{"version":3,"sources":["../../src/helpers/validators.ts"],"sourcesContent":["import fs from \"fs\";\nimport { RequestHandler } from \"express\";\nimport { RouteErrorHandler, ExpressMethod } from \"../types\";\nimport { JAVASCRIPT_FILES_EXTENSION_REGEX } from \"../constants/regex\";\nimport { EXPRESS_METHODS_ARRAY } from \"../constants\";\nimport { resolveTarget } from \"./resolvers\";\n\nconst VALID_OUTPUT_TYPES = [\"tree\", \"table\", \"json\"] as const;\n\nexport function isFunction(value: any): value is Function {\n    return typeof value === \"function\";\n}\n\nexport function isRequestHandler(handler: any): handler is RequestHandler {\n    return isFunction(handler);\n}\n\nexport function isErrorHandler(handler: any): handler is RouteErrorHandler {\n    return isFunction(handler) && handler.length === 4;\n}\n\nexport function filenameIsJSorTS(filename: string) {\n    return !!filename.match(JAVASCRIPT_FILES_EXTENSION_REGEX);\n}\n\nexport function pathExistsAndIsFile(path: string) {\n    return fs.existsSync(path) && fs.statSync(path).isFile();\n}\n\nexport function fileExistsAndIsJSorTS(filePath: string) {\n    return !!filePath.match(JAVASCRIPT_FILES_EXTENSION_REGEX) && pathExistsAndIsFile(filePath);\n}\n\nexport function methodIsExpressMethod(method: string): method is ExpressMethod {\n    return EXPRESS_METHODS_ARRAY.includes(method as ExpressMethod);\n}\n\nexport function isDefined<T>(value: T): value is NonNullable<T> {\n    return value !== null && value !== undefined;\n}\n\nexport function isNotDefined<T>(value: T): value is Extract<T, null | undefined> {\n    return value === null || value === undefined;\n}\n\nexport function isObject(value: unknown): value is object {\n    return isDefined(value) && typeof value === \"object\";\n}\n\nexport function validateCLIList<T extends string = string>(value: string | undefined, allowed: T[] | Readonly<T[]>, name: string): T[] {\n    if (!value) return [];\n  \n    const list = value.split(\",\").map(v => v.trim()).filter(Boolean);\n  \n    for (const item of list) {\n      if (!allowed.includes(item as T)) {\n        throw new Error(`Invalid ${name} value: ${item}`);\n      }\n    }\n  \n    return list as T[];\n}\n\nexport function normalizeCLIOptions(options: Record<string, any>) {\n  const output = options.output ?? \"tree\";\n  const target = resolveTarget(options.target);\n\n  if (!VALID_OUTPUT_TYPES.includes(output)) {\n    throw new Error(`Invalid output: ${output}`);\n  }\n\n  return {\n    target,\n    output: output as typeof VALID_OUTPUT_TYPES[number],\n  };\n}"],"mappings":"AAAA,OAAO,QAAQ;AAGf,SAAS,wCAAwC;AACjD,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAE9B,MAAM,qBAAqB,CAAC,QAAQ,SAAS,MAAM;AAE5C,SAAS,WAAW,OAA+B;AACtD,SAAO,OAAO,UAAU;AAC5B;AAEO,SAAS,iBAAiB,SAAyC;AACtE,SAAO,WAAW,OAAO;AAC7B;AAEO,SAAS,eAAe,SAA4C;AACvE,SAAO,WAAW,OAAO,KAAK,QAAQ,WAAW;AACrD;AAEO,SAAS,iBAAiB,UAAkB;AAC/C,SAAO,CAAC,CAAC,SAAS,MAAM,gCAAgC;AAC5D;AAEO,SAAS,oBAAoB,MAAc;AAC9C,SAAO,GAAG,WAAW,IAAI,KAAK,GAAG,SAAS,IAAI,EAAE,OAAO;AAC3D;AAEO,SAAS,sBAAsB,UAAkB;AACpD,SAAO,CAAC,CAAC,SAAS,MAAM,gCAAgC,KAAK,oBAAoB,QAAQ;AAC7F;AAEO,SAAS,sBAAsB,QAAyC;AAC3E,SAAO,sBAAsB,SAAS,MAAuB;AACjE;AAEO,SAAS,UAAa,OAAmC;AAC5D,SAAO,UAAU,QAAQ,UAAU;AACvC;AAEO,SAAS,aAAgB,OAAiD;AAC7E,SAAO,UAAU,QAAQ,UAAU;AACvC;AAEO,SAAS,SAAS,OAAiC;AACtD,SAAO,UAAU,KAAK,KAAK,OAAO,UAAU;AAChD;AAEO,SAAS,gBAA2C,OAA2B,SAA8B,MAAmB;AACnI,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAE/D,aAAW,QAAQ,MAAM;AACvB,QAAI,CAAC,QAAQ,SAAS,IAAS,GAAG;AAChC,YAAM,IAAI,MAAM,WAAW,IAAI,WAAW,IAAI,EAAE;AAAA,IAClD;AAAA,EACF;AAEA,SAAO;AACX;AAEO,SAAS,oBAAoB,SAA8B;AA/DlE;AAgEE,QAAM,UAAS,aAAQ,WAAR,YAAkB;AACjC,QAAM,SAAS,cAAc,QAAQ,MAAM;AAE3C,MAAI,CAAC,mBAAmB,SAAS,MAAM,GAAG;AACxC,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}