diff --git a/export/pdf/README.MD b/export/pdf/README.MD new file mode 100644 index 000000000..d6fcc9470 --- /dev/null +++ b/export/pdf/README.MD @@ -0,0 +1,82 @@ + + +# AI-Powered PDF Report Generator + +**Automatically generate and upload AI-analyzed PDF reports from Flatfile data** + +The `AI-Powered PDF Report Generator` is a Flatfile Listener plugin that creates comprehensive PDF reports with AI-driven analysis when a job is ready. It fetches sheet data, utilizes Anthropic's AI for in-depth analysis, generates a visually appealing PDF report, and seamlessly uploads it back to Flatfile. + +**Event Type:** +`listener.on('job:ready')` + +**Supported field types:** +All field types are supported as the plugin processes entire sheets. + + + +## Features + +- Automatic PDF report generation when a job is ready +- AI-powered data analysis using Anthropic's Claude model +- Dynamic PDF creation with data summaries and placeholders for charts +- Seamless upload of generated reports back to Flatfile +- Error handling and logging for robust operation + +## Installation + +1. Install the required dependencies: + +```bash +npm install @flatfile/listener @flatfile/api pdf-lib @anthropic-ai/sdk +``` + +2. Set up the necessary environment variables: + +``` +FLATFILE_API_KEY=your_flatfile_api_key +ANTHROPIC_API_KEY=your_anthropic_api_key +FLATFILE_SPACE_ID=your_flatfile_space_id +FLATFILE_ENVIRONMENT_ID=your_flatfile_environment_id +``` + +3. Import and use the plugin in your Flatfile configuration. + +## Example Usage + +```javascript +import listener from './path-to-plugin'; + +// Use the listener in your Flatfile configuration +export default { + name: "My Flatfile Project", + plugins: [listener], + // ... other configuration options +}; +``` + +## Configuration + +The plugin requires the following environment variables to be set: + +- `FLATFILE_API_KEY`: Your Flatfile API key +- `ANTHROPIC_API_KEY`: Your Anthropic API key +- `FLATFILE_SPACE_ID`: The ID of your Flatfile space +- `FLATFILE_ENVIRONMENT_ID`: The ID of your Flatfile environment + +Ensure these are properly set in your environment before running the plugin. + +## Behavior + +1. When a `job:ready` event is triggered, the plugin fetches the sheet data from Flatfile. +2. It then sends the first 10 rows of data to Anthropic's AI for analysis. +3. A PDF report is generated, including: + - A title + - A summary of the total records + - A placeholder for charts or graphs + - The AI-generated analysis +4. The PDF is temporarily saved and then uploaded back to Flatfile. +5. The temporary PDF file is deleted after successful upload. + +In case of any errors during this process, they are logged, and the job is marked as failed with an error message. + +This plugin provides a powerful way to automatically generate insightful reports from your Flatfile data, enhancing data analysis and visualization capabilities. \ No newline at end of file diff --git a/export/pdf/package.json b/export/pdf/package.json new file mode 100644 index 000000000..719f670aa --- /dev/null +++ b/export/pdf/package.json @@ -0,0 +1,71 @@ +{ + "name": "@flatfile/plugin-export-pdf", + "version": "0.0.0", + "url": "https://github.com/FlatFilers/flatfile-plugins/tree/main/export/pdf", + "description": "A Flatfile plugin for generating PDF reports from a Flatfile Workbook", + "registryMetadata": { + "category": "export" + }, + "engines": { + "node": ">= 16" + }, + "browser": { + "./dist/index.cjs": "./dist/index.browser.cjs", + "./dist/index.mjs": "./dist/index.browser.mjs" + }, + "exports": { + "types": "./dist/index.d.ts", + "node": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs" + }, + "browser": { + "require": "./dist/index.browser.cjs", + "import": "./dist/index.browser.mjs" + }, + "default": "./dist/index.mjs" + }, + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "source": "./src/index.ts", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], + "scripts": { + "build": "rollup -c", + "build:watch": "rollup -c --watch", + "build:prod": "NODE_ENV=production rollup -c", + "check": "tsc ./**/*.ts --noEmit --esModuleInterop", + "test": "jest src/*.spec.ts --detectOpenHandles", + "test:unit": "jest src/*.spec.ts --testPathIgnorePatterns=.*\\.e2e\\.spec\\.ts$ --detectOpenHandles", + "test:e2e": "jest src/*.e2e.spec.ts --detectOpenHandles" + }, + "keywords": [ + "flatfile-plugins", + "category-export" + ], + "author": "Flatfile, Inc.", + "repository": { + "type": "git", + "url": "https://github.com/FlatFilers/flatfile-plugins.git", + "directory": "export/pdf" + }, + "license": "ISC", + "dependencies": { + "@anthropic-ai/sdk": "^0.29.0", + "@flatfile/api": "^1.9.19", + "@flatfile/plugin-space-configure": "0.6.1", + "@flatfile/util-common": "^1.4.1", + "pdf-lib": "^1.17.1" + }, + "peerDependencies": { + "@flatfile/listener": "^1.0.5" + }, + "devDependencies": { + "@flatfile/hooks": "^1.5.0", + "@flatfile/rollup-config": "^0.1.1", + "@types/node": "^22.7.4", + "typescript": "^5.6.2" + } +} diff --git a/export/pdf/rollup.config.mjs b/export/pdf/rollup.config.mjs new file mode 100644 index 000000000..17a3ce3f9 --- /dev/null +++ b/export/pdf/rollup.config.mjs @@ -0,0 +1,3 @@ +import { buildConfig } from '@flatfile/rollup-config' + +export default buildConfig({}) diff --git a/export/pdf/src/export.pdf.analyze.ts b/export/pdf/src/export.pdf.analyze.ts new file mode 100644 index 000000000..6e9a5dbf7 --- /dev/null +++ b/export/pdf/src/export.pdf.analyze.ts @@ -0,0 +1,30 @@ +import Anthropic from '@anthropic-ai/sdk' +import { TextBlock } from '@anthropic-ai/sdk/resources' + +export async function analyzeDataWithAI( + sheetData: any[], + ANTHROPIC_API_KEY: string +): Promise { + const dataDescription = JSON.stringify(sheetData) + + const anthropic = new Anthropic({ + apiKey: ANTHROPIC_API_KEY, + }) + + const prompt = `Given the following dataset: ${dataDescription} + + Please provide a concise analysis of this data, including: + 1. A summary of the main features or columns in the dataset. + 2. Any notable patterns or trends you can identify. + 3. Potential insights or recommendations based on this data. + + Limit your response to 3-4 paragraphs.` + + const response = await anthropic.messages.create({ + max_tokens: 1024, + messages: [{ role: 'user', content: prompt }], + model: 'claude-3-opus-20240229', + }) + + return response.content[0] as TextBlock +} diff --git a/export/pdf/src/export.pdf.generate.ts b/export/pdf/src/export.pdf.generate.ts new file mode 100644 index 000000000..4d5e9170e --- /dev/null +++ b/export/pdf/src/export.pdf.generate.ts @@ -0,0 +1,96 @@ +import { FlatfileEvent } from '@flatfile/listener' +import { PDFDocument, StandardFonts, rgb } from 'pdf-lib' +import { analyzeDataWithAI } from './export.pdf.analyze' + +export async function generatePDFReport( + sheetData: any[], + event: FlatfileEvent +) { + const pdfDoc = await PDFDocument.create() + const page = pdfDoc.addPage() + const { height } = page.getSize() + const font = await pdfDoc.embedFont(StandardFonts.Helvetica) + const anthropicApiKey = + process.env.ANTHROPIC_API_KEY || (await event.secrets('ANTHROPIC_API_KEY')) + + if (!anthropicApiKey) { + throw new Error('Anthropic API key is not set') + } + // Add title + page.drawText('Data Analysis Report', { + x: 50, + y: height - 50, + size: 24, + font, + color: rgb(0, 0, 0), + }) + + // Add data summary + let yOffset = height - 100 + page.drawText(`Total Records: ${sheetData.length}`, { + x: 50, + y: yOffset, + size: 12, + font, + color: rgb(0, 0, 0), + }) + + // Placeholder for chart/graph + yOffset -= 30 + page.drawRectangle({ + x: 50, + y: yOffset - 200, + width: 300, + height: 200, + borderColor: rgb(0, 0, 0), + borderWidth: 1, + }) + page.drawText('Chart Placeholder', { + x: 175, + y: yOffset - 100, + size: 12, + font, + color: rgb(0.5, 0.5, 0.5), + }) + + // AI analysis + yOffset -= 250 + page.drawText('AI Analysis:', { + x: 50, + y: yOffset, + size: 14, + font, + color: rgb(0, 0, 0), + }) + yOffset -= 20 + + const aiAnalysis = await analyzeDataWithAI(sheetData, anthropicApiKey) + console.log('aiAnalysis', aiAnalysis) + const words = aiAnalysis.text.split(' ') + let line = '' + for (const word of words) { + if ((line + word).length > 70) { + page.drawText(line, { + x: 50, + y: yOffset, + size: 10, + font, + color: rgb(0, 0, 0), + }) + yOffset -= 15 + line = '' + } + line += (line ? ' ' : '') + word + } + if (line) { + page.drawText(line, { + x: 50, + y: yOffset, + size: 10, + font, + color: rgb(0, 0, 0), + }) + } + + return pdfDoc.save() +} diff --git a/export/pdf/src/export.pdf.plugin.ts b/export/pdf/src/export.pdf.plugin.ts new file mode 100644 index 000000000..6fc148a29 --- /dev/null +++ b/export/pdf/src/export.pdf.plugin.ts @@ -0,0 +1,47 @@ +import api from '@flatfile/api' +import type { FlatfileEvent, FlatfileListener } from '@flatfile/listener' +import { jobHandler } from '@flatfile/plugin-job-handler' +import * as fs from 'fs' +import { generatePDFReport } from './export.pdf.generate' + +export function exportPDF() { + return function (listener: FlatfileListener) { + listener.use( + jobHandler('sheet:generatePDFReport', async (event: FlatfileEvent) => { + const { sheetId, spaceId, environmentId } = event.context + + if (!sheetId) { + throw new Error('Sheet ID is missing from the event context') + } + + const { data: records } = await api.records.get(sheetId, { + pageSize: 50, + }) + + const pdfBytes = await generatePDFReport(records.records, event) + + const fileName = `report_${sheetId}_${Date.now()}.pdf` + + const tempFilePath = `/tmp/${fileName}` + fs.writeFileSync(tempFilePath, Buffer.from(pdfBytes)) + const fileStream = fs.createReadStream(tempFilePath) + + try { + await api.files.upload(fileStream, { + spaceId, + environmentId, + }) + fs.unlinkSync(tempFilePath) + + return { + info: 'PDF report generated', + } + } catch (error) { + fs.unlinkSync(tempFilePath) + console.error('Failed to upload PDF report', error) + throw new Error('Failed to upload PDF report') + } + }) + ) + } +} diff --git a/export/pdf/src/index.ts b/export/pdf/src/index.ts new file mode 100644 index 000000000..b65f1ed4e --- /dev/null +++ b/export/pdf/src/index.ts @@ -0,0 +1 @@ +export * from './export.pdf.plugin' diff --git a/flatfilers/sandbox/src/index.ts b/flatfilers/sandbox/src/index.ts index fadd7fb1f..008db1573 100644 --- a/flatfilers/sandbox/src/index.ts +++ b/flatfilers/sandbox/src/index.ts @@ -1,6 +1,82 @@ import type { FlatfileListener } from '@flatfile/listener' -import { HTMLTableExtractor } from '@flatfile/plugin-extract-html-table' +import { exportPDF } from '@flatfile/plugin-export-pdf' +import { configureSpace } from '@flatfile/plugin-space-configure' export default async function (listener: FlatfileListener) { - listener.use(HTMLTableExtractor()) + listener.on('job:completed', { job: 'file:extract*' }, async (event) => { + const { fileId } = event.context + const { data: file } = await api.files.get(fileId) + + const isFileNameMatch = (file: Flatfile.File_): boolean => { + const { matchFilename: regex } = this.options + + if (R.isNil(regex)) { + // allow mapping to continue b/c we weren't explicitly told not to + return true + } else { + if (regex.global) { + regex.lastIndex = 0 + } + return regex.test(file.name) + } + } + + if (!this.isFileNameMatch(file)) { + //create new job + } + }) + + listener.use(exportPDF()) + + listener.use( + configureSpace({ + workbooks: [ + { + name: 'Sandbox', + sheets: [ + { + name: 'Contacts', + slug: 'contacts', + allowAdditionalFields: true, + fields: [ + { + key: 'firstName', + type: 'string', + label: 'First Name', + }, + { + key: 'lastName', + type: 'string', + label: 'Last Name', + }, + { + key: 'email', + type: 'string', + label: 'Email', + }, + { + key: 'phone', + type: 'string', + label: 'Phone', + }, + { + key: 'country', + type: 'string', + label: 'Country', + }, + ], + actions: [ + { + operation: 'generatePDFReport', + mode: 'foreground', + label: 'Export PDF', + description: 'Export this sheet as a PDF.', + }, + ], + }, + ], + }, + ], + }) + ) } diff --git a/package-lock.json b/package-lock.json index 69c06be83..22807e8ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,12 +12,14 @@ "bundlers/*", "convert/*", "enrich/*", + "export/*", "extract/*", "flatfilers/*", "import/*", "plugins/*", "support/*", "utils/*", + "export/*", "validate/*", "enrich/*" ], @@ -117,6 +119,45 @@ "@flatfile/listener": "^1.1.0" } }, + "export/pdf": { + "name": "@flatfile/plugin-export-pdf", + "version": "0.0.0", + "license": "ISC", + "dependencies": { + "@anthropic-ai/sdk": "^0.29.0", + "@flatfile/api": "^1.9.19", + "@flatfile/plugin-space-configure": "0.6.1", + "@flatfile/util-common": "^1.4.1", + "pdf-lib": "^1.17.1" + }, + "devDependencies": { + "@flatfile/hooks": "^1.5.0", + "@flatfile/rollup-config": "^0.1.1", + "@types/node": "^22.7.4", + "typescript": "^5.6.2" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@flatfile/listener": "^1.0.5" + } + }, + "export/pdf/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "export/pdf/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + }, "extract/html-table": { "name": "@flatfile/plugin-extract-html-table", "version": "1.0.0", @@ -156,6 +197,7 @@ } }, "import/rss": { + "name": "@flatfile/plugin-import-rss", "version": "0.0.0", "license": "ISC", "dependencies": { @@ -185,6 +227,39 @@ "node": ">=6.0.0" } }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.29.0.tgz", + "integrity": "sha512-3Hj28b7pAqFbGW19jXRqMvyDr09qBcL0iEuvERpbjXaqWD8dwfmMiwWreNcRvAKjeP4W4xTh0JStONvwhOTjEw==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.55.tgz", + "integrity": "sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "9.0.9", "dev": true, @@ -3219,6 +3294,10 @@ "resolved": "enrich/summarize", "link": true }, + "node_modules/@flatfile/plugin-export-pdf": { + "resolved": "export/pdf", + "link": true + }, "node_modules/@flatfile/plugin-export-workbook": { "resolved": "plugins/export-workbook", "link": true @@ -6237,6 +6316,32 @@ "@parcel/core": "^2.12.0" } }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/standard-fonts/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@pdf-lib/upng/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "license": "MIT", @@ -8188,7 +8293,6 @@ }, "node_modules/@types/node-fetch": { "version": "2.6.11", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -8659,8 +8763,7 @@ }, "node_modules/axios": { "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -11506,6 +11609,23 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, "node_modules/forwarded": { "version": "0.2.0", "dev": true, @@ -11943,8 +12063,7 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } @@ -15977,6 +16096,24 @@ "node": ">= 0.10.5" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "license": "MIT", @@ -16026,8 +16163,7 @@ }, "node_modules/node-html-parser": { "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "license": "MIT", "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" @@ -16682,6 +16818,27 @@ "node": ">=8" } }, + "node_modules/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdf-lib/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/pdf-lib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/picocolors": { "version": "1.0.1", "license": "ISC" @@ -18018,8 +18175,7 @@ }, "node_modules/rss-parser": { "version": "3.13.0", - "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", - "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "license": "MIT", "dependencies": { "entities": "^2.0.3", "xml2js": "^0.5.0" @@ -18027,8 +18183,7 @@ }, "node_modules/rss-parser/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -20028,6 +20183,14 @@ "dev": true, "license": "MIT" }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "license": "BSD-2-Clause" @@ -20279,7 +20442,6 @@ "version": "0.20.2", "resolved": "https://cdn.sheetjs.com/xlsx-0.20.2/xlsx-0.20.2.tgz", "integrity": "sha512-+nKZ39+nvK7Qq6i0PvWWRA4j/EkfWOtkP/YhMtupm+lJIiHxUrgTr1CcKv1nBk1rHtkRRQ3O2+Ih/q/sA+FXZA==", - "license": "Apache-2.0", "bin": { "xlsx": "bin/xlsx.njs" }, @@ -20306,8 +20468,7 @@ }, "node_modules/xml2js": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "license": "MIT", "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" @@ -20318,8 +20479,7 @@ }, "node_modules/xmlbuilder": { "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", "engines": { "node": ">=4.0" } diff --git a/package.json b/package.json index a21d368f5..23bca65c9 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,14 @@ "bundlers/*", "convert/*", "enrich/*", + "export/*", "extract/*", "flatfilers/*", "import/*", "plugins/*", "support/*", "utils/*", + "export/*", "validate/*", "enrich/*" ],