injeca 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Injeca
|
|
2
2
|
|
|
3
|
-
Pure
|
|
3
|
+
Pure functional programming (means no `class` and extra wrappers and containers) based dependency injection with application lifecycle management.
|
|
4
4
|
|
|
5
5
|
> Heavily inspired by [uber/fig](https://go.uber.org/fig) and [uber/dig](https://go.uber.org/dig) in Golang ecosystem.
|
|
6
6
|
|
|
@@ -22,18 +22,18 @@ yarn add injeca
|
|
|
22
22
|
|
|
23
23
|
## Basic usage
|
|
24
24
|
|
|
25
|
-
`injeca` ships with a global singleton container exposed as `
|
|
25
|
+
`injeca` ships with a global singleton container exposed as `injeca`. You can register
|
|
26
26
|
providers, declare their dependencies, and run invocations once everything is ready.
|
|
27
27
|
|
|
28
28
|
```ts
|
|
29
29
|
import { createServer } from 'node:http'
|
|
30
30
|
|
|
31
|
-
import {
|
|
31
|
+
import { injeca, lifecycle } from 'injeca'
|
|
32
32
|
|
|
33
33
|
// Providers return a value once and are cached inside the container.
|
|
34
|
-
const config =
|
|
34
|
+
const config = injeca.provide('config', () => ({ port: 3000 }))
|
|
35
35
|
|
|
36
|
-
const server =
|
|
36
|
+
const server = injeca.provide({
|
|
37
37
|
dependsOn: { config, lifecycle },
|
|
38
38
|
async build({ dependsOn }) {
|
|
39
39
|
const { config, lifecycle } = dependsOn
|
|
@@ -46,7 +46,7 @@ const server = injecta.provide({
|
|
|
46
46
|
},
|
|
47
47
|
})
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
injeca.invoke({
|
|
50
50
|
dependsOn: { server },
|
|
51
51
|
async callback({ server }) {
|
|
52
52
|
// eslint-disable-next-line no-console
|
|
@@ -54,10 +54,10 @@ injecta.invoke({
|
|
|
54
54
|
},
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
await
|
|
57
|
+
await injeca.start()
|
|
58
58
|
|
|
59
59
|
process.once('SIGINT', async () => {
|
|
60
|
-
await
|
|
60
|
+
await injeca.stop()
|
|
61
61
|
})
|
|
62
62
|
```
|
|
63
63
|
|
package/dist/index.d.mts
CHANGED
|
@@ -82,7 +82,7 @@ interface InvokeOptionObjectWithKeys<Deps extends Record<string, string | Provid
|
|
|
82
82
|
type InvokeOptionWithKeys<Deps extends Record<string, string | ProvidedKey<any, any, any>>> = InvokeOptionObjectWithKeys<Deps>;
|
|
83
83
|
declare const lifecycle: ProvidedKey<'lifecycle', Lifecycle, undefined>;
|
|
84
84
|
declare function createContainer(options?: LoggerOptions): Container;
|
|
85
|
-
interface ProvidedKey<Key,
|
|
85
|
+
interface ProvidedKey<Key, _T, _D extends DependencyMap | undefined> {
|
|
86
86
|
key: Key;
|
|
87
87
|
}
|
|
88
88
|
declare function provide<T$1, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, name: Key, option: ProvideOptionWithKeys<T$1, Deps>): ProvidedKey<Key, T$1, ResolveDependencyDeclaration<Deps>>;
|
|
@@ -110,7 +110,7 @@ declare function start$1(): Promise<void>;
|
|
|
110
110
|
declare function stop$1(): Promise<void>;
|
|
111
111
|
//#endregion
|
|
112
112
|
//#region src/index.d.ts
|
|
113
|
-
declare const
|
|
113
|
+
declare const injeca: {
|
|
114
114
|
provide: typeof provide$1;
|
|
115
115
|
invoke: typeof invoke$1;
|
|
116
116
|
start: typeof start$1;
|
|
@@ -118,5 +118,5 @@ declare const injecta: {
|
|
|
118
118
|
setLogger: typeof setLogger;
|
|
119
119
|
};
|
|
120
120
|
//#endregion
|
|
121
|
-
export { type BuildContext, type Container, type DependencyMap, type InvokeOption, type InvokeOptionFunc, type InvokeOptionObject, type InvokeOptionObjectWithKeys, type InvokeOptionWithKeys, type Lifecycle, type Logger, type LoggerOptions, type ProvideOption, type ProvideOptionFunc, type ProvideOptionObject, type ProvideOptionObjectWithKeys, type ProvideOptionWithKeys, type ProvidedKey, type ResolveDependencyDeclaration, createContainer, createDefaultLogger, createLoggLogger, createNoopLogger,
|
|
121
|
+
export { type BuildContext, type Container, type DependencyMap, type InvokeOption, type InvokeOptionFunc, type InvokeOptionObject, type InvokeOptionObjectWithKeys, type InvokeOptionWithKeys, type Lifecycle, type Logger, type LoggerOptions, type ProvideOption, type ProvideOptionFunc, type ProvideOptionObject, type ProvideOptionObjectWithKeys, type ProvideOptionWithKeys, type ProvidedKey, type ResolveDependencyDeclaration, createContainer, createDefaultLogger, createLoggLogger, createNoopLogger, injeca, invoke, lifecycle, provide, start, stop };
|
|
122
122
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -259,7 +259,7 @@ async function stop(container) {
|
|
|
259
259
|
|
|
260
260
|
//#endregion
|
|
261
261
|
//#region src/index.ts
|
|
262
|
-
const
|
|
262
|
+
const injeca = {
|
|
263
263
|
provide: provide$1,
|
|
264
264
|
invoke: invoke$1,
|
|
265
265
|
start: start$1,
|
|
@@ -268,5 +268,5 @@ const injecta = {
|
|
|
268
268
|
};
|
|
269
269
|
|
|
270
270
|
//#endregion
|
|
271
|
-
export { createContainer, createDefaultLogger, createLoggLogger, createNoopLogger,
|
|
271
|
+
export { createContainer, createDefaultLogger, createLoggLogger, createNoopLogger, injeca, invoke, lifecycle, provide, start, stop };
|
|
272
272
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["provide","indexProvide","invoke","start","indexStart","stop","indexStop","name","lifecycle: ProvidedKey<'lifecycle', Lifecycle, undefined>","name","resolvedDependsOn: Record<string, string>","resolvedDependencies: Record<string, any>","serviceLifecycle: any","context: BuildContext<typeof provider.dependsOn>","result: string[]","lifecycle","globalProvide","globalInvoke","globalStart","globalStop","globalSetLogger"],"sources":["../src/global.ts","../package.json","../src/logger.ts","../src/scoped.ts","../src/index.ts"],"sourcesContent":["import type { DependencyMap, InvokeOption, InvokeOptionWithKeys, Logger, ProvideOption, ProvideOptionWithKeys, ResolveDependencyDeclaration } from '.'\nimport type { ProvidedKey } from './scoped'\n\nimport { createContainer, provide as indexProvide, start as indexStart, stop as indexStop } from '.'\n\nlet globalContainer = createContainer()\n\nexport function setLogger(logger: Logger) {\n globalContainer.logger = logger\n}\n\nexport function resetContainer() {\n globalContainer = createContainer()\n}\n\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(name: Key, option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(name: Key, option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(nameOrOption: Key | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: ProvideOption<T, D> | ProvideOptionWithKeys<T, any>): ProvidedKey<Key, T, D> {\n if (option != null && typeof option === 'function') {\n return indexProvide(globalContainer, nameOrOption as any, { build: option, autoNameStackIndex: 2 } as any)\n }\n\n return indexProvide(globalContainer, nameOrOption as any, { ...option, autoNameStackIndex: 2 } as any)\n}\n\nexport function invoke<Deps extends Record<string, string | ProvidedKey<any, any, any>>>(option: InvokeOptionWithKeys<Deps>): void\nexport function invoke<D extends DependencyMap>(option: InvokeOption<D>): void\nexport function invoke<D extends DependencyMap>(option: InvokeOption<D> | InvokeOptionWithKeys<any>): void {\n if (typeof option === 'function') {\n globalContainer.invocations.push({ callback: option } as any)\n }\n else {\n globalContainer.invocations.push(option as any)\n }\n}\n\nexport function start(): Promise<void> {\n return indexStart(globalContainer)\n}\n\nexport function stop(): Promise<void> {\n return indexStop(globalContainer)\n}\n","{\n \"name\": \"injeca\",\n \"type\": \"module\",\n \"packageManager\": \"pnpm@10.22.0\",\n \"description\": \"Pure function programming based dependency injection library inspired by go.uber.org/fig and go.uber.org/dig.\",\n \"author\": {\n \"name\": \"Moeru AI Project AIRI Team\",\n \"email\": \"airi@moeru.ai\",\n \"url\": \"https://github.com/moeru-ai\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/moeru-ai/injeca.git\"\n },\n \"exports\": {\n \".\": {\n \"type\": \"./dist/index.d.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"README.md\",\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsdown\",\n \"test\": \"vitest --coverage\",\n \"test:run\": \"vitest run\",\n \"lint\": \"eslint --cache .\",\n \"lint:fix\": \"eslint --cache --fix .\",\n \"typecheck\": \"tsc --noEmit\",\n \"up\": \"taze -w -r -I -f && pnpm prune && pnpm dedupe\"\n },\n \"peerDependencies\": {\n \"@guiiai/logg\": \">= 1\",\n \"error-stack-parser\": \"^2.1.4\",\n \"nanoid\": \">=5\"\n },\n \"peerDependenciesMeta\": {\n \"@guiiai/logg\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@antfu/eslint-config\": \"^6.2.0\",\n \"@moeru/eslint-config\": \"0.1.0-beta.13\",\n \"@moeru/tsconfig\": \"0.1.0-beta.13\",\n \"@types/node\": \"^24.10.1\",\n \"bumpp\": \"^10.3.1\",\n \"eslint\": \"^9.39.1\",\n \"eslint-plugin-oxlint\": \"^1.28.0\",\n \"oxlint\": \"^1.28.0\",\n \"publint\": \"^0.3.15\",\n \"taze\": \"^19.9.0\",\n \"tsdown\": \"^0.16.4\",\n \"typescript\": \"^5.9.3\",\n \"unplugin-unused\": \"^0.5.6\",\n \"vite\": \"^7.2.2\",\n \"vitest\": \"^4.0.9\"\n }\n}\n","import type { Logg as LoggLogger } from '@guiiai/logg'\n\nimport { name } from '../package.json'\n\nexport interface Logger {\n provide: (name: string, dependencies: string[]) => void\n invoke: (dependencies: string[]) => void\n beforeRun: (name: string) => void\n run: (name: string, duration: number) => void\n hookOnStart: (name: string) => void\n hookOnStartComplete: (name: string, duration: number) => void\n hookOnStop: (name: string) => void\n hookOnStopComplete: (name: string, duration: number) => void\n running: () => void\n}\n\nexport interface LoggerOptions {\n enabled?: boolean\n logger?: Logger\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1) {\n return `${(ms * 1000).toFixed(3)}µs`\n }\n if (ms < 1000) {\n return `${ms.toFixed(3)}ms`\n }\n return `${(ms / 1000).toFixed(3)}s`\n}\n\nexport function createDefaultLogger(): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUNNING`)\n },\n }\n}\n\nexport function createLoggLogger(logg: LoggLogger): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n logg.log(`BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n logg.log(`RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n logg.log(`HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n logg.log(`HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n logg.log(`RUNNING`)\n },\n }\n}\n\nexport function createNoopLogger(): Logger {\n return {\n provide: () => {},\n invoke: () => {},\n beforeRun: () => {},\n run: () => {},\n hookOnStart: () => {},\n hookOnStartComplete: () => {},\n hookOnStop: () => {},\n hookOnStopComplete: () => {},\n running: () => {},\n }\n}\n","import type { Lifecycle, LifecycleTriggerable } from './builtin'\nimport type { Logger, LoggerOptions } from './logger'\n\nimport ErrorStackParser from 'error-stack-parser'\n\nimport { nanoid } from 'nanoid'\n\nimport { createDefaultLogger, createNoopLogger } from './logger'\n\nexport type DependencyMap = Record<string, any>\n\nexport interface Container {\n providers: Map<string, ProvideOptionObject<any, any>>\n instances: Map<string, any>\n lifecycleHooks: Map<string, LifecycleTriggerable>\n dependencyGraph: Map<string, string[]>\n invocations: InvokeOptionObject<any>[]\n logger: Logger\n}\n\nexport type BuildContext<D extends DependencyMap | undefined = undefined> = {\n container: Container\n name: string\n} & (D extends undefined ? { dependsOn?: unknown } : { dependsOn: D })\n\nexport type ResolveDependencyDeclaration<Deps extends Record<string, string | ProvidedKey<any, any, any>>> = {\n [K in keyof Deps]: Deps[K] extends ProvidedKey<any, infer T, any> ? T : any\n}\n\nexport type ProvideOptionObject<T, D extends DependencyMap | undefined = undefined> = { build: (context: BuildContext<D>) => T | Promise<T> } & (D extends undefined ? { dependsOn?: Record<string, never> } : { dependsOn: { [K in keyof D]: string } })\nexport type ProvideOptionFunc<T, D extends DependencyMap | undefined = undefined> = (context: BuildContext<D>) => T | Promise<T>\nexport type ProvideOption<T, D extends DependencyMap | undefined = undefined> = ProvideOptionObject<T, D> | ProvideOptionFunc<T, D>\n\nexport interface ProvideOptionObjectWithKeys<T, Deps extends Record<string, string | ProvidedKey<any, any, any>>> {\n build: (context: BuildContext<ResolveDependencyDeclaration<Deps>>) => T | Promise<T>\n dependsOn: Deps\n}\nexport type ProvideOptionWithKeys<T, Deps extends Record<string, string | ProvidedKey<any, any, any>>> = ProvideOptionObjectWithKeys<T, Deps>\n\nexport type InvokeOptionObject<D extends DependencyMap | undefined = undefined> = { callback: (dependencies: D) => void | Promise<void> } & (D extends undefined ? { dependsOn?: Record<string, never> } : { dependsOn: { [K in keyof D]: string } })\nexport type InvokeOptionFunc<D extends DependencyMap | undefined = undefined> = (dependencies: D) => void | Promise<void>\nexport type InvokeOption<D extends DependencyMap | undefined = undefined> = InvokeOptionObject<D> | InvokeOptionFunc<D>\n\nexport interface InvokeOptionObjectWithKeys<Deps extends Record<string, string | ProvidedKey<any, any, any>>> {\n callback: (dependencies: ResolveDependencyDeclaration<Deps>) => void | Promise<void>\n dependsOn: Deps\n}\nexport type InvokeOptionWithKeys<Deps extends Record<string, string | ProvidedKey<any, any, any>>> = InvokeOptionObjectWithKeys<Deps>\n\nexport const lifecycle: ProvidedKey<'lifecycle', Lifecycle, undefined> = { key: 'lifecycle' }\n\nexport function createContainer(options?: LoggerOptions): Container {\n const logger = options?.enabled === false\n ? createNoopLogger()\n : (options?.logger ?? createDefaultLogger())\n\n return {\n providers: new Map(),\n instances: new Map(),\n lifecycleHooks: new Map(),\n dependencyGraph: new Map(),\n invocations: [],\n logger,\n }\n}\n\n// eslint-disable-next-line unused-imports/no-unused-vars\nexport interface ProvidedKey<Key, T, D extends DependencyMap | undefined> {\n key: Key\n}\n\nexport function normalizeName(nameOrProvidedKey: string | ProvidedKey<any, any, any>): string {\n if (typeof nameOrProvidedKey === 'object' && nameOrProvidedKey !== null && 'key' in nameOrProvidedKey) {\n return (nameOrProvidedKey as ProvidedKey<any, any, any>).key as string\n }\n\n return nameOrProvidedKey as string\n}\n\nexport function normalizeProvideOption<D extends DependencyMap | undefined, T = any, Key extends string = string>(nameOrOption: Key | ProvidedKey<Key, T, D> | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: (ProvideOption<T, D> | ProvideOptionWithKeys<T, any>) & { autoNameStackIndex?: number }): ProvideOptionObject<T, D> {\n if (typeof nameOrOption === 'string') {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as named callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n if (typeof nameOrOption === 'object' && 'key' in nameOrOption) {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as typed ProvideOptionWithKeys<T, D, Key> callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n\n if (typeof nameOrOption === 'function') {\n return { build: nameOrOption } as ProvideOptionObject<T, D>\n }\n\n return nameOrOption as ProvideOptionObject<T, D>\n}\n\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, name: Key, option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, option: ProvideOptionWithKeys<T, Deps> & { autoNameStackIndex?: number }): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, name: Key, option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, option: ProvideOption<T, D> & { autoNameStackIndex?: number }): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, nameOrOption: Key | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: (ProvideOption<T, D> | ProvideOptionWithKeys<T, any>) & { autoNameStackIndex?: number }): ProvidedKey<Key, T, D> {\n const parentFile = ErrorStackParser.parse(new Error('providing'))[option?.autoNameStackIndex ?? 1]\n const name = typeof nameOrOption === 'string'\n ? nameOrOption\n : `${parentFile.fileName ?? `unknown-${nanoid()}`}:${parentFile.lineNumber ?? 0}:${parentFile.columnNumber ?? 0}`\n\n const providerObject = normalizeProvideOption<D, T, Key>(nameOrOption, option) as unknown as ProvideOptionObject<any, any>\n if (providerObject.dependsOn) {\n const resolvedDependsOn: Record<string, string> = {}\n for (const [key, value] of Object.entries(providerObject.dependsOn)) {\n resolvedDependsOn[key] = normalizeName(value)\n }\n\n providerObject.dependsOn = resolvedDependsOn\n }\n\n container.providers.set(name, providerObject)\n\n const dependencies = providerObject.dependsOn ? Object.values(providerObject.dependsOn) : []\n container.logger.provide(name, dependencies)\n container.dependencyGraph.set(name, dependencies)\n\n return { key: name } as ProvidedKey<Key, T, D>\n}\n\nexport function invoke<Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, option: InvokeOptionWithKeys<Deps>): void\nexport function invoke<D extends DependencyMap>(container: Container, option: InvokeOption<D>): void\nexport function invoke<D extends DependencyMap>(container: Container, option: InvokeOption<D> | InvokeOptionWithKeys<any>): void {\n const invocationObject = typeof option === 'function'\n ? { callback: option } as InvokeOptionObject<any>\n : option as InvokeOptionObject<any>\n\n if (invocationObject.dependsOn) {\n const resolvedDependsOn: Record<string, string> = {}\n for (const [key, value] of Object.entries(invocationObject.dependsOn)) {\n resolvedDependsOn[key] = normalizeName(value)\n }\n\n invocationObject.dependsOn = resolvedDependsOn\n }\n\n const dependencies = invocationObject.dependsOn ? Object.values(invocationObject.dependsOn) : []\n\n container.logger.invoke(dependencies)\n container.invocations.push(invocationObject)\n}\n\nasync function resolveInstance<T>(container: Container, name: string): Promise<T> {\n if (container.instances.has(name)) {\n return container.instances.get(name) as T\n }\n\n const provider = container.providers.get(name)\n if (!provider) {\n throw new Error(`No provider found for '${name}'`)\n }\n\n const resolvedDependencies: Record<string, any> = {}\n let serviceLifecycle: any = null\n\n if (provider.dependsOn) {\n for (const [key, depName] of Object.entries(provider.dependsOn)) {\n if (depName === 'lifecycle') {\n // Create individual lifecycle instance for this service\n const { buildLifecycle } = await import('./builtin')\n serviceLifecycle = buildLifecycle()\n resolvedDependencies[key] = serviceLifecycle\n\n // Track this service's lifecycle\n container.lifecycleHooks.set(name, serviceLifecycle)\n }\n else {\n resolvedDependencies[key] = await resolveInstance(container, depName)\n }\n }\n }\n\n const context: BuildContext<typeof provider.dependsOn> = {\n container,\n dependsOn: resolvedDependencies,\n name,\n }\n\n container.logger.beforeRun(name)\n\n const startTime = performance.now()\n const instance = await provider.build(context)\n const duration = performance.now() - startTime\n\n container.logger.run(name, duration)\n\n container.instances.set(name, instance)\n\n return instance as T\n}\n\nfunction topologicalSort(dependencyGraph: Map<string, string[]>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n function visit(node: string) {\n if (visiting.has(node)) {\n throw new Error(`Circular dependency detected involving '${node}'`)\n }\n if (visited.has(node)) {\n return\n }\n\n visiting.add(node)\n const dependencies = dependencyGraph.get(node) || []\n for (const dep of dependencies) {\n visit(dep)\n }\n visiting.delete(node)\n visited.add(node)\n result.push(node)\n }\n\n for (const node of dependencyGraph.keys()) {\n if (!visited.has(node)) {\n visit(node)\n }\n }\n\n return result\n}\n\nexport async function startLifecycleHooks(container: Container): Promise<void> {\n const sortedServices = topologicalSort(container.dependencyGraph)\n\n for (const serviceName of sortedServices) {\n const lifecycle = container.lifecycleHooks.get(serviceName)\n if (lifecycle?.emitOnStart) {\n container.logger.hookOnStart(serviceName)\n\n const startTime = performance.now()\n await lifecycle.emitOnStart()\n const duration = performance.now() - startTime\n\n container.logger.hookOnStartComplete(serviceName, duration)\n }\n }\n}\n\nexport async function stopLifecycleHooks(container: Container): Promise<void> {\n const sortedServices = topologicalSort(container.dependencyGraph)\n\n // Shutdown in reverse order\n for (const serviceName of sortedServices.reverse()) {\n const lifecycle = container.lifecycleHooks.get(serviceName)\n if (lifecycle?.emitOnStop) {\n container.logger.hookOnStop(serviceName)\n\n const startTime = performance.now()\n await lifecycle.emitOnStop()\n const duration = performance.now() - startTime\n\n container.logger.hookOnStopComplete(serviceName, duration)\n }\n }\n}\n\nexport async function start(container: Container): Promise<void> {\n await startLifecycleHooks(container)\n\n for (const invocation of container.invocations) {\n const resolvedDependencies: Record<string, any> = {}\n\n if (invocation.dependsOn) {\n for (const [key, depName] of Object.entries(invocation.dependsOn)) {\n resolvedDependencies[key] = await resolveInstance(container, normalizeName(depName))\n }\n }\n\n await invocation.callback(resolvedDependencies)\n }\n\n container.logger.running()\n}\n\nexport async function stop(container: Container): Promise<void> {\n await stopLifecycleHooks(container)\n}\n","import {\n invoke as globalInvoke,\n provide as globalProvide,\n setLogger as globalSetLogger,\n start as globalStart,\n stop as globalStop,\n} from './global'\n\nexport type { Lifecycle } from './builtin'\n\nexport type { Logger, LoggerOptions } from './logger'\n\nexport {\n createDefaultLogger,\n createLoggLogger,\n createNoopLogger,\n} from './logger'\n\nexport {\n createContainer,\n invoke,\n lifecycle,\n provide,\n start,\n stop,\n} from './scoped'\nexport type {\n BuildContext,\n Container,\n DependencyMap,\n InvokeOption,\n InvokeOptionFunc,\n InvokeOptionObject,\n InvokeOptionObjectWithKeys,\n InvokeOptionWithKeys,\n ProvidedKey,\n ProvideOption,\n ProvideOptionFunc,\n ProvideOptionObject,\n ProvideOptionObjectWithKeys,\n ProvideOptionWithKeys,\n ResolveDependencyDeclaration,\n} from './scoped'\n\nexport const injecta = {\n provide: globalProvide,\n invoke: globalInvoke,\n start: globalStart,\n stop: globalStop,\n setLogger: globalSetLogger,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["provide","indexProvide","invoke","start","indexStart","stop","indexStop","name","lifecycle: ProvidedKey<'lifecycle', Lifecycle, undefined>","name","resolvedDependsOn: Record<string, string>","resolvedDependencies: Record<string, any>","serviceLifecycle: any","context: BuildContext<typeof provider.dependsOn>","result: string[]","lifecycle","globalProvide","globalInvoke","globalStart","globalStop","globalSetLogger"],"sources":["../src/global.ts","../package.json","../src/logger.ts","../src/scoped.ts","../src/index.ts"],"sourcesContent":["import type { DependencyMap, InvokeOption, InvokeOptionWithKeys, Logger, ProvideOption, ProvideOptionWithKeys, ResolveDependencyDeclaration } from '.'\nimport type { ProvidedKey } from './scoped'\n\nimport { createContainer, provide as indexProvide, start as indexStart, stop as indexStop } from '.'\n\nlet globalContainer = createContainer()\n\nexport function setLogger(logger: Logger) {\n globalContainer.logger = logger\n}\n\nexport function resetContainer() {\n globalContainer = createContainer()\n}\n\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(name: Key, option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(name: Key, option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(nameOrOption: Key | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: ProvideOption<T, D> | ProvideOptionWithKeys<T, any>): ProvidedKey<Key, T, D> {\n if (option != null && typeof option === 'function') {\n return indexProvide(globalContainer, nameOrOption as any, { build: option, autoNameStackIndex: 2 } as any)\n }\n\n return indexProvide(globalContainer, nameOrOption as any, { ...option, autoNameStackIndex: 2 } as any)\n}\n\nexport function invoke<Deps extends Record<string, string | ProvidedKey<any, any, any>>>(option: InvokeOptionWithKeys<Deps>): void\nexport function invoke<D extends DependencyMap>(option: InvokeOption<D>): void\nexport function invoke<D extends DependencyMap>(option: InvokeOption<D> | InvokeOptionWithKeys<any>): void {\n if (typeof option === 'function') {\n globalContainer.invocations.push({ callback: option } as any)\n }\n else {\n globalContainer.invocations.push(option as any)\n }\n}\n\nexport function start(): Promise<void> {\n return indexStart(globalContainer)\n}\n\nexport function stop(): Promise<void> {\n return indexStop(globalContainer)\n}\n","{\n \"name\": \"injeca\",\n \"type\": \"module\",\n \"version\": \"0.1.0\",\n \"packageManager\": \"pnpm@10.22.0\",\n \"description\": \"Pure functional programming based dependency injection library inspired by go.uber.org/fig and go.uber.org/dig.\",\n \"author\": {\n \"name\": \"Moeru AI Project AIRI Team\",\n \"email\": \"airi@moeru.ai\",\n \"url\": \"https://github.com/moeru-ai\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/moeru-ai/injeca.git\"\n },\n \"exports\": {\n \".\": {\n \"type\": \"./dist/index.d.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"README.md\",\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsdown\",\n \"test\": \"vitest --coverage\",\n \"test:run\": \"vitest run\",\n \"lint\": \"eslint --cache .\",\n \"lint:fix\": \"eslint --cache --fix .\",\n \"typecheck\": \"tsc --noEmit\",\n \"up\": \"taze -w -r -I -f && pnpm prune && pnpm dedupe\"\n },\n \"peerDependencies\": {\n \"@guiiai/logg\": \">= 1\",\n \"error-stack-parser\": \"^2.1.4\",\n \"nanoid\": \">=5\"\n },\n \"peerDependenciesMeta\": {\n \"@guiiai/logg\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@antfu/eslint-config\": \"^6.2.0\",\n \"@moeru/eslint-config\": \"0.1.0-beta.13\",\n \"@moeru/tsconfig\": \"0.1.0-beta.13\",\n \"@types/node\": \"^24.10.1\",\n \"bumpp\": \"^10.3.1\",\n \"eslint\": \"^9.39.1\",\n \"eslint-plugin-oxlint\": \"^1.28.0\",\n \"oxlint\": \"^1.28.0\",\n \"publint\": \"^0.3.15\",\n \"taze\": \"^19.9.0\",\n \"tsdown\": \"^0.16.4\",\n \"typescript\": \"^5.9.3\",\n \"unplugin-unused\": \"^0.5.6\",\n \"vite\": \"^7.2.2\",\n \"vitest\": \"^4.0.9\"\n }\n}\n","import type { Logg as LoggLogger } from '@guiiai/logg'\n\nimport { name } from '../package.json'\n\nexport interface Logger {\n provide: (name: string, dependencies: string[]) => void\n invoke: (dependencies: string[]) => void\n beforeRun: (name: string) => void\n run: (name: string, duration: number) => void\n hookOnStart: (name: string) => void\n hookOnStartComplete: (name: string, duration: number) => void\n hookOnStop: (name: string) => void\n hookOnStopComplete: (name: string, duration: number) => void\n running: () => void\n}\n\nexport interface LoggerOptions {\n enabled?: boolean\n logger?: Logger\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1) {\n return `${(ms * 1000).toFixed(3)}µs`\n }\n if (ms < 1000) {\n return `${ms.toFixed(3)}ms`\n }\n return `${(ms / 1000).toFixed(3)}s`\n}\n\nexport function createDefaultLogger(): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n // eslint-disable-next-line no-console\n console.log(`[${name}] INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n // eslint-disable-next-line no-console\n console.log(`[${name}] RUNNING`)\n },\n }\n}\n\nexport function createLoggLogger(logg: LoggLogger): Logger {\n return {\n provide: (name: string, dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`PROVIDE ${name}${depsStr}`)\n },\n\n invoke: (dependencies: string[]) => {\n const depsStr = dependencies.length > 0 ? ` (depends on: ${dependencies.join(', ')})` : ''\n logg.log(`INVOKE${depsStr}`)\n },\n\n beforeRun: (name: string) => {\n logg.log(`BEFORE RUN provide: ${name}()`)\n },\n\n run: (name: string, duration: number) => {\n logg.log(`RUN provide: ${name}() in ${formatDuration(duration)}`)\n },\n\n hookOnStart: (name: string) => {\n logg.log(`HOOK OnStart ${name}() executing`)\n },\n\n hookOnStartComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStart ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n hookOnStop: (name: string) => {\n logg.log(`HOOK OnStop ${name}() executing`)\n },\n\n hookOnStopComplete: (name: string, duration: number) => {\n logg.log(`HOOK OnStop ${name}() ran successfully in ${formatDuration(duration)}`)\n },\n\n running: () => {\n logg.log(`RUNNING`)\n },\n }\n}\n\nexport function createNoopLogger(): Logger {\n return {\n provide: () => {},\n invoke: () => {},\n beforeRun: () => {},\n run: () => {},\n hookOnStart: () => {},\n hookOnStartComplete: () => {},\n hookOnStop: () => {},\n hookOnStopComplete: () => {},\n running: () => {},\n }\n}\n","import type { Lifecycle, LifecycleTriggerable } from './builtin'\nimport type { Logger, LoggerOptions } from './logger'\n\nimport ErrorStackParser from 'error-stack-parser'\n\nimport { nanoid } from 'nanoid'\n\nimport { createDefaultLogger, createNoopLogger } from './logger'\n\nexport type DependencyMap = Record<string, any>\n\nexport interface Container {\n providers: Map<string, ProvideOptionObject<any, any>>\n instances: Map<string, any>\n lifecycleHooks: Map<string, LifecycleTriggerable>\n dependencyGraph: Map<string, string[]>\n invocations: InvokeOptionObject<any>[]\n logger: Logger\n}\n\nexport type BuildContext<D extends DependencyMap | undefined = undefined> = {\n container: Container\n name: string\n} & (D extends undefined ? { dependsOn?: unknown } : { dependsOn: D })\n\nexport type ResolveDependencyDeclaration<Deps extends Record<string, string | ProvidedKey<any, any, any>>> = {\n [K in keyof Deps]: Deps[K] extends ProvidedKey<any, infer T, any> ? T : any\n}\n\nexport type ProvideOptionObject<T, D extends DependencyMap | undefined = undefined> = { build: (context: BuildContext<D>) => T | Promise<T> } & (D extends undefined ? { dependsOn?: Record<string, never> } : { dependsOn: { [K in keyof D]: string } })\nexport type ProvideOptionFunc<T, D extends DependencyMap | undefined = undefined> = (context: BuildContext<D>) => T | Promise<T>\nexport type ProvideOption<T, D extends DependencyMap | undefined = undefined> = ProvideOptionObject<T, D> | ProvideOptionFunc<T, D>\n\nexport interface ProvideOptionObjectWithKeys<T, Deps extends Record<string, string | ProvidedKey<any, any, any>>> {\n build: (context: BuildContext<ResolveDependencyDeclaration<Deps>>) => T | Promise<T>\n dependsOn: Deps\n}\nexport type ProvideOptionWithKeys<T, Deps extends Record<string, string | ProvidedKey<any, any, any>>> = ProvideOptionObjectWithKeys<T, Deps>\n\nexport type InvokeOptionObject<D extends DependencyMap | undefined = undefined> = { callback: (dependencies: D) => void | Promise<void> } & (D extends undefined ? { dependsOn?: Record<string, never> } : { dependsOn: { [K in keyof D]: string } })\nexport type InvokeOptionFunc<D extends DependencyMap | undefined = undefined> = (dependencies: D) => void | Promise<void>\nexport type InvokeOption<D extends DependencyMap | undefined = undefined> = InvokeOptionObject<D> | InvokeOptionFunc<D>\n\nexport interface InvokeOptionObjectWithKeys<Deps extends Record<string, string | ProvidedKey<any, any, any>>> {\n callback: (dependencies: ResolveDependencyDeclaration<Deps>) => void | Promise<void>\n dependsOn: Deps\n}\nexport type InvokeOptionWithKeys<Deps extends Record<string, string | ProvidedKey<any, any, any>>> = InvokeOptionObjectWithKeys<Deps>\n\nexport const lifecycle: ProvidedKey<'lifecycle', Lifecycle, undefined> = { key: 'lifecycle' }\n\nexport function createContainer(options?: LoggerOptions): Container {\n const logger = options?.enabled === false\n ? createNoopLogger()\n : (options?.logger ?? createDefaultLogger())\n\n return {\n providers: new Map(),\n instances: new Map(),\n lifecycleHooks: new Map(),\n dependencyGraph: new Map(),\n invocations: [],\n logger,\n }\n}\n\nexport interface ProvidedKey<Key, _T, _D extends DependencyMap | undefined> {\n key: Key\n}\n\nexport function normalizeName(nameOrProvidedKey: string | ProvidedKey<any, any, any>): string {\n if (typeof nameOrProvidedKey === 'object' && nameOrProvidedKey !== null && 'key' in nameOrProvidedKey) {\n return (nameOrProvidedKey as ProvidedKey<any, any, any>).key as string\n }\n\n return nameOrProvidedKey as string\n}\n\nexport function normalizeProvideOption<D extends DependencyMap | undefined, T = any, Key extends string = string>(nameOrOption: Key | ProvidedKey<Key, T, D> | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: (ProvideOption<T, D> | ProvideOptionWithKeys<T, any>) & { autoNameStackIndex?: number }): ProvideOptionObject<T, D> {\n if (typeof nameOrOption === 'string') {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as named callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n if (typeof nameOrOption === 'object' && 'key' in nameOrOption) {\n if (option == null || (!('build' in option) && typeof option !== 'function')) {\n throw new Error('When using provide(...) as typed ProvideOptionWithKeys<T, D, Key> callback, the second argument must be either a valid ProvideOptionObject<T, D> or a ProvideOptionFunc<T, D>.')\n }\n if (typeof option === 'function') {\n return { build: option } as ProvideOptionObject<T, D>\n }\n\n return option as ProvideOptionObject<T, D>\n }\n\n if (typeof nameOrOption === 'function') {\n return { build: nameOrOption } as ProvideOptionObject<T, D>\n }\n\n return nameOrOption as ProvideOptionObject<T, D>\n}\n\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, name: Key, option: ProvideOptionWithKeys<T, Deps>): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<T, Key extends string, Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, option: ProvideOptionWithKeys<T, Deps> & { autoNameStackIndex?: number }): ProvidedKey<Key, T, ResolveDependencyDeclaration<Deps>>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, name: Key, option: ProvideOption<T, D>): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, option: ProvideOption<T, D> & { autoNameStackIndex?: number }): ProvidedKey<Key, T, D>\nexport function provide<D extends DependencyMap | undefined, T = any, Key extends string = string>(container: Container, nameOrOption: Key | ProvideOption<T, D> | ProvideOptionWithKeys<T, any>, option?: (ProvideOption<T, D> | ProvideOptionWithKeys<T, any>) & { autoNameStackIndex?: number }): ProvidedKey<Key, T, D> {\n const parentFile = ErrorStackParser.parse(new Error('providing'))[option?.autoNameStackIndex ?? 1]\n const name = typeof nameOrOption === 'string'\n ? nameOrOption\n : `${parentFile.fileName ?? `unknown-${nanoid()}`}:${parentFile.lineNumber ?? 0}:${parentFile.columnNumber ?? 0}`\n\n const providerObject = normalizeProvideOption<D, T, Key>(nameOrOption, option) as unknown as ProvideOptionObject<any, any>\n if (providerObject.dependsOn) {\n const resolvedDependsOn: Record<string, string> = {}\n for (const [key, value] of Object.entries(providerObject.dependsOn)) {\n resolvedDependsOn[key] = normalizeName(value)\n }\n\n providerObject.dependsOn = resolvedDependsOn\n }\n\n container.providers.set(name, providerObject)\n\n const dependencies = providerObject.dependsOn ? Object.values(providerObject.dependsOn) : []\n container.logger.provide(name, dependencies)\n container.dependencyGraph.set(name, dependencies)\n\n return { key: name } as ProvidedKey<Key, T, D>\n}\n\nexport function invoke<Deps extends Record<string, string | ProvidedKey<any, any, any>>>(container: Container, option: InvokeOptionWithKeys<Deps>): void\nexport function invoke<D extends DependencyMap>(container: Container, option: InvokeOption<D>): void\nexport function invoke<D extends DependencyMap>(container: Container, option: InvokeOption<D> | InvokeOptionWithKeys<any>): void {\n const invocationObject = typeof option === 'function'\n ? { callback: option } as InvokeOptionObject<any>\n : option as InvokeOptionObject<any>\n\n if (invocationObject.dependsOn) {\n const resolvedDependsOn: Record<string, string> = {}\n for (const [key, value] of Object.entries(invocationObject.dependsOn)) {\n resolvedDependsOn[key] = normalizeName(value)\n }\n\n invocationObject.dependsOn = resolvedDependsOn\n }\n\n const dependencies = invocationObject.dependsOn ? Object.values(invocationObject.dependsOn) : []\n\n container.logger.invoke(dependencies)\n container.invocations.push(invocationObject)\n}\n\nasync function resolveInstance<T>(container: Container, name: string): Promise<T> {\n if (container.instances.has(name)) {\n return container.instances.get(name) as T\n }\n\n const provider = container.providers.get(name)\n if (!provider) {\n throw new Error(`No provider found for '${name}'`)\n }\n\n const resolvedDependencies: Record<string, any> = {}\n let serviceLifecycle: any = null\n\n if (provider.dependsOn) {\n for (const [key, depName] of Object.entries(provider.dependsOn)) {\n if (depName === 'lifecycle') {\n // Create individual lifecycle instance for this service\n const { buildLifecycle } = await import('./builtin')\n serviceLifecycle = buildLifecycle()\n resolvedDependencies[key] = serviceLifecycle\n\n // Track this service's lifecycle\n container.lifecycleHooks.set(name, serviceLifecycle)\n }\n else {\n resolvedDependencies[key] = await resolveInstance(container, depName)\n }\n }\n }\n\n const context: BuildContext<typeof provider.dependsOn> = {\n container,\n dependsOn: resolvedDependencies,\n name,\n }\n\n container.logger.beforeRun(name)\n\n const startTime = performance.now()\n const instance = await provider.build(context)\n const duration = performance.now() - startTime\n\n container.logger.run(name, duration)\n\n container.instances.set(name, instance)\n\n return instance as T\n}\n\nfunction topologicalSort(dependencyGraph: Map<string, string[]>): string[] {\n const visited = new Set<string>()\n const visiting = new Set<string>()\n const result: string[] = []\n\n function visit(node: string) {\n if (visiting.has(node)) {\n throw new Error(`Circular dependency detected involving '${node}'`)\n }\n if (visited.has(node)) {\n return\n }\n\n visiting.add(node)\n const dependencies = dependencyGraph.get(node) || []\n for (const dep of dependencies) {\n visit(dep)\n }\n visiting.delete(node)\n visited.add(node)\n result.push(node)\n }\n\n for (const node of dependencyGraph.keys()) {\n if (!visited.has(node)) {\n visit(node)\n }\n }\n\n return result\n}\n\nexport async function startLifecycleHooks(container: Container): Promise<void> {\n const sortedServices = topologicalSort(container.dependencyGraph)\n\n for (const serviceName of sortedServices) {\n const lifecycle = container.lifecycleHooks.get(serviceName)\n if (lifecycle?.emitOnStart) {\n container.logger.hookOnStart(serviceName)\n\n const startTime = performance.now()\n await lifecycle.emitOnStart()\n const duration = performance.now() - startTime\n\n container.logger.hookOnStartComplete(serviceName, duration)\n }\n }\n}\n\nexport async function stopLifecycleHooks(container: Container): Promise<void> {\n const sortedServices = topologicalSort(container.dependencyGraph)\n\n // Shutdown in reverse order\n for (const serviceName of sortedServices.reverse()) {\n const lifecycle = container.lifecycleHooks.get(serviceName)\n if (lifecycle?.emitOnStop) {\n container.logger.hookOnStop(serviceName)\n\n const startTime = performance.now()\n await lifecycle.emitOnStop()\n const duration = performance.now() - startTime\n\n container.logger.hookOnStopComplete(serviceName, duration)\n }\n }\n}\n\nexport async function start(container: Container): Promise<void> {\n await startLifecycleHooks(container)\n\n for (const invocation of container.invocations) {\n const resolvedDependencies: Record<string, any> = {}\n\n if (invocation.dependsOn) {\n for (const [key, depName] of Object.entries(invocation.dependsOn)) {\n resolvedDependencies[key] = await resolveInstance(container, normalizeName(depName))\n }\n }\n\n await invocation.callback(resolvedDependencies)\n }\n\n container.logger.running()\n}\n\nexport async function stop(container: Container): Promise<void> {\n await stopLifecycleHooks(container)\n}\n","import {\n invoke as globalInvoke,\n provide as globalProvide,\n setLogger as globalSetLogger,\n start as globalStart,\n stop as globalStop,\n} from './global'\n\nexport type { Lifecycle } from './builtin'\n\nexport type { Logger, LoggerOptions } from './logger'\n\nexport {\n createDefaultLogger,\n createLoggLogger,\n createNoopLogger,\n} from './logger'\n\nexport {\n createContainer,\n invoke,\n lifecycle,\n provide,\n start,\n stop,\n} from './scoped'\nexport type {\n BuildContext,\n Container,\n DependencyMap,\n InvokeOption,\n InvokeOptionFunc,\n InvokeOptionObject,\n InvokeOptionObjectWithKeys,\n InvokeOptionWithKeys,\n ProvidedKey,\n ProvideOption,\n ProvideOptionFunc,\n ProvideOptionObject,\n ProvideOptionObjectWithKeys,\n ProvideOptionWithKeys,\n ResolveDependencyDeclaration,\n} from './scoped'\n\nexport const injeca = {\n provide: globalProvide,\n invoke: globalInvoke,\n start: globalStart,\n stop: globalStop,\n setLogger: globalSetLogger,\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "injeca",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0
|
|
5
|
-
"description": "Pure
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Pure functional programming based dependency injection library inspired by go.uber.org/fig and go.uber.org/dig.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Moeru AI Project AIRI Team",
|
|
8
8
|
"email": "airi@moeru.ai",
|