@stitchem/core 0.0.3

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 (68) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/LICENSE +21 -0
  3. package/README.md +815 -0
  4. package/dist/container/container.d.ts +79 -0
  5. package/dist/container/container.js +156 -0
  6. package/dist/container/module.map.d.ts +22 -0
  7. package/dist/container/module.map.js +40 -0
  8. package/dist/context/context.d.ts +181 -0
  9. package/dist/context/context.js +395 -0
  10. package/dist/context/scope.d.ts +30 -0
  11. package/dist/context/scope.js +42 -0
  12. package/dist/core/core.lifecycle.d.ts +41 -0
  13. package/dist/core/core.lifecycle.js +37 -0
  14. package/dist/core/core.lifetime.d.ts +21 -0
  15. package/dist/core/core.lifetime.js +22 -0
  16. package/dist/core/core.types.d.ts +2 -0
  17. package/dist/core/core.types.js +2 -0
  18. package/dist/core/core.utils.d.ts +8 -0
  19. package/dist/core/core.utils.js +13 -0
  20. package/dist/decorator/inject.decorator.d.ts +50 -0
  21. package/dist/decorator/inject.decorator.js +78 -0
  22. package/dist/decorator/injectable.decorator.d.ts +45 -0
  23. package/dist/decorator/injectable.decorator.js +46 -0
  24. package/dist/errors/core.error.d.ts +24 -0
  25. package/dist/errors/core.error.js +59 -0
  26. package/dist/errors/error.codes.d.ts +17 -0
  27. package/dist/errors/error.codes.js +21 -0
  28. package/dist/index.d.ts +25 -0
  29. package/dist/index.js +23 -0
  30. package/dist/injector/injector.d.ts +78 -0
  31. package/dist/injector/injector.js +295 -0
  32. package/dist/instance-wrapper/instance-wrapper.d.ts +61 -0
  33. package/dist/instance-wrapper/instance-wrapper.js +142 -0
  34. package/dist/instance-wrapper/instance-wrapper.types.d.ts +18 -0
  35. package/dist/instance-wrapper/instance-wrapper.types.js +2 -0
  36. package/dist/logger/console.logger.d.ts +52 -0
  37. package/dist/logger/console.logger.js +90 -0
  38. package/dist/logger/logger.token.d.ts +23 -0
  39. package/dist/logger/logger.token.js +23 -0
  40. package/dist/logger/logger.types.d.ts +38 -0
  41. package/dist/logger/logger.types.js +12 -0
  42. package/dist/module/module.d.ts +104 -0
  43. package/dist/module/module.decorator.d.ts +28 -0
  44. package/dist/module/module.decorator.js +42 -0
  45. package/dist/module/module.graph.d.ts +52 -0
  46. package/dist/module/module.graph.js +263 -0
  47. package/dist/module/module.js +181 -0
  48. package/dist/module/module.ref.d.ts +81 -0
  49. package/dist/module/module.ref.js +123 -0
  50. package/dist/module/module.types.d.ts +80 -0
  51. package/dist/module/module.types.js +10 -0
  52. package/dist/provider/provider.guards.d.ts +46 -0
  53. package/dist/provider/provider.guards.js +62 -0
  54. package/dist/provider/provider.interface.d.ts +39 -0
  55. package/dist/provider/provider.interface.js +2 -0
  56. package/dist/test/test.d.ts +22 -0
  57. package/dist/test/test.js +23 -0
  58. package/dist/test/test.module-builder.d.ts +136 -0
  59. package/dist/test/test.module-builder.js +377 -0
  60. package/dist/test/test.module.d.ts +71 -0
  61. package/dist/test/test.module.js +151 -0
  62. package/dist/token/lazy.token.d.ts +44 -0
  63. package/dist/token/lazy.token.js +42 -0
  64. package/dist/token/token.types.d.ts +8 -0
  65. package/dist/token/token.types.js +2 -0
  66. package/dist/token/token.utils.d.ts +9 -0
  67. package/dist/token/token.utils.js +19 -0
  68. package/package.json +62 -0
