ioc-manifest 0.3.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 (148) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +350 -0
  3. package/bin/ioc.cjs +19 -0
  4. package/dist/cli/ioc.d.ts +3 -0
  5. package/dist/cli/ioc.d.ts.map +1 -0
  6. package/dist/cli/ioc.js +86 -0
  7. package/dist/cli/ioc.js.map +1 -0
  8. package/dist/cli/parseIocCli.d.ts +21 -0
  9. package/dist/cli/parseIocCli.d.ts.map +1 -0
  10. package/dist/cli/parseIocCli.js +76 -0
  11. package/dist/cli/parseIocCli.js.map +1 -0
  12. package/dist/config/iocConfig.d.ts +97 -0
  13. package/dist/config/iocConfig.d.ts.map +1 -0
  14. package/dist/config/iocConfig.js +65 -0
  15. package/dist/config/iocConfig.js.map +1 -0
  16. package/dist/config/loadIocConfig.d.ts +25 -0
  17. package/dist/config/loadIocConfig.d.ts.map +1 -0
  18. package/dist/config/loadIocConfig.js +245 -0
  19. package/dist/config/loadIocConfig.js.map +1 -0
  20. package/dist/config/parseDiscoveryScanDirs.d.ts +6 -0
  21. package/dist/config/parseDiscoveryScanDirs.d.ts.map +1 -0
  22. package/dist/config/parseDiscoveryScanDirs.js +78 -0
  23. package/dist/config/parseDiscoveryScanDirs.js.map +1 -0
  24. package/dist/core/defaultImplementationSelection.d.ts +14 -0
  25. package/dist/core/defaultImplementationSelection.d.ts.map +1 -0
  26. package/dist/core/defaultImplementationSelection.js +47 -0
  27. package/dist/core/defaultImplementationSelection.js.map +1 -0
  28. package/dist/core/index.d.ts +4 -0
  29. package/dist/core/index.d.ts.map +1 -0
  30. package/dist/core/index.js +3 -0
  31. package/dist/core/index.js.map +1 -0
  32. package/dist/core/manifest.d.ts +79 -0
  33. package/dist/core/manifest.d.ts.map +1 -0
  34. package/dist/core/manifest.js +3 -0
  35. package/dist/core/manifest.js.map +1 -0
  36. package/dist/core/resolver.d.ts +18 -0
  37. package/dist/core/resolver.d.ts.map +1 -0
  38. package/dist/core/resolver.js +27 -0
  39. package/dist/core/resolver.js.map +1 -0
  40. package/dist/generator/contractTypeSourceFile.d.ts +16 -0
  41. package/dist/generator/contractTypeSourceFile.d.ts.map +1 -0
  42. package/dist/generator/contractTypeSourceFile.js +236 -0
  43. package/dist/generator/contractTypeSourceFile.js.map +1 -0
  44. package/dist/generator/discoverFactories/discoverFactories.d.ts +18 -0
  45. package/dist/generator/discoverFactories/discoverFactories.d.ts.map +1 -0
  46. package/dist/generator/discoverFactories/discoverFactories.js +108 -0
  47. package/dist/generator/discoverFactories/discoverFactories.js.map +1 -0
  48. package/dist/generator/discoverFactories/discoveryOutcomeTypes.d.ts +47 -0
  49. package/dist/generator/discoverFactories/discoveryOutcomeTypes.d.ts.map +1 -0
  50. package/dist/generator/discoverFactories/discoveryOutcomeTypes.js +19 -0
  51. package/dist/generator/discoverFactories/discoveryOutcomeTypes.js.map +1 -0
  52. package/dist/generator/discoverFactories/inferFactoryDependencyContracts.d.ts +11 -0
  53. package/dist/generator/discoverFactories/inferFactoryDependencyContracts.d.ts.map +1 -0
  54. package/dist/generator/discoverFactories/inferFactoryDependencyContracts.js +118 -0
  55. package/dist/generator/discoverFactories/inferFactoryDependencyContracts.js.map +1 -0
  56. package/dist/generator/discoverFactories/scanFactoryFile.d.ts +18 -0
  57. package/dist/generator/discoverFactories/scanFactoryFile.d.ts.map +1 -0
  58. package/dist/generator/discoverFactories/scanFactoryFile.js +379 -0
  59. package/dist/generator/discoverFactories/scanFactoryFile.js.map +1 -0
  60. package/dist/generator/generateManifest.d.ts +13 -0
  61. package/dist/generator/generateManifest.d.ts.map +1 -0
  62. package/dist/generator/generateManifest.js +88 -0
  63. package/dist/generator/generateManifest.js.map +1 -0
  64. package/dist/generator/iocProgramContext.d.ts +11 -0
  65. package/dist/generator/iocProgramContext.d.ts.map +1 -0
  66. package/dist/generator/iocProgramContext.js +81 -0
  67. package/dist/generator/iocProgramContext.js.map +1 -0
  68. package/dist/generator/manifestOptions.d.ts +26 -0
  69. package/dist/generator/manifestOptions.d.ts.map +1 -0
  70. package/dist/generator/manifestOptions.js +86 -0
  71. package/dist/generator/manifestOptions.js.map +1 -0
  72. package/dist/generator/manifestPaths.d.ts +94 -0
  73. package/dist/generator/manifestPaths.d.ts.map +1 -0
  74. package/dist/generator/manifestPaths.js +377 -0
  75. package/dist/generator/manifestPaths.js.map +1 -0
  76. package/dist/generator/naming.d.ts +9 -0
  77. package/dist/generator/naming.d.ts.map +1 -0
  78. package/dist/generator/naming.js +46 -0
  79. package/dist/generator/naming.js.map +1 -0
  80. package/dist/generator/resolveRegistrationPlan.d.ts +66 -0
  81. package/dist/generator/resolveRegistrationPlan.d.ts.map +1 -0
  82. package/dist/generator/resolveRegistrationPlan.js +377 -0
  83. package/dist/generator/resolveRegistrationPlan.js.map +1 -0
  84. package/dist/generator/types.d.ts +37 -0
  85. package/dist/generator/types.d.ts.map +1 -0
  86. package/dist/generator/types.js +2 -0
  87. package/dist/generator/types.js.map +1 -0
  88. package/dist/generator/writeManifest.d.ts +19 -0
  89. package/dist/generator/writeManifest.d.ts.map +1 -0
  90. package/dist/generator/writeManifest.js +405 -0
  91. package/dist/generator/writeManifest.js.map +1 -0
  92. package/dist/groups/baseTypeAssignability.d.ts +48 -0
  93. package/dist/groups/baseTypeAssignability.d.ts.map +1 -0
  94. package/dist/groups/baseTypeAssignability.js +145 -0
  95. package/dist/groups/baseTypeAssignability.js.map +1 -0
  96. package/dist/groups/resolveGroupPlan.d.ts +85 -0
  97. package/dist/groups/resolveGroupPlan.d.ts.map +1 -0
  98. package/dist/groups/resolveGroupPlan.js +215 -0
  99. package/dist/groups/resolveGroupPlan.js.map +1 -0
  100. package/dist/index.d.ts +22 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +20 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/inspection/formatReports.d.ts +14 -0
  105. package/dist/inspection/formatReports.d.ts.map +1 -0
  106. package/dist/inspection/formatReports.js +115 -0
  107. package/dist/inspection/formatReports.js.map +1 -0
  108. package/dist/inspection/index.d.ts +8 -0
  109. package/dist/inspection/index.d.ts.map +1 -0
  110. package/dist/inspection/index.js +8 -0
  111. package/dist/inspection/index.js.map +1 -0
  112. package/dist/inspection/reports.d.ts +40 -0
  113. package/dist/inspection/reports.d.ts.map +1 -0
  114. package/dist/inspection/reports.js +95 -0
  115. package/dist/inspection/reports.js.map +1 -0
  116. package/dist/inspection/runDiscoveryAnalysis.d.ts +36 -0
  117. package/dist/inspection/runDiscoveryAnalysis.d.ts.map +1 -0
  118. package/dist/inspection/runDiscoveryAnalysis.js +48 -0
  119. package/dist/inspection/runDiscoveryAnalysis.js.map +1 -0
  120. package/dist/inspection/validateManifest.d.ts +8 -0
  121. package/dist/inspection/validateManifest.d.ts.map +1 -0
  122. package/dist/inspection/validateManifest.js +46 -0
  123. package/dist/inspection/validateManifest.js.map +1 -0
  124. package/dist/runtime/bootstrap.d.ts +13 -0
  125. package/dist/runtime/bootstrap.d.ts.map +1 -0
  126. package/dist/runtime/bootstrap.js +259 -0
  127. package/dist/runtime/bootstrap.js.map +1 -0
  128. package/dist/runtime/index.d.ts +4 -0
  129. package/dist/runtime/index.d.ts.map +1 -0
  130. package/dist/runtime/index.js +4 -0
  131. package/dist/runtime/index.js.map +1 -0
  132. package/dist/runtime/iocResolutionError.d.ts +54 -0
  133. package/dist/runtime/iocResolutionError.d.ts.map +1 -0
  134. package/dist/runtime/iocResolutionError.js +266 -0
  135. package/dist/runtime/iocResolutionError.js.map +1 -0
  136. package/dist/runtime/iocResolutionStack.d.ts +21 -0
  137. package/dist/runtime/iocResolutionStack.d.ts.map +1 -0
  138. package/dist/runtime/iocResolutionStack.js +17 -0
  139. package/dist/runtime/iocResolutionStack.js.map +1 -0
  140. package/dist/runtime/iocRuntimeErrors.d.ts +35 -0
  141. package/dist/runtime/iocRuntimeErrors.d.ts.map +1 -0
  142. package/dist/runtime/iocRuntimeErrors.js +27 -0
  143. package/dist/runtime/iocRuntimeErrors.js.map +1 -0
  144. package/dist/runtime/registrationKeyIndex.d.ts +12 -0
  145. package/dist/runtime/registrationKeyIndex.d.ts.map +1 -0
  146. package/dist/runtime/registrationKeyIndex.js +19 -0
  147. package/dist/runtime/registrationKeyIndex.js.map +1 -0
  148. package/package.json +67 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * @fileoverview Serializes manifest data to `ioc-manifest.ts` (runtime imports + metadata) and
