prodex 1.4.4 → 1.4.5

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 (85) hide show
  1. package/dist/cli/cli-input.js +0 -1
  2. package/dist/cli/init.js +0 -1
  3. package/dist/cli/picker.js +0 -1
  4. package/dist/cli/summary.js +0 -1
  5. package/dist/constants/cache-keys.js +0 -1
  6. package/dist/constants/config.js +0 -1
  7. package/dist/constants/default-config.js +0 -1
  8. package/dist/constants/flags.js +0 -1
  9. package/dist/constants/index.js +0 -1
  10. package/dist/constants/render-constants.js +0 -1
  11. package/dist/core/combine.js +0 -1
  12. package/dist/core/dependency.js +0 -1
  13. package/dist/core/helpers.js +0 -1
  14. package/dist/core/managers/cache.js +0 -1
  15. package/dist/core/managers/config.js +19 -18
  16. package/dist/core/output.js +0 -1
  17. package/dist/core/renderers.js +0 -1
  18. package/dist/debug.js +2 -2
  19. package/dist/index.js +0 -1
  20. package/dist/lib/logger.js +0 -1
  21. package/dist/lib/polyfills.js +0 -1
  22. package/dist/lib/prompt.js +0 -1
  23. package/dist/lib/questions.js +0 -1
  24. package/dist/lib/utils.js +0 -1
  25. package/dist/resolvers/js/extract-imports.js +0 -1
  26. package/dist/resolvers/js/js-resolver.js +0 -1
  27. package/dist/resolvers/js/resolve-alias.js +0 -1
  28. package/dist/resolvers/php/bindings.js +0 -1
  29. package/dist/resolvers/php/extract-imports.js +0 -1
  30. package/dist/resolvers/php/php-resolver.js +0 -1
  31. package/dist/resolvers/php/psr4.js +0 -1
  32. package/dist/shared/collections.js +0 -1
  33. package/dist/shared/index.js +0 -1
  34. package/dist/shared/io.js +0 -1
  35. package/dist/shared/patterns.js +0 -1
  36. package/dist/store.js +0 -1
  37. package/dist/types/cli.types.js +0 -1
  38. package/dist/types/config.types.js +0 -1
  39. package/dist/types/core.types.js +0 -1
  40. package/dist/types/index.js +0 -1
  41. package/dist/types/resolver.types.js +0 -1
  42. package/dist/types/utils.types.js +0 -1
  43. package/package.json +1 -1
  44. package/dist/cli/cli-input.js.map +0 -1
  45. package/dist/cli/init.js.map +0 -1
  46. package/dist/cli/picker.js.map +0 -1
  47. package/dist/cli/summary.js.map +0 -1
  48. package/dist/constants/cache-keys.js.map +0 -1
  49. package/dist/constants/config.js.map +0 -1
  50. package/dist/constants/default-config.js.map +0 -1
  51. package/dist/constants/flags.js.map +0 -1
  52. package/dist/constants/index.js.map +0 -1
  53. package/dist/constants/render-constants.js.map +0 -1
  54. package/dist/core/combine.js.map +0 -1
  55. package/dist/core/dependency.js.map +0 -1
  56. package/dist/core/helpers.js.map +0 -1
  57. package/dist/core/managers/cache.js.map +0 -1
  58. package/dist/core/managers/config.js.map +0 -1
  59. package/dist/core/output.js.map +0 -1
  60. package/dist/core/renderers.js.map +0 -1
  61. package/dist/debug.js.map +0 -1
  62. package/dist/index.js.map +0 -1
  63. package/dist/lib/logger.js.map +0 -1
  64. package/dist/lib/polyfills.js.map +0 -1
  65. package/dist/lib/prompt.js.map +0 -1
  66. package/dist/lib/questions.js.map +0 -1
  67. package/dist/lib/utils.js.map +0 -1
  68. package/dist/resolvers/js/extract-imports.js.map +0 -1
  69. package/dist/resolvers/js/js-resolver.js.map +0 -1
  70. package/dist/resolvers/js/resolve-alias.js.map +0 -1
  71. package/dist/resolvers/php/bindings.js.map +0 -1
  72. package/dist/resolvers/php/extract-imports.js.map +0 -1
  73. package/dist/resolvers/php/php-resolver.js.map +0 -1
  74. package/dist/resolvers/php/psr4.js.map +0 -1
  75. package/dist/shared/collections.js.map +0 -1
  76. package/dist/shared/index.js.map +0 -1
  77. package/dist/shared/io.js.map +0 -1
  78. package/dist/shared/patterns.js.map +0 -1
  79. package/dist/store.js.map +0 -1
  80. package/dist/types/cli.types.js.map +0 -1
  81. package/dist/types/config.types.js.map +0 -1
  82. package/dist/types/core.types.js.map +0 -1
  83. package/dist/types/index.js.map +0 -1
  84. package/dist/types/resolver.types.js.map +0 -1
  85. package/dist/types/utils.types.js.map +0 -1
@@ -103,4 +103,3 @@ function validateArgs(parsed, warnings, errors) {
103
103
  process.exit(1);
104
104
  }
105
105
  }
106
- //# sourceMappingURL=cli-input.js.map
package/dist/cli/init.js CHANGED
@@ -19,4 +19,3 @@ async function initProdex() {
19
19
  console.log(`✅ Created ${dest}`);
20
20
  console.log("💡 Globs supported everywhere (include, exclude, priority).");
21
21
  }
22
- //# sourceMappingURL=init.js.map
@@ -81,4 +81,3 @@ async function getFilesAtDepth(depth, cfg, scanCache) {
81
81
  logger_1.logger.debug(`[picker] depth=${depth} found=${files.length}`);
82
82
  return files;
83
83
  }
84
- //# sourceMappingURL=picker.js.map
@@ -30,4 +30,3 @@ function entrySummary(entries) {
30
30
  if (entries?.length)
31
31
  logger_1.logger.log(result);
32
32
  }
33
- //# sourceMappingURL=summary.js.map
@@ -9,4 +9,3 @@ exports.CACHE_KEYS = {
9
9
  PHP_BINDINGS: "php:bindings",
10
10
  PHP_FILECACHE: "php:fileCache",
11
11
  };
12
- //# sourceMappingURL=cache-keys.js.map
@@ -25,4 +25,3 @@ exports.SUFFIX = "trace";
25
25
  * - Filters out invalid or unusable characters for Fast-Glob.
26
26
  */
27
27
  exports.VALID_GLOB_CHARS = /^[\w\-@./*?|!{}\[\]^$()+]+$/;
28
- //# sourceMappingURL=config.js.map
@@ -41,4 +41,3 @@ exports.DEFAULT_PRODEX_CONFIG = {
41
41
  },
42
42
  },
43
43
  };
44
- //# sourceMappingURL=default-config.js.map
@@ -77,4 +77,3 @@ ${Object.entries(exports.FLAG_MAP)
77
77
  .map(([k, v]) => ` --${k}${v.short ? ` | -${v.short}` : ""}\t${v.description}`)
78
78
  .join("\n")}
79
79
  `;
80
- //# sourceMappingURL=flags.js.map
@@ -18,4 +18,3 @@ __exportStar(require("./cache-keys"), exports);
18
18
  __exportStar(require("./default-config"), exports);
19
19
  __exportStar(require("./render-constants"), exports);
20
20
  __exportStar(require("./config"), exports);
21
- //# sourceMappingURL=index.js.map
@@ -22,4 +22,3 @@ exports.TEXT_HEADERS = {
22
22
  regionEnd: "##endregion",
23
23
  };
24
24
  exports.MD_FOOTER = ["\n---", "*Generated with [Prodex](https://github.com/emxhive/prodex) — Codebase decoded.*", `<!-- PRODEx v${package_json_1.default.version} | ${new Date().toISOString()} -->`].join("\n");
25
- //# sourceMappingURL=render-constants.js.map
@@ -54,4 +54,3 @@ function persistAliases() {
54
54
  config_1.ConfigManager.persist({ resolve: { aliases } });
55
55
  }
56
56
  }
57
- //# sourceMappingURL=combine.js.map
@@ -73,4 +73,3 @@ async function applyIncludes(cfg, files) {
73
73
  logger_1.logger.debug("APPLY_include", _2j(scan));
74
74
  return (0, collections_1.unique)([...files, ...scan.files]);
75
75
  }
76
- //# sourceMappingURL=dependency.js.map
@@ -83,4 +83,3 @@ async function globScan(patterns, opts) {
83
83
  logger_1.logger.debug("globScan →", _2j(files));
84
84
  return { files };
85
85
  }
86
- //# sourceMappingURL=helpers.js.map
@@ -51,4 +51,3 @@ class CacheManager {
51
51
  }
52
52
  }
53
53
  exports.CacheManager = CacheManager;
54
- //# sourceMappingURL=cache.js.map
@@ -65,25 +65,27 @@ class ConfigManager {
65
65
  return cfg;
66
66
  }
67
67
  static applyShortcuts(cfg, flags) {
68
- const shortcut = cfg.shortcuts[flags.shortcut];
69
- const noFlagIncludes = (0, utils_1.ArrisEmpty)(flags.include);
70
- const noFlagExcludes = (0, utils_1.ArrisEmpty)(flags.exclude);
71
- const noFlagFiles = (0, utils_1.ArrisEmpty)(flags.files);
72
- const handleCut = (shortcutSrc, childKey, configSrc, noFlags) => {
73
- //shortcut.resolve
74
- if (shortcutSrc) {
75
- //shortcut.resolve.include
76
- if (shortcutSrc?.[childKey]) {
77
- if (noFlags)
78
- configSrc[childKey] = shortcutSrc[childKey];
79
- else
80
- configSrc[childKey] = [...flags[childKey], ...shortcutSrc[childKey]];
81
- }
68
+ const shortcut = cfg.shortcuts?.[flags.shortcut];
69
+ if (!shortcut)
70
+ return cfg;
71
+ const mergeOrReplace = (key, target) => {
72
+ const flagValues = (flags[key] || []);
73
+ const hasFlags = !(0, utils_1.ArrisEmpty)(flagValues);
74
+ let values = shortcut[key];
75
+ if (!values && !hasFlags) {
76
+ target[key] = [];
77
+ return;
82
78
  }
79
+ if (!values)
80
+ values = [];
81
+ target[key] = hasFlags ? [...flagValues, ...values] : values;
83
82
  };
84
- handleCut(shortcut, "include", cfg.resolve, noFlagIncludes);
85
- handleCut(shortcut, "exclude", cfg.resolve, noFlagExcludes);
86
- handleCut(shortcut, "files", cfg.entry, noFlagFiles);
83
+ // include / exclude live in cfg.resolve
84
+ mergeOrReplace("include", cfg.resolve);
85
+ mergeOrReplace("exclude", cfg.resolve);
86
+ // files live in cfg.entry
87
+ mergeOrReplace("files", cfg.entry);
88
+ // name override
87
89
  if (shortcut.prefix)
88
90
  cfg.name = shortcut.prefix;
89
91
  return cfg;
@@ -133,4 +135,3 @@ function deepMerge(base, patch) {
133
135
  function isPlainObject(x) {
134
136
  return x && typeof x === "object" && !Array.isArray(x);
135
137
  }
136
- //# sourceMappingURL=config.js.map
@@ -46,4 +46,3 @@ async function produceOutput({ name, files, cfg, showUi }) {
46
46
  fs_1.default.writeFileSync(outputPath, content, "utf8");
47
47
  return outputPath;
48
48
  }
49
- //# sourceMappingURL=output.js.map
@@ -41,4 +41,3 @@ function renderTxt(p) {
41
41
  const code = (0, io_1.readFileSafe)(p);
42
42
  return ["##==== path: " + relPath + " ====", "##region " + relPath, code, "##endregion", ""].join("\n");
43
43
  }
44
- //# sourceMappingURL=renderers.js.map
package/dist/debug.js CHANGED
@@ -6,10 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const index_1 = __importDefault(require("./index"));
7
7
  require("source-map-support/register");
8
8
  (async () => {
9
- const mockArgs = ["node", "prodex", "@web", "-f", "**/(dashboard|accounts).tsx", "-cd"];
9
+ const mockArgs = ["node", "prodex", "@web", "-cd"];
10
10
  process.argv = mockArgs;
11
+ //"-f", "**/(dashboard|accounts).tsx",
11
12
  console.log("🧩 Debug runner starting...");
12
13
  await (0, index_1.default)();
13
14
  console.log("🧩 Debug runner done.");
14
15
  })();
