@goodie-ts/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +21 -0
  2. package/dist/application-context.d.ts +69 -0
  3. package/dist/application-context.d.ts.map +1 -0
  4. package/dist/application-context.js +315 -0
  5. package/dist/application-context.js.map +1 -0
  6. package/dist/bean-definition.d.ts +25 -0
  7. package/dist/bean-definition.d.ts.map +1 -0
  8. package/dist/bean-definition.js +2 -0
  9. package/dist/bean-definition.js.map +1 -0
  10. package/dist/bean-post-processor.d.ts +12 -0
  11. package/dist/bean-post-processor.d.ts.map +1 -0
  12. package/dist/bean-post-processor.js +2 -0
  13. package/dist/bean-post-processor.js.map +1 -0
  14. package/dist/errors.d.ts +30 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +56 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/goodie.d.ts +29 -0
  19. package/dist/goodie.d.ts.map +1 -0
  20. package/dist/goodie.js +34 -0
  21. package/dist/goodie.js.map +1 -0
  22. package/dist/index.d.ts +10 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/injection-token.d.ts +17 -0
  27. package/dist/injection-token.d.ts.map +1 -0
  28. package/dist/injection-token.js +19 -0
  29. package/dist/injection-token.js.map +1 -0
  30. package/dist/polyfills.d.ts +1 -0
  31. package/dist/polyfills.d.ts.map +1 -0
  32. package/dist/polyfills.js +4 -0
  33. package/dist/polyfills.js.map +1 -0
  34. package/dist/topo-sort.d.ts +10 -0
  35. package/dist/topo-sort.d.ts.map +1 -0
  36. package/dist/topo-sort.js +59 -0
  37. package/dist/topo-sort.js.map +1 -0
  38. package/dist/types.d.ts +5 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +30 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 GOOD Code ApS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,69 @@
