prodex 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +55 -49
  2. package/dist/cli/cli-input.js +58 -43
  3. package/dist/cli/cli-input.js.map +1 -0
  4. package/dist/cli/flags.js +1 -0
  5. package/dist/cli/flags.js.map +1 -0
  6. package/dist/cli/init.js +5 -5
  7. package/dist/cli/init.js.map +1 -0
  8. package/dist/cli/picker.js +43 -41
  9. package/dist/cli/picker.js.map +1 -0
  10. package/dist/cli/summary.js +28 -9
  11. package/dist/cli/summary.js.map +1 -0
  12. package/dist/constants/cache-keys.js +12 -0
  13. package/dist/constants/cache-keys.js.map +1 -0
  14. package/dist/constants/config-loader.js +12 -7
  15. package/dist/constants/config-loader.js.map +1 -0
  16. package/dist/constants/config.js +17 -6
  17. package/dist/constants/config.js.map +1 -0
  18. package/dist/constants/default-config.js +4 -17
  19. package/dist/constants/default-config.js.map +1 -0
  20. package/dist/constants/flags.js +74 -0
  21. package/dist/constants/flags.js.map +1 -0
  22. package/dist/constants/index.js +21 -0
  23. package/dist/constants/index.js.map +1 -0
  24. package/dist/constants/render-constants.js +11 -9
  25. package/dist/constants/render-constants.js.map +1 -0
  26. package/dist/core/cache.js +54 -0
  27. package/dist/core/cache.js.map +1 -0
  28. package/dist/core/combine.js +42 -59
  29. package/dist/core/combine.js.map +1 -0
  30. package/dist/core/config-manager.js +104 -0
  31. package/dist/core/config-manager.js.map +1 -0
  32. package/dist/core/dependency.js +42 -17
  33. package/dist/core/dependency.js.map +1 -0
  34. package/dist/core/file-utils.js +1 -44
  35. package/dist/core/file-utils.js.map +1 -0
  36. package/dist/core/helpers.js +43 -38
  37. package/dist/core/helpers.js.map +1 -0
  38. package/dist/core/managers/cache.js +54 -0
  39. package/dist/core/managers/cache.js.map +1 -0
  40. package/dist/core/managers/config-manager.js +104 -0
  41. package/dist/core/managers/config-manager.js.map +1 -0
  42. package/dist/core/managers/config.js +104 -0
  43. package/dist/core/managers/config.js.map +1 -0
  44. package/dist/core/output.js +49 -0
  45. package/dist/core/output.js.map +1 -0
  46. package/dist/core/parsers/extract-imports.js +2 -7
  47. package/dist/core/parsers/extract-imports.js.map +1 -0
  48. package/dist/core/renderers.js +10 -8
  49. package/dist/core/renderers.js.map +1 -0
  50. package/dist/debug.js +14 -0
  51. package/dist/debug.js.map +1 -0
  52. package/dist/index.js +49 -22
  53. package/dist/index.js.map +1 -0
  54. package/dist/lib/logger.js +38 -9
  55. package/dist/lib/logger.js.map +1 -0
  56. package/dist/lib/polyfills.js +6 -0
  57. package/dist/lib/polyfills.js.map +1 -0
  58. package/dist/lib/prompt.js +35 -0
  59. package/dist/lib/prompt.js.map +1 -0
  60. package/dist/lib/questions.js +29 -0
  61. package/dist/lib/questions.js.map +1 -0
  62. package/dist/lib/utils.js +35 -11
  63. package/dist/lib/utils.js.map +1 -0
  64. package/dist/resolvers/js/alias-loader.js +1 -0
  65. package/dist/resolvers/js/alias-loader.js.map +1 -0
  66. package/dist/resolvers/js/extract-imports.js +46 -0
  67. package/dist/resolvers/js/extract-imports.js.map +1 -0
  68. package/dist/resolvers/js/js-resolver.js +93 -116
  69. package/dist/resolvers/js/js-resolver.js.map +1 -0
  70. package/dist/resolvers/js/resolve-alias.js +58 -0
  71. package/dist/resolvers/js/resolve-alias.js.map +1 -0
  72. package/dist/resolvers/php/bindings.js +21 -9
  73. package/dist/resolvers/php/bindings.js.map +1 -0
  74. package/dist/resolvers/php/extract-imports.js +50 -0
  75. package/dist/resolvers/php/extract-imports.js.map +1 -0
  76. package/dist/resolvers/php/patterns.js +37 -4
  77. package/dist/resolvers/php/patterns.js.map +1 -0
  78. package/dist/resolvers/php/php-resolver.js +99 -59
  79. package/dist/resolvers/php/php-resolver.js.map +1 -0
  80. package/dist/resolvers/php/psr4.js +19 -5
  81. package/dist/resolvers/php/psr4.js.map +1 -0
  82. package/dist/resolvers/shared/excludes.js +1 -0
  83. package/dist/resolvers/shared/excludes.js.map +1 -0
  84. package/dist/resolvers/shared/file-cache.js +1 -29
  85. package/dist/resolvers/shared/file-cache.js.map +1 -0
  86. package/dist/resolvers/shared/resolve-alias.js +62 -0
  87. package/dist/resolvers/shared/resolve-alias.js.map +1 -0
  88. package/dist/resolvers/shared/stats.js +3 -3
  89. package/dist/resolvers/shared/stats.js.map +1 -0
  90. package/dist/shared/collections.js +34 -0
  91. package/dist/shared/collections.js.map +1 -0
  92. package/dist/shared/index.js +20 -0
  93. package/dist/shared/index.js.map +1 -0
  94. package/dist/shared/io.js +52 -0
  95. package/dist/shared/io.js.map +1 -0
  96. package/dist/shared/patterns.js +30 -0
  97. package/dist/shared/patterns.js.map +1 -0
  98. package/dist/shared/stats.js +32 -0
  99. package/dist/shared/stats.js.map +1 -0
  100. package/dist/store.js +16 -0
  101. package/dist/store.js.map +1 -0
  102. package/dist/types/cli.types.js +1 -0
  103. package/dist/types/cli.types.js.map +1 -0
  104. package/dist/types/config.types.js +1 -0
  105. package/dist/types/config.types.js.map +1 -0
  106. package/dist/types/core.types.js +1 -0
  107. package/dist/types/core.types.js.map +1 -0
  108. package/dist/types/index.js +1 -0
  109. package/dist/types/index.js.map +1 -0
  110. package/dist/types/resolver.types.js +1 -0
  111. package/dist/types/resolver.types.js.map +1 -0
  112. package/dist/types/utils.types.js +1 -0
  113. package/dist/types/utils.types.js.map +1 -0
  114. package/package.json +5 -4