15
- //# sourceMappingURL=debug.js.map
package/dist/index.js CHANGED
@@ -53,4 +53,3 @@ async function startProdex(args = process.argv) {
53
53
  await Promise.resolve().then(() => __importStar(require("./lib/polyfills")));
54
54
  await (0, combine_1.runCombine)({ cfg: config, opts });
55
55
  }
56
- //# sourceMappingURL=index.js.map
@@ -40,4 +40,3 @@ exports.logger = {
40
40
  },
41
41
  clear: () => console.clear(),
42
42
  };
43
- //# sourceMappingURL=logger.js.map
@@ -15,4 +15,3 @@ if (!String.prototype.clean) {
15
15
  };
16
16
  }
17
17
  globalThis._2j = (obj) => util_1.default.inspect(obj, { colors: true, depth: null, breakLength: 150, compact: 3 });
18
- //# sourceMappingURL=polyfills.js.map
@@ -32,4 +32,3 @@ async function prompt(questions, fallback) {
32
32
  return fallback ?? null;
33
33
  }
34
34
  }
35
- //# sourceMappingURL=prompt.js.map
@@ -26,4 +26,3 @@ const PICK_ENTRIES_QUESTION = (choices, depth) => [
26
26
  },
27
27
  ];
28
28
  exports.PICK_ENTRIES_QUESTION = PICK_ENTRIES_QUESTION;
29
- //# sourceMappingURL=questions.js.map
package/dist/lib/utils.js CHANGED
@@ -44,4 +44,3 @@ function ArrisEmpty(arr) {
44
44
  function toJson(obj) {
45
45
  return JSON.stringify(obj, null, 4);
46
46
  }
47
- //# sourceMappingURL=utils.js.map
@@ -43,4 +43,3 @@ function fallbackRegex(code) {
43
43
  }
44
44
  return matches;
45
45
  }
46
- //# sourceMappingURL=extract-imports.js.map
@@ -129,4 +129,3 @@ async function getImportsCached(filePath, code) {
129
129
  cache_1.CacheManager.set(JS_IMPORTS, filePath, set);
130
130
  return set;
131
131
  }
132
- //# sourceMappingURL=js-resolver.js.map
@@ -58,4 +58,3 @@ function resolveMatches(matches, remainder) {
58
58
  return "";
59
59
  return dSplit[0].replace(/\\/g, "/");
60
60
  }
61
- //# sourceMappingURL=resolve-alias.js.map
@@ -41,4 +41,3 @@ function loadLaravelBindings(root) {
41
41
  cache_1.CacheManager.set(cache_keys_1.CACHE_KEYS.PHP_BINDINGS, root, bindings);
42
42
  return bindings;
43
43
  }
44
- //# sourceMappingURL=bindings.js.map
@@ -47,4 +47,3 @@ function expandGroupedUses(raw) {
47
47
  }
48
48
  return out;
49
49
  }
50
- //# sourceMappingURL=extract-imports.js.map
@@ -127,4 +127,3 @@ async function tryResolvePhpFile(imp, fromFile, psr4) {
127
127
  cache_1.CacheManager.set(constants_1.CACHE_KEYS.PHP_FILECACHE, key, resolved);
128
128
  return resolved;
129
129
  }
130
- //# sourceMappingURL=php-resolver.js.map
@@ -37,4 +37,3 @@ function resolvePsr4(root) {
37
37
  return {};
38
38
  }
39
39
  }
40
- //# sourceMappingURL=psr4.js.map
@@ -31,4 +31,3 @@ 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
@@ -17,4 +17,3 @@ 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
package/dist/shared/io.js CHANGED
@@ -49,4 +49,3 @@ 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
@@ -29,4 +29,3 @@ function makeExcludeMatcher(patterns = []) {
29
29
  const mm = micromatch_1.default.matcher(patterns);
30
30
  return (s) => mm(String(s).replace(/\\/g, "/"));
31
31
  }
32
- //# sourceMappingURL=patterns.js.map
package/dist/store.js CHANGED
@@ -13,4 +13,3 @@ 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
@@ -10,4 +10,3 @@
10
10
  * [--inc=<globs>] [--exc=<globs>]
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- //# sourceMappingURL=cli.types.js.map
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=config.types.js.map
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=core.types.js.map
@@ -19,4 +19,3 @@ __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
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=resolver.types.js.map
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=utils.types.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prodex",
3
- "version": "1.4.4",
3
+ "version": "1.4.5",
4
4
  "description": "Unified Project Indexer & Dependency Extractor for Laravel + React + Node stacks.",
