prodex 1.4.1 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +234 -234
  2. package/dist/cli/cli-input.js +8 -2
  3. package/dist/cli/cli-input.js.map +1 -0
  4. package/dist/cli/init.js +3 -1
  5. package/dist/cli/init.js.map +1 -0
  6. package/dist/cli/picker.js +1 -0
  7. package/dist/cli/picker.js.map +1 -0
  8. package/dist/cli/summary.js +1 -0
  9. package/dist/cli/summary.js.map +1 -0
  10. package/dist/constants/cache-keys.js +1 -0
  11. package/dist/constants/cache-keys.js.map +1 -0
  12. package/dist/constants/config.js +2 -1
  13. package/dist/constants/config.js.map +1 -0
  14. package/dist/constants/default-config.js +14 -4
  15. package/dist/constants/default-config.js.map +1 -0
  16. package/dist/constants/flags.js +7 -0
  17. package/dist/constants/flags.js.map +1 -0
  18. package/dist/constants/index.js +1 -0
  19. package/dist/constants/index.js.map +1 -0
  20. package/dist/constants/render-constants.js +1 -0
  21. package/dist/constants/render-constants.js.map +1 -0
  22. package/dist/core/combine.js +1 -0
  23. package/dist/core/combine.js.map +1 -0
  24. package/dist/core/dependency.js +1 -0
  25. package/dist/core/dependency.js.map +1 -0
  26. package/dist/core/helpers.js +1 -0
  27. package/dist/core/helpers.js.map +1 -0
  28. package/dist/core/managers/cache.js +1 -0
  29. package/dist/core/managers/cache.js.map +1 -0
  30. package/dist/core/managers/config.js +39 -6
  31. package/dist/core/managers/config.js.map +1 -0
  32. package/dist/core/output.js +1 -0
  33. package/dist/core/output.js.map +1 -0
  34. package/dist/core/renderers.js +1 -0
  35. package/dist/core/renderers.js.map +1 -0
  36. package/dist/debug.js +3 -1
  37. package/dist/debug.js.map +1 -0
  38. package/dist/index.js +2 -1
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/logger.js +1 -0
  41. package/dist/lib/logger.js.map +1 -0
  42. package/dist/lib/polyfills.js +1 -0
  43. package/dist/lib/polyfills.js.map +1 -0
  44. package/dist/lib/prompt.js +1 -0
  45. package/dist/lib/prompt.js.map +1 -0
  46. package/dist/lib/questions.js +1 -0
  47. package/dist/lib/questions.js.map +1 -0
  48. package/dist/lib/utils.js +9 -0
  49. package/dist/lib/utils.js.map +1 -0
  50. package/dist/resolvers/js/extract-imports.js +1 -0
  51. package/dist/resolvers/js/extract-imports.js.map +1 -0
  52. package/dist/resolvers/js/js-resolver.js +14 -11
  53. package/dist/resolvers/js/js-resolver.js.map +1 -0
  54. package/dist/resolvers/js/resolve-alias.js +16 -12
  55. package/dist/resolvers/js/resolve-alias.js.map +1 -0
  56. package/dist/resolvers/php/bindings.js +1 -0
  57. package/dist/resolvers/php/bindings.js.map +1 -0
  58. package/dist/resolvers/php/extract-imports.js +1 -0
  59. package/dist/resolvers/php/extract-imports.js.map +1 -0
  60. package/dist/resolvers/php/php-resolver.js +7 -4
  61. package/dist/resolvers/php/php-resolver.js.map +1 -0
  62. package/dist/resolvers/php/psr4.js +1 -0
  63. package/dist/resolvers/php/psr4.js.map +1 -0
  64. package/dist/shared/collections.js +1 -0
  65. package/dist/shared/collections.js.map +1 -0
  66. package/dist/shared/index.js +1 -0
  67. package/dist/shared/index.js.map +1 -0
  68. package/dist/shared/io.js +1 -0
  69. package/dist/shared/io.js.map +1 -0
  70. package/dist/shared/patterns.js +4 -1
  71. package/dist/shared/patterns.js.map +1 -0
  72. package/dist/store.js +1 -0
  73. package/dist/store.js.map +1 -0
  74. package/dist/types/cli.types.js +1 -0
  75. package/dist/types/cli.types.js.map +1 -0
  76. package/dist/types/config.types.js +1 -0
  77. package/dist/types/config.types.js.map +1 -0
  78. package/dist/types/core.types.js +1 -0
  79. package/dist/types/core.types.js.map +1 -0
  80. package/dist/types/index.js +1 -0
  81. package/dist/types/index.js.map +1 -0
  82. package/dist/types/resolver.types.js +1 -0
  83. package/dist/types/resolver.types.js.map +1 -0
  84. package/dist/types/utils.types.js +1 -0
  85. package/dist/types/utils.types.js.map +1 -0
  86. package/package.json +6 -4
