@socketsecurity/lib 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/abort.js.map +2 -2
- package/dist/argv/parse.js.map +2 -2
- package/dist/bin.js +1 -4
- package/dist/bin.js.map +2 -2
- package/dist/cacache.d.ts +0 -2
- package/dist/cacache.js +0 -1
- package/dist/cacache.js.map +2 -2
- package/dist/cache-with-ttl.js.map +2 -2
- package/dist/dlx.js.map +2 -2
- package/dist/external/@yarnpkg/extensions.d.ts +0 -1
- package/dist/external/cacache.d.ts +0 -7
- package/dist/external/debug.d.ts +0 -3
- package/dist/external/fast-sort.d.ts +0 -1
- package/dist/external/libnpmpack.d.ts +0 -1
- package/dist/external/make-fetch-happen.d.ts +0 -1
- package/dist/external/pacote.d.ts +0 -5
- package/dist/external/semver.d.ts +0 -1
- package/dist/external/validate-npm-package-name.js +1 -1
- package/dist/external/yargs-parser.d.ts +0 -1
- package/dist/external/yoctocolors-cjs.js +1 -1
- package/dist/external/zod.js +9 -9
- package/dist/fs.js.map +2 -2
- package/dist/globs.js.map +2 -2
- package/dist/logger.d.ts +1 -3
- package/dist/logger.js +1 -5
- package/dist/logger.js.map +2 -2
- package/dist/promises.d.ts +1 -1
- package/dist/promises.js +3 -0
- package/dist/promises.js.map +2 -2
- package/dist/signal-exit.js.map +2 -2
- package/dist/sorts.js.map +2 -2
- package/dist/spawn.d.ts +3 -21
- package/dist/spawn.js.map +2 -2
- package/dist/spinner.js.map +2 -2
- package/dist/streams.js.map +2 -2
- package/dist/suppress-warnings.js.map +2 -2
- package/dist/validation/types.d.ts +0 -4
- package/dist/validation/types.js.map +1 -1
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.5] - 2025-10-22
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added support for custom retry delays from onRetry callback
|
|
13
|
+
|
|
14
|
+
## [1.0.4] - 2025-10-21
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Fixed external dependency paths in root-level source files (corrected require paths from `../external/` to `./external/` in bin, cacache, fs, globs, spawn, spinner, and streams modules)
|
|
19
|
+
|
|
8
20
|
## [1.0.3] - 2025-10-21
|
|
9
21
|
|
|
10
22
|
### Fixed
|
package/dist/abort.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/abort.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Abort signal utilities.\n */\n\n/**\n * Create a composite AbortSignal from multiple signals.\n */\nexport function createCompositeAbortSignal(\n ...signals: Array<AbortSignal | null | undefined>\n): AbortSignal {\n const validSignals = signals.filter(s => s != null) as AbortSignal[]\n\n if (validSignals.length === 0) {\n return new AbortController().signal\n }\n\n if (validSignals.length === 1) {\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,8BACX,SACU;AACb,QAAM,eAAe,QAAQ,OAAO,OAAK,KAAK,IAAI;AAElD,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,IAAI,gBAAgB,EAAE;AAAA,EAC/B;AAEA,MAAI,aAAa,WAAW,GAAG;
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Abort signal utilities.\n */\n\n/**\n * Create a composite AbortSignal from multiple signals.\n */\nexport function createCompositeAbortSignal(\n ...signals: Array<AbortSignal | null | undefined>\n): AbortSignal {\n const validSignals = signals.filter(s => s != null) as AbortSignal[]\n\n if (validSignals.length === 0) {\n return new AbortController().signal\n }\n\n if (validSignals.length === 1) {\n return validSignals[0]!\n }\n\n const controller = new AbortController()\n\n for (const signal of validSignals) {\n if (signal.aborted) {\n controller.abort()\n return controller.signal\n }\n signal.addEventListener('abort', () => controller.abort(), { once: true })\n }\n\n return controller.signal\n}\n\n/**\n * Create an AbortSignal that triggers after a timeout.\n */\nexport function createTimeoutSignal(ms: number): AbortSignal {\n if (typeof ms !== 'number' || Number.isNaN(ms)) {\n throw new TypeError('timeout must be a number')\n }\n if (!Number.isFinite(ms)) {\n throw new TypeError('timeout must be a finite number')\n }\n if (ms <= 0) {\n throw new TypeError('timeout must be a positive number')\n }\n const controller = new AbortController()\n setTimeout(() => controller.abort(), ms)\n return controller.signal\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,SAAS,8BACX,SACU;AACb,QAAM,eAAe,QAAQ,OAAO,OAAK,KAAK,IAAI;AAElD,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,IAAI,gBAAgB,EAAE;AAAA,EAC/B;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,aAAa,CAAC;AAAA,EACvB;AAEA,QAAM,aAAa,IAAI,gBAAgB;AAEvC,aAAW,UAAU,cAAc;AACjC,QAAI,OAAO,SAAS;AAClB,iBAAW,MAAM;AACjB,aAAO,WAAW;AAAA,IACpB;AACA,WAAO,iBAAiB,SAAS,MAAM,WAAW,MAAM,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAC3E;AAEA,SAAO,WAAW;AACpB;AAKO,SAAS,oBAAoB,IAAyB;AAC3D,MAAI,OAAO,OAAO,YAAY,OAAO,MAAM,EAAE,GAAG;AAC9C,UAAM,IAAI,UAAU,0BAA0B;AAAA,EAChD;AACA,MAAI,CAAC,OAAO,SAAS,EAAE,GAAG;AACxB,UAAM,IAAI,UAAU,iCAAiC;AAAA,EACvD;AACA,MAAI,MAAM,GAAG;AACX,UAAM,IAAI,UAAU,mCAAmC;AAAA,EACzD;AACA,QAAM,aAAa,IAAI,gBAAgB;AACvC,aAAW,MAAM,WAAW,MAAM,GAAG,EAAE;AACvC,SAAO,WAAW;AACpB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/argv/parse.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/argv/parse.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Argument parsing utilities for CLI applications.\n * Uses yargs-parser internally for robust argument parsing with Node.js parseArgs-compatible API.\n */\n\nimport yargsParser from '../external/yargs-parser'\n\n/**\n * Yargs parser options interface.\n */\ninterface YargsOptions {\n // Array of option names that should be treated as booleans.\n boolean?: string[] | undefined\n // Array of option names that should be treated as strings.\n string?: string[] | undefined\n // Array of option names that should accept multiple values.\n array?: string[] | undefined\n // Map of short aliases to full option names.\n alias?: Record<string, string | string[]> | undefined\n // Default values for options.\n default?: Record<string, unknown> | undefined\n // Transform functions to coerce parsed values.\n coerce?: Record<string, (value: unknown) => unknown> | undefined\n // Whether to treat unknown options as positional arguments.\n 'unknown-options-as-args'?: boolean | undefined\n // Whether to parse numeric strings as numbers.\n 'parse-numbers'?: boolean | undefined\n // Whether to parse positional arguments as numbers.\n 'parse-positional-numbers'?: boolean | undefined\n // Whether to support --no-<option> negation for booleans.\n 'boolean-negation'?: boolean | undefined\n // Whether to stop parsing options after the first positional.\n 'halt-at-non-option'?: boolean | undefined\n // Advanced yargs-parser configuration options.\n configuration?: Record<string, boolean | string> | undefined\n // Whether to throw on unknown options.\n strict?: boolean | undefined\n}\n\n/**\n * Yargs parser result interface.\n */\ninterface YargsArguments extends Record<string, unknown> {\n _: string[]\n $0?: string\n}\n\n/**\n * Options for configuring argument parsing, similar to Node.js util.parseArgs.\n */\nexport interface ParseArgsOptionsConfig {\n // Whether the option accepts multiple values (array).\n multiple?: boolean | undefined\n // Short alias for the option (single character).\n short?: string | undefined\n // Type of the option value.\n type?: 'boolean' | 'string' | undefined\n // Default value for the option.\n default?: unknown | undefined\n // Transform function to coerce parsed values.\n coerce?: (value: unknown) => unknown | undefined\n}\n\n/**\n * Configuration object for parseArgs function, similar to Node.js util.parseArgs.\n */\nexport interface ParseArgsConfig {\n // Command-line arguments to parse (defaults to process.argv.slice(2)).\n args?: readonly string[] | undefined\n // Options configuration object.\n options?: Record<string, ParseArgsOptionsConfig> | undefined\n // Whether to throw on unknown options (default: true).\n strict?: boolean | undefined\n // Whether to populate tokens array (not implemented, for API compatibility).\n tokens?: boolean | undefined\n // Whether to allow positional arguments after options.\n allowPositionals?: boolean | undefined\n // Whether to allow negative numbers as option values.\n allowNegative?: boolean | undefined\n // Advanced yargs-parser configuration passthrough.\n configuration?: Record<string, boolean | string> | undefined\n}\n\n/**\n * Result of parsing command-line arguments.\n */\nexport interface ParsedArgs<T = Record<string, unknown>> {\n // Parsed option values.\n values: T\n // Positional arguments (non-option arguments).\n positionals: string[]\n // Raw parsed arguments object from yargs-parser.\n raw: YargsArguments\n}\n\n/**\n * Parse command-line arguments with a Node.js parseArgs-compatible API.\n * Uses yargs-parser internally for robust argument parsing.\n */\nexport function parseArgs<T = Record<string, unknown>>(\n config: ParseArgsConfig = {},\n): ParsedArgs<T> {\n const {\n allowNegative = false,\n allowPositionals = true,\n args = process.argv.slice(2),\n configuration,\n options = {},\n strict = true,\n } = config\n\n // Convert parseArgs options to yargs-parser options.\n const yargsOptions: YargsOptions = {\n // Arrays of option names to treat as specific types.\n boolean: [],\n string: [],\n array: [],\n // Maps for aliases, defaults, and transformations.\n alias: {},\n default: {},\n coerce: {},\n 'unknown-options-as-args': !strict,\n 'parse-numbers': false,\n 'parse-positional-numbers': false,\n 'boolean-negation': !allowNegative,\n 'halt-at-non-option': !allowPositionals,\n configuration: {\n // Enable kebab-case to camelCase conversion (e.g., --temp-dir \u2192 tempDir).\n 'camel-case-expansion': true,\n // Disable dot notation to avoid confusing nested property parsing.\n 'dot-notation': false,\n // Convert duplicate arguments into arrays automatically.\n 'duplicate-arguments-array': true,\n // Flatten nested arrays from duplicate arguments for cleaner output.\n 'flatten-duplicate-arrays': true,\n // Populate the '--' key with arguments after the -- separator.\n 'populate--': true,\n // Allow short option grouping like -abc for -a -b -c.\n 'short-option-groups': true,\n // Keep aliased keys in the result for flexibility.\n 'strip-aliased': false,\n // Keep both kebab-case and camelCase keys for flexibility.\n 'strip-dashed': false,\n ...configuration,\n },\n }\n\n // Process each option configuration.\n for (const { 0: key, 1: optionConfig } of Object.entries(options)) {\n const {\n coerce,\n default: defaultValue,\n multiple,\n short,\n type,\n } = optionConfig\n\n // Set the option type.\n if (type === 'boolean') {\n yargsOptions.boolean?.push(key)\n } else if (type === 'string') {\n yargsOptions.string?.push(key)\n }\n\n // Handle multiple values (arrays).\n if (multiple) {\n yargsOptions.array?.push(key)\n }\n\n // Set short alias.\n if (short) {\n ;(yargsOptions.alias as Record<string, string>)[short] = key\n }\n\n // Set default value.\n if (defaultValue !== undefined) {\n ;(yargsOptions.default as Record<string, unknown>)[key] = defaultValue\n }\n\n // Set coerce function.\n if (coerce) {\n ;(yargsOptions.coerce as Record<string, unknown>)[key] = coerce\n }\n }\n\n // Parse the arguments.\n const parsed = yargsParser(args as string[], yargsOptions)\n\n // Extract positional arguments.\n const positionals = parsed._ || []\n\n // Remove the positionals array from values to match Node.js parseArgs behavior.\n const { _, ...values } = parsed\n\n // Ensure positionals are strings.\n const stringPositionals = positionals.map(String)\n\n return {\n values: values as T,\n positionals: stringPositionals,\n raw: parsed as YargsArguments,\n }\n}\n\n/**\n * Parse command-line arguments with Socket defaults.\n * Provides sensible defaults for Socket CLI applications.\n */\nexport function parseArgsWithDefaults<T = Record<string, unknown>>(\n config: ParseArgsConfig = {},\n): ParsedArgs<T> {\n return parseArgs<T>({\n strict: false,\n allowPositionals: true,\n ...config,\n })\n}\n\n/**\n * Common parseArgs configuration for Socket registry scripts.\n */\nexport const commonParseArgsConfig: ParseArgsConfig = {\n options: {\n force: {\n type: 'boolean',\n short: 'f',\n default: false,\n },\n quiet: {\n type: 'boolean',\n short: 'q',\n default: false,\n },\n },\n strict: false,\n}\n\n/**\n * Extract positional arguments from process.argv.\n * Useful for commands that accept file paths or other positional parameters.\n */\nexport function getPositionalArgs(startIndex = 2): string[] {\n const args = process.argv.slice(startIndex)\n const positionals: string[] = []\n let i = 0\n\n while (i < args.length) {\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,0BAAwB;AA8FjB,SAAS,UACd,SAA0B,CAAC,GACZ;AACf,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,OAAO,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC3B;AAAA,IACA,UAAU,CAAC;AAAA,IACX,SAAS;AAAA,EACX,IAAI;AAGJ,QAAM,eAA6B;AAAA;AAAA,IAEjC,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,OAAO,CAAC;AAAA;AAAA,IAER,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,2BAA2B,CAAC;AAAA,IAC5B,iBAAiB;AAAA,IACjB,4BAA4B;AAAA,IAC5B,oBAAoB,CAAC;AAAA,IACrB,sBAAsB,CAAC;AAAA,IACvB,eAAe;AAAA;AAAA,MAEb,wBAAwB;AAAA;AAAA,MAExB,gBAAgB;AAAA;AAAA,MAEhB,6BAA6B;AAAA;AAAA,MAE7B,4BAA4B;AAAA;AAAA,MAE5B,cAAc;AAAA;AAAA,MAEd,uBAAuB;AAAA;AAAA,MAEvB,iBAAiB;AAAA;AAAA,MAEjB,gBAAgB;AAAA,MAChB,GAAG;AAAA,IACL;AAAA,EACF;AAGA,aAAW,EAAE,GAAG,KAAK,GAAG,aAAa,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjE,UAAM;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,QAAI,SAAS,WAAW;AACtB,mBAAa,SAAS,KAAK,GAAG;AAAA,IAChC,WAAW,SAAS,UAAU;AAC5B,mBAAa,QAAQ,KAAK,GAAG;AAAA,IAC/B;AAGA,QAAI,UAAU;AACZ,mBAAa,OAAO,KAAK,GAAG;AAAA,IAC9B;AAGA,QAAI,OAAO;AACT;AAAC,MAAC,aAAa,MAAiC,KAAK,IAAI;AAAA,IAC3D;AAGA,QAAI,iBAAiB,QAAW;AAC9B;AAAC,MAAC,aAAa,QAAoC,GAAG,IAAI;AAAA,IAC5D;AAGA,QAAI,QAAQ;AACV;AAAC,MAAC,aAAa,OAAmC,GAAG,IAAI;AAAA,IAC3D;AAAA,EACF;AAGA,QAAM,aAAS,oBAAAA,SAAY,MAAkB,YAAY;AAGzD,QAAM,cAAc,OAAO,KAAK,CAAC;AAGjC,QAAM,EAAE,GAAG,GAAG,OAAO,IAAI;AAGzB,QAAM,oBAAoB,YAAY,IAAI,MAAM;AAEhD,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb,KAAK;AAAA,EACP;AACF;AAMO,SAAS,sBACd,SAA0B,CAAC,GACZ;AACf,SAAO,UAAa;AAAA,IAClB,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,GAAG;AAAA,EACL,CAAC;AACH;AAKO,MAAM,wBAAyC;AAAA,EACpD,SAAS;AAAA,IACP,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,QAAQ;AACV;AAMO,SAAS,kBAAkB,aAAa,GAAa;AAC1D,QAAM,OAAO,QAAQ,KAAK,MAAM,UAAU;AAC1C,QAAM,cAAwB,CAAC;AAC/B,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,QAAQ;
|
|
4
|
+
"sourcesContent": ["/**\n * Argument parsing utilities for CLI applications.\n * Uses yargs-parser internally for robust argument parsing with Node.js parseArgs-compatible API.\n */\n\nimport yargsParser from '../external/yargs-parser'\n\n/**\n * Yargs parser options interface.\n */\ninterface YargsOptions {\n // Array of option names that should be treated as booleans.\n boolean?: string[] | undefined\n // Array of option names that should be treated as strings.\n string?: string[] | undefined\n // Array of option names that should accept multiple values.\n array?: string[] | undefined\n // Map of short aliases to full option names.\n alias?: Record<string, string | string[]> | undefined\n // Default values for options.\n default?: Record<string, unknown> | undefined\n // Transform functions to coerce parsed values.\n coerce?: Record<string, (value: unknown) => unknown> | undefined\n // Whether to treat unknown options as positional arguments.\n 'unknown-options-as-args'?: boolean | undefined\n // Whether to parse numeric strings as numbers.\n 'parse-numbers'?: boolean | undefined\n // Whether to parse positional arguments as numbers.\n 'parse-positional-numbers'?: boolean | undefined\n // Whether to support --no-<option> negation for booleans.\n 'boolean-negation'?: boolean | undefined\n // Whether to stop parsing options after the first positional.\n 'halt-at-non-option'?: boolean | undefined\n // Advanced yargs-parser configuration options.\n configuration?: Record<string, boolean | string> | undefined\n // Whether to throw on unknown options.\n strict?: boolean | undefined\n}\n\n/**\n * Yargs parser result interface.\n */\ninterface YargsArguments extends Record<string, unknown> {\n _: string[]\n $0?: string\n}\n\n/**\n * Options for configuring argument parsing, similar to Node.js util.parseArgs.\n */\nexport interface ParseArgsOptionsConfig {\n // Whether the option accepts multiple values (array).\n multiple?: boolean | undefined\n // Short alias for the option (single character).\n short?: string | undefined\n // Type of the option value.\n type?: 'boolean' | 'string' | undefined\n // Default value for the option.\n default?: unknown | undefined\n // Transform function to coerce parsed values.\n coerce?: (value: unknown) => unknown | undefined\n}\n\n/**\n * Configuration object for parseArgs function, similar to Node.js util.parseArgs.\n */\nexport interface ParseArgsConfig {\n // Command-line arguments to parse (defaults to process.argv.slice(2)).\n args?: readonly string[] | undefined\n // Options configuration object.\n options?: Record<string, ParseArgsOptionsConfig> | undefined\n // Whether to throw on unknown options (default: true).\n strict?: boolean | undefined\n // Whether to populate tokens array (not implemented, for API compatibility).\n tokens?: boolean | undefined\n // Whether to allow positional arguments after options.\n allowPositionals?: boolean | undefined\n // Whether to allow negative numbers as option values.\n allowNegative?: boolean | undefined\n // Advanced yargs-parser configuration passthrough.\n configuration?: Record<string, boolean | string> | undefined\n}\n\n/**\n * Result of parsing command-line arguments.\n */\nexport interface ParsedArgs<T = Record<string, unknown>> {\n // Parsed option values.\n values: T\n // Positional arguments (non-option arguments).\n positionals: string[]\n // Raw parsed arguments object from yargs-parser.\n raw: YargsArguments\n}\n\n/**\n * Parse command-line arguments with a Node.js parseArgs-compatible API.\n * Uses yargs-parser internally for robust argument parsing.\n */\nexport function parseArgs<T = Record<string, unknown>>(\n config: ParseArgsConfig = {},\n): ParsedArgs<T> {\n const {\n allowNegative = false,\n allowPositionals = true,\n args = process.argv.slice(2),\n configuration,\n options = {},\n strict = true,\n } = config\n\n // Convert parseArgs options to yargs-parser options.\n const yargsOptions: YargsOptions = {\n // Arrays of option names to treat as specific types.\n boolean: [],\n string: [],\n array: [],\n // Maps for aliases, defaults, and transformations.\n alias: {},\n default: {},\n coerce: {},\n 'unknown-options-as-args': !strict,\n 'parse-numbers': false,\n 'parse-positional-numbers': false,\n 'boolean-negation': !allowNegative,\n 'halt-at-non-option': !allowPositionals,\n configuration: {\n // Enable kebab-case to camelCase conversion (e.g., --temp-dir \u2192 tempDir).\n 'camel-case-expansion': true,\n // Disable dot notation to avoid confusing nested property parsing.\n 'dot-notation': false,\n // Convert duplicate arguments into arrays automatically.\n 'duplicate-arguments-array': true,\n // Flatten nested arrays from duplicate arguments for cleaner output.\n 'flatten-duplicate-arrays': true,\n // Populate the '--' key with arguments after the -- separator.\n 'populate--': true,\n // Allow short option grouping like -abc for -a -b -c.\n 'short-option-groups': true,\n // Keep aliased keys in the result for flexibility.\n 'strip-aliased': false,\n // Keep both kebab-case and camelCase keys for flexibility.\n 'strip-dashed': false,\n ...configuration,\n },\n }\n\n // Process each option configuration.\n for (const { 0: key, 1: optionConfig } of Object.entries(options)) {\n const {\n coerce,\n default: defaultValue,\n multiple,\n short,\n type,\n } = optionConfig\n\n // Set the option type.\n if (type === 'boolean') {\n yargsOptions.boolean?.push(key)\n } else if (type === 'string') {\n yargsOptions.string?.push(key)\n }\n\n // Handle multiple values (arrays).\n if (multiple) {\n yargsOptions.array?.push(key)\n }\n\n // Set short alias.\n if (short) {\n ;(yargsOptions.alias as Record<string, string>)[short] = key\n }\n\n // Set default value.\n if (defaultValue !== undefined) {\n ;(yargsOptions.default as Record<string, unknown>)[key] = defaultValue\n }\n\n // Set coerce function.\n if (coerce) {\n ;(yargsOptions.coerce as Record<string, unknown>)[key] = coerce\n }\n }\n\n // Parse the arguments.\n const parsed = yargsParser(args as string[], yargsOptions)\n\n // Extract positional arguments.\n const positionals = parsed._ || []\n\n // Remove the positionals array from values to match Node.js parseArgs behavior.\n const { _, ...values } = parsed\n\n // Ensure positionals are strings.\n const stringPositionals = positionals.map(String)\n\n return {\n values: values as T,\n positionals: stringPositionals,\n raw: parsed as YargsArguments,\n }\n}\n\n/**\n * Parse command-line arguments with Socket defaults.\n * Provides sensible defaults for Socket CLI applications.\n */\nexport function parseArgsWithDefaults<T = Record<string, unknown>>(\n config: ParseArgsConfig = {},\n): ParsedArgs<T> {\n return parseArgs<T>({\n strict: false,\n allowPositionals: true,\n ...config,\n })\n}\n\n/**\n * Common parseArgs configuration for Socket registry scripts.\n */\nexport const commonParseArgsConfig: ParseArgsConfig = {\n options: {\n force: {\n type: 'boolean',\n short: 'f',\n default: false,\n },\n quiet: {\n type: 'boolean',\n short: 'q',\n default: false,\n },\n },\n strict: false,\n}\n\n/**\n * Extract positional arguments from process.argv.\n * Useful for commands that accept file paths or other positional parameters.\n */\nexport function getPositionalArgs(startIndex = 2): string[] {\n const args = process.argv.slice(startIndex)\n const positionals: string[] = []\n let i = 0\n\n while (i < args.length) {\n const arg = args[i]!\n // Stop at first flag\n if (arg.startsWith('-')) {\n break\n }\n positionals.push(arg)\n i++\n }\n\n return positionals\n}\n\n/**\n * Check if a specific flag is present in argv.\n */\nexport function hasFlag(flag: string, argv = process.argv): boolean {\n const flagVariants = [\n `--${flag}`,\n // Short flag.\n `-${flag.charAt(0)}`,\n ]\n return flagVariants.some(variant => argv.includes(variant))\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["yargsParser"]
|
|
7
7
|
}
|
package/dist/bin.js
CHANGED
|
@@ -69,10 +69,7 @@ async function execBin(binPath, args, options) {
|
|
|
69
69
|
error.code = "ENOENT";
|
|
70
70
|
throw error;
|
|
71
71
|
}
|
|
72
|
-
const binCommand = Array.isArray(resolvedPath) ?
|
|
73
|
-
// biome-ignore lint/style/noNonNullAssertion: which always returns non-empty array.
|
|
74
|
-
resolvedPath[0]
|
|
75
|
-
) : resolvedPath;
|
|
72
|
+
const binCommand = Array.isArray(resolvedPath) ? resolvedPath[0] : resolvedPath;
|
|
76
73
|
return await (0, import_spawn.spawn)(binCommand, args ?? [], options);
|
|
77
74
|
}
|
|
78
75
|
async function whichBin(binName, options) {
|
package/dist/bin.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/bin.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Binary path resolution and execution utilities for package managers.\n * Provides cross-platform bin path lookup, command execution, and path normalization.\n */\n\nimport { APPDATA } from '#env/appdata'\nimport { HOME } from '#env/home'\nimport { LOCALAPPDATA } from '#env/localappdata'\nimport { XDG_DATA_HOME } from '#env/xdg-data-home'\n\nimport { readJsonSync } from './fs'\nimport { getOwn } from './objects'\nimport { isPath, normalizePath } from './path'\nimport { spawn } from './spawn'\n\nlet _fs: typeof import('node:fs') | undefined\n/**\n * Lazily load the fs module to avoid Webpack errors.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getFs() {\n if (_fs === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _fs = /*@__PURE__*/ require('node:fs')\n }\n // biome-ignore lint/style/noNonNullAssertion: Initialized above.\n return _fs!\n}\n\nlet _path: typeof import('node:path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n // biome-ignore lint/style/noNonNullAssertion: Initialized above.\n return _path!\n}\n\nlet _which: typeof import('which') | undefined\n/**\n * Lazily load the which module for finding executables.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getWhich() {\n if (_which === undefined) {\n _which = /*@__PURE__*/ require('../external/which')\n }\n // biome-ignore lint/style/noNonNullAssertion: Initialized above.\n return _which!\n}\n\n/**\n * Execute a binary with the given arguments.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function execBin(\n binPath: string,\n args?: string[],\n options?: import('./spawn').SpawnOptions,\n) {\n // Resolve the binary path.\n const resolvedPath = isPath(binPath)\n ? resolveBinPathSync(binPath)\n : await whichBin(binPath)\n\n if (!resolvedPath) {\n const error = new Error(`Binary not found: ${binPath}`) as Error & {\n code: string\n }\n error.code = 'ENOENT'\n throw error\n }\n\n // Execute the binary directly.\n const binCommand = Array.isArray(resolvedPath)\n ? // biome-ignore lint/style/noNonNullAssertion: which always returns non-empty array.\n resolvedPath[0]!\n : resolvedPath\n return await spawn(binCommand, args ?? [], options)\n}\n\n/**\n * Find and resolve a binary in the system PATH asynchronously.\n * @template {import('which').Options} T\n * @throws {Error} If the binary is not found and nothrow is false.\n */\nexport async function whichBin(\n binName: string,\n options?: import('which').Options,\n): Promise<string | string[] | undefined> {\n const which = getWhich()\n // Default to nothrow: true if not specified to return undefined instead of throwing\n const opts = { nothrow: true, ...options }\n // Depending on options `which` may throw if `binName` is not found.\n // With nothrow: true, it returns null when `binName` is not found.\n const result = await which?.(binName, opts)\n\n // When 'all: true' is specified, ensure we always return an array.\n if (options?.all) {\n const paths = Array.isArray(result)\n ? result\n : typeof result === 'string'\n ? [result]\n : undefined\n // If all is true and we have paths, resolve each one.\n return paths?.length ? paths.map(p => resolveBinPathSync(p)) : paths\n }\n\n // If result is undefined (binary not found), return undefined\n if (!result) {\n return undefined\n }\n\n return resolveBinPathSync(result)\n}\n\n/**\n * Find and resolve a binary in the system PATH synchronously.\n * @template {import('which').Options} T\n * @throws {Error} If the binary is not found and nothrow is false.\n */\nexport function whichBinSync(\n binName: string,\n options?: import('which').Options,\n): string | string[] | undefined {\n // Default to nothrow: true if not specified to return undefined instead of throwing\n const opts = { nothrow: true, ...options }\n // Depending on options `which` may throw if `binName` is not found.\n // With nothrow: true, it returns null when `binName` is not found.\n const result = getWhich()?.sync(binName, opts)\n\n // When 'all: true' is specified, ensure we always return an array.\n if (getOwn(options, 'all')) {\n const paths = Array.isArray(result)\n ? result\n : typeof result === 'string'\n ? [result]\n : undefined\n // If all is true and we have paths, resolve each one.\n return paths?.length ? paths.map(p => resolveBinPathSync(p)) : paths\n }\n\n // If result is undefined (binary not found), return undefined\n if (!result) {\n return undefined\n }\n\n return resolveBinPathSync(result)\n}\n\n/**\n * Check if a directory path contains any shadow bin patterns.\n */\nexport function isShadowBinPath(dirPath: string | undefined): boolean {\n if (!dirPath) {\n return false\n }\n // Check for node_modules/.bin pattern (Unix and Windows)\n const normalized = dirPath.replace(/\\\\/g, '/')\n return normalized.includes('node_modules/.bin')\n}\n\n/**\n * Find the real executable for a binary, bypassing shadow bins.\n */\nexport function findRealBin(\n binName: string,\n commonPaths: string[] = [],\n): string | undefined {\n const fs = getFs()\n const path = getPath()\n const which = getWhich()\n\n // Try common locations first.\n for (const binPath of commonPaths) {\n if (fs?.existsSync(binPath)) {\n return binPath\n }\n }\n\n // Fall back to which.sync if no direct path found.\n const binPath = which?.sync(binName, { nothrow: true })\n if (binPath) {\n const binDir = path?.dirname(binPath)\n\n if (isShadowBinPath(binDir)) {\n // This is likely a shadowed binary, try to find the real one.\n const allPaths = which?.sync(binName, { all: true, nothrow: true }) || []\n // Ensure allPaths is an array.\n const pathsArray = Array.isArray(allPaths)\n ? allPaths\n : typeof allPaths === 'string'\n ? [allPaths]\n : []\n\n for (const altPath of pathsArray) {\n const altDir = path?.dirname(altPath)\n if (!isShadowBinPath(altDir)) {\n return altPath\n }\n }\n }\n return binPath\n }\n // If all else fails, return undefined to indicate binary not found.\n return undefined\n}\n\n/**\n * Find the real npm executable, bypassing any aliases and shadow bins.\n */\nexport function findRealNpm(): string {\n const fs = getFs()\n const path = getPath()\n\n // Try to find npm in the same directory as the node executable.\n const nodeDir = path?.dirname(process.execPath)\n const npmInNodeDir = path?.join(nodeDir, 'npm')\n\n if (fs?.existsSync(npmInNodeDir)) {\n return npmInNodeDir\n }\n\n // Try common npm locations.\n const commonPaths = ['/usr/local/bin/npm', '/usr/bin/npm']\n const result = findRealBin('npm', commonPaths)\n\n // If we found a valid path, return it.\n if (result && fs?.existsSync(result)) {\n return result\n }\n\n // As a last resort, try to use whichBinSync to find npm.\n // This handles cases where npm is installed in non-standard locations.\n const npmPath = whichBinSync('npm', { nothrow: true })\n if (npmPath && typeof npmPath === 'string' && fs?.existsSync(npmPath)) {\n return npmPath\n }\n\n // Return the basic 'npm' and let the system resolve it.\n return 'npm'\n}\n\n/**\n * Find the real pnpm executable, bypassing any aliases and shadow bins.\n */\nexport function findRealPnpm(): string {\n const WIN32 = require('../constants/platform').WIN32\n const path = getPath()\n\n // Try common pnpm locations.\n const commonPaths = WIN32\n ? [\n // Windows common paths.\n path?.join(APPDATA as string, 'npm', 'pnpm.cmd'),\n path?.join(APPDATA as string, 'npm', 'pnpm'),\n path?.join(LOCALAPPDATA as string, 'pnpm', 'pnpm.cmd'),\n path?.join(LOCALAPPDATA as string, 'pnpm', 'pnpm'),\n 'C:\\\\Program Files\\\\nodejs\\\\pnpm.cmd',\n 'C:\\\\Program Files\\\\nodejs\\\\pnpm',\n ].filter(Boolean)\n : [\n // Unix common paths.\n '/usr/local/bin/pnpm',\n '/usr/bin/pnpm',\n path?.join(\n (XDG_DATA_HOME as string) || `${HOME as string}/.local/share`,\n 'pnpm/pnpm',\n ),\n path?.join(HOME as string, '.pnpm/pnpm'),\n ].filter(Boolean)\n\n return findRealBin('pnpm', commonPaths) ?? ''\n}\n\n/**\n * Find the real yarn executable, bypassing any aliases and shadow bins.\n */\nexport function findRealYarn(): string {\n const path = getPath()\n\n // Try common yarn locations.\n const commonPaths = [\n '/usr/local/bin/yarn',\n '/usr/bin/yarn',\n path?.join(HOME as string, '.yarn/bin/yarn'),\n path?.join(HOME as string, '.config/yarn/global/node_modules/.bin/yarn'),\n ].filter(Boolean)\n\n return findRealBin('yarn', commonPaths) ?? ''\n}\n\n/*@__NO_SIDE_EFFECTS__*/\n/**\n * Resolve a binary path to its actual executable file.\n * Handles Windows .cmd wrappers and Unix shell scripts.\n */\nexport function resolveBinPathSync(binPath: string): string {\n const fs = getFs()\n const path = getPath()\n\n // If it's not an absolute path, try to find it in PATH first\n if (!path?.isAbsolute(binPath)) {\n try {\n const resolved = whichBinSync(binPath)\n if (resolved) {\n // biome-ignore lint/style/noParameterAssign: Reassigning for normalization.\n binPath = resolved as string\n }\n } catch {}\n }\n\n // Normalize the path once for consistent pattern matching.\n // biome-ignore lint/style/noParameterAssign: Normalizing path for consistent handling.\n binPath = normalizePath(binPath)\n\n // Handle empty string that normalized to '.' (current directory)\n if (binPath === '.') {\n return binPath\n }\n\n const ext = path?.extname(binPath)\n const extLowered = ext.toLowerCase()\n const basename = path?.basename(binPath, ext)\n const voltaIndex =\n basename === 'node' ? -1 : (/(?<=\\/)\\.volta\\//i.exec(binPath)?.index ?? -1)\n if (voltaIndex !== -1) {\n const voltaPath = binPath.slice(0, voltaIndex)\n const voltaToolsPath = path?.join(voltaPath, 'tools')\n const voltaImagePath = path?.join(voltaToolsPath, 'image')\n const voltaUserPath = path?.join(voltaToolsPath, 'user')\n const voltaPlatform = readJsonSync(\n path?.join(voltaUserPath, 'platform.json'),\n { throws: false },\n ) as\n // biome-ignore lint/suspicious/noExplicitAny: Volta platform config structure is dynamic.\n any\n const voltaNodeVersion = voltaPlatform?.node?.runtime\n const voltaNpmVersion = voltaPlatform?.node?.npm\n let voltaBinPath = ''\n if (basename === 'npm' || basename === 'npx') {\n if (voltaNpmVersion) {\n const relCliPath = `bin/${basename}-cli.js`\n voltaBinPath = path?.join(\n voltaImagePath,\n `npm/${voltaNpmVersion}/${relCliPath}`,\n )\n if (voltaNodeVersion && !fs?.existsSync(voltaBinPath)) {\n voltaBinPath = path?.join(\n voltaImagePath,\n `node/${voltaNodeVersion}/lib/node_modules/npm/${relCliPath}`,\n )\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = ''\n }\n }\n }\n } else {\n const voltaUserBinPath = path?.join(voltaUserPath, 'bin')\n const binInfo = readJsonSync(\n path?.join(voltaUserBinPath, `${basename}.json`),\n { throws: false },\n ) as\n // biome-ignore lint/suspicious/noExplicitAny: Volta bin info structure is dynamic.\n any\n const binPackage = binInfo?.package\n if (binPackage) {\n voltaBinPath = path?.join(\n voltaImagePath,\n `packages/${binPackage}/bin/${basename}`,\n )\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = `${voltaBinPath}.cmd`\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = ''\n }\n }\n }\n }\n if (voltaBinPath) {\n try {\n return normalizePath(fs?.realpathSync.native(voltaBinPath))\n } catch {}\n return voltaBinPath\n }\n }\n const WIN32 = require('../constants/platform').WIN32\n if (WIN32) {\n const hasKnownExt =\n extLowered === '' ||\n extLowered === '.cmd' ||\n extLowered === '.exe' ||\n extLowered === '.ps1'\n const isNpmOrNpx = basename === 'npm' || basename === 'npx'\n const isPnpmOrYarn = basename === 'pnpm' || basename === 'yarn'\n if (hasKnownExt && isNpmOrNpx) {\n // The quick route assumes a bin path like: C:\\Program Files\\nodejs\\npm.cmd\n const quickPath = path?.join(\n path?.dirname(binPath),\n `node_modules/npm/bin/${basename}-cli.js`,\n )\n if (fs?.existsSync(quickPath)) {\n try {\n return fs?.realpathSync.native(quickPath)\n } catch {}\n return quickPath\n }\n }\n let relPath = ''\n if (\n hasKnownExt &&\n // Only parse shell scripts and batch files, not actual executables.\n // .exe files are already executables and don't need path resolution from wrapper scripts.\n extLowered !== '.exe' &&\n // Check if file exists before attempting to read it to avoid ENOENT errors.\n fs?.existsSync(binPath)\n ) {\n const source = fs?.readFileSync(binPath, 'utf8')\n if (isNpmOrNpx) {\n if (extLowered === '.cmd') {\n // \"npm.cmd\" and \"npx.cmd\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm.cmd\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx.cmd\n relPath =\n basename === 'npm'\n ? /(?<=\"NPM_CLI_JS=%~dp0\\\\).*(?=\")/.exec(source)?.[0] || ''\n : /(?<=\"NPX_CLI_JS=%~dp0\\\\).*(?=\")/.exec(source)?.[0] || ''\n } else if (extLowered === '') {\n // Extensionless \"npm\" and \"npx\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx\n relPath =\n basename === 'npm'\n ? /(?<=NPM_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] ||\n ''\n : /(?<=NPX_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] ||\n ''\n } else if (extLowered === '.ps1') {\n // \"npm.ps1\" and \"npx.ps1\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm.ps1\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx.ps1\n relPath =\n basename === 'npm'\n ? /(?<=\\$NPM_CLI_JS=\"\\$PSScriptRoot\\/).*(?=\")/.exec(\n source,\n )?.[0] || ''\n : /(?<=\\$NPX_CLI_JS=\"\\$PSScriptRoot\\/).*(?=\")/.exec(\n source,\n )?.[0] || ''\n }\n } else if (isPnpmOrYarn) {\n if (extLowered === '.cmd') {\n // pnpm.cmd and yarn.cmd can have different formats depending on installation method\n // Common formats include:\n // 1. Setup-pnpm action format: node \"%~dp0\\..\\pnpm\\bin\\pnpm.cjs\" %*\n // 2. npm install -g pnpm format: similar to cmd-shim\n // 3. Standalone installer format: various patterns\n\n // Try setup-pnpm/setup-yarn action format first\n relPath =\n /(?<=node\\s+\")%~dp0\\\\([^\"]+)(?=\"\\s+%\\*)/.exec(source)?.[1] || ''\n\n // Try alternative format: \"%~dp0\\node.exe\" \"%~dp0\\..\\package\\bin\\binary.js\" %*\n if (!relPath) {\n relPath =\n /(?<=\"%~dp0\\\\[^\"]*node[^\"]*\"\\s+\")%~dp0\\\\([^\"]+)(?=\"\\s+%\\*)/.exec(\n source,\n )?.[1] || ''\n }\n\n // Try cmd-shim format as fallback\n if (!relPath) {\n relPath = /(?<=\"%dp0%\\\\).*(?=\" %\\*\\r\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '') {\n // Extensionless pnpm/yarn - try common shebang formats\n // Handle pnpm installed via standalone installer or global install\n // Format: exec \"$basedir/node\" \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n // Note: may have multiple spaces between arguments\n relPath =\n /(?<=\"\\$basedir\\/)\\.tools\\/pnpm\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(\n source,\n )?.[0] || ''\n if (!relPath) {\n // Also try: exec node \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n relPath =\n /(?<=exec\\s+node\\s+\"\\$basedir\\/)\\.tools\\/pnpm\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(\n source,\n )?.[0] || ''\n }\n if (!relPath) {\n // Try standard cmd-shim format: exec node \"$basedir/../package/bin/binary.js\" \"$@\"\n relPath = /(?<=\"\\$basedir\\/).*(?=\" \"\\$@\"\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '.ps1') {\n // PowerShell format\n relPath = /(?<=\"\\$basedir\\/).*(?=\" $args\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '.cmd') {\n // \"bin.CMD\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L98:\n //\n // @ECHO off\n // GOTO start\n // :find_dp0\n // SET dp0=%~dp0\n // EXIT /b\n // :start\n // SETLOCAL\n // CALL :find_dp0\n //\n // IF EXIST \"%dp0%\\node.exe\" (\n // SET \"_prog=%dp0%\\node.exe\"\n // ) ELSE (\n // SET \"_prog=node\"\n // SET PATHEXT=%PATHEXT:;.JS;=;%\n // )\n //\n // endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & \"%_prog%\" \"%dp0%\\..\\<PACKAGE_NAME>\\path\\to\\bin.js\" %*\n relPath = /(?<=\"%dp0%\\\\).*(?=\" %\\*\\r\\n)/.exec(source)?.[0] || ''\n } else if (extLowered === '') {\n // Extensionless \"bin\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L138:\n //\n // #!/bin/sh\n // basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n //\n // case `uname` in\n // *CYGWIN*|*MINGW*|*MSYS*)\n // if command -v cygpath > /dev/null 2>&1; then\n // basedir=`cygpath -w \"$basedir\"`\n // fi\n // ;;\n // esac\n //\n // if [ -x \"$basedir/node\" ]; then\n // exec \"$basedir/node\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" \"$@\"\n // else\n // exec node \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" \"$@\"\n // fi\n relPath = /(?<=\"$basedir\\/).*(?=\" \"\\$@\"\\n)/.exec(source)?.[0] || ''\n } else if (extLowered === '.ps1') {\n // \"bin.PS1\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L192:\n //\n // #!/usr/bin/env pwsh\n // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n //\n // $exe=\"\"\n // if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n // # Fix case when both the Windows and Linux builds of Node\n // # are installed in the same directory\n // $exe=\".exe\"\n // }\n // $ret=0\n // if (Test-Path \"$basedir/node$exe\") {\n // # Support pipeline input\n // if ($MyInvocation.ExpectingInput) {\n // $input | & \"$basedir/node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // } else {\n // & \"$basedir/node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // }\n // $ret=$LASTEXITCODE\n // } else {\n // # Support pipeline input\n // if ($MyInvocation.ExpectingInput) {\n // $input | & \"node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // } else {\n // & \"node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // }\n // $ret=$LASTEXITCODE\n // }\n // exit $ret\n relPath = /(?<=\"\\$basedir\\/).*(?=\" $args\\n)/.exec(source)?.[0] || ''\n }\n if (relPath) {\n // biome-ignore lint/style/noParameterAssign: Resolving wrapper script target.\n binPath = normalizePath(path?.resolve(path?.dirname(binPath), relPath))\n }\n }\n } else {\n // Handle Unix shell scripts (non-Windows platforms)\n let hasNoExt = extLowered === ''\n const isPnpmOrYarn = basename === 'pnpm' || basename === 'yarn'\n const isNpmOrNpx = basename === 'npm' || basename === 'npx'\n\n // Handle special case where pnpm path in CI has extra segments.\n // In setup-pnpm GitHub Action, the path might be malformed like:\n // /home/runner/setup-pnpm/node_modules/.bin/pnpm/bin/pnpm.cjs\n // This happens when the shell script contains a relative path that\n // when resolved, creates an invalid nested structure.\n if (isPnpmOrYarn && binPath.includes('/.bin/pnpm/bin/')) {\n // Extract the correct pnpm bin path.\n const binIndex = binPath.indexOf('/.bin/pnpm')\n if (binIndex !== -1) {\n // Get the base path up to /.bin/pnpm.\n const baseBinPath = binPath.slice(0, binIndex + '/.bin/pnpm'.length)\n // Check if the original shell script exists.\n try {\n const stats = fs?.statSync(baseBinPath)\n // Only use this path if it's a file (the shell script).\n if (stats.isFile()) {\n // biome-ignore lint/style/noParameterAssign: Fixing pnpm nested bin structure.\n binPath = normalizePath(baseBinPath)\n // Recompute hasNoExt since we changed the path.\n hasNoExt = !path?.extname(binPath)\n }\n } catch {\n // If stat fails, continue with the original path.\n }\n }\n }\n\n if (\n hasNoExt &&\n (isPnpmOrYarn || isNpmOrNpx) &&\n // For extensionless files (Unix shell scripts), verify existence before reading.\n // This prevents ENOENT errors when the bin path doesn't exist.\n fs?.existsSync(binPath)\n ) {\n const source = fs?.readFileSync(binPath, 'utf8')\n let relPath = ''\n\n if (isPnpmOrYarn) {\n // Handle pnpm/yarn Unix shell scripts.\n // Format: exec \"$basedir/node\" \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n // or: exec node \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n relPath =\n /(?<=\"\\$basedir\\/)\\.tools\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(source)?.[0] || ''\n if (!relPath) {\n // Try standard cmd-shim format: exec node \"$basedir/../package/bin/binary.js\" \"$@\"\n // Example: exec node \"$basedir/../pnpm/bin/pnpm.cjs\" \"$@\"\n // ^^^^^^^^^^^^^^^^^^^^^ captures this part\n // This regex needs to be more careful to not match \"$@\" at the end.\n relPath =\n /(?<=\"\\$basedir\\/)[^\"]+(?=\"\\s+\"\\$@\")/.exec(source)?.[0] || ''\n }\n // Special case for setup-pnpm GitHub Action which may use a different format.\n // The setup-pnpm action creates a shell script that references ../pnpm/bin/pnpm.cjs\n if (!relPath) {\n // Try to match: exec node \"$basedir/../pnpm/bin/pnpm.cjs\" \"$@\"\n const match = /exec\\s+node\\s+\"?\\$basedir\\/([^\"]+)\"?\\s+\"\\$@\"/.exec(\n source,\n )\n if (match) {\n relPath = match[1] || ''\n }\n }\n // Check if the extracted path looks wrong (e.g., pnpm/bin/pnpm.cjs without ../).\n // This happens with setup-pnpm action when it creates a malformed shell script.\n if (relPath && basename === 'pnpm' && relPath.startsWith('pnpm/')) {\n // The path should be ../pnpm/... not pnpm/...\n // Prepend ../ to fix the relative path.\n relPath = `../${relPath}`\n }\n } else if (isNpmOrNpx) {\n // Handle npm/npx Unix shell scripts\n relPath =\n basename === 'npm'\n ? /(?<=NPM_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] || ''\n : /(?<=NPX_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] || ''\n }\n\n if (relPath) {\n // Resolve the relative path to handle .. segments properly.\n // biome-ignore lint/style/noParameterAssign: Resolving shell script target.\n binPath = normalizePath(path?.resolve(path?.dirname(binPath), relPath))\n }\n }\n }\n try {\n const realPath = fs?.realpathSync.native(binPath)\n return normalizePath(realPath)\n } catch {}\n // Return normalized path even if realpath fails.\n return normalizePath(binPath)\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,qBAAwB;AACxB,kBAAqB;AACrB,0BAA6B;AAC7B,2BAA8B;AAE9B,gBAA6B;AAC7B,qBAAuB;AACvB,kBAAsC;AACtC,mBAAsB;AAEtB,IAAI;AAAA;AAKJ,SAAS,QAAQ;AACf,MAAI,QAAQ,QAAW;AAGrB,UAAoB,QAAQ,SAAS;AAAA,EACvC;
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Binary path resolution and execution utilities for package managers.\n * Provides cross-platform bin path lookup, command execution, and path normalization.\n */\n\nimport { APPDATA } from '#env/appdata'\nimport { HOME } from '#env/home'\nimport { LOCALAPPDATA } from '#env/localappdata'\nimport { XDG_DATA_HOME } from '#env/xdg-data-home'\n\nimport { readJsonSync } from './fs'\nimport { getOwn } from './objects'\nimport { isPath, normalizePath } from './path'\nimport { spawn } from './spawn'\n\nlet _fs: typeof import('node:fs') | undefined\n/**\n * Lazily load the fs module to avoid Webpack errors.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getFs() {\n if (_fs === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _fs = /*@__PURE__*/ require('node:fs')\n }\n return _fs!\n}\n\nlet _path: typeof import('node:path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n return _path!\n}\n\nlet _which: typeof import('which') | undefined\n/**\n * Lazily load the which module for finding executables.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getWhich() {\n if (_which === undefined) {\n _which = /*@__PURE__*/ require('./external/which')\n }\n return _which!\n}\n\n/**\n * Execute a binary with the given arguments.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function execBin(\n binPath: string,\n args?: string[],\n options?: import('./spawn').SpawnOptions,\n) {\n // Resolve the binary path.\n const resolvedPath = isPath(binPath)\n ? resolveBinPathSync(binPath)\n : await whichBin(binPath)\n\n if (!resolvedPath) {\n const error = new Error(`Binary not found: ${binPath}`) as Error & {\n code: string\n }\n error.code = 'ENOENT'\n throw error\n }\n\n // Execute the binary directly.\n const binCommand = Array.isArray(resolvedPath)\n ? resolvedPath[0]!\n : resolvedPath\n return await spawn(binCommand, args ?? [], options)\n}\n\n/**\n * Find and resolve a binary in the system PATH asynchronously.\n * @template {import('which').Options} T\n * @throws {Error} If the binary is not found and nothrow is false.\n */\nexport async function whichBin(\n binName: string,\n options?: import('which').Options,\n): Promise<string | string[] | undefined> {\n const which = getWhich()\n // Default to nothrow: true if not specified to return undefined instead of throwing\n const opts = { nothrow: true, ...options }\n // Depending on options `which` may throw if `binName` is not found.\n // With nothrow: true, it returns null when `binName` is not found.\n const result = await which?.(binName, opts)\n\n // When 'all: true' is specified, ensure we always return an array.\n if (options?.all) {\n const paths = Array.isArray(result)\n ? result\n : typeof result === 'string'\n ? [result]\n : undefined\n // If all is true and we have paths, resolve each one.\n return paths?.length ? paths.map(p => resolveBinPathSync(p)) : paths\n }\n\n // If result is undefined (binary not found), return undefined\n if (!result) {\n return undefined\n }\n\n return resolveBinPathSync(result)\n}\n\n/**\n * Find and resolve a binary in the system PATH synchronously.\n * @template {import('which').Options} T\n * @throws {Error} If the binary is not found and nothrow is false.\n */\nexport function whichBinSync(\n binName: string,\n options?: import('which').Options,\n): string | string[] | undefined {\n // Default to nothrow: true if not specified to return undefined instead of throwing\n const opts = { nothrow: true, ...options }\n // Depending on options `which` may throw if `binName` is not found.\n // With nothrow: true, it returns null when `binName` is not found.\n const result = getWhich()?.sync(binName, opts)\n\n // When 'all: true' is specified, ensure we always return an array.\n if (getOwn(options, 'all')) {\n const paths = Array.isArray(result)\n ? result\n : typeof result === 'string'\n ? [result]\n : undefined\n // If all is true and we have paths, resolve each one.\n return paths?.length ? paths.map(p => resolveBinPathSync(p)) : paths\n }\n\n // If result is undefined (binary not found), return undefined\n if (!result) {\n return undefined\n }\n\n return resolveBinPathSync(result)\n}\n\n/**\n * Check if a directory path contains any shadow bin patterns.\n */\nexport function isShadowBinPath(dirPath: string | undefined): boolean {\n if (!dirPath) {\n return false\n }\n // Check for node_modules/.bin pattern (Unix and Windows)\n const normalized = dirPath.replace(/\\\\/g, '/')\n return normalized.includes('node_modules/.bin')\n}\n\n/**\n * Find the real executable for a binary, bypassing shadow bins.\n */\nexport function findRealBin(\n binName: string,\n commonPaths: string[] = [],\n): string | undefined {\n const fs = getFs()\n const path = getPath()\n const which = getWhich()\n\n // Try common locations first.\n for (const binPath of commonPaths) {\n if (fs?.existsSync(binPath)) {\n return binPath\n }\n }\n\n // Fall back to which.sync if no direct path found.\n const binPath = which?.sync(binName, { nothrow: true })\n if (binPath) {\n const binDir = path?.dirname(binPath)\n\n if (isShadowBinPath(binDir)) {\n // This is likely a shadowed binary, try to find the real one.\n const allPaths = which?.sync(binName, { all: true, nothrow: true }) || []\n // Ensure allPaths is an array.\n const pathsArray = Array.isArray(allPaths)\n ? allPaths\n : typeof allPaths === 'string'\n ? [allPaths]\n : []\n\n for (const altPath of pathsArray) {\n const altDir = path?.dirname(altPath)\n if (!isShadowBinPath(altDir)) {\n return altPath\n }\n }\n }\n return binPath\n }\n // If all else fails, return undefined to indicate binary not found.\n return undefined\n}\n\n/**\n * Find the real npm executable, bypassing any aliases and shadow bins.\n */\nexport function findRealNpm(): string {\n const fs = getFs()\n const path = getPath()\n\n // Try to find npm in the same directory as the node executable.\n const nodeDir = path?.dirname(process.execPath)\n const npmInNodeDir = path?.join(nodeDir, 'npm')\n\n if (fs?.existsSync(npmInNodeDir)) {\n return npmInNodeDir\n }\n\n // Try common npm locations.\n const commonPaths = ['/usr/local/bin/npm', '/usr/bin/npm']\n const result = findRealBin('npm', commonPaths)\n\n // If we found a valid path, return it.\n if (result && fs?.existsSync(result)) {\n return result\n }\n\n // As a last resort, try to use whichBinSync to find npm.\n // This handles cases where npm is installed in non-standard locations.\n const npmPath = whichBinSync('npm', { nothrow: true })\n if (npmPath && typeof npmPath === 'string' && fs?.existsSync(npmPath)) {\n return npmPath\n }\n\n // Return the basic 'npm' and let the system resolve it.\n return 'npm'\n}\n\n/**\n * Find the real pnpm executable, bypassing any aliases and shadow bins.\n */\nexport function findRealPnpm(): string {\n const WIN32 = require('../constants/platform').WIN32\n const path = getPath()\n\n // Try common pnpm locations.\n const commonPaths = WIN32\n ? [\n // Windows common paths.\n path?.join(APPDATA as string, 'npm', 'pnpm.cmd'),\n path?.join(APPDATA as string, 'npm', 'pnpm'),\n path?.join(LOCALAPPDATA as string, 'pnpm', 'pnpm.cmd'),\n path?.join(LOCALAPPDATA as string, 'pnpm', 'pnpm'),\n 'C:\\\\Program Files\\\\nodejs\\\\pnpm.cmd',\n 'C:\\\\Program Files\\\\nodejs\\\\pnpm',\n ].filter(Boolean)\n : [\n // Unix common paths.\n '/usr/local/bin/pnpm',\n '/usr/bin/pnpm',\n path?.join(\n (XDG_DATA_HOME as string) || `${HOME as string}/.local/share`,\n 'pnpm/pnpm',\n ),\n path?.join(HOME as string, '.pnpm/pnpm'),\n ].filter(Boolean)\n\n return findRealBin('pnpm', commonPaths) ?? ''\n}\n\n/**\n * Find the real yarn executable, bypassing any aliases and shadow bins.\n */\nexport function findRealYarn(): string {\n const path = getPath()\n\n // Try common yarn locations.\n const commonPaths = [\n '/usr/local/bin/yarn',\n '/usr/bin/yarn',\n path?.join(HOME as string, '.yarn/bin/yarn'),\n path?.join(HOME as string, '.config/yarn/global/node_modules/.bin/yarn'),\n ].filter(Boolean)\n\n return findRealBin('yarn', commonPaths) ?? ''\n}\n\n/*@__NO_SIDE_EFFECTS__*/\n/**\n * Resolve a binary path to its actual executable file.\n * Handles Windows .cmd wrappers and Unix shell scripts.\n */\nexport function resolveBinPathSync(binPath: string): string {\n const fs = getFs()\n const path = getPath()\n\n // If it's not an absolute path, try to find it in PATH first\n if (!path?.isAbsolute(binPath)) {\n try {\n const resolved = whichBinSync(binPath)\n if (resolved) {\n binPath = resolved as string\n }\n } catch {}\n }\n\n // Normalize the path once for consistent pattern matching.\n binPath = normalizePath(binPath)\n\n // Handle empty string that normalized to '.' (current directory)\n if (binPath === '.') {\n return binPath\n }\n\n const ext = path?.extname(binPath)\n const extLowered = ext.toLowerCase()\n const basename = path?.basename(binPath, ext)\n const voltaIndex =\n basename === 'node' ? -1 : (/(?<=\\/)\\.volta\\//i.exec(binPath)?.index ?? -1)\n if (voltaIndex !== -1) {\n const voltaPath = binPath.slice(0, voltaIndex)\n const voltaToolsPath = path?.join(voltaPath, 'tools')\n const voltaImagePath = path?.join(voltaToolsPath, 'image')\n const voltaUserPath = path?.join(voltaToolsPath, 'user')\n const voltaPlatform = readJsonSync(\n path?.join(voltaUserPath, 'platform.json'),\n { throws: false },\n ) as any\n const voltaNodeVersion = voltaPlatform?.node?.runtime\n const voltaNpmVersion = voltaPlatform?.node?.npm\n let voltaBinPath = ''\n if (basename === 'npm' || basename === 'npx') {\n if (voltaNpmVersion) {\n const relCliPath = `bin/${basename}-cli.js`\n voltaBinPath = path?.join(\n voltaImagePath,\n `npm/${voltaNpmVersion}/${relCliPath}`,\n )\n if (voltaNodeVersion && !fs?.existsSync(voltaBinPath)) {\n voltaBinPath = path?.join(\n voltaImagePath,\n `node/${voltaNodeVersion}/lib/node_modules/npm/${relCliPath}`,\n )\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = ''\n }\n }\n }\n } else {\n const voltaUserBinPath = path?.join(voltaUserPath, 'bin')\n const binInfo = readJsonSync(\n path?.join(voltaUserBinPath, `${basename}.json`),\n { throws: false },\n ) as any\n const binPackage = binInfo?.package\n if (binPackage) {\n voltaBinPath = path?.join(\n voltaImagePath,\n `packages/${binPackage}/bin/${basename}`,\n )\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = `${voltaBinPath}.cmd`\n if (!fs?.existsSync(voltaBinPath)) {\n voltaBinPath = ''\n }\n }\n }\n }\n if (voltaBinPath) {\n try {\n return normalizePath(fs?.realpathSync.native(voltaBinPath))\n } catch {}\n return voltaBinPath\n }\n }\n const WIN32 = require('../constants/platform').WIN32\n if (WIN32) {\n const hasKnownExt =\n extLowered === '' ||\n extLowered === '.cmd' ||\n extLowered === '.exe' ||\n extLowered === '.ps1'\n const isNpmOrNpx = basename === 'npm' || basename === 'npx'\n const isPnpmOrYarn = basename === 'pnpm' || basename === 'yarn'\n if (hasKnownExt && isNpmOrNpx) {\n // The quick route assumes a bin path like: C:\\Program Files\\nodejs\\npm.cmd\n const quickPath = path?.join(\n path?.dirname(binPath),\n `node_modules/npm/bin/${basename}-cli.js`,\n )\n if (fs?.existsSync(quickPath)) {\n try {\n return fs?.realpathSync.native(quickPath)\n } catch {}\n return quickPath\n }\n }\n let relPath = ''\n if (\n hasKnownExt &&\n // Only parse shell scripts and batch files, not actual executables.\n // .exe files are already executables and don't need path resolution from wrapper scripts.\n extLowered !== '.exe' &&\n // Check if file exists before attempting to read it to avoid ENOENT errors.\n fs?.existsSync(binPath)\n ) {\n const source = fs?.readFileSync(binPath, 'utf8')\n if (isNpmOrNpx) {\n if (extLowered === '.cmd') {\n // \"npm.cmd\" and \"npx.cmd\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm.cmd\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx.cmd\n relPath =\n basename === 'npm'\n ? /(?<=\"NPM_CLI_JS=%~dp0\\\\).*(?=\")/.exec(source)?.[0] || ''\n : /(?<=\"NPX_CLI_JS=%~dp0\\\\).*(?=\")/.exec(source)?.[0] || ''\n } else if (extLowered === '') {\n // Extensionless \"npm\" and \"npx\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx\n relPath =\n basename === 'npm'\n ? /(?<=NPM_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] ||\n ''\n : /(?<=NPX_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] ||\n ''\n } else if (extLowered === '.ps1') {\n // \"npm.ps1\" and \"npx.ps1\" defined by\n // https://github.com/npm/cli/blob/v11.4.2/bin/npm.ps1\n // https://github.com/npm/cli/blob/v11.4.2/bin/npx.ps1\n relPath =\n basename === 'npm'\n ? /(?<=\\$NPM_CLI_JS=\"\\$PSScriptRoot\\/).*(?=\")/.exec(\n source,\n )?.[0] || ''\n : /(?<=\\$NPX_CLI_JS=\"\\$PSScriptRoot\\/).*(?=\")/.exec(\n source,\n )?.[0] || ''\n }\n } else if (isPnpmOrYarn) {\n if (extLowered === '.cmd') {\n // pnpm.cmd and yarn.cmd can have different formats depending on installation method\n // Common formats include:\n // 1. Setup-pnpm action format: node \"%~dp0\\..\\pnpm\\bin\\pnpm.cjs\" %*\n // 2. npm install -g pnpm format: similar to cmd-shim\n // 3. Standalone installer format: various patterns\n\n // Try setup-pnpm/setup-yarn action format first\n relPath =\n /(?<=node\\s+\")%~dp0\\\\([^\"]+)(?=\"\\s+%\\*)/.exec(source)?.[1] || ''\n\n // Try alternative format: \"%~dp0\\node.exe\" \"%~dp0\\..\\package\\bin\\binary.js\" %*\n if (!relPath) {\n relPath =\n /(?<=\"%~dp0\\\\[^\"]*node[^\"]*\"\\s+\")%~dp0\\\\([^\"]+)(?=\"\\s+%\\*)/.exec(\n source,\n )?.[1] || ''\n }\n\n // Try cmd-shim format as fallback\n if (!relPath) {\n relPath = /(?<=\"%dp0%\\\\).*(?=\" %\\*\\r\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '') {\n // Extensionless pnpm/yarn - try common shebang formats\n // Handle pnpm installed via standalone installer or global install\n // Format: exec \"$basedir/node\" \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n // Note: may have multiple spaces between arguments\n relPath =\n /(?<=\"\\$basedir\\/)\\.tools\\/pnpm\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(\n source,\n )?.[0] || ''\n if (!relPath) {\n // Also try: exec node \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n relPath =\n /(?<=exec\\s+node\\s+\"\\$basedir\\/)\\.tools\\/pnpm\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(\n source,\n )?.[0] || ''\n }\n if (!relPath) {\n // Try standard cmd-shim format: exec node \"$basedir/../package/bin/binary.js\" \"$@\"\n relPath = /(?<=\"\\$basedir\\/).*(?=\" \"\\$@\"\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '.ps1') {\n // PowerShell format\n relPath = /(?<=\"\\$basedir\\/).*(?=\" $args\\n)/.exec(source)?.[0] || ''\n }\n } else if (extLowered === '.cmd') {\n // \"bin.CMD\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L98:\n //\n // @ECHO off\n // GOTO start\n // :find_dp0\n // SET dp0=%~dp0\n // EXIT /b\n // :start\n // SETLOCAL\n // CALL :find_dp0\n //\n // IF EXIST \"%dp0%\\node.exe\" (\n // SET \"_prog=%dp0%\\node.exe\"\n // ) ELSE (\n // SET \"_prog=node\"\n // SET PATHEXT=%PATHEXT:;.JS;=;%\n // )\n //\n // endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & \"%_prog%\" \"%dp0%\\..\\<PACKAGE_NAME>\\path\\to\\bin.js\" %*\n relPath = /(?<=\"%dp0%\\\\).*(?=\" %\\*\\r\\n)/.exec(source)?.[0] || ''\n } else if (extLowered === '') {\n // Extensionless \"bin\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L138:\n //\n // #!/bin/sh\n // basedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\,/,g')\")\n //\n // case `uname` in\n // *CYGWIN*|*MINGW*|*MSYS*)\n // if command -v cygpath > /dev/null 2>&1; then\n // basedir=`cygpath -w \"$basedir\"`\n // fi\n // ;;\n // esac\n //\n // if [ -x \"$basedir/node\" ]; then\n // exec \"$basedir/node\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" \"$@\"\n // else\n // exec node \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" \"$@\"\n // fi\n relPath = /(?<=\"$basedir\\/).*(?=\" \"\\$@\"\\n)/.exec(source)?.[0] || ''\n } else if (extLowered === '.ps1') {\n // \"bin.PS1\" generated by\n // https://github.com/npm/cmd-shim/blob/v7.0.0/lib/index.js#L192:\n //\n // #!/usr/bin/env pwsh\n // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n //\n // $exe=\"\"\n // if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n // # Fix case when both the Windows and Linux builds of Node\n // # are installed in the same directory\n // $exe=\".exe\"\n // }\n // $ret=0\n // if (Test-Path \"$basedir/node$exe\") {\n // # Support pipeline input\n // if ($MyInvocation.ExpectingInput) {\n // $input | & \"$basedir/node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // } else {\n // & \"$basedir/node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // }\n // $ret=$LASTEXITCODE\n // } else {\n // # Support pipeline input\n // if ($MyInvocation.ExpectingInput) {\n // $input | & \"node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // } else {\n // & \"node$exe\" \"$basedir/../<PACKAGE_NAME>/path/to/bin.js\" $args\n // }\n // $ret=$LASTEXITCODE\n // }\n // exit $ret\n relPath = /(?<=\"\\$basedir\\/).*(?=\" $args\\n)/.exec(source)?.[0] || ''\n }\n if (relPath) {\n binPath = normalizePath(path?.resolve(path?.dirname(binPath), relPath))\n }\n }\n } else {\n // Handle Unix shell scripts (non-Windows platforms)\n let hasNoExt = extLowered === ''\n const isPnpmOrYarn = basename === 'pnpm' || basename === 'yarn'\n const isNpmOrNpx = basename === 'npm' || basename === 'npx'\n\n // Handle special case where pnpm path in CI has extra segments.\n // In setup-pnpm GitHub Action, the path might be malformed like:\n // /home/runner/setup-pnpm/node_modules/.bin/pnpm/bin/pnpm.cjs\n // This happens when the shell script contains a relative path that\n // when resolved, creates an invalid nested structure.\n if (isPnpmOrYarn && binPath.includes('/.bin/pnpm/bin/')) {\n // Extract the correct pnpm bin path.\n const binIndex = binPath.indexOf('/.bin/pnpm')\n if (binIndex !== -1) {\n // Get the base path up to /.bin/pnpm.\n const baseBinPath = binPath.slice(0, binIndex + '/.bin/pnpm'.length)\n // Check if the original shell script exists.\n try {\n const stats = fs?.statSync(baseBinPath)\n // Only use this path if it's a file (the shell script).\n if (stats.isFile()) {\n binPath = normalizePath(baseBinPath)\n // Recompute hasNoExt since we changed the path.\n hasNoExt = !path?.extname(binPath)\n }\n } catch {\n // If stat fails, continue with the original path.\n }\n }\n }\n\n if (\n hasNoExt &&\n (isPnpmOrYarn || isNpmOrNpx) &&\n // For extensionless files (Unix shell scripts), verify existence before reading.\n // This prevents ENOENT errors when the bin path doesn't exist.\n fs?.existsSync(binPath)\n ) {\n const source = fs?.readFileSync(binPath, 'utf8')\n let relPath = ''\n\n if (isPnpmOrYarn) {\n // Handle pnpm/yarn Unix shell scripts.\n // Format: exec \"$basedir/node\" \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n // or: exec node \"$basedir/.tools/pnpm/VERSION/...\" \"$@\"\n relPath =\n /(?<=\"\\$basedir\\/)\\.tools\\/[^\"]+(?=\"\\s+\"\\$@\")/.exec(source)?.[0] || ''\n if (!relPath) {\n // Try standard cmd-shim format: exec node \"$basedir/../package/bin/binary.js\" \"$@\"\n // Example: exec node \"$basedir/../pnpm/bin/pnpm.cjs\" \"$@\"\n // ^^^^^^^^^^^^^^^^^^^^^ captures this part\n // This regex needs to be more careful to not match \"$@\" at the end.\n relPath =\n /(?<=\"\\$basedir\\/)[^\"]+(?=\"\\s+\"\\$@\")/.exec(source)?.[0] || ''\n }\n // Special case for setup-pnpm GitHub Action which may use a different format.\n // The setup-pnpm action creates a shell script that references ../pnpm/bin/pnpm.cjs\n if (!relPath) {\n // Try to match: exec node \"$basedir/../pnpm/bin/pnpm.cjs\" \"$@\"\n const match = /exec\\s+node\\s+\"?\\$basedir\\/([^\"]+)\"?\\s+\"\\$@\"/.exec(\n source,\n )\n if (match) {\n relPath = match[1] || ''\n }\n }\n // Check if the extracted path looks wrong (e.g., pnpm/bin/pnpm.cjs without ../).\n // This happens with setup-pnpm action when it creates a malformed shell script.\n if (relPath && basename === 'pnpm' && relPath.startsWith('pnpm/')) {\n // The path should be ../pnpm/... not pnpm/...\n // Prepend ../ to fix the relative path.\n relPath = `../${relPath}`\n }\n } else if (isNpmOrNpx) {\n // Handle npm/npx Unix shell scripts\n relPath =\n basename === 'npm'\n ? /(?<=NPM_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] || ''\n : /(?<=NPX_CLI_JS=\"\\$CLI_BASEDIR\\/).*(?=\")/.exec(source)?.[0] || ''\n }\n\n if (relPath) {\n // Resolve the relative path to handle .. segments properly.\n binPath = normalizePath(path?.resolve(path?.dirname(binPath), relPath))\n }\n }\n }\n try {\n const realPath = fs?.realpathSync.native(binPath)\n return normalizePath(realPath)\n } catch {}\n // Return normalized path even if realpath fails.\n return normalizePath(binPath)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["binPath"]
|
|
7
7
|
}
|
package/dist/cacache.d.ts
CHANGED
|
@@ -6,7 +6,6 @@ export interface GetOptions {
|
|
|
6
6
|
export interface PutOptions {
|
|
7
7
|
integrity?: string | undefined;
|
|
8
8
|
size?: number | undefined;
|
|
9
|
-
// biome-ignore lint/suspicious/noExplicitAny: User-provided arbitrary metadata.
|
|
10
9
|
metadata?: any | undefined;
|
|
11
10
|
memoize?: boolean | undefined;
|
|
12
11
|
}
|
|
@@ -14,7 +13,6 @@ export interface CacheEntry {
|
|
|
14
13
|
data: Buffer;
|
|
15
14
|
integrity: string;
|
|
16
15
|
key: string;
|
|
17
|
-
// biome-ignore lint/suspicious/noExplicitAny: User-provided arbitrary metadata.
|
|
18
16
|
metadata?: any | undefined;
|
|
19
17
|
path: string;
|
|
20
18
|
size: number;
|
package/dist/cacache.js
CHANGED
package/dist/cacache.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cacache.ts"],
|
|
4
|
-
"sourcesContent": ["/** @fileoverview Cacache utilities for Socket ecosystem shared content-addressable cache. */\n\nimport { getSocketCacacheDir } from './paths'\n\nexport interface GetOptions {\n integrity?: string | undefined\n size?: number | undefined\n memoize?: boolean | undefined\n}\n\nexport interface PutOptions {\n integrity?: string | undefined\n size?: number | undefined\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,mBAAoC;
|
|
4
|
+
"sourcesContent": ["/** @fileoverview Cacache utilities for Socket ecosystem shared content-addressable cache. */\n\nimport { getSocketCacacheDir } from './paths'\n\nexport interface GetOptions {\n integrity?: string | undefined\n size?: number | undefined\n memoize?: boolean | undefined\n}\n\nexport interface PutOptions {\n integrity?: string | undefined\n size?: number | undefined\n metadata?: any | undefined\n memoize?: boolean | undefined\n}\n\nexport interface CacheEntry {\n data: Buffer\n integrity: string\n key: string\n metadata?: any | undefined\n path: string\n size: number\n time: number\n}\n\nexport interface RemoveOptions {\n /**\n * Optional key prefix to filter removals.\n * If provided, only keys starting with this prefix will be removed.\n * Can include wildcards (*) for pattern matching.\n *\n * @example\n * { prefix: 'socket-sdk' } // Simple prefix\n * { prefix: 'socket-sdk:scans:abc*' } // With wildcard\n */\n prefix?: string | undefined\n}\n\n/**\n * Get the cacache module for cache operations.\n */\nfunction getCacache() {\n return /*@__PURE__*/ require('./external/cacache')\n}\n\n/**\n * Convert wildcard pattern to regex for matching.\n * Supports * as wildcard (matches any characters).\n */\nfunction patternToRegex(pattern: string): RegExp {\n // Escape regex special characters except *\n const escaped = pattern.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n // Convert * to .* (match any characters)\n const regexPattern = escaped.replaceAll('*', '.*')\n return new RegExp(`^${regexPattern}`)\n}\n\n/**\n * Check if a key matches a pattern (with wildcard support).\n */\nfunction matchesPattern(key: string, pattern: string): boolean {\n // If no wildcards, use simple prefix matching (faster)\n if (!pattern.includes('*')) {\n return key.startsWith(pattern)\n }\n // Use regex for wildcard patterns\n const regex = patternToRegex(pattern)\n return regex.test(key)\n}\n\n/**\n * Clear entries from the Socket shared cache.\n *\n * Supports wildcard patterns (*) in prefix for flexible matching.\n * For simple prefixes without wildcards, uses efficient streaming.\n * For wildcard patterns, iterates and matches each entry.\n *\n * @param options - Optional configuration for selective clearing\n * @param options.prefix - Prefix or pattern to match (supports * wildcards)\n * @returns Number of entries removed (only when prefix is specified)\n *\n * @example\n * // Clear all entries\n * await clear()\n *\n * @example\n * // Clear entries with simple prefix\n * const removed = await clear({ prefix: 'socket-sdk:scans' })\n * console.log(`Removed ${removed} scan cache entries`)\n *\n * @example\n * // Clear entries with wildcard pattern\n * await clear({ prefix: 'socket-sdk:scans:abc*' })\n * await clear({ prefix: 'socket-sdk:npm/lodash/*' })\n */\nexport async function clear(\n options?: RemoveOptions | undefined,\n): Promise<number | undefined> {\n const opts = { __proto__: null, ...options } as RemoveOptions\n const cacache = getCacache()\n const cacheDir = getSocketCacacheDir()\n\n // If no prefix specified, clear everything.\n if (!opts.prefix) {\n try {\n await cacache.rm.all(cacheDir)\n return\n } catch (e) {\n // Ignore ENOTEMPTY errors - can occur when multiple processes\n // are cleaning up concurrently (e.g., in CI test environments).\n if ((e as NodeJS.ErrnoException)?.code !== 'ENOTEMPTY') {\n throw e\n }\n return\n }\n }\n\n const hasWildcard = opts.prefix.includes('*')\n\n // For simple prefix (no wildcards), use faster iteration.\n if (!hasWildcard) {\n let removed = 0\n const stream = cacache.ls.stream(cacheDir)\n\n for await (const entry of stream) {\n if (entry.key.startsWith(opts.prefix)) {\n try {\n await cacache.rm.entry(cacheDir, entry.key)\n removed++\n } catch {\n // Ignore individual removal errors (e.g., already removed by another process).\n }\n }\n }\n\n return removed\n }\n\n // For wildcard patterns, need to match each entry.\n let removed = 0\n const stream = cacache.ls.stream(cacheDir)\n\n for await (const entry of stream) {\n if (matchesPattern(entry.key, opts.prefix)) {\n try {\n await cacache.rm.entry(cacheDir, entry.key)\n removed++\n } catch {\n // Ignore individual removal errors.\n }\n }\n }\n\n return removed\n}\n\n/**\n * Get data from the Socket shared cache by key.\n * @throws {Error} When cache entry is not found.\n * @throws {TypeError} If key contains wildcards (*)\n */\nexport async function get(\n key: string,\n options?: GetOptions | undefined,\n): Promise<CacheEntry> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n const cacache = getCacache() as any\n return await cacache.get(getSocketCacacheDir(), key, options)\n}\n\n/**\n * Put data into the Socket shared cache with a key.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\nexport async function put(\n key: string,\n data: string | Buffer,\n options?: PutOptions | undefined,\n) {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n const cacache = getCacache()\n return await cacache.put(getSocketCacacheDir(), key, data, options)\n}\n\n/**\n * Remove an entry from the Socket shared cache by key.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\nexport async function remove(key: string): Promise<unknown> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use clear({ prefix: \"pattern*\" }) to remove multiple entries.',\n )\n }\n const cacache = getCacache() as any\n return await cacache.rm.entry(getSocketCacacheDir(), key)\n}\n\n/**\n * Get data from the Socket shared cache by key without throwing.\n */\nexport async function safeGet(\n key: string,\n options?: GetOptions | undefined,\n): Promise<CacheEntry | undefined> {\n try {\n return await get(key, options)\n } catch {\n return undefined\n }\n}\n\n/**\n * Execute a callback with a temporary directory for cache operations.\n */\nexport async function withTmp<T>(\n callback: (tmpDirPath: string) => Promise<T>,\n): Promise<T> {\n const cacache = getCacache()\n // The DefinitelyTyped types for cacache.tmp.withTmp are incorrect.\n // It actually returns the callback's return value, not void.\n return (await cacache.tmp.withTmp(\n getSocketCacacheDir(),\n {},\n callback as any,\n )) as T\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["removed", "stream"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cache-with-ttl.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Generic TTL-based caching utility using cacache.\n *\n * Provides a simple interface for caching data with time-to-live (TTL) expiration.\n * Uses cacache for persistent storage with metadata for TTL tracking.\n *\n * Features:\n * - Automatic expiration based on TTL\n * - In-memory memoization for hot data\n * - Persistent storage across process restarts\n * - Type-safe with generics\n *\n * Usage:\n * ```ts\n * const cache = createTtlCache({ ttl: 5 * 60 * 1000 }) // 5 minutes\n * const data = await cache.getOrFetch('key', async () => fetchData())\n * ```\n */\n\nimport * as cacache from './cacache'\n\nexport interface TtlCacheOptions {\n /**\n * Time-to-live in milliseconds.\n * @default 5 * 60 * 1000 (5 minutes)\n */\n ttl?: number | undefined\n /**\n * Enable in-memory memoization for hot data.\n * @default true\n */\n memoize?: boolean | undefined\n /**\n * Custom cache key prefix.\n * Must not contain wildcards (*).\n * Use clear({ prefix: \"pattern*\" }) for wildcard matching instead.\n *\n * @default 'ttl-cache'\n * @throws {TypeError} If prefix contains wildcards\n *\n * @example\n * // Valid\n * createTtlCache({ prefix: 'socket-sdk' })\n * createTtlCache({ prefix: 'my-app:cache' })\n *\n * @example\n * // Invalid - throws TypeError\n * createTtlCache({ prefix: 'socket-*' })\n */\n prefix?: string | undefined\n}\n\nexport interface TtlCacheEntry<T> {\n data: T\n expiresAt: number\n}\n\nexport interface ClearOptions {\n /**\n * Only clear in-memory memoization cache, not persistent cache.\n * Useful for forcing a refresh of cached data without removing it from disk.\n *\n * @default false\n */\n memoOnly?: boolean | undefined\n}\n\nexport interface TtlCache {\n /**\n * Get cached data without fetching.\n * Returns undefined if not found or expired.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n get<T>(key: string): Promise<T | undefined>\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or use '*' for all entries)\n * @returns Map of matching entries (key -> value)\n *\n * @example\n * // Get all organization entries\n * const orgs = await cache.getAll<OrgData>('organizations:*')\n * for (const [key, org] of orgs) {\n * console.log(`${key}: ${org.name}`)\n * }\n *\n * @example\n * // Get all entries with this cache's prefix\n * const all = await cache.getAll<any>('*')\n */\n getAll<T>(pattern: string): Promise<Map<string, T>>\n /**\n * Get cached data or fetch and cache if missing/expired.\n *\n * @param key - Cache key (must not contain wildcards)\n */\n getOrFetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>\n /**\n * Set cached data with TTL.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n set<T>(key: string, data: T): Promise<void>\n /**\n * Delete a specific cache entry.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n delete(key: string): Promise<void>\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or omit to delete all)\n * @returns Number of entries deleted\n *\n * @example\n * // Delete all entries with this cache's prefix\n * await cache.deleteAll()\n *\n * @example\n * // Delete entries matching prefix\n * await cache.deleteAll('organizations')\n *\n * @example\n * // Delete entries with wildcard pattern\n * await cache.deleteAll('scans:abc*')\n * await cache.deleteAll('npm/lodash/*')\n */\n deleteAll(pattern?: string | undefined): Promise<number>\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n *\n * @param options - Optional configuration\n * @param options.memoOnly - If true, only clears in-memory cache\n *\n * @example\n * // Clear everything (memory + disk)\n * await cache.clear()\n *\n * @example\n * // Clear only in-memory cache (force refresh)\n * await cache.clear({ memoOnly: true })\n */\n clear(options?: ClearOptions | undefined): Promise<void>\n}\n\n// 5 minutes\nconst DEFAULT_TTL_MS = 5 * 60 * 1000\nconst DEFAULT_PREFIX = 'ttl-cache'\n\n/**\n * Create a TTL-based cache instance.\n */\nexport function createTtlCache(options?: TtlCacheOptions): TtlCache {\n const opts = {\n __proto__: null,\n memoize: true,\n prefix: DEFAULT_PREFIX,\n ttl: DEFAULT_TTL_MS,\n ...options,\n } as Required<TtlCacheOptions>\n\n // Validate prefix does not contain wildcards.\n if (opts.prefix?.includes('*')) {\n throw new TypeError(\n 'Cache prefix cannot contain wildcards (*). Use clear({ prefix: \"pattern*\" }) for wildcard matching.',\n )\n }\n\n // In-memory cache for hot data\n // biome-ignore lint/suspicious/noExplicitAny: Generic cache for any value type.\n const memoCache = new Map<string, TtlCacheEntry<any>>()\n\n // Ensure ttl is defined\n const ttl = opts.ttl ?? DEFAULT_TTL_MS\n\n /**\n * Build full cache key with prefix.\n */\n function buildKey(key: string): string {\n return `${opts.prefix}:${key}`\n }\n\n /**\n * Check if entry is expired.\n */\n function isExpired(\n // biome-ignore lint/suspicious/noExplicitAny: Generic check for any entry type.\n entry: TtlCacheEntry<any>,\n ): boolean {\n return Date.now() > entry.expiresAt\n }\n\n /**\n * Create a matcher function for a pattern (with wildcard support).\n * Returns a function that tests if a key matches the pattern.\n */\n function createMatcher(pattern: string): (key: string) => boolean {\n const fullPattern = buildKey(pattern)\n const hasWildcard = pattern.includes('*')\n\n if (!hasWildcard) {\n // Simple prefix matching (fast path).\n return (key: string) => key.startsWith(fullPattern)\n }\n\n // Wildcard matching with regex.\n const escaped = fullPattern.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regexPattern = escaped.replaceAll('*', '.*')\n const regex = new RegExp(`^${regexPattern}`)\n return (key: string) => regex.test(key)\n }\n\n /**\n * Get cached data without fetching.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function get<T>(key: string): Promise<T | undefined> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use getAll(pattern) to retrieve multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n const memoEntry = memoCache.get(fullKey)\n if (memoEntry && !isExpired(memoEntry)) {\n return memoEntry.data as T\n }\n // Remove expired memo entry.\n if (memoEntry) {\n memoCache.delete(fullKey)\n }\n }\n\n // Check persistent cache.\n const cacheEntry = await cacache.safeGet(fullKey)\n if (cacheEntry) {\n const entry = JSON.parse(\n cacheEntry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n if (!isExpired(entry)) {\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n return entry.data\n }\n // Remove expired entry.\n await cacache.remove(fullKey)\n }\n\n return undefined\n }\n\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n */\n async function getAll<T>(pattern: string): Promise<Map<string, T>> {\n const results = new Map<string, T>()\n const matches = createMatcher(pattern)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n for (const [key, entry] of memoCache.entries()) {\n if (!matches(key)) {\n continue\n }\n\n // Skip if expired.\n if (isExpired(entry)) {\n memoCache.delete(key)\n continue\n }\n\n // Add to results (strip cache prefix from key).\n const originalKey = key.slice((opts.prefix?.length ?? 0) + 1)\n results.set(originalKey, entry.data as T)\n }\n }\n\n // Check persistent cache for entries not in memory.\n const cacheDir = (await import('./paths')).getSocketCacacheDir()\n // biome-ignore lint/suspicious/noExplicitAny: cacache types are incomplete.\n const cacacheModule = (await import('./cacache')) as any\n const stream = cacacheModule.getCacache().ls.stream(cacheDir)\n\n for await (const cacheEntry of stream) {\n // Skip if doesn't match our cache prefix.\n if (!cacheEntry.key.startsWith(`${opts.prefix}:`)) {\n continue\n }\n\n // Skip if doesn't match pattern.\n if (!matches(cacheEntry.key)) {\n continue\n }\n\n // Skip if already in results (from memory).\n const originalKey = cacheEntry.key.slice((opts.prefix?.length ?? 0) + 1)\n if (results.has(originalKey)) {\n continue\n }\n\n // Get entry from cache.\n try {\n const entry = await cacache.safeGet(cacheEntry.key)\n if (!entry) {\n continue\n }\n\n const parsed = JSON.parse(\n entry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n\n // Skip if expired.\n if (isExpired(parsed)) {\n await cacache.remove(cacheEntry.key)\n continue\n }\n\n // Add to results.\n results.set(originalKey, parsed.data)\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(cacheEntry.key, parsed)\n }\n } catch {\n // Ignore parse errors or other issues.\n }\n }\n\n return results\n }\n\n /**\n * Set cached data with TTL.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function set<T>(key: string, data: T): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n\n const fullKey = buildKey(key)\n const entry: TtlCacheEntry<T> = {\n data,\n expiresAt: Date.now() + ttl,\n }\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n\n // Update persistent cache.\n await cacache.put(fullKey, JSON.stringify(entry), {\n metadata: { expiresAt: entry.expiresAt },\n })\n }\n\n /**\n * Get cached data or fetch and cache if missing/expired.\n */\n async function getOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ): Promise<T> {\n const cached = await get<T>(key)\n if (cached !== undefined) {\n return cached\n }\n\n const data = await fetcher()\n await set(key, data)\n return data\n }\n\n /**\n * Delete a specific cache entry.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function deleteEntry(key: string): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use deleteAll(pattern) to remove multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n memoCache.delete(fullKey)\n await cacache.remove(fullKey)\n }\n\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) in patterns.\n * Delegates to cacache.clear() which handles pattern matching efficiently.\n */\n async function deleteAll(pattern?: string | undefined): Promise<number> {\n // Build full prefix/pattern by combining cache prefix with optional pattern.\n const fullPrefix = pattern ? `${opts.prefix}:${pattern}` : opts.prefix\n\n // Delete matching in-memory entries.\n if (!pattern) {\n // Delete all in-memory entries for this cache.\n memoCache.clear()\n } else {\n // Delete matching in-memory entries using shared matcher logic.\n const matches = createMatcher(pattern)\n for (const key of memoCache.keys()) {\n if (matches(key)) {\n memoCache.delete(key)\n }\n }\n }\n\n // Delete matching persistent cache entries.\n // Delegate to cacache.clear() which handles wildcards efficiently.\n const removed = await cacache.clear({ prefix: fullPrefix })\n return (removed ?? 0) as number\n }\n\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n */\n async function clear(options?: ClearOptions | undefined): Promise<void> {\n const opts = { __proto__: null, ...options } as ClearOptions\n\n // Clear in-memory cache.\n memoCache.clear()\n\n // If memoOnly, stop here.\n if (opts.memoOnly) {\n return\n }\n\n // Clear persistent cache.\n await deleteAll()\n }\n\n return {\n clear,\n delete: deleteEntry,\n deleteAll,\n get,\n getAll,\n getOrFetch,\n set,\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,cAAyB;AAwIzB,MAAM,iBAAiB,IAAI,KAAK;AAChC,MAAM,iBAAiB;AAKhB,SAAS,eAAe,SAAqC;AAClE,QAAM,OAAO;AAAA,IACX,WAAW;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,GAAG;AAAA,EACL;AAGA,MAAI,KAAK,QAAQ,SAAS,GAAG,GAAG;AAC9B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;
|
|
4
|
+
"sourcesContent": ["/**\n * @fileoverview Generic TTL-based caching utility using cacache.\n *\n * Provides a simple interface for caching data with time-to-live (TTL) expiration.\n * Uses cacache for persistent storage with metadata for TTL tracking.\n *\n * Features:\n * - Automatic expiration based on TTL\n * - In-memory memoization for hot data\n * - Persistent storage across process restarts\n * - Type-safe with generics\n *\n * Usage:\n * ```ts\n * const cache = createTtlCache({ ttl: 5 * 60 * 1000 }) // 5 minutes\n * const data = await cache.getOrFetch('key', async () => fetchData())\n * ```\n */\n\nimport * as cacache from './cacache'\n\nexport interface TtlCacheOptions {\n /**\n * Time-to-live in milliseconds.\n * @default 5 * 60 * 1000 (5 minutes)\n */\n ttl?: number | undefined\n /**\n * Enable in-memory memoization for hot data.\n * @default true\n */\n memoize?: boolean | undefined\n /**\n * Custom cache key prefix.\n * Must not contain wildcards (*).\n * Use clear({ prefix: \"pattern*\" }) for wildcard matching instead.\n *\n * @default 'ttl-cache'\n * @throws {TypeError} If prefix contains wildcards\n *\n * @example\n * // Valid\n * createTtlCache({ prefix: 'socket-sdk' })\n * createTtlCache({ prefix: 'my-app:cache' })\n *\n * @example\n * // Invalid - throws TypeError\n * createTtlCache({ prefix: 'socket-*' })\n */\n prefix?: string | undefined\n}\n\nexport interface TtlCacheEntry<T> {\n data: T\n expiresAt: number\n}\n\nexport interface ClearOptions {\n /**\n * Only clear in-memory memoization cache, not persistent cache.\n * Useful for forcing a refresh of cached data without removing it from disk.\n *\n * @default false\n */\n memoOnly?: boolean | undefined\n}\n\nexport interface TtlCache {\n /**\n * Get cached data without fetching.\n * Returns undefined if not found or expired.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n get<T>(key: string): Promise<T | undefined>\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or use '*' for all entries)\n * @returns Map of matching entries (key -> value)\n *\n * @example\n * // Get all organization entries\n * const orgs = await cache.getAll<OrgData>('organizations:*')\n * for (const [key, org] of orgs) {\n * console.log(`${key}: ${org.name}`)\n * }\n *\n * @example\n * // Get all entries with this cache's prefix\n * const all = await cache.getAll<any>('*')\n */\n getAll<T>(pattern: string): Promise<Map<string, T>>\n /**\n * Get cached data or fetch and cache if missing/expired.\n *\n * @param key - Cache key (must not contain wildcards)\n */\n getOrFetch<T>(key: string, fetcher: () => Promise<T>): Promise<T>\n /**\n * Set cached data with TTL.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n set<T>(key: string, data: T): Promise<void>\n /**\n * Delete a specific cache entry.\n *\n * @param key - Cache key (must not contain wildcards)\n * @throws {TypeError} If key contains wildcards (*)\n */\n delete(key: string): Promise<void>\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n *\n * @param pattern - Key pattern (supports * wildcards, or omit to delete all)\n * @returns Number of entries deleted\n *\n * @example\n * // Delete all entries with this cache's prefix\n * await cache.deleteAll()\n *\n * @example\n * // Delete entries matching prefix\n * await cache.deleteAll('organizations')\n *\n * @example\n * // Delete entries with wildcard pattern\n * await cache.deleteAll('scans:abc*')\n * await cache.deleteAll('npm/lodash/*')\n */\n deleteAll(pattern?: string | undefined): Promise<number>\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n *\n * @param options - Optional configuration\n * @param options.memoOnly - If true, only clears in-memory cache\n *\n * @example\n * // Clear everything (memory + disk)\n * await cache.clear()\n *\n * @example\n * // Clear only in-memory cache (force refresh)\n * await cache.clear({ memoOnly: true })\n */\n clear(options?: ClearOptions | undefined): Promise<void>\n}\n\n// 5 minutes\nconst DEFAULT_TTL_MS = 5 * 60 * 1000\nconst DEFAULT_PREFIX = 'ttl-cache'\n\n/**\n * Create a TTL-based cache instance.\n */\nexport function createTtlCache(options?: TtlCacheOptions): TtlCache {\n const opts = {\n __proto__: null,\n memoize: true,\n prefix: DEFAULT_PREFIX,\n ttl: DEFAULT_TTL_MS,\n ...options,\n } as Required<TtlCacheOptions>\n\n // Validate prefix does not contain wildcards.\n if (opts.prefix?.includes('*')) {\n throw new TypeError(\n 'Cache prefix cannot contain wildcards (*). Use clear({ prefix: \"pattern*\" }) for wildcard matching.',\n )\n }\n\n // In-memory cache for hot data\n const memoCache = new Map<string, TtlCacheEntry<any>>()\n\n // Ensure ttl is defined\n const ttl = opts.ttl ?? DEFAULT_TTL_MS\n\n /**\n * Build full cache key with prefix.\n */\n function buildKey(key: string): string {\n return `${opts.prefix}:${key}`\n }\n\n /**\n * Check if entry is expired.\n */\n function isExpired(entry: TtlCacheEntry<any>): boolean {\n return Date.now() > entry.expiresAt\n }\n\n /**\n * Create a matcher function for a pattern (with wildcard support).\n * Returns a function that tests if a key matches the pattern.\n */\n function createMatcher(pattern: string): (key: string) => boolean {\n const fullPattern = buildKey(pattern)\n const hasWildcard = pattern.includes('*')\n\n if (!hasWildcard) {\n // Simple prefix matching (fast path).\n return (key: string) => key.startsWith(fullPattern)\n }\n\n // Wildcard matching with regex.\n const escaped = fullPattern.replaceAll(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const regexPattern = escaped.replaceAll('*', '.*')\n const regex = new RegExp(`^${regexPattern}`)\n return (key: string) => regex.test(key)\n }\n\n /**\n * Get cached data without fetching.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function get<T>(key: string): Promise<T | undefined> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use getAll(pattern) to retrieve multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n const memoEntry = memoCache.get(fullKey)\n if (memoEntry && !isExpired(memoEntry)) {\n return memoEntry.data as T\n }\n // Remove expired memo entry.\n if (memoEntry) {\n memoCache.delete(fullKey)\n }\n }\n\n // Check persistent cache.\n const cacheEntry = await cacache.safeGet(fullKey)\n if (cacheEntry) {\n const entry = JSON.parse(\n cacheEntry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n if (!isExpired(entry)) {\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n return entry.data\n }\n // Remove expired entry.\n await cacache.remove(fullKey)\n }\n\n return undefined\n }\n\n /**\n * Get all cached entries matching a pattern.\n * Supports wildcards (*) for flexible matching.\n */\n async function getAll<T>(pattern: string): Promise<Map<string, T>> {\n const results = new Map<string, T>()\n const matches = createMatcher(pattern)\n\n // Check in-memory cache first.\n if (opts.memoize) {\n for (const [key, entry] of memoCache.entries()) {\n if (!matches(key)) {\n continue\n }\n\n // Skip if expired.\n if (isExpired(entry)) {\n memoCache.delete(key)\n continue\n }\n\n // Add to results (strip cache prefix from key).\n const originalKey = key.slice((opts.prefix?.length ?? 0) + 1)\n results.set(originalKey, entry.data as T)\n }\n }\n\n // Check persistent cache for entries not in memory.\n const cacheDir = (await import('./paths')).getSocketCacacheDir()\n const cacacheModule = (await import('./cacache')) as any\n const stream = cacacheModule.getCacache().ls.stream(cacheDir)\n\n for await (const cacheEntry of stream) {\n // Skip if doesn't match our cache prefix.\n if (!cacheEntry.key.startsWith(`${opts.prefix}:`)) {\n continue\n }\n\n // Skip if doesn't match pattern.\n if (!matches(cacheEntry.key)) {\n continue\n }\n\n // Skip if already in results (from memory).\n const originalKey = cacheEntry.key.slice((opts.prefix?.length ?? 0) + 1)\n if (results.has(originalKey)) {\n continue\n }\n\n // Get entry from cache.\n try {\n const entry = await cacache.safeGet(cacheEntry.key)\n if (!entry) {\n continue\n }\n\n const parsed = JSON.parse(\n entry.data.toString('utf8'),\n ) as TtlCacheEntry<T>\n\n // Skip if expired.\n if (isExpired(parsed)) {\n await cacache.remove(cacheEntry.key)\n continue\n }\n\n // Add to results.\n results.set(originalKey, parsed.data)\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(cacheEntry.key, parsed)\n }\n } catch {\n // Ignore parse errors or other issues.\n }\n }\n\n return results\n }\n\n /**\n * Set cached data with TTL.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function set<T>(key: string, data: T): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Wildcards are only supported in clear({ prefix: \"pattern*\" }).',\n )\n }\n\n const fullKey = buildKey(key)\n const entry: TtlCacheEntry<T> = {\n data,\n expiresAt: Date.now() + ttl,\n }\n\n // Update in-memory cache.\n if (opts.memoize) {\n memoCache.set(fullKey, entry)\n }\n\n // Update persistent cache.\n await cacache.put(fullKey, JSON.stringify(entry), {\n metadata: { expiresAt: entry.expiresAt },\n })\n }\n\n /**\n * Get cached data or fetch and cache if missing/expired.\n */\n async function getOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ): Promise<T> {\n const cached = await get<T>(key)\n if (cached !== undefined) {\n return cached\n }\n\n const data = await fetcher()\n await set(key, data)\n return data\n }\n\n /**\n * Delete a specific cache entry.\n *\n * @throws {TypeError} If key contains wildcards (*)\n */\n async function deleteEntry(key: string): Promise<void> {\n if (key.includes('*')) {\n throw new TypeError(\n 'Cache key cannot contain wildcards (*). Use deleteAll(pattern) to remove multiple entries.',\n )\n }\n\n const fullKey = buildKey(key)\n memoCache.delete(fullKey)\n await cacache.remove(fullKey)\n }\n\n /**\n * Delete all cache entries matching a pattern.\n * Supports wildcards (*) in patterns.\n * Delegates to cacache.clear() which handles pattern matching efficiently.\n */\n async function deleteAll(pattern?: string | undefined): Promise<number> {\n // Build full prefix/pattern by combining cache prefix with optional pattern.\n const fullPrefix = pattern ? `${opts.prefix}:${pattern}` : opts.prefix\n\n // Delete matching in-memory entries.\n if (!pattern) {\n // Delete all in-memory entries for this cache.\n memoCache.clear()\n } else {\n // Delete matching in-memory entries using shared matcher logic.\n const matches = createMatcher(pattern)\n for (const key of memoCache.keys()) {\n if (matches(key)) {\n memoCache.delete(key)\n }\n }\n }\n\n // Delete matching persistent cache entries.\n // Delegate to cacache.clear() which handles wildcards efficiently.\n const removed = await cacache.clear({ prefix: fullPrefix })\n return (removed ?? 0) as number\n }\n\n /**\n * Clear all cache entries (like Map.clear()).\n * Optionally clear only in-memory cache.\n */\n async function clear(options?: ClearOptions | undefined): Promise<void> {\n const opts = { __proto__: null, ...options } as ClearOptions\n\n // Clear in-memory cache.\n memoCache.clear()\n\n // If memoOnly, stop here.\n if (opts.memoOnly) {\n return\n }\n\n // Clear persistent cache.\n await deleteAll()\n }\n\n return {\n clear,\n delete: deleteEntry,\n deleteAll,\n get,\n getAll,\n getOrFetch,\n set,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["options", "opts"]
|
|
7
7
|
}
|
package/dist/dlx.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/dlx.ts"],
|
|
4
|
-
"sourcesContent": ["/** @fileoverview DLX (execute package) utilities for Socket ecosystem shared installations. */\n\nimport { existsSync, promises as fs } from 'node:fs'\n\nimport { readDirNamesSync, safeDelete } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _path: typeof import('path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAA2C;AAE3C,gBAA6C;AAC7C,kBAA8B;AAC9B,mBAAgC;AAChC,sBAAsB;AAEtB,IAAI;AAAA;AAMJ,SAAS,UAAU;AACjB,MAAI,UAAU,QAAW;AAGvB,YAAsB,QAAQ,WAAW;AAAA,EAC3C;
|
|
4
|
+
"sourcesContent": ["/** @fileoverview DLX (execute package) utilities for Socket ecosystem shared installations. */\n\nimport { existsSync, promises as fs } from 'node:fs'\n\nimport { readDirNamesSync, safeDelete } from './fs'\nimport { normalizePath } from './path'\nimport { getSocketDlxDir } from './paths'\nimport { pEach } from './promises'\n\nlet _path: typeof import('path') | undefined\n/**\n * Lazily load the path module to avoid Webpack errors.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPath() {\n if (_path === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _path = /*@__PURE__*/ require('node:path')\n }\n return _path!\n}\n\n/**\n * Clear all DLX package installations.\n */\nexport async function clearDlx(): Promise<void> {\n const packages = await listDlxPackagesAsync()\n await pEach(packages, pkg => removeDlxPackage(pkg))\n}\n\n/**\n * Clear all DLX package installations synchronously.\n */\nexport function clearDlxSync(): void {\n const packages = listDlxPackages()\n for (const pkg of packages) {\n removeDlxPackageSync(pkg)\n }\n}\n\n/**\n * Check if the DLX directory exists.\n */\nexport function dlxDirExists(): boolean {\n return existsSync(getSocketDlxDir())\n}\n\n/**\n * Check if the DLX directory exists asynchronously.\n */\nexport async function dlxDirExistsAsync(): Promise<boolean> {\n try {\n await fs.access(getSocketDlxDir())\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Ensure the DLX directory exists, creating it if necessary.\n */\nexport async function ensureDlxDir(): Promise<void> {\n await fs.mkdir(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Ensure the DLX directory exists synchronously, creating it if necessary.\n */\nexport function ensureDlxDirSync(): void {\n const { mkdirSync } = require('node:fs')\n mkdirSync(getSocketDlxDir(), { recursive: true })\n}\n\n/**\n * Get the installed package directory within DLX node_modules.\n */\nexport function getDlxInstalledPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxPackageNodeModulesDir(packageName), packageName),\n )\n}\n\n/**\n * Get the DLX installation directory for a specific package.\n */\nexport function getDlxPackageDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getSocketDlxDir(), packageName))\n}\n\n/**\n * Get the package.json path for a DLX installed package.\n */\nexport function getDlxPackageJsonPath(packageName: string): string {\n const path = getPath()\n return normalizePath(\n path.join(getDlxInstalledPackageDir(packageName), 'package.json'),\n )\n}\n\n/**\n * Get the node_modules directory for a DLX package installation.\n */\nexport function getDlxPackageNodeModulesDir(packageName: string): string {\n const path = getPath()\n return normalizePath(path.join(getDlxPackageDir(packageName), 'node_modules'))\n}\n\n/**\n * Check if a package is installed in DLX.\n */\nexport function isDlxPackageInstalled(packageName: string): boolean {\n return existsSync(getDlxInstalledPackageDir(packageName))\n}\n\n/**\n * Check if a package is installed in DLX asynchronously.\n */\nexport async function isDlxPackageInstalledAsync(\n packageName: string,\n): Promise<boolean> {\n try {\n await fs.access(getDlxInstalledPackageDir(packageName))\n return true\n } catch {\n return false\n }\n}\n\n/**\n * List all packages installed in DLX.\n */\nexport function listDlxPackages(): string[] {\n try {\n return readDirNamesSync(getSocketDlxDir(), { sort: true })\n } catch {\n return []\n }\n}\n\n/**\n * List all packages installed in DLX asynchronously.\n */\nexport async function listDlxPackagesAsync(): Promise<string[]> {\n try {\n const entries = await fs.readdir(getSocketDlxDir(), {\n withFileTypes: true,\n })\n return entries\n .filter(e => e.isDirectory())\n .map(e => e.name)\n .sort()\n } catch {\n return []\n }\n}\n\n/**\n * Remove a DLX package installation.\n */\nexport async function removeDlxPackage(packageName: string): Promise<void> {\n const packageDir = getDlxPackageDir(packageName)\n try {\n await safeDelete(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n\n/**\n * Remove a DLX package installation synchronously.\n */\nexport function removeDlxPackageSync(packageName: string): void {\n const { rmSync } = require('node:fs')\n const packageDir = getDlxPackageDir(packageName)\n try {\n rmSync(packageDir, { recursive: true, force: true })\n } catch (e) {\n throw new Error(`Failed to remove DLX package \"${packageName}\"`, {\n cause: e,\n })\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,qBAA2C;AAE3C,gBAA6C;AAC7C,kBAA8B;AAC9B,mBAAgC;AAChC,sBAAsB;AAEtB,IAAI;AAAA;AAMJ,SAAS,UAAU;AACjB,MAAI,UAAU,QAAW;AAGvB,YAAsB,QAAQ,WAAW;AAAA,EAC3C;AACA,SAAO;AACT;AAKA,eAAsB,WAA0B;AAC9C,QAAM,WAAW,MAAM,qBAAqB;AAC5C,YAAM,uBAAM,UAAU,SAAO,iBAAiB,GAAG,CAAC;AACpD;AAKO,SAAS,eAAqB;AACnC,QAAM,WAAW,gBAAgB;AACjC,aAAW,OAAO,UAAU;AAC1B,yBAAqB,GAAG;AAAA,EAC1B;AACF;AAKO,SAAS,eAAwB;AACtC,aAAO,+BAAW,8BAAgB,CAAC;AACrC;AAKA,eAAsB,oBAAsC;AAC1D,MAAI;AACF,UAAM,eAAAA,SAAG,WAAO,8BAAgB,CAAC;AACjC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,eAA8B;AAClD,QAAM,eAAAA,SAAG,UAAM,8BAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD;AAKO,SAAS,mBAAyB;AACvC,QAAM,EAAE,UAAU,IAAI,QAAQ,SAAS;AACvC,gBAAU,8BAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD;AAKO,SAAS,0BAA0B,aAA6B;AACrE,QAAM,OAAO,wBAAQ;AACrB,aAAO;AAAA,IACL,KAAK,KAAK,4BAA4B,WAAW,GAAG,WAAW;AAAA,EACjE;AACF;AAKO,SAAS,iBAAiB,aAA6B;AAC5D,QAAM,OAAO,wBAAQ;AACrB,aAAO,2BAAc,KAAK,SAAK,8BAAgB,GAAG,WAAW,CAAC;AAChE;AAKO,SAAS,sBAAsB,aAA6B;AACjE,QAAM,OAAO,wBAAQ;AACrB,aAAO;AAAA,IACL,KAAK,KAAK,0BAA0B,WAAW,GAAG,cAAc;AAAA,EAClE;AACF;AAKO,SAAS,4BAA4B,aAA6B;AACvE,QAAM,OAAO,wBAAQ;AACrB,aAAO,2BAAc,KAAK,KAAK,iBAAiB,WAAW,GAAG,cAAc,CAAC;AAC/E;AAKO,SAAS,sBAAsB,aAA8B;AAClE,aAAO,2BAAW,0BAA0B,WAAW,CAAC;AAC1D;AAKA,eAAsB,2BACpB,aACkB;AAClB,MAAI;AACF,UAAM,eAAAA,SAAG,OAAO,0BAA0B,WAAW,CAAC;AACtD,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,kBAA4B;AAC1C,MAAI;AACF,eAAO,gCAAiB,8BAAgB,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,EAC3D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,uBAA0C;AAC9D,MAAI;AACF,UAAM,UAAU,MAAM,eAAAA,SAAG,YAAQ,8BAAgB,GAAG;AAAA,MAClD,eAAe;AAAA,IACjB,CAAC;AACD,WAAO,QACJ,OAAO,OAAK,EAAE,YAAY,CAAC,EAC3B,IAAI,OAAK,EAAE,IAAI,EACf,KAAK;AAAA,EACV,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKA,eAAsB,iBAAiB,aAAoC;AACzE,QAAM,aAAa,iBAAiB,WAAW;AAC/C,MAAI;AACF,cAAM,sBAAW,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EAC/D,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,iCAAiC,WAAW,KAAK;AAAA,MAC/D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;AAKO,SAAS,qBAAqB,aAA2B;AAC9D,QAAM,EAAE,OAAO,IAAI,QAAQ,SAAS;AACpC,QAAM,aAAa,iBAAiB,WAAW;AAC/C,MAAI;AACF,WAAO,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD,SAAS,GAAG;AACV,UAAM,IAAI,MAAM,iCAAiC,WAAW,KAAK;AAAA,MAC/D,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": ["fs"]
|
|
7
7
|
}
|
|
@@ -8,7 +8,6 @@ declare namespace Cacache {
|
|
|
8
8
|
interface PutOptions {
|
|
9
9
|
integrity?: string | undefined
|
|
10
10
|
size?: number | undefined
|
|
11
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
12
11
|
metadata?: any | undefined
|
|
13
12
|
memoize?: boolean | undefined
|
|
14
13
|
}
|
|
@@ -17,7 +16,6 @@ declare namespace Cacache {
|
|
|
17
16
|
data: Buffer
|
|
18
17
|
integrity: string
|
|
19
18
|
key: string
|
|
20
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
21
19
|
metadata?: any | undefined
|
|
22
20
|
path: string
|
|
23
21
|
size: number
|
|
@@ -30,7 +28,6 @@ declare namespace Cacache {
|
|
|
30
28
|
path: string
|
|
31
29
|
time: number
|
|
32
30
|
size: number
|
|
33
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
34
31
|
metadata?: any | undefined
|
|
35
32
|
}
|
|
36
33
|
}
|
|
@@ -79,14 +76,10 @@ declare const cacache: {
|
|
|
79
76
|
tmp: {
|
|
80
77
|
withTmp: (
|
|
81
78
|
cache: string,
|
|
82
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
83
79
|
opts: any,
|
|
84
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
85
80
|
callback: (tmpDirPath: string) => Promise<any>,
|
|
86
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
87
81
|
) => Promise<any>
|
|
88
82
|
}
|
|
89
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
90
83
|
[key: string]: any
|
|
91
84
|
}
|
|
92
85
|
|
package/dist/external/debug.d.ts
CHANGED
|
@@ -7,16 +7,13 @@ interface Debug {
|
|
|
7
7
|
showHidden?: boolean | null
|
|
8
8
|
depth?: number | boolean | null
|
|
9
9
|
colors?: boolean
|
|
10
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
11
10
|
[key: string]: any
|
|
12
11
|
}
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
interface DebugInstance {
|
|
16
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
17
15
|
(...args: any[]): void
|
|
18
16
|
enabled: boolean
|
|
19
|
-
// biome-ignore lint/suspicious/noExplicitAny: External third-party type definition
|
|
20
17
|
log: (...args: any[]) => void
|
|
21
18
|
namespace: string
|
|
22
19
|
}
|