prodex 1.4.0 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +234 -234
- package/dist/cli/cli-input.js +7 -2
- package/dist/cli/cli-input.js.map +1 -1
- package/dist/cli/init.js +2 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/constants/config.js +1 -1
- package/dist/constants/config.js.map +1 -1
- package/dist/constants/default-config.js +13 -4
- package/dist/constants/default-config.js.map +1 -1
- package/dist/constants/flags.js +6 -0
- package/dist/constants/flags.js.map +1 -1
- package/dist/core/managers/config.js +38 -6
- package/dist/core/managers/config.js.map +1 -1
- package/dist/debug.js +2 -1
- package/dist/debug.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.js +8 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/resolvers/js/js-resolver.js +13 -11
- package/dist/resolvers/js/js-resolver.js.map +1 -1
- package/dist/resolvers/js/resolve-alias.js +15 -12
- package/dist/resolvers/js/resolve-alias.js.map +1 -1
- package/dist/resolvers/php/php-resolver.js +6 -4
- package/dist/resolvers/php/php-resolver.js.map +1 -1
- package/dist/shared/collections.js.map +1 -1
- package/dist/shared/patterns.js +3 -1
- package/dist/shared/patterns.js.map +1 -1
- package/dist/types/cli.types.js.map +1 -1
- package/dist/types/config.types.js.map +1 -1
- package/package.json +6 -4
- package/dist/cli/flags.js +0 -43
- package/dist/cli/flags.js.map +0 -1
- package/dist/constants/config-loader.js +0 -95
- package/dist/constants/config-loader.js.map +0 -1
- package/dist/core/cache.js +0 -54
- package/dist/core/cache.js.map +0 -1
- package/dist/core/config-manager.js +0 -104
- package/dist/core/config-manager.js.map +0 -1
- package/dist/core/file-utils.js +0 -1
- package/dist/core/file-utils.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/parsers/extract-imports.js +0 -46
- package/dist/core/parsers/extract-imports.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/php/patterns.js +0 -50
- package/dist/resolvers/php/patterns.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/stats.js +0 -32
- package/dist/shared/stats.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prodex",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"description": "Unified Project Indexer & Dependency Extractor for Laravel + React + Node stacks.",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"bin": {
|
|
7
7
|
"prodex": "./bin/prodex.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
10
|
"files": [
|
|
12
11
|
"dist/",
|
|
13
12
|
"bin/",
|
|
@@ -27,7 +26,8 @@
|
|
|
27
26
|
"scripts": {
|
|
28
27
|
"build": "tsc",
|
|
29
28
|
"dev": "tsc --watch",
|
|
30
|
-
"
|
|
29
|
+
"gen:schema": "node schema/generate.js",
|
|
30
|
+
"prepare": "npm run build && npm run gen:schema",
|
|
31
31
|
"d:w": "nodemon --watch dist --delay 500ms --exec node --inspect-brk dist/debug.js"
|
|
32
32
|
},
|
|
33
33
|
"engines": {
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^24.9.2",
|
|
40
40
|
"nodemon": "^3.1.10",
|
|
41
|
+
"ts-json-schema-generator": "^2.4.0",
|
|
41
42
|
"typescript": "^5.9.3"
|
|
42
43
|
},
|
|
43
44
|
"dependencies": {
|
|
@@ -45,6 +46,7 @@
|
|
|
45
46
|
"fast-glob": "^3.3.3",
|
|
46
47
|
"inquirer": "^12.10.0",
|
|
47
48
|
"micromatch": "^4.0.8",
|
|
48
|
-
"sade": "^1.8.1"
|
|
49
|
+
"sade": "^1.8.1",
|
|
50
|
+
"source-map-support": "^0.5.21"
|
|
49
51
|
}
|
|
50
52
|
}
|
package/dist/cli/flags.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CLI_USAGE = exports.FLAG_SHORT_MAP = exports.PRODEX_FLAGS = exports.FlagKey = void 0;
|
|
4
|
-
var FlagKey;
|
|
5
|
-
(function (FlagKey) {
|
|
6
|
-
FlagKey["Txt"] = "txt";
|
|
7
|
-
FlagKey["Ci"] = "ci";
|
|
8
|
-
FlagKey["Debug"] = "debug";
|
|
9
|
-
FlagKey["Name"] = "name";
|
|
10
|
-
FlagKey["Limit"] = "limit";
|
|
11
|
-
FlagKey["Inc"] = "include";
|
|
12
|
-
FlagKey["Exc"] = "exclude";
|
|
13
|
-
FlagKey["Help"] = "help";
|
|
14
|
-
FlagKey["Files"] = "files";
|
|
15
|
-
})(FlagKey || (exports.FlagKey = FlagKey = {}));
|
|
16
|
-
exports.PRODEX_FLAGS = {
|
|
17
|
-
[FlagKey.Files]: { short: "f", type: "list", description: "Comma-separated entry files." },
|
|
18
|
-
[FlagKey.Txt]: { short: "t", type: "boolean", description: "Output as .txt instead of .md." },
|
|
19
|
-
[FlagKey.Ci]: { short: "c", type: "boolean", description: "Headless/no-UI mode." },
|
|
20
|
-
[FlagKey.Debug]: { short: "d", type: "boolean", description: "Enable debug logs." },
|
|
21
|
-
[FlagKey.Name]: { short: "n", type: "string", description: "Custom output filename." },
|
|
22
|
-
[FlagKey.Limit]: { short: "l", type: "number", description: "Override traversal limit." },
|
|
23
|
-
[FlagKey.Inc]: { type: "list", short: "i", description: "Comma-separated include globs." },
|
|
24
|
-
[FlagKey.Exc]: { type: "list", short: "x", description: "Comma-separated exclude globs." },
|
|
25
|
-
[FlagKey.Help]: { short: "h", type: "boolean", description: "Show CLI help and exit." },
|
|
26
|
-
};
|
|
27
|
-
/** Reverse lookup for short aliases. */
|
|
28
|
-
exports.FLAG_SHORT_MAP = Object.entries(exports.PRODEX_FLAGS).reduce((acc, [key, meta]) => {
|
|
29
|
-
if (meta.short)
|
|
30
|
-
acc[meta.short] = key;
|
|
31
|
-
return acc;
|
|
32
|
-
}, {});
|
|
33
|
-
exports.CLI_USAGE = `
|
|
34
|
-
Usage: prodex [-fcdv]
|
|
35
|
-
[--files=<globs>|-f=<globs>]
|
|
36
|
-
[--include=<globs>|-i=<globs>]
|
|
37
|
-
[--exclude=<globs>|-x=<globs>]
|
|
38
|
-
[--txt|-t] [--ci|-c] [--debug|-d] [--version|-v]
|
|
39
|
-
[--name=<string>|-n=<string>]
|
|
40
|
-
[--limit=<int>|-l=<int>]
|
|
41
|
-
[--help|-h]
|
|
42
|
-
`;
|
|
43
|
-
//# sourceMappingURL=flags.js.map
|
package/dist/cli/flags.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/cli/flags.ts"],"names":[],"mappings":";;;AAMA,IAAY,OAUX;AAVD,WAAY,OAAO;IAClB,sBAAW,CAAA;IACX,oBAAS,CAAA;IACT,0BAAe,CAAA;IACf,wBAAa,CAAA;IACb,0BAAe,CAAA;IACf,0BAAe,CAAA;IACf,0BAAe,CAAA;IACf,wBAAa,CAAA;IACb,0BAAe,CAAA;AAChB,CAAC,EAVW,OAAO,uBAAP,OAAO,QAUlB;AAOY,QAAA,YAAY,GAA0B;IAClD,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,8BAA8B,EAAE;IAC1F,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC7F,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sBAAsB,EAAE;IAClF,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACnF,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;IACtF,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;IACzF,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC1F,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,gCAAgC,EAAE;IAC1F,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE;CACvF,CAAC;AAEF,wCAAwC;AAC3B,QAAA,cAAc,GAA4B,MAAM,CAAC,OAAO,CAAC,oBAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IAC/G,IAAI,IAAI,CAAC,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAc,CAAC;IACjD,OAAO,GAAG,CAAC;AACZ,CAAC,EAAE,EAA6B,CAAC,CAAC;AAGrB,QAAA,SAAS,GAAG;;;;;;;;;CASxB,CAAC","sourcesContent":["/**\n * 🧩 Prodex Flag Definitions (v3)\n * Metadata used by the CLI parser for validation, casting, and help output.\n */\nexport type FlagType = \"boolean\" | \"string\" | \"number\" | \"list\";\n\nexport enum FlagKey {\n\tTxt = \"txt\",\n\tCi = \"ci\",\n\tDebug = \"debug\",\n\tName = \"name\",\n\tLimit = \"limit\",\n\tInc = \"include\",\n\tExc = \"exclude\",\n\tHelp = \"help\",\n\tFiles = \"files\",\n}\n\ntype Spec = {\n\tshort?: string;\n\ttype: FlagType;\n\tdescription: string;\n};\nexport const PRODEX_FLAGS: Record<FlagKey, Spec> = {\n\t[FlagKey.Files]: { short: \"f\", type: \"list\", description: \"Comma-separated entry files.\" },\n\t[FlagKey.Txt]: { short: \"t\", type: \"boolean\", description: \"Output as .txt instead of .md.\" },\n\t[FlagKey.Ci]: { short: \"c\", type: \"boolean\", description: \"Headless/no-UI mode.\" },\n\t[FlagKey.Debug]: { short: \"d\", type: \"boolean\", description: \"Enable debug logs.\" },\n\t[FlagKey.Name]: { short: \"n\", type: \"string\", description: \"Custom output filename.\" },\n\t[FlagKey.Limit]: { short: \"l\", type: \"number\", description: \"Override traversal limit.\" },\n\t[FlagKey.Inc]: { type: \"list\", short: \"i\", description: \"Comma-separated include globs.\" },\n\t[FlagKey.Exc]: { type: \"list\", short: \"x\", description: \"Comma-separated exclude globs.\" },\n\t[FlagKey.Help]: { short: \"h\", type: \"boolean\", description: \"Show CLI help and exit.\" },\n};\n\n/** Reverse lookup for short aliases. */\nexport const FLAG_SHORT_MAP: Record<string, FlagKey> = Object.entries(PRODEX_FLAGS).reduce((acc, [key, meta]) => {\n\tif (meta.short) acc[meta.short] = key as FlagKey;\n\treturn acc;\n}, {} as Record<string, FlagKey>);\n\n\nexport const CLI_USAGE = `\nUsage: prodex [-fcdv]\n [--files=<globs>|-f=<globs>]\n [--include=<globs>|-i=<globs>]\n [--exclude=<globs>|-x=<globs>]\n [--txt|-t] [--ci|-c] [--debug|-d] [--version|-v]\n [--name=<string>|-n=<string>]\n [--limit=<int>|-l=<int>]\n [--help|-h]\n`;\n"]}
|
|
@@ -1,95 +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.loadProdexConfig = loadProdexConfig;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const default_config_1 = require("./default-config");
|
|
10
|
-
const utils_1 = require("../lib/utils");
|
|
11
|
-
/**
|
|
12
|
-
* 🧩 Load and merge Prodex configuration (v3)
|
|
13
|
-
*
|
|
14
|
-
* 1️⃣ Reads `prodex.json` if present.
|
|
15
|
-
* 2️⃣ Merges with `DEFAULT_PRODEX_CONFIG`.
|
|
16
|
-
* 3️⃣ Normalizes all path-like fields.
|
|
17
|
-
* 4️⃣ Applies CLI flag overrides.
|
|
18
|
-
*/
|
|
19
|
-
async function loadProdexConfig(flags = {}, cwd) {
|
|
20
|
-
const configPath = path_1.default.join(cwd, "prodex.json");
|
|
21
|
-
let userConfig = {};
|
|
22
|
-
// 1️⃣ Load config if present
|
|
23
|
-
try {
|
|
24
|
-
const content = fs_1.default.readFileSync(configPath, "utf8");
|
|
25
|
-
userConfig = JSON.parse(content);
|
|
26
|
-
}
|
|
27
|
-
catch (err) {
|
|
28
|
-
console.info("No prodex.json found — using defaults.");
|
|
29
|
-
}
|
|
30
|
-
// 2️⃣ Merge defaults → user config
|
|
31
|
-
const { output, entry, resolve } = default_config_1.DEFAULT_PRODEX_CONFIG;
|
|
32
|
-
const cfg = {
|
|
33
|
-
...default_config_1.DEFAULT_PRODEX_CONFIG,
|
|
34
|
-
...userConfig,
|
|
35
|
-
output: { ...output, ...userConfig.output },
|
|
36
|
-
entry: {
|
|
37
|
-
...entry,
|
|
38
|
-
...userConfig.entry,
|
|
39
|
-
ui: { ...entry.ui, ...userConfig.entry?.ui },
|
|
40
|
-
},
|
|
41
|
-
resolve: { ...resolve, ...userConfig.resolve },
|
|
42
|
-
root: cwd,
|
|
43
|
-
name: flags?.name,
|
|
44
|
-
};
|
|
45
|
-
// 4️⃣ Apply CLI flag overrides (if any)
|
|
46
|
-
applyFlagOverrides(cfg, flags);
|
|
47
|
-
tidyArrayFields(cfg);
|
|
48
|
-
return cfg;
|
|
49
|
-
}
|
|
50
|
-
/** Merge CLI flags into config where relevant. */
|
|
51
|
-
/** Merge CLI flags into config where relevant. */
|
|
52
|
-
function applyFlagOverrides(cfg, flags) {
|
|
53
|
-
if (!flags)
|
|
54
|
-
return;
|
|
55
|
-
const outputOverrides = {
|
|
56
|
-
txt: (cfg, v) => (cfg.output.format = v ? "txt" : "md"),
|
|
57
|
-
};
|
|
58
|
-
const resolveOverrides = {
|
|
59
|
-
limit: (cfg, v) => (cfg.resolve.limit = v),
|
|
60
|
-
include: (cfg, v) => (cfg.resolve.include = v),
|
|
61
|
-
exclude: (cfg, v) => (cfg.resolve.exclude = v),
|
|
62
|
-
};
|
|
63
|
-
const entryOverrides = {
|
|
64
|
-
files: (cfg, v) => (cfg.entry.files = v),
|
|
65
|
-
};
|
|
66
|
-
const envOverrides = {
|
|
67
|
-
debug: (_, v) => (process.env.PRODEX_DEBUG = v ? "1" : "0"),
|
|
68
|
-
verbose: (_, v) => (process.env.PRODEX_VERBOSE = v ? "1" : "0"),
|
|
69
|
-
};
|
|
70
|
-
const overrideMap = {
|
|
71
|
-
...outputOverrides,
|
|
72
|
-
...resolveOverrides,
|
|
73
|
-
...entryOverrides,
|
|
74
|
-
...envOverrides,
|
|
75
|
-
};
|
|
76
|
-
// Apply all flag overrides dynamically
|
|
77
|
-
for (const [flag, value] of Object.entries(flags)) {
|
|
78
|
-
if (value == undefined)
|
|
79
|
-
continue;
|
|
80
|
-
const apply = overrideMap[flag];
|
|
81
|
-
if (apply)
|
|
82
|
-
apply(cfg, value);
|
|
83
|
-
}
|
|
84
|
-
// Conditional override rule:
|
|
85
|
-
// If files exist and include was null/undefined → clear include array
|
|
86
|
-
const hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;
|
|
87
|
-
if (hasFiles && !flags.include) {
|
|
88
|
-
cfg.resolve.include = [];
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function tidyArrayFields(cfg) {
|
|
92
|
-
cfg.entry.files = (0, utils_1.normalizePatterns)(cfg.entry.files);
|
|
93
|
-
["include", "exclude"].forEach((k) => (cfg.resolve[k] = cfg.resolve[k]));
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/constants/config-loader.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { DEFAULT_PRODEX_CONFIG } from \"./default-config\";\nimport type { ProdexConfig, ProdexFlags } from \"../types\";\nimport { normalizePatterns } from \"../lib/utils\";\n\n/**\n * 🧩 Load and merge Prodex configuration (v3)\n *\n * 1️⃣ Reads `prodex.json` if present.\n * 2️⃣ Merges with `DEFAULT_PRODEX_CONFIG`.\n * 3️⃣ Normalizes all path-like fields.\n * 4️⃣ Applies CLI flag overrides.\n */\nexport async function loadProdexConfig(flags: Partial<ProdexFlags> = {}, cwd: string): Promise<ProdexConfig> {\n\tconst configPath = path.join(cwd, \"prodex.json\");\n\tlet userConfig: Partial<ProdexConfig> = {};\n\n\t// 1️⃣ Load config if present\n\ttry {\n\t\tconst content = fs.readFileSync(configPath, \"utf8\");\n\t\tuserConfig = JSON.parse(content);\n\t} catch (err: any) {\n\t\tconsole.info(\"No prodex.json found — using defaults.\");\n\t}\n\n\t// 2️⃣ Merge defaults → user config\n\tconst { output, entry, resolve } = DEFAULT_PRODEX_CONFIG;\n\n\tconst cfg: ProdexConfig = {\n\t\t...DEFAULT_PRODEX_CONFIG,\n\t\t...userConfig,\n\t\toutput: { ...output, ...userConfig.output },\n\t\tentry: {\n\t\t\t...entry,\n\t\t\t...userConfig.entry,\n\t\t\tui: { ...entry.ui, ...userConfig.entry?.ui },\n\t\t},\n\t\tresolve: { ...resolve, ...userConfig.resolve },\n\t\troot: cwd,\n\t\tname: flags?.name,\n\t};\n\n\t// 4️⃣ Apply CLI flag overrides (if any)\n\tapplyFlagOverrides(cfg, flags);\n\ttidyArrayFields(cfg);\n\treturn cfg;\n}\n\n/** Merge CLI flags into config where relevant. */\n/** Merge CLI flags into config where relevant. */\nfunction applyFlagOverrides(cfg: ProdexConfig, flags: Partial<ProdexFlags>): void {\n\tif (!flags) return;\n\n\tconst outputOverrides = {\n\t\ttxt: (cfg: ProdexConfig, v) => (cfg.output.format = v ? \"txt\" : \"md\"),\n\t};\n\n\tconst resolveOverrides = {\n\t\tlimit: (cfg: ProdexConfig, v: any) => (cfg.resolve.limit = v),\n\t\tinclude: (cfg: ProdexConfig, v: any) => (cfg.resolve.include = v),\n\t\texclude: (cfg: ProdexConfig, v: any) => (cfg.resolve.exclude = v),\n\t};\n\n\tconst entryOverrides = {\n\t\tfiles: (cfg: ProdexConfig, v: any) => (cfg.entry.files = v),\n\t};\n\n\tconst envOverrides = {\n\t\tdebug: (_, v) => (process.env.PRODEX_DEBUG = v ? \"1\" : \"0\"),\n\t\tverbose: (_, v) => (process.env.PRODEX_VERBOSE = v ? \"1\" : \"0\"),\n\t};\n\n\tconst overrideMap = {\n\t\t...outputOverrides,\n\t\t...resolveOverrides,\n\t\t...entryOverrides,\n\t\t...envOverrides,\n\t};\n\n\t// Apply all flag overrides dynamically\n\tfor (const [flag, value] of Object.entries(flags)) {\n\t\tif (value == undefined) continue;\n\t\tconst apply = overrideMap[flag];\n\t\tif (apply) apply(cfg, value);\n\t}\n\n\t// Conditional override rule:\n\t// If files exist and include was null/undefined → clear include array\n\tconst hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;\n\n\tif (hasFiles && !flags.include) {\n\t\tcfg.resolve.include = [];\n\t}\n}\n\nfunction tidyArrayFields(cfg: ProdexConfig) {\n\tcfg.entry.files = normalizePatterns(cfg.entry.files);\n\t[\"include\", \"exclude\"].forEach((k) => (cfg.resolve[k] = cfg.resolve[k]));\n}\n"]}
|
package/dist/core/cache.js
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CacheManager = void 0;
|
|
4
|
-
const logger_1 = require("../lib/logger");
|
|
5
|
-
/**
|
|
6
|
-
* 🧩 CacheManager
|
|
7
|
-
* Unified in-memory registry for all runtime maps.
|
|
8
|
-
*
|
|
9
|
-
* - Namespaced storage (e.g., "aliases", "stats", "resolver")
|
|
10
|
-
* - Purely in-memory (no file I/O)
|
|
11
|
-
* - Static API for symmetry with ConfigManager
|
|
12
|
-
*/
|
|
13
|
-
class CacheManager {
|
|
14
|
-
static registry = new Map();
|
|
15
|
-
/** Ensure namespace map exists and return it */
|
|
16
|
-
static ns(ns) {
|
|
17
|
-
if (!this.registry.has(ns))
|
|
18
|
-
this.registry.set(ns, new Map());
|
|
19
|
-
return this.registry.get(ns);
|
|
20
|
-
}
|
|
21
|
-
/** Set or update a cached entry */
|
|
22
|
-
static set(ns, key, val) {
|
|
23
|
-
this.ns(ns).set(key, val);
|
|
24
|
-
logger_1.logger.debug(`🧩 [cache:${ns}] set ${key} → ${String(val)}`);
|
|
25
|
-
}
|
|
26
|
-
/** Retrieve a cached entry */
|
|
27
|
-
static get(ns, key) {
|
|
28
|
-
return this.ns(ns).get(key);
|
|
29
|
-
}
|
|
30
|
-
/** Remove all entries from one namespace or from all */
|
|
31
|
-
static clear(ns) {
|
|
32
|
-
if (ns) {
|
|
33
|
-
this.ns(ns).clear();
|
|
34
|
-
logger_1.logger.debug(`🧩 [cache:${ns}] cleared`);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
this.registry.forEach((m) => m.clear());
|
|
38
|
-
logger_1.logger.debug("🧩 [cache] cleared all namespaces");
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/** Export a namespace as a plain object (for persistence or inspection) */
|
|
42
|
-
static dump(ns) {
|
|
43
|
-
return Object.fromEntries(this.ns(ns).entries());
|
|
44
|
-
}
|
|
45
|
-
/** Return count of entries per namespace */
|
|
46
|
-
static stats() {
|
|
47
|
-
const summary = {};
|
|
48
|
-
for (const [name, map] of this.registry)
|
|
49
|
-
summary[name] = map.size;
|
|
50
|
-
return summary;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
exports.CacheManager = CacheManager;
|
|
54
|
-
//# sourceMappingURL=cache.js.map
|
package/dist/core/cache.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":";;;AAAA,0CAAuC;AAEvC;;;;;;;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/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"]}
|
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"]}
|
|
@@ -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,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,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"]}
|