@@ -15,6 +15,7 @@ const store_1 = require("../../store");
15
15
  const constants_1 = require("../../constants");
16
16
  const cache_1 = require("../../core/managers/cache");
17
17
  const collections_1 = require("../../shared/collections");
18
+ const promises_1 = __importDefault(require("fs/promises")); // (add near the top if not present)
18
19
  /** Ensure we have a PHP resolver context for the current root */
19
20
  function buildPhpCtx(root, prev) {
20
21
  if (prev?.kind === "php")
@@ -53,7 +54,6 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
53
54
  return (0, collections_1.emptyResult)(visited);
54
55
  // Context + exclusions
55
56
  const phpCtx = buildPhpCtx(ROOT, ctx);
56
- const isExcluded = (0, shared_1.makeExcludeMatcher)(excludePatterns);
57
57
  // Parse imports (expand grouped `use` syntax)
58
58
  const raw = (0, extract_imports_1.extractPhpImports)(code);
59
59
  const imports = (0, extract_imports_1.expandGroupedUses)(raw);
@@ -70,11 +70,14 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
70
70
  // Only resolve PSR-4 mapped namespaces
71
71
  if (!startsWithAnyNamespace(imp, phpCtx.nsKeys))
72
72
  continue;
73
- if (isExcluded(imp))
73
+ if ((0, shared_1.isExcluded)(imp, excludePatterns))
74
74
  continue;
75
- stats.expected.add(imp);
76
75
  // Resolve namespace → file path (sync helper retained)
77
76
  const resolvedPath = await tryResolvePhpFile(imp, filePath, phpCtx.psr4);
77
+ // Exclusion check after final resolution
78
+ if ((0, shared_1.isExcluded)(resolvedPath, excludePatterns))
79
+ continue;
80
+ stats.expected.add(imp);
78
81
  if (!resolvedPath)
79
82
  continue;
80
83
  stats.resolved.add(imp);
@@ -97,7 +100,6 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
97
100
  logger_1.logger.debug("[php-resolver] unresolved:", [...unresolved]);
98
101
  return { files: out, visited, stats };
99
102
  }