@@ -7,7 +7,7 @@ exports.loadProdexConfig = loadProdexConfig;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const default_config_1 = require("./default-config");
10
- const logger_1 = require("../lib/logger");
10
+ const utils_1 = require("../lib/utils");
11
11
  /**
12
12
  * 🧩 Load and merge Prodex configuration (v3)
13
13
  *
@@ -25,10 +25,10 @@ async function loadProdexConfig(flags = {}, cwd) {
25
25
  userConfig = JSON.parse(content);
26
26
  }
27
27
  catch (err) {
28
- logger_1.logger.info("No prodex.json found — using defaults.");
28
+ console.info("No prodex.json found — using defaults.");
29
29
  }
30
30
  // 2️⃣ Merge defaults → user config
31
- const { output, entry, resolve, debug } = default_config_1.DEFAULT_PRODEX_CONFIG;
31
+ const { output, entry, resolve } = default_config_1.DEFAULT_PRODEX_CONFIG;
32
32
  const cfg = {
33
33
  ...default_config_1.DEFAULT_PRODEX_CONFIG,
34
34
  ...userConfig,
@@ -39,11 +39,12 @@ async function loadProdexConfig(flags = {}, cwd) {
39
39
  ui: { ...entry.ui, ...userConfig.entry?.ui },
40
40
  },
41
41
  resolve: { ...resolve, ...userConfig.resolve },
42
- debug: { ...debug, ...userConfig.debug },
43
42
  root: cwd,
43
+ name: flags?.name,
44
44
  };
45
45
  // 4️⃣ Apply CLI flag overrides (if any)
46
46
  applyFlagOverrides(cfg, flags);
47
+ tidyArrayFields(cfg);
47
48
  return cfg;
48
49
  }
49
50
  /** Merge CLI flags into config where relevant. */
