prodex 1.4.0 → 1.4.1
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.
- package/dist/cli/cli-input.js +0 -1
- package/dist/cli/init.js +0 -1
- package/dist/cli/picker.js +0 -1
- package/dist/cli/summary.js +0 -1
- package/dist/constants/cache-keys.js +0 -1
- package/dist/constants/config.js +0 -1
- package/dist/constants/default-config.js +0 -1
- package/dist/constants/flags.js +0 -1
- package/dist/constants/index.js +0 -1
- package/dist/constants/render-constants.js +0 -1
- package/dist/core/combine.js +0 -1
- package/dist/core/dependency.js +0 -1
- package/dist/core/helpers.js +0 -1
- package/dist/core/managers/cache.js +0 -1
- package/dist/core/managers/config.js +0 -1
- package/dist/core/output.js +0 -1
- package/dist/core/renderers.js +0 -1
- package/dist/debug.js +0 -1
- package/dist/index.js +0 -1
- package/dist/lib/logger.js +0 -1
- package/dist/lib/polyfills.js +0 -1
- package/dist/lib/prompt.js +0 -1
- package/dist/lib/questions.js +0 -1
- package/dist/lib/utils.js +0 -1
- package/dist/resolvers/js/extract-imports.js +0 -1
- package/dist/resolvers/js/js-resolver.js +0 -1
- package/dist/resolvers/js/resolve-alias.js +0 -1
- package/dist/resolvers/php/bindings.js +0 -1
- package/dist/resolvers/php/extract-imports.js +0 -1
- package/dist/resolvers/php/php-resolver.js +0 -1
- package/dist/resolvers/php/psr4.js +0 -1
- package/dist/shared/collections.js +0 -1
- package/dist/shared/index.js +0 -1
- package/dist/shared/io.js +0 -1
- package/dist/shared/patterns.js +0 -1
- package/dist/store.js +0 -1
- package/dist/types/cli.types.js +0 -1
- package/dist/types/config.types.js +0 -1
- package/dist/types/core.types.js +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/resolver.types.js +0 -1
- package/dist/types/utils.types.js +0 -1
- package/package.json +1 -1
- package/dist/cli/cli-input.js.map +0 -1
- package/dist/cli/flags.js +0 -43
- package/dist/cli/flags.js.map +0 -1
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/picker.js.map +0 -1
- package/dist/cli/summary.js.map +0 -1
- package/dist/constants/cache-keys.js.map +0 -1
- package/dist/constants/config-loader.js +0 -95
- package/dist/constants/config-loader.js.map +0 -1
- package/dist/constants/config.js.map +0 -1
- package/dist/constants/default-config.js.map +0 -1
- package/dist/constants/flags.js.map +0 -1
- package/dist/constants/index.js.map +0 -1
- package/dist/constants/render-constants.js.map +0 -1
- package/dist/core/cache.js +0 -54
- package/dist/core/cache.js.map +0 -1
- package/dist/core/combine.js.map +0 -1
- package/dist/core/config-manager.js +0 -104
- package/dist/core/config-manager.js.map +0 -1
- package/dist/core/dependency.js.map +0 -1
- package/dist/core/file-utils.js +0 -1
- package/dist/core/file-utils.js.map +0 -1
- package/dist/core/helpers.js.map +0 -1
- package/dist/core/managers/cache.js.map +0 -1
- package/dist/core/managers/config-manager.js +0 -104
- package/dist/core/managers/config-manager.js.map +0 -1
- package/dist/core/managers/config.js.map +0 -1
- package/dist/core/output.js.map +0 -1
- package/dist/core/parsers/extract-imports.js +0 -46
- package/dist/core/parsers/extract-imports.js.map +0 -1
- package/dist/core/renderers.js.map +0 -1
- package/dist/debug.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/logger.js.map +0 -1
- package/dist/lib/polyfills.js.map +0 -1
- package/dist/lib/prompt.js.map +0 -1
- package/dist/lib/questions.js.map +0 -1
- package/dist/lib/utils.js.map +0 -1
- package/dist/resolvers/js/alias-loader.js +0 -53
- package/dist/resolvers/js/alias-loader.js.map +0 -1
- package/dist/resolvers/js/extract-imports.js.map +0 -1
- package/dist/resolvers/js/js-resolver.js.map +0 -1
- package/dist/resolvers/js/resolve-alias.js.map +0 -1
- package/dist/resolvers/php/bindings.js.map +0 -1
- package/dist/resolvers/php/extract-imports.js.map +0 -1
- package/dist/resolvers/php/patterns.js +0 -50
- package/dist/resolvers/php/patterns.js.map +0 -1
- package/dist/resolvers/php/php-resolver.js.map +0 -1
- package/dist/resolvers/php/psr4.js.map +0 -1
- package/dist/resolvers/shared/excludes.js +0 -12
- package/dist/resolvers/shared/excludes.js.map +0 -1
- package/dist/resolvers/shared/file-cache.js +0 -1
- package/dist/resolvers/shared/file-cache.js.map +0 -1
- package/dist/resolvers/shared/resolve-alias.js +0 -62
- package/dist/resolvers/shared/resolve-alias.js.map +0 -1
- package/dist/resolvers/shared/stats.js +0 -17
- package/dist/resolvers/shared/stats.js.map +0 -1
- package/dist/shared/collections.js.map +0 -1
- package/dist/shared/index.js.map +0 -1
- package/dist/shared/io.js.map +0 -1
- package/dist/shared/patterns.js.map +0 -1
- package/dist/shared/stats.js +0 -32
- package/dist/shared/stats.js.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/types/cli.types.js.map +0 -1
- package/dist/types/config.types.js.map +0 -1
- package/dist/types/core.types.js.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/types/resolver.types.js.map +0 -1
- package/dist/types/utils.types.js.map +0 -1
|
@@ -1,104 +0,0 @@
|
|
|
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.ConfigManager = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const default_config_1 = require("../constants/default-config");
|
|
10
|
-
const utils_1 = require("../lib/utils");
|
|
11
|
-
const flags_1 = require("../constants/flags");
|
|
12
|
-
const store_1 = require("../store");
|
|
13
|
-
/**
|
|
14
|
-
* 🧩 ConfigManager
|
|
15
|
-
* Unified loader, merger, and flag applier.
|
|
16
|
-
*/
|
|
17
|
-
class ConfigManager {
|
|
18
|
-
static load(cwd) {
|
|
19
|
-
const file = path_1.default.join(cwd, "prodex.json");
|
|
20
|
-
if (!fs_1.default.existsSync(file))
|
|
21
|
-
return default_config_1.DEFAULT_PRODEX_CONFIG;
|
|
22
|
-
try {
|
|
23
|
-
return JSON.parse(fs_1.default.readFileSync(file, "utf8"));
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
console.warn("⚠️ Invalid prodex.json — using defaults.");
|
|
27
|
-
return default_config_1.DEFAULT_PRODEX_CONFIG;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
static merge(user, flags, cwd = process.cwd()) {
|
|
31
|
-
const merged = {
|
|
32
|
-
...default_config_1.DEFAULT_PRODEX_CONFIG,
|
|
33
|
-
...user,
|
|
34
|
-
output: { ...default_config_1.DEFAULT_PRODEX_CONFIG.output, ...user.output },
|
|
35
|
-
entry: {
|
|
36
|
-
...default_config_1.DEFAULT_PRODEX_CONFIG.entry,
|
|
37
|
-
...user.entry,
|
|
38
|
-
ui: { ...default_config_1.DEFAULT_PRODEX_CONFIG.entry.ui, ...user.entry?.ui },
|
|
39
|
-
},
|
|
40
|
-
resolve: { ...default_config_1.DEFAULT_PRODEX_CONFIG.resolve, ...user.resolve },
|
|
41
|
-
root: cwd,
|
|
42
|
-
name: flags?.name ?? null,
|
|
43
|
-
};
|
|
44
|
-
this.applyFlags(merged, flags);
|
|
45
|
-
return this.normalize(merged);
|
|
46
|
-
}
|
|
47
|
-
static applyFlags(cfg, flags) {
|
|
48
|
-
if (!flags)
|
|
49
|
-
return cfg;
|
|
50
|
-
for (const [key, val] of Object.entries(flags)) {
|
|
51
|
-
if (val === undefined)
|
|
52
|
-
continue;
|
|
53
|
-
const def = flags_1.FLAG_MAP[key];
|
|
54
|
-
if (def?.apply)
|
|
55
|
-
def.apply(cfg, val);
|
|
56
|
-
}
|
|
57
|
-
const hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;
|
|
58
|
-
if (hasFiles && !flags.include)
|
|
59
|
-
cfg.resolve.include = [];
|
|
60
|
-
return cfg;
|
|
61
|
-
}
|
|
62
|
-
static normalize(cfg) {
|
|
63
|
-
cfg.entry.files = (0, utils_1.normalizePatterns)(cfg.entry.files);
|
|
64
|
-
//TODO: Is there a need?
|
|
65
|
-
// cfg.resolve.include = normalizePatterns(cfg.resolve.include);
|
|
66
|
-
// cfg.resolve.exclude = normalizePatterns(cfg.resolve.exclude);
|
|
67
|
-
return cfg;
|
|
68
|
-
}
|
|
69
|
-
static persist(partial) {
|
|
70
|
-
const cfg = (0, store_1.getConfig)();
|
|
71
|
-
const dest = path_1.default.join(cfg.root, "prodex.json");
|
|
72
|
-
const { root, name, ...pure } = cfg;
|
|
73
|
-
const merged = deepMerge(pure, partial);
|
|
74
|
-
try {
|
|
75
|
-
fs_1.default.writeFileSync(dest, JSON.stringify(merged, null, 2) + "\n", "utf8");
|
|
76
|
-
console.log(`✅ Updated ${dest}`);
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
console.warn("⚠️ Failed to persist config:", err?.message || err);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
exports.ConfigManager = ConfigManager;
|
|
84
|
-
function deepMerge(base, patch) {
|
|
85
|
-
if (!patch)
|
|
86
|
-
return base;
|
|
87
|
-
const out = Array.isArray(base) ? [...base] : { ...base };
|
|
88
|
-
for (const [k, v] of Object.entries(patch)) {
|
|
89
|
-
if (v === undefined)
|
|
90
|
-
continue;
|
|
91
|
-
const bv = base[k];
|
|
92
|
-
if (Array.isArray(v))
|
|
93
|
-
out[k] = [...v]; // overwrite arrays
|
|
94
|
-
else if (isPlainObject(v) && isPlainObject(bv))
|
|
95
|
-
out[k] = deepMerge(bv, v);
|
|
96
|
-
else
|
|
97
|
-
out[k] = v;
|
|
98
|
-
}
|
|
99
|
-
return out;
|
|
100
|
-
}
|
|
101
|
-
function isPlainObject(x) {
|
|
102
|
-
return x && typeof x === "object" && !Array.isArray(x);
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/core/config-manager.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../src/core/dependency.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { CODE_EXTS, RESOLVERS } from \"../constants/config\";\r\nimport { globScan } from \"./helpers\";\r\nimport { logger } from \"../lib/logger\";\r\nimport { unique } from \"../shared/collections\";\r\nimport type { ProdexConfig, ResolverParams, ResolverResult } from \"../types\";\r\n\r\n/**\r\n * 🧩 followChain()\r\n * Traverses all dependencies starting from the given entry files.\r\n * Uses language-specific resolvers (JS / PHP) under the hood.\r\n */\r\nexport async function followChain(entryFiles: string[], cfg: ProdexConfig) {\r\n\tconst limit = cfg.resolve.limit;\r\n\tconst resolverDepth = cfg.resolve.depth;\r\n\r\n\tlogger.debug(\"🧩 Following dependency chain...\");\r\n\r\n\tconst visited = new Set<string>();\r\n\tconst all: string[] = [];\r\n\tconst expected = new Set<string>();\r\n\tconst resolved = new Set<string>();\r\n\r\n\tfor (const f of entryFiles) {\r\n\t\tif (visited.has(f)) continue;\r\n\t\tall.push(f);\r\n\r\n\t\tconst ext = path.extname(f);\r\n\t\tif (!CODE_EXTS.includes(ext)) continue;\r\n\r\n\t\tconst resolver = RESOLVERS[ext];\r\n\t\tif (!resolver) continue;\r\n\r\n\t\tconst params: ResolverParams = {\r\n\t\t\tfilePath: f,\r\n\t\t\tvisited,\r\n\t\t\tdepth: 0,\r\n\t\t\tmaxDepth: resolverDepth,\r\n\t\t};\r\n\r\n\t\tlet result: ResolverResult | null = null;\r\n\t\ttry {\r\n\t\t\tresult = await resolver(params);\r\n\t\t} catch (err: any) {\r\n\t\t\tlogger.warn(`⚠️ Resolver failed for ${f}:`, err.message || err);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!result) continue;\r\n\r\n\t\tconst { files, stats } = result;\r\n\t\tall.push(...files);\r\n\t\tstats.expected.forEach((x) => expected.add(x));\r\n\t\tstats.resolved.forEach((x) => resolved.add(x));\r\n\r\n\t\tif (limit && all.length >= limit) {\r\n\t\t\tlogger.warn(\"⚠️ Limit reached:\", limit);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tfiles: unique(all),\r\n\t\tstats: { expected, resolved },\r\n\t};\r\n}\r\n\r\n/**\r\n * 🧩 applyIncludes()\r\n * Scans and appends additional files defined in config.resolve.include.\r\n */\r\nexport async function applyIncludes(cfg: ProdexConfig, files: string[]) {\r\n\tconst { resolve, root } = cfg;\r\n\tconst scan = await globScan(resolve.include, { cwd: root });\r\n\tlogger.debug(\"APPLY_include\", _2j(scan));\r\n\treturn unique([...files, ...scan.files]);\r\n}\r\n"]}
|
package/dist/core/file-utils.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=file-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/core/file-utils.ts"],"names":[],"mappings":"","sourcesContent":["\n\n"]}
|
package/dist/core/helpers.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/core/helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport micromatch from \"micromatch\";\nimport { ProdexConfig } from \"../types\";\nimport { isExcluded, rel, unique } from \"../shared\";\n\nimport path from \"path\";\nimport fg, { Options } from \"fast-glob\";\n\nimport { GLOBAL_IGNORE } from \"../constants\";\nimport { logger } from \"../lib/logger\";\n\n/**\n * Recursive walker that respects glob exclude.\n * Returns all files under the given directory tree.\n */\nexport function* walk(dir, cfg: ProdexConfig, depth = 0) {\n\tconst {\n\t\troot,\n\t\tentry: {\n\t\t\tui: { scanDepth },\n\t\t},\n\t\tresolve: { exclude },\n\t} = cfg;\n\n\tif (depth > scanDepth) return;\n\n\tconst entries = fs.readdirSync(dir, { withFileTypes: true });\n\tfor (const e of entries) {\n\t\tconst full = path.join(dir, e.name);\n\n\t\tif (e.isDirectory()) {\n\t\t\t// Skip excluded directories entirely\n\t\t\tconst relPath = rel(full, root);\n\t\t\tif (isExcluded(relPath, exclude)) continue;\n\t\t\tyield* walk(full, cfg, depth + 1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (e.isFile()) {\n\t\t\tconst relPath = rel(full, root);\n\t\t\tif (isExcluded(relPath, exclude)) continue;\n\t\t\tyield full;\n\t\t}\n\t}\n}\n\nexport function orderByPriority(files, priorityList = []) {\n\tif (!priorityList.length) return files;\n\tconst prioritized = [];\n\tconst normal = [];\n\n\tfor (const f of files) {\n\t\tconst normalized = f.norm().toLowerCase();\n\t\tif (priorityList.some((p) => micromatch.isMatch(normalized, p.toLowerCase()))) prioritized.push(f);\n\t\telse normal.push(f);\n\t}\n\n\treturn unique([...prioritized, ...normal]);\n}\nexport function smartNaming(entries: string[]): string {\n\tconst names = unique(entries.map((f) => path.basename(f, path.extname(f))));\n\tif (names.length === 1) return names[0];\n\tif (names.length === 2) return `${names[0]}-${names[1]}`;\n\tif (names.length > 2) return `${names[0]}-and-${names.length - 1}more`;\n\treturn \"prodex\";\n}\n\n\n\n/**\n * Safe micromatch.scan wrapper (compatible with micromatch v4 & v5)\n */\n\nexport async function globScan(patterns: string[], opts: Options) {\n\tconst { absolute = true, cwd = process.cwd() } = opts;\n\n\tif (!patterns?.length) return { files: [] };\n\tconst files = (\n\t\tawait fg(patterns, {\n\t\t\tcwd,\n\t\t\textglob: true,\n\t\t\tdot: true,\n\t\t\tonlyFiles: true,\n\t\t\tignore: GLOBAL_IGNORE,\n\t\t\tabsolute,\n\t\t})\n\t).map((f) => path.resolve(f));\n\tlogger.debug(\"globScan →\", _2j(files));\n\n\treturn { files };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/core/managers/cache.ts"],"names":[],"mappings":";;;AAAA,6CAA0C;AAE1C;;;;;;;GAOG;AACH,MAAa,YAAY;IAChB,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAE9D,gDAAgD;IACxC,MAAM,CAAC,EAAE,CAAC,EAAU;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;IAC/B,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,GAAG,CAAU,EAAU,EAAE,GAAW,EAAE,GAAM;QAClD,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1B,eAAM,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,8BAA8B;IAC9B,MAAM,CAAC,GAAG,CAAU,EAAU,EAAE,GAAW;QAC1C,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,wDAAwD;IACxD,MAAM,CAAC,KAAK,CAAC,EAAW;QACvB,IAAI,EAAE,EAAE,CAAC;YACR,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACpB,eAAM,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,eAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;IACF,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,IAAI,CAAC,EAAU;QACrB,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;QAClE,OAAO,OAAO,CAAC;IAChB,CAAC;;AAzCF,oCA0CC","sourcesContent":["import { logger } from \"../../lib/logger\";\r\n\r\n/**\r\n * 🧩 CacheManager\r\n * Unified in-memory registry for all runtime maps.\r\n *\r\n * - Namespaced storage (e.g., \"aliases\", \"stats\", \"resolver\")\r\n * - Purely in-memory (no file I/O)\r\n * - Static API for symmetry with ConfigManager\r\n */\r\nexport class CacheManager {\r\n\tprivate static registry = new Map<string, Map<string, any>>();\r\n\r\n\t/** Ensure namespace map exists and return it */\r\n\tprivate static ns(ns: string): Map<string, any> {\r\n\t\tif (!this.registry.has(ns)) this.registry.set(ns, new Map());\r\n\t\treturn this.registry.get(ns)!;\r\n\t}\r\n\r\n\t/** Set or update a cached entry */\r\n\tstatic set<T = any>(ns: string, key: string, val: T): void {\r\n\t\tthis.ns(ns).set(key, val);\r\n\t\tlogger.debug(`🧩 [cache:${ns}] set ${key} → ${String(val)}`);\r\n\t}\r\n\r\n\t/** Retrieve a cached entry */\r\n\tstatic get<T = any>(ns: string, key: string): T | undefined {\r\n\t\treturn this.ns(ns).get(key);\r\n\t}\r\n\r\n\t/** Remove all entries from one namespace or from all */\r\n\tstatic clear(ns?: string): void {\r\n\t\tif (ns) {\r\n\t\t\tthis.ns(ns).clear();\r\n\t\t\tlogger.debug(`🧩 [cache:${ns}] cleared`);\r\n\t\t} else {\r\n\t\t\tthis.registry.forEach((m) => m.clear());\r\n\t\t\tlogger.debug(\"🧩 [cache] cleared all namespaces\");\r\n\t\t}\r\n\t}\r\n\r\n\t/** Export a namespace as a plain object (for persistence or inspection) */\r\n\tstatic dump(ns: string): Record<string, any> {\r\n\t\treturn Object.fromEntries(this.ns(ns).entries());\r\n\t}\r\n\r\n\t/** Return count of entries per namespace */\r\n\tstatic stats(): Record<string, number> {\r\n\t\tconst summary: Record<string, number> = {};\r\n\t\tfor (const [name, map] of this.registry) summary[name] = map.size;\r\n\t\treturn summary;\r\n\t}\r\n}\r\n"]}
|
|
@@ -1,104 +0,0 @@
|
|
|
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.ConfigManager = void 0;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const default_config_1 = require("../../constants/default-config");
|
|
10
|
-
const utils_1 = require("../../lib/utils");
|
|
11
|
-
const flags_1 = require("../../constants/flags");
|
|
12
|
-
const store_1 = require("../../store");
|
|
13
|
-
/**
|
|
14
|
-
* 🧩 ConfigManager
|
|
15
|
-
* Unified loader, merger, and flag applier.
|
|
16
|
-
*/
|
|
17
|
-
class ConfigManager {
|
|
18
|
-
static load(cwd) {
|
|
19
|
-
const file = path_1.default.join(cwd, "prodex.json");
|
|
20
|
-
if (!fs_1.default.existsSync(file))
|
|
21
|
-
return default_config_1.DEFAULT_PRODEX_CONFIG;
|
|
22
|
-
try {
|
|
23
|
-
return JSON.parse(fs_1.default.readFileSync(file, "utf8"));
|
|
24
|
-
}
|
|
25
|
-
catch {
|
|
26
|
-
console.warn("⚠️ Invalid prodex.json — using defaults.");
|
|
27
|
-
return default_config_1.DEFAULT_PRODEX_CONFIG;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
static merge(user, flags, cwd = process.cwd()) {
|
|
31
|
-
const merged = {
|
|
32
|
-
...default_config_1.DEFAULT_PRODEX_CONFIG,
|
|
33
|
-
...user,
|
|
34
|
-
output: { ...default_config_1.DEFAULT_PRODEX_CONFIG.output, ...user.output },
|
|
35
|
-
entry: {
|
|
36
|
-
...default_config_1.DEFAULT_PRODEX_CONFIG.entry,
|
|
37
|
-
...user.entry,
|
|
38
|
-
ui: { ...default_config_1.DEFAULT_PRODEX_CONFIG.entry.ui, ...user.entry?.ui },
|
|
39
|
-
},
|
|
40
|
-
resolve: { ...default_config_1.DEFAULT_PRODEX_CONFIG.resolve, ...user.resolve },
|
|
41
|
-
root: cwd,
|
|
42
|
-
name: flags?.name ?? null,
|
|
43
|
-
};
|
|
44
|
-
this.applyFlags(merged, flags);
|
|
45
|
-
return this.normalize(merged);
|
|
46
|
-
}
|
|
47
|
-
static applyFlags(cfg, flags) {
|
|
48
|
-
if (!flags)
|
|
49
|
-
return cfg;
|
|
50
|
-
for (const [key, val] of Object.entries(flags)) {
|
|
51
|
-
if (val === undefined)
|
|
52
|
-
continue;
|
|
53
|
-
const def = flags_1.FLAG_MAP[key];
|
|
54
|
-
if (def?.apply)
|
|
55
|
-
def.apply(cfg, val);
|
|
56
|
-
}
|
|
57
|
-
const hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;
|
|
58
|
-
if (hasFiles && !flags.include)
|
|
59
|
-
cfg.resolve.include = [];
|
|
60
|
-
return cfg;
|
|
61
|
-
}
|
|
62
|
-
static normalize(cfg) {
|
|
63
|
-
cfg.entry.files = (0, utils_1.normalizePatterns)(cfg.entry.files);
|
|
64
|
-
//TODO: Is there a need?
|
|
65
|
-
// cfg.resolve.include = normalizePatterns(cfg.resolve.include);
|
|
66
|
-
// cfg.resolve.exclude = normalizePatterns(cfg.resolve.exclude);
|
|
67
|
-
return cfg;
|
|
68
|
-
}
|
|
69
|
-
static persist(partial) {
|
|
70
|
-
const cfg = (0, store_1.getConfig)();
|
|
71
|
-
const dest = path_1.default.join(cfg.root, "prodex.json");
|
|
72
|
-
const { root, name, ...pure } = cfg;
|
|
73
|
-
const merged = deepMerge(pure, partial);
|
|
74
|
-
try {
|
|
75
|
-
fs_1.default.writeFileSync(dest, JSON.stringify(merged, null, 2) + "\n", "utf8");
|
|
76
|
-
console.log(`✅ Updated ${dest}`);
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
console.warn("⚠️ Failed to persist config:", err?.message || err);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
exports.ConfigManager = ConfigManager;
|
|
84
|
-
function deepMerge(base, patch) {
|
|
85
|
-
if (!patch)
|
|
86
|
-
return base;
|
|
87
|
-
const out = Array.isArray(base) ? [...base] : { ...base };
|
|
88
|
-
for (const [k, v] of Object.entries(patch)) {
|
|
89
|
-
if (v === undefined)
|
|
90
|
-
continue;
|
|
91
|
-
const bv = base[k];
|
|
92
|
-
if (Array.isArray(v))
|
|
93
|
-
out[k] = [...v]; // overwrite arrays
|
|
94
|
-
else if (isPlainObject(v) && isPlainObject(bv))
|
|
95
|
-
out[k] = deepMerge(bv, v);
|
|
96
|
-
else
|
|
97
|
-
out[k] = v;
|
|
98
|
-
}
|
|
99
|
-
return out;
|
|
100
|
-
}
|
|
101
|
-
function isPlainObject(x) {
|
|
102
|
-
return x && typeof x === "object" && !Array.isArray(x);
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=config-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/core/managers/config-manager.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/managers/config.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { DEFAULT_PRODEX_CONFIG } from \"../../constants/default-config\";\r\nimport { 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"]}
|
package/dist/core/output.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":";;;;;AAgBA,sCAkCC;AAlDD,4CAAoB;AACpB,gDAAwB;AACxB,0CAAuC;AACvC,2CAAiE;AACjE,0CAAuC;AAEvC,wCAA8C;AAC9C,gDAAwD;AACxD,oEAA0D;AAC1D,gDAA6C;AAE7C;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAgB;IAC7E,MAAM,EACL,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAClC,GAAG,GAAG,CAAC;IAER,CAAC;IAED,8BAA8B;IAC9B,IAAI,UAAU,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,IAAA,eAAM,EAAyB,gCAAoB,CAAC,CAAC;QAC1E,IAAI,MAAM,EAAE,UAAU;YAAE,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxD,CAAC;IAED,oCAAoC;IACpC,UAAU,GAAG,GAAG,UAAU,IAAI,eAAM,EAAE,CAAC;IACvC,IAAI,SAAS;QAAE,UAAU,GAAG,GAAG,UAAU,IAAI,IAAA,sBAAc,GAAE,EAAE,CAAC;IAEhE,8BAA8B;IAC9B,IAAI,CAAC;QACJ,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACR,eAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,gCAAgC;IAChC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,IAAI,MAAM,EAAE,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAM,EAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAK,EAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,4BAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExK,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO,UAAU,CAAC;AACnB,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { prompt } from \"../lib/prompt\";\r\nimport { renderMd, renderTxt, tocMd, tocTxt } from \"./renderers\";\r\nimport { logger } from \"../lib/logger\";\r\nimport type { OutputParams } from \"../types\";\r\nimport { shortTimestamp } from \"../lib/utils\";\r\nimport { OUTPUT_NAME_QUESTION } from \"../lib/questions\";\r\nimport { MD_FOOTER } from \"../constants/render-constants\";\r\nimport { SUFFIX } from \"../constants/config\";\r\n\r\n/**\r\n * 🧩 produceOutput()\r\n * Handles rendering and writing of the final trace file.\r\n * Receives resolved files and configuration from combine.ts.\r\n */\r\nexport async function produceOutput({ name, files, cfg, showUi }: OutputParams): Promise<string> {\r\n\tconst {\r\n\t\toutput: { format, versioned, dir },\r\n\t} = cfg;\r\n\r\n\t;\r\n\r\n\t// 1️⃣ Determine base filename\r\n\tlet outputBase = name;\r\n\tif (showUi) {\r\n\t\tconst result = await prompt<{ outputBase: string }>(OUTPUT_NAME_QUESTION);\r\n\t\tif (result?.outputBase) outputBase = result.outputBase;\r\n\t}\r\n\r\n\t// 2️⃣ Prefix timestamp if versioned\r\n\toutputBase = `${outputBase}-${SUFFIX}`;\r\n\tif (versioned) outputBase = `${outputBase}_${shortTimestamp()}`;\r\n\r\n\t// 3️⃣ Ensure output directory\r\n\ttry {\r\n\t\tfs.mkdirSync(dir, { recursive: true });\r\n\t} catch {\r\n\t\tlogger.warn(\"Could not create dir directory:\", dir);\r\n\t}\r\n\r\n\t// 4️⃣ Prepare and write content\r\n\tconst outputPath = path.join(dir, `${outputBase}.${format}`);\r\n\r\n\tconst sorted = [...files].sort((a, b) => a.localeCompare(b));\r\n\tconst content = format === \"txt\" ? [tocTxt(sorted), ...sorted.map(renderTxt)].join(\"\") : [tocMd(sorted), ...sorted.map((f, i) => renderMd(f, i)), MD_FOOTER].join(\"\\n\");\r\n\r\n\tfs.writeFileSync(outputPath, content, \"utf8\");\r\n\r\n\treturn outputPath;\r\n}\r\n"]}
|
|
@@ -1,46 +0,0 @@
|
|
|
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.extractImports = extractImports;
|
|
7
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
-
const es_module_lexer_1 = require("es-module-lexer");
|
|
9
|
-
let initialized = false;
|
|
10
|
-
async function extractImports(filePath, code) {
|
|
11
|
-
if (!initialized) {
|
|
12
|
-
await es_module_lexer_1.init;
|
|
13
|
-
initialized = true;
|
|
14
|
-
}
|
|
15
|
-
let src = code;
|
|
16
|
-
if (src == null) {
|
|
17
|
-
try {
|
|
18
|
-
src = await promises_1.default.readFile(filePath, "utf8");
|
|
19
|
-
}
|
|
20
|
-
catch {
|
|
21
|
-
return new Set();
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
try {
|
|
25
|
-
const [imports] = (0, es_module_lexer_1.parse)(src);
|
|
26
|
-
const out = new Set();
|
|
27
|
-
for (const i of imports)
|
|
28
|
-
if (i.n)
|
|
29
|
-
out.add(i.n);
|
|
30
|
-
return out;
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return fallbackRegex(src);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function fallbackRegex(code) {
|
|
37
|
-
const patterns = [/import\s+[^'"]*['"]([^'"]+)['"]/g, /import\(\s*['"]([^'"]+)['"]\s*\)/g, /require\(\s*['"]([^'"]+)['"]\s*\)/g, /export\s+\*\s+from\s+['"]([^'"]+)['"]/g];
|
|
38
|
-
const matches = new Set();
|
|
39
|
-
for (const r of patterns) {
|
|
40
|
-
let m;
|
|
41
|
-
while ((m = r.exec(code)))
|
|
42
|
-
matches.add(m[1]);
|
|
43
|
-
}
|
|
44
|
-
return matches;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=extract-imports.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extract-imports.js","sourceRoot":"","sources":["../../../src/core/parsers/extract-imports.ts"],"names":[],"mappings":";;;;;AAKA,wCAuBC;AA5BD,2DAA6B;AAC7B,qDAA8C;AAE9C,IAAI,WAAW,GAAG,KAAK,CAAC;AAEjB,KAAK,UAAU,cAAc,CAAC,QAAQ,EAAE,IAAI;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,sBAAI,CAAC;QACX,WAAW,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,GAAG,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,CAAC,OAAO,CAAC,GAAG,IAAA,uBAAK,EAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,IAAI;IAC1B,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mCAAmC,EAAE,oCAAoC,EAAE,wCAAwC,CAAC,CAAC;IAE3K,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["import fs from \"fs/promises\";\r\nimport { init, parse } from \"es-module-lexer\";\r\n\r\nlet initialized = false;\r\n\r\nexport async function extractImports(filePath, code): Promise<Set<string>> {\r\n\tif (!initialized) {\r\n\t\tawait init;\r\n\t\tinitialized = true;\r\n\t}\r\n\r\n\tlet src = code;\r\n\tif (src == null) {\r\n\t\ttry {\r\n\t\t\tsrc = await fs.readFile(filePath, \"utf8\");\r\n\t\t} catch {\r\n\t\t\treturn new Set();\r\n\t\t}\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst [imports] = parse(src);\r\n\t\tconst out = new Set<string>();\r\n\t\tfor (const i of imports) if (i.n) out.add(i.n);\r\n\t\treturn out;\r\n\t} catch {\r\n\t\treturn fallbackRegex(src);\r\n\t}\r\n}\r\n\r\nfunction fallbackRegex(code) {\r\n\tconst patterns = [/import\\s+[^'\"]*['\"]([^'\"]+)['\"]/g, /import\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /export\\s+\\*\\s+from\\s+['\"]([^'\"]+)['\"]/g];\r\n\r\n\tconst matches = new Set<string>();\r\n\tfor (const r of patterns) {\r\n\t\tlet m;\r\n\t\twhile ((m = r.exec(code))) matches.add(m[1]);\r\n\t}\r\n\treturn matches;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderers.js","sourceRoot":"","sources":["../../src/core/renderers.ts"],"names":[],"mappings":";;;;;AAQA,sBAKC;AAKD,4BAOC;AAKD,wBAGC;AAED,8BAIC;AAvCD,gDAAwB;AACxB,qCAA4C;AAC5C,qCAAmC;AACnC,oEAAyD;AAEzD;;GAEG;AACH,SAAgB,KAAK,CAAC,KAAK;IAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,IAAA,QAAG,EAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,OAAO,CAAC,UAAU,EAAE,4BAA4B,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC;IAClB,MAAM,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,2BAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;IACpC,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAEvC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,GAAG,4BAA4B,EAAE,EAAE,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnI,CAAC;AAED;;GAEG;AACH,SAAgB,MAAM,CAAC,KAAK;IAC3B,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,4BAA4B,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACnG,CAAC;AAED,SAAgB,SAAS,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAA,QAAG,EAAC,CAAC,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,CAAC,eAAe,GAAG,OAAO,GAAG,OAAO,EAAE,WAAW,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzG,CAAC","sourcesContent":["import path from \"path\";\nimport { readFileSafe } from \"../shared/io\";\nimport { rel } from \"../shared/io\";\nimport { LANG_MAP } from \"../constants/render-constants\";\n\n/**\n * Generate Markdown Table of Contents with anchors\n */\nexport function tocMd(files) {\n\tconst count = files.length;\n\tconst items = files.map((f, i) => `- [${rel(f)}](#${i + 1})`).join(\"\\n\");\n\n\treturn [\"# Index \", `\\nIncluded Source Files (${count})`, items, \"\", \"---\"].join(\"\\n\");\n}\n\n/**\n * Render each file section with invisible anchors\n */\nexport function renderMd(p, i) {\n\tconst rp = rel(p);\n\tconst ext = path.extname(p).toLowerCase();\n\tconst lang = LANG_MAP[ext] || \"txt\";\n\tconst code = readFileSafe(p).trimEnd();\n\n\treturn [`---\\n#### ${i + 1}`, \"\\n\", \"` File: \" + rp + \"` [↑ Back to top](#index)\", \"\", \"```\" + lang, code, \"```\", \"\"].join(\"\\n\");\n}\n\n/**\n * TXT version (unchanged)\n */\nexport function tocTxt(files) {\n\tconst sorted = [...files].sort((a, b) => a.localeCompare(b));\n\treturn [\"##==== Combined Scope ====\", ...sorted.map((f) => \"## - \" + rel(f))].join(\"\\n\") + \"\\n\\n\";\n}\n\nexport function renderTxt(p) {\n\tconst relPath = rel(p);\n\tconst code = readFileSafe(p);\n\treturn [\"##==== path: \" + relPath + \" ====\", \"##region \" + relPath, code, \"##endregion\", \"\"].join(\"\\n\");\n}\n"]}
|
package/dist/debug.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":";;;;;AAAA,oDAAkC;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"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,8BAeC;AArBD,qCAAwC;AACxC,+CAAgD;AAChD,mDAAuD;AACvD,mCAAqC;AACrC,4CAA4C;AAE7B,KAAK,UAAU,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAA,iBAAU,GAAE,CAAC;IAE/C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAA,yBAAa,EAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,sBAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,sBAAa,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAA,kBAAU,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE1B,MAAM,IAAI,GAAG;QACZ,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,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"]}
|
package/dist/lib/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AAGpC,IAAI,KAAK,GAAQ,IAAI,CAAC;AACtB,IAAI,KAAK,GAAG,KAAK,CAAC;AAClB,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,SAAS,WAAW;IACnB,IAAI,KAAK;QAAE,OAAO;IAClB,KAAK,GAAG,IAAA,gBAAQ,GAAE,IAAI,EAAE,CAAC;IACzB,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACtB,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;AACzB,CAAC;AAEY,QAAA,MAAM,GAAW;IAC7B,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,IAAI,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACd,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACd,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACf,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE;QACb,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;CAC5B,CAAC","sourcesContent":["import { getFlags } from \"../store\";\r\nimport { Logger } from \"../types\";\r\n\r\nlet FLAGS: any = null;\r\nlet DEBUG = false;\r\nlet SILENT = false;\r\n\r\nfunction ensureFlags() {\r\n\tif (FLAGS) return;\r\n\tFLAGS = getFlags() || {};\r\n\tDEBUG = !!FLAGS.debug;\r\n\tSILENT = !!FLAGS.silent;\r\n}\r\n\r\nexport const logger: Logger = {\r\n\tdebug: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (DEBUG && !SILENT) console.log(\"\\n🪶 [debug]\", ...a);\r\n\t},\r\n\tinfo: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.log(\"\\n📌 [info]\", ...a);\r\n\t},\r\n\twarn: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.warn(\"\\n⚠️ [warn]\", ...a);\r\n\t},\r\n\terror: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.error(\"\\n💥 [error]\", ...a);\r\n\t},\r\n\tlog: (...a) => {\r\n\t\tensureFlags();\r\n\t\tif (!SILENT) console.log(\"\\n\", ...a);\r\n\t},\r\n\tclear: () => console.clear(),\r\n};\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"polyfills.js","sourceRoot":"","sources":["../../src/lib/polyfills.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC,CAAC;AACH,CAAC;AAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC7B,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC;AACH,CAAC;AAED,UAAU,CAAC,GAAG,GAAG,CAAC,GAAQ,EAAU,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC","sourcesContent":["import util from \"util\";\r\n\r\nif (!String.prototype.norm) {\r\n\tString.prototype.norm = function () {\r\n\t\treturn this.replace(/\\\\/g, \"/\");\r\n\t};\r\n}\r\n\r\nif (!String.prototype.clean) {\r\n\tString.prototype.clean = function () {\r\n\t\treturn this.replace(/[<>:\\\"/\\\\|?*]+/g, \"_\");\r\n\t};\r\n}\r\n\r\nglobalThis._2j = (obj: any): string => util.inspect(obj, { colors: true, depth: null, breakLength: 150, compact: 3 });\r\n"]}
|
package/dist/lib/prompt.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":";;;;;AAYA,wBAcC;AA1BD,wDAAgC;AAChC,qCAAkC;AAGlC;;;;;;;GAOG;AACI,KAAK,UAAU,MAAM,CAAU,SAAyB,EAAE,QAAY;IAC5E,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,CAAC,MAAM,kBAAQ,CAAC,MAAM,CAAI,SAAgB,CAAC,CAAM,CAAC;QAClE,OAAO,OAAO,CAAC;IAChB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QACnB,IAAI,GAAG,EAAE,UAAU,EAAE,CAAC;YACrB,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YACnD,eAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,CAAC;aAAM,CAAC;YACP,eAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,IAAI,IAAI,CAAC;IACzB,CAAC;AACF,CAAC","sourcesContent":["import inquirer from \"inquirer\";\r\nimport { logger } from \"./logger\";\r\nimport type { QuestionSet } from \"../types\";\r\n\r\n/**\r\n * 🧩 prompt()\r\n * Unified and safe wrapper for inquirer.prompt()\r\n *\r\n * - Requires explicit `showUi` flag (no env auto-detection).\r\n * - Returns `null` or `fallback` on failure or disabled UI.\r\n * - Handles TTY errors and user cancellations gracefully.\r\n */\r\nexport async function prompt<T = any>(questions: QuestionSet<T>, fallback?: T): Promise<T | null> {\r\n\ttry {\r\n\t\tconst answers = (await inquirer.prompt<T>(questions as any)) as T;\r\n\t\treturn answers;\r\n\t} catch (err: any) {\r\n\t\tif (err?.isTtyError) {\r\n\t\t\tlogger.warn(\"Interactive prompts not supported (no TTY).\");\r\n\t\t} else if (/canceled|aborted/i.test(err?.message)) {\r\n\t\t\tlogger.warn(\"Prompt canceled by user.\");\r\n\t\t} else {\r\n\t\t\tlogger.error(\"Prompt failed:\", err.message || err);\r\n\t\t}\r\n\t\treturn fallback ?? null;\r\n\t}\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/lib/questions.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AAEH,2DAA2D;AAC9C,QAAA,oBAAoB,GAAwC;IACxE;QACC,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,uCAAuC;QAChD,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI,UAAU;KAC7E;CACD,CAAC;AAEK,MAAM,qBAAqB,GAAG,CAAC,OAAc,EAAE,KAAa,EAAoC,EAAE,CAAC;IACzG;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,6BAA6B,KAAK,GAAG;QAC9C,OAAO;QACP,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE;KACZ;CACD,CAAC;AATW,QAAA,qBAAqB,yBAShC","sourcesContent":["import type { QuestionSet } from \"../types\";\r\n\r\n/**\r\n * 🧩 Centralized Inquirer question definitions.\r\n * Each export is a named, reusable question set.\r\n */\r\n\r\n/** Ask for the output filename (used in produceOutput). */\r\nexport const OUTPUT_NAME_QUESTION: QuestionSet<{ outputBase: string }> = [\r\n\t{\r\n\t\ttype: \"input\",\r\n\t\tname: \"outputBase\",\r\n\t\tmessage: \"Output file name (without extension):\",\r\n\t\tdefault: \"combined\",\r\n\t\tfilter: (v: string) => v.trim().replace(/[<>:\\\"/\\\\|?*]+/g, \"_\") || \"combined\",\r\n\t},\r\n];\r\n\r\nexport const PICK_ENTRIES_QUESTION = (choices: any[], depth: number): QuestionSet<{ picks: string[] }> => [\r\n\t{\r\n\t\ttype: \"checkbox\",\r\n\t\tname: \"picks\",\r\n\t\tmessage: `Select entry files (depth ${depth})`,\r\n\t\tchoices,\r\n\t\tloop: false,\r\n\t\tpageSize: 20,\r\n\t},\r\n];\r\n"]}
|
package/dist/lib/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,53 +0,0 @@
|
|
|
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.loadProjectAliases = loadProjectAliases;
|
|
8
|
-
const fs_1 = __importDefault(require("fs"));
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
let cacheByRoot = new Map();
|
|
11
|
-
function loadProjectAliases(root) {
|
|
12
|
-
if (cacheByRoot.has(root))
|
|
13
|
-
return cacheByRoot.get(root);
|
|
14
|
-
const aliases = {};
|
|
15
|
-
const tsPath = path_1.default.join(root, "tsconfig.json");
|
|
16
|
-
const viteJs = path_1.default.join(root, "vite.config");
|
|
17
|
-
const viteTs = path_1.default.join(root, "vite.config.ts");
|
|
18
|
-
if (fs_1.default.existsSync(tsPath)) {
|
|
19
|
-
try {
|
|
20
|
-
const ts = JSON.parse(fs_1.default.readFileSync(tsPath, "utf8"));
|
|
21
|
-
const paths = ts.compilerOptions?.paths || {};
|
|
22
|
-
for (const [key, value] of Object.entries(paths)) {
|
|
23
|
-
const cleanedKey = key.replace(/\/\*$/, "");
|
|
24
|
-
const first = Array.isArray(value) ? value[0] : value;
|
|
25
|
-
if (!first)
|
|
26
|
-
continue;
|
|
27
|
-
const cleanedVal = first.replace(/\/\*$/, "");
|
|
28
|
-
aliases[cleanedKey] = path_1.default.resolve(root, cleanedVal);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch { }
|
|
32
|
-
}
|
|
33
|
-
for (const vitePath of [viteJs, viteTs]) {
|
|
34
|
-
if (!fs_1.default.existsSync(vitePath))
|
|
35
|
-
continue;
|
|
36
|
-
try {
|
|
37
|
-
const content = fs_1.default.readFileSync(vitePath, "utf8");
|
|
38
|
-
const blocks = [...content.matchAll(/alias\s*:\s*\{([^}]+)\}/g)];
|
|
39
|
-
for (const m of blocks) {
|
|
40
|
-
const inner = m[1];
|
|
41
|
-
const pairs = [...inner.matchAll(/['"](.+?)['"]\s*:\s*['"](.+?)['"]/g)];
|
|
42
|
-
for (const [, key, val] of pairs) {
|
|
43
|
-
const abs = path_1.default.isAbsolute(val) ? val : path_1.default.resolve(root, val);
|
|
44
|
-
aliases[key] = abs;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
catch { }
|
|
49
|
-
}
|
|
50
|
-
cacheByRoot.set(root, aliases);
|
|
51
|
-
return aliases;
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=alias-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"alias-loader.js","sourceRoot":"","sources":["../../../src/resolvers/js/alias-loader.ts"],"names":[],"mappings":";AAAA,cAAc;;;;;AAOd,gDAyCC;AA9CD,4CAAoB;AACpB,gDAAwB;AAExB,IAAI,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;AAE5B,SAAgB,kBAAkB,CAAC,IAAI;IACrC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,EAAE,CAAC;IAEnB,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAEjD,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,EAAE,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACtD,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACrB,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC9C,OAAO,CAAC,UAAU,CAAC,GAAG,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACjE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBACxE,KAAK,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;oBACjC,MAAM,GAAG,GAAG,cAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["// @ts-nocheck\r\n\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\nlet cacheByRoot = new Map();\r\n\r\nexport function loadProjectAliases(root) {\r\n if (cacheByRoot.has(root)) return cacheByRoot.get(root);\r\n\r\n const aliases = {};\r\n\r\n const tsPath = path.join(root, \"tsconfig.json\");\r\n const viteJs = path.join(root, \"vite.config\");\r\n const viteTs = path.join(root, \"vite.config.ts\");\r\n\r\n if (fs.existsSync(tsPath)) {\r\n try {\r\n const ts = JSON.parse(fs.readFileSync(tsPath, \"utf8\"));\r\n const paths = ts.compilerOptions?.paths || {};\r\n for (const [key, value] of Object.entries(paths)) {\r\n const cleanedKey = key.replace(/\\/\\*$/, \"\");\r\n const first = Array.isArray(value) ? value[0] : value;\r\n if (!first) continue;\r\n const cleanedVal = first.replace(/\\/\\*$/, \"\");\r\n aliases[cleanedKey] = path.resolve(root, cleanedVal);\r\n }\r\n } catch {}\r\n }\r\n\r\n for (const vitePath of [viteJs, viteTs]) {\r\n if (!fs.existsSync(vitePath)) continue;\r\n try {\r\n const content = fs.readFileSync(vitePath, \"utf8\");\r\n const blocks = [...content.matchAll(/alias\\s*:\\s*\\{([^}]+)\\}/g)];\r\n for (const m of blocks) {\r\n const inner = m[1];\r\n const pairs = [...inner.matchAll(/['\"](.+?)['\"]\\s*:\\s*['\"](.+?)['\"]/g)];\r\n for (const [, key, val] of pairs) {\r\n const abs = path.isAbsolute(val) ? val : path.resolve(root, val);\r\n aliases[key] = abs;\r\n }\r\n }\r\n } catch {}\r\n }\r\n\r\n cacheByRoot.set(root, aliases);\r\n return aliases;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extract-imports.js","sourceRoot":"","sources":["../../../src/resolvers/js/extract-imports.ts"],"names":[],"mappings":";;;;;AAKA,wCAuBC;AA5BD,2DAA6B;AAC7B,qDAA8C;AAE9C,IAAI,WAAW,GAAG,KAAK,CAAC;AAEjB,KAAK,UAAU,cAAc,CAAC,QAAQ,EAAE,IAAI;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,MAAM,sBAAI,CAAC;QACX,WAAW,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACjB,IAAI,CAAC;YACJ,GAAG,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,GAAG,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,CAAC,OAAO,CAAC,GAAG,IAAA,uBAAK,EAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,IAAI,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACF,CAAC;AAED,SAAS,aAAa,CAAC,IAAI;IAC1B,MAAM,QAAQ,GAAG,CAAC,kCAAkC,EAAE,mCAAmC,EAAE,oCAAoC,EAAE,wCAAwC,CAAC,CAAC;IAE3K,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["import fs from \"fs/promises\";\r\nimport { init, parse } from \"es-module-lexer\";\r\n\r\nlet initialized = false;\r\n\r\nexport async function extractImports(filePath, code): Promise<Set<string>> {\r\n\tif (!initialized) {\r\n\t\tawait init;\r\n\t\tinitialized = true;\r\n\t}\r\n\r\n\tlet src = code;\r\n\tif (src == null) {\r\n\t\ttry {\r\n\t\t\tsrc = await fs.readFile(filePath, \"utf8\");\r\n\t\t} catch {\r\n\t\t\treturn new Set();\r\n\t\t}\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst [imports] = parse(src);\r\n\t\tconst out = new Set<string>();\r\n\t\tfor (const i of imports) if (i.n) out.add(i.n);\r\n\t\treturn out;\r\n\t} catch {\r\n\t\treturn fallbackRegex(src);\r\n\t}\r\n}\r\n\r\nfunction fallbackRegex(code) {\r\n\tconst patterns = [/import\\s+[^'\"]*['\"]([^'\"]+)['\"]/g, /import\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /require\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g, /export\\s+\\*\\s+from\\s+['\"]([^'\"]+)['\"]/g];\r\n\r\n\tconst matches = new Set<string>();\r\n\tfor (const r of patterns) {\r\n\t\tlet m;\r\n\t\twhile ((m = r.exec(code))) matches.add(m[1]);\r\n\t}\r\n\treturn matches;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"js-resolver.js","sourceRoot":"","sources":["../../../src/resolvers/js/js-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\r\nimport { extractImports } from \"./extract-imports\";\r\nimport { BASE_EXTS, DTS_EXT, REAL_EXTS } from \"../../constants/config\";\r\nimport { emptyResult, 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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../../src/resolvers/php/bindings.ts"],"names":[],"mappings":";;;;;AASA,kDAkCC;AA3CD,4CAAoB;AACpB,gDAAwB;AACxB,qDAAyD;AACzD,2DAAwD;AAExD;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC/D,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,YAAE;SACd,WAAW,CAAC,YAAY,CAAC;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzC,4DAA4D;IAC5D,iEAAiE;IACjE,MAAM,EAAE,GAAG,uGAAuG,CAAC;IAEnH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;QACxB,CAAC;IACF,CAAC;IAED,oBAAY,CAAC,GAAG,CAAC,uBAAU,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC;AACjB,CAAC","sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { CacheManager } from \"../../core/managers/cache\";\r\nimport { CACHE_KEYS } from \"../../constants/cache-keys\";\r\n\r\n/**\r\n * Scans app/Providers/*.php for `$this->app->bind()` / `singleton()` calls\r\n * and returns a map of Interface::class → Implementation::class (FQCN strings).\r\n */\r\nexport function loadLaravelBindings(root: string): Record<string, string> {\r\n\tconst cached = CacheManager.get(CACHE_KEYS.PHP_BINDINGS, root);\r\n\tif (cached) return cached;\r\n\r\n\tconst providersDir = path.join(root, \"app\", \"Providers\");\r\n\tconst bindings: Record<string, string> = {};\r\n\r\n\tif (!fs.existsSync(providersDir)) {\r\n\t\tCacheManager.set(CACHE_KEYS.PHP_BINDINGS, root, bindings);\r\n\t\treturn bindings;\r\n\t}\r\n\r\n\tconst files = fs\r\n\t\t.readdirSync(providersDir)\r\n\t\t.filter((f) => f.endsWith(\".php\"))\r\n\t\t.map((f) => path.join(providersDir, f));\r\n\r\n\t// $this->app->bind(Interface::class, Implementation::class)\r\n\t// $this->app->singleton(Interface::class, Implementation::class)\r\n\tconst re = /\\$this->app->(?:bind|singleton)\\s*\\(\\s*([A-Za-z0-9_:\\\\\\\\]+)::class\\s*,\\s*([A-Za-z0-9_:\\\\\\\\]+)::class/g;\r\n\r\n\tfor (const file of files) {\r\n\t\tconst code = fs.readFileSync(file, \"utf8\");\r\n\t\tlet m: RegExpExecArray | null;\r\n\t\twhile ((m = re.exec(code))) {\r\n\t\t\tconst iface = m[1].replace(/\\\\\\\\/g, \"\\\\\");\r\n\t\t\tconst impl = m[2].replace(/\\\\\\\\/g, \"\\\\\");\r\n\t\t\tbindings[iface] = impl;\r\n\t\t}\r\n\t}\r\n\r\n\tCacheManager.set(CACHE_KEYS.PHP_BINDINGS, root, bindings);\r\n\r\n\treturn bindings;\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extract-imports.js","sourceRoot":"","sources":["../../../src/resolvers/php/extract-imports.ts"],"names":[],"mappings":";;AAQA,8CAgBC;AAOD,8CAgBC;AA7CD;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,MAAM,QAAQ,GAAa;QACzB,2EAA2E;QAC3E,wCAAwC;KACzC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,GAAG;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,GAAgB;IAChD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC;iBACf,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import type { PhpResolverCtx } from \"../../types\";\r\n\r\n/**\r\n * Extracts import-like references from PHP code.\r\n * Supports:\r\n * - require/include/require_once/include_once\r\n * - use statements (including grouped imports like `use App\\Models\\{User, Team};`)\r\n */\r\nexport function extractPhpImports(code: string): Set<string> {\r\n const out = new Set<string>();\r\n\r\n const patterns: RegExp[] = [\r\n /\\b(?:require|include|require_once|include_once)\\s*\\(?['\"]([^'\"]+)['\"]\\)?/g,\r\n /\\buse\\s+([A-Z][\\w\\\\]+(?:\\s*{[^}]+})?)/g,\r\n ];\r\n\r\n for (const r of patterns) {\r\n let m: RegExpExecArray | null;\r\n while ((m = r.exec(code))) {\r\n const val = m[1];\r\n if (val) out.add(val);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Expands grouped `use` imports into individual fully qualified names.\r\n * Example:\r\n * \"App\\\\Models\\\\{User, Team}\" → [\"App\\\\Models\\\\User\", \"App\\\\Models\\\\Team\"]\r\n */\r\nexport function expandGroupedUses(raw: Set<string>): Set<string> {\r\n const out = new Set<string>();\r\n for (const imp of raw) {\r\n const g = imp.match(/^(.+?)\\s*{([^}]+)}/);\r\n if (g) {\r\n const base = g[1].trim().replace(/\\\\+$/, \"\");\r\n g[2]\r\n .split(\",\")\r\n .map((x) => x.trim())\r\n .filter(Boolean)\r\n .forEach((p) => out.add(`${base}\\\\${p}`));\r\n } else {\r\n out.add(imp.trim());\r\n }\r\n }\r\n return out;\r\n}\r\n"]}
|