@spine-event-engine/server 2.0.0-snapshot.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/LICENSE +201 -0
- package/README.md +569 -0
- package/REFERENCE.md +488 -0
- package/dist/bus/command-bus.d.ts +61 -0
- package/dist/bus/command-bus.d.ts.map +1 -0
- package/dist/bus/command-bus.js +201 -0
- package/dist/bus/command-bus.js.map +1 -0
- package/dist/bus/command-dispatcher-registry.d.ts +33 -0
- package/dist/bus/command-dispatcher-registry.d.ts.map +1 -0
- package/dist/bus/command-dispatcher-registry.js +75 -0
- package/dist/bus/command-dispatcher-registry.js.map +1 -0
- package/dist/bus/command-dispatcher.d.ts +25 -0
- package/dist/bus/command-dispatcher.d.ts.map +1 -0
- package/dist/bus/command-dispatcher.js +15 -0
- package/dist/bus/command-dispatcher.js.map +1 -0
- package/dist/bus/command-errors.d.ts +23 -0
- package/dist/bus/command-errors.d.ts.map +1 -0
- package/dist/bus/command-errors.js +52 -0
- package/dist/bus/command-errors.js.map +1 -0
- package/dist/bus/event-bus.d.ts +113 -0
- package/dist/bus/event-bus.d.ts.map +1 -0
- package/dist/bus/event-bus.js +518 -0
- package/dist/bus/event-bus.js.map +1 -0
- package/dist/bus/event-dispatcher-origin-schemas.d.ts +17 -0
- package/dist/bus/event-dispatcher-origin-schemas.d.ts.map +1 -0
- package/dist/bus/event-dispatcher-origin-schemas.js +32 -0
- package/dist/bus/event-dispatcher-origin-schemas.js.map +1 -0
- package/dist/bus/event-dispatcher-registry.d.ts +48 -0
- package/dist/bus/event-dispatcher-registry.d.ts.map +1 -0
- package/dist/bus/event-dispatcher-registry.js +176 -0
- package/dist/bus/event-dispatcher-registry.js.map +1 -0
- package/dist/bus/event-dispatcher.d.ts +48 -0
- package/dist/bus/event-dispatcher.d.ts.map +1 -0
- package/dist/bus/event-dispatcher.js +15 -0
- package/dist/bus/event-dispatcher.js.map +1 -0
- package/dist/context/bounded-context.d.ts +606 -0
- package/dist/context/bounded-context.d.ts.map +1 -0
- package/dist/context/bounded-context.js +1780 -0
- package/dist/context/bounded-context.js.map +1 -0
- package/dist/context/entity-inbox.d.ts +63 -0
- package/dist/context/entity-inbox.d.ts.map +1 -0
- package/dist/context/entity-inbox.js +380 -0
- package/dist/context/entity-inbox.js.map +1 -0
- package/dist/context/local-inbox-handoff.d.ts +244 -0
- package/dist/context/local-inbox-handoff.d.ts.map +1 -0
- package/dist/context/local-inbox-handoff.js +334 -0
- package/dist/context/local-inbox-handoff.js.map +1 -0
- package/dist/context/projection-handoff.d.ts +46 -0
- package/dist/context/projection-handoff.d.ts.map +1 -0
- package/dist/context/projection-handoff.js +172 -0
- package/dist/context/projection-handoff.js.map +1 -0
- package/dist/context/tenant-index.d.ts +41 -0
- package/dist/context/tenant-index.d.ts.map +1 -0
- package/dist/context/tenant-index.js +92 -0
- package/dist/context/tenant-index.js.map +1 -0
- package/dist/delivery/conditional-pickup.d.ts +25 -0
- package/dist/delivery/conditional-pickup.d.ts.map +1 -0
- package/dist/delivery/conditional-pickup.js +26 -0
- package/dist/delivery/conditional-pickup.js.map +1 -0
- package/dist/delivery/delivery-builder.d.ts +216 -0
- package/dist/delivery/delivery-builder.d.ts.map +1 -0
- package/dist/delivery/delivery-builder.js +323 -0
- package/dist/delivery/delivery-builder.js.map +1 -0
- package/dist/delivery/delivery-lease.d.ts +15 -0
- package/dist/delivery/delivery-lease.d.ts.map +1 -0
- package/dist/delivery/delivery-lease.js +44 -0
- package/dist/delivery/delivery-lease.js.map +1 -0
- package/dist/delivery/delivery-loop.d.ts +113 -0
- package/dist/delivery/delivery-loop.d.ts.map +1 -0
- package/dist/delivery/delivery-loop.js +119 -0
- package/dist/delivery/delivery-loop.js.map +1 -0
- package/dist/delivery/delivery-monitor.d.ts +165 -0
- package/dist/delivery/delivery-monitor.d.ts.map +1 -0
- package/dist/delivery/delivery-monitor.js +168 -0
- package/dist/delivery/delivery-monitor.js.map +1 -0
- package/dist/delivery/delivery-ports.d.ts +141 -0
- package/dist/delivery/delivery-ports.d.ts.map +1 -0
- package/dist/delivery/delivery-ports.js +15 -0
- package/dist/delivery/delivery-ports.js.map +1 -0
- package/dist/delivery/delivery-run-control.d.ts +50 -0
- package/dist/delivery/delivery-run-control.d.ts.map +1 -0
- package/dist/delivery/delivery-run-control.js +66 -0
- package/dist/delivery/delivery-run-control.js.map +1 -0
- package/dist/delivery/delivery-run-coordinator.d.ts +218 -0
- package/dist/delivery/delivery-run-coordinator.d.ts.map +1 -0
- package/dist/delivery/delivery-run-coordinator.js +609 -0
- package/dist/delivery/delivery-run-coordinator.js.map +1 -0
- package/dist/delivery/delivery-storage-error.d.ts +13 -0
- package/dist/delivery/delivery-storage-error.d.ts.map +1 -0
- package/dist/delivery/delivery-storage-error.js +30 -0
- package/dist/delivery/delivery-storage-error.js.map +1 -0
- package/dist/delivery/delivery-supervisor.d.ts +175 -0
- package/dist/delivery/delivery-supervisor.d.ts.map +1 -0
- package/dist/delivery/delivery-supervisor.js +469 -0
- package/dist/delivery/delivery-supervisor.js.map +1 -0
- package/dist/delivery/delivery-worker.d.ts +180 -0
- package/dist/delivery/delivery-worker.d.ts.map +1 -0
- package/dist/delivery/delivery-worker.js +232 -0
- package/dist/delivery/delivery-worker.js.map +1 -0
- package/dist/delivery/delivery.d.ts +238 -0
- package/dist/delivery/delivery.d.ts.map +1 -0
- package/dist/delivery/delivery.js +400 -0
- package/dist/delivery/delivery.js.map +1 -0
- package/dist/delivery/inbox-records.d.ts +19 -0
- package/dist/delivery/inbox-records.d.ts.map +1 -0
- package/dist/delivery/inbox-records.js +291 -0
- package/dist/delivery/inbox-records.js.map +1 -0
- package/dist/delivery/inbox-storage.d.ts +81 -0
- package/dist/delivery/inbox-storage.d.ts.map +1 -0
- package/dist/delivery/inbox-storage.js +353 -0
- package/dist/delivery/inbox-storage.js.map +1 -0
- package/dist/delivery/inbox.d.ts +263 -0
- package/dist/delivery/inbox.d.ts.map +1 -0
- package/dist/delivery/inbox.js +172 -0
- package/dist/delivery/inbox.js.map +1 -0
- package/dist/delivery/parked-delivery-obligations.d.ts +182 -0
- package/dist/delivery/parked-delivery-obligations.d.ts.map +1 -0
- package/dist/delivery/parked-delivery-obligations.js +390 -0
- package/dist/delivery/parked-delivery-obligations.js.map +1 -0
- package/dist/delivery/shard-index.d.ts +41 -0
- package/dist/delivery/shard-index.d.ts.map +1 -0
- package/dist/delivery/shard-index.js +67 -0
- package/dist/delivery/shard-index.js.map +1 -0
- package/dist/delivery/sharded-work-registry.d.ts +114 -0
- package/dist/delivery/sharded-work-registry.d.ts.map +1 -0
- package/dist/delivery/sharded-work-registry.js +360 -0
- package/dist/delivery/sharded-work-registry.js.map +1 -0
- package/dist/entity/entity-metadata.d.ts +173 -0
- package/dist/entity/entity-metadata.d.ts.map +1 -0
- package/dist/entity/entity-metadata.js +187 -0
- package/dist/entity/entity-metadata.js.map +1 -0
- package/dist/entity/entity-storage-descriptor.d.ts +64 -0
- package/dist/entity/entity-storage-descriptor.d.ts.map +1 -0
- package/dist/entity/entity-storage-descriptor.js +227 -0
- package/dist/entity/entity-storage-descriptor.js.map +1 -0
- package/dist/entity/entity-transaction.d.ts +372 -0
- package/dist/entity/entity-transaction.d.ts.map +1 -0
- package/dist/entity/entity-transaction.js +413 -0
- package/dist/entity/entity-transaction.js.map +1 -0
- package/dist/entity/entity-transition-validation.d.ts +47 -0
- package/dist/entity/entity-transition-validation.d.ts.map +1 -0
- package/dist/entity/entity-transition-validation.js +327 -0
- package/dist/entity/entity-transition-validation.js.map +1 -0
- package/dist/entity/entity.d.ts +499 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +829 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/implicit-required-id.d.ts +15 -0
- package/dist/entity/implicit-required-id.d.ts.map +1 -0
- package/dist/entity/implicit-required-id.js +123 -0
- package/dist/entity/implicit-required-id.js.map +1 -0
- package/dist/entity/spec-scanner.d.ts +14 -0
- package/dist/entity/spec-scanner.d.ts.map +1 -0
- package/dist/entity/spec-scanner.js +37 -0
- package/dist/entity/spec-scanner.js.map +1 -0
- package/dist/handler/build-time-handler-analyzer.d.ts +150 -0
- package/dist/handler/build-time-handler-analyzer.d.ts.map +1 -0
- package/dist/handler/build-time-handler-analyzer.js +1101 -0
- package/dist/handler/build-time-handler-analyzer.js.map +1 -0
- package/dist/handler/command-registration-readiness.d.ts +99 -0
- package/dist/handler/command-registration-readiness.d.ts.map +1 -0
- package/dist/handler/command-registration-readiness.js +118 -0
- package/dist/handler/command-registration-readiness.js.map +1 -0
- package/dist/handler/event-handler-filter.d.ts +43 -0
- package/dist/handler/event-handler-filter.d.ts.map +1 -0
- package/dist/handler/event-handler-filter.js +128 -0
- package/dist/handler/event-handler-filter.js.map +1 -0
- package/dist/handler/event-registration-readiness.d.ts +196 -0
- package/dist/handler/event-registration-readiness.d.ts.map +1 -0
- package/dist/handler/event-registration-readiness.js +187 -0
- package/dist/handler/event-registration-readiness.js.map +1 -0
- package/dist/handler/external.d.ts +10 -0
- package/dist/handler/external.d.ts.map +1 -0
- package/dist/handler/external.js +15 -0
- package/dist/handler/external.js.map +1 -0
- package/dist/handler/generated-handler-registry.d.ts +154 -0
- package/dist/handler/generated-handler-registry.d.ts.map +1 -0
- package/dist/handler/generated-handler-registry.js +223 -0
- package/dist/handler/generated-handler-registry.js.map +1 -0
- package/dist/handler/generated-registry-discovery.d.ts +94 -0
- package/dist/handler/generated-registry-discovery.d.ts.map +1 -0
- package/dist/handler/generated-registry-discovery.js +228 -0
- package/dist/handler/generated-registry-discovery.js.map +1 -0
- package/dist/handler/generated-registry-writer.d.ts +58 -0
- package/dist/handler/generated-registry-writer.d.ts.map +1 -0
- package/dist/handler/generated-registry-writer.js +458 -0
- package/dist/handler/generated-registry-writer.js.map +1 -0
- package/dist/handler/handler-codegen.d.ts +48 -0
- package/dist/handler/handler-codegen.d.ts.map +1 -0
- package/dist/handler/handler-codegen.js +214 -0
- package/dist/handler/handler-codegen.js.map +1 -0
- package/dist/handler/handler-decorators.d.ts +134 -0
- package/dist/handler/handler-decorators.d.ts.map +1 -0
- package/dist/handler/handler-decorators.js +239 -0
- package/dist/handler/handler-decorators.js.map +1 -0
- package/dist/handler/handler-metadata.d.ts +510 -0
- package/dist/handler/handler-metadata.d.ts.map +1 -0
- package/dist/handler/handler-metadata.js +391 -0
- package/dist/handler/handler-metadata.js.map +1 -0
- package/dist/handler/registration-readiness-metadata.d.ts +68 -0
- package/dist/handler/registration-readiness-metadata.d.ts.map +1 -0
- package/dist/handler/registration-readiness-metadata.js +170 -0
- package/dist/handler/registration-readiness-metadata.js.map +1 -0
- package/dist/handler/rejection-source.d.ts +11 -0
- package/dist/handler/rejection-source.d.ts.map +1 -0
- package/dist/handler/rejection-source.js +25 -0
- package/dist/handler/rejection-source.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/external-messages.d.ts +49 -0
- package/dist/integration/external-messages.d.ts.map +1 -0
- package/dist/integration/external-messages.js +112 -0
- package/dist/integration/external-messages.js.map +1 -0
- package/dist/integration/integration-broker.d.ts +74 -0
- package/dist/integration/integration-broker.d.ts.map +1 -0
- package/dist/integration/integration-broker.js +444 -0
- package/dist/integration/integration-broker.js.map +1 -0
- package/dist/integration/third-party-context.d.ts +56 -0
- package/dist/integration/third-party-context.d.ts.map +1 -0
- package/dist/integration/third-party-context.js +130 -0
- package/dist/integration/third-party-context.js.map +1 -0
- package/dist/repository/command-errors.d.ts +25 -0
- package/dist/repository/command-errors.d.ts.map +1 -0
- package/dist/repository/command-errors.js +43 -0
- package/dist/repository/command-errors.js.map +1 -0
- package/dist/repository/command-routing.d.ts +72 -0
- package/dist/repository/command-routing.d.ts.map +1 -0
- package/dist/repository/command-routing.js +98 -0
- package/dist/repository/command-routing.js.map +1 -0
- package/dist/repository/commit-fence.d.ts +22 -0
- package/dist/repository/commit-fence.d.ts.map +1 -0
- package/dist/repository/commit-fence.js +37 -0
- package/dist/repository/commit-fence.js.map +1 -0
- package/dist/repository/event-routing.d.ts +71 -0
- package/dist/repository/event-routing.d.ts.map +1 -0
- package/dist/repository/event-routing.js +96 -0
- package/dist/repository/event-routing.js.map +1 -0
- package/dist/repository/primitive-id.d.ts +86 -0
- package/dist/repository/primitive-id.d.ts.map +1 -0
- package/dist/repository/primitive-id.js +110 -0
- package/dist/repository/primitive-id.js.map +1 -0
- package/dist/repository/repository.d.ts +670 -0
- package/dist/repository/repository.d.ts.map +1 -0
- package/dist/repository/repository.js +3298 -0
- package/dist/repository/repository.js.map +1 -0
- package/dist/repository/routing-declarations.d.ts +75 -0
- package/dist/repository/routing-declarations.d.ts.map +1 -0
- package/dist/repository/routing-declarations.js +101 -0
- package/dist/repository/routing-declarations.js.map +1 -0
- package/dist/repository/state-update-routing.d.ts +66 -0
- package/dist/repository/state-update-routing.d.ts.map +1 -0
- package/dist/repository/state-update-routing.js +91 -0
- package/dist/repository/state-update-routing.js.map +1 -0
- package/dist/runtime/runtime.d.ts +156 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +215 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/signal-intake.d.ts +84 -0
- package/dist/runtime/signal-intake.d.ts.map +1 -0
- package/dist/runtime/signal-intake.js +94 -0
- package/dist/runtime/signal-intake.js.map +1 -0
- package/dist/runtime/signal-metadata.d.ts +242 -0
- package/dist/runtime/signal-metadata.d.ts.map +1 -0
- package/dist/runtime/signal-metadata.js +368 -0
- package/dist/runtime/signal-metadata.js.map +1 -0
- package/dist/server/browser-server.d.ts +49 -0
- package/dist/server/browser-server.d.ts.map +1 -0
- package/dist/server/browser-server.js +633 -0
- package/dist/server/browser-server.js.map +1 -0
- package/dist/server/durable-subscription-bindings.d.ts +122 -0
- package/dist/server/durable-subscription-bindings.d.ts.map +1 -0
- package/dist/server/durable-subscription-bindings.js +524 -0
- package/dist/server/durable-subscription-bindings.js.map +1 -0
- package/dist/server/environment-attachment.d.ts +356 -0
- package/dist/server/environment-attachment.d.ts.map +1 -0
- package/dist/server/environment-attachment.js +2061 -0
- package/dist/server/environment-attachment.js.map +1 -0
- package/dist/server/environment-delivery-records.d.ts +77 -0
- package/dist/server/environment-delivery-records.d.ts.map +1 -0
- package/dist/server/environment-delivery-records.js +282 -0
- package/dist/server/environment-delivery-records.js.map +1 -0
- package/dist/server/environment-delivery-worker.d.ts +161 -0
- package/dist/server/environment-delivery-worker.d.ts.map +1 -0
- package/dist/server/environment-delivery-worker.js +664 -0
- package/dist/server/environment-delivery-worker.js.map +1 -0
- package/dist/server/environment.d.ts +43 -0
- package/dist/server/environment.d.ts.map +1 -0
- package/dist/server/environment.js +90 -0
- package/dist/server/environment.js.map +1 -0
- package/dist/server/managed-child-subscription.d.ts +11 -0
- package/dist/server/managed-child-subscription.d.ts.map +1 -0
- package/dist/server/managed-child-subscription.js +44 -0
- package/dist/server/managed-child-subscription.js.map +1 -0
- package/dist/server/managed-server-application.d.ts +324 -0
- package/dist/server/managed-server-application.d.ts.map +1 -0
- package/dist/server/managed-server-application.js +937 -0
- package/dist/server/managed-server-application.js.map +1 -0
- package/dist/server/node-coordinator.d.ts +191 -0
- package/dist/server/node-coordinator.d.ts.map +1 -0
- package/dist/server/node-coordinator.js +552 -0
- package/dist/server/node-coordinator.js.map +1 -0
- package/dist/server/process-server-coordinator.d.ts +15 -0
- package/dist/server/process-server-coordinator.d.ts.map +1 -0
- package/dist/server/process-server-coordinator.js +112 -0
- package/dist/server/process-server-coordinator.js.map +1 -0
- package/dist/server/reserved-spine-rpc-paths.json +8 -0
- package/dist/server/retryable-close.d.ts +28 -0
- package/dist/server/retryable-close.d.ts.map +1 -0
- package/dist/server/retryable-close.js +129 -0
- package/dist/server/retryable-close.js.map +1 -0
- package/dist/server/server-environment.d.ts +180 -0
- package/dist/server/server-environment.d.ts.map +1 -0
- package/dist/server/server-environment.js +418 -0
- package/dist/server/server-environment.js.map +1 -0
- package/dist/server/server-log.d.ts +18 -0
- package/dist/server/server-log.d.ts.map +1 -0
- package/dist/server/server-log.js +96 -0
- package/dist/server/server-log.js.map +1 -0
- package/dist/server/server.d.ts +389 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +752 -0
- package/dist/server/server.js.map +1 -0
- package/dist/services/spine-services.d.ts +88 -0
- package/dist/services/spine-services.d.ts.map +1 -0
- package/dist/services/spine-services.js +1586 -0
- package/dist/services/spine-services.js.map +1 -0
- package/dist/stand/stand.d.ts +294 -0
- package/dist/stand/stand.d.ts.map +1 -0
- package/dist/stand/stand.js +680 -0
- package/dist/stand/stand.js.map +1 -0
- package/dist/stand/subscription-observer.d.ts +53 -0
- package/dist/stand/subscription-observer.d.ts.map +1 -0
- package/dist/stand/subscription-observer.js +444 -0
- package/dist/stand/subscription-observer.js.map +1 -0
- package/dist/stand/subscription-records.d.ts +12 -0
- package/dist/stand/subscription-records.d.ts.map +1 -0
- package/dist/stand/subscription-records.js +99 -0
- package/dist/stand/subscription-records.js.map +1 -0
- package/dist/stand/subscription-registry.d.ts +285 -0
- package/dist/stand/subscription-registry.d.ts.map +1 -0
- package/dist/stand/subscription-registry.js +403 -0
- package/dist/stand/subscription-registry.js.map +1 -0
- package/dist/stand/subscription-runtime.d.ts +102 -0
- package/dist/stand/subscription-runtime.d.ts.map +1 -0
- package/dist/stand/subscription-runtime.js +380 -0
- package/dist/stand/subscription-runtime.js.map +1 -0
- package/dist/testing/index.d.ts +14 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +34 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { lstatSync, mkdirSync, opendirSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
15
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
16
|
+
import ts from "typescript";
|
|
17
|
+
import { BuildHandlerAnalyzer } from "./build-time-handler-analyzer.js";
|
|
18
|
+
import { GeneratedRegistryWriter } from "./generated-registry-writer.js";
|
|
19
|
+
const maxCompilerRoots = 1000;
|
|
20
|
+
const maxDiscoveryEntries = 1000;
|
|
21
|
+
const defaultOperations = {
|
|
22
|
+
mkdir: (path) => {
|
|
23
|
+
mkdirSync(path, { recursive: true });
|
|
24
|
+
},
|
|
25
|
+
write: (path, source) => {
|
|
26
|
+
writeFileSync(path, source, "utf8");
|
|
27
|
+
},
|
|
28
|
+
rename: renameSync,
|
|
29
|
+
remove: (path) => {
|
|
30
|
+
rmSync(path, { force: true });
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Creates and atomically replaces an application's generated handler registry.
|
|
35
|
+
*
|
|
36
|
+
* @param options Application root and generation configuration.
|
|
37
|
+
* @param operations Optional filesystem operations used for generation.
|
|
38
|
+
*/
|
|
39
|
+
export function generateHandlerRegistry(options, operations = {}) {
|
|
40
|
+
const appRoot = HandlerFiles.directory(resolve(options.appRoot), "Application root");
|
|
41
|
+
const project = HandlerFiles.file(appRoot, join(appRoot, "tsconfig.json"), "Project");
|
|
42
|
+
const generatedRoot = HandlerFiles.path(appRoot, join(appRoot, "generated"), "Generated root");
|
|
43
|
+
const outputFile = HandlerFiles.path(generatedRoot, join(generatedRoot, "handler/generated-handler-registry.ts"), "Generated output");
|
|
44
|
+
const { program, sources } = HandlerFiles.program(appRoot, project);
|
|
45
|
+
const analysis = BuildHandlerAnalyzer.analyze(program, sources);
|
|
46
|
+
if (analysis.diagnostics.length > 0)
|
|
47
|
+
throw new Error(HandlerFiles.diagnostics(analysis.diagnostics));
|
|
48
|
+
const source = new GeneratedRegistryWriter().render(analysis, { outputFile });
|
|
49
|
+
(operations.mkdir ?? defaultOperations.mkdir)(dirname(outputFile));
|
|
50
|
+
HandlerFiles.write(outputFile, source, operations);
|
|
51
|
+
}
|
|
52
|
+
const HandlerFiles = Object.freeze({
|
|
53
|
+
program(appRoot, project) {
|
|
54
|
+
const config = ts.readConfigFile(project, (path) => ts.sys.readFile(path));
|
|
55
|
+
if (config.error !== undefined)
|
|
56
|
+
throw new Error(HandlerFiles.configDiagnostics([config.error]));
|
|
57
|
+
HandlerFiles.assertIncludes(HandlerFiles.value(config.config, "include"), appRoot);
|
|
58
|
+
const parsed = ts.parseJsonConfigFileContent(config.config, HandlerFiles.configHost(appRoot, dirname(project)), dirname(project), undefined, project);
|
|
59
|
+
if (parsed.errors.length > 0)
|
|
60
|
+
throw new Error(HandlerFiles.configDiagnostics(parsed.errors));
|
|
61
|
+
if ((parsed.projectReferences?.length ?? 0) > 0)
|
|
62
|
+
throw new Error("Project references are not supported for handler generation.");
|
|
63
|
+
if (parsed.fileNames.length > maxCompilerRoots)
|
|
64
|
+
throw new Error(`Handler source count exceeds ${String(maxCompilerRoots)}.`);
|
|
65
|
+
const roots = parsed.fileNames.map((file) => HandlerFiles.typeScriptFile(appRoot, file));
|
|
66
|
+
const program = ts.createProgram({
|
|
67
|
+
rootNames: roots,
|
|
68
|
+
options: parsed.options,
|
|
69
|
+
...(parsed.projectReferences === undefined
|
|
70
|
+
? {}
|
|
71
|
+
: { projectReferences: parsed.projectReferences }),
|
|
72
|
+
});
|
|
73
|
+
const sources = roots
|
|
74
|
+
.map((root) => program.getSourceFile(root))
|
|
75
|
+
.filter(HandlerFiles.sourceFile);
|
|
76
|
+
return { program, sources };
|
|
77
|
+
},
|
|
78
|
+
assertIncludes(value, appRoot) {
|
|
79
|
+
if (!Array.isArray(value))
|
|
80
|
+
return;
|
|
81
|
+
for (const include of value) {
|
|
82
|
+
if (typeof include !== "string")
|
|
83
|
+
continue;
|
|
84
|
+
if (include.split(/[\\/]/u).includes(".."))
|
|
85
|
+
throw new Error(`Handler source must stay within ${appRoot}.`);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
value(value, key) {
|
|
89
|
+
if (typeof value !== "object" || value === null)
|
|
90
|
+
return undefined;
|
|
91
|
+
return value[key];
|
|
92
|
+
},
|
|
93
|
+
configHost(appRoot, currentDirectory) {
|
|
94
|
+
let entries = 0;
|
|
95
|
+
// TypeScript 6.0.3 exports matchFiles at runtime but omits it from its declarations.
|
|
96
|
+
const matchFiles = ts.matchFiles;
|
|
97
|
+
return {
|
|
98
|
+
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
|
|
99
|
+
readDirectory: (path, extensions, excludes, includes, depth) => matchFiles(path, extensions, excludes, includes, ts.sys.useCaseSensitiveFileNames, currentDirectory, depth, (directory) => {
|
|
100
|
+
const resolvedDirectory = resolve(currentDirectory, directory);
|
|
101
|
+
HandlerFiles.containedPath(appRoot, resolvedDirectory, "Handler discovery directory");
|
|
102
|
+
const files = [];
|
|
103
|
+
const directories = [];
|
|
104
|
+
const handle = opendirSync(resolvedDirectory);
|
|
105
|
+
try {
|
|
106
|
+
let entry;
|
|
107
|
+
while ((entry = handle.readSync()) !== null) {
|
|
108
|
+
entries += 1;
|
|
109
|
+
if (entries > maxDiscoveryEntries)
|
|
110
|
+
throw new Error(`Handler discovery entry count exceeds ${String(maxDiscoveryEntries)}.`);
|
|
111
|
+
const candidate = join(resolvedDirectory, entry.name);
|
|
112
|
+
if (lstatSync(candidate).isSymbolicLink())
|
|
113
|
+
throw new Error(`Handler discovery must not traverse symlink: ${candidate}`);
|
|
114
|
+
if (entry.isDirectory())
|
|
115
|
+
directories.push(entry.name);
|
|
116
|
+
else if (entry.isFile())
|
|
117
|
+
files.push(entry.name);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
handle.closeSync();
|
|
122
|
+
}
|
|
123
|
+
return { files, directories };
|
|
124
|
+
}, (path) => ts.sys.realpath?.(path) ?? path),
|
|
125
|
+
fileExists: (path) => ts.sys.fileExists(path),
|
|
126
|
+
readFile: (path) => ts.sys.readFile(path),
|
|
127
|
+
trace: () => undefined,
|
|
128
|
+
directoryExists: (path) => ts.sys.directoryExists(path),
|
|
129
|
+
realpath: (path) => ts.sys.realpath?.(path) ?? path,
|
|
130
|
+
};
|
|
131
|
+
},
|
|
132
|
+
sourceFile(value) {
|
|
133
|
+
return value !== undefined;
|
|
134
|
+
},
|
|
135
|
+
diagnostics(diagnostics) {
|
|
136
|
+
return diagnostics
|
|
137
|
+
.map((diagnostic) => {
|
|
138
|
+
const location = `${diagnostic.sourceFile}:${String(diagnostic.line)}:` + String(diagnostic.column);
|
|
139
|
+
return `${location} ${diagnostic.code} ${diagnostic.message}`;
|
|
140
|
+
})
|
|
141
|
+
.join("\n");
|
|
142
|
+
},
|
|
143
|
+
configDiagnostics(diagnostics) {
|
|
144
|
+
return ts.formatDiagnosticsWithColorAndContext(diagnostics, {
|
|
145
|
+
getCanonicalFileName: (fileName) => fileName,
|
|
146
|
+
getCurrentDirectory: () => process.cwd(),
|
|
147
|
+
getNewLine: () => "\n",
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
file(root, value, label) {
|
|
151
|
+
const path = HandlerFiles.path(root, value, label);
|
|
152
|
+
if (!lstatSync(path).isFile())
|
|
153
|
+
throw new Error(`${label} must be a regular file: ${path}`);
|
|
154
|
+
return path;
|
|
155
|
+
},
|
|
156
|
+
typeScriptFile(root, value) {
|
|
157
|
+
if (!value.endsWith(".ts") || value.endsWith(".d.ts"))
|
|
158
|
+
throw new Error(`Handler source must be a TypeScript file: ${value}`);
|
|
159
|
+
return HandlerFiles.file(root, value, "Handler source");
|
|
160
|
+
},
|
|
161
|
+
directory(path, label) {
|
|
162
|
+
HandlerFiles.assertNoSymlinkAncestors(path, label);
|
|
163
|
+
if (!lstatSync(path).isDirectory())
|
|
164
|
+
throw new Error(`${label} must be a directory: ${path}`);
|
|
165
|
+
return path;
|
|
166
|
+
},
|
|
167
|
+
path(root, path, label) {
|
|
168
|
+
const value = relative(root, path);
|
|
169
|
+
if (value === "" || value.startsWith("..") || isAbsolute(value))
|
|
170
|
+
throw new Error(`${label} must stay within ${root}.`);
|
|
171
|
+
HandlerFiles.assertNoSymlinkAncestors(path, label);
|
|
172
|
+
return path;
|
|
173
|
+
},
|
|
174
|
+
containedPath(root, path, label) {
|
|
175
|
+
const value = relative(root, path);
|
|
176
|
+
if (value.startsWith("..") || isAbsolute(value))
|
|
177
|
+
throw new Error(`${label} must stay within ${root}.`);
|
|
178
|
+
HandlerFiles.assertNoSymlinkAncestors(path, label);
|
|
179
|
+
return path;
|
|
180
|
+
},
|
|
181
|
+
assertNoSymlinkAncestors(path, label) {
|
|
182
|
+
const parts = resolve(path).split(sep).filter(Boolean);
|
|
183
|
+
let current = sep;
|
|
184
|
+
for (const part of parts) {
|
|
185
|
+
current = join(current, part);
|
|
186
|
+
try {
|
|
187
|
+
if (lstatSync(current).isSymbolicLink())
|
|
188
|
+
throw new Error(`${label} must not use a symlink path.`);
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
if (error.code !== "ENOENT")
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
write(outputFile, source, operations) {
|
|
197
|
+
const fileOperations = { ...defaultOperations, ...operations };
|
|
198
|
+
const stage = join(dirname(outputFile), `.${basename(outputFile)}.${String(process.pid)}.${crypto.randomUUID()}.tmp`);
|
|
199
|
+
try {
|
|
200
|
+
fileOperations.write(stage, source);
|
|
201
|
+
fileOperations.rename(stage, outputFile);
|
|
202
|
+
}
|
|
203
|
+
catch (primary) {
|
|
204
|
+
try {
|
|
205
|
+
fileOperations.remove(stage);
|
|
206
|
+
}
|
|
207
|
+
catch (cleanup) {
|
|
208
|
+
throw new AggregateError([primary, cleanup], "Generated handler registry publication failed.");
|
|
209
|
+
}
|
|
210
|
+
throw primary;
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=handler-codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-codegen.js","sourceRoot":"","sources":["../../src/handler/handler-codegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { DescriptorMessageSchema } from "../entity/entity-metadata.js";
|
|
2
|
+
import { type EntityClass, type EntityHandlersMetadata, type EventApplicationOptions, type WhereOptions } from "./handler-metadata.js";
|
|
3
|
+
export type { WhereOptions } from "./handler-metadata.js";
|
|
4
|
+
/**
|
|
5
|
+
* Describes the standard TypeScript method decorator accepted by Spine handler declarations.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam This - Entity instance that owns the decorated method.
|
|
8
|
+
* @typeParam Parameters - Parameters accepted by the decorated method.
|
|
9
|
+
* @typeParam Return - Result returned by the decorated method.
|
|
10
|
+
* @param value Decorated method implementation.
|
|
11
|
+
* @param context Standard TypeScript decorator context.
|
|
12
|
+
*/
|
|
13
|
+
export type HandlerMethodDecorator = <This extends object, Parameters extends readonly unknown[], Return>(value: HandlerMethodValue<This, Parameters, Return>, context: ClassMethodDecoratorContext<This, HandlerMethodValue<This, Parameters, Return>>) => void;
|
|
14
|
+
/**
|
|
15
|
+
* Describes an instance method shape accepted by public handler decorators.
|
|
16
|
+
*
|
|
17
|
+
* @typeParam This - Entity instance that owns the method.
|
|
18
|
+
* @typeParam Parameters - Parameters accepted by the method.
|
|
19
|
+
* @typeParam Return - Result returned by the method.
|
|
20
|
+
* @param this Entity instance that receives the invocation.
|
|
21
|
+
* @param parameters Arguments supplied to the handler.
|
|
22
|
+
* @returns Handler result.
|
|
23
|
+
*/
|
|
24
|
+
export type HandlerMethodValue<This extends object = object, Parameters extends readonly unknown[] = readonly unknown[], Return = unknown> = (this: This, ...parameters: Parameters) => Return;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a command-assignee declaration.
|
|
27
|
+
*
|
|
28
|
+
* Bare `@Assign` is the ordinary application form. Generated handler
|
|
29
|
+
* registries require a command input and normal event output; a rejection is
|
|
30
|
+
* valid in neither role, but the handler may throw a generated rejection
|
|
31
|
+
* throwable. The decorator records metadata only; it does not register the
|
|
32
|
+
* handler, instantiate the entity, or invoke the method.
|
|
33
|
+
*
|
|
34
|
+
* @typeParam This - Entity instance that owns the method.
|
|
35
|
+
* @typeParam Parameters - Parameters accepted by the method.
|
|
36
|
+
* @typeParam Return - Result returned by the method.
|
|
37
|
+
* @param value Decorated method implementation or command schema.
|
|
38
|
+
* @param context Standard decorator context for bare usage.
|
|
39
|
+
*/
|
|
40
|
+
export declare function Assign<This extends object, Parameters extends readonly unknown[], Return>(value: HandlerMethodValue<This, Parameters, Return>, context: ClassMethodDecoratorContext<This, HandlerMethodValue<This, Parameters, Return>>): void;
|
|
41
|
+
/**
|
|
42
|
+
* Creates a command-reacting declaration.
|
|
43
|
+
*
|
|
44
|
+
* Bare `@Command` is the ordinary application form. Generated registries accept
|
|
45
|
+
* command inputs; event-to-command handlers also accept event or rejection
|
|
46
|
+
* inputs. Normal outputs are commands, while rejections are thrown, not
|
|
47
|
+
* returned. Command reactors may fan out in `HandlerMetadataRegistry`; this
|
|
48
|
+
* decorator only records the declaration.
|
|
49
|
+
*
|
|
50
|
+
* @typeParam This - Entity instance that owns the method.
|
|
51
|
+
* @typeParam Parameters - Parameters accepted by the method.
|
|
52
|
+
* @typeParam Return - Result returned by the method.
|
|
53
|
+
* @param value Decorated method implementation or command schema.
|
|
54
|
+
* @param context Standard decorator context for bare usage.
|
|
55
|
+
*/
|
|
56
|
+
export declare function Command<This extends object, Parameters extends readonly unknown[], Return>(value: HandlerMethodValue<This, Parameters, Return>, context: ClassMethodDecoratorContext<This, HandlerMethodValue<This, Parameters, Return>>): void;
|
|
57
|
+
/**
|
|
58
|
+
* Creates an Event/rejection or Entity-state subscriber declaration.
|
|
59
|
+
*
|
|
60
|
+
* Bare `@Subscribe` accepts generated Event/rejection or descriptor-marked
|
|
61
|
+
* Entity-state inputs and returns `void`. Event/rejection inputs produce
|
|
62
|
+
* event-subscription metadata; Entity state inputs produce state-subscription
|
|
63
|
+
* metadata. Subscribers are metadata-only declarations bridged by generated
|
|
64
|
+
* registry and runtime metadata.
|
|
65
|
+
*
|
|
66
|
+
* @typeParam This - Entity instance that owns the method.
|
|
67
|
+
* @typeParam Parameters - Parameters accepted by the method.
|
|
68
|
+
* @typeParam Return - Result returned by the method.
|
|
69
|
+
* @param value Decorated method implementation.
|
|
70
|
+
* @param context Standard decorator context for bare usage.
|
|
71
|
+
*/
|
|
72
|
+
export declare function Subscribe<This extends object, Parameters extends readonly unknown[], Return>(value: HandlerMethodValue<This, Parameters, Return>, context: ClassMethodDecoratorContext<This, HandlerMethodValue<This, Parameters, Return>>): void;
|
|
73
|
+
/**
|
|
74
|
+
* Creates an event-reactor declaration.
|
|
75
|
+
*
|
|
76
|
+
* Bare `@React` accepts generated event or rejection inputs and returns normal
|
|
77
|
+
* events or explicit `void`; rejections are thrown, not returned. Reactors are
|
|
78
|
+
* collected as class-owned metadata and may fan out through the caller-owned
|
|
79
|
+
* handler registry.
|
|
80
|
+
*
|
|
81
|
+
* @typeParam This - Entity instance that owns the method.
|
|
82
|
+
* @typeParam Parameters - Parameters accepted by the method.
|
|
83
|
+
* @typeParam Return - Result returned by the method.
|
|
84
|
+
* @param value Decorated method implementation or event schema.
|
|
85
|
+
* @param context Standard decorator context for bare usage.
|
|
86
|
+
*/
|
|
87
|
+
export declare function React<This extends object, Parameters extends readonly unknown[], Return>(value: HandlerMethodValue<This, Parameters, Return>, context: ClassMethodDecoratorContext<This, HandlerMethodValue<This, Parameters, Return>>): void;
|
|
88
|
+
/**
|
|
89
|
+
* Creates one Event field equality filter for an Event-consuming handler.
|
|
90
|
+
*
|
|
91
|
+
* Generated handler analysis validates the declaration and carries it into
|
|
92
|
+
* immutable repository metadata. The decorator itself does not inspect or
|
|
93
|
+
* invoke the handler.
|
|
94
|
+
*
|
|
95
|
+
* @param options Event source field and canonical expected value.
|
|
96
|
+
* @returns Decorator for a public instance handler method.
|
|
97
|
+
*/
|
|
98
|
+
export declare function Where(options: WhereOptions): HandlerMethodDecorator;
|
|
99
|
+
/**
|
|
100
|
+
* Creates legacy framework event-application metadata.
|
|
101
|
+
*
|
|
102
|
+
* New application aggregates must not use `@Apply`; managed aggregates are no
|
|
103
|
+
* longer event-sourced and the framework owns state transactions. This
|
|
104
|
+
* decorator is kept only for compatibility code that still needs explicit
|
|
105
|
+
* schema-bearing event application metadata. The optional `allowImport` flag
|
|
106
|
+
* is preserved only as part of that legacy metadata shape.
|
|
107
|
+
*
|
|
108
|
+
* @param schema Event schema accepted by the decorated method.
|
|
109
|
+
* @param options Legacy event-application metadata options.
|
|
110
|
+
* @returns Decorator that records the application metadata.
|
|
111
|
+
*/
|
|
112
|
+
export declare function Apply(schema: DescriptorMessageSchema, options?: EventApplicationOptions): HandlerMethodDecorator;
|
|
113
|
+
/**
|
|
114
|
+
* Builds schema-bearing decorator declarations for framework compatibility.
|
|
115
|
+
*
|
|
116
|
+
* The returned object is the same frozen `EntityHandlersMetadata` contract
|
|
117
|
+
* produced by `EntityHandlers.define()` and accepted by
|
|
118
|
+
* `HandlerMetadataRegistry`. Only own prototype methods of `entityType` are
|
|
119
|
+
* inspected; inherited decorated methods are intentionally not materialized by
|
|
120
|
+
* this class-owned adapter.
|
|
121
|
+
*
|
|
122
|
+
* Application code must not call this function and must not provide its own
|
|
123
|
+
* handler discovery/materialization. Generated framework registries own schema
|
|
124
|
+
* inference for bare decorators; this adapter only supports legacy
|
|
125
|
+
* schema-bearing decorator metadata.
|
|
126
|
+
*
|
|
127
|
+
* @typeParam Instance - Entity instance that owns the handlers.
|
|
128
|
+
* @typeParam StateSchema - Schema that describes the entity state.
|
|
129
|
+
* @param entityType Entity class whose own decorated methods are read.
|
|
130
|
+
* @param stateSchema Schema that describes the entity state.
|
|
131
|
+
* @returns Frozen handler metadata for the decorated methods.
|
|
132
|
+
*/
|
|
133
|
+
export declare function materializeDecoratedEntityHandlers<Instance extends object, StateSchema extends DescriptorMessageSchema>(entityType: EntityClass<Instance>, stateSchema: StateSchema): EntityHandlersMetadata<Instance, StateSchema>;
|
|
134
|
+
//# sourceMappingURL=handler-decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-decorators.d.ts","sourceRoot":"","sources":["../../src/handler/handler-decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { EntityHandlers, } from "./handler-metadata.js";
|
|
15
|
+
const handlerDecoratorMetadataKey = Symbol("@spine-event-engine/server.handlerDecorators");
|
|
16
|
+
/**
|
|
17
|
+
* Creates command-assignment decorator metadata or a schema-bearing decorator.
|
|
18
|
+
*
|
|
19
|
+
* @param schemaOrValue Command schema or decorated method implementation.
|
|
20
|
+
* @param context Standard decorator context for bare usage.
|
|
21
|
+
* @returns A decorator for schema-bearing usage, or `undefined` after bare usage.
|
|
22
|
+
*/
|
|
23
|
+
export function Assign(schemaOrValue, context) {
|
|
24
|
+
return DecoratorMetadata.decorateOrCreate("command-assignment", schemaOrValue, context);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Creates command-reaction decorator metadata or a schema-bearing decorator.
|
|
28
|
+
*
|
|
29
|
+
* @param schemaOrValue Command schema or decorated method implementation.
|
|
30
|
+
* @param context Standard decorator context for bare usage.
|
|
31
|
+
* @returns A decorator for schema-bearing usage, or `undefined` after bare usage.
|
|
32
|
+
*/
|
|
33
|
+
export function Command(schemaOrValue, context) {
|
|
34
|
+
return DecoratorMetadata.decorateOrCreate("command-reaction", schemaOrValue, context);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Creates subscriber decorator metadata or a schema-bearing decorator.
|
|
38
|
+
*
|
|
39
|
+
* @param schemaOrValue Event, rejection, or descriptor-marked Entity state
|
|
40
|
+
* schema, or the decorated method implementation.
|
|
41
|
+
* @param context Standard decorator context for bare usage.
|
|
42
|
+
* @returns A decorator for schema-bearing usage, or `undefined` after bare usage.
|
|
43
|
+
*/
|
|
44
|
+
export function Subscribe(schemaOrValue, context) {
|
|
45
|
+
return DecoratorMetadata.decorateOrCreate("event-subscription", schemaOrValue, context);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates event-reaction decorator metadata or a schema-bearing decorator.
|
|
49
|
+
*
|
|
50
|
+
* @param schemaOrValue Event schema or decorated method implementation.
|
|
51
|
+
* @param context Standard decorator context for bare usage.
|
|
52
|
+
* @returns A decorator for schema-bearing usage, or `undefined` after bare usage.
|
|
53
|
+
*/
|
|
54
|
+
export function React(schemaOrValue, context) {
|
|
55
|
+
return DecoratorMetadata.decorateOrCreate("event-reaction", schemaOrValue, context);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Creates one Event field equality filter for an Event-consuming handler.
|
|
59
|
+
*
|
|
60
|
+
* Generated handler analysis validates the declaration and carries it into
|
|
61
|
+
* immutable repository metadata. The decorator itself does not inspect or
|
|
62
|
+
* invoke the handler.
|
|
63
|
+
*
|
|
64
|
+
* @param options Event source field and canonical expected value.
|
|
65
|
+
* @returns Decorator for a public instance handler method.
|
|
66
|
+
*/
|
|
67
|
+
export function Where(options) {
|
|
68
|
+
const snapshot = WhereValues.snapshot(options);
|
|
69
|
+
return (_value, context) => {
|
|
70
|
+
void snapshot;
|
|
71
|
+
DecoratorMetadata.methodName(context);
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Creates legacy framework event-application metadata.
|
|
76
|
+
*
|
|
77
|
+
* New application aggregates must not use `@Apply`; managed aggregates are no
|
|
78
|
+
* longer event-sourced and the framework owns state transactions. This
|
|
79
|
+
* decorator is kept only for compatibility code that still needs explicit
|
|
80
|
+
* schema-bearing event application metadata. The optional `allowImport` flag
|
|
81
|
+
* is preserved only as part of that legacy metadata shape.
|
|
82
|
+
*
|
|
83
|
+
* @param schema Event schema accepted by the decorated method.
|
|
84
|
+
* @param options Legacy event-application metadata options.
|
|
85
|
+
* @returns Decorator that records the application metadata.
|
|
86
|
+
*/
|
|
87
|
+
export function Apply(schema, options = {}) {
|
|
88
|
+
return DecoratorMetadata.create("event-application", schema, options);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Builds schema-bearing decorator declarations for framework compatibility.
|
|
92
|
+
*
|
|
93
|
+
* The returned object is the same frozen `EntityHandlersMetadata` contract
|
|
94
|
+
* produced by `EntityHandlers.define()` and accepted by
|
|
95
|
+
* `HandlerMetadataRegistry`. Only own prototype methods of `entityType` are
|
|
96
|
+
* inspected; inherited decorated methods are intentionally not materialized by
|
|
97
|
+
* this class-owned adapter.
|
|
98
|
+
*
|
|
99
|
+
* Application code must not call this function and must not provide its own
|
|
100
|
+
* handler discovery/materialization. Generated framework registries own schema
|
|
101
|
+
* inference for bare decorators; this adapter only supports legacy
|
|
102
|
+
* schema-bearing decorator metadata.
|
|
103
|
+
*
|
|
104
|
+
* @typeParam Instance - Entity instance that owns the handlers.
|
|
105
|
+
* @typeParam StateSchema - Schema that describes the entity state.
|
|
106
|
+
* @param entityType Entity class whose own decorated methods are read.
|
|
107
|
+
* @param stateSchema Schema that describes the entity state.
|
|
108
|
+
* @returns Frozen handler metadata for the decorated methods.
|
|
109
|
+
*/
|
|
110
|
+
export function materializeDecoratedEntityHandlers(entityType, stateSchema) {
|
|
111
|
+
const decoratedHandlers = DecoratorMetadata.collect(entityType);
|
|
112
|
+
return EntityHandlers.define(entityType, stateSchema, (builder) => decoratedHandlers.map((handler) => {
|
|
113
|
+
const methodName = handler.methodName;
|
|
114
|
+
switch (handler.kind) {
|
|
115
|
+
case "command-assignment":
|
|
116
|
+
return builder.assign(DecoratorMetadata.schema(handler), methodName);
|
|
117
|
+
case "command-reaction":
|
|
118
|
+
return builder.command(DecoratorMetadata.schema(handler), methodName);
|
|
119
|
+
case "event-subscription":
|
|
120
|
+
return builder.subscribe(DecoratorMetadata.schema(handler), methodName);
|
|
121
|
+
case "event-reaction":
|
|
122
|
+
return builder.react(DecoratorMetadata.schema(handler), methodName);
|
|
123
|
+
case "event-application":
|
|
124
|
+
return builder.apply(DecoratorMetadata.schema(handler), methodName, {
|
|
125
|
+
allowImport: handler.allowImport ?? false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
const DecoratorMetadata = Object.freeze({
|
|
131
|
+
methodName(context) {
|
|
132
|
+
if (context.static || context.private) {
|
|
133
|
+
throw new TypeError("Spine handler decorators must be applied to public instance methods.");
|
|
134
|
+
}
|
|
135
|
+
if (typeof context.name !== "string") {
|
|
136
|
+
throw new TypeError("Spine handler decorators require string-named methods.");
|
|
137
|
+
}
|
|
138
|
+
return context.name;
|
|
139
|
+
},
|
|
140
|
+
decorateOrCreate(kind, schemaOrValue, context) {
|
|
141
|
+
if (context !== undefined) {
|
|
142
|
+
DecoratorMetadata.create(kind)(schemaOrValue, context);
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
return DecoratorMetadata.create(kind, schemaOrValue);
|
|
146
|
+
},
|
|
147
|
+
create(kind, schema, options = {}) {
|
|
148
|
+
return (_value, context) => {
|
|
149
|
+
const methodName = DecoratorMetadata.methodName(context);
|
|
150
|
+
const record = Object.freeze({
|
|
151
|
+
kind,
|
|
152
|
+
...(schema === undefined ? {} : { schema }),
|
|
153
|
+
methodName,
|
|
154
|
+
...(kind === "event-application" ? { allowImport: options.allowImport ?? false } : {}),
|
|
155
|
+
});
|
|
156
|
+
const metadata = DecoratorMetadata.require(context);
|
|
157
|
+
const previous = DecoratorMetadata.read(metadata);
|
|
158
|
+
Object.defineProperty(metadata, handlerDecoratorMetadataKey, {
|
|
159
|
+
configurable: true,
|
|
160
|
+
enumerable: false,
|
|
161
|
+
value: Object.freeze([...previous, record]),
|
|
162
|
+
writable: true,
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
},
|
|
166
|
+
schema(handler) {
|
|
167
|
+
if (handler.schema === undefined) {
|
|
168
|
+
throw new TypeError(`Decorated handler "${handler.methodName}" was declared without a schema; ` +
|
|
169
|
+
"use generated registry metadata or explicit EntityHandlers.define() registration.");
|
|
170
|
+
}
|
|
171
|
+
return handler.schema;
|
|
172
|
+
},
|
|
173
|
+
collect(entityType) {
|
|
174
|
+
const metadata = DecoratorMetadata.classMetadata(entityType);
|
|
175
|
+
if (metadata === undefined) {
|
|
176
|
+
return Object.freeze([]);
|
|
177
|
+
}
|
|
178
|
+
const records = DecoratorMetadata.read(metadata).filter((record) => {
|
|
179
|
+
const descriptor = Object.getOwnPropertyDescriptor(entityType.prototype, record.methodName);
|
|
180
|
+
return typeof descriptor?.value === "function";
|
|
181
|
+
});
|
|
182
|
+
return Object.freeze(records);
|
|
183
|
+
},
|
|
184
|
+
installSymbol() {
|
|
185
|
+
const existingMetadata = Reflect.get(Symbol, "metadata");
|
|
186
|
+
if (typeof existingMetadata === "symbol") {
|
|
187
|
+
return existingMetadata;
|
|
188
|
+
}
|
|
189
|
+
const metadata = Symbol("Symbol.metadata");
|
|
190
|
+
Object.defineProperty(Symbol, "metadata", {
|
|
191
|
+
configurable: true,
|
|
192
|
+
enumerable: false,
|
|
193
|
+
value: metadata,
|
|
194
|
+
writable: false,
|
|
195
|
+
});
|
|
196
|
+
return metadata;
|
|
197
|
+
},
|
|
198
|
+
require(context) {
|
|
199
|
+
if (context.metadata === undefined) {
|
|
200
|
+
throw new TypeError("Spine handler decorators require standard decorator metadata support.");
|
|
201
|
+
}
|
|
202
|
+
return context.metadata;
|
|
203
|
+
},
|
|
204
|
+
classMetadata(entityType) {
|
|
205
|
+
const descriptor = Object.getOwnPropertyDescriptor(entityType, decoratorMetadataSymbol);
|
|
206
|
+
const metadata = descriptor?.value;
|
|
207
|
+
if (metadata === null || typeof metadata !== "object") {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
return metadata;
|
|
211
|
+
},
|
|
212
|
+
read(metadata) {
|
|
213
|
+
if (!Object.hasOwn(metadata, handlerDecoratorMetadataKey)) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
const value = metadata[handlerDecoratorMetadataKey];
|
|
217
|
+
return Array.isArray(value) ? value : [];
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
const WhereValues = Object.freeze({
|
|
221
|
+
snapshot(options) {
|
|
222
|
+
const value = options;
|
|
223
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
224
|
+
throw new TypeError("Where options must be an object.");
|
|
225
|
+
}
|
|
226
|
+
const keys = Object.keys(value);
|
|
227
|
+
if (keys.length !== 2 ||
|
|
228
|
+
!keys.includes("eventField") ||
|
|
229
|
+
!keys.includes("equals") ||
|
|
230
|
+
typeof options.eventField !== "string" ||
|
|
231
|
+
options.eventField.trim().length === 0 ||
|
|
232
|
+
typeof options.equals !== "string") {
|
|
233
|
+
throw new TypeError("Where options require exactly non-empty eventField and string equals.");
|
|
234
|
+
}
|
|
235
|
+
return Object.freeze({ eventField: options.eventField, equals: options.equals });
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
const decoratorMetadataSymbol = DecoratorMetadata.installSymbol();
|
|
239
|
+
//# sourceMappingURL=handler-decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-decorators.js","sourceRoot":"","sources":["../../src/handler/handler-decorators.ts"],"names":[],"mappings":"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"}
|