100
- const promises_1 = __importDefault(require("fs/promises")); // (add near the top if not present)
101
103
  async function tryResolvePhpFile(imp, fromFile, psr4) {
102
104
  const key = `php:${imp}:${fromFile}`;
103
105
  const cached = cache_1.CacheManager.get(constants_1.CACHE_KEYS.PHP_FILECACHE, key);
@@ -125,3 +127,4 @@ async function tryResolvePhpFile(imp, fromFile, psr4) {
125
127
  cache_1.CacheManager.set(constants_1.CACHE_KEYS.PHP_FILECACHE, key, resolved);
126
128
  return resolved;
127
129
  }
130
+ //# sourceMappingURL=php-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/php/php-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { extractPhpImports, expandGroupedUses } from \"./extract-imports\";\r\nimport { loadLaravelBindings } from \"./bindings\";\r\nimport { resolvePsr4 } from \"./psr4\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport { newStats, mergeStats, unique, readFileSafe, makeExcludeMatcher, setDiff, isExcluded } from \"../../shared\";\r\nimport { getConfig } from \"../../store\";\r\nimport type { ResolverParams, ResolverResult, PhpResolverCtx } from \"../../types\";\r\nimport { CACHE_KEYS } from \"../../constants\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport { emptyResult } from \"../../shared/collections\";\r\nimport fsp from \"fs/promises\"; // (add near the top if not present)\r\n\r\n\r\n/** Ensure we have a PHP resolver context for the current root */\r\nfunction buildPhpCtx(root: string, prev?: PhpResolverCtx): PhpResolverCtx {\r\n\tif (prev?.kind === \"php\") return prev;\r\n\tconst psr4 = resolvePsr4(root);\r\n\tconst nsKeys = Object.keys(psr4).sort((a, b) => b.length - a.length);\r\n\tconst bindings = loadLaravelBindings(root);\r\n\treturn { kind: \"php\", psr4, nsKeys, bindings };\r\n}\r\n\r\n/** Namespace prefix check */\r\nfunction startsWithAnyNamespace(imp: string, nsKeys: string[]): boolean {\r\n\tfor (const k of nsKeys) if (imp.startsWith(k)) return true;\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * Typed PHP resolver (aligned with JS resolver signature).\r\n * - Uses global config via getConfig()\r\n * - Returns ResolverResult (files + stats)\r\n * - Depth/visited guarded recursion\r\n */\r\nexport async function resolvePhpImports({ filePath, visited = new Set<string>(), depth = 0, maxDepth, ctx }: ResolverParams): Promise<ResolverResult> {\r\n\tconst {\r\n\t\troot: ROOT,\r\n\t\tresolve: { exclude: excludePatterns = [], depth: defaultDepth = 10 },\r\n\t} = getConfig();\r\n\r\n\tconst limitDepth = maxDepth ?? defaultDepth;\r\n\r\n\tif (depth >= limitDepth) return emptyResult(visited);\r\n\tif (visited.has(filePath)) return emptyResult(visited);\r\n\tvisited.add(filePath);\r\n\r\n\t// Fast existence / read\r\n\tif (!fs.existsSync(filePath)) return emptyResult(visited);\r\n\tconst code = readFileSafe(filePath);\r\n\tif (!code) return emptyResult(visited);\r\n\r\n\t// Context + exclusions\r\n\tconst phpCtx = buildPhpCtx(ROOT, ctx as PhpResolverCtx | undefined);\r\n\r\n\t// Parse imports (expand grouped `use` syntax)\r\n\tconst raw = extractPhpImports(code);\r\n\tconst imports = expandGroupedUses(raw);\r\n\r\n\t// Accumulators\r\n\tconst stats = newStats();\r\n\tconst filesOut: string[] = [];\r\n\r\n\tfor (const imp0 of imports) {\r\n\t\tlet imp = imp0;\r\n\r\n\t\t// Respect Laravel container bindings (Interface → Implementation)\r\n\t\tif (phpCtx.bindings[imp]) {\r\n\t\t\tlogger.debug(\"[php-resolver] binding:\", imp, \"→\", phpCtx.bindings[imp]);\r\n\t\t\timp = phpCtx.bindings[imp];\r\n\t\t}\r\n\r\n\t\t// Only resolve PSR-4 mapped namespaces\r\n\t\tif (!startsWithAnyNamespace(imp, phpCtx.nsKeys)) continue;\r\n\t\tif (isExcluded(imp, excludePatterns)) continue;\r\n\r\n\t\t// Resolve namespace → file path (sync helper retained)\r\n\t\tconst resolvedPath = await tryResolvePhpFile(imp, filePath, phpCtx.psr4);\r\n\r\n\t\t// Exclusion check after final resolution\r\n\t\tif (isExcluded(resolvedPath, excludePatterns)) continue;\r\n\t\tstats.expected.add(imp);\r\n\t\tif (!resolvedPath) continue;\r\n\r\n\t\tstats.resolved.add(imp);\r\n\t\tfilesOut.push(resolvedPath);\r\n\r\n\t\t// Recurse\r\n\t\tconst sub = await resolvePhpImports({\r\n\t\t\tfilePath: resolvedPath,\r\n\t\t\tvisited,\r\n\t\t\tdepth: depth + 1,\r\n\t\t\tmaxDepth: limitDepth,\r\n\t\t\tctx: phpCtx,\r\n\t\t});\r\n\r\n\t\tfilesOut.push(...sub.files);\r\n\t\tmergeStats(stats, sub.stats);\r\n\t}\r\n\r\n\tconst out = unique(filesOut);\r\n\tconst unresolved = setDiff(stats.expected, stats.resolved);\r\n\tlogger.debug(`🪶 [php-resolver] ${path.basename(filePath)} → expected: ${stats.expected.size}, resolved: ${stats.resolved.size}`);\r\n\tif (unresolved.size) logger.debug(\"[php-resolver] unresolved:\", [...unresolved]);\r\n\r\n\treturn { files: out, visited, stats };\r\n}\r\n\r\n\r\nasync function tryResolvePhpFile(imp: string, fromFile: string, psr4: Record<string, string>): Promise<string | null> {\r\n\tconst key = `php:${imp}:${fromFile}`;\r\n\tconst cached = CacheManager.get(CACHE_KEYS.PHP_FILECACHE, key);\r\n\tif (cached !== undefined) return cached;\r\n\r\n\tconst nsKey = Object.keys(psr4).find((k) => imp.startsWith(k));\r\n\tif (!nsKey) {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_FILECACHE, key, null);\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst rel = imp.slice(nsKey.length).norm();\r\n\tconst tries = [path.join(psr4[nsKey], rel), path.join(psr4[nsKey], rel + \".php\"), path.join(psr4[nsKey], rel, \"index.php\")];\r\n\r\n\t// 🔹 Run all stats concurrently\r\n\tconst results = await Promise.allSettled(\r\n\t\ttries.map(async (p) => {\r\n\t\t\ttry {\r\n\t\t\t\tconst st = await fsp.stat(p);\r\n\t\t\t\treturn st.isFile() ? path.resolve(p) : null;\r\n\t\t\t} catch {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t})\r\n\t);\r\n\r\n\t//@ts-ignore\r\n\tconst resolved = results.find((r) => r.status === \"fulfilled\" && r.value)?.value ?? null;\r\n\tCacheManager.set(CACHE_KEYS.PHP_FILECACHE, key, resolved);\r\n\treturn resolved;\r\n}\r\n"]}
@@ -37,3 +37,4 @@ function resolvePsr4(root) {
37
37
  return {};
38
38
  }
39
39
  }
