diff --git a/.dockerignore b/.dockerignore index ca364931cc..27e6189fc8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ * !src !test +src/cli diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000000..9b1c8b133c --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +/dist diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fee5f2e58c..2733ac067c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -112,6 +112,9 @@ jobs: - name: prepare apt proxy run: sudo yarn prepare:proxy + - name: build + run: yarn build + - name: test distro run: docker buildx bake @@ -149,6 +152,9 @@ jobs: - name: prepare apt proxy run: sudo yarn prepare:proxy + - name: build + run: yarn build + - name: test distro run: docker buildx bake test-distro @@ -208,6 +214,9 @@ jobs: - name: prepare apt proxy run: sudo yarn prepare:proxy + - name: build + run: yarn build + - name: test run: docker buildx bake test env: diff --git a/.gitignore b/.gitignore index a27f0ba3aa..b363eec01a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,11 @@ .cache/ node_modules/ /bin +/dist + +# generated files /src/usr/local/containerbase/version +/src/usr/local/containerbase/bin/containerbase-cli-* .eslintcache diff --git a/Dockerfile b/Dockerfile index 0f534801cb..acb9a17e5d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,7 +24,6 @@ COPY src/ / RUN install-containerbase - # renovate: datasource=github-tags packageName=git/git RUN install-tool git v2.41.0 diff --git a/README.md b/README.md index 32a20ac32c..789a6d51c5 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,12 @@ Commits to `main` branch are automatically build and published. You need a recent [docker](https://www.docker.com) version with [buildx](https://github.com/docker/buildx) [`>= v0.4.0`](https://github.com/docker/buildx/releases/tag/v0.4.0) plugin installed. -You should use +You first need to build the cli before building the docker images. + +```console +> yarn install +> yarn build +``` ### Base image diff --git a/package.json b/package.json index a42c8f15f3..ae49a99984 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ }, "scripts": { "bats": "node_modules/bats/bin/bats --timing --verbose-run", - "build": "release:prepare", + "build": "run-s 'build:*'", + "build:cli": "node tools/esbuild.js", "eslint": "eslint --cache --report-unused-disable-directives .", "eslint-fix": "eslint --cache --fix --report-unused-disable-directives .", "lint": "run-s prettier eslint", @@ -22,14 +23,30 @@ "prettier-fix": "prettier --cache -w -u \"**/*.*\"", "release:prepare": "node tools/prepare-release.js", "release:publish": "node tools/publish-release.js", + "start": "tsx src/cli/index.ts", "test:bats": "node_modules/bats/bin/bats --timing --verbose-run test/bash/ test/bash/v2", "test:docker": "node tools/test.js" }, + "dependencies": { + "clipanion": "3.2.0", + "execa": "7.1.1", + "got": "12.6.0", + "hasha": "5.2.2", + "inversify": "6.0.1", + "pino": "8.14.1", + "pino-pretty": "10.0.0", + "reflect-metadata": "0.1.13", + "semver": "7.5.1", + "tar": "6.1.15", + "typanion": "3.12.1" + }, "devDependencies": { "@semantic-release/exec": "6.0.3", "@tsconfig/node18": "2.0.1", "@types/node": "18.16.16", + "@types/semver": "7.5.0", "@types/shelljs": "0.8.12", + "@types/tar": "6.1.5", "@typescript-eslint/eslint-plugin": "5.59.9", "@typescript-eslint/parser": "5.59.9", "bats": "1.9.0", @@ -37,6 +54,8 @@ "bats-support": "0.3.0", "clipanion": "3.2.1", "conventional-changelog-conventionalcommits": "6.0.0", + "esbuild": "0.17.19", + "esbuild-plugin-pino": "2.0.0", "eslint": "8.42.0", "eslint-config-prettier": "8.8.0", "eslint-formatter-gha": "1.4.2", @@ -49,10 +68,12 @@ "husky": "8.0.3", "lint-staged": "13.2.2", "npm-run-all": "4.1.5", + "pkg": "5.8.1", "prettier": "2.8.8", "prettier-plugin-package": "1.3.0", "semantic-release": "21.0.3", "shelljs": "0.8.5", + "tsx": "3.12.7", "typescript": "5.1.3" }, "contributors": [ diff --git a/src/cli/command/index.ts b/src/cli/command/index.ts new file mode 100644 index 0000000000..10c2ab117c --- /dev/null +++ b/src/cli/command/index.ts @@ -0,0 +1,44 @@ +import { argv0 } from 'node:process'; +import type { Cli } from 'clipanion'; +import type { CliMode } from '../utils'; +import { logger } from '../utils/logger'; +import { InstallToolCommand, InstallToolShortCommand } from './install-tool'; +import { PrepareToolCommand, PrepareToolShortCommand } from './prepare-tool'; +import { prepareToolVersion } from './utils'; + +export function prepareCommands( + cli: Cli, + mode: CliMode | null, + args: string[] +): string[] { + logger.debug('prepare commands'); + /* + * Workaround for linking the cli tool as different executables. + * So it can be called as + * - `install-tool node 1.2.3` + * - `prepare-tool node` + */ + if (mode === 'install-tool') { + cli.register(InstallToolShortCommand); + return prepareToolVersion(mode, args); + } else if (mode === 'prepare-tool') { + cli.register(PrepareToolShortCommand); + return args; + } + + cli.register(InstallToolCommand); + cli.register(PrepareToolCommand); + return prepareToolVersion(mode, args); +} + +export function parseBinaryName( + mode: CliMode | null, + node: string, + app: string +): string | undefined { + if (mode) { + return mode; + } + + return argv0.endsWith('/node') || argv0 === 'node' ? `${node} ${app}` : argv0; +} diff --git a/src/cli/command/install-tool.ts b/src/cli/command/install-tool.ts new file mode 100644 index 0000000000..50625350ae --- /dev/null +++ b/src/cli/command/install-tool.ts @@ -0,0 +1,57 @@ +import { Command, Option } from 'clipanion'; +import * as t from 'typanion'; +import { installTool } from '../install-tool'; +import { logger, validateVersion } from '../utils'; + +export class InstallToolCommand extends Command { + static override paths = [['install', 'tool'], ['it']]; + + static override usage = Command.Usage({ + description: 'Installs a tool into the container.', + examples: [ + ['Installs node 14.17.0', '$0 install tool node 14.17.0'], + [ + 'Installs node with version via environment variable', + 'NODE_VERSION=14.17.0 $0 install tool node', + ], + ], + }); + + name = Option.String({ required: true }); + + version = Option.String({ + required: true, + validator: t.cascade(t.isString(), validateVersion()), + }); + + dryRun = Option.Boolean('-d,--dry-run', false); + + async execute(): Promise { + const start = Date.now(); + + logger.info(`Installing tool ${this.name} v${this.version}...`); + try { + return await installTool(this.name, this.version, this.dryRun); + } catch (err) { + logger.fatal(err); + return 1; + } finally { + logger.info(`Installed tool ${this.name} in ${Date.now() - start}ms.`); + } + } +} + +export class InstallToolShortCommand extends InstallToolCommand { + static override paths = []; + + static override usage = Command.Usage({ + description: 'Installs a tool into the container.', + examples: [ + ['Installs node v14.17.0', '$0 node 14.17.0'], + [ + 'Installs node with version via environment variable', + 'NODE_VERSION=14.17.0 $0 node', + ], + ], + }); +} diff --git a/src/cli/command/prepare-tool.ts b/src/cli/command/prepare-tool.ts new file mode 100644 index 0000000000..8c04a5008a --- /dev/null +++ b/src/cli/command/prepare-tool.ts @@ -0,0 +1,46 @@ +import { Command, Option } from 'clipanion'; +import { prepareTools } from '../prepare-tool'; +import { logger } from '../utils'; + +export class PrepareToolCommand extends Command { + static override paths = [['prepare', 'tool'], ['pt']]; + + static override usage = Command.Usage({ + description: 'Prepares a tool into the container.', + examples: [ + ['Prepares node', '$0 prepare tool node'], + ['Prepares all tools', '$0 prepare tool all'], + ], + }); + + tools = Option.Rest({ required: 1 }); + + dryRun = Option.Boolean('-d,--dry-run', false); + + async execute(): Promise { + const start = Date.now(); + logger.info(`Preparing tools ${this.tools.join(', ')}...`); + try { + return await prepareTools(this.tools, this.dryRun); + } catch (err) { + logger.fatal(err); + return 1; + } finally { + logger.info( + `Prepared tools ${this.tools.join(', ')} in ${Date.now() - start}ms.` + ); + } + } +} + +export class PrepareToolShortCommand extends PrepareToolCommand { + static override paths = []; + + static override usage = Command.Usage({ + description: 'Prepares a tool into the container.', + examples: [ + ['Prepares node', '$0 node'], + ['Prepares all tools', '$0'], + ], + }); +} diff --git a/src/cli/command/utils.ts b/src/cli/command/utils.ts new file mode 100644 index 0000000000..c0c71bbffa --- /dev/null +++ b/src/cli/command/utils.ts @@ -0,0 +1,37 @@ +import type { CliMode } from '../utils'; + +export function prepareToolVersion( + mode: CliMode | null, + args: string[] +): string[] { + switch (mode) { + case 'install-tool': { + if (args.length === 1) { + // install-tool node + appendVersion(args, 0); + } + break; + } + case 'containerbase-cli': + default: { + if (args.length === 2) { + // containerbase-cli it node + appendVersion(args, 1); + } else if (args.length === 3) { + // containerbase-cli install tool node + appendVersion(args, 2); + } + break; + } + } + return args; +} + +function appendVersion(args: string[], index: number): void { + const tool = args.at(index)!; + const version = + process.env[tool.replace('-', '_').toUpperCase() + '_VERSION']; + if (version) { + args.push(version); + } +} diff --git a/src/cli/index.ts b/src/cli/index.ts new file mode 100644 index 0000000000..8fe69fa49f --- /dev/null +++ b/src/cli/index.ts @@ -0,0 +1,6 @@ +#!/usr/bin/env node + +import 'reflect-metadata'; +import { main } from './main'; + +void main(); diff --git a/src/cli/install-tool/index.ts b/src/cli/install-tool/index.ts new file mode 100644 index 0000000000..3aec8f61f1 --- /dev/null +++ b/src/cli/install-tool/index.ts @@ -0,0 +1,31 @@ +import { Container } from 'inversify'; +import { rootContainer } from '../services'; +import { InstallDockerService } from '../tools/docker'; +import { logger } from '../utils'; +import { InstallLegacyToolService } from './install-legacy-tool.service'; +import { INSTALL_TOOL_TOKEN, InstallToolService } from './install-tool.service'; + +function prepareContainer(): Container { + logger.trace('preparing container'); + const container = new Container(); + container.parent = rootContainer; + + // core services + container.bind(InstallToolService).toSelf(); + container.bind(InstallLegacyToolService).toSelf(); + + // tool services + container.bind(INSTALL_TOOL_TOKEN).to(InstallDockerService); + + logger.trace('preparing container done'); + return container; +} + +export function installTool( + tool: string, + version: string, + dryRun = false +): Promise { + const container = prepareContainer(); + return container.get(InstallToolService).execute(tool, version, dryRun); +} diff --git a/src/cli/install-tool/install-legacy-tool.service.ts b/src/cli/install-tool/install-legacy-tool.service.ts new file mode 100644 index 0000000000..4e640ea75b --- /dev/null +++ b/src/cli/install-tool/install-legacy-tool.service.ts @@ -0,0 +1,13 @@ +import { execa } from 'execa'; +import { injectable } from 'inversify'; +import { logger } from '../utils'; + +@injectable() +export class InstallLegacyToolService { + async execute(tool: string, version: string): Promise { + logger.info(`Preparing legacy tool ${tool} ...`); + await execa('/usr/local/containerbase/bin/install-tool', [tool, version], { + stdio: 'inherit', + }); + } +} diff --git a/src/cli/install-tool/install-tool-base.service.ts b/src/cli/install-tool/install-tool-base.service.ts new file mode 100644 index 0000000000..5b78c88e34 --- /dev/null +++ b/src/cli/install-tool/install-tool-base.service.ts @@ -0,0 +1,84 @@ +import { chmod, chown, stat, writeFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { injectable } from 'inversify'; +import type { EnvService, PathService } from '../services'; +import { fileRights, logger } from '../utils'; + +export interface ShellWrapperConfig { + name: string; + srcDir: string; + exports?: string; +} + +export interface FileOwnerConfig { + file: string; + mode?: number; +} + +@injectable() +export abstract class InstallToolBaseService { + abstract readonly name: string; + + constructor( + protected readonly pathSvc: PathService, + protected envSvc: EnvService + ) {} + + abstract install(version: string): Promise; + + async isInstalled(version: string): Promise { + return !!(await this.pathSvc.findVersionedToolPath(this.name, version)); + } + + abstract link(version: string): Promise; + + test(_version: string): Promise { + return Promise.resolve(); + } + + toString(): string { + return this.name; + } + + validate(_version: string): boolean { + return true; + } + + protected async shellwrapper({ + name, + srcDir, + exports, + }: ShellWrapperConfig): Promise { + const tgt = join(this.pathSvc.binDir, name); + + let content = `#!/bin/bash + + if [[ -z "\${CONTAINERBASE_ENV+x}" ]]; then + . $ENV_FILE + fi + `; + + if (exports) { + content += `export ${exports}\n`; + } + + content += `${srcDir}/${name} "$@"\n`; + + await writeFile(tgt, content, { encoding: 'utf8' }); + await this.setOwner({ file: tgt }); + } + + protected async setOwner({ + file, + mode = 509, + }: FileOwnerConfig): Promise { + const s = await stat(file); + if ((s.mode & fileRights) !== mode) { + logger.debug({ file, mode, s: s.mode & fileRights }, 'setting file mode'); + await chmod(file, mode); + } + if (this.envSvc.isRoot && s.uid === 0) { + await chown(file, this.envSvc.userId, 0); + } + } +} diff --git a/src/cli/install-tool/install-tool.service.ts b/src/cli/install-tool/install-tool.service.ts new file mode 100644 index 0000000000..94110639bf --- /dev/null +++ b/src/cli/install-tool/install-tool.service.ts @@ -0,0 +1,88 @@ +import { inject, injectable, multiInject, optional } from 'inversify'; +import { prepareTools } from '../prepare-tool'; +import { EnvService, PathService, VersionService } from '../services'; +import { logger } from '../utils'; +import { InstallLegacyToolService } from './install-legacy-tool.service'; +import type { InstallToolBaseService } from './install-tool-base.service'; + +export const INSTALL_TOOL_TOKEN = Symbol('INSTALL_TOOL_TOKEN'); + +@injectable() +export class InstallToolService { + constructor( + @inject(InstallLegacyToolService) + private legacySvc: InstallLegacyToolService, + @multiInject(INSTALL_TOOL_TOKEN) + @optional() + private toolSvcs: InstallToolBaseService[] = [], + @inject(EnvService) private envSvc: EnvService, + @inject(PathService) private pathSvc: PathService, + @inject(VersionService) private versionSvc: VersionService + ) {} + + async execute( + tool: string, + version: string, + dryRun = false + ): Promise { + logger.debug( + { tools: this.toolSvcs.map((t) => t.name) }, + 'supported tools' + ); + + const toolSvc = this.toolSvcs.find((t) => t.name === tool); + if (toolSvc) { + if (await toolSvc.isInstalled(version)) { + logger.info({ tool }, 'tool already installed'); + await this.linkAndTest(toolSvc, version); + return; + } + + if (!(await this.pathSvc.findToolPath(tool))) { + logger.debug({ tool }, 'tool not prepared'); + const res = await prepareTools([tool], dryRun); + if (res) { + return res; + } + } + + logger.debug({ tool }, 'validate tool'); + if (!toolSvc.validate(version)) { + logger.fatal({ tool }, 'tool version not supported'); + return 1; + } + + if (dryRun) { + logger.info(`Dry run: install tool ${tool} ...`); + return; + } else { + logger.debug({ tool }, 'install tool'); + await toolSvc.install(version); + // TODO delete versioned tool path on error + await this.linkAndTest(toolSvc, version); + } + } else { + if (dryRun) { + logger.info(`Dry run: install tool ${tool} v${version} ...`); + return; + } + await this.legacySvc.execute(tool, version); + } + } + private async linkAndTest( + toolSvc: InstallToolBaseService, + version: string + ): Promise { + if (version === (await this.versionSvc.find(toolSvc.name))) { + logger.debug({ tool: toolSvc.name }, 'tool already linked'); + return; + } + logger.debug({ tool: toolSvc.name }, 'link tool'); + await toolSvc.link(version); + await this.versionSvc.update(toolSvc.name, version); + logger.debug({ tool: toolSvc.name }, 'test tool'); + if (!this.envSvc.skipTests) { + await toolSvc.test(version); + } + } +} diff --git a/src/cli/main.ts b/src/cli/main.ts new file mode 100644 index 0000000000..15893d2aa3 --- /dev/null +++ b/src/cli/main.ts @@ -0,0 +1,30 @@ +import { argv, argv0 } from 'node:process'; +import { Builtins, Cli } from 'clipanion'; +import { parseBinaryName, prepareCommands } from './command'; +import { cliMode, logger, validateSystem } from './utils'; + +declare global { + // needs to be this to make eslint happy + // eslint-disable-next-line no-var + var CONTAINERBASE_VERSION: string | undefined; +} + +export async function main(): Promise { + logger.trace({ argv0, argv }, 'main'); + await validateSystem(); + + const mode = cliMode(); + const [node, app, ...args] = argv; + + const cli = new Cli({ + binaryLabel: `containerbase-cli`, + binaryName: parseBinaryName(mode, node, app), + binaryVersion: globalThis.CONTAINERBASE_VERSION ?? '0.0.0-PLACEHOLDER', + }); + + cli.register(Builtins.DefinitionsCommand); + cli.register(Builtins.HelpCommand); + cli.register(Builtins.VersionCommand); + + await cli.runExit(prepareCommands(cli, mode, args)); +} diff --git a/src/cli/prepare-tool/index.ts b/src/cli/prepare-tool/index.ts new file mode 100644 index 0000000000..349b96d304 --- /dev/null +++ b/src/cli/prepare-tool/index.ts @@ -0,0 +1,30 @@ +import { Container } from 'inversify'; +import { rootContainer } from '../services'; +import { PrepareDockerService } from '../tools/docker'; +import { logger } from '../utils'; +import { PrepareLegacyToolsService } from './prepare-legacy-tools.service'; +import { PREPARE_TOOL_TOKEN, PrepareToolService } from './prepare-tool.service'; + +function prepareContainer(): Container { + logger.trace('preparing container'); + const container = new Container(); + container.parent = rootContainer; + + // core services + container.bind(PrepareToolService).toSelf(); + container.bind(PrepareLegacyToolsService).toSelf(); + + // tool services + container.bind(PREPARE_TOOL_TOKEN).to(PrepareDockerService); + + logger.trace('preparing container done'); + return container; +} + +export function prepareTools( + tools: string[], + dryRun = false +): Promise { + const container = prepareContainer(); + return container.get(PrepareToolService).execute(tools, dryRun); +} diff --git a/src/cli/prepare-tool/prepare-legacy-tools.service.ts b/src/cli/prepare-tool/prepare-legacy-tools.service.ts new file mode 100644 index 0000000000..d5456f5744 --- /dev/null +++ b/src/cli/prepare-tool/prepare-legacy-tools.service.ts @@ -0,0 +1,13 @@ +import { execa } from 'execa'; +import { injectable } from 'inversify'; +import { logger } from '../utils'; + +@injectable() +export class PrepareLegacyToolsService { + async execute(tools: string[]): Promise { + logger.info(`Preparing legacy tools ${tools.join(', ')} ...`); + await execa('/usr/local/containerbase/bin/prepare-tool', tools, { + stdio: 'inherit', + }); + } +} diff --git a/src/cli/prepare-tool/prepare-tool-base.service.ts b/src/cli/prepare-tool/prepare-tool-base.service.ts new file mode 100644 index 0000000000..ee5e32885b --- /dev/null +++ b/src/cli/prepare-tool/prepare-tool-base.service.ts @@ -0,0 +1,12 @@ +import { injectable } from 'inversify'; + +@injectable() +export abstract class PrepareToolBaseService { + abstract readonly name: string; + + abstract execute(): Promise | void; + + toString(): string { + return this.name; + } +} diff --git a/src/cli/prepare-tool/prepare-tool.service.ts b/src/cli/prepare-tool/prepare-tool.service.ts new file mode 100644 index 0000000000..fe2fa9d5fb --- /dev/null +++ b/src/cli/prepare-tool/prepare-tool.service.ts @@ -0,0 +1,62 @@ +import { inject, injectable, multiInject, optional } from 'inversify'; +import { EnvService, PathService } from '../services'; +import { logger } from '../utils'; +import { PrepareLegacyToolsService } from './prepare-legacy-tools.service'; +import type { PrepareToolBaseService } from './prepare-tool-base.service'; + +export const PREPARE_TOOL_TOKEN = Symbol('PREPARE_TOOL_TOKEN'); + +@injectable() +export class PrepareToolService { + constructor( + @inject(PrepareLegacyToolsService) + private legacySvc: PrepareLegacyToolsService, + @multiInject(PREPARE_TOOL_TOKEN) + @optional() + private toolSvcs: PrepareToolBaseService[] = [], + @inject(PathService) private pathSvc: PathService, + @inject(EnvService) private envSvc: EnvService + ) {} + + async execute(tools: string[], dryRun = false): Promise { + logger.debug( + { tools: this.toolSvcs.map((t) => t.name) }, + 'supported tools' + ); + if (dryRun) { + logger.info(`Dry run: preparing tools ${tools.join(', ')} ...`); + return; + } + if (!this.envSvc.isRoot) { + logger.fatal('prepare tools must be run as root'); + return 1; + } + if (tools.length === 1 && tools[0] === 'all') { + for (const tool of this.toolSvcs) { + if (await this.pathSvc.findToolPath(tool.name)) { + logger.debug({ tool: tool.name }, 'tool already prepared'); + continue; + } + logger.debug({ tool: tool.name }, 'preparing tool'); + await tool.execute(); + await this.pathSvc.createToolPath(tool.name); + } + await this.legacySvc.execute(tools); + } else { + for (const tool of tools) { + const toolSvc = this.toolSvcs.find((t) => t.name === tool); + if (toolSvc) { + if (await this.pathSvc.findToolPath(tool)) { + logger.debug({ tool }, 'tool already prepared'); + continue; + } + logger.debug({ tool }, 'preparing tool'); + await toolSvc.execute(); + await this.pathSvc.createToolPath(tool); + } else { + await this.legacySvc.execute([tool]); + } + } + } + } +} diff --git a/src/cli/services/env.service.ts b/src/cli/services/env.service.ts new file mode 100644 index 0000000000..4486951173 --- /dev/null +++ b/src/cli/services/env.service.ts @@ -0,0 +1,53 @@ +import { arch } from 'node:os'; +import { geteuid } from 'node:process'; +import { injectable } from 'inversify'; +import type { Arch } from '../utils'; + +@injectable() +export class EnvService { + readonly arch: Arch; + private uid: number; + + constructor() { + this.uid = geteuid?.() ?? 0; // fallback should never happen on linux + switch (arch()) { + case 'arm64': + this.arch = 'arm64'; + break; + case 'x64': + this.arch = 'amd64'; + break; + default: + // should never happen + throw new Error('Unsupported architecture'); + } + } + + get cacheDir(): string | null { + return process.env.CONTAINERBASE_CACHE_DIR ?? null; + } + + get isRoot(): boolean { + return this.uid === 0; + } + + get userHome(): string { + return process.env.USER_HOME ?? `/home/${this.userName}`; + } + + get userName(): string { + return process.env.USER_NAME ?? 'ubuntu'; + } + + get userId(): number { + return parseInt(process.env.USER_ID ?? '1000', 10); + } + + get umask(): number { + return this.isRoot ? 0o755 : 0o775; + } + + get skipTests(): boolean { + return !!process.env.SKIP_VERSION; + } +} diff --git a/src/cli/services/http.service.ts b/src/cli/services/http.service.ts new file mode 100644 index 0000000000..1d6518536e --- /dev/null +++ b/src/cli/services/http.service.ts @@ -0,0 +1,82 @@ +import { createWriteStream } from 'node:fs'; +import { mkdir } from 'node:fs/promises'; +import { join } from 'node:path'; +import { pipeline } from 'node:stream/promises'; +import { got } from 'got'; +import hasha from 'hasha'; +import { inject, injectable } from 'inversify'; +import { logger } from '../utils'; +import { EnvService } from './env.service'; +import { PathService } from './path.service'; + +export type HttpChecksumType = + | 'sha1' + | 'sha224' + | 'sha256' + | 'sha384' + | 'sha512'; + +export interface HttpDownloadConfig { + url: string; + expectedChecksum?: string; + checksumType?: HttpChecksumType; + fileName?: string; +} + +@injectable() +export class HttpService { + constructor( + @inject(EnvService) private envSvc: EnvService, + @inject(PathService) private pathSvc: PathService + ) {} + + async download({ + url, + expectedChecksum, + checksumType, + fileName, + }: HttpDownloadConfig): Promise { + const urlChecksum = hasha(url, { algorithm: 'sha256' }); + + const cacheDir = this.envSvc.cacheDir ?? this.pathSvc.tmpDir; + const cachePath = join(cacheDir, urlChecksum); + // TODO: validate name + const file = fileName ?? new URL(url).pathname.split('/').pop()!; + const filePath = join(cachePath, file); + + if (await this.pathSvc.fileExists(filePath)) { + if (expectedChecksum && checksumType) { + const actualChecksum = await hasha.fromFile(filePath, { + algorithm: checksumType, + }); + + if (actualChecksum === expectedChecksum) { + return filePath; + } else { + logger.debug( + { url, expectedChecksum, actualChecksum, checksumType }, + 'checksum mismatch' + ); + } + } else { + return filePath; + } + } + + await mkdir(cachePath, { recursive: true }); + + for (const run of [1, 2, 3]) { + try { + await pipeline(got.stream(url), createWriteStream(filePath)); + return filePath; + } catch (err) { + if (run === 3) { + logger.error({ err, run }, 'download failed'); + } else { + logger.debug({ err, run }, 'download failed'); + } + } + } + throw new Error('download failed'); + } +} diff --git a/src/cli/services/index.ts b/src/cli/services/index.ts new file mode 100644 index 0000000000..01bbac3dc5 --- /dev/null +++ b/src/cli/services/index.ts @@ -0,0 +1,14 @@ +import { Container } from 'inversify'; +import { EnvService } from './env.service'; +import { HttpService } from './http.service'; +import { PathService } from './path.service'; +import { VersionService } from './version.service'; + +export { EnvService, PathService, VersionService, HttpService }; + +export const rootContainer = new Container(); + +rootContainer.bind(EnvService).toSelf(); +rootContainer.bind(PathService).toSelf(); +rootContainer.bind(VersionService).toSelf(); +rootContainer.bind(HttpService).toSelf(); diff --git a/src/cli/services/path.service.ts b/src/cli/services/path.service.ts new file mode 100644 index 0000000000..8a23b116a5 --- /dev/null +++ b/src/cli/services/path.service.ts @@ -0,0 +1,92 @@ +import { chmod, mkdir, stat } from 'node:fs/promises'; +import { join } from 'node:path'; +import { inject, injectable } from 'inversify'; +import { EnvService } from './env.service'; + +@injectable() +export class PathService { + get binDir(): string { + return '/usr/local/bin'; + } + + get tmpDir(): string { + return '/tmp'; + } + + get installDir(): string { + return '/opt/containerbase'; + } + + get toolsPath(): string { + return join(this.installDir, 'tools'); + } + + get versionPath(): string { + return join(this.installDir, 'versions'); + } + + constructor(@inject(EnvService) private envSvc: EnvService) {} + + async createToolPath(tool: string): Promise { + const toolPath = this.toolPath(tool); + await mkdir(toolPath); + await chmod(toolPath, 0o775); + return toolPath; + } + + async createVersionedToolPath( + tool: string, + version: string + ): Promise { + const toolPath = this.versionedToolPath(tool, version); + await mkdir(toolPath); + await chmod(toolPath, this.envSvc.umask); + return toolPath; + } + + async findToolPath(tool: string): Promise { + const toolPath = this.toolPath(tool); + + if ( + await stat(toolPath) + .then((s) => !s.isDirectory()) + .catch(() => true) + ) { + return null; + } + return toolPath; + } + + async findVersionedToolPath( + tool: string, + version: string + ): Promise { + const versionedToolPath = this.versionedToolPath(tool, version); + + if ( + await stat(versionedToolPath) + .then((s) => !s.isDirectory()) + .catch(() => true) + ) { + return null; + } + return versionedToolPath; + } + + async fileExists(filePath: string): Promise { + try { + const fstat = await stat(filePath); + return fstat.isFile(); + } catch { + return false; + } + } + + toolPath(tool: string): string { + return join(this.toolsPath, tool); + } + + versionedToolPath(tool: string, version: string): string { + return join(this.toolPath(tool), version); + } +} diff --git a/src/cli/services/version.service.ts b/src/cli/services/version.service.ts new file mode 100644 index 0000000000..6374c469cb --- /dev/null +++ b/src/cli/services/version.service.ts @@ -0,0 +1,37 @@ +import { chmod, readFile, stat, writeFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { inject, injectable } from 'inversify'; +import { fileRights, logger } from '../utils'; +import { PathService } from './path.service'; + +@injectable() +export class VersionService { + constructor(@inject(PathService) private pathSvc: PathService) {} + + async find(tool: string): Promise { + const path = join(this.pathSvc.versionPath, tool); + try { + return (await readFile(path, { encoding: 'utf8' })) ?? null; + } catch (err) { + if (err instanceof Error && err.code === 'ENOENT') { + logger.debug({ tool }, 'tool version not found'); + } else { + logger.error({ tool, err }, 'tool version not found'); + } + return null; + } + } + + async update(tool: string, version: string): Promise { + const path = join(this.pathSvc.versionPath, tool); + try { + await writeFile(path, version, { encoding: 'utf8' }); + const s = await stat(path); + if ((s.mode & fileRights) !== 0o664) { + await chmod(path, 0o664); + } + } catch (err) { + logger.error({ tool, err }, 'tool version not found'); + } + } +} diff --git a/src/cli/tools/docker/index.ts b/src/cli/tools/docker/index.ts new file mode 100644 index 0000000000..7d2b005aa5 --- /dev/null +++ b/src/cli/tools/docker/index.ts @@ -0,0 +1,73 @@ +import { createReadStream } from 'node:fs'; +import fs from 'node:fs/promises'; +import { join } from 'node:path'; +import { pipeline } from 'node:stream/promises'; +import { execa } from 'execa'; +import { inject, injectable } from 'inversify'; +import tar from 'tar'; +import { InstallToolBaseService } from '../../install-tool/install-tool-base.service'; +import { PrepareToolBaseService } from '../../prepare-tool/prepare-tool-base.service'; +import { EnvService, HttpService, PathService } from '../../services'; +import { logger } from '../../utils'; + +@injectable() +export class PrepareDockerService extends PrepareToolBaseService { + readonly name = 'docker'; + + constructor(@inject(EnvService) private envSvc: EnvService) { + super(); + } + + async execute(): Promise { + await execa('groupadd', ['-g', '999', 'docker']); + await execa('usermod', ['-aG', 'docker', this.envSvc.userName]); + } +} + +@injectable() +export class InstallDockerService extends InstallToolBaseService { + readonly name = 'docker'; + + private get arch(): string { + switch (this.envSvc.arch) { + case 'arm64': + return 'aarch64'; + case 'amd64': + return 'x86_64'; + } + } + + constructor( + @inject(EnvService) envSvc: EnvService, + @inject(PathService) pathSvc: PathService, + @inject(HttpService) private http: HttpService + ) { + super(pathSvc, envSvc); + } + + override async install(version: string): Promise { + const url = `https://download.docker.com/linux/static/stable/${this.arch}/docker-${version}.tgz`; + logger.debug({ url }, 'download docker'); + const file = await this.http.download({ url }); + + const path = join( + await this.pathSvc.createVersionedToolPath(this.name, version), + 'bin' + ); + await fs.mkdir(path); + await pipeline( + createReadStream(file), + tar.x({ cwd: path, strip: 1 }, ['docker/docker']) + ); + } + + override async link(version: string): Promise { + const src = join(this.pathSvc.versionedToolPath(this.name, version), 'bin'); + + await this.shellwrapper({ name: 'docker', srcDir: src }); + } + + override async test(_version: string): Promise { + await execa('docker', ['--version'], { stdio: 'inherit' }); + } +} diff --git a/src/cli/tsconfig.json b/src/cli/tsconfig.json new file mode 100644 index 0000000000..018431895a --- /dev/null +++ b/src/cli/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "baseUrl": "." + } +} diff --git a/src/cli/types.d.ts b/src/cli/types.d.ts new file mode 100644 index 0000000000..5b0f0d6756 --- /dev/null +++ b/src/cli/types.d.ts @@ -0,0 +1,3 @@ +interface Error { + code?: string; +} diff --git a/src/cli/utils/common.ts b/src/cli/utils/common.ts new file mode 100644 index 0000000000..a39aaa2217 --- /dev/null +++ b/src/cli/utils/common.ts @@ -0,0 +1,58 @@ +import fs from 'node:fs/promises'; +import os from 'node:os'; +import { exit } from 'node:process'; +import { logger } from './logger'; +import type { Distro } from './types'; + +let distro: undefined | Promise; + +export async function validateSystem(): Promise { + if (os.platform() !== 'linux') { + logger.fatal(`Unsupported platform: ${os.platform()}! Please use Linux.`); + exit(1); + } + if (os.arch() !== 'x64' && os.arch() !== 'arm64') { + logger.fatal( + `Unsupported architecture: ${os.arch()}! Please use 'x64' or 'arm64'.` + ); + exit(1); + } + const d = await (distro ??= readDistro()); + switch (d.versionCode) { + case 'focal': + case 'jammy': + break; + default: + logger.fatal( + { distro: d }, + `Unsupported distro: ${d.versionCode}! Please use Ubuntu 'focal' or 'jammy'.` + ); + exit(1); + } +} + +export async function getDistro(): Promise { + return await (distro ??= readDistro()); +} + +async function readDistro(): Promise { + const data = await fs.readFile('/etc/os-release', { encoding: 'utf-8' }); + const name = /^NAME="?(\w+)"?$/m.exec(data)?.[1]; + const versionCode = /^VERSION_CODENAME="?(\w+)"?$/m.exec(data)?.[1]; + const versionId = /^VERSION_ID="?(\d+\.\d+)"?$/m.exec(data)?.[1]; + if (!name || !versionCode || !versionId) { + logger.error( + { data, d: { name, versionCode, versionId } }, + `Couldn't detect distro from '/etc/os-release'.` + ); + return { name: 'Unknown', versionCode: 'unknown', versionId: '00.00' }; + } + logger.debug( + { distro: { name, versionCode, versionId } }, + 'discovered distro' + ); + return { name, versionCode, versionId }; +} + +export const fileRights = + fs.constants.S_IRWXU | fs.constants.S_IRWXG | fs.constants.S_IRWXO; diff --git a/src/cli/utils/index.ts b/src/cli/utils/index.ts new file mode 100644 index 0000000000..a7c94863f1 --- /dev/null +++ b/src/cli/utils/index.ts @@ -0,0 +1,21 @@ +import { argv0 } from 'node:process'; +import type { CliMode } from './types'; + +export type * from './types'; +export * from './versions'; +export * from './logger'; +export * from './common'; + +export function cliMode(): CliMode | null { + if (argv0.endsWith('/install-tool') || argv0 === 'install-tool') { + return 'install-tool'; + } + if (argv0.endsWith('/prepare-tool') || argv0 === 'prepare-tool') { + return 'prepare-tool'; + } + if (argv0.endsWith('/install-tool') || argv0 === 'install-tool') { + return 'containerbase-cli'; + } + + return null; +} diff --git a/src/cli/utils/logger.ts b/src/cli/utils/logger.ts new file mode 100644 index 0000000000..509aa1a38b --- /dev/null +++ b/src/cli/utils/logger.ts @@ -0,0 +1,11 @@ +import { env } from 'node:process'; +import { type Level, pino } from 'pino'; +import pretty from 'pino-pretty'; + +const level: Level = + (env.LOG_LEVEL as Level | undefined) ?? + (env.CONTAINERBASE_DEBUG ? 'debug' : undefined) ?? + 'info'; + +// TODO: support file and ndjson logging +export const logger = pino({ level }, pretty()); diff --git a/src/cli/utils/types.ts b/src/cli/utils/types.ts new file mode 100644 index 0000000000..d123428f1e --- /dev/null +++ b/src/cli/utils/types.ts @@ -0,0 +1,9 @@ +export interface Distro { + readonly name: string; + readonly versionCode: string; + readonly versionId: string; +} + +export type CliMode = 'containerbase-cli' | 'install-tool' | 'prepare-tool'; + +export type Arch = 'arm64' | 'amd64'; diff --git a/src/cli/utils/versions.ts b/src/cli/utils/versions.ts new file mode 100644 index 0000000000..8d6c60387f --- /dev/null +++ b/src/cli/utils/versions.ts @@ -0,0 +1,46 @@ +import semver from 'semver'; +import { type StrictValidator, makeValidator } from 'typanion'; + +export function validateSemver(): StrictValidator { + return makeValidator({ + test: (value, state): value is string => { + const version = semver.valid(value); + if (version !== null) { + if (state?.coercions) { + if (!state.coercion) { + state.errors?.push(`${state?.p ?? '.'}: Unbound coercion result`); + return false; + } + state.coercions.push([ + state.p ?? '.', + state.coercion.bind(null, version), + ]); + } + return true; + } + + state?.errors?.push(`${state?.p ?? '.'}: must be a valid semver version`); + return false; + }, + }); +} + +export function validateVersion(): StrictValidator { + return makeValidator({ + test: (value, state): value is string => { + if (value.startsWith('v')) { + if (state?.coercions) { + if (!state.coercion) { + state.errors?.push(`${state?.p ?? '.'}: Unbound coercion result`); + return false; + } + state.coercions.push([ + state.p ?? '.', + state.coercion.bind(null, value.slice(1)), + ]); + } + } + return true; + }, + }); +} diff --git a/src/usr/local/bin/install-containerbase b/src/usr/local/bin/install-containerbase index ea92dc6c10..3e50d71002 100755 --- a/src/usr/local/bin/install-containerbase +++ b/src/usr/local/bin/install-containerbase @@ -81,6 +81,18 @@ if [[ "$(find /usr/local/share/ca-certificates/ -name "*.crt" -type f -printf '. update-ca-certificates fi +function link_tool () { + local arch=x64 + + if [[ "${ARCHITECTURE}" = "aarch64" ]];then + arch=arm64 + fi + ln -sf /usr/local/containerbase/bin/containerbase-cli-${arch} /usr/local/bin/containerbase-cli + ln -sf /usr/local/containerbase/bin/containerbase-cli-${arch} /usr/local/bin/install-tool + ln -sf /usr/local/containerbase/bin/containerbase-cli-${arch} /usr/local/bin/prepare-tool +} +link_tool + # do this at the end as we are overwriting certain env vars and functions function prepare_v2_tools () { diff --git a/src/usr/local/bin/install-tool b/src/usr/local/containerbase/bin/install-tool similarity index 100% rename from src/usr/local/bin/install-tool rename to src/usr/local/containerbase/bin/install-tool diff --git a/src/usr/local/bin/prepare-tool b/src/usr/local/containerbase/bin/prepare-tool similarity index 100% rename from src/usr/local/bin/prepare-tool rename to src/usr/local/containerbase/bin/prepare-tool diff --git a/src/usr/local/containerbase/tools/v2/docker.sh b/src/usr/local/containerbase/tools/v2/docker.sh deleted file mode 100644 index e09de8b0b1..0000000000 --- a/src/usr/local/containerbase/tools/v2/docker.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -function prepare_tool() { - groupadd -g 999 docker - usermod -aG docker "${USER_NAME}" - create_tool_path > /dev/null -} - -function install_tool () { - local versioned_tool_path - local file - local arch - - if [[ ! -d "$(find_tool_path)" ]]; then - if [[ $(is_root) -ne 0 ]]; then - echo "${TOOL_NAME} not prepared" - exit 1 - fi - prepare_tool - fi - - arch=$(uname -p) - file=$(get_from_url "https://download.docker.com/linux/static/stable/${arch}/docker-${TOOL_VERSION}.tgz") - - versioned_tool_path=$(create_versioned_tool_path) - mkdir "${versioned_tool_path}/bin" - bsdtar -C "${versioned_tool_path}/bin" --strip 1 -xf "${file}" docker/docker -} - -function link_tool () { - shell_wrapper "${TOOL_NAME}" "$(find_versioned_tool_path)/bin" - [[ -n $SKIP_VERSION ]] || docker --version -} diff --git a/tools/esbuild.js b/tools/esbuild.js new file mode 100644 index 0000000000..f6bcec4a65 --- /dev/null +++ b/tools/esbuild.js @@ -0,0 +1,50 @@ +import fs from 'node:fs/promises'; +import { build } from 'esbuild'; +import esbuildPluginPino from 'esbuild-plugin-pino'; +import { exec } from 'pkg'; + +await build({ + entryPoints: { 'containerbase-cli': './src/cli/index.ts' }, + bundle: true, + platform: 'node', + target: 'node18', + minify: false, + tsconfig: 'src/cli/tsconfig.json', + // format: "esm", // not supported https://github.com/vercel/pkg/issues/1291 + outdir: './dist/', + define: { + 'globalThis.CONTAINERBASE_VERSION': `"${ + process.env.CONTAINERBASE_VERSION ?? '0.0.0-PLACEHOLDER' + }"`, + }, + plugins: [esbuildPluginPino({ transports: ['pino-pretty'] })], +}); + +await fs.writeFile( + './dist/package.json', + JSON.stringify( + { + name: 'containerbase-cli', + version: process.env.CONTAINERBASE_VERSION ?? '0.0.0-PLACEHOLDER', + private: true, + type: 'commonjs', + bin: { + 'containerbase-cli': './containerbase-cli.js', + }, + pkg: { + scripts: ['*.js'], + targets: ['node18-linux-x64', 'node18-linux-arm64'], + }, + }, + undefined, + 2 + ) +); + +await exec([ + '--out-path', + './src/usr/local/containerbase/bin', + '--public', + // '--debug', + 'dist', +]); diff --git a/tools/prepare-release.js b/tools/prepare-release.js index 58cdbf785e..282b385869 100644 --- a/tools/prepare-release.js +++ b/tools/prepare-release.js @@ -24,7 +24,9 @@ class PrepareCommand extends Command { await fs.writeFile('src/usr/local/containerbase/version', version); - let r = shell.exec('tar -cJf ./bin/containerbase.tar.xz -C ./src .'); + let r = shell.exec( + `tar --exclude='./cli' -cJf ./bin/containerbase.tar.xz -C ./src .` + ); if (r.code) { return 1; } diff --git a/tools/test.js b/tools/test.js index 12785cc673..ff9812a23d 100644 --- a/tools/test.js +++ b/tools/test.js @@ -7,11 +7,18 @@ shell.config.fatal = true; class TestCommand extends Command { tests = Option.Rest({ required: false }); dryRun = Option.Boolean('-d,--dry-run', { required: false }); + target = Option.String('-t,--target', { required: false, default: 'test' }); + build = Option.Boolean('-b,--build', { required: false, default: false }); async execute() { let tests = this.tests; let explicit = true; + if (this.build) { + shell.echo('Compiling sources'); + shell.exec('yarn build'); + } + if (!tests.length) { tests = shell.ls('test'); explicit = false; @@ -29,7 +36,7 @@ class TestCommand extends Command { continue; } shell.echo('Processing:', d); - shell.exec('docker buildx bake test', { + shell.exec(`docker buildx bake ${this.target}`, { env: { ...process.env, TAG: d }, }); } diff --git a/tsconfig.json b/tsconfig.json index 420ec92fbe..21f7bb2102 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,9 @@ "allowJs": true, "noEmit": true, "types": ["node"], - "verbatimModuleSyntax": true + "verbatimModuleSyntax": true, + "noImplicitOverride": true, + "experimentalDecorators": true }, "exclude": ["node_modules", "bin"] } diff --git a/yarn.lock b/yarn.lock index 91f7d9bceb..dcd314927c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,7 +33,25 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6": +"@babel/generator@npm:7.18.2": + version: 7.18.2 + resolution: "@babel/generator@npm:7.18.2" + dependencies: + "@babel/types": ^7.18.2 + "@jridgewell/gen-mapping": ^0.3.0 + jsesc: ^2.5.1 + checksum: d0661e95532ddd97566d41fec26355a7b28d1cbc4df95fe80cc084c413342935911b48db20910708db39714844ddd614f61c2ec4cca3fb10181418bdcaa2e7a3 + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.18.10, @babel/helper-string-parser@npm:^7.21.5": + version: 7.21.5 + resolution: "@babel/helper-string-parser@npm:7.21.5" + checksum: 36c0ded452f3858e67634b81960d4bde1d1cd2a56b82f4ba2926e97864816021c885f111a7cf81de88a0ed025f49d84a393256700e9acbca2d99462d648705d8 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a @@ -51,6 +69,37 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:7.18.4": + version: 7.18.4 + resolution: "@babel/parser@npm:7.18.4" + bin: + parser: ./bin/babel-parser.js + checksum: e05b2dc720c4b200e088258f3c2a2de5041c140444edc38181d1217b10074e881a7133162c5b62356061f26279f08df5a06ec14c5842996ee8601ad03c57a44f + languageName: node + linkType: hard + +"@babel/types@npm:7.19.0": + version: 7.19.0 + resolution: "@babel/types@npm:7.19.0" + dependencies: + "@babel/helper-string-parser": ^7.18.10 + "@babel/helper-validator-identifier": ^7.18.6 + to-fast-properties: ^2.0.0 + checksum: 9b346715a68aeede70ba9c685a144b0b26c53bcd595d448e24c8fa8df4d5956a5712e56ebadb7c85dcc32f218ee42788e37b93d50d3295c992072224cb3ef3fe + languageName: node + linkType: hard + +"@babel/types@npm:^7.18.2, @babel/types@npm:^7.8.3": + version: 7.21.5 + resolution: "@babel/types@npm:7.21.5" + dependencies: + "@babel/helper-string-parser": ^7.21.5 + "@babel/helper-validator-identifier": ^7.19.1 + to-fast-properties: ^2.0.0 + checksum: 43242a99c612d13285ee4af46cc0f1066bcb6ffd38307daef7a76e8c70f36cfc3255eb9e75c8e768b40e761176c313aec4d5c0b9d97a21e494d49d5fd123a9f7 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -58,6 +107,190 @@ __metadata: languageName: node linkType: hard +"@esbuild-kit/cjs-loader@npm:^2.4.2": + version: 2.4.2 + resolution: "@esbuild-kit/cjs-loader@npm:2.4.2" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: e346e339bfc7eff5c52c270fd0ec06a7f2341b624adfb69f84b7d83f119c35070420906f2761a0b4604e0a0ec90e35eaf12544585476c428ed6d6ee3b250c0fe + languageName: node + linkType: hard + +"@esbuild-kit/core-utils@npm:^3.0.0": + version: 3.1.0 + resolution: "@esbuild-kit/core-utils@npm:3.1.0" + dependencies: + esbuild: ~0.17.6 + source-map-support: ^0.5.21 + checksum: d54fd5adb3ce6784d84bb025ad54ddcfbab99267071a7f65298e547f56696f0b9d0dba96c535f9678a30d4887ec71cd445fdd277d65fbec1f3b504f6808f693e + languageName: node + linkType: hard + +"@esbuild-kit/esm-loader@npm:^2.5.5": + version: 2.5.5 + resolution: "@esbuild-kit/esm-loader@npm:2.5.5" + dependencies: + "@esbuild-kit/core-utils": ^3.0.0 + get-tsconfig: ^4.4.0 + checksum: 9d4a03ffc937fbec75a8456c3d45d7cdb1a65768416791a5720081753502bc9f485ba27942a46f564b12483b140a8a46c12433a4496430d93e4513e430484ec7 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm64@npm:0.17.19" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-arm@npm:0.17.19" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/android-x64@npm:0.17.19" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-arm64@npm:0.17.19" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/darwin-x64@npm:0.17.19" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-arm64@npm:0.17.19" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/freebsd-x64@npm:0.17.19" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm64@npm:0.17.19" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-arm@npm:0.17.19" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ia32@npm:0.17.19" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-loong64@npm:0.17.19" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-mips64el@npm:0.17.19" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-ppc64@npm:0.17.19" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-riscv64@npm:0.17.19" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-s390x@npm:0.17.19" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/linux-x64@npm:0.17.19" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/netbsd-x64@npm:0.17.19" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/openbsd-x64@npm:0.17.19" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/sunos-x64@npm:0.17.19" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-arm64@npm:0.17.19" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-ia32@npm:0.17.19" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.17.19": + version: 0.17.19 + resolution: "@esbuild/win32-x64@npm:0.17.19" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -153,6 +386,55 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -702,6 +984,22 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/is@npm:^5.2.0": + version: 5.3.0 + resolution: "@sindresorhus/is@npm:5.3.0" + checksum: b31cebabcdece3d5322de2a4dbc8c0f004e04147a00f2606787bcaf5655ad4b1954f6727fc6914c524009b2b9a2cc01c42835b55f651ce69fd2a0083b60bb852 + languageName: node + linkType: hard + +"@szmarczak/http-timer@npm:^5.0.1": + version: 5.0.1 + resolution: "@szmarczak/http-timer@npm:5.0.1" + dependencies: + defer-to-connect: ^2.0.1 + checksum: fc9cb993e808806692e4a3337c90ece0ec00c89f4b67e3652a356b89730da98bc824273a6d67ca84d5f33cd85f317dcd5ce39d8cc0a2f060145a608a7cb8ce92 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -743,6 +1041,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:^4.0.1": + version: 4.0.1 + resolution: "@types/http-cache-semantics@npm:4.0.1" + checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 + languageName: node + linkType: hard + "@types/json-schema@npm:^7.0.9": version: 7.0.12 resolution: "@types/json-schema@npm:7.0.12" @@ -792,7 +1097,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12": +"@types/semver@npm:7.5.0, @types/semver@npm:^7.3.12": version: 7.5.0 resolution: "@types/semver@npm:7.5.0" checksum: 0a64b9b9c7424d9a467658b18dd70d1d781c2d6f033096a6e05762d20ebbad23c1b69b0083b0484722aabf35640b78ccc3de26368bcae1129c87e9df028a22e2 @@ -809,6 +1114,16 @@ __metadata: languageName: node linkType: hard +"@types/tar@npm:6.1.5": + version: 6.1.5 + resolution: "@types/tar@npm:6.1.5" + dependencies: + "@types/node": "*" + minipass: ^4.0.0 + checksum: 1efa71c8d72f2b02d16ffecb65c4a96be9dacce000c4207532a686477386524dd99b6e26904319354be3ac9ac4d41296a0cb9cf87d05f8f21ae31c68fe446348 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:5.59.9": version: 5.59.9 resolution: "@typescript-eslint/eslint-plugin@npm:5.59.9" @@ -1305,6 +1620,20 @@ __metadata: languageName: node linkType: hard +"at-least-node@npm:^1.0.0": + version: 1.0.0 + resolution: "at-least-node@npm:1.0.0" + checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + languageName: node + linkType: hard + +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 + languageName: node + linkType: hard + "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" @@ -1386,6 +1715,17 @@ __metadata: languageName: node linkType: hard +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: ^5.5.0 + inherits: ^2.0.4 + readable-stream: ^3.4.0 + checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + languageName: node + linkType: hard + "bottleneck@npm:^2.15.3": version: 2.19.5 resolution: "bottleneck@npm:2.19.5" @@ -1430,6 +1770,23 @@ __metadata: languageName: node linkType: hard +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: ^1.3.1 + ieee754: ^1.1.13 + checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 + languageName: node + linkType: hard + "buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" @@ -1504,6 +1861,28 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^7.0.0": + version: 7.0.0 + resolution: "cacheable-lookup@npm:7.0.0" + checksum: 9e2856763fc0a7347ab34d704c010440b819d4bb5e3593b664381b7433e942dd22e67ee5581f12256f908e79b82d30b86ebbacf40a081bfe10ee93fbfbc2d6a9 + languageName: node + linkType: hard + +"cacheable-request@npm:^10.2.8": + version: 10.2.10 + resolution: "cacheable-request@npm:10.2.10" + dependencies: + "@types/http-cache-semantics": ^4.0.1 + get-stream: ^6.0.1 + http-cache-semantics: ^4.1.1 + keyv: ^4.5.2 + mimic-response: ^4.0.0 + normalize-url: ^8.0.0 + responselike: ^3.0.0 + checksum: 6f56cf6dc88c000936c89e386fdfd65c9a7833f6a4f73314f546287352efca50ef8c7ccc80c64d5c51fe104f5a60356366e190846f56abf3f2e90c1bacec7eee + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -1579,6 +1958,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -1681,6 +2067,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -1747,7 +2144,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.19": +"colorette@npm:^2.0.19, colorette@npm:^2.0.7": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d @@ -1819,7 +2216,9 @@ __metadata: "@semantic-release/exec": 6.0.3 "@tsconfig/node18": 2.0.1 "@types/node": 18.16.16 + "@types/semver": 7.5.0 "@types/shelljs": 0.8.12 + "@types/tar": 6.1.5 "@typescript-eslint/eslint-plugin": 5.59.9 "@typescript-eslint/parser": 5.59.9 bats: 1.9.0 @@ -1827,6 +2226,8 @@ __metadata: bats-support: 0.3.0 clipanion: 3.2.1 conventional-changelog-conventionalcommits: 6.0.0 + esbuild: 0.17.19 + esbuild-plugin-pino: 2.0.0 eslint: 8.42.0 eslint-config-prettier: 8.8.0 eslint-formatter-gha: 1.4.2 @@ -1836,13 +2237,25 @@ __metadata: eslint-plugin-jest-formatting: 3.1.0 eslint-plugin-promise: 6.1.1 eslint-plugin-typescript-enum: 2.1.0 + execa: 7.1.1 + got: 12.6.0 + hasha: 5.2.2 husky: 8.0.3 + inversify: 6.0.1 lint-staged: 13.2.2 npm-run-all: 4.1.5 + pino: 8.14.1 + pino-pretty: 10.0.0 + pkg: 5.8.1 prettier: 2.8.8 prettier-plugin-package: 1.3.0 + reflect-metadata: 0.1.13 semantic-release: 21.0.3 + semver: 7.5.1 shelljs: 0.8.5 + tar: 6.1.15 + tsx: 3.12.7 + typanion: 3.12.1 typescript: 5.1.3 languageName: unknown linkType: soft @@ -2012,6 +2425,13 @@ __metadata: languageName: node linkType: hard +"dateformat@npm:^4.6.3": + version: 4.6.3 + resolution: "dateformat@npm:4.6.3" + checksum: c3aa0617c0a5b30595122bc8d1bee6276a9221e4d392087b41cbbdf175d9662ae0e50d0d6dcdf45caeac5153c4b5b0844265f8cd2b2245451e3da19e39e3b65d + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -2050,6 +2470,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: ^3.1.0 + checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 + languageName: node + linkType: hard + "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" @@ -2095,6 +2524,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.1": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b + languageName: node + linkType: hard + "define-lazy-prop@npm:^3.0.0": version: 3.0.0 resolution: "define-lazy-prop@npm:3.0.0" @@ -2133,6 +2569,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.0.1 + resolution: "detect-libc@npm:2.0.1" + checksum: ccb05fcabbb555beb544d48080179c18523a343face9ee4e1a86605a8715b4169f94d663c21a03c310ac824592f2ba9a5270218819bb411ad7be578a527593d7 + languageName: node + linkType: hard + "diff@npm:^5.1.0": version: 5.1.0 resolution: "diff@npm:5.1.0" @@ -2215,6 +2658,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: ^1.4.0 + checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.12.0": version: 5.14.1 resolution: "enhanced-resolve@npm:5.14.1" @@ -2331,6 +2783,92 @@ __metadata: languageName: node linkType: hard +"esbuild-plugin-pino@npm:2.0.0": + version: 2.0.0 + resolution: "esbuild-plugin-pino@npm:2.0.0" + peerDependencies: + esbuild: ^0.17.1 + checksum: bf5cc2be88a5feef8f650e759f1797568a60ef957c6febd9b7cdc8e26a37827d25b101975fa1225c7ba14d596d2dbf7fc59b9de847df3182e26a11ccb2eea982 + languageName: node + linkType: hard + +"esbuild@npm:0.17.19, esbuild@npm:~0.17.6": + version: 0.17.19 + resolution: "esbuild@npm:0.17.19" + dependencies: + "@esbuild/android-arm": 0.17.19 + "@esbuild/android-arm64": 0.17.19 + "@esbuild/android-x64": 0.17.19 + "@esbuild/darwin-arm64": 0.17.19 + "@esbuild/darwin-x64": 0.17.19 + "@esbuild/freebsd-arm64": 0.17.19 + "@esbuild/freebsd-x64": 0.17.19 + "@esbuild/linux-arm": 0.17.19 + "@esbuild/linux-arm64": 0.17.19 + "@esbuild/linux-ia32": 0.17.19 + "@esbuild/linux-loong64": 0.17.19 + "@esbuild/linux-mips64el": 0.17.19 + "@esbuild/linux-ppc64": 0.17.19 + "@esbuild/linux-riscv64": 0.17.19 + "@esbuild/linux-s390x": 0.17.19 + "@esbuild/linux-x64": 0.17.19 + "@esbuild/netbsd-x64": 0.17.19 + "@esbuild/openbsd-x64": 0.17.19 + "@esbuild/sunos-x64": 0.17.19 + "@esbuild/win32-arm64": 0.17.19 + "@esbuild/win32-ia32": 0.17.19 + "@esbuild/win32-x64": 0.17.19 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -2660,6 +3198,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:7.1.1, execa@npm:^7.0.0, execa@npm:^7.1.1": + version: 7.1.1 + resolution: "execa@npm:7.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^4.3.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 + languageName: node + linkType: hard + "execa@npm:^5.0.0": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -2677,20 +3232,17 @@ __metadata: languageName: node linkType: hard -"execa@npm:^7.0.0, execa@npm:^7.1.1": - version: 7.1.1 - resolution: "execa@npm:7.1.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.1 - human-signals: ^4.3.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^3.0.7 - strip-final-newline: ^3.0.0 - checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 588c19847216421ed92befb521767b7018dc88f88b0576df98cb242f20961425e96a92cbece525ef28cc5becceae5d544ae0f5b9b5e2aa05acb13716ca5b3099 + languageName: node + linkType: hard + +"fast-copy@npm:^3.0.0": + version: 3.0.1 + resolution: "fast-copy@npm:3.0.1" + checksum: 5496b5cf47df29eea479deef03b6b7188626a2cbc356b3015649062846729de6f1a9f555f937e772da8feae0a1231fab13096ed32424b2d61e4d065abc9969fe languageName: node linkType: hard @@ -2728,6 +3280,20 @@ __metadata: languageName: node linkType: hard +"fast-redact@npm:^3.1.1": + version: 3.2.0 + resolution: "fast-redact@npm:3.2.0" + checksum: 7305740bbc708b0c5662f46fc30ec910da519275574fea84f6df0bea0cfe6066ddf90c6c4b879642c509e692edf862edd22eaccb2a647db122eebe8259942888 + languageName: node + linkType: hard + +"fast-safe-stringify@npm:^2.1.1": + version: 2.1.1 + resolution: "fast-safe-stringify@npm:2.1.1" + checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d + languageName: node + linkType: hard + "fastest-levenshtein@npm:^1.0.16": version: 1.0.16 resolution: "fastest-levenshtein@npm:1.0.16" @@ -2865,6 +3431,13 @@ __metadata: languageName: node linkType: hard +"form-data-encoder@npm:^2.1.2": + version: 2.1.4 + resolution: "form-data-encoder@npm:2.1.4" + checksum: e0b3e5950fb69b3f32c273944620f9861f1933df9d3e42066e038e26dfb343d0f4465de9f27e0ead1a09d9df20bc2eed06a63c2ca2f8f00949e7202bae9e29dd + languageName: node + linkType: hard + "from2@npm:^2.3.0": version: 2.3.0 resolution: "from2@npm:2.3.0" @@ -2875,6 +3448,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + languageName: node + linkType: hard + "fs-extra@npm:^11.0.0": version: 11.1.1 resolution: "fs-extra@npm:11.1.1" @@ -2886,6 +3466,18 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^9.1.0": + version: 9.1.0 + resolution: "fs-extra@npm:9.1.0" + dependencies: + at-least-node: ^1.0.0 + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -2911,6 +3503,25 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:~2.3.2": + version: 2.3.2 + resolution: "fsevents@npm:2.3.2" + dependencies: + node-gyp: latest + checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@~2.3.2#~builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -3012,6 +3623,13 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.4.0": + version: 4.5.0 + resolution: "get-tsconfig@npm:4.5.0" + checksum: 687ee2bd69a5a07db2e2edeb4d6c41c3debb38f6281a66beb643e3f5b520252e27fcbbb5702bdd9a5f05dcf8c1d2e0150a4d8a960ad75cbdea74e06a51e91b02 + languageName: node + linkType: hard + "get-tsconfig@npm:^4.5.0": version: 4.6.0 resolution: "get-tsconfig@npm:4.6.0" @@ -3035,6 +3653,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 14e448192a35c1e42efee94c9d01a10f42fe790375891a24b25261246ce9336ab9df5d274585aedd4568f7922246c2a78b8a8cd2571bfe99c693a9718e7dd0e3 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -3082,7 +3707,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1": +"glob@npm:^8.0.0, glob@npm:^8.0.1": version: 8.1.0 resolution: "glob@npm:8.1.0" dependencies: @@ -3149,6 +3774,25 @@ __metadata: languageName: node linkType: hard +"got@npm:12.6.0": + version: 12.6.0 + resolution: "got@npm:12.6.0" + dependencies: + "@sindresorhus/is": ^5.2.0 + "@szmarczak/http-timer": ^5.0.1 + cacheable-lookup: ^7.0.0 + cacheable-request: ^10.2.8 + decompress-response: ^6.0.0 + form-data-encoder: ^2.1.2 + get-stream: ^6.0.1 + http2-wrapper: ^2.1.10 + lowercase-keys: ^3.0.0 + p-cancelable: ^3.0.0 + responselike: ^3.0.0 + checksum: 3621897067068dcb3578d05535cfb10f60aac07198032b3349a488f5741964e7f63d6e37c976840f1bcaaf42f5c049ed3c6d8e0d6c622b74639ca9319ad178a1 + languageName: node + linkType: hard + "graceful-fs@npm:4.2.10": version: 4.2.10 resolution: "graceful-fs@npm:4.2.10" @@ -3271,6 +3915,26 @@ __metadata: languageName: node linkType: hard +"hasha@npm:5.2.2": + version: 5.2.2 + resolution: "hasha@npm:5.2.2" + dependencies: + is-stream: ^2.0.0 + type-fest: ^0.8.0 + checksum: 06cc474bed246761ff61c19d629977eb5f53fa817be4313a255a64ae0f433e831a29e83acb6555e3f4592b348497596f1d1653751008dda4f21c9c21ca60ac5a + languageName: node + linkType: hard + +"help-me@npm:^4.0.1": + version: 4.2.0 + resolution: "help-me@npm:4.2.0" + dependencies: + glob: ^8.0.0 + readable-stream: ^3.6.0 + checksum: 6548acba10dd79ebfc93f0d739c4cb2f32f7932c8d87b091992f3a0f844706263415eab81be015aed4ab874154232beb666920d7e280502c6bba29a40cde343e + languageName: node + linkType: hard + "hook-std@npm:^3.0.0": version: 3.0.0 resolution: "hook-std@npm:3.0.0" @@ -3331,6 +3995,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^2.1.10": + version: 2.2.0 + resolution: "http2-wrapper@npm:2.2.0" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.2.0 + checksum: 6fd20e5cb6a58151715b3581e06a62a47df943187d2d1f69e538a50cccb7175dd334ecfde7900a37d18f3e13a1a199518a2c211f39860e81e9a16210c199cfaa + languageName: node + linkType: hard + "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -3392,7 +4066,7 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e @@ -3470,7 +4144,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": +"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -3524,6 +4198,16 @@ __metadata: languageName: node linkType: hard +"into-stream@npm:^6.0.0": + version: 6.0.0 + resolution: "into-stream@npm:6.0.0" + dependencies: + from2: ^2.3.0 + p-is-promise: ^3.0.0 + checksum: 8df24c9eadd7cdd1cbc160bc20914b961dfd0ca29767785b69e698f799e85466b6f7c637d237dca1472d09d333399f70cc05a2fb8d08cb449dc9a80d92193980 + languageName: node + linkType: hard + "into-stream@npm:^7.0.0": version: 7.0.0 resolution: "into-stream@npm:7.0.0" @@ -3534,6 +4218,13 @@ __metadata: languageName: node linkType: hard +"inversify@npm:6.0.1": + version: 6.0.1 + resolution: "inversify@npm:6.0.1" + checksum: b6c9b56ef7817a71534b06101c2b0a0130b67c47a769f58794d9c0643591a83ac02be30a48c00cb729c0c83ece96dde369c419d48c32d0201c6cc7407629fbc5 + languageName: node + linkType: hard + "ip-regex@npm:^4.1.0": version: 4.3.0 resolution: "ip-regex@npm:4.3.0" @@ -3601,6 +4292,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:2.9.0": + version: 2.9.0 + resolution: "is-core-module@npm:2.9.0" + dependencies: + has: ^1.0.3 + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce + languageName: node + linkType: hard + "is-core-module@npm:^2.11.0, is-core-module@npm:^2.12.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": version: 2.12.1 resolution: "is-core-module@npm:2.12.1" @@ -3881,6 +4581,13 @@ __metadata: languageName: node linkType: hard +"joycon@npm:^3.1.1": + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 + languageName: node + linkType: hard + "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -3899,6 +4606,22 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^2.5.1": + version: 2.5.2 + resolution: "jsesc@npm:2.5.2" + bin: + jsesc: bin/jsesc + checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" @@ -3993,6 +4716,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.2": + version: 4.5.2 + resolution: "keyv@npm:4.5.2" + dependencies: + json-buffer: 3.0.1 + checksum: 13ad58303acd2261c0d4831b4658451603fd159e61daea2121fcb15feb623e75ee328cded0572da9ca76b7b3ceaf8e614f1806c6b3af5db73c9c35a345259651 + languageName: node + linkType: hard + "kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -4335,6 +5067,13 @@ __metadata: languageName: node linkType: hard +"lowercase-keys@npm:^3.0.0": + version: 3.0.0 + resolution: "lowercase-keys@npm:3.0.0" + checksum: 67a3f81409af969bc0c4ca0e76cd7d16adb1e25aa1c197229587eaf8671275c8c067cd421795dbca4c81be0098e4c426a086a05e30de8a9c587b7a13c0c7ccc5 + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" @@ -4517,6 +5256,20 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 + languageName: node + linkType: hard + +"mimic-response@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-response@npm:4.0.0" + checksum: 33b804cc961efe206efdb1fca6a22540decdcfce6c14eb5c0c50e5ae9022267ab22ce8f5568b1f7247ba67500fe20d523d81e0e9f009b321ccd9d472e78d1850 + languageName: node + linkType: hard + "min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -4562,7 +5315,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 @@ -4654,6 +5407,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^4.0.0": + version: 4.2.8 + resolution: "minipass@npm:4.2.8" + checksum: 7f4914d5295a9a30807cae5227a37a926e6d910c03f315930fde52332cf0575dfbc20295318f91f0baf0e6bb11a6f668e30cde8027dea7a11b9d159867a3c830 + languageName: node + linkType: hard + "minipass@npm:^5.0.0": version: 5.0.0 resolution: "minipass@npm:5.0.0" @@ -4678,6 +5438,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -4708,6 +5475,16 @@ __metadata: languageName: node linkType: hard +"multistream@npm:^4.1.0": + version: 4.1.0 + resolution: "multistream@npm:4.1.0" + dependencies: + once: ^1.4.0 + readable-stream: ^3.6.0 + checksum: 305c49a1aadcb7f63f64d8ca2bb6e7852e5f7dba94c7329e9a72ce53cd0046686b71668dc1adbf123f17d2dd107765fc946e64c36a26b15c470a3146ea3bc923 + languageName: node + linkType: hard + "mute-stream@npm:~1.0.0": version: 1.0.0 resolution: "mute-stream@npm:1.0.0" @@ -4715,6 +5492,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 06c14271ee966e108d55ae109f340976a9556c8603e888037145d6522726aebe89dd0c861b4b83947feaf6d39e79e08817559e8693deedc2c94e82c5cbd090c7 + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -4757,6 +5541,15 @@ __metadata: languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.40.0 + resolution: "node-abi@npm:3.40.0" + dependencies: + semver: ^7.3.5 + checksum: 8f4ef0d9ac82352465e7e7a8ce3915dae49c0fd19d6cb49a93140ff587b612166443531111a60d25e479a18e6e6b9af09698c7870babe0f44aa54287aeaf5eef + languageName: node + linkType: hard + "node-emoji@npm:^1.11.0": version: 1.11.0 resolution: "node-emoji@npm:1.11.0" @@ -4766,7 +5559,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7": version: 2.6.11 resolution: "node-fetch@npm:2.6.11" dependencies: @@ -4780,7 +5573,7 @@ __metadata: languageName: node linkType: hard -"node-gyp@npm:^9.0.0, node-gyp@npm:^9.3.1": +"node-gyp@npm:^9.0.0, node-gyp@npm:^9.3.1, node-gyp@npm:latest": version: 9.3.1 resolution: "node-gyp@npm:9.3.1" dependencies: @@ -5148,7 +5941,14 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.4.0": +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.0 + resolution: "on-exit-leak-free@npm:2.1.0" + checksum: 7334d98b87b0c89c9b69c747760b21196ff35afdedc4eaf1a0a3a02964463d7f6802481b120e4c8298967c74773ca7b914ab2eb3d9b279010eb7f67ac4960eed + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -5201,6 +6001,13 @@ __metadata: languageName: node linkType: hard +"p-cancelable@npm:^3.0.0": + version: 3.0.0 + resolution: "p-cancelable@npm:3.0.0" + checksum: 2b5ae34218f9c2cf7a7c18e5d9a726ef9b165ef07e6c959f6738371509e747334b5f78f3bcdeb03d8a12dcb978faf641fd87eb21486ed7d36fb823b8ddef3219 + languageName: node + linkType: hard + "p-each-series@npm:^3.0.0": version: 3.0.0 resolution: "p-each-series@npm:3.0.0" @@ -5539,6 +6346,68 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:v1.0.0": + version: 1.0.0 + resolution: "pino-abstract-transport@npm:1.0.0" + dependencies: + readable-stream: ^4.0.0 + split2: ^4.0.0 + checksum: 05dd0eda52dd99fd204b39fe7b62656744b63e863bc052cdd5105d25f226a236966d0a46e39a1ace4838f6e988c608837ff946d2d0bc92835ca7baa0a3bff8d8 + languageName: node + linkType: hard + +"pino-pretty@npm:10.0.0": + version: 10.0.0 + resolution: "pino-pretty@npm:10.0.0" + dependencies: + colorette: ^2.0.7 + dateformat: ^4.6.3 + fast-copy: ^3.0.0 + fast-safe-stringify: ^2.1.1 + help-me: ^4.0.1 + joycon: ^3.1.1 + minimist: ^1.2.6 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: ^1.0.0 + pump: ^3.0.0 + readable-stream: ^4.0.0 + secure-json-parse: ^2.4.0 + sonic-boom: ^3.0.0 + strip-json-comments: ^3.1.1 + bin: + pino-pretty: bin.js + checksum: af45c69fdb50bdd27875d1456b7f2a7227bc1b98ca8b39ff3a4ef0c473ac8bd2ae1cb7de19921dc8cc0217b6d5f800c7af040eae294e5cc26e0fadf0a0a4afd7 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^6.0.0": + version: 6.2.1 + resolution: "pino-std-serializers@npm:6.2.1" + checksum: 9f86579dea7939a5d63c8313b0e2c3ad778a92aa9011a64d170677552b7634025738df890d09679eeed8be334ea90d37ded4b7a8cef4e3fa4d9c4387d339f905 + languageName: node + linkType: hard + +"pino@npm:8.14.1": + version: 8.14.1 + resolution: "pino@npm:8.14.1" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.1.1 + on-exit-leak-free: ^2.1.0 + pino-abstract-transport: v1.0.0 + pino-std-serializers: ^6.0.0 + process-warning: ^2.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.2.0 + safe-stable-stringify: ^2.3.1 + sonic-boom: ^3.1.0 + thread-stream: ^2.0.0 + bin: + pino: bin.js + checksum: 72dcae8f550d375695bb8745f11b30c42aaa20d0bcab8f546ca5af0684d784453850949fe1b244206793e813a46d72cbbf0dda8aed2cee86e9491ba44a643e3e + languageName: node + linkType: hard + "pkg-conf@npm:^2.1.0": version: 2.1.0 resolution: "pkg-conf@npm:2.1.0" @@ -5549,6 +6418,53 @@ __metadata: languageName: node linkType: hard +"pkg-fetch@npm:3.4.2": + version: 3.4.2 + resolution: "pkg-fetch@npm:3.4.2" + dependencies: + chalk: ^4.1.2 + fs-extra: ^9.1.0 + https-proxy-agent: ^5.0.0 + node-fetch: ^2.6.6 + progress: ^2.0.3 + semver: ^7.3.5 + tar-fs: ^2.1.1 + yargs: ^16.2.0 + bin: + pkg-fetch: lib-es5/bin.js + checksum: e0f73cedf6cb8882e4d998700031443e6542d213f9817d66deb03fb89c122ca7f7505f11401f85a760a2d3951f9b793d0f78782be220c46c56ccf70f9915812a + languageName: node + linkType: hard + +"pkg@npm:5.8.1": + version: 5.8.1 + resolution: "pkg@npm:5.8.1" + dependencies: + "@babel/generator": 7.18.2 + "@babel/parser": 7.18.4 + "@babel/types": 7.19.0 + chalk: ^4.1.2 + fs-extra: ^9.1.0 + globby: ^11.1.0 + into-stream: ^6.0.0 + is-core-module: 2.9.0 + minimist: ^1.2.6 + multistream: ^4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: ^1.22.0 + stream-meter: ^1.0.4 + peerDependencies: + node-notifier: ">=9.0.1" + peerDependenciesMeta: + node-notifier: + optional: true + bin: + pkg: lib-es5/bin.js + checksum: 5e750e716c3426706ea1fbd26832faf6a3ab8376b99f20aeb9c40fd48ad48e7b51375cd077b77669f3bfbefee69cc8111f49e0ca39e353fd0fc2dff95a57f822 + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.10": version: 6.0.13 resolution: "postcss-selector-parser@npm:6.0.13" @@ -5559,6 +6475,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:7.1.1": + version: 7.1.1 + resolution: "prebuild-install@npm:7.1.1" + dependencies: + detect-libc: ^2.0.0 + expand-template: ^2.0.3 + github-from-package: 0.0.0 + minimist: ^1.2.3 + mkdirp-classic: ^0.5.3 + napi-build-utils: ^1.0.1 + node-abi: ^3.3.0 + pump: ^3.0.0 + rc: ^1.2.7 + simple-get: ^4.0.0 + tar-fs: ^2.0.0 + tunnel-agent: ^0.6.0 + bin: + prebuild-install: bin.js + checksum: dbf96d0146b6b5827fc8f67f72074d2e19c69628b9a7a0a17d0fad1bf37e9f06922896972e074197fc00a52eae912993e6ef5a0d471652f561df5cb516f3f467 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -5598,6 +6536,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^2.0.0": + version: 2.2.0 + resolution: "process-warning@npm:2.2.0" + checksum: 394ae451c2622ee7d014a7196d36658fc1a5d5cc9f3bfeb54aadd5b77fcfecc89a30a25db259ae76ff49fde3f3f3dd7031dcdfb4da2e5445dac795549352e5d0 + languageName: node + linkType: hard + "process@npm:^0.11.10": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -5605,6 +6550,13 @@ __metadata: languageName: node linkType: hard +"progress@npm:^2.0.3": + version: 2.0.3 + resolution: "progress@npm:2.0.3" + checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 + languageName: node + linkType: hard + "promise-all-reject-late@npm:^1.0.0": version: 1.0.1 resolution: "promise-all-reject-late@npm:1.0.1" @@ -5652,6 +6604,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: ^1.1.0 + once: ^1.3.1 + checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + languageName: node + linkType: hard + "punycode@npm:^2.1.0": version: 2.3.0 resolution: "punycode@npm:2.3.0" @@ -5682,6 +6644,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -5689,7 +6658,14 @@ __metadata: languageName: node linkType: hard -"rc@npm:^1.2.8": +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + +"rc@npm:^1.2.7, rc@npm:^1.2.8": version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: @@ -5810,7 +6786,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -5821,7 +6797,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.2, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.2, readable-stream@npm:^2.1.4, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -5836,7 +6812,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.1.0": +"readable-stream@npm:^4.0.0, readable-stream@npm:^4.1.0": version: 4.4.0 resolution: "readable-stream@npm:4.4.0" dependencies: @@ -5848,6 +6824,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: fa060f19f2f447adf678d1376928c76379dce5f72bd334da301685ca6cdcb7b11356813332cc243c88470796bc2e2b1e2917fc10df9143dd93c2ea608694971d + languageName: node + linkType: hard + "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -5876,6 +6859,13 @@ __metadata: languageName: node linkType: hard +"reflect-metadata@npm:0.1.13": + version: 0.1.13 + resolution: "reflect-metadata@npm:0.1.13" + checksum: 798d379a7b6f6455501145419505c97dd11cbc23857a386add2b9ef15963ccf15a48d9d15507afe01d4cd74116df8a213247200bac00320bd7c11ddeaa5e8fb4 + languageName: node + linkType: hard + "regexp.prototype.flags@npm:^1.4.3": version: 1.5.0 resolution: "regexp.prototype.flags@npm:1.5.0" @@ -5903,6 +6893,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.2.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -5924,7 +6921,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.22.1": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1": version: 1.22.3 resolution: "resolve@npm:1.22.3" dependencies: @@ -5937,7 +6934,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.3 resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" dependencies: @@ -5950,6 +6947,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^3.0.0": + version: 3.0.0 + resolution: "responselike@npm:3.0.0" + dependencies: + lowercase-keys: ^3.0.0 + checksum: e0cc9be30df4f415d6d83cdede3c5c887cd4a73e7cc1708bcaab1d50a28d15acb68460ac5b02bcc55a42f3d493729c8856427dcf6e57e6e128ad05cba4cfb95e + languageName: node + linkType: hard + "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -6019,6 +7025,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -6026,13 +7039,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -6044,6 +7050,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.3.1": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -6051,6 +7064,13 @@ __metadata: languageName: node linkType: hard +"secure-json-parse@npm:^2.4.0": + version: 2.7.0 + resolution: "secure-json-parse@npm:2.7.0" + checksum: d9d7d5a01fc6db6115744ba23cf9e67ecfe8c524d771537c062ee05ad5c11b64c730bc58c7f33f60bd6877f96b86f0ceb9ea29644e4040cb757f6912d4dd6737 + languageName: node + linkType: hard + "semantic-release@npm:21.0.3": version: 21.0.3 resolution: "semantic-release@npm:21.0.3" @@ -6114,16 +7134,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1": +"semver@npm:7.5.1, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.1": version: 7.5.1 resolution: "semver@npm:7.5.1" dependencies: @@ -6134,6 +7145,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^6.0.0, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -6242,6 +7262,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 4d211042cc3d73a718c21ac6c4e7d7a0363e184be6a5ad25c8a1502e49df6d0a0253979e3d50dbdd3f60ef6c6c58d756b5d66ac1e05cda9cacd2e9fc59e3876a + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: ^6.0.0 + once: ^1.3.1 + simple-concat: ^1.0.0 + checksum: e4132fd27cf7af230d853fa45c1b8ce900cb430dd0a3c6d3829649fe4f2b26574c803698076c4006450efb0fad2ba8c5455fbb5755d4b0a5ec42d4f12b31d27e + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -6316,7 +7354,26 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.6.1": +"sonic-boom@npm:^3.0.0, sonic-boom@npm:^3.1.0": + version: 3.3.0 + resolution: "sonic-boom@npm:3.3.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: 4a290dd0f3edf49894bb72c631ee304dc3f9be0752c43d516808a365f341821f5cf49997c80ee7c0e67167e0e5131dc71afe7c58812858eb965d6b9746c0cac7 + languageName: node + linkType: hard + +"source-map-support@npm:^0.5.21": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0, source-map@npm:^0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -6373,6 +7430,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + "split2@npm:~1.0.0": version: 1.0.0 resolution: "split2@npm:1.0.0" @@ -6419,6 +7483,15 @@ __metadata: languageName: node linkType: hard +"stream-meter@npm:^1.0.4": + version: 1.0.4 + resolution: "stream-meter@npm:1.0.4" + dependencies: + readable-stream: ^2.1.4 + checksum: a732f7ede9dadd6214083aaf4e3014d664498a56b91cdbc4e6abae59ec8ae507883f58f1f3ca7a939cdb9cc8e2320997241191e9fb8c7717f3fad9ca8cb5dc46 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -6624,7 +7697,32 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.1.13, tar@npm:^6.1.14, tar@npm:^6.1.2": +"tar-fs@npm:^2.0.0, tar-fs@npm:^2.1.1": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: ^1.1.1 + mkdirp-classic: ^0.5.2 + pump: ^3.0.0 + tar-stream: ^2.1.4 + checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: ^4.0.3 + end-of-stream: ^1.4.1 + fs-constants: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + languageName: node + linkType: hard + +"tar@npm:6.1.15, tar@npm:^6.1.11, tar@npm:^6.1.13, tar@npm:^6.1.14, tar@npm:^6.1.2": version: 6.1.15 resolution: "tar@npm:6.1.15" dependencies: @@ -6671,6 +7769,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^2.0.0": + version: 2.3.0 + resolution: "thread-stream@npm:2.3.0" + dependencies: + real-require: ^0.2.0 + checksum: e9ea58f9f36320165b41c2aae5c439bf68bd3575eb533c458483d8b290e31d519979e351408c7d6e248711611434332c2a3aae2165650b028cc3eb9b1052ac16 + languageName: node + linkType: hard + "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -6711,6 +7818,13 @@ __metadata: languageName: node linkType: hard +"to-fast-properties@npm:^2.0.0": + version: 2.0.0 + resolution: "to-fast-properties@npm:2.0.0" + checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -6785,6 +7899,23 @@ __metadata: languageName: node linkType: hard +"tsx@npm:3.12.7": + version: 3.12.7 + resolution: "tsx@npm:3.12.7" + dependencies: + "@esbuild-kit/cjs-loader": ^2.4.2 + "@esbuild-kit/core-utils": ^3.0.0 + "@esbuild-kit/esm-loader": ^2.5.5 + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.js + checksum: ddec149ad263e5c75fc8fde5c6ba7ec2ee390934c0a2e2c23897bacab83bc8c665955a23b608a19c42f49c14a7362cf74ad793b52cc94eda684be5c2c13fdb4d + languageName: node + linkType: hard + "tuf-js@npm:^1.1.3": version: 1.1.6 resolution: "tuf-js@npm:1.1.6" @@ -6796,6 +7927,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: ^5.0.1 + checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 + languageName: node + linkType: hard + "tunnel@npm:^0.0.6": version: 0.0.6 resolution: "tunnel@npm:0.0.6" @@ -6803,7 +7943,7 @@ __metadata: languageName: node linkType: hard -"typanion@npm:^3.8.0": +"typanion@npm:3.12.1, typanion@npm:^3.8.0": version: 3.12.1 resolution: "typanion@npm:3.12.1" checksum: a2e26fa216f8a1dbd2ffbaacb75b1e2dc042a0356e9702fba05a968cad95d9f661b24e37f6c6d8c3adad2c8582c99fca4826ff26a2d07cd2ae617ea87e6187eb @@ -6847,7 +7987,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.8.1": +"type-fest@npm:^0.8.0, type-fest@npm:^0.8.1": version: 0.8.1 resolution: "type-fest@npm:0.8.1" checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 @@ -7238,7 +8378,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 @@ -7252,6 +8392,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: ^7.0.2 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.0 + y18n: ^5.0.5 + yargs-parser: ^20.2.2 + checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 + languageName: node + linkType: hard + "yargs@npm:^17.5.1": version: 17.7.2 resolution: "yargs@npm:17.7.2"