ioc-manifest 4.0.0 → 4.0.1

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.
@@ -0,0 +1,43 @@
1
+ /**
2
+ * How many tsx ESM hooks this process has registered.
3
+ *
4
+ * The structural pin for the regression this module fixes: it must be 1 after loading any number
5
+ * of configs, and 0 before the first. A timing assertion would say the same thing far less
6
+ * reliably.
7
+ */
8
+ export declare const configLoaderRegistrationCount: () => number;
9
+ /**
10
+ * Releases the tsx hook. For embedders that load configs inside a longer-lived process and want
11
+ * their loader chain back; a CLI run has no reason to call it.
12
+ *
13
+ * Deliberately NOT wired to `process.on("exit")`: `unregister` is async and exit handlers cannot
14
+ * await, so the "cleanup" would be a no-op that merely looked tidy.
15
+ */
16
+ export declare const unregisterConfigLoader: () => Promise<void>;
17
+ /**
18
+ * The identity two paths to the same config share.
19
+ *
20
+ * Realpath rather than `resolve` so a package reached through a `node_modules` symlink and the same
21
+ * package reached through its workspace path are one cache entry, not two. A path that cannot be
22
+ * realpath'd (it does not exist yet) still gets a stable key.
23
+ */
24
+ export declare const canonicalConfigKey: (absoluteConfigPath: string) => string;
25
+ /**
26
+ * The identity of "this config file with THIS content" — path plus stamp.
27
+ *
28
+ * Anything caching a derived value (a validated {@link IocConfig}, say) must key on this rather
29
+ * than on the path alone, or a config rewritten in place would keep serving its old value while
30
+ * {@link importConfigModule} correctly re-read the new one. The two caches have to agree on when a
31
+ * config has changed, so they share one definition of it.
32
+ */
33
+ export declare const configCacheKey: (absoluteConfigPath: string) => string;
34
+ /**
35
+ * Loads a `.ts` config as a module namespace, once per (path, content) per process.
36
+ *
37
+ * A rejected load is evicted rather than remembered: a config that throws on load is a condition a
38
+ * caller may legitimately retry after fixing it, and a cached rejection would outlive the fix.
39
+ */
40
+ export declare const importConfigModule: (absoluteConfigPath: string) => Promise<Record<string, unknown>>;
41
+ /** Drops every cached config module. For tests that rebuild a fixture under one process. */
42
+ export declare const clearConfigModuleCache: () => void;
43
+ //# sourceMappingURL=configModuleLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configModuleLoader.d.ts","sourceRoot":"","sources":["../../src/config/configModuleLoader.ts"],"names":[],"mappings":"AAwGA;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,QAAO,MAA2B,CAAC;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,QAAa,OAAO,CAAC,IAAI,CAS3D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,oBAAoB,MAAM,KAAG,MAO/D,CAAC;AAwBF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAAI,oBAAoB,MAAM,KAAG,MAG3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,oBAAoB,MAAM,KACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BjC,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,QAAO,IAEzC,CAAC"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @fileoverview The ONE place a `.ts` `ioc.config` becomes a module. Everything that needs a
3
+ * config goes through here; nothing else in the codebase may import `tsx`.
4
+ *
5
+ * ### Why this module exists at all
6
+ *
7
+ * `tsx`'s `tsImport()` is `register({ namespace: Date.now() }).import(...)`, and it never
8
+ * unregisters. On Node 18.19+/20.6+ that takes the off-thread `module.register()` path, so every
9
+ * call leaves ANOTHER live ESM hook in the process. Four packages meant four hooks.
10
+ *
11
+ * The hooks are supposed to be independent — each registration cache-busts `esm/index.mjs` with a
12
+ * `?<timestamp>` so it gets its own module instance, and each hook ignores resolutions whose
13
+ * namespace is not its own. In tsx 4.22.0–4.22.4 that isolation is broken: the exported
14
+ * `initialize` / `resolve` / `load` come from a helper module that is NOT cache-busted, and they
15
+ * all close over a single module-level state object which `initialize` overwrites with
16
+ * `Object.assign(state, createData(options))`. Every new registration therefore re-points the
17
+ * namespace that ALL prior hooks compare against, so all N hooks match the current namespace and
18
+ * each re-applies tsx's full extension fan-out (`mapTsExtensions`: 9–14 candidates) before
19
+ * delegating to the next. Cost goes as roughly 14^(N−1).
20
+ *
21
+ * Reproduced on tsx 4.22.0, one import, N hooks registered up front:
22
+ *
23
+ * ```
24
+ * N=1 0.016s N=2 0.017s N=3 0.032s
25
+ * N=4 0.202s N=5 2.209s N=6 30.388s
26
+ * ```
27
+ *
28
+ * The field saw the same curve as 1.03 / 1.36 / 11.53 / 151.42s across four packages — a 156-second
29
+ * `ioc validate` whose globbing and hashing were provably innocent.
30
+ *
31
+ * `unregister()` is not a workaround: it only flips `active` to false on that same shared object,
32
+ * and the next `register()` re-arms it for every hook at once. Measured identical.
33
+ *
34
+ * ### The fix
35
+ *
36
+ * Register exactly once per process and reuse the scoped importer. N stays 1 however many packages
37
+ * are composed, which makes the pathological branch unreachable regardless of which tsx is
38
+ * installed. {@link configLoaderRegistrationCount} exists so a test can assert that structurally
39
+ * rather than by watching a clock.
40
+ *
41
+ * ### Why the specifier carries an mtime stamp
42
+ *
43
+ * The per-call namespace `tsImport` generated had one accidental virtue: it made every load a
44
+ * distinct module URL, so a config rewritten in place was always re-read. Under one stable
45
+ * namespace the URL is stable too, and Node's ESM cache would hand back the STALE module — which
46
+ * silently breaks anything that regenerates a config and reloads it. So the specifier carries
47
+ * `?ioc-config=<mtimeMs>-<size>`: unchanged file, same URL, free cache hit; changed file, new URL,
48
+ * genuine re-read. Verified in both directions.
49
+ */
50
+ import fs from "node:fs";
51
+ import path from "node:path";
52
+ import { register } from "tsx/esm/api";
53
+ /**
54
+ * Stable, and deliberately not `Date.now()`.
55
+ *
56
+ * The namespace exists to keep OUR hook from claiming resolutions that belong to someone else's
57
+ * loader; it does not need to be unique per call, and making it unique per call is precisely the
58
+ * bug this module routes around.
59
+ */
60
+ const TSX_NAMESPACE = "ioc-manifest-config";
61
+ /** The query key that carries the file stamp. Named so it is obvious in a stack trace. */
62
+ const STAMP_QUERY = "ioc-config";
63
+ let scopedLoader;
64
+ let registrationCount = 0;
65
+ /**
66
+ * `false` disables tsx's tsconfig resolution for config loading; `undefined` keeps it.
67
+ *
68
+ * Default is to KEEP it. A consumer's `ioc.config.ts` is allowed to import through the project's
69
+ * `paths` aliases, and `tsconfig: false` makes those imports fail outright with
70
+ * `ERR_MODULE_NOT_FOUND` — so it cannot be the default. It is also not the fix it looked like:
71
+ * measured against the reproduction above, `tsconfig: false` on its own left the blow-up fully
72
+ * intact (2.64s vs 2.57s across five packages), because the extension fan-out is entered whenever
73
+ * the IMPORTING file is TypeScript, not only when `allowJs` is set. Registering once is what
74
+ * flattens it (0.04s).
75
+ *
76
+ * The escape hatch stays for the case it genuinely serves: a project whose tsconfig is enormous or
77
+ * whose compiler options actively confuse a config that needs none of them.
78
+ */
79
+ const resolveTsconfigOption = () => process.env.IOC_CONFIG_TSCONFIG === "false" ? false : undefined;
80
+ /** The process's single tsx registration, created on first use. */
81
+ const scoped = () => {
82
+ if (scopedLoader === undefined) {
83
+ scopedLoader = register({
84
+ namespace: TSX_NAMESPACE,
85
+ tsconfig: resolveTsconfigOption(),
86
+ });
87
+ registrationCount += 1;
88
+ }
89
+ return scopedLoader;
90
+ };
91
+ /**
92
+ * How many tsx ESM hooks this process has registered.
93
+ *
94
+ * The structural pin for the regression this module fixes: it must be 1 after loading any number
95
+ * of configs, and 0 before the first. A timing assertion would say the same thing far less
96
+ * reliably.
97
+ */
98
+ export const configLoaderRegistrationCount = () => registrationCount;
99
+ /**
100
+ * Releases the tsx hook. For embedders that load configs inside a longer-lived process and want
101
+ * their loader chain back; a CLI run has no reason to call it.
102
+ *
103
+ * Deliberately NOT wired to `process.on("exit")`: `unregister` is async and exit handlers cannot
104
+ * await, so the "cleanup" would be a no-op that merely looked tidy.
105
+ */
106
+ export const unregisterConfigLoader = async () => {
107
+ const active = scopedLoader;
108
+ if (active === undefined) {
109
+ return;
110
+ }
111
+ scopedLoader = undefined;
112
+ registrationCount = 0;
113
+ moduleCache.clear();
114
+ await active.unregister();
115
+ };
116
+ /**
117
+ * The identity two paths to the same config share.
118
+ *
119
+ * Realpath rather than `resolve` so a package reached through a `node_modules` symlink and the same
120
+ * package reached through its workspace path are one cache entry, not two. A path that cannot be
121
+ * realpath'd (it does not exist yet) still gets a stable key.
122
+ */
123
+ export const canonicalConfigKey = (absoluteConfigPath) => {
124
+ const resolved = path.resolve(absoluteConfigPath);
125
+ try {
126
+ return fs.realpathSync(resolved);
127
+ }
128
+ catch {
129
+ return resolved;
130
+ }
131
+ };
132
+ /**
133
+ * What the file looks like right now, or `undefined` if it cannot be stat'd.
134
+ *
135
+ * mtime AND size: mtime alone has filesystem-dependent granularity, and a same-millisecond rewrite
136
+ * that changes length is exactly the shape a test fixture produces.
137
+ */
138
+ const fileStamp = (canonicalPath) => {
139
+ try {
140
+ const stat = fs.statSync(canonicalPath);
141
+ return `${stat.mtimeMs}-${stat.size}`;
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ };
147
+ const moduleCache = new Map();
148
+ /**
149
+ * The identity of "this config file with THIS content" — path plus stamp.
150
+ *
151
+ * Anything caching a derived value (a validated {@link IocConfig}, say) must key on this rather
152
+ * than on the path alone, or a config rewritten in place would keep serving its old value while
153
+ * {@link importConfigModule} correctly re-read the new one. The two caches have to agree on when a
154
+ * config has changed, so they share one definition of it.
155
+ */
156
+ export const configCacheKey = (absoluteConfigPath) => {
157
+ const key = canonicalConfigKey(absoluteConfigPath);
158
+ return `${key}@${fileStamp(key) ?? "missing"}`;
159
+ };
160
+ /**
161
+ * Loads a `.ts` config as a module namespace, once per (path, content) per process.
162
+ *
163
+ * A rejected load is evicted rather than remembered: a config that throws on load is a condition a
164
+ * caller may legitimately retry after fixing it, and a cached rejection would outlive the fix.
165
+ */
166
+ export const importConfigModule = async (absoluteConfigPath) => {
167
+ const key = canonicalConfigKey(absoluteConfigPath);
168
+ const stamp = fileStamp(key);
169
+ const cached = moduleCache.get(key);
170
+ if (cached !== undefined && cached.stamp === stamp) {
171
+ return cached.module;
172
+ }
173
+ const specifier = stamp === undefined
174
+ ? key
175
+ : `${key}?${STAMP_QUERY}=${encodeURIComponent(stamp)}`;
176
+ const loading = scoped()
177
+ .import(specifier, import.meta.url)
178
+ .then((mod) => mod)
179
+ .catch((error) => {
180
+ if (moduleCache.get(key)?.module === loading) {
181
+ moduleCache.delete(key);
182
+ }
183
+ throw error;
184
+ });
185
+ moduleCache.set(key, { stamp, module: loading });
186
+ return loading;
187
+ };
188
+ /** Drops every cached config module. For tests that rebuild a fixture under one process. */
189
+ export const clearConfigModuleCache = () => {
190
+ moduleCache.clear();
191
+ };
192
+ //# sourceMappingURL=configModuleLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configModuleLoader.js","sourceRoot":"","sources":["../../src/config/configModuleLoader.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { IocConfig } from "./iocConfig.js";
2
2
  export declare const loadIocConfig: (absoluteConfigPath: string) => Promise<IocConfig>;
3
+ /** Drops every cached config. For tests that rebuild a fixture config under one process. */
4
+ export declare const clearIocConfigCache: () => void;
3
5
  /**
4
6
  * IoC package root inferred from where `ioc.config` lives: if the config file is under a `src`
5
7
  * directory, the package root is the parent of that `src` (so `discovery.scanDirs` entries stay relative
@@ -1 +1 @@
1
- {"version":3,"file":"loadIocConfig.d.ts","sourceRoot":"","sources":["../../src/config/loadIocConfig.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgLhD,eAAO,MAAM,aAAa,GACxB,oBAAoB,MAAM,KACzB,OAAO,CAAC,SAAS,CAWnB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAC9C,oBAAoB,MAAM,KACzB,MAKF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gCAAgC,GAC3C,aAAa,MAAM,KAClB,MAAM,GAAG,SAQX,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,MAAM,EACtB,eAAe,MAAM,KACpB,MAwDF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,KACzB,OAAO,CAAC,SAAS,GAAG,SAAS,CAQ/B,CAAC"}
1
+ {"version":3,"file":"loadIocConfig.d.ts","sourceRoot":"","sources":["../../src/config/loadIocConfig.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAiMhD,eAAO,MAAM,aAAa,GACxB,oBAAoB,MAAM,KACzB,OAAO,CAAC,SAAS,CAyBnB,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,QAAO,IAEtC,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAC9C,oBAAoB,MAAM,KACzB,MAKF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gCAAgC,GAC3C,aAAa,MAAM,KAClB,MAAM,GAAG,SAQX,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,GAC/B,gBAAgB,MAAM,EACtB,eAAe,MAAM,KACpB,MAwDF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,oBAAoB,MAAM,KACzB,OAAO,CAAC,SAAS,GAAG,SAAS,CAQ/B,CAAC"}
@@ -7,7 +7,7 @@ import { existsSync } from "node:fs";
7
7
  import fs from "node:fs/promises";
8
8
  import path from "node:path";
9
9
  import fg from "fast-glob";
10
- import { tsImport } from "tsx/esm/api";
10
+ import { configCacheKey, importConfigModule } from "./configModuleLoader.js";
11
11
  import { formatIocConfigIssues, iocConfigSchema } from "./iocConfigSchema.js";
12
12
  import { findPackageIdentifierCollisions, formatPackageIdentifierCollisionError, } from "./packageIdentifier.js";
13
13
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -135,14 +135,49 @@ const resolveConfigFromModule = (mod) => {
135
135
  }
136
136
  return current;
137
137
  };
138
+ /**
139
+ * Validated configs already loaded in this process, keyed by {@link configCacheKey}.
140
+ *
141
+ * `importConfigModule` already makes the TRANSPILE free on a repeat load; this makes the
142
+ * VALIDATION free too — the zod parse, the `package.json` read for self-reference detection, the
143
+ * composed-identifier collision scan, and the advisory warnings, which a reader should see once per
144
+ * config and not once per package that asks about it.
145
+ *
146
+ * Keyed on path AND content stamp, the same identity the module cache uses, so a config rewritten
147
+ * in place is revalidated rather than answered from a stale entry.
148
+ *
149
+ * A single `ioc validate` asks for the same config from three directions — discovery, the freshness
150
+ * slice loop, and the composition context. Reusing the loaded object there is not an optimization
151
+ * bolted on top; it is the invariant that makes those three agree on what the config SAYS.
152
+ */
153
+ const validatedConfigCache = new Map();
138
154
  export const loadIocConfig = async (absoluteConfigPath) => {
139
- // Transpile the `.ts` config in-process via tsx's scoped loader rather than delegating to a
140
- // bare `import()`, which fails on Node versions without native type stripping. `tsImport`
141
- // patches the loader only for this import and restores it after, so the rest of the CLI is
142
- // untouched.
143
- const mod = (await tsImport(absoluteConfigPath, import.meta.url));
144
- const raw = resolveConfigFromModule(mod);
145
- return validateIocConfig(raw, absoluteConfigPath);
155
+ const key = configCacheKey(absoluteConfigPath);
156
+ const cached = validatedConfigCache.get(key);
157
+ if (cached !== undefined) {
158
+ return cached;
159
+ }
160
+ // Transpiling the `.ts` config in-process is delegated to `configModuleLoader`, which owns the
161
+ // single per-process tsx registration. A bare `import()` is not an option: it fails on Node
162
+ // versions without native type stripping.
163
+ const loading = (async () => {
164
+ const mod = await importConfigModule(absoluteConfigPath);
165
+ const raw = resolveConfigFromModule(mod);
166
+ return validateIocConfig(raw, absoluteConfigPath);
167
+ })().catch((error) => {
168
+ // A config that failed to load or validate is retryable once its author fixes it; a remembered
169
+ // rejection would outlive the fix.
170
+ if (validatedConfigCache.get(key) === loading) {
171
+ validatedConfigCache.delete(key);
172
+ }
173
+ throw error;
174
+ });
175
+ validatedConfigCache.set(key, loading);
176
+ return loading;
177
+ };
178
+ /** Drops every cached config. For tests that rebuild a fixture config under one process. */
179
+ export const clearIocConfigCache = () => {
180
+ validatedConfigCache.clear();
146
181
  };
147
182
  const CONFIG_RELATIVE_SEARCH_PATHS = ["src/ioc.config.ts", "ioc.config.ts"];
148
183
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"loadIocConfig.js","sourceRoot":"","sources":["../../src/config/loadIocConfig.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadIocConfig.js","sourceRoot":"","sources":["../../src/config/loadIocConfig.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ioc-manifest",
3
- "version": "4.0.0",
3
+ "version": "4.0.1",
4
4
  "description": "Build-time factory discovery and codegen: generates a typed Awilix (PROXY) registration manifest from TypeScript sources with ioc.config as the single policy surface.",
5
5
  "license": "MIT",
6
6
  "repository": {