40
+ //# sourceMappingURL=psr4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psr4.js","sourceRoot":"","sources":["../../../src/resolvers/php/psr4.ts"],"names":[],"mappings":";;;;;AASA,kCA4BC;AArCD,4CAAoB;AACpB,gDAAwB;AACxB,qDAAyD;AACzD,2DAAwD;AAExD;;;GAGG;AACH,SAAgB,WAAW,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAExD,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,GAAG,GAA2B,EAAE,CAAC;QAEvC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,OAAO,CAAC,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport { CACHE_KEYS } from \"../../constants/cache-keys\";\r\n\r\n/**\r\n * Builds a PSR-4 namespace → directory map from composer.json.\r\n * Returns absolute paths in the map values.\r\n */\r\nexport function resolvePsr4(root: string): Record<string, string> {\r\n\tconst cached = CacheManager.get(CACHE_KEYS.PHP_PSR4, root);\r\n\tif (cached) return cached;\r\n\r\n\tconst composer = path.join(root, \"composer.json\");\r\n\tif (!fs.existsSync(composer)) {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, {});\r\n\t\treturn {};\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst data = JSON.parse(fs.readFileSync(composer, \"utf8\")) as {\r\n\t\t\tautoload?: { [\"psr-4\"]?: Record<string, string> };\r\n\t\t};\r\n\t\tconst src = data.autoload?.[\"psr-4\"] || {};\r\n\t\tconst map: Record<string, string> = {};\r\n\r\n\t\tfor (const ns in src) {\r\n\t\t\tconst cleanNs = ns.replace(/\\\\+$/, \"\");\r\n\t\t\tmap[cleanNs] = path.resolve(root, src[ns]);\r\n\t\t}\r\n\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, map);\r\n\t\treturn map;\r\n\t} catch {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, {});\r\n\t\treturn {};\r\n\t}\r\n}\r\n"]}
@@ -31,3 +31,4 @@ function unique(arr) {
31
31
  function emptyResult(visited) {
32
32
  return { files: [], visited, stats: { expected: new Set(), resolved: new Set() } };
33
33
  } // ---------------------------------------------------------
34
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/shared/collections.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,gCAIC;AAMD,0BAEC;AAMD,wBAEC;AAED,kCAEC;AA5BD,SAAgB,QAAQ;IACvB,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,UAAU,CAAC,MAAM,EAAE,GAAG;IACrC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAI,CAAS,EAAE,CAAS;IAC9C,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD;;;GAGG;AAEH,SAAgB,MAAM,CAAI,GAAQ;IACjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,0BAA0B;AAC1B,SAAgB,WAAW,CAAC,OAAoB;IAC/C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC;AACpF,CAAC,CAAC,4DAA4D","sourcesContent":["import { ResolverResult } from \"../types\";\r\n\r\nexport function newStats(): ResolverResult[\"stats\"] {\r\n\treturn { expected: new Set(), resolved: new Set() };\r\n}\r\n\r\nexport function mergeStats(target, src) {\r\n\tsrc.expected.forEach((i) => target.expected.add(i));\r\n\tsrc.resolved.forEach((i) => target.resolved.add(i));\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Returns a new Set of elements present in A but not in B.\r\n * Used to detect unresolved imports in JS and PHP resolvers.\r\n */\r\nexport function setDiff<A>(A: Set<A>, B: Set<A>): Set<A> {\r\n\treturn new Set([...A].filter((x) => !B.has(x)));\r\n}\r\n/**\r\n * Removes duplicates from an array.\r\n * Stateless helper used across resolvers and dependency chain.\r\n */\r\n\r\nexport function unique<T>(arr: T[]): T[] {\r\n\treturn [...new Set(arr)];\r\n}\r\n/** Empty result helper */\r\nexport function emptyResult(visited: Set<string>): ResolverResult {\r\n\treturn { files: [], visited, stats: { expected: new Set(), resolved: new Set() } };\r\n} // ---------------------------------------------------------\r\n\r\n\r\n"]}
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./io"), exports);
18
18
  __exportStar(require("./patterns"), exports);