1
+ import type { BeanDefinition } from './bean-definition.js';
2
+ import type { InjectionToken } from './injection-token.js';
3
+ import type { Constructor } from './types.js';
4
+ /**
5
+ * The runtime dependency injection container.
6
+ *
7
+ * Created from an array of BeanDefinitions (produced by the compile-time
8
+ * transformer or built manually). Manages scoping, lazy/eager instantiation,
9
+ * async deduplication, and BeanPostProcessor hooks.
10
+ */
11
+ export declare class ApplicationContext {
12
+ private readonly sortedDefs;
13
+ private readonly defsByToken;
14
+ private readonly primaryDef;
15
+ private readonly singletonCache;
16
+ private readonly asyncInFlight;
17
+ private readonly postProcessors;
18
+ private closed;
19
+ private constructor();
20
+ /**
21
+ * Build and initialize an ApplicationContext.
22
+ *
23
+ * 1. Topologically sorts definitions
24
+ * 2. Validates required dependencies exist
25
+ * 3. Discovers and initializes BeanPostProcessors
26
+ * 4. Eagerly resolves beans marked with `eager: true`
27
+ */
28
+ static create(definitions: BeanDefinition[]): Promise<ApplicationContext>;
29
+ /**
30
+ * Synchronously get a bean. Throws if:
31
+ * - The bean is async and hasn't been resolved yet
32
+ * - The token has no provider
33
+ * - The context is closed
34
+ */
35
+ get<T>(token: Constructor<T> | InjectionToken<T>): T;
36
+ /**
37
+ * Asynchronously get a bean. Always works, even for async factories.
38
+ */
39
+ getAsync<T>(token: Constructor<T> | InjectionToken<T>): Promise<T>;
40
+ /**
41
+ * Get all beans registered under the given token.
42
+ */
43
+ getAll<T>(token: Constructor<T> | InjectionToken<T>): T[];
44
+ /**
45
+ * Returns a shallow defensive copy of the bean definitions used to build this context.
46
+ */
47
+ getDefinitions(): readonly BeanDefinition[];
48
+ /**
49
+ * Close the context. Calls `@PreDestroy` methods on instantiated singletons
50
+ * in reverse-topological order (dependents destroyed before dependencies),
51
+ * then clears caches and rejects further calls.
52
+ */
53
+ close(): Promise<void>;
54
+ private assertOpen;
55
+ private validateDependencies;
56
+ private initPostProcessors;
57
+ private initEagerBeans;
58
+ private resolveDepsSync;
59
+ private resolveDepsAsync;
60
+ private resolveSync;
61
+ private resolveAsync;
62
+ /**
63
+ * @param skipPostProcessors - true when resolving post-processors themselves
64
+ */
65
+ private resolveAsyncRaw;
66
+ private applyPostProcessorsSync;
67
+ private applyPostProcessorsAsync;
68
+ }
69
+ //# sourceMappingURL=application-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-context.d.ts","sourceRoot":"","sources":["../src/application-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,sBAAsB,CAAC;AAOvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C;;;;;;GAMG;AACH,qBAAa,kBAAkB;IAQT,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO;IAaP;;;;;;;OAOG;WACU,MAAM,CACjB,WAAW,EAAE,cAAc,EAAE,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAS9B;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC;IAwBpD;;OAEG;IACG,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiCxE;;OAEG;IACH,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;IAiBzD;;OAEG;IACH,cAAc,IAAI,SAAS,cAAc,EAAE;IAI3C;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,oBAAoB;YAad,kBAAkB;YASlB,cAAc;IAQ5B,OAAO,CAAC,eAAe;YAeT,gBAAgB;IAuB9B,OAAO,CAAC,WAAW;YAiBL,YAAY;IAI1B;;OAEG;YACW,eAAe;IAuB7B,OAAO,CAAC,uBAAuB;YAuBjB,wBAAwB;CAiBvC"}
@@ -0,0 +1,315 @@
1
+ import { AsyncBeanNotReadyError, ContextClosedError, MissingDependencyError, } from './errors.js';
2
+ import { topoSort } from './topo-sort.js';
3
+ const UNRESOLVED = Symbol('UNRESOLVED');
4
+ /**
5
+ * The runtime dependency injection container.
6
+ *
7
+ * Created from an array of BeanDefinitions (produced by the compile-time
8
+ * transformer or built manually). Manages scoping, lazy/eager instantiation,
9
+ * async deduplication, and BeanPostProcessor hooks.
10
+ */
11
+ export class ApplicationContext {
12
+ sortedDefs;
13
+ defsByToken = new Map();
14
+ primaryDef = new Map();
15
+ singletonCache = new Map();
16
+ asyncInFlight = new Map();
17
+ postProcessors = [];
18
+ closed = false;
19
+ constructor(sortedDefs) {
20
+ this.sortedDefs = sortedDefs;
21
+ for (const def of sortedDefs) {
22
+ const existing = this.defsByToken.get(def.token);
23
+ if (existing) {
24
+ existing.push(def);
25
+ }
26
+ else {
27
+ this.defsByToken.set(def.token, [def]);
28
+ }
29
+ // Last definition wins as primary (matches typical DI override semantics)
30
+ this.primaryDef.set(def.token, def);
31
+ }
32
+ }
33
+ /**
34
+ * Build and initialize an ApplicationContext.
35
+ *
36
+ * 1. Topologically sorts definitions
37
+ * 2. Validates required dependencies exist
38
+ * 3. Discovers and initializes BeanPostProcessors
39
+ * 4. Eagerly resolves beans marked with `eager: true`
40
+ */
41
+ static async create(definitions) {
42
+ const sorted = topoSort(definitions);
43
+ const ctx = new ApplicationContext(sorted);
44
+ ctx.validateDependencies();
45
+ await ctx.initPostProcessors();
46
+ await ctx.initEagerBeans();
47
+ return ctx;
48
+ }
49
+ /**
50
+ * Synchronously get a bean. Throws if:
51
+ * - The bean is async and hasn't been resolved yet
52
+ * - The token has no provider
53
+ * - The context is closed
54
+ */
55
+ get(token) {
56
+ this.assertOpen();
57
+ const def = this.primaryDef.get(token);
58
+ if (!def) {
59
+ throw new MissingDependencyError(tokenName(token));
60
+ }
61
+ if (def.scope === 'singleton') {
62
+ const cached = this.singletonCache.get(token);
63
+ if (cached !== undefined) {
64
+ return cached;
65
+ }
66
+ if (cached === UNRESOLVED || this.asyncInFlight.has(token)) {
67
+ throw new AsyncBeanNotReadyError(tokenName(token));
68
+ }
69
+ // Attempt synchronous resolution
70
+ const instance = this.resolveSync(def);
71
+ return instance;
72
+ }
73
+ // Prototype: new instance every time
74
+ return this.resolveSync(def);
75
+ }
76
+ /**
77
+ * Asynchronously get a bean. Always works, even for async factories.
78
+ */
79
+ async getAsync(token) {
80
+ this.assertOpen();
81
+ const def = this.primaryDef.get(token);
82
+ if (!def) {
83
+ throw new MissingDependencyError(tokenName(token));
84
+ }
85
+ if (def.scope === 'singleton') {
86
+ const cached = this.singletonCache.get(token);
87
+ if (cached !== undefined && cached !== UNRESOLVED) {
88
+ return cached;
89
+ }
90
+ // Deduplicate concurrent async resolution
91
+ const inFlight = this.asyncInFlight.get(token);
92
+ if (inFlight) {
93
+ return inFlight;
94
+ }
95
+ const promise = this.resolveAsync(def);
96
+ this.asyncInFlight.set(token, promise);
97
+ try {
98
+ const instance = await promise;
99
+ return instance;
100
+ }
101
+ finally {
102
+ this.asyncInFlight.delete(token);
103
+ }
104
+ }
105
+ // Prototype
106
+ return this.resolveAsync(def);
107
+ }
108
+ /**
109
+ * Get all beans registered under the given token.
110
+ */
111
+ getAll(token) {
112
+ this.assertOpen();
113
+ const defs = this.defsByToken.get(token);
114
+ if (!defs || defs.length === 0) {
115
+ return [];
116
+ }
117
+ return defs.map((def) => {
118
+ if (def.scope === 'singleton') {
119
+ const cached = this.singletonCache.get(def.token);
120
+ if (cached !== undefined && cached !== UNRESOLVED) {
121
+ return cached;
122
+ }
123
+ }
124
+ return this.resolveSync(def);
125
+ });
126
+ }
127
+ /**
128
+ * Returns a shallow defensive copy of the bean definitions used to build this context.
129
+ */
130
+ getDefinitions() {
131
+ return [...this.sortedDefs];
132
+ }
133
+ /**
134
+ * Close the context. Calls `@PreDestroy` methods on instantiated singletons
135
+ * in reverse-topological order (dependents destroyed before dependencies),
136
+ * then clears caches and rejects further calls.
137
+ */
138
+ async close() {
139
+ this.closed = true;
140
+ const errors = [];
141
+ for (const def of [...this.sortedDefs].reverse()) {
142
+ if (def.scope !== 'singleton')
143
+ continue;
144
+ const methods = def.metadata.preDestroyMethods;
145
+ if (!methods || methods.length === 0)
146
+ continue;
147
+ const instance = this.singletonCache.get(def.token);
148
+ if (instance === undefined || instance === UNRESOLVED)
149
+ continue;
150
+ for (const methodName of methods) {
151
+ try {
152
+ await instance[methodName]();
153
+ }
154
+ catch (err) {
155
+ errors.push(err instanceof Error ? err : new Error(String(err)));
156
+ }
157
+ }
158
+ }
159
+ this.singletonCache.clear();
160
+ this.asyncInFlight.clear();
161
+ if (errors.length === 1)
162
+ throw errors[0];
163
+ if (errors.length > 1)
164
+ throw new AggregateError(errors, 'Errors during bean destruction');
165
+ }
166
+ assertOpen() {
167
+ if (this.closed) {
168
+ throw new ContextClosedError();
169
+ }
170
+ }
171
+ validateDependencies() {
172
+ for (const def of this.sortedDefs) {
173
+ for (const dep of def.dependencies) {
174
+ if (!dep.optional && !this.primaryDef.has(dep.token)) {
175
+ throw new MissingDependencyError(tokenName(dep.token), tokenName(def.token));
176
+ }
177
+ }
178
+ }
179
+ }
180
+ async initPostProcessors() {
181
+ for (const def of this.sortedDefs) {
182
+ if (def.metadata.isBeanPostProcessor) {
183
+ const processor = await this.resolveAsyncRaw(def, true);
184
+ this.postProcessors.push(processor);
185
+ }
186
+ }
187
+ }
188
+ async initEagerBeans() {
189
+ for (const def of this.sortedDefs) {
190
+ if (def.eager && !def.metadata.isBeanPostProcessor) {
191
+ await this.resolveAsyncRaw(def, false);
192
+ }
193
+ }
194
+ }
195
+ resolveDepsSync(deps) {
196
+ return deps.map((dep) => {
197
+ const depDef = this.primaryDef.get(dep.token);
198
+ if (!depDef) {
199
+ if (dep.optional)
200
+ return undefined;
201
+ throw new MissingDependencyError(tokenName(dep.token));
202
+ }
203
+ if (depDef.scope === 'singleton') {
204
+ const cached = this.singletonCache.get(dep.token);
205
+ if (cached !== undefined && cached !== UNRESOLVED)
206
+ return cached;
207
+ }
208
+ return this.resolveSync(depDef);
209
+ });
210
+ }
211
+ async resolveDepsAsync(deps) {
212
+ const resolved = [];
213
+ for (const dep of deps) {
214
+ const depDef = this.primaryDef.get(dep.token);
215
+ if (!depDef) {
216
+ if (dep.optional) {
217
+ resolved.push(undefined);
218
+ continue;
219
+ }
220
+ throw new MissingDependencyError(tokenName(dep.token));
221
+ }
222
+ if (depDef.scope === 'singleton') {
223
+ const cached = this.singletonCache.get(dep.token);
224
+ if (cached !== undefined && cached !== UNRESOLVED) {
225
+ resolved.push(cached);
226
+ continue;
227
+ }
228
+ }
229
+ resolved.push(await this.resolveAsyncRaw(depDef, false));
230
+ }
231
+ return resolved;
232
+ }
233
+ resolveSync(def) {
234
+ const deps = this.resolveDepsSync(def.dependencies);
235
+ const raw = def.factory(...deps);
236
+ if (raw instanceof Promise) {
237
+ // Mark as unresolved so sync get() knows to throw
238
+ if (def.scope === 'singleton') {
239
+ this.singletonCache.set(def.token, UNRESOLVED);
240
+ }
241
+ throw new AsyncBeanNotReadyError(tokenName(def.token));
242
+ }
243
+ const instance = this.applyPostProcessorsSync(raw, def);
244
+ if (def.scope === 'singleton') {
245
+ this.singletonCache.set(def.token, instance);
246
+ }
247
+ return instance;
248
+ }
249
+ async resolveAsync(def) {
250
+ return this.resolveAsyncRaw(def, false);
251
+ }
252
+ /**
253
+ * @param skipPostProcessors - true when resolving post-processors themselves
254
+ */
255
+ async resolveAsyncRaw(def, skipPostProcessors) {
256
+ // Check cache again (may have been resolved while awaiting)
257
+ if (def.scope === 'singleton') {
258
+ const cached = this.singletonCache.get(def.token);
259
+ if (cached !== undefined && cached !== UNRESOLVED)
260
+ return cached;
261
+ }
262
+ const deps = await this.resolveDepsAsync(def.dependencies);
263
+ let instance = await def.factory(...deps);
264
+ if (!skipPostProcessors) {
265
+ instance = await this.applyPostProcessorsAsync(instance, def);
266
+ }
267
+ if (def.scope === 'singleton') {
268
+ this.singletonCache.set(def.token, instance);
269
+ }
270
+ return instance;
271
+ }
272
+ applyPostProcessorsSync(bean, def) {
273
+ let current = bean;
274
+ for (const pp of this.postProcessors) {
275
+ if (pp.beforeInit) {
276
+ const result = pp.beforeInit(current, def);
277
+ if (result instanceof Promise) {
278
+ throw new AsyncBeanNotReadyError(tokenName(def.token));
279
+ }
280
+ current = result;
281
+ }
282
+ }
283
+ for (const pp of this.postProcessors) {
284
+ if (pp.afterInit) {
285
+ const result = pp.afterInit(current, def);
286
+ if (result instanceof Promise) {
287
+ throw new AsyncBeanNotReadyError(tokenName(def.token));
288
+ }
289
+ current = result;
290
+ }
291
+ }
292
+ return current;
293
+ }
294
+ async applyPostProcessorsAsync(bean, def) {
295
+ let current = bean;
296
+ for (const pp of this.postProcessors) {
297
+ if (pp.beforeInit) {
298
+ current = await pp.beforeInit(current, def);
299
+ }
300
+ }
301
+ for (const pp of this.postProcessors) {
302
+ if (pp.afterInit) {
303
+ current = await pp.afterInit(current, def);
304
+ }
305
+ }
306
+ return current;
307
+ }
308
+ }
309
+ function tokenName(token) {
310
+ if (typeof token === 'function') {
311
+ return token.name || 'Anonymous';
312
+ }
313
+ return token.description;
314
+ }
315
+ //# sourceMappingURL=application-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-context.js","sourceRoot":"","sources":["../src/application-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { InjectionToken } from './injection-token.js';
2
+ import type { Constructor, Scope } from './types.js';
3
+ /** A single dependency of a bean. */
4
+ export interface Dependency {
5
+ /** The token to resolve. */
6
+ token: InjectionToken<unknown> | Constructor;
7
+ /** If true, resolves to `undefined` when no provider is registered. */
8
+ optional: boolean;
9
+ }
10
+ /** Full metadata describing how to create and manage a bean. */
11
+ export interface BeanDefinition<T = unknown> {
12
+ /** The token this bean is registered under. */
13
+ token: InjectionToken<T> | Constructor<T>;
14
+ /** Singleton (cached) or prototype (new instance per get). */
15
+ scope: Scope;
16
+ /** Ordered list of dependencies the factory expects. */
17
+ dependencies: Dependency[];
18
+ /** Creates the bean instance, receiving resolved dependencies in order. */
19
+ factory: (...deps: unknown[]) => T | Promise<T>;
20
+ /** Whether to instantiate eagerly during context creation. */
21
+ eager: boolean;
22
+ /** Arbitrary metadata stashed by decorators — extension libraries use this. */
23
+ metadata: Record<string, unknown>;
24
+ }
25
+ //# sourceMappingURL=bean-definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bean-definition.d.ts","sourceRoot":"","sources":["../src/bean-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAErD,qCAAqC;AACrC,MAAM,WAAW,UAAU;IACzB,4BAA4B;IAC5B,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;IAC7C,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,gEAAgE;AAChE,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,+CAA+C;IAC/C,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,EAAE,KAAK,CAAC;IACb,wDAAwD;IACxD,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,2EAA2E;IAC3E,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChD,8DAA8D;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bean-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bean-definition.js","sourceRoot":"","sources":["../src/bean-definition.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { BeanDefinition } from './bean-definition.js';
2
+ /**
3
+ * Hook called by ApplicationContext after every bean is created.
4
+ * Extension libraries (AOP, validation, caching, etc.) implement this.
5
+ */
6
+ export interface BeanPostProcessor {
7
+ /** Called before init. Can return a replacement instance. */
8
+ beforeInit?<T>(bean: T, definition: BeanDefinition<T>): T | Promise<T>;
9
+ /** Called after init. Can return a replacement instance. */
10
+ afterInit?<T>(bean: T, definition: BeanDefinition<T>): T | Promise<T>;
11
+ }
12
+ //# sourceMappingURL=bean-post-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bean-post-processor.d.ts","sourceRoot":"","sources":["../src/bean-post-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvE,4DAA4D;IAC5D,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACvE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bean-post-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bean-post-processor.js","sourceRoot":"","sources":["../src/bean-post-processor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /** Base error for all DI-related failures. */
2
+ export declare class DIError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Thrown when a required dependency has no registered provider. */
6
+ export declare class MissingDependencyError extends DIError {
7
+ readonly tokenDescription: string;
8
+ readonly requiredBy?: string | undefined;
9
+ constructor(tokenDescription: string, requiredBy?: string | undefined);
10
+ }
11
+ /** Thrown when a circular dependency is detected during topological sort. */
12
+ export declare class CircularDependencyError extends DIError {
13
+ readonly cyclePath: string[];
14
+ constructor(cyclePath: string[]);
15
+ }
16
+ /** Thrown when `get()` is called for an async bean that hasn't been resolved yet. */
17
+ export declare class AsyncBeanNotReadyError extends DIError {
18
+ readonly tokenDescription: string;
19
+ constructor(tokenDescription: string);
20
+ }
21
+ /** Thrown when trying to use a closed ApplicationContext. */
22
+ export declare class ContextClosedError extends DIError {
23
+ constructor();
24
+ }
25
+ /** Thrown when overriding a bean whose token doesn't exist in the definitions. */
26
+ export declare class OverrideError extends DIError {
27
+ readonly tokenDescription: string;
28
+ constructor(tokenDescription: string);
29
+ }
30
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,qBAAa,OAAQ,SAAQ,KAAK;gBACpB,OAAO,EAAE,MAAM;CAI5B;AAED,oEAAoE;AACpE,qBAAa,sBAAuB,SAAQ,OAAO;IAE/C,QAAQ,CAAC,gBAAgB,EAAE,MAAM;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM;gBADnB,gBAAgB,EAAE,MAAM,EACxB,UAAU,CAAC,EAAE,MAAM,YAAA;CAQ/B;AAED,6EAA6E;AAC7E,qBAAa,uBAAwB,SAAQ,OAAO;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE;gBAAnB,SAAS,EAAE,MAAM,EAAE;CAIzC;AAED,qFAAqF;AACrF,qBAAa,sBAAuB,SAAQ,OAAO;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM;gBAAxB,gBAAgB,EAAE,MAAM;CAM9C;AAED,6DAA6D;AAC7D,qBAAa,kBAAmB,SAAQ,OAAO;;CAK9C;AAED,kFAAkF;AAClF,qBAAa,aAAc,SAAQ,OAAO;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM;gBAAxB,gBAAgB,EAAE,MAAM;CAM9C"}
package/dist/errors.js ADDED
@@ -0,0 +1,56 @@
1
+ /** Base error for all DI-related failures. */
2
+ export class DIError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'DIError';
6
+ }
7
+ }
8
+ /** Thrown when a required dependency has no registered provider. */
9
+ export class MissingDependencyError extends DIError {
10
+ tokenDescription;
11
+ requiredBy;
12
+ constructor(tokenDescription, requiredBy) {
13
+ const msg = requiredBy
14
+ ? `No provider registered for ${tokenDescription} (required by ${requiredBy})`
15
+ : `No provider registered for ${tokenDescription}`;
16
+ super(msg);
17
+ this.tokenDescription = tokenDescription;
18
+ this.requiredBy = requiredBy;
19
+ this.name = 'MissingDependencyError';
20
+ }
21
+ }
22
+ /** Thrown when a circular dependency is detected during topological sort. */
23
+ export class CircularDependencyError extends DIError {
24
+ cyclePath;
25
+ constructor(cyclePath) {
26
+ super(`Circular dependency detected: ${cyclePath.join(' → ')}`);
27
+ this.cyclePath = cyclePath;
28
+ this.name = 'CircularDependencyError';
29
+ }
30
+ }
31
+ /** Thrown when `get()` is called for an async bean that hasn't been resolved yet. */
32
+ export class AsyncBeanNotReadyError extends DIError {
33
+ tokenDescription;
34
+ constructor(tokenDescription) {
35
+ super(`Bean ${tokenDescription} is async and has not been resolved yet. Use getAsync() instead.`);
36
+ this.tokenDescription = tokenDescription;
37
+ this.name = 'AsyncBeanNotReadyError';
38
+ }
39
+ }
40
+ /** Thrown when trying to use a closed ApplicationContext. */
41
+ export class ContextClosedError extends DIError {
42
+ constructor() {
43
+ super('ApplicationContext has been closed');
44
+ this.name = 'ContextClosedError';
45
+ }
46
+ }
47
+ /** Thrown when overriding a bean whose token doesn't exist in the definitions. */
48
+ export class OverrideError extends DIError {
49
+ tokenDescription;
50
+ constructor(tokenDescription) {
51
+ super(`Cannot override ${tokenDescription}: no bean with this token exists in the definitions`);
52
+ this.tokenDescription = tokenDescription;
53
+ this.name = 'OverrideError';
54
+ }
55
+ }
56
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAChC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,OAAO,sBAAuB,SAAQ,OAAO;IAEtC;IACA;IAFX,YACW,gBAAwB,EACxB,UAAmB;QAE5B,MAAM,GAAG,GAAG,UAAU;YACpB,CAAC,CAAC,8BAA8B,gBAAgB,iBAAiB,UAAU,GAAG;YAC9E,CAAC,CAAC,8BAA8B,gBAAgB,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,CAAC,CAAC;QANF,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,eAAU,GAAV,UAAU,CAAS;QAM5B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,uBAAwB,SAAQ,OAAO;IAC7B;IAArB,YAAqB,SAAmB;QACtC,KAAK,CAAC,iCAAiC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAD7C,cAAS,GAAT,SAAS,CAAU;QAEtC,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,qFAAqF;AACrF,MAAM,OAAO,sBAAuB,SAAQ,OAAO;IAC5B;IAArB,YAAqB,gBAAwB;QAC3C,KAAK,CACH,QAAQ,gBAAgB,kEAAkE,CAC3F,CAAC;QAHiB,qBAAgB,GAAhB,gBAAgB,CAAQ;QAI3C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,kBAAmB,SAAQ,OAAO;IAC7C;QACE,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,OAAO,aAAc,SAAQ,OAAO;IACnB;IAArB,YAAqB,gBAAwB;QAC3C,KAAK,CACH,mBAAmB,gBAAgB,qDAAqD,CACzF,CAAC;QAHiB,qBAAgB,GAAhB,gBAAgB,CAAQ;QAI3C,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ import { ApplicationContext } from './application-context.js';
2
+ import type { BeanDefinition } from './bean-definition.js';
3
+ /**
4
+ * Fluent builder for bootstrapping an ApplicationContext.
5
+ *
6
+ * Obtained via `Goodie.build(definitions)`. Call `.start()` to create
7
+ * and initialize the context.
8
+ */
9
+ export declare class GoodieBuilder {
10
+ private readonly definitions;
11
+ constructor(definitions: BeanDefinition[]);
12
+ /** Build and start the ApplicationContext. */
13
+ start(): Promise<ApplicationContext>;
14
+ }
15
+ /**
16
+ * Entry point for the Goodie framework.
17
+ *
18
+ * Usage (in generated code):
19
+ * ```ts
20
+ * export const app = Goodie.build(definitions)
21
+ * const ctx = await app.start()
22
+ * ```
23
+ */
24
+ export declare class Goodie {
25
+ private constructor();
26
+ /** Create a builder pre-loaded with the given bean definitions. */
27
+ static build(definitions: BeanDefinition[]): GoodieBuilder;
28
+ }
29
+ //# sourceMappingURL=goodie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goodie.d.ts","sourceRoot":"","sources":["../src/goodie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D;;;;;GAKG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,cAAc,EAAE;IAE1D,8CAA8C;IACxC,KAAK,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAG3C;AAED;;;;;;;;GAQG;AACH,qBAAa,MAAM;IACjB,OAAO;IAEP,mEAAmE;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,aAAa;CAG3D"}
package/dist/goodie.js ADDED
@@ -0,0 +1,34 @@
1
+ import { ApplicationContext } from './application-context.js';
2
+ /**
3
+ * Fluent builder for bootstrapping an ApplicationContext.
4
+ *
5
+ * Obtained via `Goodie.build(definitions)`. Call `.start()` to create
6
+ * and initialize the context.
7
+ */
8
+ export class GoodieBuilder {
9
+ definitions;
10
+ constructor(definitions) {
11
+ this.definitions = definitions;
12
+ }
13
+ /** Build and start the ApplicationContext. */
14
+ async start() {
15
+ return ApplicationContext.create(this.definitions);
16
+ }
17
+ }
18
+ /**
19
+ * Entry point for the Goodie framework.
20
+ *
21
+ * Usage (in generated code):
22
+ * ```ts
23
+ * export const app = Goodie.build(definitions)
24
+ * const ctx = await app.start()
25
+ * ```
26
+ */
27
+ export class Goodie {
28
+ constructor() { }
29
+ /** Create a builder pre-loaded with the given bean definitions. */
30
+ static build(definitions) {
31
+ return new GoodieBuilder(definitions);
32
+ }
33
+ }
34
+ //# sourceMappingURL=goodie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goodie.js","sourceRoot":"","sources":["../src/goodie.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,WAA6B;QAA7B,gBAAW,GAAX,WAAW,CAAkB;IAAG,CAAC;IAE9D,8CAA8C;IAC9C,KAAK,CAAC,KAAK;QACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;CACF;AAED;;;;;;;;GAQG;AACH,MAAM,OAAO,MAAM;IACjB,gBAAuB,CAAC;IAExB,mEAAmE;IACnE,MAAM,CAAC,KAAK,CAAC,WAA6B;QACxC,OAAO,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import './polyfills.js';
2
+ export { ApplicationContext } from './application-context.js';
3
+ export type { BeanDefinition, Dependency } from './bean-definition.js';
4
+ export type { BeanPostProcessor } from './bean-post-processor.js';
5
+ export { AsyncBeanNotReadyError, CircularDependencyError, ContextClosedError, DIError, MissingDependencyError, OverrideError, } from './errors.js';
6
+ export { Goodie, GoodieBuilder } from './goodie.js';
7
+ export { InjectionToken } from './injection-token.js';
8
+ export { topoSort } from './topo-sort.js';
9
+ export type { Constructor, Scope } from './types.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ import './polyfills.js';
2
+ export { ApplicationContext } from './application-context.js';
3
+ export { AsyncBeanNotReadyError, CircularDependencyError, ContextClosedError, DIError, MissingDependencyError, OverrideError, } from './errors.js';
4
+ export { Goodie, GoodieBuilder } from './goodie.js';
5
+ export { InjectionToken } from './injection-token.js';
6
+ export { topoSort } from './topo-sort.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,OAAO,EACP,sBAAsB,EACtB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * A typed token used to look up beans in the container.
3
+ *
4
+ * Use this for interfaces, primitives, or any type that doesn't have
5
+ * a class constructor at runtime.
6
+ *
7
+ * @example
8
+ * const DB_URL = new InjectionToken<string>('DB_URL')
9
+ */
10
+ export declare class InjectionToken<T> {
11
+ readonly description: string;
12
+ /** Phantom field to carry the type parameter through the type system. */
13
+ readonly __type: T;
14
+ constructor(description: string);
15
+ toString(): string;
16
+ }
17
+ //# sourceMappingURL=injection-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-token.d.ts","sourceRoot":"","sources":["../src/injection-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,cAAc,CAAC,CAAC;IAIf,QAAQ,CAAC,WAAW,EAAE,MAAM;IAHxC,yEAAyE;IACzE,SAAiB,MAAM,EAAE,CAAC,CAAC;gBAEN,WAAW,EAAE,MAAM;IAExC,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * A typed token used to look up beans in the container.
3
+ *
4
+ * Use this for interfaces, primitives, or any type that doesn't have
5
+ * a class constructor at runtime.
6
+ *
7
+ * @example
8
+ * const DB_URL = new InjectionToken<string>('DB_URL')
9
+ */
10
+ export class InjectionToken {
11
+ description;
12
+ constructor(description) {
13
+ this.description = description;
14
+ }
15
+ toString() {
16
+ return `InjectionToken(${this.description})`;
17
+ }
18
+ }
19
+ //# sourceMappingURL=injection-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injection-token.js","sourceRoot":"","sources":["../src/injection-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IAIJ;IAArB,YAAqB,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAE5C,QAAQ;QACN,OAAO,kBAAkB,IAAI,CAAC,WAAW,GAAG,CAAC;IAC/C,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=polyfills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfills.d.ts","sourceRoot":"","sources":["../src/polyfills.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // Polyfill Symbol.metadata if the runtime doesn't support it yet
3
+ Symbol.metadata ??= Symbol('Symbol.metadata');
4
+ //# sourceMappingURL=polyfills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfills.js","sourceRoot":"","sources":["../src/polyfills.ts"],"names":[],"mappings":";AAAA,iEAAiE;AAChE,MAAgC,CAAC,QAAQ,KAAK,MAAM,CAAC,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { BeanDefinition } from './bean-definition.js';
2
+ /**
3
+ * Topologically sorts bean definitions so that dependencies come before
4
+ * the beans that depend on them. Detects cycles and reports the full path.
5
+ *
6
+ * Optional dependencies are included in ordering when present but do not
7
+ * cause failures when missing.
8
+ */
9
+ export declare function topoSort(definitions: BeanDefinition[]): BeanDefinition[];
10
+ //# sourceMappingURL=topo-sort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topo-sort.d.ts","sourceRoot":"","sources":["../src/topo-sort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAO3D;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAqDxE"}
@@ -0,0 +1,59 @@
1
+ import { CircularDependencyError } from './errors.js';
2
+ /**
3
+ * Topologically sorts bean definitions so that dependencies come before
4
+ * the beans that depend on them. Detects cycles and reports the full path.
5
+ *
6
+ * Optional dependencies are included in ordering when present but do not
7
+ * cause failures when missing.
8
+ */
9
+ export function topoSort(definitions) {
10
+ const defByToken = new Map();
11
+ for (const def of definitions) {
12
+ defByToken.set(def.token, def);
13
+ }
14
+ const IN_STACK = 1;
15
+ const DONE = 2;
16
+ const state = new Map();
17
+ const sorted = [];
18
+ // Track the current DFS path for cycle reporting
19
+ const pathStack = [];
20
+ function visit(def) {
21
+ const token = def.token;
22
+ const s = state.get(token);
23
+ if (s === DONE)
24
+ return;
25
+ if (s === IN_STACK) {
26
+ // Extract cycle path from the stack
27
+ const cycleStart = pathStack.indexOf(token);
28
+ const cyclePath = pathStack.slice(cycleStart).map(tokenName);
29
+ cyclePath.push(tokenName(token));
30
+ throw new CircularDependencyError(cyclePath);
31
+ }
32
+ state.set(token, IN_STACK);
33
+ pathStack.push(token);
34
+ for (const dep of def.dependencies) {
35
+ const depDef = defByToken.get(dep.token);
36
+ if (depDef) {
37
+ visit(depDef);
38
+ }
39
+ // If the dep is not found and it's optional, skip silently.
40
+ // Missing required deps are validated separately by ApplicationContext.
41
+ }
42
+ pathStack.pop();
43
+ state.set(token, DONE);
44
+ sorted.push(def);
45
+ }
46
+ for (const def of definitions) {
47
+ if (!state.has(def.token)) {
48
+ visit(def);
49
+ }
50
+ }
51
+ return sorted;
52
+ }
53
+ function tokenName(token) {
54
+ if (typeof token === 'function') {
55
+ return token.name || 'Anonymous';
56
+ }
57
+ return token.description;
58
+ }
59
+ //# sourceMappingURL=topo-sort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topo-sort.js","sourceRoot":"","sources":["../src/topo-sort.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAMtD;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,WAA6B;IACpD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,CAAC,CAAC;IAEf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACvC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,iDAAiD;IACjD,MAAM,SAAS,GAAY,EAAE,CAAC;IAE9B,SAAS,KAAK,CAAC,GAAmB;QAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3B,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnB,oCAAoC;YACpC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC7D,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;YACjC,MAAM,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,MAAM,CAAC,CAAC;YAChB,CAAC;YACD,4DAA4D;YAC5D,wEAAwE;QAC1E,CAAC;QAED,SAAS,CAAC,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAY;IAC7B,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC;IACnC,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** A newable class constructor. */
2
+ export type Constructor<T = unknown> = new (...args: any[]) => T;
3
+ /** Bean lifecycle scope. */
4
+ export type Scope = 'singleton' | 'prototype';
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAEjE,4BAA4B;AAC5B,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,WAAW,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@goodie-ts/core",
3
+ "version": "0.1.0",
4
+ "description": "Runtime dependency injection container for goodie-ts",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/GOOD-Code-ApS/goodie.git",
10
+ "directory": "packages/core"
11
+ },
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "clean": "rm -rf dist *.tsbuildinfo"
29
+ }
30
+ }