@nmakarov/cli-toolkit 0.7.2 → 0.9.0

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/README.md CHANGED
@@ -220,9 +220,9 @@ console.log(`Selected: ${choice}`);
220
220
  ### Logger - Structured Logging
221
221
 
222
222
  ```typescript
223
- import { CliToolkitLogger } from '@nmakarov/cli-toolkit/logger';
223
+ import { Logger } from '@nmakarov/cli-toolkit/logger';
224
224
 
225
- const logger = new CliToolkitLogger({
225
+ const logger = new Logger({
226
226
  prefix: 'APP',
227
227
  timestamp: true,
228
228
  progress: { withTimes: true }
@@ -378,12 +378,12 @@ The toolkit is written in TypeScript with full type definitions:
378
378
  import { Args } from '@nmakarov/cli-toolkit/args';
379
379
  import { Params } from '@nmakarov/cli-toolkit/params';
380
380
  import { showListScreen } from '@nmakarov/cli-toolkit/screen';
381
- import { CliToolkitLogger } from '@nmakarov/cli-toolkit/logger';
381
+ import { Logger } from '@nmakarov/cli-toolkit/logger';
382
382
 
383
383
  // Full IntelliSense and type checking
384
384
  const args = new Args({ aliases: { v: 'verbose' } });
385
385
  const params = new Params({ args });
386
- const logger = new CliToolkitLogger({ prefix: 'APP' });
386
+ const logger = new Logger({ prefix: 'APP' });
387
387
  ```
388
388
 
389
389
  ## CommonJS Support
@@ -394,12 +394,12 @@ Most modules support both ESM and CommonJS:
394
394
  // ESM (TypeScript/Modern Node)
395
395
  import { Args } from '@nmakarov/cli-toolkit/args';
396
396
  import { Params } from '@nmakarov/cli-toolkit/params';
397
- import { CliToolkitLogger } from '@nmakarov/cli-toolkit/logger';
397
+ import { Logger } from '@nmakarov/cli-toolkit/logger';
398
398
 
399
399
  // CommonJS (Traditional Node.js)
400
400
  const { Args } = require('@nmakarov/cli-toolkit/args');
401
401
  const { Params } = require('@nmakarov/cli-toolkit/params');
402
- const { CliToolkitLogger } = require('@nmakarov/cli-toolkit/logger');
402
+ const { Logger } = require('@nmakarov/cli-toolkit/logger');
403
403
  ```
404
404
 
405
405
  ### Screen Module - ESM-Only Dependencies
package/dist/args.cjs CHANGED
@@ -30,7 +30,7 @@ module.exports = __toCommonJS(args_exports);
30
30
  var import_fs = require("fs");
31
31
  var import_path = require("path");
32
32
  var import_dotenv = require("dotenv");
33
- var Args = class {
33
+ var Args = class _Args {
34
34
  args = {};
35
35
  flags = {};
36
36
  options = {};
@@ -45,10 +45,13 @@ var Args = class {
45
45
  configsLoaded = [];
46
46
  env = "local";
47
47
  constructor(config2 = {}) {
48
- this.aliases = config2.aliases || {};
49
- this.overrides = config2.overrides || {};
50
- this.defaults = config2.defaults || {};
51
- this.prefixes = config2.prefixes || ["not", "no"];
48
+ this.aliases = {};
49
+ this.overrides = {};
50
+ this.defaults = {};
51
+ this.prefixes = ["not", "no"];
52
+ if (Object.keys(config2).length > 0) {
53
+ this.configure(config2);
54
+ }
52
55
  const args = config2.args || process.argv.slice(2);
53
56
  this.parseArgs(args);
54
57
  this.env = this.get("env")?.toLowerCase() || "local";
@@ -56,6 +59,33 @@ var Args = class {
56
59
  this.loadConfigFiles();
57
60
  this.checkConflicts();
58
61
  }
62
+ /**
63
+ * Configure Args options
64
+ * Only parameters present in config are updated
65
+ * Note: Args is special - it's initialized first, so it can't take context
66
+ */
67
+ configure(config2) {
68
+ if (config2.aliases !== void 0) {
69
+ this.aliases = config2.aliases;
70
+ }
71
+ if (config2.overrides !== void 0) {
72
+ this.overrides = config2.overrides;
73
+ }
74
+ if (config2.defaults !== void 0) {
75
+ this.defaults = config2.defaults;
76
+ }
77
+ if (config2.prefixes !== void 0) {
78
+ this.prefixes = config2.prefixes;
79
+ }
80
+ }
81
+ /**
82
+ * Initialize Args instance
83
+ * Note: Args is special - it's initialized first, so it can't take context
84
+ * This static method is for consistency with other components
85
+ */
86
+ static init(config2 = {}) {
87
+ return new _Args(config2);
88
+ }
59
89
  /**
60
90
  * Parse command line arguments
61
91
  */
@@ -194,11 +224,11 @@ var Args = class {
194
224
  */
195
225
  get(key) {
196
226
  const resolvedKey = this.aliases[key] || key;
197
- this.usedKeys.add(resolvedKey);
227
+ const lcKey = resolvedKey.toLowerCase();
228
+ this.usedKeys.add(lcKey);
198
229
  if (this.overrides[resolvedKey] !== void 0) {
199
230
  return this.overrides[resolvedKey];
200
231
  }
201
- const lcKey = resolvedKey.toLowerCase();
202
232
  const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : ""}`;
