{"version":3,"sources":["../src/flags.ts"],"sourcesContent":["// Define interfaces for our flag types\ninterface IFlag<T> {\n  name: string;\n  defaultValue: T;\n  description?: string;\n  currentValue: T | null;\n  validator?: (input: T | null) => boolean;\n  isSecret: boolean;\n  isSet: boolean;\n  isRequired: boolean;\n  setDefault(defaultValue: T): this;\n  setRequired(required: boolean): this;\n  setDescription(description: string): this;\n  setValidator(validator: (input: T | null) => boolean): this;\n  setSecret(isSecret: boolean): this;\n  set(input: T): void;\n  get(): T | null;\n  parseInput(inp: string): T | null;\n  toHelpString(): string;\n}\n\n// Define the global flags object\ndeclare global {\n  var GLOBAL_FLAGS: { [key: string]: IFlag<any> };\n}\n\nif (typeof global.GLOBAL_FLAGS === \"undefined\") {\n  global.GLOBAL_FLAGS = {};\n}\n\nconst FLAGS: { [key: string]: IFlag<any> } = global.GLOBAL_FLAGS;\n\n/**\n * An object containing a map of flag objects.  If different modules are\n * importing different versions of the library we want them to use the same\n * FLAGS object.  This does mean that the flags library needs to be backwards\n * compatible.\n */\nexport { FLAGS };\n\nlet exitOnError = true;\n\nlet usageInfo =\n  \"Usage: node \" + (process.argv[1] || \"\").split(\"/\").pop() + \" [options]\";\n\n/**\n * If true, then the process will be nicely exit on a parse error.  If false,\n * an Error will be thrown.  Set to false in tests.\n */\nexport function setExitOnError(value: boolean) {\n  exitOnError = value;\n}\n\n/**\n * Allows an app to add extra usage information that will be shown in the help\n * message, above the flags.\n */\nexport function setUsageInfo(value: string) {\n  usageInfo = value;\n}\n\n/**\n * Defines a string flag.  e.g. --servername=bob\n */\nexport function defineString(\n  name: string,\n  defaultValue?: string,\n  description?: string\n): IFlag<string> {\n  return addFlag(name, new StringFlag(name, defaultValue, description));\n}\n\n/**\n * Defines a boolean flag.   e.g. --turnonlights\n */\nexport function defineBoolean(\n  name: string,\n  defaultValue?: boolean,\n  description?: string\n): IFlag<boolean> {\n  return addFlag(name, new BooleanFlag(name, defaultValue, description));\n}\n\n/**\n * Defines an integer flag.  e.g.  --age=12\n */\nexport function defineInteger(\n  name: string,\n  defaultValue?: number,\n  description?: string\n): IFlag<number> {\n  return addFlag(name, new IntegerFlag(name, defaultValue, description));\n}\n\n/**\n * Defines a number flag.  e.g. --number=1.345\n */\nexport function defineNumber(\n  name: string,\n  defaultValue?: number,\n  description?: string\n): IFlag<number> {\n  return addFlag(name, new NumberFlag(name, defaultValue, description));\n}\n\n/**\n * Defines a string list flag.  e.g. --animal=frog,bat,chicken\n */\nexport function defineStringList(\n  name: string,\n  defaultValue?: string[],\n  description?: string\n): IFlag<string[]> {\n  return addFlag(name, new StringListFlag(name, defaultValue, description));\n}\n\n/**\n * Defines a multi string flag.  e.g. --allowedip=127.0.0.1 --allowedip=127.0.0.2\n */\nexport function defineMultiString(\n  name: string,\n  defaultValue?: string[],\n  description?: string\n): IFlag<string[]> {\n  return addFlag(name, new MultiStringFlag(name, defaultValue, description));\n}\n\n/**\n * Dumps the help text to the console.\n */\nexport function help(): void {\n  if (usageInfo) {\n    console.log(usageInfo + \"\\n\");\n  }\n  console.log(\"Options:\");\n  for (const flag in FLAGS) {\n    if (!FLAGS[flag].isSecret) {\n      console.log(FLAGS[flag].toHelpString());\n    }\n  }\n}\n\n/**\n * Resets the flag values.\n */\nexport function reset(): void {\n  parseCalled = false;\n  Object.keys(FLAGS).forEach((key) => delete FLAGS[key]);\n  registerInternalFlags();\n}\n\n/**\n * Gets the current value of the given flag.\n */\nexport function get(name: string): unknown {\n  if (!FLAGS[name]) throw Error('Unknown flag \"' + name + '\"');\n  return FLAGS[name].get();\n}\n\n/**\n * Gets whether or not the flag was set.\n */\nexport function isSet(name: string): boolean {\n  if (!FLAGS[name]) throw Error('Unknown flag \"' + name + '\"');\n  return FLAGS[name].isSet;\n}\n\n/**\n * Parses process.argv for flags.  Idempotent if called multiple times.\n */\nexport function parse(\n  args: string[] = process.argv.slice(2),\n  ignoreUnrecognized?: boolean\n): string[] {\n  if (parseCalled) return [];\n\n  for (let i = 0; i < args.length; i++) {\n    const arg = args[i];\n\n    if (arg == \"--\") {\n      return args.slice(i + 1);\n    } else if (arg.startsWith(\"--\")) {\n      let flag = arg.slice(2);\n      let value: string | null = null;\n      if (flag.indexOf(\"=\") > -1) {\n        const parts = flag.split(\"=\");\n        flag = parts[0];\n        value = parts.slice(1).join(\"=\");\n      }\n\n      if (value == null && args[i + 1] && !args[i + 1].startsWith(\"--\")) {\n        args[i] = args[i] + \" \" + args[i + 1];\n        value = args[i + 1];\n        args.splice(i + 1, 1);\n      }\n\n      if (!FLAGS[flag] && value == null && flag.startsWith(\"no\")) {\n        flag = flag.slice(2);\n        value = \"0\";\n      }\n\n      if (FLAGS[flag]) {\n        try {\n          FLAGS[flag].set(value);\n        } catch (e) {\n          throwFlagParseError(args, i, (e as Error).message);\n        }\n      } else if (!ignoreUnrecognized) {\n        throwFlagParseError(args, i, 'Unrecognized flag name \"' + arg + '\"');\n      }\n    } else {\n      throwFlagParseError(args, i, 'Invalid argument \"' + arg + '\"');\n    }\n  }\n\n  parseCalled = true;\n\n  if (FLAGS.help.get()) {\n    help();\n    process.exit(0);\n  }\n\n  Object.keys(FLAGS).forEach((key) => {\n    if (FLAGS[key].isRequired && !FLAGS[key].isSet) {\n      throwFlagParseError(args, -1, 'Missing required flag \"--' + key + '\"');\n    }\n  });\n\n  return [];\n}\n\n// Private helpers\nlet parseCalled = false;\n\nfunction throwFlagParseError(args: string[], i: number, msg: string): void {\n  let errorMsg = \"FLAG PARSING ERROR: \" + msg;\n  if (i > -1) {\n    errorMsg +=\n      \"\\n \" +\n      args.join(\" \") +\n      \"\\n \" +\n      new Array(args.slice(0, i).join(\" \").length + 2).join(\" \") +\n      new Array(args[i].length + 1).join(\"^\");\n  }\n\n  if (exitOnError) {\n    console.error(errorMsg);\n    process.exit(1);\n  } else {\n    throw Error(errorMsg);\n  }\n}\n\nfunction addFlag<T>(name: string, flag: IFlag<T>): IFlag<T> {\n  if (parseCalled) throw Error(\"Can not register new flags after parse()\");\n  if (FLAGS[name]) throw Error('Flag already defined: \"' + name + '\"');\n  FLAGS[name] = flag;\n  return flag;\n}\n\nfunction wrapText(text: string, maxLen: number): string {\n  const lines = text.split(\"\\n\");\n  const out: string[] = [];\n  lines.forEach((line) => {\n    const maxLenx = maxLen + (out.length == 0 ? 4 : 0);\n    if (line.length < maxLenx) {\n      out.push(line);\n    } else {\n      const current = wrapLine(line, \" \", maxLenx, out);\n      if (current != \"\") {\n        out.push(current);\n      }\n    }\n  });\n  return out.join(\"\\n    \");\n}\n\nfunction wrapLine(\n  line: string,\n  delimiter: string,\n  maxLen: number,\n  out: string[]\n): string {\n  const parts = line.split(delimiter);\n  let current = \"\";\n  parts.forEach((part) => {\n    const next = current + part + delimiter;\n    if (next.length > maxLen) {\n      out.push(current);\n      current = part + delimiter;\n    } else {\n      current = next;\n    }\n  });\n  return current;\n}\n\nclass Flag<T> implements IFlag<T> {\n  name: string;\n  defaultValue: T;\n  description?: string;\n  currentValue: T | null;\n  validator?: (input: T | null) => boolean;\n  isSecret: boolean;\n  isSet: boolean;\n  isRequired: boolean;\n\n  constructor(name: string, defaultValue: T, description?: string) {\n    this.name = name;\n    this.defaultValue = defaultValue;\n    this.description = description;\n    this.currentValue = null;\n    this.isSecret = false;\n    this.isSet = false;\n    this.isRequired = false;\n  }\n\n  /** Set a default value. */\n  setDefault(defaultValue: T): this {\n    this.defaultValue = defaultValue;\n    return this;\n  }\n\n  /** Set whether this flag is required. */\n  setRequired(isRequired: boolean): this {\n    this.isRequired = isRequired;\n    return this;\n  }\n\n  /** Set a description for use in the help message. */\n  setDescription(description: string): this {\n    this.description = description;\n    return this;\n  }\n\n  /** Set a custom validator. */\n  setValidator(validator: (input: T | null) => boolean): this {\n    this.validator = validator;\n    return this;\n  }\n\n  /** Hide this flag from the help message. */\n  setSecret(isSecret: boolean): this {\n    this.isSecret = isSecret;\n    return this;\n  }\n\n  set(input: T | string): void {\n    if (this.isSet) {\n      throw Error(\"Flag already set\");\n    }\n    if (typeof input === \"string\") {\n      this.currentValue = this.parseInput(input);\n    } else if (input === null) {\n      this.currentValue = this.parseInput(null);\n    } else {\n      this.currentValue = input;\n    }\n    if (this.validator) this.validator(this.currentValue);\n    this.isSet = true;\n  }\n\n  get(): T | null {\n    return this.isSet ? this.currentValue : this.defaultValue;\n  }\n\n  parseInput(_inp: string | null): T | null {\n    throw Error(\"Not implemented\");\n  }\n\n  toHelpString(): string {\n    return (\n      wrapText(\"  --\" + this.name + \": \" + this.description, 70) +\n      \"\\n\" +\n      \"    (default: \" +\n      JSON.stringify(this.defaultValue) +\n      \")\"\n    );\n  }\n}\n\nclass BooleanFlag extends Flag<boolean> implements IFlag<boolean> {\n  constructor(name: string, defaultValue?: boolean, description?: string) {\n    super(name, defaultValue ?? false, description);\n  }\n\n  parseInput(inp: string | null): boolean {\n    if (inp === null) {\n      // Empty flag value means true for a boolean flag.\n      return true;\n    }\n    inp = inp.toLowerCase();\n    if (inp === \"1\" || inp === \"true\" || inp == \"t\") {\n      return true;\n    } else if (inp === \"0\" || inp === \"false\" || inp == \"f\") {\n      return false;\n    } else {\n      throw Error('Invalid Boolean flag \"' + inp + '\"');\n    }\n  }\n\n  get(): boolean {\n    return !!super.get();\n  }\n\n  toHelpString(): string {\n    return (\n      wrapText(\"  --[no]\" + this.name + \": \" + this.description, 70) +\n      \"\\n\" +\n      \"    (default: \" +\n      JSON.stringify(this.defaultValue) +\n      \")\"\n    );\n  }\n}\n\nclass IntegerFlag extends Flag<number> implements IFlag<number> {\n  constructor(name: string, defaultValue?: number, description?: string) {\n    super(name, defaultValue ?? 0, description);\n  }\n\n  parseInput(inp: string): number {\n    if (isNaN(Number(inp)) || parseInt(inp, 10) !== Number(inp)) {\n      throw Error('Invalid Integer flag \"' + inp + '\"');\n    }\n    return Number(inp);\n  }\n\n  toHelpString(): string {\n    return super.toHelpString() + \"\\n    (an integer)\";\n  }\n}\n\nclass NumberFlag extends Flag<number> implements IFlag<number> {\n  constructor(name: string, defaultValue?: number, description?: string) {\n    super(name, defaultValue ?? 0, description);\n  }\n\n  parseInput(inp: string | null): number {\n    if (isNaN(Number(inp))) {\n      throw Error('Invalid Number flag \"' + inp + '\"');\n    }\n    return Number(inp);\n  }\n\n  toHelpString(): string {\n    return super.toHelpString() + \"\\n    (a number)\";\n  }\n}\n\nclass StringFlag extends Flag<string> implements IFlag<string> {\n  constructor(name: string, defaultValue?: string, description?: string) {\n    super(name, defaultValue ?? \"\", description);\n  }\n\n  parseInput(inp: string | null): string {\n    if (inp === null) {\n      throw Error('Invalid String flag \"' + inp + '\"');\n    }\n    return inp;\n  }\n\n  toHelpString(): string {\n    return super.toHelpString() + \"\\n    (a string)\";\n  }\n}\n\nclass StringListFlag extends Flag<string[]> implements IFlag<string[]> {\n  constructor(name: string, defaultValue?: string[], description?: string) {\n    super(name, defaultValue ?? [], description);\n  }\n\n  parseInput(inp: string | null): string[] {\n    if (inp === null) return [];\n    else return inp.split(\",\");\n  }\n}\n\nclass MultiStringFlag extends Flag<string[]> implements IFlag<string[]> {\n  constructor(name: string, defaultValue?: string[], description?: string) {\n    super(name, defaultValue ?? [], description);\n  }\n\n  set(input: string[]): void {\n    if (this.validator) this.validator(input);\n    if (!this.currentValue) this.currentValue = [];\n    this.currentValue.push(...input);\n    this.isSet = true;\n  }\n}\n\n// Internal flags\nfunction registerInternalFlags(): void {\n  defineBoolean(\"help\").setDescription(\"Shows this help text.\").setSecret(true);\n  // TODO: --flagsfile\n}\n\nregisterInternalFlags();\n"],"mappings":"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","names":[]}