@@ -52,8 +53,7 @@ function applyFlagOverrides(cfg, flags) {
52
53
  if (!flags)
53
54
  return;
54
55
  const outputOverrides = {
55
- name: (cfg, v) => (cfg.output.prefix = v),
56
- txt: (cfg) => (cfg.output.format = "txt"),
56
+ txt: (cfg, v) => (cfg.output.format = v ? "txt" : "md"),
57
57
  };
58
58
  const resolveOverrides = {
59
59
  limit: (cfg, v) => (cfg.resolve.limit = v),
@@ -84,7 +84,12 @@ function applyFlagOverrides(cfg, flags) {
84
84
  // Conditional override rule:
85
85
  // If files exist and include was null/undefined → clear include array
86
86
  const hasFiles = Array.isArray(flags.files) ? flags.files.length > 0 : !!flags.files;
87
- if (hasFiles && flags.include == null) {
87
+ if (hasFiles && !flags.include) {
88
88
  cfg.resolve.include = [];
89
89
  }
90
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
@@ -0,0 +1 @@
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"]}
@@ -1,17 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DTS_EXT = exports.BASE_EXTS = exports.GLOBAL_IGNORE = exports.RESOLVERS = exports.CODE_EXTS = exports.ROOT = void 0;
4
- exports.ROOT = process.cwd();
5
- exports.CODE_EXTS = [".js", ".mjs", ".ts", ".tsx", ".d.ts", ".php"];
3
+ exports.VALID_GLOB_CHARS = exports.SUFFIX = exports.GLOBAL_IGNORE = exports.RESOLVERS = exports.DTS_EXT = exports.REAL_EXTS = exports.BASE_EXTS = exports.CODE_EXTS = void 0;
6
4
  const js_resolver_1 = require("../resolvers/js/js-resolver");
7
5
  const php_resolver_1 = require("../resolvers/php/php-resolver");
6
+ exports.CODE_EXTS = [".js", ".mjs", ".ts", ".tsx", ".d.ts", ".php"];
7
+ exports.BASE_EXTS = [".ts", ".tsx", ".js", ".jsx", ".mjs"];
8
+ exports.REAL_EXTS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".d.ts", ".json"]);
9
+ exports.DTS_EXT = ".d.ts";
8
10
  exports.RESOLVERS = {
9
11
  ".php": php_resolver_1.resolvePhpImports,
10
12
  ".ts": js_resolver_1.resolveJsImports,
11
13
  ".tsx": js_resolver_1.resolveJsImports,
12
14
  ".d.ts": js_resolver_1.resolveJsImports,
13
- ".js": js_resolver_1.resolveJsImports
15
+ ".js": js_resolver_1.resolveJsImports,
14
16
  };
15
17
  exports.GLOBAL_IGNORE = ["**/node_modules/**", "**/vendor/**", "**/dist/**"];
16
- exports.BASE_EXTS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".types"];
17
- exports.DTS_EXT = ".d.ts";
18
+ exports.SUFFIX = "trace";
19
+ /**
20
+ * Normalize and sanitize pattern fields.
21
+ * - Always returns an array.
22
+ * - Accepts string or string[].
23
+ * - Splits comma-separated strings.
24
+ * - Trims and removes empty elements.
25
+ * - Filters out invalid or unusable characters for Fast-Glob.
26
+ */
27
+ exports.VALID_GLOB_CHARS = /^[\w\-@./*?|!{}\[\]^$()+]+$/; // allows Fast-Glob-safe symbolsexport const REAL_EXTS = new Set<string>([".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs", ".d.ts", ".json"]);
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/constants/config.ts"],"names":[],"mappings":";;;AAAA,6DAA+D;AAC/D,gEAAkE;AAErD,QAAA,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5D,QAAA,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,QAAA,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9F,QAAA,OAAO,GAAG,OAAO,CAAC;AAElB,QAAA,SAAS,GAAG;IACxB,MAAM,EAAE,gCAAiB;IACzB,KAAK,EAAE,8BAAgB;IACvB,MAAM,EAAE,8BAAgB;IACxB,OAAO,EAAE,8BAAgB;IACzB,KAAK,EAAE,8BAAgB;CACvB,CAAC;AAEW,QAAA,aAAa,GAAG,CAAC,oBAAoB,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;AAErE,QAAA,MAAM,GAAG,OAAO,CAAC;AAE9B;;;;;;;GAOG;AACU,QAAA,gBAAgB,GAAG,6BAA6B,CAAC,CAAC,2IAA2I","sourcesContent":["import { resolveJsImports } from \"../resolvers/js/js-resolver\";\nimport { resolvePhpImports } from \"../resolvers/php/php-resolver\";\n\nexport const CODE_EXTS = [\".js\", \".mjs\", \".ts\", \".tsx\", \".d.ts\", \".php\"];\nexport const BASE_EXTS = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\"];\nexport const REAL_EXTS = new Set<string>([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".d.ts\", \".json\"]);\nexport const DTS_EXT = \".d.ts\";\n\nexport const RESOLVERS = {\n\t\".php\": resolvePhpImports,\n\t\".ts\": resolveJsImports,\n\t\".tsx\": resolveJsImports,\n\t\".d.ts\": resolveJsImports,\n\t\".js\": resolveJsImports,\n};\n\nexport const GLOBAL_IGNORE = [\"**/node_modules/**\", \"**/vendor/**\", \"**/dist/**\"];\n\nexport const SUFFIX = \"trace\";\n\n/**\n * Normalize and sanitize pattern fields.\n * - Always returns an array.\n * - Accepts string or string[].\n * - Splits comma-separated strings.\n * - Trims and removes empty elements.\n * - Filters out invalid or unusable characters for Fast-Glob.\n */\nexport const VALID_GLOB_CHARS = /^[\\w\\-@./*?|!{}\\[\\]^$()+]+$/; // allows Fast-Glob-safe symbolsexport const REAL_EXTS = new Set<string>([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".d.ts\", \".json\"]);\n"]}
@@ -9,7 +9,7 @@ exports.DEFAULT_PRODEX_CONFIG = {
9
9
  version: 3.1,
10
10
  output: {
11
11
  dir: "prodex",
12
- versioned: false,
12
+ versioned: true,
13
13
  prefix: "combined",
14
14
  format: "md",
15
15
  },
@@ -18,13 +18,7 @@ exports.DEFAULT_PRODEX_CONFIG = {
18
18
  ui: {
19
19
  roots: ["app", "routes", "resources/js/**"],
20
20
  scanDepth: 2,
21
- priority: [
22
- "**/routes/web.php",
23
- "**/routes/api.php",
24
- "**/*index.*",
25
- "**/*main.*",
26
- "**/app.*"
27
- ],
21
+ priority: ["**/routes/web.php", "**/routes/api.php", "**/*index.*", "**/*main.*", "**/app.*"],
28
22
  },
29
23
  },