203
233
  if (this.env && this.args[lcKeyWithEnv] !== void 0) {
204
234
  return this.args[lcKeyWithEnv];
package/dist/args.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/args.ts","../src/args/index.ts"],"sourcesContent":["// Re-export everything from the args module directory\nexport * from \"./args/index.js\";\n","// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set up configuration\n this.aliases = config.aliases || {};\n this.overrides = config.overrides || {};\n this.defaults = config.defaults || {};\n this.prefixes = config.prefixes || [\"not\", \"no\"];\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n this.usedKeys.add(resolvedKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n const lcKey = resolvedKey.toLowerCase();\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../src/args.ts","../src/args/index.ts"],"sourcesContent":["// Re-export everything from the args module directory\nexport * from \"./args/index.js\";\n","// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set defaults first\n this.aliases = {};\n this.overrides = {};\n this.defaults = {};\n this.prefixes = [\"not\", \"no\"];\n\n // Apply configuration\n if (Object.keys(config).length > 0) {\n this.configure(config);\n }\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Configure Args options\n * Only parameters present in config are updated\n * Note: Args is special - it's initialized first, so it can't take context\n */\n configure(config: Partial<ArgsConfig>): void {\n if (config.aliases !== undefined) {\n this.aliases = config.aliases;\n }\n if (config.overrides !== undefined) {\n this.overrides = config.overrides;\n }\n if (config.defaults !== undefined) {\n this.defaults = config.defaults;\n }\n if (config.prefixes !== undefined) {\n this.prefixes = config.prefixes;\n }\n // Note: args array can't be reconfigured after construction\n }\n\n /**\n * Initialize Args instance\n * Note: Args is special - it's initialized first, so it can't take context\n * This static method is for consistency with other components\n */\n static init(config: ArgsConfig = {}): Args {\n return new Args(config);\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n // Mark the lowercase version as used since args are stored in lowercase\n // This ensures getUnused() correctly identifies used keys\n const lcKey = resolvedKey.toLowerCase();\n this.usedKeys.add(lcKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n"],"mappings":"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","names":["config"]}
package/dist/args.js CHANGED
@@ -9,7 +9,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
9
9
  import { readFileSync, existsSync } from "fs";
10
10
  import { resolve, dirname, basename, extname, join, isAbsolute } from "path";
11
11
  import { config } from "dotenv";
12
- var Args = class {
12
+ var Args = class _Args {
13
13
  args = {};
14
14
  flags = {};
15
15
  options = {};
@@ -24,10 +24,13 @@ var Args = class {
24
24
  configsLoaded = [];
25
25
  env = "local";
26
26
  constructor(config2 = {}) {
27
- this.aliases = config2.aliases || {};
28
- this.overrides = config2.overrides || {};
29
- this.defaults = config2.defaults || {};
30
- this.prefixes = config2.prefixes || ["not", "no"];
27
+ this.aliases = {};
28
+ this.overrides = {};
29
+ this.defaults = {};
30
+ this.prefixes = ["not", "no"];
31
+ if (Object.keys(config2).length > 0) {
32
+ this.configure(config2);
33
+ }
31
34
  const args = config2.args || process.argv.slice(2);
32
35
  this.parseArgs(args);
33
36
  this.env = this.get("env")?.toLowerCase() || "local";
@@ -35,6 +38,33 @@ var Args = class {
35
38
  this.loadConfigFiles();
36
39
  this.checkConflicts();
37
40
  }
41
+ /**
42
+ * Configure Args options
43
+ * Only parameters present in config are updated
44
+ * Note: Args is special - it's initialized first, so it can't take context
45
+ */
46
+ configure(config2) {
47
+ if (config2.aliases !== void 0) {
48
+ this.aliases = config2.aliases;
49
+ }
50
+ if (config2.overrides !== void 0) {
51
+ this.overrides = config2.overrides;
52
+ }
53
+ if (config2.defaults !== void 0) {
54
+ this.defaults = config2.defaults;
55
+ }
56
+ if (config2.prefixes !== void 0) {
57
+ this.prefixes = config2.prefixes;
58
+ }
59
+ }
60
+ /**
61
+ * Initialize Args instance
62
+ * Note: Args is special - it's initialized first, so it can't take context
63
+ * This static method is for consistency with other components
64
+ */
65
+ static init(config2 = {}) {
66
+ return new _Args(config2);
67
+ }
38
68
  /**
39
69
  * Parse command line arguments
40
70
  */
@@ -173,11 +203,11 @@ var Args = class {
173
203
  */
174
204
  get(key) {
175
205
  const resolvedKey = this.aliases[key] || key;
176
- this.usedKeys.add(resolvedKey);
206
+ const lcKey = resolvedKey.toLowerCase();
207
+ this.usedKeys.add(lcKey);
177
208
  if (this.overrides[resolvedKey] !== void 0) {
178
209
  return this.overrides[resolvedKey];
179
210
  }
180
- const lcKey = resolvedKey.toLowerCase();
181
211
  const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : ""}`;
182
212
  if (this.env && this.args[lcKeyWithEnv] !== void 0) {
183
213
  return this.args[lcKeyWithEnv];
package/dist/args.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/args/index.ts"],"sourcesContent":["// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set up configuration\n this.aliases = config.aliases || {};\n this.overrides = config.overrides || {};\n this.defaults = config.defaults || {};\n this.prefixes = config.prefixes || [\"not\", \"no\"];\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n this.usedKeys.add(resolvedKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n const lcKey = resolvedKey.toLowerCase();\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../src/args/index.ts"],"sourcesContent":["// Arguments discovery and parsing module\n// This module provides utilities for parsing CLI arguments and detecting flags\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname, basename, extname, join, isAbsolute } from \"path\";\nimport { config } from \"dotenv\";\n\nexport interface ArgsConfig {\n args?: string[]; // Default: process.argv.slice(2)\n aliases?: Record<string, string>; // Short → long mapping\n overrides?: Record<string, any>; // Highest precedence\n defaults?: Record<string, any>; // Lowest precedence\n prefixes?: string[]; // Negative flag prefixes (default: [\"not\", \"no\"])\n}\n\nexport interface ParsedArgs {\n command: string;\n flags: Record<string, boolean>;\n options: Record<string, string>;\n usedKeys: string[];\n}\n\n/**\n * Parse command line arguments with support for aliases, overrides, and defaults\n *\n * Precedence order (highest to lowest):\n * 1. Overrides (constructor config)\n * 2. CLI args (command line)\n * 3. Config files (loaded from files)\n * 4. Environment variables (process.env)\n * 5. Defaults (constructor config)\n */\nexport class Args {\n private args: Record<string, any> = {};\n private flags: Record<string, boolean> = {};\n private options: Record<string, string> = {};\n private commands: string[] = [];\n private usedKeys: Set<string> = new Set();\n private aliases: Record<string, string> = {};\n private overrides: Record<string, any> = {};\n private defaults: Record<string, any> = {};\n private prefixes: string[] = [];\n private nots: string[] = [];\n private configValues: Record<string, any> = {};\n private configsLoaded: string[] = [];\n private env: string = \"local\";\n\n constructor(config: ArgsConfig = {}) {\n // Set defaults first\n this.aliases = {};\n this.overrides = {};\n this.defaults = {};\n this.prefixes = [\"not\", \"no\"];\n\n // Apply configuration\n if (Object.keys(config).length > 0) {\n this.configure(config);\n }\n\n // Parse arguments first to get environment\n const args = config.args || process.argv.slice(2);\n this.parseArgs(args);\n\n // Set environment from parsed args\n this.env = this.get(\"env\")?.toLowerCase() || \"local\";\n\n // Load .env file\n this.loadDotEnv();\n\n // Load configuration files\n this.loadConfigFiles();\n\n // Check for conflicts (short + long form of same option)\n this.checkConflicts();\n }\n\n /**\n * Configure Args options\n * Only parameters present in config are updated\n * Note: Args is special - it's initialized first, so it can't take context\n */\n configure(config: Partial<ArgsConfig>): void {\n if (config.aliases !== undefined) {\n this.aliases = config.aliases;\n }\n if (config.overrides !== undefined) {\n this.overrides = config.overrides;\n }\n if (config.defaults !== undefined) {\n this.defaults = config.defaults;\n }\n if (config.prefixes !== undefined) {\n this.prefixes = config.prefixes;\n }\n // Note: args array can't be reconfigured after construction\n }\n\n /**\n * Initialize Args instance\n * Note: Args is special - it's initialized first, so it can't take context\n * This static method is for consistency with other components\n */\n static init(config: ArgsConfig = {}): Args {\n return new Args(config);\n }\n\n /**\n * Parse command line arguments\n */\n private parseArgs(args: string[]): void {\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith(\"--\")) {\n // Long option: --key=value or --key\n const [key, value] = this.parseLongOption(arg);\n this.setValue(key, value);\n i++;\n } else if (arg.startsWith(\"-\")) {\n // Short option: -k=value, -k, or bundled -vsd\n const result = this.parseShortOption(arg, args, i);\n if (result.consumed > 0) {\n i += result.consumed;\n } else {\n i++;\n }\n } else {\n // Command (no prefix)\n this.commands.push(arg);\n i++;\n }\n }\n }\n\n /**\n * Parse long option (--key=value or --key)\n */\n private parseLongOption(arg: string): [string, string | boolean] {\n const key = arg.slice(2); // Remove '--'\n\n // Check for negative flags (--no-debug, --not-verbose)\n const prefix = this.prefixes.find((p) => key.startsWith(p));\n if (prefix) {\n let strippedKey = key.slice(prefix.length);\n // Remove leading dash if present\n if (strippedKey.startsWith(\"-\")) {\n strippedKey = strippedKey.slice(1);\n }\n this.nots.push(key);\n return [strippedKey, false];\n }\n\n if (key.includes(\"=\")) {\n // --key=value - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n return [optionKey, this.parseValue(value)];\n } else {\n // --key (boolean flag)\n return [key, true];\n }\n }\n\n /**\n * Parse short option (-k=value, -k, or bundled -vsd)\n */\n private parseShortOption(arg: string, args: string[], index: number): { consumed: number } {\n const key = arg.slice(1); // Remove '-'\n\n // Check if it's a single short flag with value (like -vo file.txt)\n if (key.length === 1 && index + 1 < args.length && !args[index + 1].startsWith(\"-\")) {\n // Single short flag with separate value\n const value = args[index + 1];\n this.setValue(key, this.parseValue(value));\n return { consumed: 2 }; // Consumed this flag and the next argument\n }\n\n // Check if it's a bundled short flags (like -vsd)\n if (key.length > 1 && !key.includes(\"=\")) {\n // Handle bundled flags: -vsd = -v -s -d\n // Process each character, valid ones become flags, invalid ones become unused\n for (let i = 0; i < key.length; i++) {\n const shortKey = key[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n // Invalid short flag - add to unused keys\n this.args[shortKey] = true;\n }\n }\n return { consumed: 1 };\n }\n\n if (key.includes(\"=\")) {\n // -k=value or -vsdk=4 - need to handle quoted values properly\n const eqIndex = key.indexOf(\"=\");\n const optionKey = key.slice(0, eqIndex);\n const value = key.slice(eqIndex + 1);\n\n // Check if this is a bundled flag with value on the last one (like -vsdk=4)\n if (optionKey.length > 1) {\n // Handle bundled flags with value on the last one: -vsdk=4 = -v -s -d -k=4\n for (let i = 0; i < optionKey.length - 1; i++) {\n const shortKey = optionKey[i];\n if (shortKey in this.aliases) {\n this.setValue(shortKey, true);\n } else {\n this.args[shortKey] = true;\n }\n }\n // Handle the last flag with value\n const lastKey = optionKey[optionKey.length - 1];\n if (lastKey in this.aliases) {\n this.setValue(lastKey, this.parseValue(value));\n } else {\n this.args[lastKey] = this.parseValue(value);\n }\n } else {\n // Single flag with value: -k=value\n this.setValue(optionKey, this.parseValue(value));\n }\n return { consumed: 1 };\n } else {\n // -k (boolean flag)\n this.setValue(key, true);\n return { consumed: 1 };\n }\n }\n\n /**\n * Parse value (handle quotes)\n */\n private parseValue(value: string): string {\n // Remove surrounding quotes if present\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n /**\n * Set a value with proper categorization\n */\n private setValue(key: string, value: string | boolean): void {\n // Resolve alias if it's a short form\n const resolvedKey = this.aliases[key] || key;\n\n if (typeof value === \"boolean\") {\n this.flags[resolvedKey] = value;\n } else {\n this.options[resolvedKey] = value;\n }\n\n // Always set the value in lowercase (for case-insensitive lookup, like legacy)\n this.args[resolvedKey.toLowerCase()] = value;\n }\n\n /**\n * Check for conflicts (short + long form of same option)\n */\n private checkConflicts(): void {\n const conflicts: string[] = [];\n\n for (const [shortKey, longKey] of Object.entries(this.aliases)) {\n const hasShort = this.args[shortKey] !== undefined;\n const hasLong = this.args[longKey] !== undefined;\n\n if (hasShort && hasLong) {\n conflicts.push(`Both -${shortKey} and --${longKey} specified`);\n }\n }\n\n if (conflicts.length > 0) {\n throw new Error(`Argument conflicts: ${conflicts.join(\", \")}`);\n }\n }\n\n /**\n * Get a value with precedence order\n */\n get(key: string): any {\n const resolvedKey = this.aliases[key] || key;\n // Mark the lowercase version as used since args are stored in lowercase\n // This ensures getUnused() correctly identifies used keys\n const lcKey = resolvedKey.toLowerCase();\n this.usedKeys.add(lcKey);\n\n // Precedence order: overrides > CLI args > config files > env vars > defaults\n if (this.overrides[resolvedKey] !== undefined) {\n return this.overrides[resolvedKey];\n }\n\n // Case-insensitive lookup for CLI args (like legacy)\n\n // Try environment-specific CLI args first (e.g., --silent_local, --debug_production)\n const lcKeyWithEnv = `${lcKey}${this.env ? `_${this.env.toLowerCase()}` : \"\"}`;\n if (this.env && this.args[lcKeyWithEnv] !== undefined) {\n return this.args[lcKeyWithEnv];\n } else if (this.args[lcKey] !== undefined) {\n return this.args[lcKey];\n }\n\n // Config file values (case-sensitive)\n if (this.configValues[resolvedKey] !== undefined) {\n return this.configValues[resolvedKey];\n }\n\n // Environment variable (convert key to ENV_VAR format)\n const envKey = this.toEnvKey(resolvedKey);\n const envKeyWithEnv = `${envKey}${this.env ? `_${this.env.toUpperCase()}` : \"\"}`;\n\n // Try environment-specific env vars first (e.g., SILENT_LOCAL, DEBUG_PRODUCTION)\n const envSpecificKey = Object.keys(process.env).find(\n (k) => this.env && k.toUpperCase() === envKeyWithEnv\n );\n const envKeyFound = Object.keys(process.env).find((k) => k.toUpperCase() === envKey);\n\n if (envSpecificKey) {\n return process.env[envSpecificKey];\n } else if (envKeyFound) {\n return process.env[envKeyFound];\n }\n\n // Default value\n if (this.defaults[resolvedKey] !== undefined) {\n return this.defaults[resolvedKey];\n }\n\n // NODE_ENV fallback for 'env' key (like legacy)\n if (resolvedKey === \"env\" && process.env.NODE_ENV !== undefined) {\n return process.env.NODE_ENV;\n }\n\n return undefined;\n }\n\n /**\n * Set a value (for testing/internal use)\n */\n set(key: string, value: any): void {\n this.args[key] = value;\n }\n\n /**\n * Check if a command exists (case-insensitive)\n */\n hasCommand(cmd: string): boolean {\n return this.commands.some((command) => command.toLowerCase() === cmd.toLowerCase());\n }\n\n /**\n * Get all commands\n */\n getCommands(): string[] {\n return [...this.commands];\n }\n\n /**\n * Get used keys (as array)\n */\n getUsed(): string[] {\n return Array.from(this.usedKeys);\n }\n\n /**\n * Get unused keys (as array)\n */\n getUnused(): string[] {\n const unused: string[] = [];\n\n for (const key of Object.keys(this.args)) {\n if (!this.usedKeys.has(key) && !this.nots.includes(key)) {\n unused.push(key);\n }\n }\n\n return unused;\n }\n\n /**\n * Convert key to environment variable format\n */\n private toEnvKey(key: string): string {\n return key\n .replace(/[A-Z0-9]/g, (match, offset) =>\n offset === 0 ? match : \"_\" + match.toLowerCase()\n )\n .toUpperCase();\n }\n\n /**\n * Load .env file\n */\n private loadDotEnv(): void {\n const dotEnvPath = this.get(\"dotEnvPath\") || process.cwd();\n const dotEnvFile = this.get(\"dotEnvFile\") || \".env\";\n\n // If custom dotEnvFile is specified, use it as-is\n if (this.get(\"dotEnvFile\")) {\n const customPath = resolve(dotEnvPath, dotEnvFile);\n if (existsSync(customPath)) {\n config({ path: customPath, quiet: true });\n }\n return;\n }\n\n // Try environment-specific .env file first (e.g., .env.local, .env.production)\n let dotEnvPathFile: string | null = null;\n\n const envSpecificFile = `.env.${this.env}`;\n const envSpecificPath = resolve(dotEnvPath, envSpecificFile);\n if (existsSync(envSpecificPath)) {\n dotEnvPathFile = envSpecificPath;\n }\n\n // If no environment-specific file found in current directory, try examples folder\n if (!dotEnvPathFile && !this.get(\"dotEnvPath\")) {\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvSpecificPath = resolve(examplesPath, envSpecificFile);\n if (existsSync(examplesEnvSpecificPath)) {\n dotEnvPathFile = examplesEnvSpecificPath;\n }\n }\n\n // If no environment-specific file found, try default .env\n if (!dotEnvPathFile) {\n dotEnvPathFile = resolve(dotEnvPath, dotEnvFile);\n\n // If .env file doesn't exist in current directory, try examples folder (for our examples)\n if (!existsSync(dotEnvPathFile)) {\n if (!this.get(\"dotEnvPath\")) {\n // Try examples folder first (for our examples)\n const examplesPath = resolve(dotEnvPath, \"examples\");\n const examplesEnvFile = resolve(examplesPath, dotEnvFile);\n if (existsSync(examplesEnvFile)) {\n dotEnvPathFile = examplesEnvFile;\n } else {\n // Try parent directory (like legacy)\n dotEnvPathFile = resolve(dotEnvPath, \"..\", dotEnvFile);\n }\n }\n }\n }\n\n // Load .env file if it exists\n if (dotEnvPathFile && existsSync(dotEnvPathFile)) {\n config({ path: dotEnvPathFile, quiet: true });\n }\n }\n\n /**\n * Load configuration files\n */\n private loadConfigFiles(): void {\n this.configsLoaded = [];\n this.configValues = {};\n\n const _defaultConfigExtension = this.get(\"defaultConfigExtension\") || \"js\";\n const optConfigFiles = this.get(\"config\") || this.get(\"configs\") || \"\";\n const configFiles = optConfigFiles ? optConfigFiles.split(/,\\s*/) : [];\n const optConfigFilePath = this.get(\"configPath\");\n\n if (configFiles.length > 0) {\n for (const cfgFile of configFiles) {\n let notLoaded = false;\n let notLoadedEnvSpecific = false;\n\n const cfgFileWithPath = this.resolveFileWithPath(optConfigFilePath, cfgFile);\n try {\n const cfgContents = this.requireConfigFile(cfgFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgFileWithPath);\n } catch {\n notLoaded = true;\n }\n\n const cfgEnvFileWithPath = this.resolveFileWithPath(\n optConfigFilePath,\n cfgFile,\n this.env\n );\n if (cfgEnvFileWithPath !== cfgFileWithPath) {\n try {\n const cfgContents = this.requireConfigFile(cfgEnvFileWithPath);\n this.configValues = { ...this.configValues, ...cfgContents };\n this.configsLoaded.push(cfgEnvFileWithPath);\n } catch {\n notLoadedEnvSpecific = true;\n }\n } else {\n notLoadedEnvSpecific = true;\n }\n\n if (notLoaded && notLoadedEnvSpecific) {\n throw new Error(`can't load config file \"${cfgFileWithPath}\"`);\n }\n }\n }\n }\n\n /**\n * Resolve file path with environment-specific naming\n */\n private resolveFileWithPath(\n optConfigFilePath: string | undefined,\n cfgFile: string,\n env?: string\n ): string {\n let cfgFileWithPath = optConfigFilePath\n ? isAbsolute(optConfigFilePath)\n ? resolve(optConfigFilePath, cfgFile)\n : resolve(process.cwd(), optConfigFilePath, cfgFile)\n : isAbsolute(cfgFile)\n ? cfgFile\n : resolve(process.cwd(), cfgFile);\n\n const { basePathWithName, extension } = this.splitPath(cfgFileWithPath);\n if (env) {\n cfgFileWithPath = `${basePathWithName}.${env}.${extension || \"js\"}`;\n } else {\n cfgFileWithPath = `${basePathWithName}.${extension || \"js\"}`;\n }\n return cfgFileWithPath;\n }\n\n /**\n * Split file path into base path and extension\n */\n private splitPath(filePath: string): { basePathWithName: string; extension: string } {\n const basePathWithName = join(dirname(filePath), basename(filePath, extname(filePath)));\n const extension = extname(filePath).slice(1);\n return { basePathWithName, extension };\n }\n\n /**\n * Require a configuration file (supports .js and .json)\n */\n private requireConfigFile(filePath: string): any {\n if (!existsSync(filePath)) {\n throw new Error(`Config file not found: ${filePath}`);\n }\n\n const ext = extname(filePath).toLowerCase();\n if (ext === \".json\") {\n const content = readFileSync(filePath, \"utf8\");\n return JSON.parse(content);\n } else if (ext === \".js\") {\n // For .js files, use require() which is safer than eval\n try {\n // Clear require cache to ensure fresh load\n delete require.cache[require.resolve(filePath)];\n return require(filePath);\n } catch (error) {\n throw new Error(`Failed to load JS config file: ${error instanceof Error ? error.message : String(error)}`);\n }\n } else {\n throw new Error(`Unsupported file extension: ${ext}`);\n }\n }\n\n /**\n * Get all parsed data\n */\n getParsed(): ParsedArgs {\n return {\n command: this.commands[0] || \"\",\n flags: { ...this.flags },\n options: { ...this.options },\n usedKeys: Array.from(this.usedKeys)\n };\n }\n\n /**\n * Set prefixes dynamically and re-parse arguments (like legacy)\n */\n setPrefixes(prefixes: string | string[]): void {\n const arr = Array.isArray(prefixes) ? prefixes : prefixes.split(/,\\s*/);\n const sortedArr = arr.sort((a, b) =>\n a.length < b.length ? 1 : a.length > b.length ? -1 : 0\n );\n this.prefixes = sortedArr.map((el) => el.toLowerCase());\n // Re-parse arguments with new prefixes\n const args = process.argv.slice(2);\n this.parseArgs(args);\n }\n}\n\n// Singleton pattern (like legacy)\nlet instance: Args | null = null;\n\n/**\n * Initialize Args instance (singleton pattern)\n */\nexport function init(args?: string[]): Args {\n instance = new Args({ args });\n return instance;\n}\n\n/**\n * Get the current Args instance (singleton pattern)\n */\nexport function getArgsInstance(): Args | null {\n return instance;\n}\n\n\n"],"mappings":"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","names":["config"]}