@calvear/env 3.0.1 โ†’ 3.1.1

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/utils/ui.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","names":[],"sources":["../../src/utils/ui.ts"],"sourcesContent":["import pc from 'picocolors';\nimport { LOG_LEVELS, logger } from './logger.js';\n\n// emoji per known integrated provider key\nconst PROVIDER_ICONS: Record<string, string> = {\n\t'app-settings': '๐Ÿ—‚๏ธ',\n\tlocal: '๐Ÿ“‚',\n\t'package-json': '๐Ÿ“ฆ',\n\tsecrets: '๐Ÿ”',\n};\n\n/** Whether output is visible at the given verbosity (lower = more verbose). */\nfunction visibleAt(level: number): boolean {\n\treturn (logger.settings.minLevel ?? LOG_LEVELS.info) <= level;\n}\n\nfunction line(text = '', level = LOG_LEVELS.info): void {\n\tif (visibleAt(level)) process.stdout.write(`${text}\\n`);\n}\n\n/**\n * Masks a value the same way the logger does, reusing its mask settings, so the\n * pretty variables view never leaks secrets.\n */\nfunction maskValue(\n\tkey: string,\n\tvalue: string,\n): { masked: boolean; value: string } {\n\tconst {\n\t\tmaskPlaceholder = '***',\n\t\tmaskValuesOfKeys = [],\n\t\tmaskValuesRegEx = [],\n\t} = logger.settings;\n\n\tif (maskValuesOfKeys.some((k) => k.toLowerCase() === key.toLowerCase()))\n\t\treturn { masked: true, value: maskPlaceholder };\n\n\tlet masked = false;\n\tlet out = value;\n\n\tfor (const regex of maskValuesRegEx) {\n\t\tconst next = out.replaceAll(\n\t\t\tnew RegExp(regex.source, 'g'),\n\t\t\tmaskPlaceholder,\n\t\t);\n\n\t\tif (next !== out) masked = true;\n\t\tout = next;\n\t}\n\n\treturn { masked, value: out };\n}\n\n/** Formats a duration in ms as \"142ms\" or \"1.4s\". */\nexport function formatDuration(ms: number): string {\n\treturn ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;\n}\n\nexport const ui = {\n\theader(version: string, env?: string, modes?: string[]): void {\n\t\tconst parts = [pc.bold('โšก env') + pc.dim(` v${version}`)];\n\n\t\tif (env) parts.push(`๐ŸŒŽ ${pc.bold(pc.green(env))}`);\n\t\tif (modes && modes.length > 0)\n\t\t\tparts.push(`๐Ÿงฉ ${pc.magenta(modes.join('+'))}`);\n\n\t\tline();\n\t\tline(parts.join(pc.dim(' ยท ')));\n\t\tline();\n\t},\n\n\tprovider(key: string, count: number): void {\n\t\tconst icon = PROVIDER_ICONS[key] ?? '๐Ÿงฉ';\n\t\tconst noun = key === 'secrets' ? 'secrets' : 'vars';\n\n\t\tline(\n\t\t\t` ${icon} ${pc.cyan(key.padEnd(16))} ${pc.bold(String(count))} ${pc.dim(noun)}`,\n\t\t);\n\t},\n\n\t/** Pretty, sorted, masked dump of the resolved environment (debug level). */\n\tvariables(env: Record<string, unknown>): void {\n\t\tif (!visibleAt(LOG_LEVELS.debug)) return;\n\n\t\tconst entries = Object.entries(env).sort(([a], [b]) =>\n\t\t\ta.localeCompare(b),\n\t\t);\n\t\tconst width = entries.reduce(\n\t\t\t(max, [key]) => Math.max(max, key.length),\n\t\t\t0,\n\t\t);\n\t\tconst heading = pc.dim(`environment (${entries.length} variables)`);\n\n\t\tline(` ${heading}`, LOG_LEVELS.debug);\n\n\t\tfor (const [key, value] of entries) {\n\t\t\tconst { masked, value: shown } = maskValue(key, String(value));\n\t\t\tconst colored = masked ? pc.yellow(shown) : pc.green(shown);\n\n\t\t\tline(\n\t\t\t\t` ${pc.cyan(key.padEnd(width))} ${pc.dim('=')} ${colored}`,\n\t\t\t\tLOG_LEVELS.debug,\n\t\t\t);\n\t\t}\n\n\t\tline('', LOG_LEVELS.debug);\n\t},\n\n\tsummary(total: number, ms: number): void {\n\t\tconst duration = pc.dim(`in ${formatDuration(ms)}`);\n\t\tline();\n\t\tline(\n\t\t\t` ${pc.green('โœ“')} ${pc.bold(String(total))} variables loaded ${duration}`,\n\t\t);\n\t},\n\n\trunning(command: string): void {\n\t\tline();\n\t\tline(` ${pc.yellow('โ–ถ')} ${pc.bold(command)}`);\n\t\tline();\n\t},\n\n\tfinished(ms: number): void {\n\t\tconst duration = pc.dim(`finished in ${formatDuration(ms)}`);\n\t\tline(` ${pc.green('โœ“')} ${duration}`);\n\t},\n\n\tfailed(code: number): void {\n\t\tconst msg = pc.red(`โœ— exited with code ${code}`);\n\t\tline(` ${msg}`);\n\t},\n\n\taction(emoji: string, message: string): void {\n\t\tline(` ${emoji} ${message}`);\n\t},\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","names":[],"sources":["../../src/utils/ui.ts"],"sourcesContent":["import pc from 'picocolors';\r\nimport { LOG_LEVELS, logger } from './logger.js';\r\n\r\n// emoji per known integrated provider key\r\nconst PROVIDER_ICONS: Record<string, string> = {\r\n\t'app-settings': '๐Ÿ—‚๏ธ',\r\n\tlocal: '๐Ÿ“‚',\r\n\t'package-json': '๐Ÿ“ฆ',\r\n\tsecrets: '๐Ÿ”',\r\n};\r\n\r\n// escape introducer (ANSI), kept as a constant so the source stays ASCII-clean\r\nconst ESC = String.fromCodePoint(27);\r\n\r\n/** Whether output is visible at the given verbosity (lower = more verbose). */\r\nfunction visibleAt(level: number): boolean {\r\n\treturn (logger.settings.minLevel ?? LOG_LEVELS.info) <= level;\r\n}\r\n\r\nfunction line(text = '', level = LOG_LEVELS.info): void {\r\n\tif (visibleAt(level)) process.stdout.write(`${text}\\n`);\r\n}\r\n\r\ninterface KeyMaskers {\r\n\t// lowercased exact key names\r\n\texact: Set<string>;\r\n\t// regexes matched against the key name (no global flag, used with .test)\r\n\tpatterns: RegExp[];\r\n}\r\n\r\n/**\r\n * Splits `maskValuesOfKeys` entries into exact key names and key-name regexes.\r\n * An entry written as `/source/flags` becomes a regex matched against the key;\r\n * anything else is an exact (case-insensitive) key name. The global flag is\r\n * intentionally NOT forced here: a global regex is stateful under `.test()`\r\n * (its `lastIndex` advances), unlike the value masking which needs `g` for\r\n * `replace`.\r\n */\r\nfunction buildKeyMaskers(keys: readonly string[]): KeyMaskers {\r\n\tconst exact = new Set<string>();\r\n\tconst patterns: RegExp[] = [];\r\n\r\n\tfor (const entry of keys) {\r\n\t\tconst delimited = /^\\/(.*)\\/([a-z]*)$/s.exec(entry);\r\n\r\n\t\tif (delimited) patterns.push(new RegExp(delimited[1], delimited[2]));\r\n\t\telse exact.add(entry.toLowerCase());\r\n\t}\r\n\r\n\treturn { exact, patterns };\r\n}\r\n\r\n/**\r\n * Masks a value the same way the logger does, reusing its mask settings, so the\r\n * pretty variables view never leaks secrets.\r\n */\r\nfunction maskValue(\r\n\tkey: string,\r\n\tvalue: string,\r\n\tkeyMaskers: KeyMaskers,\r\n): { masked: boolean; value: string } {\r\n\tconst { maskPlaceholder = '***', maskValuesRegEx = [] } = logger.settings;\r\n\r\n\tif (\r\n\t\tkeyMaskers.exact.has(key.toLowerCase()) ||\r\n\t\tkeyMaskers.patterns.some((rx) => rx.test(key))\r\n\t)\r\n\t\treturn { masked: true, value: maskPlaceholder };\r\n\r\n\tlet masked = false;\r\n\tlet out = value;\r\n\r\n\tfor (const regex of maskValuesRegEx) {\r\n\t\t// preserve the regex's own flags (e.g. `i`) and force global so every\r\n\t\t// occurrence is masked, mirroring how the logger compiles its patterns\r\n\t\tconst flags = regex.flags.includes('g')\r\n\t\t\t? regex.flags\r\n\t\t\t: `${regex.flags}g`;\r\n\t\tconst next = out.replace(\r\n\t\t\tnew RegExp(regex.source, flags),\r\n\t\t\tmaskPlaceholder,\r\n\t\t);\r\n\r\n\t\tif (next !== out) masked = true;\r\n\t\tout = next;\r\n\t}\r\n\r\n\treturn { masked, value: out };\r\n}\r\n\r\n/** 256-color orange, gated by picocolors' own color-support detection. */\r\nfunction orange(text: string): string {\r\n\treturn pc.isColorSupported ? `${ESC}[38;5;208m${text}${ESC}[39m` : text;\r\n}\r\n\r\n/** Colors a scalar value by its runtime type so types are visually distinct. */\r\nfunction colorScalar(value: unknown, text: string): string {\r\n\tswitch (typeof value) {\r\n\t\tcase 'bigint':\r\n\t\tcase 'number':\r\n\t\t\treturn orange(text);\r\n\t\tcase 'boolean':\r\n\t\t\treturn value ? pc.green(text) : pc.red(text);\r\n\t\tcase 'string':\r\n\t\t\treturn pc.gray(text);\r\n\t\tdefault:\r\n\t\t\treturn pc.dim(text);\r\n\t}\r\n}\r\n\r\n/** Formats a duration in ms as \"142ms\" or \"1.4s\". */\r\nexport function formatDuration(ms: number): string {\r\n\treturn ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`;\r\n}\r\n\r\nexport const ui = {\r\n\theader(version: string, env?: string, modes?: string[]): void {\r\n\t\tconst parts = [pc.bold('โšก env') + pc.dim(` v${version}`)];\r\n\r\n\t\tif (env) parts.push(`๐ŸŒŽ ${pc.bold(pc.green(env))}`);\r\n\t\tif (modes && modes.length > 0)\r\n\t\t\tparts.push(`๐Ÿงฉ ${pc.magenta(modes.join('+'))}`);\r\n\r\n\t\tline();\r\n\t\tline(parts.join(pc.dim(' ยท ')));\r\n\t\tline();\r\n\t},\r\n\r\n\tprovider(key: string, count: number): void {\r\n\t\tconst icon = PROVIDER_ICONS[key] ?? '๐Ÿงฉ';\r\n\t\tconst noun = key === 'secrets' ? 'secrets' : 'vars';\r\n\r\n\t\tline(\r\n\t\t\t` ${icon} ${pc.cyan(key.padEnd(16))} ${pc.bold(String(count))} ${pc.dim(noun)}`,\r\n\t\t);\r\n\t},\r\n\r\n\t/** Pretty, sorted, masked dump of the resolved environment (debug level). */\r\n\tvariables(env: Record<string, unknown>): void {\r\n\t\tif (!visibleAt(LOG_LEVELS.debug)) return;\r\n\r\n\t\tconst entries = Object.entries(env).sort(([a], [b]) =>\r\n\t\t\ta.localeCompare(b),\r\n\t\t);\r\n\t\tconst width = entries.reduce(\r\n\t\t\t(max, [key]) => Math.max(max, key.length),\r\n\t\t\t0,\r\n\t\t);\r\n\t\tconst heading = pc.dim(`environment (${entries.length} variables)`);\r\n\t\t// compile key maskers once, not per variable\r\n\t\tconst keyMaskers = buildKeyMaskers(\r\n\t\t\tlogger.settings.maskValuesOfKeys ?? [],\r\n\t\t);\r\n\r\n\t\tline(` ${heading}`, LOG_LEVELS.debug);\r\n\r\n\t\tfor (const [key, value] of entries) {\r\n\t\t\tconst { masked, value: shown } = maskValue(\r\n\t\t\t\tkey,\r\n\t\t\t\tString(value),\r\n\t\t\t\tkeyMaskers,\r\n\t\t\t);\r\n\t\t\tconst colored = masked\r\n\t\t\t\t? pc.yellow(shown)\r\n\t\t\t\t: colorScalar(value, shown);\r\n\r\n\t\t\tline(\r\n\t\t\t\t` ${pc.cyan(key.padEnd(width))} ${pc.dim('=')} ${colored}`,\r\n\t\t\t\tLOG_LEVELS.debug,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tline('', LOG_LEVELS.debug);\r\n\t},\r\n\r\n\tsummary(total: number, ms: number): void {\r\n\t\tconst duration = pc.dim(`in ${formatDuration(ms)}`);\r\n\t\tline();\r\n\t\tline(\r\n\t\t\t` ${pc.green('โœ“')} ${pc.bold(String(total))} variables loaded ${duration}`,\r\n\t\t);\r\n\t},\r\n\r\n\trunning(command: string): void {\r\n\t\tline();\r\n\t\tline(` ${pc.yellow('โ–ถ')} ${pc.bold(command)}`);\r\n\t\tline();\r\n\t},\r\n\r\n\tfinished(ms: number): void {\r\n\t\tconst duration = pc.dim(`finished in ${formatDuration(ms)}`);\r\n\t\tline(` ${pc.green('โœ“')} ${duration}`);\r\n\t},\r\n\r\n\tfailed(code: number): void {\r\n\t\tconst msg = pc.red(`โœ— exited with code ${code}`);\r\n\t\tline(` ${msg}`);\r\n\t},\r\n\r\n\taction(emoji: string, message: string): void {\r\n\t\tline(` ${emoji} ${message}`);\r\n\t},\r\n};\r\n"],"mappings":"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"}