5
5
  "type": "commonjs",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-input.js","sourceRoot":"","sources":["../../src/cli/cli-input.ts"],"names":[],"mappings":"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","sourcesContent":["import sade from \"sade\";\nimport path from \"path\";\nimport pkg from \"../../package.json\";\nimport fs from \"fs\";\nimport { FLAG_MAP } from \"../constants/flags\";\nimport type { ParsedInput } from \"../types\";\n\n/**\n * Unified CLI parser powered by Sade and FLAG_MAP.\n * Returns { root, flags, warnings, errors }.\n */\nexport function parseCliInput(argv: string[] = process.argv) {\n\tif (argv.includes(\"-v\") || argv.includes(\"--version\")) {\n\t\tconsole.log(`prodex v${pkg.version}`);\n\t\tprocess.exit(0);\n\t}\n\n\tconst program = sade(\"prodex [root]\");\n\tregisterFlags(program);\n\n\tlet parsed: ParsedInput = { rootArg: \"\", root: undefined, flags: {} };\n\n\tprogram.action((root: string | undefined, opts: Record<string, any>) => {\n\t\tlet lroot= root;\n\t\tconst cwd = process.cwd();\n\t\tif(root?.startsWith(\"@\")){\n\t\t\topts.shortcut= root.slice(1).trim();\n\t\t\tlroot= undefined;\n\t\t}\n\t\tparsed = {\n\t\t\trootArg: lroot,\n\t\t\troot: lroot ? path.resolve(cwd, lroot) : cwd,\n\t\t\tflags: { ...opts },\n\t\t};\n\t});\n\n\tprogram.parse(argv);\n\n\tconst warnings: string[] = [];\n\tconst errors: string[] = [];\n\n\tparsed.flags = normalizeFlags(parsed.flags, warnings, errors);\n\tvalidateArgs(parsed, warnings, errors);\n\n\treturn { ...parsed, warnings, errors };\n}\n\nfunction registerFlags(program: ReturnType<typeof sade>) {\n\tfor (const [key, meta] of Object.entries(FLAG_MAP)) {\n\t\tconst short = meta.short ? `-${meta.short}, ` : \"\";\n\t\tconst long = `--${key}`;\n\t\tconst desc = meta.description;\n\t\tconst defaultVal = meta.type === \"boolean\" ? false : undefined;\n\t\tprogram.option(`${short}${long}`, desc, defaultVal);\n\t}\n}\n\n/** Convert flag values to correct types based on FLAG_MAP metadata. */\nfunction normalizeFlags(flags: Record<string, any>, warnings: string[], errors: string[]) {\n\tfor (const [key, meta] of Object.entries(FLAG_MAP)) {\n\t\tconst raw = flags[key];\n\t\tif (raw === undefined) continue;\n\n\t\tswitch (meta.type) {\n\t\t\tcase \"number\": {\n\t\t\t\tconst num = Number(raw);\n\t\t\t\tif (Number.isNaN(num)) errors.push(`Flag --${key} expected a number but got \"${raw}\"`);\n\t\t\t\telse flags[key] = num;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"list\": {\n\t\t\t\tflags[key] = String(raw)\n\t\t\t\t\t.split(\",\")\n\t\t\t\t\t.map((v) => v.trim())\n\t\t\t\t\t.filter(Boolean);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tif (meta.type === \"string\") flags[key] = String(raw);\n\t\t\t}\n\t\t}\n\t}\n\treturn flags;\n}\n\n/** Validate path argument and report unrecognized flags. */\nfunction validateArgs(parsed: ParsedInput, warnings: string[], errors: string[]) {\n\tconst { rootArg } = parsed;\n\n\tif (rootArg) {\n\t\tif (!fs.existsSync(parsed.root)) {\n\t\t\terrors.push(`Invalid path argument: \"${rootArg}\" does not exist.`);\n\t\t} else if (!fs.statSync(parsed.root).isDirectory()) {\n\t\t\terrors.push(`Path argument \"${rootArg}\" is not a directory.`);\n\t\t}\n\t}\n\n\tconst unknown = parsed.flags?._ || [];\n\tif (unknown.length) {\n\t\twarnings.push(`Unrecognized arguments detected [${unknown.join(\", \")}]- They were ignored.`);\n\t}\n\n\tif (warnings.length) console.warn(\"Warnings:\", warnings);\n\tif (errors.length) {\n\t\tfor (const err of errors) console.error(err);\n\t\tprocess.exit(1);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":";;;;;AAKA,gCAaC;AAlBD,4CAAoB;AACpB,gDAAwB;AACxB,gEAAoE;AACpE,wCAAsC;AAE/B,KAAK,UAAU,UAAU;IAC/B,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAEzD,MAAM,IAAI,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;IAErD,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO;IACR,CAAC;IAED,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAA,cAAM,EAAC,sCAAqB,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;AAC5E,CAAC","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { DEFAULT_PRODEX_CONFIG } from \"../constants/default-config\";\nimport { toJson } from \"../lib/utils\";\n\nexport async function initProdex() {\n\tconsole.log(\"đŸĒ„ Prodex Init — Configuration Wizard (v3\");\n\n\tconst dest = path.join(process.cwd(), \"prodex.json\");\n\n\tif (fs.existsSync(dest)) {\n\t\tconsole.error(\"prodex.json already exists. Delete or modify it manually.\\n\");\n\t\treturn;\n\t}\n\n\tfs.writeFileSync(dest, toJson(DEFAULT_PRODEX_CONFIG) + \"\\n\", \"utf8\");\n\tconsole.log(`✅ Created ${dest}`);\n\tconsole.log(\"💡 Globs supported everywhere (include, exclude, priority).\");\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"picker.js","sourceRoot":"","sources":["../../src/cli/picker.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport inquirer from \"inquirer\";\nimport { walk, orderByPriority } from \"../core/helpers\";\nimport { rel } from \"../shared/io\";\nimport { globScan } from \"../core/helpers\";\nimport { unique } from \"../shared/collections\";\nimport { logger } from \"../lib/logger\";\nimport { prompt } from \"../lib/prompt\";\nimport type { QuestionSet, ProdexConfig } from \"../types\";\nimport { PICK_ENTRIES_QUESTION } from \"../lib/questions\";\n\n/**\n * Interactive entry picker for Prodex.\n * Handles depth-based scanning, caching, and priority ordering.\n */\nexport async function pickEntries(cfg: ProdexConfig) {\n\tconst {\n\t\troot,\n\t\tentry: {\n\t\t\tfiles,\n\t\t\tui: { roots = [], priority = [], scanDepth },\n\t\t},\n\t} = cfg;\n\n\tlet depth = scanDepth;\n\tconst entryPatterns = files || [];\n\tconst priorities = [...entryPatterns, ...priority];\n\n\t// 1ī¸âƒŖ Resolve pre-defined entry patterns\n\tconst resolvedEntries = (await globScan(entryPatterns, { cwd: root })).files;\n\tlet selected = [...resolvedEntries];\n\n\t// cache: depth → files[]\n\tconst scanCache = new Map<number, string[]>();\n\n\tfor (;;) {\n\t\tconst files = await getFilesAtDepth(depth, cfg, scanCache);\n\n\t\t// Merge resolved entries with current scan results\n\t\tconst combined = unique([...resolvedEntries, ...files]);\n\t\tconst sorted = orderByPriority(combined, priorities);\n\n\t\t// Build UI selection list\n\t\tconst choices = sorted.map((f) => ({\n\t\t\tname: rel(f, root),\n\t\t\tvalue: f,\n\t\t\tchecked: selected.includes(f),\n\t\t}));\n\n\t\tif (depth < scanDepth + 5) {\n\t\t\tchoices.push(new inquirer.Separator());\n\t\t\tchoices.push({ name: \"đŸ”Ŋ Load more (go deeper)\", value: \"__loadmore\" });\n\t\t}\n\n\t\t// 🧠 Use unified prompt wrapper\n\t\tconst answers = await prompt(PICK_ENTRIES_QUESTION(choices, depth), { picks: [] });\n\t\tif (!answers) return unique(selected);\n\n\t\tconst { picks } = answers;\n\n\t\tif (picks.includes(\"__loadmore\")) {\n\t\t\tdepth++;\n\t\t\tselected = picks.filter((p) => p !== \"__loadmore\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tselected = picks.filter((p) => p !== \"__loadmore\");\n\t\tbreak;\n\t}\n\n\treturn unique(selected);\n}\n\n/**\n * Depth-based directory scanner with caching.\n */\nasync function getFilesAtDepth(depth: number, cfg: ProdexConfig, scanCache: Map<number, string[]>) {\n\tconst baseDirs = cfg.entry.ui.roots || [];\n\tif (scanCache.has(depth)) {\n\t\tlogger.debug(`[picker] cache hit → depth=${depth}`);\n\t\treturn scanCache.get(depth)!;\n\t}\n\n\tlogger.debug(`[picker] scanning → depth=${depth}`);\n\n\tconst files: string[] = [];\n\tconst effectiveCfg = { ...cfg, scanDepth: depth };\n\n\tfor (const base of baseDirs) {\n\t\tconst full = path.join(cfg.root, base);\n\t\tif (!fs.existsSync(full)) continue;\n\t\tfor (const f of walk(full, effectiveCfg, 0)) files.push(f.norm());\n\t}\n\n\tscanCache.set(depth, files);\n\tlogger.debug(`[picker] depth=${depth} found=${files.length}`);\n\treturn files;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/cli/summary.ts"],"names":[],"mappings":";;AAMA,gCAMC;AAED,oCAQC;AAED,oCAIC;AA5BD,0CAAuC;AACvC,qCAAmC;AACnC,oCAA+C;AAE/C,IAAI,MAAM,CAAC;AACX,IAAI,KAAK,CAAC;AACV,SAAgB,UAAU,CAAC,GAAG,EAAE,MAAM;IACrC,eAAM,CAAC,KAAK,CAAC;8BACgB,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI;8BAC5B,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI;CACzD,CAAC,CAAC;IACF,eAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,YAAY;IAC3B,MAAM,GAAG,IAAA,iBAAS,GAAE,CAAC;IACrB,KAAK,GAAG,IAAA,gBAAQ,GAAE,CAAC;IAEnB,eAAM,CAAC,GAAG,CAAC,wBAAwB,IAAI,IAAI,EAAE,CAAC,kBAAkB,EAAE,+BAA+B,CAAC,CAAC;IACnG,gCAAgC;IAChC,eAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACrD,eAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,YAAY,CAAC,OAAiB;IAC7C,IAAI,MAAM,GAAG,kBAAkB,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,MAAM,IAAI,QAAQ,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,EAAE,MAAM;QAAE,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import { logger } from \"../lib/logger\";\nimport { rel } from \"../shared/io\";\nimport { getConfig, getFlags } from \"../store\";\n\nlet CONFIG;\nlet FLAGS;\nexport function endSummary(out, result) {\n\tlogger.debug(`🧩 Summary:\n â€ĸ Unique imports expected: ${result?.stats?.expected.size}\n â€ĸ Unique imports resolved: ${result?.stats?.resolved.size}\n`);\n\tlogger.log(`✅ ${out.norm()}`);\n}\n\nexport function introSummary() {\n\tCONFIG = getConfig();\n\tFLAGS = getFlags();\n\n\tlogger.log(`------- PRODEx RUN @ ${new Date().toLocaleTimeString()} — Codebase decoded -------\\n`);\n\t// Log parse results for testing\n\tlogger.debug(\"🧩 Parsed CLI input:\", _2j({ FLAGS }));\n\tlogger.debug(\"Final merged config:\", _2j(CONFIG));\n}\n\nexport function entrySummary(entries: string[]) {\n\tlet result = \"📋 You selected:\";\n\tfor (const e of entries) result += \"\\n -\" + rel(e);\n\tif (entries?.length) logger.log(result);\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache-keys.js","sourceRoot":"","sources":["../../src/constants/cache-keys.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;IACzB,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;CACrB,CAAC","sourcesContent":["export const CACHE_KEYS = {\r\n\tALIASES: \"aliases\",\r\n\tJS_IMPORTS: \"js:imports\",\r\n\tJS_STATS: \"js:stats\",\r\n\tPHP_PSR4: \"php:psr4\",\r\n\tPHP_BINDINGS: \"php:bindings\",\r\n\tPHP_FILECACHE: \"php:fileCache\",\r\n} as const;\r\n\r\nexport type CacheNamespace = (typeof CACHE_KEYS)[keyof typeof CACHE_KEYS];\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/constants/config.ts"],"names":[],"mappings":";;;AAAA,6DAA+D;AAC/D,gEAAkE;AAErD,QAAA,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5D,QAAA,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,QAAA,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9F,QAAA,OAAO,GAAG,OAAO,CAAC;AAElB,QAAA,SAAS,GAAG;IACxB,MAAM,EAAE,gCAAiB;IACzB,KAAK,EAAE,8BAAgB;IACvB,MAAM,EAAE,8BAAgB;IACxB,OAAO,EAAE,8BAAgB;IACzB,KAAK,EAAE,8BAAgB;CACvB,CAAC;AAEW,QAAA,aAAa,GAAG,CAAC,oBAAoB,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AAErE,QAAA,MAAM,GAAG,OAAO,CAAC;AAE9B;;;;;;;GAOG;AACU,QAAA,gBAAgB,GAAG,6BAA6B,CAAC","sourcesContent":["import { resolveJsImports } from \"../resolvers/js/js-resolver\";\nimport { resolvePhpImports } from \"../resolvers/php/php-resolver\";\n\nexport const CODE_EXTS = [\".js\", \".mjs\", \".ts\", \".tsx\", \".d.ts\", \".php\"];\nexport const BASE_EXTS = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"];\nexport const REAL_EXTS = new Set<string>([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".d.ts\", \".json\"]);\nexport const DTS_EXT = \".d.ts\";\n\nexport const RESOLVERS = {\n\t\".php\": resolvePhpImports,\n\t\".ts\": resolveJsImports,\n\t\".tsx\": resolveJsImports,\n\t\".d.ts\": resolveJsImports,\n\t\".js\": resolveJsImports,\n};\n\nexport const GLOBAL_IGNORE = [\"**/node_modules/**\", \"**/vendor/**\", \"**/dist/**\"];\n\nexport const SUFFIX = \"trace\";\n\n/**\n * Normalize and sanitize pattern fields.\n * - Always returns an array.\n * - Accepts string or string[].\n * - Splits comma-separated strings.\n * - Trims and removes empty elements.\n * - Filters out invalid or unusable characters for Fast-Glob.\n */\nexport const VALID_GLOB_CHARS = /^[\\w\\-@./*?|!{}\\[\\]^$()+]+$/;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/constants/default-config.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,qBAAqB,GAAqB;IACtD,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,iFAAiF;IAC1F,MAAM,EAAE;QACP,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,IAAI;KACZ;IACD,KAAK,EAAE;QACN,KAAK,EAAE,EAAE;QACT,EAAE,EAAE;YACH,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC;YAC3C,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC,mBAAmB,EAAE,UAAU,CAAC;SAC3C;KACD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,CAAC,WAAW,CAAC;QACtB,OAAO,EAAE;YACR,GAAG,EAAE,cAAc;SACnB;QACD,OAAO,EAAE,CAAC,iBAAiB,EAAE,YAAY,EAAE,qBAAqB,CAAC;QACjE,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,GAAG;KACV;IAED,SAAS,EAAE;QACV,SAAS,EAAE;YACV,KAAK,EAAE,CAAC,kBAAkB,CAAC;YAC3B,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;SACpC;QAED,GAAG,EAAE;YACJ,KAAK,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;SACnC;KACD;CACD,CAAC","sourcesContent":["import type { ProdexConfigFile } from \"../types/config.types\";\n\n/**\n * Default configuration for Prodex.\n * Conforms strictly to ProdexConfig for full type safety.\n */\nexport const DEFAULT_PRODEX_CONFIG: ProdexConfigFile = {\n\tversion: 3.1,\n\t$schema: \"https://raw.githubusercontent.com/emxhive/prodex/main/schema/prodex.schema.json\",\n\toutput: {\n\t\tdir: \"prodex\",\n\t\tversioned: true,\n\t\tprefix: \"combined\",\n\t\tformat: \"md\",\n\t},\n\tentry: {\n\t\tfiles: [],\n\t\tui: {\n\t\t\troots: [\"app\", \"routes\", \"resources/js/**\"],\n\t\t\tscanDepth: 2,\n\t\t\tpriority: [\"**/routes/web.php\", \"**/app.*\"],\n\t\t},\n\t},\n\tresolve: {\n\t\tinclude: [\"**/*.d.ts\"],\n\t\taliases: {\n\t\t\t\"@\": \"resources/js\",\n\t\t},\n\t\texclude: [\"node_modules/**\", \"@shadcn/**\", \"**/components/ui/**\"],\n\t\tdepth: 10,\n\t\tlimit: 200,\n\t},\n\n\tshortcuts: {\n\t\tdashboard: {\n\t\t\tfiles: [\"**/dashboard.tsx\"],\n\t\t\tinclude: [\"**.app.tsx\", \"**/*.d.ts\"],\n\t\t},\n\n\t\tweb: {\n\t\t\tfiles: [\"**/web.php\", \"**/api.php\"],\n\t\t},\n\t},\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/constants/flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProdexConfig } from \"../types\";\r\n\r\nexport type FlagType = \"boolean\" | \"string\" | \"number\" | \"list\";\r\nexport type FlagKey = keyof typeof FLAG_MAP;\r\n\r\nexport const FLAG_MAP = {\r\n\ttxt: {\r\n\t\tshort: \"t\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Output as .txt instead of .md.\",\r\n\t\tapply: (cfg: ProdexConfig, v: boolean) => (cfg.output.format = v ? \"txt\" : \"md\"),\r\n\t},\r\n\tname: {\r\n\t\tshort: \"n\",\r\n\t\ttype: \"string\",\r\n\t\tdescription: \"Custom output filename (without extension).\",\r\n\t\tapply: (cfg: ProdexConfig, v: string) => (cfg.name = v),\r\n\t},\r\n\tlimit: {\r\n\t\tshort: \"l\",\r\n\t\ttype: \"number\",\r\n\t\tdescription: \"Override traversal limit.\",\r\n\t\tapply: (cfg: ProdexConfig, v: number) => (cfg.resolve.limit = v),\r\n\t},\r\n\tinclude: {\r\n\t\tshort: \"i\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Comma-separated include globs.\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.resolve.include = v),\r\n\t},\r\n\texclude: {\r\n\t\tshort: \"x\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Comma-separated exclude globs.\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.resolve.exclude = v),\r\n\t},\r\n\tfiles: {\r\n\t\tshort: \"f\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Entry files (comma-separated).\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.entry.files = v),\r\n\t},\r\n\tci: {\r\n\t\tshort: \"c\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Headless (non-interactive) mode.\",\r\n\t\tapply: () => {},\r\n\t},\r\n\tdebug: {\r\n\t\tshort: \"d\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Enable debug logs.\",\r\n\t\tapply: () => {},\r\n\t},\r\n\r\n\tshortcut: {\r\n\tshort: \"a\",\r\n\ttype: \"string\",\r\n\tdescription: \"Apply a config shortcut by name.\",\r\n\tapply: () => {},\r\n},\r\n\thelp: {\r\n\t\tshort: \"h\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Show CLI help and exit.\",\r\n\t\tapply: () => {},\r\n\t},\r\n} as const;\r\n\r\n// Reverse lookup for short aliases\r\nexport const FLAG_SHORT_MAP = Object.entries(FLAG_MAP).reduce((acc, [k, v]) => {\r\n\t//@ts-ignore\r\n\tif (v.short) acc[v.short] = k;\r\n\treturn acc;\r\n}, {} as Record<string, FlagKey>);\r\n\r\nexport const CLI_USAGE = `\r\nUsage: prodex [options]\r\n\r\n${Object.entries(FLAG_MAP)\r\n\t.map(([k, v]) => ` --${k}${v.short ? ` | -${v.short}` : \"\"}\\t${v.description}`)\r\n\t.join(\"\\n\")}\r\n`;\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC;AACjC,qDAAmC;AACnC,2CAAyB","sourcesContent":["export * from \"./cache-keys\";\r\nexport * from \"./default-config\";\r\nexport * from \"./render-constants\";\r\nexport * from \"./config\";\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-constants.js","sourceRoot":"","sources":["../../src/constants/render-constants.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAqC;AAExB,QAAA,QAAQ,GAAG;IACvB,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,IAAI;CACb,CAAC;AAEW,QAAA,YAAY,GAAG;IAC3B,GAAG,EAAE,4BAA4B;IACjC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO;IACrC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE;IACnC,SAAS,EAAE,aAAa;CACxB,CAAC;AAEW,QAAA,SAAS,GAAG,CAAC,OAAO,EAAE,kFAAkF,EAAE,gBAAgB,sBAAG,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import pkg from \"../../package.json\";\n\nexport const LANG_MAP = {\n\t\"\": \"js\",\n\t\".mjs\": \"js\",\n\t\".jsx\": \"jsx\",\n\t\".ts\": \"ts\",\n\t\".tsx\": \"tsx\",\n\t\".php\": \"php\",\n\t\".json\": \"json\",\n\t\".d.ts\": \"ts\",\n};\n\nexport const TEXT_HEADERS = {\n\ttoc: \"##==== Combined Scope ====\",\n\tpath: (p) => `##==== path: ${p} ====`,\n\tregionStart: (p) => `##region ${p}`,\n\tregionEnd: \"##endregion\",\n};\n\nexport const MD_FOOTER = [\"\\n---\", \"*Generated with [Prodex](https://github.com/emxhive/prodex) — Codebase decoded.*\", `<!-- PRODEx v${pkg.version} | ${new Date().toISOString()} -->`].join(\"\\n\");\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"combine.js","sourceRoot":"","sources":["../../src/core/combine.ts"],"names":[],"mappings":";;AAYA,gCAqBC;AAjCD,0CAA4C;AAC5C,4CAAwE;AACxE,wDAAqD;AACrD,4CAAgD;AAChD,8CAAkD;AAClD,0CAAuC;AAEvC,6CAA0D;AAC1D,uCAAqC;AACrC,uCAAwC;AACxC,qCAAyC;AAElC,KAAK,UAAU,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,EAAiB;IAC5D,IAAA,sBAAY,GAAE,CAAC;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,MAAM,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;IAEtB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,eAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,GAAG,MAAM,IAAA,wBAAW,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,MAAM,IAAA,0BAAa,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,eAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAErF,MAAM,QAAQ,GAAG,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAA,sBAAa,EAAC,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvG,cAAc,EAAE,CAAC;IACjB,IAAA,oBAAU,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAe,EAAE,GAAiB;IAC/D,MAAM,EACL,IAAI,EACJ,KAAK,EAAE,EAAE,KAAK,EAAE,EAChB,OAAO,EAAE,EAAE,OAAO,EAAE,GACpB,GAAG,GAAG,CAAC;IAER,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,MAAM,IAAA,kBAAQ,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,CAAC;SAAM,CAAC;QACP,OAAO,MAAM,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACtB,MAAM,OAAO,GAAG,oBAAY,CAAC,IAAI,CAAC,uBAAU,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,sBAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;AACF,CAAC","sourcesContent":["import { pickEntries } from \"../cli/picker\";\nimport { endSummary, entrySummary, introSummary } from \"../cli/summary\";\nimport { CACHE_KEYS } from \"../constants/cache-keys\";\nimport { CacheManager } from \"./managers/cache\";\nimport { ConfigManager } from \"./managers/config\";\nimport { logger } from \"../lib/logger\";\nimport { CombineParams, ProdexConfig } from \"../types\";\nimport { applyIncludes, followChain } from \"./dependency\";\nimport { globScan } from \"./helpers\";\nimport { smartNaming } from \"./helpers\";\nimport { produceOutput } from \"./output\";\n\nexport async function runCombine({ cfg, opts }: CombineParams) {\n\tintroSummary();\n\n\tconst { showUi, cliName } = opts;\n\tlet entries = (await resolveEntries(showUi, cfg)) ?? [];\n\n\tentrySummary(entries);\n\n\tlet result;\n\tif (!entries.length) logger.info(\"No entries found\");\n\n\tif (entries.length) result = await followChain(entries, cfg);\n\n\tconst withinclude = await applyIncludes(cfg, result?.files ?? []);\n\tif (!withinclude.length) return logger.info(\"No Includes found. Exiting process...\");\n\n\tconst autoName = smartNaming(entries);\n\tconst outputPath = await produceOutput({ name: cliName ?? autoName, files: withinclude, cfg, showUi });\n\n\tpersistAliases();\n\tendSummary(outputPath, result);\n}\n\nasync function resolveEntries(showUi: boolean, cfg: ProdexConfig): Promise<string[]> {\n\tconst {\n\t\troot,\n\t\tentry: { files },\n\t\tresolve: { include },\n\t} = cfg;\n\n\tif (!showUi) {\n\t\tlogger.info(\"CI Mode\");\n\t\tif (!files?.length) {\n\t\t\tlogger.warn(\"No entry files defined and UI mode is disabled.\");\n\t\t\tif (!include.length) process.exit(1);\n\t\t\tlogger.info(\"Applying Includes\");\n\t\t}\n\t\treturn (await globScan(files, { cwd: root })).files;\n\t} else {\n\t\treturn await pickEntries(cfg);\n\t}\n}\n\n/**\n * 🧩 Persist discovered aliases (if any)\n */\nfunction persistAliases() {\n\tconst aliases = CacheManager.dump(CACHE_KEYS.ALIASES);\n\tif (Object.keys(aliases).length) {\n\t\tConfigManager.persist({ resolve: { aliases } });\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/core/dependency.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { CODE_EXTS, RESOLVERS } from \"../constants/config\";\r\nimport { globScan } from \"./helpers\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { unique } from \"../shared/collections\";\r\nimport type { ProdexConfig, ResolverParams, ResolverResult } from \"../types\";\r\n\r\n/**\r\n * 🧩 followChain()\r\n * Traverses all dependencies starting from the given entry files.\r\n * Uses language-specific resolvers (JS / PHP) under the hood.\r\n */\r\nexport async function followChain(entryFiles: string[], cfg: ProdexConfig) {\r\n\tconst limit = cfg.resolve.limit;\r\n\tconst resolverDepth = cfg.resolve.depth;\r\n\r\n\tlogger.debug(\"🧩 Following dependency chain...\");\r\n\r\n\tconst visited = new Set<string>();\r\n\tconst all: string[] = [];\r\n\tconst expected = new Set<string>();\r\n\tconst resolved = new Set<string>();\r\n\r\n\tfor (const f of entryFiles) {\r\n\t\tif (visited.has(f)) continue;\r\n\t\tall.push(f);\r\n\r\n\t\tconst ext = path.extname(f);\r\n\t\tif (!CODE_EXTS.includes(ext)) continue;\r\n\r\n\t\tconst resolver = RESOLVERS[ext];\r\n\t\tif (!resolver) continue;\r\n\r\n\t\tconst params: ResolverParams = {\r\n\t\t\tfilePath: f,\r\n\t\t\tvisited,\r\n\t\t\tdepth: 0,\r\n\t\t\tmaxDepth: resolverDepth,\r\n\t\t};\r\n\r\n\t\tlet result: ResolverResult | null = null;\r\n\t\ttry {\r\n\t\t\tresult = await resolver(params);\r\n\t\t} catch (err: any) {\r\n\t\t\tlogger.warn(`âš ī¸ Resolver failed for ${f}:`, err.message || err);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!result) continue;\r\n\r\n\t\tconst { files, stats } = result;\r\n\t\tall.push(...files);\r\n\t\tstats.expected.forEach((x) => expected.add(x));\r\n\t\tstats.resolved.forEach((x) => resolved.add(x));\r\n\r\n\t\tif (limit && all.length >= limit) {\r\n\t\t\tlogger.warn(\"âš ī¸ Limit reached:\", limit);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tfiles: unique(all),\r\n\t\tstats: { expected, resolved },\r\n\t};\r\n}\r\n\r\n/**\r\n * 🧩 applyIncludes()\r\n * Scans and appends additional files defined in config.resolve.include.\r\n */\r\nexport async function applyIncludes(cfg: ProdexConfig, files: string[]) {\r\n\tconst { resolve, root } = cfg;\r\n\tconst scan = await globScan(resolve.include, { cwd: root });\r\n\tlogger.debug(\"APPLY_include\", _2j(scan));\r\n\treturn unique([...files, ...scan.files]);\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport micromatch from \"micromatch\";\nimport { ProdexConfig } from \"../types\";\nimport { isExcluded, rel, unique } from \"../shared\";\n\nimport path from \"path\";\nimport fg, { Options } from \"fast-glob\";\n\nimport { GLOBAL_IGNORE } from \"../constants\";\nimport { logger } from \"../lib/logger\";\n\n/**\n * Recursive walker that respects glob exclude.\n * Returns all files under the given directory tree.\n */\nexport function* walk(dir, cfg: ProdexConfig, depth = 0) {\n\tconst {\n\t\troot,\n\t\tentry: {\n\t\t\tui: { scanDepth },\n\t\t},\n\t\tresolve: { exclude },\n\t} = cfg;\n\n\tif (depth > scanDepth) return;\n\n\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\tfor (const e of entries) {\n\t\tconst full = path.join(dir, e.name);\n\n\t\tif (e.isDirectory()) {\n\t\t\t// Skip excluded directories entirely\n\t\t\tconst relPath = rel(full, root);\n\t\t\tif (isExcluded(relPath, exclude)) continue;\n\t\t\tyield* walk(full, cfg, depth + 1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (e.isFile()) {\n\t\t\tconst relPath = rel(full, root);\n\t\t\tif (isExcluded(relPath, exclude)) continue;\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\nexport function orderByPriority(files, priorityList = []) {\n\tif (!priorityList.length) return files;\n\tconst prioritized = [];\n\tconst normal = [];\n\n\tfor (const f of files) {\n\t\tconst normalized = f.norm().toLowerCase();\n\t\tif (priorityList.some((p) => micromatch.isMatch(normalized, p.toLowerCase()))) prioritized.push(f);\n\t\telse normal.push(f);\n\t}\n\n\treturn unique([...prioritized, ...normal]);\n}\nexport function smartNaming(entries: string[]): string {\n\tconst names = unique(entries.map((f) => path.basename(f, path.extname(f))));\n\tif (names.length === 1) return names[0];\n\tif (names.length === 2) return `${names[0]}-${names[1]}`;\n\tif (names.length > 2) return `${names[0]}-and-${names.length - 1}more`;\n\treturn \"prodex\";\n}\n\n\n\n/**\n * Safe micromatch.scan wrapper (compatible with micromatch v4 & v5)\n */\n\nexport async function globScan(patterns: string[], opts: Options) {\n\tconst { absolute = true, cwd = process.cwd() } = opts;\n\n\tif (!patterns?.length) return { files: [] };\n\tconst files = (\n\t\tawait fg(patterns, {\n\t\t\tcwd,\n\t\t\textglob: true,\n\t\t\tdot: true,\n\t\t\tonlyFiles: true,\n\t\t\tignore: GLOBAL_IGNORE,\n\t\t\tabsolute,\n\t\t})\n\t).map((f) => path.resolve(f));\n\tlogger.debug(\"globScan →\", _2j(files));\n\n\treturn { files };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/managers/cache.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAE1C;;;;;;;GAOG;AACH,MAAa,YAAY;IAChB,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE9D,gDAAgD;IACxC,MAAM,CAAC,EAAE,CAAC,EAAU;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;IAC/B,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,GAAG,CAAU,EAAU,EAAE,GAAW,EAAE,GAAM;QAClD,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,eAAM,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CAAU,EAAU,EAAE,GAAW;QAC1C,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,wDAAwD;IACxD,MAAM,CAAC,KAAK,CAAC,EAAW;QACvB,IAAI,EAAE,EAAE,CAAC;YACR,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACpB,eAAM,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,eAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,IAAI,CAAC,EAAU;QACrB,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAClE,OAAO,OAAO,CAAC;IAChB,CAAC;;AAzCF,oCA0CC","sourcesContent":["import { logger } from \"../../lib/logger\";\r\n\r\n/**\r\n * 🧩 CacheManager\r\n * Unified in-memory registry for all runtime maps.\r\n *\r\n * - Namespaced storage (e.g., \"aliases\", \"stats\", \"resolver\")\r\n * - Purely in-memory (no file I/O)\r\n * - Static API for symmetry with ConfigManager\r\n */\r\nexport class CacheManager {\r\n\tprivate static registry = new Map<string, Map<string, any>>();\r\n\r\n\t/** Ensure namespace map exists and return it */\r\n\tprivate static ns(ns: string): Map<string, any> {\r\n\t\tif (!this.registry.has(ns)) this.registry.set(ns, new Map());\r\n\t\treturn this.registry.get(ns)!;\r\n\t}\r\n\r\n\t/** Set or update a cached entry */\r\n\tstatic set<T = any>(ns: string, key: string, val: T): void {\r\n\t\tthis.ns(ns).set(key, val);\r\n\t\tlogger.debug(`🧩 [cache:${ns}] set ${key} → ${String(val)}`);\r\n\t}\r\n\r\n\t/** Retrieve a cached entry */\r\n\tstatic get<T = any>(ns: string, key: string): T | undefined {\r\n\t\treturn this.ns(ns).get(key);\r\n\t}\r\n\r\n\t/** Remove all entries from one namespace or from all */\r\n\tstatic clear(ns?: string): void {\r\n\t\tif (ns) {\r\n\t\t\tthis.ns(ns).clear();\r\n\t\t\tlogger.debug(`🧩 [cache:${ns}] cleared`);\r\n\t\t} else {\r\n\t\t\tthis.registry.forEach((m) => m.clear());\r\n\t\t\tlogger.debug(\"🧩 [cache] cleared all namespaces\");\r\n\t\t}\r\n\t}\r\n\r\n\t/** Export a namespace as a plain object (for persistence or inspection) */\r\n\tstatic dump(ns: string): Record<string, any> {\r\n\t\treturn Object.fromEntries(this.ns(ns).entries());\r\n\t}\r\n\r\n\t/** Return count of entries per namespace */\r\n\tstatic stats(): Record<string, number> {\r\n\t\tconst summary: Record<string, number> = {};\r\n\t\tfor (const [name, map] of this.registry) summary[name] = map.size;\r\n\t\treturn summary;\r\n\t}\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/managers/config.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { DEFAULT_PRODEX_CONFIG } from \"../../constants/default-config\";\r\nimport { ArrisEmpty, normalizePatterns, toJson } from \"../../lib/utils\";\r\nimport { FLAG_MAP } from \"../../constants/flags\";\r\nimport type { ProdexConfig, ProdexFlags, ProdexConfigFile, DeepPartial, ProdexShortcut } from \"../../types\";\r\nimport { getConfig } from \"../../store\";\r\n\r\n/**\r\n * 🧩 ConfigManager\r\n * Unified loader, merger, and flag applier.\r\n */\r\nexport class ConfigManager {\r\n\tstatic rawFile: ProdexConfigFile | null = null;\r\n\r\n\tstatic load(cwd: string): ProdexConfigFile {\r\n\t\tconst file = path.join(cwd, \"prodex.json\");\r\n\t\tif (!fs.existsSync(file)) return DEFAULT_PRODEX_CONFIG;\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(fs.readFileSync(file, \"utf8\"));\r\n\t\t\tthis.rawFile = parsed; // <-- SAVE RAW COPY\r\n\t\t\treturn parsed;\r\n\t\t} catch {\r\n\t\t\tconsole.warn(\"âš ī¸ Invalid prodex.json — using defaults.\");\r\n\t\t\treturn DEFAULT_PRODEX_CONFIG;\r\n\t\t}\r\n\t}\r\n\r\n\tstatic merge(user: ProdexConfigFile, flags?: Partial<ProdexFlags>, cwd = process.cwd()): ProdexConfig {\r\n\t\tconst merged: ProdexConfig = {\r\n\t\t\t// ...rest,\r\n\t\t\t...user,\r\n\t\t\toutput: { ...DEFAULT_PRODEX_CONFIG.output, ...user.output },\r\n\t\t\tentry: {\r\n\t\t\t\t...DEFAULT_PRODEX_CONFIG.entry,\r\n\t\t\t\t...user.entry,\r\n\t\t\t\tui: { ...DEFAULT_PRODEX_CONFIG.entry.ui, ...user.entry?.ui },\r\n\t\t\t},\r\n\t\t\tresolve: { ...DEFAULT_PRODEX_CONFIG.resolve, ...user.resolve },\r\n\t\t\troot: cwd,\r\n\t\t\tname: flags?.name ?? null,\r\n\t\t} as unknown as ProdexConfig;\r\n\r\n\t\tthis.applyFlags(merged, flags);\r\n\t\treturn this.normalize(merged);\r\n\t}\r\n\r\n\tstatic applyFlags(cfg: ProdexConfig, flags?: Partial<ProdexFlags>) {\r\n\t\tif (!flags) return cfg;\r\n\r\n\t\tfor (const [key, val] of Object.entries(flags)) {\r\n\t\t\tif (val === undefined) continue;\r\n\t\t\tconst def = FLAG_MAP[key];\r\n\t\t\tif (def?.apply) def.apply(cfg, val);\r\n\t\t}\r\n\r\n\t\tconst hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;\r\n\t\tif (hasFiles && !flags.include) cfg.resolve.include = [];\r\n\t\tif (flags.shortcut && cfg.shortcuts && cfg.shortcuts[flags.shortcut]) return this.applyShortcuts(cfg, flags);\r\n\r\n\t\treturn cfg;\r\n\t}\r\n\r\n\tstatic applyShortcuts(cfg: ProdexConfig, flags: Partial<ProdexFlags>): ProdexConfig {\r\n\t\tconst shortcut = cfg.shortcuts[flags.shortcut];\r\n\t\tconst noFlagIncludes = ArrisEmpty(flags.include);\r\n\t\tconst noFlagExcludes = ArrisEmpty(flags.exclude);\r\n\t\tconst noFlagFiles = ArrisEmpty(flags.files);\r\n\r\n\t\tconst handleCut = (shortcutSrc, childKey, configSrc, noFlags) => {\r\n\t\t\t//shortcut.resolve\r\n\t\t\tif (shortcutSrc) {\r\n\t\t\t\t//shortcut.resolve.include\r\n\t\t\t\tif (shortcutSrc?.[childKey]) {\r\n\t\t\t\t\tif (noFlags) configSrc[childKey] = shortcutSrc[childKey];\r\n\t\t\t\t\telse configSrc[childKey] = [...flags[childKey], ...shortcutSrc[childKey]];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\thandleCut(shortcut, \"include\", cfg.resolve, noFlagIncludes);\r\n\r\n\t\thandleCut(shortcut, \"exclude\", cfg.resolve, noFlagExcludes);\r\n\r\n\t\thandleCut(shortcut, \"files\", cfg.entry, noFlagFiles);\r\n\t\tif (shortcut.prefix) cfg.name = shortcut.prefix;\r\n\r\n\t\treturn cfg;\r\n\t}\r\n\r\n\tstatic normalize(cfg: ProdexConfig): ProdexConfig {\r\n\t\tcfg.entry.files = normalizePatterns(cfg.entry.files);\r\n\t\t//TODO: Is there a need?\r\n\t\t// cfg.resolve.include = normalizePatterns(cfg.resolve.include);\r\n\t\t// cfg.resolve.exclude = normalizePatterns(cfg.resolve.exclude);\r\n\t\treturn cfg;\r\n\t}\r\n\r\n\tstatic persist(partial: DeepPartial<ProdexConfigFile>): void {\r\n\t\tconst cfg = getConfig();\r\n\t\tconst dest = path.join(cfg.root, \"prodex.json\");\r\n\r\n\t\t// Start from the raw config, never the merged runtime version\r\n\t\tconst base: ProdexConfigFile = ConfigManager.rawFile\r\n\t\t\t? JSON.parse(JSON.stringify(ConfigManager.rawFile)) // deep clone to avoid mutation\r\n\t\t\t: {};\r\n\r\n\t\t// Apply only the partial updates (aliases, etc.)\r\n\t\tconst patched = deepMerge(base, partial);\r\n\r\n\t\ttry {\r\n\t\t\tfs.writeFileSync(dest, toJson(patched) + \"\\n\", \"utf8\");\r\n\t\t} catch (err: any) {\r\n\t\t\tconsole.warn(\"âš ī¸ Failed to persist config:\", err?.message || err);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction deepMerge<T extends Record<string, any>>(base: T, patch: DeepPartial<T>): T {\r\n\tif (!patch) return base;\r\n\tconst out: any = Array.isArray(base) ? [...base] : { ...base };\r\n\tfor (const [k, v] of Object.entries(patch)) {\r\n\t\tif (v === undefined) continue;\r\n\t\tconst bv = (base as any)[k];\r\n\t\tif (Array.isArray(v)) out[k] = [...v]; // overwrite arrays\r\n\t\telse if (isPlainObject(v) && isPlainObject(bv)) out[k] = deepMerge(bv, v);\r\n\t\telse out[k] = v;\r\n\t}\r\n\treturn out;\r\n}\r\nfunction isPlainObject(x: any): x is Record<string, any> {\r\n\treturn x && typeof x === \"object\" && !Array.isArray(x);\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":";;;;;AAgBA,sCAkCC;AAlDD,4CAAoB;AACpB,gDAAwB;AACxB,0CAAuC;AACvC,2CAAiE;AACjE,0CAAuC;AAEvC,wCAA8C;AAC9C,gDAAwD;AACxD,oEAA0D;AAC1D,gDAA6C;AAE7C;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAgB;IAC7E,MAAM,EACL,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAClC,GAAG,GAAG,CAAC;IAER,CAAC;IAED,8BAA8B;IAC9B,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,IAAA,eAAM,EAAyB,gCAAoB,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,UAAU;YAAE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxD,CAAC;IAED,oCAAoC;IACpC,UAAU,GAAG,GAAG,UAAU,IAAI,eAAM,EAAE,CAAC;IACvC,IAAI,SAAS;QAAE,UAAU,GAAG,GAAG,UAAU,IAAI,IAAA,sBAAc,GAAE,EAAE,CAAC;IAEhE,8BAA8B;IAC9B,IAAI,CAAC;QACJ,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACR,eAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,gCAAgC;IAChC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,MAAM,EAAE,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAM,EAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAK,EAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,4BAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExK,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO,UAAU,CAAC;AACnB,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { prompt } from \"../lib/prompt\";\r\nimport { renderMd, renderTxt, tocMd, tocTxt } from \"./renderers\";\r\nimport { logger } from \"../lib/logger\";\r\nimport type { OutputParams } from \"../types\";\r\nimport { shortTimestamp } from \"../lib/utils\";\r\nimport { OUTPUT_NAME_QUESTION } from \"../lib/questions\";\r\nimport { MD_FOOTER } from \"../constants/render-constants\";\r\nimport { SUFFIX } from \"../constants/config\";\r\n\r\n/**\r\n * 🧩 produceOutput()\r\n * Handles rendering and writing of the final trace file.\r\n * Receives resolved files and configuration from combine.ts.\r\n */\r\nexport async function produceOutput({ name, files, cfg, showUi }: OutputParams): Promise<string> {\r\n\tconst {\r\n\t\toutput: { format, versioned, dir },\r\n\t} = cfg;\r\n\r\n\t;\r\n\r\n\t// 1ī¸âƒŖ Determine base filename\r\n\tlet outputBase = name;\r\n\tif (showUi) {\r\n\t\tconst result = await prompt<{ outputBase: string }>(OUTPUT_NAME_QUESTION);\r\n\t\tif (result?.outputBase) outputBase = result.outputBase;\r\n\t}\r\n\r\n\t// 2ī¸âƒŖ Prefix timestamp if versioned\r\n\toutputBase = `${outputBase}-${SUFFIX}`;\r\n\tif (versioned) outputBase = `${outputBase}_${shortTimestamp()}`;\r\n\r\n\t// 3ī¸âƒŖ Ensure output directory\r\n\ttry {\r\n\t\tfs.mkdirSync(dir, { recursive: true });\r\n\t} catch {\r\n\t\tlogger.warn(\"Could not create dir directory:\", dir);\r\n\t}\r\n\r\n\t// 4ī¸âƒŖ Prepare and write content\r\n\tconst outputPath = path.join(dir, `${outputBase}.${format}`);\r\n\r\n\tconst sorted = [...files].sort((a, b) => a.localeCompare(b));\r\n\tconst content = format === \"txt\" ? [tocTxt(sorted), ...sorted.map(renderTxt)].join(\"\") : [tocMd(sorted), ...sorted.map((f, i) => renderMd(f, i)), MD_FOOTER].join(\"\\n\");\r\n\r\n\tfs.writeFileSync(outputPath, content, \"utf8\");\r\n\r\n\treturn outputPath;\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/core/renderers.ts"],"names":[],"mappings":";;;;;AAQA,sBAKC;AAKD,4BAOC;AAKD,wBAGC;AAED,8BAIC;AAvCD,gDAAwB;AACxB,qCAA4C;AAC5C,qCAAmC;AACnC,oEAAyD;AAEzD;;GAEG;AACH,SAAgB,KAAK,CAAC,KAAK;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAA,QAAG,EAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,UAAU,EAAE,4BAA4B,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC;IAClB,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,2BAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAEvC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,GAAG,4BAA4B,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnI,CAAC;AAED;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAK;IAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,4BAA4B,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACnG,CAAC;AAED,SAAgB,SAAS,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,eAAe,GAAG,OAAO,GAAG,OAAO,EAAE,WAAW,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzG,CAAC","sourcesContent":["import path from \"path\";\nimport { readFileSafe } from \"../shared/io\";\nimport { rel } from \"../shared/io\";\nimport { LANG_MAP } from \"../constants/render-constants\";\n\n/**\n * Generate Markdown Table of Contents with anchors\n */\nexport function tocMd(files) {\n\tconst count = files.length;\n\tconst items = files.map((f, i) => `- [${rel(f)}](#${i + 1})`).join(\"\\n\");\n\n\treturn [\"# Index \", `\\nIncluded Source Files (${count})`, items, \"\", \"---\"].join(\"\\n\");\n}\n\n/**\n * Render each file section with invisible anchors\n */\nexport function renderMd(p, i) {\n\tconst rp = rel(p);\n\tconst ext = path.extname(p).toLowerCase();\n\tconst lang = LANG_MAP[ext] || \"txt\";\n\tconst code = readFileSafe(p).trimEnd();\n\n\treturn [`---\\n#### ${i + 1}`, \"\\n\", \"` File: \" + rp + \"` [↑ Back to top](#index)\", \"\", \"```\" + lang, code, \"```\", \"\"].join(\"\\n\");\n}\n\n/**\n * TXT version (unchanged)\n */\nexport function tocTxt(files) {\n\tconst sorted = [...files].sort((a, b) => a.localeCompare(b));\n\treturn [\"##==== Combined Scope ====\", ...sorted.map((f) => \"## - \" + rel(f))].join(\"\\n\") + \"\\n\\n\";\n}\n\nexport function renderTxt(p) {\n\tconst relPath = rel(p);\n\tconst code = readFileSafe(p);\n\treturn [\"##==== path: \" + relPath + \" ====\", \"##region \" + relPath, code, \"##endregion\", \"\"].join(\"\\n\");\n}\n"]}
package/dist/debug.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":";;;;;AAAA,oDAAkC;AAClC,uCAAqC;AAGrC,CAAC,KAAK,IAAI,EAAE;IACX,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACxF,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC;IAGxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,MAAM,IAAA,eAAW,GAAE,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACtC,CAAC,CAAC,EAAE,CAAC","sourcesContent":["import startProdex from \"./index\";\r\nimport \"source-map-support/register\";\r\n\r\n\r\n(async () => {\r\n\tconst mockArgs = [\"node\", \"prodex\", \"@web\", \"-f\", \"**/(dashboard|accounts).tsx\", \"-cd\"];\r\n\tprocess.argv = mockArgs;\r\n\r\n\r\n\tconsole.log(\"🧩 Debug runner starting...\");\r\n\tawait startProdex();\r\n\tconsole.log(\"🧩 Debug runner done.\");\r\n})();\r\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,8BAeC;AArBD,qCAAwC;AACxC,+CAAgD;AAChD,mDAAuD;AACvD,mCAAqC;AACrC,4CAA4C;AAE7B,KAAK,UAAU,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAA,iBAAU,GAAE,CAAC;IAE/C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAA,yBAAa,EAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,sBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,sBAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAA,kBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG;QACZ,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,IAAI,CAAC,KAAK,CAAC,QAAQ;QAChG,OAAO,EAAE,MAAM,CAAC,IAAI;KACpB,CAAC;IAEF,wDAAa,iBAAiB,GAAC,CAAC;IAChC,MAAM,IAAA,oBAAU,EAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC","sourcesContent":["import { initProdex } from \"./cli/init\";\nimport { parseCliInput } from \"./cli/cli-input\";\nimport { ConfigManager } from \"./core/managers/config\";\nimport { setGlobals } from \"./store\";\nimport { runCombine } from \"./core/combine\";\n\nexport default async function startProdex(args = process.argv) {\n\tif (args.includes(\"init\")) return initProdex();\n\n\tconst { root, flags } = parseCliInput(args);\n\tconst userConfig = ConfigManager.load(root);\n\tconst config = ConfigManager.merge(userConfig, flags, root);\n\tsetGlobals(config, flags);\n\n\tconst opts = {\n\t\tshowUi: !flags.ci && !flags?.files?.length && config?.entry?.ui?.enablePicker && !flags.shortcut,\n\t\tcliName: config.name,\n\t};\n\n\tawait import(\"./lib/polyfills\");\n\tawait runCombine({ cfg: config, opts });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AAGpC,IAAI,KAAK,GAAQ,IAAI,CAAC;AACtB,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,SAAS,WAAW;IACnB,IAAI,KAAK;QAAE,OAAO;IAClB,KAAK,GAAG,IAAA,gBAAQ,GAAE,IAAI,EAAE,CAAC;IACzB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACtB,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AACzB,CAAC;AAEY,QAAA,MAAM,GAAW;IAC7B,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACd,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACd,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACb,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;CAC5B,CAAC","sourcesContent":["import { getFlags } from \"../store\";\r\nimport { Logger } from \"../types\";\r\n\r\nlet FLAGS: any = null;\r\nlet DEBUG = false;\r\nlet SILENT = false;\r\n\r\nfunction ensureFlags() {\r\n\tif (FLAGS) return;\r\n\tFLAGS = getFlags() || {};\r\n\tDEBUG = !!FLAGS.debug;\r\n\tSILENT = !!FLAGS.silent;\r\n}\r\n\r\nexport const logger: Logger = {\r\n\tdebug: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (DEBUG && !SILENT) console.log(\"\\nđŸĒļ [debug]\", ...a);\r\n\t},\r\n\tinfo: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.log(\"\\n📌 [info]\", ...a);\r\n\t},\r\n\twarn: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.warn(\"\\nâš ī¸ [warn]\", ...a);\r\n\t},\r\n\terror: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.error(\"\\nđŸ’Ĩ [error]\", ...a);\r\n\t},\r\n\tlog: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.log(\"\\n\", ...a);\r\n\t},\r\n\tclear: () => console.clear(),\r\n};\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"polyfills.js","sourceRoot":"","sources":["../../src/lib/polyfills.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC;AACH,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC;AACH,CAAC;AAED,UAAU,CAAC,GAAG,GAAG,CAAC,GAAQ,EAAU,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC","sourcesContent":["import util from \"util\";\r\n\r\nif (!String.prototype.norm) {\r\n\tString.prototype.norm = function () {\r\n\t\treturn this.replace(/\\\\/g, \"/\");\r\n\t};\r\n}\r\n\r\nif (!String.prototype.clean) {\r\n\tString.prototype.clean = function () {\r\n\t\treturn this.replace(/[<>:\\\"/\\\\|?*]+/g, \"_\");\r\n\t};\r\n}\r\n\r\nglobalThis._2j = (obj: any): string => util.inspect(obj, { colors: true, depth: null, breakLength: 150, compact: 3 });\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":";;;;;AAYA,wBAcC;AA1BD,wDAAgC;AAChC,qCAAkC;AAGlC;;;;;;;GAOG;AACI,KAAK,UAAU,MAAM,CAAU,SAAyB,EAAE,QAAY;IAC5E,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,CAAC,MAAM,kBAAQ,CAAC,MAAM,CAAI,SAAgB,CAAC,CAAM,CAAC;QAClE,OAAO,OAAO,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QACnB,IAAI,GAAG,EAAE,UAAU,EAAE,CAAC;YACrB,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YACnD,eAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,eAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,IAAI,IAAI,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import inquirer from \"inquirer\";\r\nimport { logger } from \"./logger\";\r\nimport type { QuestionSet } from \"../types\";\r\n\r\n/**\r\n * 🧩 prompt()\r\n * Unified and safe wrapper for inquirer.prompt()\r\n *\r\n * - Requires explicit `showUi` flag (no env auto-detection).\r\n * - Returns `null` or `fallback` on failure or disabled UI.\r\n * - Handles TTY errors and user cancellations gracefully.\r\n */\r\nexport async function prompt<T = any>(questions: QuestionSet<T>, fallback?: T): Promise<T | null> {\r\n\ttry {\r\n\t\tconst answers = (await inquirer.prompt<T>(questions as any)) as T;\r\n\t\treturn answers;\r\n\t} catch (err: any) {\r\n\t\tif (err?.isTtyError) {\r\n\t\t\tlogger.warn(\"Interactive prompts not supported (no TTY).\");\r\n\t\t} else if (/canceled|aborted/i.test(err?.message)) {\r\n\t\t\tlogger.warn(\"Prompt canceled by user.\");\r\n\t\t} else {\r\n\t\t\tlogger.error(\"Prompt failed:\", err.message || err);\r\n\t\t}\r\n\t\treturn fallback ?? null;\r\n\t}\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/lib/questions.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AAEH,2DAA2D;AAC9C,QAAA,oBAAoB,GAAwC;IACxE;QACC,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,uCAAuC;QAChD,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,UAAU;KAC7E;CACD,CAAC;AAEK,MAAM,qBAAqB,GAAG,CAAC,OAAc,EAAE,KAAa,EAAoC,EAAE,CAAC;IACzG;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,6BAA6B,KAAK,GAAG;QAC9C,OAAO;QACP,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE;KACZ;CACD,CAAC;AATW,QAAA,qBAAqB,yBAShC","sourcesContent":["import type { QuestionSet } from \"../types\";\r\n\r\n/**\r\n * 🧩 Centralized Inquirer question definitions.\r\n * Each export is a named, reusable question set.\r\n */\r\n\r\n/** Ask for the output filename (used in produceOutput). */\r\nexport const OUTPUT_NAME_QUESTION: QuestionSet<{ outputBase: string }> = [\r\n\t{\r\n\t\ttype: \"input\",\r\n\t\tname: \"outputBase\",\r\n\t\tmessage: \"Output file name (without extension):\",\r\n\t\tdefault: \"combined\",\r\n\t\tfilter: (v: string) => v.trim().replace(/[<>:\\\"/\\\\|?*]+/g, \"_\") || \"combined\",\r\n\t},\r\n];\r\n\r\nexport const PICK_ENTRIES_QUESTION = (choices: any[], depth: number): QuestionSet<{ picks: string[] }> => [\r\n\t{\r\n\t\ttype: \"checkbox\",\r\n\t\tname: \"picks\",\r\n\t\tmessage: `Select entry files (depth ${depth})`,\r\n\t\tchoices,\r\n\t\tloop: false,\r\n\t\tpageSize: 20,\r\n\t},\r\n];\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":";;AAGA,wCAQC;AAED,8CAqBC;AAGD,gCAEC;AACD,wBAEC;AA1CD,gDAAuD;AAEvD,6DAA6D;AAC7D,SAAgB,cAAc;IAC7B,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAyB;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,IAAI,GAAa,CAAC;IAElB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,GAAG;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,oBAAoB;SACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,yBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,GAAG,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAgB,UAAU,CAAC,GAAQ;IAClC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;AACvD,CAAC;AACD,SAAgB,MAAM,CAAC,GAAQ;IAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import { VALID_GLOB_CHARS } from \"../constants/config\";\r\n\r\n/** Compact YYMMDD-HHmm timestamp for versioned filenames. */\r\nexport function shortTimestamp(): string {\r\n\tconst d = new Date();\r\n\tconst yy = String(d.getFullYear()).slice(-2);\r\n\tconst MM = String(d.getMonth() + 1).padStart(2, \"0\");\r\n\tconst dd = String(d.getDate()).padStart(2, \"0\");\r\n\tconst hh = String(d.getHours()).padStart(2, \"0\");\r\n\tconst mm = String(d.getMinutes()).padStart(2, \"0\");\r\n\treturn `${yy}${MM}${dd}-${hh}${mm}`;\r\n}\r\n\r\nexport function normalizePatterns(input?: string | string[]): string[] {\r\n\tif (!input) return [];\r\n\r\n\tlet arr: string[];\r\n\r\n\tif (typeof input === \"string\") {\r\n\t\tarr = input.split(\",\").map((s) => s.trim());\r\n\t} else if (Array.isArray(input)) {\r\n\t\tarr = input.map((s) => (typeof s === \"string\" ? s.trim() : \"\"));\r\n\t} else {\r\n\t\treturn [];\r\n\t}\r\n\r\n\treturn arr\r\n\t\t.filter((s) => s.length > 0)\r\n\t\t.map((s) => s.replace(/\\\\/g, \"/\")) // normalize slashes\r\n\t\t.filter((s) => {\r\n\t\t\tconst valid = VALID_GLOB_CHARS.test(s);\r\n\t\t\tif (!valid) console.warn(`âš ī¸ Invalid glob pattern skipped: \"${s}\"`);\r\n\t\t\treturn valid;\r\n\t\t});\r\n}\r\n\r\n\r\nexport function ArrisEmpty(arr: any): boolean {\r\n\treturn !arr || Array.isArray(arr) && arr.length === 0;\r\n}\r\nexport function toJson(obj: any): string {\r\n\treturn JSON.stringify(obj, null, 4);\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-imports.js","sourceRoot":"","sources":["../../../src/resolvers/js/extract-imports.ts"],"names":[],"mappings":";;;;;AAKA,wCAuBC;AA5BD,2DAA6B;AAC7B,qDAA8C;AAE9C,IAAI,WAAW,GAAG,KAAK,CAAC;AAEjB,KAAK,UAAU,cAAc,CAAC,QAAQ,EAAE,IAAI;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,sBAAI,CAAC;QACX,WAAW,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,GAAG,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,CAAC,OAAO,CAAC,GAAG,IAAA,uBAAK,EAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,IAAI;IAC1B,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mCAAmC,EAAE,oCAAoC,EAAE,wCAAwC,CAAC,CAAC;IAE3K,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["import fs from \"fs/promises\";\r\nimport { init, parse } from \"es-module-lexer\";\r\n\r\nlet initialized = false;\r\n\r\nexport async function extractImports(filePath, code): Promise<Set<string>> {\r\n\tif (!initialized) {\r\n\t\tawait init;\r\n\t\tinitialized = true;\r\n\t}\r\n\r\n\tlet src = code;\r\n\tif (src == null) {\r\n\t\ttry {\r\n\t\t\tsrc = await fs.readFile(filePath, \"utf8\");\r\n\t\t} catch {\r\n\t\t\treturn new Set();\r\n\t\t}\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst [imports] = parse(src);\r\n\t\tconst out = new Set<string>();\r\n\t\tfor (const i of imports) if (i.n) out.add(i.n);\r\n\t\treturn out;\r\n\t} catch {\r\n\t\treturn fallbackRegex(src);\r\n\t}\r\n}\r\n\r\nfunction fallbackRegex(code) {\r\n\tconst patterns = [/import\\s+[^'\"]*['\"]([^'\"]+)['\"]/g, /import\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /export\\s+\\*\\s+from\\s+['\"]([^'\"]+)['\"]/g];\r\n\r\n\tconst matches = new Set<string>();\r\n\tfor (const r of patterns) {\r\n\t\tlet m;\r\n\t\twhile ((m = r.exec(code))) matches.add(m[1]);\r\n\t}\r\n\treturn matches;\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"js-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/js/js-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { extractImports } from \"./extract-imports\";\r\nimport { BASE_EXTS, DTS_EXT, REAL_EXTS } from \"../../constants/config\";\r\nimport { emptyResult, mergeStats, newStats, unique } from \"../../shared/collections\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport { getConfig } from \"../../store\";\r\nimport { resolveAliasPath } from \"./resolve-alias\"; // alias: config + cache + fast-glob\r\nimport type { ResolverParams, ResolverResult } from \"../../types\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport { CACHE_KEYS } from \"../../constants/cache-keys\";\r\nimport { isExcluded, readFileSafe, safeStatCached } from \"../../shared\";\r\nimport { setDiff } from \"../../shared\";\r\n\r\nconst { JS_STATS, JS_IMPORTS } = CACHE_KEYS;\r\n\r\nexport async function resolveJsImports({ filePath, visited = new Set(), depth = 0, maxDepth }: ResolverParams): Promise<ResolverResult> {\r\n\tconst limitDepth = maxDepth;\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\tconst {\r\n\t\troot: ROOT,\r\n\t\tresolve: { exclude: excludePatterns },\r\n\t} = getConfig();\r\n\r\n\tconst ext = path.extname(filePath).toLowerCase();\r\n\tconst isDts = ext === DTS_EXT;\r\n\tif (!BASE_EXTS.includes(ext) && !isDts) return emptyResult(visited);\r\n\r\n\tlet code = readFileSafe(filePath);\r\n\tif (!code) return emptyResult(visited);\r\n\r\n\t// Extract imports ---------------------------------------\r\n\tconst imports = await getImportsCached(filePath, code);\r\n\tif (!imports.size) return emptyResult(visited);\r\n\r\n\t// Trackers ----------------------------------------------\r\n\tconst stats = newStats();\r\n\tconst files: string[] = [];\r\n\r\n\t// Main resolution loop ----------------------------------\r\n\tfor (const imp of imports) {\r\n\t\t// skip bare packages (react, lodash, etc.)\r\n\t\tif (!imp.startsWith(\".\") && !imp.startsWith(\"/\") && !imp.startsWith(\"@\")) continue;\r\n\t\tif (isExcluded(imp, excludePatterns)) continue;\r\n\r\n\t\tlet base: string | null = null;\r\n\r\n\t\tif (imp.startsWith(\".\")) {\r\n\t\t\t// relative → like original resolver\r\n\t\t\tbase = path.resolve(path.dirname(filePath), imp);\r\n\t\t} else if (imp.startsWith(\"/\")) {\r\n\t\t\t// absolute path import → like original resolver\r\n\t\t\tbase = path.resolve(imp);\r\n\t\t} else {\r\n\t\t\t// alias (@...) → unified resolver (config + cache + glob)\r\n\t\t\tbase = await resolveAliasPath(imp, ROOT, getConfig());\r\n\t\t}\r\n\r\n\t\tif (!base) continue;\r\n\r\n\t\tconst absBase = path.resolve(base);\r\n\t\t// Exclusion check after alias resolution\r\n\t\tif (isExcluded(absBase, excludePatterns)) continue;\r\n\r\n\t\tconst resolvedPath = await tryResolveImport(absBase);\r\n\t\t// Exclusion check after final resolution\r\n\t\tif (isExcluded(resolvedPath, excludePatterns)) continue;\r\n\r\n\t\tstats.expected.add(absBase);\r\n\t\tif (!resolvedPath) continue;\r\n\r\n\t\tstats.resolved.add(absBase);\r\n\t\tfiles.push(resolvedPath);\r\n\r\n\t\t// Recursive traversal\r\n\t\tconst sub = await resolveJsImports({\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});\r\n\r\n\t\tfiles.push(...sub.files);\r\n\t\tmergeStats(stats, sub.stats);\r\n\t}\r\n\r\n\tconst uniqueFiles = unique(files);\r\n\tconst diff = setDiff(stats.expected, stats.resolved);\r\n\r\n\tlogger.debug(`đŸĒļ [js-resolver] ${filePath} → expected: ${stats.expected.size}, resolved: ${stats.resolved.size}`);\r\n\tif (diff.size) logger.debug([...diff], \"🔴 THE diff\");\r\n\r\n\treturn { files: uniqueFiles, visited, stats };\r\n}\r\n\r\n// ---------------------------------------------------------\r\n// tryResolveImport (pure)\r\n// ---------------------------------------------------------\r\nasync function tryResolveImport(basePath: string): Promise<string | null> {\r\n\tconst candidates: string[] = [];\r\n\r\n\tconst ext = path.extname(basePath).toLowerCase();\r\n\tif (ext && REAL_EXTS.has(ext)) {\r\n\t\tcandidates.push(basePath);\r\n\t} else {\r\n\t\tfor (const e of [...BASE_EXTS, DTS_EXT]) {\r\n\t\t\tcandidates.push(basePath + e);\r\n\t\t\tcandidates.push(path.join(basePath, \"index\" + e));\r\n\t\t}\r\n\t}\r\n\t// Run all stat checks in parallel\r\n\tconst results = await Promise.allSettled(\r\n\t\tcandidates.map(async (c) => {\r\n\t\t\tconst abs = path.resolve(c);\r\n\t\t\tconst st = await safeStatCached(JS_STATS, abs);\r\n\t\t\treturn st && st.isFile() ? abs : null;\r\n\t\t})\r\n\t);\r\n\r\n\t// Find the first fulfilled non-null result\r\n\tfor (const r of results) {\r\n\t\tif (r.status === \"fulfilled\" && r.value) return r.value;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\n// ---------------------------------------------------------\r\n// Cached stat + import scanners\r\n// ---------------------------------------------------------\r\n\r\nasync function getImportsCached(filePath: string, code: string): Promise<Set<string>> {\r\n\tconst cached = CacheManager.get(JS_IMPORTS, filePath);\r\n\tif (cached) return cached;\r\n\tconst set = await extractImports(filePath, code);\r\n\tCacheManager.set(JS_IMPORTS, filePath, set);\r\n\treturn set;\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-alias.js","sourceRoot":"","sources":["../../../src/resolvers/js/resolve-alias.ts"],"names":[],"mappings":";;;;;AAeA,4CAuCC;AAtDD,gDAAwB;AACxB,qDAAyD;AAEzD,+CAA6C;AAC7C,gDAA8C;AAC9C,yCAAmC;AAEnC;;;;;;;GAOG;AACI,KAAK,UAAU,gBAAgB,CAAC,SAAiB,EAAE,IAAY,EAAE,GAAiB;IACxF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAC/C,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAEzE,mCAAmC;IACnC,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,sBAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE9D,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,wCAAwC;IACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,iCAAiC;IAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,UAAU,CAAC,CAAC;IAE9F,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,kBAAQ,EAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,4BAA4B;QAC5B,IAAI,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,OAAO,GAAG,IAAA,YAAG,EAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,oBAAY,CAAC,GAAG,CAAC,sBAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,OAAiB,EAAE,SAAiB;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import path from \"path\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport type { ProdexConfig } from \"../../types\";\r\nimport { CACHE_KEYS } from \"../../constants\";\r\nimport { globScan } from \"../../core/helpers\";\r\nimport { rel } from \"../../shared\";\r\n\r\n/**\r\n * 🧩 resolveAliasPath()\r\n * Unifies alias lookup across config, cache, and fallback discovery.\r\n *\r\n * - Checks cfg.resolve.aliases first.\r\n * - Then cached aliases (from Cache Manager).\r\n * - If still unresolved, runs Fast-Glob to discover and cache new alias root.\r\n */\r\nexport async function resolveAliasPath(specifier: string, root: string, cfg: ProdexConfig): Promise<string | null> {\r\n\tif (!specifier.includes(\"/\")) return null;\r\n\r\n\tconst [aliasName, ...rest] = specifier.split(\"/\");\r\n\tconst remainder = rest.join(\"/\");\r\n\tconst knownAliases = cfg.resolve.aliases || {};\r\n\tconst aliasKey = aliasName.startsWith(\"@\") ? aliasName : `@${aliasName}`;\r\n\r\n\t// 1ī¸âƒŖ Check config-defined aliases\r\n\tif (knownAliases[aliasKey]) {\r\n\t\tconst relPart = remainder.replace(/^\\/+/, \"\");\r\n\t\treturn path.resolve(root, knownAliases[aliasKey], relPart);\r\n\t}\r\n\r\n\t// 2ī¸âƒŖ Check cached aliases\r\n\tconst cached = CacheManager.get(CACHE_KEYS.ALIASES, aliasKey);\r\n\r\n\tif (cached) {\r\n\t\tconst relPart = remainder.replace(/^\\/+/, \"\");\r\n\t\treturn path.resolve(root, cached, relPart);\r\n\t}\r\n\r\n\t// 3ī¸âƒŖ Fallback discovery with Fast-Glob\r\n\tconst stripped = remainder; // remove prefix before first '/'\r\n\tconst hasExt = /\\.[a-z0-9]+$/i.test(stripped);\r\n\tconst patterns = hasExt ? [`**/${stripped}`] : [`**/${stripped}.*`, `**/${stripped}/index.*`];\r\n\r\n\tconst { files: matches } = await globScan(patterns, { cwd: root });\r\n\r\n\tif (matches.length) {\r\n\t\tconst resolvedMatch = resolveMatches(matches, remainder);\r\n\t\t// .replace(/\\.[^/.]+$/, \"\")\r\n\t\tif (!resolvedMatch) return null;\r\n\t\tconst relPath = rel(resolvedMatch, cfg.root);\r\n\t\tCacheManager.set(CACHE_KEYS.ALIASES, aliasKey, relPath);\r\n\t\treturn relPath;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nfunction resolveMatches(matches: string[], remainder: string) {\r\n\tconst foundFile = matches[0].norm();\r\n\tconst dSplit = foundFile.split(remainder);\r\n\tif (dSplit.length < 2) return \"\";\r\n\treturn dSplit[0].replace(/\\\\/g, \"/\");\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../../src/resolvers/php/bindings.ts"],"names":[],"mappings":";;;;;AASA,kDAkCC;AA3CD,4CAAoB;AACpB,gDAAwB;AACxB,qDAAyD;AACzD,2DAAwD;AAExD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC/D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,YAAE;SACd,WAAW,CAAC,YAAY,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzC,4DAA4D;IAC5D,iEAAiE;IACjE,MAAM,EAAE,GAAG,uGAAuG,CAAC;IAEnH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACxB,CAAC;IACF,CAAC;IAED,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC;AACjB,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 * Scans app/Providers/*.php for `$this->app->bind()` / `singleton()` calls\r\n * and returns a map of Interface::class → Implementation::class (FQCN strings).\r\n */\r\nexport function loadLaravelBindings(root: string): Record<string, string> {\r\n\tconst cached = CacheManager.get(CACHE_KEYS.PHP_BINDINGS, root);\r\n\tif (cached) return cached;\r\n\r\n\tconst providersDir = path.join(root, \"app\", \"Providers\");\r\n\tconst bindings: Record<string, string> = {};\r\n\r\n\tif (!fs.existsSync(providersDir)) {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_BINDINGS, root, bindings);\r\n\t\treturn bindings;\r\n\t}\r\n\r\n\tconst files = fs\r\n\t\t.readdirSync(providersDir)\r\n\t\t.filter((f) => f.endsWith(\".php\"))\r\n\t\t.map((f) => path.join(providersDir, f));\r\n\r\n\t// $this->app->bind(Interface::class, Implementation::class)\r\n\t// $this->app->singleton(Interface::class, Implementation::class)\r\n\tconst re = /\\$this->app->(?:bind|singleton)\\s*\\(\\s*([A-Za-z0-9_:\\\\\\\\]+)::class\\s*,\\s*([A-Za-z0-9_:\\\\\\\\]+)::class/g;\r\n\r\n\tfor (const file of files) {\r\n\t\tconst code = fs.readFileSync(file, \"utf8\");\r\n\t\tlet m: RegExpExecArray | null;\r\n\t\twhile ((m = re.exec(code))) {\r\n\t\t\tconst iface = m[1].replace(/\\\\\\\\/g, \"\\\\\");\r\n\t\t\tconst impl = m[2].replace(/\\\\\\\\/g, \"\\\\\");\r\n\t\t\tbindings[iface] = impl;\r\n\t\t}\r\n\t}\r\n\r\n\tCacheManager.set(CACHE_KEYS.PHP_BINDINGS, root, bindings);\r\n\r\n\treturn bindings;\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-imports.js","sourceRoot":"","sources":["../../../src/resolvers/php/extract-imports.ts"],"names":[],"mappings":";;AAQA,8CAgBC;AAOD,8CAgBC;AA7CD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,MAAM,QAAQ,GAAa;QACzB,2EAA2E;QAC3E,wCAAwC;KACzC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,GAAG;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAgB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;iBACf,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import type { PhpResolverCtx } from \"../../types\";\r\n\r\n/**\r\n * Extracts import-like references from PHP code.\r\n * Supports:\r\n * - require/include/require_once/include_once\r\n * - use statements (including grouped imports like `use App\\Models\\{User, Team};`)\r\n */\r\nexport function extractPhpImports(code: string): Set<string> {\r\n const out = new Set<string>();\r\n\r\n const patterns: RegExp[] = [\r\n /\\b(?:require|include|require_once|include_once)\\s*\\(?['\"]([^'\"]+)['\"]\\)?/g,\r\n /\\buse\\s+([A-Z][\\w\\\\]+(?:\\s*{[^}]+})?)/g,\r\n ];\r\n\r\n for (const r of patterns) {\r\n let m: RegExpExecArray | null;\r\n while ((m = r.exec(code))) {\r\n const val = m[1];\r\n if (val) out.add(val);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Expands grouped `use` imports into individual fully qualified names.\r\n * Example:\r\n * \"App\\\\Models\\\\{User, Team}\" → [\"App\\\\Models\\\\User\", \"App\\\\Models\\\\Team\"]\r\n */\r\nexport function expandGroupedUses(raw: Set<string>): Set<string> {\r\n const out = new Set<string>();\r\n for (const imp of raw) {\r\n const g = imp.match(/^(.+?)\\s*{([^}]+)}/);\r\n if (g) {\r\n const base = g[1].trim().replace(/\\\\+$/, \"\");\r\n g[2]\r\n .split(\",\")\r\n .map((x) => x.trim())\r\n .filter(Boolean)\r\n .forEach((p) => out.add(`${base}\\\\${p}`));\r\n } else {\r\n out.add(imp.trim());\r\n }\r\n }\r\n return out;\r\n}\r\n"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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.map DELETED
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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"]}
@@ -1 +0,0 @@
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 +0,0 @@
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 +0,0 @@
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"]}