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.
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/bin/ioc.cjs +19 -0
- package/dist/cli/ioc.d.ts +3 -0
- package/dist/cli/ioc.d.ts.map +1 -0
- package/dist/cli/ioc.js +86 -0
- package/dist/cli/ioc.js.map +1 -0
- package/dist/cli/parseIocCli.d.ts +21 -0
- package/dist/cli/parseIocCli.d.ts.map +1 -0
- package/dist/cli/parseIocCli.js +76 -0
- package/dist/cli/parseIocCli.js.map +1 -0
- package/dist/config/iocConfig.d.ts +97 -0
- package/dist/config/iocConfig.d.ts.map +1 -0
- package/dist/config/iocConfig.js +65 -0
- package/dist/config/iocConfig.js.map +1 -0
- package/dist/config/loadIocConfig.d.ts +25 -0
- package/dist/config/loadIocConfig.d.ts.map +1 -0
- package/dist/config/loadIocConfig.js +245 -0
- package/dist/config/loadIocConfig.js.map +1 -0
- package/dist/config/parseDiscoveryScanDirs.d.ts +6 -0
- package/dist/config/parseDiscoveryScanDirs.d.ts.map +1 -0
- package/dist/config/parseDiscoveryScanDirs.js +78 -0
- package/dist/config/parseDiscoveryScanDirs.js.map +1 -0
- package/dist/core/defaultImplementationSelection.d.ts +14 -0
- package/dist/core/defaultImplementationSelection.d.ts.map +1 -0
- package/dist/core/defaultImplementationSelection.js +47 -0
- package/dist/core/defaultImplementationSelection.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/manifest.d.ts +79 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +3 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/resolver.d.ts +18 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +27 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/generator/contractTypeSourceFile.d.ts +16 -0
- package/dist/generator/contractTypeSourceFile.d.ts.map +1 -0
- package/dist/generator/contractTypeSourceFile.js +236 -0
- package/dist/generator/contractTypeSourceFile.js.map +1 -0
- package/dist/generator/discoverFactories/discoverFactories.d.ts +18 -0
- package/dist/generator/discoverFactories/discoverFactories.d.ts.map +1 -0
- package/dist/generator/discoverFactories/discoverFactories.js +108 -0
- package/dist/generator/discoverFactories/discoverFactories.js.map +1 -0
- package/dist/generator/discoverFactories/discoveryOutcomeTypes.d.ts +47 -0
- package/dist/generator/discoverFactories/discoveryOutcomeTypes.d.ts.map +1 -0
- package/dist/generator/discoverFactories/discoveryOutcomeTypes.js +19 -0
- package/dist/generator/discoverFactories/discoveryOutcomeTypes.js.map +1 -0
- package/dist/generator/discoverFactories/inferFactoryDependencyContracts.d.ts +11 -0
- package/dist/generator/discoverFactories/inferFactoryDependencyContracts.d.ts.map +1 -0
- package/dist/generator/discoverFactories/inferFactoryDependencyContracts.js +118 -0
- package/dist/generator/discoverFactories/inferFactoryDependencyContracts.js.map +1 -0
- package/dist/generator/discoverFactories/scanFactoryFile.d.ts +18 -0
- package/dist/generator/discoverFactories/scanFactoryFile.d.ts.map +1 -0
- package/dist/generator/discoverFactories/scanFactoryFile.js +379 -0
- package/dist/generator/discoverFactories/scanFactoryFile.js.map +1 -0
- package/dist/generator/generateManifest.d.ts +13 -0
- package/dist/generator/generateManifest.d.ts.map +1 -0
- package/dist/generator/generateManifest.js +88 -0
- package/dist/generator/generateManifest.js.map +1 -0
- package/dist/generator/iocProgramContext.d.ts +11 -0
- package/dist/generator/iocProgramContext.d.ts.map +1 -0
- package/dist/generator/iocProgramContext.js +81 -0
- package/dist/generator/iocProgramContext.js.map +1 -0
- package/dist/generator/manifestOptions.d.ts +26 -0
- package/dist/generator/manifestOptions.d.ts.map +1 -0
- package/dist/generator/manifestOptions.js +86 -0
- package/dist/generator/manifestOptions.js.map +1 -0
- package/dist/generator/manifestPaths.d.ts +94 -0
- package/dist/generator/manifestPaths.d.ts.map +1 -0
- package/dist/generator/manifestPaths.js +377 -0
- package/dist/generator/manifestPaths.js.map +1 -0
- package/dist/generator/naming.d.ts +9 -0
- package/dist/generator/naming.d.ts.map +1 -0
- package/dist/generator/naming.js +46 -0
- package/dist/generator/naming.js.map +1 -0
- package/dist/generator/resolveRegistrationPlan.d.ts +66 -0
- package/dist/generator/resolveRegistrationPlan.d.ts.map +1 -0
- package/dist/generator/resolveRegistrationPlan.js +377 -0
- package/dist/generator/resolveRegistrationPlan.js.map +1 -0
- package/dist/generator/types.d.ts +37 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/writeManifest.d.ts +19 -0
- package/dist/generator/writeManifest.d.ts.map +1 -0
- package/dist/generator/writeManifest.js +405 -0
- package/dist/generator/writeManifest.js.map +1 -0
- package/dist/groups/baseTypeAssignability.d.ts +48 -0
- package/dist/groups/baseTypeAssignability.d.ts.map +1 -0
- package/dist/groups/baseTypeAssignability.js +145 -0
- package/dist/groups/baseTypeAssignability.js.map +1 -0
- package/dist/groups/resolveGroupPlan.d.ts +85 -0
- package/dist/groups/resolveGroupPlan.d.ts.map +1 -0
- package/dist/groups/resolveGroupPlan.js +215 -0
- package/dist/groups/resolveGroupPlan.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection/formatReports.d.ts +14 -0
- package/dist/inspection/formatReports.d.ts.map +1 -0
- package/dist/inspection/formatReports.js +115 -0
- package/dist/inspection/formatReports.js.map +1 -0
- package/dist/inspection/index.d.ts +8 -0
- package/dist/inspection/index.d.ts.map +1 -0
- package/dist/inspection/index.js +8 -0
- package/dist/inspection/index.js.map +1 -0
- package/dist/inspection/reports.d.ts +40 -0
- package/dist/inspection/reports.d.ts.map +1 -0
- package/dist/inspection/reports.js +95 -0
- package/dist/inspection/reports.js.map +1 -0
- package/dist/inspection/runDiscoveryAnalysis.d.ts +36 -0
- package/dist/inspection/runDiscoveryAnalysis.d.ts.map +1 -0
- package/dist/inspection/runDiscoveryAnalysis.js +48 -0
- package/dist/inspection/runDiscoveryAnalysis.js.map +1 -0
- package/dist/inspection/validateManifest.d.ts +8 -0
- package/dist/inspection/validateManifest.d.ts.map +1 -0
- package/dist/inspection/validateManifest.js +46 -0
- package/dist/inspection/validateManifest.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +13 -0
- package/dist/runtime/bootstrap.d.ts.map +1 -0
- package/dist/runtime/bootstrap.js +259 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +4 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/iocResolutionError.d.ts +54 -0
- package/dist/runtime/iocResolutionError.d.ts.map +1 -0
- package/dist/runtime/iocResolutionError.js +266 -0
- package/dist/runtime/iocResolutionError.js.map +1 -0
- package/dist/runtime/iocResolutionStack.d.ts +21 -0
- package/dist/runtime/iocResolutionStack.d.ts.map +1 -0
- package/dist/runtime/iocResolutionStack.js +17 -0
- package/dist/runtime/iocResolutionStack.js.map +1 -0
- package/dist/runtime/iocRuntimeErrors.d.ts +35 -0
- package/dist/runtime/iocRuntimeErrors.d.ts.map +1 -0
- package/dist/runtime/iocRuntimeErrors.js +27 -0
- package/dist/runtime/iocRuntimeErrors.js.map +1 -0
- package/dist/runtime/registrationKeyIndex.d.ts +12 -0
- package/dist/runtime/registrationKeyIndex.d.ts.map +1 -0
- package/dist/runtime/registrationKeyIndex.js +19 -0
- package/dist/runtime/registrationKeyIndex.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Builds structured reports for inspection: manifest contracts → human-oriented rows,
|
|
3
|
+
* plus discovery-oriented summaries from analyzer inputs.
|
|
4
|
+
*/
|
|
5
|
+
import { selectDefaultImplementationName } from "../core/defaultImplementationSelection.js";
|
|
6
|
+
import { validateManifest } from "./validateManifest.js";
|
|
7
|
+
const pickDefault = (contractName, impls) => {
|
|
8
|
+
const list = Object.values(impls);
|
|
9
|
+
if (list.length === 0)
|
|
10
|
+
return undefined;
|
|
11
|
+
try {
|
|
12
|
+
const name = selectDefaultImplementationName(contractName, list.map((m) => ({
|
|
13
|
+
implementationName: m.implementationName,
|
|
14
|
+
registrationKey: m.registrationKey,
|
|
15
|
+
...(m.default === true ? { default: true } : {}),
|
|
16
|
+
})));
|
|
17
|
+
const meta = list.find((m) => m.implementationName === name);
|
|
18
|
+
return meta ? { name, meta } : undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export const buildInspectionReport = (contracts) => {
|
|
25
|
+
const manifestIssues = validateManifest(contracts);
|
|
26
|
+
const contractNames = Object.keys(contracts).sort((a, b) => a.localeCompare(b));
|
|
27
|
+
const contractsOut = contractNames.map((contractName) => {
|
|
28
|
+
const impls = contracts[contractName];
|
|
29
|
+
const implKeys = Object.keys(impls).sort((a, b) => a.localeCompare(b));
|
|
30
|
+
const selected = pickDefault(contractName, impls);
|
|
31
|
+
return {
|
|
32
|
+
contractName,
|
|
33
|
+
defaultImplementationName: selected?.name,
|
|
34
|
+
defaultRegistrationKey: selected?.meta.registrationKey,
|
|
35
|
+
implementations: implKeys.map((k) => {
|
|
36
|
+
const m = impls[k];
|
|
37
|
+
return {
|
|
38
|
+
implementationName: m.implementationName,
|
|
39
|
+
registrationKey: m.registrationKey,
|
|
40
|
+
lifecycle: m.lifetime,
|
|
41
|
+
modulePath: m.modulePath,
|
|
42
|
+
exportName: m.exportName,
|
|
43
|
+
isDefault: selected?.name === m.implementationName,
|
|
44
|
+
};
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
return { contracts: contractsOut, manifestIssues };
|
|
49
|
+
};
|
|
50
|
+
const outcomeToRows = (modulePath, outcome) => {
|
|
51
|
+
if (outcome.scope === "file") {
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
modulePath,
|
|
55
|
+
status: "skipped",
|
|
56
|
+
skipReason: outcome.skipReason,
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
if (outcome.status === "discovered") {
|
|
61
|
+
return [
|
|
62
|
+
{
|
|
63
|
+
modulePath,
|
|
64
|
+
exportName: outcome.exportName,
|
|
65
|
+
status: "discovered",
|
|
66
|
+
contractName: outcome.contractName,
|
|
67
|
+
registrationKey: outcome.registrationKey,
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
}
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
modulePath,
|
|
74
|
+
exportName: outcome.exportName,
|
|
75
|
+
status: "skipped",
|
|
76
|
+
skipReason: outcome.skipReason,
|
|
77
|
+
contractName: outcome.contractName,
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
};
|
|
81
|
+
const isDiscoveryFilesArray = (input) => Array.isArray(input);
|
|
82
|
+
export const buildDiscoveryReport = (analysisOrFiles) => {
|
|
83
|
+
const discoveryFiles = isDiscoveryFilesArray(analysisOrFiles)
|
|
84
|
+
? analysisOrFiles
|
|
85
|
+
: analysisOrFiles.discoveryFiles;
|
|
86
|
+
const files = discoveryFiles
|
|
87
|
+
.slice()
|
|
88
|
+
.sort((a, b) => a.modulePath.localeCompare(b.modulePath))
|
|
89
|
+
.map((file) => ({
|
|
90
|
+
modulePath: file.modulePath,
|
|
91
|
+
rows: file.outcomes.flatMap((o) => outcomeToRows(file.modulePath, o)),
|
|
92
|
+
}));
|
|
93
|
+
return { files };
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=reports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/inspection/reports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IocConfig } from "../config/iocConfig.js";
|
|
2
|
+
import type { ResolvedContractRegistration } from "../generator/resolveRegistrationPlan.js";
|
|
3
|
+
import type { DiscoveredFactory } from "../generator/types.js";
|
|
4
|
+
import { type ManifestOptions } from "../generator/manifestOptions.js";
|
|
5
|
+
import type { ManifestRuntimePaths } from "../generator/manifestPaths.js";
|
|
6
|
+
import type { IocDiscoveryAnalysisFiles } from "../generator/discoverFactories/discoveryOutcomeTypes.js";
|
|
7
|
+
export type DiscoveryAnalysisResult = {
|
|
8
|
+
readonly discoveryFiles: IocDiscoveryAnalysisFiles;
|
|
9
|
+
readonly contractMap: Map<string, Map<string, DiscoveredFactory>>;
|
|
10
|
+
readonly acceptedFactories: readonly DiscoveredFactory[];
|
|
11
|
+
/** Resolved lifetimes (includes `lifetimeSource` when built with scanDirs context). */
|
|
12
|
+
readonly registrationPlan: readonly ResolvedContractRegistration[];
|
|
13
|
+
};
|
|
14
|
+
export type DiscoveryManifestResolution = {
|
|
15
|
+
readonly cfgPath: string;
|
|
16
|
+
readonly config: IocConfig | undefined;
|
|
17
|
+
readonly options: ManifestOptions;
|
|
18
|
+
};
|
|
19
|
+
export declare const resolveDiscoveryManifestContext: (opts?: {
|
|
20
|
+
iocConfigPath?: string;
|
|
21
|
+
/** Directory to start searching upward for `ioc.config.ts` (defaults to `paths.projectRoot` or cwd). */
|
|
22
|
+
searchStartDir?: string;
|
|
23
|
+
paths?: Partial<ManifestRuntimePaths>;
|
|
24
|
+
}) => Promise<DiscoveryManifestResolution>;
|
|
25
|
+
/**
|
|
26
|
+
* Re-runs factory discovery from source (and TypeScript) for inspection / CLI.
|
|
27
|
+
* Does not read or write the generated manifest.
|
|
28
|
+
*/
|
|
29
|
+
export declare const runDiscoveryAnalysis: (opts?: {
|
|
30
|
+
iocConfigPath?: string;
|
|
31
|
+
searchStartDir?: string;
|
|
32
|
+
paths?: Partial<ManifestRuntimePaths>;
|
|
33
|
+
/** When set, skips config loading (e.g. after {@link resolveDiscoveryManifestContext}). */
|
|
34
|
+
reuseResolution?: DiscoveryManifestResolution;
|
|
35
|
+
}) => Promise<DiscoveryAnalysisResult>;
|
|
36
|
+
//# sourceMappingURL=runDiscoveryAnalysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runDiscoveryAnalysis.d.ts","sourceRoot":"","sources":["../../src/inspection/runDiscoveryAnalysis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAE5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAY/D,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yDAAyD,CAAC;AAEzG,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,cAAc,EAAE,yBAAyB,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,iBAAiB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzD,uFAAuF;IACvF,QAAQ,CAAC,gBAAgB,EAAE,SAAS,4BAA4B,EAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAAU,OAAO;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACvC,KAAG,OAAO,CAAC,2BAA2B,CAmBtC,CAAC;AA8CF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAU,OAAO;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACtC,2FAA2F;IAC3F,eAAe,CAAC,EAAE,2BAA2B,CAAC;CAC/C,KAAG,OAAO,CAAC,uBAAuB,CAIlC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { buildRegistrationPlan } from "../generator/resolveRegistrationPlan.js";
|
|
3
|
+
import { resolveIocConfigPath, resolveProjectRootFromIocConfigPath, tryLoadIocConfig, } from "../config/loadIocConfig.js";
|
|
4
|
+
import { discoverFactories } from "../generator/discoverFactories/discoverFactories.js";
|
|
5
|
+
import { createIocProgramForDiscovery, getDiscoveryTargetFiles, reportDiscoveryProgramDiagnostics, } from "../generator/iocProgramContext.js";
|
|
6
|
+
import { mergeManifestOptionsWithIocConfig, resolveManifestOptions, } from "../generator/manifestOptions.js";
|
|
7
|
+
export const resolveDiscoveryManifestContext = async (opts) => {
|
|
8
|
+
const searchStart = path.resolve(opts?.searchStartDir ?? opts?.paths?.projectRoot ?? process.cwd());
|
|
9
|
+
const cfgPath = resolveIocConfigPath(searchStart, opts?.iocConfigPath);
|
|
10
|
+
const config = await tryLoadIocConfig(cfgPath);
|
|
11
|
+
const projectRoot = config
|
|
12
|
+
? resolveProjectRootFromIocConfigPath(cfgPath)
|
|
13
|
+
: opts?.paths?.projectRoot ?? searchStart;
|
|
14
|
+
const base = resolveManifestOptions({
|
|
15
|
+
paths: {
|
|
16
|
+
...opts?.paths,
|
|
17
|
+
projectRoot,
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const options = config
|
|
21
|
+
? mergeManifestOptionsWithIocConfig(base, config)
|
|
22
|
+
: base;
|
|
23
|
+
return { cfgPath, config, options };
|
|
24
|
+
};
|
|
25
|
+
const runDiscoveryFromResolution = async (resolved) => {
|
|
26
|
+
const { config, options } = resolved;
|
|
27
|
+
const { paths: { projectRoot, scanDirs, generatedDir, workspacePackageImportBases }, includePatterns, excludePatterns, factoryExportPrefix, } = options;
|
|
28
|
+
const files = await getDiscoveryTargetFiles(scanDirs, includePatterns, excludePatterns, generatedDir);
|
|
29
|
+
const program = createIocProgramForDiscovery(projectRoot, files);
|
|
30
|
+
reportDiscoveryProgramDiagnostics(program, projectRoot, files);
|
|
31
|
+
const { contractMap, acceptedFactories, discoveryFiles } = discoverFactories(files, program, projectRoot, factoryExportPrefix, { projectRoot, scanDirs, generatedDir, workspacePackageImportBases }, config ?? undefined, { collectFileRecords: true });
|
|
32
|
+
const registrationPlan = buildRegistrationPlan(contractMap, config, { projectRoot, scanDirs });
|
|
33
|
+
return {
|
|
34
|
+
discoveryFiles,
|
|
35
|
+
contractMap,
|
|
36
|
+
acceptedFactories,
|
|
37
|
+
registrationPlan,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Re-runs factory discovery from source (and TypeScript) for inspection / CLI.
|
|
42
|
+
* Does not read or write the generated manifest.
|
|
43
|
+
*/
|
|
44
|
+
export const runDiscoveryAnalysis = async (opts) => {
|
|
45
|
+
const resolved = opts?.reuseResolution ?? (await resolveDiscoveryManifestContext(opts));
|
|
46
|
+
return runDiscoveryFromResolution(resolved);
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=runDiscoveryAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runDiscoveryAnalysis.js","sourceRoot":"","sources":["../../src/inspection/runDiscoveryAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { IocContractManifest } from "../core/manifest.js";
|
|
2
|
+
export type ManifestValidationIssue = {
|
|
3
|
+
code: string;
|
|
4
|
+
contractName?: string;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const validateManifest: (manifestByContract: IocContractManifest) => ManifestValidationIssue[];
|
|
8
|
+
//# sourceMappingURL=validateManifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateManifest.d.ts","sourceRoot":"","sources":["../../src/inspection/validateManifest.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,mBAAmB,KACtC,uBAAuB,EA6CzB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Static checks on an in-memory `IocContractManifest` (no filesystem). Complements
|
|
3
|
+
* runtime registration: catches ambiguous defaults before `container.resolve`.
|
|
4
|
+
*/
|
|
5
|
+
import { selectDefaultImplementationName } from "../core/defaultImplementationSelection.js";
|
|
6
|
+
const collectImpls = (impls) => Object.values(impls);
|
|
7
|
+
export const validateManifest = (manifestByContract) => {
|
|
8
|
+
const issues = [];
|
|
9
|
+
for (const [contractName, impls] of Object.entries(manifestByContract)) {
|
|
10
|
+
const list = collectImpls(impls);
|
|
11
|
+
if (list.length === 0) {
|
|
12
|
+
issues.push({
|
|
13
|
+
code: "contract_no_implementations",
|
|
14
|
+
contractName,
|
|
15
|
+
message: `Contract ${JSON.stringify(contractName)} has zero implementations in the manifest.`,
|
|
16
|
+
});
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const defaults = list.filter((meta) => meta.default === true);
|
|
20
|
+
if (defaults.length > 1) {
|
|
21
|
+
issues.push({
|
|
22
|
+
code: "multiple_defaults",
|
|
23
|
+
contractName,
|
|
24
|
+
message: `Contract ${JSON.stringify(contractName)} has more than one implementation marked default: true.`,
|
|
25
|
+
});
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
selectDefaultImplementationName(contractName, list.map((meta) => ({
|
|
30
|
+
implementationName: meta.implementationName,
|
|
31
|
+
registrationKey: meta.registrationKey,
|
|
32
|
+
...(meta.default === true ? { default: true } : {}),
|
|
33
|
+
})));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
issues.push({
|
|
38
|
+
code: "multiple_implementations_no_default",
|
|
39
|
+
contractName,
|
|
40
|
+
message,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return issues;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=validateManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateManifest.js","sourceRoot":"","sources":["../../src/inspection/validateManifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,+BAA+B,EAAE,MAAM,2CAA2C,CAAC;AAY5F,MAAM,YAAY,GAAG,CACnB,KAAoD,EACnB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,kBAAuC,EACZ,EAAE;IAC7B,MAAM,MAAM,GAA8B,EAAE,CAAC;IAE7C,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,6BAA6B;gBACnC,YAAY;gBACZ,OAAO,EAAE,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,4CAA4C;aAC9F,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;QAC9D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,mBAAmB;gBACzB,YAAY;gBACZ,OAAO,EAAE,YAAY,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,yDAAyD;aAC3G,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,+BAA+B,CAC7B,YAAY,EACZ,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D,CAAC,CAAC,CACJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,qCAAqC;gBAC3C,YAAY;gBACZ,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Awilix wiring for generated manifests: register implementation factories, wire
|
|
3
|
+
* default-slot aliases, plural collection keys, and transient group roots. Resolution errors are
|
|
4
|
+
* normalized to {@link IocResolutionError} with manifest-aware stack traces.
|
|
5
|
+
*/
|
|
6
|
+
import { type AwilixContainer } from "awilix";
|
|
7
|
+
import { type IocRegisterableManifest } from "../core/manifest.js";
|
|
8
|
+
/**
|
|
9
|
+
* Registers everything described by a generated container manifest into an Awilix container
|
|
10
|
+
* (implementation factories, default access-key aliases, plural collection keys, and group roots).
|
|
11
|
+
*/
|
|
12
|
+
export declare const registerIocFromManifest: <TCradle extends object>(container: AwilixContainer<TCradle>, manifest: IocRegisterableManifest) => void;
|
|
13
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAIL,KAAK,eAAe,EAErB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAML,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAC;AA0V7B;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,SAAS,MAAM,EAC5D,WAAW,eAAe,CAAC,OAAO,CAAC,EACnC,UAAU,uBAAuB,KAChC,IAiBF,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Awilix wiring for generated manifests: register implementation factories, wire
|
|
3
|
+
* default-slot aliases, plural collection keys, and transient group roots. Resolution errors are
|
|
4
|
+
* normalized to {@link IocResolutionError} with manifest-aware stack traces.
|
|
5
|
+
*/
|
|
6
|
+
import { aliasTo, asFunction, Lifetime, } from "awilix";
|
|
7
|
+
import { IOC_GENERATED_CONTAINER_MANIFEST_FIXED_KEYS, } from "../core/manifest.js";
|
|
8
|
+
import { contractNameToCollectionRegistrationKey, contractNameToDefaultRegistrationKey, } from "../generator/naming.js";
|
|
9
|
+
import { propagateIocResolutionFailure } from "./iocResolutionError.js";
|
|
10
|
+
import { frameFromManifestMeta, popIocResolutionFrame, pushIocResolutionFrame, snapshotIocResolutionStack, } from "./iocResolutionStack.js";
|
|
11
|
+
import { selectDefaultImplementationName } from "../core/defaultImplementationSelection.js";
|
|
12
|
+
import { formatMissingDefaultImplementationMessage, formatMissingFactoryExportMessage, formatMissingModuleImportMessage, } from "./iocRuntimeErrors.js";
|
|
13
|
+
import { buildRegistrationKeyIndex, } from "./registrationKeyIndex.js";
|
|
14
|
+
/** Group-root entries only: strips fixed manifest keys (`moduleImports`, `contracts`). */
|
|
15
|
+
const extractGroupRootsFromContainerManifest = (manifest) => {
|
|
16
|
+
const out = {};
|
|
17
|
+
for (const key of Object.keys(manifest)) {
|
|
18
|
+
if (IOC_GENERATED_CONTAINER_MANIFEST_FIXED_KEYS.has(key)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const value = manifest[key];
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
/* Generated manifests only place `IocGroupNodeManifest` values on non-fixed keys. */
|
|
26
|
+
out[key] = value;
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
};
|
|
30
|
+
const lifetimeToAwilix = (lifetime) => {
|
|
31
|
+
switch (lifetime) {
|
|
32
|
+
case "singleton":
|
|
33
|
+
return Lifetime.SINGLETON;
|
|
34
|
+
case "scoped":
|
|
35
|
+
return Lifetime.SCOPED;
|
|
36
|
+
case "transient":
|
|
37
|
+
return Lifetime.TRANSIENT;
|
|
38
|
+
default: {
|
|
39
|
+
const _exhaustive = lifetime;
|
|
40
|
+
return _exhaustive;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const registerPair = (container, pair) => {
|
|
45
|
+
/* Registration keys come from generated manifests; Awilix types cannot express this map statically. */
|
|
46
|
+
container.register(pair);
|
|
47
|
+
};
|
|
48
|
+
const isFactoryFunction = (value) => typeof value === "function";
|
|
49
|
+
const invokeResolvedFactory = (factory, cradle, meta, keyIndex) => {
|
|
50
|
+
if (!isFactoryFunction(factory)) {
|
|
51
|
+
throw new Error("[ioc] internal error: expected resolver factory function");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Always pass the cradle.
|
|
55
|
+
*
|
|
56
|
+
* Why:
|
|
57
|
+
* - `(deps) => Contract` obviously needs it
|
|
58
|
+
* - `() => Contract` will safely ignore the extra argument in JS
|
|
59
|
+
* - relying on `factory.length` is fragile for signatures like `(deps = {}) => ...`,
|
|
60
|
+
* which report `.length === 0` even though they conceptually accept dependencies
|
|
61
|
+
*/
|
|
62
|
+
pushIocResolutionFrame(frameFromManifestMeta(meta));
|
|
63
|
+
try {
|
|
64
|
+
return factory(cradle);
|
|
65
|
+
}
|
|
66
|
+
catch (cause) {
|
|
67
|
+
return propagateIocResolutionFailure({
|
|
68
|
+
cause,
|
|
69
|
+
keyIndex,
|
|
70
|
+
stackSnapshot: snapshotIocResolutionStack(),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
popIocResolutionFrame();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const collectionLifetimeFromImplementations = (impls) => {
|
|
78
|
+
/**
|
|
79
|
+
* The collection resolves and returns concrete implementation instances.
|
|
80
|
+
* Its lifetime therefore must not outlive any member it captures.
|
|
81
|
+
*
|
|
82
|
+
* - if any member is transient, collection must be transient
|
|
83
|
+
* - else if any member is scoped, collection must be scoped
|
|
84
|
+
* - else singleton is safe
|
|
85
|
+
*/
|
|
86
|
+
if (impls.some((meta) => meta.lifetime === "transient")) {
|
|
87
|
+
return Lifetime.TRANSIENT;
|
|
88
|
+
}
|
|
89
|
+
if (impls.some((meta) => meta.lifetime === "scoped")) {
|
|
90
|
+
return Lifetime.SCOPED;
|
|
91
|
+
}
|
|
92
|
+
return Lifetime.SINGLETON;
|
|
93
|
+
};
|
|
94
|
+
const resolveDefaultImplementation = (contractName, implList) => {
|
|
95
|
+
if (implList.length === 0) {
|
|
96
|
+
throw new Error(`[ioc] No implementation registered for contract ${JSON.stringify(contractName)} (no factories in the manifest for this contract). Add a discoverable factory and re-run manifest generation.`);
|
|
97
|
+
}
|
|
98
|
+
const rows = implList.map((m) => ({
|
|
99
|
+
implementationName: m.implementationName,
|
|
100
|
+
registrationKey: m.registrationKey,
|
|
101
|
+
...(m.default === true ? { default: true } : {}),
|
|
102
|
+
}));
|
|
103
|
+
try {
|
|
104
|
+
const name = selectDefaultImplementationName(contractName, rows);
|
|
105
|
+
const defaultImpl = implList.find((m) => m.implementationName === name);
|
|
106
|
+
if (defaultImpl === undefined) {
|
|
107
|
+
throw new Error(`[ioc] internal error: selected default ${JSON.stringify(name)} missing from manifest for ${JSON.stringify(contractName)}`);
|
|
108
|
+
}
|
|
109
|
+
return defaultImpl;
|
|
110
|
+
}
|
|
111
|
+
catch (cause) {
|
|
112
|
+
if (implList.length > 1) {
|
|
113
|
+
throw new Error(formatMissingDefaultImplementationMessage({
|
|
114
|
+
contractName,
|
|
115
|
+
implementationNames: implList.map((m) => m.implementationName),
|
|
116
|
+
registrationKeys: implList.map((m) => m.registrationKey),
|
|
117
|
+
}), { cause });
|
|
118
|
+
}
|
|
119
|
+
throw cause;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const registerImplementationFactories = (container, manifestByContract, moduleImports, keyIndex) => {
|
|
123
|
+
for (const impls of Object.values(manifestByContract)) {
|
|
124
|
+
for (const meta of Object.values(impls)) {
|
|
125
|
+
const ns = moduleImports[meta.moduleIndex];
|
|
126
|
+
if (!ns) {
|
|
127
|
+
throw new Error(formatMissingModuleImportMessage({
|
|
128
|
+
moduleIndex: meta.moduleIndex,
|
|
129
|
+
modulePath: meta.modulePath,
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
const factory = ns[meta.exportName];
|
|
133
|
+
if (typeof factory !== "function") {
|
|
134
|
+
throw new Error(formatMissingFactoryExportMessage({
|
|
135
|
+
modulePath: meta.modulePath,
|
|
136
|
+
exportName: meta.exportName,
|
|
137
|
+
contractName: meta.contractName,
|
|
138
|
+
registrationKey: meta.registrationKey,
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
registerPair(container, {
|
|
142
|
+
[meta.registrationKey]: asFunction((cradle) => invokeResolvedFactory(factory, cradle, meta, keyIndex), { lifetime: lifetimeToAwilix(meta.lifetime) }),
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const resolveManifestAccessKey = (contractName, implList) => {
|
|
148
|
+
const explicit = implList.find((m) => m.accessKey !== undefined)?.accessKey;
|
|
149
|
+
if (explicit !== undefined) {
|
|
150
|
+
return explicit;
|
|
151
|
+
}
|
|
152
|
+
return contractNameToDefaultRegistrationKey(contractName);
|
|
153
|
+
};
|
|
154
|
+
const registerContractDefaultAliases = (container, manifestByContract) => {
|
|
155
|
+
for (const [contractName, impls] of Object.entries(manifestByContract)) {
|
|
156
|
+
const implList = Object.values(impls);
|
|
157
|
+
const accessKey = resolveManifestAccessKey(contractName, implList);
|
|
158
|
+
const defaultImpl = resolveDefaultImplementation(contractName, implList);
|
|
159
|
+
const hasImplementationAtAccessKey = implList.some((meta) => meta.registrationKey === accessKey);
|
|
160
|
+
if (accessKey !== defaultImpl.registrationKey &&
|
|
161
|
+
!hasImplementationAtAccessKey) {
|
|
162
|
+
registerPair(container, {
|
|
163
|
+
[accessKey]: aliasTo(defaultImpl.registrationKey),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Registers the automatic per-contract multi-implementation slot: plural collection key →
|
|
170
|
+
* **array** of all concrete implementations (sorted by `registrationKey`), independent of
|
|
171
|
+
* configured group roots in the human manifest.
|
|
172
|
+
*/
|
|
173
|
+
const registerImplementationCollections = (container, manifestByContract, keyIndex) => {
|
|
174
|
+
for (const [contractName, impls] of Object.entries(manifestByContract)) {
|
|
175
|
+
const implList = [...Object.values(impls)].sort((a, b) => a.registrationKey.localeCompare(b.registrationKey));
|
|
176
|
+
if (implList.length <= 1) {
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const collectionKey = contractNameToCollectionRegistrationKey(contractName);
|
|
180
|
+
const collectionLifetime = collectionLifetimeFromImplementations(implList);
|
|
181
|
+
registerPair(container, {
|
|
182
|
+
[collectionKey]: asFunction((cradle) => {
|
|
183
|
+
pushIocResolutionFrame({
|
|
184
|
+
contractName,
|
|
185
|
+
implementationName: "(collection)",
|
|
186
|
+
registrationKey: collectionKey,
|
|
187
|
+
});
|
|
188
|
+
try {
|
|
189
|
+
return implList.map((meta) => cradle[meta.registrationKey]);
|
|
190
|
+
}
|
|
191
|
+
catch (cause) {
|
|
192
|
+
return propagateIocResolutionFailure({
|
|
193
|
+
cause,
|
|
194
|
+
keyIndex,
|
|
195
|
+
stackSnapshot: snapshotIocResolutionStack(),
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
popIocResolutionFrame();
|
|
200
|
+
}
|
|
201
|
+
}, { lifetime: collectionLifetime }),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
const resolveGroupNodeFromCradle = (cradle, node) => {
|
|
206
|
+
if (Array.isArray(node)) {
|
|
207
|
+
return node.map((leaf) => cradle[leaf.registrationKey]);
|
|
208
|
+
}
|
|
209
|
+
const out = {};
|
|
210
|
+
for (const [propKey, leaf] of Object.entries(node)) {
|
|
211
|
+
out[propKey] = cradle[leaf.registrationKey];
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
};
|
|
215
|
+
const registerGroups = (container, groupsManifest, keyIndex) => {
|
|
216
|
+
if (groupsManifest === undefined) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const rootKeys = Object.keys(groupsManifest).sort((a, b) => a.localeCompare(b));
|
|
220
|
+
for (const key of rootKeys) {
|
|
221
|
+
const node = groupsManifest[key];
|
|
222
|
+
registerPair(container, {
|
|
223
|
+
[key]: asFunction((cradle) => {
|
|
224
|
+
pushIocResolutionFrame({
|
|
225
|
+
contractName: key,
|
|
226
|
+
implementationName: "(group)",
|
|
227
|
+
registrationKey: key,
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
return resolveGroupNodeFromCradle(cradle, node);
|
|
231
|
+
}
|
|
232
|
+
catch (cause) {
|
|
233
|
+
return propagateIocResolutionFailure({
|
|
234
|
+
cause,
|
|
235
|
+
keyIndex,
|
|
236
|
+
stackSnapshot: snapshotIocResolutionStack(),
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
popIocResolutionFrame();
|
|
241
|
+
}
|
|
242
|
+
}, { lifetime: Lifetime.TRANSIENT }),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Registers everything described by a generated container manifest into an Awilix container
|
|
248
|
+
* (implementation factories, default access-key aliases, plural collection keys, and group roots).
|
|
249
|
+
*/
|
|
250
|
+
export const registerIocFromManifest = (container, manifest) => {
|
|
251
|
+
const { contracts: manifestByContract, moduleImports } = manifest;
|
|
252
|
+
const groupsManifest = extractGroupRootsFromContainerManifest(manifest);
|
|
253
|
+
const keyIndex = buildRegistrationKeyIndex(manifestByContract);
|
|
254
|
+
registerImplementationFactories(container, manifestByContract, moduleImports, keyIndex);
|
|
255
|
+
registerContractDefaultAliases(container, manifestByContract);
|
|
256
|
+
registerImplementationCollections(container, manifestByContract, keyIndex);
|
|
257
|
+
registerGroups(container, groupsManifest, keyIndex);
|
|
258
|
+
};
|
|
259
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/runtime/bootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { registerIocFromManifest } from "./bootstrap.js";
|
|
2
|
+
export { applyIocResolutionErrorMessage, createIocResolutionError, formatIocResolutionErrorMessage, IocResolutionError, type IocResolutionFailureType, isIocResolutionError, mergeAncestorStackIntoResolutionError, mergeFrameSequences, type ResolutionFrame, } from "./iocResolutionError.js";
|
|
3
|
+
export { formatMissingContractImplementationMessage, formatMissingDefaultImplementationMessage, formatMissingDependencyMessage, formatMissingFactoryExportMessage, formatMissingModuleImportMessage, type MissingContractImplementationContext, type MissingDefaultContext, type MissingDependencyContext, type MissingFactoryExportContext, type MissingModuleImportContext, } from "./iocRuntimeErrors.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,+BAA+B,EAC/B,kBAAkB,EAClB,KAAK,wBAAwB,EAC7B,oBAAoB,EACpB,qCAAqC,EACrC,mBAAmB,EACnB,KAAK,eAAe,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0CAA0C,EAC1C,yCAAyC,EACzC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,oCAAoC,EACzC,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { registerIocFromManifest } from "./bootstrap.js";
|
|
2
|
+
export { applyIocResolutionErrorMessage, createIocResolutionError, formatIocResolutionErrorMessage, IocResolutionError, isIocResolutionError, mergeAncestorStackIntoResolutionError, mergeFrameSequences, } from "./iocResolutionError.js";
|
|
3
|
+
export { formatMissingContractImplementationMessage, formatMissingDefaultImplementationMessage, formatMissingDependencyMessage, formatMissingFactoryExportMessage, formatMissingModuleImportMessage, } from "./iocRuntimeErrors.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,+BAA+B,EAC/B,kBAAkB,EAElB,oBAAoB,EACpB,qCAAqC,EACrC,mBAAmB,GAEpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0CAA0C,EAC1C,yCAAyC,EACzC,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,GAMjC,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { IocResolutionFrame } from "./iocResolutionStack.js";
|
|
2
|
+
import type { RegistrationKeyIndex } from "./registrationKeyIndex.js";
|
|
3
|
+
export type ResolutionFrame = {
|
|
4
|
+
contractName: string;
|
|
5
|
+
implementationName?: string;
|
|
6
|
+
modulePath?: string;
|
|
7
|
+
/** Awilix registration key when known (used to merge stacks without duplicating frames). */
|
|
8
|
+
registrationKey?: string;
|
|
9
|
+
};
|
|
10
|
+
export type IocResolutionFailureType = "missing" | "threw" | "cyclic" | "lifetime";
|
|
11
|
+
/**
|
|
12
|
+
* Merges an ancestor IoC stack with frames already on an error so parents appear once at the front.
|
|
13
|
+
*/
|
|
14
|
+
export declare const mergeFrameSequences: (ancestorPrefix: readonly ResolutionFrame[], existing: readonly ResolutionFrame[]) => ResolutionFrame[];
|
|
15
|
+
/**
|
|
16
|
+
* Builds the final user-facing message from structured data (single formatting site).
|
|
17
|
+
*/
|
|
18
|
+
export declare const formatIocResolutionErrorMessage: (err: IocResolutionError, keyIndex: RegistrationKeyIndex) => string;
|
|
19
|
+
export declare class IocResolutionError extends Error {
|
|
20
|
+
frames: ResolutionFrame[];
|
|
21
|
+
readonly failureType: IocResolutionFailureType;
|
|
22
|
+
cause?: Error;
|
|
23
|
+
/** Set when failureType === "threw" (plain message, not another IocResolutionError string). */
|
|
24
|
+
throwDetail?: string;
|
|
25
|
+
/** Awilix diagnostic when failureType is cyclic or lifetime. */
|
|
26
|
+
awilixDetail?: string;
|
|
27
|
+
constructor(init: {
|
|
28
|
+
frames: ResolutionFrame[];
|
|
29
|
+
failureType: IocResolutionFailureType;
|
|
30
|
+
cause?: Error;
|
|
31
|
+
throwDetail?: string;
|
|
32
|
+
awilixDetail?: string;
|
|
33
|
+
message?: string;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export declare const isIocResolutionError: (value: unknown) => value is IocResolutionError;
|
|
37
|
+
/**
|
|
38
|
+
* Normalizes any thrown value into an {@link IocResolutionError} without formatting nested IoC errors as strings.
|
|
39
|
+
*/
|
|
40
|
+
export declare const createIocResolutionError: (cause: unknown, keyIndex: RegistrationKeyIndex, stackSnapshot: readonly IocResolutionFrame[]) => IocResolutionError;
|
|
41
|
+
/**
|
|
42
|
+
* Merges the current IoC stack into an existing resolution error and refreshes {@link Error.message} once.
|
|
43
|
+
*/
|
|
44
|
+
export declare const mergeAncestorStackIntoResolutionError: (err: IocResolutionError, ancestorStack: readonly IocResolutionFrame[]) => void;
|
|
45
|
+
export declare const applyIocResolutionErrorMessage: (err: IocResolutionError, keyIndex: RegistrationKeyIndex) => void;
|
|
46
|
+
/**
|
|
47
|
+
* Single entry from factory/collection/group boundaries: structured propagation, no nested string wrapping.
|
|
48
|
+
*/
|
|
49
|
+
export declare const propagateIocResolutionFailure: (params: {
|
|
50
|
+
cause: unknown;
|
|
51
|
+
keyIndex: RegistrationKeyIndex;
|
|
52
|
+
stackSnapshot: readonly IocResolutionFrame[];
|
|
53
|
+
}) => never;
|
|
54
|
+
//# sourceMappingURL=iocResolutionError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iocResolutionError.d.ts","sourceRoot":"","sources":["../../src/runtime/iocResolutionError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC,SAAS,GACT,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;AAKf;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,gBAAgB,SAAS,eAAe,EAAE,EAC1C,UAAU,SAAS,eAAe,EAAE,KACnC,eAAe,EAqBjB,CAAC;AAiOF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAC1C,KAAK,kBAAkB,EACvB,UAAU,oBAAoB,KAC7B,MAIF,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE;QAChB,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1B,WAAW,EAAE,wBAAwB,CAAC;QACtC,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;CAUF;AAED,eAAO,MAAM,oBAAoB,GAC/B,OAAO,OAAO,KACb,KAAK,IAAI,kBAAyD,CAAC;AAsDtE;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,OAAO,EACd,UAAU,oBAAoB,EAC9B,eAAe,SAAS,kBAAkB,EAAE,KAC3C,kBAUF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qCAAqC,GAChD,KAAK,kBAAkB,EACvB,eAAe,SAAS,kBAAkB,EAAE,KAC3C,IAGF,CAAC;AAEF,eAAO,MAAM,8BAA8B,GACzC,KAAK,kBAAkB,EACvB,UAAU,oBAAoB,KAC7B,IAEF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAI,QAAQ;IACpD,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAC9C,KAAG,KAYH,CAAC"}
|