19
19
  __exportStar(require("./collections"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,6CAA2B;AAC3B,gDAA8B","sourcesContent":["export * from \"./io\";\r\nexport * from \"./patterns\";\r\nexport * from \"./collections\"\r\n"]}
package/dist/shared/io.js CHANGED
@@ -49,3 +49,4 @@ function rel(p, root = process.cwd()) {
49
49
  /**
50
50
  * Get a root-relative version of a path.
51
51
  */
52
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/shared/io.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;;;AAUzB,oCAMC;AAMD,wCAWC;AAKD,kBAEC;AAtCD,kDAAsD;AACtD,gDAAwB;AACxB,4CAAoB;AACpB,2DAA8B;AAE9B;;GAEG;AACH,SAAgB,YAAY,CAAC,CAAS;IACrC,IAAI,CAAC;QACJ,OAAO,YAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,CAAS;IACzD,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,MAAM,kBAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACR,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,GAAG,CAAC,CAAS,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IAClD,OAAO,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AACD;;GAEG","sourcesContent":["// File: src/shared/io.ts\r\n\r\nimport { CacheManager } from \"../core/managers/cache\";\r\nimport path from \"path\";\r\nimport fs from \"fs\";\r\nimport fsp from \"fs/promises\";\r\n\r\n/**\r\n * Read a file safely. Returns \"\" if the file cannot be read.\r\n */\r\nexport function readFileSafe(p: string): string {\r\n\ttry {\r\n\t\treturn fs.readFileSync(p, \"utf8\");\r\n\t} catch {\r\n\t\treturn \"\";\r\n\t}\r\n}\r\n\r\n/**\r\n * Cached version of fs.stat().\r\n * Takes a cache namespace to preserve behavior across resolvers.\r\n */\r\nexport async function safeStatCached(ns: string, p: string): Promise<import(\"fs\").Stats | null> {\r\n\tconst cached = CacheManager.get(ns, p);\r\n\tif (cached !== undefined) return cached;\r\n\ttry {\r\n\t\tconst st = await fsp.stat(p);\r\n\t\tCacheManager.set(ns, p, st);\r\n\t\treturn st;\r\n\t} catch {\r\n\t\tCacheManager.set(ns, p, null);\r\n\t\treturn null;\r\n\t}\r\n}\r\n\r\n/**\r\n * Return a path relative to a root, normalized for forward slashes.\r\n */\r\nexport function rel(p: string, root = process.cwd()): string {\r\n\treturn path.relative(root, p).replaceAll(\"\\\\\", \"/\");\r\n}\r\n/**\r\n * Get a root-relative version of a path.\r\n */\r\n"]}
@@ -11,9 +11,11 @@ const micromatch_1 = __importDefault(require("micromatch"));
11
11
  * Returns true if a given path matches any of the provided glob patterns.
12
12
  * Equivalent to core/helpers.isExcluded().
13
13
  */
14
- function isExcluded(p, patterns = [], root = process.cwd()) {
14
+ function isExcluded(p = "", patterns = [], root = process.cwd()) {
15
15
  if (!patterns?.length)
16
16
  return false;
17
+ if (!p)
18
+ return false;
17
19
  const relPath = p.replaceAll("\\", "/");
18
20
  return micromatch_1.default.isMatch(relPath, patterns);
19
21
  }
@@ -27,3 +29,4 @@ function makeExcludeMatcher(patterns = []) {
27
29
  const mm = micromatch_1.default.matcher(patterns);
28
30
  return (s) => mm(String(s).replace(/\\/g, "/"));
29
31
  }
32
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/shared/patterns.ts"],"names":[],"mappings":";;;;;AAOA,gCAKC;AAMD,gDAIC;AAtBD,+BAA+B;AAC/B,4DAAoC;AAEpC;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY,EAAE,EAAE,WAAqB,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IACvF,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,oBAAU,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,WAAqB,EAAE;IACzD,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;IAC1C,MAAM,EAAE,GAAG,oBAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC","sourcesContent":["// File: src/shared/patterns.ts\r\nimport micromatch from \"micromatch\";\r\n\r\n/**\r\n * Returns true if a given path matches any of the provided glob patterns.\r\n * Equivalent to core/helpers.isExcluded().\r\n */\r\nexport function isExcluded(p: string = \"\", patterns: string[] = [], root = process.cwd()): boolean {\r\n\tif (!patterns?.length) return false;\r\n\tif (!p) return false;\r\n\tconst relPath = p.replaceAll(\"\\\\\", \"/\");\r\n\treturn micromatch.isMatch(relPath, patterns);\r\n}\r\n\r\n/**\r\n * Builds a reusable micromatch matcher for efficiency.\r\n * Equivalent to php-resolver.makeExcludeMatcher().\r\n */\r\nexport function makeExcludeMatcher(patterns: string[] = []): (s: string) => boolean {\r\n\tif (!patterns?.length) return () => false;\r\n\tconst mm = micromatch.matcher(patterns);\r\n\treturn (s: string) => mm(String(s).replace(/\\\\/g, \"/\"));\r\n}\r\n"]}
package/dist/store.js CHANGED
@@ -13,3 +13,4 @@ const getConfig = () => globalConfig || globalThis.__PRODEX__?.config;
13
13
  exports.getConfig = getConfig;
14
14
  const getFlags = () => globalFlags || globalThis.__PRODEX__?.flags;
15
15
  exports.getFlags = getFlags;
16
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;AAKA,gCAIC;AAPD,IAAI,YAAY,GAAG,IAAI,CAAC;AACxB,IAAI,WAAW,GAAG,IAAI,CAAC;AAEvB,SAAgB,UAAU,CAAC,GAAG,EAAE,KAA2B;IAC1D,YAAY,GAAG,GAAG,CAAC;IACnB,WAAW,GAAG,KAAK,CAAC;IACpB,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC;AAEM,MAAM,SAAS,GAAG,GAAiB,EAAE,CAAC,YAAY,IAAI,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC;AAA9E,QAAA,SAAS,aAAqE;AACpF,MAAM,QAAQ,GAAG,GAAgB,EAAE,CAAC,WAAW,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC;AAA1E,QAAA,QAAQ,YAAkE","sourcesContent":["import { ProdexConfig, ProdexFlags } from \"./types\";\r\n\r\nlet globalConfig = null;\r\nlet globalFlags = null;\r\n\r\nexport function setGlobals(cfg, flags: Partial<ProdexFlags>) {\r\n\tglobalConfig = cfg;\r\n\tglobalFlags = flags;\r\n\tglobalThis.__PRODEX__ = Object.freeze({ config: cfg, flags });\r\n}\r\n\r\nexport const getConfig = (): ProdexConfig => globalConfig || globalThis.__PRODEX__?.config;\r\nexport const getFlags = (): ProdexFlags => globalFlags || globalThis.__PRODEX__?.flags;\r\n"]}
@@ -10,3 +10,4 @@
10
10
  * [--inc=<globs>] [--exc=<globs>]
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
+ //# sourceMappingURL=cli.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.types.js","sourceRoot":"","sources":["../../src/types/cli.types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * CLI flag schema for Prodex.\n * Mirrors the current CLI synopsis:\n *\n * prodex [entries...] [-tcdv]\n * [--txt] [--ci] [--debug] [--verbose]\n * [--name=<string>|-n=<string>]\n * [--limit=<int>|-l=<int>]\n * [--inc=<globs>] [--exc=<globs>]\n */\n\nexport interface ProdexFlags {\n\t_: string[];\n\t/** Output as .txt instead of .md (-t / --txt) */\n\ttxt?: boolean;\n\n\t/** Headless / non-interactive mode (-c / --ci) */\n\tci?: boolean;\n\n\t/** Enable debug logs (-d / --debug) */\n\tdebug?: boolean;\n\n\t/** Verbose logs (-v / --verbose) */\n\tverbose?: boolean;\n\n\tsilent?: boolean;\n\n\t/** Custom output filename (without extension) (--name / -n) */\n\tname?: string | null;\n\n\t/** Traversal limit override (--limit / -l) */\n\tlimit?: number | null;\n\n\t/** Comma-separated glob list overriding resolve.include (--inc) */\n\tinclude?: string[];\n\n\t/** Comma-separated glob list overriding resolve.exclude (--exc) */\n\texclude?: string[];\n\tfiles?: string[];\n\n\tshortcut?: string;\n\n\t/** Optional short alias reference mapping */\n\tshort?: {\n\t\tt?: boolean;\n\t\tc?: boolean;\n\t\td?: boolean;\n\t\tv?: boolean;\n\t\tn?: string;\n\t\tl?: number;\n\t};\n}\n\n/** Minimal run summary for logging and UX display. */\nexport interface CliSummary {\n\toutDir: string;\n\tfileName: string;\n\tentries: string[];\n}\n\nexport interface ParsedInput {\n\trootArg: string;\n\troot?: string;\n\tflags: Partial<ProdexFlags>;\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Canonical configuration interface for Prodex.\n * Defines the accepted and guaranteed structure at runtime.\n */\nexport interface ProdexConfig extends ProdexBase {\n\tname: string;\n\troot: string;\n}\n\n/** Represents the user-saved config file (without runtime fields). */\nexport type ProdexConfigFile = DeepPartial<ProdexBase> & {\n\t$schema: string;\n\tversion: number;\n};\n\nexport type DeepPartial<T> = {\n\t[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\nexport type ProdexShortcut = {\n\tprefix?: string;\n\tfiles?: string[];\n\tinclude?: string[];\n\texclude?: string[];\n};\ninterface ProdexBase {\n\toutput: {\n\t\tdir: string;\n\t\tversioned: boolean;\n\t\tprefix: string;\n\t\tformat: \"md\" | \"txt\";\n\t};\n\n\tentry: {\n\t\tfiles: string[];\n\t\tui: {\n\t\t\troots: string[];\n\t\t\tscanDepth: number;\n\t\t\tpriority: string[];\n\t\t\tenablePicker?: boolean;\n\t\t};\n\t};\n\n\tresolve: {\n\t\tinclude: string[];\n\t\taliases: Record<string, string>;\n\t\texclude: string[];\n\t\tdepth: number;\n\t\tlimit: number;\n\t};\n\n\tshortcuts: Record<string, ProdexShortcut>;\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=core.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.types.js","sourceRoot":"","sources":["../../src/types/core.types.ts"],"names":[],"mappings":"","sourcesContent":["import { ProdexConfig } from \".\";\n\n/** Shared stats type across resolvers and chain results. */\nexport interface Stats {\n\texpected: Set<string>;\n\tresolved: Set<string>;\n}\n\n/** Followed dependency chain result. */\nexport interface ChainResult {\n\tfiles: string[];\n\tstats: Stats;\n}\n\n/** Parameters for producing the final output trace file. */\nexport interface OutputParams {\n\t/** Fully resolved + included file list (already dependency-expanded). */\n\tfiles: string[];\n\n\tname: string;\n\n\t/** Active Prodex configuration (merged + flag-overridden). */\n\tcfg: ProdexConfig;\n\n\t/** Whether to show interactive prompts for filename override. */\n\tshowUi: boolean;\n}\n\n/** Options accepted by runCombine (keep lean). */\nexport interface CombineOptions {\n\tshowUi: boolean;\n\tcliName: string;\n}\n\nexport interface CombineParams {\n\tcfg: ProdexConfig;\n\topts: CombineOptions;\n}\n\n/**\n * 🧠 Cache Type Definitions for Prodex\n * Central store for runtime-discovered aliases and other ephemeral data.\n */\n\nexport interface AliasCache {\n\t[alias: string]: string;\n}\n\n/**\n * Core cache registry shape.\n * Extend this interface to include other cache namespaces (fileCache, statsCache, etc.)\n */\nexport interface CacheRegistry {\n\taliases: Map<string, string>;\n}\n"]}
@@ -19,3 +19,4 @@ __exportStar(require("./cli.types"), exports);
19
19
  __exportStar(require("./core.types"), exports);
