refactor: engine output

This commit is contained in:
Artemy 2024-05-13 13:30:47 +03:00
parent 494d1c8134
commit bdf625bb1f
13 changed files with 97 additions and 66 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@txtdot/plugins", "name": "@txtdot/plugins",
"version": "1.1.1", "version": "2.0.0",
"description": "Official txtdot plugins", "description": "Official txtdot plugins",
"main": "dist/lib.js", "main": "dist/lib.js",
"types": "dist/lib.d.ts", "types": "dist/lib.d.ts",
@ -19,6 +19,7 @@
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@mozilla/readability": "^0.5.0", "@mozilla/readability": "^0.5.0",
"linkedom": "^0.18.0",
"@txtdot/sdk": "workspace:*" "@txtdot/sdk": "workspace:*"
}, },
"devDependencies": { "devDependencies": {

View File

@ -1,6 +1,7 @@
import { Readability as OReadability } from '@mozilla/readability'; import { Readability as OReadability } from '@mozilla/readability';
import { Engine, EngineParseError } from '@txtdot/sdk'; import { Engine, EngineParseError } from '@txtdot/sdk';
import { parseHTML } from 'linkedom';
const Readability = new Engine( const Readability = new Engine(
'Readability', 'Readability',
@ -9,7 +10,7 @@ const Readability = new Engine(
); );
Readability.route('*path', async (input, ro) => { Readability.route('*path', async (input, ro) => {
const reader = new OReadability(input.parseDom().window.document); const reader = new OReadability(input.document);
const parsed = reader.parse(); const parsed = reader.parse();
if (!parsed) { if (!parsed) {
@ -17,7 +18,7 @@ Readability.route('*path', async (input, ro) => {
} }
return { return {
content: parsed.content, document: parseHTML(parsed.content).document,
textContent: parsed.textContent, textContent: parsed.textContent,
title: parsed.title, title: parsed.title,
lang: parsed.lang, lang: parsed.lang,

View File

@ -1,5 +1,6 @@
import { Engine } from '@txtdot/sdk'; import { Engine } from '@txtdot/sdk';
import { HandlerInput, Route } from '@txtdot/sdk'; import { HandlerInput, Route } from '@txtdot/sdk';
import { parseHTML } from 'linkedom';
const SearX = new Engine('SearX', "Engine for searching with 'SearXNG'", [ const SearX = new Engine('SearX', "Engine for searching with 'SearXNG'", [
'searx.*', 'searx.*',
@ -9,7 +10,7 @@ async function search(
input: HandlerInput, input: HandlerInput,
ro: Route<{ search: string; pageno?: string }> ro: Route<{ search: string; pageno?: string }>
) { ) {
const document = input.parseDom().window.document; const document = input.document;
const search = ro.q.search; const search = ro.q.search;
const page = parseInt(ro.q.pageno || '1'); const page = parseInt(ro.q.pageno || '1');
@ -45,7 +46,7 @@ async function search(
const textContent = articles_parsed.map((a) => a.text).join(''); const textContent = articles_parsed.map((a) => a.text).join('');
return { return {
content, document: parseHTML(content).document,
textContent, textContent,
title: `${search} - Searx - Page ${page}`, title: `${search} - Searx - Page ${page}`,
lang: document.documentElement.lang, lang: document.documentElement.lang,

View File

@ -1,10 +1,11 @@
import { HandlerInput, Route } from '@txtdot/sdk'; import { HandlerInput, Route } from '@txtdot/sdk';
import { parseHTML } from 'linkedom';
async function questions( async function questions(
input: HandlerInput, input: HandlerInput,
ro: Route<{ id: string; slug: string }> ro: Route<{ id: string; slug: string }>
) { ) {
const document = input.parseDom().window.document; const document = input.document;
const questionEl = document.getElementById('question'); const questionEl = document.getElementById('question');
const question = postParser(questionEl); const question = postParser(questionEl);
@ -15,9 +16,9 @@ async function questions(
const answers = allAnswers.map((a) => postParser(a)); const answers = allAnswers.map((a) => postParser(a));
return { return {
content: `${question}<hr>${answers.length} answers <hr>${answers.join( document: parseHTML(
'<hr>' `${question}<hr>${answers.length} answers <hr>${answers.join('<hr>')}`
)}`, ).document,
textContent: `${ro.q.id}/${ro.q.slug}\nText output not supported`, // TODO textContent: `${ro.q.id}/${ro.q.slug}\nText output not supported`, // TODO
title, title,
lang: document.documentElement.lang, lang: document.documentElement.lang,

View File

@ -1,10 +1,11 @@
import { HandlerInput, Route } from '@txtdot/sdk'; import { HandlerInput, Route } from '@txtdot/sdk';
import { parseHTML } from 'linkedom';
async function users( async function users(
input: HandlerInput, input: HandlerInput,
ro: Route<{ id: string; slug: string }> ro: Route<{ id: string; slug: string }>
) { ) {
const document = input.parseDom().window.document; const document = input.document;
const userInfo = const userInfo =
document.querySelector('.md\\:ai-start > div:nth-child(2)')?.textContent || document.querySelector('.md\\:ai-start > div:nth-child(2)')?.textContent ||
@ -26,7 +27,8 @@ async function users(
.join('<br/>'); .join('<br/>');
return { return {
content: `${userInfo}<hr><h3>Top Posts</h3>${topPosts}`, document: parseHTML(`${userInfo}<hr><h3>Top Posts</h3>${topPosts}`)
.document,
textContent: `${ro.q.id}/${ro.q.slug}\n`, // TODO textContent: `${ro.q.id}/${ro.q.slug}\n`, // TODO
title: document.querySelector('title')?.textContent || '', title: document.querySelector('title')?.textContent || '',
lang: document.documentElement.lang, lang: document.documentElement.lang,

View File

@ -1,6 +1,6 @@
{ {
"name": "@txtdot/sdk", "name": "@txtdot/sdk",
"version": "1.1.2", "version": "2.0.0",
"description": "SDK for creating plugins for TxtDot", "description": "SDK for creating plugins for TxtDot",
"main": "dist/lib.js", "main": "dist/lib.js",
"types": "dist/lib.d.ts", "types": "dist/lib.d.ts",

View File

@ -2,9 +2,9 @@ import Route from 'route-parser';
import { import {
HandlerInput, HandlerInput,
IHandlerOutput,
EngineFunction, EngineFunction,
RouteValues, RouteValues,
EngineOutput,
} from './types/handler'; } from './types/handler';
import { NoHandlerFoundError } from './types/errors'; import { NoHandlerFoundError } from './types/errors';
@ -33,7 +33,7 @@ export class Engine {
this.routes.push({ route: new Route<TParams>(path), handler }); this.routes.push({ route: new Route<TParams>(path), handler });
} }
async handle(input: HandlerInput): Promise<IHandlerOutput> { async handle(input: HandlerInput): Promise<EngineOutput> {
const url = new URL(input.getUrl()); const url = new URL(input.getUrl());
const path = url.pathname + url.search + url.hash; const path = url.pathname + url.search + url.hash;
for (const route of this.routes) { for (const route of this.routes) {

View File

@ -13,7 +13,7 @@ import {
RouteValues, RouteValues,
EnginesMatch, EnginesMatch,
HandlerInput, HandlerInput,
IHandlerOutput, HandlerOutput,
Route, Route,
handlerSchema, handlerSchema,
} from './types/handler'; } from './types/handler';
@ -29,7 +29,7 @@ export {
RouteValues, RouteValues,
EnginesMatch, EnginesMatch,
HandlerInput, HandlerInput,
IHandlerOutput, HandlerOutput,
Route, Route,
handlerSchema, handlerSchema,
}; };

View File

@ -4,7 +4,7 @@ import { Engine } from '../engine';
export class HandlerInput { export class HandlerInput {
private data: string; private data: string;
private url: string; private url: string;
private dom?: Window; private window?: Window;
constructor(data: string, url: string) { constructor(data: string, url: string) {
this.data = data; this.data = data;
@ -15,23 +15,30 @@ export class HandlerInput {
return this.url; return this.url;
} }
parseDom(): Window { get document(): Document {
if (this.dom) { if (this.window) {
return this.dom; return this.window.document;
} }
this.dom = parseHTML(this.data); this.window = parseHTML(this.data);
return this.dom; return this.window.document;
} }
} }
export interface IHandlerOutput { export interface HandlerOutput {
content: string; content: string;
textContent: string; textContent: string;
title?: string; title?: string;
lang?: string; lang?: string;
} }
export interface EngineOutput {
document: Document;
textContent?: string;
title?: string;
lang?: string;
}
export const handlerSchema = { export const handlerSchema = {
type: 'object', type: 'object',
properties: { properties: {
@ -66,7 +73,7 @@ export interface RouteValues {
export type EngineFunction<TParams extends RouteValues> = ( export type EngineFunction<TParams extends RouteValues> = (
input: HandlerInput, input: HandlerInput,
ro: Route<TParams> ro: Route<TParams>
) => Promise<IHandlerOutput>; ) => Promise<EngineOutput>;
export type EnginesMatch<TParams extends RouteValues> = EngineMatch<TParams>[]; export type EnginesMatch<TParams extends RouteValues> = EngineMatch<TParams>[];

View File

@ -1,6 +1,6 @@
{ {
"name": "@txtdot/server", "name": "@txtdot/server",
"version": "1.7.0", "version": "1.8.0",
"private": true, "private": true,
"description": "txtdot is an HTTP proxy that parses only text, links and pictures from pages reducing internet bandwidth usage, removing ads and heavy scripts", "description": "txtdot is an HTTP proxy that parses only text, links and pictures from pages reducing internet bandwidth usage, removing ads and heavy scripts",
"main": "dist/app.js", "main": "dist/app.js",

View File

@ -5,10 +5,9 @@ import { Readable } from 'stream';
import { NotHtmlMimetypeError } from './errors/main'; import { NotHtmlMimetypeError } from './errors/main';
import { decodeStream, parseEncodingName } from './utils/http'; import { decodeStream, parseEncodingName } from './utils/http';
import replaceHref from './utils/replace-href'; import replaceHref from './utils/replace-href';
import { parseHTML } from 'linkedom';
import { Engine } from '@txtdot/sdk'; import { Engine } from '@txtdot/sdk';
import { HandlerInput, IHandlerOutput } from '@txtdot/sdk'; import { HandlerInput, HandlerOutput } from '@txtdot/sdk';
import config from './config'; import config from './config';
interface IEngineId { interface IEngineId {
@ -32,7 +31,7 @@ export class Distributor {
requestUrl: URL, // proxy URL requestUrl: URL, // proxy URL
engineName?: string, engineName?: string,
redirectPath: string = 'get' redirectPath: string = 'get'
): Promise<IHandlerOutput> { ): Promise<HandlerOutput> {
const urlObj = new URL(remoteUrl); const urlObj = new URL(remoteUrl);
const webder_url = config.env.third_party.webder_url; const webder_url = config.env.third_party.webder_url;
@ -61,13 +60,23 @@ export class Distributor {
// post-process // post-process
// TODO: generate dom in handler and not parse here twice // TODO: generate dom in handler and not parse here twice
const dom = parseHTML(output.content); replaceHref(
replaceHref(dom, requestUrl, new URL(remoteUrl), engineName, redirectPath); output.document,
requestUrl,
new URL(remoteUrl),
engineName,
redirectPath
);
const purify = DOMPurify(dom.window); const purify = DOMPurify();
output.content = purify.sanitize(dom.document.toString()); const content = purify.sanitize(output.document.toString());
return output; return {
content,
textContent: output.textContent || output.document.textContent || '',
title: output.title,
lang: output.lang,
};
} }
getFallbackEngine(host: string, specified?: string): Engine { getFallbackEngine(host: string, specified?: string): Engine {

View File

@ -2,13 +2,12 @@ import config from '../config';
import { generateParserUrl, generateProxyUrl } from './generate'; import { generateParserUrl, generateProxyUrl } from './generate';
export default function replaceHref( export default function replaceHref(
dom: Window, doc: Document,
requestUrl: URL, requestUrl: URL,
remoteUrl: URL, remoteUrl: URL,
engine?: string, engine?: string,
redirectPath: string = 'get' redirectPath: string = 'get'
) { ) {
const doc: Document = dom.window.document;
const parserUrl = (href: string) => const parserUrl = (href: string) =>
generateParserUrl(requestUrl, remoteUrl, href, engine, redirectPath); generateParserUrl(requestUrl, remoteUrl, href, engine, redirectPath);

View File

@ -13,7 +13,7 @@ importers:
version: 20.12.11 version: 20.12.11
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
specifier: ^7.7.0 specifier: ^7.7.0
version: 7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5) version: 7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^7.7.0 specifier: ^7.7.0
version: 7.8.0(eslint@8.57.0)(typescript@5.4.5) version: 7.8.0(eslint@8.57.0)(typescript@5.4.5)
@ -22,7 +22,7 @@ importers:
version: 8.57.0 version: 8.57.0
lerna: lerna:
specifier: ^8.1.2 specifier: ^8.1.2
version: 8.1.2 version: 8.1.2(encoding@0.1.13)
prettier: prettier:
specifier: ^3.1.1 specifier: ^3.1.1
version: 3.2.5 version: 3.2.5
@ -41,6 +41,9 @@ importers:
'@txtdot/sdk': '@txtdot/sdk':
specifier: workspace:* specifier: workspace:*
version: link:../sdk version: link:../sdk
linkedom:
specifier: ^0.18.0
version: 0.18.0
devDependencies: devDependencies:
typescript: typescript:
specifier: ^5.4.5 specifier: ^5.4.5
@ -3378,12 +3381,12 @@ snapshots:
dependencies: dependencies:
'@sinclair/typebox': 0.27.8 '@sinclair/typebox': 0.27.8
'@lerna/create@8.1.2(typescript@5.4.5)': '@lerna/create@8.1.2(encoding@0.1.13)(typescript@5.4.5)':
dependencies: dependencies:
'@npmcli/run-script': 7.0.2 '@npmcli/run-script': 7.0.2
'@nx/devkit': 18.3.4(nx@18.3.4) '@nx/devkit': 18.3.4(nx@18.3.4)
'@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/plugin-enterprise-rest': 6.0.1
'@octokit/rest': 19.0.11 '@octokit/rest': 19.0.11(encoding@0.1.13)
byte-size: 8.1.1 byte-size: 8.1.1
chalk: 4.1.0 chalk: 4.1.0
clone-deep: 4.0.1 clone-deep: 4.0.1
@ -3413,7 +3416,7 @@ snapshots:
make-dir: 4.0.0 make-dir: 4.0.0
minimatch: 3.0.5 minimatch: 3.0.5
multimatch: 5.0.0 multimatch: 5.0.0
node-fetch: 2.6.7 node-fetch: 2.6.7(encoding@0.1.13)
npm-package-arg: 8.1.1 npm-package-arg: 8.1.1
npm-packlist: 5.1.1 npm-packlist: 5.1.1
npm-registry-fetch: 14.0.5 npm-registry-fetch: 14.0.5
@ -3578,11 +3581,11 @@ snapshots:
'@octokit/auth-token@3.0.4': {} '@octokit/auth-token@3.0.4': {}
'@octokit/core@4.2.4': '@octokit/core@4.2.4(encoding@0.1.13)':
dependencies: dependencies:
'@octokit/auth-token': 3.0.4 '@octokit/auth-token': 3.0.4
'@octokit/graphql': 5.0.6 '@octokit/graphql': 5.0.6(encoding@0.1.13)
'@octokit/request': 6.2.8 '@octokit/request': 6.2.8(encoding@0.1.13)
'@octokit/request-error': 3.0.3 '@octokit/request-error': 3.0.3
'@octokit/types': 9.3.2 '@octokit/types': 9.3.2
before-after-hook: 2.2.3 before-after-hook: 2.2.3
@ -3596,9 +3599,9 @@ snapshots:
is-plain-object: 5.0.0 is-plain-object: 5.0.0
universal-user-agent: 6.0.1 universal-user-agent: 6.0.1
'@octokit/graphql@5.0.6': '@octokit/graphql@5.0.6(encoding@0.1.13)':
dependencies: dependencies:
'@octokit/request': 6.2.8 '@octokit/request': 6.2.8(encoding@0.1.13)
'@octokit/types': 9.3.2 '@octokit/types': 9.3.2
universal-user-agent: 6.0.1 universal-user-agent: 6.0.1
transitivePeerDependencies: transitivePeerDependencies:
@ -3608,19 +3611,19 @@ snapshots:
'@octokit/plugin-enterprise-rest@6.0.1': {} '@octokit/plugin-enterprise-rest@6.0.1': {}
'@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4)': '@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4(encoding@0.1.13))':
dependencies: dependencies:
'@octokit/core': 4.2.4 '@octokit/core': 4.2.4(encoding@0.1.13)
'@octokit/tsconfig': 1.0.2 '@octokit/tsconfig': 1.0.2
'@octokit/types': 9.3.2 '@octokit/types': 9.3.2
'@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4)': '@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4(encoding@0.1.13))':
dependencies: dependencies:
'@octokit/core': 4.2.4 '@octokit/core': 4.2.4(encoding@0.1.13)
'@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4)': '@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4(encoding@0.1.13))':
dependencies: dependencies:
'@octokit/core': 4.2.4 '@octokit/core': 4.2.4(encoding@0.1.13)
'@octokit/types': 10.0.0 '@octokit/types': 10.0.0
'@octokit/request-error@3.0.3': '@octokit/request-error@3.0.3':
@ -3629,23 +3632,23 @@ snapshots:
deprecation: 2.3.1 deprecation: 2.3.1
once: 1.4.0 once: 1.4.0
'@octokit/request@6.2.8': '@octokit/request@6.2.8(encoding@0.1.13)':
dependencies: dependencies:
'@octokit/endpoint': 7.0.6 '@octokit/endpoint': 7.0.6
'@octokit/request-error': 3.0.3 '@octokit/request-error': 3.0.3
'@octokit/types': 9.3.2 '@octokit/types': 9.3.2
is-plain-object: 5.0.0 is-plain-object: 5.0.0
node-fetch: 2.6.7 node-fetch: 2.6.7(encoding@0.1.13)
universal-user-agent: 6.0.1 universal-user-agent: 6.0.1
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
'@octokit/rest@19.0.11': '@octokit/rest@19.0.11(encoding@0.1.13)':
dependencies: dependencies:
'@octokit/core': 4.2.4 '@octokit/core': 4.2.4(encoding@0.1.13)
'@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4(encoding@0.1.13))
'@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4(encoding@0.1.13))
'@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4(encoding@0.1.13))
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
@ -3771,7 +3774,7 @@ snapshots:
'@types/trusted-types@2.0.7': {} '@types/trusted-types@2.0.7': {}
'@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0)(eslint@8.57.0)(typescript@5.4.5)': '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.10.0 '@eslint-community/regexpp': 4.10.0
'@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': 7.8.0(eslint@8.57.0)(typescript@5.4.5)
@ -3786,6 +3789,7 @@ snapshots:
natural-compare: 1.4.0 natural-compare: 1.4.0
semver: 7.6.2 semver: 7.6.2
ts-api-utils: 1.3.0(typescript@5.4.5) ts-api-utils: 1.3.0(typescript@5.4.5)
optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3798,6 +3802,7 @@ snapshots:
'@typescript-eslint/visitor-keys': 7.8.0 '@typescript-eslint/visitor-keys': 7.8.0
debug: 4.3.4 debug: 4.3.4
eslint: 8.57.0 eslint: 8.57.0
optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3814,6 +3819,7 @@ snapshots:
debug: 4.3.4 debug: 4.3.4
eslint: 8.57.0 eslint: 8.57.0
ts-api-utils: 1.3.0(typescript@5.4.5) ts-api-utils: 1.3.0(typescript@5.4.5)
optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3830,6 +3836,7 @@ snapshots:
minimatch: 9.0.4 minimatch: 9.0.4
semver: 7.6.2 semver: 7.6.2
ts-api-utils: 1.3.0(typescript@5.4.5) ts-api-utils: 1.3.0(typescript@5.4.5)
optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -3909,11 +3916,11 @@ snapshots:
indent-string: 4.0.0 indent-string: 4.0.0
ajv-formats@2.1.1(ajv@8.13.0): ajv-formats@2.1.1(ajv@8.13.0):
dependencies: optionalDependencies:
ajv: 8.13.0 ajv: 8.13.0
ajv-formats@3.0.1(ajv@8.13.0): ajv-formats@3.0.1(ajv@8.13.0):
dependencies: optionalDependencies:
ajv: 8.13.0 ajv: 8.13.0
ajv@6.12.6: ajv@6.12.6:
@ -4300,6 +4307,7 @@ snapshots:
js-yaml: 4.1.0 js-yaml: 4.1.0
parse-json: 5.2.0 parse-json: 5.2.0
path-type: 4.0.0 path-type: 4.0.0
optionalDependencies:
typescript: 5.4.5 typescript: 5.4.5
cross-spawn@7.0.3: cross-spawn@7.0.3:
@ -5138,13 +5146,13 @@ snapshots:
kind-of@6.0.3: {} kind-of@6.0.3: {}
lerna@8.1.2: lerna@8.1.2(encoding@0.1.13):
dependencies: dependencies:
'@lerna/create': 8.1.2(typescript@5.4.5) '@lerna/create': 8.1.2(encoding@0.1.13)(typescript@5.4.5)
'@npmcli/run-script': 7.0.2 '@npmcli/run-script': 7.0.2
'@nx/devkit': 18.3.4(nx@18.3.4) '@nx/devkit': 18.3.4(nx@18.3.4)
'@octokit/plugin-enterprise-rest': 6.0.1 '@octokit/plugin-enterprise-rest': 6.0.1
'@octokit/rest': 19.0.11 '@octokit/rest': 19.0.11(encoding@0.1.13)
byte-size: 8.1.1 byte-size: 8.1.1
chalk: 4.1.0 chalk: 4.1.0
clone-deep: 4.0.1 clone-deep: 4.0.1
@ -5180,7 +5188,7 @@ snapshots:
make-dir: 4.0.0 make-dir: 4.0.0
minimatch: 3.0.5 minimatch: 3.0.5
multimatch: 5.0.0 multimatch: 5.0.0
node-fetch: 2.6.7 node-fetch: 2.6.7(encoding@0.1.13)
npm-package-arg: 8.1.1 npm-package-arg: 8.1.1
npm-packlist: 5.1.1 npm-packlist: 5.1.1
npm-registry-fetch: 14.0.5 npm-registry-fetch: 14.0.5
@ -5506,9 +5514,11 @@ snapshots:
node-cleanup@2.1.2: {} node-cleanup@2.1.2: {}
node-fetch@2.6.7: node-fetch@2.6.7(encoding@0.1.13):
dependencies: dependencies:
whatwg-url: 5.0.0 whatwg-url: 5.0.0
optionalDependencies:
encoding: 0.1.13
node-gyp@10.1.0: node-gyp@10.1.0:
dependencies: dependencies: