@aws-blocks/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +174 -0
- package/dist/api.d.ts +147 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +10 -0
- package/dist/api.test.d.ts +2 -0
- package/dist/api.test.d.ts.map +1 -0
- package/dist/api.test.js +19 -0
- package/dist/bb-utils.d.ts +11 -0
- package/dist/bb-utils.d.ts.map +1 -0
- package/dist/bb-utils.js +12 -0
- package/dist/builtin-routes.d.ts +6 -0
- package/dist/builtin-routes.d.ts.map +1 -0
- package/dist/builtin-routes.js +57 -0
- package/dist/cdk/__fixtures__/factory-backend.d.ts +3 -0
- package/dist/cdk/__fixtures__/factory-backend.d.ts.map +1 -0
- package/dist/cdk/__fixtures__/factory-backend.js +6 -0
- package/dist/cdk/__fixtures__/fullid-construct-backend.d.ts +2 -0
- package/dist/cdk/__fixtures__/fullid-construct-backend.d.ts.map +1 -0
- package/dist/cdk/__fixtures__/fullid-construct-backend.js +37 -0
- package/dist/cdk/__fixtures__/handler.d.ts +5 -0
- package/dist/cdk/__fixtures__/handler.d.ts.map +1 -0
- package/dist/cdk/__fixtures__/handler.js +3 -0
- package/dist/cdk/__fixtures__/side-effect-backend.d.ts +2 -0
- package/dist/cdk/__fixtures__/side-effect-backend.d.ts.map +1 -0
- package/dist/cdk/__fixtures__/side-effect-backend.js +5 -0
- package/dist/cdk/blocks-backend.d.ts +68 -0
- package/dist/cdk/blocks-backend.d.ts.map +1 -0
- package/dist/cdk/blocks-backend.js +214 -0
- package/dist/cdk/blocks-backend.test.d.ts +2 -0
- package/dist/cdk/blocks-backend.test.d.ts.map +1 -0
- package/dist/cdk/blocks-backend.test.js +151 -0
- package/dist/cdk/blocks-stack.test.d.ts +2 -0
- package/dist/cdk/blocks-stack.test.d.ts.map +1 -0
- package/dist/cdk/blocks-stack.test.js +78 -0
- package/dist/cdk/config-registry.d.ts +26 -0
- package/dist/cdk/config-registry.d.ts.map +1 -0
- package/dist/cdk/config-registry.js +80 -0
- package/dist/cdk/index.d.ts +35 -0
- package/dist/cdk/index.d.ts.map +1 -0
- package/dist/cdk/index.js +90 -0
- package/dist/cdk/mixins.d.ts +28 -0
- package/dist/cdk/mixins.d.ts.map +1 -0
- package/dist/cdk/mixins.js +37 -0
- package/dist/cdk/mixins.test.d.ts +2 -0
- package/dist/cdk/mixins.test.d.ts.map +1 -0
- package/dist/cdk/mixins.test.js +108 -0
- package/dist/cdk/node-version.d.ts +14 -0
- package/dist/cdk/node-version.d.ts.map +1 -0
- package/dist/cdk/node-version.js +15 -0
- package/dist/cdk/stack-metadata.d.ts +12 -0
- package/dist/cdk/stack-metadata.d.ts.map +1 -0
- package/dist/cdk/stack-metadata.js +22 -0
- package/dist/cdk/stack-metadata.test.d.ts +2 -0
- package/dist/cdk/stack-metadata.test.d.ts.map +1 -0
- package/dist/cdk/stack-metadata.test.js +56 -0
- package/dist/cdk/synth-guard.d.ts +14 -0
- package/dist/cdk/synth-guard.d.ts.map +1 -0
- package/dist/cdk/synth-guard.js +20 -0
- package/dist/cdk/synth-guard.test.d.ts +2 -0
- package/dist/cdk/synth-guard.test.d.ts.map +1 -0
- package/dist/cdk/synth-guard.test.js +15 -0
- package/dist/client/index.d.ts +97 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +238 -0
- package/dist/client/index.test.d.ts +2 -0
- package/dist/client/index.test.d.ts.map +1 -0
- package/dist/client/index.test.js +113 -0
- package/dist/common/config.d.ts +45 -0
- package/dist/common/config.d.ts.map +1 -0
- package/dist/common/config.js +154 -0
- package/dist/common/config.test.d.ts +2 -0
- package/dist/common/config.test.d.ts.map +1 -0
- package/dist/common/config.test.js +173 -0
- package/dist/common/constants.d.ts +11 -0
- package/dist/common/constants.d.ts.map +1 -0
- package/dist/common/constants.js +12 -0
- package/dist/common/crypto.d.ts +6 -0
- package/dist/common/crypto.d.ts.map +1 -0
- package/dist/common/crypto.js +14 -0
- package/dist/common/index.d.ts +220 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +180 -0
- package/dist/common/index.test.d.ts +2 -0
- package/dist/common/index.test.d.ts.map +1 -0
- package/dist/common/index.test.js +195 -0
- package/dist/common/mock-data.d.ts +40 -0
- package/dist/common/mock-data.d.ts.map +1 -0
- package/dist/common/mock-data.js +39 -0
- package/dist/common/official-bb-names.generated.d.ts +7 -0
- package/dist/common/official-bb-names.generated.d.ts.map +1 -0
- package/dist/common/official-bb-names.generated.js +28 -0
- package/dist/common/sdk-registry.d.ts +136 -0
- package/dist/common/sdk-registry.d.ts.map +1 -0
- package/dist/common/sdk-registry.js +125 -0
- package/dist/constants.d.ts +27 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +28 -0
- package/dist/cors.d.ts +39 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +85 -0
- package/dist/cors.test.d.ts +2 -0
- package/dist/cors.test.d.ts.map +1 -0
- package/dist/cors.test.js +241 -0
- package/dist/db-naming.d.ts +21 -0
- package/dist/db-naming.d.ts.map +1 -0
- package/dist/db-naming.js +38 -0
- package/dist/db-naming.test.d.ts +2 -0
- package/dist/db-naming.test.d.ts.map +1 -0
- package/dist/db-naming.test.js +29 -0
- package/dist/errors.d.ts +67 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/hosting.d.ts +258 -0
- package/dist/hosting.d.ts.map +1 -0
- package/dist/hosting.js +340 -0
- package/dist/hosting.test.d.ts +2 -0
- package/dist/hosting.test.d.ts.map +1 -0
- package/dist/hosting.test.js +1077 -0
- package/dist/index.cdk.d.ts +13 -0
- package/dist/index.cdk.d.ts.map +1 -0
- package/dist/index.cdk.js +13 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/lambda-handler.d.ts +131 -0
- package/dist/lambda-handler.d.ts.map +1 -0
- package/dist/lambda-handler.js +610 -0
- package/dist/lambda-handler.test.d.ts +2 -0
- package/dist/lambda-handler.test.d.ts.map +1 -0
- package/dist/lambda-handler.test.js +835 -0
- package/dist/pipeline/index.d.ts +4 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +3 -0
- package/dist/pipeline/pipeline-construct.d.ts +130 -0
- package/dist/pipeline/pipeline-construct.d.ts.map +1 -0
- package/dist/pipeline/pipeline-construct.js +484 -0
- package/dist/pipeline/pipeline.test.d.ts +2 -0
- package/dist/pipeline/pipeline.test.d.ts.map +1 -0
- package/dist/pipeline/pipeline.test.js +1231 -0
- package/dist/pipeline/types.d.ts +351 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +3 -0
- package/dist/raw-route.cdk.d.ts +47 -0
- package/dist/raw-route.cdk.d.ts.map +1 -0
- package/dist/raw-route.cdk.js +51 -0
- package/dist/raw-route.d.ts +119 -0
- package/dist/raw-route.d.ts.map +1 -0
- package/dist/raw-route.js +239 -0
- package/dist/raw-route.mock.d.ts +47 -0
- package/dist/raw-route.mock.d.ts.map +1 -0
- package/dist/raw-route.mock.js +51 -0
- package/dist/raw-route.test.d.ts +2 -0
- package/dist/raw-route.test.d.ts.map +1 -0
- package/dist/raw-route.test.js +597 -0
- package/dist/redact.d.ts +51 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +134 -0
- package/dist/redact.test.d.ts +2 -0
- package/dist/redact.test.d.ts.map +1 -0
- package/dist/redact.test.js +199 -0
- package/dist/rpc.d.ts +54 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +127 -0
- package/dist/rpc.test.d.ts +2 -0
- package/dist/rpc.test.d.ts.map +1 -0
- package/dist/rpc.test.js +60 -0
- package/dist/scripts/cdk-telemetry-env.d.ts +13 -0
- package/dist/scripts/cdk-telemetry-env.d.ts.map +1 -0
- package/dist/scripts/cdk-telemetry-env.js +21 -0
- package/dist/scripts/cdk-telemetry-env.test.d.ts +2 -0
- package/dist/scripts/cdk-telemetry-env.test.d.ts.map +1 -0
- package/dist/scripts/cdk-telemetry-env.test.js +56 -0
- package/dist/scripts/cleanup.d.ts +3 -0
- package/dist/scripts/cleanup.d.ts.map +1 -0
- package/dist/scripts/cleanup.js +35 -0
- package/dist/scripts/console.d.ts +6 -0
- package/dist/scripts/console.d.ts.map +1 -0
- package/dist/scripts/console.js +25 -0
- package/dist/scripts/deploy.d.ts +6 -0
- package/dist/scripts/deploy.d.ts.map +1 -0
- package/dist/scripts/deploy.js +82 -0
- package/dist/scripts/destroy.d.ts +6 -0
- package/dist/scripts/destroy.d.ts.map +1 -0
- package/dist/scripts/destroy.js +30 -0
- package/dist/scripts/dev-server-cors.test.d.ts +2 -0
- package/dist/scripts/dev-server-cors.test.d.ts.map +1 -0
- package/dist/scripts/dev-server-cors.test.js +23 -0
- package/dist/scripts/dev-server-telemetry.test.d.ts +2 -0
- package/dist/scripts/dev-server-telemetry.test.d.ts.map +1 -0
- package/dist/scripts/dev-server-telemetry.test.js +113 -0
- package/dist/scripts/dev-server.d.ts +21 -0
- package/dist/scripts/dev-server.d.ts.map +1 -0
- package/dist/scripts/dev-server.js +456 -0
- package/dist/scripts/ensure-secrets.d.ts +31 -0
- package/dist/scripts/ensure-secrets.d.ts.map +1 -0
- package/dist/scripts/ensure-secrets.js +100 -0
- package/dist/scripts/ensure-secrets.test.d.ts +2 -0
- package/dist/scripts/ensure-secrets.test.d.ts.map +1 -0
- package/dist/scripts/ensure-secrets.test.js +44 -0
- package/dist/scripts/external-migrations-step.d.ts +62 -0
- package/dist/scripts/external-migrations-step.d.ts.map +1 -0
- package/dist/scripts/external-migrations-step.js +243 -0
- package/dist/scripts/external-migrations-step.test.d.ts +2 -0
- package/dist/scripts/external-migrations-step.test.d.ts.map +1 -0
- package/dist/scripts/external-migrations-step.test.js +47 -0
- package/dist/scripts/extract-ts-types.d.ts +65 -0
- package/dist/scripts/extract-ts-types.d.ts.map +1 -0
- package/dist/scripts/extract-ts-types.js +664 -0
- package/dist/scripts/extract-ts-types.test.d.ts +2 -0
- package/dist/scripts/extract-ts-types.test.d.ts.map +1 -0
- package/dist/scripts/extract-ts-types.test.js +497 -0
- package/dist/scripts/generate-client-worker.d.ts +2 -0
- package/dist/scripts/generate-client-worker.d.ts.map +1 -0
- package/dist/scripts/generate-client-worker.js +13 -0
- package/dist/scripts/generate-client.d.ts +14 -0
- package/dist/scripts/generate-client.d.ts.map +1 -0
- package/dist/scripts/generate-client.js +73 -0
- package/dist/scripts/generate-client.test.d.ts +2 -0
- package/dist/scripts/generate-client.test.d.ts.map +1 -0
- package/dist/scripts/generate-client.test.js +48 -0
- package/dist/scripts/generate-spec-cli.d.ts +3 -0
- package/dist/scripts/generate-spec-cli.d.ts.map +1 -0
- package/dist/scripts/generate-spec-cli.js +77 -0
- package/dist/scripts/generate-spec-cli.test.d.ts +14 -0
- package/dist/scripts/generate-spec-cli.test.d.ts.map +1 -0
- package/dist/scripts/generate-spec-cli.test.js +90 -0
- package/dist/scripts/generate-spec.d.ts +61 -0
- package/dist/scripts/generate-spec.d.ts.map +1 -0
- package/dist/scripts/generate-spec.js +746 -0
- package/dist/scripts/generate-spec.test.d.ts +12 -0
- package/dist/scripts/generate-spec.test.d.ts.map +1 -0
- package/dist/scripts/generate-spec.test.js +88 -0
- package/dist/scripts/index.d.ts +12 -0
- package/dist/scripts/index.d.ts.map +1 -0
- package/dist/scripts/index.js +13 -0
- package/dist/scripts/sandbox.d.ts +11 -0
- package/dist/scripts/sandbox.d.ts.map +1 -0
- package/dist/scripts/sandbox.js +200 -0
- package/dist/scripts/telemetry-cli.d.ts +3 -0
- package/dist/scripts/telemetry-cli.d.ts.map +1 -0
- package/dist/scripts/telemetry-cli.js +8 -0
- package/dist/scripts/telemetry.d.ts +17 -0
- package/dist/scripts/telemetry.d.ts.map +1 -0
- package/dist/scripts/telemetry.js +150 -0
- package/dist/scripts/telemetry.test.d.ts +2 -0
- package/dist/scripts/telemetry.test.d.ts.map +1 -0
- package/dist/scripts/telemetry.test.js +203 -0
- package/dist/scripts/validate-spec.d.ts +22 -0
- package/dist/scripts/validate-spec.d.ts.map +1 -0
- package/dist/scripts/validate-spec.js +159 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3 -0
- package/dist/server/withAuth.d.ts +142 -0
- package/dist/server/withAuth.d.ts.map +1 -0
- package/dist/server/withAuth.js +261 -0
- package/dist/server/withAuth.test.d.ts +2 -0
- package/dist/server/withAuth.test.d.ts.map +1 -0
- package/dist/server/withAuth.test.js +278 -0
- package/dist/telemetry/client.d.ts +59 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +215 -0
- package/dist/telemetry/config-writer.d.ts +16 -0
- package/dist/telemetry/config-writer.d.ts.map +1 -0
- package/dist/telemetry/config-writer.js +36 -0
- package/dist/telemetry/consent-commands.test.d.ts +2 -0
- package/dist/telemetry/consent-commands.test.d.ts.map +1 -0
- package/dist/telemetry/consent-commands.test.js +161 -0
- package/dist/telemetry/consent.d.ts +60 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +122 -0
- package/dist/telemetry/environment.d.ts +33 -0
- package/dist/telemetry/environment.d.ts.map +1 -0
- package/dist/telemetry/environment.js +87 -0
- package/dist/telemetry/identifiers.d.ts +20 -0
- package/dist/telemetry/identifiers.d.ts.map +1 -0
- package/dist/telemetry/identifiers.js +86 -0
- package/dist/telemetry/index.d.ts +6 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +4 -0
- package/dist/telemetry/telemetry.test.d.ts +2 -0
- package/dist/telemetry/telemetry.test.d.ts.map +1 -0
- package/dist/telemetry/telemetry.test.js +1131 -0
- package/dist/telemetry/trackCommand.d.ts +32 -0
- package/dist/telemetry/trackCommand.d.ts.map +1 -0
- package/dist/telemetry/trackCommand.js +102 -0
- package/dist/telemetry/types.d.ts +92 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/package.json +83 -0
- package/src/api.test.ts +25 -0
- package/src/api.ts +163 -0
- package/src/bb-utils.ts +13 -0
- package/src/builtin-routes.ts +62 -0
- package/src/cdk/__fixtures__/factory-backend.ts +8 -0
- package/src/cdk/__fixtures__/fullid-construct-backend.ts +42 -0
- package/src/cdk/__fixtures__/handler.ts +4 -0
- package/src/cdk/__fixtures__/side-effect-backend.ts +7 -0
- package/src/cdk/blocks-backend.test.ts +207 -0
- package/src/cdk/blocks-backend.ts +249 -0
- package/src/cdk/blocks-stack.test.ts +106 -0
- package/src/cdk/config-registry.ts +106 -0
- package/src/cdk/index.ts +115 -0
- package/src/cdk/mixins.test.ts +129 -0
- package/src/cdk/mixins.ts +41 -0
- package/src/cdk/node-version.ts +17 -0
- package/src/cdk/stack-metadata.test.ts +71 -0
- package/src/cdk/stack-metadata.ts +29 -0
- package/src/cdk/synth-guard.test.ts +21 -0
- package/src/cdk/synth-guard.ts +23 -0
- package/src/client/index.test.ts +118 -0
- package/src/client/index.ts +320 -0
- package/src/common/config.test.ts +236 -0
- package/src/common/config.ts +169 -0
- package/src/common/constants.ts +15 -0
- package/src/common/crypto.ts +15 -0
- package/src/common/index.test.ts +242 -0
- package/src/common/index.ts +335 -0
- package/src/common/mock-data.ts +52 -0
- package/src/common/official-bb-names.generated.ts +29 -0
- package/src/common/sdk-registry.ts +150 -0
- package/src/constants.ts +31 -0
- package/src/cors.test.ts +279 -0
- package/src/cors.ts +91 -0
- package/src/db-naming.test.ts +48 -0
- package/src/db-naming.ts +41 -0
- package/src/errors.ts +72 -0
- package/src/hosting.test.ts +1431 -0
- package/src/hosting.ts +626 -0
- package/src/index.cdk.ts +45 -0
- package/src/index.ts +22 -0
- package/src/lambda-handler.test.ts +1005 -0
- package/src/lambda-handler.ts +706 -0
- package/src/pipeline/index.ts +12 -0
- package/src/pipeline/pipeline-construct.ts +662 -0
- package/src/pipeline/pipeline.test.ts +1565 -0
- package/src/pipeline/types.ts +384 -0
- package/src/raw-route.cdk.ts +56 -0
- package/src/raw-route.mock.ts +56 -0
- package/src/raw-route.test.ts +819 -0
- package/src/raw-route.ts +316 -0
- package/src/redact.test.ts +222 -0
- package/src/redact.ts +143 -0
- package/src/rpc.test.ts +73 -0
- package/src/rpc.ts +174 -0
- package/src/scripts/cdk-telemetry-env.test.ts +75 -0
- package/src/scripts/cdk-telemetry-env.ts +23 -0
- package/src/scripts/cleanup.ts +39 -0
- package/src/scripts/console.ts +34 -0
- package/src/scripts/deploy.ts +106 -0
- package/src/scripts/destroy.ts +42 -0
- package/src/scripts/dev-server-cors.test.ts +28 -0
- package/src/scripts/dev-server-telemetry.test.ts +127 -0
- package/src/scripts/dev-server.ts +515 -0
- package/src/scripts/ensure-secrets.test.ts +50 -0
- package/src/scripts/ensure-secrets.ts +113 -0
- package/src/scripts/external-migrations-step.test.ts +64 -0
- package/src/scripts/external-migrations-step.ts +269 -0
- package/src/scripts/extract-ts-types.test.ts +516 -0
- package/src/scripts/extract-ts-types.ts +773 -0
- package/src/scripts/generate-client-worker.ts +15 -0
- package/src/scripts/generate-client.test.ts +69 -0
- package/src/scripts/generate-client.ts +86 -0
- package/src/scripts/generate-spec-cli.test.ts +106 -0
- package/src/scripts/generate-spec-cli.ts +92 -0
- package/src/scripts/generate-spec.test.ts +99 -0
- package/src/scripts/generate-spec.ts +833 -0
- package/src/scripts/index.ts +21 -0
- package/src/scripts/sandbox.ts +230 -0
- package/src/scripts/telemetry-cli.ts +10 -0
- package/src/scripts/telemetry.test.ts +239 -0
- package/src/scripts/telemetry.ts +173 -0
- package/src/scripts/validate-spec.ts +199 -0
- package/src/server/index.ts +5 -0
- package/src/server/withAuth.test.ts +348 -0
- package/src/server/withAuth.ts +323 -0
- package/src/telemetry/client.ts +226 -0
- package/src/telemetry/config-writer.ts +52 -0
- package/src/telemetry/consent-commands.test.ts +196 -0
- package/src/telemetry/consent.ts +154 -0
- package/src/telemetry/environment.ts +100 -0
- package/src/telemetry/identifiers.ts +94 -0
- package/src/telemetry/index.ts +11 -0
- package/src/telemetry/telemetry.test.ts +1343 -0
- package/src/telemetry/trackCommand.ts +110 -0
- package/src/telemetry/types.ts +92 -0
- package/src/types.ts +33 -0
- package/src/version.ts +2 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { BLOCKS_NAMESPACE, BLOCKS_RPC_PREFIX } from './constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Typed error constants for RawRoute. Use with `isBlocksError()` in catch blocks.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* try {
|
|
10
|
+
* new RawRoute(scope, 'dup', { method: 'GET', path: '/health', handler });
|
|
11
|
+
* } catch (e: unknown) {
|
|
12
|
+
* if (isBlocksError(e, RawRouteErrors.DuplicateRoute)) {
|
|
13
|
+
* // same method+path already registered
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export const RawRouteErrors = {
|
|
19
|
+
DuplicateRoute: 'DuplicateRouteException',
|
|
20
|
+
};
|
|
21
|
+
// ── Scope-chain path derivation ─────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Derive a URL path from the scope chain.
|
|
24
|
+
*
|
|
25
|
+
* Walks the parent chain from `scope` up to (but NOT including) the root
|
|
26
|
+
* BlocksStack or the top-level user Scope, collects each intermediate scope's
|
|
27
|
+
* `id`, URL-encodes segments, and joins with `/`. The RawRoute's own `id`
|
|
28
|
+
* is appended as the final segment.
|
|
29
|
+
*
|
|
30
|
+
* A scope is "root-level" if its parent has no `parent` property (i.e., it's
|
|
31
|
+
* the BlocksStack or the fallback `{ id: ... }` sentinel). Root-level scopes
|
|
32
|
+
* are excluded from the path — they represent the application boundary, not
|
|
33
|
+
* a URL segment.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```
|
|
37
|
+
* Scope('app') → RawRoute('health') → /health
|
|
38
|
+
* Scope('app') → Scope('v1') → RawRoute('users') → /v1/users
|
|
39
|
+
* Scope('app') → Scope('api') → Scope('v2') → RawRoute('items') → /api/v2/items
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function derivePathFromScope(scope, id) {
|
|
43
|
+
const segments = [];
|
|
44
|
+
let current = scope;
|
|
45
|
+
while (current && 'parent' in current && current.parent) {
|
|
46
|
+
const parentNode = current.parent;
|
|
47
|
+
const parentIsRoot = !('parent' in parentNode) || !parentNode.parent;
|
|
48
|
+
if (parentIsRoot)
|
|
49
|
+
break;
|
|
50
|
+
segments.unshift(encodeURIComponent(current.id));
|
|
51
|
+
current = parentNode;
|
|
52
|
+
}
|
|
53
|
+
segments.push(encodeURIComponent(id));
|
|
54
|
+
return '/' + segments.join('/');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the effective path for a RawRoute — uses the explicit `path` if
|
|
58
|
+
* provided, otherwise derives it from the scope chain.
|
|
59
|
+
*/
|
|
60
|
+
export function resolveRoutePath(scope, id, options) {
|
|
61
|
+
return options.path ?? derivePathFromScope(scope, id);
|
|
62
|
+
}
|
|
63
|
+
const routeRegistry = [];
|
|
64
|
+
let registrationLocked = false;
|
|
65
|
+
const VALID_METHODS = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']);
|
|
66
|
+
/** Prevent further route registration. Call after initialization is complete. */
|
|
67
|
+
export function lockRouteRegistry() {
|
|
68
|
+
registrationLocked = true;
|
|
69
|
+
}
|
|
70
|
+
/** Re-allow route registration (useful in tests after lock). */
|
|
71
|
+
export function unlockRouteRegistry() {
|
|
72
|
+
registrationLocked = false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Register a raw HTTP route for runtime dispatch.
|
|
76
|
+
*
|
|
77
|
+
* **Internal.** The public API is `new RawRoute(scope, id, options)`.
|
|
78
|
+
* Path must be resolved before calling this function.
|
|
79
|
+
*
|
|
80
|
+
* @throws If registration is locked (after handler creation).
|
|
81
|
+
* @throws If the HTTP method is invalid.
|
|
82
|
+
* @throws If the path is under the reserved namespace (`/aws-blocks` or `/aws-blocks/api/*`).
|
|
83
|
+
* @throws {RawRouteErrors.DuplicateRoute} If the same method+path is registered twice.
|
|
84
|
+
*/
|
|
85
|
+
export function registerRoute(options) {
|
|
86
|
+
if (registrationLocked) {
|
|
87
|
+
throw new Error('Routes must be registered during initialization. Cannot register routes after handler creation.');
|
|
88
|
+
}
|
|
89
|
+
if (!VALID_METHODS.has(options.method)) {
|
|
90
|
+
throw new Error(`Invalid HTTP method: ${options.method}. Must be one of: ${Array.from(VALID_METHODS).join(', ')}`);
|
|
91
|
+
}
|
|
92
|
+
const normalizedPath = options.path.replace(/\/+/g, '/').replace(/\/$/, '') || '/';
|
|
93
|
+
if (normalizedPath === '/') {
|
|
94
|
+
throw new Error("Cannot register RawRoute at '/' — root path is not supported (API Gateway proxy resource doesn't handle root). Use a sub-path like '/health'.");
|
|
95
|
+
}
|
|
96
|
+
const lowerPath = normalizedPath.toLowerCase();
|
|
97
|
+
if (lowerPath === BLOCKS_NAMESPACE || lowerPath === BLOCKS_RPC_PREFIX || lowerPath.startsWith(`${BLOCKS_RPC_PREFIX}/`)) {
|
|
98
|
+
throw new Error(`Cannot register RawRoute at ${BLOCKS_NAMESPACE} or ${BLOCKS_RPC_PREFIX}/* — these paths are reserved for RPC dispatch`);
|
|
99
|
+
}
|
|
100
|
+
const existing = routeRegistry.find((r) => r.method === options.method && r.path === normalizedPath);
|
|
101
|
+
if (existing) {
|
|
102
|
+
const err = new Error(`${RawRouteErrors.DuplicateRoute}: ${options.method} ${normalizedPath} is already registered`);
|
|
103
|
+
err.name = RawRouteErrors.DuplicateRoute;
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
const { pattern, paramNames } = compilePath(normalizedPath);
|
|
107
|
+
routeRegistry.push({
|
|
108
|
+
method: options.method,
|
|
109
|
+
path: normalizedPath,
|
|
110
|
+
pattern,
|
|
111
|
+
paramNames,
|
|
112
|
+
handler: options.handler,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** Return a read-only snapshot of all registered routes. */
|
|
116
|
+
export function getRegisteredRoutes() {
|
|
117
|
+
return routeRegistry;
|
|
118
|
+
}
|
|
119
|
+
/** Remove all registered routes and unlock registration (used by tests). */
|
|
120
|
+
export function clearRouteRegistry() {
|
|
121
|
+
routeRegistry.length = 0;
|
|
122
|
+
registrationLocked = false;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Match an incoming HTTP request against registered routes.
|
|
126
|
+
*
|
|
127
|
+
* @returns The matched route and extracted path parameters, or `null` if no match.
|
|
128
|
+
*/
|
|
129
|
+
export function matchRoute(method, path) {
|
|
130
|
+
// Normalize incoming path: collapse double slashes
|
|
131
|
+
path = path.replace(/\/+/g, '/');
|
|
132
|
+
for (const route of routeRegistry) {
|
|
133
|
+
if (route.method !== method)
|
|
134
|
+
continue;
|
|
135
|
+
const match = route.pattern.exec(path);
|
|
136
|
+
if (match) {
|
|
137
|
+
return { route, params: extractParams(route, match) };
|
|
138
|
+
}
|
|
139
|
+
// Retry without trailing slash for non-root paths (e.g. /health/ → /health)
|
|
140
|
+
if (path.length > 1 && path.endsWith('/')) {
|
|
141
|
+
const trimmed = path.slice(0, -1);
|
|
142
|
+
const retryMatch = route.pattern.exec(trimmed);
|
|
143
|
+
if (retryMatch) {
|
|
144
|
+
return { route, params: extractParams(route, retryMatch) };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
function extractParams(route, match) {
|
|
151
|
+
const params = Object.create(null);
|
|
152
|
+
route.paramNames.forEach((name, i) => {
|
|
153
|
+
const raw = match[i + 1];
|
|
154
|
+
if (name === '*') {
|
|
155
|
+
// Wildcards capture raw paths — no decoding (prevents path traversal)
|
|
156
|
+
params[name] = raw;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Named params get decoded
|
|
160
|
+
try {
|
|
161
|
+
params[name] = decodeURIComponent(raw);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Invalid percent encoding — use raw value
|
|
165
|
+
params[name] = raw;
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
return params;
|
|
169
|
+
}
|
|
170
|
+
// ── Path compilation ────────────────────────────────────────────────────────
|
|
171
|
+
const REGEX_SPECIAL = new Set(['.', '+', '?', '^', '$', '|', '(', ')', '[', ']', '\\']);
|
|
172
|
+
const BLOCKED_PARAM_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
|
|
173
|
+
/**
|
|
174
|
+
* Compile a path pattern into a RegExp and extract parameter names.
|
|
175
|
+
*
|
|
176
|
+
* Supported syntax:
|
|
177
|
+
* - `/health` → exact match
|
|
178
|
+
* - `/users/{id}` → captures one path segment as `id`
|
|
179
|
+
* - `/v1/*` → captures everything after `/v1/` as `*`
|
|
180
|
+
* - `/a/{x}/b/{y}` → multiple named parameters
|
|
181
|
+
*/
|
|
182
|
+
export function compilePath(path) {
|
|
183
|
+
if (!path.startsWith('/')) {
|
|
184
|
+
throw new Error('Path must start with /');
|
|
185
|
+
}
|
|
186
|
+
// Normalize: collapse double slashes
|
|
187
|
+
path = path.replace(/\/+/g, '/');
|
|
188
|
+
// Remove trailing slash (except root '/')
|
|
189
|
+
if (path.length > 1 && path.endsWith('/')) {
|
|
190
|
+
path = path.slice(0, -1);
|
|
191
|
+
}
|
|
192
|
+
const paramNames = [];
|
|
193
|
+
let regexStr = '';
|
|
194
|
+
let i = 0;
|
|
195
|
+
let wildcardCount = 0;
|
|
196
|
+
while (i < path.length) {
|
|
197
|
+
if (path[i] === '{') {
|
|
198
|
+
const end = path.indexOf('}', i);
|
|
199
|
+
if (end === -1) {
|
|
200
|
+
throw new Error(`Unclosed '{' in path pattern: ${path}`);
|
|
201
|
+
}
|
|
202
|
+
const name = path.substring(i + 1, end);
|
|
203
|
+
if (!name || !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
|
|
204
|
+
throw new Error(`Invalid parameter name '${name}' in path '${path}'. Parameter names must be valid JavaScript identifiers (start with letter or underscore, contain only letters, digits, underscores).`);
|
|
205
|
+
}
|
|
206
|
+
if (BLOCKED_PARAM_NAMES.has(name)) {
|
|
207
|
+
throw new Error(`Parameter name '${name}' is reserved and cannot be used in path '${path}'.`);
|
|
208
|
+
}
|
|
209
|
+
paramNames.push(name);
|
|
210
|
+
regexStr += '([^/]+)';
|
|
211
|
+
i = end + 1;
|
|
212
|
+
}
|
|
213
|
+
else if (path[i] === '}') {
|
|
214
|
+
throw new Error(`Unexpected '}' without matching '{' in path pattern: ${path}`);
|
|
215
|
+
}
|
|
216
|
+
else if (path[i] === '*') {
|
|
217
|
+
wildcardCount++;
|
|
218
|
+
if (wildcardCount > 1) {
|
|
219
|
+
throw new Error(`Path '${path}' contains multiple wildcards. Only one wildcard (*) is allowed per route, and it must be the last segment.`);
|
|
220
|
+
}
|
|
221
|
+
if (i !== path.length - 1) {
|
|
222
|
+
throw new Error(`Path '${path}' contains multiple wildcards. Only one wildcard (*) is allowed per route, and it must be the last segment.`);
|
|
223
|
+
}
|
|
224
|
+
paramNames.push('*');
|
|
225
|
+
regexStr += '(.*)';
|
|
226
|
+
i++;
|
|
227
|
+
}
|
|
228
|
+
else if (REGEX_SPECIAL.has(path[i])) {
|
|
229
|
+
regexStr += '\\' + path[i];
|
|
230
|
+
i++;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
regexStr += path[i];
|
|
234
|
+
i++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const fullPattern = '^' + regexStr + '$';
|
|
238
|
+
return { pattern: new RegExp(fullPattern), paramNames };
|
|
239
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Scope } from './common/index.js';
|
|
2
|
+
import type { ScopeParent } from './common/index.js';
|
|
3
|
+
import { type RawRouteOptions } from './raw-route.js';
|
|
4
|
+
export { RawRouteErrors, type RawRouteOptions, type HttpMethod } from './raw-route.js';
|
|
5
|
+
/**
|
|
6
|
+
* Raw HTTP route Building Block.
|
|
7
|
+
*
|
|
8
|
+
* Provides raw HTTP endpoints with full request/response control, beyond the
|
|
9
|
+
* default RPC-only `POST /api` pattern. Routes are dispatched by the Lambda
|
|
10
|
+
* handler and dev server based on HTTP method + path pattern matching.
|
|
11
|
+
*
|
|
12
|
+
* ## Path
|
|
13
|
+
*
|
|
14
|
+
* When `path` is provided, it is used exactly as given. When omitted, the
|
|
15
|
+
* path is derived from the scope-chain IDs (excluding the root BlocksStack):
|
|
16
|
+
*
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Explicit path — used as-is
|
|
19
|
+
* new RawRoute(scope, 'health', { method: 'GET', path: '/health', handler });
|
|
20
|
+
*
|
|
21
|
+
* // Derived path — scope chain determines the URL
|
|
22
|
+
* new RawRoute(scope, 'health', { method: 'GET', handler });
|
|
23
|
+
* // If scope is the top-level Scope('my-app'), path becomes /health
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* **Caution:** Changing the construct tree structure changes derived URLs.
|
|
27
|
+
* Use explicit paths for routes that must remain stable.
|
|
28
|
+
*
|
|
29
|
+
* ## Path syntax (when explicit)
|
|
30
|
+
*
|
|
31
|
+
* - `/health` — exact match
|
|
32
|
+
* - `/users/{id}` — named path parameter (captures one segment)
|
|
33
|
+
* - `/v1/*` — wildcard (captures everything after prefix)
|
|
34
|
+
*
|
|
35
|
+
* ## How it works
|
|
36
|
+
*
|
|
37
|
+
* - At construction time, the route is registered in a global registry.
|
|
38
|
+
* - The Lambda handler and dev server check the registry before falling through to RPC dispatch.
|
|
39
|
+
* - The CDK side only validates the route (duplicate detection). No additional AWS resources
|
|
40
|
+
* are created — the existing catch-all API Gateway proxy routes all paths to the Lambda.
|
|
41
|
+
*/
|
|
42
|
+
export declare class RawRoute extends Scope {
|
|
43
|
+
/** The resolved path this route is registered at. */
|
|
44
|
+
readonly path: string;
|
|
45
|
+
constructor(scope: ScopeParent, id: string, options: RawRouteOptions);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=raw-route.mock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-route.mock.d.ts","sourceRoot":"","sources":["../src/raw-route.mock.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,qDAAqD;IACrD,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;CAKrE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { Scope } from './common/index.js';
|
|
4
|
+
import { registerRoute, resolveRoutePath } from './raw-route.js';
|
|
5
|
+
export { RawRouteErrors } from './raw-route.js';
|
|
6
|
+
/**
|
|
7
|
+
* Raw HTTP route Building Block.
|
|
8
|
+
*
|
|
9
|
+
* Provides raw HTTP endpoints with full request/response control, beyond the
|
|
10
|
+
* default RPC-only `POST /api` pattern. Routes are dispatched by the Lambda
|
|
11
|
+
* handler and dev server based on HTTP method + path pattern matching.
|
|
12
|
+
*
|
|
13
|
+
* ## Path
|
|
14
|
+
*
|
|
15
|
+
* When `path` is provided, it is used exactly as given. When omitted, the
|
|
16
|
+
* path is derived from the scope-chain IDs (excluding the root BlocksStack):
|
|
17
|
+
*
|
|
18
|
+
* ```typescript
|
|
19
|
+
* // Explicit path — used as-is
|
|
20
|
+
* new RawRoute(scope, 'health', { method: 'GET', path: '/health', handler });
|
|
21
|
+
*
|
|
22
|
+
* // Derived path — scope chain determines the URL
|
|
23
|
+
* new RawRoute(scope, 'health', { method: 'GET', handler });
|
|
24
|
+
* // If scope is the top-level Scope('my-app'), path becomes /health
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* **Caution:** Changing the construct tree structure changes derived URLs.
|
|
28
|
+
* Use explicit paths for routes that must remain stable.
|
|
29
|
+
*
|
|
30
|
+
* ## Path syntax (when explicit)
|
|
31
|
+
*
|
|
32
|
+
* - `/health` — exact match
|
|
33
|
+
* - `/users/{id}` — named path parameter (captures one segment)
|
|
34
|
+
* - `/v1/*` — wildcard (captures everything after prefix)
|
|
35
|
+
*
|
|
36
|
+
* ## How it works
|
|
37
|
+
*
|
|
38
|
+
* - At construction time, the route is registered in a global registry.
|
|
39
|
+
* - The Lambda handler and dev server check the registry before falling through to RPC dispatch.
|
|
40
|
+
* - The CDK side only validates the route (duplicate detection). No additional AWS resources
|
|
41
|
+
* are created — the existing catch-all API Gateway proxy routes all paths to the Lambda.
|
|
42
|
+
*/
|
|
43
|
+
export class RawRoute extends Scope {
|
|
44
|
+
/** The resolved path this route is registered at. */
|
|
45
|
+
path;
|
|
46
|
+
constructor(scope, id, options) {
|
|
47
|
+
super(id, { parent: scope });
|
|
48
|
+
this.path = resolveRoutePath(scope, id, options);
|
|
49
|
+
registerRoute({ ...options, path: this.path });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw-route.test.d.ts","sourceRoot":"","sources":["../src/raw-route.test.ts"],"names":[],"mappings":""}
|