20
20
  __exportStar(require("./resolver.types"), exports);
21
21
  __exportStar(require("./utils.types"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,8CAA4B;AAC5B,+CAA6B;AAC7B,mDAAiC;AACjC,gDAA8B","sourcesContent":["export * from \"./config.types\";\nexport * from \"./cli.types\";\nexport * from \"./core.types\";\nexport * from \"./resolver.types\";\nexport * from \"./utils.types\";\n"]}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resolver.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.types.js","sourceRoot":"","sources":["../../src/types/resolver.types.ts"],"names":[],"mappings":"","sourcesContent":["/** Context for JS resolver (aliases precomputed). */\nexport interface JsResolverCtx {\n kind: \"js\";\n aliases: Record<string, string>;\n}\n\n/** Context for PHP resolver (PSR-4 map, bindings, etc.). */\nexport interface PhpResolverCtx {\n kind: \"php\";\n psr4: Record<string, string>;\n nsKeys: string[];\n bindings: Record<string, string>;\n}\n\n/** Shared parameter contract for all resolvers */\nexport interface ResolverParams {\n /** Absolute path of the file being resolved */\n filePath: string;\n\n /** Set of files already visited (to prevent recursion loops) */\n visited?: Set<string>;\n\n /** Current recursion depth */\n depth?: number;\n\n /** Maximum recursion depth allowed */\n maxDepth?: number;\n\n /** Shared context cache (aliases, bindings, psr4, etc.) */\n ctx?: JsResolverCtx | PhpResolverCtx;\n}\n\n/** Standard resolver result shape for both JS and PHP. */\nexport interface ResolverResult {\n files: string[];\n visited: Set<string>;\n stats: {\n expected: Set<string>;\n resolved: Set<string>;\n };\n}\n"]}
