@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,223 @@
|
|
|
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 { isEntitySchema } from "../entity/entity-metadata.js";
|
|
15
|
+
import { HandlerMetadataValues, HandlerMetadataRegistry, } from "./handler-metadata.js";
|
|
16
|
+
import { RejectionSources } from "./rejection-source.js";
|
|
17
|
+
/**
|
|
18
|
+
* Framework-owned ingestion adapter for generated handler registries.
|
|
19
|
+
*/
|
|
20
|
+
export class HandlerRegistryIngestor {
|
|
21
|
+
// prettier-ignore
|
|
22
|
+
/**
|
|
23
|
+
* Converts generated registry records into canonical entity handler metadata.
|
|
24
|
+
*
|
|
25
|
+
* @param registry Generated registry metadata to validate and materialize.
|
|
26
|
+
* @returns Frozen canonical entity-handler metadata.
|
|
27
|
+
*/
|
|
28
|
+
ingest(registry) {
|
|
29
|
+
GeneratedRegistry.assert(registry);
|
|
30
|
+
GeneratedRegistry.validateVersion(registry);
|
|
31
|
+
return Object.freeze(registry.entities.map((entity) => GeneratedRegistry.materialize(entity)));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Registers generated registry records in a caller-owned metadata registry.
|
|
35
|
+
*
|
|
36
|
+
* @param generated Generated registry metadata to validate and register.
|
|
37
|
+
* @param registry Metadata registry to update.
|
|
38
|
+
* @returns The updated metadata registry.
|
|
39
|
+
*/
|
|
40
|
+
register(generated, registry = new HandlerMetadataRegistry()) {
|
|
41
|
+
GeneratedRegistry.assert(generated);
|
|
42
|
+
const entityHandlers = this.ingest(generated);
|
|
43
|
+
new HandlerMetadataRegistry([...registry.listEntityHandlers(), ...entityHandlers]);
|
|
44
|
+
for (const metadata of entityHandlers) {
|
|
45
|
+
registry.register(metadata);
|
|
46
|
+
}
|
|
47
|
+
return registry;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Error thrown when generated handler registry metadata cannot be ingested.
|
|
52
|
+
*/
|
|
53
|
+
export class HandlerRegistryIngestionError extends Error {
|
|
54
|
+
// prettier-ignore
|
|
55
|
+
/**
|
|
56
|
+
* Stable code for callers/tests that need structured failure handling.
|
|
57
|
+
*/
|
|
58
|
+
code;
|
|
59
|
+
/**
|
|
60
|
+
* Creates an ingestion error.
|
|
61
|
+
*
|
|
62
|
+
* @param code Stable code that identifies the failed validation.
|
|
63
|
+
* @param message Human-readable failure description.
|
|
64
|
+
*/
|
|
65
|
+
constructor(code, message) {
|
|
66
|
+
super(message);
|
|
67
|
+
this.name = "HandlerRegistryIngestionError";
|
|
68
|
+
this.code = code;
|
|
69
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const registryVersion = 3;
|
|
73
|
+
const GeneratedRegistry = Object.freeze({
|
|
74
|
+
assert(registry) {
|
|
75
|
+
if (registry === null || typeof registry !== "object") {
|
|
76
|
+
throw new HandlerRegistryIngestionError("UNSUPPORTED_REGISTRY_VERSION", "Generated handler registry must be an object.");
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
validateVersion(registry) {
|
|
80
|
+
const version = registry.version;
|
|
81
|
+
if (version === registryVersion) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
throw new HandlerRegistryIngestionError("UNSUPPORTED_REGISTRY_VERSION", `Generated handler registry version ${String(version)} is not supported.`);
|
|
85
|
+
},
|
|
86
|
+
materialize(entity) {
|
|
87
|
+
GeneratedRegistry.validateSchema(entity.stateSchema, "entity state schema");
|
|
88
|
+
entity.handlers.forEach((handler) => {
|
|
89
|
+
GeneratedRegistry.validateHandler(handler);
|
|
90
|
+
});
|
|
91
|
+
return HandlerMetadataValues.defineArity(entity.entityType, entity.stateSchema, (builder) => entity.handlers.map((handler) => GeneratedRegistry.build(builder, handler)), entity.handlers.map((handler) => ({
|
|
92
|
+
kind: handler.kind,
|
|
93
|
+
methodName: handler.methodName,
|
|
94
|
+
...(handler.kind === "event-subscription" || handler.kind === "state-subscription"
|
|
95
|
+
? {}
|
|
96
|
+
: { emittedSchemas: Object.freeze([...handler.emittedSchemas]) }),
|
|
97
|
+
parameterCount: handler.parameterCount,
|
|
98
|
+
origin: handler.origin,
|
|
99
|
+
...(handler.where === undefined ? {} : { where: Object.freeze({ ...handler.where }) }),
|
|
100
|
+
})));
|
|
101
|
+
},
|
|
102
|
+
build(builder, handler) {
|
|
103
|
+
switch (handler.kind) {
|
|
104
|
+
case "command-assignment":
|
|
105
|
+
return builder.assign(handler.signalSchema, handler.methodName);
|
|
106
|
+
case "command-reaction":
|
|
107
|
+
return builder.command(handler.signalSchema, handler.methodName);
|
|
108
|
+
case "event-subscription":
|
|
109
|
+
return builder.subscribe(handler.signalSchema, handler.methodName);
|
|
110
|
+
case "state-subscription":
|
|
111
|
+
return builder.subscribe(handler.signalSchema, handler.methodName);
|
|
112
|
+
case "event-reaction":
|
|
113
|
+
return builder.react(handler.signalSchema, handler.methodName);
|
|
114
|
+
default:
|
|
115
|
+
throw new HandlerRegistryIngestionError("UNSUPPORTED_HANDLER_KIND", `Generated handler kind "${String(handler.kind)}" is not supported.`);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
validateHandler(handler) {
|
|
119
|
+
if (!GeneratedRegistry.isKind(handler.kind)) {
|
|
120
|
+
throw new HandlerRegistryIngestionError("UNSUPPORTED_HANDLER_KIND", `Generated handler kind "${String(handler.kind)}" is not supported.`);
|
|
121
|
+
}
|
|
122
|
+
const origin = handler.origin;
|
|
123
|
+
if (origin !== "domestic" && origin !== "external") {
|
|
124
|
+
throw new HandlerRegistryIngestionError("INVALID_SIGNAL_ORIGIN", `Generated handler "${handler.methodName}" declares an invalid signal origin.`);
|
|
125
|
+
}
|
|
126
|
+
if (handler.origin === "external" &&
|
|
127
|
+
(handler.kind === "command-assignment" ||
|
|
128
|
+
(handler.kind === "command-reaction" &&
|
|
129
|
+
!GeneratedRegistry.isEventInputSchema(handler.signalSchema)))) {
|
|
130
|
+
throw new HandlerRegistryIngestionError("EXTERNAL_COMMAND_RECEIVER", `Generated command receiver "${handler.methodName}" cannot accept external commands.`);
|
|
131
|
+
}
|
|
132
|
+
const parameterCount = handler.parameterCount;
|
|
133
|
+
if (parameterCount !== 1 && parameterCount !== 2) {
|
|
134
|
+
throw new HandlerRegistryIngestionError("INVALID_PARAMETER_COUNT", `Generated handler "${handler.methodName}" declares unsupported parameter count ` +
|
|
135
|
+
`${String(parameterCount)}.`);
|
|
136
|
+
}
|
|
137
|
+
GeneratedRegistry.validateSchema(handler.signalSchema, `signal schema for generated handler "${handler.methodName}"`);
|
|
138
|
+
handler.emittedSchemas.forEach((schema, index) => {
|
|
139
|
+
GeneratedRegistry.validateSchema(schema, `emitted schema ${String(index)} for generated handler "${handler.methodName}"`);
|
|
140
|
+
});
|
|
141
|
+
GeneratedRegistry.validateWhere(handler);
|
|
142
|
+
if (handler.kind === "event-subscription" || handler.kind === "state-subscription") {
|
|
143
|
+
GeneratedRegistry.validateSubscription(handler);
|
|
144
|
+
if (handler.kind === "state-subscription" && !isEntitySchema(handler.signalSchema)) {
|
|
145
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated state subscription handler "${handler.methodName}" must declare an entity state schema.`);
|
|
146
|
+
}
|
|
147
|
+
if (handler.kind === "event-subscription" && isEntitySchema(handler.signalSchema)) {
|
|
148
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated event subscription handler "${handler.methodName}" must not declare an entity state schema.`);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (handler.kind === "command-assignment" || handler.kind === "command-reaction") {
|
|
153
|
+
GeneratedRegistry.validateEmits(handler);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
validateSchema(schema, label) {
|
|
157
|
+
const value = schema;
|
|
158
|
+
if (value === null || typeof value !== "object") {
|
|
159
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated handler registry ${label} must be an object with a non-empty typeName.`);
|
|
160
|
+
}
|
|
161
|
+
const typeName = value.typeName;
|
|
162
|
+
if (typeof typeName === "string" && typeName.trim().length > 0) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated handler registry ${label} must be an object with a non-empty typeName.`);
|
|
166
|
+
},
|
|
167
|
+
validateEmits(handler) {
|
|
168
|
+
if (handler.emittedSchemas.length > 0) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
throw new HandlerRegistryIngestionError("MISSING_EMITTED_SCHEMAS", `Generated handler "${handler.methodName}" must declare at least one emitted schema.`);
|
|
172
|
+
},
|
|
173
|
+
validateSubscription(handler) {
|
|
174
|
+
if (handler.emittedSchemas.length === 0) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
throw new HandlerRegistryIngestionError("UNEXPECTED_EMITTED_SCHEMAS", `Generated event subscription handler "${handler.methodName}" must not declare emitted schemas.`);
|
|
178
|
+
},
|
|
179
|
+
validateWhere(handler) {
|
|
180
|
+
const where = handler.where;
|
|
181
|
+
if (where === undefined)
|
|
182
|
+
return;
|
|
183
|
+
if (typeof where !== "object" ||
|
|
184
|
+
where === null ||
|
|
185
|
+
Array.isArray(where) ||
|
|
186
|
+
(Reflect.getPrototypeOf(where) !== Object.prototype && Reflect.getPrototypeOf(where) !== null)) {
|
|
187
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated handler "${handler.methodName}" declares an invalid Event field filter.`);
|
|
188
|
+
}
|
|
189
|
+
const keys = Object.keys(where);
|
|
190
|
+
const filter = where;
|
|
191
|
+
if (keys.length !== 2 ||
|
|
192
|
+
!keys.includes("eventField") ||
|
|
193
|
+
!keys.includes("equals") ||
|
|
194
|
+
typeof filter.eventField !== "string" ||
|
|
195
|
+
filter.eventField.trim().length === 0 ||
|
|
196
|
+
typeof filter.equals !== "string" ||
|
|
197
|
+
!GeneratedRegistry.isEventInputSchema(handler.signalSchema) ||
|
|
198
|
+
(handler.kind !== "event-subscription" &&
|
|
199
|
+
handler.kind !== "event-reaction" &&
|
|
200
|
+
handler.kind !== "command-reaction")) {
|
|
201
|
+
throw new HandlerRegistryIngestionError("INVALID_SCHEMA", `Generated handler "${handler.methodName}" declares an invalid Event field filter.`);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
isEventInputSchema(schema) {
|
|
205
|
+
const fileName = schema.file.name.split(/[\\/]/u).at(-1);
|
|
206
|
+
return (fileName === "events" ||
|
|
207
|
+
fileName === "events.proto" ||
|
|
208
|
+
fileName?.endsWith("_events") === true ||
|
|
209
|
+
fileName?.endsWith("_events.proto") === true ||
|
|
210
|
+
fileName === "rejections" ||
|
|
211
|
+
fileName?.endsWith("_rejections") === true ||
|
|
212
|
+
RejectionSources.matches(schema.file.name) ||
|
|
213
|
+
schema.typeName === "spine.core.Event");
|
|
214
|
+
},
|
|
215
|
+
isKind(kind) {
|
|
216
|
+
return (kind === "command-assignment" ||
|
|
217
|
+
kind === "command-reaction" ||
|
|
218
|
+
kind === "event-subscription" ||
|
|
219
|
+
kind === "state-subscription" ||
|
|
220
|
+
kind === "event-reaction");
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
//# sourceMappingURL=generated-handler-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-handler-registry.js","sourceRoot":"","sources":["../../src/handler/generated-handler-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { HandlerRegistryIngestor } from "./generated-handler-registry.js";
|
|
2
|
+
import { HandlerMetadataRegistry } from "./handler-metadata.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stable error code for generated registry discovery failures.
|
|
5
|
+
*/
|
|
6
|
+
export type RegistryDiscoveryErrorCode = "MODULE_IMPORT_FAILED" | "MISSING_REGISTRY_EXPORT" | "INVALID_REGISTRY_MODULE" | "REGISTRY_INGESTION_FAILED" | "UNSUPPORTED_MODULE_SCHEME" | "INVALID_MODULE_REF" | "DUPLICATE_REGISTRY_MODULE";
|
|
7
|
+
/**
|
|
8
|
+
* Options for loading one or more generated registry modules.
|
|
9
|
+
*/
|
|
10
|
+
export interface GeneratedRegistryDiscoveryOptions {
|
|
11
|
+
/**
|
|
12
|
+
* Explicit filesystem paths or file: URLs to load.
|
|
13
|
+
*/
|
|
14
|
+
readonly modules: readonly (string | URL)[];
|
|
15
|
+
/**
|
|
16
|
+
* Export name expected from each generated module.
|
|
17
|
+
*/
|
|
18
|
+
readonly exportName?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional retry token used to bypass Node's dynamic import cache for canonical modules.
|
|
21
|
+
*/
|
|
22
|
+
readonly cacheBust?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Error thrown when generated registry discovery or loading fails.
|
|
26
|
+
*/
|
|
27
|
+
export declare class GeneratedRegistryDiscoveryError extends Error {
|
|
28
|
+
/**
|
|
29
|
+
* Stable code for callers/tests that need structured failure handling.
|
|
30
|
+
*/
|
|
31
|
+
readonly code: RegistryDiscoveryErrorCode;
|
|
32
|
+
/**
|
|
33
|
+
* Normalized imported module identifier.
|
|
34
|
+
*/
|
|
35
|
+
readonly moduleId: string;
|
|
36
|
+
/**
|
|
37
|
+
* Optional underlying import or ingestion error.
|
|
38
|
+
*/
|
|
39
|
+
readonly cause: unknown;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a registry discovery error.
|
|
42
|
+
*
|
|
43
|
+
* @param code Stable code that identifies the failed operation.
|
|
44
|
+
* @param message Human-readable failure description.
|
|
45
|
+
* @param moduleId Normalized identifier of the affected module.
|
|
46
|
+
* @param cause Underlying import or ingestion failure.
|
|
47
|
+
*/
|
|
48
|
+
constructor(code: RegistryDiscoveryErrorCode, message: string, moduleId: string, cause?: unknown);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Framework-owned runtime loader for generated handler registry modules.
|
|
52
|
+
*/
|
|
53
|
+
export declare class GeneratedRegistryDiscovery {
|
|
54
|
+
#private;
|
|
55
|
+
/**
|
|
56
|
+
* Creates a generated-registry loader.
|
|
57
|
+
*
|
|
58
|
+
* @param ingestor Adapter that validates and registers loaded metadata.
|
|
59
|
+
*/
|
|
60
|
+
constructor(ingestor?: HandlerRegistryIngestor);
|
|
61
|
+
/**
|
|
62
|
+
* Builds the conventional generated registry module path for one package or app root.
|
|
63
|
+
*
|
|
64
|
+
* @param root Package or application root directory.
|
|
65
|
+
* @returns Absolute path to the conventional registry module.
|
|
66
|
+
*/
|
|
67
|
+
static conventionalModulePath(root: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* Builds the conventional generated registry module URL for one package or app root.
|
|
70
|
+
*
|
|
71
|
+
* @param root Package or application root directory.
|
|
72
|
+
* @returns File URL for the conventional registry module.
|
|
73
|
+
*/
|
|
74
|
+
static conventionalModuleUrl(root: string): URL;
|
|
75
|
+
/**
|
|
76
|
+
* Loads generated handler registries from explicit filesystem paths or file URLs.
|
|
77
|
+
*
|
|
78
|
+
* @param options Module references and optional load configuration.
|
|
79
|
+
* @returns Frozen loaded registry values in module order.
|
|
80
|
+
*/
|
|
81
|
+
load(options: GeneratedRegistryDiscoveryOptions): Promise<readonly unknown[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Loads generated handler registries and ingests them into a caller-owned metadata registry.
|
|
84
|
+
*
|
|
85
|
+
* Registration stages all new metadata before mutating the caller-owned registry.
|
|
86
|
+
*
|
|
87
|
+
* @param options Module references and optional load configuration.
|
|
88
|
+
* @param registry Metadata registry to update, if one already exists.
|
|
89
|
+
* @returns Registry containing the loaded generated metadata.
|
|
90
|
+
*/
|
|
91
|
+
register(options: GeneratedRegistryDiscoveryOptions, registry?: HandlerMetadataRegistry): Promise<HandlerMetadataRegistry>;
|
|
92
|
+
private loadModules;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=generated-registry-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-registry-discovery.d.ts","sourceRoot":"","sources":["../../src/handler/generated-registry-discovery.ts"],"names":[],"mappings":"AAiBA,OAAO,EAEL,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAOhE;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAClC,sBAAsB,GACtB,yBAAyB,GACzB,yBAAyB,GACzB,2BAA2B,GAC3B,2BAA2B,GAC3B,oBAAoB,GACpB,2BAA2B,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,iCAAiC;IAGhD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;IAE5C;;OAEG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,+BAAgC,SAAQ,KAAK;IAGxD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,SAAkB,KAAK,EAAE,OAAO,CAAC;IAEjC;;;;;;;OAOG;gBAED,IAAI,EAAE,0BAA0B,EAChC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,OAAO;CASlB;AAED;;GAEG;AACH,qBAAa,0BAA0B;;IAGrC;;;;OAIG;gBACS,QAAQ,GAAE,uBAAuD;IAI7E;;;;;OAKG;IACH,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInD;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAI/C;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,iCAAiC,GAAG,OAAO,CAAC,SAAS,OAAO,EAAE,CAAC;IAMnF;;;;;;;;OAQG;IACG,QAAQ,CACZ,OAAO,EAAE,iCAAiC,EAC1C,QAAQ,CAAC,EAAE,uBAAuB,GACjC,OAAO,CAAC,uBAAuB,CAAC;YA8BrB,WAAW;CAqB1B"}
|
|
@@ -0,0 +1,228 @@
|
|
|
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 { resolve } from "node:path";
|
|
15
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
16
|
+
import { HandlerRegistryIngestor, } from "./generated-handler-registry.js";
|
|
17
|
+
import { HandlerMetadataRegistry } from "./handler-metadata.js";
|
|
18
|
+
const defaultExportName = "generatedHandlerRegistry";
|
|
19
|
+
const generatedRegistryFile = "generated/handler/generated-handler-registry.js";
|
|
20
|
+
const moduleSchemeRe = /^[A-Za-z][A-Za-z\d+.-]*:/;
|
|
21
|
+
const registryVersion = 3;
|
|
22
|
+
/**
|
|
23
|
+
* Error thrown when generated registry discovery or loading fails.
|
|
24
|
+
*/
|
|
25
|
+
export class GeneratedRegistryDiscoveryError extends Error {
|
|
26
|
+
// prettier-ignore
|
|
27
|
+
/**
|
|
28
|
+
* Stable code for callers/tests that need structured failure handling.
|
|
29
|
+
*/
|
|
30
|
+
code;
|
|
31
|
+
/**
|
|
32
|
+
* Normalized imported module identifier.
|
|
33
|
+
*/
|
|
34
|
+
moduleId;
|
|
35
|
+
/**
|
|
36
|
+
* Optional underlying import or ingestion error.
|
|
37
|
+
*/
|
|
38
|
+
cause;
|
|
39
|
+
/**
|
|
40
|
+
* Creates a registry discovery error.
|
|
41
|
+
*
|
|
42
|
+
* @param code Stable code that identifies the failed operation.
|
|
43
|
+
* @param message Human-readable failure description.
|
|
44
|
+
* @param moduleId Normalized identifier of the affected module.
|
|
45
|
+
* @param cause Underlying import or ingestion failure.
|
|
46
|
+
*/
|
|
47
|
+
constructor(code, message, moduleId, cause) {
|
|
48
|
+
super(message);
|
|
49
|
+
this.name = "GeneratedRegistryDiscoveryError";
|
|
50
|
+
this.code = code;
|
|
51
|
+
this.moduleId = moduleId;
|
|
52
|
+
this.cause = cause;
|
|
53
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Framework-owned runtime loader for generated handler registry modules.
|
|
58
|
+
*/
|
|
59
|
+
export class GeneratedRegistryDiscovery {
|
|
60
|
+
#ingestor;
|
|
61
|
+
/**
|
|
62
|
+
* Creates a generated-registry loader.
|
|
63
|
+
*
|
|
64
|
+
* @param ingestor Adapter that validates and registers loaded metadata.
|
|
65
|
+
*/
|
|
66
|
+
constructor(ingestor = new HandlerRegistryIngestor()) {
|
|
67
|
+
this.#ingestor = ingestor;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Builds the conventional generated registry module path for one package or app root.
|
|
71
|
+
*
|
|
72
|
+
* @param root Package or application root directory.
|
|
73
|
+
* @returns Absolute path to the conventional registry module.
|
|
74
|
+
*/
|
|
75
|
+
static conventionalModulePath(root) {
|
|
76
|
+
return resolve(root, generatedRegistryFile);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Builds the conventional generated registry module URL for one package or app root.
|
|
80
|
+
*
|
|
81
|
+
* @param root Package or application root directory.
|
|
82
|
+
* @returns File URL for the conventional registry module.
|
|
83
|
+
*/
|
|
84
|
+
static conventionalModuleUrl(root) {
|
|
85
|
+
return pathToFileURL(GeneratedRegistryDiscovery.conventionalModulePath(root));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Loads generated handler registries from explicit filesystem paths or file URLs.
|
|
89
|
+
*
|
|
90
|
+
* @param options Module references and optional load configuration.
|
|
91
|
+
* @returns Frozen loaded registry values in module order.
|
|
92
|
+
*/
|
|
93
|
+
async load(options) {
|
|
94
|
+
const loaded = await this.loadModules(options);
|
|
95
|
+
return Object.freeze(loaded.map((entry) => entry.registry));
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Loads generated handler registries and ingests them into a caller-owned metadata registry.
|
|
99
|
+
*
|
|
100
|
+
* Registration stages all new metadata before mutating the caller-owned registry.
|
|
101
|
+
*
|
|
102
|
+
* @param options Module references and optional load configuration.
|
|
103
|
+
* @param registry Metadata registry to update, if one already exists.
|
|
104
|
+
* @returns Registry containing the loaded generated metadata.
|
|
105
|
+
*/
|
|
106
|
+
async register(options, registry) {
|
|
107
|
+
const loaded = await this.loadModules(options);
|
|
108
|
+
const target = registry ?? new HandlerMetadataRegistry();
|
|
109
|
+
const existing = target.listEntityHandlers();
|
|
110
|
+
const staged = new HandlerMetadataRegistry(existing);
|
|
111
|
+
for (const entry of loaded) {
|
|
112
|
+
try {
|
|
113
|
+
this.#ingestor.register(entry.registry, staged);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
throw new GeneratedRegistryDiscoveryError("REGISTRY_INGESTION_FAILED", `Generated handler registry module "${entry.moduleId}" could not be ingested.`, entry.moduleId, error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (registry === undefined) {
|
|
120
|
+
return staged;
|
|
121
|
+
}
|
|
122
|
+
for (const metadata of staged.listEntityHandlers().slice(existing.length)) {
|
|
123
|
+
registry.register(metadata);
|
|
124
|
+
}
|
|
125
|
+
return registry;
|
|
126
|
+
}
|
|
127
|
+
async loadModules(options) {
|
|
128
|
+
const exportName = options.exportName ?? defaultExportName;
|
|
129
|
+
const moduleRefs = [...options.modules];
|
|
130
|
+
const moduleIds = moduleRefs.map((moduleRef) => RegistryModules.normalize(moduleRef));
|
|
131
|
+
const loaded = [];
|
|
132
|
+
RegistryModules.assertUnique(moduleIds);
|
|
133
|
+
for (const moduleId of moduleIds) {
|
|
134
|
+
const exports = await RegistryModules.import(RegistryModules.cacheable(moduleId, options));
|
|
135
|
+
loaded.push({
|
|
136
|
+
moduleId,
|
|
137
|
+
registry: RegistryModules.registry(exports, moduleId, exportName),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
return Object.freeze(loaded);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const RegistryModules = Object.freeze({
|
|
144
|
+
async import(moduleId) {
|
|
145
|
+
try {
|
|
146
|
+
return await import(moduleId);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
throw new GeneratedRegistryDiscoveryError("MODULE_IMPORT_FAILED", `Could not import generated handler registry module "${moduleId}".`, moduleId, error);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
cacheable(moduleId, options) {
|
|
153
|
+
if (options.cacheBust === undefined || options.cacheBust.length === 0) {
|
|
154
|
+
return moduleId;
|
|
155
|
+
}
|
|
156
|
+
const moduleUrl = new URL(moduleId);
|
|
157
|
+
moduleUrl.searchParams.set("spine-registry-cache", options.cacheBust);
|
|
158
|
+
return moduleUrl.href;
|
|
159
|
+
},
|
|
160
|
+
registry(exports, moduleId, exportName) {
|
|
161
|
+
const value = RegistryModules.export(exports, exportName);
|
|
162
|
+
if (value === undefined) {
|
|
163
|
+
throw new GeneratedRegistryDiscoveryError("MISSING_REGISTRY_EXPORT", `Generated handler registry module "${moduleId}" does not export "${exportName}".`, moduleId);
|
|
164
|
+
}
|
|
165
|
+
if (RegistryModules.isRegistry(value)) {
|
|
166
|
+
return value;
|
|
167
|
+
}
|
|
168
|
+
throw new GeneratedRegistryDiscoveryError("INVALID_REGISTRY_MODULE", `Generated handler registry module "${moduleId}" exports invalid "${exportName}" metadata.`, moduleId);
|
|
169
|
+
},
|
|
170
|
+
export(exports, exportName) {
|
|
171
|
+
if (exports === null || typeof exports !== "object") {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
return exports[exportName];
|
|
175
|
+
},
|
|
176
|
+
isRegistry(value) {
|
|
177
|
+
if (value === null || typeof value !== "object") {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const version = value.version;
|
|
181
|
+
const entities = value.entities;
|
|
182
|
+
return version === registryVersion && Array.isArray(entities);
|
|
183
|
+
},
|
|
184
|
+
normalize(moduleRef) {
|
|
185
|
+
if (moduleRef instanceof URL) {
|
|
186
|
+
return RegistryModules.url(moduleRef);
|
|
187
|
+
}
|
|
188
|
+
if (RegistryModules.isUrl(moduleRef)) {
|
|
189
|
+
return RegistryModules.url(RegistryModules.parse(moduleRef));
|
|
190
|
+
}
|
|
191
|
+
return pathToFileURL(resolve(moduleRef)).href;
|
|
192
|
+
},
|
|
193
|
+
url(moduleUrl) {
|
|
194
|
+
if (moduleUrl.protocol !== "file:") {
|
|
195
|
+
throw new GeneratedRegistryDiscoveryError("UNSUPPORTED_MODULE_SCHEME", `Generated handler registry module "${moduleUrl.href}" must use the file: URL scheme.`, moduleUrl.href);
|
|
196
|
+
}
|
|
197
|
+
if (moduleUrl.search.length > 0 || moduleUrl.hash.length > 0) {
|
|
198
|
+
throw new GeneratedRegistryDiscoveryError("INVALID_MODULE_REF", `Generated handler registry module "${moduleUrl.href}" must not include a query or hash.`, moduleUrl.href);
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
return pathToFileURL(resolve(fileURLToPath(moduleUrl))).href;
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
throw new GeneratedRegistryDiscoveryError("INVALID_MODULE_REF", `Generated handler registry module "${moduleUrl.href}" is not a valid file URL.`, moduleUrl.href, error);
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
isUrl(moduleRef) {
|
|
208
|
+
return moduleSchemeRe.test(moduleRef) && !/^[A-Za-z]:[\\/]/.test(moduleRef);
|
|
209
|
+
},
|
|
210
|
+
parse(moduleRef) {
|
|
211
|
+
try {
|
|
212
|
+
return new URL(moduleRef);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
throw new GeneratedRegistryDiscoveryError("INVALID_MODULE_REF", `Generated handler registry module "${moduleRef}" is not a valid URL.`, moduleRef, error);
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
assertUnique(moduleIds) {
|
|
219
|
+
const seen = new Set();
|
|
220
|
+
for (const moduleId of moduleIds) {
|
|
221
|
+
if (seen.has(moduleId)) {
|
|
222
|
+
throw new GeneratedRegistryDiscoveryError("DUPLICATE_REGISTRY_MODULE", `Generated handler registry module "${moduleId}" was listed more than once.`, moduleId);
|
|
223
|
+
}
|
|
224
|
+
seen.add(moduleId);
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=generated-registry-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-registry-discovery.js","sourceRoot":"","sources":["../../src/handler/generated-registry-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { BuildHandlerAnalysis } from "./build-time-handler-analyzer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for deterministic generated-registry source rendering.
|
|
4
|
+
*/
|
|
5
|
+
export interface RegistryRenderOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Absolute or caller-owned output file used for relative import rendering.
|
|
8
|
+
*/
|
|
9
|
+
readonly outputFile: string;
|
|
10
|
+
/**
|
|
11
|
+
* Type-only module specifier used for the generated registry contract.
|
|
12
|
+
*/
|
|
13
|
+
readonly registryModuleSpecifier?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Exported constant name for the generated registry object.
|
|
16
|
+
*/
|
|
17
|
+
readonly registryName?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for guarded generated-registry file writing.
|
|
21
|
+
*/
|
|
22
|
+
export interface RegistryWriteOptions extends RegistryRenderOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Repository root used for Git-ignore and symlink validation.
|
|
25
|
+
*/
|
|
26
|
+
readonly repoRoot: string;
|
|
27
|
+
/**
|
|
28
|
+
* Explicit generated directory that must own the output file.
|
|
29
|
+
*/
|
|
30
|
+
readonly generatedRoot: string;
|
|
31
|
+
/**
|
|
32
|
+
* Published output path used for relative imports when writing to staging.
|
|
33
|
+
*/
|
|
34
|
+
readonly publishedOutputFile?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build-time writer for version-3 generated handler registry source.
|
|
38
|
+
*/
|
|
39
|
+
export declare class GeneratedRegistryWriter {
|
|
40
|
+
/**
|
|
41
|
+
* Renders generated registry source without writing to disk.
|
|
42
|
+
*
|
|
43
|
+
* @param analysis Analyzed entity handlers to render.
|
|
44
|
+
* @param options Caller-owned output and registry naming options.
|
|
45
|
+
* @returns Deterministic generated TypeScript source.
|
|
46
|
+
*/
|
|
47
|
+
render(analysis: BuildHandlerAnalysis, options: RegistryRenderOptions): string;
|
|
48
|
+
/**
|
|
49
|
+
* Validates and writes generated registry source only when explicitly invoked.
|
|
50
|
+
*
|
|
51
|
+
* @param analysis Analyzed entity handlers to render and validate.
|
|
52
|
+
* @param options Guarded output location and registry naming options.
|
|
53
|
+
* @returns Generated TypeScript source written to the output file.
|
|
54
|
+
*/
|
|
55
|
+
write(analysis: BuildHandlerAnalysis, options: RegistryWriteOptions): string;
|
|
56
|
+
}
|
|
57
|
+
export type { BuildHandlerAnalysis } from "./build-time-handler-analyzer.js";
|
|
58
|
+
//# sourceMappingURL=generated-registry-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generated-registry-writer.d.ts","sourceRoot":"","sources":["../../src/handler/generated-registry-writer.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,kCAAkC,CAAC;AAsE1C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAGpC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IAGjE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAGlC;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,qBAAqB,GAAG,MAAM;IAkB9E;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM;CAkB7E;AAydD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC"}
|