durable-actors 0.2.4
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.md +9 -0
- package/README.md +206 -0
- package/dist/actor/actor.d.ts +66 -0
- package/dist/actor/actor.d.ts.map +1 -0
- package/dist/actor/actor.js +144 -0
- package/dist/actor/actor.js.map +1 -0
- package/dist/actor/decorators.d.ts +6 -0
- package/dist/actor/decorators.d.ts.map +1 -0
- package/dist/actor/decorators.js +24 -0
- package/dist/actor/decorators.js.map +1 -0
- package/dist/actor/identity.d.ts +16 -0
- package/dist/actor/identity.d.ts.map +1 -0
- package/dist/actor/identity.js +29 -0
- package/dist/actor/identity.js.map +1 -0
- package/dist/actor/invocationContext.d.ts +4 -0
- package/dist/actor/invocationContext.d.ts.map +1 -0
- package/dist/actor/invocationContext.js +10 -0
- package/dist/actor/invocationContext.js.map +1 -0
- package/dist/actor/schema.d.ts +22 -0
- package/dist/actor/schema.d.ts.map +1 -0
- package/dist/actor/schema.js +8 -0
- package/dist/actor/schema.js.map +1 -0
- package/dist/actor/socket.d.ts +88 -0
- package/dist/actor/socket.d.ts.map +1 -0
- package/dist/actor/socket.js +216 -0
- package/dist/actor/socket.js.map +1 -0
- package/dist/actor/socketProtocol.d.ts +85 -0
- package/dist/actor/socketProtocol.d.ts.map +1 -0
- package/dist/actor/socketProtocol.js +95 -0
- package/dist/actor/socketProtocol.js.map +1 -0
- package/dist/actor/socketValidation.d.ts +29 -0
- package/dist/actor/socketValidation.d.ts.map +1 -0
- package/dist/actor/socketValidation.js +73 -0
- package/dist/actor/socketValidation.js.map +1 -0
- package/dist/backend.d.ts +13 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +45 -0
- package/dist/backend.js.map +1 -0
- package/dist/cli/actor-source-watcher.d.ts +11 -0
- package/dist/cli/actor-source-watcher.d.ts.map +1 -0
- package/dist/cli/actor-source-watcher.js +55 -0
- package/dist/cli/actor-source-watcher.js.map +1 -0
- package/dist/cli/connection.d.ts +14 -0
- package/dist/cli/connection.d.ts.map +1 -0
- package/dist/cli/connection.js +16 -0
- package/dist/cli/connection.js.map +1 -0
- package/dist/cli/control-plane.d.ts +34 -0
- package/dist/cli/control-plane.d.ts.map +1 -0
- package/dist/cli/control-plane.js +99 -0
- package/dist/cli/control-plane.js.map +1 -0
- package/dist/cli/deploy.d.ts +4 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +39 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/dev.d.ts +4 -0
- package/dist/cli/dev.d.ts.map +1 -0
- package/dist/cli/dev.js +121 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/generate.d.ts +4 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +59 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/objects.d.ts +4 -0
- package/dist/cli/objects.d.ts.map +1 -0
- package/dist/cli/objects.js +68 -0
- package/dist/cli/objects.js.map +1 -0
- package/dist/cli/observe.d.ts +23 -0
- package/dist/cli/observe.d.ts.map +1 -0
- package/dist/cli/observe.js +245 -0
- package/dist/cli/observe.js.map +1 -0
- package/dist/cli/rust-runtime.d.ts +10 -0
- package/dist/cli/rust-runtime.d.ts.map +1 -0
- package/dist/cli/rust-runtime.js +62 -0
- package/dist/cli/rust-runtime.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +131 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/actorHostGrpc.d.ts +50 -0
- package/dist/client/actorHostGrpc.d.ts.map +1 -0
- package/dist/client/actorHostGrpc.js +111 -0
- package/dist/client/actorHostGrpc.js.map +1 -0
- package/dist/client/client.d.ts +12 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +20 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/clientSettings.d.ts +8 -0
- package/dist/client/clientSettings.d.ts.map +1 -0
- package/dist/client/clientSettings.js +45 -0
- package/dist/client/clientSettings.js.map +1 -0
- package/dist/client/remoteClient.d.ts +49 -0
- package/dist/client/remoteClient.d.ts.map +1 -0
- package/dist/client/remoteClient.js +286 -0
- package/dist/client/remoteClient.js.map +1 -0
- package/dist/client/socketConnection.d.ts +18 -0
- package/dist/client/socketConnection.d.ts.map +1 -0
- package/dist/client/socketConnection.js +48 -0
- package/dist/client/socketConnection.js.map +1 -0
- package/dist/client/telemetry.d.ts +14 -0
- package/dist/client/telemetry.d.ts.map +1 -0
- package/dist/client/telemetry.js +23 -0
- package/dist/client/telemetry.js.map +1 -0
- package/dist/compiler/actor-build.d.ts +4 -0
- package/dist/compiler/actor-build.d.ts.map +1 -0
- package/dist/compiler/actor-build.js +36 -0
- package/dist/compiler/actor-build.js.map +1 -0
- package/dist/compiler/actor-compiler.d.ts +30 -0
- package/dist/compiler/actor-compiler.d.ts.map +1 -0
- package/dist/compiler/actor-compiler.js +300 -0
- package/dist/compiler/actor-compiler.js.map +1 -0
- package/dist/compiler/deployment-build.d.ts +2 -0
- package/dist/compiler/deployment-build.d.ts.map +1 -0
- package/dist/compiler/deployment-build.js +23 -0
- package/dist/compiler/deployment-build.js.map +1 -0
- package/dist/compiler/features/persistence.d.ts +11 -0
- package/dist/compiler/features/persistence.d.ts.map +1 -0
- package/dist/compiler/features/persistence.js +102 -0
- package/dist/compiler/features/persistence.js.map +1 -0
- package/dist/compiler/features/reentrancy.d.ts +9 -0
- package/dist/compiler/features/reentrancy.d.ts.map +1 -0
- package/dist/compiler/features/reentrancy.js +44 -0
- package/dist/compiler/features/reentrancy.js.map +1 -0
- package/dist/compiler/generators/backend-generator.d.ts +5 -0
- package/dist/compiler/generators/backend-generator.d.ts.map +1 -0
- package/dist/compiler/generators/backend-generator.js +181 -0
- package/dist/compiler/generators/backend-generator.js.map +1 -0
- package/dist/compiler/generators/client-generator.d.ts +5 -0
- package/dist/compiler/generators/client-generator.d.ts.map +1 -0
- package/dist/compiler/generators/client-generator.js +28 -0
- package/dist/compiler/generators/client-generator.js.map +1 -0
- package/dist/compiler/generators/typescript-generator.d.ts +8 -0
- package/dist/compiler/generators/typescript-generator.d.ts.map +1 -0
- package/dist/compiler/generators/typescript-generator.js +154 -0
- package/dist/compiler/generators/typescript-generator.js.map +1 -0
- package/dist/compiler/generators/usage-comment.d.ts +3 -0
- package/dist/compiler/generators/usage-comment.d.ts.map +1 -0
- package/dist/compiler/generators/usage-comment.js +6 -0
- package/dist/compiler/generators/usage-comment.js.map +1 -0
- package/dist/compiler/json-schema.d.ts +7 -0
- package/dist/compiler/json-schema.d.ts.map +1 -0
- package/dist/compiler/json-schema.js +122 -0
- package/dist/compiler/json-schema.js.map +1 -0
- package/dist/compiler/public-schema.d.ts +4 -0
- package/dist/compiler/public-schema.d.ts.map +1 -0
- package/dist/compiler/public-schema.js +46 -0
- package/dist/compiler/public-schema.js.map +1 -0
- package/dist/compiler/rpc-contract.d.ts +5 -0
- package/dist/compiler/rpc-contract.d.ts.map +1 -0
- package/dist/compiler/rpc-contract.js +95 -0
- package/dist/compiler/rpc-contract.js.map +1 -0
- package/dist/compiler/socket-contract.d.ts +6 -0
- package/dist/compiler/socket-contract.d.ts.map +1 -0
- package/dist/compiler/socket-contract.js +36 -0
- package/dist/compiler/socket-contract.js.map +1 -0
- package/dist/compiler/types.d.ts +51 -0
- package/dist/compiler/types.d.ts.map +1 -0
- package/dist/compiler/types.js +9 -0
- package/dist/compiler/types.js.map +1 -0
- package/dist/compiler/validate-public-contract.d.ts +4 -0
- package/dist/compiler/validate-public-contract.d.ts.map +1 -0
- package/dist/compiler/validate-public-contract.js +155 -0
- package/dist/compiler/validate-public-contract.js.map +1 -0
- package/dist/environment.d.ts +2 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +18 -0
- package/dist/environment.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +52 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/durable_object/v1/ActivateActorReply.d.ts +8 -0
- package/dist/generated/durable_object/v1/ActivateActorReply.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActivateActorReply.js +3 -0
- package/dist/generated/durable_object/v1/ActivateActorReply.js.map +1 -0
- package/dist/generated/durable_object/v1/ActivateActorRequest.d.ts +8 -0
- package/dist/generated/durable_object/v1/ActivateActorRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActivateActorRequest.js +3 -0
- package/dist/generated/durable_object/v1/ActivateActorRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/ActorCompleted.d.ts +9 -0
- package/dist/generated/durable_object/v1/ActorCompleted.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActorCompleted.js +3 -0
- package/dist/generated/durable_object/v1/ActorCompleted.js.map +1 -0
- package/dist/generated/durable_object/v1/ActorControlPlaneService.d.ts +21 -0
- package/dist/generated/durable_object/v1/ActorControlPlaneService.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActorControlPlaneService.js +3 -0
- package/dist/generated/durable_object/v1/ActorControlPlaneService.js.map +1 -0
- package/dist/generated/durable_object/v1/ActorFailed.d.ts +9 -0
- package/dist/generated/durable_object/v1/ActorFailed.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActorFailed.js +3 -0
- package/dist/generated/durable_object/v1/ActorFailed.js.map +1 -0
- package/dist/generated/durable_object/v1/ActorHostService.d.ts +56 -0
- package/dist/generated/durable_object/v1/ActorHostService.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActorHostService.js +3 -0
- package/dist/generated/durable_object/v1/ActorHostService.js.map +1 -0
- package/dist/generated/durable_object/v1/ActorKey.d.ts +11 -0
- package/dist/generated/durable_object/v1/ActorKey.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ActorKey.js +3 -0
- package/dist/generated/durable_object/v1/ActorKey.js.map +1 -0
- package/dist/generated/durable_object/v1/ControlPlaneReply.d.ts +7 -0
- package/dist/generated/durable_object/v1/ControlPlaneReply.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ControlPlaneReply.js +3 -0
- package/dist/generated/durable_object/v1/ControlPlaneReply.js.map +1 -0
- package/dist/generated/durable_object/v1/ControlPlaneRequest.d.ts +7 -0
- package/dist/generated/durable_object/v1/ControlPlaneRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ControlPlaneRequest.js +3 -0
- package/dist/generated/durable_object/v1/ControlPlaneRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/Empty.d.ts +5 -0
- package/dist/generated/durable_object/v1/Empty.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/Empty.js +3 -0
- package/dist/generated/durable_object/v1/Empty.js.map +1 -0
- package/dist/generated/durable_object/v1/HostInvokeActorRequest.d.ts +11 -0
- package/dist/generated/durable_object/v1/HostInvokeActorRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/HostInvokeActorRequest.js +3 -0
- package/dist/generated/durable_object/v1/HostInvokeActorRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/HostSocketEventRequest.d.ts +17 -0
- package/dist/generated/durable_object/v1/HostSocketEventRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/HostSocketEventRequest.js +3 -0
- package/dist/generated/durable_object/v1/HostSocketEventRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/InvokeActorReply.d.ts +16 -0
- package/dist/generated/durable_object/v1/InvokeActorReply.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/InvokeActorReply.js +3 -0
- package/dist/generated/durable_object/v1/InvokeActorReply.js.map +1 -0
- package/dist/generated/durable_object/v1/InvokeActorRequest.d.ts +14 -0
- package/dist/generated/durable_object/v1/InvokeActorRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/InvokeActorRequest.js +3 -0
- package/dist/generated/durable_object/v1/InvokeActorRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.d.ts +13 -0
- package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.js +3 -0
- package/dist/generated/durable_object/v1/PublishSocketEffectsRequest.js.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaService.d.ts +42 -0
- package/dist/generated/durable_object/v1/ReplicaService.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaService.js +3 -0
- package/dist/generated/durable_object/v1/ReplicaService.js.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaSessionHead.d.ts +14 -0
- package/dist/generated/durable_object/v1/ReplicaSessionHead.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaSessionHead.js +3 -0
- package/dist/generated/durable_object/v1/ReplicaSessionHead.js.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaSnapshotRef.d.ts +14 -0
- package/dist/generated/durable_object/v1/ReplicaSnapshotRef.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaSnapshotRef.js +3 -0
- package/dist/generated/durable_object/v1/ReplicaSnapshotRef.js.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaStreamHead.d.ts +11 -0
- package/dist/generated/durable_object/v1/ReplicaStreamHead.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaStreamHead.js +3 -0
- package/dist/generated/durable_object/v1/ReplicaStreamHead.js.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaStreamIdentity.d.ts +14 -0
- package/dist/generated/durable_object/v1/ReplicaStreamIdentity.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/ReplicaStreamIdentity.js +3 -0
- package/dist/generated/durable_object/v1/ReplicaStreamIdentity.js.map +1 -0
- package/dist/generated/durable_object/v1/Reroute.d.ts +5 -0
- package/dist/generated/durable_object/v1/Reroute.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/Reroute.js +3 -0
- package/dist/generated/durable_object/v1/Reroute.js.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotData.d.ts +7 -0
- package/dist/generated/durable_object/v1/SnapshotData.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotData.js +3 -0
- package/dist/generated/durable_object/v1/SnapshotData.js.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotService.d.ts +32 -0
- package/dist/generated/durable_object/v1/SnapshotService.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotService.js +3 -0
- package/dist/generated/durable_object/v1/SnapshotService.js.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotWriteReply.d.ts +7 -0
- package/dist/generated/durable_object/v1/SnapshotWriteReply.d.ts.map +1 -0
- package/dist/generated/durable_object/v1/SnapshotWriteReply.js +3 -0
- package/dist/generated/durable_object/v1/SnapshotWriteReply.js.map +1 -0
- package/dist/generated/durable_object.d.ts +69 -0
- package/dist/generated/durable_object.d.ts.map +1 -0
- package/dist/generated/durable_object.js +2 -0
- package/dist/generated/durable_object.js.map +1 -0
- package/dist/generated/durable_object.proto +117 -0
- package/dist/generated.browser.d.ts +6 -0
- package/dist/generated.browser.d.ts.map +1 -0
- package/dist/generated.browser.js +10 -0
- package/dist/generated.browser.js.map +1 -0
- package/dist/generated.d.ts +3 -0
- package/dist/generated.d.ts.map +1 -0
- package/dist/generated.js +3 -0
- package/dist/generated.js.map +1 -0
- package/dist/host/actor-host.d.ts +22 -0
- package/dist/host/actor-host.d.ts.map +1 -0
- package/dist/host/actor-host.js +392 -0
- package/dist/host/actor-host.js.map +1 -0
- package/dist/host/actor-runtime.d.ts +34 -0
- package/dist/host/actor-runtime.d.ts.map +1 -0
- package/dist/host/actor-runtime.js +279 -0
- package/dist/host/actor-runtime.js.map +1 -0
- package/dist/host/actor-worker.d.ts +2 -0
- package/dist/host/actor-worker.d.ts.map +1 -0
- package/dist/host/actor-worker.js +154 -0
- package/dist/host/actor-worker.js.map +1 -0
- package/dist/host/generic-host.d.ts +3 -0
- package/dist/host/generic-host.d.ts.map +1 -0
- package/dist/host/generic-host.js +87 -0
- package/dist/host/generic-host.js.map +1 -0
- package/dist/host/protocol.d.ts +347 -0
- package/dist/host/protocol.d.ts.map +1 -0
- package/dist/host/protocol.js +76 -0
- package/dist/host/protocol.js.map +1 -0
- package/dist/host/types.d.ts +42 -0
- package/dist/host/types.d.ts.map +1 -0
- package/dist/host/types.js +2 -0
- package/dist/host/types.js.map +1 -0
- package/dist/host/worker-supervisor.d.ts +85 -0
- package/dist/host/worker-supervisor.d.ts.map +1 -0
- package/dist/host/worker-supervisor.js +423 -0
- package/dist/host/worker-supervisor.js.map +1 -0
- package/dist/host.d.ts +3 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +3 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +13 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +34 -0
- package/dist/json.js.map +1 -0
- package/dist/localRuntime.d.ts +27 -0
- package/dist/localRuntime.d.ts.map +1 -0
- package/dist/localRuntime.js +112 -0
- package/dist/localRuntime.js.map +1 -0
- package/dist/proxy.d.ts +43 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +76 -0
- package/dist/proxy.js.map +1 -0
- package/dist/runtimeInstaller.d.ts +16 -0
- package/dist/runtimeInstaller.d.ts.map +1 -0
- package/dist/runtimeInstaller.js +95 -0
- package/dist/runtimeInstaller.js.map +1 -0
- package/dist/templates/actor/LICENSE.md +9 -0
- package/dist/templates/actor/README.md +33 -0
- package/dist/templates/actor/gitignore +7 -0
- package/dist/templates/actor/package.json +20 -0
- package/dist/templates/actor/src/durable-objects.ts +13 -0
- package/dist/templates/actor/tsconfig.json +11 -0
- package/dist/templates/ai-chat/.env.example +1 -0
- package/dist/templates/ai-chat/LICENSE.md +9 -0
- package/dist/templates/ai-chat/README.md +41 -0
- package/dist/templates/ai-chat/gitignore +8 -0
- package/dist/templates/ai-chat/index.html +12 -0
- package/dist/templates/ai-chat/package.json +30 -0
- package/dist/templates/ai-chat/src/Chat.tsx +37 -0
- package/dist/templates/ai-chat/src/backend.ts +41 -0
- package/dist/templates/ai-chat/src/durable-objects.ts +15 -0
- package/dist/templates/ai-chat/tsconfig.json +13 -0
- package/dist/templates/chat/LICENSE.md +9 -0
- package/dist/templates/chat/README.md +29 -0
- package/dist/templates/chat/gitignore +8 -0
- package/dist/templates/chat/index.html +12 -0
- package/dist/templates/chat/package.json +27 -0
- package/dist/templates/chat/src/Chat.tsx +63 -0
- package/dist/templates/chat/src/backend.ts +20 -0
- package/dist/templates/chat/src/durable-objects.ts +18 -0
- package/dist/templates/chat/tsconfig.json +13 -0
- package/dist/templates/documents/LICENSE.md +9 -0
- package/dist/templates/documents/README.md +38 -0
- package/dist/templates/documents/gitignore +8 -0
- package/dist/templates/documents/index.html +12 -0
- package/dist/templates/documents/package.json +35 -0
- package/dist/templates/documents/src/App.tsx +81 -0
- package/dist/templates/documents/src/Editor.tsx +69 -0
- package/dist/templates/documents/src/backend.ts +18 -0
- package/dist/templates/documents/src/collaboration.ts +46 -0
- package/dist/templates/documents/src/durable-objects.ts +48 -0
- package/dist/templates/documents/src/style.css +145 -0
- package/dist/templates/documents/tsconfig.json +13 -0
- package/dist/wire/contract.d.ts +9 -0
- package/dist/wire/contract.d.ts.map +1 -0
- package/dist/wire/contract.js +2 -0
- package/dist/wire/contract.js.map +1 -0
- package/dist/wire/public-contract.d.ts +36 -0
- package/dist/wire/public-contract.d.ts.map +1 -0
- package/dist/wire/public-contract.js +2 -0
- package/dist/wire/public-contract.js.map +1 -0
- package/package.json +111 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-comment.js","sourceRoot":"","sources":["../../../src/compiler/generators/usage-comment.ts"],"names":[],"mappings":"AAAA,SAAS,YAAY,CAAC,WAAmB,EAAE,OAAgB;IACvD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrF,OAAO,QAAQ,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAA;AAC7F,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { JSONSchema7 } from "json-schema";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
declare function jsonSchema(checker: ts.TypeChecker, types: Record<string, ts.Type>): JSONSchema7;
|
|
4
|
+
declare function sourceTypeName(type: ts.Type): string | undefined;
|
|
5
|
+
declare function assertJsonType(checker: ts.TypeChecker, type: ts.Type, label: string, optional?: boolean, seen?: Set<ts.Type>): void;
|
|
6
|
+
export { assertJsonType, jsonSchema, sourceTypeName };
|
|
7
|
+
//# sourceMappingURL=json-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../../src/compiler/json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,MAAM,YAAY,CAAA;AAK3B,iBAAS,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,WAAW,CAmBxF;AAiDD,iBAAS,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM,GAAG,SAAS,CAWzD;AAED,iBAAS,cAAc,CACnB,OAAO,EAAE,EAAE,CAAC,WAAW,EACvB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,UAAQ,EAChB,IAAI,eAAqB,GAC1B,IAAI,CAiDN;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { JsonSchemaGenerator, getDefaultArgs } from "typescript-json-schema";
|
|
3
|
+
import { ActorDefinitionError } from "../errors.js";
|
|
4
|
+
function jsonSchema(checker, types) {
|
|
5
|
+
const generator = new JsonSchemaGenerator([], types, {}, {}, checker, {
|
|
6
|
+
...getDefaultArgs(),
|
|
7
|
+
required: true,
|
|
8
|
+
strictNullChecks: true,
|
|
9
|
+
rejectDateType: true,
|
|
10
|
+
ref: true,
|
|
11
|
+
aliasRef: false,
|
|
12
|
+
topRef: false,
|
|
13
|
+
defaultProps: false
|
|
14
|
+
});
|
|
15
|
+
const names = Object.keys(types).filter(name => !(types[name].flags & ts.TypeFlags.Never));
|
|
16
|
+
const generated = generator.getSchemaForSymbols(names);
|
|
17
|
+
const definitions = { ...generated.definitions };
|
|
18
|
+
for (const name of Object.keys(types))
|
|
19
|
+
if (types[name].flags & ts.TypeFlags.Never)
|
|
20
|
+
definitions[name] = false;
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
for (const [name, type] of Object.entries(types))
|
|
23
|
+
preserveTypeNames(checker, type, definitions[name], definitions, seen);
|
|
24
|
+
return { $schema: "http://json-schema.org/draft-07/schema#", definitions };
|
|
25
|
+
}
|
|
26
|
+
function preserveTypeNames(checker, type, schema, definitions, seen) {
|
|
27
|
+
if (!schema || typeof schema === "boolean" || seen.has(schema))
|
|
28
|
+
return;
|
|
29
|
+
seen.add(schema);
|
|
30
|
+
if (schema.$ref) {
|
|
31
|
+
const key = decodeURIComponent(schema.$ref.slice("#/definitions/".length))
|
|
32
|
+
.replaceAll("~1", "/")
|
|
33
|
+
.replaceAll("~0", "~");
|
|
34
|
+
preserveTypeNames(checker, type, definitions[key], definitions, seen);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const name = sourceTypeName(type);
|
|
38
|
+
if (type.isUnion()) {
|
|
39
|
+
const members = type.types.filter(member => !(member.flags & ts.TypeFlags.Undefined));
|
|
40
|
+
if (members.length !== 1) {
|
|
41
|
+
if (name)
|
|
42
|
+
schema.title ??= name;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
type = members[0];
|
|
46
|
+
}
|
|
47
|
+
const title = name ?? sourceTypeName(type);
|
|
48
|
+
if (title)
|
|
49
|
+
schema.title ??= title;
|
|
50
|
+
const visit = (child, definition) => preserveTypeNames(checker, child, definition, definitions, seen);
|
|
51
|
+
if (checker.isArrayType(type) || checker.isTupleType(type) || type.getSymbol()?.name === "ReadonlyArray") {
|
|
52
|
+
const elements = checker.getTypeArguments(type);
|
|
53
|
+
if (Array.isArray(schema.items))
|
|
54
|
+
schema.items.forEach((item, index) => {
|
|
55
|
+
if (elements[index])
|
|
56
|
+
visit(elements[index], item);
|
|
57
|
+
});
|
|
58
|
+
else if (elements[0])
|
|
59
|
+
visit(elements[0], schema.items);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const property of type.getProperties()) {
|
|
63
|
+
const declaration = property.valueDeclaration ?? property.declarations?.[0];
|
|
64
|
+
if (declaration)
|
|
65
|
+
visit(checker.getTypeOfSymbolAtLocation(property, declaration), schema.properties?.[property.name]);
|
|
66
|
+
}
|
|
67
|
+
const indexType = checker.getIndexTypeOfType(type, ts.IndexKind.String);
|
|
68
|
+
if (indexType)
|
|
69
|
+
visit(indexType, schema.additionalProperties);
|
|
70
|
+
}
|
|
71
|
+
function sourceTypeName(type) {
|
|
72
|
+
const symbol = type.aliasSymbol ?? type.getSymbol();
|
|
73
|
+
if (symbol?.declarations?.some(declaration => declaration.getSourceFile().hasNoDefaultLib))
|
|
74
|
+
return undefined;
|
|
75
|
+
return symbol?.declarations?.some(declaration => ts.isInterfaceDeclaration(declaration) ||
|
|
76
|
+
ts.isTypeAliasDeclaration(declaration) ||
|
|
77
|
+
ts.isEnumDeclaration(declaration))
|
|
78
|
+
? symbol.name
|
|
79
|
+
: undefined;
|
|
80
|
+
}
|
|
81
|
+
function assertJsonType(checker, type, label, optional = false, seen = new Set()) {
|
|
82
|
+
if (type.flags & ts.TypeFlags.Undefined) {
|
|
83
|
+
if (optional)
|
|
84
|
+
return;
|
|
85
|
+
throw new ActorDefinitionError(`${label} must be JSON-compatible; undefined is only allowed for optional properties`);
|
|
86
|
+
}
|
|
87
|
+
if (type.isUnionOrIntersection()) {
|
|
88
|
+
for (const member of type.types)
|
|
89
|
+
assertJsonType(checker, member, label, optional, seen);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (seen.has(type))
|
|
93
|
+
return;
|
|
94
|
+
seen.add(type);
|
|
95
|
+
if (type.flags &
|
|
96
|
+
(ts.TypeFlags.StringLike |
|
|
97
|
+
ts.TypeFlags.NumberLike |
|
|
98
|
+
ts.TypeFlags.BooleanLike |
|
|
99
|
+
ts.TypeFlags.Null |
|
|
100
|
+
ts.TypeFlags.Never))
|
|
101
|
+
return;
|
|
102
|
+
if (checker.isArrayType(type) || checker.isTupleType(type) || type.getSymbol()?.name === "ReadonlyArray") {
|
|
103
|
+
for (const element of checker.getTypeArguments(type))
|
|
104
|
+
assertJsonType(checker, element, label, false, seen);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!(type.flags & ts.TypeFlags.Object) ||
|
|
108
|
+
type.getCallSignatures().length ||
|
|
109
|
+
type.getConstructSignatures().length ||
|
|
110
|
+
(type.getSymbol()?.flags ?? 0) & ts.SymbolFlags.Class)
|
|
111
|
+
throw new ActorDefinitionError(`${label} must be JSON-compatible; unsupported type ${checker.typeToString(type)}`);
|
|
112
|
+
for (const property of type.getProperties()) {
|
|
113
|
+
const declaration = property.valueDeclaration ?? property.declarations?.[0];
|
|
114
|
+
if (!declaration || property.name.startsWith("__@"))
|
|
115
|
+
throw new ActorDefinitionError(`${label} must be JSON-compatible; symbol properties are not supported`);
|
|
116
|
+
assertJsonType(checker, checker.getTypeOfSymbolAtLocation(property, declaration), `${label}.${property.name}`, !!(property.flags & ts.SymbolFlags.Optional), seen);
|
|
117
|
+
}
|
|
118
|
+
for (const index of checker.getIndexInfosOfType(type))
|
|
119
|
+
assertJsonType(checker, index.type, label, false, seen);
|
|
120
|
+
}
|
|
121
|
+
export { assertJsonType, jsonSchema, sourceTypeName };
|
|
122
|
+
//# sourceMappingURL=json-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/compiler/json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAEnD,SAAS,UAAU,CAAC,OAAuB,EAAE,KAA8B;IACvE,MAAM,SAAS,GAAG,IAAI,mBAAmB,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;QAClE,GAAG,cAAc,EAAE;QACnB,QAAQ,EAAE,IAAI;QACd,gBAAgB,EAAE,IAAI;QACtB,cAAc,EAAE,IAAI;QACpB,GAAG,EAAE,IAAI;QACT,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,KAAK;KACtB,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1F,MAAM,SAAS,GAAG,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAgB,CAAA;IACrE,MAAM,WAAW,GAA0C,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAA;IACvF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC5G,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAA;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5C,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;IAC1E,OAAO,EAAE,OAAO,EAAE,yCAAyC,EAAE,WAAW,EAAE,CAAA;AAC9E,CAAC;AAED,SAAS,iBAAiB,CACtB,OAAuB,EACvB,IAAa,EACb,MAAyC,EACzC,WAAkD,EAClD,IAAsB;IAEtB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAM;IACtE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAChB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;aACrE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;aACrB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC1B,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;QACrE,OAAM;IACV,CAAC;IACD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;QACrF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,IAAI;gBAAE,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;YAC/B,OAAM;QACV,CAAC;QACD,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,KAAK;QAAE,MAAM,CAAC,KAAK,KAAK,KAAK,CAAA;IACjC,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,UAA6C,EAAE,EAAE,CAC5E,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QACvG,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAA;QACnE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBACjC,IAAI,QAAQ,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAA;YACrD,CAAC,CAAC,CAAA;aACD,IAAI,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QACtD,OAAM;IACV,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3E,IAAI,WAAW;YACX,KAAK,CAAC,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3G,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACvE,IAAI,SAAS;QAAE,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAA;IACnD,IAAI,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5G,OAAO,MAAM,EAAE,YAAY,EAAE,IAAI,CAC7B,WAAW,CAAC,EAAE,CACV,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC;QACtC,EAAE,CAAC,sBAAsB,CAAC,WAAW,CAAC;QACtC,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,CACxC;QACG,CAAC,CAAC,MAAM,CAAC,IAAI;QACb,CAAC,CAAC,SAAS,CAAA;AACnB,CAAC;AAED,SAAS,cAAc,CACnB,OAAuB,EACvB,IAAa,EACb,KAAa,EACb,QAAQ,GAAG,KAAK,EAChB,OAAO,IAAI,GAAG,EAAW;IAEzB,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,QAAQ;YAAE,OAAM;QACpB,MAAM,IAAI,oBAAoB,CAC1B,GAAG,KAAK,6EAA6E,CACxF,CAAA;IACL,CAAC;IACD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK;YAAE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;QACvF,OAAM;IACV,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAM;IAC1B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACd,IACI,IAAI,CAAC,KAAK;QACV,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU;YACpB,EAAE,CAAC,SAAS,CAAC,UAAU;YACvB,EAAE,CAAC,SAAS,CAAC,WAAW;YACxB,EAAE,CAAC,SAAS,CAAC,IAAI;YACjB,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC;QAEvB,OAAM;IACV,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,KAAK,eAAe,EAAE,CAAC;QACvG,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAwB,CAAC;YACpE,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QACxD,OAAM;IACV,CAAC;IACD,IACI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;QACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC,MAAM;QAC/B,IAAI,CAAC,sBAAsB,EAAE,CAAC,MAAM;QACpC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK;QAErD,MAAM,IAAI,oBAAoB,CAC1B,GAAG,KAAK,8CAA8C,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CACrF,CAAA;IACL,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3E,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,+DAA+D,CAAC,CAAA;QAC3G,cAAc,CACV,OAAO,EACP,OAAO,CAAC,yBAAyB,CAAC,QAAQ,EAAE,WAAW,CAAC,EACxD,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAC3B,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,EAC5C,IAAI,CACP,CAAA;IACL,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;AAClH,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-schema.d.ts","sourceRoot":"","sources":["../../src/compiler/public-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAA;AAIrE,iBAAS,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CA+BvF;AAaD,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ActorDefinitionError } from "../errors.js";
|
|
2
|
+
function extractPublicSchema(schema, roots) {
|
|
3
|
+
const definitions = schema.definitions ?? {};
|
|
4
|
+
const names = new Map(roots.map(name => [name, name]));
|
|
5
|
+
const pending = [...roots];
|
|
6
|
+
let nextType = 0;
|
|
7
|
+
const rename = (reference) => {
|
|
8
|
+
if (!reference.startsWith("#/definitions/"))
|
|
9
|
+
throw new ActorDefinitionError(`public contracts require local type references: ${reference}`);
|
|
10
|
+
const original = decodeURIComponent(reference.slice("#/definitions/".length))
|
|
11
|
+
.replaceAll("~1", "/")
|
|
12
|
+
.replaceAll("~0", "~");
|
|
13
|
+
if (!Object.hasOwn(definitions, original))
|
|
14
|
+
throw new ActorDefinitionError(`public contract type reference is missing: ${reference}`);
|
|
15
|
+
if (!names.has(original)) {
|
|
16
|
+
let name;
|
|
17
|
+
do
|
|
18
|
+
name = `Type${nextType++}`;
|
|
19
|
+
while (roots.includes(name));
|
|
20
|
+
names.set(original, name);
|
|
21
|
+
pending.push(original);
|
|
22
|
+
}
|
|
23
|
+
return `#/definitions/${names.get(original)}`;
|
|
24
|
+
};
|
|
25
|
+
const publicDefinitions = [];
|
|
26
|
+
for (let index = 0; index < pending.length; index++) {
|
|
27
|
+
const original = pending[index];
|
|
28
|
+
publicDefinitions.push([
|
|
29
|
+
names.get(original),
|
|
30
|
+
rewriteReferences(definitions[original], rename)
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
return { $schema: schema.$schema, definitions: Object.fromEntries(publicDefinitions) };
|
|
34
|
+
}
|
|
35
|
+
function rewriteReferences(value, rename) {
|
|
36
|
+
if (Array.isArray(value))
|
|
37
|
+
return value.map(item => rewriteReferences(item, rename));
|
|
38
|
+
if (!value || typeof value !== "object")
|
|
39
|
+
return value;
|
|
40
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => [
|
|
41
|
+
key,
|
|
42
|
+
key === "$ref" && typeof child === "string" ? rename(child) : rewriteReferences(child, rename)
|
|
43
|
+
]));
|
|
44
|
+
}
|
|
45
|
+
export { extractPublicSchema };
|
|
46
|
+
//# sourceMappingURL=public-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-schema.js","sourceRoot":"","sources":["../../src/compiler/public-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-contract.d.ts","sourceRoot":"","sources":["../../src/compiler/rpc-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAI3B,OAAO,KAAK,EAAE,WAAW,EAA0C,MAAM,4BAA4B,CAAA;AAKrG,iBAAS,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,GAAG,WAAW,CAMrF;AAsGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { validateActorComponent } from "../actor/identity.js";
|
|
3
|
+
import { ActorDefinitionError } from "../errors.js";
|
|
4
|
+
import { assertJsonType, jsonSchema, sourceTypeName } from "./json-schema.js";
|
|
5
|
+
import { extractPublicSchema } from "./public-schema.js";
|
|
6
|
+
function rpcContract(checker, actor) {
|
|
7
|
+
const types = Object.create(null);
|
|
8
|
+
const methods = publicMethods(checker, actor).map(({ name, declaration }) => readMethod(checker, declaration, `${actor.name.text}.${name}`, name, types));
|
|
9
|
+
return { schema: rpcSchema(checker, types), methods };
|
|
10
|
+
}
|
|
11
|
+
function rpcSchema(checker, types) {
|
|
12
|
+
const schema = jsonSchema(checker, types);
|
|
13
|
+
for (const [name, definition] of Object.entries(schema.definitions ?? {})) {
|
|
14
|
+
if (typeof definition === "boolean" || definition.$ref)
|
|
15
|
+
continue;
|
|
16
|
+
const title = types[name] ? sourceTypeName(types[name]) : /^[A-Za-z_$][\w$]*$/u.test(name) ? name : undefined;
|
|
17
|
+
if (title)
|
|
18
|
+
definition.title ??= title;
|
|
19
|
+
}
|
|
20
|
+
return extractPublicSchema(schema, Object.keys(types));
|
|
21
|
+
}
|
|
22
|
+
function publicMethods(checker, actor) {
|
|
23
|
+
const methods = [];
|
|
24
|
+
for (const member of actor.members) {
|
|
25
|
+
if (!member.name || ts.isPrivateIdentifier(member.name) || !isPublicInstance(member))
|
|
26
|
+
continue;
|
|
27
|
+
const symbol = checker.getSymbolAtLocation(member.name);
|
|
28
|
+
const name = symbol?.name ?? member.name.getText();
|
|
29
|
+
const label = `${actor.name.text}.${name}`;
|
|
30
|
+
if (ts.isGetAccessorDeclaration(member) || ts.isSetAccessorDeclaration(member))
|
|
31
|
+
throw new ActorDefinitionError(`${label}: accessors are not supported`);
|
|
32
|
+
if (!ts.isMethodDeclaration(member)) {
|
|
33
|
+
if (checker.getTypeAtLocation(member).getCallSignatures().length)
|
|
34
|
+
throw new ActorDefinitionError(`${label}: callable fields must be declared as async methods`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (["onConnect", "onMessage", "onDisconnect"].includes(name))
|
|
38
|
+
continue;
|
|
39
|
+
if (["then", "connect", "broadcast"].includes(name))
|
|
40
|
+
throw new ActorDefinitionError(`${label}: reserved RPC method name`);
|
|
41
|
+
validateActorComponent("actor method", name);
|
|
42
|
+
if (symbol?.declarations?.filter(ts.isMethodDeclaration).length !== 1)
|
|
43
|
+
throw new ActorDefinitionError(`${label}: overloaded RPC methods are not supported`);
|
|
44
|
+
if (!member.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.AsyncKeyword) || member.asteriskToken)
|
|
45
|
+
throw new ActorDefinitionError(`${label}: RPC methods must be async functions`);
|
|
46
|
+
if (member.typeParameters?.length)
|
|
47
|
+
throw new ActorDefinitionError(`${label}: generic RPC methods are not supported`);
|
|
48
|
+
if (member.questionToken)
|
|
49
|
+
throw new ActorDefinitionError(`${label}: optional RPC methods are not supported`);
|
|
50
|
+
methods.push({ name, declaration: member });
|
|
51
|
+
}
|
|
52
|
+
return methods.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
53
|
+
}
|
|
54
|
+
function isPublicInstance(member) {
|
|
55
|
+
const excluded = [ts.SyntaxKind.PrivateKeyword, ts.SyntaxKind.ProtectedKeyword, ts.SyntaxKind.StaticKeyword];
|
|
56
|
+
return !ts.canHaveModifiers(member) || !ts.getModifiers(member)?.some(modifier => excluded.includes(modifier.kind));
|
|
57
|
+
}
|
|
58
|
+
function readMethod(checker, method, label, name, types) {
|
|
59
|
+
const signature = checker.getSignatureFromDeclaration(method);
|
|
60
|
+
const parameters = method.parameters.map((parameter, index) => readParameter(checker, parameter, index, method, label, name, types));
|
|
61
|
+
const result = checker.getAwaitedType(signature.getReturnType());
|
|
62
|
+
if (result.flags & ts.TypeFlags.Void)
|
|
63
|
+
return { name, parameters, result: { kind: "void" } };
|
|
64
|
+
assertJsonType(checker, result, `${label} result`);
|
|
65
|
+
return {
|
|
66
|
+
name,
|
|
67
|
+
parameters,
|
|
68
|
+
result: { kind: "value", type: registerType(types, `Method_${name}_Result`, result) }
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function readParameter(checker, parameter, index, method, label, methodName, types) {
|
|
72
|
+
const name = ts.isIdentifier(parameter.name) ? parameter.name.text : `arg${index}`;
|
|
73
|
+
if (name === "this")
|
|
74
|
+
throw new ActorDefinitionError(`${label}: explicit this parameters are not supported`);
|
|
75
|
+
const optional = !!(parameter.questionToken || parameter.initializer);
|
|
76
|
+
const rest = !!parameter.dotDotDotToken;
|
|
77
|
+
const type = checker.getTypeAtLocation(parameter);
|
|
78
|
+
if (rest && !checker.isArrayType(type))
|
|
79
|
+
throw new ActorDefinitionError(`${label}: rest parameters must use an array type`);
|
|
80
|
+
if (parameter.initializer &&
|
|
81
|
+
method.parameters
|
|
82
|
+
.slice(index + 1)
|
|
83
|
+
.some(next => !next.questionToken && !next.initializer && !next.dotDotDotToken))
|
|
84
|
+
throw new ActorDefinitionError(`${label}: default parameters before required parameters are not supported`);
|
|
85
|
+
assertJsonType(checker, type, `${label} parameter ${name}`, optional);
|
|
86
|
+
return { name, optional, rest, type: registerType(types, `Method_${methodName}_Parameter_${index}`, type) };
|
|
87
|
+
}
|
|
88
|
+
function registerType(types, name, type) {
|
|
89
|
+
const existing = sourceTypeName(type) ? Object.keys(types).find(key => types[key] === type) : undefined;
|
|
90
|
+
const key = existing ?? name;
|
|
91
|
+
types[key] = type;
|
|
92
|
+
return { $ref: `#/definitions/${key}` };
|
|
93
|
+
}
|
|
94
|
+
export { rpcContract };
|
|
95
|
+
//# sourceMappingURL=rpc-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-contract.js","sourceRoot":"","sources":["../../src/compiler/rpc-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAGnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAExD,SAAS,WAAW,CAAC,OAAuB,EAAE,KAA0B;IACpE,MAAM,KAAK,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CACxE,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,IAAK,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAC/E,CAAA;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,OAAuB,EAAE,KAA8B;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,IAAI;YAAE,SAAQ;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7G,IAAI,KAAK;YAAE,UAAU,CAAC,KAAK,KAAK,KAAK,CAAA;IACzC,CAAC;IACD,OAAO,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,aAAa,CAAC,OAAuB,EAAE,KAA0B;IACtE,MAAM,OAAO,GAA0D,EAAE,CAAA;IACzE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAAE,SAAQ;QAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;QAClD,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,IAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAA;QAC3C,IAAI,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC;YAC1E,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAA;QAC3E,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC,MAAM;gBAC5D,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,qDAAqD,CAAC,CAAA;YACjG,SAAQ;QACZ,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAQ;QACvE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAA;QACxE,sBAAsB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;QAC5C,IAAI,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,KAAK,CAAC;YACjE,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAA;QACxF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,aAAa;YACzG,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,uCAAuC,CAAC,CAAA;QACnF,IAAI,MAAM,CAAC,cAAc,EAAE,MAAM;YAC7B,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAA;QACrF,IAAI,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAA;QAC5G,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACxG,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB;IAC7C,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;IAC5G,OAAO,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;AACvH,CAAC;AAED,SAAS,UAAU,CACf,OAAuB,EACvB,MAA4B,EAC5B,KAAa,EACb,IAAY,EACZ,KAA8B;IAE9B,MAAM,SAAS,GAAG,OAAO,CAAC,2BAA2B,CAAC,MAAM,CAAE,CAAA;IAC9D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAC1D,aAAa,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CACvE,CAAA;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,aAAa,EAAE,CAAE,CAAA;IACjE,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAA;IAC3F,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAA;IAClD,OAAO;QACH,IAAI;QACJ,UAAU;QACV,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,IAAI,SAAS,EAAE,MAAM,CAAC,EAAE;KACxF,CAAA;AACL,CAAC;AAED,SAAS,aAAa,CAClB,OAAuB,EACvB,SAAkC,EAClC,KAAa,EACb,MAA4B,EAC5B,KAAa,EACb,UAAkB,EAClB,KAA8B;IAE9B,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAA;IAClF,IAAI,IAAI,KAAK,MAAM;QAAE,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,8CAA8C,CAAC,CAAA;IAC3G,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;IACrE,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,CAAA;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;IACjD,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAA;IACtF,IACI,SAAS,CAAC,WAAW;QACrB,MAAM,CAAC,UAAU;aACZ,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;aAChB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;QAEnF,MAAM,IAAI,oBAAoB,CAAC,GAAG,KAAK,mEAAmE,CAAC,CAAA;IAC/G,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,cAAc,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAA;IACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,UAAU,UAAU,cAAc,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,CAAA;AAC/G,CAAC;AAED,SAAS,YAAY,CAAC,KAA8B,EAAE,IAAY,EAAE,IAAa;IAC7E,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvG,MAAM,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAA;IAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACjB,OAAO,EAAE,IAAI,EAAE,iBAAiB,GAAG,EAAE,EAAE,CAAA;AAC3C,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { ActorSchema } from "../actor/schema.js";
|
|
3
|
+
import type { SocketContract } from "../wire/contract.js";
|
|
4
|
+
declare function socketContract(checker: ts.TypeChecker, actor: ts.ClassDeclaration, schema: ActorSchema): SocketContract;
|
|
5
|
+
export { socketContract };
|
|
6
|
+
//# sourceMappingURL=socket-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-contract.d.ts","sourceRoot":"","sources":["../../src/compiler/socket-contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAA;AAG3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAIzD,iBAAS,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,GAAG,cAAc,CA2BhH;AAMD,OAAO,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { Persistence } from "../actor/schema.js";
|
|
3
|
+
import { assertJsonType, jsonSchema } from "./json-schema.js";
|
|
4
|
+
function socketContract(checker, actor, schema) {
|
|
5
|
+
const instance = checker.getTypeAtLocation(actor);
|
|
6
|
+
const base = instance.getBaseTypes()[0];
|
|
7
|
+
const [metadata, incoming, outgoing] = checker.getTypeArguments(base);
|
|
8
|
+
const types = { Metadata: metadata, Incoming: incoming, Outgoing: outgoing };
|
|
9
|
+
const optional = new Set();
|
|
10
|
+
const state = { type: "object", properties: Object.create(null), required: [] };
|
|
11
|
+
for (const field of schema.fields.filter(field => field.persistence === Persistence.Persisted && !field.private && !field.visibility)) {
|
|
12
|
+
const property = instance.getProperty(field.name);
|
|
13
|
+
const name = `Field_${field.name}`;
|
|
14
|
+
types[name] = checker.getTypeOfSymbolAtLocation(property, actor);
|
|
15
|
+
state.properties[field.name] = { $ref: `#/definitions/${pointer(name)}` };
|
|
16
|
+
if (property.flags & ts.SymbolFlags.Optional)
|
|
17
|
+
optional.add(name);
|
|
18
|
+
else
|
|
19
|
+
state.required.push(field.name);
|
|
20
|
+
}
|
|
21
|
+
for (const [name, type] of Object.entries(types))
|
|
22
|
+
assertJsonType(checker, type, `${schema.actorName}.${name}`, optional.has(name));
|
|
23
|
+
const generated = jsonSchema(checker, types);
|
|
24
|
+
const definitions = { ...generated.definitions, State: state };
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
actorName: schema.actorName,
|
|
28
|
+
schema: { $schema: "http://json-schema.org/draft-07/schema#", definitions },
|
|
29
|
+
emittable: schema.fields.filter(field => field.emittable).map(field => field.name)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function pointer(value) {
|
|
33
|
+
return value.replaceAll("~", "~0").replaceAll("/", "~1");
|
|
34
|
+
}
|
|
35
|
+
export { socketContract };
|
|
36
|
+
//# sourceMappingURL=socket-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket-contract.js","sourceRoot":"","sources":["../../src/compiler/socket-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type ts from "typescript";
|
|
2
|
+
import { Persistence } from "../actor/schema.js";
|
|
3
|
+
import type { ActorSchema } from "../actor/schema.js";
|
|
4
|
+
interface CompilerOptions {
|
|
5
|
+
readonly configFile?: string;
|
|
6
|
+
}
|
|
7
|
+
interface SdkSymbols {
|
|
8
|
+
readonly Actor: ts.Symbol;
|
|
9
|
+
readonly Persisted: ts.Symbol;
|
|
10
|
+
readonly Ephemeral: ts.Symbol;
|
|
11
|
+
readonly Emittable: ts.Symbol;
|
|
12
|
+
readonly Reentrant?: ts.Symbol;
|
|
13
|
+
}
|
|
14
|
+
declare enum AnnotationKind {
|
|
15
|
+
Persistence = "persistence",
|
|
16
|
+
Emission = "emission",
|
|
17
|
+
Reentrancy = "reentrancy"
|
|
18
|
+
}
|
|
19
|
+
interface PersistenceAnnotation {
|
|
20
|
+
readonly kind: AnnotationKind.Persistence;
|
|
21
|
+
readonly mode: Persistence;
|
|
22
|
+
readonly node: ts.Decorator;
|
|
23
|
+
}
|
|
24
|
+
type Annotation = PersistenceAnnotation | {
|
|
25
|
+
readonly kind: AnnotationKind.Emission | AnnotationKind.Reentrancy;
|
|
26
|
+
readonly node: ts.Decorator;
|
|
27
|
+
};
|
|
28
|
+
interface DecoratorUse {
|
|
29
|
+
readonly node: ts.Decorator;
|
|
30
|
+
readonly target: ts.Node;
|
|
31
|
+
readonly called: boolean;
|
|
32
|
+
}
|
|
33
|
+
interface DecoratorResult {
|
|
34
|
+
readonly annotations: readonly Annotation[];
|
|
35
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
36
|
+
}
|
|
37
|
+
interface ParsedMember extends DecoratorResult {
|
|
38
|
+
readonly node: ts.ClassElement;
|
|
39
|
+
}
|
|
40
|
+
interface ParsedActor extends DecoratorResult {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly members: readonly ParsedMember[];
|
|
43
|
+
}
|
|
44
|
+
interface ActorAnalysis {
|
|
45
|
+
readonly schemas: readonly ActorSchema[];
|
|
46
|
+
readonly diagnostics: readonly ts.Diagnostic[];
|
|
47
|
+
}
|
|
48
|
+
export { AnnotationKind, Persistence };
|
|
49
|
+
export type { ActorAnalysis, ActorSchema, Annotation, CompilerOptions, DecoratorResult, DecoratorUse, ParsedActor, ParsedMember, SdkSymbols };
|
|
50
|
+
export type { ActorFieldSchema } from "../actor/schema.js";
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compiler/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAA;AAEhC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,UAAU,eAAe;IACrB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,UAAU,UAAU;IAChB,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAA;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,CAAA;CACjC;AAED,aAAK,cAAc;IACf,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,UAAU,eAAe;CAC5B;AAED,UAAU,qBAAqB;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAA;IACzC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAA;CAC9B;AAED,KAAK,UAAU,GACT,qBAAqB,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAA;CAAE,CAAA;AAEzG,UAAU,YAAY;IAClB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAC3B;AAED,UAAU,eAAe;IACrB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAA;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,CAAA;CACjD;AAED,UAAU,YAAa,SAAQ,eAAe;IAC1C,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAA;CACjC;AAED,UAAU,WAAY,SAAQ,eAAe;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;CAC5C;AAED,UAAU,aAAa;IACnB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,CAAA;CACjD;AAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA;AACtC,YAAY,EACR,aAAa,EACb,WAAW,EACX,UAAU,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACb,CAAA;AACD,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Persistence } from "../actor/schema.js";
|
|
2
|
+
var AnnotationKind;
|
|
3
|
+
(function (AnnotationKind) {
|
|
4
|
+
AnnotationKind["Persistence"] = "persistence";
|
|
5
|
+
AnnotationKind["Emission"] = "emission";
|
|
6
|
+
AnnotationKind["Reentrancy"] = "reentrancy";
|
|
7
|
+
})(AnnotationKind || (AnnotationKind = {}));
|
|
8
|
+
export { AnnotationKind, Persistence };
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/compiler/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAehD,IAAK,cAIJ;AAJD,WAAK,cAAc;IACf,6CAA2B,CAAA;IAC3B,uCAAqB,CAAA;IACrB,2CAAyB,CAAA;AAC7B,CAAC,EAJI,cAAc,KAAd,cAAc,QAIlB;AAqCD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-public-contract.d.ts","sourceRoot":"","sources":["../../src/compiler/validate-public-contract.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAY,mBAAmB,EAAe,MAAM,4BAA4B,CAAA;AAE5F,iBAAS,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,CAQhE;AAuJD,OAAO,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Ajv } from "ajv";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
function parsePublicContract(input) {
|
|
5
|
+
const document = documentSchema.parse(input);
|
|
6
|
+
const names = new Set();
|
|
7
|
+
for (const actor of document.actors) {
|
|
8
|
+
unique(names, actor.actorName, "actor");
|
|
9
|
+
validateActor(actor);
|
|
10
|
+
}
|
|
11
|
+
return document;
|
|
12
|
+
}
|
|
13
|
+
function validateActor(actor) {
|
|
14
|
+
const scanner = ts.createScanner(ts.ScriptTarget.Latest, false, ts.LanguageVariant.Standard, actor.actorName);
|
|
15
|
+
if (scanner.scan() !== ts.SyntaxKind.Identifier || scanner.scan() !== ts.SyntaxKind.EndOfFileToken)
|
|
16
|
+
throw new Error(`actor name ${actor.actorName} cannot be emitted as a TypeScript identifier`);
|
|
17
|
+
if (actor.actorName !== actor.socket.actorName)
|
|
18
|
+
throw new Error("actor and socket contract names must match");
|
|
19
|
+
validateSocket(actor.socket);
|
|
20
|
+
validateRpc(actor.rpc);
|
|
21
|
+
}
|
|
22
|
+
function validateSocket(socket) {
|
|
23
|
+
for (const kind of ["Metadata", "Incoming", "Outgoing", "State"])
|
|
24
|
+
reference(socket.schema, `#/definitions/${kind}`);
|
|
25
|
+
const fields = new Set();
|
|
26
|
+
const state = socket.schema.definitions.State;
|
|
27
|
+
for (const field of socket.emittable) {
|
|
28
|
+
unique(fields, field, "emittable field");
|
|
29
|
+
if (typeof state !== "object" || !Object.hasOwn(state.properties ?? {}, field))
|
|
30
|
+
throw new Error(`emittable field ${field} is not public state`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function validateRpc(rpc) {
|
|
34
|
+
const methods = new Set();
|
|
35
|
+
for (const method of rpc.methods) {
|
|
36
|
+
unique(methods, method.name, "RPC method");
|
|
37
|
+
if (["constructor", "then", "connect", "broadcast", "onConnect", "onMessage", "onDisconnect"].includes(method.name))
|
|
38
|
+
throw new Error(`reserved RPC method ${method.name}`);
|
|
39
|
+
let optionalSeen = false;
|
|
40
|
+
method.parameters.forEach((parameter, index) => {
|
|
41
|
+
const type = reference(rpc.schema, parameter.type.$ref);
|
|
42
|
+
if (parameter.rest &&
|
|
43
|
+
(parameter.optional ||
|
|
44
|
+
index !== method.parameters.length - 1 ||
|
|
45
|
+
typeof type !== "object" ||
|
|
46
|
+
type.type !== "array" ||
|
|
47
|
+
Array.isArray(type.items)))
|
|
48
|
+
throw new Error("rest parameter must be a final, required array parameter");
|
|
49
|
+
if (optionalSeen && !parameter.optional && !parameter.rest)
|
|
50
|
+
throw new Error("required parameter follows optional parameter");
|
|
51
|
+
optionalSeen ||= parameter.optional;
|
|
52
|
+
});
|
|
53
|
+
if (method.result.kind === "value")
|
|
54
|
+
reference(rpc.schema, method.result.type.$ref);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function unique(seen, value, kind) {
|
|
58
|
+
if (seen.has(value))
|
|
59
|
+
throw new Error(`duplicate ${kind} ${value}`);
|
|
60
|
+
seen.add(value);
|
|
61
|
+
}
|
|
62
|
+
function parseSchema(input, context) {
|
|
63
|
+
if (!ajv.validate("http://json-schema.org/draft-07/schema#", input)) {
|
|
64
|
+
context.addIssue({ code: "custom", message: `invalid contract schema: ${ajv.errorsText()}` });
|
|
65
|
+
return z.NEVER;
|
|
66
|
+
}
|
|
67
|
+
visit(input, input);
|
|
68
|
+
return input;
|
|
69
|
+
}
|
|
70
|
+
function visit(node, root) {
|
|
71
|
+
if (typeof node === "boolean")
|
|
72
|
+
return;
|
|
73
|
+
if (["$id", "id", "tsType"].some(key => Object.hasOwn(node, key)))
|
|
74
|
+
throw new Error("contract schemas cannot override type resolution");
|
|
75
|
+
if (node.$ref)
|
|
76
|
+
reference(root, node.$ref);
|
|
77
|
+
for (const children of [node.definitions, node.properties, node.patternProperties])
|
|
78
|
+
for (const child of Object.values(children ?? {}))
|
|
79
|
+
visit(child, root);
|
|
80
|
+
for (const child of [
|
|
81
|
+
node.items,
|
|
82
|
+
node.additionalItems,
|
|
83
|
+
node.additionalProperties,
|
|
84
|
+
node.contains,
|
|
85
|
+
node.propertyNames,
|
|
86
|
+
node.not,
|
|
87
|
+
node.if,
|
|
88
|
+
node.then,
|
|
89
|
+
node.else,
|
|
90
|
+
node.allOf,
|
|
91
|
+
node.anyOf,
|
|
92
|
+
node.oneOf
|
|
93
|
+
]) {
|
|
94
|
+
if (Array.isArray(child))
|
|
95
|
+
child.forEach(item => visit(item, root));
|
|
96
|
+
else if (child !== undefined)
|
|
97
|
+
visit(child, root);
|
|
98
|
+
}
|
|
99
|
+
for (const child of Object.values(node.dependencies ?? {}))
|
|
100
|
+
if (!Array.isArray(child))
|
|
101
|
+
visit(child, root);
|
|
102
|
+
}
|
|
103
|
+
function reference(schema, ref) {
|
|
104
|
+
if (!ref.startsWith("#/definitions/"))
|
|
105
|
+
throw new Error("contract type references must be local definitions");
|
|
106
|
+
let target = schema;
|
|
107
|
+
for (const part of ref.slice(2).split("/")) {
|
|
108
|
+
const key = part.replaceAll("~1", "/").replaceAll("~0", "~");
|
|
109
|
+
target =
|
|
110
|
+
target && typeof target === "object" && Object.hasOwn(target, key)
|
|
111
|
+
? target[key]
|
|
112
|
+
: undefined;
|
|
113
|
+
}
|
|
114
|
+
if (typeof target !== "boolean" && (!target || typeof target !== "object" || Array.isArray(target)))
|
|
115
|
+
throw new Error(`contract type reference is missing: ${ref}`);
|
|
116
|
+
return target;
|
|
117
|
+
}
|
|
118
|
+
const ajv = new Ajv({ strict: false, validateFormats: false });
|
|
119
|
+
const schema = z.looseObject({ definitions: z.record(z.string(), z.unknown()) }).transform(parseSchema);
|
|
120
|
+
const typeReference = z.strictObject({ $ref: z.string() });
|
|
121
|
+
const component = z
|
|
122
|
+
.string()
|
|
123
|
+
.min(1)
|
|
124
|
+
.max(255)
|
|
125
|
+
.regex(/^[A-Za-z0-9._-]+$/u);
|
|
126
|
+
const documentSchema = z.strictObject({
|
|
127
|
+
version: z.literal(1),
|
|
128
|
+
actors: z.array(z.strictObject({
|
|
129
|
+
actorName: component,
|
|
130
|
+
socket: z.strictObject({
|
|
131
|
+
version: z.literal(1),
|
|
132
|
+
actorName: component,
|
|
133
|
+
schema,
|
|
134
|
+
emittable: z.array(z.string())
|
|
135
|
+
}),
|
|
136
|
+
rpc: z.strictObject({
|
|
137
|
+
schema,
|
|
138
|
+
methods: z.array(z.strictObject({
|
|
139
|
+
name: component,
|
|
140
|
+
parameters: z.array(z.strictObject({
|
|
141
|
+
name: z.string().min(1),
|
|
142
|
+
optional: z.boolean(),
|
|
143
|
+
rest: z.boolean(),
|
|
144
|
+
type: typeReference
|
|
145
|
+
})),
|
|
146
|
+
result: z.discriminatedUnion("kind", [
|
|
147
|
+
z.strictObject({ kind: z.literal("void") }),
|
|
148
|
+
z.strictObject({ kind: z.literal("value"), type: typeReference })
|
|
149
|
+
])
|
|
150
|
+
}))
|
|
151
|
+
})
|
|
152
|
+
}))
|
|
153
|
+
});
|
|
154
|
+
export { parsePublicContract };
|
|
155
|
+
//# sourceMappingURL=validate-public-contract.js.map
|