├── README.md ├── packages └── szip │ ├── .env.example │ ├── src │ ├── parser │ │ ├── index.ts │ │ ├── regex.ts │ │ ├── parse-error.ts │ │ ├── parse-compress-message.ts │ │ ├── parse-archive-result.ts │ │ ├── parse-archive-header.ts │ │ ├── types.ts │ │ └── parse-archive-info.ts │ ├── types.ts │ ├── utils │ │ ├── wait.ts │ │ ├── pattern.ts │ │ └── safe-exec.ts │ ├── debugger.ts │ ├── error.ts │ ├── bin.ts │ ├── cmd │ │ ├── update.ts │ │ ├── extract.ts │ │ ├── encrypt.ts │ │ ├── list.ts │ │ ├── compress.ts │ │ ├── delete.ts │ │ └── add.ts │ └── helpers.ts │ ├── package.json │ ├── tests │ ├── utils.test.ts │ ├── delete.test.ts │ ├── list.test.ts │ ├── utils.ts │ ├── encrypt.test.ts │ ├── compress.test.ts │ ├── archive.test.ts │ └── parser.test.ts │ └── index.ts ├── renovate.json ├── tests ├── log.ts └── index.test.ts ├── .mocharc.json ├── pnpm-workspace.yaml ├── src ├── utils │ ├── get-dirname.ts │ ├── normalize.ts │ └── fs-access.ts ├── types.ts ├── index.ts └── lib │ └── archive.ts ├── scripts ├── internal │ ├── utils │ │ ├── try-exit.ts │ │ ├── handle-error.ts │ │ ├── boolean-env.ts │ │ ├── detect-platform.ts │ │ └── override-proxy.ts │ ├── log.ts │ ├── types.ts │ ├── configuration.ts │ └── installer.ts └── install.ts ├── .prettierrc ├── .prettierignore ├── tsup.config.ts ├── .eslintrc.json ├── tsconfig.json ├── package.json ├── .gitignore ├── LICENSE └── pnpm-lock.yaml /README.md: -------------------------------------------------------------------------------- 1 | # node-archive 2 | -------------------------------------------------------------------------------- /packages/szip/.env.example: -------------------------------------------------------------------------------- 1 | SZIP_BIN_PATH=/usr/local/bin/s7p 2 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:base"] 4 | } 5 | -------------------------------------------------------------------------------- /tests/log.ts: -------------------------------------------------------------------------------- 1 | export function log(message: any): void { 2 | // eslint-disable-next-line no-console 3 | console.log(message); 4 | } 5 | -------------------------------------------------------------------------------- /tests/index.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | 3 | describe('Test', () => { 4 | it('works', () => { 5 | expect(true).to.equal(true); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/mocharc.json", 3 | "require": ["tsx", "dotenv/config", "chai/register-expect"], 4 | "timeout": 10000 5 | } 6 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | # all packages in direct subdirs of packages/ 3 | - 'packages/*' 4 | # exclude packages that are inside test directories 5 | - '!**/tests/**' 6 | -------------------------------------------------------------------------------- /src/utils/get-dirname.ts: -------------------------------------------------------------------------------- 1 | import { fileURLToPath } from 'node:url'; 2 | 3 | export function getDirname() { 4 | return typeof __dirname === 'undefined' 5 | ? fileURLToPath(new URL(`.`, import.meta.url)) 6 | : __dirname; 7 | } 8 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import type { Readable as ReadableStream } from 'node:stream'; 2 | 3 | export type ContentLike = string | Buffer | ReadableStream; 4 | 5 | export type { Readable as ReadableStream, Writable as WritableStream } from 'node:stream'; 6 | -------------------------------------------------------------------------------- /packages/szip/src/parser/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@szip/parser/parse-archive-info'; 2 | export * from '@szip/parser/parse-error'; 3 | 4 | // ------------------------------ 5 | 6 | export type * from '@szip/parser/types'; 7 | 8 | // ------------------------------ 9 | -------------------------------------------------------------------------------- /packages/szip/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "szip", 3 | "version": "0.0.0", 4 | "main": "index.ts", 5 | "types": "index.ts", 6 | "scripts": { 7 | "tests": "mocha \"**/*.test.ts\"" 8 | }, 9 | "dependencies": {}, 10 | "devDependencies": {} 11 | } 12 | -------------------------------------------------------------------------------- /scripts/internal/utils/try-exit.ts: -------------------------------------------------------------------------------- 1 | import { handleError } from './handle-error'; 2 | 3 | export async function tryOrExit(fn: () => Promise): Promise { 4 | try { 5 | await fn(); 6 | } catch (error) { 7 | handleError(error); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/szip/src/types.ts: -------------------------------------------------------------------------------- 1 | export type SafeReturn = Partial<{ 2 | data: T; 3 | error: K; 4 | }> & 5 | ( 6 | | { 7 | data: T; 8 | error?: never; 9 | } 10 | | { 11 | data?: never; 12 | error: K; 13 | } 14 | ); 15 | -------------------------------------------------------------------------------- /src/utils/normalize.ts: -------------------------------------------------------------------------------- 1 | import { PathLike } from 'node:fs'; 2 | import { fileURLToPath } from 'node:url'; 3 | 4 | export function normalizePathLike(path: PathLike): string { 5 | if (path instanceof URL) { 6 | return fileURLToPath(path); 7 | } 8 | 9 | return path.toString(); 10 | } 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "overrides": [ 7 | { 8 | "files": "*.md", 9 | "options": { 10 | "parser": "markdown", 11 | "printWidth": 79 12 | } 13 | } 14 | ] 15 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { Archive } from '@/lib/archive'; 2 | import { SZip } from 'szip'; 3 | 4 | // ------------------------------ 5 | 6 | export { Archive, SZip }; 7 | 8 | // ------------------------------ 9 | 10 | export type * from '@/types'; 11 | 12 | // ------------------------------ 13 | 14 | export default Archive; 15 | -------------------------------------------------------------------------------- /scripts/internal/utils/handle-error.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | 3 | export function handleError(error: unknown): void { 4 | if (error instanceof Error) { 5 | console.error(`**ERROR** ${error.message}`); 6 | process.exit(1); 7 | } 8 | 9 | console.error(`**ERROR** ${error}`); 10 | process.exit(1); 11 | } 12 | -------------------------------------------------------------------------------- /packages/szip/src/utils/wait.ts: -------------------------------------------------------------------------------- 1 | import { WritableStream } from '@/types'; 2 | 3 | export async function sleep(ms: number) { 4 | return new Promise((resolve) => setTimeout(resolve, ms)); 5 | } 6 | 7 | export async function waitUtilOpenStream(stream: WritableStream) { 8 | return new Promise((resolve) => stream.once('open', resolve)); 9 | } 10 | -------------------------------------------------------------------------------- /packages/szip/src/utils/pattern.ts: -------------------------------------------------------------------------------- 1 | export function isRecurse(path: string) { 2 | return path.includes('**'); 3 | } 4 | 5 | export function addPattern(mode: 'x' | 'i', path: string, recurse: boolean) { 6 | return `-${mode}${recurse ? 'r' : ''}!${path}`; 7 | } 8 | 9 | export function isWildcard(path: string) { 10 | return path.includes('*'); 11 | } 12 | -------------------------------------------------------------------------------- /scripts/internal/log.ts: -------------------------------------------------------------------------------- 1 | export function logPolitely(toBeLogged: unknown): void { 2 | const logLevel = process.env['npm_config_loglevel'] || ''; 3 | const logLevelDisplay = ['silent', 'error', 'warn'].indexOf(logLevel) > -1; 4 | 5 | if (!logLevelDisplay) { 6 | // eslint-disable-next-line no-console 7 | console.log(toBeLogged); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/szip/src/debugger.ts: -------------------------------------------------------------------------------- 1 | export function debug(...args: any[]) { 2 | if (_debugger) { 3 | _debugger(...args); 4 | } 5 | } 6 | 7 | let _debugger: (...args: any[]) => void; 8 | 9 | // Add debug 10 | import('debug') 11 | .then((pkg) => { 12 | if (pkg) { 13 | _debugger = pkg.default('SZip'); 14 | } 15 | }) 16 | .catch(() => {}); 17 | -------------------------------------------------------------------------------- /scripts/internal/types.ts: -------------------------------------------------------------------------------- 1 | export enum Platform { 2 | Linux = 'linux', 3 | Mac = 'mac', 4 | Windows = 'windows' 5 | } 6 | 7 | export interface Configuration { 8 | version: string; 9 | downloadBaseUrl: string; 10 | skipDownload: boolean; 11 | binPath: string; 12 | cacheDirectory: string; 13 | executablePath: string; 14 | logLevel: string; 15 | } 16 | -------------------------------------------------------------------------------- /scripts/internal/utils/boolean-env.ts: -------------------------------------------------------------------------------- 1 | export function getBooleanEnv(name: string) { 2 | const env = process.env[name]; 3 | if (env === undefined) { 4 | return; 5 | } 6 | switch (env.toLowerCase()) { 7 | case '': 8 | case '0': 9 | case 'false': 10 | case 'off': 11 | return false; 12 | default: 13 | return true; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | packages/szip/.env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | .changeset/ 15 | .prettierrc 16 | package.json 17 | .vercel 18 | .contentlayer 19 | dist 20 | cmdline 21 | 22 | vite.config.js.timestamp-* 23 | vite.config.ts.timestamp-* 24 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig([ 4 | { 5 | clean: true, 6 | dts: true, 7 | entry: ['src/index.ts'], 8 | format: ['cjs', 'esm'], 9 | target: 'esnext', 10 | outDir: 'dist' 11 | }, 12 | { 13 | clean: true, 14 | entry: ['scripts/*.ts'], 15 | format: ['esm'], 16 | target: 'esnext', 17 | outDir: 'dist/scripts' 18 | } 19 | ]); 20 | -------------------------------------------------------------------------------- /scripts/internal/utils/detect-platform.ts: -------------------------------------------------------------------------------- 1 | import { Platform } from '../types'; 2 | 3 | export function detectPlatform(): Platform | undefined { 4 | const platform = process.platform; 5 | if (platform === 'win32') { 6 | return Platform.Windows; 7 | } 8 | if (platform === 'darwin') { 9 | return Platform.Mac; 10 | } 11 | if (platform === 'linux') { 12 | return Platform.Linux; 13 | } 14 | return undefined; 15 | } 16 | -------------------------------------------------------------------------------- /packages/szip/src/utils/safe-exec.ts: -------------------------------------------------------------------------------- 1 | import { execa, ExecaError, ExecaReturnValue, Options } from 'execa'; 2 | import { SafeReturn } from 'szip'; 3 | 4 | export async function safeExec( 5 | file: string, 6 | args: string[], 7 | options: Options 8 | ): Promise> { 9 | return execa(file, args, options) 10 | .catch((error) => error) 11 | .then((result) => (result instanceof Error ? { error: result } : { data: result })); 12 | } 13 | -------------------------------------------------------------------------------- /packages/szip/src/parser/regex.ts: -------------------------------------------------------------------------------- 1 | export const TYPE_REGEX = /^Type = (.+)$/gm; 2 | export const PHYSICAL_SIZE_REGEX = /^Physical Size = (\d+)$/gm; 3 | export const HEADERS_SIZE_REGEX = /^Headers Size = (\d+)$/gm; 4 | export const METHOD_REGEX = /^Method = (.+)$/gm; 5 | export const SOLID_REGEX = /^Solid = (.+)$/gm; 6 | export const BLOCKS_REGEX = /^Blocks = (\d+)$/gm; 7 | export const CODE_PAGE_REGEX = /^Code Page = (.+)$/gm; 8 | export const CHARACTERISTICS_REGEX = /^Characteristics = (.+)$/gm; 9 | -------------------------------------------------------------------------------- /packages/szip/src/parser/parse-error.ts: -------------------------------------------------------------------------------- 1 | export function parseError(message: string) { 2 | if (message.startsWith('Command failed with')) { 3 | message = message.split('\n').slice(2).join('\n'); 4 | } 5 | 6 | message = message.trim(); 7 | 8 | const isMultiLine = message.includes('\n\n\n'); 9 | 10 | if (isMultiLine) { 11 | const errors = message.split('\n\n'); 12 | message = errors[0]; 13 | } 14 | 15 | message = message.replaceAll('\n', ' '); 16 | 17 | return message; 18 | } 19 | -------------------------------------------------------------------------------- /src/utils/fs-access.ts: -------------------------------------------------------------------------------- 1 | import { PathLike, promises, accessSync } from 'node:fs'; 2 | 3 | export async function fsAccess(path: PathLike, mode?: number): Promise { 4 | try { 5 | await promises.access(path, mode); 6 | return true; 7 | } catch (_) { 8 | return false; 9 | } 10 | } 11 | 12 | export function fsAccessSync(path: PathLike, mode?: number): boolean { 13 | try { 14 | accessSync(path, mode); 15 | return true; 16 | } catch (_) { 17 | return false; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/eslintrc.json", 3 | "env": { 4 | "es2021": true, 5 | "node": true 6 | }, 7 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 8 | "parserOptions": { 9 | "ecmaVersion": "latest", 10 | "sourceType": "module" 11 | }, 12 | "rules": { 13 | "no-console": "error", 14 | "@typescript-eslint/semi": "off", 15 | "@typescript-eslint/no-explicit-any": "off" 16 | }, 17 | "ignorePatterns": ["cmdline", "dist"] 18 | } 19 | -------------------------------------------------------------------------------- /packages/szip/src/error.ts: -------------------------------------------------------------------------------- 1 | import { parseError } from '@szip/parser'; 2 | import { ExecaError } from 'execa'; 3 | 4 | export class SZipError extends Error { 5 | constructor( 6 | message: string, 7 | private command?: string 8 | ) { 9 | super(message); 10 | } 11 | 12 | static fromStderr(message: string) { 13 | return new SZipError(parseError(message)); 14 | } 15 | 16 | static fromExecaError(result: ExecaError) { 17 | return new SZipError(parseError(result.stderr), result.command); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/szip/src/parser/parse-compress-message.ts: -------------------------------------------------------------------------------- 1 | import { SZipCompressResult } from '@szip/parser/types'; 2 | 3 | export function parseCompressMessage(message: string): SZipCompressResult { 4 | const ARCHIVE_SIZE_REGEX = /^Archive size: (\d+) bytes/gm; 5 | const ARCHIVE_REGEX = /^Creating archive: (.+)$/gm; 6 | 7 | const archivePath = ARCHIVE_REGEX.exec(message); 8 | const archiveSize = ARCHIVE_SIZE_REGEX.exec(message); 9 | 10 | return { 11 | path: archivePath![1], 12 | size: parseInt(archiveSize![1]) 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /scripts/install.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * The Purpose of this script is to download the 7zip binary 5 | * for the current platform. 6 | */ 7 | 8 | async function importInstaller() { 9 | try { 10 | return await import('./internal/installer'); 11 | } catch { 12 | console.warn( 13 | 'Skipping binary installation because the build is not available. Run `npm install` again after you have re-built the package.' 14 | ); 15 | process.exit(0); 16 | } 17 | } 18 | 19 | try { 20 | const { download } = await importInstaller(); 21 | await download(); 22 | } catch (error) { 23 | console.warn('Binary download failed', error); 24 | } 25 | -------------------------------------------------------------------------------- /scripts/internal/utils/override-proxy.ts: -------------------------------------------------------------------------------- 1 | export function overrideProxy() { 2 | // Override current environment proxy settings with npm configuration, if any. 3 | const NPM_HTTPS_PROXY = process.env['npm_config_https_proxy'] || process.env['npm_config_proxy']; 4 | const NPM_HTTP_PROXY = process.env['npm_config_http_proxy'] || process.env['npm_config_proxy']; 5 | const NPM_NO_PROXY = process.env['npm_config_no_proxy']; 6 | 7 | if (NPM_HTTPS_PROXY) { 8 | process.env['HTTPS_PROXY'] = NPM_HTTPS_PROXY; 9 | } 10 | if (NPM_HTTP_PROXY) { 11 | process.env['HTTP_PROXY'] = NPM_HTTP_PROXY; 12 | } 13 | if (NPM_NO_PROXY) { 14 | process.env['NO_PROXY'] = NPM_NO_PROXY; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/szip/tests/utils.test.ts: -------------------------------------------------------------------------------- 1 | import { waitUtilOpenStream } from '@szip/utils/wait'; 2 | import { expect } from 'chai'; 3 | import { createWriteStream, promises } from 'node:fs'; 4 | import { resolve } from 'node:path'; 5 | import { ROOT_DIR } from './utils'; 6 | 7 | describe('Stream', () => { 8 | it('should create write stream and wait until it is open', async () => { 9 | const stream = createWriteStream(resolve(ROOT_DIR, 'test.txt')); 10 | 11 | await waitUtilOpenStream(stream); 12 | 13 | expect(stream.writable).to.be.true; 14 | 15 | stream.write('Hello World'); 16 | 17 | stream.end(); 18 | 19 | await promises.unlink(resolve(ROOT_DIR, 'test.txt')); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /packages/szip/index.ts: -------------------------------------------------------------------------------- 1 | import * as Add from '@szip/cmd/add'; 2 | import * as Compress from '@szip/cmd/compress'; 3 | import * as Delete from '@szip/cmd/delete'; 4 | import * as Encrypt from '@szip/cmd/encrypt'; 5 | import * as List from '@szip/cmd/list'; 6 | import * as Update from '@szip/cmd/update'; 7 | 8 | export { Add, Compress, Delete, Encrypt, List, Update }; 9 | 10 | const SZip = { 11 | ...Add, 12 | ...Compress, 13 | ...Delete, 14 | ...Encrypt, 15 | ...List, 16 | ...Update 17 | }; 18 | 19 | // ------------------------------ 20 | 21 | // @todo: export SZip option types 22 | 23 | export type { ArchiveType, Archive7z, ArchiveZip, ArchiveTar } from '@szip/parser'; 24 | export type { SZipCompressResult } from '@szip/parser'; 25 | 26 | // ------------------------------ 27 | 28 | export { SZipError } from '@szip/error'; 29 | 30 | // ------------------------------ 31 | 32 | export type * from '@szip/types'; 33 | 34 | // ------------------------------ 35 | 36 | export { SZip }; 37 | export default SZip; 38 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig.json", 3 | "compilerOptions": { 4 | "lib": ["ESNext"], 5 | "module": "esnext", 6 | "target": "esnext", 7 | "moduleResolution": "node", 8 | "moduleDetection": "force", 9 | "strict": true, 10 | "skipLibCheck": true, 11 | "declaration": true, 12 | "declarationMap": true, 13 | "esModuleInterop": true, 14 | "isolatedModules": true, 15 | "noUnusedLocals": false, 16 | "noUnusedParameters": false, 17 | "strictNullChecks": true, 18 | "allowSyntheticDefaultImports": true, 19 | "forceConsistentCasingInFileNames": true, 20 | "allowJs": true, 21 | "outDir": "dist", 22 | "baseUrl": ".", 23 | "paths": { 24 | "@/*": ["src/*"], 25 | "@tests/*": ["tests/*"], 26 | "@szip/*": ["packages/szip/src/*"], 27 | "szip": ["packages/szip/index.ts"], 28 | "node-archive": ["src/index.ts"] 29 | } 30 | }, 31 | "include": ["**/*.ts"], 32 | "exclude": ["node_modules", "dist"] 33 | } 34 | -------------------------------------------------------------------------------- /packages/szip/src/bin.ts: -------------------------------------------------------------------------------- 1 | import { fsAccessSync } from '@/utils/fs-access'; 2 | import { getDirname } from '@/utils/get-dirname'; 3 | import { debug } from '@szip/debugger'; 4 | import { SZipError } from '@szip/error'; 5 | import { join, resolve } from 'node:path'; 6 | 7 | export const BIN_PATH = process?.env?.SZIP_BIN_PATH ?? resolveBinPath(); 8 | 9 | debug('Binary Path:', BIN_PATH); 10 | 11 | function resolveBinPath() { 12 | // This path is for dev and its pointing to the dist folder and root of the project 13 | const develPath = resolve(join('dist', 'bin', '7zz')); 14 | if (fsAccessSync(develPath)) { 15 | return develPath; 16 | } 17 | 18 | // This path is for dist version and its pointing to bin directory at the dist folder 19 | const distLevel = resolve(join(getDirname(), 'bin', '7zz')); 20 | if (fsAccessSync(distLevel)) { 21 | return distLevel; 22 | } 23 | 24 | // We are not going to use $(which 7z) result because it can be different from the one we are using 25 | throw new SZipError('p7z binary not found'); 26 | } 27 | -------------------------------------------------------------------------------- /packages/szip/tests/delete.test.ts: -------------------------------------------------------------------------------- 1 | import { log } from '@tests/log'; 2 | import { expect } from 'chai'; 3 | import { promises } from 'node:fs'; 4 | import { resolve } from 'node:path'; 5 | import { SZip } from 'szip'; 6 | import { ROOT_DIR } from './utils'; 7 | 8 | describe('SZip - Delete', () => { 9 | it('should `Tar` project and then delete `*.test.ts` files', async () => { 10 | const filename = resolve(ROOT_DIR, 'project.tar'); 11 | const createdTar = await SZip.add(filename, ['*'], { 12 | exclude: ['node_modules', 'project.tar'], 13 | type: 'tar', 14 | recurse: true, 15 | update: true, 16 | cwd: ROOT_DIR 17 | }); 18 | 19 | log(createdTar); 20 | 21 | const deletedTar = await SZip.del(filename, ['*.test.ts'], { 22 | recurse: true, 23 | cwd: ROOT_DIR 24 | }); 25 | 26 | log(deletedTar); 27 | expect(deletedTar.error).to.be.undefined; 28 | expect(deletedTar.data).to.be.an('object'); 29 | expect(deletedTar.data).to.have.property('deleted').property('files').to.be.greaterThan(0); 30 | 31 | await promises.unlink(filename); 32 | }); 33 | }); 34 | -------------------------------------------------------------------------------- /packages/szip/tests/list.test.ts: -------------------------------------------------------------------------------- 1 | import { log } from '@tests/log'; 2 | import { promises } from 'node:fs'; 3 | import { resolve } from 'node:path'; 4 | import { SZip } from 'szip'; 5 | import { createTar, createTar7z, createZip, ROOT_DIR } from './utils'; 6 | 7 | describe('SZip - List', () => { 8 | describe('Technical', () => { 9 | it('list the info of a 7z file', async () => { 10 | const filename = resolve(ROOT_DIR, 'source.tar.7z'); 11 | await createTar7z(filename); 12 | 13 | const list = await SZip.list(filename, { 14 | raw: true 15 | }); 16 | 17 | log(list); 18 | 19 | await promises.unlink(filename); 20 | }); 21 | 22 | it('list the info of a tar file', async () => { 23 | await createTar('source.tar'); 24 | 25 | const list = await SZip.list('source.tar', { 26 | raw: true 27 | }); 28 | log(list); 29 | 30 | await promises.unlink('source.tar'); 31 | }); 32 | 33 | it('list the info of a zip file', async () => { 34 | const filename = 'source.zip'; 35 | await createZip(filename); 36 | 37 | const list = await SZip.list(filename, { 38 | raw: true 39 | }); 40 | log(list); 41 | 42 | await promises.unlink(filename); 43 | }); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /packages/szip/tests/utils.ts: -------------------------------------------------------------------------------- 1 | import { fsAccessSync } from '@/utils/fs-access'; 2 | import { promises } from 'node:fs'; 3 | import { resolve } from 'node:path'; 4 | import { SZip } from 'szip'; 5 | 6 | export async function createTar(filename: string = 'source.tar', password?: string) { 7 | const output = await SZip.add(filename, ['src/*', 'dist/*'], { 8 | type: 'tar', 9 | password, 10 | update: true, 11 | cwd: ROOT_DIR, 12 | raw: true 13 | }); 14 | 15 | return output; 16 | } 17 | 18 | export async function createTar7z(filename: string = 'secure.tar.7z', password?: string) { 19 | const tarName = resolve(ROOT_DIR, 'source.tar'); 20 | await createTar(tarName); 21 | 22 | const output = await SZip.add(filename, [tarName], { 23 | type: '7z', 24 | password, 25 | cwd: ROOT_DIR, 26 | raw: true 27 | }); 28 | 29 | await promises.unlink(tarName); 30 | 31 | return output; 32 | } 33 | 34 | export async function createZip(filename: string = 'source.zip', password?: string) { 35 | const output = await SZip.add(filename, ['src/*', 'dist/*'], { 36 | type: 'zip', 37 | password, 38 | cwd: ROOT_DIR, 39 | raw: true 40 | }); 41 | 42 | return output; 43 | } 44 | 45 | export const ROOT_DIR = fsAccessSync('packages') 46 | ? process.cwd() 47 | : process.cwd().replace('packages/szip', ''); 48 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/update.ts: -------------------------------------------------------------------------------- 1 | import { ContentLike, WritableStream } from '@/types'; 2 | import { PathLike } from 'node:fs'; 3 | 4 | type SZipUpdateOptions = { 5 | // -bb (Set output log level) 6 | logLevel?: string; 7 | // -i (Include) 8 | include?: string[]; 9 | // -m (Method) 10 | method?: string; 11 | // -p (Set Password) 12 | password?: string; 13 | // -r (Recurse) 14 | recurse?: boolean; 15 | // -sfx (create SFX) 16 | sfx?: boolean; 17 | // -so (use StdOut) 18 | stdout?: WritableStream; 19 | // -si (use StdIn) 20 | stdin?: ContentLike; 21 | // -sni (Store NT security information) 22 | storeNTSecurityInformation?: boolean; 23 | // -sns (Store NTFS alternate Streams) 24 | storeNTFSAlternateStreams?: boolean; 25 | // -ssw (Compress shared files) 26 | compressSharedFiles?: boolean; 27 | // -spf (Use fully qualified file paths) 28 | fullyQualifiedPaths?: boolean; 29 | // -spm (Require path separator mark for directory path) 30 | requirePathSeparator?: boolean; 31 | // -stl (Set archive timestamp from the most recently modified file) 32 | setArchiveTimestamp?: boolean; 33 | // -stx (Exclude archive type) 34 | excludeArchiveType?: boolean; 35 | // -t (Type of archive) 36 | type?: string; 37 | // -u (Update) 38 | update?: boolean; 39 | // -w (Working Dir) 40 | workingDir?: string; 41 | // -x (Exclude) 42 | exclude?: string[]; 43 | }; 44 | 45 | /** 46 | * Update older files in the archive and add files that are not already in the archive. 47 | * 48 | * @param filename 49 | * @param options 50 | */ 51 | export async function update(filename: PathLike, options: SZipUpdateOptions) {} 52 | -------------------------------------------------------------------------------- /packages/szip/tests/encrypt.test.ts: -------------------------------------------------------------------------------- 1 | import { log } from '@tests/log'; 2 | import { expect } from 'chai'; 3 | import { createReadStream, promises } from 'node:fs'; 4 | import { resolve } from 'node:path'; 5 | import { SZip } from 'szip'; 6 | import { createTar, createTar7z, ROOT_DIR } from './utils'; 7 | 8 | describe('SZip - Encrypt Archive', () => { 9 | it('encrypt data from read stream', async () => { 10 | const tarName = resolve(ROOT_DIR, 'source.tar'); 11 | const createdTar = await createTar(tarName); 12 | 13 | expect(createdTar, createdTar.error?.message).to.have.property('data'); 14 | expect(createdTar.data).to.contain('Everything is Ok'); 15 | 16 | const filename = resolve(ROOT_DIR, 'secure.tar.7z'); 17 | 18 | const output = await SZip.encrypt(filename, createReadStream(tarName), { 19 | cwd: ROOT_DIR, 20 | password: '1234', 21 | raw: true 22 | }); 23 | 24 | expect(output, output.error?.message).to.have.property('data'); 25 | expect(output.data).to.contain('Everything is Ok'); 26 | 27 | log(output.data); 28 | 29 | await promises.unlink(filename); 30 | await promises.unlink(tarName); 31 | }); 32 | 33 | it('encrypt the an 7z archive', async () => { 34 | const tarName = resolve(ROOT_DIR, 'source.tar.7z'); 35 | const createdTar = await createTar7z(tarName); 36 | 37 | expect(createdTar, createdTar.error?.message).to.have.property('data'); 38 | expect(createdTar.data).to.contain('Everything is Ok'); 39 | 40 | // Read the source.tar and pass it to compress 41 | const content = await promises.readFile(tarName); 42 | 43 | const filename = resolve(ROOT_DIR, 'secure.tar.7z'); 44 | 45 | const output = await SZip.encrypt(filename, content, { 46 | cwd: ROOT_DIR, 47 | password: '1234' 48 | }); 49 | 50 | log(output); 51 | 52 | expect(output).to.have.property('data').to.be.true; 53 | 54 | await promises.unlink(filename); 55 | await promises.unlink(tarName); 56 | }); 57 | }); 58 | -------------------------------------------------------------------------------- /packages/szip/src/parser/parse-archive-result.ts: -------------------------------------------------------------------------------- 1 | import { parseArchiveHeader } from '@szip/parser/parse-archive-header'; 2 | import { ArchiveResult, ArchiveStats } from '@szip/parser/types'; 3 | 4 | export function parseArchiveResult(message: string): ArchiveResult { 5 | const ADDED_FOLDER_FILE_BYTE_REGEX = 6 | /^Add new data to archive: (?:(\d+) folders, )?(\d+) files?, (\d+)/gm; 7 | 8 | const PREVIOUS_FOLDER_FILE_BYTE_REGEX = 9 | /^Keep old data in archive: (?:(\d+) folders, )?(\d+) files?, (\d+)/gm; 10 | 11 | const DELETED_FOLDER_FILE_BYTE_REGEX = 12 | /^Delete data from archive: (?:(\d+) folders, )?(\d+) files?, (\d+)/gm; 13 | 14 | const ARCHIVE_SIZE_REGEX = /^Archive size: (\d+) bytes/gm; 15 | 16 | const ARCHIVE_REGEX = /^(Creating|Updating) archive: (.+)$/gm; 17 | 18 | const archivePath = ARCHIVE_REGEX.exec(message); 19 | const archiveSize = ARCHIVE_SIZE_REGEX.exec(message); 20 | const result: Partial = { 21 | path: archivePath![2], 22 | size: parseInt(archiveSize![1]) 23 | }; 24 | 25 | const parsedHeader = parseArchiveHeader(message); 26 | if (parsedHeader) { 27 | result.header = parsedHeader; 28 | } 29 | 30 | const deletedStats = DELETED_FOLDER_FILE_BYTE_REGEX.exec(message); 31 | if (deletedStats) { 32 | result.deleted = { 33 | files: parseInt(deletedStats[2]), 34 | bytes: parseInt(deletedStats[3]) 35 | }; 36 | } 37 | 38 | [ADDED_FOLDER_FILE_BYTE_REGEX, PREVIOUS_FOLDER_FILE_BYTE_REGEX].forEach((regex) => { 39 | const stats = regex.exec(message); 40 | if (stats) { 41 | const type = regex === ADDED_FOLDER_FILE_BYTE_REGEX ? 'added' : 'previous'; 42 | const res: ArchiveStats = { 43 | folders: stats[1] ? parseInt(stats[1]) : undefined, 44 | files: parseInt(stats[2]), 45 | bytes: parseInt(stats[3]) 46 | }; 47 | 48 | if (typeof res.folders === 'undefined') { 49 | delete res.folders; 50 | } 51 | 52 | result[type] = res; 53 | } 54 | }); 55 | 56 | return result as ArchiveResult; 57 | } 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-archive", 3 | "version": "0.0.0-canary.5", 4 | "main": "dist/index.js", 5 | "module": "dist/index.mjs", 6 | "types": "dist/index.d.ts", 7 | "files": [ 8 | "dist/**", 9 | "!dist/bin" 10 | ], 11 | "exports": { 12 | ".": { 13 | "import": { 14 | "types": "./dist/index.d.mts", 15 | "default": "./dist/index.mjs" 16 | }, 17 | "require": { 18 | "types": "./dist/index.d.ts", 19 | "default": "./dist/index.js" 20 | } 21 | } 22 | }, 23 | "scripts": { 24 | "dev": "tsup --watch", 25 | "build": "tsup", 26 | "test": "mocha \"**/*.test.ts\"", 27 | "type-check": "tsc --noEmit", 28 | "lint": "eslint \"src/**/*.ts\"", 29 | "lint:fix": "npm run lint -- --fix", 30 | "format:check": "prettier --check \"**/*.{ts,tsx,json,md}\"", 31 | "format": "prettier --write .", 32 | "bin:download": "node dist/scripts/install.mjs", 33 | "prepublishOnly": "pnpm build && pnpm run format:check && pnpm run type-check && pnpm run bin:download && pnpm test", 34 | "preinstall": "pnpm run bin:download" 35 | }, 36 | "packageManager": "pnpm@8.15.0", 37 | "dependencies": { 38 | "execa": "^8.0.1" 39 | }, 40 | "devDependencies": { 41 | "@types/chai": "^4.3.12", 42 | "@types/debug": "^4.1.12", 43 | "@types/mocha": "^10.0.6", 44 | "@types/node": "^20.11.26", 45 | "@typescript-eslint/eslint-plugin": "^7.2.0", 46 | "chai": "^5.1.0", 47 | "debug": "^4.3.4", 48 | "dotenv": "^16.4.5", 49 | "eslint": "^8.57.0", 50 | "mocha": "^10.3.0", 51 | "prettier": "^3.2.5", 52 | "szip": "workspace:^", 53 | "tsup": "^8.0.2", 54 | "tsx": "^4.7.1", 55 | "typescript": "^5.4.2" 56 | }, 57 | "repository": { 58 | "type": "git", 59 | "url": "git://github.com/shahradelahi/node-archive.git" 60 | }, 61 | "author": "Shahrad Elahi (https://github.com/shahradelahi)", 62 | "license": "GPL-3.0", 63 | "bugs": { 64 | "url": "https://github.com/shahradelahi/node-archive/issues" 65 | }, 66 | "homepage": "https://github.com/shahradelahi/node-archive#readme" 67 | } 68 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/extract.ts: -------------------------------------------------------------------------------- 1 | import type { ContentLike, WritableStream } from '@/types'; 2 | import { BIN_PATH } from '@szip/bin'; 3 | import { handleExecaResult } from '@szip/helpers'; 4 | import { safeExec } from '@szip/utils/safe-exec'; 5 | import { SZipError } from 'szip'; 6 | 7 | type SZipExtractOptions = { 8 | // -ai (Include archives) 9 | includeArchives?: boolean; 10 | // -an (Disable parsing of archive_name) 11 | disableParsingArchiveName?: boolean; 12 | // -ao (Overwrite mode) 13 | overwriteMode?: string; 14 | // -ax (Exclude archives) 15 | excludeArchives?: boolean; 16 | // -i (Include) 17 | include?: string[]; 18 | // -m (Method) 19 | method?: string; 20 | // -o (Set Output Directory) 21 | outDir?: string; 22 | // -p (Set Password) 23 | password?: string; 24 | // -r (Recurse) 25 | recurse?: boolean; 26 | // -si (use StdIn) 27 | stdin?: ContentLike; 28 | // -sni (Store NT security information) 29 | storeNTSecurityInformation?: boolean; 30 | // -sns (Store NTFS alternate Streams) 31 | storeNTFSAlternateStreams?: boolean; 32 | // -so (use StdOut) 33 | stdout?: WritableStream; 34 | // -spf (Use fully qualified file paths) 35 | fullyQualifiedPaths?: boolean; 36 | // -spm (Require path separator mark for directory path) 37 | requirePathSeparator?: boolean; 38 | // -stx (Exclude archive type) 39 | excludeArchiveType?: boolean; 40 | // -t (Type of archive) 41 | type?: string; 42 | // -x (Exclude) 43 | exclude?: string[]; 44 | // -y (Assume Yes on all queries) 45 | assumeYes?: boolean; 46 | // -scrc (Set hash method) 47 | hashMethod?: string; 48 | // -w (Working Dir) 49 | cwd?: string; 50 | }; 51 | 52 | export async function extract(filename: string, options: SZipExtractOptions) { 53 | const args = ['e', filename]; 54 | 55 | // Examples: 56 | // 7z e archive.zip 57 | // 7z e archive.zip -oc:\soft *.cpp -r 58 | 59 | const { data, error } = await safeExec(BIN_PATH, args, { 60 | cwd: options?.cwd 61 | }); 62 | 63 | if (error) { 64 | return { error: SZipError.fromExecaError(error) }; 65 | } 66 | 67 | return handleExecaResult(data, { 68 | raw: true, 69 | parser: () => true 70 | }); 71 | } 72 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/encrypt.ts: -------------------------------------------------------------------------------- 1 | import { ContentLike } from '@/types'; 2 | import { normalizePathLike } from '@/utils/normalize'; 3 | import { BIN_PATH } from '@szip/bin'; 4 | import { debug } from '@szip/debugger'; 5 | import { handleExecaResult } from '@szip/helpers'; 6 | import { safeExec } from '@szip/utils/safe-exec'; 7 | import { PathLike } from 'node:fs'; 8 | import { basename } from 'node:path'; 9 | import { SafeReturn, SZipError } from 'szip'; 10 | 11 | type SZipEncryptOptions = { 12 | // -t (Type of archive) 13 | type?: string; 14 | // -p (Set Password) 15 | password: string; 16 | // -w (Working Dir) 17 | cwd?: string; 18 | // force overwrite 19 | force?: boolean; 20 | }; 21 | 22 | export async function encrypt( 23 | output: PathLike, 24 | content: ContentLike, 25 | options: SZipEncryptOptions & { raw: true } 26 | ): Promise>; 27 | 28 | export async function encrypt( 29 | output: PathLike, 30 | content: ContentLike, 31 | options: SZipEncryptOptions & { raw?: false } 32 | ): Promise>; 33 | 34 | /** 35 | * Encrypt an archive 36 | * 37 | * @param output 38 | * @param content 39 | * @param options 40 | */ 41 | export async function encrypt( 42 | output: PathLike, 43 | content: ContentLike, 44 | options: SZipEncryptOptions & { raw?: boolean } 45 | ): Promise> { 46 | const normalizedPath = normalizePathLike(output); 47 | const args = ['a', '-si', normalizedPath]; 48 | 49 | if (!options.password) { 50 | throw new Error('Password is required'); 51 | } 52 | 53 | if (options.type) { 54 | args.push(`-t${options.type}`); 55 | } 56 | 57 | args.push(`-p${options.password}`); 58 | 59 | const filename = basename(normalizedPath); 60 | 61 | if (filename.endsWith('.7z')) { 62 | args.push('-mhe=on'); 63 | } 64 | 65 | const { data, error } = await safeExec(BIN_PATH, args, { 66 | input: content, 67 | cwd: options?.cwd 68 | }); 69 | 70 | if (error) { 71 | return { error: SZipError.fromExecaError(error) }; 72 | } 73 | 74 | debug('encrypt', data.command); 75 | 76 | return handleExecaResult(data, { 77 | raw: options.raw || false, 78 | parser: () => true 79 | }); 80 | } 81 | -------------------------------------------------------------------------------- /packages/szip/src/parser/parse-archive-header.ts: -------------------------------------------------------------------------------- 1 | import { detectArchiveType } from '@szip/helpers'; 2 | import { 3 | BLOCKS_REGEX, 4 | CHARACTERISTICS_REGEX, 5 | CODE_PAGE_REGEX, 6 | HEADERS_SIZE_REGEX, 7 | METHOD_REGEX, 8 | PHYSICAL_SIZE_REGEX, 9 | SOLID_REGEX 10 | } from '@szip/parser/regex'; 11 | import { Archive7zHeader, ArchiveHeader, ArchiveTarHeader, ArchiveType } from '@szip/parser/types'; 12 | 13 | export function cRegExp(regex: RegExp): RegExp { 14 | return new RegExp(regex.source, regex.flags); 15 | } 16 | 17 | function parseTarHeader(message: string): ArchiveTarHeader { 18 | const physicalSize = cRegExp(PHYSICAL_SIZE_REGEX).exec(message); 19 | const headersSize = cRegExp(HEADERS_SIZE_REGEX).exec(message); 20 | const codePage = cRegExp(CODE_PAGE_REGEX).exec(message); 21 | const characteristics = cRegExp(CHARACTERISTICS_REGEX).exec(message); 22 | 23 | return { 24 | type: 'tar', 25 | physicalSize: physicalSize ? parseInt(physicalSize[1]) : 0, 26 | headersSize: headersSize ? parseInt(headersSize[1]) : 0, 27 | codePage: codePage ? codePage[1] : '', 28 | characteristics: characteristics ? characteristics[1] : '' 29 | }; 30 | } 31 | 32 | function parse7zHeader(message: string): Archive7zHeader { 33 | const physicalSize = cRegExp(PHYSICAL_SIZE_REGEX).exec(message); 34 | const headersSize = cRegExp(HEADERS_SIZE_REGEX).exec(message); 35 | const method = cRegExp(METHOD_REGEX).exec(message); 36 | const solid = cRegExp(SOLID_REGEX).exec(message); 37 | const blocks = cRegExp(BLOCKS_REGEX).exec(message); 38 | 39 | return { 40 | type: '7z', 41 | physicalSize: physicalSize ? parseInt(physicalSize[1]) : 0, 42 | headersSize: headersSize ? parseInt(headersSize[1]) : 0, 43 | method: method![1].split(' '), 44 | solid: solid![1] === '+', 45 | blocks: parseInt(blocks![1]) 46 | }; 47 | } 48 | 49 | export function parseArchiveHeader( 50 | message: string 51 | ): ArchiveHeader | undefined { 52 | const type = detectArchiveType(message); 53 | switch (type) { 54 | case '7z': 55 | return parse7zHeader(message) as ArchiveHeader; 56 | case 'tar': 57 | return parseTarHeader(message) as ArchiveHeader; 58 | case 'zip': 59 | throw new Error('Not implemented'); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /packages/szip/tests/compress.test.ts: -------------------------------------------------------------------------------- 1 | import { Archive } from 'node-archive'; 2 | import { resolve } from 'node:path'; 3 | import { SZip } from 'szip'; 4 | import { log } from '@tests/log'; 5 | import { expect } from 'chai'; 6 | import { createReadStream, createWriteStream, promises } from 'node:fs'; 7 | import { createTar, ROOT_DIR } from './utils'; 8 | 9 | describe('SZip - Compress', () => { 10 | describe('Using Stream', () => { 11 | it('compress data from read stream', async () => { 12 | const tarName = resolve(ROOT_DIR, 'source.tar'); 13 | const { data } = await createTar(tarName); 14 | expect(data).to.contain('Everything is Ok'); 15 | 16 | const filename = resolve(ROOT_DIR, 'source.tar.xz'); 17 | 18 | const { data: output } = await SZip.compress(filename, createReadStream(tarName), { 19 | type: 'xz', 20 | cwd: ROOT_DIR, 21 | raw: true 22 | }); 23 | 24 | log(output); 25 | 26 | await promises.unlink(filename); 27 | await promises.unlink(tarName); 28 | }); 29 | 30 | it('compress content to write stream', async () => { 31 | const tarName = resolve(ROOT_DIR, 'source.tar'); 32 | const { data } = await createTar(tarName); 33 | expect(data).to.contain('Everything is Ok'); 34 | 35 | const filename = resolve(ROOT_DIR, 'source.tar.xz'); 36 | 37 | const stream = createWriteStream(filename); 38 | 39 | const { data: output } = await SZip.compress(undefined, createReadStream(tarName), { 40 | type: 'xz', 41 | cwd: ROOT_DIR, 42 | stdout: stream 43 | }); 44 | 45 | expect(output).to.be.true; 46 | 47 | await promises.unlink(filename); 48 | await promises.unlink(tarName); 49 | }); 50 | }); 51 | 52 | it('compress a string', async () => { 53 | const tarName = resolve(ROOT_DIR, 'source.tar'); 54 | 55 | const { data } = await createTar(tarName); 56 | 57 | expect(data).to.contain('Everything is Ok'); 58 | 59 | // Read the source.tar and pass it to compress 60 | const content = await promises.readFile(tarName); 61 | 62 | const filename = resolve(ROOT_DIR, 'source.tar.xz'); 63 | 64 | const output = await SZip.compress(filename, content, { 65 | type: 'xz', 66 | cwd: ROOT_DIR 67 | }); 68 | 69 | log(output); 70 | 71 | expect(output).to.have.property('data'); 72 | expect(output.data).to.have.property('size'); 73 | expect(output.data).to.have.property('path'); 74 | 75 | await promises.unlink(filename); 76 | await promises.unlink(tarName); 77 | }); 78 | }); 79 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | packages/szip/.env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | .idea 133 | -------------------------------------------------------------------------------- /scripts/internal/configuration.ts: -------------------------------------------------------------------------------- 1 | import { homedir } from 'node:os'; 2 | import { join, resolve } from 'node:path'; 3 | import { fileURLToPath } from 'node:url'; 4 | 5 | import { Configuration } from './types'; 6 | import { getBooleanEnv } from './utils/boolean-env'; 7 | 8 | export function getConfiguration(): Configuration { 9 | const configuration: Partial = { 10 | version: '23.01', 11 | downloadBaseUrl: 'https://7zip.s3.ir-thr-at1.arvanstorage.ir' 12 | }; 13 | 14 | configuration.logLevel = (process.env['ARCHIVE_LOGLEVEL'] ?? 15 | process.env['npm_config_LOGLEVEL'] ?? 16 | process.env['npm_package_config_LOGLEVEL'] ?? 17 | configuration.logLevel ?? 18 | 'warn') as 'silent' | 'error' | 'warn'; 19 | 20 | configuration.binPath = 21 | process.env['ARCHIVE_BIN_PATH'] ?? 22 | process.env['npm_config_archive_bin_path'] ?? 23 | process.env['npm_package_config_archive_bin_path'] ?? 24 | configuration.binPath ?? 25 | // join(process.cwd(), 'node_modules', '.bin'); 26 | resolvePathFormPackage('../bin'); 27 | 28 | configuration.executablePath = 29 | process.env['ARCHIVE_EXECUTABLE_PATH'] ?? 30 | process.env['npm_config_archive_executable_path'] ?? 31 | process.env['npm_package_config_archive_executable_path'] ?? 32 | configuration.executablePath ?? 33 | join(configuration.binPath, '7zz'); 34 | 35 | // Set skipDownload explicitly or from default 36 | configuration.skipDownload = Boolean( 37 | getBooleanEnv('PUPPETEER_SKIP_DOWNLOAD') ?? 38 | getBooleanEnv('npm_config_archive_skip_download') ?? 39 | getBooleanEnv('npm_package_config_archive_skip_download') ?? 40 | configuration.skipDownload 41 | ); 42 | 43 | if (!configuration.skipDownload) { 44 | configuration.downloadBaseUrl = 45 | process.env['ARCHIVE_DOWNLOAD_BASE_URL'] ?? 46 | process.env['npm_config_archive_download_base_url'] ?? 47 | process.env['npm_package_config_archive_download_base_url'] ?? 48 | configuration.downloadBaseUrl; 49 | 50 | configuration.version = 51 | process.env['ARCHIVE_VERSION'] ?? 52 | process.env['npm_config_archive_version'] ?? 53 | process.env['npm_package_config_archive_version'] ?? 54 | configuration.version; 55 | } 56 | 57 | configuration.cacheDirectory = 58 | process.env['ARCHIVE_CACHE_DIR'] ?? 59 | process.env['npm_config_archive_cache_dir'] ?? 60 | process.env['npm_package_config_archive_cache_dir'] ?? 61 | configuration.cacheDirectory ?? 62 | join(homedir(), '.cache', 'node-archive'); 63 | 64 | return configuration as Configuration; 65 | } 66 | 67 | function resolvePathFormPackage(filePath: string) { 68 | const distPath = 69 | typeof __dirname === 'undefined' ? fileURLToPath(new URL(`.`, import.meta.url)) : __dirname; 70 | 71 | return resolve(distPath, filePath); 72 | } 73 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/list.ts: -------------------------------------------------------------------------------- 1 | import { normalizePathLike } from '@/utils/normalize'; 2 | import { BIN_PATH } from '@szip/bin'; 3 | import { debug } from '@szip/debugger'; 4 | import { SZipError } from '@szip/error'; 5 | import { handleExecaResult } from '@szip/helpers'; 6 | import { ArchiveInfo, ArchiveType, parseArchiveInfo } from '@szip/parser'; 7 | import type { SafeReturn } from '@szip/types'; 8 | import { safeExec } from '@szip/utils/safe-exec'; 9 | import type { PathLike } from 'node:fs'; 10 | 11 | type SZipListOptions = { 12 | // -ai (Include archives) 13 | includeArchives?: boolean; 14 | // -an (Disable parsing of archive_name) 15 | disableParsingArchiveName?: boolean; 16 | // -ax (Exclude archives) 17 | excludeArchives?: boolean; 18 | // -i (Include) 19 | include?: string[]; 20 | // // -slt (Show technical information) 21 | // technicalInfo?: boolean; 22 | // -sns (Store NTFS alternate Streams) 23 | storeNTFSAlternateStreams?: boolean; 24 | // -p (Set Password) 25 | password?: string; 26 | // -r (Recurse) 27 | recurse?: boolean; 28 | // -stx (Exclude archive type) 29 | excludeArchiveType?: boolean; 30 | // -t (Type of archive) 31 | type?: string; 32 | // -x (Exclude) 33 | exclude?: string[]; 34 | // -w (Working Dir) 35 | cwd?: string; 36 | }; 37 | 38 | export async function list( 39 | filename: PathLike, 40 | options: SZipListOptions & { raw?: false } 41 | ): Promise, SZipError>>; 42 | 43 | export async function list( 44 | filename: PathLike, 45 | options: SZipListOptions & { raw: true } 46 | ): Promise>; 47 | 48 | export async function list( 49 | filename: PathLike, 50 | options: SZipListOptions & { raw?: boolean } = {} 51 | ): Promise, SZipError>> { 52 | const args: string[] = ['l', '-slt', normalizePathLike(filename)]; 53 | 54 | if (options?.password) { 55 | args.push(`-p${options.password}`); 56 | } 57 | 58 | if (options?.recurse) { 59 | args.push('-r'); 60 | } 61 | 62 | if (options?.storeNTFSAlternateStreams) { 63 | args.push('-sns'); 64 | } 65 | 66 | if (options?.excludeArchiveType) { 67 | args.push('-stx'); 68 | } 69 | 70 | if (options?.include) { 71 | options.include.forEach((include) => { 72 | args.push('-i!' + include); 73 | }); 74 | } 75 | 76 | if (options?.excludeArchives) { 77 | args.push('-ax'); 78 | } 79 | 80 | if (options?.includeArchives) { 81 | args.push('-ai'); 82 | } 83 | 84 | const { data, error } = await safeExec(BIN_PATH, args, { 85 | cwd: options?.cwd 86 | }); 87 | 88 | if (error) { 89 | return { error: SZipError.fromExecaError(error) }; 90 | } 91 | 92 | debug('list', data.command); 93 | 94 | return handleExecaResult(data, { 95 | raw: options.raw || false, 96 | parser: parseArchiveInfo 97 | }); 98 | } 99 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/compress.ts: -------------------------------------------------------------------------------- 1 | import type { ContentLike, WritableStream } from '@/types'; 2 | import { BIN_PATH } from '@szip/bin'; 3 | import { debug } from '@szip/debugger'; 4 | import { SZipError } from '@szip/error'; 5 | import { auditArgsWithStdout, handleExecaResult } from '@szip/helpers'; 6 | import { SZipCompressResult } from '@szip/parser'; 7 | import { parseCompressMessage } from '@szip/parser/parse-compress-message'; 8 | import { safeExec } from '@szip/utils/safe-exec'; 9 | import { PathLike } from 'node:fs'; 10 | import { SafeReturn } from 'szip'; 11 | 12 | type SZipCompressOptions = { 13 | // -m (Method) 14 | method?: string; 15 | // -p (Set Password) 16 | password?: string; 17 | // -t (Type of archive) 18 | type: string; 19 | // -so (write data to stdout) 20 | stdout?: WritableStream; 21 | // -w (Working Dir) 22 | cwd?: string; 23 | // force: Force to recreate archive 24 | force?: boolean; 25 | }; 26 | 27 | export async function compress( 28 | filename: PathLike | undefined, 29 | content: ContentLike, 30 | options: Omit & { stdout: WritableStream; raw?: never } 31 | ): Promise>; 32 | 33 | export async function compress( 34 | filename: PathLike, 35 | content: ContentLike, 36 | options: SZipCompressOptions & { raw?: false } 37 | ): Promise>; 38 | 39 | export async function compress( 40 | filename: PathLike, 41 | content: ContentLike, 42 | options: SZipCompressOptions & { raw: true } 43 | ): Promise>; 44 | 45 | /** 46 | * Compress an archive or any given content. 47 | * 48 | * @param filename 49 | * @param content 50 | * @param options 51 | */ 52 | export async function compress( 53 | filename: PathLike | undefined, 54 | content: ContentLike, 55 | options: SZipCompressOptions & { raw?: boolean } 56 | ): Promise> { 57 | let args = ['a', '-si']; 58 | 59 | const audited = await auditArgsWithStdout(filename, args, options); 60 | if (audited.error) { 61 | return audited; 62 | } 63 | 64 | if (audited.data) { 65 | args = audited.data; 66 | } 67 | 68 | if (options.type) { 69 | args.push('-t' + options.type); 70 | } 71 | 72 | if (options.method) { 73 | args.push('-m' + options.method); 74 | } 75 | 76 | if (options.password) { 77 | args.push('-p' + options.password); 78 | } 79 | 80 | const { data, error } = await safeExec(BIN_PATH, args, { 81 | input: content, 82 | stdio: options.stdout ? ['pipe', options.stdout, 'inherit'] : undefined, 83 | cwd: options?.cwd 84 | }); 85 | 86 | if (error) { 87 | return { error: SZipError.fromExecaError(error) }; 88 | } 89 | 90 | debug('compress', data.command); 91 | 92 | return handleExecaResult(data, { 93 | raw: options.raw || false, 94 | stdout: options.stdout, 95 | parser: parseCompressMessage 96 | }); 97 | } 98 | -------------------------------------------------------------------------------- /packages/szip/src/helpers.ts: -------------------------------------------------------------------------------- 1 | import { fsAccessSync } from '@/utils/fs-access'; 2 | import { normalizePathLike } from '@/utils/normalize'; 3 | import type { ArchiveType } from '@szip/parser/types'; 4 | import { waitUtilOpenStream } from '@szip/utils/wait'; 5 | import { ExecaReturnValue } from 'execa'; 6 | import { PathLike, promises } from 'node:fs'; 7 | import type { Writable as WritableStream } from 'node:stream'; 8 | import { SafeReturn, SZipError } from 'szip'; 9 | 10 | export function detectArchiveType(message: string): ArchiveType | undefined { 11 | const matches = /--\n(?:.|\n)+^Type = (.+)$/gm.exec(message); 12 | if (!matches || !matches[1]) { 13 | return; 14 | } 15 | 16 | return matches[1].trim() as ArchiveType; 17 | } 18 | 19 | export function handleExecaResult( 20 | result: ExecaReturnValue, 21 | options: { raw: boolean; stdout?: WritableStream; parser?: (message: string) => Value } 22 | ): SafeReturn { 23 | if (options.stdout) { 24 | return { data: !result.failed }; 25 | } 26 | 27 | const message = result.stdout !== '' ? result.stdout : result.stderr; 28 | if (options.raw) { 29 | return { data: message }; 30 | } 31 | 32 | if (result.stderr !== '') { 33 | return { error: SZipError.fromStderr(result.stderr) }; 34 | } 35 | 36 | if (result.stdout === '') { 37 | return { error: new SZipError('Empty') }; 38 | } 39 | 40 | if (!options.parser) { 41 | return { error: new SZipError('No parser is provided') }; 42 | } 43 | 44 | return { data: options.parser(message) }; 45 | } 46 | 47 | export async function auditArgsWithStdout( 48 | filename: PathLike | undefined, 49 | args: string[], 50 | options: { stdout?: WritableStream; force?: boolean; ignoreOverwrite?: boolean; raw?: boolean } 51 | ): Promise> { 52 | if (options.stdout) { 53 | // Its using stdout. use a random str to as filename 54 | args.push('-so'); 55 | 56 | const randomStr = Math.random().toString(36).substring(7); 57 | const tempName = filename ? `${normalizePathLike(filename)}.${randomStr}` : `${randomStr}.tmp`; 58 | args.push(tempName); 59 | 60 | // We need to wait until the stream is open to write 61 | await waitUtilOpenStream(options.stdout); 62 | 63 | return { data: args }; 64 | } 65 | 66 | // Passing IF statement means we're going to write stdout to a file 67 | 68 | if (!filename) { 69 | return { error: new SZipError('Filename is required') }; 70 | } 71 | 72 | const normalizedFilename = normalizePathLike(filename); 73 | 74 | if (!options.ignoreOverwrite) { 75 | // Check if the file exists 76 | const exists = fsAccessSync(filename); 77 | if (exists && !options.force) { 78 | return { error: new SZipError('File already exists.') }; 79 | } 80 | 81 | if (options.force) { 82 | // Remove previous file 83 | try { 84 | await promises.unlink(filename); 85 | } catch (error) { 86 | return { error: new SZipError('Error removing previous file') }; 87 | } 88 | } 89 | } 90 | 91 | args.push(normalizedFilename); 92 | 93 | return { data: args }; 94 | } 95 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/delete.ts: -------------------------------------------------------------------------------- 1 | import { normalizePathLike } from '@/utils/normalize'; 2 | import { BIN_PATH } from '@szip/bin'; 3 | import { debug } from '@szip/debugger'; 4 | import { handleExecaResult } from '@szip/helpers'; 5 | import { ArchiveInfo, ArchiveResult, ArchiveType } from '@szip/parser'; 6 | import { parseArchiveResult } from '@szip/parser/parse-archive-result'; 7 | import { addPattern, isWildcard } from '@szip/utils/pattern'; 8 | import { safeExec } from '@szip/utils/safe-exec'; 9 | import { PathLike } from 'node:fs'; 10 | import { SafeReturn, SZipError } from 'szip'; 11 | 12 | type SZipDeleteOptions = { 13 | // -bb (Set output log level) 14 | logLevel?: string; 15 | // -i (Include) 16 | include?: string[]; 17 | // -x (Exclude) 18 | exclude?: string[]; 19 | // -m (Method) 20 | method?: string; 21 | // -w (Working Dir) 22 | cwd?: string; 23 | // -p (Set Password) 24 | password?: string; 25 | // -r (Recurse) 26 | recurse?: boolean; 27 | // -sns (Store NTFS alternate Streams) 28 | storeNTFSAlternateStreams?: boolean; 29 | // -u (Update) 30 | update?: boolean; 31 | }; 32 | 33 | export async function del( 34 | filepath: PathLike, 35 | patterns: string[], 36 | options?: SZipDeleteOptions & { raw: true } 37 | ): Promise>; 38 | 39 | export async function del( 40 | filepath: PathLike, 41 | patterns: string[], 42 | options?: SZipDeleteOptions & { raw?: boolean } 43 | ): Promise, SZipError>>; 44 | 45 | /** 46 | * Deletes files from archive. 47 | * 48 | * @param filepath 49 | * @param patterns 50 | * @param options 51 | */ 52 | export async function del( 53 | filepath: PathLike, 54 | patterns: string[], 55 | options?: SZipDeleteOptions & { raw?: boolean } 56 | ): Promise | string, SZipError>> { 57 | const normalizedPath = normalizePathLike(filepath); 58 | const args = ['d', normalizedPath]; 59 | 60 | if (options?.logLevel) { 61 | args.push(`-bb${options.logLevel}`); 62 | } 63 | 64 | if (options?.password) { 65 | args.push(`-p${options.password}`); 66 | } 67 | 68 | if (options?.recurse) { 69 | args.push('-r'); 70 | } 71 | 72 | if (options?.storeNTFSAlternateStreams) { 73 | args.push('-sns'); 74 | } 75 | 76 | if (options?.update) { 77 | args.push('-u'); 78 | } 79 | 80 | // Add patterns 81 | Array.from(patterns || []) 82 | .filter((p) => p && p.trim() !== '') 83 | .forEach((p) => args.push(p.trim())); 84 | 85 | if (options?.include) { 86 | options.include.forEach((include) => { 87 | args.push(addPattern('i', include, options.recurse ?? isWildcard(include))); 88 | }); 89 | } 90 | 91 | if (options?.exclude) { 92 | options.exclude.forEach((exclude) => { 93 | args.push(addPattern('x', exclude, options.recurse ?? isWildcard(exclude))); 94 | }); 95 | } 96 | 97 | // Examples: 98 | // 99 | // 7z d archive.zip *.bak -r 100 | // deletes *.bak files from archive archive.zip. 101 | 102 | const { data, error } = await safeExec(BIN_PATH, args, { 103 | cwd: options?.cwd 104 | }); 105 | 106 | if (error) { 107 | return { error: SZipError.fromExecaError(error) }; 108 | } 109 | 110 | debug('delete', data.command); 111 | 112 | // @ts-expect-error - It does not recognize the `type` property 113 | return handleExecaResult(data, { 114 | raw: options?.raw || false, 115 | parser: parseArchiveResult 116 | }); 117 | } 118 | -------------------------------------------------------------------------------- /scripts/internal/installer.ts: -------------------------------------------------------------------------------- 1 | import { promises } from 'node:fs'; 2 | 3 | import { getConfiguration } from './configuration'; 4 | import { logPolitely } from './log'; 5 | import { detectPlatform } from './utils/detect-platform'; 6 | import { overrideProxy } from './utils/override-proxy'; 7 | import { tryOrExit } from './utils/try-exit'; 8 | 9 | export async function download(): Promise { 10 | overrideProxy(); 11 | 12 | const configuration = getConfiguration(); 13 | if (configuration.skipDownload) { 14 | logPolitely('**INFO** Skipping 7zip download'); 15 | return; 16 | } 17 | 18 | const downloadBaseUrl = configuration.downloadBaseUrl; 19 | 20 | const platform = detectPlatform(); 21 | if (!platform) { 22 | throw new Error('The current platform is not supported.'); 23 | } 24 | 25 | const arch = process.arch; 26 | 27 | let downloadUrl: string; 28 | 29 | switch (platform) { 30 | case 'linux': 31 | switch (arch) { 32 | case 'x64' || 'arm' || 'arm64': 33 | downloadUrl = `${downloadBaseUrl}/${configuration.version}/linux/linux-${arch}/7zz`; 34 | break; 35 | case 'ia32': 36 | downloadUrl = `${downloadBaseUrl}/${configuration.version}/linux/linux-x86/7zz`; 37 | break; 38 | default: 39 | throw new Error('The current architecture is not supported.'); 40 | } 41 | break; 42 | case 'mac': 43 | downloadUrl = `${downloadBaseUrl}/${configuration.version}/mac/7zz`; 44 | break; 45 | case 'windows': 46 | switch (arch) { 47 | case 'x64': 48 | downloadUrl = `${downloadBaseUrl}/${configuration.version}/windows/x64/7zz.exe`; 49 | break; 50 | case 'ia32': // This is the architecture for 32-bit Windows 51 | downloadUrl = `${downloadBaseUrl}/${configuration.version}/windows/x86/7zz.exe`; 52 | break; 53 | default: 54 | throw new Error('The current architecture is not supported.'); 55 | } 56 | break; 57 | default: 58 | throw new Error('The current platform is not supported.'); 59 | } 60 | 61 | // Download 7zip 62 | if (configuration.logLevel !== 'silent') { 63 | logPolitely(`**INFO** Downloading binary...`); 64 | } 65 | 66 | const cacheDirectory = configuration.cacheDirectory; 67 | 68 | // Download it to the cache directory with a name that includes the version 69 | const downloadPath = `${cacheDirectory}/7zz-${configuration.version}`; 70 | 71 | // Download the file 72 | await tryOrExit(async () => { 73 | await promises.mkdir(configuration.cacheDirectory, { recursive: true }); 74 | await downloadFile(downloadUrl, downloadPath); 75 | }); 76 | 77 | // Make the file executable 78 | if (platform === 'linux' || platform === 'mac') { 79 | await tryOrExit(async () => { 80 | await promises.chmod(downloadPath, 0o755); 81 | }); 82 | } 83 | 84 | if (configuration.logLevel !== 'silent') { 85 | logPolitely(`**INFO** Binary downloaded to ${downloadPath}`); 86 | } 87 | 88 | // Move it to the user bin directory 89 | const destination = configuration.executablePath; 90 | 91 | // @todo: install in node_modules instead of user bin directory 92 | await tryOrExit(async () => { 93 | await promises.mkdir(configuration.binPath, { recursive: true }); 94 | await promises.rename(downloadPath, destination); 95 | }); 96 | 97 | if (configuration.logLevel !== 'silent') { 98 | logPolitely(`**INFO** Binary moved to ${destination}`); 99 | } 100 | 101 | return; 102 | } 103 | 104 | async function downloadFile(url: string, destination: string): Promise { 105 | const response = await fetch(url); 106 | const buffer = await response.arrayBuffer(); 107 | await promises.writeFile(destination, Buffer.from(buffer)); 108 | } 109 | -------------------------------------------------------------------------------- /packages/szip/src/parser/types.ts: -------------------------------------------------------------------------------- 1 | export type ArchiveType = '7z' | 'tar' | 'zip'; 2 | 3 | export type Archive7z = { 4 | path: string; 5 | type: '7z'; 6 | physicalSize: number; 7 | headersSize: number; 8 | method: string[]; 9 | solid: boolean; 10 | blocks: number; 11 | files: Archive7zFile[]; 12 | }; 13 | 14 | export type Archive7zFile = { 15 | path: string; 16 | size: number; 17 | packedSize: number; 18 | modified: string; 19 | attributes: string; 20 | crc: string; 21 | encrypted: boolean; 22 | method: string[]; 23 | block: number; 24 | }; 25 | 26 | export type ArchiveTar = { 27 | path: string; 28 | type: 'tar'; 29 | physicalSize: number; 30 | headersSize: number; 31 | codePage: string; 32 | characteristics: string; 33 | files: ArchiveTarFile[]; 34 | }; 35 | 36 | export type ArchiveTarFile = { 37 | path: string; 38 | folder: boolean; 39 | size: number; 40 | packedSize: number; 41 | modified: string; 42 | created: string | undefined; 43 | accessed: string | undefined; 44 | mode: string; 45 | user: string | undefined; 46 | group: string | undefined; 47 | userID: number; 48 | groupID: number; 49 | symbolicLink: boolean; 50 | hardLink: boolean; 51 | characteristics: string; 52 | comment: string | undefined; 53 | deviceMajor: string | undefined; 54 | deviceMinor: string | undefined; 55 | }; 56 | 57 | export type ArchiveZip = { 58 | path: string; 59 | type: 'zip'; 60 | physicalSize: number; 61 | files: ArchiveZipFile[]; 62 | }; 63 | 64 | export type ArchiveZipFile = { 65 | path: string; 66 | folder: boolean; 67 | size: number; 68 | packedSize: number; 69 | modified: string; 70 | created: string | undefined; 71 | accessed: string | undefined; 72 | attributes: string | undefined; 73 | encrypted: boolean; 74 | comment: string | undefined; 75 | crc: string | undefined; 76 | method: string; 77 | characteristics: string; 78 | hostOS: string; 79 | version: number; 80 | volumeIndex: number; 81 | offset: number; 82 | }; 83 | 84 | export type ArchiveInfo = Type extends ArchiveType 85 | ? { 86 | '7z': Archive7z; 87 | tar: ArchiveTar; 88 | zip: ArchiveZip; 89 | }[Type] 90 | : never; 91 | 92 | // ------------------------------- 93 | 94 | export interface SZipCompressResult { 95 | path: string; 96 | size: number; 97 | } 98 | 99 | // ------------------------------- 100 | 101 | export interface ArchiveTarHeader { 102 | type: 'tar'; 103 | physicalSize: number; 104 | headersSize: number; 105 | codePage: string; 106 | characteristics: string; 107 | } 108 | 109 | export interface Archive7zHeader { 110 | type: '7z'; 111 | physicalSize: number; 112 | headersSize: number; 113 | method: string[]; 114 | solid: boolean; 115 | blocks: number; 116 | } 117 | 118 | export type ArchiveHeader = Type extends ArchiveType 119 | ? { 120 | '7z': Archive7zHeader; 121 | tar: ArchiveTarHeader; 122 | zip: never; 123 | }[Type] 124 | : never; 125 | 126 | // ------------------------------- 127 | 128 | export type ArchiveStats = { 129 | files: number; 130 | bytes: number; 131 | } & (Operation extends 'delete' ? { folders?: never } : { folders: number }); 132 | 133 | export type ArchiveOperation = 'create' | 'update' | 'delete'; 134 | 135 | export type ArchiveResult< 136 | Operation extends ArchiveOperation = any, 137 | Type extends ArchiveType = any 138 | > = { 139 | path: string; 140 | size: number; 141 | previous?: ArchiveStats; 142 | added: ArchiveStats; 143 | } & (Operation extends 'create' 144 | ? { header?: never } 145 | : { 146 | header: ArchiveHeader; 147 | }) & 148 | (Operation extends 'delete' ? { deleted: ArchiveStats } : { deleted?: never }); 149 | 150 | // ------------------------------- 151 | -------------------------------------------------------------------------------- /packages/szip/tests/archive.test.ts: -------------------------------------------------------------------------------- 1 | import { log } from '@tests/log'; 2 | import { expect } from 'chai'; 3 | import { promises } from 'node:fs'; 4 | import { resolve } from 'node:path'; 5 | import { SZip } from 'szip'; 6 | import { ROOT_DIR } from './utils'; 7 | 8 | describe('SZip - Create Archive', () => { 9 | describe('Zip', () => { 10 | it('archive `src` and `dist` directory', async () => { 11 | const filename = resolve(ROOT_DIR, 'project.zip'); 12 | 13 | const output = await SZip.add(filename, ['src/*', 'dist/*'], { 14 | type: 'zip', 15 | cwd: ROOT_DIR, 16 | raw: true 17 | }); 18 | 19 | expect(output).to.have.property('data').that.is.a('string'); 20 | expect(output.data).to.contain('Everything is Ok'); 21 | 22 | await promises.unlink(filename); 23 | }); 24 | 25 | it('archive `package.json` and `pnpm-lock.yaml`', async () => { 26 | const filename = resolve(ROOT_DIR, 'package.zip'); 27 | 28 | const output = await SZip.add(filename, ['package.json', 'pnpm-lock.yaml'], { 29 | type: 'zip', 30 | cwd: ROOT_DIR, 31 | raw: true 32 | }); 33 | 34 | log(output); 35 | 36 | await promises.unlink(filename); 37 | }); 38 | }); 39 | 40 | describe('Tar', () => { 41 | it('archive `src` directory', async () => { 42 | const filename = 'project.tar'; 43 | 44 | const output = await SZip.add(filename, ['src/*'], { 45 | type: 'tar', 46 | cwd: ROOT_DIR, 47 | raw: true 48 | }); 49 | 50 | log(output); 51 | 52 | await promises.unlink(resolve(ROOT_DIR, filename)); 53 | }); 54 | 55 | it('should archive `src` and then add `dist` directory to archive', async () => { 56 | const filename = resolve(ROOT_DIR, 'project.tar'); 57 | 58 | const createdTar = await SZip.add(filename, ['src/*'], { 59 | type: 'tar', 60 | cwd: ROOT_DIR, 61 | raw: true 62 | }); 63 | 64 | log(createdTar); 65 | 66 | const updatedTar = await SZip.add(filename, ['dist/*'], { 67 | type: 'tar', 68 | update: true, // Update the archive 69 | cwd: ROOT_DIR, 70 | raw: true 71 | }); 72 | 73 | log(updatedTar); 74 | 75 | await promises.unlink(filename); 76 | }); 77 | 78 | it('archive `package.json` and `pnpm-lock.yaml` then removes `package.json` from archive', async () => { 79 | const filename = resolve(ROOT_DIR, 'package.tar'); 80 | 81 | const createdTar = await SZip.add(filename, ['package.json', 'pnpm-lock.yaml'], { 82 | type: 'tar', 83 | cwd: ROOT_DIR 84 | }); 85 | 86 | log(createdTar); 87 | 88 | const updatedTar = await SZip.del(filename, ['package.json']); 89 | 90 | log(updatedTar); 91 | 92 | await promises.unlink(filename); 93 | }); 94 | }); 95 | 96 | describe('7z', () => { 97 | it('should archive `src` and `dist` directory', async () => { 98 | const filename = resolve(ROOT_DIR, 'project.7z'); 99 | 100 | const output = await SZip.add(filename, ['src/*', 'dist/*'], { 101 | type: '7z', 102 | cwd: ROOT_DIR, 103 | raw: true 104 | }); 105 | 106 | expect(output, output.error?.message).to.have.property('data').that.is.a('string'); 107 | expect(output.data).to.contain('Everything is Ok'); 108 | 109 | log(output); 110 | 111 | await promises.unlink(filename); 112 | }); 113 | }); 114 | 115 | describe('With password', () => { 116 | it('create a zip', async () => { 117 | const filename = resolve(ROOT_DIR, 'source.zip'); 118 | 119 | const output = await SZip.add(filename, ['src/*', 'dist/*'], { 120 | type: 'zip', 121 | password: 'pa$$word @|', 122 | cwd: ROOT_DIR, 123 | raw: true 124 | }); 125 | 126 | log(output); 127 | 128 | await promises.unlink(filename); 129 | }); 130 | }); 131 | }); 132 | -------------------------------------------------------------------------------- /packages/szip/src/parser/parse-archive-info.ts: -------------------------------------------------------------------------------- 1 | import { SZipError } from '@szip/error'; 2 | import type { 3 | Archive7z, 4 | ArchiveInfo, 5 | ArchiveTarFile, 6 | ArchiveTar, 7 | Archive7zFile 8 | } from '@szip/parser/types'; 9 | import { detectArchiveType } from '@szip/helpers'; 10 | 11 | function parse7zArchiveInfo(message: string): Archive7z { 12 | const ARCHIVE_REGEX = /Listing archive: (.+)/gm; 13 | const archivePath = ARCHIVE_REGEX.exec(message)![1]; 14 | 15 | const PHYSICAL_SIZE_REGEX = /^Physical Size = (\d+)/gm; 16 | const HEADERS_SIZE_REGEX = /^Headers Size = (\d+)/gm; 17 | const METHOD_REGEX = /^Method = (.+)/gm; 18 | const SOLID_REGEX = /^Solid = (.+)/gm; 19 | const BLOCKS_REGEX = /^Blocks = (\d+)/gm; 20 | 21 | const FILE_REGEX = 22 | /Path = (.+)\nSize = (\d+)\nPacked Size = (\d+)\nModified = (.+)\nAttributes = (.+)\nCRC = (.+)\nEncrypted = (.+)\nMethod = (.+)\nBlock = (\d+)/gm; 23 | 24 | const physicalSize = parseInt(PHYSICAL_SIZE_REGEX.exec(message)![1]); 25 | const headersSize = parseInt(HEADERS_SIZE_REGEX.exec(message)![1]); 26 | const method = METHOD_REGEX.exec(message)![1].split(' '); 27 | const solid = SOLID_REGEX.exec(message)![1] === '+'; 28 | const blocks = parseInt(BLOCKS_REGEX.exec(message)![1]); 29 | 30 | const files: Archive7zFile[] = []; 31 | let file: RegExpExecArray | null; 32 | while ((file = FILE_REGEX.exec(message)) !== null) { 33 | files.push({ 34 | path: file[1], 35 | size: parseInt(file[2]), 36 | packedSize: parseInt(file[3]), 37 | modified: file[4], 38 | attributes: file[5], 39 | crc: file[6], 40 | encrypted: file[7] === '+', 41 | method: file[8].split(' '), 42 | block: parseInt(file[9]) 43 | }); 44 | } 45 | 46 | return { 47 | path: archivePath, 48 | type: '7z', 49 | physicalSize, 50 | headersSize, 51 | method, 52 | solid, 53 | blocks, 54 | files 55 | }; 56 | } 57 | 58 | function parseTarArchiveInfo(message: string): ArchiveTar { 59 | const FILE_REGEX = 60 | /Path = (.+)\nFolder = (.+)\nSize = (\d+)\nPacked Size = (\d+)\nModified = (.+)?\nCreated = (.+)?\nAccessed = (.+)?\nMode = (.+)?\nUser = (.+)?\nGroup = (.+)?\nUser ID = (.+)?\nGroup ID = (.+)?\nSymbolic Link = (.+)?\nHard Link = (.+)?\nCharacteristics = (.+)?\nComment = (.+)?\nDevice Major = (.+)?\nDevice Minor = (.+)?/gm; 61 | 62 | const files: ArchiveTarFile[] = []; 63 | let file: RegExpExecArray | null; 64 | while ((file = FILE_REGEX.exec(message)) !== null) { 65 | files.push({ 66 | path: file[1], 67 | folder: file[2] === '+', 68 | size: parseInt(file[3]), 69 | packedSize: parseInt(file[4]), 70 | modified: file[5], 71 | created: file[6], 72 | accessed: file[7], 73 | mode: file[8], 74 | user: file[9], 75 | group: file[10], 76 | userID: parseInt(file[11]), 77 | groupID: parseInt(file[12]), 78 | symbolicLink: file[13] === '+', 79 | hardLink: file[14] === '+', 80 | characteristics: file[15], 81 | comment: file[16], 82 | deviceMajor: file[17], 83 | deviceMinor: file[18] 84 | }); 85 | } 86 | 87 | const archivePath = /(?:Creating|Open|Updating|Listing) archive: (.+)$/gm.exec(message); 88 | const physicalSize = /^Physical Size = (\d+)/gm.exec(message); 89 | const headersSize = /^Headers Size = (\d+)/gm.exec(message); 90 | const codePage = /^Code Page = (.+)/gm.exec(message); 91 | const characteristics = /^Characteristics = (.+)/gm.exec(message); 92 | 93 | return { 94 | path: archivePath ? archivePath[1] : '', 95 | type: 'tar', 96 | physicalSize: physicalSize ? parseInt(physicalSize[1]) : 0, 97 | headersSize: headersSize ? parseInt(headersSize[1]) : 0, 98 | codePage: codePage ? codePage[1] : '', 99 | characteristics: characteristics ? characteristics[1] : '', 100 | files 101 | }; 102 | } 103 | 104 | export function parseArchiveInfo(message: string): ArchiveInfo | SZipError { 105 | const type = detectArchiveType(message); 106 | 107 | if (!type) { 108 | throw new SZipError('Archive type not detected'); 109 | } 110 | 111 | if (type === '7z') { 112 | return parse7zArchiveInfo(message); 113 | } 114 | 115 | if (type === 'tar') { 116 | return parseTarArchiveInfo(message); 117 | } 118 | 119 | throw new SZipError('Archive type not supported'); 120 | } 121 | -------------------------------------------------------------------------------- /src/lib/archive.ts: -------------------------------------------------------------------------------- 1 | import { SZip, SZipError } from 'szip'; 2 | import { PathLike } from 'node:fs'; 3 | 4 | type ArchiveOptions = { 5 | archive?: PathLike; 6 | password?: string; 7 | output?: PathLike; 8 | } & ( 9 | | { 10 | archive: PathLike; 11 | password?: string; 12 | } 13 | | { 14 | output: PathLike; 15 | } 16 | ); 17 | 18 | type ArchiveFormat = 'Zip' | 'GZip' | 'BZip2' | '7z' | 'XZ' | 'WIM' | 'Tar'; 19 | 20 | class Archive { 21 | private _archive: PathLike | undefined; 22 | private _password: string | undefined; 23 | 24 | private _output: PathLike | undefined; 25 | 26 | constructor( 27 | private format: ArchiveFormat, 28 | opts: ArchiveOptions 29 | ) { 30 | this._archive = opts.archive; 31 | this._password = opts.password; 32 | this._output = opts.output; 33 | } 34 | 35 | /** 36 | * Modify an existing archive file. 37 | * @param archive 38 | * @param password 39 | */ 40 | static fromArchive(archive: PathLike, password?: string): Archive { 41 | // Check archive exists 42 | // Get archive info 43 | // Check if password is required, if it was, validate it 44 | // Return new Archive instance 45 | // return new Archive({ 46 | // archive, 47 | // password 48 | // }); 49 | throw new Error('Not implemented'); 50 | } 51 | 52 | /** 53 | * Lists contents of archive. 54 | */ 55 | async list(): Promise { 56 | return []; 57 | } 58 | 59 | // ------------------------------ 60 | // Extract 61 | // ------------------------------ 62 | static async extract(archive: PathLike, output: PathLike, files: string[]): Promise {} 63 | 64 | static async extractAll(archive: PathLike, output: PathLike): Promise {} 65 | 66 | // ------------------------------ 67 | // Add, Update, and Delete 68 | // ------------------------------ 69 | async add(path: string, options: ArchiveAddOptions): Promise {} 70 | 71 | // ------------------------------ 72 | // Misc 73 | // ------------------------------ 74 | setPassword(password: string): void {} 75 | 76 | /** 77 | * Get information about an archive. 78 | * @param archive 79 | */ 80 | static async getInfo(archive: PathLike) { 81 | const info = await SZip.list(archive, {}); 82 | 83 | return info; 84 | } 85 | 86 | static async hasPassword(archive: PathLike): Promise { 87 | const { data, error } = await Archive.getInfo(archive); 88 | if (error) { 89 | throw error; 90 | } 91 | 92 | if (!data) { 93 | throw new SZipError('No data'); 94 | } 95 | 96 | switch (data.type) { 97 | case '7z': 98 | case 'zip': 99 | return data.files.some((file) => file.encrypted); 100 | case 'tar': 101 | return false; 102 | default: 103 | throw new SZipError('Unsupported archive type'); 104 | } 105 | } 106 | 107 | async finalize(opts: FinalizeOptions): Promise {} 108 | } 109 | 110 | type FinalizeOptions = { 111 | format: ArchiveFormat; 112 | } & ( 113 | | ({ 114 | format: 'Zip'; 115 | } & ArchiveZipOptions) 116 | | ({ 117 | format: 'GZip'; 118 | } & ArchiveGZipOptions) 119 | ); 120 | 121 | type ArchiveZipOptions = { 122 | method?: 'Copy' | 'Deflate' | 'Deflate64' | 'BZip2' | 'LZMA' | 'PPMd'; 123 | // Sets number of Fast Bytes for Deflate encoder. 124 | fastBytes?: number; 125 | // Sets number of Passes for Deflate encoder. 126 | passes?: number; 127 | // Sets Dictionary size for BZip2 128 | dictionarySize?: number; 129 | // Sets size of used memory for PPMd. 130 | memorySize?: number; 131 | // Sets model order for PPMd. 132 | modelOrder?: number; 133 | // Sets multithreading mode. 134 | threads?: number; 135 | // Sets a encryption method: ZipCrypto, AES128, AES192, AES256. 136 | encryption?: 'ZipCrypto' | 'AES128' | 'AES192' | 'AES256'; 137 | // 7-Zip always uses local code page for file names. 138 | localCodePage?: boolean; 139 | // 7-Zip uses UTF-8 for file names that contain non-ASCII symbols. 140 | utf8?: boolean; 141 | // Sets code page 142 | codePage?: boolean; 143 | // Stores last Modified timestamps for files. 144 | timestamps?: boolean; 145 | // Stores Creation timestamps for files. 146 | creationTimestamps?: boolean; 147 | // Stores last Access timestamps for files 148 | accessTimestamps?: boolean; 149 | // Sets timestamp precision: 0 - Windows (100 ns), 1 - Unix (1 sec), 2 - DOS (2 sec). 3 - Windows (100 ns). 150 | timestampPrecision?: 0 | 1 | 2 | 3; 151 | }; 152 | 153 | type ArchiveGZipOptions = Pick & { 154 | method?: 'Deflate'; 155 | }; 156 | 157 | interface ArchiveAddOptions { 158 | recursive?: boolean; 159 | } 160 | 161 | export { Archive }; 162 | -------------------------------------------------------------------------------- /packages/szip/src/cmd/add.ts: -------------------------------------------------------------------------------- 1 | import type { ContentLike, WritableStream } from '@/types'; 2 | import { BIN_PATH } from '@szip/bin'; 3 | import { debug } from '@szip/debugger'; 4 | import { SZipError } from '@szip/error'; 5 | import { auditArgsWithStdout, handleExecaResult } from '@szip/helpers'; 6 | import { ArchiveInfo, ArchiveOperation, ArchiveResult } from '@szip/parser'; 7 | import { parseArchiveResult } from '@szip/parser/parse-archive-result'; 8 | import { addPattern, isRecurse } from '@szip/utils/pattern'; 9 | import { safeExec } from '@szip/utils/safe-exec'; 10 | import { PathLike } from 'node:fs'; 11 | import { ArchiveType, SafeReturn } from 'szip'; 12 | 13 | type SZipAddOptions = { 14 | // -bb (Set output log level) 15 | logLevel?: string; 16 | // -i (Include) 17 | include?: string[]; 18 | // -m (Method) 19 | method?: string; 20 | // -p (Set Password) 21 | password?: string; 22 | // -r (Recurse) 23 | recurse?: boolean; 24 | // -sdel (Delete files after including to archive) 25 | deleteAfter?: boolean; 26 | // -sfx (create SFX) 27 | sfx?: boolean; 28 | // -si (use StdIn) 29 | stdin?: ContentLike; 30 | // -so (use StdOut) 31 | stdout?: WritableStream; 32 | // -sni (Store NT security information) 33 | storeNTSecurityInformation?: boolean; 34 | // -sns (Store NTFS alternate Streams) 35 | storeNTFSAlternateStreams?: boolean; 36 | // -ssw (Compress shared files) 37 | compressSharedFiles?: boolean; 38 | // -spf (Use fully qualified file paths) 39 | fullyQualifiedPaths?: boolean; 40 | // -spm (Require path separator mark for directory path) 41 | requirePathSeparator?: boolean; 42 | // -stl (Set archive timestamp from the most recently modified file) 43 | setArchiveTimestamp?: boolean; 44 | // -stx (Exclude archive type) 45 | excludeArchiveType?: boolean; 46 | // -t (Type of archive) 47 | type?: string; 48 | // -u (Update) 49 | update?: boolean; 50 | // -v (Volumes) 51 | volumes?: string; 52 | // -w (Working Dir) 53 | cwd?: string; 54 | // -x (Exclude) 55 | exclude?: string[]; 56 | }; 57 | 58 | export async function add< 59 | Operation extends ArchiveOperation = 'create' | 'update', 60 | Type extends ArchiveType = any 61 | >( 62 | filename: PathLike, 63 | patterns: string[], 64 | options: SZipAddOptions & { raw?: false } 65 | ): Promise, SZipError>>; 66 | 67 | export async function add( 68 | filename: PathLike, 69 | patterns: string[], 70 | options: SZipAddOptions & { stdout?: WritableStream; raw?: never } 71 | ): Promise>; 72 | 73 | export async function add( 74 | filename: PathLike, 75 | patterns: string[], 76 | options: SZipAddOptions & { raw: true } 77 | ): Promise>; 78 | 79 | /** 80 | * Add files to an archive. 81 | * 82 | * @param filename 83 | * @param patterns 84 | * @param options 85 | */ 86 | export async function add( 87 | filename: PathLike, 88 | patterns: string[], 89 | options: SZipAddOptions & { raw?: boolean } 90 | ): Promise | string | boolean, SZipError>> { 91 | let args = ['a']; 92 | 93 | const audited = await auditArgsWithStdout(filename, args, { 94 | ...options, 95 | ignoreOverwrite: options.update 96 | }); 97 | if (audited.error) { 98 | return audited; 99 | } 100 | 101 | if (audited.data) { 102 | args = audited.data; 103 | } 104 | 105 | if (options.type) { 106 | args.push('-t' + options.type); // Type of archive: zip, tar, etc. 107 | } 108 | 109 | if (options.password) { 110 | args.push(`-p${options.password}`); 111 | 112 | // On 7z format add -mhe switch 113 | if (options.type === '7z') { 114 | args.push('-mhe'); 115 | } 116 | } 117 | 118 | // Add patterns 119 | Array.from(patterns || []) 120 | .filter((p) => p && p.trim() !== '') 121 | .forEach((p) => args.push(p.trim())); 122 | 123 | if (options.include) { 124 | options.include.forEach((include) => { 125 | args.push(addPattern('i', include, options.recurse ?? isRecurse(include))); 126 | }); 127 | } 128 | 129 | if (options.exclude) { 130 | options.exclude.forEach((exclude) => { 131 | args.push(addPattern('x', exclude, options.recurse ?? isRecurse(exclude))); 132 | }); 133 | } 134 | 135 | if (options.volumes) { 136 | args.push('-v' + options.volumes); 137 | } 138 | 139 | if (options.deleteAfter) { 140 | args.push('-sdel'); 141 | } 142 | 143 | if (options.method) { 144 | args.push('-m' + options.method); 145 | } 146 | 147 | if (options.sfx) { 148 | args.push('-sfx'); 149 | } 150 | 151 | if (options.fullyQualifiedPaths) { 152 | args.push('-spf'); 153 | } 154 | 155 | if (options.requirePathSeparator) { 156 | args.push('-spm'); 157 | } 158 | 159 | if (options.storeNTSecurityInformation) { 160 | args.push('-sni'); 161 | } 162 | 163 | if (options.storeNTFSAlternateStreams) { 164 | args.push('-sns'); 165 | } 166 | 167 | if (options.compressSharedFiles) { 168 | args.push('-ssw'); 169 | } 170 | 171 | if (options.setArchiveTimestamp) { 172 | args.push('-stl'); 173 | } 174 | 175 | if (options.excludeArchiveType) { 176 | args.push('-stx'); 177 | } 178 | 179 | // Examples: 180 | // 181 | // $ 7z a archive1.zip subdir\ 182 | // adds all files and subfolders from folder subdir to archive archive1.zip. The filenames 183 | // in archive will contain subdir\ prefix. 184 | // 185 | // $ 7z a archive.7z Folder1\ -xr!*.png 186 | // adds to the archive.7z all files from Folder1 and its subfolders, except *.png files. 187 | // 188 | // $ 7z a -tzip archive.zip *.txt -x!temp.* 189 | // adds to the archive.zip all *.txt files, except temp.* files. 190 | 191 | const { data, error } = await safeExec(BIN_PATH, args, { 192 | cwd: options?.cwd 193 | }); 194 | 195 | if (error) { 196 | return { error: SZipError.fromExecaError(error) }; 197 | } 198 | 199 | debug('add', data.command); 200 | 201 | // @ts-expect-error - It does not recognize the `operation` and `type` properties 202 | return handleExecaResult(data, { 203 | raw: options.raw || false, 204 | stdout: options.stdout, 205 | parser: parseArchiveResult 206 | }); 207 | } 208 | -------------------------------------------------------------------------------- /packages/szip/tests/parser.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ArchiveResult, 3 | ArchiveTar, 4 | parseArchiveInfo, 5 | parseError, 6 | SZipCompressResult 7 | } from '@szip/parser'; 8 | import { parseArchiveResult } from '@szip/parser/parse-archive-result'; 9 | import { parseCompressMessage } from '@szip/parser/parse-compress-message'; 10 | import { log } from '@tests/log'; 11 | import { expect } from 'chai'; 12 | import { Archive7z } from 'szip'; 13 | 14 | describe('SZip - Message Parser', () => { 15 | describe('Create and Modify', () => { 16 | const MessageList = { 17 | MODIFY_ARCHIVE: `\ 18 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 19 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 20 | 21 | Open archive: source.tar 22 | -- 23 | Path = source.tar 24 | Type = tar 25 | Physical Size = 13312 26 | Headers Size = 5632 27 | Code Page = UTF-8 28 | Characteristics = GNU ASCII 29 | 30 | Scanning the drive: 31 | 3 folders, 6 files, 6865 bytes (7 KiB) 32 | 33 | Updating archive: source.tar 34 | 35 | Add new data to archive: 3 folders, 6 files, 6865 bytes (7 KiB) 36 | 37 | 38 | Files read from disk: 9 39 | Archive size: 13312 bytes (13 KiB) 40 | Everything is Ok`, 41 | UPDATE_ADDED_ARCHIVE: `\ 42 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 43 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 44 | 45 | Open archive: project.tar 46 | -- 47 | Path = project.tar 48 | Type = tar 49 | Physical Size = 20992 50 | Headers Size = 6656 51 | Code Page = UTF-8 52 | Characteristics = GNU ASCII 53 | 54 | Scanning the drive: 55 | 2 folders, 7 files, 2837970 bytes (2772 KiB) 56 | 57 | Updating archive: project.tar 58 | 59 | Keep old data in archive: 3 folders, 8 files, 12585 bytes (13 KiB) 60 | Add new data to archive: 2 folders, 7 files, 2837970 bytes (2772 KiB) 61 | 62 | 63 | Files read from disk: 9 64 | Archive size: 2865664 bytes (2799 KiB) 65 | Everything is Ok`, 66 | UPDATE_DELETED_ARCHIVE: `\ 67 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 68 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 69 | 70 | Open archive: package.tar 71 | -- 72 | Path = package.tar 73 | Type = tar 74 | Physical Size = 78336 75 | Headers Size = 2048 76 | Code Page = UTF-8 77 | Characteristics = GNU ASCII 78 | 79 | Updating archive: package.tar 80 | 81 | 82 | Delete data from archive: 1 file, 74192 bytes (73 KiB) 83 | Keep old data in archive: 1 file, 1760 bytes (2 KiB) 84 | Add new data to archive: 0 files, 0 bytes 85 | 86 | 87 | Files read from disk: 0 88 | Archive size: 3584 bytes (4 KiB) 89 | Everything is Ok`, 90 | NEW_ARCHIVE: `\ 91 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 92 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 93 | 94 | Scanning the drive: 95 | 5 folders, 15 files, 2852280 bytes (2786 KiB) 96 | 97 | Creating archive: project.zip 98 | 99 | Add new data to archive: 5 folders, 15 files, 2852280 bytes (2786 KiB) 100 | 101 | 102 | Files read from disk: 15 103 | Archive size: 1231162 bytes (1203 KiB) 104 | Everything is Ok` 105 | }; 106 | 107 | it('should parse a update message', () => { 108 | const message = MessageList.MODIFY_ARCHIVE; 109 | 110 | const expected: ArchiveResult<'update', 'tar'> = { 111 | path: 'source.tar', 112 | size: 13312, 113 | header: { 114 | type: 'tar', 115 | physicalSize: 13312, 116 | headersSize: 5632, 117 | codePage: 'UTF-8', 118 | characteristics: 'GNU ASCII' 119 | }, 120 | added: { 121 | folders: 3, 122 | files: 6, 123 | bytes: 6865 124 | } 125 | }; 126 | 127 | const result = parseArchiveResult(message); 128 | log(result); 129 | 130 | expect(result).to.deep.equal(expected); 131 | }); 132 | 133 | it('should parse a update message with previous archive', () => { 134 | const expected: ArchiveResult<'update', 'tar'> = { 135 | path: 'project.tar', 136 | size: 2865664, 137 | header: { 138 | type: 'tar', 139 | physicalSize: 20992, 140 | headersSize: 6656, 141 | codePage: 'UTF-8', 142 | characteristics: 'GNU ASCII' 143 | }, 144 | added: { 145 | folders: 2, 146 | files: 7, 147 | bytes: 2837970 148 | }, 149 | previous: { 150 | folders: 3, 151 | files: 8, 152 | bytes: 12585 153 | } 154 | }; 155 | 156 | const result = parseArchiveResult(MessageList.UPDATE_ADDED_ARCHIVE); 157 | log(result); 158 | 159 | expect(result).to.deep.equal(expected); 160 | }); 161 | 162 | it('should parse a update message with deleted archive', () => { 163 | const message = MessageList.UPDATE_DELETED_ARCHIVE; 164 | 165 | const expected: ArchiveResult<'delete', 'tar'> = { 166 | path: 'package.tar', 167 | size: 3584, 168 | header: { 169 | type: 'tar', 170 | physicalSize: 78336, 171 | headersSize: 2048, 172 | codePage: 'UTF-8', 173 | characteristics: 'GNU ASCII' 174 | }, 175 | deleted: { 176 | files: 1, 177 | bytes: 74192 178 | }, 179 | previous: { 180 | files: 1, 181 | bytes: 1760 182 | }, 183 | added: { 184 | files: 0, 185 | bytes: 0 186 | } 187 | }; 188 | 189 | const result = parseArchiveResult(message); 190 | log(result); 191 | 192 | expect(result).to.deep.equal(expected); 193 | }); 194 | 195 | it('should parse a new archive message', () => { 196 | const message = MessageList.NEW_ARCHIVE; 197 | 198 | const expected: ArchiveResult<'create'> = { 199 | path: 'project.zip', 200 | size: 1231162, 201 | added: { 202 | folders: 5, 203 | files: 15, 204 | bytes: 2852280 205 | } 206 | }; 207 | 208 | const result = parseArchiveResult(message); 209 | log(result); 210 | 211 | expect(result).to.deep.equal(expected); 212 | }); 213 | }); 214 | 215 | describe('List', () => { 216 | const MessageList: Record = { 217 | LIST_7Z: `\ 218 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 219 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 220 | 221 | Scanning the drive for archives: 222 | 1 file, 1004250 bytes (981 KiB) 223 | 224 | Listing archive: secure.tar.7z 225 | 226 | -- 227 | Path = secure.tar.7z 228 | Type = 7z 229 | Physical Size = 1004250 230 | Headers Size = 122 231 | Method = LZMA2:24 7zAES 232 | Solid = - 233 | Blocks = 1 234 | 235 | ---------- 236 | Path = secure.tar 237 | Size = 2868224 238 | Packed Size = 1004128 239 | Modified = 2024-03-08 00:09:39.2828660 240 | Attributes = RA ---------- 241 | CRC = F2118818 242 | Encrypted = + 243 | Method = LZMA2:24 7zAES:19 244 | Block = 0`, 245 | LIST_TAR: `\ 246 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 247 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:524288, ASM 248 | 249 | Scanning the drive for archives: 250 | 1 file, 2868224 bytes (2801 KiB) 251 | 252 | Listing archive: source.tar 253 | 254 | -- 255 | Path = source.tar 256 | Type = tar 257 | Physical Size = 2868224 258 | Headers Size = 11264 259 | Code Page = UTF-8 260 | Characteristics = GNU ASCII 261 | 262 | ---------- 263 | Path = dist/bin 264 | Folder = + 265 | Size = 0 266 | Packed Size = 0 267 | Modified = 2024-03-07 03:48:23 268 | Created = 269 | Accessed = 270 | Mode = drwxr-xr-x 271 | User = 272 | Group = 273 | User ID = 0 274 | Group ID = 0 275 | Symbolic Link = 276 | Hard Link = 277 | Characteristics = 5 GNU ASCII 278 | Comment = 279 | Device Major = 280 | Device Minor = 281 | 282 | Path = dist/bin/7zz 283 | Folder = - 284 | Size = 2763304 285 | Packed Size = 2763776 286 | Modified = 2024-03-07 03:48:23 287 | Created = 288 | Accessed = 289 | Mode = -rwxr-xr-x 290 | User = 291 | Group = 292 | User ID = 0 293 | Group ID = 0 294 | Symbolic Link = 295 | Hard Link = 296 | Characteristics = 0 GNU ASCII 297 | Comment = 298 | Device Major = 299 | Device Minor = `, 300 | LIST_ZIP: `\ 301 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 302 | 64-bit locale=C.UTF-8 Threads:8 OPEN_MAX:524288, ASM 303 | 304 | Scanning the drive for archives: 305 | 1 file, 1231071 bytes (1203 KiB) 306 | 307 | Listing archive: source.zip 308 | 309 | -- 310 | Path = source.zip 311 | Type = zip 312 | Physical Size = 1231071 313 | 314 | ---------- 315 | Path = dist/bin 316 | Folder = + 317 | Size = 0 318 | Packed Size = 0 319 | Modified = 2024-03-07 03:48:23.8745316 320 | Created = 321 | Accessed = 322 | Attributes = D drwxr-xr-x 323 | Encrypted = - 324 | Comment = 325 | CRC = 326 | Method = Store 327 | Characteristics = NTFS 328 | Host OS = Unix 329 | Version = 20 330 | Volume Index = 0 331 | Offset = 0 332 | 333 | Path = dist/bin/7zz 334 | Folder = - 335 | Size = 2763304 336 | Packed Size = 1205072 337 | Modified = 2024-03-07 03:48:23.8745316 338 | Created = 339 | Accessed = 340 | Attributes = -rwxr-xr-x 341 | Encrypted = - 342 | Comment = 343 | CRC = 2375CC5A 344 | Method = Deflate 345 | Characteristics = NTFS 346 | Host OS = Unix 347 | Version = 20 348 | Volume Index = 0 349 | Offset = 39` 350 | }; 351 | 352 | it('should parse a 7z archive list', () => { 353 | const message = MessageList.LIST_7Z; 354 | 355 | const expected: Archive7z = { 356 | path: 'secure.tar.7z', 357 | type: '7z', 358 | physicalSize: 1004250, 359 | headersSize: 122, 360 | method: ['LZMA2:24', '7zAES'], 361 | solid: false, 362 | blocks: 1, 363 | files: [ 364 | { 365 | path: 'secure.tar', 366 | size: 2868224, 367 | packedSize: 1004128, 368 | modified: '2024-03-08 00:09:39.2828660', 369 | attributes: 'RA ----------', 370 | crc: 'F2118818', 371 | encrypted: true, 372 | method: ['LZMA2:24', '7zAES:19'], 373 | block: 0 374 | } 375 | ] 376 | }; 377 | 378 | const result = parseArchiveInfo(message); 379 | log(result); 380 | 381 | expect(result).to.deep.equal(expected); 382 | }); 383 | 384 | it('should parse a tar archive list', () => { 385 | const message = MessageList.LIST_TAR; 386 | 387 | const expected: ArchiveTar = { 388 | path: 'source.tar', 389 | type: 'tar', 390 | physicalSize: 2868224, 391 | headersSize: 11264, 392 | codePage: 'UTF-8', 393 | characteristics: 'GNU ASCII', 394 | files: [ 395 | { 396 | path: 'dist/bin', 397 | folder: true, 398 | size: 0, 399 | packedSize: 0, 400 | modified: '2024-03-07 03:48:23', 401 | created: undefined, 402 | accessed: undefined, 403 | mode: 'drwxr-xr-x', 404 | user: undefined, 405 | group: undefined, 406 | userID: 0, 407 | groupID: 0, 408 | symbolicLink: false, 409 | hardLink: false, 410 | characteristics: '5 GNU ASCII', 411 | comment: undefined, 412 | deviceMajor: undefined, 413 | deviceMinor: undefined 414 | }, 415 | { 416 | path: 'dist/bin/7zz', 417 | folder: false, 418 | size: 2763304, 419 | packedSize: 2763776, 420 | modified: '2024-03-07 03:48:23', 421 | created: undefined, 422 | accessed: undefined, 423 | mode: '-rwxr-xr-x', 424 | user: undefined, 425 | group: undefined, 426 | userID: 0, 427 | groupID: 0, 428 | symbolicLink: false, 429 | hardLink: false, 430 | characteristics: '0 GNU ASCII', 431 | comment: undefined, 432 | deviceMajor: undefined, 433 | deviceMinor: undefined 434 | } 435 | ] 436 | }; 437 | 438 | const result = parseArchiveInfo(message); 439 | log(result); 440 | 441 | expect(result).to.deep.equal(expected); 442 | }); 443 | }); 444 | 445 | describe('Compress', () => { 446 | const MessageList: Record = { 447 | COMPRESS_XZ: `\ 448 | 7-Zip (z) 23.01 (x64) : Copyright (c) 1999-2023 Igor Pavlov : 2023-06-20 449 | 64-bit locale=en_US.UTF-8 Threads:8 OPEN_MAX:1048576, ASM 450 | 451 | Creating archive: /home/master/Projects/WebstormProjects/Github/node-archive/source.tar.xz 452 | 453 | Add new data to archive: 1 file 454 | 455 | 456 | Files read from disk: 1 457 | Archive size: 1003532 bytes (981 KiB) 458 | Everything is Ok` 459 | }; 460 | 461 | it('should parse a compress message', () => { 462 | const message = MessageList.COMPRESS_XZ; 463 | 464 | const expected: SZipCompressResult = { 465 | path: '/home/master/Projects/WebstormProjects/Github/node-archive/source.tar.xz', 466 | size: 1003532 467 | }; 468 | 469 | const result = parseCompressMessage(message); 470 | log(result); 471 | 472 | expect(result).to.deep.equal(expected); 473 | }); 474 | }); 475 | 476 | describe('Error', () => { 477 | const MessageList = { 478 | CMDLINE_ERROR_SINGLE: `\ 479 | Command Line Error: 480 | Incorrect wildcard type marker 481 | src/*.*`, 482 | CMDLINE_ERROR_SINGLE_2: `\ 483 | Command Line Error: 484 | I won't write compressed data to a terminal`, 485 | CMDLINE_ERROR_MULTI: `\ 486 | WARNING: errno=2 : No such file or directory 487 | !package.json 488 | 489 | 490 | WARNING: errno=2 : No such file or directory 491 | !pnpm-lock.yaml` 492 | }; 493 | 494 | // Errors with \n\n as separator are multi-line errors 495 | 496 | it('should parse a cmdline error message', async () => { 497 | const message = MessageList.CMDLINE_ERROR_SINGLE; 498 | 499 | const expected = 'Command Line Error: Incorrect wildcard type marker src/*.*'; 500 | 501 | const result = parseError(message); 502 | log(result); 503 | 504 | expect(result).to.equal(expected); 505 | }); 506 | 507 | it('should parse a cmdline error message with multi-line', async () => { 508 | const message = MessageList.CMDLINE_ERROR_MULTI; 509 | 510 | const expected = `\ 511 | WARNING: errno=2 : No such file or directory !package.json`; 512 | 513 | const result = parseError(message); 514 | log(result); 515 | 516 | expect(result).to.equal(expected); 517 | }); 518 | 519 | it('should parse a cmdline error message with multi-line 2', async () => { 520 | const message = MessageList.CMDLINE_ERROR_MULTI; 521 | 522 | const expected = `\ 523 | WARNING: errno=2 : No such file or directory !package.json`; 524 | 525 | const result = parseError(message); 526 | log(result); 527 | 528 | expect(result).to.equal(expected); 529 | }); 530 | }); 531 | }); 532 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | execa: 12 | specifier: ^8.0.1 13 | version: 8.0.1 14 | devDependencies: 15 | '@types/chai': 16 | specifier: ^4.3.12 17 | version: 4.3.12 18 | '@types/debug': 19 | specifier: ^4.1.12 20 | version: 4.1.12 21 | '@types/mocha': 22 | specifier: ^10.0.6 23 | version: 10.0.6 24 | '@types/node': 25 | specifier: ^20.11.26 26 | version: 20.11.26 27 | '@typescript-eslint/eslint-plugin': 28 | specifier: ^7.2.0 29 | version: 7.2.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2) 30 | chai: 31 | specifier: ^5.1.0 32 | version: 5.1.0 33 | debug: 34 | specifier: ^4.3.4 35 | version: 4.3.4(supports-color@8.1.1) 36 | dotenv: 37 | specifier: ^16.4.5 38 | version: 16.4.5 39 | eslint: 40 | specifier: ^8.57.0 41 | version: 8.57.0 42 | mocha: 43 | specifier: ^10.3.0 44 | version: 10.3.0 45 | prettier: 46 | specifier: ^3.2.5 47 | version: 3.2.5 48 | szip: 49 | specifier: workspace:^ 50 | version: link:packages/szip 51 | tsup: 52 | specifier: ^8.0.2 53 | version: 8.0.2(typescript@5.4.2) 54 | tsx: 55 | specifier: ^4.7.1 56 | version: 4.7.1 57 | typescript: 58 | specifier: ^5.4.2 59 | version: 5.4.2 60 | 61 | packages/szip: {} 62 | 63 | packages: 64 | 65 | /@aashutoshrathi/word-wrap@1.2.6: 66 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 67 | engines: {node: '>=0.10.0'} 68 | dev: true 69 | 70 | /@esbuild/aix-ppc64@0.19.12: 71 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 72 | engines: {node: '>=12'} 73 | cpu: [ppc64] 74 | os: [aix] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/android-arm64@0.19.12: 80 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 81 | engines: {node: '>=12'} 82 | cpu: [arm64] 83 | os: [android] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/android-arm@0.19.12: 89 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 90 | engines: {node: '>=12'} 91 | cpu: [arm] 92 | os: [android] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/android-x64@0.19.12: 98 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [android] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/darwin-arm64@0.19.12: 107 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [darwin] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/darwin-x64@0.19.12: 116 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 117 | engines: {node: '>=12'} 118 | cpu: [x64] 119 | os: [darwin] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/freebsd-arm64@0.19.12: 125 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 126 | engines: {node: '>=12'} 127 | cpu: [arm64] 128 | os: [freebsd] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/freebsd-x64@0.19.12: 134 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 135 | engines: {node: '>=12'} 136 | cpu: [x64] 137 | os: [freebsd] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-arm64@0.19.12: 143 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 144 | engines: {node: '>=12'} 145 | cpu: [arm64] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-arm@0.19.12: 152 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 153 | engines: {node: '>=12'} 154 | cpu: [arm] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-ia32@0.19.12: 161 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 162 | engines: {node: '>=12'} 163 | cpu: [ia32] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-loong64@0.19.12: 170 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 171 | engines: {node: '>=12'} 172 | cpu: [loong64] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-mips64el@0.19.12: 179 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 180 | engines: {node: '>=12'} 181 | cpu: [mips64el] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/linux-ppc64@0.19.12: 188 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 189 | engines: {node: '>=12'} 190 | cpu: [ppc64] 191 | os: [linux] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-riscv64@0.19.12: 197 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 198 | engines: {node: '>=12'} 199 | cpu: [riscv64] 200 | os: [linux] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/linux-s390x@0.19.12: 206 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 207 | engines: {node: '>=12'} 208 | cpu: [s390x] 209 | os: [linux] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/linux-x64@0.19.12: 215 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 216 | engines: {node: '>=12'} 217 | cpu: [x64] 218 | os: [linux] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/netbsd-x64@0.19.12: 224 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 225 | engines: {node: '>=12'} 226 | cpu: [x64] 227 | os: [netbsd] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/openbsd-x64@0.19.12: 233 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 234 | engines: {node: '>=12'} 235 | cpu: [x64] 236 | os: [openbsd] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/sunos-x64@0.19.12: 242 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 243 | engines: {node: '>=12'} 244 | cpu: [x64] 245 | os: [sunos] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/win32-arm64@0.19.12: 251 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 252 | engines: {node: '>=12'} 253 | cpu: [arm64] 254 | os: [win32] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@esbuild/win32-ia32@0.19.12: 260 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 261 | engines: {node: '>=12'} 262 | cpu: [ia32] 263 | os: [win32] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/win32-x64@0.19.12: 269 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 270 | engines: {node: '>=12'} 271 | cpu: [x64] 272 | os: [win32] 273 | requiresBuild: true 274 | dev: true 275 | optional: true 276 | 277 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): 278 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 279 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 280 | peerDependencies: 281 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 282 | dependencies: 283 | eslint: 8.57.0 284 | eslint-visitor-keys: 3.4.3 285 | dev: true 286 | 287 | /@eslint-community/regexpp@4.10.0: 288 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 289 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 290 | dev: true 291 | 292 | /@eslint/eslintrc@2.1.4: 293 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 294 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 295 | dependencies: 296 | ajv: 6.12.6 297 | debug: 4.3.4(supports-color@8.1.1) 298 | espree: 9.6.1 299 | globals: 13.24.0 300 | ignore: 5.3.1 301 | import-fresh: 3.3.0 302 | js-yaml: 4.1.0 303 | minimatch: 3.1.2 304 | strip-json-comments: 3.1.1 305 | transitivePeerDependencies: 306 | - supports-color 307 | dev: true 308 | 309 | /@eslint/js@8.57.0: 310 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 311 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 312 | dev: true 313 | 314 | /@humanwhocodes/config-array@0.11.14: 315 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 316 | engines: {node: '>=10.10.0'} 317 | dependencies: 318 | '@humanwhocodes/object-schema': 2.0.2 319 | debug: 4.3.4(supports-color@8.1.1) 320 | minimatch: 3.1.2 321 | transitivePeerDependencies: 322 | - supports-color 323 | dev: true 324 | 325 | /@humanwhocodes/module-importer@1.0.1: 326 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 327 | engines: {node: '>=12.22'} 328 | dev: true 329 | 330 | /@humanwhocodes/object-schema@2.0.2: 331 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 332 | dev: true 333 | 334 | /@isaacs/cliui@8.0.2: 335 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 336 | engines: {node: '>=12'} 337 | dependencies: 338 | string-width: 5.1.2 339 | string-width-cjs: /string-width@4.2.3 340 | strip-ansi: 7.1.0 341 | strip-ansi-cjs: /strip-ansi@6.0.1 342 | wrap-ansi: 8.1.0 343 | wrap-ansi-cjs: /wrap-ansi@7.0.0 344 | dev: true 345 | 346 | /@jridgewell/gen-mapping@0.3.5: 347 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 348 | engines: {node: '>=6.0.0'} 349 | dependencies: 350 | '@jridgewell/set-array': 1.2.1 351 | '@jridgewell/sourcemap-codec': 1.4.15 352 | '@jridgewell/trace-mapping': 0.3.25 353 | dev: true 354 | 355 | /@jridgewell/resolve-uri@3.1.2: 356 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 357 | engines: {node: '>=6.0.0'} 358 | dev: true 359 | 360 | /@jridgewell/set-array@1.2.1: 361 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 362 | engines: {node: '>=6.0.0'} 363 | dev: true 364 | 365 | /@jridgewell/sourcemap-codec@1.4.15: 366 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 367 | dev: true 368 | 369 | /@jridgewell/trace-mapping@0.3.25: 370 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 371 | dependencies: 372 | '@jridgewell/resolve-uri': 3.1.2 373 | '@jridgewell/sourcemap-codec': 1.4.15 374 | dev: true 375 | 376 | /@nodelib/fs.scandir@2.1.5: 377 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 378 | engines: {node: '>= 8'} 379 | dependencies: 380 | '@nodelib/fs.stat': 2.0.5 381 | run-parallel: 1.2.0 382 | dev: true 383 | 384 | /@nodelib/fs.stat@2.0.5: 385 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 386 | engines: {node: '>= 8'} 387 | dev: true 388 | 389 | /@nodelib/fs.walk@1.2.8: 390 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 391 | engines: {node: '>= 8'} 392 | dependencies: 393 | '@nodelib/fs.scandir': 2.1.5 394 | fastq: 1.17.1 395 | dev: true 396 | 397 | /@pkgjs/parseargs@0.11.0: 398 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 399 | engines: {node: '>=14'} 400 | requiresBuild: true 401 | dev: true 402 | optional: true 403 | 404 | /@rollup/rollup-android-arm-eabi@4.12.0: 405 | resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} 406 | cpu: [arm] 407 | os: [android] 408 | requiresBuild: true 409 | dev: true 410 | optional: true 411 | 412 | /@rollup/rollup-android-arm64@4.12.0: 413 | resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} 414 | cpu: [arm64] 415 | os: [android] 416 | requiresBuild: true 417 | dev: true 418 | optional: true 419 | 420 | /@rollup/rollup-darwin-arm64@4.12.0: 421 | resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} 422 | cpu: [arm64] 423 | os: [darwin] 424 | requiresBuild: true 425 | dev: true 426 | optional: true 427 | 428 | /@rollup/rollup-darwin-x64@4.12.0: 429 | resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} 430 | cpu: [x64] 431 | os: [darwin] 432 | requiresBuild: true 433 | dev: true 434 | optional: true 435 | 436 | /@rollup/rollup-linux-arm-gnueabihf@4.12.0: 437 | resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} 438 | cpu: [arm] 439 | os: [linux] 440 | requiresBuild: true 441 | dev: true 442 | optional: true 443 | 444 | /@rollup/rollup-linux-arm64-gnu@4.12.0: 445 | resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} 446 | cpu: [arm64] 447 | os: [linux] 448 | requiresBuild: true 449 | dev: true 450 | optional: true 451 | 452 | /@rollup/rollup-linux-arm64-musl@4.12.0: 453 | resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} 454 | cpu: [arm64] 455 | os: [linux] 456 | requiresBuild: true 457 | dev: true 458 | optional: true 459 | 460 | /@rollup/rollup-linux-riscv64-gnu@4.12.0: 461 | resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} 462 | cpu: [riscv64] 463 | os: [linux] 464 | requiresBuild: true 465 | dev: true 466 | optional: true 467 | 468 | /@rollup/rollup-linux-x64-gnu@4.12.0: 469 | resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} 470 | cpu: [x64] 471 | os: [linux] 472 | requiresBuild: true 473 | dev: true 474 | optional: true 475 | 476 | /@rollup/rollup-linux-x64-musl@4.12.0: 477 | resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} 478 | cpu: [x64] 479 | os: [linux] 480 | requiresBuild: true 481 | dev: true 482 | optional: true 483 | 484 | /@rollup/rollup-win32-arm64-msvc@4.12.0: 485 | resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} 486 | cpu: [arm64] 487 | os: [win32] 488 | requiresBuild: true 489 | dev: true 490 | optional: true 491 | 492 | /@rollup/rollup-win32-ia32-msvc@4.12.0: 493 | resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} 494 | cpu: [ia32] 495 | os: [win32] 496 | requiresBuild: true 497 | dev: true 498 | optional: true 499 | 500 | /@rollup/rollup-win32-x64-msvc@4.12.0: 501 | resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} 502 | cpu: [x64] 503 | os: [win32] 504 | requiresBuild: true 505 | dev: true 506 | optional: true 507 | 508 | /@types/chai@4.3.12: 509 | resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} 510 | dev: true 511 | 512 | /@types/debug@4.1.12: 513 | resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} 514 | dependencies: 515 | '@types/ms': 0.7.34 516 | dev: true 517 | 518 | /@types/estree@1.0.5: 519 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 520 | dev: true 521 | 522 | /@types/json-schema@7.0.15: 523 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 524 | dev: true 525 | 526 | /@types/mocha@10.0.6: 527 | resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} 528 | dev: true 529 | 530 | /@types/ms@0.7.34: 531 | resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} 532 | dev: true 533 | 534 | /@types/node@20.11.26: 535 | resolution: {integrity: sha512-YwOMmyhNnAWijOBQweOJnQPl068Oqd4K3OFbTc6AHJwzweUwwWG3GIFY74OKks2PJUDkQPeddOQES9mLn1CTEQ==} 536 | dependencies: 537 | undici-types: 5.26.5 538 | dev: true 539 | 540 | /@types/semver@7.5.8: 541 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 542 | dev: true 543 | 544 | /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.1.0)(eslint@8.57.0)(typescript@5.4.2): 545 | resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} 546 | engines: {node: ^16.0.0 || >=18.0.0} 547 | peerDependencies: 548 | '@typescript-eslint/parser': ^7.0.0 549 | eslint: ^8.56.0 550 | typescript: '*' 551 | peerDependenciesMeta: 552 | typescript: 553 | optional: true 554 | dependencies: 555 | '@eslint-community/regexpp': 4.10.0 556 | '@typescript-eslint/parser': 7.1.0(eslint@8.57.0)(typescript@5.4.2) 557 | '@typescript-eslint/scope-manager': 7.2.0 558 | '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 559 | '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 560 | '@typescript-eslint/visitor-keys': 7.2.0 561 | debug: 4.3.4(supports-color@8.1.1) 562 | eslint: 8.57.0 563 | graphemer: 1.4.0 564 | ignore: 5.3.1 565 | natural-compare: 1.4.0 566 | semver: 7.6.0 567 | ts-api-utils: 1.2.1(typescript@5.4.2) 568 | typescript: 5.4.2 569 | transitivePeerDependencies: 570 | - supports-color 571 | dev: true 572 | 573 | /@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.4.2): 574 | resolution: {integrity: sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w==} 575 | engines: {node: ^16.0.0 || >=18.0.0} 576 | peerDependencies: 577 | eslint: ^8.56.0 578 | typescript: '*' 579 | peerDependenciesMeta: 580 | typescript: 581 | optional: true 582 | dependencies: 583 | '@typescript-eslint/scope-manager': 7.1.0 584 | '@typescript-eslint/types': 7.1.0 585 | '@typescript-eslint/typescript-estree': 7.1.0(typescript@5.4.2) 586 | '@typescript-eslint/visitor-keys': 7.1.0 587 | debug: 4.3.4(supports-color@8.1.1) 588 | eslint: 8.57.0 589 | typescript: 5.4.2 590 | transitivePeerDependencies: 591 | - supports-color 592 | dev: true 593 | 594 | /@typescript-eslint/scope-manager@7.1.0: 595 | resolution: {integrity: sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A==} 596 | engines: {node: ^16.0.0 || >=18.0.0} 597 | dependencies: 598 | '@typescript-eslint/types': 7.1.0 599 | '@typescript-eslint/visitor-keys': 7.1.0 600 | dev: true 601 | 602 | /@typescript-eslint/scope-manager@7.2.0: 603 | resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} 604 | engines: {node: ^16.0.0 || >=18.0.0} 605 | dependencies: 606 | '@typescript-eslint/types': 7.2.0 607 | '@typescript-eslint/visitor-keys': 7.2.0 608 | dev: true 609 | 610 | /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): 611 | resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} 612 | engines: {node: ^16.0.0 || >=18.0.0} 613 | peerDependencies: 614 | eslint: ^8.56.0 615 | typescript: '*' 616 | peerDependenciesMeta: 617 | typescript: 618 | optional: true 619 | dependencies: 620 | '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) 621 | '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.2) 622 | debug: 4.3.4(supports-color@8.1.1) 623 | eslint: 8.57.0 624 | ts-api-utils: 1.2.1(typescript@5.4.2) 625 | typescript: 5.4.2 626 | transitivePeerDependencies: 627 | - supports-color 628 | dev: true 629 | 630 | /@typescript-eslint/types@7.1.0: 631 | resolution: {integrity: sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA==} 632 | engines: {node: ^16.0.0 || >=18.0.0} 633 | dev: true 634 | 635 | /@typescript-eslint/types@7.2.0: 636 | resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} 637 | engines: {node: ^16.0.0 || >=18.0.0} 638 | dev: true 639 | 640 | /@typescript-eslint/typescript-estree@7.1.0(typescript@5.4.2): 641 | resolution: {integrity: sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ==} 642 | engines: {node: ^16.0.0 || >=18.0.0} 643 | peerDependencies: 644 | typescript: '*' 645 | peerDependenciesMeta: 646 | typescript: 647 | optional: true 648 | dependencies: 649 | '@typescript-eslint/types': 7.1.0 650 | '@typescript-eslint/visitor-keys': 7.1.0 651 | debug: 4.3.4(supports-color@8.1.1) 652 | globby: 11.1.0 653 | is-glob: 4.0.3 654 | minimatch: 9.0.3 655 | semver: 7.6.0 656 | ts-api-utils: 1.2.1(typescript@5.4.2) 657 | typescript: 5.4.2 658 | transitivePeerDependencies: 659 | - supports-color 660 | dev: true 661 | 662 | /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.2): 663 | resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} 664 | engines: {node: ^16.0.0 || >=18.0.0} 665 | peerDependencies: 666 | typescript: '*' 667 | peerDependenciesMeta: 668 | typescript: 669 | optional: true 670 | dependencies: 671 | '@typescript-eslint/types': 7.2.0 672 | '@typescript-eslint/visitor-keys': 7.2.0 673 | debug: 4.3.4(supports-color@8.1.1) 674 | globby: 11.1.0 675 | is-glob: 4.0.3 676 | minimatch: 9.0.3 677 | semver: 7.6.0 678 | ts-api-utils: 1.2.1(typescript@5.4.2) 679 | typescript: 5.4.2 680 | transitivePeerDependencies: 681 | - supports-color 682 | dev: true 683 | 684 | /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.2): 685 | resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} 686 | engines: {node: ^16.0.0 || >=18.0.0} 687 | peerDependencies: 688 | eslint: ^8.56.0 689 | dependencies: 690 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 691 | '@types/json-schema': 7.0.15 692 | '@types/semver': 7.5.8 693 | '@typescript-eslint/scope-manager': 7.2.0 694 | '@typescript-eslint/types': 7.2.0 695 | '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.2) 696 | eslint: 8.57.0 697 | semver: 7.6.0 698 | transitivePeerDependencies: 699 | - supports-color 700 | - typescript 701 | dev: true 702 | 703 | /@typescript-eslint/visitor-keys@7.1.0: 704 | resolution: {integrity: sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA==} 705 | engines: {node: ^16.0.0 || >=18.0.0} 706 | dependencies: 707 | '@typescript-eslint/types': 7.1.0 708 | eslint-visitor-keys: 3.4.3 709 | dev: true 710 | 711 | /@typescript-eslint/visitor-keys@7.2.0: 712 | resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} 713 | engines: {node: ^16.0.0 || >=18.0.0} 714 | dependencies: 715 | '@typescript-eslint/types': 7.2.0 716 | eslint-visitor-keys: 3.4.3 717 | dev: true 718 | 719 | /@ungap/structured-clone@1.2.0: 720 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 721 | dev: true 722 | 723 | /acorn-jsx@5.3.2(acorn@8.11.3): 724 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 725 | peerDependencies: 726 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 727 | dependencies: 728 | acorn: 8.11.3 729 | dev: true 730 | 731 | /acorn@8.11.3: 732 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 733 | engines: {node: '>=0.4.0'} 734 | hasBin: true 735 | dev: true 736 | 737 | /ajv@6.12.6: 738 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 739 | dependencies: 740 | fast-deep-equal: 3.1.3 741 | fast-json-stable-stringify: 2.1.0 742 | json-schema-traverse: 0.4.1 743 | uri-js: 4.4.1 744 | dev: true 745 | 746 | /ansi-colors@4.1.1: 747 | resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} 748 | engines: {node: '>=6'} 749 | dev: true 750 | 751 | /ansi-regex@5.0.1: 752 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 753 | engines: {node: '>=8'} 754 | dev: true 755 | 756 | /ansi-regex@6.0.1: 757 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 758 | engines: {node: '>=12'} 759 | dev: true 760 | 761 | /ansi-styles@4.3.0: 762 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 763 | engines: {node: '>=8'} 764 | dependencies: 765 | color-convert: 2.0.1 766 | dev: true 767 | 768 | /ansi-styles@6.2.1: 769 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 770 | engines: {node: '>=12'} 771 | dev: true 772 | 773 | /any-promise@1.3.0: 774 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 775 | dev: true 776 | 777 | /anymatch@3.1.3: 778 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 779 | engines: {node: '>= 8'} 780 | dependencies: 781 | normalize-path: 3.0.0 782 | picomatch: 2.3.1 783 | dev: true 784 | 785 | /argparse@2.0.1: 786 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 787 | dev: true 788 | 789 | /array-union@2.1.0: 790 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 791 | engines: {node: '>=8'} 792 | dev: true 793 | 794 | /assertion-error@2.0.1: 795 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 796 | engines: {node: '>=12'} 797 | dev: true 798 | 799 | /balanced-match@1.0.2: 800 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 801 | dev: true 802 | 803 | /binary-extensions@2.2.0: 804 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 805 | engines: {node: '>=8'} 806 | dev: true 807 | 808 | /brace-expansion@1.1.11: 809 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 810 | dependencies: 811 | balanced-match: 1.0.2 812 | concat-map: 0.0.1 813 | dev: true 814 | 815 | /brace-expansion@2.0.1: 816 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 817 | dependencies: 818 | balanced-match: 1.0.2 819 | dev: true 820 | 821 | /braces@3.0.2: 822 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 823 | engines: {node: '>=8'} 824 | dependencies: 825 | fill-range: 7.0.1 826 | dev: true 827 | 828 | /browser-stdout@1.3.1: 829 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 830 | dev: true 831 | 832 | /bundle-require@4.0.2(esbuild@0.19.12): 833 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 834 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 835 | peerDependencies: 836 | esbuild: '>=0.17' 837 | dependencies: 838 | esbuild: 0.19.12 839 | load-tsconfig: 0.2.5 840 | dev: true 841 | 842 | /cac@6.7.14: 843 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 844 | engines: {node: '>=8'} 845 | dev: true 846 | 847 | /callsites@3.1.0: 848 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 849 | engines: {node: '>=6'} 850 | dev: true 851 | 852 | /camelcase@6.3.0: 853 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 854 | engines: {node: '>=10'} 855 | dev: true 856 | 857 | /chai@5.1.0: 858 | resolution: {integrity: sha512-kDZ7MZyM6Q1DhR9jy7dalKohXQ2yrlXkk59CR52aRKxJrobmlBNqnFQxX9xOX8w+4mz8SYlKJa/7D7ddltFXCw==} 859 | engines: {node: '>=12'} 860 | dependencies: 861 | assertion-error: 2.0.1 862 | check-error: 2.0.0 863 | deep-eql: 5.0.1 864 | loupe: 3.1.0 865 | pathval: 2.0.0 866 | dev: true 867 | 868 | /chalk@4.1.2: 869 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 870 | engines: {node: '>=10'} 871 | dependencies: 872 | ansi-styles: 4.3.0 873 | supports-color: 7.2.0 874 | dev: true 875 | 876 | /check-error@2.0.0: 877 | resolution: {integrity: sha512-tjLAOBHKVxtPoHe/SA7kNOMvhCRdCJ3vETdeY0RuAc9popf+hyaSV6ZEg9hr4cpWF7jmo/JSWEnLDrnijS9Tog==} 878 | engines: {node: '>= 16'} 879 | dev: true 880 | 881 | /chokidar@3.5.3: 882 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 883 | engines: {node: '>= 8.10.0'} 884 | dependencies: 885 | anymatch: 3.1.3 886 | braces: 3.0.2 887 | glob-parent: 5.1.2 888 | is-binary-path: 2.1.0 889 | is-glob: 4.0.3 890 | normalize-path: 3.0.0 891 | readdirp: 3.6.0 892 | optionalDependencies: 893 | fsevents: 2.3.3 894 | dev: true 895 | 896 | /chokidar@3.6.0: 897 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 898 | engines: {node: '>= 8.10.0'} 899 | dependencies: 900 | anymatch: 3.1.3 901 | braces: 3.0.2 902 | glob-parent: 5.1.2 903 | is-binary-path: 2.1.0 904 | is-glob: 4.0.3 905 | normalize-path: 3.0.0 906 | readdirp: 3.6.0 907 | optionalDependencies: 908 | fsevents: 2.3.3 909 | dev: true 910 | 911 | /cliui@7.0.4: 912 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 913 | dependencies: 914 | string-width: 4.2.3 915 | strip-ansi: 6.0.1 916 | wrap-ansi: 7.0.0 917 | dev: true 918 | 919 | /color-convert@2.0.1: 920 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 921 | engines: {node: '>=7.0.0'} 922 | dependencies: 923 | color-name: 1.1.4 924 | dev: true 925 | 926 | /color-name@1.1.4: 927 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 928 | dev: true 929 | 930 | /commander@4.1.1: 931 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 932 | engines: {node: '>= 6'} 933 | dev: true 934 | 935 | /concat-map@0.0.1: 936 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 937 | dev: true 938 | 939 | /cross-spawn@7.0.3: 940 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 941 | engines: {node: '>= 8'} 942 | dependencies: 943 | path-key: 3.1.1 944 | shebang-command: 2.0.0 945 | which: 2.0.2 946 | 947 | /debug@4.3.4(supports-color@8.1.1): 948 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 949 | engines: {node: '>=6.0'} 950 | peerDependencies: 951 | supports-color: '*' 952 | peerDependenciesMeta: 953 | supports-color: 954 | optional: true 955 | dependencies: 956 | ms: 2.1.2 957 | supports-color: 8.1.1 958 | dev: true 959 | 960 | /decamelize@4.0.0: 961 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 962 | engines: {node: '>=10'} 963 | dev: true 964 | 965 | /deep-eql@5.0.1: 966 | resolution: {integrity: sha512-nwQCf6ne2gez3o1MxWifqkciwt0zhl0LO1/UwVu4uMBuPmflWM4oQ70XMqHqnBJA+nhzncaqL9HVL6KkHJ28lw==} 967 | engines: {node: '>=6'} 968 | dev: true 969 | 970 | /deep-is@0.1.4: 971 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 972 | dev: true 973 | 974 | /diff@5.0.0: 975 | resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} 976 | engines: {node: '>=0.3.1'} 977 | dev: true 978 | 979 | /dir-glob@3.0.1: 980 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 981 | engines: {node: '>=8'} 982 | dependencies: 983 | path-type: 4.0.0 984 | dev: true 985 | 986 | /doctrine@3.0.0: 987 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 988 | engines: {node: '>=6.0.0'} 989 | dependencies: 990 | esutils: 2.0.3 991 | dev: true 992 | 993 | /dotenv@16.4.5: 994 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} 995 | engines: {node: '>=12'} 996 | dev: true 997 | 998 | /eastasianwidth@0.2.0: 999 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1000 | dev: true 1001 | 1002 | /emoji-regex@8.0.0: 1003 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1004 | dev: true 1005 | 1006 | /emoji-regex@9.2.2: 1007 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1008 | dev: true 1009 | 1010 | /esbuild@0.19.12: 1011 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1012 | engines: {node: '>=12'} 1013 | hasBin: true 1014 | requiresBuild: true 1015 | optionalDependencies: 1016 | '@esbuild/aix-ppc64': 0.19.12 1017 | '@esbuild/android-arm': 0.19.12 1018 | '@esbuild/android-arm64': 0.19.12 1019 | '@esbuild/android-x64': 0.19.12 1020 | '@esbuild/darwin-arm64': 0.19.12 1021 | '@esbuild/darwin-x64': 0.19.12 1022 | '@esbuild/freebsd-arm64': 0.19.12 1023 | '@esbuild/freebsd-x64': 0.19.12 1024 | '@esbuild/linux-arm': 0.19.12 1025 | '@esbuild/linux-arm64': 0.19.12 1026 | '@esbuild/linux-ia32': 0.19.12 1027 | '@esbuild/linux-loong64': 0.19.12 1028 | '@esbuild/linux-mips64el': 0.19.12 1029 | '@esbuild/linux-ppc64': 0.19.12 1030 | '@esbuild/linux-riscv64': 0.19.12 1031 | '@esbuild/linux-s390x': 0.19.12 1032 | '@esbuild/linux-x64': 0.19.12 1033 | '@esbuild/netbsd-x64': 0.19.12 1034 | '@esbuild/openbsd-x64': 0.19.12 1035 | '@esbuild/sunos-x64': 0.19.12 1036 | '@esbuild/win32-arm64': 0.19.12 1037 | '@esbuild/win32-ia32': 0.19.12 1038 | '@esbuild/win32-x64': 0.19.12 1039 | dev: true 1040 | 1041 | /escalade@3.1.2: 1042 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1043 | engines: {node: '>=6'} 1044 | dev: true 1045 | 1046 | /escape-string-regexp@4.0.0: 1047 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1048 | engines: {node: '>=10'} 1049 | dev: true 1050 | 1051 | /eslint-scope@7.2.2: 1052 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1053 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1054 | dependencies: 1055 | esrecurse: 4.3.0 1056 | estraverse: 5.3.0 1057 | dev: true 1058 | 1059 | /eslint-visitor-keys@3.4.3: 1060 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1061 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1062 | dev: true 1063 | 1064 | /eslint@8.57.0: 1065 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 1066 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1067 | hasBin: true 1068 | dependencies: 1069 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1070 | '@eslint-community/regexpp': 4.10.0 1071 | '@eslint/eslintrc': 2.1.4 1072 | '@eslint/js': 8.57.0 1073 | '@humanwhocodes/config-array': 0.11.14 1074 | '@humanwhocodes/module-importer': 1.0.1 1075 | '@nodelib/fs.walk': 1.2.8 1076 | '@ungap/structured-clone': 1.2.0 1077 | ajv: 6.12.6 1078 | chalk: 4.1.2 1079 | cross-spawn: 7.0.3 1080 | debug: 4.3.4(supports-color@8.1.1) 1081 | doctrine: 3.0.0 1082 | escape-string-regexp: 4.0.0 1083 | eslint-scope: 7.2.2 1084 | eslint-visitor-keys: 3.4.3 1085 | espree: 9.6.1 1086 | esquery: 1.5.0 1087 | esutils: 2.0.3 1088 | fast-deep-equal: 3.1.3 1089 | file-entry-cache: 6.0.1 1090 | find-up: 5.0.0 1091 | glob-parent: 6.0.2 1092 | globals: 13.24.0 1093 | graphemer: 1.4.0 1094 | ignore: 5.3.1 1095 | imurmurhash: 0.1.4 1096 | is-glob: 4.0.3 1097 | is-path-inside: 3.0.3 1098 | js-yaml: 4.1.0 1099 | json-stable-stringify-without-jsonify: 1.0.1 1100 | levn: 0.4.1 1101 | lodash.merge: 4.6.2 1102 | minimatch: 3.1.2 1103 | natural-compare: 1.4.0 1104 | optionator: 0.9.3 1105 | strip-ansi: 6.0.1 1106 | text-table: 0.2.0 1107 | transitivePeerDependencies: 1108 | - supports-color 1109 | dev: true 1110 | 1111 | /espree@9.6.1: 1112 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1113 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1114 | dependencies: 1115 | acorn: 8.11.3 1116 | acorn-jsx: 5.3.2(acorn@8.11.3) 1117 | eslint-visitor-keys: 3.4.3 1118 | dev: true 1119 | 1120 | /esquery@1.5.0: 1121 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1122 | engines: {node: '>=0.10'} 1123 | dependencies: 1124 | estraverse: 5.3.0 1125 | dev: true 1126 | 1127 | /esrecurse@4.3.0: 1128 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1129 | engines: {node: '>=4.0'} 1130 | dependencies: 1131 | estraverse: 5.3.0 1132 | dev: true 1133 | 1134 | /estraverse@5.3.0: 1135 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1136 | engines: {node: '>=4.0'} 1137 | dev: true 1138 | 1139 | /esutils@2.0.3: 1140 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1141 | engines: {node: '>=0.10.0'} 1142 | dev: true 1143 | 1144 | /execa@5.1.1: 1145 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1146 | engines: {node: '>=10'} 1147 | dependencies: 1148 | cross-spawn: 7.0.3 1149 | get-stream: 6.0.1 1150 | human-signals: 2.1.0 1151 | is-stream: 2.0.1 1152 | merge-stream: 2.0.0 1153 | npm-run-path: 4.0.1 1154 | onetime: 5.1.2 1155 | signal-exit: 3.0.7 1156 | strip-final-newline: 2.0.0 1157 | dev: true 1158 | 1159 | /execa@8.0.1: 1160 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 1161 | engines: {node: '>=16.17'} 1162 | dependencies: 1163 | cross-spawn: 7.0.3 1164 | get-stream: 8.0.1 1165 | human-signals: 5.0.0 1166 | is-stream: 3.0.0 1167 | merge-stream: 2.0.0 1168 | npm-run-path: 5.3.0 1169 | onetime: 6.0.0 1170 | signal-exit: 4.1.0 1171 | strip-final-newline: 3.0.0 1172 | dev: false 1173 | 1174 | /fast-deep-equal@3.1.3: 1175 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1176 | dev: true 1177 | 1178 | /fast-glob@3.3.2: 1179 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1180 | engines: {node: '>=8.6.0'} 1181 | dependencies: 1182 | '@nodelib/fs.stat': 2.0.5 1183 | '@nodelib/fs.walk': 1.2.8 1184 | glob-parent: 5.1.2 1185 | merge2: 1.4.1 1186 | micromatch: 4.0.5 1187 | dev: true 1188 | 1189 | /fast-json-stable-stringify@2.1.0: 1190 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1191 | dev: true 1192 | 1193 | /fast-levenshtein@2.0.6: 1194 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1195 | dev: true 1196 | 1197 | /fastq@1.17.1: 1198 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1199 | dependencies: 1200 | reusify: 1.0.4 1201 | dev: true 1202 | 1203 | /file-entry-cache@6.0.1: 1204 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1205 | engines: {node: ^10.12.0 || >=12.0.0} 1206 | dependencies: 1207 | flat-cache: 3.2.0 1208 | dev: true 1209 | 1210 | /fill-range@7.0.1: 1211 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1212 | engines: {node: '>=8'} 1213 | dependencies: 1214 | to-regex-range: 5.0.1 1215 | dev: true 1216 | 1217 | /find-up@5.0.0: 1218 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1219 | engines: {node: '>=10'} 1220 | dependencies: 1221 | locate-path: 6.0.0 1222 | path-exists: 4.0.0 1223 | dev: true 1224 | 1225 | /flat-cache@3.2.0: 1226 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1227 | engines: {node: ^10.12.0 || >=12.0.0} 1228 | dependencies: 1229 | flatted: 3.3.1 1230 | keyv: 4.5.4 1231 | rimraf: 3.0.2 1232 | dev: true 1233 | 1234 | /flat@5.0.2: 1235 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 1236 | hasBin: true 1237 | dev: true 1238 | 1239 | /flatted@3.3.1: 1240 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 1241 | dev: true 1242 | 1243 | /foreground-child@3.1.1: 1244 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1245 | engines: {node: '>=14'} 1246 | dependencies: 1247 | cross-spawn: 7.0.3 1248 | signal-exit: 4.1.0 1249 | dev: true 1250 | 1251 | /fs.realpath@1.0.0: 1252 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1253 | dev: true 1254 | 1255 | /fsevents@2.3.3: 1256 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1257 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1258 | os: [darwin] 1259 | requiresBuild: true 1260 | dev: true 1261 | optional: true 1262 | 1263 | /get-caller-file@2.0.5: 1264 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1265 | engines: {node: 6.* || 8.* || >= 10.*} 1266 | dev: true 1267 | 1268 | /get-func-name@2.0.2: 1269 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 1270 | dev: true 1271 | 1272 | /get-stream@6.0.1: 1273 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1274 | engines: {node: '>=10'} 1275 | dev: true 1276 | 1277 | /get-stream@8.0.1: 1278 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 1279 | engines: {node: '>=16'} 1280 | dev: false 1281 | 1282 | /get-tsconfig@4.7.2: 1283 | resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} 1284 | dependencies: 1285 | resolve-pkg-maps: 1.0.0 1286 | dev: true 1287 | 1288 | /glob-parent@5.1.2: 1289 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1290 | engines: {node: '>= 6'} 1291 | dependencies: 1292 | is-glob: 4.0.3 1293 | dev: true 1294 | 1295 | /glob-parent@6.0.2: 1296 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1297 | engines: {node: '>=10.13.0'} 1298 | dependencies: 1299 | is-glob: 4.0.3 1300 | dev: true 1301 | 1302 | /glob@10.3.10: 1303 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1304 | engines: {node: '>=16 || 14 >=14.17'} 1305 | hasBin: true 1306 | dependencies: 1307 | foreground-child: 3.1.1 1308 | jackspeak: 2.3.6 1309 | minimatch: 9.0.3 1310 | minipass: 7.0.4 1311 | path-scurry: 1.10.1 1312 | dev: true 1313 | 1314 | /glob@7.2.3: 1315 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1316 | dependencies: 1317 | fs.realpath: 1.0.0 1318 | inflight: 1.0.6 1319 | inherits: 2.0.4 1320 | minimatch: 3.1.2 1321 | once: 1.4.0 1322 | path-is-absolute: 1.0.1 1323 | dev: true 1324 | 1325 | /glob@8.1.0: 1326 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 1327 | engines: {node: '>=12'} 1328 | dependencies: 1329 | fs.realpath: 1.0.0 1330 | inflight: 1.0.6 1331 | inherits: 2.0.4 1332 | minimatch: 5.0.1 1333 | once: 1.4.0 1334 | dev: true 1335 | 1336 | /globals@13.24.0: 1337 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1338 | engines: {node: '>=8'} 1339 | dependencies: 1340 | type-fest: 0.20.2 1341 | dev: true 1342 | 1343 | /globby@11.1.0: 1344 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1345 | engines: {node: '>=10'} 1346 | dependencies: 1347 | array-union: 2.1.0 1348 | dir-glob: 3.0.1 1349 | fast-glob: 3.3.2 1350 | ignore: 5.3.1 1351 | merge2: 1.4.1 1352 | slash: 3.0.0 1353 | dev: true 1354 | 1355 | /graphemer@1.4.0: 1356 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1357 | dev: true 1358 | 1359 | /has-flag@4.0.0: 1360 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1361 | engines: {node: '>=8'} 1362 | dev: true 1363 | 1364 | /he@1.2.0: 1365 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1366 | hasBin: true 1367 | dev: true 1368 | 1369 | /human-signals@2.1.0: 1370 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1371 | engines: {node: '>=10.17.0'} 1372 | dev: true 1373 | 1374 | /human-signals@5.0.0: 1375 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 1376 | engines: {node: '>=16.17.0'} 1377 | dev: false 1378 | 1379 | /ignore@5.3.1: 1380 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1381 | engines: {node: '>= 4'} 1382 | dev: true 1383 | 1384 | /import-fresh@3.3.0: 1385 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1386 | engines: {node: '>=6'} 1387 | dependencies: 1388 | parent-module: 1.0.1 1389 | resolve-from: 4.0.0 1390 | dev: true 1391 | 1392 | /imurmurhash@0.1.4: 1393 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1394 | engines: {node: '>=0.8.19'} 1395 | dev: true 1396 | 1397 | /inflight@1.0.6: 1398 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1399 | dependencies: 1400 | once: 1.4.0 1401 | wrappy: 1.0.2 1402 | dev: true 1403 | 1404 | /inherits@2.0.4: 1405 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1406 | dev: true 1407 | 1408 | /is-binary-path@2.1.0: 1409 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1410 | engines: {node: '>=8'} 1411 | dependencies: 1412 | binary-extensions: 2.2.0 1413 | dev: true 1414 | 1415 | /is-extglob@2.1.1: 1416 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1417 | engines: {node: '>=0.10.0'} 1418 | dev: true 1419 | 1420 | /is-fullwidth-code-point@3.0.0: 1421 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1422 | engines: {node: '>=8'} 1423 | dev: true 1424 | 1425 | /is-glob@4.0.3: 1426 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1427 | engines: {node: '>=0.10.0'} 1428 | dependencies: 1429 | is-extglob: 2.1.1 1430 | dev: true 1431 | 1432 | /is-number@7.0.0: 1433 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1434 | engines: {node: '>=0.12.0'} 1435 | dev: true 1436 | 1437 | /is-path-inside@3.0.3: 1438 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1439 | engines: {node: '>=8'} 1440 | dev: true 1441 | 1442 | /is-plain-obj@2.1.0: 1443 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 1444 | engines: {node: '>=8'} 1445 | dev: true 1446 | 1447 | /is-stream@2.0.1: 1448 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1449 | engines: {node: '>=8'} 1450 | dev: true 1451 | 1452 | /is-stream@3.0.0: 1453 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1454 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1455 | dev: false 1456 | 1457 | /is-unicode-supported@0.1.0: 1458 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1459 | engines: {node: '>=10'} 1460 | dev: true 1461 | 1462 | /isexe@2.0.0: 1463 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1464 | 1465 | /jackspeak@2.3.6: 1466 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1467 | engines: {node: '>=14'} 1468 | dependencies: 1469 | '@isaacs/cliui': 8.0.2 1470 | optionalDependencies: 1471 | '@pkgjs/parseargs': 0.11.0 1472 | dev: true 1473 | 1474 | /joycon@3.1.1: 1475 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1476 | engines: {node: '>=10'} 1477 | dev: true 1478 | 1479 | /js-yaml@4.1.0: 1480 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1481 | hasBin: true 1482 | dependencies: 1483 | argparse: 2.0.1 1484 | dev: true 1485 | 1486 | /json-buffer@3.0.1: 1487 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1488 | dev: true 1489 | 1490 | /json-schema-traverse@0.4.1: 1491 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1492 | dev: true 1493 | 1494 | /json-stable-stringify-without-jsonify@1.0.1: 1495 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1496 | dev: true 1497 | 1498 | /keyv@4.5.4: 1499 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1500 | dependencies: 1501 | json-buffer: 3.0.1 1502 | dev: true 1503 | 1504 | /levn@0.4.1: 1505 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1506 | engines: {node: '>= 0.8.0'} 1507 | dependencies: 1508 | prelude-ls: 1.2.1 1509 | type-check: 0.4.0 1510 | dev: true 1511 | 1512 | /lilconfig@3.1.1: 1513 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1514 | engines: {node: '>=14'} 1515 | dev: true 1516 | 1517 | /lines-and-columns@1.2.4: 1518 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1519 | dev: true 1520 | 1521 | /load-tsconfig@0.2.5: 1522 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 1523 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1524 | dev: true 1525 | 1526 | /locate-path@6.0.0: 1527 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1528 | engines: {node: '>=10'} 1529 | dependencies: 1530 | p-locate: 5.0.0 1531 | dev: true 1532 | 1533 | /lodash.merge@4.6.2: 1534 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1535 | dev: true 1536 | 1537 | /lodash.sortby@4.7.0: 1538 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 1539 | dev: true 1540 | 1541 | /log-symbols@4.1.0: 1542 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1543 | engines: {node: '>=10'} 1544 | dependencies: 1545 | chalk: 4.1.2 1546 | is-unicode-supported: 0.1.0 1547 | dev: true 1548 | 1549 | /loupe@3.1.0: 1550 | resolution: {integrity: sha512-qKl+FrLXUhFuHUoDJG7f8P8gEMHq9NFS0c6ghXG1J0rldmZFQZoNVv/vyirE9qwCIhWZDsvEFd1sbFu3GvRQFg==} 1551 | dependencies: 1552 | get-func-name: 2.0.2 1553 | dev: true 1554 | 1555 | /lru-cache@10.2.0: 1556 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1557 | engines: {node: 14 || >=16.14} 1558 | dev: true 1559 | 1560 | /lru-cache@6.0.0: 1561 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1562 | engines: {node: '>=10'} 1563 | dependencies: 1564 | yallist: 4.0.0 1565 | dev: true 1566 | 1567 | /merge-stream@2.0.0: 1568 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1569 | 1570 | /merge2@1.4.1: 1571 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1572 | engines: {node: '>= 8'} 1573 | dev: true 1574 | 1575 | /micromatch@4.0.5: 1576 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1577 | engines: {node: '>=8.6'} 1578 | dependencies: 1579 | braces: 3.0.2 1580 | picomatch: 2.3.1 1581 | dev: true 1582 | 1583 | /mimic-fn@2.1.0: 1584 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1585 | engines: {node: '>=6'} 1586 | dev: true 1587 | 1588 | /mimic-fn@4.0.0: 1589 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1590 | engines: {node: '>=12'} 1591 | dev: false 1592 | 1593 | /minimatch@3.1.2: 1594 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1595 | dependencies: 1596 | brace-expansion: 1.1.11 1597 | dev: true 1598 | 1599 | /minimatch@5.0.1: 1600 | resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} 1601 | engines: {node: '>=10'} 1602 | dependencies: 1603 | brace-expansion: 2.0.1 1604 | dev: true 1605 | 1606 | /minimatch@9.0.3: 1607 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1608 | engines: {node: '>=16 || 14 >=14.17'} 1609 | dependencies: 1610 | brace-expansion: 2.0.1 1611 | dev: true 1612 | 1613 | /minipass@7.0.4: 1614 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1615 | engines: {node: '>=16 || 14 >=14.17'} 1616 | dev: true 1617 | 1618 | /mocha@10.3.0: 1619 | resolution: {integrity: sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==} 1620 | engines: {node: '>= 14.0.0'} 1621 | hasBin: true 1622 | dependencies: 1623 | ansi-colors: 4.1.1 1624 | browser-stdout: 1.3.1 1625 | chokidar: 3.5.3 1626 | debug: 4.3.4(supports-color@8.1.1) 1627 | diff: 5.0.0 1628 | escape-string-regexp: 4.0.0 1629 | find-up: 5.0.0 1630 | glob: 8.1.0 1631 | he: 1.2.0 1632 | js-yaml: 4.1.0 1633 | log-symbols: 4.1.0 1634 | minimatch: 5.0.1 1635 | ms: 2.1.3 1636 | serialize-javascript: 6.0.0 1637 | strip-json-comments: 3.1.1 1638 | supports-color: 8.1.1 1639 | workerpool: 6.2.1 1640 | yargs: 16.2.0 1641 | yargs-parser: 20.2.4 1642 | yargs-unparser: 2.0.0 1643 | dev: true 1644 | 1645 | /ms@2.1.2: 1646 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1647 | dev: true 1648 | 1649 | /ms@2.1.3: 1650 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1651 | dev: true 1652 | 1653 | /mz@2.7.0: 1654 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1655 | dependencies: 1656 | any-promise: 1.3.0 1657 | object-assign: 4.1.1 1658 | thenify-all: 1.6.0 1659 | dev: true 1660 | 1661 | /natural-compare@1.4.0: 1662 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1663 | dev: true 1664 | 1665 | /normalize-path@3.0.0: 1666 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1667 | engines: {node: '>=0.10.0'} 1668 | dev: true 1669 | 1670 | /npm-run-path@4.0.1: 1671 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1672 | engines: {node: '>=8'} 1673 | dependencies: 1674 | path-key: 3.1.1 1675 | dev: true 1676 | 1677 | /npm-run-path@5.3.0: 1678 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1679 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1680 | dependencies: 1681 | path-key: 4.0.0 1682 | dev: false 1683 | 1684 | /object-assign@4.1.1: 1685 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1686 | engines: {node: '>=0.10.0'} 1687 | dev: true 1688 | 1689 | /once@1.4.0: 1690 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1691 | dependencies: 1692 | wrappy: 1.0.2 1693 | dev: true 1694 | 1695 | /onetime@5.1.2: 1696 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1697 | engines: {node: '>=6'} 1698 | dependencies: 1699 | mimic-fn: 2.1.0 1700 | dev: true 1701 | 1702 | /onetime@6.0.0: 1703 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1704 | engines: {node: '>=12'} 1705 | dependencies: 1706 | mimic-fn: 4.0.0 1707 | dev: false 1708 | 1709 | /optionator@0.9.3: 1710 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1711 | engines: {node: '>= 0.8.0'} 1712 | dependencies: 1713 | '@aashutoshrathi/word-wrap': 1.2.6 1714 | deep-is: 0.1.4 1715 | fast-levenshtein: 2.0.6 1716 | levn: 0.4.1 1717 | prelude-ls: 1.2.1 1718 | type-check: 0.4.0 1719 | dev: true 1720 | 1721 | /p-limit@3.1.0: 1722 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1723 | engines: {node: '>=10'} 1724 | dependencies: 1725 | yocto-queue: 0.1.0 1726 | dev: true 1727 | 1728 | /p-locate@5.0.0: 1729 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1730 | engines: {node: '>=10'} 1731 | dependencies: 1732 | p-limit: 3.1.0 1733 | dev: true 1734 | 1735 | /parent-module@1.0.1: 1736 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1737 | engines: {node: '>=6'} 1738 | dependencies: 1739 | callsites: 3.1.0 1740 | dev: true 1741 | 1742 | /path-exists@4.0.0: 1743 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1744 | engines: {node: '>=8'} 1745 | dev: true 1746 | 1747 | /path-is-absolute@1.0.1: 1748 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1749 | engines: {node: '>=0.10.0'} 1750 | dev: true 1751 | 1752 | /path-key@3.1.1: 1753 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1754 | engines: {node: '>=8'} 1755 | 1756 | /path-key@4.0.0: 1757 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1758 | engines: {node: '>=12'} 1759 | dev: false 1760 | 1761 | /path-scurry@1.10.1: 1762 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1763 | engines: {node: '>=16 || 14 >=14.17'} 1764 | dependencies: 1765 | lru-cache: 10.2.0 1766 | minipass: 7.0.4 1767 | dev: true 1768 | 1769 | /path-type@4.0.0: 1770 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1771 | engines: {node: '>=8'} 1772 | dev: true 1773 | 1774 | /pathval@2.0.0: 1775 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1776 | engines: {node: '>= 14.16'} 1777 | dev: true 1778 | 1779 | /picomatch@2.3.1: 1780 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1781 | engines: {node: '>=8.6'} 1782 | dev: true 1783 | 1784 | /pirates@4.0.6: 1785 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1786 | engines: {node: '>= 6'} 1787 | dev: true 1788 | 1789 | /postcss-load-config@4.0.2: 1790 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1791 | engines: {node: '>= 14'} 1792 | peerDependencies: 1793 | postcss: '>=8.0.9' 1794 | ts-node: '>=9.0.0' 1795 | peerDependenciesMeta: 1796 | postcss: 1797 | optional: true 1798 | ts-node: 1799 | optional: true 1800 | dependencies: 1801 | lilconfig: 3.1.1 1802 | yaml: 2.4.0 1803 | dev: true 1804 | 1805 | /prelude-ls@1.2.1: 1806 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1807 | engines: {node: '>= 0.8.0'} 1808 | dev: true 1809 | 1810 | /prettier@3.2.5: 1811 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 1812 | engines: {node: '>=14'} 1813 | hasBin: true 1814 | dev: true 1815 | 1816 | /punycode@2.3.1: 1817 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1818 | engines: {node: '>=6'} 1819 | dev: true 1820 | 1821 | /queue-microtask@1.2.3: 1822 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1823 | dev: true 1824 | 1825 | /randombytes@2.1.0: 1826 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1827 | dependencies: 1828 | safe-buffer: 5.2.1 1829 | dev: true 1830 | 1831 | /readdirp@3.6.0: 1832 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1833 | engines: {node: '>=8.10.0'} 1834 | dependencies: 1835 | picomatch: 2.3.1 1836 | dev: true 1837 | 1838 | /require-directory@2.1.1: 1839 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1840 | engines: {node: '>=0.10.0'} 1841 | dev: true 1842 | 1843 | /resolve-from@4.0.0: 1844 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1845 | engines: {node: '>=4'} 1846 | dev: true 1847 | 1848 | /resolve-from@5.0.0: 1849 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1850 | engines: {node: '>=8'} 1851 | dev: true 1852 | 1853 | /resolve-pkg-maps@1.0.0: 1854 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1855 | dev: true 1856 | 1857 | /reusify@1.0.4: 1858 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1859 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1860 | dev: true 1861 | 1862 | /rimraf@3.0.2: 1863 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1864 | hasBin: true 1865 | dependencies: 1866 | glob: 7.2.3 1867 | dev: true 1868 | 1869 | /rollup@4.12.0: 1870 | resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} 1871 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1872 | hasBin: true 1873 | dependencies: 1874 | '@types/estree': 1.0.5 1875 | optionalDependencies: 1876 | '@rollup/rollup-android-arm-eabi': 4.12.0 1877 | '@rollup/rollup-android-arm64': 4.12.0 1878 | '@rollup/rollup-darwin-arm64': 4.12.0 1879 | '@rollup/rollup-darwin-x64': 4.12.0 1880 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 1881 | '@rollup/rollup-linux-arm64-gnu': 4.12.0 1882 | '@rollup/rollup-linux-arm64-musl': 4.12.0 1883 | '@rollup/rollup-linux-riscv64-gnu': 4.12.0 1884 | '@rollup/rollup-linux-x64-gnu': 4.12.0 1885 | '@rollup/rollup-linux-x64-musl': 4.12.0 1886 | '@rollup/rollup-win32-arm64-msvc': 4.12.0 1887 | '@rollup/rollup-win32-ia32-msvc': 4.12.0 1888 | '@rollup/rollup-win32-x64-msvc': 4.12.0 1889 | fsevents: 2.3.3 1890 | dev: true 1891 | 1892 | /run-parallel@1.2.0: 1893 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1894 | dependencies: 1895 | queue-microtask: 1.2.3 1896 | dev: true 1897 | 1898 | /safe-buffer@5.2.1: 1899 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1900 | dev: true 1901 | 1902 | /semver@7.6.0: 1903 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 1904 | engines: {node: '>=10'} 1905 | hasBin: true 1906 | dependencies: 1907 | lru-cache: 6.0.0 1908 | dev: true 1909 | 1910 | /serialize-javascript@6.0.0: 1911 | resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} 1912 | dependencies: 1913 | randombytes: 2.1.0 1914 | dev: true 1915 | 1916 | /shebang-command@2.0.0: 1917 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1918 | engines: {node: '>=8'} 1919 | dependencies: 1920 | shebang-regex: 3.0.0 1921 | 1922 | /shebang-regex@3.0.0: 1923 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1924 | engines: {node: '>=8'} 1925 | 1926 | /signal-exit@3.0.7: 1927 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1928 | dev: true 1929 | 1930 | /signal-exit@4.1.0: 1931 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1932 | engines: {node: '>=14'} 1933 | 1934 | /slash@3.0.0: 1935 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1936 | engines: {node: '>=8'} 1937 | dev: true 1938 | 1939 | /source-map@0.8.0-beta.0: 1940 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1941 | engines: {node: '>= 8'} 1942 | dependencies: 1943 | whatwg-url: 7.1.0 1944 | dev: true 1945 | 1946 | /string-width@4.2.3: 1947 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1948 | engines: {node: '>=8'} 1949 | dependencies: 1950 | emoji-regex: 8.0.0 1951 | is-fullwidth-code-point: 3.0.0 1952 | strip-ansi: 6.0.1 1953 | dev: true 1954 | 1955 | /string-width@5.1.2: 1956 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1957 | engines: {node: '>=12'} 1958 | dependencies: 1959 | eastasianwidth: 0.2.0 1960 | emoji-regex: 9.2.2 1961 | strip-ansi: 7.1.0 1962 | dev: true 1963 | 1964 | /strip-ansi@6.0.1: 1965 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1966 | engines: {node: '>=8'} 1967 | dependencies: 1968 | ansi-regex: 5.0.1 1969 | dev: true 1970 | 1971 | /strip-ansi@7.1.0: 1972 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1973 | engines: {node: '>=12'} 1974 | dependencies: 1975 | ansi-regex: 6.0.1 1976 | dev: true 1977 | 1978 | /strip-final-newline@2.0.0: 1979 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1980 | engines: {node: '>=6'} 1981 | dev: true 1982 | 1983 | /strip-final-newline@3.0.0: 1984 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1985 | engines: {node: '>=12'} 1986 | dev: false 1987 | 1988 | /strip-json-comments@3.1.1: 1989 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1990 | engines: {node: '>=8'} 1991 | dev: true 1992 | 1993 | /sucrase@3.35.0: 1994 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1995 | engines: {node: '>=16 || 14 >=14.17'} 1996 | hasBin: true 1997 | dependencies: 1998 | '@jridgewell/gen-mapping': 0.3.5 1999 | commander: 4.1.1 2000 | glob: 10.3.10 2001 | lines-and-columns: 1.2.4 2002 | mz: 2.7.0 2003 | pirates: 4.0.6 2004 | ts-interface-checker: 0.1.13 2005 | dev: true 2006 | 2007 | /supports-color@7.2.0: 2008 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2009 | engines: {node: '>=8'} 2010 | dependencies: 2011 | has-flag: 4.0.0 2012 | dev: true 2013 | 2014 | /supports-color@8.1.1: 2015 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2016 | engines: {node: '>=10'} 2017 | dependencies: 2018 | has-flag: 4.0.0 2019 | dev: true 2020 | 2021 | /text-table@0.2.0: 2022 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2023 | dev: true 2024 | 2025 | /thenify-all@1.6.0: 2026 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2027 | engines: {node: '>=0.8'} 2028 | dependencies: 2029 | thenify: 3.3.1 2030 | dev: true 2031 | 2032 | /thenify@3.3.1: 2033 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2034 | dependencies: 2035 | any-promise: 1.3.0 2036 | dev: true 2037 | 2038 | /to-regex-range@5.0.1: 2039 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2040 | engines: {node: '>=8.0'} 2041 | dependencies: 2042 | is-number: 7.0.0 2043 | dev: true 2044 | 2045 | /tr46@1.0.1: 2046 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 2047 | dependencies: 2048 | punycode: 2.3.1 2049 | dev: true 2050 | 2051 | /tree-kill@1.2.2: 2052 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 2053 | hasBin: true 2054 | dev: true 2055 | 2056 | /ts-api-utils@1.2.1(typescript@5.4.2): 2057 | resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} 2058 | engines: {node: '>=16'} 2059 | peerDependencies: 2060 | typescript: '>=4.2.0' 2061 | dependencies: 2062 | typescript: 5.4.2 2063 | dev: true 2064 | 2065 | /ts-interface-checker@0.1.13: 2066 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2067 | dev: true 2068 | 2069 | /tsup@8.0.2(typescript@5.4.2): 2070 | resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} 2071 | engines: {node: '>=18'} 2072 | hasBin: true 2073 | peerDependencies: 2074 | '@microsoft/api-extractor': ^7.36.0 2075 | '@swc/core': ^1 2076 | postcss: ^8.4.12 2077 | typescript: '>=4.5.0' 2078 | peerDependenciesMeta: 2079 | '@microsoft/api-extractor': 2080 | optional: true 2081 | '@swc/core': 2082 | optional: true 2083 | postcss: 2084 | optional: true 2085 | typescript: 2086 | optional: true 2087 | dependencies: 2088 | bundle-require: 4.0.2(esbuild@0.19.12) 2089 | cac: 6.7.14 2090 | chokidar: 3.6.0 2091 | debug: 4.3.4(supports-color@8.1.1) 2092 | esbuild: 0.19.12 2093 | execa: 5.1.1 2094 | globby: 11.1.0 2095 | joycon: 3.1.1 2096 | postcss-load-config: 4.0.2 2097 | resolve-from: 5.0.0 2098 | rollup: 4.12.0 2099 | source-map: 0.8.0-beta.0 2100 | sucrase: 3.35.0 2101 | tree-kill: 1.2.2 2102 | typescript: 5.4.2 2103 | transitivePeerDependencies: 2104 | - supports-color 2105 | - ts-node 2106 | dev: true 2107 | 2108 | /tsx@4.7.1: 2109 | resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} 2110 | engines: {node: '>=18.0.0'} 2111 | hasBin: true 2112 | dependencies: 2113 | esbuild: 0.19.12 2114 | get-tsconfig: 4.7.2 2115 | optionalDependencies: 2116 | fsevents: 2.3.3 2117 | dev: true 2118 | 2119 | /type-check@0.4.0: 2120 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2121 | engines: {node: '>= 0.8.0'} 2122 | dependencies: 2123 | prelude-ls: 1.2.1 2124 | dev: true 2125 | 2126 | /type-fest@0.20.2: 2127 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2128 | engines: {node: '>=10'} 2129 | dev: true 2130 | 2131 | /typescript@5.4.2: 2132 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 2133 | engines: {node: '>=14.17'} 2134 | hasBin: true 2135 | dev: true 2136 | 2137 | /undici-types@5.26.5: 2138 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2139 | dev: true 2140 | 2141 | /uri-js@4.4.1: 2142 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2143 | dependencies: 2144 | punycode: 2.3.1 2145 | dev: true 2146 | 2147 | /webidl-conversions@4.0.2: 2148 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 2149 | dev: true 2150 | 2151 | /whatwg-url@7.1.0: 2152 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 2153 | dependencies: 2154 | lodash.sortby: 4.7.0 2155 | tr46: 1.0.1 2156 | webidl-conversions: 4.0.2 2157 | dev: true 2158 | 2159 | /which@2.0.2: 2160 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2161 | engines: {node: '>= 8'} 2162 | hasBin: true 2163 | dependencies: 2164 | isexe: 2.0.0 2165 | 2166 | /workerpool@6.2.1: 2167 | resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} 2168 | dev: true 2169 | 2170 | /wrap-ansi@7.0.0: 2171 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2172 | engines: {node: '>=10'} 2173 | dependencies: 2174 | ansi-styles: 4.3.0 2175 | string-width: 4.2.3 2176 | strip-ansi: 6.0.1 2177 | dev: true 2178 | 2179 | /wrap-ansi@8.1.0: 2180 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2181 | engines: {node: '>=12'} 2182 | dependencies: 2183 | ansi-styles: 6.2.1 2184 | string-width: 5.1.2 2185 | strip-ansi: 7.1.0 2186 | dev: true 2187 | 2188 | /wrappy@1.0.2: 2189 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2190 | dev: true 2191 | 2192 | /y18n@5.0.8: 2193 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2194 | engines: {node: '>=10'} 2195 | dev: true 2196 | 2197 | /yallist@4.0.0: 2198 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2199 | dev: true 2200 | 2201 | /yaml@2.4.0: 2202 | resolution: {integrity: sha512-j9iR8g+/t0lArF4V6NE/QCfT+CO7iLqrXAHZbJdo+LfjqP1vR8Fg5bSiaq6Q2lOD1AUEVrEVIgABvBFYojJVYQ==} 2203 | engines: {node: '>= 14'} 2204 | hasBin: true 2205 | dev: true 2206 | 2207 | /yargs-parser@20.2.4: 2208 | resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} 2209 | engines: {node: '>=10'} 2210 | dev: true 2211 | 2212 | /yargs-unparser@2.0.0: 2213 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 2214 | engines: {node: '>=10'} 2215 | dependencies: 2216 | camelcase: 6.3.0 2217 | decamelize: 4.0.0 2218 | flat: 5.0.2 2219 | is-plain-obj: 2.1.0 2220 | dev: true 2221 | 2222 | /yargs@16.2.0: 2223 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 2224 | engines: {node: '>=10'} 2225 | dependencies: 2226 | cliui: 7.0.4 2227 | escalade: 3.1.2 2228 | get-caller-file: 2.0.5 2229 | require-directory: 2.1.1 2230 | string-width: 4.2.3 2231 | y18n: 5.0.8 2232 | yargs-parser: 20.2.4 2233 | dev: true 2234 | 2235 | /yocto-queue@0.1.0: 2236 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2237 | engines: {node: '>=10'} 2238 | dev: true 2239 | --------------------------------------------------------------------------------