@signe/di 2.8.3 → 2.9.2

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/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @signe/di
2
+
3
+ ## 2.9.2
4
+
5
+ ### Patch Changes
6
+
7
+ - e9907e0: Harden public package usage with clearer package metadata, reliable typechecking, safer sync client listener removal, stronger room request routing, and aligned load behavior for typed collections.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Samuel Ronce
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.
package/dist/index.js CHANGED
@@ -1,20 +1,14 @@
1
- var __defProp = Object.defineProperty;
2
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
-
4
1
  // src/inject.ts
5
2
  var DEFAULT_INSTANCE_KEY = "__default__";
6
3
  function toTokenName(token) {
7
4
  return typeof token === "function" ? token.name : token;
8
5
  }
9
- __name(toTokenName, "toTokenName");
10
6
  function toInstanceKey(name) {
11
7
  return name ?? DEFAULT_INSTANCE_KEY;
12
8
  }
13
- __name(toInstanceKey, "toInstanceKey");
14
9
  function getRecord(context, token) {
15
10
  return context.get("inject:" + toTokenName(token));
16
11
  }
17
- __name(getRecord, "getRecord");
18
12
  function ensureRecord(context, token) {
19
13
  const key = "inject:" + toTokenName(token);
20
14
  let record = context.get(key);
@@ -28,7 +22,6 @@ function ensureRecord(context, token) {
28
22
  context.set(key, record);
29
23
  return record;
30
24
  }
31
- __name(ensureRecord, "ensureRecord");
32
25
  function provide(context, token, value, options = {}) {
33
26
  const record = ensureRecord(context, token);
34
27
  const instanceKey = toInstanceKey(options.name);
@@ -41,7 +34,6 @@ function provide(context, token, value, options = {}) {
41
34
  record.values.set(instanceKey, value);
42
35
  return value;
43
36
  }
44
- __name(provide, "provide");
45
37
  function isInjected(context, token, options = {}) {
46
38
  const record = getRecord(context, token);
47
39
  if (!record) {
@@ -55,7 +47,6 @@ function isInjected(context, token, options = {}) {
55
47
  }
56
48
  return record.injected.has(DEFAULT_INSTANCE_KEY);
57
49
  }
58
- __name(isInjected, "isInjected");
59
50
  function isProvided(context, token, options = {}) {
60
51
  const record = getRecord(context, token);
61
52
  if (!record) {
@@ -69,11 +60,9 @@ function isProvided(context, token, options = {}) {
69
60
  }
70
61
  return record.values.has(DEFAULT_INSTANCE_KEY);
71
62
  }
72
- __name(isProvided, "isProvided");
73
63
  function hasInstance(context, token, options = {}) {
74
64
  return isProvided(context, token, options);
75
65
  }
76
- __name(hasInstance, "hasInstance");
77
66
  function handleMissingInjection(token, options) {
78
67
  const name = toTokenName(token);
79
68
  if (options.name) {
@@ -81,17 +70,14 @@ function handleMissingInjection(token, options) {
81
70
  }
82
71
  throw new Error(`Injection provider ${name} not found`);
83
72
  }
84
- __name(handleMissingInjection, "handleMissingInjection");
85
73
  function markInjected(record, key) {
86
74
  record.injected.add(key);
87
75
  }
88
- __name(markInjected, "markInjected");
89
76
  function markAllInjected(record) {
90
77
  for (const key of record.values.keys()) {
91
78
  record.injected.add(key);
92
79
  }
93
80
  }
94
- __name(markAllInjected, "markAllInjected");
95
81
  function inject(context, token, options = {}) {
96
82
  const record = getRecord(context, token);
97
83
  if (!record) {
@@ -132,7 +118,6 @@ function inject(context, token, options = {}) {
132
118
  markInjected(record, DEFAULT_INSTANCE_KEY);
133
119
  return value;
134
120
  }
135
- __name(inject, "inject");
136
121
  function override(providers, newProvider, options) {
137
122
  let { upsert = false, key } = options ?? {};
138
123
  if (!key) {
@@ -160,7 +145,6 @@ function override(providers, newProvider, options) {
160
145
  }
161
146
  return mappedProviders;
162
147
  }
163
- __name(override, "override");
164
148
  function findProviders(providers, name) {
165
149
  const results = [];
166
150
  for (const provider of providers) {
@@ -172,7 +156,6 @@ function findProviders(providers, name) {
172
156
  }
173
157
  return results;
174
158
  }
175
- __name(findProviders, "findProviders");
176
159
  function findProvider(providers, name) {
177
160
  if (!Array.isArray(providers)) {
178
161
  if (typeof providers === "object" && "provide" in providers) {
@@ -203,7 +186,6 @@ function findProvider(providers, name) {
203
186
  }
204
187
  return null;
205
188
  }
206
- __name(findProvider, "findProvider");
207
189
 
208
190
  // src/merge-config.ts
209
191
  function processProvider(mergedConfig, baseConfig, provider) {
@@ -220,14 +202,11 @@ function processProvider(mergedConfig, baseConfig, provider) {
220
202
  mergedConfig.providers.push(provider);
221
203
  }
222
204
  }
223
- __name(processProvider, "processProvider");
224
205
  function mergeConfig(baseConfig, config) {
225
206
  const mergedConfig = {
226
207
  ...baseConfig,
227
208
  ...config,
228
- providers: [
229
- ...baseConfig.providers
230
- ]
209
+ providers: [...baseConfig.providers]
231
210
  // Start with a copy of base providers
232
211
  };
233
212
  for (const provider of config.providers) {
@@ -235,7 +214,6 @@ function mergeConfig(baseConfig, config) {
235
214
  }
236
215
  return mergedConfig;
237
216
  }
238
- __name(mergeConfig, "mergeConfig");
239
217
 
240
218
  // src/provider.ts
241
219
  function extractProvideOptions(source) {
@@ -246,21 +224,16 @@ function extractProvideOptions(source) {
246
224
  if (multi === void 0 && name === void 0) {
247
225
  return void 0;
248
226
  }
249
- return {
250
- multi,
251
- name
252
- };
227
+ return { multi, name };
253
228
  }
254
- __name(extractProvideOptions, "extractProvideOptions");
255
229
  function getDeps(provider) {
256
230
  if (typeof provider === "function") {
257
231
  return provider.deps ?? [];
258
232
  }
259
233
  return provider.deps ?? [];
260
234
  }
261
- __name(getDeps, "getDeps");
262
235
  function sortProviders(providers) {
263
- const tokenName = /* @__PURE__ */ __name((t) => typeof t === "function" ? t.name : t, "tokenName");
236
+ const tokenName = (t) => typeof t === "function" ? t.name : t;
264
237
  const map = /* @__PURE__ */ new Map();
265
238
  for (const p of providers) {
266
239
  const token = tokenName(typeof p === "function" ? p : p.provide);
@@ -268,15 +241,13 @@ function sortProviders(providers) {
268
241
  if (list) {
269
242
  list.push(p);
270
243
  } else {
271
- map.set(token, [
272
- p
273
- ]);
244
+ map.set(token, [p]);
274
245
  }
275
246
  }
276
247
  const result = [];
277
248
  const visited = /* @__PURE__ */ new Set();
278
249
  const stack = /* @__PURE__ */ new Set();
279
- const visit = /* @__PURE__ */ __name((token) => {
250
+ const visit = (token) => {
280
251
  const name = tokenName(token);
281
252
  if (visited.has(name)) return;
282
253
  if (stack.has(name)) {
@@ -294,14 +265,13 @@ function sortProviders(providers) {
294
265
  visited.add(name);
295
266
  }
296
267
  stack.delete(name);
297
- }, "visit");
268
+ };
298
269
  for (const p of providers) {
299
270
  const token = typeof p === "function" ? p : p.provide;
300
271
  visit(token);
301
272
  }
302
273
  return result;
303
274
  }
304
- __name(sortProviders, "sortProviders");
305
275
  async function injector(context, providers) {
306
276
  providers = providers.flat();
307
277
  providers = sortProviders(providers);
@@ -335,15 +305,13 @@ async function injector(context, providers) {
335
305
  provide(context, token, instance, options);
336
306
  }
337
307
  }
338
- __name(injector, "injector");
339
308
 
340
309
  // src/context.ts
341
310
  var Context = class {
342
- static {
343
- __name(this, "Context");
311
+ constructor() {
312
+ /** Internal storage for injected values */
313
+ this.values = {};
344
314
  }
345
- /** Internal storage for injected values */
346
- values = {};
347
315
  /**
348
316
  * Sets a value in the context
349
317
  * @param key - Unique identifier for the value
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/inject.ts","../src/merge-config.ts","../src/provider.ts","../src/context.ts"],"sourcesContent":["/**\n * Core functionality for dependency injection\n * @module @signe/di/inject\n */\n\nimport { Context } from \"./context\";\nimport {\n InjectionOptions,\n InstanceLookupOptions,\n ProvideOptions,\n Provider,\n ProviderToken,\n Providers\n} from \"./types\";\n\nconst DEFAULT_INSTANCE_KEY = \"__default__\";\n\ninterface ProviderRecord {\n multi: boolean;\n values: Map<string, any>;\n injected: Set<string>;\n}\n\nfunction toTokenName(token: ProviderToken | string): string {\n return typeof token === \"function\" ? token.name : token;\n}\n\nfunction toInstanceKey(name?: string): string {\n return name ?? DEFAULT_INSTANCE_KEY;\n}\n\nfunction getRecord(context: Context, token: ProviderToken | string): ProviderRecord | undefined {\n return context.get(\"inject:\" + toTokenName(token));\n}\n\nfunction ensureRecord(context: Context, token: ProviderToken | string): ProviderRecord {\n const key = \"inject:\" + toTokenName(token);\n let record = context.get(key) as ProviderRecord | undefined;\n if (!record) {\n record = {\n multi: false,\n values: new Map<string, any>(),\n injected: new Set<string>()\n };\n }\n context.set(key, record);\n return record;\n}\n\n/**\n * Provides a value to the dependency injection context\n * @template T - Type of the value being provided\n * @param context - The injection context\n * @param token - Identifier for the provided value\n * @param value - The value to provide\n * @param options - Configuration options for the provided value\n * @returns The provided value\n */\nexport function provide<T>(\n context: Context,\n token: ProviderToken | string,\n value: T,\n options: ProvideOptions = {}\n): T {\n const record = ensureRecord(context, token);\n const instanceKey = toInstanceKey(options.name);\n\n if (options.multi) {\n record.multi = true;\n }\n\n if (!record.multi && instanceKey !== DEFAULT_INSTANCE_KEY) {\n // If we are switching from single to named instance without multi, enable multi mode implicitly\n record.multi = true;\n }\n\n record.values.set(instanceKey, value);\n return value;\n}\n\n/**\n * Checks if a service has been injected into the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the service has been injected, false otherwise\n */\nexport function isInjected(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n const record = getRecord(context, token);\n if (!record) {\n return false;\n }\n\n if (options.name) {\n return record.injected.has(toInstanceKey(options.name));\n }\n\n if (record.multi) {\n return record.injected.size > 0;\n }\n\n return record.injected.has(DEFAULT_INSTANCE_KEY);\n}\n\n/**\n * Checks if a service has been provided in the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the service has been provided, false otherwise\n */\nexport function isProvided(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n const record = getRecord(context, token);\n if (!record) {\n return false;\n }\n\n if (options.name) {\n return record.values.has(toInstanceKey(options.name));\n }\n\n if (record.multi) {\n return record.values.size > 0;\n }\n\n return record.values.has(DEFAULT_INSTANCE_KEY);\n}\n\n/**\n * Checks if an instance exists in the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the instance exists, false otherwise\n */\nexport function hasInstance(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n return isProvided(context, token, options);\n}\n\nfunction handleMissingInjection(\n token: ProviderToken | string,\n options: InjectionOptions\n): never {\n const name = toTokenName(token);\n if (options.name) {\n throw new Error(`Injection provider ${name} with name ${options.name} not found`);\n }\n throw new Error(`Injection provider ${name} not found`);\n}\n\nfunction markInjected(record: ProviderRecord, key: string) {\n record.injected.add(key);\n}\n\nfunction markAllInjected(record: ProviderRecord) {\n for (const key of record.values.keys()) {\n record.injected.add(key);\n }\n}\n\nexport function inject<T>(context: Context, token: ProviderToken | string, options: InjectionOptions & { multi: true }): T[];\nexport function inject<T>(context: Context, token: ProviderToken | string, options: InjectionOptions & { optional: true }): T | undefined;\nexport function inject<T>(context: Context, token: ProviderToken | string, options?: InjectionOptions): T;\n/**\n * Retrieves a service from the dependency injection context\n * @template T - Type of the service to inject\n * @param context - The injection context\n * @param token - Class constructor or string identifier of the service\n * @param options - Optional configuration for resolving the service\n * @returns The injected service instance or `undefined` when optional\n * @throws {Error} If the requested service is not found in the context\n */\nexport function inject<T>(\n context: Context,\n token: ProviderToken | string,\n options: InjectionOptions = {}\n): T | T[] | undefined {\n const record = getRecord(context, token);\n\n if (!record) {\n if (options.optional) {\n return options.multi ? [] : undefined;\n }\n return handleMissingInjection(token, options);\n }\n\n if (options.name) {\n const instanceKey = toInstanceKey(options.name);\n if (!record.values.has(instanceKey)) {\n if (options.optional) {\n return undefined;\n }\n return handleMissingInjection(token, options);\n }\n const value = record.values.get(instanceKey);\n markInjected(record, instanceKey);\n return value as T;\n }\n\n if (options.multi || record.multi) {\n if (record.values.size === 0) {\n if (options.optional) {\n return [];\n }\n return handleMissingInjection(token, options);\n }\n markAllInjected(record);\n return Array.from(record.values.values()) as T[];\n }\n\n const value = record.values.get(DEFAULT_INSTANCE_KEY);\n if (value === undefined) {\n if (options.optional) {\n return undefined;\n }\n return handleMissingInjection(token, options);\n }\n\n markInjected(record, DEFAULT_INSTANCE_KEY);\n return value as T;\n}\n\n/**\n * Overrides or adds a provider in the providers array\n * @param providers - Array of existing providers\n * @param newProvider - Provider to add or replace with\n * @param options - Configuration options\n * @param options.upsert - If true, adds the provider when not found\n * @param options.key - Custom key to identify the provider\n * @returns Updated array of providers\n */\nexport function override(\n providers: Providers,\n newProvider: Provider,\n options?: {\n upsert?: boolean,\n key?: string\n }\n) {\n let { upsert = false, key } = options ?? {};\n if (!key) {\n key = (\n typeof newProvider === \"function\" ? newProvider.name : newProvider.provide\n ) as string;\n }\n\n // Flatten the providers array\n const flatProviders = providers.flat();\n\n // Check if provider exists\n const exists = flatProviders.some(provider => {\n if (typeof provider === \"function\") {\n return provider.name === key;\n } else if (typeof provider === \"object\") {\n return (provider as any).provide === key;\n }\n return false;\n });\n\n // Map and replace if found\n const mappedProviders = flatProviders.map((provider) => {\n if (typeof provider === \"function\" && provider.name === key) {\n return newProvider;\n } else if (typeof provider === \"object\" && (provider as any).provide === key) {\n return newProvider;\n }\n return provider;\n });\n\n // If upsert is true and provider wasn't found, add it to the end\n if (upsert && !exists) {\n mappedProviders.push(newProvider);\n }\n\n return mappedProviders;\n}\n\n/**\n * Finds all providers matching the given name or pattern\n * @template T - Type of provider to return\n * @param providers - Array of providers to search\n * @param name - String or RegExp to match against provider names\n * @returns Array of matching providers\n */\nexport function findProviders<T extends Provider = Provider>(providers: Providers, name: string | RegExp): T[] {\n const results: any[] = [];\n\n for (const provider of providers) {\n if (Array.isArray(provider)) {\n // Recursively search in nested arrays and concat results\n results.push(...findProviders(provider, name));\n } else if (findProvider(provider as any, name)) {\n // Add matching provider to results\n results.push(provider as T);\n }\n }\n\n return results;\n}\n\n/**\n * Finds the first provider matching the given name or pattern\n * @template T - Type of provider to return\n * @param providers - Array of providers to search\n * @param name - String or RegExp to match against provider names\n * @returns Matching provider or null if not found\n */\nexport function findProvider<T extends Provider = Provider>(providers: Providers, name: string | RegExp): T | null {\n // Handle single provider case\n if (!Array.isArray(providers)) {\n if (typeof providers === \"object\" && 'provide' in providers) {\n const provider = providers as any\n const providerName = typeof provider.provide === \"function\"\n ? provider.provide.name\n : provider.provide;\n\n if (name instanceof RegExp) {\n if (name.test(providerName)) return providers as T;\n } else {\n if (providerName === name) return providers as T;\n }\n }\n return null;\n }\n\n // Original array handling logic\n for (const provider of providers) {\n // If provider is an array, recursively search in it\n if (Array.isArray(provider)) {\n const found = findProvider(provider, name);\n if (found) return found as T;\n continue;\n }\n\n // Check object provider\n if (typeof provider === \"object\" && 'provide' in provider) {\n const providerName = typeof provider.provide === \"function\"\n ? provider.provide.name\n : provider.provide;\n\n // Handle RegExp matching\n if (name instanceof RegExp) {\n if (name.test(providerName)) return provider as T;\n } else {\n // Handle exact string matching\n if (providerName === name) return provider as T;\n }\n }\n }\n return null;\n}\n","/**\n * Configuration merging functionality for dependency injection\n * @module @signe/di/merge-config\n */\n\nimport { findProvider, override } from \"./inject\";\n\n/**\n * Application configuration interface\n */\nexport interface AppConfig {\n /** Array of dependency providers */\n providers: any[];\n /** Optional static files configuration */\n staticFiles?: {\n /** Path to static files */\n path: string;\n /** Static file serving configuration */\n serve: any;\n }\n}\n\n/**\n * Process a provider or nested provider array and add it to the merged config\n * @param mergedConfig - Configuration being built\n * @param baseConfig - Original base configuration \n * @param provider - Provider or nested provider array to process\n */\nfunction processProvider(mergedConfig: AppConfig, baseConfig: AppConfig, provider: any) {\n // Handle nested arrays of providers\n if (Array.isArray(provider)) {\n for (const nestedProvider of provider) {\n processProvider(mergedConfig, baseConfig, nestedProvider);\n }\n return;\n }\n\n // Handle individual provider\n const existingProvider = findProvider(baseConfig.providers, provider.provide);\n if (existingProvider) {\n // Replace existing provider\n mergedConfig.providers = override(mergedConfig.providers, provider);\n } else {\n // Add new provider\n mergedConfig.providers.push(provider);\n }\n}\n\n/**\n * Merges two application configurations\n * @param baseConfig - Base configuration to merge into\n * @param config - Configuration to merge with base\n * @returns Merged configuration with providers properly combined\n */\nexport function mergeConfig(baseConfig: AppConfig, config: AppConfig): AppConfig {\n // Create a new config object with everything except providers\n const mergedConfig: AppConfig = {\n ...baseConfig,\n ...config,\n providers: [...baseConfig.providers] // Start with a copy of base providers\n }\n\n // Process each provider from the config to merge\n for (const provider of config.providers) {\n processProvider(mergedConfig, baseConfig, provider);\n }\n\n return mergedConfig;\n}\n","/**\n * Provider system implementation for dependency injection\n * @module @signe/di/provider\n */\n\nimport { ClassProvider, ProvideOptions, Provider, Providers, ProviderToken } from \"./types\";\nimport { inject, provide } from \"./inject\";\nimport { Context } from \"./context\";\n\nfunction extractProvideOptions(source: { multi?: boolean; name?: string } | undefined): ProvideOptions | undefined {\n if (!source) {\n return undefined;\n }\n\n const { multi, name } = source;\n if (multi === undefined && name === undefined) {\n return undefined;\n }\n\n return { multi, name };\n}\n\n/**\n * Type guard to check if a provider is a ClassProvider\n * @param provider - Provider to check\n * @returns True if the provider is a ClassProvider\n */\nfunction isClassProvider(provider: Provider): provider is ClassProvider {\n if (typeof provider === 'string') {\n return false;\n }\n return 'useClass' in provider && typeof provider.useClass === 'function';\n}\n\n/**\n * Retrieves dependencies declared on a provider\n * @param provider - Provider to inspect\n * @returns Array of provider tokens this provider depends on\n */\nfunction getDeps(provider: Provider): ProviderToken[] {\n if (typeof provider === 'function') {\n return (provider as any).deps ?? [];\n }\n return (provider as any).deps ?? [];\n}\n\n/**\n * Sorts providers so that dependencies are instantiated first\n * @param providers - Array of providers to sort\n * @throws When a circular dependency is detected\n */\nfunction sortProviders(providers: Provider[]): Provider[] {\n const tokenName = (t: ProviderToken) => typeof t === 'function' ? t.name : t;\n const map = new Map<string, Provider[]>();\n for (const p of providers) {\n const token = tokenName(typeof p === 'function' ? p : (p as any).provide);\n const list = map.get(token);\n if (list) {\n list.push(p);\n } else {\n map.set(token, [p]);\n }\n }\n\n const result: Provider[] = [];\n const visited = new Set<string>();\n const stack = new Set<string>();\n\n const visit = (token: ProviderToken) => {\n const name = tokenName(token);\n if (visited.has(name)) return;\n if (stack.has(name)) {\n throw new Error(`Circular dependency detected for provider ${name}`);\n }\n stack.add(name);\n const providersForToken = map.get(name);\n if (providersForToken) {\n for (const provider of providersForToken) {\n for (const dep of getDeps(provider)) {\n visit(dep);\n }\n result.push(provider);\n }\n visited.add(name);\n }\n stack.delete(name);\n };\n\n for (const p of providers) {\n const token = typeof p === 'function' ? p : (p as any).provide;\n visit(token);\n }\n\n return result;\n}\n\n/**\n * Processes and instantiates all providers in the given context\n * @param context - The injection context\n * @param providers - Array of providers to process\n * @returns Promise that resolves when all providers are processed\n * \n * @example\n * ```typescript\n * const context = new Context();\n * const providers = [\n * UserService,\n * { provide: 'CONFIG', useValue: { apiUrl: 'http://api.example.com' } },\n * { provide: AuthService, useFactory: (ctx) => new AuthService(ctx) }\n * ];\n * \n * await injector(context, providers);\n * ```\n */\nexport async function injector(context: Context, providers: Providers) {\n providers = providers.flat();\n providers = sortProviders(providers as Provider[]);\n\n for (const provider of providers) {\n let token: ProviderToken;\n let instance: any;\n let options: ProvideOptions | undefined;\n\n if (typeof provider === 'function') {\n // If provider is a class, treat it as a ClassProvider\n token = provider;\n instance = new provider(context);\n const diOptions = extractProvideOptions((provider as any).diOptions ?? (provider as any).di);\n options = diOptions;\n } else {\n token = (provider as any).provide;\n options = extractProvideOptions(provider as any);\n const provideUserClass = (provider as any).useClass;\n const isClass = typeof provideUserClass === 'function';\n if (isClass) {\n instance = new provideUserClass(context);\n } else if ('useValue' in provider) {\n instance = provider.useValue;\n } else if ('useFactory' in provider) {\n instance = provider.useFactory?.(context);\n if (instance instanceof Promise) {\n instance = await instance;\n }\n } else if ('useExisting' in provider) {\n instance = inject(context, provider.useExisting);\n }\n }\n\n provide(context, token, instance, options);\n }\n}","/**\n * Context class for managing dependency injection state\n * @module @signe/di/context\n */\n\n/**\n * Stores and manages the state of injected dependencies\n * @template TState - Type for the state\n * @template TActions - Type for the actions\n * @template TValues - Type for additional values\n */\nexport class Context<\n TState = any,\n TActions = any,\n TValues extends Record<string, any> = Record<string, any>\n> {\n /** Internal storage for injected values */\n private values: TValues = {} as TValues\n\n /**\n * Sets a value in the context\n * @param key - Unique identifier for the value\n * @param value - Value to store\n */\n set<K extends keyof TValues>(key: K, value: TValues[K]) {\n this.values[key] = value\n }\n\n /**\n * Retrieves a value from the context\n * @param key - Unique identifier for the value\n * @returns The stored value or undefined if not found\n */\n get<K extends keyof TValues>(key: K): TValues[K] {\n return this.values[key]\n }\n}"],"mappings":"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","names":["DEFAULT_INSTANCE_KEY","toTokenName","token","name","toInstanceKey","getRecord","context","get","ensureRecord","key","record","multi","values","Map","injected","Set","set","provide","value","options","instanceKey","isInjected","has","size","isProvided","hasInstance","handleMissingInjection","Error","markInjected","add","markAllInjected","keys","inject","optional","undefined","Array","from","override","providers","newProvider","upsert","flatProviders","flat","exists","some","provider","mappedProviders","map","push","findProviders","results","isArray","findProvider","providerName","RegExp","test","found","processProvider","mergedConfig","baseConfig","provider","Array","isArray","nestedProvider","existingProvider","findProvider","providers","provide","override","push","mergeConfig","config","extractProvideOptions","source","undefined","multi","name","getDeps","provider","deps","sortProviders","providers","tokenName","t","name","map","Map","p","token","provide","list","get","push","set","result","visited","Set","stack","visit","has","Error","add","providersForToken","dep","delete","injector","context","flat","instance","options","diOptions","extractProvideOptions","di","provideUserClass","useClass","isClass","useValue","useFactory","Promise","inject","useExisting","Context","values","set","key","value","get"]}
1
+ {"version":3,"sources":["../src/inject.ts","../src/merge-config.ts","../src/provider.ts","../src/context.ts"],"sourcesContent":["/**\n * Core functionality for dependency injection\n * @module @signe/di/inject\n */\n\nimport { Context } from \"./context\";\nimport {\n InjectionOptions,\n InstanceLookupOptions,\n ProvideOptions,\n Provider,\n ProviderToken,\n Providers\n} from \"./types\";\n\nconst DEFAULT_INSTANCE_KEY = \"__default__\";\n\ninterface ProviderRecord {\n multi: boolean;\n values: Map<string, any>;\n injected: Set<string>;\n}\n\nfunction toTokenName(token: ProviderToken | string): string {\n return typeof token === \"function\" ? token.name : token;\n}\n\nfunction toInstanceKey(name?: string): string {\n return name ?? DEFAULT_INSTANCE_KEY;\n}\n\nfunction getRecord(context: Context, token: ProviderToken | string): ProviderRecord | undefined {\n return context.get(\"inject:\" + toTokenName(token));\n}\n\nfunction ensureRecord(context: Context, token: ProviderToken | string): ProviderRecord {\n const key = \"inject:\" + toTokenName(token);\n let record = context.get(key) as ProviderRecord | undefined;\n if (!record) {\n record = {\n multi: false,\n values: new Map<string, any>(),\n injected: new Set<string>()\n };\n }\n context.set(key, record);\n return record;\n}\n\n/**\n * Provides a value to the dependency injection context\n * @template T - Type of the value being provided\n * @param context - The injection context\n * @param token - Identifier for the provided value\n * @param value - The value to provide\n * @param options - Configuration options for the provided value\n * @returns The provided value\n */\nexport function provide<T>(\n context: Context,\n token: ProviderToken | string,\n value: T,\n options: ProvideOptions = {}\n): T {\n const record = ensureRecord(context, token);\n const instanceKey = toInstanceKey(options.name);\n\n if (options.multi) {\n record.multi = true;\n }\n\n if (!record.multi && instanceKey !== DEFAULT_INSTANCE_KEY) {\n // If we are switching from single to named instance without multi, enable multi mode implicitly\n record.multi = true;\n }\n\n record.values.set(instanceKey, value);\n return value;\n}\n\n/**\n * Checks if a service has been injected into the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the service has been injected, false otherwise\n */\nexport function isInjected(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n const record = getRecord(context, token);\n if (!record) {\n return false;\n }\n\n if (options.name) {\n return record.injected.has(toInstanceKey(options.name));\n }\n\n if (record.multi) {\n return record.injected.size > 0;\n }\n\n return record.injected.has(DEFAULT_INSTANCE_KEY);\n}\n\n/**\n * Checks if a service has been provided in the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the service has been provided, false otherwise\n */\nexport function isProvided(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n const record = getRecord(context, token);\n if (!record) {\n return false;\n }\n\n if (options.name) {\n return record.values.has(toInstanceKey(options.name));\n }\n\n if (record.multi) {\n return record.values.size > 0;\n }\n\n return record.values.has(DEFAULT_INSTANCE_KEY);\n}\n\n/**\n * Checks if an instance exists in the context\n * @param context - The injection context\n * @param token - Token of the service to check\n * @param options - Optional lookup configuration\n * @returns True if the instance exists, false otherwise\n */\nexport function hasInstance(\n context: Context,\n token: ProviderToken | string,\n options: InstanceLookupOptions = {}\n): boolean {\n return isProvided(context, token, options);\n}\n\nfunction handleMissingInjection(\n token: ProviderToken | string,\n options: InjectionOptions\n): never {\n const name = toTokenName(token);\n if (options.name) {\n throw new Error(`Injection provider ${name} with name ${options.name} not found`);\n }\n throw new Error(`Injection provider ${name} not found`);\n}\n\nfunction markInjected(record: ProviderRecord, key: string) {\n record.injected.add(key);\n}\n\nfunction markAllInjected(record: ProviderRecord) {\n for (const key of record.values.keys()) {\n record.injected.add(key);\n }\n}\n\nexport function inject<T>(context: Context, token: ProviderToken | string, options: InjectionOptions & { multi: true }): T[];\nexport function inject<T>(context: Context, token: ProviderToken | string, options: InjectionOptions & { optional: true }): T | undefined;\nexport function inject<T>(context: Context, token: ProviderToken | string, options?: InjectionOptions): T;\n/**\n * Retrieves a service from the dependency injection context\n * @template T - Type of the service to inject\n * @param context - The injection context\n * @param token - Class constructor or string identifier of the service\n * @param options - Optional configuration for resolving the service\n * @returns The injected service instance or `undefined` when optional\n * @throws {Error} If the requested service is not found in the context\n */\nexport function inject<T>(\n context: Context,\n token: ProviderToken | string,\n options: InjectionOptions = {}\n): T | T[] | undefined {\n const record = getRecord(context, token);\n\n if (!record) {\n if (options.optional) {\n return options.multi ? [] : undefined;\n }\n return handleMissingInjection(token, options);\n }\n\n if (options.name) {\n const instanceKey = toInstanceKey(options.name);\n if (!record.values.has(instanceKey)) {\n if (options.optional) {\n return undefined;\n }\n return handleMissingInjection(token, options);\n }\n const value = record.values.get(instanceKey);\n markInjected(record, instanceKey);\n return value as T;\n }\n\n if (options.multi || record.multi) {\n if (record.values.size === 0) {\n if (options.optional) {\n return [];\n }\n return handleMissingInjection(token, options);\n }\n markAllInjected(record);\n return Array.from(record.values.values()) as T[];\n }\n\n const value = record.values.get(DEFAULT_INSTANCE_KEY);\n if (value === undefined) {\n if (options.optional) {\n return undefined;\n }\n return handleMissingInjection(token, options);\n }\n\n markInjected(record, DEFAULT_INSTANCE_KEY);\n return value as T;\n}\n\n/**\n * Overrides or adds a provider in the providers array\n * @param providers - Array of existing providers\n * @param newProvider - Provider to add or replace with\n * @param options - Configuration options\n * @param options.upsert - If true, adds the provider when not found\n * @param options.key - Custom key to identify the provider\n * @returns Updated array of providers\n */\nexport function override(\n providers: Providers,\n newProvider: Provider,\n options?: {\n upsert?: boolean,\n key?: string\n }\n) {\n let { upsert = false, key } = options ?? {};\n if (!key) {\n key = (\n typeof newProvider === \"function\" ? newProvider.name : newProvider.provide\n ) as string;\n }\n\n // Flatten the providers array\n const flatProviders = providers.flat();\n\n // Check if provider exists\n const exists = flatProviders.some(provider => {\n if (typeof provider === \"function\") {\n return provider.name === key;\n } else if (typeof provider === \"object\") {\n return (provider as any).provide === key;\n }\n return false;\n });\n\n // Map and replace if found\n const mappedProviders = flatProviders.map((provider) => {\n if (typeof provider === \"function\" && provider.name === key) {\n return newProvider;\n } else if (typeof provider === \"object\" && (provider as any).provide === key) {\n return newProvider;\n }\n return provider;\n });\n\n // If upsert is true and provider wasn't found, add it to the end\n if (upsert && !exists) {\n mappedProviders.push(newProvider);\n }\n\n return mappedProviders;\n}\n\n/**\n * Finds all providers matching the given name or pattern\n * @template T - Type of provider to return\n * @param providers - Array of providers to search\n * @param name - String or RegExp to match against provider names\n * @returns Array of matching providers\n */\nexport function findProviders<T extends Provider = Provider>(providers: Providers, name: string | RegExp): T[] {\n const results: any[] = [];\n\n for (const provider of providers) {\n if (Array.isArray(provider)) {\n // Recursively search in nested arrays and concat results\n results.push(...findProviders(provider, name));\n } else if (findProvider(provider as any, name)) {\n // Add matching provider to results\n results.push(provider as T);\n }\n }\n\n return results;\n}\n\n/**\n * Finds the first provider matching the given name or pattern\n * @template T - Type of provider to return\n * @param providers - Array of providers to search\n * @param name - String or RegExp to match against provider names\n * @returns Matching provider or null if not found\n */\nexport function findProvider<T extends Provider = Provider>(providers: Providers, name: string | RegExp): T | null {\n // Handle single provider case\n if (!Array.isArray(providers)) {\n if (typeof providers === \"object\" && 'provide' in providers) {\n const provider = providers as any\n const providerName = typeof provider.provide === \"function\"\n ? provider.provide.name\n : provider.provide;\n\n if (name instanceof RegExp) {\n if (name.test(providerName)) return providers as T;\n } else {\n if (providerName === name) return providers as T;\n }\n }\n return null;\n }\n\n // Original array handling logic\n for (const provider of providers) {\n // If provider is an array, recursively search in it\n if (Array.isArray(provider)) {\n const found = findProvider(provider, name);\n if (found) return found as T;\n continue;\n }\n\n // Check object provider\n if (typeof provider === \"object\" && 'provide' in provider) {\n const providerName = typeof provider.provide === \"function\"\n ? provider.provide.name\n : provider.provide;\n\n // Handle RegExp matching\n if (name instanceof RegExp) {\n if (name.test(providerName)) return provider as T;\n } else {\n // Handle exact string matching\n if (providerName === name) return provider as T;\n }\n }\n }\n return null;\n}\n","/**\n * Configuration merging functionality for dependency injection\n * @module @signe/di/merge-config\n */\n\nimport { findProvider, override } from \"./inject\";\n\n/**\n * Application configuration interface\n */\nexport interface AppConfig {\n /** Array of dependency providers */\n providers: any[];\n /** Optional static files configuration */\n staticFiles?: {\n /** Path to static files */\n path: string;\n /** Static file serving configuration */\n serve: any;\n }\n}\n\n/**\n * Process a provider or nested provider array and add it to the merged config\n * @param mergedConfig - Configuration being built\n * @param baseConfig - Original base configuration \n * @param provider - Provider or nested provider array to process\n */\nfunction processProvider(mergedConfig: AppConfig, baseConfig: AppConfig, provider: any) {\n // Handle nested arrays of providers\n if (Array.isArray(provider)) {\n for (const nestedProvider of provider) {\n processProvider(mergedConfig, baseConfig, nestedProvider);\n }\n return;\n }\n\n // Handle individual provider\n const existingProvider = findProvider(baseConfig.providers, provider.provide);\n if (existingProvider) {\n // Replace existing provider\n mergedConfig.providers = override(mergedConfig.providers, provider);\n } else {\n // Add new provider\n mergedConfig.providers.push(provider);\n }\n}\n\n/**\n * Merges two application configurations\n * @param baseConfig - Base configuration to merge into\n * @param config - Configuration to merge with base\n * @returns Merged configuration with providers properly combined\n */\nexport function mergeConfig(baseConfig: AppConfig, config: AppConfig): AppConfig {\n // Create a new config object with everything except providers\n const mergedConfig: AppConfig = {\n ...baseConfig,\n ...config,\n providers: [...baseConfig.providers] // Start with a copy of base providers\n }\n\n // Process each provider from the config to merge\n for (const provider of config.providers) {\n processProvider(mergedConfig, baseConfig, provider);\n }\n\n return mergedConfig;\n}\n","/**\n * Provider system implementation for dependency injection\n * @module @signe/di/provider\n */\n\nimport { ClassProvider, ProvideOptions, Provider, Providers, ProviderToken } from \"./types\";\nimport { inject, provide } from \"./inject\";\nimport { Context } from \"./context\";\n\nfunction extractProvideOptions(source: { multi?: boolean; name?: string } | undefined): ProvideOptions | undefined {\n if (!source) {\n return undefined;\n }\n\n const { multi, name } = source;\n if (multi === undefined && name === undefined) {\n return undefined;\n }\n\n return { multi, name };\n}\n\n/**\n * Type guard to check if a provider is a ClassProvider\n * @param provider - Provider to check\n * @returns True if the provider is a ClassProvider\n */\nfunction isClassProvider(provider: Provider): provider is ClassProvider {\n if (typeof provider === 'string') {\n return false;\n }\n return 'useClass' in provider && typeof provider.useClass === 'function';\n}\n\n/**\n * Retrieves dependencies declared on a provider\n * @param provider - Provider to inspect\n * @returns Array of provider tokens this provider depends on\n */\nfunction getDeps(provider: Provider): ProviderToken[] {\n if (typeof provider === 'function') {\n return (provider as any).deps ?? [];\n }\n return (provider as any).deps ?? [];\n}\n\n/**\n * Sorts providers so that dependencies are instantiated first\n * @param providers - Array of providers to sort\n * @throws When a circular dependency is detected\n */\nfunction sortProviders(providers: Provider[]): Provider[] {\n const tokenName = (t: ProviderToken) => typeof t === 'function' ? t.name : t;\n const map = new Map<string, Provider[]>();\n for (const p of providers) {\n const token = tokenName(typeof p === 'function' ? p : (p as any).provide);\n const list = map.get(token);\n if (list) {\n list.push(p);\n } else {\n map.set(token, [p]);\n }\n }\n\n const result: Provider[] = [];\n const visited = new Set<string>();\n const stack = new Set<string>();\n\n const visit = (token: ProviderToken) => {\n const name = tokenName(token);\n if (visited.has(name)) return;\n if (stack.has(name)) {\n throw new Error(`Circular dependency detected for provider ${name}`);\n }\n stack.add(name);\n const providersForToken = map.get(name);\n if (providersForToken) {\n for (const provider of providersForToken) {\n for (const dep of getDeps(provider)) {\n visit(dep);\n }\n result.push(provider);\n }\n visited.add(name);\n }\n stack.delete(name);\n };\n\n for (const p of providers) {\n const token = typeof p === 'function' ? p : (p as any).provide;\n visit(token);\n }\n\n return result;\n}\n\n/**\n * Processes and instantiates all providers in the given context\n * @param context - The injection context\n * @param providers - Array of providers to process\n * @returns Promise that resolves when all providers are processed\n * \n * @example\n * ```typescript\n * const context = new Context();\n * const providers = [\n * UserService,\n * { provide: 'CONFIG', useValue: { apiUrl: 'http://api.example.com' } },\n * { provide: AuthService, useFactory: (ctx) => new AuthService(ctx) }\n * ];\n * \n * await injector(context, providers);\n * ```\n */\nexport async function injector(context: Context, providers: Providers) {\n providers = providers.flat();\n providers = sortProviders(providers as Provider[]);\n\n for (const provider of providers) {\n let token: ProviderToken;\n let instance: any;\n let options: ProvideOptions | undefined;\n\n if (typeof provider === 'function') {\n // If provider is a class, treat it as a ClassProvider\n token = provider;\n instance = new provider(context);\n const diOptions = extractProvideOptions((provider as any).diOptions ?? (provider as any).di);\n options = diOptions;\n } else {\n token = (provider as any).provide;\n options = extractProvideOptions(provider as any);\n const provideUserClass = (provider as any).useClass;\n const isClass = typeof provideUserClass === 'function';\n if (isClass) {\n instance = new provideUserClass(context);\n } else if ('useValue' in provider) {\n instance = provider.useValue;\n } else if ('useFactory' in provider) {\n instance = provider.useFactory?.(context);\n if (instance instanceof Promise) {\n instance = await instance;\n }\n } else if ('useExisting' in provider) {\n instance = inject(context, provider.useExisting);\n }\n }\n\n provide(context, token, instance, options);\n }\n}","/**\n * Context class for managing dependency injection state\n * @module @signe/di/context\n */\n\n/**\n * Stores and manages the state of injected dependencies\n * @template TState - Type for the state\n * @template TActions - Type for the actions\n * @template TValues - Type for additional values\n */\nexport class Context<\n TState = any,\n TActions = any,\n TValues extends Record<string, any> = Record<string, any>\n> {\n /** Internal storage for injected values */\n private values: TValues = {} as TValues\n\n /**\n * Sets a value in the context\n * @param key - Unique identifier for the value\n * @param value - Value to store\n */\n set<K extends keyof TValues>(key: K, value: TValues[K]) {\n this.values[key] = value\n }\n\n /**\n * Retrieves a value from the context\n * @param key - Unique identifier for the value\n * @returns The stored value or undefined if not found\n */\n get<K extends keyof TValues>(key: K): TValues[K] {\n return this.values[key]\n }\n}"],"mappings":"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","names":["value"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@signe/di",
3
- "version": "2.8.3",
4
- "description": "",
3
+ "version": "2.9.2",
4
+ "description": "Lightweight dependency injection container for TypeScript applications.",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
7
7
  ".": {
@@ -10,7 +10,11 @@
10
10
  },
11
11
  "./*": "./*"
12
12
  },
13
- "keywords": [],
13
+ "keywords": [
14
+ "dependency-injection",
15
+ "di",
16
+ "typescript"
17
+ ],
14
18
  "author": "Samuel Ronce",
15
19
  "license": "MIT",
16
20
  "publishConfig": {