@@ -0,0 +1,78 @@
1
+ // WeakMap-based metadata storage for accessor-injected properties.
2
+ // TODO: Replace with `context.metadata[key]` once transpilers ship decorator metadata support.
3
+ // That change is internal-only — the public API stays identical.
4
+ const registry = new WeakMap();
5
+ // Pending tokens accumulated by @inject() accessor decorators during class definition.
6
+ // Flushed into `registry` by the class decorator (@injectable / @module).
7
+ // This is needed because TC39 accessor decorators execute before the class decorator,
8
+ // so the class constructor isn't available yet when @inject() runs.
9
+ let pendingTokens = [];
10
+ /**
11
+ * TC39 accessor decorator for property injection.
12
+ *
13
+ * Use this when you need to inject a dependency as a class property
14
+ * rather than through the constructor.
15
+ *
16
+ * Must be used on a class also decorated with @injectable() or @module().
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * @injectable()
21
+ * class OrderService {
22
+ * @inject(LOGGER) accessor logger!: ILogger;
23
+ * }
24
+ * ```
25
+ */
26
+ export function inject(token) {
27
+ return function (_target, context) {
28
+ pendingTokens.push({ name: context.name, token });
29
+ };
30
+ }
31
+ /**
32
+ * Flushes pending @inject() tokens accumulated during class definition
33
+ * into the registry, keyed by the given class constructor.
34
+ *
35
+ * Called by class decorators (@injectable, @module) which run after accessor decorators.
36
+ *
37
+ * @internal
38
+ */
39
+ export function flushPendingInjectTokens(target) {
40
+ if (pendingTokens.length === 0)
41
+ return;
42
+ let tokens = registry.get(target);
43
+ if (!tokens) {
44
+ tokens = new Map();
45
+ registry.set(target, tokens);
46
+ }
47
+ for (const { name, token } of pendingTokens) {
48
+ tokens.set(name, token);
49
+ }
50
+ pendingTokens = [];
51
+ }
52
+ /**
53
+ * Gets constructor injection tokens from a class's `static inject` array.
54
+ * These tokens are resolved in order and passed to the constructor.
55
+ *
56
+ * Returns an empty array if the class has no `static inject`.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * class UserService {
61
+ * static inject = [UserRepository, LOGGER] as const;
62
+ * constructor(readonly repo: UserRepository, readonly logger: ILogger) {}
63
+ * }
64
+ *
65
+ * getConstructorTokens(UserService); // [UserRepository, LOGGER]
66
+ * ```
67
+ */
68
+ export function getConstructorTokens(target) {
69
+ return target.inject ?? [];
70
+ }
71
+ /**
72
+ * Gets all accessor-injected property tokens for a class.
73
+ * Returns a Map of property name → injection token, or undefined if none.
74
+ */
75
+ export function getInjectTokens(target) {
76
+ return registry.get(target);
77
+ }
78
+ //# sourceMappingURL=inject.decorator.js.map
@@ -0,0 +1,45 @@
1
+ import type { constructor } from '../core/core.types.js';
2
+ import { Lifetime } from '../core/core.lifetime.js';
3
+ /**
4
+ * Options for the @injectable decorator.
5
+ */
6
+ export interface InjectableOptions {
7
+ /**
8
+ * The lifetime of the injectable.
9
+ * @default Lifetime.SINGLETON
10
+ */
11
+ lifetime?: Lifetime;
12
+ }
13
+ /**
14
+ * Metadata stored by @injectable decorator.
15
+ */
16
+ export interface InjectableMetadata {
17
+ lifetime: Lifetime;
18
+ }
19
+ /**
20
+ * Marks a class as injectable, allowing it to be managed by the DI container.
21
+ *
22
+ * Uses TC39 class decorators. No reflect-metadata required.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * @injectable()
27
+ * class UserService {
28
+ * static inject = [UserRepository, LOGGER];
29
+ * constructor(readonly userRepo: UserRepository, readonly logger: ILogger) {}
30
+ * }
31
+ *
32
+ * @injectable({ lifetime: Lifetime.TRANSIENT })
33
+ * class RequestHandler {}
34
+ * ```
35
+ */
36
+ export declare function injectable(options?: InjectableOptions): (target: constructor, _context: ClassDecoratorContext) => void;
37
+ /**
38
+ * Checks if a class is decorated with @injectable().
39
+ */
40
+ export declare function isInjectable(target: constructor): boolean;
41
+ /**
42
+ * Gets the injectable metadata from a class, or undefined if not decorated.
43
+ */
44
+ export declare function getInjectableMetadata(target: constructor): InjectableMetadata | undefined;
45
+ //# sourceMappingURL=injectable.decorator.d.ts.map
@@ -0,0 +1,46 @@
1
+ import { Lifetime } from '../core/core.lifetime.js';
2
+ import { flushPendingInjectTokens } from './inject.decorator.js';
3
+ // WeakMap-based metadata storage.
4
+ // TODO: Replace with `context.metadata[key]` once transpilers ship decorator metadata support.
5
+ // That change is internal-only — the public API stays identical.
6
+ const registry = new WeakMap();
7
+ /**
8
+ * Marks a class as injectable, allowing it to be managed by the DI container.
9
+ *
10
+ * Uses TC39 class decorators. No reflect-metadata required.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * @injectable()
15
+ * class UserService {
16
+ * static inject = [UserRepository, LOGGER];
17
+ * constructor(readonly userRepo: UserRepository, readonly logger: ILogger) {}
18
+ * }
19
+ *
20
+ * @injectable({ lifetime: Lifetime.TRANSIENT })
21
+ * class RequestHandler {}
22
+ * ```
23
+ */
24
+ export function injectable(options) {
25
+ return function (target, _context) {
26
+ registry.set(target, {
27
+ lifetime: options?.lifetime ?? Lifetime.SINGLETON,
28
+ });
29
+ // Flush any @inject() accessor tokens accumulated during class definition.
30
+ // TC39 order: accessor decorators run first, class decorator runs last.
31
+ flushPendingInjectTokens(target);
32
+ };
33
+ }
34
+ /**
35
+ * Checks if a class is decorated with @injectable().
36
+ */
37
+ export function isInjectable(target) {
38
+ return registry.has(target);
39
+ }
40
+ /**
41
+ * Gets the injectable metadata from a class, or undefined if not decorated.
42
+ */
43
+ export function getInjectableMetadata(target) {
44
+ return registry.get(target);
45
+ }
46
+ //# sourceMappingURL=injectable.decorator.js.map
@@ -0,0 +1,24 @@
1
+ import type { Token } from '../token/token.types.js';
2
+ import type { constructor } from '../core/core.types.js';
3
+ import { ErrorCode } from './error.codes.js';
4
+ /**
5
+ * Single error class for all core DI errors.
6
+ * Use `code` to distinguish error types and `context` for structured data.
7
+ */
8
+ export declare class CoreError extends Error {
9
+ readonly code: ErrorCode;
10
+ readonly context: Record<string, unknown>;
11
+ constructor(code: ErrorCode, message: string, context?: Record<string, unknown>);
12
+ static circularDependency(path: Token[]): CoreError;
13
+ static scopedResolution(token: Token): CoreError;
14
+ static unknownDependency(token: Token, detail?: string): CoreError;
15
+ static invalidModule(moduleClass: constructor): CoreError;
16
+ static circularModuleDependency(detail: string): CoreError;
17
+ static moduleNotFound(moduleClass: constructor): CoreError;
18
+ static moduleNotExported(moduleClass: constructor, moduleId: string): CoreError;
19
+ static notInjectable(target: constructor): CoreError;
20
+ static invalidProvider(detail: string): CoreError;
21
+ static providerNotFound(token: Token, moduleId: string): CoreError;
22
+ static providerNotVisible(token: Token, moduleId: string): CoreError;
23
+ }
24
+ //# sourceMappingURL=core.error.d.ts.map
@@ -0,0 +1,59 @@
1
+ import { formatToken } from '../token/token.utils.js';
2
+ import { ErrorCode } from './error.codes.js';
3
+ /**
4
+ * Single error class for all core DI errors.
5
+ * Use `code` to distinguish error types and `context` for structured data.
6
+ */
7
+ export class CoreError extends Error {
8
+ code;
9
+ context;
10
+ constructor(code, message, context = {}) {
11
+ super(message);
12
+ this.name = 'CoreError';
13
+ this.code = code;
14
+ this.context = context;
15
+ Error.captureStackTrace(this, this.constructor);
16
+ }
17
+ // --- Injection errors ---
18
+ static circularDependency(path) {
19
+ const pathString = path.map(formatToken).join(' -> ');
20
+ return new CoreError(ErrorCode.CIRCULAR_DEPENDENCY, `Circular dependency detected: ${pathString}`, { path });
21
+ }
22
+ static scopedResolution(token) {
23
+ return new CoreError(ErrorCode.SCOPED_RESOLUTION, `Cannot resolve scoped dependency ${formatToken(token)} outside of a scope. Use context.createScope() to create a scoped context.`, { token });
24
+ }
25
+ static unknownDependency(token, detail) {
26
+ const tokenName = formatToken(token);
27
+ const message = detail
28
+ ? `Cannot resolve dependency "${tokenName}": ${detail}`
29
+ : `Cannot resolve dependency "${tokenName}"`;
30
+ return new CoreError(ErrorCode.UNKNOWN_DEPENDENCY, message, { token });
31
+ }
32
+ // --- Module errors ---
33
+ static invalidModule(moduleClass) {
34
+ return new CoreError(ErrorCode.INVALID_MODULE, `Class "${moduleClass.name}" is not a valid module. Did you forget @module()?`, { moduleClass });
35
+ }
36
+ static circularModuleDependency(detail) {
37
+ return new CoreError(ErrorCode.CIRCULAR_MODULE_DEPENDENCY, `Circular module dependency detected: ${detail}`);
38
+ }
39
+ static moduleNotFound(moduleClass) {
40
+ return new CoreError(ErrorCode.MODULE_NOT_FOUND, `Module "${moduleClass.name}" not found in container. Ensure it is imported in the module tree.`, { moduleClass });
41
+ }
42
+ static moduleNotExported(moduleClass, moduleId) {
43
+ return new CoreError(ErrorCode.MODULE_NOT_EXPORTED, `Module "${moduleClass.name}" is listed in exports of module "${moduleId}" but is not imported. A module must be imported before it can be re-exported.`, { moduleClass, moduleId });
44
+ }
45
+ // --- Provider errors ---
46
+ static notInjectable(target) {
47
+ return new CoreError(ErrorCode.NOT_INJECTABLE, `Class "${target.name}" is not injectable. Did you forget to add @injectable()?`, { target });
48
+ }
49
+ static invalidProvider(detail) {
50
+ return new CoreError(ErrorCode.INVALID_PROVIDER, `Invalid provider: ${detail}`);
51
+ }
52
+ static providerNotFound(token, moduleId) {
53
+ return new CoreError(ErrorCode.PROVIDER_NOT_FOUND, `Provider "${formatToken(token)}" not found when resolving from module "${moduleId}".`, { token, moduleId });
54
+ }
55
+ static providerNotVisible(token, moduleId) {
56
+ return new CoreError(ErrorCode.PROVIDER_NOT_VISIBLE, `Cannot resolve "${formatToken(token)}" from module "${moduleId}". The provider exists but is not visible. Ensure it is exported by an imported module or is a global export.`, { token, moduleId });
57
+ }
58
+ }
59
+ //# sourceMappingURL=core.error.js.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Error codes for all stitchem DI errors.
3
+ */
4
+ export declare enum ErrorCode {
5
+ CIRCULAR_DEPENDENCY = "CIRCULAR_DEPENDENCY",
6
+ SCOPED_RESOLUTION = "SCOPED_RESOLUTION",
7
+ UNKNOWN_DEPENDENCY = "UNKNOWN_DEPENDENCY",
8
+ INVALID_MODULE = "INVALID_MODULE",
9
+ CIRCULAR_MODULE_DEPENDENCY = "CIRCULAR_MODULE_DEPENDENCY",
10
+ MODULE_NOT_FOUND = "MODULE_NOT_FOUND",
11
+ MODULE_NOT_EXPORTED = "MODULE_NOT_EXPORTED",
12
+ NOT_INJECTABLE = "NOT_INJECTABLE",
13
+ INVALID_PROVIDER = "INVALID_PROVIDER",
14
+ PROVIDER_NOT_FOUND = "PROVIDER_NOT_FOUND",
15
+ PROVIDER_NOT_VISIBLE = "PROVIDER_NOT_VISIBLE"
16
+ }
17
+ //# sourceMappingURL=error.codes.d.ts.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Error codes for all stitchem DI errors.
3
+ */
4
+ export var ErrorCode;
5
+ (function (ErrorCode) {
6
+ // Injection errors
7
+ ErrorCode["CIRCULAR_DEPENDENCY"] = "CIRCULAR_DEPENDENCY";
8
+ ErrorCode["SCOPED_RESOLUTION"] = "SCOPED_RESOLUTION";
9
+ ErrorCode["UNKNOWN_DEPENDENCY"] = "UNKNOWN_DEPENDENCY";
10
+ // Module errors
11
+ ErrorCode["INVALID_MODULE"] = "INVALID_MODULE";
12
+ ErrorCode["CIRCULAR_MODULE_DEPENDENCY"] = "CIRCULAR_MODULE_DEPENDENCY";
13
+ ErrorCode["MODULE_NOT_FOUND"] = "MODULE_NOT_FOUND";
14
+ ErrorCode["MODULE_NOT_EXPORTED"] = "MODULE_NOT_EXPORTED";
15
+ // Provider errors
16
+ ErrorCode["NOT_INJECTABLE"] = "NOT_INJECTABLE";
17
+ ErrorCode["INVALID_PROVIDER"] = "INVALID_PROVIDER";
18
+ ErrorCode["PROVIDER_NOT_FOUND"] = "PROVIDER_NOT_FOUND";
19
+ ErrorCode["PROVIDER_NOT_VISIBLE"] = "PROVIDER_NOT_VISIBLE";
20
+ })(ErrorCode || (ErrorCode = {}));
21
+ //# sourceMappingURL=error.codes.js.map
@@ -0,0 +1,25 @@
1
+ export { injectable } from './decorator/injectable.decorator.js';
2
+ export { inject } from './decorator/inject.decorator.js';
3
+ export { module } from './module/module.decorator.js';
4
+ export type { constructor } from './core/core.types.js';
5
+ export type { Token } from './token/token.types.js';
6
+ export { Lifetime } from './core/core.lifetime.js';
7
+ export { lazy } from './token/lazy.token.js';
8
+ export { isConstructor } from './core/core.utils.js';
9
+ export type { OnInit, OnDispose, OnReady } from './core/core.lifecycle.js';
10
+ export type { Provider, ClassProvider, ValueProvider, FactoryProvider, ExistingProvider, } from './provider/provider.interface.js';
11
+ export type { ModuleMetadata, DynamicModule, ModuleImport, } from './module/module.types.js';
12
+ export { Context } from './context/context.js';
13
+ export type { Scope } from './context/scope.js';
14
+ export type { ResolveOptions, ContextOptions, LoggingOptions, ComponentRef, } from './context/context.js';
15
+ export { ModuleRef } from './module/module.ref.js';
16
+ export { CoreError } from './errors/core.error.js';
17
+ export { ErrorCode } from './errors/error.codes.js';
18
+ export type { Logger } from './logger/logger.types.js';
19
+ export { LogLevel } from './logger/logger.types.js';
20
+ export { LOGGER } from './logger/logger.token.js';
21
+ export { ConsoleLogger } from './logger/console.logger.js';
22
+ export { Test } from './test/test.js';
23
+ export { TestModule } from './test/test.module.js';
24
+ export { TestModuleBuilder } from './test/test.module-builder.js';
25
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ // Decorators
2
+ export { injectable } from './decorator/injectable.decorator.js';
3
+ export { inject } from './decorator/inject.decorator.js';
4
+ export { module } from './module/module.decorator.js';
5
+ export { Lifetime } from './core/core.lifetime.js';
6
+ export { lazy } from './token/lazy.token.js';
7
+ // Utilities
8
+ export { isConstructor } from './core/core.utils.js';
9
+ // Context
10
+ export { Context } from './context/context.js';
11
+ // Module reference
12
+ export { ModuleRef } from './module/module.ref.js';
13
+ // Errors
14
+ export { CoreError } from './errors/core.error.js';
15
+ export { ErrorCode } from './errors/error.codes.js';
16
+ export { LogLevel } from './logger/logger.types.js';
17
+ export { LOGGER } from './logger/logger.token.js';
18
+ export { ConsoleLogger } from './logger/console.logger.js';
19
+ // Testing
20
+ export { Test } from './test/test.js';
21
+ export { TestModule } from './test/test.module.js';
22
+ export { TestModuleBuilder } from './test/test.module-builder.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,78 @@
1
+ import type { constructor } from '../core/core.types.js';
2
+ import type { InstanceWrapper } from '../instance-wrapper/instance-wrapper.js';
3
+ import type { Module } from '../module/module.js';
4
+ import { Scope } from '../context/scope.js';
5
+ import { Container } from '../container/container.js';
6
+ /**
7
+ * Handles dependency resolution and instance creation.
8
+ * Supports constructor injection (via `static inject`), accessor injection
9
+ * (via `@inject()` accessor decorator), and lazy proxies for circular deps.
10
+ */
11
+ export declare class Injector {
12
+ private readonly container;
13
+ /** Tracks tokens currently being resolved (circular dependency detection). */
14
+ private readonly resolutionStack;
15
+ constructor(container: Container);
16
+ /**
17
+ * Resolves an instance from a wrapper (async).
18
+ * Handles caching, circular dependency detection, and lifecycle hooks.
19
+ *
20
+ * @throws CoreError (SCOPED_RESOLUTION) if resolving scoped without a scope
21
+ * @throws CoreError (CIRCULAR_DEPENDENCY) if a circular dependency is detected
22
+ */
23
+ loadInstance<T>(wrapper: InstanceWrapper<T>, module: Module, scope?: Scope): Promise<T>;
24
+ /**
25
+ * Resolves an instance from a wrapper (sync).
26
+ *
27
+ * @throws CoreError (SCOPED_RESOLUTION) if resolving scoped without a scope
28
+ * @throws CoreError (CIRCULAR_DEPENDENCY) if a circular dependency is detected
29
+ * @throws Error if async factory or async onInit is encountered
30
+ */
31
+ loadInstanceSync<T>(wrapper: InstanceWrapper<T>, module: Module, scope?: Scope): T;
32
+ /**
33
+ * Creates a new instance without caching.
34
+ * Useful for transient-like creation on demand.
35
+ *
36
+ * @throws CoreError (CIRCULAR_DEPENDENCY) if a circular dependency is detected
37
+ */
38
+ createUncached<T>(wrapper: InstanceWrapper<T>, module: Module, scope?: Scope): Promise<T>;
39
+ /**
40
+ * Instantiates any class by resolving its constructor and accessor dependencies.
41
+ * The class does not need to be registered as a provider or marked with @injectable().
42
+ */
43
+ instantiateClass<T>(ctor: constructor<T>, module: Module, scope?: Scope): Promise<T>;
44
+ /**
45
+ * Instantiates any class using global resolution (bypasses module visibility).
46
+ */
47
+ instantiateClassGlobal<T>(ctor: constructor<T>, scope?: Scope): Promise<T>;
48
+ /**
49
+ * Validates resolution preconditions and returns the cached instance if available.
50
+ * Returns null if the instance needs to be created.
51
+ *
52
+ * @throws CoreError (SCOPED_RESOLUTION) if resolving scoped without a scope
53
+ * @throws CoreError (CIRCULAR_DEPENDENCY) if a circular dependency is detected
54
+ */
55
+ private guardResolution;
56
+ /** Creates a resolver scoped to a specific module. */
57
+ private moduleResolver;
58
+ /** Creates a resolver that searches all modules (bypasses visibility). */
59
+ private globalResolver;
60
+ /** Creates an instance from a wrapper's provider (async). */
61
+ private createInstance;
62
+ /** Creates an instance from a wrapper's provider (sync). */
63
+ private createInstanceSync;
64
+ /** Resolves an array of dependency tokens (async). */
65
+ private resolveDependencies;
66
+ /** Resolves an array of dependency tokens (sync). */
67
+ private resolveDependenciesSync;
68
+ /** Injects accessor-decorated properties on an instance (async). */
69
+ private injectAccessorProperties;
70
+ /** Injects accessor-decorated properties on an instance (sync). */
71
+ private injectAccessorPropertiesSync;
72
+ /**
73
+ * Creates a lazy proxy that defers resolution until first property access.
74
+ * Used to break circular dependencies.
75
+ */
76
+ private createLazyProxy;
77
+ }
78
+ //# sourceMappingURL=injector.d.ts.map