hexok 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/api-use-case.d.ts +52 -0
- package/dist/app/api-use-case.d.ts.map +1 -0
- package/dist/app/api-use-case.js +59 -0
- package/dist/app/api-use-case.js.map +1 -0
- package/dist/app/callable-use-case.d.ts +34 -0
- package/dist/app/callable-use-case.d.ts.map +1 -0
- package/dist/app/callable-use-case.js +41 -0
- package/dist/app/callable-use-case.js.map +1 -0
- package/dist/app/contract.d.ts +46 -0
- package/dist/app/contract.d.ts.map +1 -0
- package/dist/app/contract.js +28 -0
- package/dist/app/contract.js.map +1 -0
- package/dist/app/error-factory.d.ts +9 -0
- package/dist/app/error-factory.d.ts.map +1 -0
- package/dist/app/error-factory.js +30 -0
- package/dist/app/error-factory.js.map +1 -0
- package/dist/app/event-channel.d.ts +133 -0
- package/dist/app/event-channel.d.ts.map +1 -0
- package/dist/app/event-channel.js +49 -0
- package/dist/app/event-channel.js.map +1 -0
- package/dist/app/event-use-case.d.ts +47 -0
- package/dist/app/event-use-case.d.ts.map +1 -0
- package/dist/app/event-use-case.js +54 -0
- package/dist/app/event-use-case.js.map +1 -0
- package/dist/app/execute-ctx.d.ts +92 -0
- package/dist/app/execute-ctx.d.ts.map +1 -0
- package/dist/app/execute-ctx.js +2 -0
- package/dist/app/execute-ctx.js.map +1 -0
- package/dist/app/external-use-case.d.ts +25 -0
- package/dist/app/external-use-case.d.ts.map +1 -0
- package/dist/app/external-use-case.js +25 -0
- package/dist/app/external-use-case.js.map +1 -0
- package/dist/app/index.d.ts +9 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +8 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/internal-use-case.d.ts +26 -0
- package/dist/app/internal-use-case.d.ts.map +1 -0
- package/dist/app/internal-use-case.js +26 -0
- package/dist/app/internal-use-case.js.map +1 -0
- package/dist/app/nest.d.ts +9 -0
- package/dist/app/nest.d.ts.map +1 -0
- package/dist/app/nest.js +28 -0
- package/dist/app/nest.js.map +1 -0
- package/dist/app/types.d.ts +153 -0
- package/dist/app/types.d.ts.map +1 -0
- package/dist/app/types.js +17 -0
- package/dist/app/types.js.map +1 -0
- package/dist/core/coded-error.d.ts +24 -0
- package/dist/core/coded-error.d.ts.map +1 -0
- package/dist/core/coded-error.js +32 -0
- package/dist/core/coded-error.js.map +1 -0
- package/dist/core/error-map.d.ts +21 -0
- package/dist/core/error-map.d.ts.map +1 -0
- package/dist/core/error-map.js +5 -0
- package/dist/core/error-map.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/result.d.ts +23 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +11 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/schema.d.ts +19 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +28 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/standard-schema.d.ts +51 -0
- package/dist/core/standard-schema.d.ts.map +1 -0
- package/dist/core/standard-schema.js +2 -0
- package/dist/core/standard-schema.js.map +1 -0
- package/dist/domain/capabilities.d.ts +42 -0
- package/dist/domain/capabilities.d.ts.map +1 -0
- package/dist/domain/capabilities.js +2 -0
- package/dist/domain/capabilities.js.map +1 -0
- package/dist/domain/catalog.d.ts +46 -0
- package/dist/domain/catalog.d.ts.map +1 -0
- package/dist/domain/catalog.js +114 -0
- package/dist/domain/catalog.js.map +1 -0
- package/dist/domain/channel.d.ts +36 -0
- package/dist/domain/channel.d.ts.map +1 -0
- package/dist/domain/channel.js +2 -0
- package/dist/domain/channel.js.map +1 -0
- package/dist/domain/cow-draft.d.ts +10 -0
- package/dist/domain/cow-draft.d.ts.map +1 -0
- package/dist/domain/cow-draft.js +147 -0
- package/dist/domain/cow-draft.js.map +1 -0
- package/dist/domain/entity.d.ts +120 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +263 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/envelope.d.ts +59 -0
- package/dist/domain/envelope.d.ts.map +1 -0
- package/dist/domain/envelope.js +2 -0
- package/dist/domain/envelope.js.map +1 -0
- package/dist/domain/event.d.ts +44 -0
- package/dist/domain/event.d.ts.map +1 -0
- package/dist/domain/event.js +21 -0
- package/dist/domain/event.js.map +1 -0
- package/dist/domain/index.d.ts +8 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/port.d.ts +45 -0
- package/dist/domain/port.d.ts.map +1 -0
- package/dist/domain/port.js +41 -0
- package/dist/domain/port.js.map +1 -0
- package/dist/infra/adapter.d.ts +22 -0
- package/dist/infra/adapter.d.ts.map +1 -0
- package/dist/infra/adapter.js +18 -0
- package/dist/infra/adapter.js.map +1 -0
- package/dist/infra/index.d.ts +3 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +3 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/mapper.d.ts +48 -0
- package/dist/infra/mapper.d.ts.map +1 -0
- package/dist/infra/mapper.js +77 -0
- package/dist/infra/mapper.js.map +1 -0
- package/dist/runtime/app.d.ts +100 -0
- package/dist/runtime/app.d.ts.map +1 -0
- package/dist/runtime/app.js +292 -0
- package/dist/runtime/app.js.map +1 -0
- package/dist/runtime/channel.d.ts +34 -0
- package/dist/runtime/channel.d.ts.map +1 -0
- package/dist/runtime/channel.js +110 -0
- package/dist/runtime/channel.js.map +1 -0
- package/dist/runtime/client.d.ts +21 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +2 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/completeness.d.ts +89 -0
- package/dist/runtime/completeness.d.ts.map +1 -0
- package/dist/runtime/completeness.js +2 -0
- package/dist/runtime/completeness.js.map +1 -0
- package/dist/runtime/envelope.d.ts +7 -0
- package/dist/runtime/envelope.d.ts.map +1 -0
- package/dist/runtime/envelope.js +69 -0
- package/dist/runtime/envelope.js.map +1 -0
- package/dist/runtime/events.d.ts +6 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +48 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/http-status.d.ts +3 -0
- package/dist/runtime/http-status.d.ts.map +1 -0
- package/dist/runtime/http-status.js +11 -0
- package/dist/runtime/http-status.js.map +1 -0
- package/dist/runtime/http.d.ts +4 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +58 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/interceptor.d.ts +61 -0
- package/dist/runtime/interceptor.d.ts.map +1 -0
- package/dist/runtime/interceptor.js +7 -0
- package/dist/runtime/interceptor.js.map +1 -0
- package/dist/runtime/invoke.d.ts +34 -0
- package/dist/runtime/invoke.d.ts.map +1 -0
- package/dist/runtime/invoke.js +235 -0
- package/dist/runtime/invoke.js.map +1 -0
- package/dist/runtime/middleware.d.ts +20 -0
- package/dist/runtime/middleware.d.ts.map +1 -0
- package/dist/runtime/middleware.js +2 -0
- package/dist/runtime/middleware.js.map +1 -0
- package/dist/runtime/rpc.d.ts +24 -0
- package/dist/runtime/rpc.d.ts.map +1 -0
- package/dist/runtime/rpc.js +16 -0
- package/dist/runtime/rpc.js.map +1 -0
- package/dist/testing/app-test.d.ts +77 -0
- package/dist/testing/app-test.d.ts.map +1 -0
- package/dist/testing/app-test.js +109 -0
- package/dist/testing/app-test.js.map +1 -0
- package/dist/testing/in-memory-broker.d.ts +18 -0
- package/dist/testing/in-memory-broker.d.ts.map +1 -0
- package/dist/testing/in-memory-broker.js +42 -0
- package/dist/testing/in-memory-broker.js.map +1 -0
- package/dist/testing/in-memory-bus.d.ts +19 -0
- package/dist/testing/in-memory-bus.d.ts.map +1 -0
- package/dist/testing/in-memory-bus.js +31 -0
- package/dist/testing/in-memory-bus.js.map +1 -0
- package/dist/testing/in-memory-channel.d.ts +32 -0
- package/dist/testing/in-memory-channel.d.ts.map +1 -0
- package/dist/testing/in-memory-channel.js +65 -0
- package/dist/testing/in-memory-channel.js.map +1 -0
- package/dist/testing/in-memory-queue.d.ts +24 -0
- package/dist/testing/in-memory-queue.d.ts.map +1 -0
- package/dist/testing/in-memory-queue.js +66 -0
- package/dist/testing/in-memory-queue.js.map +1 -0
- package/dist/testing/in-memory-repository.d.ts +44 -0
- package/dist/testing/in-memory-repository.d.ts.map +1 -0
- package/dist/testing/in-memory-repository.js +60 -0
- package/dist/testing/in-memory-repository.js.map +1 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CodedError } from '../core/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Event handler. Mutually exclusive with ExternalUseCase and InternalUseCase.
|
|
4
|
+
* Queue catalogs require `static group`.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* class NotifyOnClose extends EventUseCase {
|
|
8
|
+
* static readonly key = 'incident.notifyOnClose'
|
|
9
|
+
* static readonly on = IncidentClosed
|
|
10
|
+
* static readonly catalog = DomainEvents
|
|
11
|
+
* async execute({ event, ports }: EventCtx<typeof NotifyOnClose>) {
|
|
12
|
+
* await ports.notifier.send(event.payload)
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export class EventUseCase {
|
|
18
|
+
/** Discriminator for `App.from` / `isEventUseCase`. Do not override. */
|
|
19
|
+
static trigger = 'event';
|
|
20
|
+
/** Handler id (`incident.notifyOnClose`). Used in completeness messages. */
|
|
21
|
+
static key;
|
|
22
|
+
/** Event class this handler listens to. Required by `App.from`; must be in `catalog`. */
|
|
23
|
+
static on;
|
|
24
|
+
/** Catalog that owns `on`. Required by `App.from`; bind it with `App.bind`. */
|
|
25
|
+
static catalog;
|
|
26
|
+
/** Port tokens keyed by the alias used in `execute`. */
|
|
27
|
+
static ports;
|
|
28
|
+
/** Consumer group for queue catalogs. Required when `catalog.kind` is `'queue'`. */
|
|
29
|
+
static group;
|
|
30
|
+
/** `static publishes = [DomainEvents] as const` — without `as const`, Events widens to EventClass. */
|
|
31
|
+
static publishes;
|
|
32
|
+
/** `static channels = [ClientChannel] as const` — without `as const`, catalog keys widen. */
|
|
33
|
+
static channels;
|
|
34
|
+
/** Declared refusals. Keys become `errors.CODE()` factories on `EventCtx`. */
|
|
35
|
+
static errors = {};
|
|
36
|
+
constructor() { }
|
|
37
|
+
/**
|
|
38
|
+
* Same one-liner as `if (!result.ok) throw new CodedError({ code: result.code })`.
|
|
39
|
+
* For `validate` / custom Results. Entity methods throw themselves.
|
|
40
|
+
*/
|
|
41
|
+
unwrap(result) {
|
|
42
|
+
if (!result.ok) {
|
|
43
|
+
throw new CodedError({
|
|
44
|
+
code: result.code,
|
|
45
|
+
message: result.code,
|
|
46
|
+
...(result.issues !== undefined
|
|
47
|
+
? { data: { issues: result.issues } }
|
|
48
|
+
: {}),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return result.value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=event-use-case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-use-case.js","sourceRoot":"","sources":["../../src/app/event-use-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA8B,MAAM,kBAAkB,CAAC;AAQ1E;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAgB,YAAY;IAChC,wEAAwE;IACxE,MAAM,CAAU,OAAO,GAAG,OAAgB,CAAC;IAC3C,4EAA4E;IAC5E,MAAM,CAAU,GAAG,CAAS;IAC5B,yFAAyF;IACzF,MAAM,CAAU,EAAE,CAAc;IAChC,+EAA+E;IAC/E,MAAM,CAAU,OAAO,CAAmB;IAC1C,wDAAwD;IACxD,MAAM,CAAU,KAAK,CAAsC;IAC3D,oFAAoF;IACpF,MAAM,CAAU,KAAK,CAAU;IAC/B,sGAAsG;IACtG,MAAM,CAAU,SAAS,CAA8B;IACvD,6FAA6F;IAC7F,MAAM,CAAU,QAAQ,CAA+B;IACvD,8EAA8E;IAC9E,MAAM,CAAU,MAAM,GAAa,EAAE,CAAC;IAEtC,gBAAyB,CAAC;IAK1B;;;OAGG;IACH,MAAM,CAAsB,MAAoB;QAC9C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAAC;gBACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;oBAC7B,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE;oBACrC,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { Infer, Result, StandardSchemaV1 } from '../core/index.js';
|
|
2
|
+
import type { CatalogEvents, DomainEvent, Envelope, EventCatalog, EventClass, EventPayload } from '../domain/index.js';
|
|
3
|
+
import type { ChannelProps } from './event-channel.js';
|
|
4
|
+
import type { CallableUseCaseCtor, ErrorFactories, ResolvedPorts } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* `publish` **enqueues**. The runtime flushes only if `execute` returns.
|
|
7
|
+
* A throw drops the queue — publish after success, not a coincidence.
|
|
8
|
+
*/
|
|
9
|
+
export type Publish = {
|
|
10
|
+
(event: DomainEvent): void;
|
|
11
|
+
(envelope: Envelope): void;
|
|
12
|
+
};
|
|
13
|
+
type AllowedEventInstance<C> = C extends {
|
|
14
|
+
publishes: readonly (infer Cat)[];
|
|
15
|
+
} ? CatalogEvents<Cat> extends infer E ? [E] extends [never] ? never : InstanceType<Extract<E, EventClass>> : never : DomainEvent;
|
|
16
|
+
/** `publish` when `static publishes` is declared — only those catalog events. */
|
|
17
|
+
export type PublishFor<C> = (event: AllowedEventInstance<C>) => void;
|
|
18
|
+
/** Nested callable invocation. Shares ctx, signal, and the parent publish queue. */
|
|
19
|
+
export type Run = <U extends CallableUseCaseCtor>(useCase: U, input: Infer<U['input']>) => Promise<Infer<U['output']>>;
|
|
20
|
+
/** Argument to `ExternalUseCase.execute` and `InternalUseCase.execute`. Typed from the subclass statics. */
|
|
21
|
+
export type ExecuteCtx<C, Ctx = unknown> = {
|
|
22
|
+
/** Validated `static input`. */
|
|
23
|
+
input: C extends {
|
|
24
|
+
input: infer S extends StandardSchemaV1;
|
|
25
|
+
} ? Infer<S> : unknown;
|
|
26
|
+
/** Bound adapters from `static ports`. */
|
|
27
|
+
ports: C extends {
|
|
28
|
+
ports: infer P;
|
|
29
|
+
} ? ResolvedPorts<P> : Record<string, never>;
|
|
30
|
+
/** App request context from `App.ctx` or the caller. */
|
|
31
|
+
ctx: Ctx;
|
|
32
|
+
/** Factories from `static errors`. Throw `errors.NOT_FOUND()`. */
|
|
33
|
+
errors: C extends {
|
|
34
|
+
errors: infer E;
|
|
35
|
+
} ? ErrorFactories<E> : ErrorFactories<never>;
|
|
36
|
+
/** Abort signal for this invocation. */
|
|
37
|
+
signal: AbortSignal;
|
|
38
|
+
/** Enqueue a catalog event. Flushed only if `execute` returns. */
|
|
39
|
+
publish: C extends {
|
|
40
|
+
publishes: readonly unknown[];
|
|
41
|
+
} ? PublishFor<C> : Publish;
|
|
42
|
+
/** Invoke an ExternalUseCase or InternalUseCase with the same ctx, signal, and publish queue. */
|
|
43
|
+
run: Run;
|
|
44
|
+
/** Presence handles for `static channels`, keyed by catalog key. */
|
|
45
|
+
channels: ChannelProps<C>;
|
|
46
|
+
};
|
|
47
|
+
type EventOn<C> = C extends {
|
|
48
|
+
on: infer E extends EventClass;
|
|
49
|
+
} ? E : EventClass;
|
|
50
|
+
type CatalogKeyOf<C> = C extends {
|
|
51
|
+
catalog: EventCatalog<infer K extends string, infer _Kind, infer _E, infer _Ctx>;
|
|
52
|
+
} ? K : string;
|
|
53
|
+
type CatalogKindOf<C> = C extends {
|
|
54
|
+
catalog: EventCatalog<string, infer Kind, infer _E, infer _Ctx>;
|
|
55
|
+
} ? Kind : 'bus';
|
|
56
|
+
type CatalogCtxOf<C> = C extends {
|
|
57
|
+
catalog: EventCatalog<string, infer _Kind, infer _E, infer Ctx>;
|
|
58
|
+
} ? Ctx : unknown;
|
|
59
|
+
/** Argument to `EventUseCase.execute`. Typed from the subclass statics. */
|
|
60
|
+
export type EventCtx<C, Ctx = unknown> = {
|
|
61
|
+
/** Envelope for `static on`, including payload and catalog metadata. */
|
|
62
|
+
event: Envelope<EventOn<C>['key'] extends infer N extends string ? N : string, EventPayload<EventOn<C>>, CatalogKeyOf<C>, CatalogKindOf<C>, CatalogCtxOf<C>>;
|
|
63
|
+
/** Bound adapters from `static ports`. */
|
|
64
|
+
ports: C extends {
|
|
65
|
+
ports: infer P;
|
|
66
|
+
} ? ResolvedPorts<P> : Record<string, never>;
|
|
67
|
+
/** App request context from `App.ctx` or the caller. */
|
|
68
|
+
ctx: Ctx;
|
|
69
|
+
/** Factories from `static errors`. Throw `errors.NOT_FOUND()`. */
|
|
70
|
+
errors: C extends {
|
|
71
|
+
errors: infer E;
|
|
72
|
+
} ? ErrorFactories<E> : ErrorFactories<never>;
|
|
73
|
+
/** Abort signal for this invocation. */
|
|
74
|
+
signal: AbortSignal;
|
|
75
|
+
/** Enqueue a catalog event. Flushed only if `execute` returns. */
|
|
76
|
+
publish: C extends {
|
|
77
|
+
publishes: readonly unknown[];
|
|
78
|
+
} ? PublishFor<C> : Publish;
|
|
79
|
+
/** Invoke an ExternalUseCase or InternalUseCase with the same ctx, signal, and publish queue. */
|
|
80
|
+
run: Run;
|
|
81
|
+
/** Presence handles for `static channels`, keyed by catalog key. */
|
|
82
|
+
channels: ChannelProps<C>;
|
|
83
|
+
} & (CatalogKindOf<C> extends 'queue' ? {
|
|
84
|
+
/** Delivery attempt, 1-based, for queue catalogs. */
|
|
85
|
+
attempt: number;
|
|
86
|
+
} : {
|
|
87
|
+
/** Unset for bus catalogs. */
|
|
88
|
+
attempt?: number;
|
|
89
|
+
});
|
|
90
|
+
export type Unwrap = <T, E extends string>(result: Result<T, E>) => T;
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=execute-ctx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-ctx.d.ts","sourceRoot":"","sources":["../../src/app/execute-ctx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC5B,CAAC;AAEF,KAAK,oBAAoB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAA;CAAE,GAC1E,aAAa,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAChC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACjB,KAAK,GACL,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GACtC,KAAK,GACP,WAAW,CAAC;AAEhB,iFAAiF;AACjF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAErE,oFAAoF;AACpF,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,mBAAmB,EAC9C,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KACrB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEjC,4GAA4G;AAC5G,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,IAAI;IACzC,gCAAgC;IAChC,KAAK,EAAE,CAAC,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC,SAAS,gBAAgB,CAAA;KAAE,GACxD,KAAK,CAAC,CAAC,CAAC,GACR,OAAO,CAAC;IACZ,0CAA0C;IAC1C,KAAK,EAAE,CAAC,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC,CAAA;KAAE,GAC/B,aAAa,CAAC,CAAC,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,wDAAwD;IACxD,GAAG,EAAE,GAAG,CAAC;IACT,kEAAkE;IAClE,MAAM,EAAE,CAAC,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACjC,cAAc,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1B,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,CAAC,SAAS;QAAE,SAAS,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,GAChD,UAAU,CAAC,CAAC,CAAC,GACb,OAAO,CAAC;IACZ,iGAAiG;IACjG,GAAG,EAAE,GAAG,CAAC;IACT,oEAAoE;IACpE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC,SAAS,UAAU,CAAA;CAAE,GAAG,CAAC,GAAG,UAAU,CAAC;AAEhF,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAC/B,OAAO,EAAE,YAAY,CACnB,MAAM,CAAC,SAAS,MAAM,EACtB,MAAM,KAAK,EACX,MAAM,EAAE,EACR,MAAM,IAAI,CACX,CAAC;CACH,GACG,CAAC,GACD,MAAM,CAAC;AAEX,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS;IAChC,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,IAAI,CAAC,CAAC;CACjE,GACG,IAAI,GACJ,KAAK,CAAC;AAEV,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAC/B,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;CACjE,GACG,GAAG,GACH,OAAO,CAAC;AAEZ,2EAA2E;AAC3E,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,IAAI;IACvC,wEAAwE;IACxE,KAAK,EAAE,QAAQ,CACb,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,MAAM,EAC7D,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EACxB,YAAY,CAAC,CAAC,CAAC,EACf,aAAa,CAAC,CAAC,CAAC,EAChB,YAAY,CAAC,CAAC,CAAC,CAChB,CAAC;IACF,0CAA0C;IAC1C,KAAK,EAAE,CAAC,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC,CAAA;KAAE,GAC/B,aAAa,CAAC,CAAC,CAAC,GAChB,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,wDAAwD;IACxD,GAAG,EAAE,GAAG,CAAC;IACT,kEAAkE;IAClE,MAAM,EAAE,CAAC,SAAS;QAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GACjC,cAAc,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1B,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,kEAAkE;IAClE,OAAO,EAAE,CAAC,SAAS;QAAE,SAAS,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,GAChD,UAAU,CAAC,CAAC,CAAC,GACb,OAAO,CAAC;IACZ,iGAAiG;IACjG,GAAG,EAAE,GAAG,CAAC;IACT,oEAAoE;IACpE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAC3B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,OAAO,GACjC;IACE,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEP,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-ctx.js","sourceRoot":"","sources":["../../src/app/execute-ctx.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CallableUseCase } from './callable-use-case.js';
|
|
2
|
+
/**
|
|
3
|
+
* Public request/response use case. Declare static `key`, `input`, `output`,
|
|
4
|
+
* `errors`, `ports`. Implement `execute`.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* class CloseIncident extends ExternalUseCase {
|
|
8
|
+
* static readonly key = 'incident.close'
|
|
9
|
+
* static readonly input = z.object({ id: z.string() })
|
|
10
|
+
* static readonly output = Incident.schema
|
|
11
|
+
* static readonly errors = { NOT_FOUND: { message: 'Incident not found' } } as const
|
|
12
|
+
* static readonly ports = { incidents: IncidentRepository }
|
|
13
|
+
* async execute({ input, ports, errors }: ExecuteCtx<typeof CloseIncident>) {
|
|
14
|
+
* const incident = await ports.incidents.get(input.id)
|
|
15
|
+
* if (!incident) throw errors.NOT_FOUND()
|
|
16
|
+
* return incident.toProps()
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare abstract class ExternalUseCase extends CallableUseCase {
|
|
22
|
+
/** Discriminator for `App.from` / `isExternalUseCase`. Do not override. */
|
|
23
|
+
static readonly trigger: "external";
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=external-use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-use-case.d.ts","sourceRoot":"","sources":["../../src/app/external-use-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,8BAAsB,eAAgB,SAAQ,eAAe;IAC3D,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAU;CAC/C"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { CallableUseCase } from './callable-use-case.js';
|
|
2
|
+
/**
|
|
3
|
+
* Public request/response use case. Declare static `key`, `input`, `output`,
|
|
4
|
+
* `errors`, `ports`. Implement `execute`.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* class CloseIncident extends ExternalUseCase {
|
|
8
|
+
* static readonly key = 'incident.close'
|
|
9
|
+
* static readonly input = z.object({ id: z.string() })
|
|
10
|
+
* static readonly output = Incident.schema
|
|
11
|
+
* static readonly errors = { NOT_FOUND: { message: 'Incident not found' } } as const
|
|
12
|
+
* static readonly ports = { incidents: IncidentRepository }
|
|
13
|
+
* async execute({ input, ports, errors }: ExecuteCtx<typeof CloseIncident>) {
|
|
14
|
+
* const incident = await ports.incidents.get(input.id)
|
|
15
|
+
* if (!incident) throw errors.NOT_FOUND()
|
|
16
|
+
* return incident.toProps()
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export class ExternalUseCase extends CallableUseCase {
|
|
22
|
+
/** Discriminator for `App.from` / `isExternalUseCase`. Do not override. */
|
|
23
|
+
static trigger = 'external';
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=external-use-case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-use-case.js","sourceRoot":"","sources":["../../src/app/external-use-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAgB,eAAgB,SAAQ,eAAe;IAC3D,2EAA2E;IAC3E,MAAM,CAAU,OAAO,GAAG,UAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { type CatalogEntry, type DerivedContract, deriveContract, nestByKey, type UseCaseContract, } from './contract.js';
|
|
2
|
+
export { errorFactories } from './error-factory.js';
|
|
3
|
+
export { type ChannelControl, type ChannelProps, type ChannelSession, EventChannel, type JoinCtx, type RefreshCtx, type RouteCtx, } from './event-channel.js';
|
|
4
|
+
export { EventUseCase } from './event-use-case.js';
|
|
5
|
+
export type { EventCtx, ExecuteCtx, Publish, PublishFor, Run, } from './execute-ctx.js';
|
|
6
|
+
export { ExternalUseCase } from './external-use-case.js';
|
|
7
|
+
export { InternalUseCase } from './internal-use-case.js';
|
|
8
|
+
export { type AsUseCaseBag, type CallableUseCaseCtor, type CheckUseCase, type ErrorFactories, type EventChannelCtor, type EventUseCaseCtor, type ExternalUseCaseCtor, type InternalUseCaseCtor, isCallableUseCase, isEventUseCase, isExternalUseCase, isInternalUseCase, type ResolvedPorts, type UseCaseBag, type UseCaseClass, } from './types.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,cAAc,EACd,SAAS,EACT,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,YAAY,EACZ,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,QAAQ,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EACV,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACV,GAAG,GACJ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { deriveContract, nestByKey, } from './contract.js';
|
|
2
|
+
export { errorFactories } from './error-factory.js';
|
|
3
|
+
export { EventChannel, } from './event-channel.js';
|
|
4
|
+
export { EventUseCase } from './event-use-case.js';
|
|
5
|
+
export { ExternalUseCase } from './external-use-case.js';
|
|
6
|
+
export { InternalUseCase } from './internal-use-case.js';
|
|
7
|
+
export { isCallableUseCase, isEventUseCase, isExternalUseCase, isInternalUseCase, } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACd,SAAS,GAEV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAIL,YAAY,GAIb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EASL,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAIlB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CallableUseCase } from './callable-use-case.js';
|
|
2
|
+
/**
|
|
3
|
+
* Composition-only request/response use case. Same execute shape as
|
|
4
|
+
* ExternalUseCase. Omitted from `deriveContract`, `app.contract`, `app.local`,
|
|
5
|
+
* and HTTP. Still in completeness. Invocable via `ctx.run`.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* class CreateUser extends InternalUseCase {
|
|
9
|
+
* static readonly key = 'user.create'
|
|
10
|
+
* static readonly input = z.object({ id: z.string(), name: z.string() })
|
|
11
|
+
* static readonly output = z.object({ id: z.string() })
|
|
12
|
+
* static readonly errors = { USER_EXISTS: { message: 'User already exists' } } as const
|
|
13
|
+
* static readonly ports = { users: UserRepository }
|
|
14
|
+
* async execute({ input, ports, errors }: ExecuteCtx<typeof CreateUser>) {
|
|
15
|
+
* if (await ports.users.getUser(input.id)) throw errors.USER_EXISTS()
|
|
16
|
+
* await ports.users.saveUser(input)
|
|
17
|
+
* return { id: input.id }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare abstract class InternalUseCase extends CallableUseCase {
|
|
23
|
+
/** Discriminator for `App.from` / `isInternalUseCase`. Do not override. */
|
|
24
|
+
static readonly trigger: "internal";
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=internal-use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-use-case.d.ts","sourceRoot":"","sources":["../../src/app/internal-use-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,8BAAsB,eAAgB,SAAQ,eAAe;IAC3D,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,UAAU,CAAU;CAC/C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CallableUseCase } from './callable-use-case.js';
|
|
2
|
+
/**
|
|
3
|
+
* Composition-only request/response use case. Same execute shape as
|
|
4
|
+
* ExternalUseCase. Omitted from `deriveContract`, `app.contract`, `app.local`,
|
|
5
|
+
* and HTTP. Still in completeness. Invocable via `ctx.run`.
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* class CreateUser extends InternalUseCase {
|
|
9
|
+
* static readonly key = 'user.create'
|
|
10
|
+
* static readonly input = z.object({ id: z.string(), name: z.string() })
|
|
11
|
+
* static readonly output = z.object({ id: z.string() })
|
|
12
|
+
* static readonly errors = { USER_EXISTS: { message: 'User already exists' } } as const
|
|
13
|
+
* static readonly ports = { users: UserRepository }
|
|
14
|
+
* async execute({ input, ports, errors }: ExecuteCtx<typeof CreateUser>) {
|
|
15
|
+
* if (await ports.users.getUser(input.id)) throw errors.USER_EXISTS()
|
|
16
|
+
* await ports.users.saveUser(input)
|
|
17
|
+
* return { id: input.id }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export class InternalUseCase extends CallableUseCase {
|
|
23
|
+
/** Discriminator for `App.from` / `isInternalUseCase`. Do not override. */
|
|
24
|
+
static trigger = 'internal';
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=internal-use-case.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-use-case.js","sourceRoot":"","sources":["../../src/app/internal-use-case.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAgB,eAAgB,SAAQ,eAAe;IAC3D,2EAA2E;IAC3E,MAAM,CAAU,OAAO,GAAG,UAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type PathTo<Path extends string, V> = Path extends `${infer Head}.${infer Rest}` ? {
|
|
2
|
+
readonly [K in Head]: PathTo<Rest, V>;
|
|
3
|
+
} : {
|
|
4
|
+
readonly [K in Path]: V;
|
|
5
|
+
};
|
|
6
|
+
export type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
7
|
+
/** Nest dotted keys (`incident.close` → `{ incident: { close } }`). */
|
|
8
|
+
export declare function nestByKey<V>(entries: Iterable<[string, V]>): Record<string, unknown>;
|
|
9
|
+
//# sourceMappingURL=nest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest.d.ts","sourceRoot":"","sources":["../../src/app/nest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,CAChB,IAAI,SAAS,MAAM,EACnB,CAAC,IACC,IAAI,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAC1C;IAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;CAAE,GACzC;IAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC;CAAE,CAAC;AAEhC,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CACnC,CAAC,SAAS,OAAO,GACb,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GACd,KAAK,CACV,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAC1B,CAAC,GACD,KAAK,CAAC;AAEV,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,CAAC,EACzB,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBzB"}
|
package/dist/app/nest.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Nest dotted keys (`incident.close` → `{ incident: { close } }`). */
|
|
2
|
+
export function nestByKey(entries) {
|
|
3
|
+
const root = Object.create(null);
|
|
4
|
+
for (const [key, value] of entries) {
|
|
5
|
+
const parts = key.split('.');
|
|
6
|
+
let cursor = root;
|
|
7
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
8
|
+
const part = parts[i];
|
|
9
|
+
if (part === undefined)
|
|
10
|
+
continue;
|
|
11
|
+
const existing = cursor[part];
|
|
12
|
+
if (existing === undefined || typeof existing !== 'object') {
|
|
13
|
+
const next = Object.create(null);
|
|
14
|
+
cursor[part] = next;
|
|
15
|
+
cursor = next;
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
cursor = existing;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const last = parts[parts.length - 1];
|
|
22
|
+
if (last === undefined)
|
|
23
|
+
continue;
|
|
24
|
+
cursor[last] = value;
|
|
25
|
+
}
|
|
26
|
+
return root;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=nest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest.js","sourceRoot":"","sources":["../../src/app/nest.ts"],"names":[],"mappings":"AAeA,uEAAuE;AACvE,MAAM,UAAU,SAAS,CACvB,OAA8B;IAE9B,MAAM,IAAI,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC3D,MAAM,IAAI,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACpB,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,QAAmC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ErrorMap, Infer, StandardSchemaV1 } from '../core/index.js';
|
|
2
|
+
import type { AnyEventCatalog, EventCatalog, EventClass, PortToken } from '../domain/index.js';
|
|
3
|
+
/** Port map with tokens replaced by their bound implementations. */
|
|
4
|
+
export type ResolvedPorts<P> = {
|
|
5
|
+
[K in keyof P]: P[K] extends PortToken<infer I> ? I : never;
|
|
6
|
+
};
|
|
7
|
+
/** `errors.CODE()` map. Each factory throws `CodedError` and types as `never`. */
|
|
8
|
+
export type ErrorFactories<M> = {
|
|
9
|
+
[K in keyof M]: M[K] extends {
|
|
10
|
+
data: infer S;
|
|
11
|
+
} ? S extends StandardSchemaV1 ? (data: Infer<S>) => never : () => never : () => never;
|
|
12
|
+
};
|
|
13
|
+
type KeyOf<C> = C extends {
|
|
14
|
+
key: infer I extends string;
|
|
15
|
+
} ? I : 'unknown';
|
|
16
|
+
type OnInCatalog<C> = C extends {
|
|
17
|
+
key: infer Key extends string;
|
|
18
|
+
on: infer On;
|
|
19
|
+
catalog: EventCatalog<infer _K, infer _Kind, infer Events extends EventClass, infer _Ctx>;
|
|
20
|
+
} ? [On] extends [Events] ? C : `hexok: EventUseCase "${Key}" static on is not in catalog` : C;
|
|
21
|
+
type HasLiteralKey<C> = C extends {
|
|
22
|
+
key: infer K extends string;
|
|
23
|
+
} ? string extends K ? false : true : false;
|
|
24
|
+
type IsWideArray<T> = T extends readonly unknown[] ? number extends T['length'] ? true : false : false;
|
|
25
|
+
type CheckAsConst<C, Field extends string, Kind extends string> = [C] extends [
|
|
26
|
+
string
|
|
27
|
+
] ? C : Field extends keyof C ? undefined extends C[Field] ? C : IsWideArray<C[Field]> extends true ? `hexok: ${Kind} "${KeyOf<C>}" static ${Field} must be \`as const\`` : C : C;
|
|
28
|
+
type CheckCallableShape<C, Kind extends string> = HasLiteralKey<C> extends false ? `hexok: ${Kind} "${KeyOf<C>}" is missing static key` : C extends {
|
|
29
|
+
input: StandardSchemaV1;
|
|
30
|
+
} ? C extends {
|
|
31
|
+
output: StandardSchemaV1;
|
|
32
|
+
} ? C extends {
|
|
33
|
+
ports: Record<string, PortToken<unknown>>;
|
|
34
|
+
} ? C : `hexok: ${Kind} "${KeyOf<C>}" is missing static ports` : `hexok: ${Kind} "${KeyOf<C>}" is missing static output` : `hexok: ${Kind} "${KeyOf<C>}" is missing static input`;
|
|
35
|
+
type CheckQueueGroup<C> = [C] extends [string] ? C : C extends {
|
|
36
|
+
catalog: {
|
|
37
|
+
kind: 'queue';
|
|
38
|
+
};
|
|
39
|
+
} ? C extends {
|
|
40
|
+
group: string;
|
|
41
|
+
} ? C : `hexok: EventUseCase "${KeyOf<C>}" is missing static group` : C;
|
|
42
|
+
type CheckEventShape<C> = HasLiteralKey<C> extends false ? `hexok: EventUseCase "${KeyOf<C>}" is missing static key` : C extends {
|
|
43
|
+
on: {
|
|
44
|
+
readonly key: string;
|
|
45
|
+
};
|
|
46
|
+
} ? C extends {
|
|
47
|
+
catalog: AnyEventCatalog;
|
|
48
|
+
} ? CheckQueueGroup<OnInCatalog<C>> : `hexok: EventUseCase "${KeyOf<C>}" is missing static catalog` : `hexok: EventUseCase "${KeyOf<C>}" is missing static on`;
|
|
49
|
+
/**
|
|
50
|
+
* Per-entry diagnostic for `App.from` / `App.test`. Missing statics become a
|
|
51
|
+
* `hexok:` sentence instead of a UseCaseClass union dump.
|
|
52
|
+
*/
|
|
53
|
+
export type CheckUseCase<C> = C extends {
|
|
54
|
+
trigger: 'external';
|
|
55
|
+
} ? CheckAsConst<CheckAsConst<CheckCallableShape<C, 'ExternalUseCase'>, 'publishes', 'ExternalUseCase'>, 'channels', 'ExternalUseCase'> : C extends {
|
|
56
|
+
trigger: 'internal';
|
|
57
|
+
} ? CheckAsConst<CheckAsConst<CheckCallableShape<C, 'InternalUseCase'>, 'publishes', 'InternalUseCase'>, 'channels', 'InternalUseCase'> : C extends {
|
|
58
|
+
trigger: 'event';
|
|
59
|
+
} ? CheckAsConst<CheckAsConst<CheckEventShape<C>, 'publishes', 'EventUseCase'>, 'channels', 'EventUseCase'> : C extends {
|
|
60
|
+
trigger: 'api';
|
|
61
|
+
} ? `hexok: ApiUseCase was renamed to ExternalUseCase; composition-only use cases extend InternalUseCase — delete static internal` : `hexok: "${KeyOf<C>}" must extend ExternalUseCase, InternalUseCase, or EventUseCase`;
|
|
62
|
+
/** Named map of use-case classes passed to `App.from`. */
|
|
63
|
+
export type UseCaseBag = Record<string, UseCaseClass>;
|
|
64
|
+
/** Keep a checked bag's specific classes; do not intersect with UseCaseBag. */
|
|
65
|
+
export type AsUseCaseBag<Bag> = Bag extends UseCaseBag ? Bag : UseCaseBag;
|
|
66
|
+
/** An external, internal, or event use-case constructor. */
|
|
67
|
+
export type UseCaseClass = ExternalUseCaseCtor | InternalUseCaseCtor | EventUseCaseCtor;
|
|
68
|
+
/** Constructor shape of an ExternalUseCase or InternalUseCase subclass. */
|
|
69
|
+
export interface CallableUseCaseCtor {
|
|
70
|
+
readonly trigger: 'external' | 'internal';
|
|
71
|
+
/** Use-case id (`incident.close`). Unique among the callable family. */
|
|
72
|
+
readonly key: string;
|
|
73
|
+
/** Request Standard Schema. */
|
|
74
|
+
readonly input: StandardSchemaV1;
|
|
75
|
+
/** Success Standard Schema. */
|
|
76
|
+
readonly output: StandardSchemaV1;
|
|
77
|
+
/** Declared refusals. */
|
|
78
|
+
readonly errors: ErrorMap;
|
|
79
|
+
/** Port tokens keyed by the alias used in `execute`. */
|
|
80
|
+
readonly ports: Record<string, PortToken<unknown>>;
|
|
81
|
+
/** Catalogs this use case may `publish` to. */
|
|
82
|
+
readonly publishes?: readonly AnyEventCatalog[];
|
|
83
|
+
/** Channels available as `channels` on execute ctx. */
|
|
84
|
+
readonly channels?: readonly EventChannelCtor[];
|
|
85
|
+
readonly prototype: {
|
|
86
|
+
execute(ctx: never): Promise<unknown>;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Constructor shape of an `ExternalUseCase` subclass. */
|
|
90
|
+
export interface ExternalUseCaseCtor extends CallableUseCaseCtor {
|
|
91
|
+
readonly trigger: 'external';
|
|
92
|
+
}
|
|
93
|
+
/** Constructor shape of an `InternalUseCase` subclass. */
|
|
94
|
+
export interface InternalUseCaseCtor extends CallableUseCaseCtor {
|
|
95
|
+
readonly trigger: 'internal';
|
|
96
|
+
}
|
|
97
|
+
export type ExternalKeyOf<C> = C extends {
|
|
98
|
+
trigger: 'external';
|
|
99
|
+
key: infer Key extends string;
|
|
100
|
+
} ? Key : never;
|
|
101
|
+
export type ExternalKeysOf<Bag> = {
|
|
102
|
+
[K in keyof Bag]: ExternalKeyOf<Bag[K]>;
|
|
103
|
+
}[keyof Bag];
|
|
104
|
+
/** Constructor shape of an `EventUseCase` subclass. */
|
|
105
|
+
export interface EventUseCaseCtor {
|
|
106
|
+
readonly trigger: 'event';
|
|
107
|
+
/** Handler id (`incident.notifyOnClose`). */
|
|
108
|
+
readonly key: string;
|
|
109
|
+
/** Event class this handler listens to. Must be in `catalog`. */
|
|
110
|
+
readonly on: EventClass;
|
|
111
|
+
/** Catalog that owns `on`. Bind it with `App.bind`. */
|
|
112
|
+
readonly catalog: AnyEventCatalog;
|
|
113
|
+
/** Consumer group for queue catalogs. */
|
|
114
|
+
readonly group?: string;
|
|
115
|
+
/** Port tokens keyed by the alias used in `execute`. */
|
|
116
|
+
readonly ports?: Record<string, PortToken<unknown>>;
|
|
117
|
+
/** Catalogs this handler may `publish` to. */
|
|
118
|
+
readonly publishes?: readonly AnyEventCatalog[];
|
|
119
|
+
/** Channels available as `channels` on event ctx. */
|
|
120
|
+
readonly channels?: readonly EventChannelCtor[];
|
|
121
|
+
/** Declared refusals. */
|
|
122
|
+
readonly errors?: ErrorMap;
|
|
123
|
+
readonly prototype: {
|
|
124
|
+
execute(ctx: never): Promise<void>;
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** Constructor shape of an `EventChannel` subclass (`catalog`, `joinInput`, optional `ports`). */
|
|
128
|
+
export interface EventChannelCtor {
|
|
129
|
+
readonly trigger: 'channel';
|
|
130
|
+
/** Catalog whose events this channel delivers. Must be a bus. */
|
|
131
|
+
readonly catalog: AnyEventCatalog;
|
|
132
|
+
/** Port tokens keyed by the alias used in join, refresh, and route. */
|
|
133
|
+
readonly ports?: Record<string, PortToken<unknown>>;
|
|
134
|
+
/** Join-claims Standard Schema. Validated before `join`. */
|
|
135
|
+
readonly joinInput: StandardSchemaV1;
|
|
136
|
+
/** Declared refusals for join/refresh. */
|
|
137
|
+
readonly errors?: ErrorMap;
|
|
138
|
+
readonly prototype: {
|
|
139
|
+
join(ctx: never): Promise<unknown>;
|
|
140
|
+
refresh(ctx: never): Promise<unknown>;
|
|
141
|
+
route(ctx: never): Promise<void>;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/** True when `ctor.trigger === 'event'`. */
|
|
145
|
+
export declare function isEventUseCase(ctor: UseCaseClass): ctor is EventUseCaseCtor;
|
|
146
|
+
/** True when `ctor.trigger === 'external'`. */
|
|
147
|
+
export declare function isExternalUseCase(ctor: UseCaseClass): ctor is ExternalUseCaseCtor;
|
|
148
|
+
/** True when `ctor.trigger === 'internal'`. */
|
|
149
|
+
export declare function isInternalUseCase(ctor: UseCaseClass): ctor is InternalUseCaseCtor;
|
|
150
|
+
/** True when `ctor.trigger` is `'external'` or `'internal'`. */
|
|
151
|
+
export declare function isCallableUseCase(ctor: UseCaseClass): ctor is CallableUseCaseCtor;
|
|
152
|
+
export {};
|
|
153
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** True when `ctor.trigger === 'event'`. */
|
|
2
|
+
export function isEventUseCase(ctor) {
|
|
3
|
+
return ctor.trigger === 'event';
|
|
4
|
+
}
|
|
5
|
+
/** True when `ctor.trigger === 'external'`. */
|
|
6
|
+
export function isExternalUseCase(ctor) {
|
|
7
|
+
return ctor.trigger === 'external';
|
|
8
|
+
}
|
|
9
|
+
/** True when `ctor.trigger === 'internal'`. */
|
|
10
|
+
export function isInternalUseCase(ctor) {
|
|
11
|
+
return ctor.trigger === 'internal';
|
|
12
|
+
}
|
|
13
|
+
/** True when `ctor.trigger` is `'external'` or `'internal'`. */
|
|
14
|
+
export function isCallableUseCase(ctor) {
|
|
15
|
+
return ctor.trigger === 'external' || ctor.trigger === 'internal';
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/app/types.ts"],"names":[],"mappings":"AA0NA,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,OAAO,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC;AAClC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB,CAC/B,IAAkB;IAElB,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,iBAAiB,CAC/B,IAAkB;IAElB,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC;AACrC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAC/B,IAAkB;IAElB,OAAO,IAAI,CAAC,OAAO,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from './standard-schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown by entity refusals and use-case error factories.
|
|
4
|
+
* Carries `code`, optional `message`, and optional `data`.
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* throw new CodedError({ code: 'NOT_FOUND', message: 'Incident not found' })
|
|
8
|
+
* ```
|
|
9
|
+
*/
|
|
10
|
+
export declare class CodedError<C extends string = string> extends Error {
|
|
11
|
+
/** Machine-readable refusal code. Catch and switch on this; a runtime transport may map it to a status. */
|
|
12
|
+
readonly code: C;
|
|
13
|
+
/** Optional payload. Set only when the constructor received `data`. */
|
|
14
|
+
readonly data?: unknown;
|
|
15
|
+
/** `message` defaults to `code`. */
|
|
16
|
+
constructor(args: {
|
|
17
|
+
code: C;
|
|
18
|
+
message?: string;
|
|
19
|
+
data?: unknown;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** `VALIDATION` refusal. `data.issues` is the Standard Schema issue list when present. */
|
|
23
|
+
export declare function validationError(message: string, issues?: readonly StandardSchemaV1.Issue[]): CodedError<'VALIDATION'>;
|
|
24
|
+
//# sourceMappingURL=coded-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coded-error.d.ts","sourceRoot":"","sources":["../../src/core/coded-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;;;;;;GAOG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;IAC9D,2GAA2G;IAC3G,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,uEAAuE;IACvE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAExB,oCAAoC;gBACxB,IAAI,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB;CAQF;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,SAAS,gBAAgB,CAAC,KAAK,EAAE,GACzC,UAAU,CAAC,YAAY,CAAC,CAM1B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown by entity refusals and use-case error factories.
|
|
3
|
+
* Carries `code`, optional `message`, and optional `data`.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* throw new CodedError({ code: 'NOT_FOUND', message: 'Incident not found' })
|
|
7
|
+
* ```
|
|
8
|
+
*/
|
|
9
|
+
export class CodedError extends Error {
|
|
10
|
+
/** Machine-readable refusal code. Catch and switch on this; a runtime transport may map it to a status. */
|
|
11
|
+
code;
|
|
12
|
+
/** Optional payload. Set only when the constructor received `data`. */
|
|
13
|
+
data;
|
|
14
|
+
/** `message` defaults to `code`. */
|
|
15
|
+
constructor(args) {
|
|
16
|
+
super(args.message ?? args.code);
|
|
17
|
+
this.name = 'CodedError';
|
|
18
|
+
this.code = args.code;
|
|
19
|
+
if ('data' in args) {
|
|
20
|
+
this.data = args.data;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** `VALIDATION` refusal. `data.issues` is the Standard Schema issue list when present. */
|
|
25
|
+
export function validationError(message, issues) {
|
|
26
|
+
return new CodedError({
|
|
27
|
+
code: 'VALIDATION',
|
|
28
|
+
message,
|
|
29
|
+
...(issues !== undefined ? { data: { issues } } : {}),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=coded-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coded-error.js","sourceRoot":"","sources":["../../src/core/coded-error.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,UAAsC,SAAQ,KAAK;IAC9D,2GAA2G;IAClG,IAAI,CAAI;IACjB,uEAAuE;IAC9D,IAAI,CAAW;IAExB,oCAAoC;IACpC,YAAY,IAIX;QACC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAED,0FAA0F;AAC1F,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,MAA0C;IAE1C,OAAO,IAAI,UAAU,CAAC;QACpB,IAAI,EAAE,YAAY;QAClB,OAAO;QACP,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC"}
|