prodex 1.4.0 → 1.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +234 -234
  2. package/dist/cli/cli-input.js +7 -2
  3. package/dist/cli/cli-input.js.map +1 -1
  4. package/dist/cli/init.js +2 -1
  5. package/dist/cli/init.js.map +1 -1
  6. package/dist/constants/config.js +1 -1
  7. package/dist/constants/config.js.map +1 -1
  8. package/dist/constants/default-config.js +13 -4
  9. package/dist/constants/default-config.js.map +1 -1
  10. package/dist/constants/flags.js +6 -0
  11. package/dist/constants/flags.js.map +1 -1
  12. package/dist/core/managers/config.js +38 -6
  13. package/dist/core/managers/config.js.map +1 -1
  14. package/dist/debug.js +2 -1
  15. package/dist/debug.js.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/utils.js +8 -0
  19. package/dist/lib/utils.js.map +1 -1
  20. package/dist/resolvers/js/js-resolver.js +13 -11
  21. package/dist/resolvers/js/js-resolver.js.map +1 -1
  22. package/dist/resolvers/js/resolve-alias.js +15 -12
  23. package/dist/resolvers/js/resolve-alias.js.map +1 -1
  24. package/dist/resolvers/php/php-resolver.js +6 -4
  25. package/dist/resolvers/php/php-resolver.js.map +1 -1
  26. package/dist/shared/collections.js.map +1 -1
  27. package/dist/shared/patterns.js +3 -1
  28. package/dist/shared/patterns.js.map +1 -1
  29. package/dist/types/cli.types.js.map +1 -1
  30. package/dist/types/config.types.js.map +1 -1
  31. package/package.json +6 -4
  32. package/dist/cli/flags.js +0 -43
  33. package/dist/cli/flags.js.map +0 -1
  34. package/dist/constants/config-loader.js +0 -95
  35. package/dist/constants/config-loader.js.map +0 -1
  36. package/dist/core/cache.js +0 -54
  37. package/dist/core/cache.js.map +0 -1
  38. package/dist/core/config-manager.js +0 -104
  39. package/dist/core/config-manager.js.map +0 -1
  40. package/dist/core/file-utils.js +0 -1
  41. package/dist/core/file-utils.js.map +0 -1
  42. package/dist/core/managers/config-manager.js +0 -104
  43. package/dist/core/managers/config-manager.js.map +0 -1
  44. package/dist/core/parsers/extract-imports.js +0 -46
  45. package/dist/core/parsers/extract-imports.js.map +0 -1
  46. package/dist/resolvers/js/alias-loader.js +0 -53
  47. package/dist/resolvers/js/alias-loader.js.map +0 -1
  48. package/dist/resolvers/php/patterns.js +0 -50
  49. package/dist/resolvers/php/patterns.js.map +0 -1
  50. package/dist/resolvers/shared/excludes.js +0 -12
  51. package/dist/resolvers/shared/excludes.js.map +0 -1
  52. package/dist/resolvers/shared/file-cache.js +0 -1
  53. package/dist/resolvers/shared/file-cache.js.map +0 -1
  54. package/dist/resolvers/shared/resolve-alias.js +0 -62
  55. package/dist/resolvers/shared/resolve-alias.js.map +0 -1
  56. package/dist/resolvers/shared/stats.js +0 -17
  57. package/dist/resolvers/shared/stats.js.map +0 -1
  58. package/dist/shared/stats.js +0 -32
  59. package/dist/shared/stats.js.map +0 -1
@@ -1 +1 @@
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\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
+ {"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"]}
@@ -15,12 +15,15 @@ const store_1 = require("../../store");
15
15
  * Unified loader, merger, and flag applier.
16
16
  */
