@cosystem/core 0.0.0 → 0.0.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/dist/index.d.mts +29 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +220 -41
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -30,16 +30,16 @@ declare class InjectContextError extends CosystemError {
|
|
|
30
30
|
}
|
|
31
31
|
//#endregion
|
|
32
32
|
//#region src/types.d.ts
|
|
33
|
-
interface Token<_T =
|
|
33
|
+
interface Token<_T = any> {
|
|
34
34
|
readonly id: symbol;
|
|
35
35
|
readonly description?: string;
|
|
36
|
-
readonly __type?: _T;
|
|
36
|
+
readonly __type?: (value: _T) => _T;
|
|
37
37
|
}
|
|
38
38
|
type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
39
|
-
type ClassToken<T =
|
|
40
|
-
type InjectionToken<T =
|
|
39
|
+
type ClassToken<T = any> = abstract new (...args: any[]) => T;
|
|
40
|
+
type InjectionToken<T = any> = Token<T> | ClassToken<T> | string | symbol;
|
|
41
41
|
type TokenValue<TToken> = TToken extends InjectionToken<infer TValue> ? TValue : unknown;
|
|
42
|
-
type DependencySpec<T =
|
|
42
|
+
type DependencySpec<T = any> = InjectionToken<T> | {
|
|
43
43
|
readonly token: InjectionToken<T>;
|
|
44
44
|
readonly optional?: boolean;
|
|
45
45
|
readonly many?: boolean;
|
|
@@ -172,7 +172,6 @@ interface AppScope {
|
|
|
172
172
|
readonly container: Container;
|
|
173
173
|
}
|
|
174
174
|
interface App {
|
|
175
|
-
readonly container: Container;
|
|
176
175
|
readonly state: AppState;
|
|
177
176
|
readonly started: boolean;
|
|
178
177
|
readonly store: Store<RootState>;
|
|
@@ -197,6 +196,7 @@ interface Plugin {
|
|
|
197
196
|
onModuleCreated?(event: ModuleCreatedEvent): void;
|
|
198
197
|
onActionStart?(event: ActionEvent): void;
|
|
199
198
|
onActionEnd?(event: ActionEvent): void;
|
|
199
|
+
onPatch?(event: PatchEvent): void;
|
|
200
200
|
onStateChange?(event: StateChangeEvent): void;
|
|
201
201
|
onError?(error: unknown, context: ErrorContext): void;
|
|
202
202
|
dispose?(): void | Promise<void>;
|
|
@@ -217,6 +217,10 @@ interface ActionEvent {
|
|
|
217
217
|
interface StateChangeEvent {
|
|
218
218
|
readonly state: unknown;
|
|
219
219
|
}
|
|
220
|
+
interface PatchEvent {
|
|
221
|
+
readonly patches: readonly unknown[];
|
|
222
|
+
readonly inversePatches: readonly unknown[];
|
|
223
|
+
}
|
|
220
224
|
interface ErrorContext {
|
|
221
225
|
readonly phase: string;
|
|
222
226
|
}
|
|
@@ -231,6 +235,7 @@ interface TestAppInspector {
|
|
|
231
235
|
interface MutableTestInspector extends TestAppInspector {
|
|
232
236
|
recordAction(event: ActionEvent): void;
|
|
233
237
|
recordPatch(patch: unknown): void;
|
|
238
|
+
recordState(state: unknown): void;
|
|
234
239
|
}
|
|
235
240
|
type RootState = Record<string, Record<PropertyKey, unknown>>;
|
|
236
241
|
declare function createApp(options?: CreateAppOptions): App;
|
|
@@ -256,11 +261,14 @@ interface ModuleMetadata {
|
|
|
256
261
|
readonly actions: Set<PropertyKey>;
|
|
257
262
|
readonly computed: Set<PropertyKey>;
|
|
258
263
|
}
|
|
259
|
-
|
|
264
|
+
interface MetadataContext {
|
|
265
|
+
readonly metadata?: Record<PropertyKey, unknown> | undefined;
|
|
266
|
+
}
|
|
267
|
+
declare function defineModule<T extends Constructor>(target: T, options?: DefineModuleOptions, context?: MetadataContext): T;
|
|
260
268
|
declare function getModuleMetadata(target: Function): ModuleMetadata | undefined;
|
|
261
269
|
//#endregion
|
|
262
270
|
//#region src/decorators.d.ts
|
|
263
|
-
declare function module(options?: ModuleOptions): <T extends Constructor>(target: T,
|
|
271
|
+
declare function module(options?: ModuleOptions): <T extends Constructor>(target: T, context?: ClassDecoratorContext<T>) => T;
|
|
264
272
|
declare function state<This extends object, Value>(_value: ClassAccessorDecoratorTarget<This, Value>, context: ClassAccessorDecoratorContext<This, Value>): void;
|
|
265
273
|
declare function action<This extends object, Args extends unknown[], Return>(_value: (this: This, ...args: Args) => Return, context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>): void;
|
|
266
274
|
declare function computed<This extends object, Value>(_value: (this: This) => Value, context: ClassGetterDecoratorContext<This, Value>): void;
|
|
@@ -268,6 +276,16 @@ declare function computed<This extends object, Value>(_value: (this: This) => Va
|
|
|
268
276
|
//#region src/inject.d.ts
|
|
269
277
|
declare function inject<TToken extends InjectionToken>(token: TToken): TokenValue<TToken>;
|
|
270
278
|
//#endregion
|
|
279
|
+
//#region src/loggerPlugin.d.ts
|
|
280
|
+
interface LoggerPluginLogger {
|
|
281
|
+
info(message: string, details?: unknown): void;
|
|
282
|
+
error(message: string, details?: unknown): void;
|
|
283
|
+
}
|
|
284
|
+
interface LoggerPluginOptions {
|
|
285
|
+
readonly logger?: LoggerPluginLogger;
|
|
286
|
+
}
|
|
287
|
+
declare function createLoggerPlugin(options?: LoggerPluginOptions): Plugin;
|
|
288
|
+
//#endregion
|
|
271
289
|
//#region src/provider.d.ts
|
|
272
290
|
declare function provide<T>(token: InjectionToken<T>, options: ClassProvideOptions<T>): ClassProvider<T>;
|
|
273
291
|
declare function provide<T>(token: InjectionToken<T>, options: ValueProvideOptions<T>): ValueProvider<T>;
|
|
@@ -319,6 +337,8 @@ interface WorkerResultMessage {
|
|
|
319
337
|
interface WorkerStateMessage {
|
|
320
338
|
readonly type: "state";
|
|
321
339
|
readonly state: unknown;
|
|
340
|
+
readonly patches?: readonly unknown[];
|
|
341
|
+
readonly sync: "patch" | "snapshot";
|
|
322
342
|
readonly version: number;
|
|
323
343
|
}
|
|
324
344
|
interface WorkerReadyMessage {
|
|
@@ -354,5 +374,5 @@ declare function createWorkerApp(options: CreateWorkerAppOptions): WorkerAppHost
|
|
|
354
374
|
declare function createWorkerClient(options: CreateWorkerClientOptions): WorkerClient;
|
|
355
375
|
declare function createMemoryWorkerTransportPair(): readonly [WorkerTransport, WorkerTransport];
|
|
356
376
|
//#endregion
|
|
357
|
-
export { type ActionEvent, AmbiguousProviderError, type App, type AppDevOptions, type AppScope, type AppState, type AsyncMethodProxy, AsyncProviderInSyncResolutionError, type AutoStartedTestAppOptions, type BuildOptions, CircularDependencyError, type ClassProvideOptions, type ClassProvider, type ClassToken, type Constructor, type Container, type ContainerOptions, CosystemError, type CreateAppOptions, type CreateWorkerAppOptions, type CreateWorkerClientOptions, type DefineModuleOptions, type DependencySpec, type DependencyValue, DuplicateProviderError, type EngineOptions, type ErrorContext, type ExistingProvideOptions, type ExistingProvider, type FactoryProvideOptions, type FactoryProvider, FrozenContainerError, InjectContextError, type InjectionToken, LifetimeLeakError, type ManualTestAppOptions, MissingProviderError, type ModuleCreatedEvent, type ModuleMetadata, type ModuleOptions, type Plugin, type Provider, type ProviderInput, type ResolvedDeps as ResolvedDependencyTuple, type ResolvedDeps, type Scope, type ScopeOptions, type SerializedWorkerError, type StateChangeEvent, type TestApp, type TestAppInspector, type TestAppOptions, type Token, type TokenValue, type ValueProvideOptions, type ValueProvider, type WatchOptions, type WorkerAppHost, type WorkerClient, type WorkerMessage, type WorkerStateMessage, type WorkerTransport, action, computed, createApp, createContainer, createMemoryWorkerTransportPair, createWorkerApp, createWorkerClient, defineModule, getModuleMetadata, inject, module, provide, state, testApp, token, tokenName };
|
|
377
|
+
export { type ActionEvent, AmbiguousProviderError, type App, type AppDevOptions, type AppScope, type AppState, type AsyncMethodProxy, AsyncProviderInSyncResolutionError, type AutoStartedTestAppOptions, type BuildOptions, CircularDependencyError, type ClassProvideOptions, type ClassProvider, type ClassToken, type Constructor, type Container, type ContainerOptions, CosystemError, type CreateAppOptions, type CreateWorkerAppOptions, type CreateWorkerClientOptions, type DefineModuleOptions, type DependencySpec, type DependencyValue, DuplicateProviderError, type EngineOptions, type ErrorContext, type ExistingProvideOptions, type ExistingProvider, type FactoryProvideOptions, type FactoryProvider, FrozenContainerError, InjectContextError, type InjectionToken, LifetimeLeakError, type LoggerPluginLogger, type LoggerPluginOptions, type ManualTestAppOptions, MissingProviderError, type ModuleCreatedEvent, type ModuleMetadata, type ModuleOptions, type PatchEvent, type Plugin, type Provider, type ProviderInput, type ResolvedDeps as ResolvedDependencyTuple, type ResolvedDeps, type Scope, type ScopeOptions, type SerializedWorkerError, type StateChangeEvent, type TestApp, type TestAppInspector, type TestAppOptions, type Token, type TokenValue, type ValueProvideOptions, type ValueProvider, type WatchOptions, type WorkerAppHost, type WorkerClient, type WorkerMessage, type WorkerStateMessage, type WorkerTransport, action, computed, createApp, createContainer, createLoggerPlugin, createMemoryWorkerTransportPair, createWorkerApp, createWorkerClient, defineModule, getModuleMetadata, inject, module, provide, state, testApp, token, tokenName };
|
|
358
378
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/container.ts","../src/app.ts","../src/metadata.ts","../src/decorators.ts","../src/inject.ts","../src/provider.ts","../src/testApp.ts","../src/token.ts","../src/worker.ts"],"mappings":";;;cAAa,aAAA,SAAsB,KAAA;EACjC,WAAA,CAAY,OAAA;AAAA;AAAA,cAMD,oBAAA,SAA6B,aAAA;EACxC,WAAA;AAAA;AAAA,cAMW,oBAAA,SAA6B,aAAA;EACxC,WAAA,CAAY,KAAA,UAAe,IAAA;AAAA;AAAA,cAchB,sBAAA,SAA+B,aAAA;EAC1C,WAAA,CAAY,KAAA;AAAA;AAAA,cAMD,sBAAA,SAA+B,aAAA;EAC1C,WAAA,CAAY,KAAA;AAAA;AAAA,cAMD,uBAAA,SAAgC,aAAA;EAC3C,WAAA,CAAY,IAAA;AAAA;AAAA,cAMD,kCAAA,SAA2C,aAAA;EACtD,WAAA,CAAY,KAAA;AAAA;AAAA,cAMD,iBAAA,SAA0B,aAAA;EACrC,WAAA,CAAY,MAAA,UAAgB,WAAA,UAAqB,KAAA,UAAe,UAAA;AAAA;AAAA,cAMrD,kBAAA,SAA2B,aAAA;EACtC,WAAA,CAAY,KAAA;AAAA;;;UCjEG,KAAA;EAAA,SACN,EAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/container.ts","../src/app.ts","../src/metadata.ts","../src/decorators.ts","../src/inject.ts","../src/loggerPlugin.ts","../src/provider.ts","../src/testApp.ts","../src/token.ts","../src/worker.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -348,13 +348,18 @@ var RuntimeContainer = class RuntimeContainer {
|
|
|
348
348
|
const records = this.getAllRecords(dep.token);
|
|
349
349
|
return this.resolveAllRecords(records, context);
|
|
350
350
|
}
|
|
351
|
-
const record = dep.optional === true ? this.getSingleRecord(dep.token, true) : this.
|
|
351
|
+
const record = dep.optional === true ? this.getSingleRecord(dep.token, true) : this.getRequiredRecord(dep.token, context);
|
|
352
352
|
if (record === void 0) return;
|
|
353
353
|
return this.resolveRecord(record, context);
|
|
354
354
|
}
|
|
355
|
-
const record = this.
|
|
355
|
+
const record = this.getRequiredRecord(dep, context);
|
|
356
356
|
return this.resolveRecord(record, context);
|
|
357
357
|
}
|
|
358
|
+
getRequiredRecord(token, context) {
|
|
359
|
+
const record = this.getSingleRecord(token, true);
|
|
360
|
+
if (record === void 0) throw new MissingProviderError(tokenName(token), context.stack.map((entry) => entry.tokenName));
|
|
361
|
+
return record;
|
|
362
|
+
}
|
|
358
363
|
resolveAllRecords(records, context) {
|
|
359
364
|
const values = records.map((record) => this.resolveRecord(record, context));
|
|
360
365
|
if (values.some(isPromiseLike)) return Promise.all(values);
|
|
@@ -439,16 +444,25 @@ async function disposeValue(value, record) {
|
|
|
439
444
|
//#endregion
|
|
440
445
|
//#region src/metadata.ts
|
|
441
446
|
const moduleMetadata = /* @__PURE__ */ new WeakMap();
|
|
442
|
-
|
|
447
|
+
const moduleMetadataKey = Symbol.for("@cosystem/core/moduleMetadata");
|
|
448
|
+
const symbolMetadataKey = Symbol.metadata;
|
|
449
|
+
function defineModule(target, options = {}, context) {
|
|
443
450
|
const metadata = ensureModuleMetadata(target);
|
|
451
|
+
mergeModuleMetadata(metadata, readContextMetadata(context));
|
|
444
452
|
applyModuleOptions(metadata, options);
|
|
445
453
|
addProperties(metadata.state, options.state);
|
|
446
454
|
addProperties(metadata.actions, options.actions);
|
|
455
|
+
writeContextMetadata(context, metadata);
|
|
447
456
|
addProperties(metadata.computed, options.computed);
|
|
448
457
|
return target;
|
|
449
458
|
}
|
|
450
459
|
function getModuleMetadata(target) {
|
|
451
|
-
|
|
460
|
+
const existing = moduleMetadata.get(target);
|
|
461
|
+
if (existing !== void 0) return existing;
|
|
462
|
+
const metadata = readSymbolMetadata(target);
|
|
463
|
+
if (metadata === void 0) return;
|
|
464
|
+
moduleMetadata.set(target, metadata);
|
|
465
|
+
return metadata;
|
|
452
466
|
}
|
|
453
467
|
function addModuleState(target, property) {
|
|
454
468
|
ensureModuleMetadata(target).state.add(property);
|
|
@@ -476,16 +490,59 @@ function ensureModuleMetadata(target) {
|
|
|
476
490
|
moduleMetadata.set(target, metadata);
|
|
477
491
|
return metadata;
|
|
478
492
|
}
|
|
493
|
+
function ensureContextModuleMetadata(context) {
|
|
494
|
+
if (context?.metadata === void 0) return;
|
|
495
|
+
const existing = readContextMetadata(context);
|
|
496
|
+
if (existing !== void 0) return existing;
|
|
497
|
+
const metadata = createModuleMetadata();
|
|
498
|
+
writeContextMetadata(context, metadata);
|
|
499
|
+
return metadata;
|
|
500
|
+
}
|
|
479
501
|
function addProperties(target, properties) {
|
|
480
502
|
for (const property of properties ?? []) target.add(property);
|
|
481
503
|
}
|
|
504
|
+
function createModuleMetadata() {
|
|
505
|
+
return {
|
|
506
|
+
kind: "module",
|
|
507
|
+
state: /* @__PURE__ */ new Set(),
|
|
508
|
+
actions: /* @__PURE__ */ new Set(),
|
|
509
|
+
computed: /* @__PURE__ */ new Set()
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
function readContextMetadata(context) {
|
|
513
|
+
const value = context?.metadata?.[moduleMetadataKey];
|
|
514
|
+
return isModuleMetadata(value) ? value : void 0;
|
|
515
|
+
}
|
|
516
|
+
function writeContextMetadata(context, metadata) {
|
|
517
|
+
if (context?.metadata === void 0) return;
|
|
518
|
+
context.metadata[moduleMetadataKey] = metadata;
|
|
519
|
+
}
|
|
520
|
+
function readSymbolMetadata(target) {
|
|
521
|
+
if (symbolMetadataKey === void 0) return;
|
|
522
|
+
const metadata = target[symbolMetadataKey];
|
|
523
|
+
if (metadata === void 0 || metadata === null || typeof metadata !== "object") return;
|
|
524
|
+
const value = metadata[moduleMetadataKey];
|
|
525
|
+
return isModuleMetadata(value) ? value : void 0;
|
|
526
|
+
}
|
|
527
|
+
function mergeModuleMetadata(target, source) {
|
|
528
|
+
if (source === void 0 || source === target) return;
|
|
529
|
+
applyModuleOptions(target, source);
|
|
530
|
+
addProperties(target.state, [...source.state]);
|
|
531
|
+
addProperties(target.actions, [...source.actions]);
|
|
532
|
+
addProperties(target.computed, [...source.computed]);
|
|
533
|
+
}
|
|
534
|
+
function isModuleMetadata(value) {
|
|
535
|
+
return typeof value === "object" && value !== null && value.kind === "module" && value instanceof Object && value.state instanceof Set && value.actions instanceof Set && value.computed instanceof Set;
|
|
536
|
+
}
|
|
482
537
|
//#endregion
|
|
483
538
|
//#region src/app.ts
|
|
539
|
+
const runtimeModuleMetadataKey = Symbol.for("@cosystem/core/runtimeModule");
|
|
540
|
+
const appContainerMap = /* @__PURE__ */ new WeakMap();
|
|
484
541
|
function createApp(options = {}) {
|
|
485
542
|
return createAppInternal(options);
|
|
486
543
|
}
|
|
487
544
|
function createAppInternal(options = {}) {
|
|
488
|
-
const parent = isApp(options.parent) ? options.parent
|
|
545
|
+
const parent = isApp(options.parent) ? getAppContainer(options.parent) : options.parent;
|
|
489
546
|
const container = parent === void 0 ? createContainer() : createContainer({ parent });
|
|
490
547
|
const moduleTokens = [];
|
|
491
548
|
for (const provider of options.providers ?? []) {
|
|
@@ -496,10 +553,7 @@ function createAppInternal(options = {}) {
|
|
|
496
553
|
for (const override of options.overrides ?? []) container.override(normalizeAppProvider(override).provider);
|
|
497
554
|
container.freeze();
|
|
498
555
|
const modules = instantiateModules(container, moduleTokens);
|
|
499
|
-
const store = create(createRootState(modules),
|
|
500
|
-
name: "cosystem",
|
|
501
|
-
sliceMode: "single"
|
|
502
|
-
});
|
|
556
|
+
const store = create(createRootState(modules), createStoreOptions(options.engine, shouldEnablePatches(options)));
|
|
503
557
|
const app = new RuntimeApp({
|
|
504
558
|
container,
|
|
505
559
|
devOptions: options.devOptions ?? {},
|
|
@@ -510,14 +564,16 @@ function createAppInternal(options = {}) {
|
|
|
510
564
|
...options.testInspector === void 0 ? {} : { testInspector: options.testInspector }
|
|
511
565
|
});
|
|
512
566
|
app.bindModules();
|
|
567
|
+
app.attachRuntimeMetadata();
|
|
513
568
|
app.runModuleCreatedHooks();
|
|
514
569
|
app.init();
|
|
570
|
+
appContainerMap.set(app, container);
|
|
515
571
|
return app;
|
|
516
572
|
}
|
|
517
573
|
var RuntimeApp = class {
|
|
518
|
-
container;
|
|
519
574
|
state;
|
|
520
575
|
store;
|
|
576
|
+
#container;
|
|
521
577
|
devOptions;
|
|
522
578
|
modules;
|
|
523
579
|
moduleByToken = /* @__PURE__ */ new Map();
|
|
@@ -528,7 +584,7 @@ var RuntimeApp = class {
|
|
|
528
584
|
isStarted = false;
|
|
529
585
|
isDisposed = false;
|
|
530
586
|
constructor(options) {
|
|
531
|
-
this
|
|
587
|
+
this.#container = options.container;
|
|
532
588
|
this.devOptions = options.devOptions;
|
|
533
589
|
this.modules = options.modules;
|
|
534
590
|
this.plugins = options.plugins;
|
|
@@ -539,10 +595,11 @@ var RuntimeApp = class {
|
|
|
539
595
|
this.moduleByToken.set(moduleBinding.token, moduleBinding);
|
|
540
596
|
this.moduleByName.set(moduleBinding.name, moduleBinding);
|
|
541
597
|
}
|
|
598
|
+
this.wrapStoreSetState();
|
|
542
599
|
this.store.subscribe(() => {
|
|
543
600
|
this.state.version += 1;
|
|
544
601
|
const state = this.store.getPureState();
|
|
545
|
-
this.testInspector?.
|
|
602
|
+
this.testInspector?.recordState(state);
|
|
546
603
|
this.emitStateChange({ state });
|
|
547
604
|
});
|
|
548
605
|
}
|
|
@@ -550,13 +607,13 @@ var RuntimeApp = class {
|
|
|
550
607
|
return this.isStarted;
|
|
551
608
|
}
|
|
552
609
|
get(token) {
|
|
553
|
-
return this
|
|
610
|
+
return this.#container.get(token);
|
|
554
611
|
}
|
|
555
612
|
getAsync(token) {
|
|
556
|
-
return this
|
|
613
|
+
return this.#container.getAsync(token);
|
|
557
614
|
}
|
|
558
615
|
getAll(token) {
|
|
559
|
-
return this
|
|
616
|
+
return this.#container.getAll(token);
|
|
560
617
|
}
|
|
561
618
|
getModule(token) {
|
|
562
619
|
const value = this.get(token);
|
|
@@ -591,25 +648,40 @@ var RuntimeApp = class {
|
|
|
591
648
|
async start() {
|
|
592
649
|
if (this.isStarted) return;
|
|
593
650
|
await this.initPromise;
|
|
594
|
-
|
|
595
|
-
|
|
651
|
+
try {
|
|
652
|
+
await this.runLifecycle("onStart");
|
|
653
|
+
this.isStarted = true;
|
|
654
|
+
} catch (error) {
|
|
655
|
+
this.emitError(error, { phase: "start" });
|
|
656
|
+
throw error;
|
|
657
|
+
}
|
|
596
658
|
}
|
|
597
659
|
async stop() {
|
|
598
660
|
if (!this.isStarted) return;
|
|
599
|
-
|
|
600
|
-
|
|
661
|
+
try {
|
|
662
|
+
await this.runLifecycle("onStop", true);
|
|
663
|
+
this.isStarted = false;
|
|
664
|
+
} catch (error) {
|
|
665
|
+
this.emitError(error, { phase: "stop" });
|
|
666
|
+
throw error;
|
|
667
|
+
}
|
|
601
668
|
}
|
|
602
669
|
async dispose() {
|
|
603
670
|
if (this.isDisposed) return;
|
|
604
671
|
await this.stop();
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
672
|
+
try {
|
|
673
|
+
await this.runLifecycle("onDispose", true);
|
|
674
|
+
await Promise.all(this.plugins.map((plugin) => plugin.dispose?.()));
|
|
675
|
+
await this.#container.dispose();
|
|
676
|
+
this.store.destroy();
|
|
677
|
+
this.isDisposed = true;
|
|
678
|
+
} catch (error) {
|
|
679
|
+
this.emitError(error, { phase: "dispose" });
|
|
680
|
+
throw error;
|
|
681
|
+
}
|
|
610
682
|
}
|
|
611
683
|
createScope(options) {
|
|
612
|
-
return { container: this
|
|
684
|
+
return { container: this.#container.createScope(options) };
|
|
613
685
|
}
|
|
614
686
|
bindModules() {
|
|
615
687
|
for (const moduleBinding of this.modules) {
|
|
@@ -618,6 +690,17 @@ var RuntimeApp = class {
|
|
|
618
690
|
this.bindActions(moduleBinding);
|
|
619
691
|
}
|
|
620
692
|
}
|
|
693
|
+
attachRuntimeMetadata() {
|
|
694
|
+
for (const moduleBinding of this.modules) Object.defineProperty(moduleBinding.instance, runtimeModuleMetadataKey, {
|
|
695
|
+
configurable: false,
|
|
696
|
+
enumerable: false,
|
|
697
|
+
value: {
|
|
698
|
+
app: this,
|
|
699
|
+
name: moduleBinding.name,
|
|
700
|
+
token: moduleBinding.token
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
}
|
|
621
704
|
runModuleCreatedHooks() {
|
|
622
705
|
for (const moduleBinding of this.modules) {
|
|
623
706
|
const event = {
|
|
@@ -630,8 +713,13 @@ var RuntimeApp = class {
|
|
|
630
713
|
}
|
|
631
714
|
init() {
|
|
632
715
|
this.initPromise = (async () => {
|
|
633
|
-
|
|
634
|
-
|
|
716
|
+
try {
|
|
717
|
+
await Promise.all(this.plugins.map((plugin) => this.runWithAppInjectContext(() => plugin.setup?.(this))));
|
|
718
|
+
await this.runLifecycle("onInit");
|
|
719
|
+
} catch (error) {
|
|
720
|
+
this.emitError(error, { phase: "init" });
|
|
721
|
+
throw error;
|
|
722
|
+
}
|
|
635
723
|
})();
|
|
636
724
|
}
|
|
637
725
|
bindState(moduleBinding) {
|
|
@@ -703,6 +791,7 @@ var RuntimeApp = class {
|
|
|
703
791
|
});
|
|
704
792
|
} catch (caught) {
|
|
705
793
|
error = caught;
|
|
794
|
+
this.emitError(caught, { phase: "action" });
|
|
706
795
|
} finally {
|
|
707
796
|
moduleBinding.actionDepth -= 1;
|
|
708
797
|
}
|
|
@@ -718,7 +807,10 @@ var RuntimeApp = class {
|
|
|
718
807
|
}
|
|
719
808
|
async runLifecycle(method, reverse = false) {
|
|
720
809
|
const modules = reverse ? this.modules.toReversed() : this.modules;
|
|
721
|
-
for (const moduleBinding of modules)
|
|
810
|
+
for (const moduleBinding of modules) {
|
|
811
|
+
const lifecycle = moduleBinding.instance;
|
|
812
|
+
await this.runWithAppInjectContext(() => lifecycle[method]?.());
|
|
813
|
+
}
|
|
722
814
|
}
|
|
723
815
|
emitActionStart(event) {
|
|
724
816
|
for (const plugin of this.plugins) plugin.onActionStart?.(event);
|
|
@@ -729,6 +821,38 @@ var RuntimeApp = class {
|
|
|
729
821
|
emitStateChange(event) {
|
|
730
822
|
for (const plugin of this.plugins) plugin.onStateChange?.(event);
|
|
731
823
|
}
|
|
824
|
+
emitPatch(event) {
|
|
825
|
+
for (const plugin of this.plugins) plugin.onPatch?.(event);
|
|
826
|
+
}
|
|
827
|
+
emitError(error, context) {
|
|
828
|
+
for (const plugin of this.plugins) plugin.onError?.(error, context);
|
|
829
|
+
}
|
|
830
|
+
runWithAppInjectContext(callback) {
|
|
831
|
+
return runWithInjectContext({
|
|
832
|
+
mode: "sync",
|
|
833
|
+
requestContainer: this.#container,
|
|
834
|
+
resolutionCache: /* @__PURE__ */ new Map(),
|
|
835
|
+
stack: []
|
|
836
|
+
}, callback);
|
|
837
|
+
}
|
|
838
|
+
wrapStoreSetState() {
|
|
839
|
+
const originalSetState = this.store.setState.bind(this.store);
|
|
840
|
+
this.store.setState = ((...args) => {
|
|
841
|
+
const result = originalSetState(...args);
|
|
842
|
+
this.recordMutationResult(result);
|
|
843
|
+
return result;
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
recordMutationResult(result) {
|
|
847
|
+
if (!Array.isArray(result) || result.length < 3) return;
|
|
848
|
+
const patches = result[1];
|
|
849
|
+
if (patches.length === 0) return;
|
|
850
|
+
this.testInspector?.recordPatch(patches);
|
|
851
|
+
this.emitPatch({
|
|
852
|
+
inversePatches: result[2],
|
|
853
|
+
patches
|
|
854
|
+
});
|
|
855
|
+
}
|
|
732
856
|
};
|
|
733
857
|
function normalizeAppProvider(provider) {
|
|
734
858
|
if (typeof provider === "function") {
|
|
@@ -751,6 +875,18 @@ function normalizeAppProvider(provider) {
|
|
|
751
875
|
}
|
|
752
876
|
return { provider };
|
|
753
877
|
}
|
|
878
|
+
function createStoreOptions(engine, enablePatches) {
|
|
879
|
+
return {
|
|
880
|
+
name: "cosystem",
|
|
881
|
+
sliceMode: "single",
|
|
882
|
+
enablePatches,
|
|
883
|
+
...engine?.transport === void 0 ? {} : { transport: engine.transport }
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
function shouldEnablePatches(options) {
|
|
887
|
+
if (options.engine?.patches !== void 0) return options.engine.patches;
|
|
888
|
+
return options.testInspector !== void 0 || (options.plugins ?? []).some((plugin) => plugin.onPatch !== void 0);
|
|
889
|
+
}
|
|
754
890
|
function createModuleClassProviderOptions(useClass, metadata) {
|
|
755
891
|
return {
|
|
756
892
|
useClass,
|
|
@@ -819,33 +955,62 @@ function getDescriptor(instance, property) {
|
|
|
819
955
|
function isApp(value) {
|
|
820
956
|
return typeof value === "object" && value !== null && "get" in value && "start" in value && "dispose" in value;
|
|
821
957
|
}
|
|
958
|
+
function getAppContainer(app) {
|
|
959
|
+
const container = appContainerMap.get(app);
|
|
960
|
+
if (container === void 0) throw new CosystemError("Parent app was not created by CoSystem.");
|
|
961
|
+
return container;
|
|
962
|
+
}
|
|
822
963
|
//#endregion
|
|
823
964
|
//#region src/decorators.ts
|
|
824
965
|
function module(options = {}) {
|
|
825
|
-
return function moduleDecorator(target,
|
|
826
|
-
defineModule(target, options);
|
|
966
|
+
return function moduleDecorator(target, context) {
|
|
967
|
+
defineModule(target, options, context);
|
|
827
968
|
return target;
|
|
828
969
|
};
|
|
829
970
|
}
|
|
830
971
|
function state(_value, context) {
|
|
831
972
|
if (context.kind !== "accessor") throw new TypeError("@state only supports standard accessor decorators.");
|
|
973
|
+
ensureContextModuleMetadata(context)?.state.add(context.name);
|
|
832
974
|
context.addInitializer(function initializeState() {
|
|
833
975
|
addModuleState(this.constructor, context.name);
|
|
834
976
|
});
|
|
835
977
|
}
|
|
836
978
|
function action(_value, context) {
|
|
837
979
|
if (context.kind !== "method") throw new TypeError("@action only supports method decorators.");
|
|
980
|
+
ensureContextModuleMetadata(context)?.actions.add(context.name);
|
|
838
981
|
context.addInitializer(function initializeAction() {
|
|
839
982
|
addModuleAction(this.constructor, context.name);
|
|
840
983
|
});
|
|
841
984
|
}
|
|
842
985
|
function computed(_value, context) {
|
|
843
986
|
if (context.kind !== "getter") throw new TypeError("@computed only supports getter decorators.");
|
|
987
|
+
ensureContextModuleMetadata(context)?.computed.add(context.name);
|
|
844
988
|
context.addInitializer(function initializeComputed() {
|
|
845
989
|
addModuleComputed(this.constructor, context.name);
|
|
846
990
|
});
|
|
847
991
|
}
|
|
848
992
|
//#endregion
|
|
993
|
+
//#region src/loggerPlugin.ts
|
|
994
|
+
function createLoggerPlugin(options = {}) {
|
|
995
|
+
const logger = options.logger ?? console;
|
|
996
|
+
return {
|
|
997
|
+
name: "cosystem:logger",
|
|
998
|
+
onActionEnd(event) {
|
|
999
|
+
if (event.error !== void 0) {
|
|
1000
|
+
logger.error(`Action failed: ${event.module}.${event.method}`, event);
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
logger.info(`Action completed: ${event.module}.${event.method}`, event);
|
|
1004
|
+
},
|
|
1005
|
+
onError(error, context) {
|
|
1006
|
+
logger.error(`Runtime error during ${context.phase}`, error);
|
|
1007
|
+
},
|
|
1008
|
+
onModuleCreated(event) {
|
|
1009
|
+
logger.info(`Module created: ${event.name}`, event);
|
|
1010
|
+
}
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
//#endregion
|
|
849
1014
|
//#region src/testApp.ts
|
|
850
1015
|
function testApp(options = {}) {
|
|
851
1016
|
const inspector = createTestInspector();
|
|
@@ -894,8 +1059,10 @@ function createTestInspector() {
|
|
|
894
1059
|
actions.push(event);
|
|
895
1060
|
},
|
|
896
1061
|
recordPatch(patch) {
|
|
897
|
-
lastState = patch;
|
|
898
1062
|
patches.push(patch);
|
|
1063
|
+
},
|
|
1064
|
+
recordState(state) {
|
|
1065
|
+
lastState = state;
|
|
899
1066
|
}
|
|
900
1067
|
};
|
|
901
1068
|
}
|
|
@@ -903,21 +1070,30 @@ function createTestInspector() {
|
|
|
903
1070
|
//#region src/worker.ts
|
|
904
1071
|
function createWorkerApp(options) {
|
|
905
1072
|
const { transport, ...appOptions } = options;
|
|
906
|
-
const
|
|
1073
|
+
const patchPlugin = {
|
|
1074
|
+
name: "cosystem:worker-patches",
|
|
1075
|
+
onPatch(event) {
|
|
1076
|
+
publishState(app, transport, event.patches);
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
const app = createApp({
|
|
1080
|
+
...appOptions,
|
|
1081
|
+
engine: {
|
|
1082
|
+
...appOptions.engine,
|
|
1083
|
+
patches: true
|
|
1084
|
+
},
|
|
1085
|
+
plugins: [...appOptions.plugins ?? [], patchPlugin]
|
|
1086
|
+
});
|
|
907
1087
|
const unsubscribeTransport = transport.subscribe((message) => {
|
|
908
1088
|
if (message.type !== "call") return;
|
|
909
1089
|
handleCall(app, transport, message);
|
|
910
1090
|
});
|
|
911
|
-
const unsubscribeStore = app.store.subscribe(() => {
|
|
912
|
-
publishState(app, transport);
|
|
913
|
-
});
|
|
914
1091
|
transport.post({ type: "ready" });
|
|
915
1092
|
publishState(app, transport);
|
|
916
1093
|
return {
|
|
917
1094
|
app,
|
|
918
1095
|
async dispose() {
|
|
919
1096
|
unsubscribeTransport();
|
|
920
|
-
unsubscribeStore();
|
|
921
1097
|
await app.dispose();
|
|
922
1098
|
}
|
|
923
1099
|
};
|
|
@@ -1013,12 +1189,15 @@ async function handleCall(app, transport, message) {
|
|
|
1013
1189
|
});
|
|
1014
1190
|
}
|
|
1015
1191
|
}
|
|
1016
|
-
function publishState(app, transport) {
|
|
1017
|
-
|
|
1192
|
+
function publishState(app, transport, patches = []) {
|
|
1193
|
+
const message = {
|
|
1018
1194
|
state: app.store.getPureState(),
|
|
1195
|
+
sync: patches.length > 0 ? "patch" : "snapshot",
|
|
1019
1196
|
type: "state",
|
|
1020
|
-
version: app.state.version
|
|
1021
|
-
|
|
1197
|
+
version: app.state.version,
|
|
1198
|
+
...patches.length === 0 ? {} : { patches }
|
|
1199
|
+
};
|
|
1200
|
+
transport.post(message);
|
|
1022
1201
|
}
|
|
1023
1202
|
function createMemoryWorkerTransport(inbox, outbox) {
|
|
1024
1203
|
return {
|
|
@@ -1051,6 +1230,6 @@ function createRemoteError(error) {
|
|
|
1051
1230
|
return remoteError;
|
|
1052
1231
|
}
|
|
1053
1232
|
//#endregion
|
|
1054
|
-
export { AmbiguousProviderError, AsyncProviderInSyncResolutionError, CircularDependencyError, CosystemError, DuplicateProviderError, FrozenContainerError, InjectContextError, LifetimeLeakError, MissingProviderError, action, computed, createApp, createContainer, createMemoryWorkerTransportPair, createWorkerApp, createWorkerClient, defineModule, getModuleMetadata, inject, module, provide, state, testApp, token, tokenName };
|
|
1233
|
+
export { AmbiguousProviderError, AsyncProviderInSyncResolutionError, CircularDependencyError, CosystemError, DuplicateProviderError, FrozenContainerError, InjectContextError, LifetimeLeakError, MissingProviderError, action, computed, createApp, createContainer, createLoggerPlugin, createMemoryWorkerTransportPair, createWorkerApp, createWorkerClient, defineModule, getModuleMetadata, inject, module, provide, state, testApp, token, tokenName };
|
|
1055
1234
|
|
|
1056
1235
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createCoactionStore"],"sources":["../src/errors.ts","../src/token.ts","../src/inject.ts","../src/provider.ts","../src/container.ts","../src/metadata.ts","../src/app.ts","../src/decorators.ts","../src/testApp.ts","../src/worker.ts"],"sourcesContent":["export class CosystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CosystemError\";\n }\n}\n\nexport class FrozenContainerError extends CosystemError {\n constructor() {\n super(\"Container provider graph is frozen and can no longer be mutated.\");\n this.name = \"FrozenContainerError\";\n }\n}\n\nexport class MissingProviderError extends CosystemError {\n constructor(token: string, path: readonly string[]) {\n super(\n [\n `Missing provider for ${token}.`,\n path.length > 0 ? \"Resolution path:\" : \"\",\n ...path.map((entry) => ` ${entry}`),\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n this.name = \"MissingProviderError\";\n }\n}\n\nexport class DuplicateProviderError extends CosystemError {\n constructor(token: string) {\n super(`Duplicate non-multi provider for ${token}. Use override() or mark providers as multi.`);\n this.name = \"DuplicateProviderError\";\n }\n}\n\nexport class AmbiguousProviderError extends CosystemError {\n constructor(token: string) {\n super(`Multiple providers registered for ${token}. Use getAll() instead of get().`);\n this.name = \"AmbiguousProviderError\";\n }\n}\n\nexport class CircularDependencyError extends CosystemError {\n constructor(path: readonly string[]) {\n super([\"Circular dependency detected:\", ...path.map((entry) => ` ${entry}`)].join(\"\\n\"));\n this.name = \"CircularDependencyError\";\n }\n}\n\nexport class AsyncProviderInSyncResolutionError extends CosystemError {\n constructor(token: string) {\n super(`Provider for ${token} resolved asynchronously. Use getAsync() instead of get().`);\n this.name = \"AsyncProviderInSyncResolutionError\";\n }\n}\n\nexport class LifetimeLeakError extends CosystemError {\n constructor(parent: string, parentScope: string, child: string, childScope: string) {\n super(`${parent} (${parentScope}) cannot depend on ${child} (${childScope}) without leakSafe.`);\n this.name = \"LifetimeLeakError\";\n }\n}\n\nexport class InjectContextError extends CosystemError {\n constructor(token: string) {\n super(`${token} can only be injected while resolving a provider or running an app hook.`);\n this.name = \"InjectContextError\";\n }\n}\n","import type { InjectionToken, Token } from \"./types.js\";\n\nexport function token<T>(description?: string): Token<T> {\n const id = Symbol(description);\n\n if (description === undefined) {\n return { id };\n }\n\n return { id, description };\n}\n\nexport function tokenName(tokenValue: InjectionToken): string {\n if (typeof tokenValue === \"string\") {\n return tokenValue;\n }\n\n if (typeof tokenValue === \"symbol\") {\n return tokenValue.description ?? tokenValue.toString();\n }\n\n if (typeof tokenValue === \"function\") {\n return tokenValue.name || \"<anonymous class>\";\n }\n\n return tokenValue.description ?? tokenValue.id.description ?? tokenValue.id.toString();\n}\n","import { InjectContextError } from \"./errors.js\";\nimport { tokenName } from \"./token.js\";\nimport type { InjectionToken, ResolutionContext, TokenValue } from \"./types.js\";\n\nlet activeResolutionContext: ResolutionContext | undefined;\n\nexport function inject<TToken extends InjectionToken>(token: TToken): TokenValue<TToken> {\n if (activeResolutionContext === undefined) {\n throw new InjectContextError(tokenName(token));\n }\n\n return activeResolutionContext.requestContainer.get(token) as TokenValue<TToken>;\n}\n\nexport function runWithInjectContext<T>(context: ResolutionContext, callback: () => T): T {\n const previousContext = activeResolutionContext;\n activeResolutionContext = context;\n\n try {\n return callback();\n } finally {\n activeResolutionContext = previousContext;\n }\n}\n","import type {\n ClassProvideOptions,\n ClassProvider,\n DependencySpec,\n ExistingProvideOptions,\n ExistingProvider,\n FactoryProvideOptions,\n FactoryProvider,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolvedDeps,\n ValueProvideOptions,\n ValueProvider,\n} from \"./types.js\";\nimport { tokenName } from \"./token.js\";\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ClassProvideOptions<T>,\n): ClassProvider<T>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ValueProvideOptions<T>,\n): ValueProvider<T>;\n\nexport function provide<T, const TDeps extends readonly DependencySpec[]>(\n token: InjectionToken<T>,\n options: FactoryProvideOptions<T, TDeps>,\n): FactoryProvider<T, TDeps>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ExistingProvideOptions<T>,\n): ExistingProvider<T>;\n\nexport function provide<T>(\n providerToken: InjectionToken<T>,\n options:\n | ClassProvideOptions<T>\n | ValueProvideOptions<T>\n | FactoryProvideOptions<T, readonly DependencySpec[]>\n | ExistingProvideOptions<T>,\n): ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T> {\n return {\n provide: providerToken,\n ...options,\n };\n}\n\nexport function normalizeProvider(input: ProviderInput): ProviderRecord {\n if (typeof input === \"function\") {\n return normalizeProvider({\n provide: input,\n useClass: input,\n });\n }\n\n const token = input.provide;\n const base = {\n token,\n tokenName: tokenName(token),\n multi: input.multi ?? false,\n leakSafe: input.leakSafe ?? false,\n };\n\n if (\"useClass\" in input) {\n return {\n ...base,\n provider: {\n kind: \"class\",\n useClass: input.useClass,\n },\n scope: input.scope ?? \"singleton\",\n deps:\n input.deps ??\n (input.useClass as { readonly inject?: readonly DependencySpec[] }).inject ??\n [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useValue\" in input) {\n return {\n ...base,\n provider: {\n kind: \"value\",\n useValue: input.useValue,\n },\n scope: \"singleton\",\n deps: [],\n eager: true,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useFactory\" in input) {\n return {\n ...base,\n provider: {\n kind: \"factory\",\n useFactory: input.useFactory as (...deps: readonly unknown[]) => unknown,\n },\n scope: input.scope ?? \"singleton\",\n deps: input.deps ?? [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n return {\n ...base,\n provider: {\n kind: \"existing\",\n useExisting: input.useExisting,\n },\n scope: \"singleton\",\n deps: [input.useExisting],\n eager: false,\n };\n}\n\nexport type { ResolvedDeps };\n\nfunction eraseDispose<T>(dispose: ((value: T) => void | Promise<void>) | undefined): {\n readonly dispose?: (value: unknown) => void | Promise<void>;\n} {\n if (dispose === undefined) {\n return {};\n }\n\n return {\n dispose: dispose as (value: unknown) => void | Promise<void>,\n };\n}\n","import {\n AmbiguousProviderError,\n AsyncProviderInSyncResolutionError,\n CircularDependencyError,\n DuplicateProviderError,\n FrozenContainerError,\n LifetimeLeakError,\n MissingProviderError,\n} from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport { normalizeProvider } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n BuildOptions,\n Constructor,\n Container,\n ContainerImpl,\n ContainerOptions,\n DependencySpec,\n DisposableInstance,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolutionContext,\n Scope,\n ScopeOptions,\n} from \"./types.js\";\n\nconst asyncDisposeSymbol: symbol | undefined = Symbol.asyncDispose;\nconst disposeSymbol: symbol | undefined = Symbol.dispose;\n\nexport function createContainer(options: ContainerOptions = {}): Container {\n return new RuntimeContainer(options);\n}\n\nclass RuntimeContainer implements ContainerImpl {\n readonly parent: ContainerImpl | undefined;\n readonly strictScopes: boolean;\n readonly records = new Map<InjectionToken, ProviderRecord[]>();\n readonly scopedCache = new Map<ProviderRecord, unknown>();\n readonly created: DisposableInstance[] = [];\n readonly root: ContainerImpl;\n readonly singletonCache = new Map<ProviderRecord, unknown>();\n frozen = false;\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent as ContainerImpl | undefined;\n this.strictScopes = options.strictScopes ?? this.parent?.strictScopes ?? true;\n this.root = this.parent?.root ?? this;\n }\n\n get<T>(token: InjectionToken<T>): T;\n get<T>(token: InjectionToken<T>, options: { readonly optional: true }): T | undefined;\n get<T>(token: InjectionToken<T>, options?: { readonly optional: true }): T | undefined {\n const record =\n options?.optional === true\n ? this.getSingleRecord(token, true)\n : this.getSingleRecord(token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n const context = this.createResolutionContext(\"sync\");\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n const records = this.getAllRecords(token);\n const context = this.createResolutionContext(\"sync\");\n\n return records.map((record) => {\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n });\n }\n\n async getAsync<T>(token: InjectionToken<T>): Promise<T> {\n const record = this.getSingleRecord(token, false);\n const context = this.createResolutionContext(\"async\");\n return (await this.resolveRecord(record, context)) as T;\n }\n\n has(token: InjectionToken): boolean {\n return this.findRecords(token).length > 0;\n }\n\n provide(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n\n if (!record.multi && existing.some((candidate) => !candidate.multi)) {\n throw new DuplicateProviderError(record.tokenName);\n }\n\n this.records.set(record.token, [...existing, record]);\n }\n\n override(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n const kept = existing.filter((candidate) => candidate.multi && !record.multi);\n this.records.set(record.token, [...kept, record]);\n }\n\n createScope(options: ScopeOptions = {}): Container {\n return new RuntimeContainer({\n parent: this,\n strictScopes: options.strictScopes ?? this.strictScopes,\n });\n }\n\n build<T>(target: Constructor<T>, options: BuildOptions = {}): T {\n const deps =\n options.deps ?? (target as { readonly inject?: readonly DependencySpec[] }).inject ?? [];\n const context = this.createResolutionContext(\"sync\");\n const values = this.resolveDependencies(deps, context);\n\n if (isPromiseLike(values)) {\n throw new AsyncProviderInSyncResolutionError(target.name);\n }\n\n return Reflect.construct(target, values) as T;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n\n for (const entry of [...this.created].toReversed()) {\n if (entry.disposed) {\n continue;\n }\n\n entry.disposed = true;\n\n try {\n await disposeValue(entry.value, entry.record);\n } catch (error) {\n errors.push(error);\n }\n }\n\n this.created.length = 0;\n this.scopedCache.clear();\n\n if (this.root === this) {\n this.singletonCache.clear();\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more providers failed to dispose.\");\n }\n }\n\n private assertMutable(): void {\n if (this.frozen) {\n throw new FrozenContainerError();\n }\n }\n\n private createResolutionContext(mode: \"sync\" | \"async\"): ResolutionContext {\n return {\n stack: [],\n resolutionCache: new Map(),\n mode,\n requestContainer: this,\n };\n }\n\n private getSingleRecord(token: InjectionToken, optional: false): ProviderRecord;\n private getSingleRecord(token: InjectionToken, optional: true): ProviderRecord | undefined;\n private getSingleRecord(token: InjectionToken, optional: boolean): ProviderRecord | undefined {\n const records = this.findRecords(token);\n\n if (records.length === 0) {\n if (optional) {\n return undefined;\n }\n\n throw new MissingProviderError(tokenName(token), []);\n }\n\n const nonMultiRecords = records.filter((record) => !record.multi);\n\n if (nonMultiRecords.length === 1) {\n return nonMultiRecords[0]!;\n }\n\n if (records.length === 1) {\n return records[0]!;\n }\n\n throw new AmbiguousProviderError(tokenName(token));\n }\n\n private getAllRecords(token: InjectionToken): ProviderRecord[] {\n return this.getAllRecordsFromHierarchy(token);\n }\n\n findRecords(token: InjectionToken): ProviderRecord[] {\n const localRecords = this.records.get(token);\n\n if (localRecords !== undefined && localRecords.length > 0) {\n return localRecords;\n }\n\n return this.parent?.findRecords(token) ?? [];\n }\n\n getAllRecordsFromHierarchy(token: InjectionToken): ProviderRecord[] {\n const parentRecords = this.parent?.getAllRecordsFromHierarchy(token) ?? [];\n const localRecords = this.records.get(token) ?? [];\n return [...parentRecords, ...localRecords];\n }\n\n private resolveRecord(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n const cached = this.getCached(record, context);\n\n if (cached.found) {\n return cached.value;\n }\n\n this.assertNoCycle(record, context);\n this.assertLifetimeSafe(record, context);\n\n context.stack.push(record);\n\n const finalize = (value: unknown): unknown => {\n context.stack.pop();\n this.setCached(record, value, context);\n return value;\n };\n\n const fail = (error: unknown): never => {\n context.stack.pop();\n throw error;\n };\n\n try {\n const value = this.createValue(record, context);\n\n if (isPromiseLike(value)) {\n if (context.mode === \"sync\") {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return Promise.resolve(value).then(finalize, fail);\n }\n\n return finalize(value);\n } catch (error) {\n return fail(error);\n }\n }\n\n private createValue(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n switch (record.provider.kind) {\n case \"class\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n Reflect.construct(provider.useClass, values),\n );\n }\n\n return Reflect.construct(provider.useClass, deps);\n }\n\n case \"value\":\n return record.provider.useValue;\n\n case \"factory\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n runWithInjectContext(context, () => provider.useFactory(...values)),\n );\n }\n\n return runWithInjectContext(context, () => provider.useFactory(...deps));\n }\n\n case \"existing\":\n return this.resolveDependency(record.provider.useExisting, context);\n }\n }\n\n private resolveDependencies(\n deps: readonly DependencySpec[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values: unknown[] = Array.from({ length: deps.length });\n const asyncValues: Promise<unknown>[] = [];\n\n for (const [index, dep] of deps.entries()) {\n const value = this.resolveDependency(dep, context);\n\n if (isPromiseLike(value)) {\n asyncValues.push(\n Promise.resolve(value).then((resolved) => {\n values[index] = resolved;\n return resolved;\n }),\n );\n } else {\n values[index] = value;\n }\n }\n\n if (asyncValues.length === 0) {\n return values;\n }\n\n return Promise.all(asyncValues).then(() => values);\n }\n\n private resolveDependency(\n dep: DependencySpec,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n if (isDependencyObject(dep)) {\n if (dep.many === true) {\n const records = this.getAllRecords(dep.token);\n return this.resolveAllRecords(records, context);\n }\n\n const record =\n dep.optional === true\n ? this.getSingleRecord(dep.token, true)\n : this.getSingleRecord(dep.token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n return this.resolveRecord(record, context);\n }\n\n const record = this.getSingleRecord(dep, false);\n return this.resolveRecord(record, context);\n }\n\n private resolveAllRecords(\n records: readonly ProviderRecord[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values = records.map((record) => this.resolveRecord(record, context));\n\n if (values.some(isPromiseLike)) {\n return Promise.all(values);\n }\n\n return values;\n }\n\n private getCached(\n record: ProviderRecord,\n context: ResolutionContext,\n ): { readonly found: boolean; readonly value?: unknown } {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined || !cache.has(record)) {\n return { found: false };\n }\n\n return { found: true, value: cache.get(record) };\n }\n\n private setCached<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined) {\n this.trackCreated(record, value, context);\n return;\n }\n\n if (!cache.has(record)) {\n cache.set(record, value);\n this.trackCreated(record, value, context);\n }\n }\n\n private cacheFor(\n record: ProviderRecord,\n context: ResolutionContext,\n ): Map<ProviderRecord, unknown> | undefined {\n switch (record.scope) {\n case \"singleton\":\n return this.root.singletonCache;\n case \"scoped\":\n return context.requestContainer.scopedCache;\n case \"resolution\":\n return context.resolutionCache;\n case \"transient\":\n return undefined;\n }\n }\n\n private trackCreated<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const owner = record.scope === \"singleton\" ? this.root : context.requestContainer;\n owner.created.push({ record, value, disposed: false });\n }\n\n private assertNoCycle(record: ProviderRecord, context: ResolutionContext): void {\n const existingIndex = context.stack.indexOf(record);\n\n if (existingIndex === -1) {\n return;\n }\n\n const cycle = [...context.stack.slice(existingIndex), record].map((entry) => entry.tokenName);\n throw new CircularDependencyError(cycle);\n }\n\n private assertLifetimeSafe(record: ProviderRecord, context: ResolutionContext): void {\n if (!this.strictScopes || record.leakSafe || context.stack.length === 0) {\n return;\n }\n\n const parent = context.stack.at(-1);\n\n if (parent === undefined) {\n return;\n }\n\n if (isLifetimeLeak(parent.scope, record.scope)) {\n throw new LifetimeLeakError(parent.tokenName, parent.scope, record.tokenName, record.scope);\n }\n }\n}\n\nfunction isDependencyObject(dep: DependencySpec): dep is {\n readonly token: InjectionToken;\n readonly optional?: boolean;\n readonly many?: boolean;\n} {\n return typeof dep === \"object\" && dep !== null && \"token\" in dep;\n}\n\nfunction isPromiseLike<T = unknown>(value: unknown): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction isLifetimeLeak(parentScope: Scope, childScope: Scope): boolean {\n if (parentScope === \"singleton\") {\n return childScope === \"scoped\" || childScope === \"resolution\" || childScope === \"transient\";\n }\n\n if (parentScope === \"scoped\") {\n return childScope === \"resolution\" || childScope === \"transient\";\n }\n\n return false;\n}\n\nasync function disposeValue(value: unknown, record: ProviderRecord): Promise<void> {\n if (record.dispose !== undefined) {\n await record.dispose(value);\n }\n\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const maybeDisposable = value as Record<PropertyKey, unknown>;\n\n if (\n asyncDisposeSymbol !== undefined &&\n typeof maybeDisposable[asyncDisposeSymbol] === \"function\"\n ) {\n await (maybeDisposable[asyncDisposeSymbol] as () => Promise<void> | void)();\n return;\n }\n\n if (disposeSymbol !== undefined && typeof maybeDisposable[disposeSymbol] === \"function\") {\n (maybeDisposable[disposeSymbol] as () => void)();\n return;\n }\n\n if (typeof maybeDisposable.dispose === \"function\") {\n await (maybeDisposable.dispose as () => Promise<void> | void)();\n return;\n }\n\n if (typeof maybeDisposable.destroy === \"function\") {\n await (maybeDisposable.destroy as () => Promise<void> | void)();\n }\n}\n","import type { Constructor, DependencySpec, Scope } from \"./types.js\";\n\nexport interface ModuleOptions {\n readonly name?: string;\n readonly deps?: readonly DependencySpec[];\n readonly scope?: Scope;\n}\n\nexport interface DefineModuleOptions extends ModuleOptions {\n readonly state?: readonly PropertyKey[];\n readonly actions?: readonly PropertyKey[];\n readonly computed?: readonly PropertyKey[];\n}\n\nexport interface ModuleMetadata {\n readonly kind: \"module\";\n name?: string;\n deps?: readonly DependencySpec[];\n scope?: Scope;\n readonly state: Set<PropertyKey>;\n readonly actions: Set<PropertyKey>;\n readonly computed: Set<PropertyKey>;\n}\n\nconst moduleMetadata = new WeakMap<Function, ModuleMetadata>();\n\nexport function defineModule<T extends Constructor>(\n target: T,\n options: DefineModuleOptions = {},\n): T {\n const metadata = ensureModuleMetadata(target);\n applyModuleOptions(metadata, options);\n addProperties(metadata.state, options.state);\n addProperties(metadata.actions, options.actions);\n addProperties(metadata.computed, options.computed);\n return target;\n}\n\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n return moduleMetadata.get(target);\n}\n\nexport function addModuleState(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).state.add(property);\n}\n\nexport function addModuleAction(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).actions.add(property);\n}\n\nexport function addModuleComputed(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).computed.add(property);\n}\n\nexport function applyModuleOptions(metadata: ModuleMetadata, options: ModuleOptions): void {\n if (options.name !== undefined) {\n metadata.name = options.name;\n }\n\n if (options.deps !== undefined) {\n metadata.deps = options.deps;\n }\n\n if (options.scope !== undefined) {\n metadata.scope = options.scope;\n }\n}\n\nexport function ensureModuleMetadata(target: Function): ModuleMetadata {\n let metadata = moduleMetadata.get(target);\n\n if (metadata !== undefined) {\n return metadata;\n }\n\n metadata = {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n };\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nfunction addProperties(target: Set<PropertyKey>, properties: readonly PropertyKey[] | undefined) {\n for (const property of properties ?? []) {\n target.add(property);\n }\n}\n","import { create as createCoactionStore, createReactiveTracker, type Store } from \"coaction\";\n\nimport { createContainer } from \"./container.js\";\nimport { CosystemError, DuplicateProviderError } from \"./errors.js\";\nimport { getModuleMetadata, type ModuleMetadata } from \"./metadata.js\";\nimport { provide } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n ClassProvideOptions,\n Constructor,\n Container,\n InjectionToken,\n Provider,\n ProviderInput,\n ScopeOptions,\n} from \"./types.js\";\n\nexport interface EngineOptions {\n readonly patches?: boolean;\n readonly devtools?: boolean;\n readonly transport?: unknown;\n}\n\nexport interface AppDevOptions {\n readonly strictActions?: boolean;\n}\n\nexport interface CreateAppOptions {\n readonly providers?: readonly ProviderInput[];\n readonly plugins?: readonly Plugin[];\n readonly parent?: App | Container;\n readonly devOptions?: AppDevOptions;\n readonly engine?: EngineOptions;\n}\n\nexport interface InternalCreateAppOptions extends CreateAppOptions {\n readonly overrides?: readonly ProviderInput[];\n readonly testInspector?: MutableTestInspector;\n}\n\nexport interface AppState {\n readonly version: number;\n}\n\nexport interface AppScope {\n readonly container: Container;\n}\n\nexport interface App {\n readonly container: Container;\n readonly state: AppState;\n readonly started: boolean;\n readonly store: Store<RootState>;\n\n get<T>(token: InjectionToken<T>): T;\n getAsync<T>(token: InjectionToken<T>): Promise<T>;\n getAll<T>(token: InjectionToken<T>): T[];\n getModule<T>(token: InjectionToken<T>): T;\n getModuleByName<T = unknown>(name: string): T;\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options?: WatchOptions<T>,\n ): () => void;\n start(): Promise<void>;\n stop(): Promise<void>;\n dispose(): Promise<void>;\n createScope(options?: ScopeOptions): AppScope;\n}\n\nexport interface WatchOptions<T> {\n readonly equals?: (value: T, previous: T) => boolean;\n readonly immediate?: boolean;\n}\n\nexport interface Plugin {\n readonly name?: string;\n setup?(app: App): void | Promise<void>;\n onModuleCreated?(event: ModuleCreatedEvent): void;\n onActionStart?(event: ActionEvent): void;\n onActionEnd?(event: ActionEvent): void;\n onStateChange?(event: StateChangeEvent): void;\n onError?(error: unknown, context: ErrorContext): void;\n dispose?(): void | Promise<void>;\n}\n\nexport interface ModuleCreatedEvent {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: unknown;\n}\n\nexport interface ActionEvent {\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n readonly startedAt: number;\n readonly endedAt?: number;\n readonly error?: unknown;\n}\n\nexport interface StateChangeEvent {\n readonly state: unknown;\n}\n\nexport interface ErrorContext {\n readonly phase: string;\n}\n\nexport interface TestAppInspector {\n getActions(): readonly ActionEvent[];\n getState(): unknown;\n getPatches(): readonly unknown[];\n clearActions(): void;\n clearPatches(): void;\n flushEffects(): Promise<void>;\n}\n\nexport interface MutableTestInspector extends TestAppInspector {\n recordAction(event: ActionEvent): void;\n recordPatch(patch: unknown): void;\n}\n\ntype RootState = Record<string, Record<PropertyKey, unknown>>;\n\ninterface ModuleBinding {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: Record<PropertyKey, unknown>;\n readonly metadata: ModuleMetadata;\n readonly originalActions: Map<PropertyKey, (...args: unknown[]) => unknown>;\n readonly originalComputed: Map<PropertyKey, () => unknown>;\n activeDraft: Record<PropertyKey, unknown> | undefined;\n actionDepth: number;\n}\n\ninterface LifecycleModule {\n onInit?(): void | Promise<void>;\n onStart?(): void | Promise<void>;\n onStop?(): void | Promise<void>;\n onDispose?(): void | Promise<void>;\n}\n\nexport function createApp(options: CreateAppOptions = {}): App {\n return createAppInternal(options);\n}\n\nexport function createAppInternal(options: InternalCreateAppOptions = {}): App {\n const parent = isApp(options.parent) ? options.parent.container : options.parent;\n const container = parent === undefined ? createContainer() : createContainer({ parent });\n const moduleTokens: InjectionToken[] = [];\n\n for (const provider of options.providers ?? []) {\n const normalized = normalizeAppProvider(provider);\n container.provide(normalized.provider);\n\n if (normalized.moduleToken !== undefined) {\n moduleTokens.push(normalized.moduleToken);\n }\n }\n\n for (const override of options.overrides ?? []) {\n container.override(normalizeAppProvider(override).provider);\n }\n\n container.freeze();\n\n const modules = instantiateModules(container, moduleTokens);\n const rootState = createRootState(modules);\n const store = createCoactionStore(rootState, {\n name: \"cosystem\",\n sliceMode: \"single\",\n });\n const state: { version: number } = { version: 0 };\n const app = new RuntimeApp({\n container,\n devOptions: options.devOptions ?? {},\n modules,\n plugins: options.plugins ?? [],\n state,\n store,\n ...(options.testInspector === undefined ? {} : { testInspector: options.testInspector }),\n });\n\n app.bindModules();\n app.runModuleCreatedHooks();\n app.init();\n\n return app;\n}\n\nclass RuntimeApp implements App {\n readonly container: Container;\n readonly state: AppState;\n readonly store: Store<RootState>;\n\n private readonly devOptions: AppDevOptions;\n private readonly modules: ModuleBinding[];\n private readonly moduleByToken = new Map<InjectionToken, ModuleBinding>();\n private readonly moduleByName = new Map<string, ModuleBinding>();\n private readonly plugins: readonly Plugin[];\n private readonly testInspector: MutableTestInspector | undefined;\n private initPromise: Promise<void> = Promise.resolve();\n private isStarted = false;\n private isDisposed = false;\n\n constructor(options: {\n readonly container: Container;\n readonly devOptions: AppDevOptions;\n readonly modules: ModuleBinding[];\n readonly plugins: readonly Plugin[];\n readonly state: AppState;\n readonly store: Store<RootState>;\n readonly testInspector?: MutableTestInspector;\n }) {\n this.container = options.container;\n this.devOptions = options.devOptions;\n this.modules = options.modules;\n this.plugins = options.plugins;\n this.state = options.state;\n this.store = options.store;\n this.testInspector = options.testInspector;\n\n for (const moduleBinding of options.modules) {\n this.moduleByToken.set(moduleBinding.token, moduleBinding);\n this.moduleByName.set(moduleBinding.name, moduleBinding);\n }\n\n this.store.subscribe(() => {\n (this.state as { version: number }).version += 1;\n const state = this.store.getPureState();\n this.testInspector?.recordPatch(state);\n this.emitStateChange({ state });\n });\n }\n\n get started(): boolean {\n return this.isStarted;\n }\n\n get<T>(token: InjectionToken<T>): T {\n return this.container.get(token);\n }\n\n getAsync<T>(token: InjectionToken<T>): Promise<T> {\n return this.container.getAsync(token);\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n return this.container.getAll(token);\n }\n\n getModule<T>(token: InjectionToken<T>): T {\n const value = this.get(token);\n\n if (!this.moduleByToken.has(token)) {\n throw new CosystemError(`${tokenName(token)} is not a CoSystem module.`);\n }\n\n return value;\n }\n\n getModuleByName<T = unknown>(name: string): T {\n const moduleBinding = this.moduleByName.get(name);\n\n if (moduleBinding === undefined) {\n throw new CosystemError(`${name} is not a CoSystem module.`);\n }\n\n return moduleBinding.instance as T;\n }\n\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options: WatchOptions<T> = {},\n ): () => void {\n const equals = options.equals ?? Object.is;\n const tracker = createReactiveTracker();\n let previous = tracker.track(read);\n\n if (options.immediate === true) {\n listener(previous, previous);\n }\n\n const publish = () => {\n const next = tracker.track(read);\n\n if (equals(next, previous)) {\n return;\n }\n\n const last = previous;\n previous = next;\n listener(next, last);\n };\n\n const unsubscribeStore = this.store.subscribe(publish);\n const unsubscribeTracker = tracker.subscribe(publish);\n\n return () => {\n unsubscribeStore();\n unsubscribeTracker();\n tracker.dispose();\n };\n }\n\n async start(): Promise<void> {\n if (this.isStarted) {\n return;\n }\n\n await this.initPromise;\n await this.runLifecycle(\"onStart\");\n this.isStarted = true;\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) {\n return;\n }\n\n await this.runLifecycle(\"onStop\", true);\n this.isStarted = false;\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) {\n return;\n }\n\n await this.stop();\n await this.runLifecycle(\"onDispose\", true);\n await Promise.all(this.plugins.map((plugin) => plugin.dispose?.()));\n await this.container.dispose();\n this.store.destroy();\n this.isDisposed = true;\n }\n\n createScope(options?: ScopeOptions): AppScope {\n return {\n container: this.container.createScope(options),\n };\n }\n\n bindModules(): void {\n for (const moduleBinding of this.modules) {\n this.bindState(moduleBinding);\n this.bindComputed(moduleBinding);\n this.bindActions(moduleBinding);\n }\n }\n\n runModuleCreatedHooks(): void {\n for (const moduleBinding of this.modules) {\n const event: ModuleCreatedEvent = {\n name: moduleBinding.name,\n token: moduleBinding.token,\n instance: moduleBinding.instance,\n };\n\n for (const plugin of this.plugins) {\n plugin.onModuleCreated?.(event);\n }\n }\n }\n\n init(): void {\n this.initPromise = (async () => {\n await Promise.all(this.plugins.map((plugin) => plugin.setup?.(this)));\n await this.runLifecycle(\"onInit\");\n })();\n }\n\n private bindState(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.state) {\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => this.readModuleState(moduleBinding, property),\n set: (value: unknown) => this.writeModuleState(moduleBinding, property, value),\n });\n }\n }\n\n private bindActions(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.actions) {\n const action = getMethod(moduleBinding.instance, property);\n moduleBinding.originalActions.set(property, action);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n value: (...args: unknown[]) => this.runAction(moduleBinding, property, args),\n });\n }\n }\n\n private bindComputed(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.computed) {\n const getter = getGetter(moduleBinding.instance, property);\n moduleBinding.originalComputed.set(property, getter);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => getter.call(moduleBinding.instance),\n });\n }\n }\n\n private readModuleState(moduleBinding: ModuleBinding, property: PropertyKey): unknown {\n return this.store.getState()[moduleBinding.name]?.[property];\n }\n\n private writeModuleState(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n value: unknown,\n ): void {\n if (moduleBinding.activeDraft !== undefined) {\n moduleBinding.activeDraft[property] = value;\n return;\n }\n\n if (this.devOptions.strictActions === true && moduleBinding.actionDepth === 0) {\n throw new CosystemError(\n `Cannot write ${moduleBinding.name}.${String(property)} outside an action.`,\n );\n }\n\n this.store.setState((draft) => {\n draft[moduleBinding.name] ??= {};\n draft[moduleBinding.name]![property] = value;\n });\n }\n\n private runAction(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n args: readonly unknown[],\n ): unknown {\n const action = moduleBinding.originalActions.get(property);\n\n if (action === undefined) {\n throw new CosystemError(`${moduleBinding.name}.${String(property)} is not an action.`);\n }\n\n const event: ActionEvent = {\n args,\n method: String(property),\n module: moduleBinding.name,\n startedAt: Date.now(),\n };\n this.emitActionStart(event);\n\n let result: unknown;\n let error: unknown;\n\n try {\n moduleBinding.actionDepth += 1;\n this.store.setState((draft) => {\n const previousDraft = moduleBinding.activeDraft;\n moduleBinding.activeDraft = draft[moduleBinding.name] ?? {};\n draft[moduleBinding.name] = moduleBinding.activeDraft;\n\n try {\n result = action.apply(moduleBinding.instance, [...args]);\n } finally {\n moduleBinding.activeDraft = previousDraft;\n }\n });\n } catch (caught) {\n error = caught;\n } finally {\n moduleBinding.actionDepth -= 1;\n }\n\n const endedEvent: ActionEvent = {\n ...event,\n endedAt: Date.now(),\n ...(error === undefined ? {} : { error }),\n };\n this.testInspector?.recordAction(endedEvent);\n this.emitActionEnd(endedEvent);\n\n if (error !== undefined) {\n throw error;\n }\n\n return result;\n }\n\n private async runLifecycle(method: keyof LifecycleModule, reverse = false): Promise<void> {\n const modules = reverse ? this.modules.toReversed() : this.modules;\n\n for (const moduleBinding of modules) {\n const lifecycle = moduleBinding.instance as LifecycleModule;\n await lifecycle[method]?.();\n }\n }\n\n private emitActionStart(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionStart?.(event);\n }\n }\n\n private emitActionEnd(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionEnd?.(event);\n }\n }\n\n private emitStateChange(event: StateChangeEvent): void {\n for (const plugin of this.plugins) {\n plugin.onStateChange?.(event);\n }\n }\n}\n\nfunction normalizeAppProvider(provider: ProviderInput): {\n readonly provider: ProviderInput;\n readonly moduleToken?: InjectionToken;\n} {\n if (typeof provider === \"function\") {\n const metadata = getModuleMetadata(provider);\n\n if (metadata !== undefined) {\n return {\n provider: provide(provider, createModuleClassProviderOptions(provider, metadata)),\n moduleToken: provider,\n };\n }\n\n return { provider };\n }\n\n if (\"useClass\" in provider) {\n const metadata = getModuleMetadata(provider.useClass);\n\n if (metadata !== undefined) {\n return {\n provider: {\n ...provider,\n ...mergeModuleClassProviderOptions(provider, metadata),\n },\n moduleToken: provider.provide,\n };\n }\n }\n\n return { provider };\n}\n\nfunction createModuleClassProviderOptions<T>(\n useClass: Constructor<T>,\n metadata: ModuleMetadata,\n): ClassProvideOptions<T> {\n return {\n useClass,\n ...(metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction mergeModuleClassProviderOptions<T>(\n provider: Provider<T>,\n metadata: ModuleMetadata,\n): Partial<ClassProvideOptions<T>> {\n return {\n ...(\"deps\" in provider || metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(\"scope\" in provider || metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction instantiateModules(container: Container, moduleTokens: readonly InjectionToken[]) {\n const modules: ModuleBinding[] = [];\n\n for (const moduleToken of moduleTokens) {\n const instance = container.get(moduleToken) as Record<PropertyKey, unknown>;\n const metadata = getModuleMetadata(instance.constructor);\n\n if (metadata === undefined) {\n continue;\n }\n\n const name = metadata.name ?? stableModuleName(moduleToken);\n\n if (modules.some((moduleBinding) => moduleBinding.name === name)) {\n throw new DuplicateProviderError(name);\n }\n\n modules.push({\n actionDepth: 0,\n activeDraft: undefined,\n instance,\n metadata,\n name,\n originalActions: new Map(),\n originalComputed: new Map(),\n token: moduleToken,\n });\n }\n\n return modules;\n}\n\nfunction createRootState(modules: readonly ModuleBinding[]): RootState {\n const rootState: RootState = {};\n\n for (const moduleBinding of modules) {\n const state: Record<PropertyKey, unknown> = {};\n\n for (const property of moduleBinding.metadata.state) {\n state[property] = moduleBinding.instance[property];\n }\n\n rootState[moduleBinding.name] = state;\n }\n\n return rootState;\n}\n\nfunction stableModuleName(token: InjectionToken): string {\n const name = tokenName(token);\n return `${name.slice(0, 1).toLowerCase()}${name.slice(1)}`;\n}\n\nfunction getMethod(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): (...args: unknown[]) => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.value === undefined || typeof descriptor.value !== \"function\") {\n throw new CosystemError(`${String(property)} is not a method.`);\n }\n\n return descriptor.value as (...args: unknown[]) => unknown;\n}\n\nfunction getGetter(instance: Record<PropertyKey, unknown>, property: PropertyKey): () => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.get === undefined) {\n throw new CosystemError(`${String(property)} is not a getter.`);\n }\n\n return descriptor.get;\n}\n\nfunction getDescriptor(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): PropertyDescriptor | undefined {\n let current: object | null = instance;\n\n while (current !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(current, property);\n\n if (descriptor !== undefined) {\n return descriptor;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return undefined;\n}\n\nfunction isApp(value: unknown): value is App {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"get\" in value &&\n \"start\" in value &&\n \"dispose\" in value\n );\n}\n","import {\n addModuleAction,\n addModuleComputed,\n addModuleState,\n applyModuleOptions,\n defineModule,\n ensureModuleMetadata,\n type ModuleOptions,\n} from \"./metadata.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport function module(options: ModuleOptions = {}) {\n return function moduleDecorator<T extends Constructor>(\n target: T,\n _context?: ClassDecoratorContext<T>,\n ): T {\n defineModule(target, options);\n return target;\n };\n}\n\nexport function state<This extends object, Value>(\n _value: ClassAccessorDecoratorTarget<This, Value>,\n context: ClassAccessorDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"accessor\") {\n throw new TypeError(\"@state only supports standard accessor decorators.\");\n }\n\n context.addInitializer(function initializeState(this: This) {\n addModuleState(this.constructor, context.name);\n });\n}\n\nexport function action<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n if (context.kind !== \"method\") {\n throw new TypeError(\"@action only supports method decorators.\");\n }\n\n context.addInitializer(function initializeAction(this: This) {\n addModuleAction(this.constructor, context.name);\n });\n}\n\nexport function computed<This extends object, Value>(\n _value: (this: This) => Value,\n context: ClassGetterDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"getter\") {\n throw new TypeError(\"@computed only supports getter decorators.\");\n }\n\n context.addInitializer(function initializeComputed(this: This) {\n addModuleComputed(this.constructor, context.name);\n });\n}\n\nexport function effect<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n _context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n // Effect scheduling is intentionally deferred until the app runtime has real\n // lifecycle semantics for reactive side effects.\n}\n\nexport function moduleOptions(target: Constructor, options: ModuleOptions): void {\n applyModuleOptions(ensureModuleMetadata(target), options);\n}\n","import { createAppInternal, type MutableTestInspector } from \"./app.js\";\nimport type { ActionEvent, CreateAppOptions, TestAppInspector } from \"./app.js\";\nimport type { ProviderInput } from \"./types.js\";\n\nexport interface TestAppOptions extends Omit<CreateAppOptions, \"providers\"> {\n readonly providers?: readonly ProviderInput[];\n readonly overrides?: readonly ProviderInput[];\n readonly autoStart?: boolean;\n readonly strictActions?: boolean;\n}\n\nexport interface TestApp extends ReturnType<typeof createAppInternal> {\n readonly test: TestAppInspector;\n}\n\nexport interface AutoStartedTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart: true;\n}\n\nexport interface ManualTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart?: false;\n}\n\nexport function testApp(options: AutoStartedTestAppOptions): Promise<TestApp>;\nexport function testApp(options?: ManualTestAppOptions): TestApp;\nexport function testApp(options: TestAppOptions = {}): TestApp | Promise<TestApp> {\n const inspector = createTestInspector();\n const { autoStart, overrides, strictActions, ...createOptions } = options;\n const app = createAppInternal({\n ...createOptions,\n devOptions: {\n ...createOptions.devOptions,\n ...(strictActions === undefined ? {} : { strictActions }),\n },\n ...(overrides === undefined ? {} : { overrides }),\n testInspector: inspector,\n }) as TestApp;\n\n Object.defineProperty(app, \"test\", {\n configurable: false,\n enumerable: false,\n value: inspector,\n });\n\n if (autoStart === true) {\n return app.start().then(() => app);\n }\n\n return app;\n}\n\nfunction createTestInspector(): MutableTestInspector {\n const actions: ActionEvent[] = [];\n const patches: unknown[] = [];\n let lastState: unknown;\n\n return {\n clearActions() {\n actions.length = 0;\n },\n clearPatches() {\n patches.length = 0;\n },\n flushEffects() {\n return Promise.resolve();\n },\n getActions() {\n return actions;\n },\n getPatches() {\n return patches;\n },\n getState() {\n return lastState;\n },\n recordAction(event) {\n actions.push(event);\n },\n recordPatch(patch) {\n lastState = patch;\n patches.push(patch);\n },\n };\n}\n","import { CosystemError } from \"./errors.js\";\nimport { createApp, type App, type CreateAppOptions } from \"./app.js\";\n\nexport interface WorkerTransport {\n post(message: WorkerMessage): void;\n subscribe(listener: (message: WorkerMessage) => void): () => void;\n}\n\nexport type WorkerMessage =\n | WorkerCallMessage\n | WorkerResultMessage\n | WorkerStateMessage\n | WorkerReadyMessage;\n\nexport interface WorkerCallMessage {\n readonly id: number;\n readonly type: \"call\";\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n}\n\nexport interface WorkerResultMessage {\n readonly id: number;\n readonly type: \"result\";\n readonly value?: unknown;\n readonly error?: SerializedWorkerError;\n}\n\nexport interface WorkerStateMessage {\n readonly type: \"state\";\n readonly state: unknown;\n readonly version: number;\n}\n\nexport interface WorkerReadyMessage {\n readonly type: \"ready\";\n}\n\nexport interface SerializedWorkerError {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n}\n\nexport interface CreateWorkerAppOptions extends CreateAppOptions {\n readonly transport: WorkerTransport;\n}\n\nexport interface WorkerAppHost {\n readonly app: App;\n dispose(): Promise<void>;\n}\n\nexport interface CreateWorkerClientOptions {\n readonly transport: WorkerTransport;\n}\n\nexport type AsyncMethodProxy<T extends object> = {\n readonly [Key in keyof T as T[Key] extends (...args: any[]) => unknown\n ? Key\n : never]: T[Key] extends (...args: infer Args) => infer Return\n ? (...args: Args) => Promise<Awaited<Return>>\n : never;\n};\n\nexport interface WorkerClient {\n readonly state: {\n readonly version: number;\n };\n getState(): unknown;\n call(module: string, method: string, ...args: readonly unknown[]): Promise<unknown>;\n module<T extends object>(name: string): AsyncMethodProxy<T>;\n subscribe(listener: (message: WorkerStateMessage) => void): () => void;\n dispose(): void;\n}\n\nexport function createWorkerApp(options: CreateWorkerAppOptions): WorkerAppHost {\n const { transport, ...appOptions } = options;\n const app = createApp(appOptions);\n const unsubscribeTransport = transport.subscribe((message) => {\n if (message.type !== \"call\") {\n return;\n }\n\n void handleCall(app, transport, message);\n });\n const unsubscribeStore = app.store.subscribe(() => {\n publishState(app, transport);\n });\n\n transport.post({ type: \"ready\" });\n publishState(app, transport);\n\n return {\n app,\n async dispose() {\n unsubscribeTransport();\n unsubscribeStore();\n await app.dispose();\n },\n };\n}\n\nexport function createWorkerClient(options: CreateWorkerClientOptions): WorkerClient {\n const { transport } = options;\n const listeners = new Set<(message: WorkerStateMessage) => void>();\n const pending = new Map<\n number,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: unknown) => void;\n }\n >();\n const state = { version: 0 };\n let nextId = 1;\n let snapshot: unknown;\n\n const unsubscribe = transport.subscribe((message) => {\n if (message.type === \"state\") {\n state.version = message.version;\n snapshot = message.state;\n\n for (const listener of listeners) {\n listener(message);\n }\n\n return;\n }\n\n if (message.type !== \"result\") {\n return;\n }\n\n const entry = pending.get(message.id);\n\n if (entry === undefined) {\n return;\n }\n\n pending.delete(message.id);\n\n if (message.error !== undefined) {\n entry.reject(createRemoteError(message.error));\n return;\n }\n\n entry.resolve(message.value);\n });\n\n const client: WorkerClient = {\n state,\n call(module, method, ...args) {\n const id = nextId;\n nextId += 1;\n\n return new Promise((resolve, reject) => {\n pending.set(id, { reject, resolve });\n transport.post({\n args,\n id,\n method,\n module,\n type: \"call\",\n });\n });\n },\n dispose() {\n unsubscribe();\n\n for (const entry of pending.values()) {\n entry.reject(new CosystemError(\"Worker client disposed before response.\"));\n }\n\n pending.clear();\n listeners.clear();\n },\n getState() {\n return snapshot;\n },\n module<T extends object>(name: string): AsyncMethodProxy<T> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n return (...args: readonly unknown[]) => client.call(name, property, ...args);\n },\n },\n ) as AsyncMethodProxy<T>;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return client;\n}\n\nexport function createMemoryWorkerTransportPair(): readonly [WorkerTransport, WorkerTransport] {\n const leftListeners = new Set<(message: WorkerMessage) => void>();\n const rightListeners = new Set<(message: WorkerMessage) => void>();\n\n return [\n createMemoryWorkerTransport(leftListeners, rightListeners),\n createMemoryWorkerTransport(rightListeners, leftListeners),\n ];\n}\n\nasync function handleCall(\n app: App,\n transport: WorkerTransport,\n message: WorkerCallMessage,\n): Promise<void> {\n try {\n const module = app.getModuleByName<Record<string, unknown>>(message.module);\n const method = module[message.method];\n\n if (typeof method !== \"function\") {\n throw new CosystemError(`${message.module}.${message.method} is not callable.`);\n }\n\n const value = await method.apply(module, message.args);\n transport.post({\n id: message.id,\n type: \"result\",\n value,\n });\n } catch (error) {\n transport.post({\n error: serializeError(error),\n id: message.id,\n type: \"result\",\n });\n }\n}\n\nfunction publishState(app: App, transport: WorkerTransport): void {\n transport.post({\n state: app.store.getPureState(),\n type: \"state\",\n version: app.state.version,\n });\n}\n\nfunction createMemoryWorkerTransport(\n inbox: Set<(message: WorkerMessage) => void>,\n outbox: Set<(message: WorkerMessage) => void>,\n): WorkerTransport {\n return {\n post(message) {\n for (const listener of outbox) {\n listener(message);\n }\n },\n subscribe(listener) {\n inbox.add(listener);\n return () => {\n inbox.delete(listener);\n };\n },\n };\n}\n\nfunction serializeError(error: unknown): SerializedWorkerError {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n}\n\nfunction createRemoteError(error: SerializedWorkerError): CosystemError {\n const remoteError = new CosystemError(`Remote worker error: ${error.message}`);\n remoteError.name = error.name;\n\n if (error.stack !== undefined) {\n remoteError.stack = error.stack;\n }\n\n return remoteError;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createCoactionStore","#container"],"sources":["../src/errors.ts","../src/token.ts","../src/inject.ts","../src/provider.ts","../src/container.ts","../src/metadata.ts","../src/app.ts","../src/decorators.ts","../src/loggerPlugin.ts","../src/testApp.ts","../src/worker.ts"],"sourcesContent":["export class CosystemError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"CosystemError\";\n }\n}\n\nexport class FrozenContainerError extends CosystemError {\n constructor() {\n super(\"Container provider graph is frozen and can no longer be mutated.\");\n this.name = \"FrozenContainerError\";\n }\n}\n\nexport class MissingProviderError extends CosystemError {\n constructor(token: string, path: readonly string[]) {\n super(\n [\n `Missing provider for ${token}.`,\n path.length > 0 ? \"Resolution path:\" : \"\",\n ...path.map((entry) => ` ${entry}`),\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n this.name = \"MissingProviderError\";\n }\n}\n\nexport class DuplicateProviderError extends CosystemError {\n constructor(token: string) {\n super(`Duplicate non-multi provider for ${token}. Use override() or mark providers as multi.`);\n this.name = \"DuplicateProviderError\";\n }\n}\n\nexport class AmbiguousProviderError extends CosystemError {\n constructor(token: string) {\n super(`Multiple providers registered for ${token}. Use getAll() instead of get().`);\n this.name = \"AmbiguousProviderError\";\n }\n}\n\nexport class CircularDependencyError extends CosystemError {\n constructor(path: readonly string[]) {\n super([\"Circular dependency detected:\", ...path.map((entry) => ` ${entry}`)].join(\"\\n\"));\n this.name = \"CircularDependencyError\";\n }\n}\n\nexport class AsyncProviderInSyncResolutionError extends CosystemError {\n constructor(token: string) {\n super(`Provider for ${token} resolved asynchronously. Use getAsync() instead of get().`);\n this.name = \"AsyncProviderInSyncResolutionError\";\n }\n}\n\nexport class LifetimeLeakError extends CosystemError {\n constructor(parent: string, parentScope: string, child: string, childScope: string) {\n super(`${parent} (${parentScope}) cannot depend on ${child} (${childScope}) without leakSafe.`);\n this.name = \"LifetimeLeakError\";\n }\n}\n\nexport class InjectContextError extends CosystemError {\n constructor(token: string) {\n super(`${token} can only be injected while resolving a provider or running an app hook.`);\n this.name = \"InjectContextError\";\n }\n}\n","import type { InjectionToken, Token } from \"./types.js\";\n\nexport function token<T>(description?: string): Token<T> {\n const id = Symbol(description);\n\n if (description === undefined) {\n return { id };\n }\n\n return { id, description };\n}\n\nexport function tokenName(tokenValue: InjectionToken): string {\n if (typeof tokenValue === \"string\") {\n return tokenValue;\n }\n\n if (typeof tokenValue === \"symbol\") {\n return tokenValue.description ?? tokenValue.toString();\n }\n\n if (typeof tokenValue === \"function\") {\n return tokenValue.name || \"<anonymous class>\";\n }\n\n return tokenValue.description ?? tokenValue.id.description ?? tokenValue.id.toString();\n}\n","import { InjectContextError } from \"./errors.js\";\nimport { tokenName } from \"./token.js\";\nimport type { InjectionToken, ResolutionContext, TokenValue } from \"./types.js\";\n\nlet activeResolutionContext: ResolutionContext | undefined;\n\nexport function inject<TToken extends InjectionToken>(token: TToken): TokenValue<TToken> {\n if (activeResolutionContext === undefined) {\n throw new InjectContextError(tokenName(token));\n }\n\n return activeResolutionContext.requestContainer.get(token) as TokenValue<TToken>;\n}\n\nexport function runWithInjectContext<T>(context: ResolutionContext, callback: () => T): T {\n const previousContext = activeResolutionContext;\n activeResolutionContext = context;\n\n try {\n return callback();\n } finally {\n activeResolutionContext = previousContext;\n }\n}\n","import type {\n ClassProvideOptions,\n ClassProvider,\n DependencySpec,\n ExistingProvideOptions,\n ExistingProvider,\n FactoryProvideOptions,\n FactoryProvider,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolvedDeps,\n ValueProvideOptions,\n ValueProvider,\n} from \"./types.js\";\nimport { tokenName } from \"./token.js\";\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ClassProvideOptions<T>,\n): ClassProvider<T>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ValueProvideOptions<T>,\n): ValueProvider<T>;\n\nexport function provide<T, const TDeps extends readonly DependencySpec[]>(\n token: InjectionToken<T>,\n options: FactoryProvideOptions<T, TDeps>,\n): FactoryProvider<T, TDeps>;\n\nexport function provide<T>(\n token: InjectionToken<T>,\n options: ExistingProvideOptions<T>,\n): ExistingProvider<T>;\n\nexport function provide<T>(\n providerToken: InjectionToken<T>,\n options:\n | ClassProvideOptions<T>\n | ValueProvideOptions<T>\n | FactoryProvideOptions<T, readonly DependencySpec[]>\n | ExistingProvideOptions<T>,\n): ClassProvider<T> | ValueProvider<T> | FactoryProvider<T> | ExistingProvider<T> {\n return {\n provide: providerToken,\n ...options,\n };\n}\n\nexport function normalizeProvider(input: ProviderInput): ProviderRecord {\n if (typeof input === \"function\") {\n return normalizeProvider({\n provide: input,\n useClass: input,\n });\n }\n\n const token = input.provide;\n const base = {\n token,\n tokenName: tokenName(token),\n multi: input.multi ?? false,\n leakSafe: input.leakSafe ?? false,\n };\n\n if (\"useClass\" in input) {\n return {\n ...base,\n provider: {\n kind: \"class\",\n useClass: input.useClass,\n },\n scope: input.scope ?? \"singleton\",\n deps:\n input.deps ??\n (input.useClass as { readonly inject?: readonly DependencySpec[] }).inject ??\n [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useValue\" in input) {\n return {\n ...base,\n provider: {\n kind: \"value\",\n useValue: input.useValue,\n },\n scope: \"singleton\",\n deps: [],\n eager: true,\n ...eraseDispose(input.dispose),\n };\n }\n\n if (\"useFactory\" in input) {\n return {\n ...base,\n provider: {\n kind: \"factory\",\n useFactory: input.useFactory as (...deps: readonly unknown[]) => unknown,\n },\n scope: input.scope ?? \"singleton\",\n deps: input.deps ?? [],\n eager: input.eager ?? false,\n ...eraseDispose(input.dispose),\n };\n }\n\n return {\n ...base,\n provider: {\n kind: \"existing\",\n useExisting: input.useExisting,\n },\n scope: \"singleton\",\n deps: [input.useExisting],\n eager: false,\n };\n}\n\nexport type { ResolvedDeps };\n\nfunction eraseDispose<T>(dispose: ((value: T) => void | Promise<void>) | undefined): {\n readonly dispose?: (value: unknown) => void | Promise<void>;\n} {\n if (dispose === undefined) {\n return {};\n }\n\n return {\n dispose: dispose as (value: unknown) => void | Promise<void>,\n };\n}\n","import {\n AmbiguousProviderError,\n AsyncProviderInSyncResolutionError,\n CircularDependencyError,\n DuplicateProviderError,\n FrozenContainerError,\n LifetimeLeakError,\n MissingProviderError,\n} from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport { normalizeProvider } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n BuildOptions,\n Constructor,\n Container,\n ContainerImpl,\n ContainerOptions,\n DependencySpec,\n DisposableInstance,\n InjectionToken,\n ProviderInput,\n ProviderRecord,\n ResolutionContext,\n Scope,\n ScopeOptions,\n} from \"./types.js\";\n\nconst asyncDisposeSymbol: symbol | undefined = Symbol.asyncDispose;\nconst disposeSymbol: symbol | undefined = Symbol.dispose;\n\nexport function createContainer(options: ContainerOptions = {}): Container {\n return new RuntimeContainer(options);\n}\n\nclass RuntimeContainer implements ContainerImpl {\n readonly parent: ContainerImpl | undefined;\n readonly strictScopes: boolean;\n readonly records = new Map<InjectionToken, ProviderRecord[]>();\n readonly scopedCache = new Map<ProviderRecord, unknown>();\n readonly created: DisposableInstance[] = [];\n readonly root: ContainerImpl;\n readonly singletonCache = new Map<ProviderRecord, unknown>();\n frozen = false;\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent as ContainerImpl | undefined;\n this.strictScopes = options.strictScopes ?? this.parent?.strictScopes ?? true;\n this.root = this.parent?.root ?? this;\n }\n\n get<T>(token: InjectionToken<T>): T;\n get<T>(token: InjectionToken<T>, options: { readonly optional: true }): T | undefined;\n get<T>(token: InjectionToken<T>, options?: { readonly optional: true }): T | undefined {\n const record =\n options?.optional === true\n ? this.getSingleRecord(token, true)\n : this.getSingleRecord(token, false);\n\n if (record === undefined) {\n return undefined;\n }\n\n const context = this.createResolutionContext(\"sync\");\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n const records = this.getAllRecords(token);\n const context = this.createResolutionContext(\"sync\");\n\n return records.map((record) => {\n const value = this.resolveRecord(record, context);\n\n if (isPromiseLike(value)) {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return value as T;\n });\n }\n\n async getAsync<T>(token: InjectionToken<T>): Promise<T> {\n const record = this.getSingleRecord(token, false);\n const context = this.createResolutionContext(\"async\");\n return (await this.resolveRecord(record, context)) as T;\n }\n\n has(token: InjectionToken): boolean {\n return this.findRecords(token).length > 0;\n }\n\n provide(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n\n if (!record.multi && existing.some((candidate) => !candidate.multi)) {\n throw new DuplicateProviderError(record.tokenName);\n }\n\n this.records.set(record.token, [...existing, record]);\n }\n\n override(provider: ProviderInput): void {\n this.assertMutable();\n const record = normalizeProvider(provider);\n const existing = this.records.get(record.token) ?? [];\n const kept = existing.filter((candidate) => candidate.multi && !record.multi);\n this.records.set(record.token, [...kept, record]);\n }\n\n createScope(options: ScopeOptions = {}): Container {\n return new RuntimeContainer({\n parent: this,\n strictScopes: options.strictScopes ?? this.strictScopes,\n });\n }\n\n build<T>(target: Constructor<T>, options: BuildOptions = {}): T {\n const deps =\n options.deps ?? (target as { readonly inject?: readonly DependencySpec[] }).inject ?? [];\n const context = this.createResolutionContext(\"sync\");\n const values = this.resolveDependencies(deps, context);\n\n if (isPromiseLike(values)) {\n throw new AsyncProviderInSyncResolutionError(target.name);\n }\n\n return Reflect.construct(target, values) as T;\n }\n\n freeze(): void {\n this.frozen = true;\n }\n\n async dispose(): Promise<void> {\n const errors: unknown[] = [];\n\n for (const entry of [...this.created].toReversed()) {\n if (entry.disposed) {\n continue;\n }\n\n entry.disposed = true;\n\n try {\n await disposeValue(entry.value, entry.record);\n } catch (error) {\n errors.push(error);\n }\n }\n\n this.created.length = 0;\n this.scopedCache.clear();\n\n if (this.root === this) {\n this.singletonCache.clear();\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"One or more providers failed to dispose.\");\n }\n }\n\n private assertMutable(): void {\n if (this.frozen) {\n throw new FrozenContainerError();\n }\n }\n\n private createResolutionContext(mode: \"sync\" | \"async\"): ResolutionContext {\n return {\n stack: [],\n resolutionCache: new Map(),\n mode,\n requestContainer: this,\n };\n }\n\n private getSingleRecord(token: InjectionToken, optional: false): ProviderRecord;\n private getSingleRecord(token: InjectionToken, optional: true): ProviderRecord | undefined;\n private getSingleRecord(token: InjectionToken, optional: boolean): ProviderRecord | undefined {\n const records = this.findRecords(token);\n\n if (records.length === 0) {\n if (optional) {\n return undefined;\n }\n\n throw new MissingProviderError(tokenName(token), []);\n }\n\n const nonMultiRecords = records.filter((record) => !record.multi);\n\n if (nonMultiRecords.length === 1) {\n return nonMultiRecords[0]!;\n }\n\n if (records.length === 1) {\n return records[0]!;\n }\n\n throw new AmbiguousProviderError(tokenName(token));\n }\n\n private getAllRecords(token: InjectionToken): ProviderRecord[] {\n return this.getAllRecordsFromHierarchy(token);\n }\n\n findRecords(token: InjectionToken): ProviderRecord[] {\n const localRecords = this.records.get(token);\n\n if (localRecords !== undefined && localRecords.length > 0) {\n return localRecords;\n }\n\n return this.parent?.findRecords(token) ?? [];\n }\n\n getAllRecordsFromHierarchy(token: InjectionToken): ProviderRecord[] {\n const parentRecords = this.parent?.getAllRecordsFromHierarchy(token) ?? [];\n const localRecords = this.records.get(token) ?? [];\n return [...parentRecords, ...localRecords];\n }\n\n private resolveRecord(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n const cached = this.getCached(record, context);\n\n if (cached.found) {\n return cached.value;\n }\n\n this.assertNoCycle(record, context);\n this.assertLifetimeSafe(record, context);\n\n context.stack.push(record);\n\n const finalize = (value: unknown): unknown => {\n context.stack.pop();\n this.setCached(record, value, context);\n return value;\n };\n\n const fail = (error: unknown): never => {\n context.stack.pop();\n throw error;\n };\n\n try {\n const value = this.createValue(record, context);\n\n if (isPromiseLike(value)) {\n if (context.mode === \"sync\") {\n throw new AsyncProviderInSyncResolutionError(record.tokenName);\n }\n\n return Promise.resolve(value).then(finalize, fail);\n }\n\n return finalize(value);\n } catch (error) {\n return fail(error);\n }\n }\n\n private createValue(\n record: ProviderRecord,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n switch (record.provider.kind) {\n case \"class\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n Reflect.construct(provider.useClass, values),\n );\n }\n\n return Reflect.construct(provider.useClass, deps);\n }\n\n case \"value\":\n return record.provider.useValue;\n\n case \"factory\": {\n const provider = record.provider;\n const deps = this.resolveDependencies(record.deps, context);\n\n if (isPromiseLike(deps)) {\n return Promise.resolve(deps).then((values) =>\n runWithInjectContext(context, () => provider.useFactory(...values)),\n );\n }\n\n return runWithInjectContext(context, () => provider.useFactory(...deps));\n }\n\n case \"existing\":\n return this.resolveDependency(record.provider.useExisting, context);\n }\n }\n\n private resolveDependencies(\n deps: readonly DependencySpec[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values: unknown[] = Array.from({ length: deps.length });\n const asyncValues: Promise<unknown>[] = [];\n\n for (const [index, dep] of deps.entries()) {\n const value = this.resolveDependency(dep, context);\n\n if (isPromiseLike(value)) {\n asyncValues.push(\n Promise.resolve(value).then((resolved) => {\n values[index] = resolved;\n return resolved;\n }),\n );\n } else {\n values[index] = value;\n }\n }\n\n if (asyncValues.length === 0) {\n return values;\n }\n\n return Promise.all(asyncValues).then(() => values);\n }\n\n private resolveDependency(\n dep: DependencySpec,\n context: ResolutionContext,\n ): unknown | Promise<unknown> {\n if (isDependencyObject(dep)) {\n if (dep.many === true) {\n const records = this.getAllRecords(dep.token);\n return this.resolveAllRecords(records, context);\n }\n\n const record =\n dep.optional === true\n ? this.getSingleRecord(dep.token, true)\n : this.getRequiredRecord(dep.token, context);\n\n if (record === undefined) {\n return undefined;\n }\n\n return this.resolveRecord(record, context);\n }\n\n const record = this.getRequiredRecord(dep, context);\n return this.resolveRecord(record, context);\n }\n\n private getRequiredRecord(token: InjectionToken, context: ResolutionContext): ProviderRecord {\n const record = this.getSingleRecord(token, true);\n\n if (record === undefined) {\n throw new MissingProviderError(\n tokenName(token),\n context.stack.map((entry) => entry.tokenName),\n );\n }\n\n return record;\n }\n\n private resolveAllRecords(\n records: readonly ProviderRecord[],\n context: ResolutionContext,\n ): unknown[] | Promise<unknown[]> {\n const values = records.map((record) => this.resolveRecord(record, context));\n\n if (values.some(isPromiseLike)) {\n return Promise.all(values);\n }\n\n return values;\n }\n\n private getCached(\n record: ProviderRecord,\n context: ResolutionContext,\n ): { readonly found: boolean; readonly value?: unknown } {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined || !cache.has(record)) {\n return { found: false };\n }\n\n return { found: true, value: cache.get(record) };\n }\n\n private setCached<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n const cache = this.cacheFor(record, context);\n\n if (cache === undefined) {\n this.trackCreated(record, value, context);\n return;\n }\n\n if (!cache.has(record)) {\n cache.set(record, value);\n this.trackCreated(record, value, context);\n }\n }\n\n private cacheFor(\n record: ProviderRecord,\n context: ResolutionContext,\n ): Map<ProviderRecord, unknown> | undefined {\n switch (record.scope) {\n case \"singleton\":\n return this.root.singletonCache;\n case \"scoped\":\n return context.requestContainer.scopedCache;\n case \"resolution\":\n return context.resolutionCache;\n case \"transient\":\n return undefined;\n }\n }\n\n private trackCreated<T>(record: ProviderRecord, value: T, context: ResolutionContext): void {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const owner = record.scope === \"singleton\" ? this.root : context.requestContainer;\n owner.created.push({ record, value, disposed: false });\n }\n\n private assertNoCycle(record: ProviderRecord, context: ResolutionContext): void {\n const existingIndex = context.stack.indexOf(record);\n\n if (existingIndex === -1) {\n return;\n }\n\n const cycle = [...context.stack.slice(existingIndex), record].map((entry) => entry.tokenName);\n throw new CircularDependencyError(cycle);\n }\n\n private assertLifetimeSafe(record: ProviderRecord, context: ResolutionContext): void {\n if (!this.strictScopes || record.leakSafe || context.stack.length === 0) {\n return;\n }\n\n const parent = context.stack.at(-1);\n\n if (parent === undefined) {\n return;\n }\n\n if (isLifetimeLeak(parent.scope, record.scope)) {\n throw new LifetimeLeakError(parent.tokenName, parent.scope, record.tokenName, record.scope);\n }\n }\n}\n\nfunction isDependencyObject(dep: DependencySpec): dep is {\n readonly token: InjectionToken;\n readonly optional?: boolean;\n readonly many?: boolean;\n} {\n return typeof dep === \"object\" && dep !== null && \"token\" in dep;\n}\n\nfunction isPromiseLike<T = unknown>(value: unknown): value is PromiseLike<T> {\n return (\n (typeof value === \"object\" || typeof value === \"function\") &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n );\n}\n\nfunction isLifetimeLeak(parentScope: Scope, childScope: Scope): boolean {\n if (parentScope === \"singleton\") {\n return childScope === \"scoped\" || childScope === \"resolution\" || childScope === \"transient\";\n }\n\n if (parentScope === \"scoped\") {\n return childScope === \"resolution\" || childScope === \"transient\";\n }\n\n return false;\n}\n\nasync function disposeValue(value: unknown, record: ProviderRecord): Promise<void> {\n if (record.dispose !== undefined) {\n await record.dispose(value);\n }\n\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return;\n }\n\n const maybeDisposable = value as Record<PropertyKey, unknown>;\n\n if (\n asyncDisposeSymbol !== undefined &&\n typeof maybeDisposable[asyncDisposeSymbol] === \"function\"\n ) {\n await (maybeDisposable[asyncDisposeSymbol] as () => Promise<void> | void)();\n return;\n }\n\n if (disposeSymbol !== undefined && typeof maybeDisposable[disposeSymbol] === \"function\") {\n (maybeDisposable[disposeSymbol] as () => void)();\n return;\n }\n\n if (typeof maybeDisposable.dispose === \"function\") {\n await (maybeDisposable.dispose as () => Promise<void> | void)();\n return;\n }\n\n if (typeof maybeDisposable.destroy === \"function\") {\n await (maybeDisposable.destroy as () => Promise<void> | void)();\n }\n}\n","import type { Constructor, DependencySpec, Scope } from \"./types.js\";\n\nexport interface ModuleOptions {\n readonly name?: string;\n readonly deps?: readonly DependencySpec[];\n readonly scope?: Scope;\n}\n\nexport interface DefineModuleOptions extends ModuleOptions {\n readonly state?: readonly PropertyKey[];\n readonly actions?: readonly PropertyKey[];\n readonly computed?: readonly PropertyKey[];\n}\n\nexport interface ModuleMetadata {\n readonly kind: \"module\";\n name?: string;\n deps?: readonly DependencySpec[];\n scope?: Scope;\n readonly state: Set<PropertyKey>;\n readonly actions: Set<PropertyKey>;\n readonly computed: Set<PropertyKey>;\n}\n\nconst moduleMetadata = new WeakMap<Function, ModuleMetadata>();\nconst moduleMetadataKey = Symbol.for(\"@cosystem/core/moduleMetadata\");\nconst symbolMetadataKey: symbol | undefined = (\n Symbol as SymbolConstructor & { readonly metadata?: symbol }\n).metadata;\n\nexport interface MetadataContext {\n readonly metadata?: Record<PropertyKey, unknown> | undefined;\n}\n\nexport function defineModule<T extends Constructor>(\n target: T,\n options: DefineModuleOptions = {},\n context?: MetadataContext,\n): T {\n const metadata = ensureModuleMetadata(target);\n mergeModuleMetadata(metadata, readContextMetadata(context));\n applyModuleOptions(metadata, options);\n addProperties(metadata.state, options.state);\n addProperties(metadata.actions, options.actions);\n writeContextMetadata(context, metadata);\n addProperties(metadata.computed, options.computed);\n return target;\n}\n\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n const existing = moduleMetadata.get(target);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const metadata = readSymbolMetadata(target);\n\n if (metadata === undefined) {\n return undefined;\n }\n\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nexport function addModuleState(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).state.add(property);\n}\n\nexport function addModuleAction(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).actions.add(property);\n}\n\nexport function addModuleComputed(target: Function, property: PropertyKey): void {\n ensureModuleMetadata(target).computed.add(property);\n}\n\nexport function applyModuleOptions(metadata: ModuleMetadata, options: ModuleOptions): void {\n if (options.name !== undefined) {\n metadata.name = options.name;\n }\n\n if (options.deps !== undefined) {\n metadata.deps = options.deps;\n }\n\n if (options.scope !== undefined) {\n metadata.scope = options.scope;\n }\n}\n\nexport function ensureModuleMetadata(target: Function): ModuleMetadata {\n let metadata = moduleMetadata.get(target);\n\n if (metadata !== undefined) {\n return metadata;\n }\n\n metadata = {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n };\n moduleMetadata.set(target, metadata);\n return metadata;\n}\n\nexport function ensureContextModuleMetadata(\n context: MetadataContext | undefined,\n): ModuleMetadata | undefined {\n if (context?.metadata === undefined) {\n return undefined;\n }\n\n const existing = readContextMetadata(context);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const metadata = createModuleMetadata();\n writeContextMetadata(context, metadata);\n return metadata;\n}\n\nfunction addProperties(target: Set<PropertyKey>, properties: readonly PropertyKey[] | undefined) {\n for (const property of properties ?? []) {\n target.add(property);\n }\n}\n\nfunction createModuleMetadata(): ModuleMetadata {\n return {\n kind: \"module\",\n state: new Set(),\n actions: new Set(),\n computed: new Set(),\n };\n}\n\nfunction readContextMetadata(context: MetadataContext | undefined): ModuleMetadata | undefined {\n const value = context?.metadata?.[moduleMetadataKey];\n return isModuleMetadata(value) ? value : undefined;\n}\n\nfunction writeContextMetadata(\n context: MetadataContext | undefined,\n metadata: ModuleMetadata,\n): void {\n if (context?.metadata === undefined) {\n return;\n }\n\n context.metadata[moduleMetadataKey] = metadata;\n}\n\nfunction readSymbolMetadata(target: Function): ModuleMetadata | undefined {\n if (symbolMetadataKey === undefined) {\n return undefined;\n }\n\n const metadata = (target as unknown as Record<PropertyKey, unknown>)[symbolMetadataKey];\n\n if (metadata === undefined || metadata === null || typeof metadata !== \"object\") {\n return undefined;\n }\n\n const value = (metadata as Record<PropertyKey, unknown>)[moduleMetadataKey];\n return isModuleMetadata(value) ? value : undefined;\n}\n\nfunction mergeModuleMetadata(target: ModuleMetadata, source: ModuleMetadata | undefined): void {\n if (source === undefined || source === target) {\n return;\n }\n\n applyModuleOptions(target, source);\n addProperties(target.state, [...source.state]);\n addProperties(target.actions, [...source.actions]);\n addProperties(target.computed, [...source.computed]);\n}\n\nfunction isModuleMetadata(value: unknown): value is ModuleMetadata {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as ModuleMetadata).kind === \"module\" &&\n value instanceof Object &&\n (value as ModuleMetadata).state instanceof Set &&\n (value as ModuleMetadata).actions instanceof Set &&\n (value as ModuleMetadata).computed instanceof Set\n );\n}\n","import { create as createCoactionStore, createReactiveTracker, type Store } from \"coaction\";\n\nimport { createContainer } from \"./container.js\";\nimport { CosystemError, DuplicateProviderError } from \"./errors.js\";\nimport { runWithInjectContext } from \"./inject.js\";\nimport { getModuleMetadata, type ModuleMetadata } from \"./metadata.js\";\nimport { provide } from \"./provider.js\";\nimport { tokenName } from \"./token.js\";\nimport type {\n ClassProvideOptions,\n Constructor,\n Container,\n InjectionToken,\n Provider,\n ProviderInput,\n ResolutionContext,\n ScopeOptions,\n} from \"./types.js\";\n\nexport interface EngineOptions {\n readonly patches?: boolean;\n readonly devtools?: boolean;\n readonly transport?: unknown;\n}\n\nexport interface AppDevOptions {\n readonly strictActions?: boolean;\n}\n\nexport interface CreateAppOptions {\n readonly providers?: readonly ProviderInput[];\n readonly plugins?: readonly Plugin[];\n readonly parent?: App | Container;\n readonly devOptions?: AppDevOptions;\n readonly engine?: EngineOptions;\n}\n\nexport interface InternalCreateAppOptions extends CreateAppOptions {\n readonly overrides?: readonly ProviderInput[];\n readonly testInspector?: MutableTestInspector;\n}\n\nexport interface AppState {\n readonly version: number;\n}\n\nexport interface AppScope {\n readonly container: Container;\n}\n\nexport interface App {\n readonly state: AppState;\n readonly started: boolean;\n readonly store: Store<RootState>;\n\n get<T>(token: InjectionToken<T>): T;\n getAsync<T>(token: InjectionToken<T>): Promise<T>;\n getAll<T>(token: InjectionToken<T>): T[];\n getModule<T>(token: InjectionToken<T>): T;\n getModuleByName<T = unknown>(name: string): T;\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options?: WatchOptions<T>,\n ): () => void;\n start(): Promise<void>;\n stop(): Promise<void>;\n dispose(): Promise<void>;\n createScope(options?: ScopeOptions): AppScope;\n}\n\nexport interface WatchOptions<T> {\n readonly equals?: (value: T, previous: T) => boolean;\n readonly immediate?: boolean;\n}\n\nexport interface Plugin {\n readonly name?: string;\n setup?(app: App): void | Promise<void>;\n onModuleCreated?(event: ModuleCreatedEvent): void;\n onActionStart?(event: ActionEvent): void;\n onActionEnd?(event: ActionEvent): void;\n onPatch?(event: PatchEvent): void;\n onStateChange?(event: StateChangeEvent): void;\n onError?(error: unknown, context: ErrorContext): void;\n dispose?(): void | Promise<void>;\n}\n\nexport interface ModuleCreatedEvent {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: unknown;\n}\n\nexport interface ActionEvent {\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n readonly startedAt: number;\n readonly endedAt?: number;\n readonly error?: unknown;\n}\n\nexport interface StateChangeEvent {\n readonly state: unknown;\n}\n\nexport interface PatchEvent {\n readonly patches: readonly unknown[];\n readonly inversePatches: readonly unknown[];\n}\n\nexport interface ErrorContext {\n readonly phase: string;\n}\n\nexport interface TestAppInspector {\n getActions(): readonly ActionEvent[];\n getState(): unknown;\n getPatches(): readonly unknown[];\n clearActions(): void;\n clearPatches(): void;\n flushEffects(): Promise<void>;\n}\n\nexport interface MutableTestInspector extends TestAppInspector {\n recordAction(event: ActionEvent): void;\n recordPatch(patch: unknown): void;\n recordState(state: unknown): void;\n}\n\ntype RootState = Record<string, Record<PropertyKey, unknown>>;\ntype StoreSetState = Store<RootState>[\"setState\"];\n\ninterface CoactionStoreOptions {\n readonly name: string;\n readonly sliceMode: \"single\";\n readonly enablePatches?: boolean;\n readonly transport?: unknown;\n}\n\ninterface ModuleBinding {\n readonly name: string;\n readonly token: InjectionToken;\n readonly instance: Record<PropertyKey, unknown>;\n readonly metadata: ModuleMetadata;\n readonly originalActions: Map<PropertyKey, (...args: unknown[]) => unknown>;\n readonly originalComputed: Map<PropertyKey, () => unknown>;\n activeDraft: Record<PropertyKey, unknown> | undefined;\n actionDepth: number;\n}\n\ninterface RuntimeModuleMetadata {\n readonly app: App;\n readonly name: string;\n readonly token: InjectionToken;\n}\n\ninterface LifecycleModule {\n onInit?(): void | Promise<void>;\n onStart?(): void | Promise<void>;\n onStop?(): void | Promise<void>;\n onDispose?(): void | Promise<void>;\n}\n\nconst runtimeModuleMetadataKey = Symbol.for(\"@cosystem/core/runtimeModule\");\nconst appContainerMap = new WeakMap<App, Container>();\n\nexport function createApp(options: CreateAppOptions = {}): App {\n return createAppInternal(options);\n}\n\nexport function createAppInternal(options: InternalCreateAppOptions = {}): App {\n const parent = isApp(options.parent) ? getAppContainer(options.parent) : options.parent;\n const container = parent === undefined ? createContainer() : createContainer({ parent });\n const moduleTokens: InjectionToken[] = [];\n\n for (const provider of options.providers ?? []) {\n const normalized = normalizeAppProvider(provider);\n container.provide(normalized.provider);\n\n if (normalized.moduleToken !== undefined) {\n moduleTokens.push(normalized.moduleToken);\n }\n }\n\n for (const override of options.overrides ?? []) {\n container.override(normalizeAppProvider(override).provider);\n }\n\n container.freeze();\n\n const modules = instantiateModules(container, moduleTokens);\n const rootState = createRootState(modules);\n const store = createCoactionStore(\n rootState,\n createStoreOptions(options.engine, shouldEnablePatches(options)) as never,\n );\n const state: { version: number } = { version: 0 };\n const app = new RuntimeApp({\n container,\n devOptions: options.devOptions ?? {},\n modules,\n plugins: options.plugins ?? [],\n state,\n store,\n ...(options.testInspector === undefined ? {} : { testInspector: options.testInspector }),\n });\n\n app.bindModules();\n app.attachRuntimeMetadata();\n app.runModuleCreatedHooks();\n app.init();\n appContainerMap.set(app, container);\n\n return app;\n}\n\nclass RuntimeApp implements App {\n readonly state: AppState;\n readonly store: Store<RootState>;\n\n readonly #container: Container;\n private readonly devOptions: AppDevOptions;\n private readonly modules: ModuleBinding[];\n private readonly moduleByToken = new Map<InjectionToken, ModuleBinding>();\n private readonly moduleByName = new Map<string, ModuleBinding>();\n private readonly plugins: readonly Plugin[];\n private readonly testInspector: MutableTestInspector | undefined;\n private initPromise: Promise<void> = Promise.resolve();\n private isStarted = false;\n private isDisposed = false;\n\n constructor(options: {\n readonly container: Container;\n readonly devOptions: AppDevOptions;\n readonly modules: ModuleBinding[];\n readonly plugins: readonly Plugin[];\n readonly state: AppState;\n readonly store: Store<RootState>;\n readonly testInspector?: MutableTestInspector;\n }) {\n this.#container = options.container;\n this.devOptions = options.devOptions;\n this.modules = options.modules;\n this.plugins = options.plugins;\n this.state = options.state;\n this.store = options.store;\n this.testInspector = options.testInspector;\n\n for (const moduleBinding of options.modules) {\n this.moduleByToken.set(moduleBinding.token, moduleBinding);\n this.moduleByName.set(moduleBinding.name, moduleBinding);\n }\n\n this.wrapStoreSetState();\n\n this.store.subscribe(() => {\n (this.state as { version: number }).version += 1;\n const state = this.store.getPureState();\n this.testInspector?.recordState(state);\n this.emitStateChange({ state });\n });\n }\n\n get started(): boolean {\n return this.isStarted;\n }\n\n get<T>(token: InjectionToken<T>): T {\n return this.#container.get(token);\n }\n\n getAsync<T>(token: InjectionToken<T>): Promise<T> {\n return this.#container.getAsync(token);\n }\n\n getAll<T>(token: InjectionToken<T>): T[] {\n return this.#container.getAll(token);\n }\n\n getModule<T>(token: InjectionToken<T>): T {\n const value = this.get(token);\n\n if (!this.moduleByToken.has(token)) {\n throw new CosystemError(`${tokenName(token)} is not a CoSystem module.`);\n }\n\n return value;\n }\n\n getModuleByName<T = unknown>(name: string): T {\n const moduleBinding = this.moduleByName.get(name);\n\n if (moduleBinding === undefined) {\n throw new CosystemError(`${name} is not a CoSystem module.`);\n }\n\n return moduleBinding.instance as T;\n }\n\n watch<T>(\n read: () => T,\n listener: (value: T, previous: T) => void,\n options: WatchOptions<T> = {},\n ): () => void {\n const equals = options.equals ?? Object.is;\n const tracker = createReactiveTracker();\n let previous = tracker.track(read);\n\n if (options.immediate === true) {\n listener(previous, previous);\n }\n\n const publish = () => {\n const next = tracker.track(read);\n\n if (equals(next, previous)) {\n return;\n }\n\n const last = previous;\n previous = next;\n listener(next, last);\n };\n\n const unsubscribeStore = this.store.subscribe(publish);\n const unsubscribeTracker = tracker.subscribe(publish);\n\n return () => {\n unsubscribeStore();\n unsubscribeTracker();\n tracker.dispose();\n };\n }\n\n async start(): Promise<void> {\n if (this.isStarted) {\n return;\n }\n\n await this.initPromise;\n\n try {\n await this.runLifecycle(\"onStart\");\n this.isStarted = true;\n } catch (error) {\n this.emitError(error, { phase: \"start\" });\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (!this.isStarted) {\n return;\n }\n\n try {\n await this.runLifecycle(\"onStop\", true);\n this.isStarted = false;\n } catch (error) {\n this.emitError(error, { phase: \"stop\" });\n throw error;\n }\n }\n\n async dispose(): Promise<void> {\n if (this.isDisposed) {\n return;\n }\n\n await this.stop();\n\n try {\n await this.runLifecycle(\"onDispose\", true);\n await Promise.all(this.plugins.map((plugin) => plugin.dispose?.()));\n await this.#container.dispose();\n this.store.destroy();\n this.isDisposed = true;\n } catch (error) {\n this.emitError(error, { phase: \"dispose\" });\n throw error;\n }\n }\n\n createScope(options?: ScopeOptions): AppScope {\n return {\n container: this.#container.createScope(options),\n };\n }\n\n bindModules(): void {\n for (const moduleBinding of this.modules) {\n this.bindState(moduleBinding);\n this.bindComputed(moduleBinding);\n this.bindActions(moduleBinding);\n }\n }\n\n attachRuntimeMetadata(): void {\n for (const moduleBinding of this.modules) {\n Object.defineProperty(moduleBinding.instance, runtimeModuleMetadataKey, {\n configurable: false,\n enumerable: false,\n value: {\n app: this,\n name: moduleBinding.name,\n token: moduleBinding.token,\n } satisfies RuntimeModuleMetadata,\n });\n }\n }\n\n runModuleCreatedHooks(): void {\n for (const moduleBinding of this.modules) {\n const event: ModuleCreatedEvent = {\n name: moduleBinding.name,\n token: moduleBinding.token,\n instance: moduleBinding.instance,\n };\n\n for (const plugin of this.plugins) {\n plugin.onModuleCreated?.(event);\n }\n }\n }\n\n init(): void {\n this.initPromise = (async () => {\n try {\n await Promise.all(\n this.plugins.map((plugin) => this.runWithAppInjectContext(() => plugin.setup?.(this))),\n );\n await this.runLifecycle(\"onInit\");\n } catch (error) {\n this.emitError(error, { phase: \"init\" });\n throw error;\n }\n })();\n }\n\n private bindState(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.state) {\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => this.readModuleState(moduleBinding, property),\n set: (value: unknown) => this.writeModuleState(moduleBinding, property, value),\n });\n }\n }\n\n private bindActions(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.actions) {\n const action = getMethod(moduleBinding.instance, property);\n moduleBinding.originalActions.set(property, action);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n value: (...args: unknown[]) => this.runAction(moduleBinding, property, args),\n });\n }\n }\n\n private bindComputed(moduleBinding: ModuleBinding): void {\n for (const property of moduleBinding.metadata.computed) {\n const getter = getGetter(moduleBinding.instance, property);\n moduleBinding.originalComputed.set(property, getter);\n\n Object.defineProperty(moduleBinding.instance, property, {\n configurable: true,\n enumerable: true,\n get: () => getter.call(moduleBinding.instance),\n });\n }\n }\n\n private readModuleState(moduleBinding: ModuleBinding, property: PropertyKey): unknown {\n return this.store.getState()[moduleBinding.name]?.[property];\n }\n\n private writeModuleState(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n value: unknown,\n ): void {\n if (moduleBinding.activeDraft !== undefined) {\n moduleBinding.activeDraft[property] = value;\n return;\n }\n\n if (this.devOptions.strictActions === true && moduleBinding.actionDepth === 0) {\n throw new CosystemError(\n `Cannot write ${moduleBinding.name}.${String(property)} outside an action.`,\n );\n }\n\n this.store.setState((draft) => {\n draft[moduleBinding.name] ??= {};\n draft[moduleBinding.name]![property] = value;\n });\n }\n\n private runAction(\n moduleBinding: ModuleBinding,\n property: PropertyKey,\n args: readonly unknown[],\n ): unknown {\n const action = moduleBinding.originalActions.get(property);\n\n if (action === undefined) {\n throw new CosystemError(`${moduleBinding.name}.${String(property)} is not an action.`);\n }\n\n const event: ActionEvent = {\n args,\n method: String(property),\n module: moduleBinding.name,\n startedAt: Date.now(),\n };\n this.emitActionStart(event);\n\n let result: unknown;\n let error: unknown;\n\n try {\n moduleBinding.actionDepth += 1;\n this.store.setState((draft) => {\n const previousDraft = moduleBinding.activeDraft;\n moduleBinding.activeDraft = draft[moduleBinding.name] ?? {};\n draft[moduleBinding.name] = moduleBinding.activeDraft;\n\n try {\n result = action.apply(moduleBinding.instance, [...args]);\n } finally {\n moduleBinding.activeDraft = previousDraft;\n }\n });\n } catch (caught) {\n error = caught;\n this.emitError(caught, { phase: \"action\" });\n } finally {\n moduleBinding.actionDepth -= 1;\n }\n\n const endedEvent: ActionEvent = {\n ...event,\n endedAt: Date.now(),\n ...(error === undefined ? {} : { error }),\n };\n this.testInspector?.recordAction(endedEvent);\n this.emitActionEnd(endedEvent);\n\n if (error !== undefined) {\n throw error;\n }\n\n return result;\n }\n\n private async runLifecycle(method: keyof LifecycleModule, reverse = false): Promise<void> {\n const modules = reverse ? this.modules.toReversed() : this.modules;\n\n for (const moduleBinding of modules) {\n const lifecycle = moduleBinding.instance as LifecycleModule;\n await this.runWithAppInjectContext(() => lifecycle[method]?.());\n }\n }\n\n private emitActionStart(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionStart?.(event);\n }\n }\n\n private emitActionEnd(event: ActionEvent): void {\n for (const plugin of this.plugins) {\n plugin.onActionEnd?.(event);\n }\n }\n\n private emitStateChange(event: StateChangeEvent): void {\n for (const plugin of this.plugins) {\n plugin.onStateChange?.(event);\n }\n }\n\n private emitPatch(event: PatchEvent): void {\n for (const plugin of this.plugins) {\n plugin.onPatch?.(event);\n }\n }\n\n private emitError(error: unknown, context: ErrorContext): void {\n for (const plugin of this.plugins) {\n plugin.onError?.(error, context);\n }\n }\n\n private runWithAppInjectContext<T>(callback: () => T): T {\n return runWithInjectContext(\n {\n mode: \"sync\",\n requestContainer: this.#container as ResolutionContext[\"requestContainer\"],\n resolutionCache: new Map(),\n stack: [],\n },\n callback,\n );\n }\n\n private wrapStoreSetState(): void {\n const originalSetState = this.store.setState.bind(this.store) as (\n ...args: Parameters<StoreSetState>\n ) => unknown;\n\n this.store.setState = ((...args: Parameters<StoreSetState>) => {\n const result = originalSetState(...args);\n this.recordMutationResult(result);\n return result as never;\n }) as StoreSetState;\n }\n\n private recordMutationResult(result: unknown): void {\n if (!Array.isArray(result) || result.length < 3) {\n return;\n }\n\n const patches = result[1] as readonly unknown[];\n\n if (patches.length === 0) {\n return;\n }\n\n this.testInspector?.recordPatch(patches);\n this.emitPatch({\n inversePatches: result[2] as readonly unknown[],\n patches,\n });\n }\n}\n\nfunction normalizeAppProvider(provider: ProviderInput): {\n readonly provider: ProviderInput;\n readonly moduleToken?: InjectionToken;\n} {\n if (typeof provider === \"function\") {\n const metadata = getModuleMetadata(provider);\n\n if (metadata !== undefined) {\n return {\n provider: provide(provider, createModuleClassProviderOptions(provider, metadata)),\n moduleToken: provider,\n };\n }\n\n return { provider };\n }\n\n if (\"useClass\" in provider) {\n const metadata = getModuleMetadata(provider.useClass);\n\n if (metadata !== undefined) {\n return {\n provider: {\n ...provider,\n ...mergeModuleClassProviderOptions(provider, metadata),\n },\n moduleToken: provider.provide,\n };\n }\n }\n\n return { provider };\n}\n\nfunction createStoreOptions(\n engine: EngineOptions | undefined,\n enablePatches: boolean,\n): CoactionStoreOptions {\n return {\n name: \"cosystem\",\n sliceMode: \"single\",\n enablePatches,\n ...(engine?.transport === undefined ? {} : { transport: engine.transport }),\n } as CoactionStoreOptions;\n}\n\nfunction shouldEnablePatches(options: InternalCreateAppOptions): boolean {\n if (options.engine?.patches !== undefined) {\n return options.engine.patches;\n }\n\n return (\n options.testInspector !== undefined ||\n (options.plugins ?? []).some((plugin) => plugin.onPatch !== undefined)\n );\n}\n\nfunction createModuleClassProviderOptions<T>(\n useClass: Constructor<T>,\n metadata: ModuleMetadata,\n): ClassProvideOptions<T> {\n return {\n useClass,\n ...(metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction mergeModuleClassProviderOptions<T>(\n provider: Provider<T>,\n metadata: ModuleMetadata,\n): Partial<ClassProvideOptions<T>> {\n return {\n ...(\"deps\" in provider || metadata.deps === undefined ? {} : { deps: metadata.deps }),\n ...(\"scope\" in provider || metadata.scope === undefined ? {} : { scope: metadata.scope }),\n };\n}\n\nfunction instantiateModules(container: Container, moduleTokens: readonly InjectionToken[]) {\n const modules: ModuleBinding[] = [];\n\n for (const moduleToken of moduleTokens) {\n const instance = container.get(moduleToken) as Record<PropertyKey, unknown>;\n const metadata = getModuleMetadata(instance.constructor);\n\n if (metadata === undefined) {\n continue;\n }\n\n const name = metadata.name ?? stableModuleName(moduleToken);\n\n if (modules.some((moduleBinding) => moduleBinding.name === name)) {\n throw new DuplicateProviderError(name);\n }\n\n modules.push({\n actionDepth: 0,\n activeDraft: undefined,\n instance,\n metadata,\n name,\n originalActions: new Map(),\n originalComputed: new Map(),\n token: moduleToken,\n });\n }\n\n return modules;\n}\n\nfunction createRootState(modules: readonly ModuleBinding[]): RootState {\n const rootState: RootState = {};\n\n for (const moduleBinding of modules) {\n const state: Record<PropertyKey, unknown> = {};\n\n for (const property of moduleBinding.metadata.state) {\n state[property] = moduleBinding.instance[property];\n }\n\n rootState[moduleBinding.name] = state;\n }\n\n return rootState;\n}\n\nfunction stableModuleName(token: InjectionToken): string {\n const name = tokenName(token);\n return `${name.slice(0, 1).toLowerCase()}${name.slice(1)}`;\n}\n\nfunction getMethod(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): (...args: unknown[]) => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.value === undefined || typeof descriptor.value !== \"function\") {\n throw new CosystemError(`${String(property)} is not a method.`);\n }\n\n return descriptor.value as (...args: unknown[]) => unknown;\n}\n\nfunction getGetter(instance: Record<PropertyKey, unknown>, property: PropertyKey): () => unknown {\n const descriptor = getDescriptor(instance, property);\n\n if (descriptor?.get === undefined) {\n throw new CosystemError(`${String(property)} is not a getter.`);\n }\n\n return descriptor.get;\n}\n\nfunction getDescriptor(\n instance: Record<PropertyKey, unknown>,\n property: PropertyKey,\n): PropertyDescriptor | undefined {\n let current: object | null = instance;\n\n while (current !== null) {\n const descriptor = Object.getOwnPropertyDescriptor(current, property);\n\n if (descriptor !== undefined) {\n return descriptor;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return undefined;\n}\n\nfunction isApp(value: unknown): value is App {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"get\" in value &&\n \"start\" in value &&\n \"dispose\" in value\n );\n}\n\nfunction getAppContainer(app: App): Container {\n const container = appContainerMap.get(app);\n\n if (container === undefined) {\n throw new CosystemError(\"Parent app was not created by CoSystem.\");\n }\n\n return container;\n}\n","import {\n addModuleAction,\n addModuleComputed,\n addModuleState,\n applyModuleOptions,\n defineModule,\n ensureContextModuleMetadata,\n ensureModuleMetadata,\n type ModuleOptions,\n} from \"./metadata.js\";\nimport type { Constructor } from \"./types.js\";\n\nexport function module(options: ModuleOptions = {}) {\n return function moduleDecorator<T extends Constructor>(\n target: T,\n context?: ClassDecoratorContext<T>,\n ): T {\n defineModule(target, options, context);\n return target;\n };\n}\n\nexport function state<This extends object, Value>(\n _value: ClassAccessorDecoratorTarget<This, Value>,\n context: ClassAccessorDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"accessor\") {\n throw new TypeError(\"@state only supports standard accessor decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.state.add(context.name);\n\n context.addInitializer(function initializeState(this: This) {\n addModuleState(this.constructor, context.name);\n });\n}\n\nexport function action<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n if (context.kind !== \"method\") {\n throw new TypeError(\"@action only supports method decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.actions.add(context.name);\n\n context.addInitializer(function initializeAction(this: This) {\n addModuleAction(this.constructor, context.name);\n });\n}\n\nexport function computed<This extends object, Value>(\n _value: (this: This) => Value,\n context: ClassGetterDecoratorContext<This, Value>,\n): void {\n if (context.kind !== \"getter\") {\n throw new TypeError(\"@computed only supports getter decorators.\");\n }\n\n ensureContextModuleMetadata(context)?.computed.add(context.name);\n\n context.addInitializer(function initializeComputed(this: This) {\n addModuleComputed(this.constructor, context.name);\n });\n}\n\nexport function effect<This extends object, Args extends unknown[], Return>(\n _value: (this: This, ...args: Args) => Return,\n _context: ClassMethodDecoratorContext<This, (this: This, ...args: Args) => Return>,\n): void {\n // Effect scheduling is intentionally deferred until the app runtime has real\n // lifecycle semantics for reactive side effects.\n}\n\nexport function moduleOptions(target: Constructor, options: ModuleOptions): void {\n applyModuleOptions(ensureModuleMetadata(target), options);\n}\n","import type { Plugin } from \"./app.js\";\n\nexport interface LoggerPluginLogger {\n info(message: string, details?: unknown): void;\n error(message: string, details?: unknown): void;\n}\n\nexport interface LoggerPluginOptions {\n readonly logger?: LoggerPluginLogger;\n}\n\nexport function createLoggerPlugin(options: LoggerPluginOptions = {}): Plugin {\n const logger = options.logger ?? console;\n\n return {\n name: \"cosystem:logger\",\n onActionEnd(event) {\n if (event.error !== undefined) {\n logger.error(`Action failed: ${event.module}.${event.method}`, event);\n return;\n }\n\n logger.info(`Action completed: ${event.module}.${event.method}`, event);\n },\n onError(error, context) {\n logger.error(`Runtime error during ${context.phase}`, error);\n },\n onModuleCreated(event) {\n logger.info(`Module created: ${event.name}`, event);\n },\n };\n}\n","import { createAppInternal, type MutableTestInspector } from \"./app.js\";\nimport type { ActionEvent, CreateAppOptions, TestAppInspector } from \"./app.js\";\nimport type { ProviderInput } from \"./types.js\";\n\nexport interface TestAppOptions extends Omit<CreateAppOptions, \"providers\"> {\n readonly providers?: readonly ProviderInput[];\n readonly overrides?: readonly ProviderInput[];\n readonly autoStart?: boolean;\n readonly strictActions?: boolean;\n}\n\nexport interface TestApp extends ReturnType<typeof createAppInternal> {\n readonly test: TestAppInspector;\n}\n\nexport interface AutoStartedTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart: true;\n}\n\nexport interface ManualTestAppOptions extends Omit<TestAppOptions, \"autoStart\"> {\n readonly autoStart?: false;\n}\n\nexport function testApp(options: AutoStartedTestAppOptions): Promise<TestApp>;\nexport function testApp(options?: ManualTestAppOptions): TestApp;\nexport function testApp(options: TestAppOptions = {}): TestApp | Promise<TestApp> {\n const inspector = createTestInspector();\n const { autoStart, overrides, strictActions, ...createOptions } = options;\n const app = createAppInternal({\n ...createOptions,\n devOptions: {\n ...createOptions.devOptions,\n ...(strictActions === undefined ? {} : { strictActions }),\n },\n ...(overrides === undefined ? {} : { overrides }),\n testInspector: inspector,\n }) as TestApp;\n\n Object.defineProperty(app, \"test\", {\n configurable: false,\n enumerable: false,\n value: inspector,\n });\n\n if (autoStart === true) {\n return app.start().then(() => app);\n }\n\n return app;\n}\n\nfunction createTestInspector(): MutableTestInspector {\n const actions: ActionEvent[] = [];\n const patches: unknown[] = [];\n let lastState: unknown;\n\n return {\n clearActions() {\n actions.length = 0;\n },\n clearPatches() {\n patches.length = 0;\n },\n flushEffects() {\n return Promise.resolve();\n },\n getActions() {\n return actions;\n },\n getPatches() {\n return patches;\n },\n getState() {\n return lastState;\n },\n recordAction(event) {\n actions.push(event);\n },\n recordPatch(patch) {\n patches.push(patch);\n },\n recordState(state) {\n lastState = state;\n },\n };\n}\n","import { CosystemError } from \"./errors.js\";\nimport { createApp, type App, type CreateAppOptions, type Plugin } from \"./app.js\";\n\nexport interface WorkerTransport {\n post(message: WorkerMessage): void;\n subscribe(listener: (message: WorkerMessage) => void): () => void;\n}\n\nexport type WorkerMessage =\n | WorkerCallMessage\n | WorkerResultMessage\n | WorkerStateMessage\n | WorkerReadyMessage;\n\nexport interface WorkerCallMessage {\n readonly id: number;\n readonly type: \"call\";\n readonly module: string;\n readonly method: string;\n readonly args: readonly unknown[];\n}\n\nexport interface WorkerResultMessage {\n readonly id: number;\n readonly type: \"result\";\n readonly value?: unknown;\n readonly error?: SerializedWorkerError;\n}\n\nexport interface WorkerStateMessage {\n readonly type: \"state\";\n readonly state: unknown;\n readonly patches?: readonly unknown[];\n readonly sync: \"patch\" | \"snapshot\";\n readonly version: number;\n}\n\nexport interface WorkerReadyMessage {\n readonly type: \"ready\";\n}\n\nexport interface SerializedWorkerError {\n readonly name: string;\n readonly message: string;\n readonly stack?: string;\n}\n\nexport interface CreateWorkerAppOptions extends CreateAppOptions {\n readonly transport: WorkerTransport;\n}\n\nexport interface WorkerAppHost {\n readonly app: App;\n dispose(): Promise<void>;\n}\n\nexport interface CreateWorkerClientOptions {\n readonly transport: WorkerTransport;\n}\n\nexport type AsyncMethodProxy<T extends object> = {\n readonly [Key in keyof T as T[Key] extends (...args: any[]) => unknown\n ? Key\n : never]: T[Key] extends (...args: infer Args) => infer Return\n ? (...args: Args) => Promise<Awaited<Return>>\n : never;\n};\n\nexport interface WorkerClient {\n readonly state: {\n readonly version: number;\n };\n getState(): unknown;\n call(module: string, method: string, ...args: readonly unknown[]): Promise<unknown>;\n module<T extends object>(name: string): AsyncMethodProxy<T>;\n subscribe(listener: (message: WorkerStateMessage) => void): () => void;\n dispose(): void;\n}\n\nexport function createWorkerApp(options: CreateWorkerAppOptions): WorkerAppHost {\n const { transport, ...appOptions } = options;\n const patchPlugin: Plugin = {\n name: \"cosystem:worker-patches\",\n onPatch(event) {\n publishState(app, transport, event.patches);\n },\n };\n const app = createApp({\n ...appOptions,\n engine: {\n ...appOptions.engine,\n patches: true,\n },\n plugins: [...(appOptions.plugins ?? []), patchPlugin],\n });\n const unsubscribeTransport = transport.subscribe((message) => {\n if (message.type !== \"call\") {\n return;\n }\n\n void handleCall(app, transport, message);\n });\n\n transport.post({ type: \"ready\" });\n publishState(app, transport);\n\n return {\n app,\n async dispose() {\n unsubscribeTransport();\n await app.dispose();\n },\n };\n}\n\nexport function createWorkerClient(options: CreateWorkerClientOptions): WorkerClient {\n const { transport } = options;\n const listeners = new Set<(message: WorkerStateMessage) => void>();\n const pending = new Map<\n number,\n {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: unknown) => void;\n }\n >();\n const state = { version: 0 };\n let nextId = 1;\n let snapshot: unknown;\n\n const unsubscribe = transport.subscribe((message) => {\n if (message.type === \"state\") {\n state.version = message.version;\n snapshot = message.state;\n\n for (const listener of listeners) {\n listener(message);\n }\n\n return;\n }\n\n if (message.type !== \"result\") {\n return;\n }\n\n const entry = pending.get(message.id);\n\n if (entry === undefined) {\n return;\n }\n\n pending.delete(message.id);\n\n if (message.error !== undefined) {\n entry.reject(createRemoteError(message.error));\n return;\n }\n\n entry.resolve(message.value);\n });\n\n const client: WorkerClient = {\n state,\n call(module, method, ...args) {\n const id = nextId;\n nextId += 1;\n\n return new Promise((resolve, reject) => {\n pending.set(id, { reject, resolve });\n transport.post({\n args,\n id,\n method,\n module,\n type: \"call\",\n });\n });\n },\n dispose() {\n unsubscribe();\n\n for (const entry of pending.values()) {\n entry.reject(new CosystemError(\"Worker client disposed before response.\"));\n }\n\n pending.clear();\n listeners.clear();\n },\n getState() {\n return snapshot;\n },\n module<T extends object>(name: string): AsyncMethodProxy<T> {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (typeof property !== \"string\") {\n return undefined;\n }\n\n return (...args: readonly unknown[]) => client.call(name, property, ...args);\n },\n },\n ) as AsyncMethodProxy<T>;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n };\n\n return client;\n}\n\nexport function createMemoryWorkerTransportPair(): readonly [WorkerTransport, WorkerTransport] {\n const leftListeners = new Set<(message: WorkerMessage) => void>();\n const rightListeners = new Set<(message: WorkerMessage) => void>();\n\n return [\n createMemoryWorkerTransport(leftListeners, rightListeners),\n createMemoryWorkerTransport(rightListeners, leftListeners),\n ];\n}\n\nasync function handleCall(\n app: App,\n transport: WorkerTransport,\n message: WorkerCallMessage,\n): Promise<void> {\n try {\n const module = app.getModuleByName<Record<string, unknown>>(message.module);\n const method = module[message.method];\n\n if (typeof method !== \"function\") {\n throw new CosystemError(`${message.module}.${message.method} is not callable.`);\n }\n\n const value = await method.apply(module, message.args);\n transport.post({\n id: message.id,\n type: \"result\",\n value,\n });\n } catch (error) {\n transport.post({\n error: serializeError(error),\n id: message.id,\n type: \"result\",\n });\n }\n}\n\nfunction publishState(\n app: App,\n transport: WorkerTransport,\n patches: readonly unknown[] = [],\n): void {\n const message: WorkerStateMessage = {\n state: app.store.getPureState(),\n sync: patches.length > 0 ? \"patch\" : \"snapshot\",\n type: \"state\",\n version: app.state.version,\n ...(patches.length === 0 ? {} : { patches }),\n };\n\n transport.post(message);\n}\n\nfunction createMemoryWorkerTransport(\n inbox: Set<(message: WorkerMessage) => void>,\n outbox: Set<(message: WorkerMessage) => void>,\n): WorkerTransport {\n return {\n post(message) {\n for (const listener of outbox) {\n listener(message);\n }\n },\n subscribe(listener) {\n inbox.add(listener);\n return () => {\n inbox.delete(listener);\n };\n },\n };\n}\n\nfunction serializeError(error: unknown): SerializedWorkerError {\n if (error instanceof Error) {\n return {\n message: error.message,\n name: error.name,\n ...(error.stack === undefined ? {} : { stack: error.stack }),\n };\n }\n\n return {\n message: String(error),\n name: \"Error\",\n };\n}\n\nfunction createRemoteError(error: SerializedWorkerError): CosystemError {\n const remoteError = new CosystemError(`Remote worker error: ${error.message}`);\n remoteError.name = error.name;\n\n if (error.stack !== undefined) {\n remoteError.stack = error.stack;\n }\n\n return remoteError;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cosystem/core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Core utilities for CoSystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"tsdown": "0.22.3",
|
|
27
27
|
"typescript": "6.0.3",
|
|
28
28
|
"vitest": "4.1.9",
|
|
29
|
-
"@cosystem/tsconfig": "0.0.
|
|
29
|
+
"@cosystem/tsconfig": "0.0.2"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsdown",
|