3
+ * `ioc-registry.types.ts` (cradle typing). Keeps output deterministic: sorted keys, stable module aliases,
4
+ * temp-then-rename for safe concurrent runs.
5
+ */
6
+ import fs from "node:fs/promises";
7
+ import path from "node:path";
8
+ import { cradleTypeImportUsesDefaultExport, resolveContractTypeSourceFile, } from "./contractTypeSourceFile.js";
9
+ /** Deterministic ordering for manifest output. */
10
+ const sortFactoriesForManifest = (factories) => [...factories].sort((a, b) => {
11
+ if (a.registrationKey !== b.registrationKey) {
12
+ return a.registrationKey.localeCompare(b.registrationKey);
13
+ }
14
+ if (a.modulePath !== b.modulePath) {
15
+ return a.modulePath.localeCompare(b.modulePath);
16
+ }
17
+ return a.exportName.localeCompare(b.exportName);
18
+ });
19
+ /** One row per implementation module, in stable order. */
20
+ const uniqueModuleRows = (sortedFactories) => {
21
+ const seen = new Map();
22
+ for (const factory of sortedFactories) {
23
+ if (seen.has(factory.modulePath)) {
24
+ continue;
25
+ }
26
+ seen.set(factory.modulePath, {
27
+ relImport: factory.relImport,
28
+ modulePath: factory.modulePath,
29
+ });
30
+ }
31
+ return Array.from(seen.values()).sort((a, b) => a.modulePath.localeCompare(b.modulePath));
32
+ };
33
+ const sanitizeToIdentifierPart = (raw) => {
34
+ const s = raw.replace(/[^a-zA-Z0-9_]/g, "_");
35
+ if (s.length === 0) {
36
+ return "module";
37
+ }
38
+ if (/^[0-9]/.test(s)) {
39
+ return `_${s}`;
40
+ }
41
+ return s;
42
+ };
43
+ const tsIdentifierOrQuoted = (key) => /^[a-zA-Z_$][\w$]*$/.test(key) ? key : JSON.stringify(key);
44
+ /**
45
+ * Stable, collision-safe namespace identifiers derived from module paths
46
+ * (e.g. `examples/a-single-implementation.ts` → `ioc_examples_a_single_implementation`).
47
+ */
48
+ const assignStableModuleAliases = (modules) => {
49
+ const pathToAlias = new Map();
50
+ const used = new Set();
51
+ for (const moduleEntry of modules) {
52
+ const withoutExt = moduleEntry.modulePath.replace(/\.[^.]+$/, "");
53
+ const segments = withoutExt.split(/[/\\]/).filter(Boolean);
54
+ const base = sanitizeToIdentifierPart(segments.length > 0 ? `ioc_${segments.join("_")}` : "ioc_module");
55
+ let candidate = base;
56
+ let n = 2;
57
+ while (used.has(candidate)) {
58
+ candidate = `${base}_${n}`;
59
+ n += 1;
60
+ }
61
+ used.add(candidate);
62
+ pathToAlias.set(moduleEntry.modulePath, candidate);
63
+ }
64
+ return pathToAlias;
65
+ };
66
+ const buildModuleIndexByPath = (modules) => {
67
+ const out = new Map();
68
+ modules.forEach((row, index) => {
69
+ out.set(row.modulePath, index);
70
+ });
71
+ return out;
72
+ };
73
+ const plansToIocContractManifest = (plans, moduleIndexByPath) => {
74
+ const out = {};
75
+ for (const plan of plans) {
76
+ const implementations = {};
77
+ for (const impl of plan.implementations) {
78
+ const moduleIndex = moduleIndexByPath.get(impl.modulePath);
79
+ if (moduleIndex === undefined) {
80
+ throw new Error(`[ioc] internal error: module path "${impl.modulePath}" missing from module index map`);
81
+ }
82
+ const isResolvedDefault = impl.implementationName === plan.defaultImplementationName;
83
+ const accessKeyDiffersFromConvention = plan.accessKey !== plan.contractKey;
84
+ implementations[impl.implementationName] = {
85
+ exportName: impl.exportName,
86
+ registrationKey: impl.registrationKey,
87
+ modulePath: impl.modulePath,
88
+ relImport: impl.relImport,
89
+ contractName: plan.contractName,
90
+ implementationName: impl.implementationName,
91
+ lifetime: impl.lifetime,
92
+ moduleIndex,
93
+ ...(isResolvedDefault ? { default: true } : {}),
94
+ ...(accessKeyDiffersFromConvention
95
+ ? { accessKey: plan.accessKey }
96
+ : {}),
97
+ ...(impl.discoveredBy !== undefined
98
+ ? { discoveredBy: impl.discoveredBy }
99
+ : {}),
100
+ ...(impl.configOverridesApplied !== undefined &&
101
+ impl.configOverridesApplied.length > 0
102
+ ? { configOverridesApplied: impl.configOverridesApplied }
103
+ : {}),
104
+ ...(impl.dependencyContractNames !== undefined &&
105
+ impl.dependencyContractNames.length > 0
106
+ ? { dependencyContractNames: impl.dependencyContractNames }
107
+ : {}),
108
+ };
109
+ }
110
+ out[plan.contractName] = implementations;
111
+ }
112
+ return out;
113
+ };
114
+ const serializeGroupNodeLiteral = (node, baseIndent) => {
115
+ const inner = `${baseIndent} `;
116
+ if (Array.isArray(node)) {
117
+ if (node.length === 0) {
118
+ return "[]";
119
+ }
120
+ const lines = ["["];
121
+ for (const leaf of node) {
122
+ lines.push(`${inner}{`);
123
+ lines.push(`${inner} contractName: ${JSON.stringify(leaf.contractName)},`);
124
+ lines.push(`${inner} registrationKey: ${JSON.stringify(leaf.registrationKey)},`);
125
+ lines.push(`${inner}},`);
126
+ }
127
+ lines.push(`${baseIndent}]`);
128
+ return lines.join("\n");
129
+ }
130
+ const propKeys = Object.keys(node).sort((a, b) => a.localeCompare(b));
131
+ if (propKeys.length === 0) {
132
+ return "{}";
133
+ }
134
+ const lines = ["{"];
135
+ for (const propKey of propKeys) {
136
+ const leaf = node[propKey];
137
+ lines.push(`${inner}${tsIdentifierOrQuoted(propKey)}: {`);
138
+ lines.push(`${inner} contractName: ${JSON.stringify(leaf.contractName)},`);
139
+ lines.push(`${inner} registrationKey: ${JSON.stringify(leaf.registrationKey)},`);
140
+ lines.push(`${inner}},`);
141
+ }
142
+ lines.push(`${baseIndent}}`);
143
+ return lines.join("\n");
144
+ };
145
+ const serializeGroupRootsForManifest = (groupsManifest) => {
146
+ if (groupsManifest === undefined) {
147
+ return "";
148
+ }
149
+ const rootKeys = Object.keys(groupsManifest).sort((a, b) => a.localeCompare(b));
150
+ const blocks = [];
151
+ for (const key of rootKeys) {
152
+ const node = groupsManifest[key];
153
+ blocks.push("");
154
+ blocks.push(` // ${key}`);
155
+ blocks.push(` ${tsIdentifierOrQuoted(key)}: ${serializeGroupNodeLiteral(node, " ")},`);
156
+ }
157
+ return blocks.join("\n");
158
+ };
159
+ const buildIocManifestGroupRootsTypeSource = (groupsManifest) => {
160
+ const rootKeys = Object.keys(groupsManifest).sort((a, b) => a.localeCompare(b));
161
+ const lines = ["type IocManifestGroupRoots = {"];
162
+ for (const key of rootKeys) {
163
+ const node = groupsManifest[key];
164
+ if (Array.isArray(node)) {
165
+ lines.push(` readonly ${tsIdentifierOrQuoted(key)}: readonly [`);
166
+ for (const leaf of node) {
167
+ lines.push(` { readonly contractName: ${JSON.stringify(leaf.contractName)}; readonly registrationKey: ${JSON.stringify(leaf.registrationKey)} },`);
168
+ }
169
+ lines.push(" ];");
170
+ continue;
171
+ }
172
+ lines.push(` readonly ${tsIdentifierOrQuoted(key)}: {`);
173
+ const propKeys = Object.keys(node).sort((a, b) => a.localeCompare(b));
174
+ for (const propKey of propKeys) {
175
+ const leaf = node[propKey];
176
+ lines.push(` readonly ${tsIdentifierOrQuoted(propKey)}: { readonly contractName: ${JSON.stringify(leaf.contractName)}; readonly registrationKey: ${JSON.stringify(leaf.registrationKey)} };`);
177
+ }
178
+ lines.push(" };");
179
+ }
180
+ lines.push("};");
181
+ return lines.join("\n");
182
+ };
183
+ const serializeMetadataBlock = (meta) => {
184
+ const lines = [
185
+ ` exportName: ${JSON.stringify(meta.exportName)},`,
186
+ ` registrationKey: ${JSON.stringify(meta.registrationKey)},`,
187
+ ` modulePath: ${JSON.stringify(meta.modulePath)},`,
188
+ ` relImport: ${JSON.stringify(meta.relImport)},`,
189
+ ` contractName: ${JSON.stringify(meta.contractName)},`,
190
+ ` implementationName: ${JSON.stringify(meta.implementationName)},`,
191
+ ` lifetime: ${JSON.stringify(meta.lifetime)},`,
192
+ ` moduleIndex: ${meta.moduleIndex},`,
193
+ ];
194
+ if (meta.group !== undefined) {
195
+ lines.push(` group: ${JSON.stringify(meta.group)},`);
196
+ }
197
+ if (meta.default !== undefined) {
198
+ lines.push(` default: ${meta.default},`);
199
+ }
200
+ if (meta.discoveredBy !== undefined) {
201
+ lines.push(` discoveredBy: ${JSON.stringify(meta.discoveredBy)},`);
202
+ }
203
+ if (meta.configOverridesApplied !== undefined) {
204
+ lines.push(` configOverridesApplied: ${JSON.stringify(meta.configOverridesApplied)},`);
205
+ }
206
+ if (meta.dependencyContractNames !== undefined) {
207
+ lines.push(` dependencyContractNames: ${JSON.stringify(meta.dependencyContractNames)},`);
208
+ }
209
+ if (meta.accessKey !== undefined) {
210
+ lines.push(` accessKey: ${JSON.stringify(meta.accessKey)},`);
211
+ }
212
+ return lines.join("\n");
213
+ };
214
+ const serializeRegistrationManifestValue = (manifest) => {
215
+ const contractNames = Object.keys(manifest).sort((a, b) => a.localeCompare(b));
216
+ const contractLines = ["{"];
217
+ for (const contractName of contractNames) {
218
+ const impls = manifest[contractName];
219
+ const implKeys = Object.keys(impls).sort((a, b) => a.localeCompare(b));
220
+ contractLines.push(` ${JSON.stringify(contractName)}: {`);
221
+ for (const implKey of implKeys) {
222
+ const meta = impls[implKey];
223
+ contractLines.push(` ${JSON.stringify(implKey)}: {`);
224
+ contractLines.push(serializeMetadataBlock(meta));
225
+ contractLines.push(" },");
226
+ }
227
+ contractLines.push(" },");
228
+ }
229
+ contractLines.push("}");
230
+ return contractLines.join("\n");
231
+ };
232
+ const serializeMainIocManifestSource = (contractManifest, groupsManifest, manifestImportFromPackage, importLines, moduleArrayLines) => {
233
+ const header = `/* AUTO-GENERATED. DO NOT EDIT.
234
+ Primary container manifest.
235
+ Re-run \`npm run gen:manifest\` after changing factories or IoC config.
236
+ */
237
+ `;
238
+ const groupRootsBlock = serializeGroupRootsForManifest(groupsManifest);
239
+ const hasGroups = groupsManifest !== undefined && Object.keys(groupsManifest).length > 0;
240
+ const groupRootsTypeBlock = hasGroups
241
+ ? `${buildIocManifestGroupRootsTypeSource(groupsManifest)}\n\n`
242
+ : "";
243
+ const satisfiesType = hasGroups
244
+ ? "IocGeneratedContainerManifest<IocManifestGroupRoots>"
245
+ : "IocGeneratedContainerManifest";
246
+ const contractsBlock = serializeRegistrationManifestValue(contractManifest);
247
+ return `${header}import type {
248
+ IocGeneratedContainerManifest,
249
+ IocModuleNamespace,
250
+ } from "${manifestImportFromPackage}";
251
+
252
+ ${importLines.join("\n")}
253
+
254
+ ${groupRootsTypeBlock}export const iocManifest = {
255
+ moduleImports: [
256
+ ${moduleArrayLines.join("\n")}
257
+ ] as const satisfies readonly IocModuleNamespace[],
258
+
259
+ contracts: ${contractsBlock},${groupRootsBlock}
260
+ } as const satisfies ${satisfiesType};
261
+ `;
262
+ };
263
+ const buildCradleTypeSource = (plans, groupsManifest, registryTypesBuildContext) => {
264
+ const importLines = [];
265
+ if (registryTypesBuildContext === undefined) {
266
+ const typeImports = new Map();
267
+ for (const plan of plans) {
268
+ const importPath = plan.contractTypeRelImport;
269
+ const set = typeImports.get(importPath) ?? new Set();
270
+ set.add(plan.contractName);
271
+ typeImports.set(importPath, set);
272
+ }
273
+ for (const [relImport, names] of Array.from(typeImports.entries()).sort(([a], [b]) => a.localeCompare(b))) {
274
+ const sorted = Array.from(names).sort((x, y) => x.localeCompare(y));
275
+ importLines.push(`import type { ${sorted.join(", ")} } from "${relImport}";`);
276
+ }
277
+ }
278
+ else {
279
+ const { program, generatedDir, scanDirs } = registryTypesBuildContext;
280
+ const grouped = new Map();
281
+ for (const plan of plans) {
282
+ const relImport = plan.contractTypeRelImport;
283
+ let bucket = grouped.get(relImport);
284
+ if (bucket === undefined) {
285
+ bucket = { named: new Set(), defaults: new Set() };
286
+ grouped.set(relImport, bucket);
287
+ }
288
+ const sourceFile = resolveContractTypeSourceFile(program, generatedDir, relImport, scanDirs, plan.contractName);
289
+ const useDefault = sourceFile !== undefined &&
290
+ cradleTypeImportUsesDefaultExport(sourceFile, plan.contractName);
291
+ if (useDefault) {
292
+ bucket.defaults.add(plan.contractName);
293
+ }
294
+ else {
295
+ bucket.named.add(plan.contractName);
296
+ }
297
+ }
298
+ for (const [relImport, bucket] of Array.from(grouped.entries()).sort(([a], [b]) => a.localeCompare(b))) {
299
+ const defaultNames = Array.from(bucket.defaults).sort((x, y) => x.localeCompare(y));
300
+ const namedNames = Array.from(bucket.named).sort((x, y) => x.localeCompare(y));
301
+ for (const defaultName of defaultNames) {
302
+ importLines.push(`import type ${defaultName} from "${relImport}";`);
303
+ }
304
+ if (namedNames.length > 0) {
305
+ importLines.push(`import type { ${namedNames.join(", ")} } from "${relImport}";`);
306
+ }
307
+ }
308
+ }
309
+ const propertyLines = [];
310
+ const sortedPlans = [...plans].sort((a, b) => a.contractName.localeCompare(b.contractName));
311
+ for (const plan of sortedPlans) {
312
+ const typeName = plan.contractName;
313
+ propertyLines.push(` ${plan.accessKey}: ${typeName};`);
314
+ if (plan.collectionKey !== undefined) {
315
+ propertyLines.push(` ${plan.collectionKey}: ReadonlyArray<${typeName}>;`);
316
+ }
317
+ }
318
+ const appendGroupNodeType = (node, indent) => {
319
+ if (Array.isArray(node)) {
320
+ const seen = new Set();
321
+ const order = [];
322
+ for (const leaf of node) {
323
+ if (!seen.has(leaf.contractName)) {
324
+ seen.add(leaf.contractName);
325
+ order.push(leaf.contractName);
326
+ }
327
+ }
328
+ const union = order.length > 0 ? order.join(" | ") : "never";
329
+ return `ReadonlyArray<${union}>`;
330
+ }
331
+ const lines = [`${indent}{`];
332
+ const sortedKeys = Object.keys(node).sort((a, b) => a.localeCompare(b));
333
+ for (const key of sortedKeys) {
334
+ const leaf = node[key];
335
+ lines.push(`${indent} ${tsIdentifierOrQuoted(key)}: ${leaf.contractName};`);
336
+ }
337
+ lines.push(`${indent}}`);
338
+ return lines.join("\n");
339
+ };
340
+ if (groupsManifest !== undefined) {
341
+ const groupRootKeys = Object.keys(groupsManifest).sort((a, b) => a.localeCompare(b));
342
+ for (const key of groupRootKeys) {
343
+ const node = groupsManifest[key];
344
+ propertyLines.push(` ${tsIdentifierOrQuoted(key)}: ${appendGroupNodeType(node, "")};`);
345
+ }
346
+ }
347
+ const header = `/* AUTO-GENERATED. DO NOT EDIT.
348
+ Re-run \`npm run gen:manifest\` after changing factories or IoC config.
349
+ */
350
+ `;
351
+ return `${header}${importLines.length > 0 ? importLines.join("\n") + "\n\n" : ""}export interface IocGeneratedTypes {
352
+ ${propertyLines.join("\n")}
353
+ }
354
+
355
+ export type IocGeneratedCradle = IocGeneratedTypes;
356
+ `;
357
+ };
358
+ const replaceFileFromTemp = async (targetPath, contents) => {
359
+ const tempPath = `${targetPath}.tmp-${process.pid}-${Date.now()}`;
360
+ try {
361
+ await fs.writeFile(tempPath, contents, "utf8");
362
+ await fs.rename(tempPath, targetPath);
363
+ }
364
+ catch (error) {
365
+ try {
366
+ await fs.unlink(tempPath);
367
+ }
368
+ catch {
369
+ // Best effort cleanup; keep original failure context.
370
+ }
371
+ throw error;
372
+ }
373
+ };
374
+ /**
375
+ * Writes the two generated artifacts next to each other. `manifestImportFromPackage` is the
376
+ * package name (or path) used in the `import type` for `IocGeneratedContainerManifest`.
377
+ */
378
+ export const writeManifest = async (acceptedFactories, plans, groupsManifest, manifestOutPath, manifestImportFromPackage, options) => {
379
+ const sortedFactories = sortFactoriesForManifest(acceptedFactories);
380
+ const modules = uniqueModuleRows(sortedFactories);
381
+ const moduleIndexByPath = buildModuleIndexByPath(modules);
382
+ const aliasByPath = assignStableModuleAliases(modules);
383
+ const contractManifest = plansToIocContractManifest(plans, moduleIndexByPath);
384
+ const iocGroupsManifest = groupsManifest;
385
+ const importLines = modules.map((moduleEntry) => {
386
+ const alias = aliasByPath.get(moduleEntry.modulePath);
387
+ if (!alias) {
388
+ throw new Error(`[ioc] internal error: missing alias for "${moduleEntry.modulePath}"`);
389
+ }
390
+ return `import * as ${alias} from "${moduleEntry.relImport}";`;
391
+ });
392
+ const moduleArrayLines = modules.map((moduleEntry) => {
393
+ const alias = aliasByPath.get(moduleEntry.modulePath);
394
+ if (!alias) {
395
+ throw new Error(`[ioc] internal error: missing alias for "${moduleEntry.modulePath}"`);
396
+ }
397
+ return ` ${alias},`;
398
+ });
399
+ const mainSource = serializeMainIocManifestSource(contractManifest, iocGroupsManifest, manifestImportFromPackage, importLines, moduleArrayLines);
400
+ await replaceFileFromTemp(manifestOutPath, mainSource);
401
+ const typesPath = path.join(path.dirname(manifestOutPath), "ioc-registry.types.ts");
402
+ const typesSource = buildCradleTypeSource(plans, iocGroupsManifest, options?.registryTypesBuildContext);
403
+ await replaceFileFromTemp(typesPath, typesSource);
404
+ };
405
+ //# sourceMappingURL=writeManifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeManifest.js","sourceRoot":"","sources":["../../src/generator/writeManifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import ts from "typescript";
2
+ import type { ResolvedScanDir } from "../generator/manifestPaths.js";
3
+ import type { ResolvedContractRegistration, ResolvedImplementationEntry } from "../generator/resolveRegistrationPlan.js";
4
+ export type BaseTypeResolution = {
5
+ ok: true;
6
+ type: ts.Type;
7
+ } | {
8
+ ok: false;
9
+ message: string;
10
+ };
11
+ export type AssignableImplementationMember = {
12
+ contractName: string;
13
+ registrationKey: string;
14
+ };
15
+ /** One contract row for `kind: "object"` groups; manifest object keys are `contractKey`. */
16
+ export type ContractDefaultGroupMember = {
17
+ contractKey: string;
18
+ contractName: string;
19
+ registrationKey: string;
20
+ };
21
+ export declare const getContractDeclaredType: (checker: ts.TypeChecker, program: ts.Program, generatedDir: string, scanDirs: readonly ResolvedScanDir[], plan: ResolvedContractRegistration) => ts.Type | undefined;
22
+ /**
23
+ * Resolve an unqualified interface/type-alias name across non–node_modules program sources.
24
+ * Multiple declarations in different files are rejected as ambiguous.
25
+ */
26
+ export declare const resolveDeclaredBaseType: (program: ts.Program, checker: ts.TypeChecker, typeName: string) => BaseTypeResolution;
27
+ /**
28
+ * Whether an implementation should appear in a **collection** group.
29
+ *
30
+ * Skips non-default implementations registered at the contract default slot key (`contractKey`).
31
+ * Those registrations occupy the canonical contract name as a key while another implementation is
32
+ * the selected default; including them would duplicate “default slot” semantics alongside named keys.
33
+ */
34
+ export declare const shouldIncludeImplInCollectionGroup: (plan: ResolvedContractRegistration, impl: ResolvedImplementationEntry) => boolean;
35
+ /**
36
+ * All implementations belonging to contracts assignable to `baseType` (per declared contract type).
37
+ * Skips contracts whose declared type cannot be loaded from the program.
38
+ *
39
+ * @param filterImpl - When set, only implementations for which this returns true are included.
40
+ */
41
+ export declare const collectImplementationMembersAssignableToBase: (checker: ts.TypeChecker, program: ts.Program, generatedDir: string, scanDirs: readonly ResolvedScanDir[], plans: readonly ResolvedContractRegistration[], baseType: ts.Type, filterImpl?: (plan: ResolvedContractRegistration, impl: ResolvedImplementationEntry) => boolean) => AssignableImplementationMember[];
42
+ /**
43
+ * For each contract whose declared type is assignable to `baseType`, one member using the
44
+ * contract's default implementation registration key. Manifest keys are the contract key
45
+ * (camel-cased contract name), not implementation registration keys.
46
+ */
47
+ export declare const collectContractDefaultMembersAssignableToBase: (checker: ts.TypeChecker, program: ts.Program, generatedDir: string, scanDirs: readonly ResolvedScanDir[], plans: readonly ResolvedContractRegistration[], baseType: ts.Type) => ContractDefaultGroupMember[];
48
+ //# sourceMappingURL=baseTypeAssignability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseTypeAssignability.d.ts","sourceRoot":"","sources":["../../src/groups/baseTypeAssignability.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,yCAAyC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,8BAA8B,GAAG;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,4FAA4F;AAC5F,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAqBF,eAAO,MAAM,uBAAuB,GAClC,SAAS,EAAE,CAAC,WAAW,EACvB,SAAS,EAAE,CAAC,OAAO,EACnB,cAAc,MAAM,EACpB,UAAU,SAAS,eAAe,EAAE,EACpC,MAAM,4BAA4B,KACjC,EAAE,CAAC,IAAI,GAAG,SAwBZ,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,SAAS,EAAE,CAAC,OAAO,EACnB,SAAS,EAAE,CAAC,WAAW,EACvB,UAAU,MAAM,KACf,kBAsCF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,GAC7C,MAAM,4BAA4B,EAClC,MAAM,2BAA2B,KAChC,OAEyD,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,4CAA4C,GACvD,SAAS,EAAE,CAAC,WAAW,EACvB,SAAS,EAAE,CAAC,OAAO,EACnB,cAAc,MAAM,EACpB,UAAU,SAAS,eAAe,EAAE,EACpC,OAAO,SAAS,4BAA4B,EAAE,EAC9C,UAAU,EAAE,CAAC,IAAI,EACjB,aAAa,CACX,IAAI,EAAE,4BAA4B,EAClC,IAAI,EAAE,2BAA2B,KAC9B,OAAO,KACX,8BAA8B,EA4BhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6CAA6C,GACxD,SAAS,EAAE,CAAC,WAAW,EACvB,SAAS,EAAE,CAAC,OAAO,EACnB,cAAc,MAAM,EACpB,UAAU,SAAS,eAAe,EAAE,EACpC,OAAO,SAAS,4BAA4B,EAAE,EAC9C,UAAU,EAAE,CAAC,IAAI,KAChB,0BAA0B,EAgC5B,CAAC"}
@@ -0,0 +1,145 @@
1
+ import path from "node:path";
2
+ import ts from "typescript";
3
+ import { resolveContractTypeSourceFile } from "../generator/contractTypeSourceFile.js";
4
+ const getTopLevelTypeDeclaration = (sourceFile, typeName) => {
5
+ for (const stmt of sourceFile.statements) {
6
+ if (ts.isInterfaceDeclaration(stmt) && stmt.name.text === typeName) {
7
+ if (stmt.parent === sourceFile) {
8
+ return stmt;
9
+ }
10
+ }
11
+ if (ts.isTypeAliasDeclaration(stmt) && stmt.name.text === typeName) {
12
+ if (stmt.parent === sourceFile) {
13
+ return stmt;
14
+ }
15
+ }
16
+ }
17
+ return undefined;
18
+ };
19
+ export const getContractDeclaredType = (checker, program, generatedDir, scanDirs, plan) => {
20
+ const sourceFile = resolveContractTypeSourceFile(program, generatedDir, plan.contractTypeRelImport, scanDirs, plan.contractName);
21
+ if (sourceFile === undefined) {
22
+ return undefined;
23
+ }
24
+ const decl = getTopLevelTypeDeclaration(sourceFile, plan.contractName);
25
+ if (decl === undefined) {
26
+ return undefined;
27
+ }
28
+ const sym = checker.getSymbolAtLocation(decl.name);
29
+ if (sym === undefined) {
30
+ return undefined;
31
+ }
32
+ const declared = checker.getDeclaredTypeOfSymbol(sym);
33
+ // Strip `null` / `undefined` from the declared contract type so group assignability matches the
34
+ // underlying contract shape (e.g. `Foo | undefined` vs `Foo`) without treating the optional form
35
+ // as a distinct assignability failure at the union level.
36
+ return checker.getNonNullableType(declared);
37
+ };
38
+ /**
39
+ * Resolve an unqualified interface/type-alias name across non–node_modules program sources.
40
+ * Multiple declarations in different files are rejected as ambiguous.
41
+ */
42
+ export const resolveDeclaredBaseType = (program, checker, typeName) => {
43
+ const declarationFiles = new Set();
44
+ let loneType;
45
+ for (const sf of program.getSourceFiles()) {
46
+ if (sf.fileName.includes(`${path.sep}node_modules${path.sep}`)) {
47
+ continue;
48
+ }
49
+ const decl = getTopLevelTypeDeclaration(sf, typeName);
50
+ if (decl === undefined) {
51
+ continue;
52
+ }
53
+ declarationFiles.add(path.normalize(sf.fileName));
54
+ const sym = checker.getSymbolAtLocation(decl.name);
55
+ if (sym === undefined) {
56
+ continue;
57
+ }
58
+ const t = checker.getDeclaredTypeOfSymbol(sym);
59
+ loneType = t;
60
+ }
61
+ if (declarationFiles.size === 0) {
62
+ return {
63
+ ok: false,
64
+ message: `no interface or type alias named ${JSON.stringify(typeName)} found in the TypeScript program (excluding node_modules)`,
65
+ };
66
+ }
67
+ if (declarationFiles.size > 1) {
68
+ const listed = [...declarationFiles].sort((a, b) => a.localeCompare(b));
69
+ return {
70
+ ok: false,
71
+ message: `ambiguous base type ${JSON.stringify(typeName)}: declared in multiple files: ${listed.map((f) => JSON.stringify(f)).join(", ")}. Use a unique name or consolidate declarations.`,
72
+ };
73
+ }
74
+ if (loneType === undefined) {
75
+ return { ok: false, message: "internal error resolving base type" };
76
+ }
77
+ return { ok: true, type: loneType };
78
+ };
79
+ /**
80
+ * Whether an implementation should appear in a **collection** group.
81
+ *
82
+ * Skips non-default implementations registered at the contract default slot key (`contractKey`).
83
+ * Those registrations occupy the canonical contract name as a key while another implementation is
84
+ * the selected default; including them would duplicate “default slot” semantics alongside named keys.
85
+ */
86
+ export const shouldIncludeImplInCollectionGroup = (plan, impl) => impl.registrationKey !== plan.contractKey ||
87
+ impl.implementationName === plan.defaultImplementationName;
88
+ /**
89
+ * All implementations belonging to contracts assignable to `baseType` (per declared contract type).
90
+ * Skips contracts whose declared type cannot be loaded from the program.
91
+ *
92
+ * @param filterImpl - When set, only implementations for which this returns true are included.
93
+ */
94
+ export const collectImplementationMembersAssignableToBase = (checker, program, generatedDir, scanDirs, plans, baseType, filterImpl) => {
95
+ const members = [];
96
+ for (const plan of plans) {
97
+ const contractType = getContractDeclaredType(checker, program, generatedDir, scanDirs, plan);
98
+ if (contractType === undefined) {
99
+ continue;
100
+ }
101
+ if (!checker.isTypeAssignableTo(contractType, baseType)) {
102
+ continue;
103
+ }
104
+ for (const impl of plan.implementations) {
105
+ if (filterImpl !== undefined && !filterImpl(plan, impl)) {
106
+ continue;
107
+ }
108
+ members.push({
109
+ contractName: plan.contractName,
110
+ registrationKey: impl.registrationKey,
111
+ });
112
+ }
113
+ }
114
+ members.sort((a, b) => a.registrationKey.localeCompare(b.registrationKey));
115
+ return members;
116
+ };
117
+ /**
118
+ * For each contract whose declared type is assignable to `baseType`, one member using the
119
+ * contract's default implementation registration key. Manifest keys are the contract key
120
+ * (camel-cased contract name), not implementation registration keys.
121
+ */
122
+ export const collectContractDefaultMembersAssignableToBase = (checker, program, generatedDir, scanDirs, plans, baseType) => {
123
+ const members = [];
124
+ for (const plan of plans) {
125
+ const contractType = getContractDeclaredType(checker, program, generatedDir, scanDirs, plan);
126
+ if (contractType === undefined) {
127
+ continue;
128
+ }
129
+ if (!checker.isTypeAssignableTo(contractType, baseType)) {
130
+ continue;
131
+ }
132
+ const defaultImpl = plan.implementations.find((impl) => impl.implementationName === plan.defaultImplementationName);
133
+ if (defaultImpl === undefined) {
134
+ throw new Error(`[ioc-config] Contract ${JSON.stringify(plan.contractName)} has defaultImplementationName ${JSON.stringify(plan.defaultImplementationName)} but no matching implementation row (internal registration plan inconsistency).`);
135
+ }
136
+ members.push({
137
+ contractKey: plan.contractKey,
138
+ contractName: plan.contractName,
139
+ registrationKey: defaultImpl.registrationKey,
140
+ });
141
+ }
142
+ members.sort((a, b) => a.contractKey.localeCompare(b.contractKey));
143
+ return members;
144
+ };
145
+ //# sourceMappingURL=baseTypeAssignability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseTypeAssignability.js","sourceRoot":"","sources":["../../src/groups/baseTypeAssignability.ts"],"names":[],"mappings":"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"}