17
17
  class ConfigManager {
18
+ static rawFile = null;
18
19
  static load(cwd) {
19
20
  const file = path_1.default.join(cwd, "prodex.json");
20
21
  if (!fs_1.default.existsSync(file))
21
22
  return default_config_1.DEFAULT_PRODEX_CONFIG;
22
23
  try {
23
- return JSON.parse(fs_1.default.readFileSync(file, "utf8"));
24
+ const parsed = JSON.parse(fs_1.default.readFileSync(file, "utf8"));
25
+ this.rawFile = parsed; // <-- SAVE RAW COPY
26
+ return parsed;
24
27
  }
25
28
  catch {
26
29
  console.warn("⚠️ Invalid prodex.json — using defaults.");
@@ -29,7 +32,7 @@ class ConfigManager {
29
32
  }
30
33
  static merge(user, flags, cwd = process.cwd()) {
31
34
  const merged = {
32
- ...default_config_1.DEFAULT_PRODEX_CONFIG,
35
+ // ...rest,
33
36
  ...user,
34
37
  output: { ...default_config_1.DEFAULT_PRODEX_CONFIG.output, ...user.output },
35
38
  entry: {
@@ -57,6 +60,32 @@ class ConfigManager {
57
60
  const hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;
58
61
  if (hasFiles && !flags.include)
59
62
  cfg.resolve.include = [];
63
+ if (flags.shortcut && cfg.shortcuts && cfg.shortcuts[flags.shortcut])
64
+ return this.applyShortcuts(cfg, flags);
65
+ return cfg;
66
+ }
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
+ }
82
+ }
83
+ };
84
+ handleCut(shortcut, "include", cfg.resolve, noFlagIncludes);
85
+ handleCut(shortcut, "exclude", cfg.resolve, noFlagExcludes);
86
+ handleCut(shortcut, "files", cfg.entry, noFlagFiles);
87
+ if (shortcut.prefix)
88
+ cfg.name = shortcut.prefix;
60
89
  return cfg;
61
90
  }
62
91
  static normalize(cfg) {
@@ -69,11 +98,14 @@ class ConfigManager {
69
98
  static persist(partial) {
70
99
  const cfg = (0, store_1.getConfig)();
71
100
  const dest = path_1.default.join(cfg.root, "prodex.json");
72
- const { root, name, ...pure } = cfg;
73
- const merged = deepMerge(pure, partial);
101
+ // Start from the raw config, never the merged runtime version
102
+ const base = ConfigManager.rawFile
103
+ ? JSON.parse(JSON.stringify(ConfigManager.rawFile)) // deep clone to avoid mutation
104
+ : {};
105
+ // Apply only the partial updates (aliases, etc.)
106
+ const patched = deepMerge(base, partial);
74
107
  try {
75
- fs_1.default.writeFileSync(dest, JSON.stringify(merged, null, 2) + "\n", "utf8");
76
- console.log(`✅ Updated ${dest}`);
108
+ fs_1.default.writeFileSync(dest, (0, utils_1.toJson)(patched) + "\n", "utf8");
77
109
  }
78
110
  catch (err) {
79
111
  console.warn("⚠️ Failed to persist config:", err?.message || err);
@@ -1 +1 @@
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 { normalizePatterns } from \"../../lib/utils\";\r\nimport { FLAG_MAP } from \"../../constants/flags\";\r\nimport type { ProdexConfig, ProdexFlags, ProdexConfigFile, DeepPartial } from \"../../types\";\r\nimport { logger } from \"../../lib/logger\";\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 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\treturn JSON.parse(fs.readFileSync(file, \"utf8\"));\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: Partial<ProdexConfigFile>, flags?: Partial<ProdexFlags>, cwd = process.cwd()): ProdexConfig {\r\n\t\tconst merged: ProdexConfig = {\r\n\t\t\t...DEFAULT_PRODEX_CONFIG,\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};\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\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\t\tconst { root, name, ...pure } = cfg;\r\n\t\tconst merged = deepMerge(pure, partial);\r\n\r\n\t\ttry {\r\n\t\t\tfs.writeFileSync(dest, JSON.stringify(merged, null, 2) + \"\\n\", \"utf8\");\r\n\t\t\tconsole.log(`✅ Updated ${dest}`);\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
+ {"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"]}
package/dist/debug.js CHANGED
@@ -4,8 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const index_1 = __importDefault(require("./index"));
7
+ require("source-map-support/register");
7
8
  (async () => {
8
- const mockArgs = ["node", "prodex", "C:\\Users\\USER\\Herd\\fireshot", "-f", "**/(dashboard|accounts).tsx", "-cd"];
9
+ const mockArgs = ["node", "prodex", "@web", "-f", "**/(dashboard|accounts).tsx", "-cd"];
9
10
  process.argv = mockArgs;
10
11
  console.log("🧩 Debug runner starting...");
11
12
  await (0, index_1.default)();
package/dist/debug.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":";;;;;AAAA,oDAAkC;AAElC,CAAC,KAAK,IAAI,EAAE;IACX,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,iCAAiC,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACnH,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\n\r\n(async () => {\r\n\tconst mockArgs = [\"node\", \"prodex\", \"C:\\\\Users\\\\USER\\\\Herd\\\\fireshot\", \"-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"]}
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 CHANGED
@@ -47,7 +47,7 @@ async function startProdex(args = process.argv) {
47
47
  const config = config_1.ConfigManager.merge(userConfig, flags, root);
48
48
  (0, store_1.setGlobals)(config, flags);
49
49
  const opts = {
50
- showUi: !flags.ci && !flags?.files?.length && !config?.entry?.ui?.enablePicker,
50
+ showUi: !flags.ci && !flags?.files?.length && config?.entry?.ui?.enablePicker && !flags.shortcut,
51
51
  cliName: config.name,
52
52
  };
53
53
  await Promise.resolve().then(() => __importStar(require("./lib/polyfills")));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY;QAC9E,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,\n\t\tcliName: config.name,\n\t};\n\n\tawait import(\"./lib/polyfills\");\n\tawait runCombine({ cfg: config, opts });\n}\n"]}
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"]}
package/dist/lib/utils.js CHANGED
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.shortTimestamp = shortTimestamp;
4
4
  exports.normalizePatterns = normalizePatterns;
5
+ exports.ArrisEmpty = ArrisEmpty;
6
+ exports.toJson = toJson;
5
7
  const config_1 = require("../constants/config");
6
8
  /** Compact YYMMDD-HHmm timestamp for versioned filenames. */
7
9
  function shortTimestamp() {
@@ -36,4 +38,10 @@ function normalizePatterns(input) {
36
38
  return valid;
37
39
  });
38
40
  }
41
+ function ArrisEmpty(arr) {
42
+ return !arr || Array.isArray(arr) && arr.length === 0;
43
+ }
44
+ function toJson(obj) {
45
+ return JSON.stringify(obj, null, 4);
46
+ }
39
47
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":";;AAGA,wCAQC;AAED,8CAqBC;AAlCD,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","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"]}
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"]}
@@ -36,8 +36,7 @@ async function resolveJsImports({ filePath, visited = new Set(), depth = 0, maxD
36
36
  if (!imports.size)
37
37
  return (0, collections_1.emptyResult)(visited);
38
38
  // Trackers ----------------------------------------------
39
- const expected = new Set();
40
- const resolved = new Set();
39
+ const stats = (0, collections_1.newStats)();
41
40
  const files = [];
42
41
  // Main resolution loop ----------------------------------
43
42
  for (const imp of imports) {
@@ -62,11 +61,17 @@ async function resolveJsImports({ filePath, visited = new Set(), depth = 0, maxD
62
61
  if (!base)
63
62
  continue;
64
63
  const absBase = path_1.default.resolve(base);
65
- expected.add(absBase);
64
+ // Exclusion check after alias resolution
65
+ if ((0, shared_1.isExcluded)(absBase, excludePatterns))
66
+ continue;
66
67
  const resolvedPath = await tryResolveImport(absBase);
68
+ // Exclusion check after final resolution
69
+ if ((0, shared_1.isExcluded)(resolvedPath, excludePatterns))
70
+ continue;
71
+ stats.expected.add(absBase);
67
72
  if (!resolvedPath)
68
73
  continue;
69
- resolved.add(absBase);
74
+ stats.resolved.add(absBase);
70
75
  files.push(resolvedPath);
71
76
  // Recursive traversal
72
77
  const sub = await resolveJsImports({
@@ -76,17 +81,14 @@ async function resolveJsImports({ filePath, visited = new Set(), depth = 0, maxD
76
81
  maxDepth: limitDepth,
77
82
  });
78
83
  files.push(...sub.files);
79
- for (const e of sub.stats.expected)
80
- expected.add(e);
81
- for (const r of sub.stats.resolved)
82
- resolved.add(r);
84
+ (0, collections_1.mergeStats)(stats, sub.stats);
83
85
  }
84
86
  const uniqueFiles = (0, collections_1.unique)(files);
85
- const diff = (0, shared_2.setDiff)(expected, resolved);
86
- logger_1.logger.debug(`🪶 [js-resolver] ${filePath} → expected: ${expected.size}, resolved: ${resolved.size}`);
87
+ const diff = (0, shared_2.setDiff)(stats.expected, stats.resolved);
88
+ logger_1.logger.debug(`🪶 [js-resolver] ${filePath} → expected: ${stats.expected.size}, resolved: ${stats.resolved.size}`);
87
89
  if (diff.size)
88
90
  logger_1.logger.debug([...diff], "🔴 THE diff");
89
- return { files: uniqueFiles, visited, stats: { expected, resolved } };
91
+ return { files: uniqueFiles, visited, stats };
90
92
  }
91
93
  // ---------------------------------------------------------
92
94
  // tryResolveImport (pure)
@@ -1 +1 @@
1
- {"version":3,"file":"js-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/js/js-resolver.ts"],"names":[],"mappings":";;;;;AAeA,4CA8EC;AA7FD,gDAAwB;AACxB,uDAAmD;AACnD,mDAAuE;AACvE,0DAA+D;AAC/D,6CAA0C;AAC1C,uCAAwC;AACxC,mDAAmD,CAAC,oCAAoC;AAExF,qDAAyD;AACzD,2DAAwD;AACxD,yCAAwE;AACxE,yCAAuC;AAEvC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,uBAAU,CAAC;AAErC,KAAK,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAkB;IAC5G,MAAM,UAAU,GAAG,QAAQ,CAAC;IAE5B,IAAI,KAAK,IAAI,UAAU;QAAE,OAAO,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEtB,MAAM,EACL,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,GACrC,GAAG,IAAA,iBAAS,GAAE,CAAC;IAEhB,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,GAAG,KAAK,gBAAO,CAAC;IAC9B,IAAI,CAAC,kBAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IAEpE,IAAI,IAAI,GAAG,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IAE/C,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,0DAA0D;IAC1D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,2CAA2C;QAC3C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACnF,IAAI,IAAA,mBAAU,EAAC,GAAG,EAAE,eAAe,CAAC;YAAE,SAAS;QAE/C,IAAI,IAAI,GAAkB,IAAI,CAAC;QAE/B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,oCAAoC;YACpC,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,gDAAgD;YAChD,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACP,0DAA0D;YAC1D,IAAI,GAAG,MAAM,IAAA,gCAAgB,EAAC,GAAG,EAAE,IAAI,EAAE,IAAA,iBAAS,GAAE,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,OAAO,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEtB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEzB,sBAAsB;QACtB,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;YAClC,QAAQ,EAAE,YAAY;YACtB,OAAO;YACP,KAAK,EAAE,KAAK,GAAG,CAAC;YAChB,QAAQ,EAAE,UAAU;SACpB,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,oBAAM,EAAC,KAAK,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAA,gBAAO,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEzC,eAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,gBAAgB,QAAQ,CAAC,IAAI,eAAe,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACtG,IAAI,IAAI,CAAC,IAAI;QAAE,eAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;IAEtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC;AACvE,CAAC;AAED,4DAA4D;AAC5D,0BAA0B;AAC1B,4DAA4D;AAC5D,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,GAAG,IAAI,kBAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACP,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAS,EAAE,gBAAO,CAAC,EAAE,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IACD,kCAAkC;IAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACvC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,GAAG,MAAM,IAAA,uBAAc,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC,CAAC,CACF,CAAC;IAEF,2CAA2C;IAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IACzD,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,4DAA4D;AAC5D,gCAAgC;AAChC,4DAA4D;AAE5D,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,IAAY;IAC7D,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,MAAM,IAAA,gCAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,oBAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACZ,CAAC","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, 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 expected = new Set<string>();\r\n\tconst resolved = new Set<string>();\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\texpected.add(absBase);\r\n\r\n\t\tconst resolvedPath = await tryResolveImport(absBase);\r\n\t\tif (!resolvedPath) continue;\r\n\r\n\t\tresolved.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\tfor (const e of sub.stats.expected) expected.add(e);\r\n\t\tfor (const r of sub.stats.resolved) resolved.add(r);\r\n\t}\r\n\r\n\tconst uniqueFiles = unique(files);\r\n\tconst diff = setDiff(expected, resolved);\r\n\r\n\tlogger.debug(`🪶 [js-resolver] ${filePath} → expected: ${expected.size}, resolved: ${resolved.size}`);\r\n\tif (diff.size) logger.debug([...diff], \"🔴 THE diff\");\r\n\r\n\treturn { files: uniqueFiles, visited, stats: { expected, resolved } };\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
+ {"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"]}
@@ -8,6 +8,7 @@ const path_1 = __importDefault(require("path"));
8
8
  const cache_1 = require("../../core/managers/cache");
9
9
  const constants_1 = require("../../constants");
10
10
  const helpers_1 = require("../../core/helpers");
11
+ const shared_1 = require("../../shared");
11
12
  /**
12
13
  * 🧩 resolveAliasPath()
13
14
  * Unifies alias lookup across config, cache, and fallback discovery.
@@ -39,20 +40,22 @@ async function resolveAliasPath(specifier, root, cfg) {
39
40
  const hasExt = /\.[a-z0-9]+$/i.test(stripped);
40
41
  const patterns = hasExt ? [`**/${stripped}`] : [`**/${stripped}.*`, `**/${stripped}/index.*`];
41
42
  const { files: matches } = await (0, helpers_1.globScan)(patterns, { cwd: root });
42
- if (matches.length === 1) {
43
- return resolveMatches(matches, remainder, aliasKey);
44
- }
45
- //There are multiple matches, Assuming they match the target approximate folder.
46
- if (matches.length > 1) {
47
- const resolvedMatch = resolveMatches(matches, remainder, aliasKey);
48
- return resolvedMatch.replace(/\.[^/.]+$/, "");
43
+ if (matches.length) {
44
+ const resolvedMatch = resolveMatches(matches, remainder);
45
+ // .replace(/\.[^/.]+$/, "")
46
+ if (!resolvedMatch)
47
+ return null;
48
+ const relPath = (0, shared_1.rel)(resolvedMatch, cfg.root);
49
+ cache_1.CacheManager.set(constants_1.CACHE_KEYS.ALIASES, aliasKey, relPath);
50
+ return relPath;
49
51
  }
50
52
  return null;
51
53
  }
52
- function resolveMatches(matches, remainder, aliasKey) {
53
- const foundFile = matches[0];
54
- const aliasRoot = foundFile.split(remainder)[0].replace(/\\/g, "/");
55
- cache_1.CacheManager.set(constants_1.CACHE_KEYS.ALIASES, aliasKey, aliasRoot);
56
- return foundFile;
54
+ function resolveMatches(matches, remainder) {
55
+ const foundFile = matches[0].norm();
56
+ const dSplit = foundFile.split(remainder);
57
+ if (dSplit.length < 2)
58
+ return "";
59
+ return dSplit[0].replace(/\\/g, "/");
57
60
  }
58
61
  //# sourceMappingURL=resolve-alias.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-alias.js","sourceRoot":"","sources":["../../../src/resolvers/js/resolve-alias.ts"],"names":[],"mappings":";;;;;AAcA,4CAwCC;AAtDD,gDAAwB;AACxB,qDAAyD;AAEzD,+CAA6C;AAC7C,gDAA8C;AAE9C;;;;;;;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,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,gFAAgF;IAChF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QACnE,OAAO,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,OAAiB,EAAE,SAAiB,EAAE,QAAgB;IAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpE,oBAAY,CAAC,GAAG,CAAC,sBAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,SAAS,CAAC;AAClB,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\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 === 1) {\r\n\t\treturn resolveMatches(matches, remainder, aliasKey);\r\n\t}\r\n\r\n\t//There are multiple matches, Assuming they match the target approximate folder.\r\n\tif (matches.length > 1) {\r\n\t\tconst resolvedMatch = resolveMatches(matches, remainder, aliasKey);\r\n\t\treturn resolvedMatch.replace(/\\.[^/.]+$/, \"\");\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nfunction resolveMatches(matches: string[], remainder: string, aliasKey: string) {\r\n\tconst foundFile = matches[0];\r\n\tconst aliasRoot = foundFile.split(remainder)[0].replace(/\\\\/g, \"/\");\r\n\tCacheManager.set(CACHE_KEYS.ALIASES, aliasKey, aliasRoot);\r\n\treturn foundFile;\r\n}\r\n"]}
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"]}
@@ -15,6 +15,7 @@ const store_1 = require("../../store");
15
15
  const constants_1 = require("../../constants");
16
16
  const cache_1 = require("../../core/managers/cache");
17
17
  const collections_1 = require("../../shared/collections");
18
+ const promises_1 = __importDefault(require("fs/promises")); // (add near the top if not present)
18
19
  /** Ensure we have a PHP resolver context for the current root */
19
20
  function buildPhpCtx(root, prev) {
20
21
  if (prev?.kind === "php")
@@ -53,7 +54,6 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
53
54
  return (0, collections_1.emptyResult)(visited);
54
55
  // Context + exclusions
55
56
  const phpCtx = buildPhpCtx(ROOT, ctx);
56
- const isExcluded = (0, shared_1.makeExcludeMatcher)(excludePatterns);
57
57
  // Parse imports (expand grouped `use` syntax)
58
58
  const raw = (0, extract_imports_1.extractPhpImports)(code);
59
59
  const imports = (0, extract_imports_1.expandGroupedUses)(raw);
@@ -70,11 +70,14 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
70
70
  // Only resolve PSR-4 mapped namespaces
71
71
  if (!startsWithAnyNamespace(imp, phpCtx.nsKeys))
72
72
  continue;
73
- if (isExcluded(imp))
73
+ if ((0, shared_1.isExcluded)(imp, excludePatterns))
74
74
  continue;
75
- stats.expected.add(imp);
76
75
  // Resolve namespace → file path (sync helper retained)
77
76
  const resolvedPath = await tryResolvePhpFile(imp, filePath, phpCtx.psr4);
77
+ // Exclusion check after final resolution
78
+ if ((0, shared_1.isExcluded)(resolvedPath, excludePatterns))
79
+ continue;
80
+ stats.expected.add(imp);
78
81
  if (!resolvedPath)
79
82
  continue;
80
83
  stats.resolved.add(imp);
@@ -97,7 +100,6 @@ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, max
97
100
  logger_1.logger.debug("[php-resolver] unresolved:", [...unresolved]);
98
101
  return { files: out, visited, stats };
99
102
  }
100
- const promises_1 = __importDefault(require("fs/promises")); // (add near the top if not present)
101
103
  async function tryResolvePhpFile(imp, fromFile, psr4) {
102
104
  const key = `php:${imp}:${fromFile}`;
103
105
  const cached = cache_1.CacheManager.get(constants_1.CACHE_KEYS.PHP_FILECACHE, key);
@@ -1 +1 @@
1
- {"version":3,"file":"php-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/php/php-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { extractPhpImports, expandGroupedUses } from \"./extract-imports\";\r\nimport { loadLaravelBindings } from \"./bindings\";\r\nimport { resolvePsr4 } from \"./psr4\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport { newStats, mergeStats, unique, readFileSafe, makeExcludeMatcher, setDiff } 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\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\tconst isExcluded = makeExcludeMatcher(excludePatterns);\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)) continue;\r\n\r\n\t\tstats.expected.add(imp);\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\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\nimport fsp from \"fs/promises\"; // (add near the top if not present)\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
+ {"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 +1 @@
1
- {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/shared/collections.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,gCAIC;AAMD,0BAEC;AAMD,wBAEC;AAED,kCAEC;AA5BD,SAAgB,QAAQ;IACvB,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,UAAU,CAAC,MAAM,EAAE,GAAG;IACrC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAI,CAAS,EAAE,CAAS;IAC9C,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD;;;GAGG;AAEH,SAAgB,MAAM,CAAI,GAAQ;IACjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,0BAA0B;AAC1B,SAAgB,WAAW,CAAC,OAAoB;IAC/C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC;AACpF,CAAC,CAAC,4DAA4D","sourcesContent":["import { ResolverResult } from \"../types\";\r\n\r\nexport function newStats(): ResolverResult[\"stats\"] {\r\n\treturn { expected: new Set(), resolved: new Set() };\r\n}\r\n\r\nexport function mergeStats(target, src) {\r\n\tsrc.expected.forEach((i) => target.expected.add(i));\r\n\tsrc.resolved.forEach((i) => target.resolved.add(i));\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Returns a new Set of elements present in A but not in B.\r\n * Used to detect unresolved imports in JS and PHP resolvers.\r\n */\r\nexport function setDiff<A>(A: Set<A>, B: Set<A>): Set<A> {\r\n\treturn new Set([...A].filter((x) => !B.has(x)));\r\n}\r\n/**\r\n * Removes duplicates from an array.\r\n * Stateless helper used across resolvers and dependency chain.\r\n */\r\n\r\nexport function unique<T>(arr: T[]): T[] {\r\n\treturn [...new Set(arr)];\r\n}\r\n/** Empty result helper */\r\nexport function emptyResult(visited: Set<string>): ResolverResult {\r\n\treturn { files: [], visited, stats: { expected: new Set(), resolved: new Set() } };\r\n} // ---------------------------------------------------------\r\n"]}
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"]}
@@ -11,9 +11,11 @@ const micromatch_1 = __importDefault(require("micromatch"));
11
11
  * Returns true if a given path matches any of the provided glob patterns.
12
12
  * Equivalent to core/helpers.isExcluded().
13
13
  */
14
- function isExcluded(p, patterns = [], root = process.cwd()) {
14
+ function isExcluded(p = "", patterns = [], root = process.cwd()) {
15
15
  if (!patterns?.length)
16
16
  return false;
17
+ if (!p)
18
+ return false;
17
19
  const relPath = p.replaceAll("\\", "/");
18
20
  return micromatch_1.default.isMatch(relPath, patterns);
19
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/shared/patterns.ts"],"names":[],"mappings":";;;;;AAOA,gCAIC;AAMD,gDAIC;AArBD,+BAA+B;AAC/B,4DAAoC;AAEpC;;;GAGG;AACH,SAAgB,UAAU,CAAC,CAAS,EAAE,WAAqB,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IACjF,IAAI,CAAC,QAAQ,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,oBAAU,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,WAAqB,EAAE;IACxD,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;AAC1D,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 if (!patterns?.length) return false;\r\n const relPath = p.replaceAll(\"\\\\\", \"/\");\r\n return 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 if (!patterns?.length) return () => false;\r\n const mm = micromatch.matcher(patterns);\r\n return (s: string) => mm(String(s).replace(/\\\\/g, \"/\"));\r\n}\r\n"]}
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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cli.types.js","sourceRoot":"","sources":["../../src/types/cli.types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * CLI flag schema for Prodex.\n * Mirrors the current CLI synopsis:\n *\n * prodex [entries...] [-tcdv]\n * [--txt] [--ci] [--debug] [--verbose]\n * [--name=<string>|-n=<string>]\n * [--limit=<int>|-l=<int>]\n * [--inc=<globs>] [--exc=<globs>]\n */\n\nexport interface ProdexFlags {\n\t_: string[];\n\t/** Output as .txt instead of .md (-t / --txt) */\n\ttxt?: boolean;\n\n\t/** Headless / non-interactive mode (-c / --ci) */\n\tci?: boolean;\n\n\t/** Enable debug logs (-d / --debug) */\n\tdebug?: boolean;\n\n\t/** Verbose logs (-v / --verbose) */\n\tverbose?: boolean;\n\n\tsilent?: boolean;\n\n\t/** Custom output filename (without extension) (--name / -n) */\n\tname?: string | null;\n\n\t/** Traversal limit override (--limit / -l) */\n\tlimit?: number | null;\n\n\t/** Comma-separated glob list overriding resolve.include (--inc) */\n\tinclude?: string[];\n\n\t/** Comma-separated glob list overriding resolve.exclude (--exc) */\n\texclude?: string[];\n\tfiles?: string[];\n\n\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
+ {"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 +1 @@
1
- {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Canonical configuration interface for Prodex.\n * Defines the accepted and guaranteed structure at runtime.\n */\nexport interface ProdexConfig {\n\tversion: number;\n\tname: string;\n\troot: string;\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\n/** Optional helper for typed schema versions. */\nexport interface Versioned {\n\tversion: ProdexConfig[\"version\"];\n}\n\n/** Represents the user-saved config file (without runtime fields). */\nexport type ProdexConfigFile = Omit<ProdexConfig, \"root\" | \"name\">;\n\nexport type DeepPartial<T> = {\n\t[K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n"]}
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"]}