simple-pdf-generator
Advanced tools
Comparing version 2.1.1 to 3.0.0
export * from './PdfFiller'; | ||
export * from './PdfGenerator'; | ||
export * from './Server'; | ||
export * from './utils'; |
@@ -19,3 +19,2 @@ "use strict"; | ||
__exportStar(require("./PdfGenerator"), exports); | ||
__exportStar(require("./Server"), exports); | ||
__exportStar(require("./utils"), exports); |
/// <reference types="node" /> | ||
import { Asset } from './PdfGenerator'; | ||
import puppeteer from 'puppeteer'; | ||
interface PdfFieldOptions { | ||
fieldName?: string; | ||
} | ||
export declare function PdfField(options?: PdfFieldOptions): (target: any, propertyKey: string) => void; | ||
interface PdfTableOptions { | ||
tableName?: string; | ||
} | ||
export declare function PdfTable(options?: PdfTableOptions): (target: any, propertyKey: string) => void; | ||
interface PdfTemplateOptions { | ||
import { PDFOptions } from 'puppeteer'; | ||
export declare function PdfField(): (target: object, propertyKey: string) => void; | ||
export declare function PdfTable(): (target: object, propertyKey: string) => void; | ||
type PdfTemplateOptions = { | ||
templatePath: string; | ||
pdfOptions?: puppeteer.PDFOptions; | ||
pdfOptions?: PDFOptions; | ||
includes?: Asset[]; | ||
} | ||
export declare function PdfTemplate(options: PdfTemplateOptions): (target: any) => void; | ||
}; | ||
export declare function PdfTemplate(options: PdfTemplateOptions): (target: object) => void; | ||
export declare abstract class PdfFiller { | ||
[key: string]: unknown; | ||
private static searchRegex; | ||
fill(): Promise<Buffer>; | ||
fill(pdfOptions: puppeteer.PDFOptions): Promise<Buffer>; | ||
fill(outputPath: string): Promise<Buffer>; | ||
fill(outputPath: string, pdfOptions: puppeteer.PDFOptions): Promise<Buffer>; | ||
fill(outputPath?: string): Promise<Buffer>; | ||
fill(outputPath?: string, pdfOptions?: PDFOptions): Promise<Buffer>; | ||
} | ||
export {}; |
@@ -11,5 +11,7 @@ "use strict"; | ||
const utils_1 = require("./utils"); | ||
function PdfField(options) { | ||
const mime_1 = __importDefault(require("mime")); | ||
const validator_1 = __importDefault(require("validator")); | ||
function PdfField() { | ||
return function (target, propertyKey) { | ||
PdfFieldClass.registerDecorator(target, propertyKey, options); | ||
PdfFieldClass.registerDecorator(target, propertyKey); | ||
}; | ||
@@ -19,9 +21,11 @@ } | ||
class PdfFieldClass { | ||
static registerDecorator(target, property, options) { | ||
static registerDecorator(target, property) { | ||
let keys = this.decoratorsMap.get(target); | ||
if (!keys) { | ||
keys = []; | ||
keys = new Map(); | ||
this.decoratorsMap.set(target, keys); | ||
} | ||
keys.push({ propertyName: property, constructor: target.constructor, fieldOptions: options }); | ||
keys.set(property, { | ||
propertyName: property, | ||
}); | ||
} | ||
@@ -34,5 +38,5 @@ static getDecorators(target) { | ||
PdfFieldClass.decoratorsMap = new Map(); | ||
function PdfTable(options) { | ||
function PdfTable() { | ||
return function (target, propertyKey) { | ||
PdfTableClass.registerDecorator(target, propertyKey, options); | ||
PdfTableClass.registerDecorator(target, propertyKey); | ||
}; | ||
@@ -42,3 +46,3 @@ } | ||
class PdfTableClass { | ||
static registerDecorator(target, property, options) { | ||
static registerDecorator(target, property) { | ||
let keys = this.decoratorsMap.get(target); | ||
@@ -49,3 +53,5 @@ if (!keys) { | ||
} | ||
keys.push({ propertyName: property, constructor: target.constructor, fieldOptions: options }); | ||
keys.push({ | ||
propertyName: property, | ||
}); | ||
} | ||
@@ -66,3 +72,6 @@ static getDecorators(target) { | ||
static registerDecorator(target, options) { | ||
this.decoratorMap.set(target, { className: target.constructor.name, options: options }); | ||
this.decoratorMap.set(target, { | ||
className: target.constructor.name, | ||
options: options, | ||
}); | ||
} | ||
@@ -75,66 +84,80 @@ static getDecorators(target) { | ||
class PdfFiller { | ||
async fill(args, pdfOptions) { | ||
var _a; | ||
let outputPath = null; | ||
let __pdfOptions = null; | ||
if (typeof (args) == 'string') { | ||
outputPath = args; | ||
} | ||
else { | ||
__pdfOptions = args; | ||
} | ||
if (pdfOptions != null) { | ||
__pdfOptions = pdfOptions; | ||
} | ||
async fill(outputPath, pdfOptions) { | ||
var _a, _b, _c; | ||
const fieldDecorators = PdfFieldClass.getDecorators(this); | ||
const tableDecorators = PdfTableClass.getDecorators(this); | ||
const classDecorators = PdfTemplateClass.getDecorators(this); | ||
if (classDecorators != null && fieldDecorators != null) { | ||
let template = (await fs_1.default.promises.readFile(classDecorators.options.templatePath)).toString(); | ||
fieldDecorators.forEach(property => { | ||
var _a, _b; | ||
template = template.replace(new RegExp(`%%${(_b = (_a = property.fieldOptions) === null || _a === void 0 ? void 0 : _a.fieldName) !== null && _b !== void 0 ? _b : property.propertyName}%%`, 'g'), Reflect.get(this, property.propertyName)); | ||
}); | ||
const includes = new Array(); | ||
includes.push({ path: path_1.default.join(__dirname, '..', 'template', 'css', 'bootstrap.min.css') }); | ||
includes.push({ path: path_1.default.join(__dirname, '..', 'template', 'js', 'jquery.min.js') }); | ||
includes.push({ path: path_1.default.join(__dirname, '..', 'template', 'js', 'bootstrap.min.js') }); | ||
(_a = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.options.includes) === null || _a === void 0 ? void 0 : _a.forEach(element => { | ||
includes.push(element); | ||
}); | ||
if (tableDecorators != null) { | ||
const tableData = new Object(); | ||
tableDecorators.forEach(element => { | ||
var _a, _b; | ||
Object.defineProperty(tableData, (_b = (_a = element.fieldOptions) === null || _a === void 0 ? void 0 : _a.tableName) !== null && _b !== void 0 ? _b : element.propertyName, { | ||
value: Reflect.get(this, element.propertyName), | ||
enumerable: true, | ||
}); | ||
}); | ||
let script = (await fs_1.default.promises.readFile(path_1.default.join(__dirname, '..', 'template', 'js', 'table-generator.js'))).toString(); | ||
script = script.replace('tablesData', `tablesData = ${(0, utils_1.stringify)(tableData)}`); | ||
includes.push({ content: script, type: 'js' }); | ||
if (classDecorators == null) { | ||
throw new Error('Missing mandatory decorators'); | ||
} | ||
let template = (await fs_1.default.promises.readFile(classDecorators.options.templatePath)).toString(); | ||
const includes = new Array(); | ||
for (const include of (_a = classDecorators.options.includes) !== null && _a !== void 0 ? _a : []) { | ||
includes.push(include); | ||
} | ||
const matches = template.matchAll(PdfFiller.searchRegex); | ||
for (const match of matches) { | ||
if (((_b = match.groups) === null || _b === void 0 ? void 0 : _b['propName']) != null) { | ||
if (fieldDecorators != null) { | ||
const decorator = fieldDecorators.get(match.groups.propName); | ||
if (decorator != null) { | ||
const value = Reflect.get(this, decorator.propertyName); | ||
if (value != null) { | ||
template = template.replace(match[0], validator_1.default.escape(value.toString())); | ||
} | ||
} | ||
} | ||
} | ||
let _pdfOptions = {}; | ||
if (classDecorators.options.pdfOptions != null) { | ||
_pdfOptions = Object.assign(_pdfOptions, classDecorators.options.pdfOptions); | ||
else if (((_c = match.groups) === null || _c === void 0 ? void 0 : _c['imgSrc']) != null) { | ||
const mimeType = mime_1.default.getType(match.groups.imgSrc); | ||
if (mimeType != null) { | ||
try { | ||
let imgSrc = match.groups.imgSrc; | ||
if (!path_1.default.isAbsolute(match.groups.imgSrc)) { | ||
imgSrc = path_1.default.join(path_1.default.dirname(classDecorators.options.templatePath), match.groups.imgSrc); | ||
} | ||
const data = await fs_1.default.promises.readFile(imgSrc); | ||
const base64 = data.toString('base64'); | ||
const newSrc = `data:${mimeType};base64,${base64}`; | ||
template = template.replace(match[0], match[0].replace(match.groups.imgSrc, newSrc)); | ||
} | ||
catch (e) { | ||
console.error(e); | ||
} | ||
} | ||
} | ||
if (__pdfOptions != null) { | ||
_pdfOptions = Object.assign(_pdfOptions, __pdfOptions); | ||
} | ||
if (tableDecorators != null) { | ||
const tableData = new Object(); | ||
for (const decorator of tableDecorators) { | ||
Object.defineProperty(tableData, decorator.propertyName, { | ||
value: Reflect.get(this, decorator.propertyName), | ||
enumerable: true, | ||
}); | ||
} | ||
const pdf = await PdfGenerator_1.PdfGenerator.getPdf({ | ||
options: { | ||
template: template, | ||
includes: includes, | ||
}, | ||
pdfOptions: _pdfOptions, | ||
}); | ||
if (outputPath != null) { | ||
await fs_1.default.promises.writeFile(outputPath, pdf); | ||
} | ||
return pdf; | ||
let script = PdfGenerator_1.PdfGenerator.tableGeneratorScript; | ||
script = script.replace('tablesData', `tablesData = ${(0, utils_1.stringify)(tableData)}`); | ||
includes.push({ content: script, type: 'js' }); | ||
} | ||
throw new Error('Missing mandatory decorators'); | ||
let _pdfOptions = {}; | ||
if (classDecorators.options.pdfOptions != null) { | ||
_pdfOptions = Object.assign(_pdfOptions, classDecorators.options.pdfOptions); | ||
} | ||
if (pdfOptions != null) { | ||
_pdfOptions = Object.assign(_pdfOptions, pdfOptions); | ||
} | ||
const pdf = await PdfGenerator_1.PdfGenerator.getPdf({ | ||
options: { | ||
template: template, | ||
includes: includes, | ||
}, | ||
pdfOptions: _pdfOptions, | ||
}); | ||
if (outputPath != null) { | ||
await fs_1.default.promises.writeFile(outputPath, pdf); | ||
} | ||
return pdf; | ||
} | ||
} | ||
exports.PdfFiller = PdfFiller; | ||
PdfFiller.searchRegex = new RegExp('(?:%%(?<propName>.*)%%)|(?:<img[^>]*src="(?<imgSrc>.*?)"[^>]*>)', 'g'); |
/// <reference types="node" /> | ||
import puppeteer from 'puppeteer'; | ||
import { PDFOptions } from 'puppeteer'; | ||
export interface Asset { | ||
@@ -14,3 +14,3 @@ path?: string; | ||
export interface PdfGeneratorOptions { | ||
pdfOptions?: puppeteer.PDFOptions; | ||
pdfOptions?: PDFOptions; | ||
options?: PdfGeneratorTemplateOptions; | ||
@@ -20,13 +20,8 @@ } | ||
private static _browser; | ||
private static _server; | ||
private static _browserDisconnected; | ||
static get staticFilePath(): string | undefined; | ||
static set staticFilePath(val: string | undefined); | ||
static start(): Promise<void>; | ||
static stop(): Promise<void>; | ||
private static _tableGeneratorScript; | ||
static get tableGeneratorScript(): string; | ||
private static _startBrowser; | ||
private static _startServer; | ||
static getPdf(options: PdfGeneratorOptions): Promise<Buffer>; | ||
private static includeAssets; | ||
private static _readContentOrFile; | ||
private static _includeAssets; | ||
} |
@@ -7,34 +7,22 @@ "use strict"; | ||
exports.PdfGenerator = void 0; | ||
const Server_1 = require("./Server"); | ||
const puppeteer_1 = __importDefault(require("puppeteer")); | ||
const lodash_1 = __importDefault(require("lodash")); | ||
const fs_1 = __importDefault(require("fs")); | ||
const utils_1 = require("./utils"); | ||
const path_1 = __importDefault(require("path")); | ||
class PdfGenerator { | ||
static get staticFilePath() { | ||
return this._server.staticFolderPath; | ||
static get tableGeneratorScript() { | ||
if (this._tableGeneratorScript === '') { | ||
this._tableGeneratorScript = fs_1.default | ||
.readFileSync(path_1.default.join(__dirname, '..', 'template', 'js', 'table-generator.js')) | ||
.toString(); | ||
} | ||
return this._tableGeneratorScript; | ||
} | ||
static set staticFilePath(val) { | ||
this._server.staticFolderPath = val; | ||
} | ||
static async start() { | ||
await this._startServer(); | ||
await this._startBrowser(); | ||
} | ||
static async stop() { | ||
var _a; | ||
await ((_a = this._browser) === null || _a === void 0 ? void 0 : _a.close()); | ||
this._server.close(); | ||
} | ||
static async _startBrowser() { | ||
const browser_args = ['--proxy-server=\'direct://\'', '--proxy-bypass-list=*']; | ||
const browser_args = ["--proxy-server='direct://'", '--proxy-bypass-list=*', '--disable-web-security']; | ||
if (process.env.PUPPETEER_NO_SANDBOX === 'true') { | ||
browser_args.push(...['--no-sandbox', '--disable-setuid-sandbox']); | ||
} | ||
let headless = true; | ||
if (process.env.PUPPETEER_NO_HEADLESS === 'true') { | ||
headless = false; | ||
} | ||
this._browser = await puppeteer_1.default.launch({ | ||
headless: headless, | ||
headless: process.env.PUPPETEER_NO_HEADLESS === 'true' ? false : 'new', | ||
args: browser_args, | ||
@@ -51,9 +39,6 @@ defaultViewport: null, | ||
} | ||
static async _startServer() { | ||
this._server = new Server_1.Server(); | ||
} | ||
static async getPdf(options) { | ||
var _a, _b, _c; | ||
if (this._browserDisconnected) { | ||
await new Promise(f => setTimeout(f, 10000)); | ||
await new Promise((f) => setTimeout(f, 10000)); | ||
await this._startBrowser(); | ||
@@ -64,33 +49,14 @@ } | ||
} | ||
if (this._server == null) { | ||
await this._startServer(); | ||
} | ||
if (this._browser == null) { | ||
throw new Error('Browser is broken'); | ||
throw new Error('Browser not started'); | ||
} | ||
const page = await this._browser.newPage(); | ||
await page.emulateMediaType('screen'); | ||
await page.goto(this._server.address); | ||
const template = await this._readContentOrFile((_a = options.options) === null || _a === void 0 ? void 0 : _a.template, (_b = options.options) === null || _b === void 0 ? void 0 : _b.templatePath); | ||
const template = await (0, utils_1.readContentOrFile)((_a = options.options) === null || _a === void 0 ? void 0 : _a.template, (_b = options.options) === null || _b === void 0 ? void 0 : _b.templatePath); | ||
if (template !== '') { | ||
if (/^\s*<!doctype html>/i.test(template)) { | ||
await page.setContent(template); | ||
} | ||
else { | ||
await page.evaluate((body) => { | ||
const bodyElement = document.querySelector('body'); | ||
if (bodyElement != null) { | ||
bodyElement.innerHTML = body; | ||
} | ||
}, template); | ||
} | ||
await page.setContent(template); | ||
} | ||
if (((_c = options.options) === null || _c === void 0 ? void 0 : _c.includes) != null) { | ||
await this.includeAssets(page, options.options.includes); | ||
await this._includeAssets(page, options.options.includes); | ||
} | ||
await page.waitForFunction('window.jQuery'); | ||
await page.waitForFunction('$(window).ready'); | ||
await page.evaluate(() => { | ||
document.dispatchEvent(new CustomEvent('start')); | ||
}); | ||
let pdfOptions = { | ||
@@ -113,3 +79,3 @@ format: 'A4', | ||
} | ||
static async includeAssets(page, includes) { | ||
static async _includeAssets(page, includes) { | ||
for (const include of includes) { | ||
@@ -124,20 +90,18 @@ let type = ''; | ||
if (type === 'css') { | ||
await page.addStyleTag({ content: include.content, path: include.path }); | ||
await page.addStyleTag({ | ||
content: include.content, | ||
path: include.path, | ||
}); | ||
} | ||
else if (type === 'js') { | ||
await page.addScriptTag({ content: include.content, path: include.path }); | ||
await page.addScriptTag({ | ||
content: include.content, | ||
path: include.path, | ||
}); | ||
} | ||
} | ||
} | ||
static async _readContentOrFile(content, path) { | ||
if (content) | ||
return lodash_1.default.toString(content); | ||
if (!path) | ||
return ''; | ||
if ((await fs_1.default.promises.stat(path)).isDirectory()) | ||
return ''; | ||
return (await fs_1.default.promises.readFile(path)).toString(); | ||
} | ||
} | ||
exports.PdfGenerator = PdfGenerator; | ||
PdfGenerator._browserDisconnected = false; | ||
PdfGenerator._tableGeneratorScript = ''; |
export declare function getFileExtension(filename: string): string; | ||
export declare function stringify(obj: Record<string, any>): string; | ||
export declare function readContentOrFile(content?: string, filePath?: string): Promise<string>; |
@@ -6,4 +6,5 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.stringify = exports.getFileExtension = void 0; | ||
exports.readContentOrFile = exports.stringify = exports.getFileExtension = void 0; | ||
const path_1 = __importDefault(require("path")); | ||
const fs_1 = __importDefault(require("fs")); | ||
function getFileExtension(filename) { | ||
@@ -20,1 +21,11 @@ return path_1.default.extname(filename).substring(1); | ||
exports.stringify = stringify; | ||
async function readContentOrFile(content, filePath) { | ||
if (content) | ||
return content; | ||
if (!filePath) | ||
return ''; | ||
if ((await fs_1.default.promises.stat(filePath)).isDirectory()) | ||
return ''; | ||
return (await fs_1.default.promises.readFile(filePath)).toString(); | ||
} | ||
exports.readContentOrFile = readContentOrFile; |
{ | ||
"name": "simple-pdf-generator", | ||
"version": "2.1.1", | ||
"version": "3.0.0", | ||
"description": "Generator of PDF files from HTML templates using TS decorators", | ||
@@ -28,15 +28,17 @@ "main": "./lib/index.js", | ||
"devDependencies": { | ||
"@types/lodash": "^4.14.182", | ||
"@types/node": "^17.0.41", | ||
"@types/stringify-object": "^4.0.1", | ||
"@typescript-eslint/eslint-plugin": "^5.27.1", | ||
"@typescript-eslint/parser": "^5.27.1", | ||
"eslint": "^8.17.0", | ||
"eslint-plugin-import": "^2.26.0", | ||
"ts-node": "^10.8.1", | ||
"typescript": "^4.7.3" | ||
"@types/mime": "^3.0.1", | ||
"@types/node": "^20.5.9", | ||
"@types/stringify-object": "^4.0.2", | ||
"@types/validator": "^13.11.1", | ||
"@typescript-eslint/eslint-plugin": "^6.5.0", | ||
"@typescript-eslint/parser": "^6.5.0", | ||
"eslint": "^8.48.0", | ||
"eslint-plugin-import": "^2.28.1", | ||
"ts-node": "^10.9.1", | ||
"typescript": "^5.2.2" | ||
}, | ||
"dependencies": { | ||
"lodash": "^4.17.21", | ||
"puppeteer": "^14.3.0" | ||
"mime": "^3.0.0", | ||
"puppeteer": "^21.1.1", | ||
"validator": "^13.11.0" | ||
}, | ||
@@ -43,0 +45,0 @@ "scripts": { |
@@ -20,3 +20,2 @@ # Simple PDF Generator | ||
- useses Bootstrap (5.1.0) and jQuery (3.6.0), they will be injected automatically in the HTML file; | ||
- supports custom CSS and JS; | ||
@@ -109,7 +108,7 @@ - fills custom fields in the HTML template; | ||
export class Template extends PdfFiller { | ||
@PdfField({ fieldName: 'custom-field-name' }) | ||
@PdfField() | ||
field = ''; | ||
@PdfTable({ fieldName: 'data' }) | ||
tableData = new Array<TableRow>(); | ||
@PdfTable() | ||
data = new Array<TableRow>(); | ||
} | ||
@@ -177,8 +176,8 @@ ``` | ||
Extend abstract class `PdfFiller` and use the following decorators: | ||
Extend abstract class `PdfFiller` and use the following decorators on the properties: | ||
| Decorator | Parameters | HTML use | | ||
|---|---|---| | ||
| `PdfField` | `{fieldName: string}` | `%%fieldName%%` | | ||
| `PdfTable` | `{tableName: string}` | `<inject-table :items="fieldName">`<br> `<inject-column prop="name" label="Name"/>`<br> `<inject-column prop="surname" label="Surname"/>`<br>`</inject-table>` | | ||
| Decorator | HTML use | | ||
|---|---| | ||
| `PdfField` | `%%propertyName%%` | | ||
| `PdfTable` | `<inject-table :items="propertyName">`<br> `<inject-column prop="name" label="Name"/>`<br> `<inject-column prop="surname" label="Surname"/>`<br>`</inject-table>` | | ||
@@ -254,6 +253,6 @@ ### `fill` | ||
export class Template extends PdfFiller { | ||
@PdfField({ fieldName: 'firstField' }) | ||
@PdfField() | ||
firstField = ''; | ||
@PdfField({ fieldName: 'secondField' }) | ||
@PdfField() | ||
secondField = ''; | ||
@@ -260,0 +259,0 @@ } |
@@ -18,8 +18,23 @@ /* eslint-disable no-undef */ | ||
newTable.setAttribute('class', table.getAttribute('class')); | ||
newTable.setAttribute(':items', table.getAttribute(':items')); | ||
newTable.setAttribute('id', table.getAttribute('id')); | ||
newTable.setAttribute('style', table.getAttribute('style')); | ||
const classAttribute = table.getAttribute('class'); | ||
if (classAttribute != null) { | ||
newTable.className = classAttribute; | ||
} | ||
for (const column of columns) { | ||
const idAttribute = table.getAttribute('id'); | ||
if (idAttribute != null) { | ||
newTable.id = idAttribute; | ||
} | ||
const styleAttribute = table.getAttribute('style'); | ||
if (styleAttribute != null) { | ||
newTable.style = styleAttribute; | ||
} | ||
const itemAttribute = table.getAttribute('items'); | ||
if (itemAttribute != null) { | ||
newTable.setAttribute('items', itemAttribute); | ||
} | ||
for (const column of columns.values()) { | ||
const cell = document.createElement('th'); | ||
@@ -52,6 +67,6 @@ | ||
function populateTable(table) { | ||
const tableFound = tables.find(documentTable => documentTable === table); | ||
if (tableFound == null) return; | ||
const tableFound = tables.find((documentTable) => documentTable === table); | ||
if (tableFound === undefined) return; | ||
const data = Reflect.get(tablesData, tableFound.getAttribute(':items')); | ||
const data = Reflect.get(tablesData, tableFound.getAttribute('items')); | ||
@@ -79,1 +94,3 @@ const headColumns = [...tableFound.tHead.rows[0].cells]; | ||
} | ||
createTables(); |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
0
27909
3
10
14
433
293
+ Addedmime@^3.0.0
+ Addedvalidator@^13.11.0
+ Added@babel/code-frame@7.26.2(transitive)
+ Added@babel/helper-validator-identifier@7.25.9(transitive)
+ Added@puppeteer/browsers@1.9.1(transitive)
+ Added@tootallnate/quickjs-emscripten@0.23.0(transitive)
+ Addedagent-base@7.1.3(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@4.3.0(transitive)
+ Addedargparse@2.0.1(transitive)
+ Addedast-types@0.13.4(transitive)
+ Addedb4a@1.6.7(transitive)
+ Addedbare-events@2.5.4(transitive)
+ Addedbasic-ftp@5.0.5(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedchromium-bidi@0.5.8(transitive)
+ Addedcliui@8.0.1(transitive)
+ Addedcolor-convert@2.0.1(transitive)
+ Addedcolor-name@1.1.4(transitive)
+ Addedcosmiconfig@9.0.0(transitive)
+ Addedcross-fetch@4.0.0(transitive)
+ Addeddata-uri-to-buffer@6.0.2(transitive)
+ Addeddegenerator@5.0.1(transitive)
+ Addeddevtools-protocol@0.0.1232444(transitive)
+ Addedemoji-regex@8.0.0(transitive)
+ Addedenv-paths@2.2.1(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedescalade@3.2.0(transitive)
+ Addedescodegen@2.1.0(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedestraverse@5.3.0(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedfast-fifo@1.3.2(transitive)
+ Addedget-caller-file@2.0.5(transitive)
+ Addedget-uri@6.0.4(transitive)
+ Addedhttp-proxy-agent@7.0.2(transitive)
+ Addedhttps-proxy-agent@7.0.6(transitive)
+ Addedimport-fresh@3.3.1(transitive)
+ Addedip-address@9.0.5(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-fullwidth-code-point@3.0.0(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedjs-yaml@4.1.0(transitive)
+ Addedjsbn@1.1.0(transitive)
+ Addedjson-parse-even-better-errors@2.3.1(transitive)
+ Addedlines-and-columns@1.2.4(transitive)
+ Addedlru-cache@7.18.3(transitive)
+ Addedmime@3.0.0(transitive)
+ Addedmitt@3.0.1(transitive)
+ Addednetmask@2.0.2(transitive)
+ Addednode-fetch@2.7.0(transitive)
+ Addedpac-proxy-agent@7.2.0(transitive)
+ Addedpac-resolver@7.0.1(transitive)
+ Addedparent-module@1.0.1(transitive)
+ Addedparse-json@5.2.0(transitive)
+ Addedpicocolors@1.1.1(transitive)
+ Addedproxy-agent@6.3.1(transitive)
+ Addedpuppeteer@21.11.0(transitive)
+ Addedpuppeteer-core@21.11.0(transitive)
+ Addedrequire-directory@2.1.1(transitive)
+ Addedresolve-from@4.0.0(transitive)
+ Addedsmart-buffer@4.2.0(transitive)
+ Addedsocks@2.8.4(transitive)
+ Addedsocks-proxy-agent@8.0.5(transitive)
+ Addedsource-map@0.6.1(transitive)
+ Addedsprintf-js@1.1.3(transitive)
+ Addedstreamx@2.22.0(transitive)
+ Addedstring-width@4.2.3(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedtar-fs@3.0.4(transitive)
+ Addedtar-stream@3.1.7(transitive)
+ Addedtext-decoder@1.2.3(transitive)
+ Addedtslib@2.8.1(transitive)
+ Addedurlpattern-polyfill@10.0.0(transitive)
+ Addedvalidator@13.12.0(transitive)
+ Addedwrap-ansi@7.0.0(transitive)
+ Addedws@8.16.0(transitive)
+ Addedy18n@5.0.8(transitive)
+ Addedyargs@17.7.2(transitive)
+ Addedyargs-parser@21.1.1(transitive)
- Removedlodash@^4.17.21
- Removedagent-base@6.0.2(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedbl@4.1.0(transitive)
- Removedbrace-expansion@1.1.11(transitive)
- Removedchownr@1.1.4(transitive)
- Removedconcat-map@0.0.1(transitive)
- Removedcross-fetch@3.1.5(transitive)
- Removeddevtools-protocol@0.0.1001819(transitive)
- Removedfind-up@4.1.0(transitive)
- Removedfs-constants@1.0.0(transitive)
- Removedfs.realpath@1.0.0(transitive)
- Removedglob@7.2.3(transitive)
- Removedhttps-proxy-agent@5.0.1(transitive)
- Removedinflight@1.0.6(transitive)
- Removedinherits@2.0.4(transitive)
- Removedlocate-path@5.0.0(transitive)
- Removedlodash@4.17.21(transitive)
- Removedminimatch@3.1.2(transitive)
- Removednode-fetch@2.6.7(transitive)
- Removedp-limit@2.3.0(transitive)
- Removedp-locate@4.1.0(transitive)
- Removedp-try@2.2.0(transitive)
- Removedpath-exists@4.0.0(transitive)
- Removedpath-is-absolute@1.0.1(transitive)
- Removedpkg-dir@4.2.0(transitive)
- Removedpuppeteer@14.4.1(transitive)
- Removedreadable-stream@3.6.2(transitive)
- Removedrimraf@3.0.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedstring_decoder@1.3.0(transitive)
- Removedtar-fs@2.1.1(transitive)
- Removedtar-stream@2.2.0(transitive)
- Removedutil-deprecate@1.0.2(transitive)
- Removedws@8.7.0(transitive)
Updatedpuppeteer@^21.1.1