prodex 1.2.0 → 1.4.0

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 (114) hide show
  1. package/README.md +55 -49
  2. package/dist/cli/cli-input.js +58 -43
  3. package/dist/cli/cli-input.js.map +1 -0
  4. package/dist/cli/flags.js +1 -0
  5. package/dist/cli/flags.js.map +1 -0
  6. package/dist/cli/init.js +5 -5
  7. package/dist/cli/init.js.map +1 -0
  8. package/dist/cli/picker.js +43 -41
  9. package/dist/cli/picker.js.map +1 -0
  10. package/dist/cli/summary.js +28 -9
  11. package/dist/cli/summary.js.map +1 -0
  12. package/dist/constants/cache-keys.js +12 -0
  13. package/dist/constants/cache-keys.js.map +1 -0
  14. package/dist/constants/config-loader.js +12 -7
  15. package/dist/constants/config-loader.js.map +1 -0
  16. package/dist/constants/config.js +17 -6
  17. package/dist/constants/config.js.map +1 -0
  18. package/dist/constants/default-config.js +4 -17
  19. package/dist/constants/default-config.js.map +1 -0
  20. package/dist/constants/flags.js +74 -0
  21. package/dist/constants/flags.js.map +1 -0
  22. package/dist/constants/index.js +21 -0
  23. package/dist/constants/index.js.map +1 -0
  24. package/dist/constants/render-constants.js +11 -9
  25. package/dist/constants/render-constants.js.map +1 -0
  26. package/dist/core/cache.js +54 -0
  27. package/dist/core/cache.js.map +1 -0
  28. package/dist/core/combine.js +42 -59
  29. package/dist/core/combine.js.map +1 -0
  30. package/dist/core/config-manager.js +104 -0
  31. package/dist/core/config-manager.js.map +1 -0
  32. package/dist/core/dependency.js +42 -17
  33. package/dist/core/dependency.js.map +1 -0
  34. package/dist/core/file-utils.js +1 -44
  35. package/dist/core/file-utils.js.map +1 -0
  36. package/dist/core/helpers.js +43 -38
  37. package/dist/core/helpers.js.map +1 -0
  38. package/dist/core/managers/cache.js +54 -0
  39. package/dist/core/managers/cache.js.map +1 -0
  40. package/dist/core/managers/config-manager.js +104 -0
  41. package/dist/core/managers/config-manager.js.map +1 -0
  42. package/dist/core/managers/config.js +104 -0
  43. package/dist/core/managers/config.js.map +1 -0
  44. package/dist/core/output.js +49 -0
  45. package/dist/core/output.js.map +1 -0
  46. package/dist/core/parsers/extract-imports.js +2 -7
  47. package/dist/core/parsers/extract-imports.js.map +1 -0
  48. package/dist/core/renderers.js +10 -8
  49. package/dist/core/renderers.js.map +1 -0
  50. package/dist/debug.js +14 -0
  51. package/dist/debug.js.map +1 -0
  52. package/dist/index.js +49 -22
  53. package/dist/index.js.map +1 -0
  54. package/dist/lib/logger.js +38 -9
  55. package/dist/lib/logger.js.map +1 -0
  56. package/dist/lib/polyfills.js +6 -0
  57. package/dist/lib/polyfills.js.map +1 -0
  58. package/dist/lib/prompt.js +35 -0
  59. package/dist/lib/prompt.js.map +1 -0
  60. package/dist/lib/questions.js +29 -0
  61. package/dist/lib/questions.js.map +1 -0
  62. package/dist/lib/utils.js +35 -11
  63. package/dist/lib/utils.js.map +1 -0
  64. package/dist/resolvers/js/alias-loader.js +1 -0
  65. package/dist/resolvers/js/alias-loader.js.map +1 -0
  66. package/dist/resolvers/js/extract-imports.js +46 -0
  67. package/dist/resolvers/js/extract-imports.js.map +1 -0
  68. package/dist/resolvers/js/js-resolver.js +93 -116
  69. package/dist/resolvers/js/js-resolver.js.map +1 -0
  70. package/dist/resolvers/js/resolve-alias.js +58 -0
  71. package/dist/resolvers/js/resolve-alias.js.map +1 -0
  72. package/dist/resolvers/php/bindings.js +21 -9
  73. package/dist/resolvers/php/bindings.js.map +1 -0
  74. package/dist/resolvers/php/extract-imports.js +50 -0
  75. package/dist/resolvers/php/extract-imports.js.map +1 -0
  76. package/dist/resolvers/php/patterns.js +37 -4
  77. package/dist/resolvers/php/patterns.js.map +1 -0
  78. package/dist/resolvers/php/php-resolver.js +99 -59
  79. package/dist/resolvers/php/php-resolver.js.map +1 -0
  80. package/dist/resolvers/php/psr4.js +19 -5
  81. package/dist/resolvers/php/psr4.js.map +1 -0
  82. package/dist/resolvers/shared/excludes.js +1 -0
  83. package/dist/resolvers/shared/excludes.js.map +1 -0
  84. package/dist/resolvers/shared/file-cache.js +1 -29
  85. package/dist/resolvers/shared/file-cache.js.map +1 -0
  86. package/dist/resolvers/shared/resolve-alias.js +62 -0
  87. package/dist/resolvers/shared/resolve-alias.js.map +1 -0
  88. package/dist/resolvers/shared/stats.js +3 -3
  89. package/dist/resolvers/shared/stats.js.map +1 -0
  90. package/dist/shared/collections.js +34 -0
  91. package/dist/shared/collections.js.map +1 -0
  92. package/dist/shared/index.js +20 -0
  93. package/dist/shared/index.js.map +1 -0
  94. package/dist/shared/io.js +52 -0
  95. package/dist/shared/io.js.map +1 -0
  96. package/dist/shared/patterns.js +30 -0
  97. package/dist/shared/patterns.js.map +1 -0
  98. package/dist/shared/stats.js +32 -0
  99. package/dist/shared/stats.js.map +1 -0
  100. package/dist/store.js +16 -0
  101. package/dist/store.js.map +1 -0
  102. package/dist/types/cli.types.js +1 -0
  103. package/dist/types/cli.types.js.map +1 -0
  104. package/dist/types/config.types.js +1 -0
  105. package/dist/types/config.types.js.map +1 -0
  106. package/dist/types/core.types.js +1 -0
  107. package/dist/types/core.types.js.map +1 -0
  108. package/dist/types/index.js +1 -0
  109. package/dist/types/index.js.map +1 -0
  110. package/dist/types/resolver.types.js +1 -0
  111. package/dist/types/resolver.types.js.map +1 -0
  112. package/dist/types/utils.types.js +1 -0
  113. package/dist/types/utils.types.js.map +1 -0
  114. package/package.json +5 -4
