sst 3.0.0 → 3.0.1-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -139
- package/src/index.ts +1 -0
- package/src/resource.ts +15 -0
- package/tsconfig.json +11 -0
- package/LICENSE +0 -21
- package/README.md +0 -43
- package/bootstrap.d.ts +0 -5
- package/bootstrap.js +0 -318
- package/bus.d.ts +0 -20
- package/bus.js +0 -52
- package/cache.d.ts +0 -4
- package/cache.js +0 -31
- package/cdk/deploy-stack.d.ts +0 -223
- package/cdk/deploy-stack.js +0 -562
- package/cdk/deployments-wrapper.d.ts +0 -3
- package/cdk/deployments-wrapper.js +0 -135
- package/cdk/deployments.d.ts +0 -327
- package/cdk/deployments.js +0 -360
- package/cdk/util.d.ts +0 -1
- package/cdk/util.js +0 -17
- package/cli/ci-info.d.ts +0 -4
- package/cli/ci-info.js +0 -8
- package/cli/colors.d.ts +0 -17
- package/cli/colors.js +0 -27
- package/cli/commands/bind.d.ts +0 -19
- package/cli/commands/bind.js +0 -360
- package/cli/commands/bootstrap.d.ts +0 -15
- package/cli/commands/bootstrap.js +0 -11
- package/cli/commands/build.d.ts +0 -17
- package/cli/commands/build.js +0 -25
- package/cli/commands/connect.d.ts +0 -17
- package/cli/commands/connect.js +0 -55
- package/cli/commands/console.d.ts +0 -15
- package/cli/commands/console.js +0 -22
- package/cli/commands/deploy.d.ts +0 -19
- package/cli/commands/deploy.js +0 -112
- package/cli/commands/dev.d.ts +0 -25
- package/cli/commands/dev.js +0 -351
- package/cli/commands/diff.d.ts +0 -19
- package/cli/commands/diff.js +0 -89
- package/cli/commands/plugins/kysely.d.ts +0 -1
- package/cli/commands/plugins/kysely.js +0 -87
- package/cli/commands/plugins/pothos.d.ts +0 -1
- package/cli/commands/plugins/pothos.js +0 -58
- package/cli/commands/plugins/warmer.d.ts +0 -1
- package/cli/commands/plugins/warmer.js +0 -33
- package/cli/commands/remove.d.ts +0 -19
- package/cli/commands/remove.js +0 -62
- package/cli/commands/secrets/get.d.ts +0 -19
- package/cli/commands/secrets/get.js +0 -27
- package/cli/commands/secrets/list.d.ts +0 -19
- package/cli/commands/secrets/list.js +0 -69
- package/cli/commands/secrets/load.d.ts +0 -17
- package/cli/commands/secrets/load.js +0 -47
- package/cli/commands/secrets/remove.d.ts +0 -19
- package/cli/commands/secrets/remove.js +0 -27
- package/cli/commands/secrets/secrets.d.ts +0 -2
- package/cli/commands/secrets/secrets.js +0 -16
- package/cli/commands/secrets/set.d.ts +0 -21
- package/cli/commands/secrets/set.js +0 -54
- package/cli/commands/telemetry.d.ts +0 -17
- package/cli/commands/telemetry.js +0 -24
- package/cli/commands/transform.d.ts +0 -17
- package/cli/commands/transform.js +0 -62
- package/cli/commands/types.d.ts +0 -15
- package/cli/commands/types.js +0 -25
- package/cli/commands/update.d.ts +0 -17
- package/cli/commands/update.js +0 -116
- package/cli/commands/version.d.ts +0 -15
- package/cli/commands/version.js +0 -15
- package/cli/local/router.d.ts +0 -44
- package/cli/local/router.js +0 -43
- package/cli/local/server.d.ts +0 -22
- package/cli/local/server.js +0 -319
- package/cli/program.d.ts +0 -19
- package/cli/program.js +0 -87
- package/cli/spinner.d.ts +0 -3
- package/cli/spinner.js +0 -14
- package/cli/sst.d.ts +0 -2
- package/cli/sst.js +0 -74
- package/cli/telemetry/environment.d.ts +0 -15
- package/cli/telemetry/environment.js +0 -27
- package/cli/telemetry/post-payload.d.ts +0 -1
- package/cli/telemetry/post-payload.js +0 -27
- package/cli/telemetry/project-id.d.ts +0 -2
- package/cli/telemetry/project-id.js +0 -47
- package/cli/telemetry/telemetry.d.ts +0 -19
- package/cli/telemetry/telemetry.js +0 -103
- package/cli/terminal.d.ts +0 -1
- package/cli/terminal.js +0 -8
- package/cli/ui/deploy.d.ts +0 -10
- package/cli/ui/deploy.js +0 -172
- package/cli/ui/functions.d.ts +0 -2
- package/cli/ui/functions.js +0 -130
- package/cli/ui/header.d.ts +0 -5
- package/cli/ui/header.js +0 -16
- package/cli/ui/stack.d.ts +0 -1
- package/cli/ui/stack.js +0 -6
- package/config.d.ts +0 -56
- package/config.js +0 -244
- package/constructs/Api.d.ts +0 -814
- package/constructs/Api.js +0 -743
- package/constructs/ApiGatewayV1Api.d.ts +0 -642
- package/constructs/ApiGatewayV1Api.js +0 -767
- package/constructs/App.d.ts +0 -168
- package/constructs/App.js +0 -493
- package/constructs/AppSyncApi.d.ts +0 -550
- package/constructs/AppSyncApi.js +0 -493
- package/constructs/AstroSite.d.ts +0 -39
- package/constructs/AstroSite.js +0 -78
- package/constructs/AstroSite.tsdoc.d.ts +0 -2
- package/constructs/AstroSite.tsdoc.js +0 -2
- package/constructs/Auth.d.ts +0 -100
- package/constructs/Auth.js +0 -177
- package/constructs/BaseSite.d.ts +0 -29
- package/constructs/BaseSite.js +0 -43
- package/constructs/Bucket.d.ts +0 -364
- package/constructs/Bucket.js +0 -327
- package/constructs/Cognito.d.ts +0 -232
- package/constructs/Cognito.js +0 -370
- package/constructs/Config.d.ts +0 -3
- package/constructs/Config.js +0 -3
- package/constructs/Construct.d.ts +0 -23
- package/constructs/Construct.js +0 -46
- package/constructs/Cron.d.ts +0 -164
- package/constructs/Cron.js +0 -114
- package/constructs/Distribution.d.ts +0 -143
- package/constructs/Distribution.js +0 -260
- package/constructs/EdgeFunction.d.ts +0 -49
- package/constructs/EdgeFunction.js +0 -442
- package/constructs/EventBus.d.ts +0 -444
- package/constructs/EventBus.js +0 -440
- package/constructs/Function.d.ts +0 -690
- package/constructs/Function.js +0 -583
- package/constructs/FunctionalStack.d.ts +0 -13
- package/constructs/FunctionalStack.js +0 -62
- package/constructs/Job.d.ts +0 -337
- package/constructs/Job.js +0 -404
- package/constructs/KinesisStream.d.ts +0 -224
- package/constructs/KinesisStream.js +0 -207
- package/constructs/Metadata.d.ts +0 -60
- package/constructs/Metadata.js +0 -1
- package/constructs/NextjsSite.d.ts +0 -104
- package/constructs/NextjsSite.js +0 -308
- package/constructs/Parameter.d.ts +0 -37
- package/constructs/Parameter.js +0 -53
- package/constructs/Queue.d.ts +0 -194
- package/constructs/Queue.js +0 -204
- package/constructs/RDS.d.ts +0 -221
- package/constructs/RDS.js +0 -363
- package/constructs/RemixSite.d.ts +0 -42
- package/constructs/RemixSite.js +0 -158
- package/constructs/RemixSite.tsdoc.d.ts +0 -2
- package/constructs/RemixSite.tsdoc.js +0 -2
- package/constructs/Script.d.ts +0 -160
- package/constructs/Script.js +0 -179
- package/constructs/Secret.d.ts +0 -30
- package/constructs/Secret.js +0 -59
- package/constructs/Service.d.ts +0 -487
- package/constructs/Service.js +0 -655
- package/constructs/SolidStartSite.d.ts +0 -37
- package/constructs/SolidStartSite.js +0 -66
- package/constructs/SolidStartSite.tsdoc.d.ts +0 -2
- package/constructs/SolidStartSite.tsdoc.js +0 -2
- package/constructs/SsrFunction.d.ts +0 -60
- package/constructs/SsrFunction.js +0 -226
- package/constructs/SsrSite.d.ts +0 -407
- package/constructs/SsrSite.js +0 -850
- package/constructs/Stack.d.ts +0 -127
- package/constructs/Stack.js +0 -243
- package/constructs/StaticSite.d.ts +0 -348
- package/constructs/StaticSite.js +0 -468
- package/constructs/SvelteKitSite.d.ts +0 -40
- package/constructs/SvelteKitSite.js +0 -106
- package/constructs/SvelteKitSite.tsdoc.d.ts +0 -2
- package/constructs/SvelteKitSite.tsdoc.js +0 -2
- package/constructs/Table.d.ts +0 -410
- package/constructs/Table.js +0 -425
- package/constructs/Topic.d.ts +0 -257
- package/constructs/Topic.js +0 -273
- package/constructs/WebSocketApi.d.ts +0 -355
- package/constructs/WebSocketApi.js +0 -404
- package/constructs/cdk/HttpAwsIntegration.d.ts +0 -32
- package/constructs/cdk/HttpAwsIntegration.js +0 -24
- package/constructs/cdk/certificate-base.d.ts +0 -18
- package/constructs/cdk/certificate-base.js +0 -26
- package/constructs/cdk/dns-validated-certificate.d.ts +0 -77
- package/constructs/cdk/dns-validated-certificate.js +0 -125
- package/constructs/cdk/website-redirect.d.ts +0 -53
- package/constructs/cdk/website-redirect.js +0 -77
- package/constructs/context.d.ts +0 -3
- package/constructs/context.js +0 -27
- package/constructs/deferred_task.d.ts +0 -6
- package/constructs/deferred_task.js +0 -45
- package/constructs/deprecated/NextjsSite.d.ts +0 -309
- package/constructs/deprecated/NextjsSite.js +0 -1074
- package/constructs/deprecated/cross-region-helper.d.ts +0 -7
- package/constructs/deprecated/cross-region-helper.js +0 -152
- package/constructs/deprecated/index.d.ts +0 -1
- package/constructs/deprecated/index.js +0 -1
- package/constructs/future/Auth.d.ts +0 -80
- package/constructs/future/Auth.js +0 -122
- package/constructs/future/index.d.ts +0 -1
- package/constructs/future/index.js +0 -1
- package/constructs/index.d.ts +0 -32
- package/constructs/index.js +0 -32
- package/constructs/static-file-list.d.ts +0 -1
- package/constructs/static-file-list.js +0 -51
- package/constructs/util/apiGatewayV1AccessLog.d.ts +0 -15
- package/constructs/util/apiGatewayV1AccessLog.js +0 -76
- package/constructs/util/apiGatewayV2AccessLog.d.ts +0 -10
- package/constructs/util/apiGatewayV2AccessLog.js +0 -107
- package/constructs/util/apiGatewayV2Cors.d.ts +0 -67
- package/constructs/util/apiGatewayV2Cors.js +0 -21
- package/constructs/util/apiGatewayV2Domain.d.ts +0 -47
- package/constructs/util/apiGatewayV2Domain.js +0 -208
- package/constructs/util/appSyncApiDomain.d.ts +0 -41
- package/constructs/util/appSyncApiDomain.js +0 -176
- package/constructs/util/builder.d.ts +0 -3
- package/constructs/util/builder.js +0 -9
- package/constructs/util/duration.d.ts +0 -3
- package/constructs/util/duration.js +0 -19
- package/constructs/util/functionBinding.d.ts +0 -31
- package/constructs/util/functionBinding.js +0 -104
- package/constructs/util/functionUrlCors.d.ts +0 -67
- package/constructs/util/functionUrlCors.js +0 -23
- package/constructs/util/permission.d.ts +0 -8
- package/constructs/util/permission.js +0 -228
- package/constructs/util/size.d.ts +0 -3
- package/constructs/util/size.js +0 -12
- package/constructs/util/warning.d.ts +0 -11
- package/constructs/util/warning.js +0 -21
- package/context/context.d.ts +0 -13
- package/context/context.js +0 -69
- package/context/context2.d.ts +0 -16
- package/context/context2.js +0 -108
- package/context/handler.d.ts +0 -25
- package/context/handler.js +0 -21
- package/context/index.d.ts +0 -2
- package/context/index.js +0 -2
- package/credentials.d.ts +0 -9
- package/credentials.js +0 -145
- package/error.d.ts +0 -6
- package/error.js +0 -10
- package/index.d.ts +0 -1
- package/index.js +0 -1
- package/iot.d.ts +0 -6
- package/iot.js +0 -163
- package/logger.d.ts +0 -3
- package/logger.js +0 -32
- package/node/actor/index.d.ts +0 -29
- package/node/actor/index.js +0 -17
- package/node/api/index.d.ts +0 -64
- package/node/api/index.js +0 -179
- package/node/auth/adapter/adapter.d.ts +0 -3
- package/node/auth/adapter/adapter.js +0 -3
- package/node/auth/adapter/facebook.d.ts +0 -2
- package/node/auth/adapter/facebook.js +0 -26
- package/node/auth/adapter/github.d.ts +0 -2
- package/node/auth/adapter/github.js +0 -21
- package/node/auth/adapter/google.d.ts +0 -9
- package/node/auth/adapter/google.js +0 -18
- package/node/auth/adapter/link.d.ts +0 -8
- package/node/auth/adapter/link.js +0 -39
- package/node/auth/adapter/oauth.d.ts +0 -25
- package/node/auth/adapter/oauth.js +0 -52
- package/node/auth/adapter/oidc.d.ts +0 -17
- package/node/auth/adapter/oidc.js +0 -50
- package/node/auth/adapter/twitch.d.ts +0 -2
- package/node/auth/adapter/twitch.js +0 -11
- package/node/auth/auth.d.ts +0 -24
- package/node/auth/auth.js +0 -74
- package/node/auth/index.d.ts +0 -13
- package/node/auth/index.js +0 -12
- package/node/auth/session.d.ts +0 -76
- package/node/auth/session.js +0 -121
- package/node/bucket/index.d.ts +0 -3
- package/node/bucket/index.js +0 -2
- package/node/config/index.d.ts +0 -13
- package/node/config/index.js +0 -22
- package/node/event-bus/index.d.ts +0 -51
- package/node/event-bus/index.js +0 -76
- package/node/function/index.d.ts +0 -3
- package/node/function/index.js +0 -3
- package/node/future/auth/adapter/adapter.d.ts +0 -10
- package/node/future/auth/adapter/adapter.js +0 -1
- package/node/future/auth/adapter/code.d.ts +0 -17
- package/node/future/auth/adapter/code.js +0 -68
- package/node/future/auth/adapter/facebook.d.ts +0 -16
- package/node/future/auth/adapter/facebook.js +0 -27
- package/node/future/auth/adapter/github.d.ts +0 -23
- package/node/future/auth/adapter/github.js +0 -23
- package/node/future/auth/adapter/google.d.ts +0 -28
- package/node/future/auth/adapter/google.js +0 -22
- package/node/future/auth/adapter/link.d.ts +0 -13
- package/node/future/auth/adapter/link.js +0 -47
- package/node/future/auth/adapter/microsoft.d.ts +0 -22
- package/node/future/auth/adapter/microsoft.js +0 -16
- package/node/future/auth/adapter/oauth.d.ts +0 -41
- package/node/future/auth/adapter/oauth.js +0 -67
- package/node/future/auth/adapter/oidc.d.ts +0 -30
- package/node/future/auth/adapter/oidc.js +0 -63
- package/node/future/auth/adapter/spotify.d.ts +0 -23
- package/node/future/auth/adapter/spotify.js +0 -22
- package/node/future/auth/encryption.d.ts +0 -2
- package/node/future/auth/encryption.js +0 -30
- package/node/future/auth/handler.d.ts +0 -46
- package/node/future/auth/handler.js +0 -280
- package/node/future/auth/index.d.ts +0 -17
- package/node/future/auth/index.js +0 -15
- package/node/future/auth/session.d.ts +0 -71
- package/node/future/auth/session.js +0 -146
- package/node/graphql/index.d.ts +0 -15
- package/node/graphql/index.js +0 -32
- package/node/job/index.d.ts +0 -37
- package/node/job/index.js +0 -64
- package/node/kinesis-stream/index.d.ts +0 -3
- package/node/kinesis-stream/index.js +0 -3
- package/node/queue/index.d.ts +0 -3
- package/node/queue/index.js +0 -2
- package/node/rds/index.d.ts +0 -3
- package/node/rds/index.js +0 -2
- package/node/service/index.d.ts +0 -3
- package/node/service/index.js +0 -4
- package/node/site/index.d.ts +0 -18
- package/node/site/index.js +0 -18
- package/node/table/index.d.ts +0 -3
- package/node/table/index.js +0 -4
- package/node/topic/index.d.ts +0 -3
- package/node/topic/index.js +0 -4
- package/node/util/index.d.ts +0 -2
- package/node/util/index.js +0 -196
- package/node/util/loader.d.ts +0 -2
- package/node/util/loader.js +0 -51
- package/node/websocket-api/index.d.ts +0 -23
- package/node/websocket-api/index.js +0 -48
- package/pothos.d.ts +0 -7
- package/pothos.js +0 -160
- package/project.d.ts +0 -75
- package/project.js +0 -188
- package/runtime/handlers/container.d.ts +0 -2
- package/runtime/handlers/container.js +0 -263
- package/runtime/handlers/dotnet.d.ts +0 -2
- package/runtime/handlers/dotnet.js +0 -115
- package/runtime/handlers/go.d.ts +0 -2
- package/runtime/handlers/go.js +0 -126
- package/runtime/handlers/java.d.ts +0 -2
- package/runtime/handlers/java.js +0 -103
- package/runtime/handlers/node.d.ts +0 -2
- package/runtime/handlers/node.js +0 -269
- package/runtime/handlers/python.d.ts +0 -2
- package/runtime/handlers/python.js +0 -141
- package/runtime/handlers/pythonBundling.d.ts +0 -82
- package/runtime/handlers/pythonBundling.js +0 -80
- package/runtime/handlers/rust.d.ts +0 -2
- package/runtime/handlers/rust.js +0 -110
- package/runtime/handlers.d.ts +0 -74
- package/runtime/handlers.js +0 -151
- package/runtime/iot.d.ts +0 -1
- package/runtime/iot.js +0 -17
- package/runtime/runtime.d.ts +0 -32
- package/runtime/runtime.js +0 -1
- package/runtime/server.d.ts +0 -6
- package/runtime/server.js +0 -150
- package/runtime/workers.d.ts +0 -37
- package/runtime/workers.js +0 -85
- package/stacks/app-metadata.d.ts +0 -7
- package/stacks/app-metadata.js +0 -75
- package/stacks/assembly.d.ts +0 -1
- package/stacks/assembly.js +0 -4
- package/stacks/build.d.ts +0 -9
- package/stacks/build.js +0 -110
- package/stacks/deploy.d.ts +0 -9
- package/stacks/deploy.js +0 -240
- package/stacks/diff.d.ts +0 -8
- package/stacks/diff.js +0 -62
- package/stacks/index.d.ts +0 -10
- package/stacks/index.js +0 -10
- package/stacks/metadata.d.ts +0 -11
- package/stacks/metadata.js +0 -83
- package/stacks/monitor.d.ts +0 -32
- package/stacks/monitor.js +0 -151
- package/stacks/remove.d.ts +0 -8
- package/stacks/remove.js +0 -76
- package/stacks/synth.d.ts +0 -12
- package/stacks/synth.js +0 -94
- package/support/base-site-archiver.mjs +0 -99
- package/support/base-site-custom-resource/s3-handler.py +0 -195
- package/support/base-site-custom-resource/s3-upload.py +0 -89
- package/support/bootstrap-metadata-function/index.mjs +0 -58011
- package/support/bridge/Dockerfile +0 -3
- package/support/bridge/bridge.mjs +0 -146
- package/support/certificate-requestor/index.js +0 -549
- package/support/custom-resources/index.mjs +0 -180627
- package/support/dotnet31-bootstrap/Program.cs +0 -17
- package/support/dotnet31-bootstrap/dotnet-bootstrap.csproj +0 -12
- package/support/dotnet31-bootstrap/release/Amazon.Lambda.Core.dll +0 -0
- package/support/dotnet31-bootstrap/release/Amazon.Lambda.RuntimeSupport.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Runtime.CompilerServices.Unsafe.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Text.Encodings.Web.dll +0 -0
- package/support/dotnet31-bootstrap/release/System.Text.Json.dll +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.deps.json +0 -230
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.dll +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.pdb +0 -0
- package/support/dotnet31-bootstrap/release/dotnet-bootstrap.runtimeconfig.json +0 -9
- package/support/dotnet6-bootstrap/Program.cs +0 -17
- package/support/dotnet6-bootstrap/dotnet-bootstrap.csproj +0 -12
- package/support/dotnet6-bootstrap/release/Amazon.Lambda.Core.dll +0 -0
- package/support/dotnet6-bootstrap/release/Amazon.Lambda.RuntimeSupport.dll +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.deps.json +0 -59
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.dll +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.pdb +0 -0
- package/support/dotnet6-bootstrap/release/dotnet-bootstrap.runtimeconfig.json +0 -12
- package/support/edge-function/edge-lambda-version.mjs +0 -3
- package/support/edge-function/edge-lambda.mjs +0 -3
- package/support/edge-function/s3-bucket.mjs +0 -3
- package/support/event-bus-retrier/index.mjs +0 -75
- package/support/java-runtime/install.sh +0 -25
- package/support/java-runtime/pom.xml +0 -39
- package/support/java-runtime/release/aws-lambda-java-core-1.2.0.jar +0 -0
- package/support/java-runtime/release/aws-lambda-java-runtime-interface-client-1.1.0.jar +0 -0
- package/support/java-runtime/release/aws-lambda-java-serialization-1.0.0.jar +0 -0
- package/support/job-manager/index.mjs +0 -57679
- package/support/nixpacks/Dockerfile +0 -6
- package/support/nodejs-runtime/index.mjs +0 -169
- package/support/python-runtime/Dockerfile +0 -9
- package/support/python-runtime/Dockerfile.custom +0 -21
- package/support/python-runtime/Dockerfile.dependencies +0 -26
- package/support/python-runtime/runtime.py +0 -127
- package/support/rds-migrator/index.mjs +0 -49
- package/support/remix-site-function/edge-server.js +0 -161
- package/support/remix-site-function/polyfill.js +0 -24
- package/support/remix-site-function/regional-server.js +0 -164
- package/support/script-function/index.mjs +0 -48760
- package/support/service-dev-function/index.js +0 -1
- package/support/signing-function/index.mjs +0 -3769
- package/support/sls-nextjs-site-build-helper/build.cjs +0 -91
- package/support/sls-nextjs-site-build-helper/index-wrapper.js +0 -19
- package/support/sls-nextjs-site-function-code-replacer/lambda-code-updater.py +0 -156
- package/support/sls-nextjs-site-stub/index.html +0 -99
- package/support/ssr-site-function-archiver.mjs +0 -96
- package/support/ssr-site-function-stub/index.js +0 -5
- package/support/ssr-warmer/index.mjs +0 -34235
- package/util/error.d.ts +0 -3
- package/util/error.js +0 -6
- package/util/fs.d.ts +0 -4
- package/util/fs.js +0 -46
- package/util/lazy.d.ts +0 -1
- package/util/lazy.js +0 -11
- package/util/module.d.ts +0 -1
- package/util/module.js +0 -5
- package/util/process.d.ts +0 -2
- package/util/process.js +0 -3
- package/watcher.d.ts +0 -14
- package/watcher.js +0 -35
|
@@ -1,767 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
3
|
-
import * as route53Targets from "aws-cdk-lib/aws-route53-targets";
|
|
4
|
-
import * as acm from "aws-cdk-lib/aws-certificatemanager";
|
|
5
|
-
import * as cognito from "aws-cdk-lib/aws-cognito";
|
|
6
|
-
import * as apig from "aws-cdk-lib/aws-apigateway";
|
|
7
|
-
import * as apigV1AccessLog from "./util/apiGatewayV1AccessLog.js";
|
|
8
|
-
import { Stack } from "./Stack.js";
|
|
9
|
-
import { toCdkDuration } from "./util/duration.js";
|
|
10
|
-
import { getFunctionRef, isCDKConstruct } from "./Construct.js";
|
|
11
|
-
import { DnsValidatedCertificate } from "./cdk/dns-validated-certificate.js";
|
|
12
|
-
import { Function as Fn, } from "./Function.js";
|
|
13
|
-
import { Duration as CDKDuration, Token } from "aws-cdk-lib/core";
|
|
14
|
-
const allowedMethods = [
|
|
15
|
-
"ANY",
|
|
16
|
-
"GET",
|
|
17
|
-
"PUT",
|
|
18
|
-
"POST",
|
|
19
|
-
"HEAD",
|
|
20
|
-
"PATCH",
|
|
21
|
-
"DELETE",
|
|
22
|
-
"OPTIONS",
|
|
23
|
-
];
|
|
24
|
-
/////////////////////
|
|
25
|
-
// Construct
|
|
26
|
-
/////////////////////
|
|
27
|
-
/**
|
|
28
|
-
*
|
|
29
|
-
* The `ApiGatewayV1Api` construct is a higher level CDK construct that makes it easy to create an API Gateway REST API.
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
*
|
|
33
|
-
* ```js
|
|
34
|
-
* import { ApiGatewayV1Api } from "sst/constructs";
|
|
35
|
-
*
|
|
36
|
-
* new ApiGatewayV1Api(stack, "Api", {
|
|
37
|
-
* routes: {
|
|
38
|
-
* "GET /notes" : "src/list.main",
|
|
39
|
-
* "POST /notes" : "src/create.main",
|
|
40
|
-
* "GET /notes/{id}": "src/get.main",
|
|
41
|
-
* "PUT /notes/{id}": "src/update.main",
|
|
42
|
-
* "DELETE /notes/{id}": "src/delete.main",
|
|
43
|
-
* },
|
|
44
|
-
* });
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
export class ApiGatewayV1Api extends Construct {
|
|
48
|
-
id;
|
|
49
|
-
cdk;
|
|
50
|
-
_deployment;
|
|
51
|
-
_customDomainUrl;
|
|
52
|
-
importedResources = {};
|
|
53
|
-
props;
|
|
54
|
-
functions = {};
|
|
55
|
-
authorizersData = {};
|
|
56
|
-
bindingForAllRoutes = [];
|
|
57
|
-
permissionsAttachedForAllRoutes = [];
|
|
58
|
-
constructor(scope, id, props) {
|
|
59
|
-
super(scope, props?.cdk?.id || id);
|
|
60
|
-
this.id = id;
|
|
61
|
-
this.props = props || {};
|
|
62
|
-
this.cdk = {};
|
|
63
|
-
this.createRestApi();
|
|
64
|
-
this.addAuthorizers(this.props.authorizers || {});
|
|
65
|
-
this.addRoutes(this, this.props.routes || {});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* The AWS generated URL of the Api.
|
|
69
|
-
*/
|
|
70
|
-
get url() {
|
|
71
|
-
const app = this.node.root;
|
|
72
|
-
return (this.cdk.restApi.url ??
|
|
73
|
-
`https://${this.cdk.restApi.restApiId}.execute-api.${app.region}.amazonaws.com/${app.stage}/`);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* If custom domain is enabled, this is the custom domain URL of the Api.
|
|
77
|
-
*
|
|
78
|
-
* :::note
|
|
79
|
-
* If you are setting the base mapping for the custom domain, you need to include the trailing slash while using the custom domain URL. For example, if the [`domainName`](#domainname) is set to `api.domain.com` and the [`path`](#path) is `v1`, the custom domain URL of the API will be `https://api.domain.com/v1/`.
|
|
80
|
-
* :::
|
|
81
|
-
*/
|
|
82
|
-
get customDomainUrl() {
|
|
83
|
-
return this._customDomainUrl;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* The routes for the Api
|
|
87
|
-
*/
|
|
88
|
-
get routes() {
|
|
89
|
-
return Object.keys(this.functions);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* The ARN of the internally created API Gateway REST API
|
|
93
|
-
*/
|
|
94
|
-
get restApiArn() {
|
|
95
|
-
const stack = Stack.of(this);
|
|
96
|
-
return `arn:${stack.partition}:apigateway:${stack.region}::/restapis/${this.cdk.restApi.restApiId}`;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* The id of the internally created API Gateway REST API
|
|
100
|
-
*/
|
|
101
|
-
get restApiId() {
|
|
102
|
-
return this.cdk.restApi.restApiId;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Adds routes to the Api after it has been created.
|
|
106
|
-
*
|
|
107
|
-
* @example
|
|
108
|
-
* ```js
|
|
109
|
-
* api.addRoutes(stack, {
|
|
110
|
-
* "GET /notes/{id}": "src/get.main",
|
|
111
|
-
* "PUT /notes/{id}": "src/update.main",
|
|
112
|
-
* "DELETE /notes/{id}": "src/delete.main",
|
|
113
|
-
* });
|
|
114
|
-
* ```
|
|
115
|
-
*/
|
|
116
|
-
addRoutes(scope, routes) {
|
|
117
|
-
Object.keys(routes).forEach((routeKey) => this.addRoute(scope, routeKey, routes[routeKey]));
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Get the instance of the internally created Function, for a given route key where the `routeKey` is the key used to define a route. For example, `GET /notes`.
|
|
121
|
-
*
|
|
122
|
-
* @example
|
|
123
|
-
* ```js
|
|
124
|
-
* const api = new ApiGatewayV1Api(stack, "Api", {
|
|
125
|
-
* routes: {
|
|
126
|
-
* "GET /notes": "src/list.main",
|
|
127
|
-
* },
|
|
128
|
-
* });
|
|
129
|
-
*
|
|
130
|
-
* const listFunction = api.getFunction("GET /notes");
|
|
131
|
-
* ```
|
|
132
|
-
*/
|
|
133
|
-
getFunction(routeKey) {
|
|
134
|
-
const fn = this.functions[this.normalizeRouteKey(routeKey)];
|
|
135
|
-
if (fn instanceof Fn) {
|
|
136
|
-
return fn;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Binds the given list of resources to all the routes.
|
|
141
|
-
*
|
|
142
|
-
* @example
|
|
143
|
-
*
|
|
144
|
-
* ```js
|
|
145
|
-
* api.bind([STRIPE_KEY, bucket]);
|
|
146
|
-
* ```
|
|
147
|
-
*/
|
|
148
|
-
bind(constructs) {
|
|
149
|
-
Object.values(this.functions).forEach((fn) => {
|
|
150
|
-
if (fn instanceof Fn) {
|
|
151
|
-
fn.bind(constructs);
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
this.bindingForAllRoutes.push(...constructs);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Binds the given list of resources to a specific route.
|
|
158
|
-
*
|
|
159
|
-
* @example
|
|
160
|
-
* ```js
|
|
161
|
-
* const api = new Api(stack, "Api", {
|
|
162
|
-
* routes: {
|
|
163
|
-
* "GET /notes": "src/list.main",
|
|
164
|
-
* },
|
|
165
|
-
* });
|
|
166
|
-
*
|
|
167
|
-
* api.bindToRoute("GET /notes", [STRIPE_KEY, bucket]);
|
|
168
|
-
* ```
|
|
169
|
-
*
|
|
170
|
-
*/
|
|
171
|
-
bindToRoute(routeKey, constructs) {
|
|
172
|
-
const fn = this.getFunction(routeKey);
|
|
173
|
-
if (!fn) {
|
|
174
|
-
throw new Error(`Failed to bind resources. Route "${routeKey}" does not exist.`);
|
|
175
|
-
}
|
|
176
|
-
fn.bind(constructs);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Attaches the given list of permissions to all the routes. This allows the functions to access other AWS resources.
|
|
180
|
-
*
|
|
181
|
-
* @example
|
|
182
|
-
*
|
|
183
|
-
* ```js
|
|
184
|
-
* api.attachPermissions(["s3"]);
|
|
185
|
-
* ```
|
|
186
|
-
*/
|
|
187
|
-
attachPermissions(permissions) {
|
|
188
|
-
Object.values(this.functions).forEach((fn) => {
|
|
189
|
-
if (fn instanceof Fn) {
|
|
190
|
-
fn.attachPermissions(permissions);
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
this.permissionsAttachedForAllRoutes.push(permissions);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Attaches the given list of permissions to a specific route. This allows that function to access other AWS resources.
|
|
197
|
-
*
|
|
198
|
-
* @example
|
|
199
|
-
* ```js
|
|
200
|
-
* const api = new ApiGatewayV1Api(stack, "Api", {
|
|
201
|
-
* routes: {
|
|
202
|
-
* "GET /notes": "src/list.main",
|
|
203
|
-
* },
|
|
204
|
-
* });
|
|
205
|
-
*
|
|
206
|
-
* api.attachPermissionsToRoute("GET /notes", ["s3"]);
|
|
207
|
-
* ```
|
|
208
|
-
*/
|
|
209
|
-
attachPermissionsToRoute(routeKey, permissions) {
|
|
210
|
-
const fn = this.getFunction(routeKey);
|
|
211
|
-
if (!fn) {
|
|
212
|
-
throw new Error(`Failed to attach permissions. Route "${routeKey}" does not exist.`);
|
|
213
|
-
}
|
|
214
|
-
fn.attachPermissions(permissions);
|
|
215
|
-
}
|
|
216
|
-
getConstructMetadata() {
|
|
217
|
-
return {
|
|
218
|
-
type: "ApiGatewayV1Api",
|
|
219
|
-
data: {
|
|
220
|
-
customDomainUrl: this._customDomainUrl,
|
|
221
|
-
url: this.cdk.restApi.url,
|
|
222
|
-
restApiId: this.cdk.restApi.restApiId,
|
|
223
|
-
routes: Object.entries(this.functions).map(([key, data]) => {
|
|
224
|
-
return {
|
|
225
|
-
type: "function",
|
|
226
|
-
route: key,
|
|
227
|
-
fn: getFunctionRef(data),
|
|
228
|
-
};
|
|
229
|
-
}),
|
|
230
|
-
},
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
/** @internal */
|
|
234
|
-
getFunctionBinding() {
|
|
235
|
-
return {
|
|
236
|
-
clientPackage: "api",
|
|
237
|
-
variables: {
|
|
238
|
-
url: {
|
|
239
|
-
type: "plain",
|
|
240
|
-
value: this.customDomainUrl || this.url,
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
permissions: {},
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
createRestApi() {
|
|
247
|
-
const { cdk, cors, accessLog, customDomain } = this.props;
|
|
248
|
-
const id = this.node.id;
|
|
249
|
-
const app = this.node.root;
|
|
250
|
-
if (isCDKConstruct(cdk?.restApi)) {
|
|
251
|
-
if (cors !== undefined) {
|
|
252
|
-
throw new Error(`Cannot configure the "cors" when the "restApi" is imported`);
|
|
253
|
-
}
|
|
254
|
-
if (accessLog !== undefined) {
|
|
255
|
-
throw new Error(`Cannot configure the "accessLog" when the "restApi" is imported`);
|
|
256
|
-
}
|
|
257
|
-
if (customDomain !== undefined) {
|
|
258
|
-
throw new Error(`Cannot configure the "customDomain" when the "restApi" is imported`);
|
|
259
|
-
}
|
|
260
|
-
this.cdk.restApi = cdk?.restApi;
|
|
261
|
-
// Create an API Gateway deployment resource to trigger a deployment
|
|
262
|
-
this._deployment = new apig.Deployment(this, "Deployment", {
|
|
263
|
-
api: this.cdk.restApi,
|
|
264
|
-
});
|
|
265
|
-
const cfnDeployment = this._deployment.node
|
|
266
|
-
.defaultChild;
|
|
267
|
-
cfnDeployment.stageName = app.stage;
|
|
268
|
-
if (cdk?.importedPaths) {
|
|
269
|
-
this.importResources(cdk?.importedPaths);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
const restApiProps = (cdk?.restApi || {});
|
|
274
|
-
// Validate input
|
|
275
|
-
if (cdk?.importedPaths !== undefined) {
|
|
276
|
-
throw new Error(`Cannot import route paths when creating a new API.`);
|
|
277
|
-
}
|
|
278
|
-
if (customDomain !== undefined && restApiProps.domainName !== undefined) {
|
|
279
|
-
throw new Error(`Use either the "customDomain" or the "restApi.domainName" to configure the Api domain. Do not use both.`);
|
|
280
|
-
}
|
|
281
|
-
if (cors !== undefined &&
|
|
282
|
-
restApiProps.defaultCorsPreflightOptions !== undefined) {
|
|
283
|
-
throw new Error(`Use either the "cors" or the "restApi.defaultCorsPreflightOptions" to configure the Api's CORS config. Do not use both.`);
|
|
284
|
-
}
|
|
285
|
-
if (accessLog !== undefined &&
|
|
286
|
-
restApiProps.deployOptions?.accessLogDestination !== undefined) {
|
|
287
|
-
throw new Error(`Use either the "accessLog" or the "restApi.deployOptions.accessLogDestination" to configure the Api's access log. Do not use both.`);
|
|
288
|
-
}
|
|
289
|
-
if (accessLog !== undefined &&
|
|
290
|
-
restApiProps.deployOptions?.accessLogFormat !== undefined) {
|
|
291
|
-
throw new Error(`Use either the "accessLog" or the "restApi.deployOptions.accessLogFormat" to configure the Api's access log. Do not use both.`);
|
|
292
|
-
}
|
|
293
|
-
const stageName = restApiProps.deployOptions?.stageName || this.node.root.stage;
|
|
294
|
-
const accessLogData = apigV1AccessLog.buildAccessLogData(this, accessLog);
|
|
295
|
-
this.cdk.accessLogGroup = accessLogData?.logGroup;
|
|
296
|
-
this.cdk.restApi = new apig.RestApi(this, "Api", {
|
|
297
|
-
restApiName: app.logicalPrefixedName(id),
|
|
298
|
-
...restApiProps,
|
|
299
|
-
domainName: restApiProps.domainName,
|
|
300
|
-
defaultCorsPreflightOptions: restApiProps.defaultCorsPreflightOptions ||
|
|
301
|
-
this.buildCorsConfig(cors),
|
|
302
|
-
deployOptions: {
|
|
303
|
-
...(restApiProps.deployOptions || {}),
|
|
304
|
-
accessLogDestination: restApiProps.deployOptions?.accessLogDestination ||
|
|
305
|
-
accessLogData?.destination,
|
|
306
|
-
accessLogFormat: restApiProps.deployOptions?.accessLogFormat ||
|
|
307
|
-
accessLogData?.format,
|
|
308
|
-
// default to the name of the sage
|
|
309
|
-
stageName: stageName,
|
|
310
|
-
// default to true
|
|
311
|
-
tracingEnabled: restApiProps.deployOptions?.tracingEnabled === undefined
|
|
312
|
-
? true
|
|
313
|
-
: restApiProps.deployOptions?.tracingEnabled,
|
|
314
|
-
},
|
|
315
|
-
});
|
|
316
|
-
this.createCustomDomain(customDomain);
|
|
317
|
-
this.createGatewayResponseForCors(cors);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
buildCorsConfig(cors) {
|
|
321
|
-
// Case: cors is false
|
|
322
|
-
if (cors === false) {
|
|
323
|
-
return undefined;
|
|
324
|
-
}
|
|
325
|
-
// Case: cors is true or undefined
|
|
326
|
-
return {
|
|
327
|
-
allowHeaders: ["*"],
|
|
328
|
-
allowOrigins: apig.Cors.ALL_ORIGINS,
|
|
329
|
-
allowMethods: apig.Cors.ALL_METHODS,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
createGatewayResponseForCors(cors) {
|
|
333
|
-
if (!cors) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
this.cdk.restApi.addGatewayResponse("GatewayResponseDefault4XX", {
|
|
337
|
-
type: apig.ResponseType.DEFAULT_4XX,
|
|
338
|
-
responseHeaders: {
|
|
339
|
-
"Access-Control-Allow-Origin": "'*'",
|
|
340
|
-
"Access-Control-Allow-Headers": "'*'",
|
|
341
|
-
},
|
|
342
|
-
});
|
|
343
|
-
this.cdk.restApi.addGatewayResponse("GatewayResponseDefault5XX", {
|
|
344
|
-
type: apig.ResponseType.DEFAULT_5XX,
|
|
345
|
-
responseHeaders: {
|
|
346
|
-
"Access-Control-Allow-Origin": "'*'",
|
|
347
|
-
"Access-Control-Allow-Headers": "'*'",
|
|
348
|
-
},
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
createCustomDomain(customDomain) {
|
|
352
|
-
// Case: customDomain is not set
|
|
353
|
-
if (customDomain === undefined) {
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
// To be implemented: to allow more flexible use cases, SST should support 3 more use cases:
|
|
357
|
-
// 1. Allow user passing in `hostedZone` object. The use case is when there are multiple
|
|
358
|
-
// HostedZones with the same domain, but one is public, and one is private.
|
|
359
|
-
// 2. Allow user passing in `certificate` object. The use case is for user to create wildcard
|
|
360
|
-
// certificate or using an imported certificate.
|
|
361
|
-
// 3. Allow user passing in `apigDomainName` object. The use case is a user creates multiple API
|
|
362
|
-
// endpoints, and is mapping them under the same custom domain. `sst.Api` needs to expose the
|
|
363
|
-
// `apigDomainName` construct created in the first Api, and lets user pass it in when creating
|
|
364
|
-
// the second Api.
|
|
365
|
-
let domainName, hostedZone, hostedZoneDomain, certificate, apigDomainName, basePath, endpointType, mtls, securityPolicy;
|
|
366
|
-
/////////////////////
|
|
367
|
-
// Parse input
|
|
368
|
-
/////////////////////
|
|
369
|
-
// Case: customDomain is a string
|
|
370
|
-
if (typeof customDomain === "string") {
|
|
371
|
-
// validate: customDomain is a TOKEN string
|
|
372
|
-
// ie. imported SSM value: ssm.StringParameter.valueForStringParameter()
|
|
373
|
-
if (Token.isUnresolved(customDomain)) {
|
|
374
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
375
|
-
}
|
|
376
|
-
domainName = customDomain;
|
|
377
|
-
this.assertDomainNameIsLowerCase(domainName);
|
|
378
|
-
hostedZoneDomain = customDomain.split(".").slice(1).join(".");
|
|
379
|
-
}
|
|
380
|
-
// Case: customDomain.domainName is a string
|
|
381
|
-
else if (customDomain.domainName) {
|
|
382
|
-
domainName = customDomain.domainName;
|
|
383
|
-
// parse customDomain.domainName
|
|
384
|
-
if (Token.isUnresolved(customDomain.domainName)) {
|
|
385
|
-
// If customDomain is a TOKEN string, "hostedZone" has to be passed in. This
|
|
386
|
-
// is because "hostedZone" cannot be parsed from a TOKEN value.
|
|
387
|
-
if (!customDomain.hostedZone && !customDomain.cdk?.hostedZone) {
|
|
388
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
389
|
-
}
|
|
390
|
-
domainName = customDomain.domainName;
|
|
391
|
-
}
|
|
392
|
-
else {
|
|
393
|
-
domainName = customDomain.domainName;
|
|
394
|
-
this.assertDomainNameIsLowerCase(domainName);
|
|
395
|
-
}
|
|
396
|
-
// parse customDomain.hostedZone
|
|
397
|
-
if (customDomain.hostedZone && customDomain.cdk?.hostedZone) {
|
|
398
|
-
throw new Error(`Use either the "customDomain.hostedZone" or the "customDomain.cdk.hostedZone" to configure the custom domain hosted zone. Do not use both.`);
|
|
399
|
-
}
|
|
400
|
-
if (customDomain.hostedZone) {
|
|
401
|
-
hostedZoneDomain = customDomain.hostedZone;
|
|
402
|
-
}
|
|
403
|
-
else if (customDomain.cdk?.hostedZone) {
|
|
404
|
-
hostedZone = customDomain.cdk?.hostedZone;
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
hostedZoneDomain = domainName.split(".").slice(1).join(".");
|
|
408
|
-
}
|
|
409
|
-
certificate = customDomain.cdk?.certificate;
|
|
410
|
-
basePath = customDomain.path;
|
|
411
|
-
endpointType = customDomain.endpointType;
|
|
412
|
-
mtls = customDomain.mtls;
|
|
413
|
-
securityPolicy = customDomain.securityPolicy;
|
|
414
|
-
}
|
|
415
|
-
// Case: customDomain.domainName is a construct
|
|
416
|
-
else if (customDomain.cdk?.domainName) {
|
|
417
|
-
apigDomainName = customDomain.cdk.domainName;
|
|
418
|
-
// customDomain.domainName is imported
|
|
419
|
-
if (apigDomainName &&
|
|
420
|
-
(customDomain.hostedZone || customDomain.cdk?.hostedZone)) {
|
|
421
|
-
throw new Error(`Cannot configure the "hostedZone" when the "domainName" is a construct`);
|
|
422
|
-
}
|
|
423
|
-
if (apigDomainName && customDomain.cdk?.certificate) {
|
|
424
|
-
throw new Error(`Cannot configure the "certificate" when the "domainName" is a construct`);
|
|
425
|
-
}
|
|
426
|
-
if (apigDomainName && customDomain.endpointType) {
|
|
427
|
-
throw new Error(`Cannot configure the "endpointType" when the "domainName" is a construct`);
|
|
428
|
-
}
|
|
429
|
-
if (apigDomainName && customDomain.mtls) {
|
|
430
|
-
throw new Error(`Cannot configure the "mtls" when the "domainName" is a construct`);
|
|
431
|
-
}
|
|
432
|
-
if (apigDomainName && customDomain.securityPolicy) {
|
|
433
|
-
throw new Error(`Cannot configure the "securityPolicy" when the "domainName" is a construct`);
|
|
434
|
-
}
|
|
435
|
-
basePath = customDomain.path;
|
|
436
|
-
}
|
|
437
|
-
/////////////////////
|
|
438
|
-
// Find hosted zone
|
|
439
|
-
/////////////////////
|
|
440
|
-
if (!apigDomainName && !hostedZone) {
|
|
441
|
-
// Look up hosted zone
|
|
442
|
-
if (!hostedZone && hostedZoneDomain) {
|
|
443
|
-
hostedZone = route53.HostedZone.fromLookup(this, "HostedZone", {
|
|
444
|
-
domainName: hostedZoneDomain,
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
/////////////////////
|
|
449
|
-
// Create certificate
|
|
450
|
-
/////////////////////
|
|
451
|
-
if (!apigDomainName && !certificate) {
|
|
452
|
-
if (endpointType === "edge") {
|
|
453
|
-
certificate = new DnsValidatedCertificate(this, "CrossRegionCertificate", {
|
|
454
|
-
domainName: domainName,
|
|
455
|
-
hostedZone: hostedZone,
|
|
456
|
-
region: "us-east-1",
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
certificate = new acm.Certificate(this, "Certificate", {
|
|
461
|
-
domainName: domainName,
|
|
462
|
-
validation: acm.CertificateValidation.fromDns(hostedZone),
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
this.cdk.certificate = certificate;
|
|
466
|
-
}
|
|
467
|
-
/////////////////////
|
|
468
|
-
// Create API Gateway domain name
|
|
469
|
-
/////////////////////
|
|
470
|
-
if (!apigDomainName && domainName) {
|
|
471
|
-
// Create custom domain in API Gateway
|
|
472
|
-
apigDomainName = new apig.DomainName(this, "DomainName", {
|
|
473
|
-
domainName,
|
|
474
|
-
certificate: certificate,
|
|
475
|
-
endpointType: endpointType &&
|
|
476
|
-
apig.EndpointType[endpointType.toLocaleUpperCase()],
|
|
477
|
-
mtls: mtls && {
|
|
478
|
-
...mtls,
|
|
479
|
-
bucket: mtls.bucket.cdk.bucket,
|
|
480
|
-
},
|
|
481
|
-
securityPolicy: securityPolicy === "TLS 1.0"
|
|
482
|
-
? apig.SecurityPolicy.TLS_1_0
|
|
483
|
-
: securityPolicy === "TLS 1.2"
|
|
484
|
-
? apig.SecurityPolicy.TLS_1_2
|
|
485
|
-
: undefined,
|
|
486
|
-
});
|
|
487
|
-
this.cdk.domainName = apigDomainName;
|
|
488
|
-
// Create DNS record
|
|
489
|
-
this.createARecords(hostedZone, domainName, apigDomainName);
|
|
490
|
-
}
|
|
491
|
-
/////////////////////
|
|
492
|
-
// Create base mapping
|
|
493
|
-
/////////////////////
|
|
494
|
-
if (apigDomainName) {
|
|
495
|
-
new apig.BasePathMapping(this, "BasePath", {
|
|
496
|
-
domainName: apigDomainName,
|
|
497
|
-
restApi: this.cdk.restApi,
|
|
498
|
-
basePath,
|
|
499
|
-
});
|
|
500
|
-
}
|
|
501
|
-
// Note: We only know the full custom domain if domainName is a string.
|
|
502
|
-
// _customDomainUrl will be undefined if apigDomainName is imported.
|
|
503
|
-
if (domainName && !Token.isUnresolved(domainName)) {
|
|
504
|
-
this._customDomainUrl = basePath
|
|
505
|
-
? `https://${domainName}/${basePath}/`
|
|
506
|
-
: `https://${domainName}`;
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
createARecords(hostedZone, domainName, apigDomain) {
|
|
510
|
-
// create DNS record
|
|
511
|
-
const recordProps = {
|
|
512
|
-
recordName: domainName,
|
|
513
|
-
zone: hostedZone,
|
|
514
|
-
target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayDomain(apigDomain)),
|
|
515
|
-
};
|
|
516
|
-
const records = [
|
|
517
|
-
new route53.ARecord(this, "AliasRecord", recordProps),
|
|
518
|
-
new route53.AaaaRecord(this, "AliasRecordAAAA", recordProps),
|
|
519
|
-
];
|
|
520
|
-
// note: If domainName is a TOKEN string ie. ${TOKEN..}, the route53.ARecord
|
|
521
|
-
// construct will append ".${hostedZoneName}" to the end of the domain.
|
|
522
|
-
// This is because the construct tries to check if the record name
|
|
523
|
-
// ends with the domain name. If not, it will append the domain name.
|
|
524
|
-
// So, we need remove this behavior.
|
|
525
|
-
if (Token.isUnresolved(domainName)) {
|
|
526
|
-
records.forEach((record) => {
|
|
527
|
-
const cfnRecord = record.node.defaultChild;
|
|
528
|
-
cfnRecord.name = domainName;
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
importResources(resources) {
|
|
533
|
-
Object.keys(resources).forEach((path) => {
|
|
534
|
-
const resource = apig.Resource.fromResourceAttributes(this, `Resource_${path}`, {
|
|
535
|
-
path,
|
|
536
|
-
resourceId: resources[path],
|
|
537
|
-
restApi: this.cdk.restApi,
|
|
538
|
-
});
|
|
539
|
-
this.importedResources[path] = resource;
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
getResourceForPath(path) {
|
|
543
|
-
// Lookup exact match imported resource
|
|
544
|
-
if (this.importedResources[path]) {
|
|
545
|
-
return this.importedResources[path];
|
|
546
|
-
}
|
|
547
|
-
// Lookup parents matching imported resource first
|
|
548
|
-
const parts = path.split("/");
|
|
549
|
-
for (let i = parts.length; i >= 1; i--) {
|
|
550
|
-
const partialPath = parts.slice(0, i).join("/");
|
|
551
|
-
if (this.importedResources[partialPath]) {
|
|
552
|
-
return this.importedResources[partialPath].resourceForPath(parts.slice(i).join("/"));
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
// Not child of imported resources, create off the root
|
|
556
|
-
return this.cdk.restApi.root.resourceForPath(path);
|
|
557
|
-
}
|
|
558
|
-
addAuthorizers(authorizers) {
|
|
559
|
-
Object.entries(authorizers).forEach(([key, value]) => {
|
|
560
|
-
if (key === "none") {
|
|
561
|
-
throw new Error(`Cannot name an authorizer "none"`);
|
|
562
|
-
}
|
|
563
|
-
else if (key === "iam") {
|
|
564
|
-
throw new Error(`Cannot name an authorizer "iam"`);
|
|
565
|
-
}
|
|
566
|
-
else if (value.type === "user_pools") {
|
|
567
|
-
if (value.cdk?.authorizer) {
|
|
568
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
569
|
-
}
|
|
570
|
-
else {
|
|
571
|
-
if (!value.userPoolIds) {
|
|
572
|
-
throw new Error(`Missing "userPoolIds" for "${key}" authorizer`);
|
|
573
|
-
}
|
|
574
|
-
const userPools = value.userPoolIds.map((userPoolId) => cognito.UserPool.fromUserPoolId(this, `${key}-${userPoolId}-ImportedUserPool`, userPoolId));
|
|
575
|
-
this.authorizersData[key] = new apig.CognitoUserPoolsAuthorizer(this, key, {
|
|
576
|
-
cognitoUserPools: userPools,
|
|
577
|
-
authorizerName: value.name,
|
|
578
|
-
identitySource: value.identitySource,
|
|
579
|
-
resultsCacheTtl: value.resultsCacheTtl
|
|
580
|
-
? toCdkDuration(value.resultsCacheTtl)
|
|
581
|
-
: CDKDuration.seconds(0),
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
else if (value.type === "lambda_token") {
|
|
586
|
-
if (value.cdk?.authorizer) {
|
|
587
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
588
|
-
}
|
|
589
|
-
else {
|
|
590
|
-
if (!value.function) {
|
|
591
|
-
throw new Error(`Missing "function" for "${key}" authorizer`);
|
|
592
|
-
}
|
|
593
|
-
this.authorizersData[key] = new apig.TokenAuthorizer(this, key, {
|
|
594
|
-
handler: value.function,
|
|
595
|
-
authorizerName: value.name,
|
|
596
|
-
identitySource: value.identitySource,
|
|
597
|
-
validationRegex: value.validationRegex,
|
|
598
|
-
assumeRole: value.cdk?.assumeRole,
|
|
599
|
-
resultsCacheTtl: value.resultsCacheTtl
|
|
600
|
-
? toCdkDuration(value.resultsCacheTtl)
|
|
601
|
-
: CDKDuration.seconds(0),
|
|
602
|
-
});
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
else if (value.type === "lambda_request") {
|
|
606
|
-
if (value.cdk?.authorizer) {
|
|
607
|
-
this.authorizersData[key] = value.cdk.authorizer;
|
|
608
|
-
}
|
|
609
|
-
else {
|
|
610
|
-
if (!value.function) {
|
|
611
|
-
throw new Error(`Missing "function" for "${key}" authorizer`);
|
|
612
|
-
}
|
|
613
|
-
else if (!value.identitySources) {
|
|
614
|
-
throw new Error(`Missing "identitySources" for "${key}" authorizer`);
|
|
615
|
-
}
|
|
616
|
-
this.authorizersData[key] = new apig.RequestAuthorizer(this, key, {
|
|
617
|
-
handler: value.function,
|
|
618
|
-
authorizerName: value.name,
|
|
619
|
-
identitySources: value.identitySources,
|
|
620
|
-
assumeRole: value.cdk?.assumeRole,
|
|
621
|
-
resultsCacheTtl: value.resultsCacheTtl
|
|
622
|
-
? toCdkDuration(value.resultsCacheTtl)
|
|
623
|
-
: CDKDuration.seconds(0),
|
|
624
|
-
});
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
});
|
|
628
|
-
}
|
|
629
|
-
addRoute(scope, routeKey, routeValue) {
|
|
630
|
-
///////////////////
|
|
631
|
-
// Normalize routeKey
|
|
632
|
-
///////////////////
|
|
633
|
-
routeKey = this.normalizeRouteKey(routeKey);
|
|
634
|
-
if (this.functions[routeKey]) {
|
|
635
|
-
throw new Error(`A route already exists for "${routeKey}"`);
|
|
636
|
-
}
|
|
637
|
-
///////////////////
|
|
638
|
-
// Get path and method
|
|
639
|
-
///////////////////
|
|
640
|
-
const routeKeyParts = routeKey.split(" ");
|
|
641
|
-
if (routeKeyParts.length !== 2) {
|
|
642
|
-
throw new Error(`Invalid route ${routeKey}`);
|
|
643
|
-
}
|
|
644
|
-
const methodStr = routeKeyParts[0].toUpperCase();
|
|
645
|
-
const path = routeKeyParts[1];
|
|
646
|
-
const method = allowedMethods.find((per) => per === methodStr);
|
|
647
|
-
if (!method) {
|
|
648
|
-
throw new Error(`Invalid method defined for "${routeKey}"`);
|
|
649
|
-
}
|
|
650
|
-
if (path.length === 0) {
|
|
651
|
-
throw new Error(`Invalid path defined for "${routeKey}"`);
|
|
652
|
-
}
|
|
653
|
-
const postfixName = `${methodStr}_${path}`;
|
|
654
|
-
///////////////////
|
|
655
|
-
// Create Resources
|
|
656
|
-
///////////////////
|
|
657
|
-
let resource;
|
|
658
|
-
if (path.endsWith("/{proxy+}")) {
|
|
659
|
-
const parentResource = this.getResourceForPath(path.split("/").slice(0, -1).join("/"));
|
|
660
|
-
resource = parentResource.addProxy({ anyMethod: false });
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
resource = this.getResourceForPath(path);
|
|
664
|
-
}
|
|
665
|
-
///////////////////
|
|
666
|
-
// Create Method
|
|
667
|
-
///////////////////
|
|
668
|
-
const [routeProps, lambda] = (() => {
|
|
669
|
-
if (Fn.isInlineDefinition(routeValue)) {
|
|
670
|
-
const routeProps = {
|
|
671
|
-
function: routeValue,
|
|
672
|
-
};
|
|
673
|
-
return [
|
|
674
|
-
routeProps,
|
|
675
|
-
this.createFunction(scope, routeKey, routeProps, postfixName),
|
|
676
|
-
];
|
|
677
|
-
}
|
|
678
|
-
else if (routeValue.cdk?.function) {
|
|
679
|
-
return [
|
|
680
|
-
routeValue,
|
|
681
|
-
this.createCdkFunction(scope, routeKey, routeValue, postfixName),
|
|
682
|
-
];
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
return [
|
|
686
|
-
routeValue,
|
|
687
|
-
this.createFunction(scope, routeKey, routeValue, postfixName),
|
|
688
|
-
];
|
|
689
|
-
}
|
|
690
|
-
})();
|
|
691
|
-
const integration = new apig.LambdaIntegration(lambda, routeProps.cdk?.integration);
|
|
692
|
-
const methodOptions = this.buildRouteMethodOptions(routeProps);
|
|
693
|
-
const apigMethod = resource.addMethod(method, integration, methodOptions);
|
|
694
|
-
///////////////////
|
|
695
|
-
// Handle manually created Deployment resource (ie. imported REST API)
|
|
696
|
-
///////////////////
|
|
697
|
-
if (this._deployment) {
|
|
698
|
-
this._deployment.addToLogicalId({ route: { routeKey, routeValue } });
|
|
699
|
-
this._deployment.node.addDependency(apigMethod);
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
createCdkFunction(_scope, routeKey, routeProps, _postfixName) {
|
|
703
|
-
const lambda = routeProps.cdk?.function;
|
|
704
|
-
this.functions[routeKey] = lambda;
|
|
705
|
-
return lambda;
|
|
706
|
-
}
|
|
707
|
-
createFunction(scope, routeKey, routeProps, postfixName) {
|
|
708
|
-
const lambda = Fn.fromDefinition(scope, `Lambda_${postfixName}`, routeProps.function, this.props.defaults?.function, `The "defaults.function" cannot be applied if an instance of a Function construct is passed in. Make sure to define all the routes using FunctionProps, so the ApiGatewayV1Api construct can apply the "defaults.function" to them.`);
|
|
709
|
-
// Add an environment variable to determine if the function is an Api route.
|
|
710
|
-
// If it is, when "sst start" is not connected, we want to return an 500
|
|
711
|
-
// status code and a descriptive error message.
|
|
712
|
-
const root = scope.node.root;
|
|
713
|
-
if (root.local) {
|
|
714
|
-
lambda.addEnvironment("SST_DEBUG_IS_API_ROUTE", "1", {
|
|
715
|
-
removeInEdge: true,
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
this.functions[routeKey] = lambda;
|
|
719
|
-
// attached existing permissions
|
|
720
|
-
this.permissionsAttachedForAllRoutes.forEach((permissions) => lambda.attachPermissions(permissions));
|
|
721
|
-
lambda.bind(this.bindingForAllRoutes);
|
|
722
|
-
return lambda;
|
|
723
|
-
}
|
|
724
|
-
buildRouteMethodOptions(routeProps) {
|
|
725
|
-
const authorizerKey = routeProps.authorizer || this.props.defaults?.authorizer || "none";
|
|
726
|
-
if (authorizerKey === "none") {
|
|
727
|
-
return {
|
|
728
|
-
authorizationType: apig.AuthorizationType.NONE,
|
|
729
|
-
...routeProps.cdk?.method,
|
|
730
|
-
};
|
|
731
|
-
}
|
|
732
|
-
else if (authorizerKey === "iam") {
|
|
733
|
-
return {
|
|
734
|
-
authorizationType: apig.AuthorizationType.IAM,
|
|
735
|
-
...routeProps.cdk?.method,
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
if (!this.props.authorizers ||
|
|
739
|
-
!this.props.authorizers[authorizerKey]) {
|
|
740
|
-
throw new Error(`Cannot find authorizer "${authorizerKey.toString()}"`);
|
|
741
|
-
}
|
|
742
|
-
const authorizer = this.authorizersData[authorizerKey];
|
|
743
|
-
const authorizationType = this.props.authorizers[authorizerKey].type;
|
|
744
|
-
if (authorizationType === "user_pools") {
|
|
745
|
-
return {
|
|
746
|
-
authorizationType: apig.AuthorizationType.COGNITO,
|
|
747
|
-
authorizer,
|
|
748
|
-
authorizationScopes: routeProps.authorizationScopes ||
|
|
749
|
-
this.props.defaults?.authorizationScopes,
|
|
750
|
-
...routeProps.cdk?.method,
|
|
751
|
-
};
|
|
752
|
-
}
|
|
753
|
-
return {
|
|
754
|
-
authorizationType: apig.AuthorizationType.CUSTOM,
|
|
755
|
-
authorizer,
|
|
756
|
-
...routeProps.cdk?.method,
|
|
757
|
-
};
|
|
758
|
-
}
|
|
759
|
-
normalizeRouteKey(routeKey) {
|
|
760
|
-
return routeKey.split(/\s+/).join(" ");
|
|
761
|
-
}
|
|
762
|
-
assertDomainNameIsLowerCase(domainName) {
|
|
763
|
-
if (domainName !== domainName.toLowerCase()) {
|
|
764
|
-
throw new Error(`The domain name needs to be in lowercase`);
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
}
|