diff --git a/modules/reports/client-react/ReportModule.ts b/modules/reports/client-react/ReportModule.ts new file mode 100644 index 0000000..17ba46a --- /dev/null +++ b/modules/reports/client-react/ReportModule.ts @@ -0,0 +1,16 @@ +import React from 'react'; +import ClientModule, { ClientModuleShape } from '@restapp/module-client-react'; + +export interface ReportModuleShape extends ClientModuleShape { + reportComponent?: Array>; +} + +interface ReportModule extends ReportModuleShape {} + +class ReportModule extends ClientModule { + constructor(...modules: ReportModuleShape[]) { + super(...modules); + } +} + +export default ReportModule; diff --git a/modules/reports/client-react/common/index.ts b/modules/reports/client-react/common/index.ts new file mode 100644 index 0000000..dfc25bf --- /dev/null +++ b/modules/reports/client-react/common/index.ts @@ -0,0 +1,17 @@ +export const getObjectURLFromArray = (array: number[]) => { + const buffer = new Uint8Array(array); + const blob = new Blob([buffer]); + return window.URL.createObjectURL(blob); +}; + +export const downloadFile = (url: string, name: string) => { + const a = document.createElement('a'); + + document.body.appendChild(a); + a.style.display = 'none'; + a.href = url; + a.download = name; + a.click(); + a.remove(); + window.URL.revokeObjectURL(url); +}; diff --git a/modules/reports/client-react/containers/Report.tsx b/modules/reports/client-react/containers/Report.tsx new file mode 100644 index 0000000..a3bf012 --- /dev/null +++ b/modules/reports/client-react/containers/Report.tsx @@ -0,0 +1,32 @@ +import React from 'react'; +import Helmet from 'react-helmet'; + +import { PageLayout } from '@restapp/look-client-react'; +import { translate, TranslateFunction } from '@restapp/i18n-client-react'; +import settings from '../../../../settings'; + +import reports from '../index'; + +interface ReportProps { + t: TranslateFunction; +} + +const Report = ({ t }: ReportProps) => ( + + + {reports.reportComponent && + reports.reportComponent.map((component: any, idx: number, items: any) => + React.cloneElement(component, { key: idx + items.length }) + )} + +); + +export default translate('report')(Report); diff --git a/modules/reports/client-react/excel/actions/index.ts b/modules/reports/client-react/excel/actions/index.ts new file mode 100644 index 0000000..3a3aef7 --- /dev/null +++ b/modules/reports/client-react/excel/actions/index.ts @@ -0,0 +1,7 @@ +import axios from 'axios'; + +const GET_EXCEL = () => ({ + types: {}, + APICall: () => axios.get(`${__API_URL__}/excel`) +}); +export default GET_EXCEL; diff --git a/modules/reports/client-react/excel/containers/DownloadReport.tsx b/modules/reports/client-react/excel/containers/DownloadReport.tsx new file mode 100644 index 0000000..f7f607a --- /dev/null +++ b/modules/reports/client-react/excel/containers/DownloadReport.tsx @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; + +import { Button } from '@restapp/look-client-react'; +import { translate, TranslateFunction } from '@restapp/i18n-client-react'; + +import { downloadFile, getObjectURLFromArray } from '../../common'; +import { connect } from 'react-redux'; +import GET_EXCEL from '../actions'; + +interface DownloadReportProps { + t: TranslateFunction; + getExcel: () => Promise; +} + +const DownloadReport = ({ t, getExcel }: DownloadReportProps) => { + const [isLoading, setIsLoading] = useState(false); + + const download = async () => { + setIsLoading(true); + const data = await getExcel(); + const url = getObjectURLFromArray(data); + downloadFile(url, 'Report.xlsx'); + setIsLoading(false); + }; + + return ( + + ); +}; + +export default connect( + null, + { getExcel: GET_EXCEL } +)(translate('ExcelReport')(DownloadReport)); diff --git a/modules/reports/client-react/excel/index.tsx b/modules/reports/client-react/excel/index.tsx new file mode 100644 index 0000000..84b23b1 --- /dev/null +++ b/modules/reports/client-react/excel/index.tsx @@ -0,0 +1,10 @@ +import React from 'react'; + +import resources from './locales'; +import DownloadReport from './containers/DownloadReport'; +import ReportModule from '../ReportModule'; + +export default new ReportModule({ + localization: [{ ns: 'ExcelReport', resources }], + reportComponent: [] +}); diff --git a/modules/reports/client-react/excel/locales/en/translations.json b/modules/reports/client-react/excel/locales/en/translations.json new file mode 100644 index 0000000..b573ca6 --- /dev/null +++ b/modules/reports/client-react/excel/locales/en/translations.json @@ -0,0 +1,3 @@ +{ + "downloadExcel": "Download Excel report from server" +} \ No newline at end of file diff --git a/modules/reports/client-react/excel/locales/index.ts b/modules/reports/client-react/excel/locales/index.ts new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/modules/reports/client-react/excel/locales/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/modules/reports/client-react/excel/locales/ru/translations.json b/modules/reports/client-react/excel/locales/ru/translations.json new file mode 100644 index 0000000..b9fee1a --- /dev/null +++ b/modules/reports/client-react/excel/locales/ru/translations.json @@ -0,0 +1,3 @@ +{ + "downloadExcel": "Загрузить отчет в Excel c сервера" +} \ No newline at end of file diff --git a/modules/reports/client-react/index.tsx b/modules/reports/client-react/index.tsx new file mode 100644 index 0000000..0310cc8 --- /dev/null +++ b/modules/reports/client-react/index.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Route, NavLink } from 'react-router-dom'; +import { translate, TranslateFunction } from '@restapp/i18n-client-react'; +import { MenuItem } from '@restapp/look-client-react'; + +import ReportModule from './ReportModule'; +import excel from './excel'; +import pdf from './pdf'; +import print from './print'; +import Report from './containers/Report'; +import resources from './locales'; + +const NavLinkWithI18n = translate('report')(({ t }: { t: TranslateFunction }) => ( + + {t('navLink')} + +)); + +export default new ReportModule(print, pdf, excel, { + route: [], + navItem: [ + + + + ], + localization: [{ ns: 'report', resources }] +}); diff --git a/modules/reports/client-react/locales/en/translations.json b/modules/reports/client-react/locales/en/translations.json new file mode 100644 index 0000000..610ac3b --- /dev/null +++ b/modules/reports/client-react/locales/en/translations.json @@ -0,0 +1,6 @@ +{ + "title": "Report", + "navLink": "Report", + "meta": "A page example with a report", + "loading": "Loading..." +} \ No newline at end of file diff --git a/modules/reports/client-react/locales/index.ts b/modules/reports/client-react/locales/index.ts new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/modules/reports/client-react/locales/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/modules/reports/client-react/locales/ru/translations.json b/modules/reports/client-react/locales/ru/translations.json new file mode 100644 index 0000000..b699689 --- /dev/null +++ b/modules/reports/client-react/locales/ru/translations.json @@ -0,0 +1,6 @@ +{ + "title": "Отчет", + "navLink": "Отчет", + "meta": "Пример страницы со отчетом", + "loading": "Загрузка..." +} \ No newline at end of file diff --git a/modules/reports/client-react/package.json b/modules/reports/client-react/package.json new file mode 100644 index 0000000..8548a34 --- /dev/null +++ b/modules/reports/client-react/package.json @@ -0,0 +1,5 @@ +{ + "name": "@restapp/reports-client-react", + "version": "0.1.0", + "private": true +} \ No newline at end of file diff --git a/modules/reports/client-react/pdf/actions/index.tsx b/modules/reports/client-react/pdf/actions/index.tsx new file mode 100644 index 0000000..8ba1c3f --- /dev/null +++ b/modules/reports/client-react/pdf/actions/index.tsx @@ -0,0 +1,7 @@ +import axios from 'axios'; + +const GET_PDF = () => ({ + types: {}, + APICall: () => axios.get(`${__API_URL__}/pdf`) +}); +export default GET_PDF; diff --git a/modules/reports/client-react/pdf/containers/DownloadReport.tsx b/modules/reports/client-react/pdf/containers/DownloadReport.tsx new file mode 100644 index 0000000..351e282 --- /dev/null +++ b/modules/reports/client-react/pdf/containers/DownloadReport.tsx @@ -0,0 +1,36 @@ +import React, { useState } from 'react'; + +import { Button } from '@restapp/look-client-react'; +import { translate, TranslateFunction } from '@restapp/i18n-client-react'; + +import { downloadFile, getObjectURLFromArray } from '../../common'; +import { connect } from 'react-redux'; +import GET_PDF from '../actions'; + +interface DownloadReportProps { + t: TranslateFunction; + getPdf: () => Promise; +} + +const DownloadReport = ({ t, getPdf }: DownloadReportProps) => { + const [isLoading, setIsLoading] = useState(false); + + const download = async () => { + setIsLoading(true); + const data = await getPdf(); + const url = getObjectURLFromArray(data); + downloadFile(url, 'Report.pdf'); + setIsLoading(false); + }; + + return ( + + ); +}; + +export default connect( + null, + { getPdf: GET_PDF } +)(translate('PdfReport')(DownloadReport)); diff --git a/modules/reports/client-react/pdf/index.tsx b/modules/reports/client-react/pdf/index.tsx new file mode 100644 index 0000000..fa474ee --- /dev/null +++ b/modules/reports/client-react/pdf/index.tsx @@ -0,0 +1,10 @@ +import React from 'react'; + +import resources from './locales'; +import DownloadReport from './containers/DownloadReport'; +import ReportModule from '../ReportModule'; + +export default new ReportModule({ + localization: [{ ns: 'PdfReport', resources }], + reportComponent: [] +}); diff --git a/modules/reports/client-react/pdf/locales/en/translations.json b/modules/reports/client-react/pdf/locales/en/translations.json new file mode 100644 index 0000000..2b8a958 --- /dev/null +++ b/modules/reports/client-react/pdf/locales/en/translations.json @@ -0,0 +1,3 @@ +{ + "downloadPDF": "Download PDF report from server" +} \ No newline at end of file diff --git a/modules/reports/client-react/pdf/locales/index.ts b/modules/reports/client-react/pdf/locales/index.ts new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/modules/reports/client-react/pdf/locales/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/modules/reports/client-react/pdf/locales/ru/translations.json b/modules/reports/client-react/pdf/locales/ru/translations.json new file mode 100644 index 0000000..72f4144 --- /dev/null +++ b/modules/reports/client-react/pdf/locales/ru/translations.json @@ -0,0 +1,4 @@ + +{ + "downloadPDF": "Загрузить отчет в PDF с сервера" +} \ No newline at end of file diff --git a/modules/reports/client-react/print/actions/index.ts b/modules/reports/client-react/print/actions/index.ts new file mode 100644 index 0000000..c2c2f9c --- /dev/null +++ b/modules/reports/client-react/print/actions/index.ts @@ -0,0 +1,10 @@ +import axios from 'axios'; +import { ActionType } from '../reducers'; + +const GET_REPORT_DATA = () => ({ + types: { + SUCCESS: ActionType.SET_REPORT_DATA + }, + APICall: () => axios.get(`${__API_URL__}/report`) +}); +export default GET_REPORT_DATA; diff --git a/modules/reports/client-react/print/containers/PrintReport.tsx b/modules/reports/client-react/print/containers/PrintReport.tsx new file mode 100644 index 0000000..dece6bd --- /dev/null +++ b/modules/reports/client-react/print/containers/PrintReport.tsx @@ -0,0 +1,58 @@ +import React, { useEffect, useState } from 'react'; + +import { translate, TranslateFunction } from '@restapp/i18n-client-react'; +import { Table, Button } from '@restapp/look-client-react'; +import { connect } from 'react-redux'; +import GET_REPORT_DATA from '../actions'; + +interface ReportProps { + t: TranslateFunction; + reportData: any[]; + getReportData: () => Promise; +} + +interface Report { + id: string; + name: string; + phone: string; + email: string; + typename?: string; +} + +const Report = ({ t, reportData, getReportData }: ReportProps) => { + const [isReady, setIsReady] = useState(false); + const print = () => { + window.print(); + }; + + useEffect(() => { + (async () => { + if (!reportData.length) { + await getReportData(); + } + setIsReady(true); + })(); + }, []); + + const columns = Object.keys(reportData.length && reportData[0]).map((name: string) => ({ + title: name, + key: name, + dataIndex: name + })); + + return isReady ? ( + <> + + + + ) : null; +}; + +export default connect( + ({ reportData: { reportData } }: any) => ({ + reportData + }), + { getReportData: GET_REPORT_DATA } +)(translate('PrintReport')(Report)); diff --git a/modules/reports/client-react/print/index.tsx b/modules/reports/client-react/print/index.tsx new file mode 100644 index 0000000..cb826ac --- /dev/null +++ b/modules/reports/client-react/print/index.tsx @@ -0,0 +1,12 @@ +import React from 'react'; + +import resources from './locales'; +import PrintReport from './containers/PrintReport'; +import ReportModule from '../ReportModule'; +import reducer from './reducers'; + +export default new ReportModule({ + reducer: [{ reportData: reducer }], + localization: [{ ns: 'PrintReport', resources }], + reportComponent: [] +}); diff --git a/modules/reports/client-react/print/locales/en/translations.json b/modules/reports/client-react/print/locales/en/translations.json new file mode 100644 index 0000000..8372892 --- /dev/null +++ b/modules/reports/client-react/print/locales/en/translations.json @@ -0,0 +1,3 @@ +{ + "print": "Print report from the component" +} \ No newline at end of file diff --git a/modules/reports/client-react/print/locales/index.ts b/modules/reports/client-react/print/locales/index.ts new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/modules/reports/client-react/print/locales/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/modules/reports/client-react/print/locales/ru/translations.json b/modules/reports/client-react/print/locales/ru/translations.json new file mode 100644 index 0000000..416562f --- /dev/null +++ b/modules/reports/client-react/print/locales/ru/translations.json @@ -0,0 +1,3 @@ +{ + "print": "Распечатать отчет из компонента" +} \ No newline at end of file diff --git a/modules/reports/client-react/print/reducers/index.ts b/modules/reports/client-react/print/reducers/index.ts new file mode 100644 index 0000000..2dbb666 --- /dev/null +++ b/modules/reports/client-react/print/reducers/index.ts @@ -0,0 +1,38 @@ +export interface ActionProps { + type: ActionType | ActionType[]; + payload?: any; + APICall?: () => Promise; + [key: string]: any; +} + +export enum ActionType { + SET_REPORT_DATA = 'SET_REPORT_DATA', + CLEAR_REPORT_DATA = 'CLEAR_REPORT_DATA' +} + +export interface ReportDataState { + reportData: any[]; +} + +const defaultState: ReportDataState = { + reportData: [] +}; + +export default function(state = defaultState, action: ActionProps) { + switch (action.type) { + case ActionType.SET_REPORT_DATA: + return { + ...state, + reportData: action.payload + }; + + case ActionType.CLEAR_REPORT_DATA: + return { + ...state, + reportData: null + }; + + default: + return state; + } +} diff --git a/modules/reports/server-ts/controllers.ts b/modules/reports/server-ts/controllers.ts new file mode 100644 index 0000000..76a4f0c --- /dev/null +++ b/modules/reports/server-ts/controllers.ts @@ -0,0 +1,7 @@ +import { Request, Response } from 'express'; + +import reportsDAO from './sql'; + +export const report = async (_req: Request, res: Response) => { + res.json(await reportsDAO.getReportData()); +}; diff --git a/modules/reports/server-ts/excel/controllers.ts b/modules/reports/server-ts/excel/controllers.ts new file mode 100644 index 0000000..e81621d --- /dev/null +++ b/modules/reports/server-ts/excel/controllers.ts @@ -0,0 +1,14 @@ +import { Request, Response } from 'express'; + +import generateExcel from './generateExcel'; +import reportsDAO from '../sql'; + +export const excel = async (_req: Request, res: Response) => { + try { + const reportsData = await reportsDAO.getReportData(); + const excelFile = await generateExcel(reportsData); + res.send(Array.from(new Uint8Array(excelFile))); + } catch (e) { + res.status(500); + } +}; diff --git a/modules/reports/server-ts/excel/generateExcel.ts b/modules/reports/server-ts/excel/generateExcel.ts new file mode 100644 index 0000000..a1b0ad6 --- /dev/null +++ b/modules/reports/server-ts/excel/generateExcel.ts @@ -0,0 +1,44 @@ +import * as xl from 'excel4node'; + +interface Data { + id: number; + name: string; + phone: string; + email: string; +} + +const wb = new xl.Workbook(); +const options = { + sheetFormat: { + defaultColWidth: 25 + } +}; +const style = wb.createStyle({ + font: { + color: '#000000', + size: 12 + } +}); + +export default function generateBufferExcel(data: Data[]) { + const ws = wb.addWorksheet('Report', options); + const titles = Object.keys(data[0]); + + titles.forEach((title, i) => { + const capitalized = title[0].toUpperCase() + title.slice(1); + ws.cell(1, i + 1) + .string(capitalized) + .style(style); + }); + + data.forEach((item, i) => { + const values = Object.values(item); + values.forEach((value, j) => { + ws.cell(i + 2, j + 1) + .string(String(value)) + .style(style); + }); + }); + + return wb.writeToBuffer(); +} diff --git a/modules/reports/server-ts/excel/index.ts b/modules/reports/server-ts/excel/index.ts new file mode 100644 index 0000000..b38fd30 --- /dev/null +++ b/modules/reports/server-ts/excel/index.ts @@ -0,0 +1,3 @@ +import { excel } from './controllers'; + +export default excel; diff --git a/modules/reports/server-ts/index.ts b/modules/reports/server-ts/index.ts new file mode 100644 index 0000000..2038c9f --- /dev/null +++ b/modules/reports/server-ts/index.ts @@ -0,0 +1,30 @@ +import ServerModule, { RestMethod } from '@restapp/module-server-ts'; + +import excel from './excel'; +import pdf from './pdf'; +import { report } from './controllers'; +import resources from './locales'; + +export default new ServerModule({ + localization: [{ ns: 'reports', resources }], + apiRouteParams: [ + { + method: RestMethod.GET, + route: 'report', + isAuthRoute: false, + controller: report + }, + { + method: RestMethod.GET, + route: 'excel', + isAuthRoute: false, + controller: excel + }, + { + method: RestMethod.GET, + route: 'pdf', + isAuthRoute: false, + controller: pdf + } + ] +}); diff --git a/modules/reports/server-ts/locales/en/translation.json b/modules/reports/server-ts/locales/en/translation.json new file mode 100644 index 0000000..f42bdf5 --- /dev/null +++ b/modules/reports/server-ts/locales/en/translation.json @@ -0,0 +1,9 @@ +{ + "pdf" : { + "title": "This is title of the report", + "database": "You can create table with data from database", + "orderedList": "Here is example of ordered list", + "unorderedList": "And unordered list", + "image": "To add an image you have to provide path to an image, width and height" + } +} \ No newline at end of file diff --git a/modules/reports/server-ts/locales/index.ts b/modules/reports/server-ts/locales/index.ts new file mode 100644 index 0000000..ff8b4c5 --- /dev/null +++ b/modules/reports/server-ts/locales/index.ts @@ -0,0 +1 @@ +export default {}; diff --git a/modules/reports/server-ts/locales/ru/translations.json b/modules/reports/server-ts/locales/ru/translations.json new file mode 100644 index 0000000..98beefd --- /dev/null +++ b/modules/reports/server-ts/locales/ru/translations.json @@ -0,0 +1,9 @@ +{ + "pdf" : { + "title": "Это заголовок отчета", + "database": "Вы можете создавать таблицы с инфорацией из базы данных", + "orderedList": "Здесь пример упорядоченного списка", + "unorderedList": "И неупорядоченного списка", + "image": "Чтобы добавить картинку, необходимо предоставить путь к файлу, ширину и высоту" + } +} \ No newline at end of file diff --git a/modules/reports/server-ts/migrations/003_report.js b/modules/reports/server-ts/migrations/003_report.js new file mode 100644 index 0000000..6c43d08 --- /dev/null +++ b/modules/reports/server-ts/migrations/003_report.js @@ -0,0 +1,15 @@ +exports.up = function(knex, Promise) { + return Promise.all([ + knex.schema.createTable('report', table => { + table.increments(); + table.string('name'); + table.string('phone'); + table.string('email'); + table.timestamps(false, true); + }) + ]); +}; + +exports.down = function(knex, Promise) { + return Promise.all([knex.schema.dropTable('report')]); +}; diff --git a/modules/reports/server-ts/package.json b/modules/reports/server-ts/package.json new file mode 100644 index 0000000..21e5a0b --- /dev/null +++ b/modules/reports/server-ts/package.json @@ -0,0 +1,5 @@ +{ + "name": "@restapp/reports-server-ts", + "version": "0.1.0", + "private": true +} \ No newline at end of file diff --git a/modules/reports/server-ts/pdf/controllers.ts b/modules/reports/server-ts/pdf/controllers.ts new file mode 100644 index 0000000..dbe18b1 --- /dev/null +++ b/modules/reports/server-ts/pdf/controllers.ts @@ -0,0 +1,17 @@ +import { Request, Response } from 'express'; + +import generator from './helpers/generator'; +import reportsDAO from '../sql'; + +export const pdf = async (_req: Request, res: Response) => { + const { + locals: { t } + } = res; + try { + const reportsData = await reportsDAO.getReportData(); + const pdfFile = await generator(reportsData, t); + res.send(Array.from(new Uint8Array(pdfFile))); + } catch (e) { + res.status(500); + } +}; diff --git a/modules/reports/server-ts/pdf/helpers/app.png b/modules/reports/server-ts/pdf/helpers/app.png new file mode 100644 index 0000000..72906a0 Binary files /dev/null and b/modules/reports/server-ts/pdf/helpers/app.png differ diff --git a/modules/reports/server-ts/pdf/helpers/fonts/Roboto/index.ts b/modules/reports/server-ts/pdf/helpers/fonts/Roboto/index.ts new file mode 100644 index 0000000..5412685 --- /dev/null +++ b/modules/reports/server-ts/pdf/helpers/fonts/Roboto/index.ts @@ -0,0 +1,15 @@ +const normal = require.resolve('roboto-npm-webfont/full/fonts/Roboto-Regular.ttf'); +const bold = require.resolve('roboto-npm-webfont/full/fonts/Roboto-Medium.ttf'); +const italics = require.resolve('roboto-npm-webfont/full/fonts/Roboto-Italic.ttf'); +const bolditalics = require.resolve('roboto-npm-webfont/full/fonts/Roboto-MediumItalic.ttf'); + +const fonts = { + Roboto: { + normal, + bold, + italics, + bolditalics + } +}; + +export default fonts; diff --git a/modules/reports/server-ts/pdf/helpers/generator.ts b/modules/reports/server-ts/pdf/helpers/generator.ts new file mode 100644 index 0000000..6373070 --- /dev/null +++ b/modules/reports/server-ts/pdf/helpers/generator.ts @@ -0,0 +1,57 @@ +import { TranslationFunction } from 'i18next'; +import PdfBuilder from './pdfBuilder'; + +interface UserContact { + id: number; + name: string; + phone: string; + email: string; +} + +function createPDF(contacts: UserContact[], t: TranslationFunction) { + const pdf = new PdfBuilder(); + const image = `${__dirname}/app.png`; + + pdf.addStyle('header', { + fontSize: 18, + bold: true, + margin: [0, 0, 0, 10] + }); + + pdf.addStyle('subheader', { + fontSize: 16, + bold: true, + margin: [0, 10, 0, 5] + }); + + pdf.addText(t('reports:pdf:title'), 'header'); + pdf.addText(t('reports:pdf:database'), 'subheader'); + pdf.addTable(contacts, Object.keys(contacts[0]).map((_, i) => (i === 0 ? 'auto' : '*'))); + pdf.addText(t('reports:pdf:orderedList'), 'subheader'); + pdf.addList([5, 4, 3, 2, 1], 'ol'); + pdf.addText(t('reports:pdf:unorderedList'), 'subheader'); + pdf.addList([1, 2, 3, 4, 5]); + pdf.addText(t('reports:pdf:image'), 'subheader'); + pdf.addImage(image, 150, 150); + + return pdf.getDocument(); +} + +export default function generator(contacts: UserContact[], t: TranslationFunction) { + const doc = createPDF(contacts, t); + const chunks: Uint8Array[] = []; + + doc.on('data', (chunk: Uint8Array) => { + chunks.push(chunk); + }); + + const buffer: Promise = new Promise(res => { + doc.on('end', () => { + res(Buffer.concat(chunks)); + }); + }); + + doc.end(); + + return buffer; +} diff --git a/modules/reports/server-ts/pdf/helpers/pdfBuilder.ts b/modules/reports/server-ts/pdf/helpers/pdfBuilder.ts new file mode 100644 index 0000000..232cfb1 --- /dev/null +++ b/modules/reports/server-ts/pdf/helpers/pdfBuilder.ts @@ -0,0 +1,58 @@ +import PdfPrinter from 'pdfmake'; +import { Content, Style } from 'pdfmake/build/pdfmake'; +import fonts from './fonts/Roboto/'; + +interface UserContact { + id: number; + name: string; + phone: string; + email: string; +} + +export default class PDFBuilder { + private printer = new PdfPrinter(fonts); + private content: Content = []; + private styles: { [name: string]: Style } = {}; + + public addText(text: string, style?: string, alignment?: string) { + this.content.push({ + text, + style, + alignment + }); + } + + public addStyle(name: string, style: Style) { + this.styles[name] = style; + } + + public addTable(data: UserContact[], columnsWidth: string[]) { + this.content.push({ + table: { + widths: columnsWidth, + body: [Object.keys(data[0]), ...data.map(item => Object.values(item))] + } + }); + } + + public addList(data: Array, type = 'ul') { + this.content.push({ + [type]: data + }); + } + + public addImage(image: string, width: number, height: number) { + this.content.push({ + image, + width, + height + }); + } + + public getDocument() { + return this.printer.createPdfKitDocument({ + content: this.content, + styles: this.styles + }); + } +} diff --git a/modules/reports/server-ts/pdf/index.ts b/modules/reports/server-ts/pdf/index.ts new file mode 100644 index 0000000..6c1a216 --- /dev/null +++ b/modules/reports/server-ts/pdf/index.ts @@ -0,0 +1,3 @@ +import { pdf } from './controllers'; + +export default pdf; diff --git a/modules/reports/server-ts/seeds/.eslintrc b/modules/reports/server-ts/seeds/.eslintrc new file mode 100644 index 0000000..712a899 --- /dev/null +++ b/modules/reports/server-ts/seeds/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "import/prefer-default-export": 0 + } +} \ No newline at end of file diff --git a/modules/reports/server-ts/seeds/003_report.js b/modules/reports/server-ts/seeds/003_report.js new file mode 100644 index 0000000..f8964a0 --- /dev/null +++ b/modules/reports/server-ts/seeds/003_report.js @@ -0,0 +1,20 @@ +import { returnId, truncateTables } from '@restapp/database-server-ts'; + +const CONTACTS = [ + { name: 'Tom Jackson', phone: '555-444-333', email: 'tom@gmail.com' }, + { name: 'Mike James', phone: '555-777-888', email: 'mikejames@gmail.com' }, + { name: 'Janet Larson', phone: '555-222-111', email: 'janetlarson@gmail.com' }, + { name: 'Clark Thompson', phone: '555-444-333', email: 'clark123@gmail.com' }, + { name: 'Emma Page', phone: '555-444-333', email: 'emma1page@gmail.com' } +]; + +export async function seed(knex, Promise) { + await truncateTables(knex, Promise, ['report']); + for (let i of CONTACTS) { + await returnId(knex('report')).insert({ + name: i.name, + phone: i.phone, + email: i.email + }); + } +} diff --git a/modules/reports/server-ts/sql.ts b/modules/reports/server-ts/sql.ts new file mode 100644 index 0000000..71c4c0b --- /dev/null +++ b/modules/reports/server-ts/sql.ts @@ -0,0 +1,14 @@ +import { knex } from '@restapp/database-server-ts'; + +class ReportsDAO { + public getReportData() { + return knex + .select('id', 'name', 'phone', 'email') + .from('report') + .orderBy('id', 'asc'); + } +} + +const reportsDAO = new ReportsDAO(); + +export default reportsDAO; diff --git a/modules/reports/server-ts/typings/typings.d.ts b/modules/reports/server-ts/typings/typings.d.ts new file mode 100644 index 0000000..48a1ec1 --- /dev/null +++ b/modules/reports/server-ts/typings/typings.d.ts @@ -0,0 +1,249 @@ + +declare namespace Excel4Node { + export const BorderStyle: { + dashDot: number; + dashDotDot: number; + dashed: number; + dotted: number; + double: number; + hair: number; + medium: number; + mediumDashDot: number; + mediumDashDotDot: number; + mediumDashed: number; + none: number; + opts: string[]; + slantDashDot: number; + thick: number; + thin: number; + validate: Function; + }; + export const CellComment: any; + export const HorizontalAlignment: { + center: number; + centerContinuous: number; + distributed: number; + fill: number; + general: number; + justify: number; + left: number; + opts: string[]; + right: number; + validate: Function; + }; + export const Orientation: { + default: number; + landscape: number; + portrait: number; + validate: Function; + }; + export const PageOrder: { + downThenOver: number; + overThenDown: number; + validate: Function; + }; + export const Pane: { + bottomLeft: number; + bottomRight: number; + topLeft: number; + topRight: number; + validate: Function; + }; + export const PaneState: { + frozen: number; + frozenSplit: number; + split: number; + validate: Function; + }; + export const PaperSize: { + A2_PAPER: number; + A3_EXTRA_PAPER: number; + A3_EXTRA_TRANSVERSE_PAPER: number; + A3_PAPER: number; + A3_TRANSVERSE_PAPER: number; + A4_EXTRA_PAPER: number; + A4_PAPER: number; + A4_PLUS_PAPER: number; + A4_SMALL_PAPER: number; + A4_TRANSVERSE_PAPER: number; + A5_EXTRA_PAPER: number; + A5_PAPER: number; + A5_TRANSVERSE_PAPER: number; + B4_ENVELOPE: number; + B4_PAPER: number; + B5_ENVELOPE: number; + B5_PAPER: number; + B6_ENVELOPE: number; + C3_ENVELOPE: number; + C4_ENVELOPE: number; + C5_ENVELOPE: number; + C65_ENVELOPE: number; + C6_ENVELOPE: number; + C_PAPER: number; + DL_PAPER: number; + D_PAPER: number; + EXECUTIVE_PAPER: number; + E_PAPER: number; + FOLIO_PAPER: number; + GERMAN_LEGAL_FANFOLD: number; + GERMAN_STANDARD_FANFOLD: number; + INVITE_ENVELOPE: number; + ISO_B4: number; + ISO_B5_EXTRA_PAPER: number; + ITALY_ENVELOPE: number; + JAPANESE_DOUBLE_POSTCARD: number; + JIS_B5_TRANSVERSE_PAPER: number; + LEDGER_PAPER: number; + LEGAL_EXTRA_PAPER: number; + LEGAL_PAPER: number; + LETTER_EXTRA_PAPER: number; + LETTER_EXTRA_TRANSVERSE_PAPER: number; + LETTER_PAPER: number; + LETTER_PLUS_PAPER: number; + LETTER_SMALL_PAPER: number; + LETTER_TRANSVERSE_PAPER: number; + MONARCH_ENVELOPE: number; + NOTE_PAPER: number; + NUMBER_10_ENVELOPE: number; + NUMBER_11_ENVELOPE: number; + NUMBER_12_ENVELOPE: number; + NUMBER_14_ENVELOPE: number; + NUMBER_9_ENVELOPE: number; + QUARTO_PAPER: number; + SIX_THREE_QUARTERS_ENVELOPE: number; + STANDARD_PAPER_10_BY_11_IN: number; + STANDARD_PAPER_10_BY_14_IN: number; + STANDARD_PAPER_11_BY_17_IN: number; + STANDARD_PAPER_15_BY_11_IN: number; + STANDARD_PAPER_9_BY_11_IN: number; + STATEMENT_PAPER: number; + SUPER_A_SUPER_A_A4_PAPER: number; + SUPER_B_SUPER_B_A3_PAPER: number; + TABLOID_EXTRA_PAPER: number; + TABLOID_PAPER: number; + US_STANDARD_FANFOLD: number; + opts: string[]; + validate: Function; + }; + export const PatternType: { + darkDown: number; + darkGray: number; + darkGrid: number; + darkHorizontal: number; + darkTrellis: number; + darkUp: number; + darkVerical: number; + gray0625: number; + gray125: number; + lightDown: number; + lightGray: number; + lightGrid: number; + lightHorizontal: number; + lightTrellis: number; + lightUp: number; + lightVertical: number; + mediumGray: number; + none: number; + opts: string[]; + solid: number; + validate: Function; + }; + export const PositiveUniversalMeasure: { + validate: Function; + }; + export const PresetColorVal: { + aqua: string; + black: string; + blue: string; + "blue-gray": string; + "bright green": string; + brown: string; + "dark blue": string; + "dark green": string; + "dark red": string; + "dark teal": string; + "dark yellow": string; + getColor: Function; + gold: string; + "gray-25": string; + "gray-40": string; + "gray-50": string; + "gray-80": string; + green: string; + indigo: string; + lavender: string; + "light blue": string; + "light green": string; + "light orange": string; + "light turquoise": string; + "light yellow": string; + lime: string; + "olive green": string; + opts: string[]; + orange: string; + "pale blue": string; + pink: string; + plum: string; + red: string; + rose: string; + "sea green": string; + "sky blue": string; + tan: string; + teal: string; + turquoise: string; + validate: Function; + violet: string; + white: string; + yellow: string; + }; + export const PrintError: { + NA: number; + blank: number; + dash: number; + displayed: number; + validate: Function; + }; + export const VerticalAlignment: { + bottom: number; + center: number; + distributed: number; + justify: number; + opts: string[]; + top: number; + validate: Function; + }; + export class Workbook { + constructor(...args: any[]); + logger: any; + opts: any; + author: any; + sheets: any; + sharedStrings: any; + sharedStringLookup: any; + styles: any; + stylesLookup: any; + dxfCollection: any; + mediaCollection: any; + definedNameCollection: any; + styleData: any; + styleDataLookup: any; + addWorksheet(name: any, opts: any): any; + createStyle(opts: any): any; + getStringIndex(val: any): any; + setSelectedTab(id: any): void; + write(fileName: any, handler: any): void; + writeToBuffer(): any; + } + export function getExcelAlpha(colNum: any): any; + export function getExcelCellRef(rowNum: any, colNum: any): any; + export function getExcelRowCol(str: any): any; + export function getExcelTS(date: any): any; + +} + +declare module 'excel4node' { + export = Excel4Node +} + +//packages without types +declare module 'pdfmake'; \ No newline at end of file diff --git a/packages/client/src/modules.ts b/packages/client/src/modules.ts index 85cdc5c..3afb220 100644 --- a/packages/client/src/modules.ts +++ b/packages/client/src/modules.ts @@ -1,4 +1,5 @@ import welcome from '@restapp/welcome-client-react'; +import reports from '@restapp/reports-client-react'; import core from '@restapp/core-client-react'; import look from '@restapp/look-client-react'; import i18n from '@restapp/i18n-client-react'; @@ -9,6 +10,6 @@ import '@restapp/favicon-common'; const pageNotFound = require('@restapp/page-not-found-client-react').default; -const modules = new ClientModule(welcome, look, validation, defaultRouter, i18n, pageNotFound, core); +const modules = new ClientModule(reports, welcome, look, validation, defaultRouter, i18n, pageNotFound, core); export default modules; diff --git a/packages/server/package.json b/packages/server/package.json index 27755cd..39c776b 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -60,6 +60,7 @@ "body-parser": "^1.18.3", "dotenv": "^5.0.1", "error-stack-parser": "^2.0.1", + "excel4node": "^1.7.2", "express": "^4.16.2", "filesize": "^3.5.11", "humps": "^2.0.1", @@ -80,6 +81,7 @@ "passport-google-oauth": "^1.0.0", "passport-linkedin-oauth2": "^1.5.0", "passport-local": "^1.0.0", + "pdfmake": "^0.1.56", "performance-now": "^2.1.0", "pg": "^7.4.0", "prop-types": "^15.6.0", diff --git a/packages/server/src/modules.ts b/packages/server/src/modules.ts index 4de5266..a9eefb9 100644 --- a/packages/server/src/modules.ts +++ b/packages/server/src/modules.ts @@ -1,4 +1,5 @@ import welcome from '@restapp/welcome-server-ts'; +import reports from '@restapp/reports-server-ts'; import core from '@restapp/core-server-ts'; import i18n from '@restapp/i18n-server-ts'; import validation from '@restapp/validation-common-react'; @@ -8,6 +9,6 @@ import '@restapp/debug-server-ts'; import ServerModule from '@restapp/module-server-ts'; -const modules: ServerModule = new ServerModule(welcome, cookies, i18n, validation, mailer, core); +const modules: ServerModule = new ServerModule(reports, welcome, cookies, i18n, validation, mailer, core); export default modules; diff --git a/yarn.lock b/yarn.lock index 8ec7a10..e85f937 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2620,7 +2620,7 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.5.0, acorn@^5.5.3: +acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -3171,11 +3171,25 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +ast-transform@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" + integrity sha1-dJRAWIh9goPhidlUYAlHvJj+AGI= + dependencies: + escodegen "~1.2.0" + esprima "~1.0.4" + through "~2.3.4" + ast-types-flow@0.0.7, ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= +ast-types@^0.7.0: + version "0.7.8" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" + integrity sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -4029,7 +4043,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.x, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: +babel-runtime@6.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.25.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -4088,6 +4102,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= + base64-js@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.1.2.tgz#d6400cac1c4c660976d90d07a04351d89395f5e8" @@ -4272,17 +4291,34 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +brfs@^1.3.0, brfs@^1.4.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" + integrity sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ== + dependencies: + quote-stream "^1.0.1" + resolve "^1.1.5" + static-module "^2.2.0" + through2 "^2.0.0" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +brotli@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.2.tgz#525a9cad4fcba96475d7d388f6aecb13eed52f46" + integrity sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y= + dependencies: + base64-js "^1.1.2" + browser-process-hrtime@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== -browser-resolve@^1.11.3: +browser-resolve@^1.11.3, browser-resolve@^1.8.1: version "1.11.3" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== @@ -4325,6 +4361,15 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" +browserify-optional@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" + integrity sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk= + dependencies: + ast-transform "0.0.0" + ast-types "^0.7.0" + browser-resolve "^1.8.1" + browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" @@ -4416,6 +4461,11 @@ buffer-equal-constant-time@1.0.1: resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= +buffer-equal@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" + integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= + buffer-fill@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" @@ -5002,7 +5052,7 @@ clone-response@1.0.2: dependencies: mimic-response "^1.0.0" -clone@^1.0.2: +clone@^1.0.1, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= @@ -5199,7 +5249,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.10, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: +concat-stream@^1.4.10, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -5742,6 +5792,11 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-js@^3.1.9-1: + version "3.1.9-1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.1.9-1.tgz#fda19e761fc077e01ffbfdc6e9fdfc59e8806cd8" + integrity sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg= + crypto-token@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/crypto-token/-/crypto-token-1.0.1.tgz#27c6482faf3b63c2f5da11577f8304346fe797a5" @@ -6002,7 +6057,7 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-equal@^1.0.1: +deep-equal@^1.0.0, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= @@ -6191,6 +6246,13 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +dfa@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/dfa/-/dfa-1.1.0.tgz#d30218bd10d030fa421df3ebbc82285463a31781" + integrity sha1-0wIYvRDQMPpCHfPrvIIoVGOjF4E= + dependencies: + babel-runtime "^6.11.6" + diff@3.5.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -6397,6 +6459,13 @@ draft-js@^0.10.0, draft-js@~0.10.0: immutable "~3.7.4" object-assign "^4.1.0" +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -6620,7 +6689,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.9.1: +escodegen@^1.8.1, escodegen@^1.9.1: version "1.11.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== @@ -6632,6 +6701,29 @@ escodegen@^1.9.1: optionalDependencies: source-map "~0.6.1" +escodegen@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" + integrity sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E= + dependencies: + esprima "~1.0.4" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.30" + +escodegen@~1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" + integrity sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-config-airbnb-base@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" @@ -6852,6 +6944,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esprima@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + integrity sha1-n1V+CPw7TSbs6d00+Pv0drYlha0= + esquery@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" @@ -6871,11 +6968,21 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + integrity sha1-hno+jlip+EYYr7bC3bzZFrfLr3E= + esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= +esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + integrity sha1-gVHTWOIMisx/t0XnRywAJf5JZXA= + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -6916,6 +7023,23 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +excel4node@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/excel4node/-/excel4node-1.7.2.tgz#1956a3fabb51c7b163388e44bd1384a7f228cb8f" + integrity sha512-3XSsPSSbUeGloTRQMTmgf4aA1WDGa9fWQitOCGN/URG8NvwPjgVdbyG7FWKukqTdl5XBz9jv0vVBz3BBIo52tg== + dependencies: + deepmerge "3.2.0" + image-size "0.7.2" + jszip "3.2.1" + lodash.get "4.4.2" + lodash.isequal "4.5.0" + lodash.isundefined "3.0.1" + lodash.reduce "4.6.0" + lodash.uniqueid "4.0.1" + mime "2.4.0" + uuid "3.3.2" + xmlbuilder "11.0.1" + exec-async@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/exec-async/-/exec-async-2.2.0.tgz#c7c5ad2eef3478d38390c6dd3acfe8af0efc8301" @@ -7653,6 +7777,16 @@ eyes@0.1.x: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +falafel@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" + integrity sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw= + dependencies: + acorn "^5.0.0" + foreach "^2.0.5" + isarray "0.0.1" + object-keys "^1.0.6" + fancy-log@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" @@ -7987,6 +8121,23 @@ follow-redirects@^1.0.0, follow-redirects@^1.2.3, follow-redirects@^1.4.1: dependencies: debug "^3.2.6" +fontkit@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fontkit/-/fontkit-1.8.0.tgz#deb9351619e90ddc91707b6156a9f14c8ab11554" + integrity sha512-EFDRCca7khfQWYu1iFhsqeABpi87f03MBdkT93ZE6YhqCdMzb5Eojb6c4dlJikGv5liuhByyzA7ikpIPTSBWbQ== + dependencies: + babel-runtime "^6.11.6" + brfs "^1.4.0" + brotli "^1.2.0" + browserify-optional "^1.0.0" + clone "^1.0.1" + deep-equal "^1.0.0" + dfa "^1.0.0" + restructure "^0.5.3" + tiny-inflate "^1.0.2" + unicode-properties "^1.0.0" + unicode-trie "^0.3.0" + for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" @@ -8011,6 +8162,11 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -9164,6 +9320,11 @@ ignore@^3.3.3, ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +image-size@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.2.tgz#5014c2c43003020d265801867b8bcf97c4080cf1" + integrity sha512-CBmVIFHyDyiWi1U24eNHl8SH0Iir2IgmEv1RwdRVZxWsEbSCvV5b/eXaYP8epOFv2dbw5uNBOrn1Nc5P5KvsUA== + image-size@^0.5.1, image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -9179,6 +9340,11 @@ immediate@^3.2.2: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + immutability-helper@2.8.1, immutability-helper@^2.6.2: version "2.8.1" resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-2.8.1.tgz#3c5ec05fcd83676bfae7146f319595243ad904f4" @@ -10665,6 +10831,16 @@ jsx-ast-utils@^2.0.1: dependencies: array-includes "^3.0.3" +jszip@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.1.tgz#c5d32df7274042282b157efb16e522b43435e01a" + integrity sha512-iCMBbo4eE5rb1VCpm5qXOAaUiRKRUKiItn8ah2YQQx9qymmSAY98eyQfioChEYcVQLh0zxJ3wS4A0mh90AVPvw== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + jwa@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.0.tgz#8f61dc799acf0309f2d4b22a91ce73d6d2bb206c" @@ -10926,6 +11102,13 @@ libnpmpublish@^1.1.1: semver "^5.5.1" ssri "^6.0.1" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + liftoff@2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" @@ -10940,6 +11123,15 @@ liftoff@2.5.0: rechoir "^0.6.2" resolve "^1.1.7" +linebreak@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/linebreak/-/linebreak-0.3.0.tgz#0526480a62c05bd679f3e9d99830e09c6a7d0ed6" + integrity sha1-BSZICmLAW9Z58+nZmDDgnGp9DtY= + dependencies: + base64-js "0.0.8" + brfs "^1.3.0" + unicode-trie "^0.3.0" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -11202,7 +11394,7 @@ lodash.filter@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= -lodash.get@^4.4.2: +lodash.get@4.4.2, lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= @@ -11232,6 +11424,11 @@ lodash.isempty@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= +lodash.isequal@4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -11262,6 +11459,11 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= +lodash.isundefined@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" + integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -11326,6 +11528,11 @@ lodash.pick@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= +lodash.reduce@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= + lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -11391,6 +11598,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.uniqueid@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz#3268f26a7c88e4f4b1758d679271814e31fa5b26" + integrity sha1-MmjyanyI5PSxdY1nknGBTjH6WyY= + lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" @@ -11523,6 +11735,13 @@ macos-release@^2.0.0: resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.0.0.tgz#7dddf4caf79001a851eb4fba7fb6034f251276ab" integrity sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A== +magic-string@^0.22.4: + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + dependencies: + vlq "^0.2.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -11720,6 +11939,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-source-map@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f" + integrity sha1-pd5GU42uhNQRTMXqArR3KmNGcB8= + dependencies: + source-map "^0.5.6" + merge-stream@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" @@ -12058,16 +12284,16 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mime@2.4.0, mime@^2.0.3, mime@^2.3.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== + mime@^1.3.4, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== - mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -12937,11 +13163,21 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" +object-inspect@~1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" + integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== + object-keys@^1.0.12: version "1.1.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032" integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg== +object-keys@^1.0.6: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-path@^0.9.2: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" @@ -13415,7 +13651,12 @@ pacote@^9.5.0: unique-filename "^1.1.1" which "^1.3.1" -pako@~1.0.5: +pako@^0.2.5: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU= + +pako@~1.0.2, pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== @@ -13723,6 +13964,26 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +pdfkit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/pdfkit/-/pdfkit-0.9.1.tgz#f07a66eebc64855f8345dccfd313f2d8f880f10f" + integrity sha512-45X/NjaynHVNd/866ETK9KmblL8Sqwmah1RPz04IzmZoEO+cvPid2UvkVfZQcS4Jeq/uWY+99qAq04NoigzWSA== + dependencies: + crypto-js "^3.1.9-1" + fontkit "^1.0.0" + linebreak "^0.3.0" + png-js ">=0.1.0" + saslprep "1.0.1" + +pdfmake@^0.1.56: + version "0.1.56" + resolved "https://registry.yarnpkg.com/pdfmake/-/pdfmake-0.1.56.tgz#a4fcabe25fa5f04c07cb6e861c0abbf9ca5b33e9" + integrity sha512-c5fSj16VTQCrmTw02Mc+Oj3boRG+PGJuu7cGXAXXljI3bMNDifwmUs+3opEwRZbTWu9WhFKYbrs2Iq136UN/NQ== + dependencies: + iconv-lite "^0.4.24" + linebreak "^0.3.0" + pdfkit "^0.9.1" + pegjs@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" @@ -13899,6 +14160,11 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +png-js@>=0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/png-js/-/png-js-0.1.1.tgz#1cc7c212303acabe74263ec3ac78009580242d93" + integrity sha1-HMfCEjA6yr50Jj7DrHgAlYAkLZM= + popper.js@^1.12.9: version "1.14.7" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e" @@ -14352,6 +14618,15 @@ quick-lru@^1.0.0: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quote-stream@^1.0.1, quote-stream@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2" + integrity sha1-hJY/jJwmuULhU/7rU6rnRlK34LI= + dependencies: + buffer-equal "0.0.1" + minimist "^1.1.3" + through2 "^2.0.0" + raf@^3.1.0, raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -15675,7 +15950,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -16100,6 +16375,13 @@ resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, re dependencies: path-parse "^1.0.6" +resolve@^1.1.5: + version "1.11.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" + integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== + dependencies: + path-parse "^1.0.6" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -16123,6 +16405,13 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +restructure@^0.5.3: + version "0.5.4" + resolved "https://registry.yarnpkg.com/restructure/-/restructure-0.5.4.tgz#f54e7dd563590fb34fd6bf55876109aeccb28de8" + integrity sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg= + dependencies: + browserify-optional "^1.0.0" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -16346,6 +16635,11 @@ sane@^2.0.0: optionalDependencies: fsevents "^1.2.3" +saslprep@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.1.tgz#b644e0ba25b156b652f3cb90df7542f896049ba6" + integrity sha512-ntN6SbE3hRqd45PKKadRPgA+xHPWg5lPSj2JWJdJvjTwXDDfkPVtXWvP8jJojvnm+rAsZ2b299C5NwZqq818EA== + sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" @@ -16517,6 +16811,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -16564,6 +16863,11 @@ shallow-clone@^1.0.0: kind-of "^5.0.0" mixin-object "^2.0.1" +shallow-copy@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= + shallow-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.1.0.tgz#cc022f030dcba0d1c198abf658a3c6c744e171ca" @@ -16817,7 +17121,7 @@ source-map-url@^0.4.0: resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= -source-map@0.1.x: +source-map@0.1.x, source-map@~0.1.30: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= @@ -17016,6 +17320,13 @@ staged-git-files@1.1.1: resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.1.tgz#37c2218ef0d6d26178b1310719309a16a59f8f7b" integrity sha512-H89UNKr1rQJvI1c/PIR3kiAMBV23yvR7LItZiV74HWZwzt7f3YHuujJ9nJZlt58WlFox7XQsOahexwk7nTe69A== +static-eval@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -17024,6 +17335,26 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +static-module@^2.2.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf" + integrity sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ== + dependencies: + concat-stream "~1.6.0" + convert-source-map "^1.5.1" + duplexer2 "~0.1.4" + escodegen "~1.9.0" + falafel "^2.1.0" + has "^1.0.1" + magic-string "^0.22.4" + merge-source-map "1.0.4" + object-inspect "~1.4.0" + quote-stream "~1.0.2" + readable-stream "~2.3.3" + shallow-copy "~0.0.1" + static-eval "^2.0.0" + through2 "~2.0.3" + "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -17529,7 +17860,7 @@ throat@^4.0.0, throat@^4.1.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0, through2@^2.0.2, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -17537,7 +17868,7 @@ through2@^2.0.0, through2@^2.0.2: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@2.3.x, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: +through@2, through@2.3.x, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -17571,6 +17902,11 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" +tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7" + integrity sha1-k9nez/yIBb1X6uQxDwt0Xptvs6c= + tiny-queue@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046" @@ -17947,11 +18283,27 @@ unicode-match-property-value-ecmascript@^1.1.0: resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== +unicode-properties@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-properties/-/unicode-properties-1.1.0.tgz#7a96eef49f75682ea69d2315eec9ac43ffdf00c1" + integrity sha1-epbu9J91aC6mnSMV7smsQ//fAME= + dependencies: + brfs "^1.4.0" + unicode-trie "^0.3.0" + unicode-property-aliases-ecmascript@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== +unicode-trie@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" + integrity sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU= + dependencies: + pako "^0.2.5" + tiny-inflate "^1.0.0" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -18225,6 +18577,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +vlq@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== + vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -18861,6 +19218,11 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xmlbuilder@11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlbuilder@8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"