@@ -1,88 +1,128 @@
1
1
  "use strict";
2
- // @ts-nocheck
3
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
4
  };
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.resolvePhpImports = resolvePhpImports;
8
7
  const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const extract_imports_1 = require("./extract-imports");
9
10
  const bindings_1 = require("./bindings");
10
11
  const psr4_1 = require("./psr4");
11
- const patterns_1 = require("./patterns");
12
12
  const logger_1 = require("../../lib/logger");
13
- const stats_1 = require("../shared/stats");
14
- const file_cache_1 = require("../shared/file-cache");
15
- const excludes_1 = require("../shared/excludes");
16
- async function resolvePhpImports(filePath, cfg, visited = new Set(), depth = 0, maxDepth = cfg?.resolve?.depth ?? 10, ctx = {}) {
17
- if (depth >= maxDepth)
18
- return empty(visited);
19
- const stats = (0, stats_1.newStats)();
20
- const filesOut = [];
21
- const ROOT = cfg.root || process.cwd();
22
- if (!ctx.psr4)
23
- ctx.psr4 = (0, psr4_1.resolvePsr4)(ROOT);
24
- if (!ctx.nsKeys)
25
- ctx.nsKeys = Object.keys(ctx.psr4).sort((a, b) => b.length - a.length);
26
- if (!ctx.bindings)
27
- ctx.bindings = (0, bindings_1.loadLaravelBindings)();
13
+ const shared_1 = require("../../shared");
14
+ const store_1 = require("../../store");
15
+ const constants_1 = require("../../constants");
16
+ const cache_1 = require("../../core/managers/cache");
17
+ const collections_1 = require("../../shared/collections");
18
+ /** Ensure we have a PHP resolver context for the current root */
19
+ function buildPhpCtx(root, prev) {
20
+ if (prev?.kind === "php")
21
+ return prev;
22
+ const psr4 = (0, psr4_1.resolvePsr4)(root);
23
+ const nsKeys = Object.keys(psr4).sort((a, b) => b.length - a.length);
24
+ const bindings = (0, bindings_1.loadLaravelBindings)(root);
25
+ return { kind: "php", psr4, nsKeys, bindings };
26
+ }
27
+ /** Namespace prefix check */
28
+ function startsWithAnyNamespace(imp, nsKeys) {
29
+ for (const k of nsKeys)
30
+ if (imp.startsWith(k))
31
+ return true;
32
+ return false;
33
+ }
34
+ /**
35
+ * Typed PHP resolver (aligned with JS resolver signature).
36
+ * - Uses global config via getConfig()
37
+ * - Returns ResolverResult (files + stats)
38
+ * - Depth/visited guarded recursion
39
+ */
40
+ async function resolvePhpImports({ filePath, visited = new Set(), depth = 0, maxDepth, ctx }) {
41
+ const { root: ROOT, resolve: { exclude: excludePatterns = [], depth: defaultDepth = 10 }, } = (0, store_1.getConfig)();
42
+ const limitDepth = maxDepth ?? defaultDepth;
43
+ if (depth >= limitDepth)
44
+ return (0, collections_1.emptyResult)(visited);
28
45
  if (visited.has(filePath))
29
- return empty(visited);
46
+ return (0, collections_1.emptyResult)(visited);
30
47
  visited.add(filePath);
48
+ // Fast existence / read
31
49
  if (!fs_1.default.existsSync(filePath))
32
- return empty(visited);
33
- const code = fs_1.default.readFileSync(filePath, "utf8");
34
- const exclude = cfg.imports?.exclude ?? [];
35
- const raw = (0, patterns_1.extractPhpImports)(code);
36
- const imports = expandGroupedUses(raw);
50
+ return (0, collections_1.emptyResult)(visited);
51
+ const code = (0, shared_1.readFileSafe)(filePath);
52
+ if (!code)
53
+ return (0, collections_1.emptyResult)(visited);
54
+ // Context + exclusions
55
+ const phpCtx = buildPhpCtx(ROOT, ctx);
56
+ const isExcluded = (0, shared_1.makeExcludeMatcher)(excludePatterns);
57
+ // Parse imports (expand grouped `use` syntax)
58
+ const raw = (0, extract_imports_1.extractPhpImports)(code);
59
+ const imports = (0, extract_imports_1.expandGroupedUses)(raw);
60
+ // Accumulators
61
+ const stats = (0, shared_1.newStats)();
62
+ const filesOut = [];
37
63
  for (const imp0 of imports) {
38
64
  let imp = imp0;
39
- if (ctx.bindings[imp]) {
40
- log("🔗 Bound:", imp0, "→", ctx.bindings[imp]);
41
- imp = ctx.bindings[imp];
65
+ // Respect Laravel container bindings (Interface → Implementation)
66
+ if (phpCtx.bindings[imp]) {
67
+ logger_1.logger.debug("[php-resolver] binding:", imp, "→", phpCtx.bindings[imp]);
68
+ imp = phpCtx.bindings[imp];
42
69
  }
43
- if (!startsWithAny(imp, ctx.nsKeys))
70
+ // Only resolve PSR-4 mapped namespaces
71
+ if (!startsWithAnyNamespace(imp, phpCtx.nsKeys))
44
72
  continue;
45
- if ((0, excludes_1.isExcluded)(imp, exclude))
73
+ if (isExcluded(imp))
46
74
  continue;
47
75
  stats.expected.add(imp);
48
- const resolvedPath = (0, file_cache_1.tryResolvePhpFile)(imp, filePath, ctx.psr4);
76
+ // Resolve namespace file path (sync helper retained)
77
+ const resolvedPath = await tryResolvePhpFile(imp, filePath, phpCtx.psr4);
49
78
  if (!resolvedPath)
50
79
  continue;
51
80
  stats.resolved.add(imp);
52
81
  filesOut.push(resolvedPath);
53
- const sub = await resolvePhpImports(resolvedPath, cfg, visited, depth + 1, maxDepth, ctx);
82
+ // Recurse
83
+ const sub = await resolvePhpImports({
84
+ filePath: resolvedPath,
85
+ visited,
86
+ depth: depth + 1,
87
+ maxDepth: limitDepth,
88
+ ctx: phpCtx,
89
+ });
54
90
  filesOut.push(...sub.files);
55
- (0, stats_1.mergeStats)(stats, sub.stats);
91
+ (0, shared_1.mergeStats)(stats, sub.stats);
56
92
  }
57
- log("✅ PHP resolver:", filePath, "→", filesOut.length);
58
- return {
59
- files: [...new Set(filesOut)],
60
- visited,
61
- stats
62
- };
93
+ const out = (0, shared_1.unique)(filesOut);
94
+ const unresolved = (0, shared_1.setDiff)(stats.expected, stats.resolved);
95
+ logger_1.logger.debug(`🪶 [php-resolver] ${path_1.default.basename(filePath)} → expected: ${stats.expected.size}, resolved: ${stats.resolved.size}`);
96
+ if (unresolved.size)
97
+ logger_1.logger.debug("[php-resolver] unresolved:", [...unresolved]);
98
+ return { files: out, visited, stats };
63
99
  }
64
- // ---------- Local helpers (resolver-scoped only) ----------
65
- function startsWithAny(imp, nsKeys) {
66
- return nsKeys.some(k => imp.startsWith(k));
67
- }
68
- function empty(visited) {
69
- return { files: [], visited, stats: (0, stats_1.emptyStats)() };
70
- }
71
- const log = (...a) => logger_1.logger.debug("[php-resolver]", ...a);
72
- function expandGroupedUses(raw) {
73
- const out = new Set();
74
- for (const imp of raw) {
75
- const g = imp.match(/^(.+?)\s*{([^}]+)}/);
76
- if (g) {
77
- const base = g[1].trim().replace(/\\+$/, "");
78
- g[2]
79
- .split(",")
80
- .map(x => x.trim())
81
- .forEach(p => out.add(`${base}\\${p}`));
100
+ const promises_1 = __importDefault(require("fs/promises")); // (add near the top if not present)
101
+ async function tryResolvePhpFile(imp, fromFile, psr4) {
102
+ const key = `php:${imp}:${fromFile}`;
103
+ const cached = cache_1.CacheManager.get(constants_1.CACHE_KEYS.PHP_FILECACHE, key);
104
+ if (cached !== undefined)
105
+ return cached;
106
+ const nsKey = Object.keys(psr4).find((k) => imp.startsWith(k));
107
+ if (!nsKey) {
108
+ cache_1.CacheManager.set(constants_1.CACHE_KEYS.PHP_FILECACHE, key, null);
109
+ return null;
110
+ }
111
+ const rel = imp.slice(nsKey.length).norm();
112
+ const tries = [path_1.default.join(psr4[nsKey], rel), path_1.default.join(psr4[nsKey], rel + ".php"), path_1.default.join(psr4[nsKey], rel, "index.php")];
113
+ // 🔹 Run all stats concurrently
114
+ const results = await Promise.allSettled(tries.map(async (p) => {
115
+ try {
116
+ const st = await promises_1.default.stat(p);
117
+ return st.isFile() ? path_1.default.resolve(p) : null;
82
118
  }
83
- else {
84
- out.add(imp.trim());
119
+ catch {
120
+ return null;
85
121
  }
86
- }
87
- return out;
122
+ }));
123
+ //@ts-ignore
124
+ const resolved = results.find((r) => r.status === "fulfilled" && r.value)?.value ?? null;
125
+ cache_1.CacheManager.set(constants_1.CACHE_KEYS.PHP_FILECACHE, key, resolved);
126
+ return resolved;
88
127
  }
128
+ //# sourceMappingURL=php-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"php-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/php/php-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { extractPhpImports, expandGroupedUses } from \"./extract-imports\";\r\nimport { loadLaravelBindings } from \"./bindings\";\r\nimport { resolvePsr4 } from \"./psr4\";\r\nimport { logger } from \"../../lib/logger\";\r\nimport { newStats, mergeStats, unique, readFileSafe, makeExcludeMatcher, setDiff } 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,5 +1,4 @@
1
1
  "use strict";
2
- // @ts-nocheck
3
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
4
  };
@@ -7,20 +6,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
6
  exports.resolvePsr4 = resolvePsr4;
8
7
  const fs_1 = __importDefault(require("fs"));
9
8
  const path_1 = __importDefault(require("path"));
10
- function resolvePsr4(ROOT) {
11
- const composer = path_1.default.join(ROOT, "composer.json");
12
- if (!fs_1.default.existsSync(composer))
9
+ const cache_1 = require("../../core/managers/cache");
10
+ const cache_keys_1 = require("../../constants/cache-keys");
11
+ /**
12
+ * Builds a PSR-4 namespace → directory map from composer.json.
13
+ * Returns absolute paths in the map values.
14
+ */
15
+ function resolvePsr4(root) {
16
+ const cached = cache_1.CacheManager.get(cache_keys_1.CACHE_KEYS.PHP_PSR4, root);
17
+ if (cached)
18
+ return cached;
19
+ const composer = path_1.default.join(root, "composer.json");
20
+ if (!fs_1.default.existsSync(composer)) {
21
+ cache_1.CacheManager.set(cache_keys_1.CACHE_KEYS.PHP_PSR4, root, {});
13
22
  return {};
23
+ }
14
24
  try {
15
25
  const data = JSON.parse(fs_1.default.readFileSync(composer, "utf8"));
16
26
  const src = data.autoload?.["psr-4"] || {};
17
27
  const map = {};
18
28
  for (const ns in src) {
19
- map[ns.replace(/\\+$/, "")] = path_1.default.resolve(ROOT, src[ns]);
29
+ const cleanNs = ns.replace(/\\+$/, "");
30
+ map[cleanNs] = path_1.default.resolve(root, src[ns]);
20
31
  }
32
+ cache_1.CacheManager.set(cache_keys_1.CACHE_KEYS.PHP_PSR4, root, map);
21
33
  return map;
22
34
  }
23
35
  catch {
36
+ cache_1.CacheManager.set(cache_keys_1.CACHE_KEYS.PHP_PSR4, root, {});
24
37
  return {};
25
38
  }
26
39
  }
40
+ //# sourceMappingURL=psr4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"psr4.js","sourceRoot":"","sources":["../../../src/resolvers/php/psr4.ts"],"names":[],"mappings":";;;;;AASA,kCA4BC;AArCD,4CAAoB;AACpB,gDAAwB;AACxB,qDAAyD;AACzD,2DAAwD;AAExD;;;GAGG;AACH,SAAgB,WAAW,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAClD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACX,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAExD,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,GAAG,GAA2B,EAAE,CAAC;QAEvC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,CAAC,OAAO,CAAC,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport { CACHE_KEYS } from \"../../constants/cache-keys\";\r\n\r\n/**\r\n * Builds a PSR-4 namespace → directory map from composer.json.\r\n * Returns absolute paths in the map values.\r\n */\r\nexport function resolvePsr4(root: string): Record<string, string> {\r\n\tconst cached = CacheManager.get(CACHE_KEYS.PHP_PSR4, root);\r\n\tif (cached) return cached;\r\n\r\n\tconst composer = path.join(root, \"composer.json\");\r\n\tif (!fs.existsSync(composer)) {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, {});\r\n\t\treturn {};\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst data = JSON.parse(fs.readFileSync(composer, \"utf8\")) as {\r\n\t\t\tautoload?: { [\"psr-4\"]?: Record<string, string> };\r\n\t\t};\r\n\t\tconst src = data.autoload?.[\"psr-4\"] || {};\r\n\t\tconst map: Record<string, string> = {};\r\n\r\n\t\tfor (const ns in src) {\r\n\t\t\tconst cleanNs = ns.replace(/\\\\+$/, \"\");\r\n\t\t\tmap[cleanNs] = path.resolve(root, src[ns]);\r\n\t\t}\r\n\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, map);\r\n\t\treturn map;\r\n\t} catch {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_PSR4, root, {});\r\n\t\treturn {};\r\n\t}\r\n}\r\n"]}
@@ -9,3 +9,4 @@ const micromatch_1 = __importDefault(require("micromatch"));
9
9
  function isExcluded(imp, exclude = []) {
10
10
  return micromatch_1.default.isMatch(imp.replaceAll("\\", "/"), exclude);
11
11
  }
12
+ //# sourceMappingURL=excludes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"excludes.js","sourceRoot":"","sources":["../../../src/resolvers/shared/excludes.ts"],"names":[],"mappings":";AAAA,cAAc;;;;;AAId,gCAEC;AAJD,4DAAoC;AAEpC,SAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE;IAC1C,OAAO,oBAAU,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC","sourcesContent":["// @ts-nocheck\r\n\r\nimport micromatch from \"micromatch\";\r\n\r\nexport function isExcluded(imp, exclude = []) {\r\n return micromatch.isMatch(imp.replaceAll(\"\\\\\", \"/\"), exclude);\r\n}\r\n"]}
@@ -1,29 +1 @@
1
- "use strict";
2
- // @ts-nocheck
3
- var __importDefault = (this && this.__importDefault) || function (mod) {
4
- return (mod && mod.__esModule) ? mod : { "default": mod };
5
- };
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.tryResolvePhpFile = tryResolvePhpFile;
8
- const fs_1 = __importDefault(require("fs"));
9
- const path_1 = __importDefault(require("path"));
10
- const CACHE = new Map();
11
- function tryResolvePhpFile(imp, fromFile, psr4) {
12
- const key = `php:${imp}:${fromFile}`;
13
- if (CACHE.has(key))
14
- return CACHE.get(key);
15
- const nsKey = Object.keys(psr4).find(k => imp.startsWith(k));
16
- if (!nsKey) {
17
- CACHE.set(key, null);
18
- return null;
19
- }
20
- const rel = imp.slice(nsKey.length).replace(/\\/g, "/");
21
- const tries = [
22
- path_1.default.join(psr4[nsKey], rel),
23
- path_1.default.join(psr4[nsKey], rel + ".php"),
24
- path_1.default.join(psr4[nsKey], rel, "index.php")
25
- ];
26
- const resolved = tries.find(p => fs_1.default.existsSync(p) && fs_1.default.statSync(p).isFile());
27
- CACHE.set(key, resolved ? path_1.default.resolve(resolved) : null);
28
- return CACHE.get(key);
29
- }
1
+ //# sourceMappingURL=file-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../../src/resolvers/shared/file-cache.ts"],"names":[],"mappings":"","sourcesContent":["\r\n\r\n"]}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveAliasPath = resolveAliasPath;
7
+ const fast_glob_1 = __importDefault(require("fast-glob"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const config_1 = require("../../constants/config");
10
+ const cache_1 = require("../../core/cache");
11
+ /**
12
+ * 🧩 resolveAliasPath()
13
+ * Unifies alias lookup across config, cache, and fallback discovery.
14
+ *
15
+ * - Checks cfg.resolve.aliases first.
16
+ * - Then cached aliases (from Cache Manager).
17
+ * - If still unresolved, runs Fast-Glob to discover and cache new alias root.
18
+ */
19
+ async function resolveAliasPath(specifier, root, cfg) {
20
+ if (!specifier.includes("/"))
21
+ return null;
22
+ const [aliasName, ...rest] = specifier.split("/");
23
+ const remainder = rest.join("/");
24
+ const knownAliases = cfg.resolve.aliases || {};
25
+ const aliasKey = aliasName.startsWith("@") ? aliasName : `@${aliasName}`;
26
+ // 1️⃣ Check config-defined aliases
27
+ if (knownAliases[aliasKey]) {
28
+ const relPart = remainder.replace(/^\/+/, "");
29
+ return path_1.default.resolve(root, knownAliases[aliasKey], relPart);
30
+ }
31
+ // 2️⃣ Check cached aliases
32
+ const cached = cache_1.CacheManager.get("aliases", aliasKey);
33
+ if (cached) {
34
+ const relPart = remainder.replace(/^\/+/, "");
35
+ return path_1.default.resolve(root, cached, relPart);
36
+ }
37
+ // 3️⃣ Fallback discovery with Fast-Glob
38
+ const stripped = remainder; // remove prefix before first '/'
39
+ const hasExt = /\.[a-z0-9]+$/i.test(stripped);
40
+ const patterns = hasExt ? [`**/${stripped}`] : [`**/${stripped}.*`, `**/${stripped}/index.*`];
41
+ const matches = await (0, fast_glob_1.default)(patterns, {
42
+ cwd: root,
43
+ absolute: true,
44
+ ignore: config_1.GLOBAL_IGNORE,
45
+ });
46
+ if (matches.length === 1) {
47
+ return resolveMatches(matches, remainder, aliasKey);
48
+ }
49
+ //There are multiple matches, Assuming they match the target approximate folder.
50
+ if (matches.length > 1) {
51
+ const resolvedMatch = resolveMatches(matches, remainder, aliasKey);
52
+ return resolvedMatch.replace(/\.[^/.]+$/, "");
53
+ }
54
+ return null;
55
+ }
56
+ function resolveMatches(matches, remainder, aliasKey) {
57
+ const foundFile = matches[0];
58
+ const aliasRoot = foundFile.split(remainder)[0].replace(/\\/g, "/");
59
+ cache_1.CacheManager.set("aliases", aliasKey, aliasRoot);
60
+ return foundFile;
61
+ }
62
+ //# sourceMappingURL=resolve-alias.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-alias.js","sourceRoot":"","sources":["../../../src/resolvers/shared/resolve-alias.ts"],"names":[],"mappings":";;;;;AAcA,4CA4CC;AA1DD,0DAA2B;AAC3B,gDAAwB;AACxB,mDAAuD;AACvD,4CAAgD;AAGhD;;;;;;;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,SAAS,EAAE,QAAQ,CAAC,CAAC;IAErD,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,OAAO,GAAG,MAAM,IAAA,mBAAE,EAAC,QAAQ,EAAE;QAClC,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,sBAAa;KACrB,CAAC,CAAC;IAEH,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,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["import fg from \"fast-glob\";\r\nimport path from \"path\";\r\nimport { GLOBAL_IGNORE } from \"../../constants/config\";\r\nimport { CacheManager } from \"../../core/cache\";\r\nimport type { ProdexConfig } from \"../../types\";\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(\"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 matches = await fg(patterns, {\r\n\t\tcwd: root,\r\n\t\tabsolute: true,\r\n\t\tignore: GLOBAL_IGNORE,\r\n\t});\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(\"aliases\", aliasKey, aliasRoot);\r\n\treturn foundFile;\r\n}\r\n"]}
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- // @ts-nocheck
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.newStats = newStats;
5
4
  exports.mergeStats = mergeStats;
@@ -8,10 +7,11 @@ function newStats() {
8
7
  return { expected: new Set(), resolved: new Set() };
9
8
  }
10
9
  function mergeStats(target, src) {
11
- src.expected.forEach(i => target.expected.add(i));
12
- src.resolved.forEach(i => target.resolved.add(i));
10
+ src.expected.forEach((i) => target.expected.add(i));
11
+ src.resolved.forEach((i) => target.resolved.add(i));
13
12
  return target;
14
13
  }
15
14
  function emptyStats() {
16
15
  return { expected: new Set(), resolved: new Set() };
17
16
  }
17
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../../src/resolvers/shared/stats.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,gCAIC;AAED,gCAEC;AAZD,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,SAAgB,UAAU;IACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,CAAC","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\nexport function emptyStats(): ResolverResult[\"stats\"] {\r\n\treturn { expected: new Set(), resolved: new Set() };\r\n}\r\n"]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newStats = newStats;
4
+ exports.mergeStats = mergeStats;
5
+ exports.setDiff = setDiff;
6
+ exports.unique = unique;
7
+ exports.emptyResult = emptyResult;
8
+ function newStats() {
9
+ return { expected: new Set(), resolved: new Set() };
10
+ }
11
+ function mergeStats(target, src) {
12
+ src.expected.forEach((i) => target.expected.add(i));
13
+ src.resolved.forEach((i) => target.resolved.add(i));
14
+ return target;
15
+ }
16
+ /**
17
+ * Returns a new Set of elements present in A but not in B.
18
+ * Used to detect unresolved imports in JS and PHP resolvers.
19
+ */
20
+ function setDiff(A, B) {
21
+ return new Set([...A].filter((x) => !B.has(x)));
22
+ }
23
+ /**
24
+ * Removes duplicates from an array.
25
+ * Stateless helper used across resolvers and dependency chain.
26
+ */
27
+ function unique(arr) {
28
+ return [...new Set(arr)];
29
+ }
30
+ /** Empty result helper */
31
+ function emptyResult(visited) {
32
+ return { files: [], visited, stats: { expected: new Set(), resolved: new Set() } };
33
+ } // ---------------------------------------------------------
34
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/shared/collections.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,gCAIC;AAMD,0BAEC;AAMD,wBAEC;AAED,kCAEC;AA5BD,SAAgB,QAAQ;IACvB,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAgB,UAAU,CAAC,MAAM,EAAE,GAAG;IACrC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAI,CAAS,EAAE,CAAS;IAC9C,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AACD;;;GAGG;AAEH,SAAgB,MAAM,CAAI,GAAQ;IACjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1B,CAAC;AACD,0BAA0B;AAC1B,SAAgB,WAAW,CAAC,OAAoB;IAC/C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE,CAAC;AACpF,CAAC,CAAC,4DAA4D","sourcesContent":["import { ResolverResult } from \"../types\";\r\n\r\nexport function newStats(): ResolverResult[\"stats\"] {\r\n\treturn { expected: new Set(), resolved: new Set() };\r\n}\r\n\r\nexport function mergeStats(target, src) {\r\n\tsrc.expected.forEach((i) => target.expected.add(i));\r\n\tsrc.resolved.forEach((i) => target.resolved.add(i));\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Returns a new Set of elements present in A but not in B.\r\n * Used to detect unresolved imports in JS and PHP resolvers.\r\n */\r\nexport function setDiff<A>(A: Set<A>, B: Set<A>): Set<A> {\r\n\treturn new Set([...A].filter((x) => !B.has(x)));\r\n}\r\n/**\r\n * Removes duplicates from an array.\r\n * Stateless helper used across resolvers and dependency chain.\r\n */\r\n\r\nexport function unique<T>(arr: T[]): T[] {\r\n\treturn [...new Set(arr)];\r\n}\r\n/** Empty result helper */\r\nexport function emptyResult(visited: Set<string>): ResolverResult {\r\n\treturn { files: [], visited, stats: { expected: new Set(), resolved: new Set() } };\r\n} // ---------------------------------------------------------\r\n"]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./io"), exports);
18
+ __exportStar(require("./patterns"), exports);
19
+ __exportStar(require("./collections"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uCAAqB;AACrB,6CAA2B;AAC3B,gDAA8B","sourcesContent":["export * from \"./io\";\r\nexport * from \"./patterns\";\r\nexport * from \"./collections\"\r\n"]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ // File: src/shared/io.ts
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.readFileSafe = readFileSafe;
8
+ exports.safeStatCached = safeStatCached;
9
+ exports.rel = rel;
10
+ const cache_1 = require("../core/managers/cache");
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const promises_1 = __importDefault(require("fs/promises"));
14
+ /**
15
+ * Read a file safely. Returns "" if the file cannot be read.
16
+ */
17
+ function readFileSafe(p) {
18
+ try {
19
+ return fs_1.default.readFileSync(p, "utf8");
20
+ }
21
+ catch {
22
+ return "";
23
+ }
24
+ }
25
+ /**
26
+ * Cached version of fs.stat().
27
+ * Takes a cache namespace to preserve behavior across resolvers.
28
+ */
29
+ async function safeStatCached(ns, p) {
30
+ const cached = cache_1.CacheManager.get(ns, p);
31
+ if (cached !== undefined)
32
+ return cached;
33
+ try {
34
+ const st = await promises_1.default.stat(p);
35
+ cache_1.CacheManager.set(ns, p, st);
36
+ return st;
37
+ }
38
+ catch {
39
+ cache_1.CacheManager.set(ns, p, null);
40
+ return null;
41
+ }
42
+ }
43
+ /**
44
+ * Return a path relative to a root, normalized for forward slashes.
45
+ */
46
+ function rel(p, root = process.cwd()) {
47
+ return path_1.default.relative(root, p).replaceAll("\\", "/");
48
+ }
49
+ /**
50
+ * Get a root-relative version of a path.
51
+ */
52
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/shared/io.ts"],"names":[],"mappings":";AAAA,yBAAyB;;;;;AAUzB,oCAMC;AAMD,wCAWC;AAKD,kBAEC;AAtCD,kDAAsD;AACtD,gDAAwB;AACxB,4CAAoB;AACpB,2DAA8B;AAE9B;;GAEG;AACH,SAAgB,YAAY,CAAC,CAAS;IACrC,IAAI,CAAC;QACJ,OAAO,YAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,CAAS;IACzD,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,MAAM,kBAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACR,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAgB,GAAG,CAAC,CAAS,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE;IAClD,OAAO,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AACD;;GAEG","sourcesContent":["// File: src/shared/io.ts\r\n\r\nimport { CacheManager } from \"../core/managers/cache\";\r\nimport path from \"path\";\r\nimport fs from \"fs\";\r\nimport fsp from \"fs/promises\";\r\n\r\n/**\r\n * Read a file safely. Returns \"\" if the file cannot be read.\r\n */\r\nexport function readFileSafe(p: string): string {\r\n\ttry {\r\n\t\treturn fs.readFileSync(p, \"utf8\");\r\n\t} catch {\r\n\t\treturn \"\";\r\n\t}\r\n}\r\n\r\n/**\r\n * Cached version of fs.stat().\r\n * Takes a cache namespace to preserve behavior across resolvers.\r\n */\r\nexport async function safeStatCached(ns: string, p: string): Promise<import(\"fs\").Stats | null> {\r\n\tconst cached = CacheManager.get(ns, p);\r\n\tif (cached !== undefined) return cached;\r\n\ttry {\r\n\t\tconst st = await fsp.stat(p);\r\n\t\tCacheManager.set(ns, p, st);\r\n\t\treturn st;\r\n\t} catch {\r\n\t\tCacheManager.set(ns, p, null);\r\n\t\treturn null;\r\n\t}\r\n}\r\n\r\n/**\r\n * Return a path relative to a root, normalized for forward slashes.\r\n */\r\nexport function rel(p: string, root = process.cwd()): string {\r\n\treturn path.relative(root, p).replaceAll(\"\\\\\", \"/\");\r\n}\r\n/**\r\n * Get a root-relative version of a path.\r\n */\r\n"]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isExcluded = isExcluded;
7
+ exports.makeExcludeMatcher = makeExcludeMatcher;
8
+ // File: src/shared/patterns.ts
9
+ const micromatch_1 = __importDefault(require("micromatch"));
10
+ /**
11
+ * Returns true if a given path matches any of the provided glob patterns.
12
+ * Equivalent to core/helpers.isExcluded().
13
+ */
14
+ function isExcluded(p, patterns = [], root = process.cwd()) {
15
+ if (!patterns?.length)
16
+ return false;
17
+ const relPath = p.replaceAll("\\", "/");
18
+ return micromatch_1.default.isMatch(relPath, patterns);
19
+ }
20
+ /**
21
+ * Builds a reusable micromatch matcher for efficiency.
22
+ * Equivalent to php-resolver.makeExcludeMatcher().
23
+ */
24
+ function makeExcludeMatcher(patterns = []) {
25
+ if (!patterns?.length)
26
+ return () => false;
27
+ const mm = micromatch_1.default.matcher(patterns);
28
+ return (s) => mm(String(s).replace(/\\/g, "/"));
29
+ }
30
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +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"]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newStats = newStats;
4
+ exports.mergeStats = mergeStats;
5
+ exports.emptyStats = emptyStats;
6
+ exports.setDiff = setDiff;
7
+ exports.unique = unique;
8
+ function newStats() {
9
+ return { expected: new Set(), resolved: new Set() };
10
+ }
11
+ function mergeStats(target, src) {
12
+ src.expected.forEach((i) => target.expected.add(i));
13
+ src.resolved.forEach((i) => target.resolved.add(i));
14
+ return target;
15
+ }
16
+ function emptyStats() {
17
+ return { expected: new Set(), resolved: new Set() };
18
+ }
19
+ /**
20
+ * Returns a new Set of elements present in A but not in B.
21
+ * Used to detect unresolved imports in JS and PHP resolvers.
22
+ */
23
+ function setDiff(A, B) {
24
+ return new Set([...A].filter((x) => !B.has(x)));
25
+ } /**
26
+ * Removes duplicates from an array.
27
+ * Stateless helper used across resolvers and dependency chain.
28
+ */
29
+ function unique(arr) {
30
+ return [...new Set(arr)];
31
+ }
32
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/shared/stats.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,gCAIC;AAED,gCAEC;AAMD,0BAEC;AAKD,wBAEC;AA3BD,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,SAAgB,UAAU;IACzB,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AACrD,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,CAAA;;;GAGE;AAEH,SAAgB,MAAM,CAAI,GAAQ;IACjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1B,CAAC","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\nexport function emptyStats(): ResolverResult[\"stats\"] {\r\n\treturn { expected: new Set(), resolved: new Set() };\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 * 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\r\n"]}