@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 +7 -0
- package/LICENSE +21 -0
- package/dist/index.js +9 -41
- package/dist/index.js.map +1 -1
- package/package.json +7 -3
package/CHANGELOG.md
ADDED
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 =
|
|
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 =
|
|
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
|
-
}
|
|
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
|
-
|
|
343
|
-
|
|
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.
|
|
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": {
|