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,4 @@
|
|
|
1
|
+
export { keyFromExportName, resolveRegistrationKeyForFactory, type RegistrationKeyResolutionContext, } from "./resolver.js";
|
|
2
|
+
export type { IocConfigOverrideField, IocContractManifest, IocGeneratedContainerManifest, IocGeneratedContainerManifestCore, IocGroupCollectionManifest, IocGroupLeafManifest, IocGroupNodeManifest, IocGroupObjectManifest, IocGroupsManifest, IocImplementationLifetime, IocModuleNamespace, IocRegisterableManifest, ModuleFactoryManifestMetadata, } from "./manifest.js";
|
|
3
|
+
export { IOC_GENERATED_CONTAINER_MANIFEST_FIXED_KEYS } from "./manifest.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gCAAgC,EAChC,KAAK,gCAAgC,GACtC,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,6BAA6B,EAC7B,iCAAiC,EACjC,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,2CAA2C,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gCAAgC,GAEjC,MAAM,eAAe,CAAC;AAkBvB,OAAO,EAAE,2CAA2C,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export type IocModuleNamespace = Record<string, unknown>;
|
|
2
|
+
/** Lifetime values stored in generated manifests (lowercase; maps to Awilix `Lifetime`). */
|
|
3
|
+
export type IocImplementationLifetime = "singleton" | "scoped" | "transient";
|
|
4
|
+
export type IocConfigOverrideField = "name" | "lifetime" | "default" | "accessKey";
|
|
5
|
+
/**
|
|
6
|
+
* Contract-first manifest: each contract (interface/type name) maps to one or more
|
|
7
|
+
* module factories (inner keys are implementation names from discovery).
|
|
8
|
+
*/
|
|
9
|
+
export type ModuleFactoryManifestMetadata = {
|
|
10
|
+
/** Exported factory identifier, e.g. `buildLocalMediaStorage`. */
|
|
11
|
+
exportName: string;
|
|
12
|
+
/** IoC registration key (from resolver metadata or derived module name). */
|
|
13
|
+
registrationKey: string;
|
|
14
|
+
/** Path relative to `src/`, informational. */
|
|
15
|
+
modulePath: string;
|
|
16
|
+
/** Relative import path from the generated manifest directory to the source file. */
|
|
17
|
+
relImport: string;
|
|
18
|
+
/** Contract / interface or type alias name the factory returns. */
|
|
19
|
+
contractName: string;
|
|
20
|
+
/** Derived from export: strip `build` prefix and lowercase first character (or resolver metadata). */
|
|
21
|
+
implementationName: string;
|
|
22
|
+
/** Awilix lifetime for this registration. */
|
|
23
|
+
lifetime: IocImplementationLifetime;
|
|
24
|
+
/** Index into the parallel `iocModuleImports` array. */
|
|
25
|
+
moduleIndex: number;
|
|
26
|
+
group?: string;
|
|
27
|
+
/** True when this implementation is the resolved default for the contract (config + discovery). */
|
|
28
|
+
default?: boolean;
|
|
29
|
+
/** How the export was matched during discovery. */
|
|
30
|
+
discoveredBy?: "naming";
|
|
31
|
+
/** Which `ioc.config` registration fields were applied for this implementation after merge. */
|
|
32
|
+
configOverridesApplied?: readonly IocConfigOverrideField[];
|
|
33
|
+
/**
|
|
34
|
+
* Contract types inferred as dependencies from the factory's first parameter (object properties).
|
|
35
|
+
*/
|
|
36
|
+
dependencyContractNames?: readonly string[];
|
|
37
|
+
/**
|
|
38
|
+
* When set, Awilix default-slot / cradle key for this contract (singular). Omitted when equal to
|
|
39
|
+
* the convention key (camel-cased contract name).
|
|
40
|
+
*/
|
|
41
|
+
accessKey?: string;
|
|
42
|
+
};
|
|
43
|
+
export type IocContractManifest = Record<string, Record<string, ModuleFactoryManifestMetadata>>;
|
|
44
|
+
/** Fixed top-level keys on the generated container manifest; group roots must not use these names. */
|
|
45
|
+
export declare const IOC_GENERATED_CONTAINER_MANIFEST_FIXED_KEYS: ReadonlySet<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Core shape every generated container manifest includes. Configured group roots are emitted
|
|
48
|
+
* as additional top-level properties alongside these.
|
|
49
|
+
*/
|
|
50
|
+
export type IocGeneratedContainerManifestCore = {
|
|
51
|
+
readonly moduleImports: readonly IocModuleNamespace[];
|
|
52
|
+
readonly contracts: IocContractManifest;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Primary generated container description: module imports, canonical contract manifest, and
|
|
56
|
+
* configured group roots as top-level entries.
|
|
57
|
+
*
|
|
58
|
+
* `TGroupRoots` is intentionally loose (`Record<string, unknown>`): the emitted
|
|
59
|
+
* `IocManifestGroupRoots` helper uses `readonly` tuple literals that are not always assignable to
|
|
60
|
+
* `IocGroupsManifest`’s mutable `Record`/`array` types, while still matching the runtime shape.
|
|
61
|
+
*/
|
|
62
|
+
export type IocGeneratedContainerManifest<TGroupRoots extends Record<string, unknown> = Record<never, never>> = IocGeneratedContainerManifestCore & Readonly<TGroupRoots>;
|
|
63
|
+
/**
|
|
64
|
+
* Full generated container manifest accepted by `registerIocFromManifest`: `moduleImports`,
|
|
65
|
+
* `contracts`, and any extra top-level group-root entries emitted by codegen.
|
|
66
|
+
*/
|
|
67
|
+
export type IocRegisterableManifest = IocGeneratedContainerManifestCore & Record<string, unknown>;
|
|
68
|
+
/** One implementation slot in a generated group (collection item or object property value). */
|
|
69
|
+
export type IocGroupLeafManifest = {
|
|
70
|
+
contractName: string;
|
|
71
|
+
registrationKey: string;
|
|
72
|
+
};
|
|
73
|
+
/** Collection group: ordered list of implementations to resolve from the cradle. */
|
|
74
|
+
export type IocGroupCollectionManifest = IocGroupLeafManifest[];
|
|
75
|
+
/** Object group: property keys are contract keys (default implementation resolved per leaf `registrationKey`). */
|
|
76
|
+
export type IocGroupObjectManifest = Record<string, IocGroupLeafManifest>;
|
|
77
|
+
export type IocGroupNodeManifest = IocGroupCollectionManifest | IocGroupObjectManifest;
|
|
78
|
+
export type IocGroupsManifest = Record<string, IocGroupNodeManifest>;
|
|
79
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,4FAA4F;AAC5F,MAAM,MAAM,yBAAyB,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAE7E,MAAM,MAAM,sBAAsB,GAC9B,MAAM,GACN,UAAU,GACV,SAAS,GACT,WAAW,CAAC;AAEhB;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GAAG;IAC1C,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,YAAY,EAAE,MAAM,CAAC;IACrB,sGAAsG;IACtG,kBAAkB,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,EAAE,yBAAyB,CAAC;IACpC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB,+FAA+F;IAC/F,sBAAsB,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3D;;OAEG;IACH,uBAAuB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,MAAM,CACtC,MAAM,EACN,MAAM,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAC9C,CAAC;AAEF,sGAAsG;AACtG,eAAO,MAAM,2CAA2C,EAAE,WAAW,CAAC,MAAM,CACnC,CAAC;AAE1C;;;GAGG;AACH,MAAM,MAAM,iCAAiC,GAAG;IAC9C,QAAQ,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;CACzC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,6BAA6B,CACvC,WAAW,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAChE,iCAAiC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,iCAAiC,GACrE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1B,+FAA+F;AAC/F,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,EAAE,CAAC;AAEhE,kHAAkH;AAClH,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAC5B,0BAA0B,GAC1B,sBAAsB,CAAC;AAE3B,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAuDA,sGAAsG;AACtG,MAAM,CAAC,MAAM,2CAA2C,GACtD,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives a registration key from an export name when `key` is omitted (legacy / convenience).
|
|
3
|
+
* `buildAlbumService` → `albumService`
|
|
4
|
+
*/
|
|
5
|
+
export declare const keyFromExportName: (exportName: string) => string;
|
|
6
|
+
export type RegistrationKeyResolutionContext = {
|
|
7
|
+
/** e.g. path relative to project root */
|
|
8
|
+
modulePath: string;
|
|
9
|
+
contractName: string;
|
|
10
|
+
exportName: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Precedence: `ioc.config` `registrations[contract][implementation].name` (passed as `configRegistrationName`)
|
|
14
|
+
* → conventional key from export name.
|
|
15
|
+
* Never returns an empty string; throws with actionable detail if a key cannot be determined.
|
|
16
|
+
*/
|
|
17
|
+
export declare const resolveRegistrationKeyForFactory: (exportName: string, configRegistrationName: string | undefined, contractName: string, ctx: RegistrationKeyResolutionContext) => string;
|
|
18
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,YAAY,MAAM,KAAG,MAOtD,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,GAC3C,YAAY,MAAM,EAClB,wBAAwB,MAAM,GAAG,SAAS,EAC1C,cAAc,MAAM,EACpB,KAAK,gCAAgC,KACpC,MAWF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derives a registration key from an export name when `key` is omitted (legacy / convenience).
|
|
3
|
+
* `buildAlbumService` → `albumService`
|
|
4
|
+
*/
|
|
5
|
+
export const keyFromExportName = (exportName) => {
|
|
6
|
+
if (exportName.startsWith("build") && exportName.length > 5) {
|
|
7
|
+
const rest = exportName.slice(5);
|
|
8
|
+
return rest.charAt(0).toLowerCase() + rest.slice(1);
|
|
9
|
+
}
|
|
10
|
+
return exportName.charAt(0).toLowerCase() + exportName.slice(1);
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Precedence: `ioc.config` `registrations[contract][implementation].name` (passed as `configRegistrationName`)
|
|
14
|
+
* → conventional key from export name.
|
|
15
|
+
* Never returns an empty string; throws with actionable detail if a key cannot be determined.
|
|
16
|
+
*/
|
|
17
|
+
export const resolveRegistrationKeyForFactory = (exportName, configRegistrationName, contractName, ctx) => {
|
|
18
|
+
if (configRegistrationName !== undefined && configRegistrationName.length > 0) {
|
|
19
|
+
return configRegistrationName;
|
|
20
|
+
}
|
|
21
|
+
const derived = keyFromExportName(exportName);
|
|
22
|
+
if (derived.length === 0) {
|
|
23
|
+
throw new Error(`[ioc] Cannot determine Awilix registration key for export ${JSON.stringify(exportName)} (contract ${JSON.stringify(contractName)}) in "${ctx.modulePath}". Set registrations[${JSON.stringify(contractName)}][implementationName].name in ioc.config.ts, or use a factory export name that yields a non-empty key (e.g. buildMyService).`);
|
|
24
|
+
}
|
|
25
|
+
return derived;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/core/resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAkB,EAAU,EAAE;IAC9D,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC;AASF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAC9C,UAAkB,EAClB,sBAA0C,EAC1C,YAAoB,EACpB,GAAqC,EAC7B,EAAE;IACV,IAAI,sBAAsB,KAAK,SAAS,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,6DAA6D,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,UAAU,wBAAwB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,8HAA8H,CAC3U,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { ResolvedScanDir } from "./manifestPaths.js";
|
|
3
|
+
/**
|
|
4
|
+
* Locates the source file for a contract type import path as stored on registration plans:
|
|
5
|
+
* relative to {@link generatedDir}, or a workspace/package alias when {@link scanDirs} defines
|
|
6
|
+
* `importPrefix` / `importMode` (see {@link computeManifestModuleSpecifier}).
|
|
7
|
+
*/
|
|
8
|
+
export declare const resolveContractTypeSourceFile: (program: ts.Program, generatedDir: string, contractTypeRelImport: string, scanDirs: readonly ResolvedScanDir[] | undefined, contractName?: string) => ts.SourceFile | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* True when {@link contractName} is provided only via the module's default export (including
|
|
11
|
+
* `export default class Name`, `export default Name`, or `export = Name`), and not via a separate
|
|
12
|
+
* named export `{ contractName }`. Then `ioc-registry.types.ts` must use
|
|
13
|
+
* `import type Name from "..."` instead of `import type { Name } from "..."`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const cradleTypeImportUsesDefaultExport: (sourceFile: ts.SourceFile, contractName: string) => boolean;
|
|
16
|
+
//# sourceMappingURL=contractTypeSourceFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractTypeSourceFile.d.ts","sourceRoot":"","sources":["../../src/generator/contractTypeSourceFile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AA4G1D;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,GACxC,SAAS,EAAE,CAAC,OAAO,EACnB,cAAc,MAAM,EACpB,uBAAuB,MAAM,EAC7B,UAAU,SAAS,eAAe,EAAE,GAAG,SAAS,EAChD,eAAe,MAAM,KACpB,EAAE,CAAC,UAAU,GAAG,SAuDlB,CAAC;AA6IF;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,GAC5C,YAAY,EAAE,CAAC,UAAU,EACzB,cAAc,MAAM,KACnB,OAKF,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
const getTopLevelTypeDeclaration = (sourceFile, typeName) => {
|
|
4
|
+
for (const stmt of sourceFile.statements) {
|
|
5
|
+
if (ts.isInterfaceDeclaration(stmt) && stmt.name.text === typeName) {
|
|
6
|
+
if (stmt.parent === sourceFile) {
|
|
7
|
+
return stmt;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
if (ts.isTypeAliasDeclaration(stmt) && stmt.name.text === typeName) {
|
|
11
|
+
if (stmt.parent === sourceFile) {
|
|
12
|
+
return stmt;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
};
|
|
18
|
+
const matchSourceFileByAbsoluteBase = (program, baseAbs) => {
|
|
19
|
+
const candidates = [
|
|
20
|
+
`${baseAbs}.ts`,
|
|
21
|
+
`${baseAbs}.tsx`,
|
|
22
|
+
path.join(baseAbs, "index.ts"),
|
|
23
|
+
path.join(baseAbs, "index.tsx"),
|
|
24
|
+
];
|
|
25
|
+
const normalizedCandidates = candidates.map((c) => path.normalize(c));
|
|
26
|
+
const files = program.getSourceFiles();
|
|
27
|
+
for (const cand of normalizedCandidates) {
|
|
28
|
+
const hit = files.find((sf) => path.normalize(sf.fileName) === cand);
|
|
29
|
+
if (hit !== undefined) {
|
|
30
|
+
return hit;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const lower = new Set(normalizedCandidates.map((c) => c.toLowerCase()));
|
|
34
|
+
const caseHit = files.find((sf) => lower.has(path.normalize(sf.fileName).toLowerCase()));
|
|
35
|
+
if (caseHit !== undefined) {
|
|
36
|
+
return caseHit;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* When {@link importMode} is `root`, the emitted specifier is only `importPrefix`. Find the unique
|
|
42
|
+
* source file under the scan root that declares `contractName` as a top-level interface or type alias.
|
|
43
|
+
*/
|
|
44
|
+
const findUniqueContractDeclarationSourceUnderScanRoot = (program, scanRootAbs, contractName) => {
|
|
45
|
+
const normRoot = path.normalize(scanRootAbs);
|
|
46
|
+
const hits = [];
|
|
47
|
+
for (const sf of program.getSourceFiles()) {
|
|
48
|
+
if (sf.fileName.includes(`${path.sep}node_modules${path.sep}`)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const norm = path.normalize(sf.fileName);
|
|
52
|
+
const under = norm === normRoot || norm.startsWith(`${normRoot}${path.sep}`);
|
|
53
|
+
if (!under) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (getTopLevelTypeDeclaration(sf, contractName) !== undefined) {
|
|
57
|
+
hits.push(sf);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (hits.length === 1) {
|
|
61
|
+
return hits[0];
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
};
|
|
65
|
+
const tryResolveRootModeSpecifier = (program, entry, contractName) => {
|
|
66
|
+
if (contractName !== undefined) {
|
|
67
|
+
const unique = findUniqueContractDeclarationSourceUnderScanRoot(program, entry.absPath, contractName);
|
|
68
|
+
if (unique !== undefined) {
|
|
69
|
+
return unique;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
for (const rel of ["index.ts", "index.tsx", "src/index.ts", "src/index.tsx"]) {
|
|
73
|
+
const full = path.normalize(path.join(entry.absPath, rel));
|
|
74
|
+
const baseAbs = full.replace(/\.tsx?$/i, "");
|
|
75
|
+
const hit = matchSourceFileByAbsoluteBase(program, baseAbs);
|
|
76
|
+
if (hit !== undefined) {
|
|
77
|
+
return hit;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Locates the source file for a contract type import path as stored on registration plans:
|
|
84
|
+
* relative to {@link generatedDir}, or a workspace/package alias when {@link scanDirs} defines
|
|
85
|
+
* `importPrefix` / `importMode` (see {@link computeManifestModuleSpecifier}).
|
|
86
|
+
*/
|
|
87
|
+
export const resolveContractTypeSourceFile = (program, generatedDir, contractTypeRelImport, scanDirs, contractName) => {
|
|
88
|
+
const entries = scanDirs ?? [];
|
|
89
|
+
const withoutJs = contractTypeRelImport.replace(/\.js$/i, "");
|
|
90
|
+
const isRelativeSpecifier = contractTypeRelImport.startsWith("./") ||
|
|
91
|
+
contractTypeRelImport.startsWith("../");
|
|
92
|
+
if (isRelativeSpecifier) {
|
|
93
|
+
const raw = contractTypeRelImport.replace(/^\.\//, "").replace(/\.js$/i, "");
|
|
94
|
+
const baseAbs = path.resolve(generatedDir, raw);
|
|
95
|
+
return matchSourceFileByAbsoluteBase(program, baseAbs);
|
|
96
|
+
}
|
|
97
|
+
const prefixed = entries
|
|
98
|
+
.filter((e) => e.importPrefix !== undefined && e.importMode !== undefined)
|
|
99
|
+
.sort((a, b) => b.importPrefix.length - a.importPrefix.length);
|
|
100
|
+
for (const entry of prefixed) {
|
|
101
|
+
const p = entry.importPrefix;
|
|
102
|
+
if (entry.importMode === "subpath") {
|
|
103
|
+
const prefixSlash = `${p}/`;
|
|
104
|
+
if (withoutJs.startsWith(prefixSlash)) {
|
|
105
|
+
const remainder = withoutJs.slice(prefixSlash.length);
|
|
106
|
+
if (remainder.length === 0) {
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
const nativeRel = remainder.split("/").join(path.sep);
|
|
110
|
+
const baseAbs = path.normalize(path.join(entry.absPath, nativeRel));
|
|
111
|
+
return matchSourceFileByAbsoluteBase(program, baseAbs);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else if (entry.importMode === "root") {
|
|
115
|
+
if (withoutJs === p) {
|
|
116
|
+
return tryResolveRootModeSpecifier(program, entry, contractName);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const bareResolved = tryResolveBarePackageSpecifierToSourceFile(program, contractTypeRelImport, generatedDir);
|
|
121
|
+
if (bareResolved !== undefined) {
|
|
122
|
+
return bareResolved;
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
};
|
|
126
|
+
const looksLikeBarePackageSpecifier = (spec) => {
|
|
127
|
+
const s = spec.replace(/\.js$/i, "");
|
|
128
|
+
if (s.length === 0) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (s.startsWith(".") || s.startsWith("/")) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (path.isAbsolute(s)) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
if (s.includes("node_modules")) {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
return true;
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Resolves a stored bare package specifier (e.g. `knex`, `@scope/pkg`) to a program source file
|
|
144
|
+
* so default-vs-named import emission can inspect the declaration module.
|
|
145
|
+
*/
|
|
146
|
+
const tryResolveBarePackageSpecifierToSourceFile = (program, moduleSpecifier, generatedDir) => {
|
|
147
|
+
const trimmed = moduleSpecifier.replace(/\.js$/i, "");
|
|
148
|
+
if (!looksLikeBarePackageSpecifier(trimmed)) {
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
const containingFile = path.join(generatedDir, "ioc-registry.types.ts");
|
|
152
|
+
const host = ts.createCompilerHost(program.getCompilerOptions());
|
|
153
|
+
const resolved = ts.resolveModuleName(trimmed, containingFile, program.getCompilerOptions(), host);
|
|
154
|
+
const fileName = resolved.resolvedModule?.resolvedFileName;
|
|
155
|
+
if (fileName === undefined) {
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
return program.getSourceFile(fileName);
|
|
159
|
+
};
|
|
160
|
+
const hasExplicitNamedExportOfContract = (sourceFile, contractName) => {
|
|
161
|
+
for (const stmt of sourceFile.statements) {
|
|
162
|
+
if (ts.isExportDeclaration(stmt) && stmt.exportClause !== undefined) {
|
|
163
|
+
if (ts.isNamedExports(stmt.exportClause)) {
|
|
164
|
+
for (const el of stmt.exportClause.elements) {
|
|
165
|
+
if (el.name.text === contractName) {
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (ts.isClassDeclaration(stmt) && stmt.name?.text === contractName) {
|
|
172
|
+
const hasExport = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
173
|
+
const hasDefault = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
174
|
+
if (hasExport === true && hasDefault !== true) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (ts.isInterfaceDeclaration(stmt) && stmt.name.text === contractName) {
|
|
179
|
+
if (stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ===
|
|
180
|
+
true) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (ts.isTypeAliasDeclaration(stmt) && stmt.name.text === contractName) {
|
|
185
|
+
if (stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) ===
|
|
186
|
+
true) {
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (ts.isFunctionDeclaration(stmt) && stmt.name?.text === contractName) {
|
|
191
|
+
const hasExport = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
192
|
+
const hasDefault = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
193
|
+
if (hasExport === true && hasDefault !== true) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return false;
|
|
199
|
+
};
|
|
200
|
+
const defaultExportProvidesContract = (sourceFile, contractName) => {
|
|
201
|
+
for (const stmt of sourceFile.statements) {
|
|
202
|
+
if (ts.isClassDeclaration(stmt) && stmt.name?.text === contractName) {
|
|
203
|
+
const hasExport = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
204
|
+
const hasDefault = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
205
|
+
if (hasExport === true && hasDefault === true) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (ts.isFunctionDeclaration(stmt) && stmt.name?.text === contractName) {
|
|
210
|
+
const hasExport = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
211
|
+
const hasDefault = stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword);
|
|
212
|
+
if (hasExport === true && hasDefault === true) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (ts.isExportAssignment(stmt) &&
|
|
217
|
+
ts.isIdentifier(stmt.expression) &&
|
|
218
|
+
stmt.expression.text === contractName) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return false;
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* True when {@link contractName} is provided only via the module's default export (including
|
|
226
|
+
* `export default class Name`, `export default Name`, or `export = Name`), and not via a separate
|
|
227
|
+
* named export `{ contractName }`. Then `ioc-registry.types.ts` must use
|
|
228
|
+
* `import type Name from "..."` instead of `import type { Name } from "..."`.
|
|
229
|
+
*/
|
|
230
|
+
export const cradleTypeImportUsesDefaultExport = (sourceFile, contractName) => {
|
|
231
|
+
if (hasExplicitNamedExportOfContract(sourceFile, contractName)) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
return defaultExportProvidesContract(sourceFile, contractName);
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=contractTypeSourceFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractTypeSourceFile.js","sourceRoot":"","sources":["../../src/generator/contractTypeSourceFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { IocConfig } from "../../config/iocConfig.js";
|
|
3
|
+
import type { DiscoveredFactory } from "../types.js";
|
|
4
|
+
import { type FactoryDiscoveryPaths } from "../manifestPaths.js";
|
|
5
|
+
import type { IocDiscoveryAnalysisFiles } from "./discoveryOutcomeTypes.js";
|
|
6
|
+
export type FactoryDiscoveryRunOptions = {
|
|
7
|
+
/** When true, collect per-file outcomes for on-demand discovery reports (not written to manifest). */
|
|
8
|
+
collectFileRecords?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Discovers factories and optionally collects full per-file scan records for analysis tooling.
|
|
12
|
+
*/
|
|
13
|
+
export declare const discoverFactories: (files: string[], program: ts.Program, projectRoot: string, factoryPrefix: string, discoveryPaths: FactoryDiscoveryPaths, iocConfig?: IocConfig, runOptions?: FactoryDiscoveryRunOptions) => {
|
|
14
|
+
contractMap: Map<string, Map<string, DiscoveredFactory>>;
|
|
15
|
+
acceptedFactories: DiscoveredFactory[];
|
|
16
|
+
discoveryFiles: IocDiscoveryAnalysisFiles;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=discoverFactories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discoverFactories.d.ts","sourceRoot":"","sources":["../../../src/generator/discoverFactories/discoverFactories.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,4BAA4B,CAAC;AAiBpC,MAAM,MAAM,0BAA0B,GAAG;IACvC,sGAAsG;IACtG,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAuCF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EAAE,EACf,SAAS,EAAE,CAAC,OAAO,EACnB,aAAa,MAAM,EACnB,eAAe,MAAM,EACrB,gBAAgB,qBAAqB,EACrC,YAAY,SAAS,EACrB,aAAa,0BAA0B,KACtC;IACD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACzD,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC,cAAc,EAAE,yBAAyB,CAAC;CAyF3C,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Aggregates per-file factory scans into a contract → implementation map and
|
|
3
|
+
* optionally enriches factories with inferred dependency contract names from the first parameter.
|
|
4
|
+
*/
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { resolveFactorySourceAbsPath, } from "../manifestPaths.js";
|
|
7
|
+
import { collectFileAnalysisForFactoryDiscovery } from "./scanFactoryFile.js";
|
|
8
|
+
import { scanFactoryFile } from "./scanFactoryFile.js";
|
|
9
|
+
import { inferDependencyContractNames } from "./inferFactoryDependencyContracts.js";
|
|
10
|
+
const normalizePath = (p) => path.normalize(p);
|
|
11
|
+
const buildSourceFileIndex = (program) => {
|
|
12
|
+
const index = new Map();
|
|
13
|
+
for (const sf of program.getSourceFiles()) {
|
|
14
|
+
index.set(normalizePath(sf.fileName), sf);
|
|
15
|
+
}
|
|
16
|
+
return index;
|
|
17
|
+
};
|
|
18
|
+
const enrichDependencyContracts = (program, acceptedFactories, contractNames, discoveryPaths, sourceFileByPath) => {
|
|
19
|
+
if (contractNames.size === 0 || acceptedFactories.length === 0) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const checker = program.getTypeChecker();
|
|
23
|
+
for (const f of acceptedFactories) {
|
|
24
|
+
const absPath = normalizePath(resolveFactorySourceAbsPath(f.modulePath, discoveryPaths.projectRoot, discoveryPaths.scanDirs));
|
|
25
|
+
const sourceFile = sourceFileByPath.get(absPath);
|
|
26
|
+
if (!sourceFile) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const analysis = collectFileAnalysisForFactoryDiscovery(sourceFile);
|
|
30
|
+
const decl = analysis.factoryDeclByExport.get(f.exportName);
|
|
31
|
+
if (!decl) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const deps = inferDependencyContractNames(checker, decl, contractNames);
|
|
35
|
+
if (deps.length > 0) {
|
|
36
|
+
f.dependencyContractNames = deps;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Discovers factories and optionally collects full per-file scan records for analysis tooling.
|
|
42
|
+
*/
|
|
43
|
+
export const discoverFactories = (files, program, projectRoot, factoryPrefix, discoveryPaths, iocConfig, runOptions) => {
|
|
44
|
+
const checker = program.getTypeChecker();
|
|
45
|
+
const sourceFileByPath = buildSourceFileIndex(program);
|
|
46
|
+
const contractMap = new Map();
|
|
47
|
+
const registrationKeyOwner = new Map();
|
|
48
|
+
const acceptedFactories = [];
|
|
49
|
+
const collectRecords = runOptions?.collectFileRecords === true;
|
|
50
|
+
const discoveryFiles = [];
|
|
51
|
+
for (const abs of files.sort((a, b) => a.localeCompare(b))) {
|
|
52
|
+
const sourceFile = sourceFileByPath.get(normalizePath(abs));
|
|
53
|
+
if (!sourceFile) {
|
|
54
|
+
throw new Error(`[ioc] File is not in the TypeScript program (cannot type-check): "${path.relative(projectRoot, abs)}". It may be excluded from tsconfig "include" or matched only by discovery globs — add it to the project or adjust tsconfig.`);
|
|
55
|
+
}
|
|
56
|
+
const fileContext = {
|
|
57
|
+
absPath: abs,
|
|
58
|
+
sourceFile,
|
|
59
|
+
projectRoot,
|
|
60
|
+
factoryPrefix,
|
|
61
|
+
iocConfig,
|
|
62
|
+
paths: {
|
|
63
|
+
projectRoot,
|
|
64
|
+
scanDirs: discoveryPaths.scanDirs,
|
|
65
|
+
generatedDir: discoveryPaths.generatedDir,
|
|
66
|
+
workspacePackageImportBases: discoveryPaths.workspacePackageImportBases,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
const scan = scanFactoryFile(fileContext, checker);
|
|
70
|
+
if (collectRecords) {
|
|
71
|
+
discoveryFiles.push({
|
|
72
|
+
modulePath: scan.modulePath,
|
|
73
|
+
outcomes: scan.outcomes,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
for (const f of scan.discovered) {
|
|
77
|
+
const existingOwner = registrationKeyOwner.get(f.registrationKey);
|
|
78
|
+
if (existingOwner !== undefined) {
|
|
79
|
+
throw new Error(`[ioc] Duplicate registration key ${JSON.stringify(f.registrationKey)}: first export "${existingOwner.exportName}" in "${existingOwner.modulePath}", second export "${f.exportName}" in "${f.modulePath}". Rename exports or adjust ioc.config registrations[contract][implementation].name so Awilix registration keys are globally unique.`);
|
|
80
|
+
}
|
|
81
|
+
const impls = contractMap.get(f.contractName) ?? new Map();
|
|
82
|
+
if (impls.has(f.implementationName)) {
|
|
83
|
+
const existing = impls.get(f.implementationName);
|
|
84
|
+
throw new Error(`[ioc] Duplicate implementation name ${JSON.stringify(f.implementationName)} for contract "${f.contractName}": first "${existing.exportName}" in "${existing.modulePath}", second "${f.exportName}" in "${f.modulePath}". Implementation names must be unique per contract.`);
|
|
85
|
+
}
|
|
86
|
+
impls.set(f.implementationName, f);
|
|
87
|
+
contractMap.set(f.contractName, impls);
|
|
88
|
+
registrationKeyOwner.set(f.registrationKey, {
|
|
89
|
+
modulePath: f.modulePath,
|
|
90
|
+
exportName: f.exportName,
|
|
91
|
+
});
|
|
92
|
+
acceptedFactories.push(f);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const knownContracts = new Set(contractMap.keys());
|
|
96
|
+
enrichDependencyContracts(program, acceptedFactories, knownContracts, discoveryPaths, sourceFileByPath);
|
|
97
|
+
const sortedFiles = collectRecords
|
|
98
|
+
? discoveryFiles
|
|
99
|
+
.slice()
|
|
100
|
+
.sort((a, b) => a.modulePath.localeCompare(b.modulePath))
|
|
101
|
+
: [];
|
|
102
|
+
return {
|
|
103
|
+
contractMap,
|
|
104
|
+
acceptedFactories,
|
|
105
|
+
discoveryFiles: sortedFiles,
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=discoverFactories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discoverFactories.js","sourceRoot":"","sources":["../../../src/generator/discoverFactories/discoverFactories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery outcome types used by factory scanning and on-demand discovery analysis.
|
|
3
|
+
* Not part of the generated runtime manifest (keeps manifest size bounded).
|
|
4
|
+
*/
|
|
5
|
+
export declare const IocDiscoverySkipReason: {
|
|
6
|
+
readonly NO_MATCHING_EXPORT: "no_matching_export";
|
|
7
|
+
readonly NO_FACTORY_PATTERN_IN_SOURCE: "no_factory_pattern_in_source";
|
|
8
|
+
readonly INVALID_FACTORY_SIGNATURE: "invalid_factory_signature";
|
|
9
|
+
readonly CONTRACT_NOT_FOUND: "contract_not_found";
|
|
10
|
+
readonly CONTRACT_NOT_IMPORTED: "contract_not_imported";
|
|
11
|
+
readonly CONTRACT_NOT_RESOLVED: "contract_not_resolved";
|
|
12
|
+
readonly EXCLUDED_BY_CONFIG: "excluded_by_config";
|
|
13
|
+
readonly UNSUPPORTED_PATTERN: "unsupported_pattern";
|
|
14
|
+
};
|
|
15
|
+
export type IocDiscoverySkipReason = (typeof IocDiscoverySkipReason)[keyof typeof IocDiscoverySkipReason];
|
|
16
|
+
export declare const IocDiscoveryStatus: {
|
|
17
|
+
readonly DISCOVERED: "discovered";
|
|
18
|
+
readonly SKIPPED: "skipped";
|
|
19
|
+
};
|
|
20
|
+
export type IocDiscoveryStatus = (typeof IocDiscoveryStatus)[keyof typeof IocDiscoveryStatus];
|
|
21
|
+
export type IocDiscoveryOutcome = {
|
|
22
|
+
scope: "file";
|
|
23
|
+
status: typeof IocDiscoveryStatus.SKIPPED;
|
|
24
|
+
skipReason: IocDiscoverySkipReason;
|
|
25
|
+
} | {
|
|
26
|
+
scope: "export";
|
|
27
|
+
exportName: string;
|
|
28
|
+
status: typeof IocDiscoveryStatus.DISCOVERED;
|
|
29
|
+
contractName: string;
|
|
30
|
+
implementationName: string;
|
|
31
|
+
registrationKey: string;
|
|
32
|
+
discoveredBy: "naming";
|
|
33
|
+
} | {
|
|
34
|
+
scope: "export";
|
|
35
|
+
exportName: string;
|
|
36
|
+
status: typeof IocDiscoveryStatus.SKIPPED;
|
|
37
|
+
skipReason: IocDiscoverySkipReason;
|
|
38
|
+
contractName?: string;
|
|
39
|
+
};
|
|
40
|
+
export type IocDiscoveryFileRecord = {
|
|
41
|
+
/** Path relative to the project `src/` root (POSIX). */
|
|
42
|
+
modulePath: string;
|
|
43
|
+
outcomes: readonly IocDiscoveryOutcome[];
|
|
44
|
+
};
|
|
45
|
+
/** Full per-file discovery scan (on-demand analysis only; not code-generated). */
|
|
46
|
+
export type IocDiscoveryAnalysisFiles = readonly IocDiscoveryFileRecord[];
|
|
47
|
+
//# sourceMappingURL=discoveryOutcomeTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discoveryOutcomeTypes.d.ts","sourceRoot":"","sources":["../../../src/generator/discoverFactories/discoveryOutcomeTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;CASzB,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAC;AAEvE,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAC5B,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,OAAO,kBAAkB,CAAC,CAAC;AAE/D,MAAM,MAAM,mBAAmB,GAC3B;IACE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,kBAAkB,CAAC,OAAO,CAAC;IAC1C,UAAU,EAAE,sBAAsB,CAAC;CACpC,GACD;IACE,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,kBAAkB,CAAC,UAAU,CAAC;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,QAAQ,CAAC;CACxB,GACD;IACE,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,kBAAkB,CAAC,OAAO,CAAC;IAC1C,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,sBAAsB,GAAG;IACnC,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;CAC1C,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,yBAAyB,GAAG,SAAS,sBAAsB,EAAE,CAAC"}
|