@@ -1,2 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=utils.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.types.js","sourceRoot":"","sources":["../../src/types/utils.types.ts"],"names":[],"mappings":"","sourcesContent":["type LogFn = (...args: any[]) => void;\r\nexport interface Logger {\r\n\tdebug: LogFn;\r\n\tinfo: LogFn;\r\n\twarn: LogFn;\r\n\terror: LogFn;\r\n\tlog: LogFn;\r\n\tclear: LogFn;\r\n}\r\n\r\nexport type QuestionSet<T = any> = ReadonlyArray<Record<string, any>> | Record<string, any>;\r\n"]}
package/package.json CHANGED
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "prodex",
3
- "version": "1.4.1",
3
+ "version": "1.4.4",
4
4
  "description": "Unified Project Indexer & Dependency Extractor for Laravel + React + Node stacks.",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "prodex": "./bin/prodex.js"
8
8
  },
9
9
  "main": "./dist/index.js",
10
- "types": "./dist/index.d.ts",
11
10
  "files": [
12
11
  "dist/",
13
12
  "bin/",
@@ -27,7 +26,8 @@
27
26
  "scripts": {
28
27
  "build": "tsc",
29
28
  "dev": "tsc --watch",
30
- "prepare": "npm run build",
29
+ "gen:schema": "node schema/generate.js",
30
+ "prepare": "npm run build && npm run gen:schema",
31
31
  "d:w": "nodemon --watch dist --delay 500ms --exec node --inspect-brk dist/debug.js"
32
32
  },
33
33
  "engines": {
@@ -38,6 +38,7 @@
38
38
  "devDependencies": {
39
39
  "@types/node": "^24.9.2",
40
40
  "nodemon": "^3.1.10",
41
+ "ts-json-schema-generator": "^2.4.0",
41
42
  "typescript": "^5.9.3"
42
43
  },
43
44
  "dependencies": {
@@ -45,6 +46,7 @@
45
46
  "fast-glob": "^3.3.3",
46
47
  "inquirer": "^12.10.0",
47
48
  "micromatch": "^4.0.8",
48
- "sade": "^1.8.1"
49
+ "sade": "^1.8.1",
50
+ "source-map-support": "^0.5.21"
49
51
  }
50
52
  }