@socketsecurity/lib 3.2.3 → 3.2.4
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 +18 -0
- package/dist/abort.js +1 -1
- package/dist/agent.js +1 -1
- package/dist/ansi.js +1 -1
- package/dist/argv/flags.js +1 -1
- package/dist/argv/parse.js +1 -1
- package/dist/arrays.js +1 -1
- package/dist/bin.js +1 -1
- package/dist/cacache.js +1 -1
- package/dist/cache-with-ttl.js +1 -1
- package/dist/constants/agents.js +1 -1
- package/dist/constants/core.js +1 -1
- package/dist/constants/encoding.js +1 -1
- package/dist/constants/github.js +1 -1
- package/dist/constants/licenses.js +1 -1
- package/dist/constants/node.js +1 -1
- package/dist/constants/packages.js +1 -1
- package/dist/constants/paths.js +1 -1
- package/dist/constants/platform.js +1 -1
- package/dist/constants/process.js +1 -1
- package/dist/constants/socket.js +1 -1
- package/dist/constants/testing.js +1 -1
- package/dist/constants/time.js +1 -1
- package/dist/constants/typescript.js +1 -1
- package/dist/cover/code.js +1 -1
- package/dist/cover/formatters.js +1 -1
- package/dist/cover/type.js +1 -1
- package/dist/cover/types.js +1 -1
- package/dist/debug.js +1 -1
- package/dist/dlx-binary.js +1 -1
- package/dist/dlx-manifest.js +1 -1
- package/dist/dlx-package.js +1 -1
- package/dist/dlx.js +1 -1
- package/dist/effects/pulse-frames.js +4 -4
- package/dist/effects/text-shimmer.js +1 -1
- package/dist/effects/types.js +1 -1
- package/dist/effects/ultra.js +1 -1
- package/dist/env/ci.js +1 -1
- package/dist/env/debug.js +1 -1
- package/dist/env/github.js +1 -1
- package/dist/env/helpers.js +1 -1
- package/dist/env/home.js +1 -1
- package/dist/env/locale.js +1 -1
- package/dist/env/node-auth-token.js +1 -1
- package/dist/env/node-env.js +1 -1
- package/dist/env/npm.js +1 -1
- package/dist/env/package-manager.js +1 -1
- package/dist/env/path.js +1 -1
- package/dist/env/pre-commit.js +1 -1
- package/dist/env/rewire.js +1 -1
- package/dist/env/shell.js +1 -1
- package/dist/env/socket-cli-shadow.js +1 -1
- package/dist/env/socket-cli.js +1 -1
- package/dist/env/socket.js +1 -1
- package/dist/env/temp-dir.js +1 -1
- package/dist/env/term.js +1 -1
- package/dist/env/test.js +1 -1
- package/dist/env/windows.js +1 -1
- package/dist/env/xdg.js +1 -1
- package/dist/env.js +1 -1
- package/dist/external/@inquirer/confirm.js +16 -15
- package/dist/external/@inquirer/input.js +16 -15
- package/dist/external/@inquirer/password.js +17 -16
- package/dist/external/@inquirer/search.js +18 -17
- package/dist/external/@inquirer/select.js +19 -18
- package/dist/external/@npmcli/package-json/lib/read-package.js +7 -1
- package/dist/external/@npmcli/package-json/lib/sort.js +6 -1
- package/dist/external/@npmcli/package-json.js +18 -0
- package/dist/external/@npmcli/promise-spawn.js +2 -1
- package/dist/external/@socketregistry/is-unicode-supported.js +2 -1
- package/dist/external/@socketregistry/packageurl-js.js +3 -2
- package/dist/external/@socketregistry/yocto-spinner.js +5 -4
- package/dist/external/@yarnpkg/extensions.js +2 -1
- package/dist/external/cacache.js +10 -9
- package/dist/external/debug.js +2 -5
- package/dist/external/del.js +3 -2
- package/dist/external/fast-glob.js +3 -2
- package/dist/external/fast-sort.js +2 -1
- package/dist/external/get-east-asian-width.js +2 -1
- package/dist/external/libnpmexec.js +6 -0
- package/dist/external/libnpmpack.js +64 -63
- package/dist/external/make-fetch-happen.js +16 -15
- package/dist/external/normalize-package-data.js +3 -2
- package/dist/external/npm-package-arg.js +3 -2
- package/dist/external/pacote.js +36 -35
- package/dist/external/picomatch.js +2 -1
- package/dist/external/semver.js +2 -1
- package/dist/external/spdx-correct.js +2 -1
- package/dist/external/spdx-expression-parse.js +2 -1
- package/dist/external/streaming-iterables.js +2 -1
- package/dist/external/validate-npm-package-name.js +2 -1
- package/dist/external/which.js +2 -1
- package/dist/external/yargs-parser.js +2 -1
- package/dist/external/yoctocolors-cjs.js +2 -1
- package/dist/external/zod.js +10 -9
- package/dist/fs.js +1 -1
- package/dist/functions.js +1 -1
- package/dist/git.js +1 -1
- package/dist/github.js +1 -1
- package/dist/globs.js +1 -1
- package/dist/http-request.js +1 -1
- package/dist/ipc.js +1 -1
- package/dist/json.js +1 -1
- package/dist/links/index.js +1 -1
- package/dist/logger.d.ts +29 -4
- package/dist/logger.js +34 -5
- package/dist/maintained-node-versions.js +1 -1
- package/dist/memoization.js +1 -1
- package/dist/objects.js +1 -1
- package/dist/packages/editable.js +1 -1
- package/dist/packages/exports.js +1 -1
- package/dist/packages/isolation.js +1 -1
- package/dist/packages/licenses.js +1 -1
- package/dist/packages/manifest.js +1 -1
- package/dist/packages/normalize.js +1 -1
- package/dist/packages/operations.js +1 -1
- package/dist/packages/paths.js +1 -1
- package/dist/packages/provenance.js +1 -1
- package/dist/packages/specs.js +1 -1
- package/dist/packages/validation.js +1 -1
- package/dist/packages.js +1 -1
- package/dist/path.js +1 -1
- package/dist/paths/rewire.js +1 -1
- package/dist/paths.js +1 -1
- package/dist/performance.js +1 -1
- package/dist/process-lock.js +1 -1
- package/dist/promise-queue.js +1 -1
- package/dist/promises.js +1 -1
- package/dist/regexps.js +1 -1
- package/dist/sea.js +1 -1
- package/dist/shadow.js +1 -1
- package/dist/signal-exit.js +1 -1
- package/dist/sorts.js +1 -1
- package/dist/spawn.js +1 -1
- package/dist/spinner.js +1 -1
- package/dist/ssri.js +1 -1
- package/dist/stdio/clear.js +1 -1
- package/dist/stdio/divider.js +1 -1
- package/dist/stdio/footer.js +1 -1
- package/dist/stdio/header.js +1 -1
- package/dist/stdio/mask.js +1 -1
- package/dist/stdio/progress.js +1 -1
- package/dist/stdio/prompts.js +1 -1
- package/dist/stdio/stderr.js +1 -1
- package/dist/stdio/stdout.js +1 -1
- package/dist/streams.js +1 -1
- package/dist/strings.js +1 -1
- package/dist/suppress-warnings.js +1 -1
- package/dist/tables.js +1 -1
- package/dist/temporary-executor.js +1 -1
- package/dist/themes/context.js +1 -1
- package/dist/themes/index.js +1 -1
- package/dist/themes/themes.js +1 -1
- package/dist/themes/types.js +1 -1
- package/dist/themes/utils.js +1 -1
- package/dist/types.js +1 -1
- package/dist/url.js +1 -1
- package/dist/utils/get-ipc.js +1 -1
- package/dist/validation/json-parser.js +1 -1
- package/dist/validation/types.js +1 -1
- package/dist/versions.js +1 -1
- package/dist/words.js +1 -1
- package/dist/zod.js +1 -1
- package/package.json +1 -1
- package/dist/abort.js.map +0 -7
- package/dist/agent.js.map +0 -7
- package/dist/ansi.js.map +0 -7
- package/dist/argv/flags.js.map +0 -7
- package/dist/argv/parse.js.map +0 -7
- package/dist/arrays.js.map +0 -7
- package/dist/bin.js.map +0 -7
- package/dist/cacache.js.map +0 -7
- package/dist/cache-with-ttl.js.map +0 -7
- package/dist/constants/agents.js.map +0 -7
- package/dist/constants/core.js.map +0 -7
- package/dist/constants/encoding.js.map +0 -7
- package/dist/constants/github.js.map +0 -7
- package/dist/constants/licenses.js.map +0 -7
- package/dist/constants/node.js.map +0 -7
- package/dist/constants/packages.js.map +0 -7
- package/dist/constants/paths.js.map +0 -7
- package/dist/constants/platform.js.map +0 -7
- package/dist/constants/process.js.map +0 -7
- package/dist/constants/socket.js.map +0 -7
- package/dist/constants/testing.js.map +0 -7
- package/dist/constants/time.js.map +0 -7
- package/dist/constants/typescript.js.map +0 -7
- package/dist/cover/code.js.map +0 -7
- package/dist/cover/formatters.js.map +0 -7
- package/dist/cover/type.js.map +0 -7
- package/dist/cover/types.js.map +0 -7
- package/dist/debug.js.map +0 -7
- package/dist/dlx-binary.js.map +0 -7
- package/dist/dlx-manifest.js.map +0 -7
- package/dist/dlx-package.js.map +0 -7
- package/dist/dlx.js.map +0 -7
- package/dist/effects/pulse-frames.js.map +0 -7
- package/dist/effects/text-shimmer.js.map +0 -7
- package/dist/effects/types.js.map +0 -7
- package/dist/effects/ultra.js.map +0 -7
- package/dist/env/ci.js.map +0 -7
- package/dist/env/debug.js.map +0 -7
- package/dist/env/github.js.map +0 -7
- package/dist/env/helpers.js.map +0 -7
- package/dist/env/home.js.map +0 -7
- package/dist/env/locale.js.map +0 -7
- package/dist/env/node-auth-token.js.map +0 -7
- package/dist/env/node-env.js.map +0 -7
- package/dist/env/npm.js.map +0 -7
- package/dist/env/package-manager.js.map +0 -7
- package/dist/env/path.js.map +0 -7
- package/dist/env/pre-commit.js.map +0 -7
- package/dist/env/rewire.js.map +0 -7
- package/dist/env/shell.js.map +0 -7
- package/dist/env/socket-cli-shadow.js.map +0 -7
- package/dist/env/socket-cli.js.map +0 -7
- package/dist/env/socket.js.map +0 -7
- package/dist/env/temp-dir.js.map +0 -7
- package/dist/env/term.js.map +0 -7
- package/dist/env/test.js.map +0 -7
- package/dist/env/windows.js.map +0 -7
- package/dist/env/xdg.js.map +0 -7
- package/dist/env.js.map +0 -7
- package/dist/external/@npmcli/package-json/index.js +0 -1
- package/dist/external/@socketregistry/is-unicode-supported.d.ts +0 -2
- package/dist/external/@socketregistry/yocto-spinner.d.ts +0 -12
- package/dist/external/@yarnpkg/extensions.d.ts +0 -4
- package/dist/external/cacache.d.ts +0 -86
- package/dist/external/debug.d.ts +0 -22
- package/dist/external/del.d.ts +0 -1
- package/dist/external/fast-sort.d.ts +0 -3
- package/dist/external/get-east-asian-width.d.ts +0 -5
- package/dist/external/libnpmexec.d.ts +0 -33
- package/dist/external/libnpmpack.d.ts +0 -2
- package/dist/external/make-fetch-happen.d.ts +0 -15
- package/dist/external/pacote.d.ts +0 -14
- package/dist/external/semver.d.ts +0 -2
- package/dist/external/yargs-parser.d.ts +0 -2
- package/dist/external/yoctocolors-cjs.d.ts +0 -52
- package/dist/external/zod.d.ts +0 -1
- package/dist/fs.js.map +0 -7
- package/dist/functions.js.map +0 -7
- package/dist/git.js.map +0 -7
- package/dist/github.js.map +0 -7
- package/dist/globs.js.map +0 -7
- package/dist/http-request.js.map +0 -7
- package/dist/ipc.js.map +0 -7
- package/dist/json.js.map +0 -7
- package/dist/links/index.js.map +0 -7
- package/dist/logger.js.map +0 -7
- package/dist/maintained-node-versions.js.map +0 -7
- package/dist/memoization.js.map +0 -7
- package/dist/objects.js.map +0 -7
- package/dist/packages/editable.js.map +0 -7
- package/dist/packages/exports.js.map +0 -7
- package/dist/packages/isolation.js.map +0 -7
- package/dist/packages/licenses.js.map +0 -7
- package/dist/packages/manifest.js.map +0 -7
- package/dist/packages/normalize.js.map +0 -7
- package/dist/packages/operations.js.map +0 -7
- package/dist/packages/paths.js.map +0 -7
- package/dist/packages/provenance.js.map +0 -7
- package/dist/packages/specs.js.map +0 -7
- package/dist/packages/validation.js.map +0 -7
- package/dist/packages.js.map +0 -7
- package/dist/path.js.map +0 -7
- package/dist/paths/rewire.js.map +0 -7
- package/dist/paths.js.map +0 -7
- package/dist/performance.js.map +0 -7
- package/dist/process-lock.js.map +0 -7
- package/dist/promise-queue.js.map +0 -7
- package/dist/promises.js.map +0 -7
- package/dist/regexps.js.map +0 -7
- package/dist/sea.js.map +0 -7
- package/dist/shadow.js.map +0 -7
- package/dist/signal-exit.js.map +0 -7
- package/dist/sorts.js.map +0 -7
- package/dist/spawn.js.map +0 -7
- package/dist/spinner.js.map +0 -7
- package/dist/ssri.js.map +0 -7
- package/dist/stdio/clear.js.map +0 -7
- package/dist/stdio/divider.js.map +0 -7
- package/dist/stdio/footer.js.map +0 -7
- package/dist/stdio/header.js.map +0 -7
- package/dist/stdio/mask.js.map +0 -7
- package/dist/stdio/progress.js.map +0 -7
- package/dist/stdio/prompts.js.map +0 -7
- package/dist/stdio/stderr.js.map +0 -7
- package/dist/stdio/stdout.js.map +0 -7
- package/dist/streams.js.map +0 -7
- package/dist/strings.js.map +0 -7
- package/dist/suppress-warnings.js.map +0 -7
- package/dist/tables.js.map +0 -7
- package/dist/temporary-executor.js.map +0 -7
- package/dist/themes/context.js.map +0 -7
- package/dist/themes/index.js.map +0 -7
- package/dist/themes/themes.js.map +0 -7
- package/dist/themes/types.js.map +0 -7
- package/dist/themes/utils.js.map +0 -7
- package/dist/types.js.map +0 -7
- package/dist/url.js.map +0 -7
- package/dist/utils/get-ipc.js.map +0 -7
- package/dist/validation/json-parser.js.map +0 -7
- package/dist/validation/types.js.map +0 -7
- package/dist/versions.js.map +0 -7
- package/dist/words.js.map +0 -7
- package/dist/zod.js.map +0 -7
package/dist/logger.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/logger.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Console logging utilities with line prefix support.\n * Provides enhanced console methods with formatted output capabilities.\n */\n\nimport isUnicodeSupported from './external/@socketregistry/is-unicode-supported'\nimport yoctocolorsCjs from './external/yoctocolors-cjs'\nimport { applyLinePrefix, isBlankString } from './strings'\nimport type { ColorValue } from './spinner'\nimport { getTheme, onThemeChange } from './themes/context'\nimport { THEMES } from './themes/themes'\n\n/**\n * Log symbols for terminal output with colored indicators.\n *\n * Each symbol provides visual feedback for different message types, with\n * Unicode and ASCII fallback support.\n *\n * @example\n * ```typescript\n * import { LOG_SYMBOLS } from '@socketsecurity/lib'\n *\n * console.log(`${LOG_SYMBOLS.success} Operation completed`)\n * console.log(`${LOG_SYMBOLS.fail} Operation failed`)\n * console.log(`${LOG_SYMBOLS.warn} Warning message`)\n * console.log(`${LOG_SYMBOLS.info} Information message`)\n * console.log(`${LOG_SYMBOLS.step} Processing step`)\n * ```\n */\ntype LogSymbols = {\n /** Red colored failure symbol (\u2716 or \u00D7 in ASCII) */\n fail: string\n /** Blue colored information symbol (\u2139 or i in ASCII) */\n info: string\n /** Cyan colored step symbol (\u2192 or > in ASCII) */\n step: string\n /** Green colored success symbol (\u2714 or \u221A in ASCII) */\n success: string\n /** Yellow colored warning symbol (\u26A0 or \u203C in ASCII) */\n warn: string\n}\n\n/**\n * Type definition for logger methods that mirror console methods.\n *\n * All methods return the logger instance for method chaining.\n */\ntype LoggerMethods = {\n [K in keyof typeof console]: (typeof console)[K] extends (\n ...args: infer A\n ) => any\n ? (...args: A) => Logger\n : (typeof console)[K]\n}\n\n/**\n * A task that can be executed with automatic start/complete logging.\n *\n * @example\n * ```typescript\n * const task = logger.createTask('Database migration')\n * task.run(() => {\n * // Migration logic here\n * })\n * // Logs: \"Starting task: Database migration\"\n * // Logs: \"Completed task: Database migration\"\n * ```\n */\ninterface Task {\n /**\n * Executes the task function with automatic logging.\n *\n * @template T - The return type of the task function\n * @param f - The function to execute\n * @returns The result of the task function\n */\n run<T>(f: () => T): T\n}\n\nexport type { LogSymbols, LoggerMethods, Task }\n\nconst globalConsole = console\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ReflectApply = Reflect.apply\nconst ReflectConstruct = Reflect.construct\n\nlet _Console: typeof import('console').Console | undefined\n/**\n * Construct a new Console instance.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction constructConsole(...args: unknown[]) {\n if (_Console === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n const nodeConsole = /*@__PURE__*/ require('node:console')\n _Console = nodeConsole.Console\n }\n return ReflectConstruct(\n _Console! as new (\n ...args: unknown[]\n ) => Console, // eslint-disable-line no-undef\n args,\n )\n}\n\n/**\n * Get the yoctocolors module for terminal colors.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getYoctocolors() {\n return yoctocolorsCjs\n}\n\n/**\n * Apply a color to text using yoctocolors.\n * Handles both named colors and RGB tuples.\n * @private\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction applyColor(\n text: string,\n color: ColorValue,\n colors: typeof yoctocolorsCjs,\n): string {\n if (typeof color === 'string') {\n // Named color like 'green', 'red', etc.\n return (colors as any)[color](text)\n }\n // RGB tuple [r, g, b]\n return colors.rgb(color[0], color[1], color[2])(text)\n}\n\n/**\n * Log symbols for terminal output with colored indicators.\n *\n * Provides colored Unicode symbols (\u2714, \u2716, \u26A0, \u2139, \u2192) with ASCII fallbacks (\u221A, \u00D7, \u203C, i, >)\n * for terminals that don't support Unicode. Symbols are colored according to the active\n * theme's color palette (success, error, warning, info, step).\n *\n * The symbols are lazily initialized on first access and automatically update when the\n * fallback theme changes (via setTheme()). Note that LOG_SYMBOLS reflect the global\n * fallback theme, not async-local theme contexts from withTheme().\n *\n * @example\n * ```typescript\n * import { LOG_SYMBOLS } from '@socketsecurity/lib'\n *\n * console.log(`${LOG_SYMBOLS.success} Build completed`) // Theme success color \u2714\n * console.log(`${LOG_SYMBOLS.fail} Build failed`) // Theme error color \u2716\n * console.log(`${LOG_SYMBOLS.warn} Deprecated API used`) // Theme warning color \u26A0\n * console.log(`${LOG_SYMBOLS.info} Starting process`) // Theme info color \u2139\n * console.log(`${LOG_SYMBOLS.step} Processing files`) // Theme step color \u2192\n * ```\n */\nexport const LOG_SYMBOLS = /*@__PURE__*/ (() => {\n const target: Record<string, string> = {\n __proto__: null,\n } as unknown as Record<string, string>\n\n let initialized = false\n\n // Mutable handler to simulate a frozen target.\n const handler: ProxyHandler<Record<string, string>> = {\n __proto__: null,\n } as unknown as ProxyHandler<Record<string, string>>\n\n const updateSymbols = () => {\n const supported = isUnicodeSupported()\n const colors = getYoctocolors()\n const theme = getTheme()\n\n // Get colors from theme\n const successColor = theme.colors.success\n const errorColor = theme.colors.error\n const warningColor = theme.colors.warning\n const infoColor = theme.colors.info\n const stepColor = theme.colors.step\n\n // Update symbol values\n target.fail = applyColor(supported ? '\u2716' : '\u00D7', errorColor, colors)\n target.info = applyColor(supported ? '\u2139' : 'i', infoColor, colors)\n target.step = applyColor(supported ? '\u2192' : '>', stepColor, colors)\n target.success = applyColor(supported ? '\u2714' : '\u221A', successColor, colors)\n target.warn = applyColor(supported ? '\u26A0' : '\u203C', warningColor, colors)\n }\n\n const init = () => {\n if (initialized) {\n return\n }\n\n updateSymbols()\n initialized = true\n\n // The handler of a Proxy is mutable after proxy instantiation.\n // We delete the traps to defer to native behavior for better performance.\n for (const trapName in handler) {\n delete handler[trapName as keyof ProxyHandler<Record<string, string>>]\n }\n }\n\n const reset = () => {\n if (!initialized) {\n return\n }\n\n // Update symbols with new theme colors\n updateSymbols()\n }\n\n for (const trapName of Reflect.ownKeys(Reflect)) {\n const fn = (Reflect as Record<PropertyKey, unknown>)[trapName]\n if (typeof fn === 'function') {\n ;(handler as Record<string, (...args: unknown[]) => unknown>)[\n trapName as string\n ] = (...args: unknown[]) => {\n init()\n return fn(...args)\n }\n }\n }\n\n // Listen for theme changes and reset symbols\n onThemeChange(() => {\n reset()\n })\n\n return new Proxy(target, handler)\n})()\n\nconst boundConsoleEntries = [\n // Add bound properties from console[kBindProperties](ignoreErrors, colorMode, groupIndentation).\n // https://github.com/nodejs/node/blob/v24.0.1/lib/internal/console/constructor.js#L230-L265\n '_stderrErrorHandler',\n '_stdoutErrorHandler',\n // Add methods that need to be bound to function properly.\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'createTask',\n 'debug',\n 'dir',\n 'dirxml',\n 'error',\n // Skip group methods because in at least Node 20 with the Node --frozen-intrinsics\n // flag it triggers a readonly property for Symbol(kGroupIndent). Instead, we\n // implement these methods ourselves.\n //'group',\n //'groupCollapsed',\n //'groupEnd',\n 'info',\n 'log',\n 'table',\n 'time',\n 'timeEnd',\n 'timeLog',\n 'trace',\n 'warn',\n]\n .filter(n => typeof (globalConsole as any)[n] === 'function')\n .map(n => [n, (globalConsole as any)[n].bind(globalConsole)])\n\nconst consolePropAttributes = {\n __proto__: null,\n writable: true,\n enumerable: false,\n configurable: true,\n}\nconst maxIndentation = 1000\n\n/**\n * WeakMap storing the Console instance for each Logger.\n *\n * Console creation is lazy - deferred until first logging method call.\n * This allows logger to be imported during early Node.js bootstrap before\n * stdout is ready, avoiding ERR_CONSOLE_WRITABLE_STREAM errors.\n */\nconst privateConsole = new WeakMap()\n\n/**\n * WeakMap storing constructor arguments for lazy Console initialization.\n *\n * WeakMap is required instead of a private field (#constructorArgs) because:\n * 1. Private fields can't be accessed from dynamically created functions\n * 2. Logger adds console methods dynamically to its prototype (lines 1560+)\n * 3. These dynamic methods need constructor args for lazy initialization\n * 4. WeakMap allows both regular methods and dynamic functions to access args\n *\n * The args are deleted from the WeakMap after Console is created (memory cleanup).\n */\nconst privateConstructorArgs = new WeakMap()\n\n/**\n * Lazily get console symbols on first access.\n *\n * Deferred to avoid accessing global console during early Node.js bootstrap\n * before stdout is ready.\n * @private\n */\nlet _consoleSymbols: symbol[] | undefined\nfunction getConsoleSymbols(): symbol[] {\n if (_consoleSymbols === undefined) {\n _consoleSymbols = Object.getOwnPropertySymbols(globalConsole)\n }\n return _consoleSymbols\n}\n\n/**\n * Symbol for incrementing the internal log call counter.\n *\n * This is an internal symbol used to track the number of times logging\n * methods have been called on a logger instance.\n */\nexport const incLogCallCountSymbol = Symbol.for('logger.logCallCount++')\n\n/**\n * Lazily get kGroupIndentationWidth symbol on first access.\n * @private\n */\nlet _kGroupIndentationWidthSymbol: symbol | undefined\nfunction getKGroupIndentationWidthSymbol(): symbol {\n if (_kGroupIndentationWidthSymbol === undefined) {\n _kGroupIndentationWidthSymbol =\n getConsoleSymbols().find(s => (s as any).label === 'kGroupIndentWidth') ??\n Symbol('kGroupIndentWidth')\n }\n return _kGroupIndentationWidthSymbol\n}\n\n/**\n * Symbol for tracking whether the last logged line was blank.\n *\n * This is used internally to prevent multiple consecutive blank lines\n * and to determine whether to add spacing before certain messages.\n */\nexport const lastWasBlankSymbol = Symbol.for('logger.lastWasBlank')\n\n/**\n * Enhanced console logger with indentation, colored symbols, and stream management.\n *\n * Provides a fluent API for logging with automatic indentation tracking, colored\n * status symbols, separate stderr/stdout management, and method chaining. All\n * methods return `this` for easy chaining.\n *\n * Features:\n * - Automatic line prefixing with indentation\n * - Colored status symbols (success, fail, warn, info)\n * - Separate indentation tracking for stderr and stdout\n * - Stream-bound logger instances via `.stderr` and `.stdout`\n * - Group/indentation management\n * - Progress indicators with clearable lines\n * - Task execution with automatic logging\n *\n * @example\n * ```typescript\n * import { logger } from '@socketsecurity/lib'\n *\n * // Basic logging with symbols\n * logger.success('Build completed')\n * logger.fail('Build failed')\n * logger.warn('Deprecated API')\n * logger.info('Starting process')\n *\n * // Indentation and grouping\n * logger.log('Processing files:')\n * logger.indent()\n * logger.log('file1.js')\n * logger.log('file2.js')\n * logger.dedent()\n *\n * // Method chaining\n * logger\n * .log('Step 1')\n * .indent()\n * .log('Substep 1.1')\n * .log('Substep 1.2')\n * .dedent()\n * .log('Step 2')\n *\n * // Stream-specific logging\n * logger.stdout.log('Normal output')\n * logger.stderr.error('Error message')\n *\n * // Progress indicators\n * logger.progress('Processing...')\n * // ... do work ...\n * logger.clearLine()\n * logger.success('Done')\n *\n * // Task execution\n * const task = logger.createTask('Migration')\n * task.run(() => {\n * // Migration logic\n * })\n * ```\n */\n/*@__PURE__*/\nexport class Logger {\n /**\n * Static reference to log symbols for convenience.\n *\n * @example\n * ```typescript\n * console.log(`${Logger.LOG_SYMBOLS.success} Done`)\n * ```\n */\n static LOG_SYMBOLS = LOG_SYMBOLS\n\n #parent?: Logger\n #boundStream?: 'stderr' | 'stdout'\n #stderrLogger?: Logger\n #stdoutLogger?: Logger\n #stderrIndention = ''\n #stdoutIndention = ''\n #stderrLastWasBlank = false\n #stdoutLastWasBlank = false\n #logCallCount = 0\n #options: Record<string, unknown>\n #originalStdout?: any\n #theme?: import('./themes/types').Theme\n\n /**\n * Creates a new Logger instance.\n *\n * When called without arguments, creates a logger using the default\n * `process.stdout` and `process.stderr` streams. Can accept custom\n * console constructor arguments for advanced use cases.\n *\n * @param args - Optional console constructor arguments\n *\n * @example\n * ```typescript\n * // Default logger\n * const logger = new Logger()\n *\n * // Custom streams (advanced)\n * const customLogger = new Logger({\n * stdout: customWritableStream,\n * stderr: customErrorStream\n * })\n * ```\n */\n constructor(...args: unknown[]) {\n // Store constructor args for lazy Console initialization.\n privateConstructorArgs.set(this, args)\n\n // Store options if provided (for future extensibility)\n const options = args['0']\n if (typeof options === 'object' && options !== null) {\n this.#options = { __proto__: null, ...options }\n // Store reference to original stdout stream to bypass Console formatting\n this.#originalStdout = (options as any).stdout\n\n // Handle theme option\n const themeOption = (options as any).theme\n if (themeOption) {\n if (typeof themeOption === 'string') {\n // Theme name - resolve to Theme object\n this.#theme = THEMES[themeOption]\n } else {\n // Theme object\n this.#theme = themeOption\n }\n }\n } else {\n this.#options = { __proto__: null }\n }\n\n // Note: Console initialization is now lazy (happens on first use).\n // This allows logger to be imported during early bootstrap before\n // stdout is ready, avoiding ERR_CONSOLE_WRITABLE_STREAM errors.\n }\n\n /**\n * Get the Console instance for this logger, creating it lazily on first access.\n *\n * This lazy initialization allows the logger to be imported during early\n * Node.js bootstrap before stdout is ready, avoiding Console initialization\n * errors (ERR_CONSOLE_WRITABLE_STREAM).\n *\n * @private\n */\n #getConsole(): typeof console & Record<string, unknown> {\n // Ensure prototype is initialized before creating Console.\n ensurePrototypeInitialized()\n\n let con = privateConsole.get(this)\n if (!con) {\n // Lazy initialization - create Console on first use.\n const ctorArgs = privateConstructorArgs.get(this) ?? []\n if (ctorArgs.length) {\n con = constructConsole(...ctorArgs)\n } else {\n // Create a new console that acts like the builtin one so that it will\n // work with Node's --frozen-intrinsics flag.\n con = constructConsole({\n stdout: process.stdout,\n stderr: process.stderr,\n }) as typeof console & Record<string, unknown>\n for (const { 0: key, 1: method } of boundConsoleEntries) {\n con[key] = method\n }\n }\n privateConsole.set(this, con)\n // Clean up constructor args - no longer needed after Console creation.\n privateConstructorArgs.delete(this)\n }\n return con\n }\n\n /**\n * Gets a logger instance bound exclusively to stderr.\n *\n * All logging operations on this instance will write to stderr only.\n * Indentation is tracked separately from stdout. The instance is\n * cached and reused on subsequent accesses.\n *\n * @returns A logger instance bound to stderr\n *\n * @example\n * ```typescript\n * // Write errors to stderr\n * logger.stderr.error('Configuration invalid')\n * logger.stderr.warn('Using fallback settings')\n *\n * // Indent only affects stderr\n * logger.stderr.indent()\n * logger.stderr.error('Nested error details')\n * logger.stderr.dedent()\n * ```\n */\n get stderr(): Logger {\n if (!this.#stderrLogger) {\n // Pass parent's constructor args to maintain config.\n const ctorArgs = privateConstructorArgs.get(this) ?? []\n const instance = new Logger(...ctorArgs)\n instance.#parent = this\n instance.#boundStream = 'stderr'\n instance.#options = { __proto__: null, ...this.#options }\n instance.#theme = this.#theme\n this.#stderrLogger = instance\n }\n return this.#stderrLogger\n }\n\n /**\n * Gets a logger instance bound exclusively to stdout.\n *\n * All logging operations on this instance will write to stdout only.\n * Indentation is tracked separately from stderr. The instance is\n * cached and reused on subsequent accesses.\n *\n * @returns A logger instance bound to stdout\n *\n * @example\n * ```typescript\n * // Write normal output to stdout\n * logger.stdout.log('Processing started')\n * logger.stdout.log('Items processed: 42')\n *\n * // Indent only affects stdout\n * logger.stdout.indent()\n * logger.stdout.log('Detailed output')\n * logger.stdout.dedent()\n * ```\n */\n get stdout(): Logger {\n if (!this.#stdoutLogger) {\n // Pass parent's constructor args to maintain config.\n const ctorArgs = privateConstructorArgs.get(this) ?? []\n const instance = new Logger(...ctorArgs)\n instance.#parent = this\n instance.#boundStream = 'stdout'\n instance.#options = { __proto__: null, ...this.#options }\n instance.#theme = this.#theme\n this.#stdoutLogger = instance\n }\n return this.#stdoutLogger\n }\n\n /**\n * Get the root logger (for accessing shared indentation state).\n * @private\n */\n #getRoot(): Logger {\n return this.#parent || this\n }\n\n /**\n * Get the resolved theme for this logger instance.\n * Returns instance theme if set, otherwise falls back to context theme.\n * @private\n */\n #getTheme(): import('./themes/types').Theme {\n return this.#theme ?? getTheme()\n }\n\n /**\n * Get logger-specific symbols using the resolved theme.\n * @private\n */\n #getSymbols(): LogSymbols {\n const theme = this.#getTheme()\n const supported = isUnicodeSupported()\n const colors = getYoctocolors()\n\n return {\n __proto__: null,\n fail: applyColor(supported ? '\u2716' : '\u00D7', theme.colors.error, colors),\n info: applyColor(supported ? '\u2139' : 'i', theme.colors.info, colors),\n step: applyColor(supported ? '\u2192' : '>', theme.colors.step, colors),\n success: applyColor(supported ? '\u2714' : '\u221A', theme.colors.success, colors),\n warn: applyColor(supported ? '\u26A0' : '\u203C', theme.colors.warning, colors),\n } as LogSymbols\n }\n\n /**\n * Get indentation for a specific stream.\n * @private\n */\n #getIndent(stream: 'stderr' | 'stdout'): string {\n const root = this.#getRoot()\n return stream === 'stderr' ? root.#stderrIndention : root.#stdoutIndention\n }\n\n /**\n * Set indentation for a specific stream.\n * @private\n */\n #setIndent(stream: 'stderr' | 'stdout', value: string): void {\n const root = this.#getRoot()\n if (stream === 'stderr') {\n root.#stderrIndention = value\n } else {\n root.#stdoutIndention = value\n }\n }\n\n /**\n * Get lastWasBlank state for a specific stream.\n * @private\n */\n #getLastWasBlank(stream: 'stderr' | 'stdout'): boolean {\n const root = this.#getRoot()\n return stream === 'stderr'\n ? root.#stderrLastWasBlank\n : root.#stdoutLastWasBlank\n }\n\n /**\n * Set lastWasBlank state for a specific stream.\n * @private\n */\n #setLastWasBlank(stream: 'stderr' | 'stdout', value: boolean): void {\n const root = this.#getRoot()\n if (stream === 'stderr') {\n root.#stderrLastWasBlank = value\n } else {\n root.#stdoutLastWasBlank = value\n }\n }\n\n /**\n * Get the target stream for this logger instance.\n * @private\n */\n #getTargetStream(): 'stderr' | 'stdout' {\n return this.#boundStream || 'stderr'\n }\n\n /**\n * Apply a console method with indentation.\n * @private\n */\n #apply(\n methodName: string,\n args: unknown[],\n stream?: 'stderr' | 'stdout',\n ): this {\n const con = this.#getConsole()\n const text = args.at(0)\n const hasText = typeof text === 'string'\n // Determine which stream this method writes to\n const targetStream = stream || (methodName === 'log' ? 'stdout' : 'stderr')\n const indent = this.#getIndent(targetStream)\n const logArgs = hasText\n ? [applyLinePrefix(text, { prefix: indent }), ...args.slice(1)]\n : args\n ReflectApply(\n con[methodName] as (...args: unknown[]) => unknown,\n con,\n logArgs,\n )\n this[lastWasBlankSymbol](hasText && isBlankString(logArgs[0]), targetStream)\n ;(this as any)[incLogCallCountSymbol]()\n return this\n }\n\n /**\n * Strip log symbols from the start of text.\n * @private\n */\n #stripSymbols(text: string): string {\n // Strip both unicode and emoji forms of log symbols from the start.\n // Matches: \u2716, \u2717, \u00D7, \u2716\uFE0F, \u26A0, \u203C, \u26A0\uFE0F, \u2714, \u2713, \u221A, \u2714\uFE0F, \u2713\uFE0F, \u2139, \u2139\uFE0F, \u2192, >\n // Also handles variation selectors (U+FE0F) and whitespace after symbol.\n // Note: We don't strip standalone 'i' or '>' to avoid breaking words.\n return text.replace(/^[\u2716\u2717\u00D7\u26A0\u203C\u2714\u2713\u221A\u2139\u2192]\\uFE0F?\\s*/u, '')\n }\n\n /**\n * Apply a method with a symbol prefix.\n * @private\n */\n #symbolApply(symbolType: string, args: unknown[]): this {\n const con = this.#getConsole()\n let text = args.at(0)\n // biome-ignore lint/suspicious/noImplicitAnyLet: Flexible argument handling.\n let extras\n if (typeof text === 'string') {\n text = this.#stripSymbols(text)\n extras = args.slice(1)\n } else {\n extras = args\n text = ''\n }\n // Note: Meta status messages (info/fail/etc) always go to stderr.\n const indent = this.#getIndent('stderr')\n const symbols = this.#getSymbols()\n con.error(\n applyLinePrefix(`${symbols[symbolType]} ${text}`, {\n prefix: indent,\n }),\n ...extras,\n )\n this[lastWasBlankSymbol](false, 'stderr')\n ;(this as any)[incLogCallCountSymbol]()\n return this\n }\n\n /**\n * Gets the total number of log calls made on this logger instance.\n *\n * Tracks all logging method calls including `log()`, `error()`, `warn()`,\n * `success()`, `fail()`, etc. Useful for testing and monitoring logging activity.\n *\n * @returns The number of times logging methods have been called\n *\n * @example\n * ```typescript\n * logger.log('Message 1')\n * logger.error('Message 2')\n * console.log(logger.logCallCount) // 2\n * ```\n */\n get logCallCount() {\n const root = this.#getRoot()\n return root.#logCallCount\n }\n\n /**\n * Increments the internal log call counter.\n *\n * This is called automatically by logging methods and should not\n * be called directly in normal usage.\n *\n * @returns The logger instance for chaining\n */\n [incLogCallCountSymbol]() {\n const root = this.#getRoot()\n root.#logCallCount += 1\n return this\n }\n\n /**\n * Sets whether the last logged line was blank.\n *\n * Used internally to track blank lines and prevent duplicate spacing.\n * This is called automatically by logging methods.\n *\n * @param value - Whether the last line was blank\n * @param stream - Optional stream to update (defaults to both streams if not bound, or target stream if bound)\n * @returns The logger instance for chaining\n */\n [lastWasBlankSymbol](value: unknown, stream?: 'stderr' | 'stdout'): this {\n if (stream) {\n // Explicit stream specified\n this.#setLastWasBlank(stream, !!value)\n } else if (this.#boundStream) {\n // Stream-bound logger - affect only the bound stream\n this.#setLastWasBlank(this.#boundStream, !!value)\n } else {\n // Root logger with no stream specified - affect both streams\n this.#setLastWasBlank('stderr', !!value)\n this.#setLastWasBlank('stdout', !!value)\n }\n return this\n }\n\n /**\n * Logs an assertion failure message if the value is falsy.\n *\n * Works like `console.assert()` but returns the logger for chaining.\n * If the value is truthy, nothing is logged. If falsy, logs an error\n * message with an assertion failure.\n *\n * @param value - The value to test\n * @param message - Optional message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.assert(true, 'This will not log')\n * logger.assert(false, 'Assertion failed: value is false')\n * logger.assert(items.length > 0, 'No items found')\n * ```\n */\n assert(value: unknown, ...message: unknown[]): this {\n const con = this.#getConsole()\n con.assert(value, message[0] as string, ...message.slice(1))\n this[lastWasBlankSymbol](false)\n return value ? this : this[incLogCallCountSymbol]()\n }\n\n /**\n * Clears the visible terminal screen.\n *\n * Only available on the main logger instance, not on stream-bound instances\n * (`.stderr` or `.stdout`). Resets the log call count and blank line tracking\n * if the output is a TTY.\n *\n * @returns The logger instance for chaining\n * @throws {Error} If called on a stream-bound logger instance\n *\n * @example\n * ```typescript\n * logger.log('Some output')\n * logger.clearVisible() // Screen is now clear\n *\n * // Error: Can't call on stream-bound instance\n * logger.stderr.clearVisible() // throws\n * ```\n */\n clearVisible() {\n if (this.#boundStream) {\n throw new Error(\n 'clearVisible() is only available on the main logger instance, not on stream-bound instances',\n )\n }\n const con = this.#getConsole()\n con.clear()\n if ((con as any)._stdout.isTTY) {\n ;(this as any)[lastWasBlankSymbol](true)\n this.#logCallCount = 0\n }\n return this\n }\n\n /**\n * Increments and logs a counter for the given label.\n *\n * Each unique label maintains its own counter. Works like `console.count()`.\n *\n * @param label - Optional label for the counter\n * @default 'default'\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.count('requests') // requests: 1\n * logger.count('requests') // requests: 2\n * logger.count('errors') // errors: 1\n * logger.count() // default: 1\n * ```\n */\n count(label?: string | undefined): this {\n const con = this.#getConsole()\n con.count(label)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Creates a task that logs start and completion messages automatically.\n *\n * Returns a task object with a `run()` method that executes the provided\n * function and logs \"Starting task: {name}\" before execution and\n * \"Completed task: {name}\" after completion.\n *\n * @param name - The name of the task\n * @returns A task object with a `run()` method\n *\n * @example\n * ```typescript\n * const task = logger.createTask('Database Migration')\n * const result = task.run(() => {\n * // Logs: \"Starting task: Database Migration\"\n * migrateDatabase()\n * return 'success'\n * // Logs: \"Completed task: Database Migration\"\n * })\n * console.log(result) // 'success'\n * ```\n */\n createTask(name: string): Task {\n return {\n run: <T>(f: () => T): T => {\n this.log(`Starting task: ${name}`)\n const result = f()\n this.log(`Completed task: ${name}`)\n return result\n },\n }\n }\n\n /**\n * Decreases the indentation level by removing spaces from the prefix.\n *\n * When called on the main logger, affects both stderr and stdout indentation.\n * When called on a stream-bound logger (`.stderr` or `.stdout`), affects\n * only that stream's indentation.\n *\n * @param spaces - Number of spaces to remove from indentation\n * @default 2\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.indent()\n * logger.log('Indented')\n * logger.dedent()\n * logger.log('Back to normal')\n *\n * // Remove custom amount\n * logger.indent(4)\n * logger.log('Four spaces')\n * logger.dedent(4)\n *\n * // Stream-specific dedent\n * logger.stdout.indent()\n * logger.stdout.log('Indented stdout')\n * logger.stdout.dedent()\n * ```\n */\n dedent(spaces = 2) {\n if (this.#boundStream) {\n // Only affect bound stream\n const current = this.#getIndent(this.#boundStream)\n this.#setIndent(this.#boundStream, current.slice(0, -spaces))\n } else {\n // Affect both streams\n const stderrCurrent = this.#getIndent('stderr')\n const stdoutCurrent = this.#getIndent('stdout')\n this.#setIndent('stderr', stderrCurrent.slice(0, -spaces))\n this.#setIndent('stdout', stdoutCurrent.slice(0, -spaces))\n }\n return this\n }\n\n /**\n * Displays an object's properties in a formatted way.\n *\n * Works like `console.dir()` with customizable options for depth,\n * colors, etc. Useful for inspecting complex objects.\n *\n * @param obj - The object to display\n * @param options - Optional formatting options (Node.js inspect options)\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: { c: 2, d: { e: 3 } } }\n * logger.dir(obj)\n * logger.dir(obj, { depth: 1 }) // Limit nesting depth\n * logger.dir(obj, { colors: true }) // Enable colors\n * ```\n */\n dir(obj: unknown, options?: unknown | undefined): this {\n const con = this.#getConsole()\n con.dir(obj, options)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Displays data as XML/HTML in a formatted way.\n *\n * Works like `console.dirxml()`. In Node.js, behaves the same as `dir()`.\n *\n * @param data - The data to display\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.dirxml(document.body) // In browser environments\n * logger.dirxml(xmlObject) // In Node.js\n * ```\n */\n dirxml(...data: unknown[]): this {\n const con = this.#getConsole()\n con.dirxml(data)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Logs an error message to stderr.\n *\n * Automatically applies current indentation. All arguments are formatted\n * and logged like `console.error()`.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.error('Build failed')\n * logger.error('Error code:', 500)\n * logger.error('Details:', { message: 'Not found' })\n * ```\n */\n error(...args: unknown[]): this {\n return this.#apply('error', args)\n }\n\n /**\n * Logs a newline to stderr only if the last line wasn't already blank.\n *\n * Prevents multiple consecutive blank lines. Useful for adding spacing\n * between sections without creating excessive whitespace.\n *\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.error('Error message')\n * logger.errorNewline() // Adds blank line\n * logger.errorNewline() // Does nothing (already blank)\n * logger.error('Next section')\n * ```\n */\n errorNewline() {\n return this.#getLastWasBlank('stderr') ? this : this.error('')\n }\n\n /**\n * Logs a failure message with a red colored fail symbol.\n *\n * Automatically prefixes the message with `LOG_SYMBOLS.fail` (red \u2716).\n * Always outputs to stderr. If the message starts with an existing\n * symbol, it will be stripped and replaced.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.fail('Build failed')\n * logger.fail('Test suite failed:', { passed: 5, failed: 3 })\n * ```\n */\n fail(...args: unknown[]): this {\n return this.#symbolApply('fail', args)\n }\n\n /**\n * Starts a new indented log group.\n *\n * If a label is provided, it's logged before increasing indentation.\n * Groups can be nested. Each group increases indentation by the\n * `kGroupIndentWidth` (default 2 spaces). Call `groupEnd()` to close.\n *\n * @param label - Optional label to display before the group\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.group('Processing files:')\n * logger.log('file1.js')\n * logger.log('file2.js')\n * logger.groupEnd()\n *\n * // Nested groups\n * logger.group('Outer')\n * logger.log('Outer content')\n * logger.group('Inner')\n * logger.log('Inner content')\n * logger.groupEnd()\n * logger.groupEnd()\n * ```\n */\n group(...label: unknown[]): this {\n const { length } = label\n if (length) {\n ReflectApply(this.log, this, label)\n }\n this.indent((this as any)[getKGroupIndentationWidthSymbol()])\n if (length) {\n ;(this as any)[lastWasBlankSymbol](false)\n ;(this as any)[incLogCallCountSymbol]()\n }\n return this\n }\n\n /**\n * Starts a new collapsed log group (alias for `group()`).\n *\n * In browser consoles, this creates a collapsed group. In Node.js,\n * it behaves identically to `group()`.\n *\n * @param label - Optional label to display before the group\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.groupCollapsed('Details')\n * logger.log('Hidden by default in browsers')\n * logger.groupEnd()\n * ```\n */\n // groupCollapsed is an alias of group.\n // https://nodejs.org/api/console.html#consolegroupcollapsed\n groupCollapsed(...label: unknown[]): this {\n return ReflectApply(this.group, this, label)\n }\n\n /**\n * Ends the current log group and decreases indentation.\n *\n * Must be called once for each `group()` or `groupCollapsed()` call\n * to properly close the group and restore indentation.\n *\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.group('Group 1')\n * logger.log('Content')\n * logger.groupEnd() // Closes 'Group 1'\n * ```\n */\n groupEnd() {\n this.dedent((this as any)[getKGroupIndentationWidthSymbol()])\n return this\n }\n\n /**\n * Increases the indentation level by adding spaces to the prefix.\n *\n * When called on the main logger, affects both stderr and stdout indentation.\n * When called on a stream-bound logger (`.stderr` or `.stdout`), affects\n * only that stream's indentation. Maximum indentation is 1000 spaces.\n *\n * @param spaces - Number of spaces to add to indentation\n * @default 2\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.log('Level 0')\n * logger.indent()\n * logger.log('Level 1')\n * logger.indent()\n * logger.log('Level 2')\n * logger.dedent()\n * logger.dedent()\n *\n * // Custom indent amount\n * logger.indent(4)\n * logger.log('Indented 4 spaces')\n * logger.dedent(4)\n *\n * // Stream-specific indent\n * logger.stdout.indent()\n * logger.stdout.log('Only stdout is indented')\n * ```\n */\n indent(spaces = 2) {\n const spacesToAdd = ' '.repeat(Math.min(spaces, maxIndentation))\n if (this.#boundStream) {\n // Only affect bound stream\n const current = this.#getIndent(this.#boundStream)\n this.#setIndent(this.#boundStream, current + spacesToAdd)\n } else {\n // Affect both streams\n const stderrCurrent = this.#getIndent('stderr')\n const stdoutCurrent = this.#getIndent('stdout')\n this.#setIndent('stderr', stderrCurrent + spacesToAdd)\n this.#setIndent('stdout', stdoutCurrent + spacesToAdd)\n }\n return this\n }\n\n /**\n * Logs an informational message with a blue colored info symbol.\n *\n * Automatically prefixes the message with `LOG_SYMBOLS.info` (blue \u2139).\n * Always outputs to stderr. If the message starts with an existing\n * symbol, it will be stripped and replaced.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.info('Starting build process')\n * logger.info('Configuration loaded:', config)\n * logger.info('Using cache directory:', cacheDir)\n * ```\n */\n info(...args: unknown[]): this {\n return this.#symbolApply('info', args)\n }\n\n /**\n * Logs a message to stdout.\n *\n * Automatically applies current indentation. All arguments are formatted\n * and logged like `console.log()`. This is the primary method for\n * standard output.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.log('Processing complete')\n * logger.log('Items processed:', 42)\n * logger.log('Results:', { success: true, count: 10 })\n *\n * // Method chaining\n * logger.log('Step 1').log('Step 2').log('Step 3')\n * ```\n */\n log(...args: unknown[]): this {\n return this.#apply('log', args)\n }\n\n /**\n * Logs a newline to stdout only if the last line wasn't already blank.\n *\n * Prevents multiple consecutive blank lines. Useful for adding spacing\n * between sections without creating excessive whitespace.\n *\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.log('Section 1')\n * logger.logNewline() // Adds blank line\n * logger.logNewline() // Does nothing (already blank)\n * logger.log('Section 2')\n * ```\n */\n logNewline() {\n return this.#getLastWasBlank('stdout') ? this : this.log('')\n }\n\n /**\n * Resets all indentation to zero.\n *\n * When called on the main logger, resets both stderr and stdout indentation.\n * When called on a stream-bound logger (`.stderr` or `.stdout`), resets\n * only that stream's indentation.\n *\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.indent().indent().indent()\n * logger.log('Very indented')\n * logger.resetIndent()\n * logger.log('Back to zero indentation')\n *\n * // Reset only stdout\n * logger.stdout.resetIndent()\n * ```\n */\n resetIndent() {\n if (this.#boundStream) {\n // Only reset bound stream\n this.#setIndent(this.#boundStream, '')\n } else {\n // Reset both streams\n this.#setIndent('stderr', '')\n this.#setIndent('stdout', '')\n }\n return this\n }\n\n /**\n * Logs a main step message with a cyan arrow symbol and blank line before it.\n *\n * Automatically prefixes the message with `LOG_SYMBOLS.step` (cyan \u2192) and\n * adds a blank line before the message unless the last line was already blank.\n * Useful for marking major steps in a process with clear visual separation.\n * Always outputs to stdout. If the message starts with an existing symbol,\n * it will be stripped and replaced.\n *\n * @param msg - The step message to log\n * @param extras - Additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.step('Building project')\n * logger.log('Compiling TypeScript...')\n * logger.step('Running tests')\n * logger.log('Running test suite...')\n * // Output:\n * // [blank line]\n * // \u2192 Building project\n * // Compiling TypeScript...\n * // [blank line]\n * // \u2192 Running tests\n * // Running test suite...\n * ```\n */\n step(msg: string, ...extras: unknown[]): this {\n // Add blank line before the step message.\n if (!this.#getLastWasBlank('stdout')) {\n // Use this.log() to properly track the blank line.\n this.log('')\n }\n // Strip existing symbols from the message.\n const text = this.#stripSymbols(msg)\n // Note: Step messages always go to stdout (unlike info/fail/etc which go to stderr).\n const indent = this.#getIndent('stdout')\n const symbols = this.#getSymbols()\n const con = this.#getConsole() as typeof console & Record<string, unknown>\n con.log(\n applyLinePrefix(`${symbols.step} ${text}`, {\n prefix: indent,\n }),\n ...extras,\n )\n this[lastWasBlankSymbol](false, 'stdout')\n ;(this as any)[incLogCallCountSymbol]()\n return this\n }\n\n /**\n * Logs an indented substep message (stateless).\n *\n * Adds a 2-space indent to the message without affecting the logger's\n * indentation state. Useful for showing sub-items under a main step.\n *\n * @param msg - The substep message to log\n * @param extras - Additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.log('Installing dependencies:')\n * logger.substep('Installing react')\n * logger.substep('Installing typescript')\n * logger.substep('Installing eslint')\n * // Output:\n * // Installing dependencies:\n * // Installing react\n * // Installing typescript\n * // Installing eslint\n * ```\n */\n substep(msg: string, ...extras: unknown[]): this {\n // Add 2-space indent to the message.\n const indentedMsg = ` ${msg}`\n // Let log() handle all tracking.\n return this.log(indentedMsg, ...extras)\n }\n\n /**\n * Logs a success message with a green colored success symbol.\n *\n * Automatically prefixes the message with `LOG_SYMBOLS.success` (green \u2714).\n * Always outputs to stderr. If the message starts with an existing\n * symbol, it will be stripped and replaced.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.success('Build completed')\n * logger.success('Tests passed:', { total: 42, passed: 42 })\n * logger.success('Deployment successful')\n * ```\n */\n success(...args: unknown[]): this {\n return this.#symbolApply('success', args)\n }\n\n /**\n * Logs a completion message with a success symbol (alias for `success()`).\n *\n * Provides semantic clarity when marking something as \"done\". Does NOT\n * automatically clear the current line - call `clearLine()` first if\n * needed after using `progress()`.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.done('Task completed')\n *\n * // After progress indicator\n * logger.progress('Processing...')\n * // ... do work ...\n * logger.clearLine()\n * logger.done('Processing complete')\n * ```\n */\n done(...args: unknown[]): this {\n return this.#symbolApply('success', args)\n }\n\n /**\n * Displays data in a table format.\n *\n * Works like `console.table()`. Accepts arrays of objects or\n * objects with nested objects. Optionally specify which properties\n * to include in the table.\n *\n * @param tabularData - The data to display as a table\n * @param properties - Optional array of property names to include\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * // Array of objects\n * logger.table([\n * { name: 'Alice', age: 30 },\n * { name: 'Bob', age: 25 }\n * ])\n *\n * // Specify properties to show\n * logger.table(users, ['name', 'email'])\n *\n * // Object with nested objects\n * logger.table({\n * user1: { name: 'Alice', age: 30 },\n * user2: { name: 'Bob', age: 25 }\n * })\n * ```\n */\n table(\n tabularData: unknown,\n properties?: readonly string[] | undefined,\n ): this {\n const con = this.#getConsole()\n con.table(tabularData, properties)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Ends a timer and logs the elapsed time.\n *\n * Logs the duration since `console.time()` was called with the same\n * label. The timer is stopped and removed.\n *\n * @param label - Optional label for the timer\n * @default 'default'\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * console.time('operation')\n * // ... do work ...\n * logger.timeEnd('operation')\n * // Logs: \"operation: 123.456ms\"\n *\n * console.time()\n * // ... do work ...\n * logger.timeEnd()\n * // Logs: \"default: 123.456ms\"\n * ```\n */\n timeEnd(label?: string | undefined): this {\n const con = this.#getConsole()\n con.timeEnd(label)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Logs the current value of a timer without stopping it.\n *\n * Logs the duration since `console.time()` was called with the same\n * label, but keeps the timer running. Can include additional data\n * to log alongside the time.\n *\n * @param label - Optional label for the timer\n * @param data - Additional data to log with the time\n * @default 'default'\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * console.time('process')\n * // ... partial work ...\n * logger.timeLog('process', 'Checkpoint 1')\n * // Logs: \"process: 123.456ms Checkpoint 1\"\n * // ... more work ...\n * logger.timeLog('process', 'Checkpoint 2')\n * // Logs: \"process: 234.567ms Checkpoint 2\"\n * console.timeEnd('process')\n * ```\n */\n timeLog(label?: string | undefined, ...data: unknown[]): this {\n const con = this.#getConsole()\n con.timeLog(label, ...data)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Logs a stack trace to the console.\n *\n * Works like `console.trace()`. Shows the call stack leading to\n * where this method was called. Useful for debugging.\n *\n * @param message - Optional message to display with the trace\n * @param args - Additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * function debugFunction() {\n * logger.trace('Debug point reached')\n * }\n *\n * logger.trace('Trace from here')\n * logger.trace('Error context:', { userId: 123 })\n * ```\n */\n trace(message?: unknown | undefined, ...args: unknown[]): this {\n const con = this.#getConsole()\n con.trace(message, ...args)\n this[lastWasBlankSymbol](false)\n return this[incLogCallCountSymbol]()\n }\n\n /**\n * Logs a warning message with a yellow colored warning symbol.\n *\n * Automatically prefixes the message with `LOG_SYMBOLS.warn` (yellow \u26A0).\n * Always outputs to stderr. If the message starts with an existing\n * symbol, it will be stripped and replaced.\n *\n * @param args - Message and additional arguments to log\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.warn('Deprecated API used')\n * logger.warn('Low memory:', { available: '100MB' })\n * logger.warn('Missing optional configuration')\n * ```\n */\n warn(...args: unknown[]): this {\n return this.#symbolApply('warn', args)\n }\n\n /**\n * Writes text directly to stdout without a newline or indentation.\n *\n * Useful for progress indicators or custom formatting where you need\n * low-level control. Does not apply any indentation or formatting.\n *\n * @param text - The text to write\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.write('Processing... ')\n * // ... do work ...\n * logger.write('done\\n')\n *\n * // Build a line incrementally\n * logger.write('Step 1')\n * logger.write('... Step 2')\n * logger.write('... Step 3\\n')\n * ```\n */\n write(text: string): this {\n const con = this.#getConsole()\n // Write directly to the original stdout stream to bypass Console formatting\n // (e.g., group indentation). Try multiple approaches to get the raw stream:\n // 1. Use stored reference from constructor options\n // 2. Try to get from constructor args\n // 3. Fall back to con._stdout (which applies formatting)\n const ctorArgs = privateConstructorArgs.get(this) ?? []\n const stdout =\n this.#originalStdout || (ctorArgs[0] as any)?.stdout || con._stdout\n stdout.write(text)\n this[lastWasBlankSymbol](false)\n return this\n }\n\n /**\n * Shows a progress indicator that can be cleared with `clearLine()`.\n *\n * Displays a simple status message with a '\u2234' prefix. Does not include\n * animation or spinner. Intended to be cleared once the operation completes.\n * The output stream (stderr or stdout) depends on whether the logger is\n * stream-bound.\n *\n * @param text - The progress message to display\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.progress('Processing files...')\n * // ... do work ...\n * logger.clearLine()\n * logger.success('Files processed')\n *\n * // Stream-specific progress\n * logger.stdout.progress('Loading...')\n * // ... do work ...\n * logger.stdout.clearLine()\n * logger.stdout.log('Done')\n * ```\n */\n progress(text: string): this {\n const con = this.#getConsole()\n const stream = this.#getTargetStream()\n const streamObj = (\n stream === 'stderr' ? con._stderr : con._stdout\n ) as NodeJS.WriteStream & { write: (text: string) => boolean }\n streamObj.write(`\u2234 ${text}`)\n this[lastWasBlankSymbol](false)\n return this\n }\n\n /**\n * Clears the current line in the terminal.\n *\n * Moves the cursor to the beginning of the line and clears all content.\n * Works in both TTY and non-TTY environments. Useful for clearing\n * progress indicators created with `progress()`.\n *\n * The stream to clear (stderr or stdout) depends on whether the logger\n * is stream-bound.\n *\n * @returns The logger instance for chaining\n *\n * @example\n * ```typescript\n * logger.progress('Loading...')\n * // ... do work ...\n * logger.clearLine()\n * logger.success('Loaded')\n *\n * // Clear multiple progress updates\n * for (const file of files) {\n * logger.progress(`Processing ${file}`)\n * processFile(file)\n * logger.clearLine()\n * }\n * logger.success('All files processed')\n * ```\n */\n clearLine(): this {\n const con = this.#getConsole()\n const stream = this.#getTargetStream()\n const streamObj = (\n stream === 'stderr' ? con._stderr : con._stdout\n ) as NodeJS.WriteStream & {\n isTTY: boolean\n cursorTo: (x: number) => void\n clearLine: (dir: number) => void\n write: (text: string) => boolean\n }\n if (streamObj.isTTY) {\n streamObj.cursorTo(0)\n streamObj.clearLine(0)\n } else {\n streamObj.write('\\r\\x1b[K')\n }\n return this\n }\n}\n\n/**\n * Lazily add dynamic console methods to Logger prototype.\n *\n * This is deferred until first access to avoid calling Object.entries(globalConsole)\n * during early Node.js bootstrap before stdout is ready.\n * @private\n */\nlet _prototypeInitialized = false\nfunction ensurePrototypeInitialized() {\n if (_prototypeInitialized) {\n return\n }\n _prototypeInitialized = true\n\n const entries: Array<[string | symbol, PropertyDescriptor]> = [\n [\n getKGroupIndentationWidthSymbol(),\n {\n ...consolePropAttributes,\n value: 2,\n },\n ],\n [\n Symbol.toStringTag,\n {\n __proto__: null,\n configurable: true,\n value: 'logger',\n } as PropertyDescriptor,\n ],\n ]\n for (const { 0: key, 1: value } of Object.entries(globalConsole)) {\n if (!(Logger.prototype as any)[key] && typeof value === 'function') {\n // Dynamically name the log method without using Object.defineProperty.\n const { [key]: func } = {\n [key](this: Logger, ...args: unknown[]) {\n // Access Console via WeakMap directly since private methods can't be\n // called from dynamically created functions.\n let con = privateConsole.get(this)\n if (con === undefined) {\n // Lazy initialization - this will only happen if someone calls a\n // dynamically added console method before any core logger method.\n const ctorArgs = privateConstructorArgs.get(this) ?? []\n // Clean up constructor args - no longer needed after Console creation.\n privateConstructorArgs.delete(this)\n if (ctorArgs.length) {\n con = constructConsole(...ctorArgs)\n } else {\n con = constructConsole({\n stdout: process.stdout,\n stderr: process.stderr,\n }) as typeof console & Record<string, unknown>\n for (const { 0: k, 1: method } of boundConsoleEntries) {\n con[k] = method\n }\n }\n privateConsole.set(this, con)\n }\n const result = (con as any)[key](...args)\n return result === undefined || result === con ? this : result\n },\n }\n entries.push([\n key,\n {\n ...consolePropAttributes,\n value: func,\n },\n ])\n }\n }\n Object.defineProperties(Logger.prototype, Object.fromEntries(entries))\n}\n\n// Private singleton instance\nlet _logger: Logger | undefined\n\n/**\n * Get the default logger instance.\n * Lazily creates the logger to avoid circular dependencies during module initialization.\n * Reuses the same instance across calls.\n *\n * @returns Shared default logger instance\n *\n * @example\n * ```ts\n * import { getDefaultLogger } from '@socketsecurity/lib/logger'\n *\n * const logger = getDefaultLogger()\n * logger.log('Application started')\n * logger.success('Configuration loaded')\n * ```\n */\nexport function getDefaultLogger(): Logger {\n if (_logger === undefined) {\n _logger = new Logger()\n }\n return _logger\n}\n\n// REMOVED: Deprecated `logger` export\n// Migration: Use getDefaultLogger() instead\n// See: getDefaultLogger() function above\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,kCAA+B;AAC/B,6BAA2B;AAC3B,qBAA+C;AAE/C,qBAAwC;AACxC,oBAAuB;AAuEvB,MAAM,gBAAgB;AAKtB,MAAM,eAAe,QAAQ;AAC7B,MAAM,mBAAmB,QAAQ;AAEjC,IAAI;AAAA;AAMJ,SAAS,oBAAoB,MAAiB;AAC5C,MAAI,aAAa,QAAW;AAG1B,UAAM,cAA4B,QAAQ,cAAc;AACxD,eAAW,YAAY;AAAA,EACzB;AACA,SAAO;AAAA,IACL;AAAA;AAAA,IAGA;AAAA,EACF;AACF;AAAA;AAOA,SAAS,iBAAiB;AACxB,SAAO,uBAAAA;AACT;AAAA;AAQA,SAAS,WACP,MACA,OACA,QACQ;AACR,MAAI,OAAO,UAAU,UAAU;AAE7B,WAAQ,OAAe,KAAK,EAAE,IAAI;AAAA,EACpC;AAEA,SAAO,OAAO,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI;AACtD;AAwBO,MAAM,cAA6B,uBAAM;AAC9C,QAAM,SAAiC;AAAA,IACrC,WAAW;AAAA,EACb;AAEA,MAAI,cAAc;AAGlB,QAAM,UAAgD;AAAA,IACpD,WAAW;AAAA,EACb;AAEA,QAAM,gBAAgB,MAAM;AAC1B,UAAM,gBAAY,4BAAAC,SAAmB;AACrC,UAAM,SAAS,+BAAe;AAC9B,UAAM,YAAQ,yBAAS;AAGvB,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,aAAa,MAAM,OAAO;AAChC,UAAM,eAAe,MAAM,OAAO;AAClC,UAAM,YAAY,MAAM,OAAO;AAC/B,UAAM,YAAY,MAAM,OAAO;AAG/B,WAAO,OAAO,2BAAW,YAAY,WAAM,QAAK,YAAY,MAAM;AAClE,WAAO,OAAO,2BAAW,YAAY,WAAM,KAAK,WAAW,MAAM;AACjE,WAAO,OAAO,2BAAW,YAAY,WAAM,KAAK,WAAW,MAAM;AACjE,WAAO,UAAU,2BAAW,YAAY,WAAM,UAAK,cAAc,MAAM;AACvE,WAAO,OAAO,2BAAW,YAAY,WAAM,UAAK,cAAc,MAAM;AAAA,EACtE;AAEA,QAAM,OAAO,MAAM;AACjB,QAAI,aAAa;AACf;AAAA,IACF;AAEA,kBAAc;AACd,kBAAc;AAId,eAAW,YAAY,SAAS;AAC9B,aAAO,QAAQ,QAAsD;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM;AAClB,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAGA,kBAAc;AAAA,EAChB;AAEA,aAAW,YAAY,QAAQ,QAAQ,OAAO,GAAG;AAC/C,UAAM,KAAM,QAAyC,QAAQ;AAC7D,QAAI,OAAO,OAAO,YAAY;AAC5B;AAAC,MAAC,QACA,QACF,IAAI,IAAI,SAAoB;AAC1B,aAAK;AACL,eAAO,GAAG,GAAG,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,oCAAc,MAAM;AAClB,UAAM;AAAA,EACR,CAAC;AAED,SAAO,IAAI,MAAM,QAAQ,OAAO;AAClC,GAAG;AAEH,MAAM,sBAAsB;AAAA;AAAA;AAAA,EAG1B;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EACG,OAAO,OAAK,OAAQ,cAAsB,CAAC,MAAM,UAAU,EAC3D,IAAI,OAAK,CAAC,GAAI,cAAsB,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;AAE9D,MAAM,wBAAwB;AAAA,EAC5B,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAChB;AACA,MAAM,iBAAiB;AASvB,MAAM,iBAAiB,oBAAI,QAAQ;AAanC,MAAM,yBAAyB,oBAAI,QAAQ;AAS3C,IAAI;AACJ,SAAS,oBAA8B;AACrC,MAAI,oBAAoB,QAAW;AACjC,sBAAkB,OAAO,sBAAsB,aAAa;AAAA,EAC9D;AACA,SAAO;AACT;AAQO,MAAM,wBAAwB,OAAO,IAAI,uBAAuB;AAMvE,IAAI;AACJ,SAAS,kCAA0C;AACjD,MAAI,kCAAkC,QAAW;AAC/C,oCACE,kBAAkB,EAAE,KAAK,OAAM,EAAU,UAAU,mBAAmB,KACtE,OAAO,mBAAmB;AAAA,EAC9B;AACA,SAAO;AACT;AAQO,MAAM,qBAAqB,OAAO,IAAI,qBAAqB;AA8D3D,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlB,OAAO,cAAc;AAAA,EAErB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,eAAe,MAAiB;AAE9B,2BAAuB,IAAI,MAAM,IAAI;AAGrC,UAAM,UAAU,KAAK,GAAG;AACxB,QAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,WAAK,WAAW,EAAE,WAAW,MAAM,GAAG,QAAQ;AAE9C,WAAK,kBAAmB,QAAgB;AAGxC,YAAM,cAAe,QAAgB;AACrC,UAAI,aAAa;AACf,YAAI,OAAO,gBAAgB,UAAU;AAEnC,eAAK,SAAS,qBAAO,WAAW;AAAA,QAClC,OAAO;AAEL,eAAK,SAAS;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,WAAW,EAAE,WAAW,KAAK;AAAA,IACpC;AAAA,EAKF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAwD;AAEtD,+BAA2B;AAE3B,QAAI,MAAM,eAAe,IAAI,IAAI;AACjC,QAAI,CAAC,KAAK;AAER,YAAM,WAAW,uBAAuB,IAAI,IAAI,KAAK,CAAC;AACtD,UAAI,SAAS,QAAQ;AACnB,cAAM,iCAAiB,GAAG,QAAQ;AAAA,MACpC,OAAO;AAGL,cAAM,iCAAiB;AAAA,UACrB,QAAQ,QAAQ;AAAA,UAChB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AACD,mBAAW,EAAE,GAAG,KAAK,GAAG,OAAO,KAAK,qBAAqB;AACvD,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF;AACA,qBAAe,IAAI,MAAM,GAAG;AAE5B,6BAAuB,OAAO,IAAI;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,IAAI,SAAiB;AACnB,QAAI,CAAC,KAAK,eAAe;AAEvB,YAAM,WAAW,uBAAuB,IAAI,IAAI,KAAK,CAAC;AACtD,YAAM,WAAW,IAAI,OAAO,GAAG,QAAQ;AACvC,eAAS,UAAU;AACnB,eAAS,eAAe;AACxB,eAAS,WAAW,EAAE,WAAW,MAAM,GAAG,KAAK,SAAS;AACxD,eAAS,SAAS,KAAK;AACvB,WAAK,gBAAgB;AAAA,IACvB;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,IAAI,SAAiB;AACnB,QAAI,CAAC,KAAK,eAAe;AAEvB,YAAM,WAAW,uBAAuB,IAAI,IAAI,KAAK,CAAC;AACtD,YAAM,WAAW,IAAI,OAAO,GAAG,QAAQ;AACvC,eAAS,UAAU;AACnB,eAAS,eAAe;AACxB,eAAS,WAAW,EAAE,WAAW,MAAM,GAAG,KAAK,SAAS;AACxD,eAAS,SAAS,KAAK;AACvB,WAAK,gBAAgB;AAAA,IACvB;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAmB;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAA4C;AAC1C,WAAO,KAAK,cAAU,yBAAS;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAA0B;AACxB,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,gBAAY,4BAAAA,SAAmB;AACrC,UAAM,SAAS,+BAAe;AAE9B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM,2BAAW,YAAY,WAAM,QAAK,MAAM,OAAO,OAAO,MAAM;AAAA,MAClE,MAAM,2BAAW,YAAY,WAAM,KAAK,MAAM,OAAO,MAAM,MAAM;AAAA,MACjE,MAAM,2BAAW,YAAY,WAAM,KAAK,MAAM,OAAO,MAAM,MAAM;AAAA,MACjE,SAAS,2BAAW,YAAY,WAAM,UAAK,MAAM,OAAO,SAAS,MAAM;AAAA,MACvE,MAAM,2BAAW,YAAY,WAAM,UAAK,MAAM,OAAO,SAAS,MAAM;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,QAAqC;AAC9C,UAAM,OAAO,KAAK,SAAS;AAC3B,WAAO,WAAW,WAAW,KAAK,mBAAmB,KAAK;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,QAA6B,OAAqB;AAC3D,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,WAAW,UAAU;AACvB,WAAK,mBAAmB;AAAA,IAC1B,OAAO;AACL,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,QAAsC;AACrD,UAAM,OAAO,KAAK,SAAS;AAC3B,WAAO,WAAW,WACd,KAAK,sBACL,KAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,QAA6B,OAAsB;AAClE,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,WAAW,UAAU;AACvB,WAAK,sBAAsB;AAAA,IAC7B,OAAO;AACL,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAwC;AACtC,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OACE,YACA,MACA,QACM;AACN,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,OAAO,KAAK,GAAG,CAAC;AACtB,UAAM,UAAU,OAAO,SAAS;AAEhC,UAAM,eAAe,WAAW,eAAe,QAAQ,WAAW;AAClE,UAAM,SAAS,KAAK,WAAW,YAAY;AAC3C,UAAM,UAAU,UACZ,KAAC,gCAAgB,MAAM,EAAE,QAAQ,OAAO,CAAC,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,IAC5D;AACJ;AAAA,MACE,IAAI,UAAU;AAAA,MACd;AAAA,MACA;AAAA,IACF;AACA,SAAK,kBAAkB,EAAE,eAAW,8BAAc,QAAQ,CAAC,CAAC,GAAG,YAAY;AAC1E,IAAC,KAAa,qBAAqB,EAAE;AACtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAsB;AAKlC,WAAO,KAAK,QAAQ,4BAA4B,EAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,YAAoB,MAAuB;AACtD,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,OAAO,KAAK,GAAG,CAAC;AAEpB,QAAI;AACJ,QAAI,OAAO,SAAS,UAAU;AAC5B,aAAO,KAAK,cAAc,IAAI;AAC9B,eAAS,KAAK,MAAM,CAAC;AAAA,IACvB,OAAO;AACL,eAAS;AACT,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,KAAK,WAAW,QAAQ;AACvC,UAAM,UAAU,KAAK,YAAY;AACjC,QAAI;AAAA,UACF,gCAAgB,GAAG,QAAQ,UAAU,CAAC,IAAI,IAAI,IAAI;AAAA,QAChD,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,GAAG;AAAA,IACL;AACA,SAAK,kBAAkB,EAAE,OAAO,QAAQ;AACvC,IAAC,KAAa,qBAAqB,EAAE;AACtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,eAAe;AACjB,UAAM,OAAO,KAAK,SAAS;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,CAAC,qBAAqB,IAAI;AACxB,UAAM,OAAO,KAAK,SAAS;AAC3B,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,CAAC,kBAAkB,EAAE,OAAgB,QAAoC;AACvE,QAAI,QAAQ;AAEV,WAAK,iBAAiB,QAAQ,CAAC,CAAC,KAAK;AAAA,IACvC,WAAW,KAAK,cAAc;AAE5B,WAAK,iBAAiB,KAAK,cAAc,CAAC,CAAC,KAAK;AAAA,IAClD,OAAO;AAEL,WAAK,iBAAiB,UAAU,CAAC,CAAC,KAAK;AACvC,WAAK,iBAAiB,UAAU,CAAC,CAAC,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,UAAmB,SAA0B;AAClD,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,OAAO,OAAO,QAAQ,CAAC,GAAa,GAAG,QAAQ,MAAM,CAAC,CAAC;AAC3D,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,QAAQ,OAAO,KAAK,qBAAqB,EAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,eAAe;AACb,QAAI,KAAK,cAAc;AACrB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,MAAM;AACV,QAAK,IAAY,QAAQ,OAAO;AAC9B;AAAC,MAAC,KAAa,kBAAkB,EAAE,IAAI;AACvC,WAAK,gBAAgB;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAM,OAAkC;AACtC,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,MAAM,KAAK;AACf,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,WAAW,MAAoB;AAC7B,WAAO;AAAA,MACL,KAAK,CAAI,MAAkB;AACzB,aAAK,IAAI,kBAAkB,IAAI,EAAE;AACjC,cAAM,SAAS,EAAE;AACjB,aAAK,IAAI,mBAAmB,IAAI,EAAE;AAClC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,OAAO,SAAS,GAAG;AACjB,QAAI,KAAK,cAAc;AAErB,YAAM,UAAU,KAAK,WAAW,KAAK,YAAY;AACjD,WAAK,WAAW,KAAK,cAAc,QAAQ,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,IAC9D,OAAO;AAEL,YAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,YAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,WAAK,WAAW,UAAU,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC;AACzD,WAAK,WAAW,UAAU,cAAc,MAAM,GAAG,CAAC,MAAM,CAAC;AAAA,IAC3D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,IAAI,KAAc,SAAqC;AACrD,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,IAAI,KAAK,OAAO;AACpB,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,UAAU,MAAuB;AAC/B,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,OAAO,IAAI;AACf,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,SAAS,MAAuB;AAC9B,WAAO,KAAK,OAAO,SAAS,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,eAAe;AACb,WAAO,KAAK,iBAAiB,QAAQ,IAAI,OAAO,KAAK,MAAM,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,aAAa,QAAQ,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BA,SAAS,OAAwB;AAC/B,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,QAAQ;AACV,mBAAa,KAAK,KAAK,MAAM,KAAK;AAAA,IACpC;AACA,SAAK,OAAQ,KAAa,gCAAgC,CAAC,CAAC;AAC5D,QAAI,QAAQ;AACV;AAAC,MAAC,KAAa,kBAAkB,EAAE,KAAK;AACvC,MAAC,KAAa,qBAAqB,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,kBAAkB,OAAwB;AACxC,WAAO,aAAa,KAAK,OAAO,MAAM,KAAK;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,WAAW;AACT,SAAK,OAAQ,KAAa,gCAAgC,CAAC,CAAC;AAC5D,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,OAAO,SAAS,GAAG;AACjB,UAAM,cAAc,IAAI,OAAO,KAAK,IAAI,QAAQ,cAAc,CAAC;AAC/D,QAAI,KAAK,cAAc;AAErB,YAAM,UAAU,KAAK,WAAW,KAAK,YAAY;AACjD,WAAK,WAAW,KAAK,cAAc,UAAU,WAAW;AAAA,IAC1D,OAAO;AAEL,YAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,YAAM,gBAAgB,KAAK,WAAW,QAAQ;AAC9C,WAAK,WAAW,UAAU,gBAAgB,WAAW;AACrD,WAAK,WAAW,UAAU,gBAAgB,WAAW;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,aAAa,QAAQ,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,MAAuB;AAC5B,WAAO,KAAK,OAAO,OAAO,IAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,aAAa;AACX,WAAO,KAAK,iBAAiB,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,cAAc;AACZ,QAAI,KAAK,cAAc;AAErB,WAAK,WAAW,KAAK,cAAc,EAAE;AAAA,IACvC,OAAO;AAEL,WAAK,WAAW,UAAU,EAAE;AAC5B,WAAK,WAAW,UAAU,EAAE;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,KAAK,QAAgB,QAAyB;AAE5C,QAAI,CAAC,KAAK,iBAAiB,QAAQ,GAAG;AAEpC,WAAK,IAAI,EAAE;AAAA,IACb;AAEA,UAAM,OAAO,KAAK,cAAc,GAAG;AAEnC,UAAM,SAAS,KAAK,WAAW,QAAQ;AACvC,UAAM,UAAU,KAAK,YAAY;AACjC,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI;AAAA,UACF,gCAAgB,GAAG,QAAQ,IAAI,IAAI,IAAI,IAAI;AAAA,QACzC,QAAQ;AAAA,MACV,CAAC;AAAA,MACD,GAAG;AAAA,IACL;AACA,SAAK,kBAAkB,EAAE,OAAO,QAAQ;AACvC,IAAC,KAAa,qBAAqB,EAAE;AACtC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,QAAQ,QAAgB,QAAyB;AAE/C,UAAM,cAAc,KAAK,GAAG;AAE5B,WAAO,KAAK,IAAI,aAAa,GAAG,MAAM;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,WAAW,MAAuB;AAChC,WAAO,KAAK,aAAa,WAAW,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,aAAa,WAAW,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BA,MACE,aACA,YACM;AACN,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,MAAM,aAAa,UAAU;AACjC,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,QAAQ,OAAkC;AACxC,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,QAAQ,KAAK;AACjB,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,QAAQ,UAA+B,MAAuB;AAC5D,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,QAAQ,OAAO,GAAG,IAAI;AAC1B,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,MAAM,YAAkC,MAAuB;AAC7D,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,MAAM,SAAS,GAAG,IAAI;AAC1B,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO,KAAK,qBAAqB,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQ,MAAuB;AAC7B,WAAO,KAAK,aAAa,QAAQ,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,MAAoB;AACxB,UAAM,MAAM,KAAK,YAAY;AAM7B,UAAM,WAAW,uBAAuB,IAAI,IAAI,KAAK,CAAC;AACtD,UAAM,SACJ,KAAK,mBAAoB,SAAS,CAAC,GAAW,UAAU,IAAI;AAC9D,WAAO,MAAM,IAAI;AACjB,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,SAAS,MAAoB;AAC3B,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,SAAS,KAAK,iBAAiB;AACrC,UAAM,YACJ,WAAW,WAAW,IAAI,UAAU,IAAI;AAE1C,cAAU,MAAM,UAAK,IAAI,EAAE;AAC3B,SAAK,kBAAkB,EAAE,KAAK;AAC9B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,YAAkB;AAChB,UAAM,MAAM,KAAK,YAAY;AAC7B,UAAM,SAAS,KAAK,iBAAiB;AACrC,UAAM,YACJ,WAAW,WAAW,IAAI,UAAU,IAAI;AAO1C,QAAI,UAAU,OAAO;AACnB,gBAAU,SAAS,CAAC;AACpB,gBAAU,UAAU,CAAC;AAAA,IACvB,OAAO;AACL,gBAAU,MAAM,UAAU;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AACF;AASA,IAAI,wBAAwB;AAC5B,SAAS,6BAA6B;AACpC,MAAI,uBAAuB;AACzB;AAAA,EACF;AACA,0BAAwB;AAExB,QAAM,UAAwD;AAAA,IAC5D;AAAA,MACE,gCAAgC;AAAA,MAChC;AAAA,QACE,GAAG;AAAA,QACH,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP;AAAA,QACE,WAAW;AAAA,QACX,cAAc;AAAA,QACd,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,aAAW,EAAE,GAAG,KAAK,GAAG,MAAM,KAAK,OAAO,QAAQ,aAAa,GAAG;AAChE,QAAI,CAAE,OAAO,UAAkB,GAAG,KAAK,OAAO,UAAU,YAAY;AAElE,YAAM,EAAE,CAAC,GAAG,GAAG,KAAK,IAAI;AAAA,QACtB,CAAC,GAAG,KAAmB,MAAiB;AAGtC,cAAI,MAAM,eAAe,IAAI,IAAI;AACjC,cAAI,QAAQ,QAAW;AAGrB,kBAAM,WAAW,uBAAuB,IAAI,IAAI,KAAK,CAAC;AAEtD,mCAAuB,OAAO,IAAI;AAClC,gBAAI,SAAS,QAAQ;AACnB,oBAAM,iCAAiB,GAAG,QAAQ;AAAA,YACpC,OAAO;AACL,oBAAM,iCAAiB;AAAA,gBACrB,QAAQ,QAAQ;AAAA,gBAChB,QAAQ,QAAQ;AAAA,cAClB,CAAC;AACD,yBAAW,EAAE,GAAG,GAAG,GAAG,OAAO,KAAK,qBAAqB;AACrD,oBAAI,CAAC,IAAI;AAAA,cACX;AAAA,YACF;AACA,2BAAe,IAAI,MAAM,GAAG;AAAA,UAC9B;AACA,gBAAM,SAAU,IAAY,GAAG,EAAE,GAAG,IAAI;AACxC,iBAAO,WAAW,UAAa,WAAW,MAAM,OAAO;AAAA,QACzD;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,UACE,GAAG;AAAA,UACH,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,iBAAiB,OAAO,WAAW,OAAO,YAAY,OAAO,CAAC;AACvE;AAGA,IAAI;AAkBG,SAAS,mBAA2B;AACzC,MAAI,YAAY,QAAW;AACzB,cAAU,IAAI,OAAO;AAAA,EACvB;AACA,SAAO;AACT;",
|
|
6
|
-
"names": ["yoctocolorsCjs", "isUnicodeSupported"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/maintained-node-versions.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Maintained Node.js versions without external dependencies.\n */\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ObjectFreeze = Object.freeze\n\n// Manually maintained Node.js version list.\n// https://nodejs.org/en/about/previous-releases#looking-for-latest-release-of-a-version-branch\n//\n// Updated October 16th, 2025.\n// - v25: 25.0.0 (Current)\n// - v24: 24.10.0 (Current)\n// - v22: 22.20.0 (Active LTS)\n// - v20: 20.19.5 (Maintenance LTS)\n// - v18: 18.20.8 (End-of-life)\nconst next = '25.0.0'\nconst current = '22.20.0'\nconst previous = '20.19.5'\nconst last = '18.20.8'\n\nexport default ObjectFreeze(\n Object.assign([last, previous, current, next], {\n current,\n last,\n next,\n previous,\n }),\n) as readonly string[] & {\n current: string\n last: string\n next: string\n previous: string\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,MAAM,eAAe,OAAO;AAW5B,MAAM,OAAO;AACb,MAAM,UAAU;AAChB,MAAM,WAAW;AACjB,MAAM,OAAO;AAEb,IAAO,mCAAQ;AAAA,EACb,OAAO,OAAO,CAAC,MAAM,UAAU,SAAS,IAAI,GAAG;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/memoization.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/memoization.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Memoization utilities for caching function results.\n * Provides function result caching to optimize repeated computations and expensive operations.\n */\n\nimport { debugLog } from './debug'\n\n/**\n * Options for memoization behavior.\n */\ntype MemoizeOptions<Args extends unknown[], _Result = unknown> = {\n /** Custom cache key generator (defaults to JSON.stringify) */\n keyGen?: (...args: Args) => string\n /** Maximum cache size (LRU eviction when exceeded) */\n maxSize?: number\n /** TTL in milliseconds (cache entries expire after this time) */\n ttl?: number\n /** Cache name for debugging */\n name?: string\n /** Weak cache for object keys (enables GC) */\n weak?: boolean\n /** Custom equality check for cache hits */\n equals?: (a: Args, b: Args) => boolean\n}\n\n/**\n * Cache entry with metadata.\n */\ntype CacheEntry<T> = {\n value: T\n timestamp: number\n hits: number\n}\n\n/**\n * Memoize a function with configurable caching behavior.\n * Caches function results to avoid repeated computation.\n *\n * @param fn - Function to memoize\n * @param options - Memoization options\n * @returns Memoized version of the function\n *\n * @example\n * import { memoize } from '@socketsecurity/lib/memoization'\n *\n * const expensiveOperation = memoize((n: number) => {\n * // Heavy computation\n * return Array(n).fill(0).reduce((a, _, i) => a + i, 0)\n * }, { maxSize: 100, ttl: 60000, name: 'sum' })\n *\n * expensiveOperation(1000) // Computed\n * expensiveOperation(1000) // Cached\n */\nexport function memoize<Args extends unknown[], Result>(\n fn: (...args: Args) => Result,\n options: MemoizeOptions<Args, Result> = {},\n): (...args: Args) => Result {\n const {\n keyGen = (...args) => JSON.stringify(args),\n maxSize = Number.POSITIVE_INFINITY,\n name = fn.name || 'anonymous',\n ttl = Number.POSITIVE_INFINITY,\n } = options\n\n const cache = new Map<string, CacheEntry<Result>>()\n const accessOrder: string[] = []\n\n function evictLRU(): void {\n if (cache.size >= maxSize && accessOrder.length > 0) {\n const oldest = accessOrder.shift()\n if (oldest) {\n cache.delete(oldest)\n debugLog(`[memoize:${name}] clear`, {\n key: oldest,\n reason: 'LRU',\n })\n }\n }\n }\n\n function isExpired(entry: CacheEntry<Result>): boolean {\n if (ttl === Number.POSITIVE_INFINITY) {\n return false\n }\n return Date.now() - entry.timestamp > ttl\n }\n\n return function memoized(...args: Args): Result {\n const key = keyGen(...args)\n\n // Check cache\n const cached = cache.get(key)\n if (cached && !isExpired(cached)) {\n cached.hits++\n // Move to end of access order (LRU)\n const index = accessOrder.indexOf(key)\n if (index !== -1) {\n accessOrder.splice(index, 1)\n }\n accessOrder.push(key)\n\n debugLog(`[memoize:${name}] hit`, { key, hits: cached.hits })\n return cached.value\n }\n\n // Cache miss - compute value\n debugLog(`[memoize:${name}] miss`, { key })\n const value = fn(...args)\n\n // Store in cache\n evictLRU()\n cache.set(key, {\n value,\n timestamp: Date.now(),\n hits: 0,\n })\n accessOrder.push(key)\n\n debugLog(`[memoize:${name}] set`, { key, cacheSize: cache.size })\n return value\n }\n}\n\n/**\n * Memoize an async function.\n * Similar to memoize() but handles promises properly.\n *\n * @param fn - Async function to memoize\n * @param options - Memoization options\n * @returns Memoized version of the async function\n *\n * @example\n * import { memoizeAsync } from '@socketsecurity/lib/memoization'\n *\n * const fetchUser = memoizeAsync(async (id: string) => {\n * const response = await fetch(`/api/users/${id}`)\n * return response.json()\n * }, { ttl: 300000, name: 'fetchUser' })\n *\n * await fetchUser('123') // Fetches from API\n * await fetchUser('123') // Returns cached result\n */\nexport function memoizeAsync<Args extends unknown[], Result>(\n fn: (...args: Args) => Promise<Result>,\n options: MemoizeOptions<Args, Result> = {},\n): (...args: Args) => Promise<Result> {\n const {\n keyGen = (...args) => JSON.stringify(args),\n maxSize = Number.POSITIVE_INFINITY,\n name = fn.name || 'anonymous',\n ttl = Number.POSITIVE_INFINITY,\n } = options\n\n const cache = new Map<string, CacheEntry<Promise<Result>>>()\n const accessOrder: string[] = []\n\n function evictLRU(): void {\n if (cache.size >= maxSize && accessOrder.length > 0) {\n const oldest = accessOrder.shift()\n if (oldest) {\n cache.delete(oldest)\n debugLog(`[memoizeAsync:${name}] clear`, {\n key: oldest,\n reason: 'LRU',\n })\n }\n }\n }\n\n function isExpired(entry: CacheEntry<Promise<Result>>): boolean {\n if (ttl === Number.POSITIVE_INFINITY) {\n return false\n }\n return Date.now() - entry.timestamp > ttl\n }\n\n return async function memoized(...args: Args): Promise<Result> {\n const key = keyGen(...args)\n\n // Check cache\n const cached = cache.get(key)\n if (cached && !isExpired(cached)) {\n cached.hits++\n // Move to end of access order (LRU)\n const index = accessOrder.indexOf(key)\n if (index !== -1) {\n accessOrder.splice(index, 1)\n }\n accessOrder.push(key)\n\n debugLog(`[memoizeAsync:${name}] hit`, { key, hits: cached.hits })\n return await cached.value\n }\n\n // Cache miss - compute value\n debugLog(`[memoizeAsync:${name}] miss`, { key })\n const promise = fn(...args)\n\n // Store promise in cache (handles concurrent calls)\n evictLRU()\n cache.set(key, {\n value: promise,\n timestamp: Date.now(),\n hits: 0,\n })\n accessOrder.push(key)\n\n debugLog(`[memoizeAsync:${name}] set`, { key, cacheSize: cache.size })\n\n try {\n const result = await promise\n return result\n } catch (e) {\n // Remove failed promise from cache\n cache.delete(key)\n const orderIndex = accessOrder.indexOf(key)\n if (orderIndex !== -1) {\n accessOrder.splice(orderIndex, 1)\n }\n debugLog(`[memoizeAsync:${name}] clear`, { key, reason: 'error' })\n throw e\n }\n }\n}\n\n/**\n * Create a memoized version of a method.\n * Preserves 'this' context for class methods.\n *\n * @param target - Object containing the method\n * @param propertyKey - Method name\n * @param descriptor - Property descriptor\n * @returns Modified descriptor with memoized method\n *\n * @example\n * import { Memoize } from '@socketsecurity/lib/memoization'\n *\n * class Calculator {\n * @Memoize()\n * fibonacci(n: number): number {\n * if (n <= 1) return n\n * return this.fibonacci(n - 1) + this.fibonacci(n - 2)\n * }\n * }\n */\nexport function Memoize(options: MemoizeOptions<unknown[], unknown> = {}) {\n return (\n _target: unknown,\n propertyKey: string,\n descriptor: PropertyDescriptor,\n ): PropertyDescriptor => {\n const originalMethod = descriptor.value as (...args: unknown[]) => unknown\n\n descriptor.value = memoize(originalMethod, {\n ...options,\n name: options.name || propertyKey,\n })\n\n return descriptor\n }\n}\n\n/**\n * Clear all memoization caches.\n * Useful for testing or when you need to force recomputation.\n */\nexport function clearAllMemoizationCaches(): void {\n // Note: This requires the memoized functions to be tracked globally.\n // For now, this is a placeholder that logs the intent.\n debugLog('[memoize:all] clear', { action: 'clear-all-caches' })\n}\n\n/**\n * Memoize with WeakMap for object keys.\n * Allows garbage collection when objects are no longer referenced.\n * Only works when first argument is an object.\n *\n * @param fn - Function to memoize\n * @returns Memoized version using WeakMap\n *\n * @example\n * import { memoizeWeak } from '@socketsecurity/lib/memoization'\n *\n * const processConfig = memoizeWeak((config: Config) => {\n * return expensiveTransform(config)\n * })\n *\n * processConfig(config1) // Computed\n * processConfig(config1) // Cached\n * // When config1 is no longer referenced, cache entry is GC'd\n */\nexport function memoizeWeak<K extends object, Result>(\n fn: (key: K) => Result,\n): (key: K) => Result {\n const cache = new WeakMap<K, Result>()\n\n return function memoized(key: K): Result {\n const cached = cache.get(key)\n if (cached !== undefined) {\n debugLog(`[memoizeWeak:${fn.name}] hit`)\n return cached\n }\n\n debugLog(`[memoizeWeak:${fn.name}] miss`)\n const result = fn(key)\n cache.set(key, result)\n return result\n }\n}\n\n/**\n * Simple once() implementation - caches single result forever.\n * Useful for initialization functions that should only run once.\n *\n * @param fn - Function to run once\n * @returns Memoized version that only executes once\n *\n * @example\n * import { once } from '@socketsecurity/lib/memoization'\n *\n * const initialize = once(() => {\n * console.log('Initializing\u2026')\n * return loadConfig()\n * })\n *\n * initialize() // Logs \"Initializing\u2026\" and returns config\n * initialize() // Returns cached config (no log)\n */\nexport function once<Result>(fn: () => Result): () => Result {\n let called = false\n let result: Result\n\n return function memoized(): Result {\n if (!called) {\n result = fn()\n called = true\n debugLog(`[once:${fn.name}] set`)\n } else {\n debugLog(`[once:${fn.name}] hit`)\n }\n return result\n }\n}\n\n/**\n * Create a debounced memoized function.\n * Combines memoization with debouncing for expensive operations.\n *\n * @param fn - Function to memoize and debounce\n * @param wait - Debounce wait time in milliseconds\n * @param options - Memoization options\n * @returns Debounced memoized function\n *\n * @example\n * import { memoizeDebounced } from '@socketsecurity/lib/memoization'\n *\n * const search = memoizeDebounced(\n * (query: string) => performSearch(query),\n * 300,\n * { name: 'search' }\n * )\n */\nexport function memoizeDebounced<Args extends unknown[], Result>(\n fn: (...args: Args) => Result,\n wait: number,\n options: MemoizeOptions<Args, Result> = {},\n): (...args: Args) => Result {\n const memoized = memoize(fn, options)\n let timeoutId: NodeJS.Timeout | undefined\n\n return function debounced(...args: Args): Result {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n memoized(...args)\n }, wait)\n\n // For immediate return, try cached value or compute synchronously\n return memoized(...args)\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
package/dist/objects.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/objects.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Object manipulation and reflection utilities.\n * Provides type-safe object operations, property access, and structural helpers.\n */\n\nimport {\n kInternalsSymbol,\n LOOP_SENTINEL,\n UNDEFINED_TOKEN,\n} from '#constants/core'\n\nimport { isArray } from './arrays'\nimport { localeCompare } from './sorts'\n\n// Type definitions\n\n/**\n * Record of property keys mapped to getter functions.\n * Used for defining lazy getters on objects.\n */\ntype GetterDefObj = { [key: PropertyKey]: () => unknown }\n\n/**\n * Statistics tracking for lazy getter initialization.\n * Keeps track of which lazy getters have been accessed and initialized.\n */\ntype LazyGetterStats = { initialized?: Set<PropertyKey> | undefined }\n\n/**\n * Configuration options for creating constants objects.\n */\ntype ConstantsObjectOptions = {\n /**\n * Lazy getter definitions to attach to the object.\n * @default undefined\n */\n getters?: GetterDefObj | undefined\n /**\n * Internal properties to store under `kInternalsSymbol`.\n * @default undefined\n */\n internals?: object | undefined\n /**\n * Properties to mix into the object (lower priority than `props`).\n * @default undefined\n */\n mixin?: object | undefined\n}\n\n/**\n * Type helper that creates a remapped type with fresh property mapping.\n * Useful for flattening intersection types into a single object type.\n */\ntype Remap<T> = { [K in keyof T]: T[K] } extends infer O\n ? { [K in keyof O]: O[K] }\n : never\n\n/**\n * Type for dynamic lazy getter record.\n */\ntype LazyGetterRecord<T> = {\n [key: PropertyKey]: () => T\n}\n\n/**\n * Type for generic property bag.\n */\ntype PropertyBag = {\n [key: PropertyKey]: unknown\n}\n\n/**\n * Type for generic sorted object entries.\n */\ntype SortedObject<T> = {\n [key: PropertyKey]: T\n}\n\nexport type { GetterDefObj, LazyGetterStats, ConstantsObjectOptions, Remap }\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ObjectDefineProperties = Object.defineProperties\nconst ObjectDefineProperty = Object.defineProperty\nconst ObjectFreeze = Object.freeze\nconst ObjectFromEntries = Object.fromEntries\nconst ObjectGetOwnPropertyDescriptors = Object.getOwnPropertyDescriptors\nconst ObjectGetOwnPropertyNames = Object.getOwnPropertyNames\nconst ObjectGetPrototypeOf = Object.getPrototypeOf\nconst ObjectHasOwn = Object.hasOwn\nconst ObjectKeys = Object.keys\nconst ObjectPrototype = Object.prototype\nconst ObjectSetPrototypeOf = Object.setPrototypeOf\n// @ts-expect-error - __defineGetter__ exists but not in type definitions.\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst __defineGetter__ = Object.prototype.__defineGetter__\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\nconst ReflectOwnKeys = Reflect.ownKeys\n\n/**\n * Create a lazy getter function that memoizes its result.\n *\n * The returned function will only call the getter once, caching the result\n * for subsequent calls. This is useful for expensive computations or\n * operations that should only happen when needed.\n *\n * @param name - The property key name for the getter (used for debugging and stats)\n * @param getter - Function that computes the value on first access\n * @param stats - Optional stats object to track initialization\n * @returns A memoized getter function\n *\n * @example\n * ```ts\n * const stats = { initialized: new Set() }\n * const getLargeData = createLazyGetter('data', () => {\n * console.log('Computing expensive data...')\n * return { large: 'dataset' }\n * }, stats)\n *\n * getLargeData() // Logs \"Computing expensive data...\" and returns data\n * getLargeData() // Returns cached data without logging\n * console.log(stats.initialized.has('data')) // true\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createLazyGetter<T>(\n name: PropertyKey,\n getter: () => T,\n stats?: LazyGetterStats | undefined,\n): () => T {\n let lazyValue: T | typeof UNDEFINED_TOKEN = UNDEFINED_TOKEN\n // Dynamically name the getter without using Object.defineProperty.\n const { [name]: lazyGetter } = {\n [name]() {\n if (lazyValue === UNDEFINED_TOKEN) {\n stats?.initialized?.add(name)\n lazyValue = getter()\n }\n return lazyValue as T\n },\n } as LazyGetterRecord<T>\n return lazyGetter as unknown as () => T\n}\n\n/**\n * Create a frozen constants object with lazy getters and internal properties.\n *\n * This function creates an immutable object with:\n * - Regular properties from `props`\n * - Lazy getters that compute values on first access\n * - Internal properties accessible via `kInternalsSymbol`\n * - Mixin properties (lower priority, won't override existing)\n * - Alphabetically sorted keys for consistency\n *\n * The resulting object is deeply frozen and cannot be modified.\n *\n * @param props - Regular properties to include on the object\n * @param options_ - Configuration options\n * @returns A frozen object with all specified properties\n *\n * @example\n * ```ts\n * const config = createConstantsObject(\n * { apiUrl: 'https://api.example.com' },\n * {\n * getters: {\n * client: () => new APIClient(),\n * timestamp: () => Date.now()\n * },\n * internals: {\n * version: '1.0.0'\n * }\n * }\n * )\n *\n * console.log(config.apiUrl) // 'https://api.example.com'\n * console.log(config.client) // APIClient instance (computed on first access)\n * console.log(config[kInternalsSymbol].version) // '1.0.0'\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createConstantsObject(\n props: object,\n options_?: ConstantsObjectOptions | undefined,\n): Readonly<object> {\n const options = { __proto__: null, ...options_ } as ConstantsObjectOptions\n const attributes = ObjectFreeze({\n __proto__: null,\n getters: options.getters\n ? ObjectFreeze(\n ObjectSetPrototypeOf(toSortedObject(options.getters), null),\n )\n : undefined,\n internals: options.internals\n ? ObjectFreeze(\n ObjectSetPrototypeOf(toSortedObject(options.internals), null),\n )\n : undefined,\n mixin: options.mixin\n ? ObjectFreeze(\n ObjectDefineProperties(\n { __proto__: null },\n ObjectGetOwnPropertyDescriptors(options.mixin),\n ),\n )\n : undefined,\n props: props\n ? ObjectFreeze(ObjectSetPrototypeOf(toSortedObject(props), null))\n : undefined,\n })\n const lazyGetterStats = ObjectFreeze({\n __proto__: null,\n initialized: new Set<PropertyKey>(),\n })\n const object = defineLazyGetters(\n {\n __proto__: null,\n [kInternalsSymbol]: ObjectFreeze({\n __proto__: null,\n get attributes() {\n return attributes\n },\n get lazyGetterStats() {\n return lazyGetterStats\n },\n ...attributes.internals,\n }),\n kInternalsSymbol,\n ...attributes.props,\n },\n attributes.getters,\n lazyGetterStats,\n )\n if (attributes.mixin) {\n ObjectDefineProperties(\n object,\n toSortedObjectFromEntries(\n objectEntries(ObjectGetOwnPropertyDescriptors(attributes.mixin)).filter(\n p => !ObjectHasOwn(object, p[0]),\n ),\n ) as PropertyDescriptorMap,\n )\n }\n return ObjectFreeze(object)\n}\n\n/**\n * Define a getter property on an object.\n *\n * The getter is non-enumerable and configurable, meaning it won't show up\n * in `for...in` loops or `Object.keys()`, but can be redefined later.\n *\n * @param object - The object to define the getter on\n * @param propKey - The property key for the getter\n * @param getter - Function that computes the property value\n * @returns The modified object (for chaining)\n *\n * @example\n * ```ts\n * const obj = {}\n * defineGetter(obj, 'timestamp', () => Date.now())\n * console.log(obj.timestamp) // Current timestamp\n * console.log(obj.timestamp) // Different timestamp (computed each time)\n * console.log(Object.keys(obj)) // [] (non-enumerable)\n * ```\n */\nexport function defineGetter<T>(\n object: object,\n propKey: PropertyKey,\n getter: () => T,\n): object {\n ObjectDefineProperty(object, propKey, {\n get: getter,\n enumerable: false,\n configurable: true,\n })\n return object\n}\n\n/**\n * Define a lazy getter property on an object.\n *\n * Unlike `defineGetter()`, this version memoizes the result so the getter\n * function is only called once. Subsequent accesses return the cached value.\n *\n * @param object - The object to define the lazy getter on\n * @param propKey - The property key for the lazy getter\n * @param getter - Function that computes the value on first access\n * @param stats - Optional stats object to track initialization\n * @returns The modified object (for chaining)\n *\n * @example\n * ```ts\n * const obj = {}\n * defineLazyGetter(obj, 'data', () => {\n * console.log('Loading data...')\n * return { expensive: 'computation' }\n * })\n * console.log(obj.data) // Logs \"Loading data...\" and returns data\n * console.log(obj.data) // Returns same data without logging\n * ```\n */\nexport function defineLazyGetter<T>(\n object: object,\n propKey: PropertyKey,\n getter: () => T,\n stats?: LazyGetterStats | undefined,\n): object {\n return defineGetter(object, propKey, createLazyGetter(propKey, getter, stats))\n}\n\n/**\n * Define multiple lazy getter properties on an object.\n *\n * Each getter in the provided object will be converted to a lazy getter\n * and attached to the target object. All getters share the same stats object\n * for tracking initialization.\n *\n * @param object - The object to define lazy getters on\n * @param getterDefObj - Object mapping property keys to getter functions\n * @param stats - Optional stats object to track initialization\n * @returns The modified object (for chaining)\n *\n * @example\n * ```ts\n * const obj = {}\n * const stats = { initialized: new Set() }\n * defineLazyGetters(obj, {\n * user: () => fetchUser(),\n * config: () => loadConfig(),\n * timestamp: () => Date.now()\n * }, stats)\n *\n * console.log(obj.user) // Fetches user on first access\n * console.log(obj.config) // Loads config on first access\n * console.log(stats.initialized) // Set(['user', 'config'])\n * ```\n */\nexport function defineLazyGetters(\n object: object,\n getterDefObj: GetterDefObj | undefined,\n stats?: LazyGetterStats | undefined,\n): object {\n if (getterDefObj !== null && typeof getterDefObj === 'object') {\n const keys = ReflectOwnKeys(getterDefObj)\n for (let i = 0, { length } = keys; i < length; i += 1) {\n const key = keys[i] as PropertyKey\n defineLazyGetter(object, key, getterDefObj[key] as () => unknown, stats)\n }\n }\n return object\n}\n\n/**\n * Compare two entry arrays by their keys for sorting.\n *\n * Used internally for alphabetically sorting object entries.\n * String keys are compared directly, non-string keys are converted to strings first.\n *\n * @param a - First entry tuple [key, value]\n * @param b - Second entry tuple [key, value]\n * @returns Negative if a < b, positive if a > b, zero if equal\n *\n * @example\n * ```ts\n * const entries = [['zebra', 1], ['apple', 2], ['banana', 3]]\n * entries.sort(entryKeyComparator)\n * // [['apple', 2], ['banana', 3], ['zebra', 1]]\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function entryKeyComparator(\n a: [PropertyKey, unknown],\n b: [PropertyKey, unknown],\n): number {\n const keyA = a[0]\n const keyB = b[0]\n const strKeyA = typeof keyA === 'string' ? keyA : String(keyA)\n const strKeyB = typeof keyB === 'string' ? keyB : String(keyB)\n return localeCompare(strKeyA, strKeyB)\n}\n\n/**\n * Get the enumerable own property keys of an object.\n *\n * This is a safe wrapper around `Object.keys()` that returns an empty array\n * for non-object values instead of throwing an error.\n *\n * @param obj - The value to get keys from\n * @returns Array of enumerable string keys, or empty array for non-objects\n *\n * @example\n * ```ts\n * getKeys({ a: 1, b: 2 }) // ['a', 'b']\n * getKeys([10, 20, 30]) // ['0', '1', '2']\n * getKeys(null) // []\n * getKeys(undefined) // []\n * getKeys('hello') // []\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getKeys(obj: unknown): string[] {\n return isObject(obj) ? ObjectKeys(obj) : []\n}\n\n/**\n * Get an own property value from an object safely.\n *\n * Returns `undefined` if the value is null/undefined or if the property\n * doesn't exist as an own property (not inherited). This avoids prototype\n * chain lookups and prevents errors on null/undefined values.\n *\n * @param obj - The object to get the property from\n * @param propKey - The property key to look up\n * @returns The property value, or `undefined` if not found or obj is null/undefined\n *\n * @example\n * ```ts\n * const obj = { name: 'Alice', age: 30 }\n * getOwn(obj, 'name') // 'Alice'\n * getOwn(obj, 'missing') // undefined\n * getOwn(obj, 'toString') // undefined (inherited, not own property)\n * getOwn(null, 'name') // undefined\n * getOwn(undefined, 'name') // undefined\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getOwn(obj: unknown, propKey: PropertyKey): unknown {\n if (obj === null || obj === undefined) {\n return undefined\n }\n return ObjectHasOwn(obj as object, propKey)\n ? (obj as Record<PropertyKey, unknown>)[propKey]\n : undefined\n}\n\n/**\n * Get all own property values from an object.\n *\n * Returns values for all own properties (enumerable and non-enumerable),\n * but not inherited properties. Returns an empty array for null/undefined.\n *\n * @param obj - The object to get values from\n * @returns Array of all own property values, or empty array for null/undefined\n *\n * @example\n * ```ts\n * getOwnPropertyValues({ a: 1, b: 2, c: 3 }) // [1, 2, 3]\n * getOwnPropertyValues([10, 20, 30]) // [10, 20, 30]\n * getOwnPropertyValues(null) // []\n * getOwnPropertyValues(undefined) // []\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getOwnPropertyValues<T>(\n obj: { [key: PropertyKey]: T } | null | undefined,\n): T[] {\n if (obj === null || obj === undefined) {\n return []\n }\n const keys = ObjectGetOwnPropertyNames(obj)\n const { length } = keys\n const values = Array(length)\n for (let i = 0; i < length; i += 1) {\n values[i] = obj[keys[i] as string]\n }\n return values\n}\n\n/**\n * Check if an object has any enumerable own properties.\n *\n * Returns `true` if the object has at least one enumerable own property,\n * `false` otherwise. Also returns `false` for null/undefined.\n *\n * @param obj - The value to check\n * @returns `true` if obj has enumerable own properties, `false` otherwise\n *\n * @example\n * ```ts\n * hasKeys({ a: 1 }) // true\n * hasKeys({}) // false\n * hasKeys([]) // false\n * hasKeys([1, 2]) // true\n * hasKeys(null) // false\n * hasKeys(undefined) // false\n * hasKeys(Object.create({ inherited: true })) // false (inherited, not own)\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function hasKeys(obj: unknown): obj is PropertyBag {\n if (obj === null || obj === undefined) {\n return false\n }\n for (const key in obj as object) {\n if (ObjectHasOwn(obj as object, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Check if an object has an own property.\n *\n * Type-safe wrapper around `Object.hasOwn()` that returns `false` for\n * null/undefined instead of throwing. Only checks own properties, not\n * inherited ones from the prototype chain.\n *\n * @param obj - The value to check\n * @param propKey - The property key to look for\n * @returns `true` if obj has the property as an own property, `false` otherwise\n *\n * @example\n * ```ts\n * const obj = { name: 'Alice' }\n * hasOwn(obj, 'name') // true\n * hasOwn(obj, 'age') // false\n * hasOwn(obj, 'toString') // false (inherited from Object.prototype)\n * hasOwn(null, 'name') // false\n * hasOwn(undefined, 'name') // false\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function hasOwn(\n obj: unknown,\n propKey: PropertyKey,\n): obj is object & PropertyBag {\n if (obj === null || obj === undefined) {\n return false\n }\n return ObjectHasOwn(obj as object, propKey)\n}\n\n/**\n * Check if a value is an object (including arrays).\n *\n * Returns `true` for any object type including arrays, functions, dates, etc.\n * Returns `false` for primitives and `null`.\n *\n * @param value - The value to check\n * @returns `true` if value is an object (including arrays), `false` otherwise\n *\n * @example\n * ```ts\n * isObject({}) // true\n * isObject([]) // true\n * isObject(new Date()) // true\n * isObject(() => {}) // false (functions are not objects for typeof)\n * isObject(null) // false\n * isObject(undefined) // false\n * isObject(42) // false\n * isObject('string') // false\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isObject(\n value: unknown,\n): value is { [key: PropertyKey]: unknown } {\n return value !== null && typeof value === 'object'\n}\n\n/**\n * Check if a value is a plain object (not an array, not a built-in).\n *\n * Returns `true` only for plain objects created with `{}` or `Object.create(null)`.\n * Returns `false` for arrays, built-in objects (Date, RegExp, etc.), and primitives.\n *\n * @param value - The value to check\n * @returns `true` if value is a plain object, `false` otherwise\n *\n * @example\n * ```ts\n * isObjectObject({}) // true\n * isObjectObject({ a: 1 }) // true\n * isObjectObject(Object.create(null)) // true\n * isObjectObject([]) // false\n * isObjectObject(new Date()) // false\n * isObjectObject(null) // false\n * isObjectObject(42) // false\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isObjectObject(\n value: unknown,\n): value is { [key: PropertyKey]: unknown } {\n if (value === null || typeof value !== 'object' || isArray(value)) {\n return false\n }\n const proto: any = ObjectGetPrototypeOf(value)\n return proto === null || proto === ObjectPrototype\n}\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\n\n/**\n * Alias for native `Object.assign`.\n *\n * Copies all enumerable own properties from one or more source objects\n * to a target object and returns the modified target object.\n *\n * @example\n * ```ts\n * const target = { a: 1 }\n * const source = { b: 2, c: 3 }\n * objectAssign(target, source) // { a: 1, b: 2, c: 3 }\n * ```\n */\nexport const objectAssign = Object.assign\n\n/**\n * Get all own property entries (key-value pairs) from an object.\n *\n * Unlike `Object.entries()`, this includes non-enumerable properties and\n * symbol keys. Returns an empty array for null/undefined.\n *\n * @param obj - The object to get entries from\n * @returns Array of [key, value] tuples, or empty array for null/undefined\n *\n * @example\n * ```ts\n * objectEntries({ a: 1, b: 2 }) // [['a', 1], ['b', 2]]\n * const sym = Symbol('key')\n * objectEntries({ [sym]: 'value', x: 10 }) // [[Symbol(key), 'value'], ['x', 10]]\n * objectEntries(null) // []\n * objectEntries(undefined) // []\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function objectEntries(obj: unknown): Array<[PropertyKey, unknown]> {\n if (obj === null || obj === undefined) {\n return []\n }\n const keys = ReflectOwnKeys(obj as object)\n const { length } = keys\n const entries = Array(length)\n const record = obj as Record<PropertyKey, unknown>\n for (let i = 0; i < length; i += 1) {\n const key = keys[i] as PropertyKey\n entries[i] = [key, record[key]]\n }\n return entries\n}\n\n// IMPORTANT: Do not use destructuring here - use direct assignment instead.\n// tsgo has a bug that incorrectly transpiles destructured exports, resulting in\n// `exports.SomeName = void 0;` which causes runtime errors.\n// See: https://github.com/SocketDev/socket-packageurl-js/issues/3\n\n/**\n * Alias for native `Object.freeze`.\n *\n * Freezes an object, preventing new properties from being added and existing\n * properties from being removed or modified. Makes the object immutable.\n *\n * @example\n * ```ts\n * const obj = { a: 1 }\n * objectFreeze(obj)\n * obj.a = 2 // Silently fails in non-strict mode, throws in strict mode\n * obj.b = 3 // Silently fails in non-strict mode, throws in strict mode\n * ```\n */\nexport const objectFreeze = Object.freeze\n\n/**\n * Deep merge source object into target object.\n *\n * Recursively merges properties from `source` into `target`. Arrays in source\n * completely replace arrays in target (no element-wise merging). Objects are\n * merged recursively. Includes infinite loop detection for safety.\n *\n * @param target - The object to merge into (will be modified)\n * @param source - The object to merge from\n * @returns The modified target object\n *\n * @example\n * ```ts\n * const target = { a: { x: 1 }, b: [1, 2] }\n * const source = { a: { y: 2 }, b: [3, 4, 5], c: 3 }\n * merge(target, source)\n * // { a: { x: 1, y: 2 }, b: [3, 4, 5], c: 3 }\n * ```\n *\n * @example\n * ```ts\n * // Arrays are replaced, not merged\n * merge({ arr: [1, 2] }, { arr: [3] }) // { arr: [3] }\n *\n * // Deep object merging\n * merge(\n * { config: { api: 'v1', timeout: 1000 } },\n * { config: { api: 'v2', retries: 3 } }\n * )\n * // { config: { api: 'v2', timeout: 1000, retries: 3 } }\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function merge<T extends object, U extends object>(\n target: T,\n source: U,\n): T & U {\n if (!isObject(target) || !isObject(source)) {\n return target as T & U\n }\n const queue: Array<[unknown, unknown]> = [[target, source]]\n let pos = 0\n let { length: queueLength } = queue\n while (pos < queueLength) {\n if (pos === LOOP_SENTINEL) {\n throw new Error('Detected infinite loop in object crawl of merge')\n }\n const { 0: currentTarget, 1: currentSource } = queue[pos++] as [\n Record<PropertyKey, unknown>,\n Record<PropertyKey, unknown>,\n ]\n\n if (!currentSource || !currentTarget) {\n continue\n }\n\n const isSourceArray = isArray(currentSource)\n const isTargetArray = isArray(currentTarget)\n\n // Skip array merging - arrays in source replace arrays in target\n if (isSourceArray || isTargetArray) {\n continue\n }\n\n const keys = ReflectOwnKeys(currentSource as object)\n for (let i = 0, { length } = keys; i < length; i += 1) {\n const key = keys[i] as PropertyKey\n const srcVal = currentSource[key]\n const targetVal = currentTarget[key]\n if (isArray(srcVal)) {\n // Replace arrays entirely\n currentTarget[key] = srcVal\n } else if (isObject(srcVal)) {\n if (isObject(targetVal) && !isArray(targetVal)) {\n queue[queueLength++] = [targetVal, srcVal]\n } else {\n currentTarget[key] = srcVal\n }\n } else {\n currentTarget[key] = srcVal\n }\n }\n }\n return target as T & U\n}\n\n/**\n * Convert an object to a new object with sorted keys.\n *\n * Creates a new object with the same properties as the input, but with keys\n * sorted alphabetically. Symbol keys are sorted separately and placed first.\n * This is useful for consistent key ordering in serialization or comparisons.\n *\n * @param obj - The object to sort\n * @returns A new object with sorted keys\n *\n * @example\n * ```ts\n * toSortedObject({ z: 1, a: 2, m: 3 })\n * // { a: 2, m: 3, z: 1 }\n *\n * const sym1 = Symbol('first')\n * const sym2 = Symbol('second')\n * toSortedObject({ z: 1, [sym2]: 2, a: 3, [sym1]: 4 })\n * // { [Symbol(first)]: 4, [Symbol(second)]: 2, a: 3, z: 1 }\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function toSortedObject<T extends object>(obj: T): T {\n return toSortedObjectFromEntries(objectEntries(obj)) as T\n}\n\n/**\n * Create an object from entries with sorted keys.\n *\n * Takes an iterable of [key, value] entries and creates a new object with\n * keys sorted alphabetically. Symbol keys are sorted separately and placed\n * first in the resulting object.\n *\n * @param entries - Iterable of [key, value] tuples\n * @returns A new object with sorted keys\n *\n * @example\n * ```ts\n * toSortedObjectFromEntries([['z', 1], ['a', 2], ['m', 3]])\n * // { a: 2, m: 3, z: 1 }\n *\n * const entries = new Map([['beta', 2], ['alpha', 1], ['gamma', 3]])\n * toSortedObjectFromEntries(entries)\n * // { alpha: 1, beta: 2, gamma: 3 }\n * ```\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function toSortedObjectFromEntries<T = unknown>(\n entries: Iterable<[PropertyKey, T]>,\n): SortedObject<T> {\n const otherEntries = []\n const symbolEntries = []\n // Use for-of to work with entries iterators.\n for (const entry of entries) {\n if (typeof entry[0] === 'symbol') {\n symbolEntries.push(entry)\n } else {\n otherEntries.push(entry)\n }\n }\n if (!otherEntries.length && !symbolEntries.length) {\n return {}\n }\n return ObjectFromEntries([\n // The String constructor is safe to use with symbols.\n ...symbolEntries.sort(entryKeyComparator),\n ...otherEntries.sort(entryKeyComparator),\n ])\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/editable.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Editable package.json manipulation utilities.\n */\n\nimport type {\n EditablePackageJsonOptions,\n NormalizeOptions,\n PackageJson,\n SaveOptions,\n} from '../packages'\nimport { isNodeModules } from '../path'\nimport { normalizePackageJson } from './normalize'\nimport { resolvePackageJsonDirname } from './paths'\n\nconst identSymbol = Symbol.for('indent')\nconst newlineSymbol = Symbol.for('newline')\n\n// Define the interface for the dynamic class\ninterface EditablePackageJsonConstructor {\n new (): EditablePackageJsonInstance\n fixSteps: unknown[]\n normalizeSteps: unknown[]\n prepareSteps: unknown[]\n create(\n path: string,\n opts?: EditablePackageJsonOptions,\n ): Promise<EditablePackageJsonInstance>\n fix(path: string, opts?: unknown): Promise<EditablePackageJsonInstance>\n load(\n path: string,\n opts?: EditablePackageJsonOptions,\n ): Promise<EditablePackageJsonInstance>\n normalize(\n path: string,\n opts?: NormalizeOptions,\n ): Promise<EditablePackageJsonInstance>\n prepare(path: string, opts?: unknown): Promise<EditablePackageJsonInstance>\n}\n\n/**\n * EditablePackageJson instance interface extending NPMCliPackageJson functionality.\n * Provides enhanced package.json manipulation with Socket-specific features.\n * @extends NPMCliPackageJson (from @npmcli/package-json)\n */\nexport interface EditablePackageJsonInstance {\n /**\n * The parsed package.json content as a readonly object.\n * @readonly\n */\n content: Readonly<PackageJson>\n\n /**\n * Create a new package.json file at the specified path.\n * @param path - The directory path where package.json will be created\n */\n create(path: string): this\n\n /**\n * Apply automatic fixes to the package.json based on npm standards.\n * @param opts - Optional fix configuration\n */\n fix(opts?: unknown | undefined): Promise<this>\n\n /**\n * Initialize the instance from a content object.\n * @param content - The package.json content object\n */\n fromContent(content: unknown): this\n\n /**\n * Initialize the instance from a JSON string.\n * @param json - The package.json content as a JSON string\n */\n fromJSON(json: string): this\n\n /**\n * Load a package.json file from the specified path.\n * @param path - The directory containing the package.json\n * @param create - Whether to create the file if it doesn't exist\n */\n load(path: string, create?: boolean): Promise<this>\n\n /**\n * Normalize the package.json content according to npm standards.\n * @param opts - Normalization options\n */\n normalize(opts?: NormalizeOptions): Promise<this>\n\n /**\n * Prepare the package.json for publishing.\n * @param opts - Preparation options\n */\n prepare(opts?: unknown): Promise<this>\n\n /**\n * Update the package.json content with new values.\n * @param content - Partial package.json object with fields to update\n * @override from NPMCliPackageJson\n */\n update(content: Partial<PackageJson>): this\n\n /**\n * Save the package.json file to disk.\n * @param options - Save options for formatting and sorting\n * @override from NPMCliPackageJson\n */\n save(options?: SaveOptions | undefined): Promise<boolean>\n\n /**\n * Synchronously save the package.json file to disk.\n * @param options - Save options for formatting and sorting\n */\n saveSync(options?: SaveOptions | undefined): boolean\n\n /**\n * Check if the package.json will be saved based on current changes.\n * @param options - Save options to evaluate\n */\n willSave(options?: SaveOptions | undefined): boolean\n}\n\nlet _EditablePackageJsonClass: EditablePackageJsonConstructor | undefined\n\nlet _fs: typeof import('fs') | undefined\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 as typeof import('fs')\n}\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 as typeof import('path')\n}\n\nlet _util: typeof import('util') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getUtil() {\n if (_util === undefined) {\n // Use non-'node:' prefixed require to avoid Webpack errors.\n\n _util = /*@__PURE__*/ require('node:util')\n }\n return _util as typeof import('util')\n}\n\n/**\n * Get the EditablePackageJson class for package.json manipulation.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getEditablePackageJsonClass(): EditablePackageJsonConstructor {\n if (_EditablePackageJsonClass === undefined) {\n const EditablePackageJsonBase =\n /*@__PURE__*/ require('../external/@npmcli/package-json')\n const { parse, read } =\n /*@__PURE__*/ require('../external/@npmcli/package-json/lib/read-package')\n const { packageSort } =\n /*@__PURE__*/ require('../external/@npmcli/package-json/lib/sort')\n _EditablePackageJsonClass =\n class EditablePackageJson extends (EditablePackageJsonBase as EditablePackageJsonConstructor) {\n static override fixSteps = EditablePackageJsonBase.fixSteps\n static override normalizeSteps = EditablePackageJsonBase.normalizeSteps\n static override prepareSteps = EditablePackageJsonBase.prepareSteps\n\n _canSave = true\n _path: string | undefined = undefined\n _readFileContent = ''\n _readFileJson: unknown = undefined\n\n override get content(): Readonly<PackageJson> {\n return super.content\n }\n\n get filename(): string {\n const path = this._path\n if (!path) {\n return ''\n }\n if (path.endsWith('package.json')) {\n return path\n }\n const nodePath = getPath()\n return nodePath.join(path, 'package.json')\n }\n\n static override async create(\n path: string,\n opts: EditablePackageJsonOptions = {},\n ) {\n const p = new (\n _EditablePackageJsonClass as EditablePackageJsonConstructor\n )()\n await p.create(path)\n return opts.data ? p.update(opts.data) : p\n }\n\n static override async fix(path: string, opts: unknown) {\n const p = new (\n _EditablePackageJsonClass as EditablePackageJsonConstructor\n )()\n await p.load(path, true)\n return await p.fix(opts)\n }\n\n static override async load(\n path: string,\n opts: EditablePackageJsonOptions = {},\n ) {\n const p = new (\n _EditablePackageJsonClass as EditablePackageJsonConstructor\n )()\n // Avoid try/catch if we aren't going to create\n if (!opts.create) {\n return await p.load(path)\n }\n try {\n return await p.load(path)\n } catch (err: unknown) {\n if (\n !(err as Error).message.startsWith('Could not read package.json')\n ) {\n throw err\n }\n return p.create(path)\n }\n }\n\n static override async normalize(path: string, opts: NormalizeOptions) {\n const p = new (\n _EditablePackageJsonClass as EditablePackageJsonConstructor\n )()\n await p.load(path)\n return await p.normalize(opts)\n }\n\n static override async prepare(path: string, opts: unknown) {\n const p = new (\n _EditablePackageJsonClass as EditablePackageJsonConstructor\n )()\n await p.load(path, true)\n return await p.prepare(opts)\n }\n\n override create(path: string) {\n super.create(path)\n ;(this as unknown as { _path: string })._path = path\n return this\n }\n\n override async fix(opts: unknown = {}) {\n await super.fix(opts)\n return this\n }\n\n override fromContent(data: unknown) {\n super.fromContent(data)\n ;(this as unknown as { _canSave: boolean })._canSave = false\n return this\n }\n\n override fromJSON(data: string): this {\n super.fromJSON(data)\n return this\n }\n\n override async load(path: string, create?: boolean): Promise<this> {\n this._path = path\n const { promises: fsPromises } = getFs()\n let parseErr: unknown\n try {\n this._readFileContent = await read(this.filename)\n } catch (err) {\n if (!create) {\n throw err\n }\n parseErr = err\n }\n if (parseErr) {\n const nodePath = getPath()\n const indexFile = nodePath.resolve(this.path || '', 'index.js')\n let indexFileContent: string\n try {\n indexFileContent = await fsPromises.readFile(indexFile, 'utf8')\n } catch {\n throw parseErr\n }\n try {\n this.fromContent(indexFileContent)\n } catch {\n throw parseErr\n }\n // This wasn't a package.json so prevent saving\n this._canSave = false\n return this\n }\n this.fromJSON(this._readFileContent)\n // Add AFTER fromJSON is called in case it errors.\n this._readFileJson = parse(this._readFileContent)\n return this\n }\n\n override async normalize(opts: NormalizeOptions = {}): Promise<this> {\n await super.normalize(opts)\n return this\n }\n\n get path() {\n return this._path\n }\n\n override async prepare(opts: unknown = {}): Promise<this> {\n await super.prepare(opts)\n return this\n }\n\n override async save(options?: SaveOptions): Promise<boolean> {\n if (!this._canSave || this.content === undefined) {\n throw new Error('No package.json to save to')\n }\n const { ignoreWhitespace = false, sort = false } = {\n __proto__: null,\n ...options,\n } as SaveOptions\n const {\n [identSymbol]: indent,\n [newlineSymbol]: newline,\n ...rest\n } = this.content as Record<string | symbol, unknown>\n const content = sort ? packageSort(rest) : rest\n const {\n [identSymbol]: _indent,\n [newlineSymbol]: _newline,\n ...origContent\n } = (this._readFileJson || {}) as Record<string | symbol, unknown>\n\n if (\n ignoreWhitespace &&\n getUtil().isDeepStrictEqual(content, origContent)\n ) {\n return false\n }\n\n const format =\n indent === undefined || indent === null\n ? ' '\n : (indent as string | number)\n const eol =\n newline === undefined || newline === null\n ? '\\n'\n : (newline as string)\n const fileContent = `${JSON.stringify(\n content,\n undefined,\n format,\n )}\\n`.replace(/\\n/g, eol)\n\n if (\n !ignoreWhitespace &&\n fileContent.trim() === this._readFileContent.trim()\n ) {\n return false\n }\n\n const { promises: fsPromises } = getFs()\n await fsPromises.writeFile(this.filename, fileContent)\n this._readFileContent = fileContent\n this._readFileJson = parse(fileContent)\n return true\n }\n\n override saveSync(options?: SaveOptions): boolean {\n if (!this._canSave || this.content === undefined) {\n throw new Error('No package.json to save to')\n }\n const { ignoreWhitespace = false, sort = false } = {\n __proto__: null,\n ...options,\n } as SaveOptions\n const {\n [Symbol.for('indent')]: indent,\n [Symbol.for('newline')]: newline,\n ...rest\n } = this.content as Record<string | symbol, unknown>\n const content = sort ? packageSort(rest) : rest\n\n if (\n ignoreWhitespace &&\n getUtil().isDeepStrictEqual(content, this._readFileJson)\n ) {\n return false\n }\n\n const format =\n indent === undefined || indent === null\n ? ' '\n : (indent as string | number)\n const eol =\n newline === undefined || newline === null\n ? '\\n'\n : (newline as string)\n const fileContent = `${JSON.stringify(\n content,\n undefined,\n format,\n )}\\n`.replace(/\\n/g, eol)\n\n if (\n !ignoreWhitespace &&\n fileContent.trim() === this._readFileContent.trim()\n ) {\n return false\n }\n\n const fs = getFs()\n fs.writeFileSync(this.filename, fileContent)\n this._readFileContent = fileContent\n this._readFileJson = parse(fileContent)\n return true\n }\n\n override update(content: PackageJson): this {\n super.update(content)\n return this\n }\n\n override willSave(options?: SaveOptions): boolean {\n const { ignoreWhitespace = false, sort = false } = {\n __proto__: null,\n ...options,\n } as SaveOptions as SaveOptions\n if (!this._canSave || this.content === undefined) {\n return false\n }\n const {\n [Symbol.for('indent')]: indent,\n [Symbol.for('newline')]: newline,\n ...rest\n } = this.content as Record<string | symbol, unknown>\n const content = sort ? packageSort(rest) : rest\n\n if (\n ignoreWhitespace &&\n getUtil().isDeepStrictEqual(content, this._readFileJson)\n ) {\n return false\n }\n\n const format =\n indent === undefined || indent === null\n ? ' '\n : (indent as string | number)\n const eol =\n newline === undefined || newline === null\n ? '\\n'\n : (newline as string)\n const fileContent = `${JSON.stringify(\n content,\n undefined,\n format,\n )}\\n`.replace(/\\n/g, eol)\n\n if (\n !ignoreWhitespace &&\n fileContent.trim() === this._readFileContent.trim()\n ) {\n return false\n }\n return true\n }\n } as EditablePackageJsonConstructor\n }\n return _EditablePackageJsonClass as EditablePackageJsonConstructor\n}\n\n/**\n * Convert a package.json object to an editable instance.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function pkgJsonToEditable(\n pkgJson: PackageJson,\n options?: EditablePackageJsonOptions,\n): unknown {\n const { normalize, ...normalizeOptions } = {\n __proto__: null,\n ...options,\n } as EditablePackageJsonOptions\n const EditablePackageJson = getEditablePackageJsonClass()\n return new EditablePackageJson().fromContent(\n normalize ? normalizePackageJson(pkgJson, normalizeOptions) : pkgJson,\n )\n}\n\n/**\n * Convert package.json to editable instance with file persistence.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function toEditablePackageJson(\n pkgJson: PackageJson,\n options?: EditablePackageJsonOptions,\n): Promise<unknown> {\n const { path: filepath, ...pkgJsonToEditableOptions } = {\n __proto__: null,\n ...options,\n }\n const { normalize, ...normalizeOptions } = pkgJsonToEditableOptions\n if (typeof filepath !== 'string') {\n return pkgJsonToEditable(pkgJson, pkgJsonToEditableOptions)\n }\n const EditablePackageJson = getEditablePackageJsonClass()\n const pkgJsonPath = resolvePackageJsonDirname(filepath)\n return (\n await EditablePackageJson.load(pkgJsonPath, { create: true })\n ).fromJSON(\n `${JSON.stringify(\n normalize\n ? normalizePackageJson(pkgJson, {\n ...(isNodeModules(pkgJsonPath) ? {} : { preserve: ['repository'] }),\n ...normalizeOptions,\n })\n : pkgJson,\n null,\n 2,\n )}\\n`,\n )\n}\n\n/**\n * Convert package.json to editable instance with file persistence synchronously.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function toEditablePackageJsonSync(\n pkgJson: PackageJson,\n options?: EditablePackageJsonOptions,\n): unknown {\n const { path: filepath, ...pkgJsonToEditableOptions } = {\n __proto__: null,\n ...options,\n }\n const { normalize, ...normalizeOptions } = pkgJsonToEditableOptions\n if (typeof filepath !== 'string') {\n return pkgJsonToEditable(pkgJson, pkgJsonToEditableOptions)\n }\n const EditablePackageJson = getEditablePackageJsonClass()\n const pkgJsonPath = resolvePackageJsonDirname(filepath)\n return new EditablePackageJson().create(pkgJsonPath).fromJSON(\n `${JSON.stringify(\n normalize\n ? normalizePackageJson(pkgJson, {\n ...(isNodeModules(pkgJsonPath) ? {} : { preserve: ['repository'] }),\n ...normalizeOptions,\n })\n : pkgJson,\n null,\n 2,\n )}\\n`,\n )\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/exports.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Package exports field utilities.\n */\n\nimport { LOOP_SENTINEL } from '#constants/core'\n\nimport { isArray } from '../arrays'\nimport { isObject, isObjectObject } from '../objects'\n\n/**\n * Find types definition for a specific subpath in package exports.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function findTypesForSubpath(\n entryExports: unknown,\n subpath: string,\n): string | undefined {\n const queue = [entryExports]\n let pos = 0\n while (pos < queue.length) {\n if (pos === LOOP_SENTINEL) {\n throw new Error(\n 'Detected infinite loop in entry exports crawl of getTypesForSubpath',\n )\n }\n const value = queue[pos++]\n if (isArray(value)) {\n for (let i = 0, { length } = value; i < length; i += 1) {\n const item = value[i]\n if (item === subpath) {\n return (value as { types?: string }).types\n }\n if (isObject(item)) {\n queue.push(item)\n }\n }\n } else if (isObject(value)) {\n const keys = Object.getOwnPropertyNames(value)\n for (let i = 0, { length } = keys; i < length; i += 1) {\n const key = keys[i] as string\n const item = value[key]\n if (item === subpath) {\n return (value as { types?: string }).types\n }\n if (isObject(item)) {\n queue.push(item)\n }\n }\n }\n }\n return undefined\n}\n\n/**\n * Get subpaths from package exports.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getSubpaths(entryExports: unknown): string[] {\n if (!isObject(entryExports)) {\n return []\n }\n // Return the keys of the exports object (the subpaths).\n return Object.getOwnPropertyNames(entryExports).filter(key =>\n key.startsWith('.'),\n )\n}\n\n/**\n * Get file paths from package exports.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function getExportFilePaths(entryExports: unknown): string[] {\n if (!isObject(entryExports)) {\n return []\n }\n\n const paths = []\n\n // Traverse the exports object to find actual file paths.\n for (const key of Object.getOwnPropertyNames(entryExports)) {\n if (!key.startsWith('.')) {\n continue\n }\n\n const value = entryExports[key]\n\n if (typeof value === 'string') {\n // Direct path export.\n paths.push(value)\n } else if (isObject(value)) {\n // Conditional or nested export.\n for (const subKey of Object.getOwnPropertyNames(value)) {\n const subValue = value[subKey]\n if (typeof subValue === 'string') {\n paths.push(subValue)\n } else if (isArray(subValue)) {\n // Array of conditions.\n for (const item of subValue) {\n if (typeof item === 'string') {\n paths.push(item)\n } else if (isObject(item)) {\n // Nested conditional.\n for (const nestedKey of Object.getOwnPropertyNames(item)) {\n const nestedValue = item[nestedKey]\n if (typeof nestedValue === 'string') {\n paths.push(nestedValue)\n }\n }\n }\n }\n }\n }\n }\n }\n\n // Remove duplicates and filter out non-file paths.\n return [...new Set(paths)].filter(p => p.startsWith('./'))\n}\n\n/**\n * Check if package exports use conditional patterns (e.g., import/require).\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isConditionalExports(entryExports: unknown): boolean {\n if (!isObjectObject(entryExports)) {\n return false\n }\n const keys = Object.getOwnPropertyNames(entryExports)\n const { length } = keys\n if (!length) {\n return false\n }\n // Conditional entry exports do NOT contain keys starting with '.'.\n // Entry exports cannot contain some keys starting with '.' and some not.\n // The exports object MUST either be an object of package subpath keys OR\n // an object of main entry condition name keys only.\n for (let i = 0; i < length; i += 1) {\n const key = keys[i] as string\n if (key.length > 0 && key.charCodeAt(0) === 46 /*'.'*/) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if package exports use subpath patterns (keys starting with '.').\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function isSubpathExports(entryExports: unknown): boolean {\n if (isObjectObject(entryExports)) {\n const keys = Object.getOwnPropertyNames(entryExports)\n for (let i = 0, { length } = keys; i < length; i += 1) {\n // Subpath entry exports contain keys starting with '.'.\n // Entry exports cannot contain some keys starting with '.' and some not.\n // The exports object MUST either be an object of package subpath keys OR\n // an object of main entry condition name keys only.\n if (keys[i]?.charCodeAt(0) === 46 /*'.'*/) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Normalize package.json exports field to canonical format.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function resolvePackageJsonEntryExports(entryExports: unknown): unknown {\n // If conditional exports main sugar\n // https://nodejs.org/api/packages.html#exports-sugar\n if (typeof entryExports === 'string' || isArray(entryExports)) {\n return { '.': entryExports }\n }\n if (isConditionalExports(entryExports)) {\n return entryExports\n }\n return isObject(entryExports) ? entryExports : undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/isolation.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Package isolation utilities for testing.\n * Provides tools to set up isolated test environments for packages.\n */\n\nimport { existsSync, promises as fs } from 'fs'\n\nimport { WIN32 } from '#constants/platform'\n\nimport type { PackageJson } from '../packages'\nimport { isAbsolute, isPath, trimLeadingDotSlash } from '../path'\nimport { readPackageJson } from './operations'\nimport { getOsTmpDir } from '#lib/paths'\n\nlet _path: typeof import('node:path') | undefined\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 as typeof import('path')\n}\n\n/**\n * Copy options for fs.cp with cross-platform retry support.\n */\nconst FS_CP_OPTIONS = {\n dereference: true,\n errorOnExist: false,\n filter: (src: string) =>\n !src.includes('node_modules') && !src.endsWith('.DS_Store'),\n force: true,\n recursive: true,\n ...(WIN32 ? { maxRetries: 3, retryDelay: 100 } : {}),\n}\n\n/**\n * Resolve a path to its real location, handling symlinks.\n */\nasync function resolveRealPath(pathStr: string): Promise<string> {\n const path = getPath()\n return await fs.realpath(pathStr).catch(() => path.resolve(pathStr))\n}\n\n/**\n * Merge and write package.json with original and new values.\n */\nasync function mergePackageJson(\n pkgJsonPath: string,\n originalPkgJson: PackageJson | undefined,\n): Promise<PackageJson> {\n const pkgJson = JSON.parse(await fs.readFile(pkgJsonPath, 'utf8'))\n const mergedPkgJson = originalPkgJson\n ? { ...originalPkgJson, ...pkgJson }\n : pkgJson\n return mergedPkgJson\n}\n\nexport type IsolatePackageOptions = {\n imports?: Record<string, string> | undefined\n install?: ((cwd: string) => Promise<void>) | undefined\n onPackageJson?:\n | ((pkgJson: PackageJson) => PackageJson | Promise<PackageJson>)\n | undefined\n sourcePath?: string | undefined\n}\n\nexport type IsolatePackageResult = {\n exports?: Record<string, unknown> | undefined\n tmpdir: string\n}\n\n/**\n * Isolates a package in a temporary test environment.\n *\n * Supports multiple input types:\n * 1. File system path (absolute or relative)\n * 2. Package name with optional version spec\n * 3. npm package spec (parsed via npm-package-arg)\n *\n * @throws {Error} When package installation or setup fails.\n */\nexport async function isolatePackage(\n packageSpec: string,\n options?: IsolatePackageOptions | undefined,\n): Promise<IsolatePackageResult> {\n const path = getPath()\n const opts = { __proto__: null, ...options } as IsolatePackageOptions\n const { imports, install, onPackageJson, sourcePath: optSourcePath } = opts\n\n let sourcePath = optSourcePath\n let packageName: string | undefined\n let spec: string | undefined\n\n // Determine if this is a path or package spec.\n if (isPath(packageSpec)) {\n // File system path.\n // Handle edge case on Windows where path.relative() returns an absolute path\n // when paths are on different drives, and the test prepends './' to it.\n // Example: './C:\\path\\to\\file' should be treated as 'C:\\path\\to\\file'.\n const trimmedPath = trimLeadingDotSlash(packageSpec)\n const pathToResolve = isAbsolute(trimmedPath) ? trimmedPath : packageSpec\n sourcePath = path.resolve(pathToResolve)\n\n if (!existsSync(sourcePath)) {\n throw new Error(`Source path does not exist: ${sourcePath}`)\n }\n\n // Read package.json to get the name.\n const pkgJson = await readPackageJson(sourcePath, { normalize: true })\n if (!pkgJson) {\n throw new Error(`Could not read package.json from: ${sourcePath}`)\n }\n packageName = pkgJson.name as string\n } else {\n // Parse as npm package spec.\n const npa = /*@__PURE__*/ require('../external/npm-package-arg')\n const parsed = npa(packageSpec)\n\n packageName = parsed.name\n\n if (parsed.type === 'directory' || parsed.type === 'file') {\n sourcePath = parsed.fetchSpec\n if (!sourcePath || !existsSync(sourcePath)) {\n throw new Error(`Source path does not exist: ${sourcePath}`)\n }\n // If package name not provided by parser, read from package.json.\n if (!packageName) {\n const pkgJson = await readPackageJson(sourcePath, { normalize: true })\n if (!pkgJson) {\n throw new Error(`Could not read package.json from: ${sourcePath}`)\n }\n packageName = pkgJson.name as string\n }\n } else {\n // Registry package.\n spec = parsed.fetchSpec || parsed.rawSpec\n }\n }\n\n if (!packageName) {\n throw new Error(`Could not determine package name from: ${packageSpec}`)\n }\n\n // Create temp directory for this package.\n const sanitizedName = packageName.replace(/[@/]/g, '-')\n const tempDir = await fs.mkdtemp(\n path.join(getOsTmpDir(), `socket-test-${sanitizedName}-`),\n )\n const packageTempDir = path.join(tempDir, sanitizedName)\n await fs.mkdir(packageTempDir, { recursive: true })\n\n let installedPath: string\n let originalPackageJson: PackageJson | undefined\n\n if (spec) {\n // Installing from registry first, then copying source on top if provided.\n await fs.writeFile(\n path.join(packageTempDir, 'package.json'),\n JSON.stringify(\n {\n name: 'test-temp',\n private: true,\n version: '1.0.0',\n },\n null,\n 2,\n ),\n )\n\n // Use custom install function or default pnpm install.\n if (install) {\n await install(packageTempDir)\n } else {\n const { spawn } = /*@__PURE__*/ require('../spawn')\n const packageInstallSpec = spec.startsWith('https://')\n ? spec\n : `${packageName}@${spec}`\n\n await spawn('pnpm', ['add', packageInstallSpec], {\n cwd: packageTempDir,\n shell: WIN32,\n stdio: 'pipe',\n })\n }\n\n installedPath = path.join(packageTempDir, 'node_modules', packageName)\n\n // Save original package.json before copying source.\n originalPackageJson = await readPackageJson(installedPath, {\n normalize: true,\n })\n\n // Copy source files on top if provided.\n if (sourcePath) {\n // Check if source and destination are the same (symlinked).\n const realInstalledPath = await resolveRealPath(installedPath)\n const realSourcePath = await resolveRealPath(sourcePath)\n\n if (realSourcePath !== realInstalledPath) {\n await fs.cp(sourcePath, installedPath, FS_CP_OPTIONS)\n }\n }\n } else {\n // Just copying local package, no registry install.\n if (!sourcePath) {\n throw new Error('sourcePath is required when no version spec provided')\n }\n\n const scopedPath = packageName.startsWith('@')\n ? path.join(\n packageTempDir,\n 'node_modules',\n packageName.split('/')[0] ?? '',\n )\n : path.join(packageTempDir, 'node_modules')\n\n await fs.mkdir(scopedPath, { recursive: true })\n installedPath = path.join(packageTempDir, 'node_modules', packageName)\n\n await fs.cp(sourcePath, installedPath, FS_CP_OPTIONS)\n }\n\n // Prepare package.json if callback provided or if we need to merge with original.\n if (onPackageJson || originalPackageJson) {\n const pkgJsonPath = path.join(installedPath, 'package.json')\n const mergedPkgJson = await mergePackageJson(\n pkgJsonPath,\n originalPackageJson,\n )\n\n const finalPkgJson = onPackageJson\n ? await onPackageJson(mergedPkgJson)\n : mergedPkgJson\n\n await fs.writeFile(pkgJsonPath, JSON.stringify(finalPkgJson, null, 2))\n }\n\n // Install dependencies.\n if (install) {\n await install(installedPath)\n } else {\n const { spawn } = /*@__PURE__*/ require('../spawn')\n await spawn('pnpm', ['install'], {\n cwd: installedPath,\n shell: WIN32,\n stdio: 'pipe',\n })\n }\n\n // Load module exports if imports provided.\n const exports: Record<string, unknown> = imports\n ? { __proto__: null }\n : (undefined as unknown as Record<string, unknown>)\n\n if (imports) {\n for (const { 0: key, 1: specifier } of Object.entries(imports)) {\n const fullPath = path.join(installedPath, specifier)\n exports[key] = require(fullPath)\n }\n }\n\n return {\n exports,\n tmpdir: installedPath,\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["fs", "exports"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/licenses.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview SPDX license parsing and analysis utilities.\n */\n\nimport { LOOP_SENTINEL } from '#constants/core'\nimport { getCopyLeftLicenses } from '#constants/licenses'\n\nconst copyLeftLicenses = getCopyLeftLicenses()\n\nimport { hasOwn } from '../objects'\nimport type { LicenseNode } from '../packages'\nimport { normalizePath } from '../path'\n\nconst BINARY_OPERATION_NODE_TYPE = 'BinaryOperation'\nconst LICENSE_NODE_TYPE = 'License'\n\nconst fileReferenceRegExp = /^SEE LICEN[CS]E IN (.+)$/\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 as typeof import('path')\n}\n\nlet _spdxCorrect: typeof import('spdx-correct') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getSpdxCorrect() {\n if (_spdxCorrect === undefined) {\n // The 'spdx-correct' package is browser safe.\n _spdxCorrect = /*@__PURE__*/ require('../external/spdx-correct')\n }\n return _spdxCorrect as typeof import('spdx-correct')\n}\n\nlet _spdxExpParse: typeof import('spdx-expression-parse') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getSpdxExpParse() {\n if (_spdxExpParse === undefined) {\n // The 'spdx-expression-parse' package is browser safe.\n _spdxExpParse = /*@__PURE__*/ require('../external/spdx-expression-parse')\n }\n return _spdxExpParse as typeof import('spdx-expression-parse')\n}\n\n// Duplicated from spdx-expression-parse - AST node types.\nexport interface SpdxLicenseNode {\n license: string\n plus?: boolean | undefined\n exception?: string | undefined\n}\n\nexport interface SpdxBinaryOperationNode {\n left: SpdxLicenseNode | SpdxBinaryOperationNode\n conjunction: 'and' | 'or'\n right: SpdxLicenseNode | SpdxBinaryOperationNode\n}\n\nexport type SpdxAstNode = SpdxLicenseNode | SpdxBinaryOperationNode\n\n// Internal AST node types with type discriminator.\nexport interface InternalLicenseNode extends SpdxLicenseNode {\n type: 'License'\n}\n\nexport interface InternalBinaryOperationNode {\n type: 'BinaryOperation'\n left: InternalLicenseNode | InternalBinaryOperationNode\n conjunction: 'and' | 'or'\n right: InternalLicenseNode | InternalBinaryOperationNode\n}\n\nexport type InternalAstNode = InternalLicenseNode | InternalBinaryOperationNode\n\nexport interface LicenseVisitor {\n License?: (\n node: InternalLicenseNode,\n parent?: InternalAstNode,\n ) => boolean | undefined\n BinaryOperation?: (\n node: InternalBinaryOperationNode,\n parent?: InternalAstNode,\n ) => boolean | undefined\n}\n\n/**\n * Collect licenses that are incompatible (copyleft).\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function collectIncompatibleLicenses(\n licenseNodes: LicenseNode[],\n): LicenseNode[] {\n const result = []\n for (let i = 0, { length } = licenseNodes; i < length; i += 1) {\n const node = licenseNodes[i]\n if (node && copyLeftLicenses.has(node.license)) {\n result.push(node)\n }\n }\n return result\n}\n\n/**\n * Collect warnings from license nodes.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function collectLicenseWarnings(licenseNodes: LicenseNode[]): string[] {\n const warnings = new Map()\n for (let i = 0, { length } = licenseNodes; i < length; i += 1) {\n const node = licenseNodes[i]\n if (!node) {\n continue\n }\n const { license } = node\n if (license === 'UNLICENSED') {\n warnings.set('UNLICENSED', 'Package is unlicensed')\n } else if (node.inFile !== undefined) {\n warnings.set('IN_FILE', `License terms specified in ${node.inFile}`)\n }\n }\n return [...warnings.values()]\n}\n\n/**\n * Create an AST node from a raw node.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createAstNode(rawNode: SpdxAstNode): InternalAstNode {\n return hasOwn(rawNode, 'license')\n ? createLicenseNode(rawNode as SpdxLicenseNode)\n : createBinaryOperationNode(rawNode as SpdxBinaryOperationNode)\n}\n\n/**\n * Create a binary operation AST node.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createBinaryOperationNode(\n rawNodeParam: SpdxBinaryOperationNode,\n): InternalBinaryOperationNode {\n let left: InternalAstNode | undefined\n let right: InternalAstNode | undefined\n let rawLeft: SpdxAstNode | undefined = rawNodeParam.left\n let rawRight: SpdxAstNode | undefined = rawNodeParam.right\n const { conjunction } = rawNodeParam\n // Clear the reference to help with memory management.\n return {\n __proto__: null,\n type: BINARY_OPERATION_NODE_TYPE as 'BinaryOperation',\n get left() {\n if (left === undefined) {\n left = createAstNode(rawLeft as SpdxAstNode)\n rawLeft = undefined\n }\n return left\n },\n conjunction,\n get right() {\n if (right === undefined) {\n right = createAstNode(rawRight as SpdxAstNode)\n rawRight = undefined\n }\n return right\n },\n } as InternalBinaryOperationNode\n}\n\n/**\n * Create a license AST node.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createLicenseNode(\n rawNode: SpdxLicenseNode,\n): InternalLicenseNode {\n return {\n __proto__: null,\n ...rawNode,\n type: LICENSE_NODE_TYPE as 'License',\n } as InternalLicenseNode\n}\n\n/**\n * Parse an SPDX license expression into an AST.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function parseSpdxExp(spdxExp: string): SpdxAstNode | undefined {\n const spdxExpParse = getSpdxExpParse()\n try {\n return spdxExpParse(spdxExp)\n } catch {}\n const spdxCorrect = getSpdxCorrect()\n const corrected = spdxCorrect(spdxExp)\n return corrected ? spdxExpParse(corrected) : undefined\n}\n\n/**\n * Parse package license field into structured license nodes.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function resolvePackageLicenses(\n licenseFieldValue: string,\n where: string,\n): LicenseNode[] {\n // Based off of validate-npm-package-license which npm, by way of normalize-package-data,\n // uses to validate license field values:\n // https://github.com/kemitchell/validate-npm-package-license.js/blob/v3.0.4/index.js#L40-L41\n if (\n licenseFieldValue === 'UNLICENSED' ||\n licenseFieldValue === 'UNLICENCED'\n ) {\n return [{ license: 'UNLICENSED' }]\n }\n // Match \"SEE LICENSE IN <relativeFilepathToLicense>\"\n // https://github.com/kemitchell/validate-npm-package-license.js/blob/v3.0.4/index.js#L48-L53\n const match = fileReferenceRegExp.exec(licenseFieldValue)\n if (match) {\n const path = getPath()\n return [\n {\n license: licenseFieldValue,\n inFile: normalizePath(path.relative(where, match[1] || '')),\n },\n ]\n }\n const licenseNodes: InternalLicenseNode[] = []\n const ast = parseSpdxExp(licenseFieldValue)\n if (ast) {\n // SPDX expressions are valid, too except if they contain \"LicenseRef\" or\n // \"DocumentRef\". If the licensing terms cannot be described with standardized\n // SPDX identifiers, then the terms should be put in a file in the package\n // and the license field should point users there, e.g. \"SEE LICENSE IN LICENSE.txt\".\n // https://github.com/kemitchell/validate-npm-package-license.js/blob/v3.0.4/index.js#L18-L24\n visitLicenses(ast, {\n License(node: InternalLicenseNode) {\n const { license } = node\n if (\n license.startsWith('LicenseRef') ||\n license.startsWith('DocumentRef')\n ) {\n licenseNodes.length = 0\n return false\n }\n licenseNodes.push(node)\n },\n })\n }\n return licenseNodes\n}\n\n/**\n * Traverse SPDX license AST and invoke visitor callbacks for each node.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function visitLicenses(ast: SpdxAstNode, visitor: LicenseVisitor): void {\n const queue: Array<[InternalAstNode, InternalAstNode | undefined]> = [\n [createAstNode(ast), undefined],\n ]\n let pos = 0\n let { length: queueLength } = queue\n while (pos < queueLength) {\n if (pos === LOOP_SENTINEL) {\n throw new Error('Detected infinite loop in ast crawl of visitLicenses')\n }\n // AST nodes can be a license node which looks like\n // {\n // license: string\n // plus?: boolean\n // exception?: string\n // }\n // or a binary operation node which looks like\n // {\n // left: License | BinaryOperation\n // conjunction: string\n // right: License | BinaryOperation\n // }\n const { 0: node, 1: parent } = queue[pos++] as [\n InternalBinaryOperationNode | InternalLicenseNode,\n InternalBinaryOperationNode | null,\n ]\n const { type } = node\n const visitorRecord = visitor as Record<string, unknown>\n if (typeof visitorRecord[type] === 'function' && hasOwn(visitor, type)) {\n if (type === LICENSE_NODE_TYPE) {\n const licenseVisitor = visitorRecord['License']\n if (\n typeof licenseVisitor === 'function' &&\n licenseVisitor(node as InternalLicenseNode, parent) === false\n ) {\n break\n }\n } else if (type === BINARY_OPERATION_NODE_TYPE) {\n const binaryOpVisitor = visitorRecord['BinaryOperation']\n if (\n typeof binaryOpVisitor === 'function' &&\n binaryOpVisitor(node as InternalBinaryOperationNode, parent) === false\n ) {\n break\n }\n }\n }\n if (type === BINARY_OPERATION_NODE_TYPE) {\n queue[queueLength++] = [node.left, node]\n queue[queueLength++] = [node.right, node]\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/manifest.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Package manifest and packument fetching utilities.\n */\n\nimport {\n getPackageDefaultNodeRange,\n getPackageDefaultSocketCategories,\n getPackumentCache,\n} from '#constants/packages'\nimport { getAbortSignal } from '#constants/process'\nimport { SOCKET_GITHUB_ORG, SOCKET_REGISTRY_REPO_NAME } from '#constants/socket'\n\nconst abortSignal = getAbortSignal()\nconst packageDefaultNodeRange = getPackageDefaultNodeRange()\nconst PACKAGE_DEFAULT_SOCKET_CATEGORIES = getPackageDefaultSocketCategories()\nconst packumentCache = getPackumentCache()\n\nimport { isArray } from '../arrays'\nimport { isObjectObject, objectEntries } from '../objects'\nimport type { PackageJson, PacoteOptions } from '../packages'\nimport { resolvePackageJsonEntryExports } from './exports'\nimport { isRegistryFetcherType } from './validation'\n\nconst pkgScopePrefixRegExp = /^@socketregistry\\//\n\nlet _npmPackageArg: typeof import('npm-package-arg') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getNpmPackageArg() {\n if (_npmPackageArg === undefined) {\n _npmPackageArg = /*@__PURE__*/ require('../external/npm-package-arg')\n }\n return _npmPackageArg as typeof import('npm-package-arg')\n}\n\nlet _pacote: typeof import('pacote') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getPacote() {\n if (_pacote === undefined) {\n _pacote = /*@__PURE__*/ require('../external/pacote')\n }\n return _pacote as typeof import('pacote')\n}\n\nlet _semver: typeof import('semver') | undefined\n/*@__NO_SIDE_EFFECTS__*/\nfunction getSemver() {\n if (_semver === undefined) {\n // The 'semver' package is browser safe.\n _semver = /*@__PURE__*/ require('../external/semver')\n }\n return _semver as typeof import('semver')\n}\n\n/**\n * Create a package.json object for a Socket registry package.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createPackageJson(\n sockRegPkgName: string,\n directory: string,\n options?: PackageJson | undefined,\n): PackageJson {\n const {\n dependencies,\n description,\n engines,\n exports: entryExportsRaw,\n files,\n keywords,\n main,\n overrides,\n resolutions,\n sideEffects,\n socket,\n type,\n version,\n } = { __proto__: null, ...options } as PackageJson\n const name = `@socketregistry/${sockRegPkgName.replace(pkgScopePrefixRegExp, '')}`\n const entryExports = resolvePackageJsonEntryExports(entryExportsRaw)\n const githubUrl = `https://github.com/${SOCKET_GITHUB_ORG}/${SOCKET_REGISTRY_REPO_NAME}`\n return {\n __proto__: null,\n name,\n version,\n license: 'MIT',\n description,\n keywords,\n homepage: `${githubUrl}/tree/main/${directory}`,\n repository: {\n type: 'git',\n url: `git+${githubUrl}.git`,\n directory,\n },\n ...(type ? { type } : {}),\n ...(isObjectObject(entryExports) ? { exports: { ...entryExports } } : {}),\n ...(entryExports ? {} : { main: `${main ?? './index.js'}` }),\n sideEffects: sideEffects !== undefined && !!sideEffects,\n ...(isObjectObject(dependencies)\n ? { dependencies: { ...dependencies } }\n : {}),\n ...(isObjectObject(overrides) ? { overrides: { ...overrides } } : {}),\n ...(isObjectObject(resolutions) ? { resolutions: { ...resolutions } } : {}),\n ...(isObjectObject(engines)\n ? {\n engines: Object.fromEntries(\n objectEntries(engines).map((pair: [PropertyKey, unknown]) => {\n const strKey = String(pair[0])\n const result: [string, unknown] = [strKey, pair[1]]\n if (strKey === 'node') {\n const semver = getSemver()\n const { 1: range } = result\n if (\n typeof range === 'string' &&\n range &&\n packageDefaultNodeRange\n ) {\n // Roughly check Node range as semver.coerce will strip leading\n // v's, carets (^), comparators (<,<=,>,>=,=), and tildes (~).\n const coercedRange = semver.coerce(range)\n if (\n !semver.satisfies(\n coercedRange?.version ?? '0.0.0',\n packageDefaultNodeRange,\n )\n ) {\n result[1] = packageDefaultNodeRange\n }\n }\n }\n return result\n }),\n ),\n }\n : { engines: { node: packageDefaultNodeRange } }),\n files: isArray(files) ? files.slice() : ['*.d.ts', '*.js'],\n ...(isObjectObject(socket)\n ? { socket: { ...socket } }\n : {\n socket: {\n // Valid categories are: cleanup, levelup, speedup, tuneup\n categories: PACKAGE_DEFAULT_SOCKET_CATEGORIES,\n },\n }),\n } as PackageJson\n}\n\n/**\n * Fetch the manifest for a package.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function fetchPackageManifest(\n pkgNameOrId: string,\n options?: PacoteOptions,\n): Promise<unknown> {\n const pacoteOptions = {\n __proto__: null,\n signal: abortSignal,\n ...options,\n packumentCache,\n preferOffline: true,\n } as PacoteOptions & { where?: string }\n const { signal } = pacoteOptions\n if (signal?.aborted) {\n return undefined\n }\n const pacote = getPacote()\n let result: unknown\n try {\n result = await pacote.manifest(pkgNameOrId, pacoteOptions)\n } catch {}\n if (signal?.aborted) {\n return undefined\n }\n if (result) {\n const npmPackageArg = getNpmPackageArg()\n const spec = npmPackageArg(pkgNameOrId, pacoteOptions.where)\n if (isRegistryFetcherType(spec.type)) {\n return result\n }\n }\n // Convert a manifest not fetched by RegistryFetcher to one that is.\n if (result) {\n const typedResult = result as { name: string; version: string }\n return await fetchPackageManifest(\n `${typedResult.name}@${typedResult.version}`,\n pacoteOptions,\n )\n }\n return null\n}\n\n/**\n * Fetch the packument (package document) for a package.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport async function fetchPackagePackument(\n pkgNameOrId: string,\n options?: PacoteOptions,\n): Promise<unknown> {\n const pacote = getPacote()\n try {\n return await pacote.packument(pkgNameOrId, {\n __proto__: null,\n signal: abortSignal,\n ...options,\n packumentCache,\n preferOffline: true,\n })\n } catch {}\n return undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/packages/normalize.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @fileoverview Package.json normalization utilities.\n */\n\nimport { merge } from '../objects'\n\nimport type { NormalizeOptions, PackageJson } from '../packages'\n\nconst ArrayIsArray = Array.isArray\nconst ObjectHasOwn = Object.hasOwn\n\n// Lazy load constants to avoid circular dependencies.\nlet _REGISTRY_SCOPE_DELIMITER: string | undefined\nfunction getRegistryScopeDelimiter(): string {\n if (_REGISTRY_SCOPE_DELIMITER === undefined) {\n _REGISTRY_SCOPE_DELIMITER =\n /*@__INLINE__*/ require('../constants/socket').REGISTRY_SCOPE_DELIMITER\n }\n return _REGISTRY_SCOPE_DELIMITER as string\n}\n\nlet _SOCKET_REGISTRY_SCOPE: string | undefined\nfunction getSocketRegistryScope(): string {\n if (_SOCKET_REGISTRY_SCOPE === undefined) {\n _SOCKET_REGISTRY_SCOPE =\n /*@__INLINE__*/ require('../constants/socket').SOCKET_REGISTRY_SCOPE\n }\n return _SOCKET_REGISTRY_SCOPE as string\n}\n\nlet _escapeRegExp: ((s: string) => string) | undefined\nfunction getEscapeRegExp(): (s: string) => string {\n if (_escapeRegExp === undefined) {\n _escapeRegExp = /*@__PURE__*/ require('../regexps').escapeRegExp\n }\n return _escapeRegExp as (s: string) => string\n}\n\nfunction getEscapedScopeRegExp(): RegExp {\n const REGISTRY_SCOPE_DELIMITER = getRegistryScopeDelimiter()\n const escapeRegExp = getEscapeRegExp()\n const firstChar = REGISTRY_SCOPE_DELIMITER[0] as string\n return new RegExp(\n `^[^${escapeRegExp(firstChar)}]+${escapeRegExp(REGISTRY_SCOPE_DELIMITER)}(?!${escapeRegExp(firstChar)})`,\n )\n}\n\nlet _normalizePackageData: typeof import('normalize-package-data') | undefined\n/**\n * Get the normalize-package-data module.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction getNormalizePackageData() {\n if (_normalizePackageData === undefined) {\n _normalizePackageData =\n /*@__PURE__*/ require('../external/normalize-package-data')\n }\n return _normalizePackageData as typeof import('normalize-package-data')\n}\n\nlet _findPackageExtensions:\n | ((name: string, version: string) => unknown)\n | undefined\n/**\n * Get the findPackageExtensions function from operations module.\n * Lazy loaded to avoid circular dependency.\n */\n/*@__NO_SIDE_EFFECTS__*/\nfunction _getFindPackageExtensions() {\n if (_findPackageExtensions === undefined) {\n // Dynamically import to avoid circular dependency.\n // Use path alias for reliable resolution in both test and production environments.\n const operations: {\n findPackageExtensions: (name: string, version: string) => unknown\n } = require('#packages/operations')\n _findPackageExtensions = operations.findPackageExtensions\n }\n return _findPackageExtensions as (name: string, version: string) => unknown\n}\n\n/**\n * Normalize a package.json object with standard npm package normalization.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function normalizePackageJson(\n pkgJson: PackageJson,\n options?: NormalizeOptions,\n): PackageJson {\n const { preserve } = { __proto__: null, ...options } as NormalizeOptions\n // Add default version if not present.\n if (!ObjectHasOwn(pkgJson, 'version')) {\n pkgJson.version = '0.0.0'\n }\n const preserved = [\n ['_id', undefined],\n ['readme', undefined],\n ...(ObjectHasOwn(pkgJson, 'bugs') ? [] : [['bugs', undefined]]),\n ...(ObjectHasOwn(pkgJson, 'homepage') ? [] : [['homepage', undefined]]),\n ...(ObjectHasOwn(pkgJson, 'name') ? [] : [['name', undefined]]),\n ...(ArrayIsArray(preserve)\n ? preserve.map(k => [\n k,\n ObjectHasOwn(pkgJson, k) ? pkgJson[k] : undefined,\n ])\n : []),\n ]\n const normalizePackageData = getNormalizePackageData()\n normalizePackageData(pkgJson)\n // Apply package extensions if name and version are present.\n if (pkgJson.name && pkgJson.version) {\n const findPackageExtensions = _getFindPackageExtensions()\n const extensions = findPackageExtensions(pkgJson.name, pkgJson.version)\n if (extensions && typeof extensions === 'object') {\n merge(pkgJson, extensions)\n }\n }\n // Revert/remove properties we don't care to have normalized.\n // Properties with undefined values are omitted when saved as JSON.\n for (const { 0: key, 1: value } of preserved) {\n pkgJson[key as keyof typeof pkgJson] = value\n }\n return pkgJson\n}\n\n/**\n * Extract escaped scope from a Socket registry package name.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function resolveEscapedScope(\n sockRegPkgName: string,\n): string | undefined {\n const escapedScopeRegExp = getEscapedScopeRegExp()\n const match = escapedScopeRegExp.exec(sockRegPkgName)?.[0]\n return match || undefined\n}\n\n/**\n * Resolve original package name from Socket registry package name.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function resolveOriginalPackageName(sockRegPkgName: string): string {\n const SOCKET_REGISTRY_SCOPE = getSocketRegistryScope()\n const name = sockRegPkgName.startsWith(`${SOCKET_REGISTRY_SCOPE}/`)\n ? sockRegPkgName.slice(SOCKET_REGISTRY_SCOPE.length + 1)\n : sockRegPkgName\n const escapedScope = resolveEscapedScope(name)\n return escapedScope\n ? `${unescapeScope(escapedScope)}/${name.slice(escapedScope.length)}`\n : name\n}\n\n/**\n * Convert escaped scope to standard npm scope format.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function unescapeScope(escapedScope: string): string {\n const REGISTRY_SCOPE_DELIMITER = getRegistryScopeDelimiter()\n return `@${escapedScope.slice(0, -REGISTRY_SCOPE_DELIMITER.length)}`\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|