30
24
  resolve: {
@@ -33,16 +27,9 @@ exports.DEFAULT_PRODEX_CONFIG = {
33
27
  "@hooks": "resources/js/hooks",
34
28
  "@data": "resources/js/data",
35
29
  },
36
- exclude: [
37
- "node_modules/**",
38
- "@shadcn/**",
39
- "**/components/ui/**"
40
- ],
30
+ exclude: ["node_modules/**", "@shadcn/**", "**/components/ui/**"],
41
31
  depth: 10,
42
32
  limit: 200,
43
33
  },
44
- debug: {
45
- verbose: false,
46
- showSummary: true,
47
- },
48
34
  };
35
+ //# sourceMappingURL=default-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-config.js","sourceRoot":"","sources":["../../src/constants/default-config.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACU,QAAA,qBAAqB,GAAqB;IAEtD,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE;QACP,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,IAAI;KACZ;IACD,KAAK,EAAE;QACN,KAAK,EAAE,EAAE;QACT,EAAE,EAAE;YACH,KAAK,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC;YAC3C,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC;SAC7F;KACD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,CAAC,WAAW,EAAE,mBAAmB,CAAC;QAC3C,OAAO,EAAE;YACR,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,mBAAmB;SAC5B;QACD,OAAO,EAAE,CAAC,iBAAiB,EAAE,YAAY,EAAE,qBAAqB,CAAC;QACjE,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,GAAG;KACV;CACD,CAAC","sourcesContent":["import type { ProdexConfig, ProdexConfigFile } from \"../types/config.types\";\n\n/**\n * Default configuration for Prodex.\n * Conforms strictly to ProdexConfig for full type safety.\n */\nexport const DEFAULT_PRODEX_CONFIG: ProdexConfigFile = {\n\n\tversion: 3.1,\n\toutput: {\n\t\tdir: \"prodex\",\n\t\tversioned: true,\n\t\tprefix: \"combined\",\n\t\tformat: \"md\",\n\t},\n\tentry: {\n\t\tfiles: [],\n\t\tui: {\n\t\t\troots: [\"app\", \"routes\", \"resources/js/**\"],\n\t\t\tscanDepth: 2,\n\t\t\tpriority: [\"**/routes/web.php\", \"**/routes/api.php\", \"**/*index.*\", \"**/*main.*\", \"**/app.*\"],\n\t\t},\n\t},\n\tresolve: {\n\t\tinclude: [\"**/*.d.ts\", \"**/*.interface.ts\"],\n\t\taliases: {\n\t\t\t\"@hooks\": \"resources/js/hooks\",\n\t\t\t\"@data\": \"resources/js/data\",\n\t\t},\n\t\texclude: [\"node_modules/**\", \"@shadcn/**\", \"**/components/ui/**\"],\n\t\tdepth: 10,\n\t\tlimit: 200,\n\t},\n};\n"]}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLI_USAGE = exports.FLAG_SHORT_MAP = exports.FLAG_MAP = void 0;
4
+ exports.FLAG_MAP = {
5
+ txt: {
6
+ short: "t",
7
+ type: "boolean",
8
+ description: "Output as .txt instead of .md.",
9
+ apply: (cfg, v) => (cfg.output.format = v ? "txt" : "md"),
10
+ },
11
+ name: {
12
+ short: "n",
13
+ type: "string",
14
+ description: "Custom output filename (without extension).",
15
+ apply: (cfg, v) => (cfg.name = v),
16
+ },
17
+ limit: {
18
+ short: "l",
19
+ type: "number",
20
+ description: "Override traversal limit.",
21
+ apply: (cfg, v) => (cfg.resolve.limit = v),
22
+ },
23
+ include: {
24
+ short: "i",
25
+ type: "list",
26
+ description: "Comma-separated include globs.",
27
+ apply: (cfg, v) => (cfg.resolve.include = v),
28
+ },
29
+ exclude: {
30
+ short: "x",
31
+ type: "list",
32
+ description: "Comma-separated exclude globs.",
33
+ apply: (cfg, v) => (cfg.resolve.exclude = v),
34
+ },
35
+ files: {
36
+ short: "f",
37
+ type: "list",
38
+ description: "Entry files (comma-separated).",
39
+ apply: (cfg, v) => (cfg.entry.files = v),
40
+ },
41
+ ci: {
42
+ short: "c",
43
+ type: "boolean",
44
+ description: "Headless (non-interactive) mode.",
45
+ apply: () => { },
46
+ },
47
+ debug: {
48
+ short: "d",
49
+ type: "boolean",
50
+ description: "Enable debug logs.",
51
+ apply: () => { },
52
+ },
53
+ help: {
54
+ short: "h",
55
+ type: "boolean",
56
+ description: "Show CLI help and exit.",
57
+ apply: () => { },
58
+ },
59
+ };
60
+ // Reverse lookup for short aliases
61
+ exports.FLAG_SHORT_MAP = Object.entries(exports.FLAG_MAP).reduce((acc, [k, v]) => {
62
+ //@ts-ignore
63
+ if (v.short)
64
+ acc[v.short] = k;
65
+ return acc;
66
+ }, {});
67
+ exports.CLI_USAGE = `
68
+ Usage: prodex [options]
69
+
70
+ ${Object.entries(exports.FLAG_MAP)
71
+ .map(([k, v]) => ` --${k}${v.short ? ` | -${v.short}` : ""}\t${v.description}`)
72
+ .join("\n")}
73
+ `;
74
+ //# sourceMappingURL=flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/constants/flags.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProdexConfig } from \"../types\";\r\n\r\nexport type FlagType = \"boolean\" | \"string\" | \"number\" | \"list\";\r\nexport type FlagKey = keyof typeof FLAG_MAP;\r\n\r\nexport const FLAG_MAP = {\r\n\ttxt: {\r\n\t\tshort: \"t\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Output as .txt instead of .md.\",\r\n\t\tapply: (cfg: ProdexConfig, v: boolean) => (cfg.output.format = v ? \"txt\" : \"md\"),\r\n\t},\r\n\tname: {\r\n\t\tshort: \"n\",\r\n\t\ttype: \"string\",\r\n\t\tdescription: \"Custom output filename (without extension).\",\r\n\t\tapply: (cfg: ProdexConfig, v: string) => (cfg.name = v),\r\n\t},\r\n\tlimit: {\r\n\t\tshort: \"l\",\r\n\t\ttype: \"number\",\r\n\t\tdescription: \"Override traversal limit.\",\r\n\t\tapply: (cfg: ProdexConfig, v: number) => (cfg.resolve.limit = v),\r\n\t},\r\n\tinclude: {\r\n\t\tshort: \"i\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Comma-separated include globs.\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.resolve.include = v),\r\n\t},\r\n\texclude: {\r\n\t\tshort: \"x\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Comma-separated exclude globs.\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.resolve.exclude = v),\r\n\t},\r\n\tfiles: {\r\n\t\tshort: \"f\",\r\n\t\ttype: \"list\",\r\n\t\tdescription: \"Entry files (comma-separated).\",\r\n\t\tapply: (cfg: ProdexConfig, v: string[]) => (cfg.entry.files = v),\r\n\t},\r\n\tci: {\r\n\t\tshort: \"c\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Headless (non-interactive) mode.\",\r\n\t\tapply: () => {},\r\n\t},\r\n\tdebug: {\r\n\t\tshort: \"d\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Enable debug logs.\",\r\n\t\tapply: () => {},\r\n\t},\r\n\thelp: {\r\n\t\tshort: \"h\",\r\n\t\ttype: \"boolean\",\r\n\t\tdescription: \"Show CLI help and exit.\",\r\n\t\tapply: () => {},\r\n\t},\r\n} as const;\r\n\r\n// Reverse lookup for short aliases\r\nexport const FLAG_SHORT_MAP = Object.entries(FLAG_MAP).reduce((acc, [k, v]) => {\r\n\t//@ts-ignore\r\n\tif (v.short) acc[v.short] = k;\r\n\treturn acc;\r\n}, {} as Record<string, FlagKey>);\r\n\r\nexport const CLI_USAGE = `\r\nUsage: prodex [options]\r\n\r\n${Object.entries(FLAG_MAP)\r\n\t.map(([k, v]) => ` --${k}${v.short ? ` | -${v.short}` : \"\"}\\t${v.description}`)\r\n\t.join(\"\\n\")}\r\n`;\r\n"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cache-keys"), exports);
18
+ __exportStar(require("./default-config"), exports);
19
+ __exportStar(require("./render-constants"), exports);
20
+ __exportStar(require("./config"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mDAAiC;AACjC,qDAAmC;AACnC,2CAAyB","sourcesContent":["export * from \"./cache-keys\";\r\nexport * from \"./default-config\";\r\nexport * from \"./render-constants\";\r\nexport * from \"./config\";\r\n"]}
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
- // ================================================================
3
- // 🧩 Prodex Render Constants
4
- // Defines shared constants for renderer outDir formats.
5
- // ================================================================
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
6
5
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.TEXT_HEADERS = exports.LANG_MAP = void 0;
6
+ exports.MD_FOOTER = exports.TEXT_HEADERS = exports.LANG_MAP = void 0;
7
+ const package_json_1 = __importDefault(require("../../package.json"));
8
8
  exports.LANG_MAP = {
9
9
  "": "js",
10
10
  ".mjs": "js",
@@ -13,11 +13,13 @@ exports.LANG_MAP = {
13
13
  ".tsx": "tsx",
14
14
  ".php": "php",
15
15
  ".json": "json",
16
- ".d.ts": "ts"
16
+ ".d.ts": "ts",
17
17
  };
18
18
  exports.TEXT_HEADERS = {
19
19
  toc: "##==== Combined Scope ====",
20
- path: p => `##==== path: ${p} ====`,
21
- regionStart: p => `##region ${p}`,
22
- regionEnd: "##endregion"
20
+ path: (p) => `##==== path: ${p} ====`,
21
+ regionStart: (p) => `##region ${p}`,
22
+ regionEnd: "##endregion",
23
23
  };
24
+ exports.MD_FOOTER = ["\n---", "*Generated with [Prodex](https://github.com/emxhive/prodex) — Codebase decoded.*", `<!-- PRODEx v${package_json_1.default.version} | ${new Date().toISOString()} -->`].join("\n");
25
+ //# sourceMappingURL=render-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-constants.js","sourceRoot":"","sources":["../../src/constants/render-constants.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAqC;AAExB,QAAA,QAAQ,GAAG;IACvB,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,IAAI;CACb,CAAC;AAEW,QAAA,YAAY,GAAG;IAC3B,GAAG,EAAE,4BAA4B;IACjC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO;IACrC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE;IACnC,SAAS,EAAE,aAAa;CACxB,CAAC;AAEW,QAAA,SAAS,GAAG,CAAC,OAAO,EAAE,kFAAkF,EAAE,gBAAgB,sBAAG,CAAC,OAAO,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import pkg from \"../../package.json\";\n\nexport const LANG_MAP = {\n\t\"\": \"js\",\n\t\".mjs\": \"js\",\n\t\".jsx\": \"jsx\",\n\t\".ts\": \"ts\",\n\t\".tsx\": \"tsx\",\n\t\".php\": \"php\",\n\t\".json\": \"json\",\n\t\".d.ts\": \"ts\",\n};\n\nexport const TEXT_HEADERS = {\n\ttoc: \"##==== Combined Scope ====\",\n\tpath: (p) => `##==== path: ${p} ====`,\n\tregionStart: (p) => `##region ${p}`,\n\tregionEnd: \"##endregion\",\n};\n\nexport const MD_FOOTER = [\"\\n---\", \"*Generated with [Prodex](https://github.com/emxhive/prodex) — Codebase decoded.*\", `<!-- PRODEx v${pkg.version} | ${new Date().toISOString()} -->`].join(\"\\n\");\n"]}
@@ -0,0 +1,54 @@
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
@@ -0,0 +1 @@
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,74 +1,57 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.runCombine = runCombine;
7
- const fs_1 = __importDefault(require("fs"));
8
- const inquirer_1 = __importDefault(require("inquirer"));
9
- const path_1 = __importDefault(require("path"));
10
4
  const picker_1 = require("../cli/picker");
11
5
  const summary_1 = require("../cli/summary");
12
- const dependency_1 = require("./dependency");
13
- const file_utils_1 = require("./file-utils");
14
- const renderers_1 = require("./renderers");
6
+ const cache_keys_1 = require("../constants/cache-keys");
7
+ const cache_1 = require("./managers/cache");
8
+ const config_1 = require("./managers/config");
15
9
  const logger_1 = require("../lib/logger");
16
- const package_json_1 = __importDefault(require("../../package.json"));
17
- async function runCombine(cfg, showUi) {
18
- const { output, entry, resolve } = cfg;
19
- const toMd = cfg.output.format == "md";
20
- const ROOT = cfg.root;
21
- const { ui } = entry;
22
- const entryFiles = entry.files ?? [];
23
- let entries = [];
10
+ const dependency_1 = require("./dependency");
11
+ const helpers_1 = require("./helpers");
12
+ const helpers_2 = require("./helpers");
13
+ const output_1 = require("./output");
14
+ async function runCombine({ cfg, opts }) {
15
+ (0, summary_1.introSummary)();
16
+ const { showUi, cliName } = opts;
17
+ let entries = (await resolveEntries(showUi, cfg)) ?? [];
18
+ (0, summary_1.entrySummary)(entries);
19
+ let result;
20
+ if (!entries.length)
21
+ logger_1.logger.info("No entries found");
22
+ if (entries.length)
23
+ result = await (0, dependency_1.followChain)(entries, cfg);
24
+ const withinclude = await (0, dependency_1.applyIncludes)(cfg, result?.files ?? []);
25
+ if (!withinclude.length)
26
+ return logger_1.logger.info("No Includes found. Exiting process...");
27
+ const autoName = (0, helpers_2.smartNaming)(entries);
28
+ const outputPath = await (0, output_1.produceOutput)({ name: cliName ?? autoName, files: withinclude, cfg, showUi });
29
+ persistAliases();
30
+ (0, summary_1.endSummary)(outputPath, result);
31
+ }
32
+ async function resolveEntries(showUi, cfg) {
33
+ const { root, entry: { files }, resolve: { include }, } = cfg;
24
34
  if (!showUi) {
25
35
  logger_1.logger.info("CI Mode");
26
- if (!entryFiles.length) {
36
+ if (!files?.length) {
27
37
  logger_1.logger.warn("No entry files defined and UI mode is disabled.");
28
- return;
38
+ if (!include.length)
39
+ process.exit(1);
40
+ logger_1.logger.info("Applying Includes");
29
41
  }
30
- entries = (await (0, file_utils_1.globScan)(entryFiles, { cwd: ROOT })).files;
42
+ return (await (0, helpers_1.globScan)(files, { cwd: root })).files;
31
43
  }
32
44
  else {
33
- entries = await (0, picker_1.pickEntries)(ui.roots, ui.scanDepth, cfg);
34
- }
35
- if (!entries.length) {
36
- logger_1.logger.error("No entries selected.");
37
- return;
45
+ return await (0, picker_1.pickEntries)(cfg);
38
46
  }
39
- logger_1.logger.log("\n📋 You selected:");
40
- for (const e of entries)
41
- logger_1.logger.log(" -", e.replace(ROOT + "/", ""));
42
- const autoName = (0, file_utils_1.generateOutputName)(entries);
43
- const outDir = output.dir;
44
- const limit = resolve.limit;
45
- let outputBase = autoName;
46
- if (showUi) {
47
- const { outputBase: answer } = await inquirer_1.default.prompt([
48
- {
49
- type: "input",
50
- name: "outputBase",
51
- message: "Output file name (without extension):",
52
- default: autoName,
53
- filter: (v) => (v.trim() || autoName).replace(/[<>:"/\\|?*]+/g, "_"),
54
- },
55
- ]);
56
- outputBase = answer;
57
- }
58
- try {
59
- fs_1.default.mkdirSync(outDir, { recursive: true });
60
- }
61
- catch {
62
- logger_1.logger.warn("Could not create outDir directory:", outDir);
47
+ }
48
+ /**
49
+ * 🧩 Persist discovered aliases (if any)
50
+ */
51
+ function persistAliases() {
52
+ const aliases = cache_1.CacheManager.dump(cache_keys_1.CACHE_KEYS.ALIASES);
53
+ if (Object.keys(aliases).length) {
54
+ config_1.ConfigManager.persist({ resolve: { aliases } });
63
55
  }
64
- const outputPath = (0, file_utils_1.resolveOutDirPath)(outDir, outputBase, toMd);
65
- (0, summary_1.showSummary)({ outDir, fileName: path_1.default.basename(outputPath), entries });
66
- const result = await (0, dependency_1.followChain)(entries, cfg, limit);
67
- const withinclude = await (0, dependency_1.applyincludes)(cfg, result.files);
68
- const sorted = [...withinclude].sort((a, b) => a.localeCompare(b));
69
- const footer = ["\n---", "*Generated with [Prodex](https://github.com/emxhive/prodex) — Codebase decoded.*", `<!-- PRODEx v${package_json_1.default.version} | ${new Date().toISOString()} -->`].join("\n");
70
- const content = toMd ? [(0, renderers_1.tocTxt)(sorted), ...sorted.map(renderers_1.renderTxt)].join("") : [(0, renderers_1.tocMd)(sorted), ...sorted.map((f, i) => (0, renderers_1.renderMd)(f, i)), footer].join("\n");
71
- fs_1.default.writeFileSync(outputPath, content, "utf8");
72
- logger_1.logger.log(`\n✅ ${outputPath.norm()}`);
73
- (0, summary_1.importSummary)(result);
74
56
  }
57
+ //# sourceMappingURL=combine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combine.js","sourceRoot":"","sources":["../../src/core/combine.ts"],"names":[],"mappings":";;AAYA,gCAqBC;AAjCD,0CAA4C;AAC5C,4CAAwE;AACxE,wDAAqD;AACrD,4CAAgD;AAChD,8CAAkD;AAClD,0CAAuC;AAEvC,6CAA0D;AAC1D,uCAAqC;AACrC,uCAAwC;AACxC,qCAAyC;AAElC,KAAK,UAAU,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,EAAiB;IAC5D,IAAA,sBAAY,GAAE,CAAC;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,MAAM,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAExD,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;IAEtB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,eAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,GAAG,MAAM,IAAA,wBAAW,EAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,MAAM,IAAA,0BAAa,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,OAAO,eAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAErF,MAAM,QAAQ,GAAG,IAAA,qBAAW,EAAC,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,IAAA,sBAAa,EAAC,EAAE,IAAI,EAAE,OAAO,IAAI,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvG,cAAc,EAAE,CAAC;IACjB,IAAA,oBAAU,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAe,EAAE,GAAiB;IAC/D,MAAM,EACL,IAAI,EACJ,KAAK,EAAE,EAAE,KAAK,EAAE,EAChB,OAAO,EAAE,EAAE,OAAO,EAAE,GACpB,GAAG,GAAG,CAAC;IAER,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACpB,eAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,eAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,MAAM,IAAA,kBAAQ,EAAC,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,CAAC;SAAM,CAAC;QACP,OAAO,MAAM,IAAA,oBAAW,EAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,cAAc;IACtB,MAAM,OAAO,GAAG,oBAAY,CAAC,IAAI,CAAC,uBAAU,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,sBAAa,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;AACF,CAAC","sourcesContent":["import { pickEntries } from \"../cli/picker\";\nimport { endSummary, entrySummary, introSummary } from \"../cli/summary\";\nimport { CACHE_KEYS } from \"../constants/cache-keys\";\nimport { CacheManager } from \"./managers/cache\";\nimport { ConfigManager } from \"./managers/config\";\nimport { logger } from \"../lib/logger\";\nimport { CombineParams, ProdexConfig } from \"../types\";\nimport { applyIncludes, followChain } from \"./dependency\";\nimport { globScan } from \"./helpers\";\nimport { smartNaming } from \"./helpers\";\nimport { produceOutput } from \"./output\";\n\nexport async function runCombine({ cfg, opts }: CombineParams) {\n\tintroSummary();\n\n\tconst { showUi, cliName } = opts;\n\tlet entries = (await resolveEntries(showUi, cfg)) ?? [];\n\n\tentrySummary(entries);\n\n\tlet result;\n\tif (!entries.length) logger.info(\"No entries found\");\n\n\tif (entries.length) result = await followChain(entries, cfg);\n\n\tconst withinclude = await applyIncludes(cfg, result?.files ?? []);\n\tif (!withinclude.length) return logger.info(\"No Includes found. Exiting process...\");\n\n\tconst autoName = smartNaming(entries);\n\tconst outputPath = await produceOutput({ name: cliName ?? autoName, files: withinclude, cfg, showUi });\n\n\tpersistAliases();\n\tendSummary(outputPath, result);\n}\n\nasync function resolveEntries(showUi: boolean, cfg: ProdexConfig): Promise<string[]> {\n\tconst {\n\t\troot,\n\t\tentry: { files },\n\t\tresolve: { include },\n\t} = cfg;\n\n\tif (!showUi) {\n\t\tlogger.info(\"CI Mode\");\n\t\tif (!files?.length) {\n\t\t\tlogger.warn(\"No entry files defined and UI mode is disabled.\");\n\t\t\tif (!include.length) process.exit(1);\n\t\t\tlogger.info(\"Applying Includes\");\n\t\t}\n\t\treturn (await globScan(files, { cwd: root })).files;\n\t} else {\n\t\treturn await pickEntries(cfg);\n\t}\n}\n\n/**\n * 🧩 Persist discovered aliases (if any)\n */\nfunction persistAliases() {\n\tconst aliases = CacheManager.dump(CACHE_KEYS.ALIASES);\n\tif (Object.keys(aliases).length) {\n\t\tConfigManager.persist({ resolve: { aliases } });\n\t}\n}\n"]}
@@ -0,0 +1,104 @@
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
@@ -0,0 +1 @@
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"]}