skyr 0.1.2 → 0.2.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/dist/di.d.ts +148 -0
- package/dist/di.d.ts.map +1 -0
- package/dist/di.js +303 -0
- package/dist/di.js.map +1 -0
- package/dist/index.d.ts +4 -275
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -477
- package/dist/index.js.map +1 -1
- package/dist/result.d.ts +146 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +419 -0
- package/dist/result.js.map +1 -0
- package/package.json +11 -6
- package/src/di.ts +2 -2
- package/src/index.ts +2 -2
package/dist/di.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Injection using generators
|
|
3
|
+
* Allows declaring, requiring, and injecting dependencies in a type-safe way
|
|
4
|
+
*/
|
|
5
|
+
import { AsyncResult, type Fail, type Result } from "./result.js";
|
|
6
|
+
/**
|
|
7
|
+
* Dependency - declares a dependency requirement
|
|
8
|
+
* Example: const LoggerService = fn.dependency<Logger>()("logger")
|
|
9
|
+
*/
|
|
10
|
+
export declare class Dependency<T, K extends string = string> {
|
|
11
|
+
readonly key: K;
|
|
12
|
+
constructor(key: K);
|
|
13
|
+
/**
|
|
14
|
+
* Create an implementation binding for this dependency
|
|
15
|
+
* Example: LoggerService.impl(myLogger)
|
|
16
|
+
*/
|
|
17
|
+
impl(value: T): DependencyImpl<T, K>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* DependencyImpl - binds a value to a dependency key
|
|
21
|
+
* Created by Dependency.impl() and used in .inject()
|
|
22
|
+
*/
|
|
23
|
+
export declare class DependencyImpl<T, K extends string = string> {
|
|
24
|
+
readonly key: K;
|
|
25
|
+
readonly value: T;
|
|
26
|
+
constructor(key: K, value: T);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* DependencyDeclaration - yielded in generators to request a dependency
|
|
30
|
+
* Created by fn.require(dependency)
|
|
31
|
+
*/
|
|
32
|
+
export declare class DependencyDeclaration<T, K extends string = string> {
|
|
33
|
+
readonly key: K;
|
|
34
|
+
readonly _tag: symbol;
|
|
35
|
+
constructor(key: K);
|
|
36
|
+
[Symbol.iterator](): Generator<DependencyDeclaration<T, K>, T, T>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* DependentGenerator - instruction to execute a function with dependency inheritance
|
|
40
|
+
* Created by fn.yield() and consumed by the DI system
|
|
41
|
+
*/
|
|
42
|
+
export interface DependentGenerator<T, Deps = never, Errors = never> {
|
|
43
|
+
_tag: "DependentGenerator";
|
|
44
|
+
_deps: Deps;
|
|
45
|
+
_errors: Errors;
|
|
46
|
+
_generator: Generator<YieldedValue, T, any>;
|
|
47
|
+
[Symbol.iterator](): Generator<DependentGenerator<T, Deps, Errors>, T, any>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Values that can be yielded in a generator
|
|
51
|
+
*/
|
|
52
|
+
type YieldedValue = Result<any, any> | AsyncResult<any, any> | Promise<unknown> | DependencyDeclaration<any> | DependentGenerator<any, any, any>;
|
|
53
|
+
/**
|
|
54
|
+
* Extract return type from generator
|
|
55
|
+
*/
|
|
56
|
+
type ExtractGeneratorReturn<G> = G extends Generator<any, infer R, any> ? R : never;
|
|
57
|
+
/**
|
|
58
|
+
* Extract yield type from generator
|
|
59
|
+
*/
|
|
60
|
+
type ExtractGeneratorYield<G> = G extends Generator<infer Y, any, any> ? Y : never;
|
|
61
|
+
/**
|
|
62
|
+
* Extract error types from yielded values
|
|
63
|
+
*/
|
|
64
|
+
type ExtractYieldedErrors<Y> = Y extends Fail<any, infer E> ? E : Y extends Result<any, infer E> ? E : Y extends AsyncResult<any, infer E> ? E : Y extends DependentGenerator<any, any, infer E> ? E : never;
|
|
65
|
+
/**
|
|
66
|
+
* Extract dependencies from yielded values
|
|
67
|
+
*/
|
|
68
|
+
type ExtractYieldedDependencies<Y> = Y extends DependencyDeclaration<infer T, infer K> ? K extends string ? Dependency<T, K> : never : Y extends DependentGenerator<any, infer D, any> ? D : never;
|
|
69
|
+
/**
|
|
70
|
+
* Infer all dependencies from a generator
|
|
71
|
+
*/
|
|
72
|
+
type InferDependencies<G> = ExtractYieldedDependencies<ExtractGeneratorYield<G>>;
|
|
73
|
+
/**
|
|
74
|
+
* Remove dependencies from union by key
|
|
75
|
+
*/
|
|
76
|
+
type RemoveDepByKey<D, K extends string> = D extends Dependency<any, K> ? never : D;
|
|
77
|
+
/**
|
|
78
|
+
* Check if yields contain async values
|
|
79
|
+
*/
|
|
80
|
+
type ContainsAsyncYields<Y> = [
|
|
81
|
+
Extract<Y, AsyncResult<any, any> | Promise<any>>
|
|
82
|
+
] extends [never] ? false : true;
|
|
83
|
+
/**
|
|
84
|
+
* Marker for async yields
|
|
85
|
+
*/
|
|
86
|
+
declare const AsyncYieldsMarker: unique symbol;
|
|
87
|
+
type AsyncYieldsMarker = typeof AsyncYieldsMarker;
|
|
88
|
+
/**
|
|
89
|
+
* Normalize yields - return marker if async present
|
|
90
|
+
*/
|
|
91
|
+
type NormalizeYields<Y> = ContainsAsyncYields<Y> extends true ? AsyncYieldsMarker : never;
|
|
92
|
+
/**
|
|
93
|
+
* Ensure return type is a Result
|
|
94
|
+
* Converts to AsyncResult if async yields are present
|
|
95
|
+
*/
|
|
96
|
+
type EnsureResult<T, E = never, Yields = never> = [Yields] extends [never] ? T extends Result<infer U, infer TE> ? Result<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : Result<T, E> : Yields extends AsyncYieldsMarker ? T extends Result<infer U, infer TE> ? AsyncResult<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : AsyncResult<T, E> : T extends Result<infer U, infer TE> ? Result<U, TE | E> : T extends AsyncResult<infer U, infer TE> ? AsyncResult<U, TE | E> : Result<T, E>;
|
|
97
|
+
/**
|
|
98
|
+
* Unwrap Result type to get inner value
|
|
99
|
+
*/
|
|
100
|
+
type UnwrapResult<T> = T extends Result<infer U, any> ? U : T extends AsyncResult<infer U, any> ? U : T;
|
|
101
|
+
/**
|
|
102
|
+
* Generator type for functions with dependencies
|
|
103
|
+
*/
|
|
104
|
+
export type FnGenerator<Return, Errors = any> = Generator<YieldedValue, Return>;
|
|
105
|
+
/**
|
|
106
|
+
* Function with dependency injection support
|
|
107
|
+
*/
|
|
108
|
+
export interface Fn<Args extends any[], Return, Errors, Deps = never, Yields = never> {
|
|
109
|
+
/**
|
|
110
|
+
* Call the function directly (only available when all dependencies are satisfied)
|
|
111
|
+
*/
|
|
112
|
+
(...args: Args): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;
|
|
113
|
+
/**
|
|
114
|
+
* Inject dependencies using implementation bindings
|
|
115
|
+
* Example: fn.inject(LoggerImpl, DbImpl)
|
|
116
|
+
* Allows injecting any dependency, even if not currently required (enables overriding)
|
|
117
|
+
*/
|
|
118
|
+
inject<const Impls extends readonly DependencyImpl<any, string>[]>(...impls: Impls): Fn<Args, Return, Errors, RemoveDepByKey<Deps, Impls[number]["key"]>, Yields>;
|
|
119
|
+
/**
|
|
120
|
+
* Execute the function with all dependencies satisfied
|
|
121
|
+
* Only callable when Deps is never (all dependencies injected)
|
|
122
|
+
*/
|
|
123
|
+
run(...args: Args): [Deps] extends [never] ? EnsureResult<Return, Errors, Yields> : never;
|
|
124
|
+
/**
|
|
125
|
+
* Create an instruction for executing this function with dependency inheritance
|
|
126
|
+
* Use with yield* to inherit dependencies from parent generator
|
|
127
|
+
* Automatically unwraps Ok results for seamless composition
|
|
128
|
+
*/
|
|
129
|
+
yield(...args: Args): DependentGenerator<UnwrapResult<Return>, Deps, Errors>;
|
|
130
|
+
_generator: (...args: Args) => FnGenerator<Return, Errors>;
|
|
131
|
+
_injectedDeps: Record<string, any>;
|
|
132
|
+
_deps: Deps;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Create a function with dependency injection support
|
|
136
|
+
*
|
|
137
|
+
* For generator functions: Enables DI and automatic error handling
|
|
138
|
+
* For regular functions: Identity transform with type inference
|
|
139
|
+
*/
|
|
140
|
+
declare function fnImpl<Args extends any[], T, E>(fn: (...args: Args) => Result<T, E>): (...args: Args) => Result<T, E>;
|
|
141
|
+
declare function fnImpl<Args extends any[], Gen extends Generator<any, any, any>>(generator: (...args: Args) => Gen): Fn<Args, ExtractGeneratorReturn<Gen>, ExtractYieldedErrors<ExtractGeneratorYield<Gen>>, InferDependencies<Gen>, NormalizeYields<ExtractGeneratorYield<Gen>>>;
|
|
142
|
+
declare namespace fnImpl {
|
|
143
|
+
var dependency: <T>() => <const K extends string>(key: K) => Dependency<T, K>;
|
|
144
|
+
var require: <T, K extends string>(dep: Dependency<T, K>) => DependencyDeclaration<T, K>;
|
|
145
|
+
}
|
|
146
|
+
export declare const fn: typeof fnImpl;
|
|
147
|
+
export {};
|
|
148
|
+
//# sourceMappingURL=di.d.ts.map
|
package/dist/di.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"di.d.ts","sourceRoot":"","sources":["../src/di.ts"],"names":[],"mappings":"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"}
|
package/dist/di.js
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Injection using generators
|
|
3
|
+
* Allows declaring, requiring, and injecting dependencies in a type-safe way
|
|
4
|
+
*/
|
|
5
|
+
import { AsyncResult, hasFailed, isOk, isResult, Ok, } from "./result.js";
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Dependency Types
|
|
8
|
+
// ============================================================================
|
|
9
|
+
const DEPENDENCY_SYMBOL = Symbol("dependency");
|
|
10
|
+
/**
|
|
11
|
+
* Dependency - declares a dependency requirement
|
|
12
|
+
* Example: const LoggerService = fn.dependency<Logger>()("logger")
|
|
13
|
+
*/
|
|
14
|
+
export class Dependency {
|
|
15
|
+
key;
|
|
16
|
+
constructor(key) {
|
|
17
|
+
this.key = key;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create an implementation binding for this dependency
|
|
21
|
+
* Example: LoggerService.impl(myLogger)
|
|
22
|
+
*/
|
|
23
|
+
impl(value) {
|
|
24
|
+
return new DependencyImpl(this.key, value);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* DependencyImpl - binds a value to a dependency key
|
|
29
|
+
* Created by Dependency.impl() and used in .inject()
|
|
30
|
+
*/
|
|
31
|
+
export class DependencyImpl {
|
|
32
|
+
key;
|
|
33
|
+
value;
|
|
34
|
+
constructor(key, value) {
|
|
35
|
+
this.key = key;
|
|
36
|
+
this.value = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* DependencyDeclaration - yielded in generators to request a dependency
|
|
41
|
+
* Created by fn.require(dependency)
|
|
42
|
+
*/
|
|
43
|
+
export class DependencyDeclaration {
|
|
44
|
+
key;
|
|
45
|
+
_tag = DEPENDENCY_SYMBOL;
|
|
46
|
+
constructor(key) {
|
|
47
|
+
this.key = key;
|
|
48
|
+
}
|
|
49
|
+
// Generator support - allows `yield* fn.require(dep)` to get the value
|
|
50
|
+
*[Symbol.iterator]() {
|
|
51
|
+
return yield this;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Marker for async yields
|
|
56
|
+
*/
|
|
57
|
+
const AsyncYieldsMarker = Symbol("AsyncYields");
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Type Guards
|
|
60
|
+
// ============================================================================
|
|
61
|
+
function isDependencyDeclaration(value) {
|
|
62
|
+
return (value != null &&
|
|
63
|
+
typeof value === "object" &&
|
|
64
|
+
"_tag" in value &&
|
|
65
|
+
value._tag === DEPENDENCY_SYMBOL);
|
|
66
|
+
}
|
|
67
|
+
function isDependentGenerator(value) {
|
|
68
|
+
return (value != null &&
|
|
69
|
+
typeof value === "object" &&
|
|
70
|
+
"_tag" in value &&
|
|
71
|
+
value._tag === "DependentGenerator");
|
|
72
|
+
}
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Generator Execution
|
|
75
|
+
// ============================================================================
|
|
76
|
+
/**
|
|
77
|
+
* Resolve a dependency and continue generator execution
|
|
78
|
+
*/
|
|
79
|
+
function resolveDependency(decl, deps, gen) {
|
|
80
|
+
if (!(decl.key in deps)) {
|
|
81
|
+
throw new Error(`Missing dependency: ${decl.key}`);
|
|
82
|
+
}
|
|
83
|
+
return gen.next(deps[decl.key]);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run a generator synchronously until it completes or needs to go async
|
|
87
|
+
* Handles:
|
|
88
|
+
* - Dependency resolution (yield* fn.require(...))
|
|
89
|
+
* - Result unwrapping (yield* ok(...) / yield* fail(...))
|
|
90
|
+
* - Nested function calls (yield* child.yield(...))
|
|
91
|
+
* - Async transition (yield* asyncResult / yield promise)
|
|
92
|
+
*/
|
|
93
|
+
function runGenerator(generator, args, deps) {
|
|
94
|
+
const gen = generator(...args);
|
|
95
|
+
let result = gen.next();
|
|
96
|
+
while (!result.done) {
|
|
97
|
+
const yielded = result.value;
|
|
98
|
+
// Handle dependency declaration
|
|
99
|
+
if (isDependencyDeclaration(yielded)) {
|
|
100
|
+
result = resolveDependency(yielded, deps, gen);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Handle nested function call (DependentGenerator)
|
|
104
|
+
if (isDependentGenerator(yielded)) {
|
|
105
|
+
const childGen = yielded._generator;
|
|
106
|
+
let childResult = childGen.next();
|
|
107
|
+
// Execute child generator
|
|
108
|
+
while (!childResult.done) {
|
|
109
|
+
const childYielded = childResult.value;
|
|
110
|
+
// Resolve child's dependencies
|
|
111
|
+
if (isDependencyDeclaration(childYielded)) {
|
|
112
|
+
childResult = resolveDependency(childYielded, deps, childGen);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// Short-circuit on child failure
|
|
116
|
+
if (hasFailed(childYielded)) {
|
|
117
|
+
return childYielded;
|
|
118
|
+
}
|
|
119
|
+
// Switch to async if child yields async
|
|
120
|
+
if (childYielded instanceof AsyncResult) {
|
|
121
|
+
return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
|
|
122
|
+
}
|
|
123
|
+
if (childYielded instanceof Promise) {
|
|
124
|
+
return new AsyncResult(runGeneratorAsync(gen, childYielded, deps));
|
|
125
|
+
}
|
|
126
|
+
childResult = childGen.next();
|
|
127
|
+
}
|
|
128
|
+
// Send child's return value back to parent
|
|
129
|
+
result = gen.next(childResult.value);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
// Short-circuit on failure
|
|
133
|
+
if (hasFailed(yielded)) {
|
|
134
|
+
return yielded;
|
|
135
|
+
}
|
|
136
|
+
// Switch to async mode
|
|
137
|
+
if (yielded instanceof AsyncResult) {
|
|
138
|
+
return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
|
|
139
|
+
}
|
|
140
|
+
if (yielded instanceof Promise) {
|
|
141
|
+
return new AsyncResult(runGeneratorAsync(gen, yielded, deps));
|
|
142
|
+
}
|
|
143
|
+
// Continue for Ok or other values
|
|
144
|
+
result = gen.next();
|
|
145
|
+
}
|
|
146
|
+
// Auto-wrap return value in Ok if not already a Result
|
|
147
|
+
return (isResult(result.value) ? result.value : new Ok(result.value));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Run a generator asynchronously after encountering an async value
|
|
151
|
+
* Continues where runGenerator left off
|
|
152
|
+
*/
|
|
153
|
+
async function runGeneratorAsync(gen, firstAsyncValue, deps) {
|
|
154
|
+
// Resolve the first async value
|
|
155
|
+
const asyncResult = firstAsyncValue instanceof AsyncResult
|
|
156
|
+
? await firstAsyncValue
|
|
157
|
+
: await firstAsyncValue;
|
|
158
|
+
// Short-circuit if it's a failure
|
|
159
|
+
if (hasFailed(asyncResult)) {
|
|
160
|
+
return asyncResult;
|
|
161
|
+
}
|
|
162
|
+
// Unwrap Ok value to send back to generator (for yield* asyncResult)
|
|
163
|
+
const unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;
|
|
164
|
+
let result = gen.next(unwrappedValue);
|
|
165
|
+
while (!result.done) {
|
|
166
|
+
const yielded = result.value;
|
|
167
|
+
// Handle dependency declaration
|
|
168
|
+
if (isDependencyDeclaration(yielded)) {
|
|
169
|
+
result = resolveDependency(yielded, deps, gen);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
// Short-circuit on failure
|
|
173
|
+
if (hasFailed(yielded)) {
|
|
174
|
+
return yielded;
|
|
175
|
+
}
|
|
176
|
+
// Handle AsyncResult
|
|
177
|
+
if (yielded instanceof AsyncResult) {
|
|
178
|
+
const asyncResult = await yielded;
|
|
179
|
+
if (hasFailed(asyncResult)) {
|
|
180
|
+
return asyncResult;
|
|
181
|
+
}
|
|
182
|
+
// Unwrap Ok to send back (for yield* asyncResult)
|
|
183
|
+
const unwrappedValue = isOk(asyncResult) ? asyncResult.value : undefined;
|
|
184
|
+
result = gen.next(unwrappedValue);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
// Handle Promise
|
|
188
|
+
if (yielded instanceof Promise) {
|
|
189
|
+
await yielded;
|
|
190
|
+
result = gen.next();
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Continue for Ok or other values
|
|
194
|
+
result = gen.next();
|
|
195
|
+
}
|
|
196
|
+
// Auto-wrap return value in Ok if not already a Result
|
|
197
|
+
return isResult(result.value) ? result.value : new Ok(result.value);
|
|
198
|
+
}
|
|
199
|
+
// ============================================================================
|
|
200
|
+
// Fn Factory
|
|
201
|
+
// ============================================================================
|
|
202
|
+
/**
|
|
203
|
+
* Create a Fn implementation with dependency injection support
|
|
204
|
+
*/
|
|
205
|
+
function createFn(generator, injectedDeps = {}) {
|
|
206
|
+
// Create the Fn object
|
|
207
|
+
const fnObj = {
|
|
208
|
+
_generator: generator,
|
|
209
|
+
_injectedDeps: injectedDeps,
|
|
210
|
+
_deps: {},
|
|
211
|
+
inject(...impls) {
|
|
212
|
+
// Merge new implementations with existing ones
|
|
213
|
+
const depsRecord = impls.reduce((acc, impl) => {
|
|
214
|
+
acc[impl.key] = impl.value;
|
|
215
|
+
return acc;
|
|
216
|
+
}, {});
|
|
217
|
+
const newInjectedDeps = { ...injectedDeps, ...depsRecord };
|
|
218
|
+
return createFn(generator, newInjectedDeps);
|
|
219
|
+
},
|
|
220
|
+
run(...args) {
|
|
221
|
+
return runGenerator(generator, args, injectedDeps);
|
|
222
|
+
},
|
|
223
|
+
yield(...args) {
|
|
224
|
+
// Create execution generator that handles dependency inheritance
|
|
225
|
+
const executeGen = function* () {
|
|
226
|
+
const gen = generator(...args);
|
|
227
|
+
let result = gen.next();
|
|
228
|
+
while (!result.done) {
|
|
229
|
+
const yielded = result.value;
|
|
230
|
+
// If it's a dependency we don't have, yield it to parent
|
|
231
|
+
if (isDependencyDeclaration(yielded)) {
|
|
232
|
+
if (!(yielded.key in injectedDeps)) {
|
|
233
|
+
// Yield to parent and get the value back
|
|
234
|
+
const depValue = yield yielded;
|
|
235
|
+
result = gen.next(depValue);
|
|
236
|
+
continue;
|
|
237
|
+
}
|
|
238
|
+
// We have this dependency, resolve it internally
|
|
239
|
+
result = resolveDependency(yielded, injectedDeps, gen);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
// Yield other values to parent
|
|
243
|
+
yield yielded;
|
|
244
|
+
result = gen.next();
|
|
245
|
+
}
|
|
246
|
+
// Auto-unwrap Result return values for seamless composition
|
|
247
|
+
const returnValue = result.value;
|
|
248
|
+
if (isOk(returnValue)) {
|
|
249
|
+
return returnValue.value;
|
|
250
|
+
}
|
|
251
|
+
return returnValue;
|
|
252
|
+
};
|
|
253
|
+
// Create instruction object
|
|
254
|
+
const instruction = {
|
|
255
|
+
_tag: "DependentGenerator",
|
|
256
|
+
_deps: {},
|
|
257
|
+
_errors: {},
|
|
258
|
+
_generator: executeGen(),
|
|
259
|
+
// Make it iterable for yield* - yields itself as instruction
|
|
260
|
+
*[Symbol.iterator]() {
|
|
261
|
+
return yield instruction;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
return instruction;
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
// Make the Fn object callable
|
|
268
|
+
const callable = (...args) => fnObj.run(...args);
|
|
269
|
+
// Copy Fn properties to the callable function
|
|
270
|
+
callable.inject = fnObj.inject;
|
|
271
|
+
callable.run = fnObj.run;
|
|
272
|
+
callable.yield = fnObj.yield;
|
|
273
|
+
callable._generator = fnObj._generator;
|
|
274
|
+
callable._injectedDeps = fnObj._injectedDeps;
|
|
275
|
+
callable._deps = fnObj._deps;
|
|
276
|
+
return callable;
|
|
277
|
+
}
|
|
278
|
+
function fnImpl(fnOrGen) {
|
|
279
|
+
// Check if it's a generator function
|
|
280
|
+
if (fnOrGen.constructor && fnOrGen.constructor.name === "GeneratorFunction") {
|
|
281
|
+
return createFn(fnOrGen);
|
|
282
|
+
}
|
|
283
|
+
// Regular function - return as-is (identity)
|
|
284
|
+
return fnOrGen;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Create a dependency key
|
|
288
|
+
* Example: const LoggerService = fn.dependency<Logger>()("logger")
|
|
289
|
+
*/
|
|
290
|
+
fnImpl.dependency = () => {
|
|
291
|
+
return (key) => {
|
|
292
|
+
return new Dependency(key);
|
|
293
|
+
};
|
|
294
|
+
};
|
|
295
|
+
/**
|
|
296
|
+
* Declare a dependency requirement
|
|
297
|
+
* Example: const logger = yield* fn.require(LoggerService)
|
|
298
|
+
*/
|
|
299
|
+
fnImpl.require = (dep) => {
|
|
300
|
+
return new DependencyDeclaration(dep.key);
|
|
301
|
+
};
|
|
302
|
+
export const fn = fnImpl;
|
|
303
|
+
//# sourceMappingURL=di.js.map
|
package/dist/di.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"di.js","sourceRoot":"","sources":["../src/di.ts"],"names":[],"mappings":"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"}
|