sst 3.0.0 → 3.0.1-1
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 +7 -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,107 +0,0 @@
|
|
|
1
|
-
import * as logs from "aws-cdk-lib/aws-logs";
|
|
2
|
-
import * as apig from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
3
|
-
const defaultHttpFields = [
|
|
4
|
-
// request info
|
|
5
|
-
`"requestTime":"$context.requestTime"`,
|
|
6
|
-
`"requestId":"$context.requestId"`,
|
|
7
|
-
`"httpMethod":"$context.httpMethod"`,
|
|
8
|
-
`"path":"$context.path"`,
|
|
9
|
-
`"routeKey":"$context.routeKey"`,
|
|
10
|
-
`"status":$context.status`,
|
|
11
|
-
`"responseLatency":$context.responseLatency`,
|
|
12
|
-
// integration info
|
|
13
|
-
`"integrationRequestId":"$context.integration.requestId"`,
|
|
14
|
-
`"integrationStatus":"$context.integration.status"`,
|
|
15
|
-
`"integrationLatency":"$context.integration.latency"`,
|
|
16
|
-
`"integrationServiceStatus":"$context.integration.integrationStatus"`,
|
|
17
|
-
// caller info
|
|
18
|
-
`"ip":"$context.identity.sourceIp"`,
|
|
19
|
-
`"userAgent":"$context.identity.userAgent"`,
|
|
20
|
-
// `cognitoIdentityId` is not supported in us-west-2 region
|
|
21
|
-
//`"cognitoIdentityId":"$context.identity.cognitoIdentityId"`,
|
|
22
|
-
];
|
|
23
|
-
const defaultWebSocketFields = [
|
|
24
|
-
// request info
|
|
25
|
-
`"requestTime":"$context.requestTime"`,
|
|
26
|
-
`"requestId":"$context.requestId"`,
|
|
27
|
-
`"eventType":"$context.eventType"`,
|
|
28
|
-
`"routeKey":"$context.routeKey"`,
|
|
29
|
-
`"status":$context.status`,
|
|
30
|
-
// integration info
|
|
31
|
-
`"integrationRequestId":"$context.awsEndpointRequestId"`,
|
|
32
|
-
`"integrationStatus":"$context.integrationStatus"`,
|
|
33
|
-
`"integrationLatency":"$context.integrationLatency"`,
|
|
34
|
-
`"integrationServiceStatus":"$context.integration.integrationStatus"`,
|
|
35
|
-
// caller info
|
|
36
|
-
`"ip":"$context.identity.sourceIp"`,
|
|
37
|
-
`"userAgent":"$context.identity.userAgent"`,
|
|
38
|
-
`"cognitoIdentityId":"$context.identity.cognitoIdentityId"`,
|
|
39
|
-
`"connectedAt":"$context.connectedAt"`,
|
|
40
|
-
`"connectionId":"$context.connectionId"`,
|
|
41
|
-
];
|
|
42
|
-
export function buildAccessLogData(scope, accessLog, apiStage, isDefaultStage) {
|
|
43
|
-
if (accessLog === false) {
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
const isWebSocketApi = apiStage instanceof apig.WebSocketStage;
|
|
47
|
-
// note: Access log configuration is not supported by L2 constructs as of CDK v1.85.0. We
|
|
48
|
-
// need to define it at L1 construct level.
|
|
49
|
-
// create log group
|
|
50
|
-
let logGroup;
|
|
51
|
-
let destinationArn;
|
|
52
|
-
if (accessLog && accessLog.destinationArn) {
|
|
53
|
-
destinationArn = accessLog.destinationArn;
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
const root = scope.node.root;
|
|
57
|
-
const apiName = root.logicalPrefixedName(scope.node.id);
|
|
58
|
-
// Backwards compatibility, only suffix if not default stage
|
|
59
|
-
const logGroupName = "LogGroup" + (isDefaultStage ? "" : apiStage.stageName);
|
|
60
|
-
logGroup = new logs.LogGroup(scope, logGroupName, {
|
|
61
|
-
logGroupName: [
|
|
62
|
-
`/aws/vendedlogs/apis`,
|
|
63
|
-
`/${cleanupLogGroupName(apiName)}-${apiStage.api.apiId}`,
|
|
64
|
-
`/${cleanupLogGroupName(apiStage.stageName)}`,
|
|
65
|
-
].join(""),
|
|
66
|
-
retention: buildLogGroupRetention(accessLog),
|
|
67
|
-
});
|
|
68
|
-
destinationArn = logGroup.logGroupArn;
|
|
69
|
-
}
|
|
70
|
-
// get log format
|
|
71
|
-
let format;
|
|
72
|
-
if (accessLog && accessLog.format) {
|
|
73
|
-
format = accessLog.format;
|
|
74
|
-
}
|
|
75
|
-
else if (typeof accessLog === "string") {
|
|
76
|
-
format = accessLog;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
format = isWebSocketApi
|
|
80
|
-
? "{" + defaultWebSocketFields.join(",") + "}"
|
|
81
|
-
: "{" + defaultHttpFields.join(",") + "}";
|
|
82
|
-
}
|
|
83
|
-
// get L1 cfnStage construct
|
|
84
|
-
if (!apiStage?.node.defaultChild) {
|
|
85
|
-
throw new Error(`Failed to define the default stage for Http API`);
|
|
86
|
-
}
|
|
87
|
-
// set access log settings
|
|
88
|
-
const cfnStage = apiStage.node.defaultChild;
|
|
89
|
-
cfnStage.accessLogSettings = { format, destinationArn };
|
|
90
|
-
return logGroup;
|
|
91
|
-
}
|
|
92
|
-
export function cleanupLogGroupName(str) {
|
|
93
|
-
return str.replace(/[^.\-_/#A-Za-z0-9]/g, "");
|
|
94
|
-
}
|
|
95
|
-
function buildLogGroupRetention(accessLog) {
|
|
96
|
-
const retention = accessLog && accessLog.retention;
|
|
97
|
-
if (!retention) {
|
|
98
|
-
return logs.RetentionDays.INFINITE;
|
|
99
|
-
}
|
|
100
|
-
// Case: retention is string
|
|
101
|
-
const retentionValue = logs.RetentionDays[retention.toUpperCase()];
|
|
102
|
-
// validate retention
|
|
103
|
-
if (!retentionValue) {
|
|
104
|
-
throw new Error(`Invalid access log retention value "${retention}".`);
|
|
105
|
-
}
|
|
106
|
-
return retentionValue;
|
|
107
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import * as apig from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
2
|
-
import { Duration } from "./duration.js";
|
|
3
|
-
export interface CorsProps {
|
|
4
|
-
/**
|
|
5
|
-
* Specifies whether credentials are included in the CORS request.
|
|
6
|
-
* @default false
|
|
7
|
-
*/
|
|
8
|
-
allowCredentials?: boolean;
|
|
9
|
-
/**
|
|
10
|
-
* The collection of allowed headers.
|
|
11
|
-
* @default Allow all headers.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```js
|
|
15
|
-
* // Allow all headers
|
|
16
|
-
* allowHeaders: ["*"]
|
|
17
|
-
*
|
|
18
|
-
* // Allow specific headers
|
|
19
|
-
* allowHeaders: ["Accept", "Content-Type", "Authorization"]
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
allowHeaders?: string[];
|
|
23
|
-
/**
|
|
24
|
-
* The collection of allowed HTTP methods.
|
|
25
|
-
* @default Allow all methods.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```js
|
|
29
|
-
* // Allow all methods
|
|
30
|
-
* allowMethods: ["ANY"]
|
|
31
|
-
*
|
|
32
|
-
* // Allow specific methods
|
|
33
|
-
* allowMethods: ["GET", "POST"]
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
allowMethods?: (keyof typeof apig.CorsHttpMethod)[];
|
|
37
|
-
/**
|
|
38
|
-
* The collection of allowed origins.
|
|
39
|
-
* @default Allow all origins.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```js
|
|
43
|
-
* // Allow all origins
|
|
44
|
-
* allowOrigins: ["*"]
|
|
45
|
-
*
|
|
46
|
-
* // Allow specific origins. Note that the url protocol, ie. "https://", is required.
|
|
47
|
-
* allowOrigins: ["https://domain.com"]
|
|
48
|
-
* ```
|
|
49
|
-
*/
|
|
50
|
-
allowOrigins?: string[];
|
|
51
|
-
/**
|
|
52
|
-
* The collection of exposed headers.
|
|
53
|
-
* @default No expose headers are allowed.
|
|
54
|
-
*/
|
|
55
|
-
exposeHeaders?: string[];
|
|
56
|
-
/**
|
|
57
|
-
* Specify how long the results of a preflight response can be cached
|
|
58
|
-
* @default No caching
|
|
59
|
-
*
|
|
60
|
-
* @example
|
|
61
|
-
* ```js
|
|
62
|
-
* maxAge: "1 day"
|
|
63
|
-
* ```
|
|
64
|
-
*/
|
|
65
|
-
maxAge?: Duration;
|
|
66
|
-
}
|
|
67
|
-
export declare function buildCorsConfig(cors?: boolean | CorsProps): apig.CorsPreflightOptions | undefined;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import * as apig from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
2
|
-
import { toCdkDuration } from "./duration.js";
|
|
3
|
-
export function buildCorsConfig(cors) {
|
|
4
|
-
// Handle cors: false
|
|
5
|
-
if (cors === false) {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
// Handle cors: true | undefined
|
|
9
|
-
if (cors === undefined || cors === true) {
|
|
10
|
-
cors = {};
|
|
11
|
-
}
|
|
12
|
-
// Handle cors: CorsProps
|
|
13
|
-
return {
|
|
14
|
-
allowCredentials: cors.allowCredentials || false,
|
|
15
|
-
allowHeaders: cors.allowHeaders || ["*"],
|
|
16
|
-
allowMethods: (cors.allowMethods || ["ANY"]).map((method) => apig.CorsHttpMethod[method]),
|
|
17
|
-
allowOrigins: cors.allowOrigins || ["*"],
|
|
18
|
-
exposeHeaders: cors.exposeHeaders,
|
|
19
|
-
maxAge: cors.maxAge && toCdkDuration(cors.maxAge),
|
|
20
|
-
};
|
|
21
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Construct } from "constructs";
|
|
2
|
-
import * as apig from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
3
|
-
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
4
|
-
import * as acm from "aws-cdk-lib/aws-certificatemanager";
|
|
5
|
-
export interface CustomDomainProps {
|
|
6
|
-
/**
|
|
7
|
-
* The domain to be assigned to the API endpoint (ie. api.domain.com)
|
|
8
|
-
*/
|
|
9
|
-
domainName?: string;
|
|
10
|
-
/**
|
|
11
|
-
* The hosted zone in Route 53 that contains the domain. By default, SST will look for a hosted zone by stripping out the first part of the domainName that's passed in. So, if your domainName is api.domain.com. SST will default the hostedZone to domain.com.
|
|
12
|
-
*/
|
|
13
|
-
hostedZone?: string;
|
|
14
|
-
/**
|
|
15
|
-
* The base mapping for the custom domain.
|
|
16
|
-
*
|
|
17
|
-
* For example, by setting the domainName to api.domain.com and the path to v1, the custom domain URL of the API will become https://api.domain.com/v1/. If the path is not set, the custom domain URL will be https://api.domain.com. Note the additional trailing slash in the former case.
|
|
18
|
-
*/
|
|
19
|
-
path?: string;
|
|
20
|
-
/**
|
|
21
|
-
* Set this option if the domain is not hosted on Amazon Route 53.
|
|
22
|
-
*/
|
|
23
|
-
isExternalDomain?: boolean;
|
|
24
|
-
cdk?: {
|
|
25
|
-
/**
|
|
26
|
-
* Override the internally created domain name
|
|
27
|
-
*/
|
|
28
|
-
domainName?: apig.IDomainName;
|
|
29
|
-
/**
|
|
30
|
-
* Override the internally created hosted zone
|
|
31
|
-
*/
|
|
32
|
-
hostedZone?: route53.IHostedZone;
|
|
33
|
-
/**
|
|
34
|
-
* Override the internally created certificate
|
|
35
|
-
*/
|
|
36
|
-
certificate?: acm.ICertificate;
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
export interface CustomDomainData {
|
|
40
|
-
readonly apigDomain: apig.IDomainName;
|
|
41
|
-
readonly mappingKey?: string;
|
|
42
|
-
readonly certificate?: acm.ICertificate;
|
|
43
|
-
readonly isApigDomainCreated: boolean;
|
|
44
|
-
readonly isCertificatedCreated: boolean;
|
|
45
|
-
readonly url: string;
|
|
46
|
-
}
|
|
47
|
-
export declare function buildCustomDomainData(scope: Construct, customDomain: string | CustomDomainProps | undefined): CustomDomainData | undefined;
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { Token } from "aws-cdk-lib/core";
|
|
2
|
-
import * as apig from "@aws-cdk/aws-apigatewayv2-alpha";
|
|
3
|
-
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
4
|
-
import * as route53Targets from "aws-cdk-lib/aws-route53-targets";
|
|
5
|
-
import * as acm from "aws-cdk-lib/aws-certificatemanager";
|
|
6
|
-
export function buildCustomDomainData(scope, customDomain) {
|
|
7
|
-
if (customDomain === undefined) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
// customDomain is a string
|
|
11
|
-
else if (typeof customDomain === "string") {
|
|
12
|
-
return buildDataForStringInput(scope, customDomain);
|
|
13
|
-
}
|
|
14
|
-
// customDomain.domainName is a string
|
|
15
|
-
else if (customDomain.domainName) {
|
|
16
|
-
return customDomain.isExternalDomain
|
|
17
|
-
? buildDataForExternalDomainInput(scope, customDomain)
|
|
18
|
-
: buildDataForInternalDomainInput(scope, customDomain);
|
|
19
|
-
}
|
|
20
|
-
// customDomain.domainName is a construct
|
|
21
|
-
else if (customDomain.cdk?.domainName) {
|
|
22
|
-
return buildDataForConstructInput(scope, customDomain);
|
|
23
|
-
}
|
|
24
|
-
// customDomain.domainName not exists
|
|
25
|
-
throw new Error(`Missing "domainName" in sst.Api's customDomain setting`);
|
|
26
|
-
}
|
|
27
|
-
function buildDataForStringInput(scope, customDomain) {
|
|
28
|
-
// validate: customDomain is a TOKEN string
|
|
29
|
-
// ie. imported SSM value: ssm.StringParameter.valueForStringParameter()
|
|
30
|
-
if (Token.isUnresolved(customDomain)) {
|
|
31
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
32
|
-
}
|
|
33
|
-
assertDomainNameIsLowerCase(customDomain);
|
|
34
|
-
const domainName = customDomain;
|
|
35
|
-
const hostedZoneDomain = parseRoute53Domain(domainName);
|
|
36
|
-
const hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
37
|
-
const certificate = createCertificate(scope, domainName, hostedZone);
|
|
38
|
-
const apigDomain = createApigDomain(scope, domainName, certificate);
|
|
39
|
-
createARecords(scope, hostedZone, domainName, apigDomain);
|
|
40
|
-
return {
|
|
41
|
-
apigDomain,
|
|
42
|
-
certificate,
|
|
43
|
-
isApigDomainCreated: true,
|
|
44
|
-
isCertificatedCreated: true,
|
|
45
|
-
url: buildDomainUrl(domainName),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function buildDataForInternalDomainInput(scope, customDomain) {
|
|
49
|
-
// If customDomain is a TOKEN string, "hostedZone" has to be passed in. This
|
|
50
|
-
// is because "hostedZone" cannot be parsed from a TOKEN value.
|
|
51
|
-
if (Token.isUnresolved(customDomain.domainName)) {
|
|
52
|
-
if (!customDomain.hostedZone && !customDomain.cdk?.hostedZone) {
|
|
53
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// If domain is not a token, ensure it is lower case
|
|
57
|
-
else {
|
|
58
|
-
assertDomainNameIsLowerCase(customDomain.domainName);
|
|
59
|
-
}
|
|
60
|
-
const domainName = customDomain.domainName;
|
|
61
|
-
// Lookup hosted zone
|
|
62
|
-
// Note: Allow user passing in `hostedZone` object. The use case is when
|
|
63
|
-
// there are multiple HostedZones with the same domain, but one is
|
|
64
|
-
// public, and one is private.
|
|
65
|
-
let hostedZone;
|
|
66
|
-
if (customDomain.hostedZone) {
|
|
67
|
-
const hostedZoneDomain = customDomain.hostedZone;
|
|
68
|
-
hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
69
|
-
}
|
|
70
|
-
else if (customDomain.cdk?.hostedZone) {
|
|
71
|
-
hostedZone = customDomain.cdk.hostedZone;
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
const hostedZoneDomain = parseRoute53Domain(domainName);
|
|
75
|
-
hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
76
|
-
}
|
|
77
|
-
// Create certificate
|
|
78
|
-
// Note: Allow user passing in `certificate` object. The use case is for
|
|
79
|
-
// user to create wildcard certificate or using an imported certificate.
|
|
80
|
-
let certificate;
|
|
81
|
-
let isCertificatedCreated;
|
|
82
|
-
if (customDomain.cdk?.certificate) {
|
|
83
|
-
certificate = customDomain.cdk.certificate;
|
|
84
|
-
isCertificatedCreated = false;
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
certificate = createCertificate(scope, domainName, hostedZone);
|
|
88
|
-
isCertificatedCreated = true;
|
|
89
|
-
}
|
|
90
|
-
const apigDomain = createApigDomain(scope, domainName, certificate);
|
|
91
|
-
const mappingKey = customDomain.path;
|
|
92
|
-
createARecords(scope, hostedZone, domainName, apigDomain);
|
|
93
|
-
return {
|
|
94
|
-
apigDomain,
|
|
95
|
-
mappingKey,
|
|
96
|
-
certificate,
|
|
97
|
-
isApigDomainCreated: true,
|
|
98
|
-
isCertificatedCreated,
|
|
99
|
-
url: buildDomainUrl(domainName, mappingKey),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function buildDataForExternalDomainInput(scope, customDomain) {
|
|
103
|
-
// if it is external, then a certificate is required
|
|
104
|
-
if (!customDomain.cdk?.certificate) {
|
|
105
|
-
throw new Error(`A valid certificate is required when "isExternalDomain" is set to "true".`);
|
|
106
|
-
}
|
|
107
|
-
// if it is external, then the hostedZone is not required
|
|
108
|
-
if (customDomain.hostedZone || customDomain.cdk?.hostedZone) {
|
|
109
|
-
throw new Error(`Hosted zones can only be configured for domains hosted on Amazon Route 53. Do not set the "hostedZone" when "isExternalDomain" is enabled.`);
|
|
110
|
-
}
|
|
111
|
-
// If domain is not a token, ensure it is lower case
|
|
112
|
-
if (!Token.isUnresolved(customDomain.domainName)) {
|
|
113
|
-
assertDomainNameIsLowerCase(customDomain.domainName);
|
|
114
|
-
}
|
|
115
|
-
const domainName = customDomain.domainName;
|
|
116
|
-
const certificate = customDomain.cdk.certificate;
|
|
117
|
-
const apigDomain = createApigDomain(scope, domainName, certificate);
|
|
118
|
-
const mappingKey = customDomain.path;
|
|
119
|
-
return {
|
|
120
|
-
apigDomain,
|
|
121
|
-
mappingKey,
|
|
122
|
-
certificate,
|
|
123
|
-
isApigDomainCreated: true,
|
|
124
|
-
isCertificatedCreated: false,
|
|
125
|
-
url: buildDomainUrl(domainName, mappingKey),
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
function buildDataForConstructInput(_scope, customDomain) {
|
|
129
|
-
// Allow user passing in `apigDomain` object. The use case is a user creates
|
|
130
|
-
// multiple API endpoints, and is mapping them under the same custom domain.
|
|
131
|
-
// `sst.Api` needs to expose the `apigDomain` construct created in the first
|
|
132
|
-
// Api, and lets user pass it in when creating the second Api.
|
|
133
|
-
if (customDomain.hostedZone || customDomain.cdk?.hostedZone) {
|
|
134
|
-
throw new Error(`Cannot configure the "hostedZone" when the "domainName" is a construct`);
|
|
135
|
-
}
|
|
136
|
-
if (customDomain.cdk?.certificate) {
|
|
137
|
-
throw new Error(`Cannot configure the "certificate" when the "domainName" is a construct`);
|
|
138
|
-
}
|
|
139
|
-
const apigDomain = customDomain.cdk?.domainName;
|
|
140
|
-
const domainName = apigDomain.name;
|
|
141
|
-
const mappingKey = customDomain.path;
|
|
142
|
-
return {
|
|
143
|
-
apigDomain,
|
|
144
|
-
mappingKey,
|
|
145
|
-
certificate: undefined,
|
|
146
|
-
isApigDomainCreated: false,
|
|
147
|
-
isCertificatedCreated: false,
|
|
148
|
-
url: buildDomainUrl(domainName, mappingKey),
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
function lookupHostedZone(scope, hostedZoneDomain) {
|
|
152
|
-
return route53.HostedZone.fromLookup(scope, "HostedZone", {
|
|
153
|
-
domainName: hostedZoneDomain,
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
function createCertificate(scope, domainName, hostedZone) {
|
|
157
|
-
return new acm.Certificate(scope, "Certificate", {
|
|
158
|
-
domainName,
|
|
159
|
-
validation: acm.CertificateValidation.fromDns(hostedZone),
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
function createApigDomain(scope, domainName, certificate) {
|
|
163
|
-
return new apig.DomainName(scope, "DomainName", {
|
|
164
|
-
domainName,
|
|
165
|
-
certificate,
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
function createARecords(scope, hostedZone, domainName, apigDomain) {
|
|
169
|
-
// create DNS record
|
|
170
|
-
const recordProps = {
|
|
171
|
-
recordName: domainName,
|
|
172
|
-
zone: hostedZone,
|
|
173
|
-
target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayv2DomainProperties(apigDomain.regionalDomainName, apigDomain.regionalHostedZoneId)),
|
|
174
|
-
};
|
|
175
|
-
const records = [
|
|
176
|
-
new route53.ARecord(scope, "AliasRecord", recordProps),
|
|
177
|
-
new route53.AaaaRecord(scope, "AliasRecordAAAA", recordProps),
|
|
178
|
-
];
|
|
179
|
-
// note: If domainName is a TOKEN string ie. ${TOKEN..}, the route53.ARecord
|
|
180
|
-
// construct will append ".${hostedZoneName}" to the end of the domain.
|
|
181
|
-
// This is because the construct tries to check if the record name
|
|
182
|
-
// ends with the domain name. If not, it will append the domain name.
|
|
183
|
-
// So, we need remove this behavior.
|
|
184
|
-
if (Token.isUnresolved(domainName)) {
|
|
185
|
-
records.forEach((record) => {
|
|
186
|
-
const cfnRecord = record.node.defaultChild;
|
|
187
|
-
cfnRecord.name = domainName;
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function buildDomainUrl(domainName, mappingKey) {
|
|
192
|
-
// Note: If mapping key is set, the URL needs a trailing slash. Without the
|
|
193
|
-
// trailing slash, the API fails with the error
|
|
194
|
-
// {"message":"Not Found"}
|
|
195
|
-
return mappingKey ? `${domainName}/${mappingKey}/` : domainName;
|
|
196
|
-
}
|
|
197
|
-
function assertDomainNameIsLowerCase(domainName) {
|
|
198
|
-
if (domainName !== domainName.toLowerCase()) {
|
|
199
|
-
throw new Error(`The domain name needs to be in lowercase`);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
function parseRoute53Domain(domainName) {
|
|
203
|
-
const parts = domainName.split(".");
|
|
204
|
-
// If the domain contains subdomain, ie. api.example.com,
|
|
205
|
-
// strip the subdomain and use the root domain, ie. example.com.
|
|
206
|
-
// Otherwise, use the domain as is.
|
|
207
|
-
return parts.length <= 2 ? domainName : parts.slice(1).join(".");
|
|
208
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import * as route53 from "aws-cdk-lib/aws-route53";
|
|
2
|
-
import * as acm from "aws-cdk-lib/aws-certificatemanager";
|
|
3
|
-
import { AppSyncApi } from "../AppSyncApi.js";
|
|
4
|
-
export interface CustomDomainProps {
|
|
5
|
-
/**
|
|
6
|
-
* The domain to be assigned to the API endpoint (ie. api.domain.com)
|
|
7
|
-
*/
|
|
8
|
-
domainName?: string;
|
|
9
|
-
/**
|
|
10
|
-
* The hosted zone in Route 53 that contains the domain. By default, SST will look for a hosted zone by stripping out the first part of the domainName that's passed in. So, if your domainName is api.domain.com. SST will default the hostedZone to domain.com.
|
|
11
|
-
*/
|
|
12
|
-
hostedZone?: string;
|
|
13
|
-
/**
|
|
14
|
-
* DNS record type for the Route 53 record associated with the custom domain. Default is CNAME.
|
|
15
|
-
* @default CNAME
|
|
16
|
-
*/
|
|
17
|
-
recordType?: "CNAME" | "A_AAAA";
|
|
18
|
-
/**
|
|
19
|
-
* Set this option if the domain is not hosted on Amazon Route 53.
|
|
20
|
-
*/
|
|
21
|
-
isExternalDomain?: boolean;
|
|
22
|
-
cdk?: {
|
|
23
|
-
/**
|
|
24
|
-
* Override the internally created hosted zone
|
|
25
|
-
*/
|
|
26
|
-
hostedZone?: route53.IHostedZone;
|
|
27
|
-
/**
|
|
28
|
-
* Override the internally created certificate
|
|
29
|
-
*/
|
|
30
|
-
certificate?: acm.ICertificate;
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
interface CustomDomainData {
|
|
34
|
-
certificate: acm.ICertificate;
|
|
35
|
-
domainName: string;
|
|
36
|
-
hostedZone?: route53.IHostedZone;
|
|
37
|
-
recordType?: CustomDomainProps["recordType"];
|
|
38
|
-
}
|
|
39
|
-
export declare function buildCustomDomainData(scope: AppSyncApi, customDomain: string | CustomDomainProps | undefined): CustomDomainData | undefined;
|
|
40
|
-
export declare function cleanup(scope: AppSyncApi, domainData: CustomDomainData): void;
|
|
41
|
-
export {};
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { Token } from "aws-cdk-lib/core";
|
|
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
|
-
export function buildCustomDomainData(scope, customDomain) {
|
|
6
|
-
if (customDomain === undefined) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
// customDomain is a string
|
|
10
|
-
else if (typeof customDomain === "string") {
|
|
11
|
-
return buildDataForStringInput(scope, customDomain);
|
|
12
|
-
}
|
|
13
|
-
// customDomain.domainName is a string
|
|
14
|
-
else if (customDomain.domainName) {
|
|
15
|
-
return customDomain.isExternalDomain
|
|
16
|
-
? buildDataForExternalDomainInput(scope, customDomain)
|
|
17
|
-
: buildDataForInternalDomainInput(scope, customDomain);
|
|
18
|
-
}
|
|
19
|
-
// customDomain.domainName not exists
|
|
20
|
-
throw new Error(`Missing "domainName" in sst.AppSyncApi's customDomain setting`);
|
|
21
|
-
}
|
|
22
|
-
export function cleanup(scope, domainData) {
|
|
23
|
-
const cfnDomainName = getCfnDomainName(scope);
|
|
24
|
-
const cfnDomainNameApiAssociation = getCfnDomainNameApiAssociation(scope);
|
|
25
|
-
if (domainData.hostedZone) {
|
|
26
|
-
createRecords(scope, domainData.domainName, domainData.hostedZone, domainData.recordType, cfnDomainName);
|
|
27
|
-
}
|
|
28
|
-
fixDomainResourceDependencies(cfnDomainName, cfnDomainNameApiAssociation);
|
|
29
|
-
}
|
|
30
|
-
function buildDataForStringInput(scope, customDomain) {
|
|
31
|
-
// validate: customDomain is a TOKEN string
|
|
32
|
-
// ie. imported SSM value: ssm.StringParameter.valueForStringParameter()
|
|
33
|
-
if (Token.isUnresolved(customDomain)) {
|
|
34
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
35
|
-
}
|
|
36
|
-
assertDomainNameIsLowerCase(customDomain);
|
|
37
|
-
const domainName = customDomain;
|
|
38
|
-
const hostedZoneDomain = domainName.split(".").slice(1).join(".");
|
|
39
|
-
const hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
40
|
-
const certificate = createCertificate(scope, domainName, hostedZone);
|
|
41
|
-
return {
|
|
42
|
-
certificate,
|
|
43
|
-
domainName,
|
|
44
|
-
hostedZone,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
function buildDataForInternalDomainInput(scope, customDomain) {
|
|
48
|
-
// If customDomain is a TOKEN string, "hostedZone" has to be passed in. This
|
|
49
|
-
// is because "hostedZone" cannot be parsed from a TOKEN value.
|
|
50
|
-
if (Token.isUnresolved(customDomain.domainName)) {
|
|
51
|
-
if (!customDomain.hostedZone) {
|
|
52
|
-
throw new Error(`You also need to specify the "hostedZone" if the "domainName" is passed in as a reference.`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
assertDomainNameIsLowerCase(customDomain.domainName);
|
|
57
|
-
}
|
|
58
|
-
const domainName = customDomain.domainName;
|
|
59
|
-
// Lookup hosted zone
|
|
60
|
-
// Note: Allow user passing in `hostedZone` object. The use case is when
|
|
61
|
-
// there are multiple HostedZones with the same domain, but one is
|
|
62
|
-
// public, and one is private.
|
|
63
|
-
let hostedZone;
|
|
64
|
-
if (customDomain.hostedZone) {
|
|
65
|
-
const hostedZoneDomain = customDomain.hostedZone;
|
|
66
|
-
hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
67
|
-
}
|
|
68
|
-
else if (customDomain.cdk?.hostedZone) {
|
|
69
|
-
hostedZone = customDomain.cdk.hostedZone;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
const hostedZoneDomain = domainName.split(".").slice(1).join(".");
|
|
73
|
-
hostedZone = lookupHostedZone(scope, hostedZoneDomain);
|
|
74
|
-
}
|
|
75
|
-
// Create certificate
|
|
76
|
-
// Note: Allow user passing in `certificate` object. The use case is for
|
|
77
|
-
// user to create wildcard certificate or using an imported certificate.
|
|
78
|
-
const certificate = customDomain.cdk?.certificate
|
|
79
|
-
? customDomain.cdk.certificate
|
|
80
|
-
: createCertificate(scope, domainName, hostedZone);
|
|
81
|
-
return {
|
|
82
|
-
certificate,
|
|
83
|
-
domainName,
|
|
84
|
-
hostedZone,
|
|
85
|
-
recordType: customDomain.recordType,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
function buildDataForExternalDomainInput(_scope, customDomain) {
|
|
89
|
-
// if it is external, then a certificate is required
|
|
90
|
-
if (!customDomain.cdk?.certificate) {
|
|
91
|
-
throw new Error(`A valid certificate is required when "isExternalDomain" is set to "true".`);
|
|
92
|
-
}
|
|
93
|
-
// if it is external, then the hostedZone is not required
|
|
94
|
-
if (customDomain.hostedZone || customDomain.cdk?.hostedZone) {
|
|
95
|
-
throw new Error(`Hosted zones can only be configured for domains hosted on Amazon Route 53. Do not set the "hostedZone" when "isExternalDomain" is enabled.`);
|
|
96
|
-
}
|
|
97
|
-
const domainName = customDomain.domainName;
|
|
98
|
-
assertDomainNameIsLowerCase(domainName);
|
|
99
|
-
const certificate = customDomain.cdk.certificate;
|
|
100
|
-
return {
|
|
101
|
-
certificate,
|
|
102
|
-
domainName,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
function lookupHostedZone(scope, hostedZoneDomain) {
|
|
106
|
-
return route53.HostedZone.fromLookup(scope, "HostedZone", {
|
|
107
|
-
domainName: hostedZoneDomain,
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
function createCertificate(scope, domainName, hostedZone) {
|
|
111
|
-
return new acm.Certificate(scope, "Certificate", {
|
|
112
|
-
domainName,
|
|
113
|
-
validation: acm.CertificateValidation.fromDns(hostedZone),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
function createRecords(scope, domainName, hostedZone, recordType, cfnDomainName) {
|
|
117
|
-
// create DNS record
|
|
118
|
-
const aRecordProps = {
|
|
119
|
-
recordName: domainName,
|
|
120
|
-
zone: hostedZone,
|
|
121
|
-
target: route53.RecordTarget.fromAlias({
|
|
122
|
-
bind() {
|
|
123
|
-
return {
|
|
124
|
-
hostedZoneId: route53Targets.CloudFrontTarget.CLOUDFRONT_ZONE_ID,
|
|
125
|
-
dnsName: cfnDomainName.attrAppSyncDomainName,
|
|
126
|
-
};
|
|
127
|
-
},
|
|
128
|
-
}),
|
|
129
|
-
};
|
|
130
|
-
const records = (recordType || "CNAME") === "CNAME"
|
|
131
|
-
? [
|
|
132
|
-
new route53.CnameRecord(scope, "CnameRecord", {
|
|
133
|
-
recordName: domainName,
|
|
134
|
-
zone: hostedZone,
|
|
135
|
-
domainName: cfnDomainName.attrAppSyncDomainName,
|
|
136
|
-
}),
|
|
137
|
-
]
|
|
138
|
-
: [
|
|
139
|
-
new route53.ARecord(scope, "AliasRecord", aRecordProps),
|
|
140
|
-
new route53.AaaaRecord(scope, "AliasRecordAAAA", aRecordProps),
|
|
141
|
-
];
|
|
142
|
-
// note: If domainName is a TOKEN string ie. ${TOKEN..}, the route53.ARecord
|
|
143
|
-
// construct will append ".${hostedZoneName}" to the end of the domain.
|
|
144
|
-
// This is because the construct tries to check if the record name
|
|
145
|
-
// ends with the domain name. If not, it will append the domain name.
|
|
146
|
-
// So, we need remove this behavior.
|
|
147
|
-
if (Token.isUnresolved(domainName)) {
|
|
148
|
-
records.forEach((record) => {
|
|
149
|
-
const cfnRecord = record.node.defaultChild;
|
|
150
|
-
cfnRecord.name = domainName;
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
function getCfnDomainName(scope) {
|
|
155
|
-
return scope.cdk.graphqlApi.node.children.find((child) => child.cfnResourceType === "AWS::AppSync::DomainName");
|
|
156
|
-
}
|
|
157
|
-
function getCfnDomainNameApiAssociation(scope) {
|
|
158
|
-
return scope.cdk.graphqlApi.node.children.find((child) => child.cfnResourceType ===
|
|
159
|
-
"AWS::AppSync::DomainNameApiAssociation");
|
|
160
|
-
}
|
|
161
|
-
function fixDomainResourceDependencies(cfnDomainName, cfnDomainNameApiAssociation) {
|
|
162
|
-
// note: As of CDK 2.20.0, the "AWS::AppSync::DomainNameApiAssociation" resource
|
|
163
|
-
// is not dependent on the "AWS::AppSync::DomainName" resource. This leads
|
|
164
|
-
// CloudFormation deploy error if DomainNameApiAssociation is created before
|
|
165
|
-
// DomainName is created.
|
|
166
|
-
// https://github.com/aws/aws-cdk/issues/18395#issuecomment-1099455502
|
|
167
|
-
// To workaround this issue, we need to add a dependency manually.
|
|
168
|
-
if (cfnDomainName && cfnDomainNameApiAssociation) {
|
|
169
|
-
cfnDomainNameApiAssociation.node.addDependency(cfnDomainName);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
function assertDomainNameIsLowerCase(domainName) {
|
|
173
|
-
if (domainName !== domainName.toLowerCase()) {
|
|
174
|
-
throw new Error(`The domain name needs to be in lowercase`);
|
|
175
|
-
}
|
|
176
|
-
}
|