@openstax/ts-utils 1.33.1 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cfnlintrc +2 -0
- package/.github/CODEOWNERS +1 -0
- package/.github/workflows/ci.yml +36 -0
- package/.github/workflows/lint.yml +55 -0
- package/.nvmrc +1 -0
- package/.syncignore +4 -0
- package/.syncpackrc +18 -0
- package/CONTRIBUTING.md +96 -0
- package/LICENSE +661 -0
- package/Procfile +1 -0
- package/README.md +62 -90
- package/app.json +23 -0
- package/cspell.json +32 -0
- package/deploy/constants.env +21 -0
- package/deploy/deploy.bash +157 -0
- package/deploy/deployment-alt-region.cfn.yml +70 -0
- package/deploy/deployment.cfn.yml +650 -0
- package/deploy/destroy-deployment.bash +23 -0
- package/deploy/shared.cfn.yml +94 -0
- package/docs/lambda-build.md +35 -0
- package/package.json +12 -228
- package/packages/frontend/README.md +46 -0
- package/packages/frontend/package.json +101 -0
- package/packages/frontend/public/favicon.ico +0 -0
- package/packages/frontend/public/index.html +107 -0
- package/packages/frontend/public/maintenance.html +59 -0
- package/packages/frontend/public/manifest.json +15 -0
- package/packages/frontend/public/robots.txt +3 -0
- package/packages/frontend/script/make-certificate.bash +49 -0
- package/packages/frontend/script/server/cli.js +11 -0
- package/packages/frontend/script/server/index.js +47 -0
- package/packages/frontend/script/start.bash +22 -0
- package/packages/frontend/script/trust-localhost.bash +7 -0
- package/packages/frontend/src/auth/authProvider.ts +10 -0
- package/packages/frontend/src/auth/useAuth.ts +33 -0
- package/packages/frontend/src/components/Pagination.tsx +26 -0
- package/packages/frontend/src/configProvider/index.ts +53 -0
- package/packages/frontend/src/configProvider/use.ts +41 -0
- package/packages/frontend/src/core/context/services.spec.tsx +39 -0
- package/packages/frontend/src/core/context/services.tsx +16 -0
- package/packages/frontend/src/core/index.spec.ts +7 -0
- package/packages/frontend/src/core/index.ts +20 -0
- package/packages/frontend/src/core/services.tsx +14 -0
- package/packages/frontend/src/core/types.ts +3 -0
- package/packages/frontend/src/example/api.ts +28 -0
- package/packages/frontend/src/example/components/Layout.tsx +23 -0
- package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
- package/packages/frontend/src/example/screens/Home.tsx +78 -0
- package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
- package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
- package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
- package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
- package/packages/frontend/src/example/screens/index.ts +9 -0
- package/packages/frontend/src/index.css +159 -0
- package/packages/frontend/src/index.tsx +67 -0
- package/packages/frontend/src/react-app-env.d.ts +1 -0
- package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
- package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
- package/packages/frontend/src/routing/middleware.ts +6 -0
- package/packages/frontend/src/routing/useQuery.ts +14 -0
- package/packages/frontend/src/setupProxy.js +19 -0
- package/packages/frontend/src/setupTests.ts +9 -0
- package/packages/frontend/src/tests/testServices.tsx +23 -0
- package/packages/frontend/tsconfig.json +27 -0
- package/packages/lambda/.eslintrc.js +64 -0
- package/packages/lambda/jest-global-setup.js +3 -0
- package/packages/lambda/jest-setup-after-env.js +1 -0
- package/packages/lambda/jest.config.js +31 -0
- package/packages/lambda/jest.resolver.js +17 -0
- package/packages/lambda/package.json +68 -0
- package/packages/lambda/script/build.bash +19 -0
- package/packages/lambda/script/bundle-functions.bash +10 -0
- package/packages/lambda/script/lambdaLocalProxy.js +16 -0
- package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
- package/packages/lambda/script/utils/getRouteData.ts +7 -0
- package/packages/lambda/script/utils/routeDataLoader.js +8 -0
- package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
- package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
- package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
- package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
- package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
- package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
- package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
- package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
- package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
- package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
- package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
- package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
- package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
- package/packages/lambda/tsconfig.json +30 -0
- package/packages/lambda/webpack.config.js +97 -0
- package/packages/utils/.eslintrc.js +64 -0
- package/packages/utils/README.md +118 -0
- package/packages/utils/jest-global-setup.js +3 -0
- package/packages/utils/jest.config.js +25 -0
- package/packages/utils/jest.resolver.js +17 -0
- package/packages/utils/package.json +238 -0
- package/packages/utils/src/assertions/index.spec.ts +126 -0
- package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
- package/packages/utils/src/aws/ssmService.ts +7 -0
- package/packages/utils/src/config/awsParameterConfig.ts +24 -0
- package/packages/utils/src/config/envConfig.ts +58 -0
- package/packages/utils/src/config/index.spec.ts +165 -0
- package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
- package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
- package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
- package/packages/utils/src/config/resolveConfigValue.ts +10 -0
- package/packages/utils/src/errors/index.spec.ts +35 -0
- package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
- package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
- package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
- package/packages/utils/src/fetch/index.spec.ts +34 -0
- package/packages/utils/src/fetch/index.ts +87 -0
- package/packages/utils/src/guards/index.spec.ts +58 -0
- package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
- package/packages/utils/src/index.spec.ts +471 -0
- package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
- package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
- package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
- package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
- package/packages/utils/src/middleware/index.spec.ts +99 -0
- package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
- package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
- package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
- package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
- package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
- package/packages/utils/src/misc/hashValue.ts +18 -0
- package/packages/utils/src/misc/helpers.ts +259 -0
- package/packages/utils/src/misc/merge.ts +48 -0
- package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
- package/packages/utils/src/pagination/index.spec.ts +150 -0
- package/packages/utils/src/pagination/index.ts +117 -0
- package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
- package/packages/utils/src/routing/index.spec.ts +553 -0
- package/packages/utils/src/routing/index.ts +424 -0
- package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
- package/packages/utils/src/routing/validators/zod.ts +14 -0
- package/packages/utils/src/services/accountsGateway/README.md +3 -0
- package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
- package/packages/utils/src/services/accountsGateway/index.ts +251 -0
- package/packages/utils/src/services/apiGateway/README.md +93 -0
- package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
- package/packages/utils/src/services/apiGateway/index.ts +189 -0
- package/packages/utils/src/services/authProvider/README.md +21 -0
- package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
- package/packages/utils/src/services/authProvider/browser.ts +209 -0
- package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
- package/packages/utils/src/services/authProvider/decryption.ts +98 -0
- package/packages/utils/src/services/authProvider/index.ts +93 -0
- package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
- package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
- package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
- package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
- package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
- package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
- package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
- package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
- package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
- package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
- package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
- package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
- package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
- package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
- package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
- package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
- package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
- package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
- package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
- package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
- package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
- package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
- package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
- package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
- package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
- package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
- package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
- package/packages/utils/src/services/exercisesGateway/README.md +5 -0
- package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
- package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
- package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
- package/packages/utils/src/services/fileServer/index.ts +43 -0
- package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
- package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
- package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
- package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
- package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
- package/packages/utils/src/services/launchParams/signer.ts +73 -0
- package/packages/utils/src/services/launchParams/verifier.ts +120 -0
- package/packages/utils/src/services/logger/console.spec.ts +29 -0
- package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
- package/packages/utils/src/services/logger/index.spec.ts +65 -0
- package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
- package/packages/utils/src/services/lrsGateway/README.md +5 -0
- package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
- package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
- package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
- package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
- package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
- package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
- package/packages/utils/src/services/lrsGateway/index.ts +257 -0
- package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
- package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
- package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
- package/packages/utils/src/services/postgresConnection/index.ts +84 -0
- package/packages/utils/src/services/searchProvider/README.md +3 -0
- package/packages/utils/src/services/searchProvider/index.ts +59 -0
- package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
- package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
- package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
- package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
- package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
- package/packages/utils/tsconfig.json +31 -0
- package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
- package/packages/utils/tsconfig.without-specs.esm.json +7 -0
- package/packages/utils/tsconfig.without-specs.json +6 -0
- package/scripts/build.bash +24 -0
- package/scripts/ci.bash +10 -0
- package/scripts/start.bash +29 -0
- package/dist/cjs/assertions/index.d.ts +0 -89
- package/dist/cjs/assertions/index.js +0 -157
- package/dist/cjs/aws/ssmService.d.ts +0 -5
- package/dist/cjs/aws/ssmService.js +0 -9
- package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
- package/dist/cjs/config/awsParameterConfig.js +0 -26
- package/dist/cjs/config/envConfig.d.ts +0 -24
- package/dist/cjs/config/envConfig.js +0 -57
- package/dist/cjs/config/index.d.ts +0 -48
- package/dist/cjs/config/index.js +0 -35
- package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
- package/dist/cjs/config/lambdaParameterConfig.js +0 -45
- package/dist/cjs/config/replaceConfig.d.ts +0 -14
- package/dist/cjs/config/replaceConfig.js +0 -22
- package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
- package/dist/cjs/config/resolveConfigValue.js +0 -12
- package/dist/cjs/errors/index.d.ts +0 -88
- package/dist/cjs/errors/index.js +0 -123
- package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
- package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
- package/dist/cjs/fetch/index.d.ts +0 -64
- package/dist/cjs/fetch/index.js +0 -55
- package/dist/cjs/guards/index.d.ts +0 -38
- package/dist/cjs/guards/index.js +0 -44
- package/dist/cjs/index.js +0 -20
- package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
- package/dist/cjs/middleware/apiErrorHandler.js +0 -42
- package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
- package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
- package/dist/cjs/middleware/index.js +0 -48
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
- package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
- package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
- package/dist/cjs/misc/hashValue.d.ts +0 -10
- package/dist/cjs/misc/hashValue.js +0 -17
- package/dist/cjs/misc/helpers.d.ts +0 -124
- package/dist/cjs/misc/helpers.js +0 -214
- package/dist/cjs/misc/merge.d.ts +0 -21
- package/dist/cjs/misc/merge.js +0 -45
- package/dist/cjs/misc/partitionSequence.d.ts +0 -35
- package/dist/cjs/misc/partitionSequence.js +0 -55
- package/dist/cjs/pagination/index.d.ts +0 -91
- package/dist/cjs/pagination/index.js +0 -83
- package/dist/cjs/routing/helpers.d.ts +0 -57
- package/dist/cjs/routing/helpers.js +0 -90
- package/dist/cjs/routing/index.d.ts +0 -290
- package/dist/cjs/routing/index.js +0 -295
- package/dist/cjs/routing/validators/zod.d.ts +0 -4
- package/dist/cjs/routing/validators/zod.js +0 -14
- package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
- package/dist/cjs/services/accountsGateway/index.js +0 -138
- package/dist/cjs/services/apiGateway/index.d.ts +0 -68
- package/dist/cjs/services/apiGateway/index.js +0 -118
- package/dist/cjs/services/authProvider/browser.d.ts +0 -40
- package/dist/cjs/services/authProvider/browser.js +0 -155
- package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
- package/dist/cjs/services/authProvider/decryption.js +0 -73
- package/dist/cjs/services/authProvider/index.d.ts +0 -63
- package/dist/cjs/services/authProvider/index.js +0 -34
- package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
- package/dist/cjs/services/authProvider/subrequest.js +0 -49
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
- package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
- package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
- package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
- package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
- package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
- package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
- package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
- package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
- package/dist/cjs/services/documentStore/index.js +0 -2
- package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
- package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
- package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
- package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
- package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
- package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
- package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
- package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
- package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
- package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
- package/dist/cjs/services/documentStore/versioned/index.js +0 -2
- package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
- package/dist/cjs/services/exercisesGateway/index.js +0 -107
- package/dist/cjs/services/fileServer/index.d.ts +0 -30
- package/dist/cjs/services/fileServer/index.js +0 -19
- package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
- package/dist/cjs/services/fileServer/localFileServer.js +0 -132
- package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
- package/dist/cjs/services/fileServer/s3FileServer.js +0 -132
- package/dist/cjs/services/launchParams/index.js +0 -7
- package/dist/cjs/services/launchParams/signer.d.ts +0 -23
- package/dist/cjs/services/launchParams/signer.js +0 -58
- package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
- package/dist/cjs/services/launchParams/verifier.js +0 -129
- package/dist/cjs/services/logger/console.d.ts +0 -4
- package/dist/cjs/services/logger/console.js +0 -12
- package/dist/cjs/services/logger/index.d.ts +0 -39
- package/dist/cjs/services/logger/index.js +0 -31
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
- package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
- package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
- package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
- package/dist/cjs/services/lrsGateway/file-system.js +0 -150
- package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
- package/dist/cjs/services/lrsGateway/index.js +0 -148
- package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
- package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
- package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
- package/dist/cjs/services/postgresConnection/index.js +0 -65
- package/dist/cjs/services/searchProvider/index.d.ts +0 -67
- package/dist/cjs/services/searchProvider/index.js +0 -2
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
- package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
- package/dist/cjs/services/searchProvider/openSearch.js +0 -154
- package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
- package/dist/cjs/types.d.ts +0 -31
- package/dist/cjs/types.js +0 -2
- package/dist/esm/assertions/index.d.ts +0 -89
- package/dist/esm/aws/ssmService.d.ts +0 -5
- package/dist/esm/aws/ssmService.js +0 -6
- package/dist/esm/config/awsParameterConfig.d.ts +0 -10
- package/dist/esm/config/awsParameterConfig.js +0 -22
- package/dist/esm/config/envConfig.d.ts +0 -24
- package/dist/esm/config/envConfig.js +0 -53
- package/dist/esm/config/index.js +0 -17
- package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
- package/dist/esm/config/lambdaParameterConfig.js +0 -38
- package/dist/esm/config/replaceConfig.d.ts +0 -14
- package/dist/esm/config/resolveConfigValue.d.ts +0 -5
- package/dist/esm/config/resolveConfigValue.js +0 -8
- package/dist/esm/errors/index.d.ts +0 -88
- package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
- package/dist/esm/fetch/fetchStatusRetry.js +0 -23
- package/dist/esm/fetch/index.d.ts +0 -64
- package/dist/esm/fetch/index.js +0 -46
- package/dist/esm/guards/index.js +0 -36
- package/dist/esm/index.d.ts +0 -4
- package/dist/esm/index.js +0 -4
- package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
- package/dist/esm/middleware/apiErrorHandler.js +0 -38
- package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
- package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
- package/dist/esm/middleware/index.d.ts +0 -47
- package/dist/esm/middleware/index.js +0 -44
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
- package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
- package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
- package/dist/esm/misc/hashValue.d.ts +0 -10
- package/dist/esm/misc/hashValue.js +0 -13
- package/dist/esm/misc/helpers.d.ts +0 -124
- package/dist/esm/misc/helpers.js +0 -199
- package/dist/esm/misc/merge.d.ts +0 -21
- package/dist/esm/misc/merge.js +0 -40
- package/dist/esm/misc/partitionSequence.d.ts +0 -35
- package/dist/esm/pagination/index.d.ts +0 -91
- package/dist/esm/pagination/index.js +0 -77
- package/dist/esm/routing/helpers.d.ts +0 -57
- package/dist/esm/routing/index.d.ts +0 -290
- package/dist/esm/routing/index.js +0 -246
- package/dist/esm/routing/validators/zod.d.ts +0 -4
- package/dist/esm/routing/validators/zod.js +0 -10
- package/dist/esm/services/accountsGateway/index.d.ts +0 -92
- package/dist/esm/services/accountsGateway/index.js +0 -131
- package/dist/esm/services/apiGateway/index.d.ts +0 -68
- package/dist/esm/services/apiGateway/index.js +0 -77
- package/dist/esm/services/authProvider/browser.d.ts +0 -40
- package/dist/esm/services/authProvider/browser.js +0 -151
- package/dist/esm/services/authProvider/decryption.d.ts +0 -19
- package/dist/esm/services/authProvider/decryption.js +0 -69
- package/dist/esm/services/authProvider/index.d.ts +0 -63
- package/dist/esm/services/authProvider/index.js +0 -26
- package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
- package/dist/esm/services/authProvider/subrequest.js +0 -45
- package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
- package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
- package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
- package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
- package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
- package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
- package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
- package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
- package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
- package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
- package/dist/esm/services/documentStore/index.d.ts +0 -14
- package/dist/esm/services/documentStore/index.js +0 -1
- package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
- package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
- package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
- package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
- package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
- package/dist/esm/services/documentStore/unversioned/index.js +0 -1
- package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
- package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
- package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
- package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
- package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
- package/dist/esm/services/documentStore/versioned/index.js +0 -1
- package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
- package/dist/esm/services/exercisesGateway/index.js +0 -70
- package/dist/esm/services/fileServer/index.d.ts +0 -30
- package/dist/esm/services/fileServer/index.js +0 -13
- package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
- package/dist/esm/services/fileServer/localFileServer.js +0 -125
- package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
- package/dist/esm/services/fileServer/s3FileServer.js +0 -125
- package/dist/esm/services/launchParams/index.d.ts +0 -2
- package/dist/esm/services/launchParams/index.js +0 -2
- package/dist/esm/services/launchParams/signer.d.ts +0 -23
- package/dist/esm/services/launchParams/signer.js +0 -51
- package/dist/esm/services/launchParams/verifier.d.ts +0 -21
- package/dist/esm/services/launchParams/verifier.js +0 -92
- package/dist/esm/services/logger/console.d.ts +0 -4
- package/dist/esm/services/logger/index.js +0 -27
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
- package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
- package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
- package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
- package/dist/esm/services/lrsGateway/file-system.js +0 -110
- package/dist/esm/services/lrsGateway/index.d.ts +0 -122
- package/dist/esm/services/lrsGateway/index.js +0 -111
- package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
- package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
- package/dist/esm/services/postgresConnection/index.d.ts +0 -28
- package/dist/esm/services/postgresConnection/index.js +0 -58
- package/dist/esm/services/searchProvider/index.d.ts +0 -67
- package/dist/esm/services/searchProvider/index.js +0 -1
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
- package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
- package/dist/esm/services/searchProvider/openSearch.js +0 -150
- package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
- package/dist/esm/types.js +0 -1
- package/script/bin/.init-params-script.bash.swp +0 -0
- /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
- /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
- /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
- /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
- /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
- /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
- /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
- /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
- /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
- /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
- /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
- /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
- /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
- /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
- /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
- /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
- /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
- /package/{script → packages/utils/script}/bin/which.bash +0 -0
- /package/{script → packages/utils/script}/bin-entry.bash +0 -0
- /package/{script → packages/utils/script}/build.bash +0 -0
- /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
- /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.requestPayloadProvider = exports.unsafePayloadValidator = exports.getRequestBody = exports.getHeader = void 0;
|
|
4
|
-
const assertions_1 = require("../assertions");
|
|
5
|
-
const errors_1 = require("../errors");
|
|
6
|
-
const guards_1 = require("../guards");
|
|
7
|
-
/**
|
|
8
|
-
* Get the value of a header, case insensitive; note if there are multiple headers of the same
|
|
9
|
-
* value, this only returns the first value
|
|
10
|
-
*
|
|
11
|
-
* @param headers
|
|
12
|
-
* @param name the name of the header, case ignored
|
|
13
|
-
*/
|
|
14
|
-
const getHeader = (headers, name) => {
|
|
15
|
-
const key = Object.keys(headers).find(header => header.toLowerCase() === name.toLowerCase());
|
|
16
|
-
const value = key ? headers[key] : undefined;
|
|
17
|
-
return value instanceof Array
|
|
18
|
-
? value[0]
|
|
19
|
-
: value;
|
|
20
|
-
};
|
|
21
|
-
exports.getHeader = getHeader;
|
|
22
|
-
/**
|
|
23
|
-
* Gets the body of a request
|
|
24
|
-
* @param request
|
|
25
|
-
* @throws InvalidRequestError if the content type is not application/json or not parsable
|
|
26
|
-
*/
|
|
27
|
-
const getRequestBody = (request) => {
|
|
28
|
-
if ((0, exports.getHeader)(request.headers, 'content-type') !== 'application/json') {
|
|
29
|
-
throw new errors_1.InvalidRequestError('unknown content type: ' + (0, exports.getHeader)(request.headers, 'content-type'));
|
|
30
|
-
}
|
|
31
|
-
if (!request.body) {
|
|
32
|
-
return {};
|
|
33
|
-
}
|
|
34
|
-
try {
|
|
35
|
-
return JSON.parse(request.body);
|
|
36
|
-
}
|
|
37
|
-
catch (error) {
|
|
38
|
-
// Since the body is provided by the user, invalid JSON in the body is an invalid request
|
|
39
|
-
// We return the message which tells them why the JSON is invalid, but no backtrace
|
|
40
|
-
throw new errors_1.InvalidRequestError((0, assertions_1.assertErrorInstanceOf)(error, SyntaxError).message);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
exports.getRequestBody = getRequestBody;
|
|
44
|
-
/* utils and middleware for loading request payload (must follow this pattern for `PayloadForRoute` to work) */
|
|
45
|
-
/**
|
|
46
|
-
* stub validator because writing validators is annoying
|
|
47
|
-
*/
|
|
48
|
-
const unsafePayloadValidator = () => (input) => {
|
|
49
|
-
return (0, guards_1.isPlainObject)(input) && Object.keys(input).length > 0;
|
|
50
|
-
};
|
|
51
|
-
exports.unsafePayloadValidator = unsafePayloadValidator;
|
|
52
|
-
/**
|
|
53
|
-
* Middleware that validates the request payload and adds it to the middleware (with key `payload`)
|
|
54
|
-
* so it can be accessed downstream.
|
|
55
|
-
*
|
|
56
|
-
* This middleware accomplishes a few things:
|
|
57
|
-
* - establishes type of payload for route body logic
|
|
58
|
-
* - validates the payload for route logic
|
|
59
|
-
* - establishes type of payload for client logic calling this route
|
|
60
|
-
*
|
|
61
|
-
* @param validator a guard function that takes the request payload and returns true if it is valid,
|
|
62
|
-
* narrowing the type of the payload to the correct type
|
|
63
|
-
* @throws InvalidRequestError if the payload is not valid
|
|
64
|
-
*
|
|
65
|
-
* @example
|
|
66
|
-
* export const exampleRoute = createRoute({
|
|
67
|
-
* name: 'exampleRoute', method: METHOD.POST, path: '/example/:id',
|
|
68
|
-
* requestServiceProvider: composeServiceMiddleware(
|
|
69
|
-
* // here we are adding to previously composed middleware
|
|
70
|
-
* requestServiceProvider,
|
|
71
|
-
* requestPayloadProvider(validatePayload)
|
|
72
|
-
* )},
|
|
73
|
-
* async(params: {id: string}, services) => {
|
|
74
|
-
* const result = await services.myDocumentStore.putItem({
|
|
75
|
-
* ...services.payload,
|
|
76
|
-
* id: params.id,
|
|
77
|
-
* });
|
|
78
|
-
* return apiJsonResponse(201, result);
|
|
79
|
-
* }
|
|
80
|
-
* );
|
|
81
|
-
*/
|
|
82
|
-
const requestPayloadProvider = (validator) => () => (requestServices) => {
|
|
83
|
-
const payload = (0, exports.getRequestBody)(requestServices.request);
|
|
84
|
-
// for more precise error messages, throw your own InvalidRequestError from your validator function
|
|
85
|
-
if (!validator(payload)) {
|
|
86
|
-
throw new errors_1.InvalidRequestError();
|
|
87
|
-
}
|
|
88
|
-
return { ...requestServices, payload };
|
|
89
|
-
};
|
|
90
|
-
exports.requestPayloadProvider = requestPayloadProvider;
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
import { Logger } from '../services/logger';
|
|
2
|
-
/** HTTP query parameters */
|
|
3
|
-
export type QueryParams = Record<string, string | undefined | string[] | null>;
|
|
4
|
-
/**
|
|
5
|
-
* The type for a map of string substitutions to use when building route paths, e.g. a route may
|
|
6
|
-
* be defined as `'/api/:id'` and then rendered as `'/api/123'` when the `id` route param is set
|
|
7
|
-
* to `'123'`
|
|
8
|
-
*/
|
|
9
|
-
export type RouteParams = {
|
|
10
|
-
[key: string]: string;
|
|
11
|
-
};
|
|
12
|
-
/** A type that is compatible with any `Route` type */
|
|
13
|
-
export type AnyRoute<R> = R extends Route<infer N, infer P, infer Sa, infer Sr, infer Ri, infer Ro> ? Route<N, P, Sa, Sr, Ri, Ro> : never;
|
|
14
|
-
export type AnySpecificRoute<R, Sa, Ri, Ro> = R extends Route<infer N, infer P, Sa, infer Sr, Ri, Ro> & infer E ? Route<N, P, Sa, Sr, Ri, Ro> & E : never;
|
|
15
|
-
/** The inferred "route output" (`Ro`) type for a given route */
|
|
16
|
-
export type OutputForRoute<R> = R extends Route<any, any, any, any, any, infer Ro> ? Ro : never;
|
|
17
|
-
/** The inferred type for the params of the provided route type, `R`; may be undefined */
|
|
18
|
-
export type ParamsForRoute<R> = R extends Route<any, infer P, any, any, any, any> ? P : never;
|
|
19
|
-
/** The inferred type for the request services of the provided route type, `R`. */
|
|
20
|
-
export type RequestServicesForRoute<R> = R extends Route<any, any, any, infer Sr, any, any> ? Sr : never;
|
|
21
|
-
/** The type for the params of the provided route type, `R`; will be `{}` if undefined */
|
|
22
|
-
export type ParamsForRouteOrEmpty<R> = ParamsForRoute<R> extends undefined ? {} : Exclude<ParamsForRoute<R>, undefined>;
|
|
23
|
-
/** derives the route match type for this route, which includes the route itself and the matching params. */
|
|
24
|
-
export type RouteMatchRecord<R> = R extends AnyRoute<R> ? {
|
|
25
|
-
route: R;
|
|
26
|
-
params: ParamsForRoute<R>;
|
|
27
|
-
} : never;
|
|
28
|
-
type Flatten<T> = T extends any ? {
|
|
29
|
-
[K in keyof T]: T[K];
|
|
30
|
-
} : never;
|
|
31
|
-
export type ExternalRoute<R> = R extends Route<infer N, infer P, infer Sa, infer Sr, infer Ri, infer Ro> & infer E ? Route<N, P, Sa, Sr extends {
|
|
32
|
-
payload: any;
|
|
33
|
-
} ? Flatten<Pick<Sr, 'payload'>> : Record<string, never>, Ri, Ro> & Flatten<Omit<E, 'name' | 'path' | 'handler' | 'requestServiceProvider'>> : never;
|
|
34
|
-
/** this utility simplifies the route type to remove stuff that is only
|
|
35
|
-
* relevant internal to the route, like the service types, keeping only
|
|
36
|
-
* the payload type which is necessary for the apiGateway
|
|
37
|
-
*
|
|
38
|
-
* this helps avoid the "type too complicated" error that typescript throws
|
|
39
|
-
* when there are a lot of routes with complex services
|
|
40
|
-
**/
|
|
41
|
-
export declare const routesList: <R>(routes: R[]) => ExternalRoute<R>[];
|
|
42
|
-
/**
|
|
43
|
-
* The conditional type for the payload for a given route, `R`. This isn't a route structure, its
|
|
44
|
-
* a convention based on the request middleware
|
|
45
|
-
*/
|
|
46
|
-
export type PayloadForRoute<R> = RequestServicesForRoute<R> extends {
|
|
47
|
-
payload: any;
|
|
48
|
-
} ? RequestServicesForRoute<R>['payload'] : undefined;
|
|
49
|
-
type RequestServiceProvider<Sa, Sr, Ri> = (app: Sa) => <R>(middleware: {
|
|
50
|
-
request: Ri;
|
|
51
|
-
logger: Logger;
|
|
52
|
-
}, match: RouteMatchRecord<R>) => Sr;
|
|
53
|
-
type RouteHandler<P, Sr, Ro> = (params: P, request: Sr) => Ro;
|
|
54
|
-
type Route<N extends string, P extends RouteParams | undefined, Sa, Sr, Ri, Ro> = (Sr extends undefined ? {
|
|
55
|
-
requestServiceProvider?: RequestServiceProvider<Sa, Sr, Ri> | undefined;
|
|
56
|
-
} : {
|
|
57
|
-
requestServiceProvider: RequestServiceProvider<Sa, Sr, Ri>;
|
|
58
|
-
}) & {
|
|
59
|
-
name: N;
|
|
60
|
-
path: string;
|
|
61
|
-
handler: (params: P, request: Sr) => Ro;
|
|
62
|
-
};
|
|
63
|
-
type CreateRouteConfig<Sa, Sr, Ri, N extends string, Ex> = (Sr extends undefined ? {
|
|
64
|
-
requestServiceProvider?: RequestServiceProvider<Sa, Sr, Ri> | undefined;
|
|
65
|
-
} : {
|
|
66
|
-
requestServiceProvider: RequestServiceProvider<Sa, Sr, Ri>;
|
|
67
|
-
}) & {
|
|
68
|
-
name: N;
|
|
69
|
-
path: string;
|
|
70
|
-
} & Ex;
|
|
71
|
-
/**
|
|
72
|
-
* Interface for a function that creates a route. There are two overloaded signatures, because
|
|
73
|
-
* sometimes typescript can't figure out the value of `Sr` between the handler and the service
|
|
74
|
-
* provider. Forcing it through the provider types first by putting the handler in a subsequent
|
|
75
|
-
* argument seems to help.
|
|
76
|
-
*/
|
|
77
|
-
export interface CreateRoute<Sa, Ri, Ex> {
|
|
78
|
-
<N extends string, Ro, Sr extends unknown | undefined = undefined, P extends RouteParams | undefined = undefined>(config: CreateRouteConfig<Sa, Sr, Ri, N, Ex> & {
|
|
79
|
-
handler: RouteHandler<P, Sr, Ro>;
|
|
80
|
-
}): Route<N, P, Sa, Sr, Ri, Ro> & Ex;
|
|
81
|
-
<N extends string, Ro, Sr extends unknown | undefined, P extends RouteParams | undefined = undefined>(config: CreateRouteConfig<Sa, Sr, Ri, N, Ex>, handler: RouteHandler<P, Sr, Ro>): Route<N, P, Sa, Sr, Ri, Ro> & Ex;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Makes a createRoute function that can be used to create routes (this is a factory factory). The
|
|
85
|
-
* `makeCreateRoute` function is typically called once in the backend and once in the frontend to
|
|
86
|
-
* set the types for the resulting `createRoute` function -- that latter function is called once
|
|
87
|
-
* per route. E.g. for the backend, the call could look like:
|
|
88
|
-
*
|
|
89
|
-
* ```
|
|
90
|
-
* export const createRoute = makeCreateRoute<AppServices, ApiRouteRequest, {
|
|
91
|
-
* method: METHOD;
|
|
92
|
-
* }>();
|
|
93
|
-
* ```
|
|
94
|
-
*
|
|
95
|
-
* Notes:
|
|
96
|
-
* * The `{method: METHOD}` defines the `Ex` extension type; here, the `method` property is only
|
|
97
|
-
* relevant to backend routes.
|
|
98
|
-
* * when defining the `createRoute` method, only the request input format is defined, the output
|
|
99
|
-
* format is derived from the routes.
|
|
100
|
-
*
|
|
101
|
-
* When calling the resulting `createRoute` function, the only required params of the route are the
|
|
102
|
-
* name, path, and handler. Other params can be added to the type and then later used in the
|
|
103
|
-
* routeMatcher.
|
|
104
|
-
*
|
|
105
|
-
* eg when defining requestServiceProvider in line, the types have a hard time, it helps to put in another argument:
|
|
106
|
-
* ```
|
|
107
|
-
* export const exampleRoute = createRoute({
|
|
108
|
-
* name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
|
|
109
|
-
* requestServiceProvider: composeServiceMiddleware({
|
|
110
|
-
* cookieAuthMiddleware,
|
|
111
|
-
* documentStoreMiddleware,
|
|
112
|
-
* }},
|
|
113
|
-
* async(params: {key: string}, services) => {
|
|
114
|
-
* const result = await services.myDocumentStore.getItem(params.key);
|
|
115
|
-
*
|
|
116
|
-
* if (!result) {
|
|
117
|
-
* throw new NotFoundError('requested item not found');
|
|
118
|
-
* }
|
|
119
|
-
*
|
|
120
|
-
* return apiJsonResponse(200, result);
|
|
121
|
-
* }
|
|
122
|
-
* );
|
|
123
|
-
* ```
|
|
124
|
-
* eg when using a pre-existing provider variable the types work better:
|
|
125
|
-
* ```
|
|
126
|
-
* export const exampleRoute = createRoute({
|
|
127
|
-
* name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
|
|
128
|
-
* requestServiceProvider,
|
|
129
|
-
* handler: async(params: {key: string}, services) => {
|
|
130
|
-
* const result = await services.myDocumentStore.getItem(params.key);
|
|
131
|
-
*
|
|
132
|
-
* if (!result) {
|
|
133
|
-
* throw new NotFoundError('requested item not found');
|
|
134
|
-
* }
|
|
135
|
-
*
|
|
136
|
-
* return apiJsonResponse(200, result);
|
|
137
|
-
* }
|
|
138
|
-
* });
|
|
139
|
-
* ```
|
|
140
|
-
*/
|
|
141
|
-
export declare const makeCreateRoute: <Sa, Ri, Ex = {}>() => CreateRoute<Sa, Ri, Ex>;
|
|
142
|
-
/**
|
|
143
|
-
* Makes a renderRouteUrl function that can be used to render route paths (this is a factory
|
|
144
|
-
* factory). The returned function takes a `route`, `params`, and `query` and returns a string
|
|
145
|
-
* with the params and query substituted into the route path.
|
|
146
|
-
*
|
|
147
|
-
* this function is initialized using the Ru type which indicates the specific routes wired into
|
|
148
|
-
* the application, which means that if you try to build a url with a route which is not wired
|
|
149
|
-
* into the router you will get a type error. this is a feature to prevent referencing routes that
|
|
150
|
-
* don't exist or aren't handling requests properly.
|
|
151
|
-
*
|
|
152
|
-
* if you are making a helper function or need to render a route outside your application, you
|
|
153
|
-
* can use the `renderAnyRouteUrl` function
|
|
154
|
-
*/
|
|
155
|
-
export declare const makeRenderRouteUrl: <Ru extends {
|
|
156
|
-
path: string;
|
|
157
|
-
}>() => <R>(route: ExternalRoute<R> extends Ru ? R & {
|
|
158
|
-
path: string;
|
|
159
|
-
} : R extends Ru ? R : never, params: ParamsForRoute<R>, query?: QueryParams) => string;
|
|
160
|
-
/**
|
|
161
|
-
* A pre-made result from `makeRenderRouteUrl`, this function interpolates parameter and query
|
|
162
|
-
* arguments into a route path.
|
|
163
|
-
*
|
|
164
|
-
* prefer using `renderRouteUrl` initialized with your applications route union
|
|
165
|
-
* when possible to help catch improperly initialized routes.
|
|
166
|
-
*
|
|
167
|
-
* @param route the route that has a `path` to be interpolated
|
|
168
|
-
* @param params the parameters to interpolate into the route path
|
|
169
|
-
* @param query the query parameters to add to the route path
|
|
170
|
-
* @returns the interpolated route path
|
|
171
|
-
*/
|
|
172
|
-
export declare const renderAnyRouteUrl: <R>(route: ExternalRoute<R> extends any ? R & {
|
|
173
|
-
path: string;
|
|
174
|
-
} : R extends any ? R : never, params: ParamsForRoute<R>, query?: QueryParams) => string;
|
|
175
|
-
type RequestPathExtractor<Ri> = (request: Ri) => string;
|
|
176
|
-
type RequestLogExtractor<Ri> = (request: Ri) => JsonCompatibleStruct;
|
|
177
|
-
type RequestRouteMatcher<Ri, R> = (request: Ri, route: R) => boolean;
|
|
178
|
-
type CompatibleServices<T1> = keyof T1 extends 'logger' ? T1 extends {
|
|
179
|
-
logger: Logger;
|
|
180
|
-
} ? T1 : never : T1 & {
|
|
181
|
-
logger?: Logger;
|
|
182
|
-
};
|
|
183
|
-
type RequestResponder<Sa, Ri, Ro> = {
|
|
184
|
-
(services: CompatibleServices<Sa>): (request: Ri) => Ro | undefined;
|
|
185
|
-
<RoF>(services: CompatibleServices<Sa>, responseMiddleware: (app: Sa) => (response: Ro | undefined, request: {
|
|
186
|
-
request: Ri;
|
|
187
|
-
logger: Logger;
|
|
188
|
-
}) => RoF): (request: Ri) => RoF;
|
|
189
|
-
};
|
|
190
|
-
/**
|
|
191
|
-
* A factory factory for creating request responders (functions that take a request and return a
|
|
192
|
-
* response -- these functions let us implement Lambda `handler` functions).
|
|
193
|
-
*
|
|
194
|
-
* Use it in two steps. First, call it with the general business logic that defines routes, logs,
|
|
195
|
-
* errors, etc:
|
|
196
|
-
* ```
|
|
197
|
-
* const getRequestResponder = makeGetRequestResponder<
|
|
198
|
-
* AppServices, TRoutes, ApiRouteRequest, Promise<ApiRouteResponse>
|
|
199
|
-
* >() // this empty invocation helps typescript mix defined and inferred types
|
|
200
|
-
* ({
|
|
201
|
-
* routes: apiRoutes, // the route definitions
|
|
202
|
-
* pathExtractor, // how to get the path out of the request format
|
|
203
|
-
* routeMatcher, // logic for matching route (beyond path matching, optional)
|
|
204
|
-
* errorHandler, // any special error handling
|
|
205
|
-
* });
|
|
206
|
-
* ```
|
|
207
|
-
* Note here that among other things we're specifying a generic response format that the response
|
|
208
|
-
* and error handling middleware can use, if any routes have responses that don't adhere to this
|
|
209
|
-
* it'll complain about it.
|
|
210
|
-
*
|
|
211
|
-
* Next, we use the `getRequestResponder` to create a responder for a specific lambda entrypoint:
|
|
212
|
-
* ```
|
|
213
|
-
* export const handler: (request: APIGatewayProxyEventV2): Promise<ApiRouteResponse> =>
|
|
214
|
-
* getRequestResponder(
|
|
215
|
-
* lambdaServices, // the AppServices for this entrypoint
|
|
216
|
-
* lambdaMiddleware // environment specific response middleware (like cors)
|
|
217
|
-
* );
|
|
218
|
-
* ```
|
|
219
|
-
*/
|
|
220
|
-
export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }: {
|
|
221
|
-
routes: () => AnySpecificRoute<Ru, Sa, Ri, Ro>[];
|
|
222
|
-
pathExtractor: RequestPathExtractor<Ri>;
|
|
223
|
-
logExtractor?: RequestLogExtractor<Ri>;
|
|
224
|
-
routeMatcher?: RequestRouteMatcher<Ri, AnySpecificRoute<Ru, Sa, Ri, Ro>>;
|
|
225
|
-
errorHandler?: (e: Error, logger: Logger) => Ro;
|
|
226
|
-
}) => RequestResponder<Sa, Ri, Ro>;
|
|
227
|
-
/** HTTP Headers */
|
|
228
|
-
export type HttpHeaders = {
|
|
229
|
-
[key: string]: string | undefined | string[];
|
|
230
|
-
};
|
|
231
|
-
/** A type that works in JSON */
|
|
232
|
-
export type JsonCompatibleValue = string | number | null | undefined | boolean;
|
|
233
|
-
/** A JSON array type */
|
|
234
|
-
export type JsonCompatibleArray = Array<JsonCompatibleValue | JsonCompatibleStruct | JsonCompatibleStruct>;
|
|
235
|
-
/** A JSON object type */
|
|
236
|
-
export type JsonCompatibleStruct = {
|
|
237
|
-
[key: string]: JsonCompatibleStruct | JsonCompatibleValue | JsonCompatibleArray;
|
|
238
|
-
};
|
|
239
|
-
/** The type for an API response */
|
|
240
|
-
export type ApiResponse<S extends number, T> = {
|
|
241
|
-
isBase64Encoded?: boolean;
|
|
242
|
-
statusCode: S;
|
|
243
|
-
data: T;
|
|
244
|
-
body: string;
|
|
245
|
-
headers?: {
|
|
246
|
-
[key: string]: string;
|
|
247
|
-
};
|
|
248
|
-
};
|
|
249
|
-
/**
|
|
250
|
-
* Returns a JSON response. Handles serializing the data to JSON and setting the content-type header.
|
|
251
|
-
* @param statusCode e.g. 201
|
|
252
|
-
* @param data the object to be serialized to JSON
|
|
253
|
-
* @param headers HTTP headers
|
|
254
|
-
* @example
|
|
255
|
-
* return apiJsonResponse(
|
|
256
|
-
* 200, {
|
|
257
|
-
* message: "hello, world!",
|
|
258
|
-
* foo: "bar",
|
|
259
|
-
* },
|
|
260
|
-
* { 'X-Frame-Options': 'DENY' }
|
|
261
|
-
* );
|
|
262
|
-
*/
|
|
263
|
-
export declare const apiJsonResponse: <S extends number, T extends JsonCompatibleStruct>(statusCode: S, data: T, headers?: HttpHeaders) => ApiResponse<S, T>;
|
|
264
|
-
/**
|
|
265
|
-
* Returns a plain text response. Handles setting the content-type header.
|
|
266
|
-
* @param statusCode e.g. 201
|
|
267
|
-
* @param data some string
|
|
268
|
-
* @param headers HTTP headers
|
|
269
|
-
* @example return apiTextResponse(200, 'some text')
|
|
270
|
-
*/
|
|
271
|
-
export declare const apiTextResponse: <S extends number>(statusCode: S, data: string, headers?: HttpHeaders) => ApiResponse<S, string>;
|
|
272
|
-
/**
|
|
273
|
-
* Returns an HTML response. Handles setting the content-type header.
|
|
274
|
-
* @param statusCode e.g. 201
|
|
275
|
-
* @param data some string
|
|
276
|
-
* @param headers HTTP headers
|
|
277
|
-
* @example return apiHtmlResponse(200, '<b>some text</b>')
|
|
278
|
-
*/
|
|
279
|
-
export declare const apiHtmlResponse: <S extends number>(statusCode: S, data: string, headers?: HttpHeaders) => ApiResponse<S, string>;
|
|
280
|
-
/** HTTP method enum */
|
|
281
|
-
export declare enum METHOD {
|
|
282
|
-
GET = "GET",
|
|
283
|
-
HEAD = "HEAD",
|
|
284
|
-
POST = "POST",
|
|
285
|
-
PUT = "PUT",
|
|
286
|
-
PATCH = "PATCH",
|
|
287
|
-
DELETE = "DELETE",
|
|
288
|
-
OPTIONS = "OPTIONS"
|
|
289
|
-
}
|
|
290
|
-
export * from './helpers';
|
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
-
};
|
|
38
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
-
};
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.METHOD = exports.apiHtmlResponse = exports.apiTextResponse = exports.apiJsonResponse = exports.makeGetRequestResponder = exports.renderAnyRouteUrl = exports.makeRenderRouteUrl = exports.makeCreateRoute = exports.routesList = void 0;
|
|
43
|
-
const pathToRegexp = __importStar(require("path-to-regexp"));
|
|
44
|
-
const query_string_1 = __importDefault(require("query-string"));
|
|
45
|
-
const helpers_1 = require("../misc/helpers");
|
|
46
|
-
const console_1 = require("../services/logger/console");
|
|
47
|
-
/** this utility simplifies the route type to remove stuff that is only
|
|
48
|
-
* relevant internal to the route, like the service types, keeping only
|
|
49
|
-
* the payload type which is necessary for the apiGateway
|
|
50
|
-
*
|
|
51
|
-
* this helps avoid the "type too complicated" error that typescript throws
|
|
52
|
-
* when there are a lot of routes with complex services
|
|
53
|
-
**/
|
|
54
|
-
const routesList = (routes) => routes;
|
|
55
|
-
exports.routesList = routesList;
|
|
56
|
-
/**
|
|
57
|
-
* Makes a createRoute function that can be used to create routes (this is a factory factory). The
|
|
58
|
-
* `makeCreateRoute` function is typically called once in the backend and once in the frontend to
|
|
59
|
-
* set the types for the resulting `createRoute` function -- that latter function is called once
|
|
60
|
-
* per route. E.g. for the backend, the call could look like:
|
|
61
|
-
*
|
|
62
|
-
* ```
|
|
63
|
-
* export const createRoute = makeCreateRoute<AppServices, ApiRouteRequest, {
|
|
64
|
-
* method: METHOD;
|
|
65
|
-
* }>();
|
|
66
|
-
* ```
|
|
67
|
-
*
|
|
68
|
-
* Notes:
|
|
69
|
-
* * The `{method: METHOD}` defines the `Ex` extension type; here, the `method` property is only
|
|
70
|
-
* relevant to backend routes.
|
|
71
|
-
* * when defining the `createRoute` method, only the request input format is defined, the output
|
|
72
|
-
* format is derived from the routes.
|
|
73
|
-
*
|
|
74
|
-
* When calling the resulting `createRoute` function, the only required params of the route are the
|
|
75
|
-
* name, path, and handler. Other params can be added to the type and then later used in the
|
|
76
|
-
* routeMatcher.
|
|
77
|
-
*
|
|
78
|
-
* eg when defining requestServiceProvider in line, the types have a hard time, it helps to put in another argument:
|
|
79
|
-
* ```
|
|
80
|
-
* export const exampleRoute = createRoute({
|
|
81
|
-
* name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
|
|
82
|
-
* requestServiceProvider: composeServiceMiddleware({
|
|
83
|
-
* cookieAuthMiddleware,
|
|
84
|
-
* documentStoreMiddleware,
|
|
85
|
-
* }},
|
|
86
|
-
* async(params: {key: string}, services) => {
|
|
87
|
-
* const result = await services.myDocumentStore.getItem(params.key);
|
|
88
|
-
*
|
|
89
|
-
* if (!result) {
|
|
90
|
-
* throw new NotFoundError('requested item not found');
|
|
91
|
-
* }
|
|
92
|
-
*
|
|
93
|
-
* return apiJsonResponse(200, result);
|
|
94
|
-
* }
|
|
95
|
-
* );
|
|
96
|
-
* ```
|
|
97
|
-
* eg when using a pre-existing provider variable the types work better:
|
|
98
|
-
* ```
|
|
99
|
-
* export const exampleRoute = createRoute({
|
|
100
|
-
* name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
|
|
101
|
-
* requestServiceProvider,
|
|
102
|
-
* handler: async(params: {key: string}, services) => {
|
|
103
|
-
* const result = await services.myDocumentStore.getItem(params.key);
|
|
104
|
-
*
|
|
105
|
-
* if (!result) {
|
|
106
|
-
* throw new NotFoundError('requested item not found');
|
|
107
|
-
* }
|
|
108
|
-
*
|
|
109
|
-
* return apiJsonResponse(200, result);
|
|
110
|
-
* }
|
|
111
|
-
* });
|
|
112
|
-
* ```
|
|
113
|
-
*/
|
|
114
|
-
const makeCreateRoute = () => (...args) => {
|
|
115
|
-
return (args.length === 1
|
|
116
|
-
? args[0]
|
|
117
|
-
: { ...args[0], handler: args[1] });
|
|
118
|
-
};
|
|
119
|
-
exports.makeCreateRoute = makeCreateRoute;
|
|
120
|
-
/* begin reverse routing utils */
|
|
121
|
-
/**
|
|
122
|
-
* Makes a renderRouteUrl function that can be used to render route paths (this is a factory
|
|
123
|
-
* factory). The returned function takes a `route`, `params`, and `query` and returns a string
|
|
124
|
-
* with the params and query substituted into the route path.
|
|
125
|
-
*
|
|
126
|
-
* this function is initialized using the Ru type which indicates the specific routes wired into
|
|
127
|
-
* the application, which means that if you try to build a url with a route which is not wired
|
|
128
|
-
* into the router you will get a type error. this is a feature to prevent referencing routes that
|
|
129
|
-
* don't exist or aren't handling requests properly.
|
|
130
|
-
*
|
|
131
|
-
* if you are making a helper function or need to render a route outside your application, you
|
|
132
|
-
* can use the `renderAnyRouteUrl` function
|
|
133
|
-
*/
|
|
134
|
-
const makeRenderRouteUrl = () => (route, params, query = {}) => {
|
|
135
|
-
const getPathForParams = pathToRegexp.compile(route.path, { encode: encodeURIComponent });
|
|
136
|
-
const search = query_string_1.default.stringify(query);
|
|
137
|
-
const path = getPathForParams(params) + (search ? `?${search}` : '');
|
|
138
|
-
return path;
|
|
139
|
-
};
|
|
140
|
-
exports.makeRenderRouteUrl = makeRenderRouteUrl;
|
|
141
|
-
/**
|
|
142
|
-
* A pre-made result from `makeRenderRouteUrl`, this function interpolates parameter and query
|
|
143
|
-
* arguments into a route path.
|
|
144
|
-
*
|
|
145
|
-
* prefer using `renderRouteUrl` initialized with your applications route union
|
|
146
|
-
* when possible to help catch improperly initialized routes.
|
|
147
|
-
*
|
|
148
|
-
* @param route the route that has a `path` to be interpolated
|
|
149
|
-
* @param params the parameters to interpolate into the route path
|
|
150
|
-
* @param query the query parameters to add to the route path
|
|
151
|
-
* @returns the interpolated route path
|
|
152
|
-
*/
|
|
153
|
-
exports.renderAnyRouteUrl = (0, exports.makeRenderRouteUrl)();
|
|
154
|
-
const bindRoute = (services, appBinder, pathExtractor, matcher) => (route) => {
|
|
155
|
-
const getParamsFromPath = pathToRegexp.match(route.path, { decode: decodeURIComponent });
|
|
156
|
-
const boundServiceProvider = route.requestServiceProvider && appBinder(services, route.requestServiceProvider);
|
|
157
|
-
return (request, logger) => {
|
|
158
|
-
const path = pathExtractor(request);
|
|
159
|
-
const match = getParamsFromPath(path);
|
|
160
|
-
if ((!matcher || matcher(request, route)) && match) {
|
|
161
|
-
return {
|
|
162
|
-
name: route.name,
|
|
163
|
-
executor: () => route.handler(match.params, boundServiceProvider ? boundServiceProvider({ request, logger }, { route, params: match.params }) : undefined)
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
};
|
|
168
|
-
/**
|
|
169
|
-
* A factory factory for creating request responders (functions that take a request and return a
|
|
170
|
-
* response -- these functions let us implement Lambda `handler` functions).
|
|
171
|
-
*
|
|
172
|
-
* Use it in two steps. First, call it with the general business logic that defines routes, logs,
|
|
173
|
-
* errors, etc:
|
|
174
|
-
* ```
|
|
175
|
-
* const getRequestResponder = makeGetRequestResponder<
|
|
176
|
-
* AppServices, TRoutes, ApiRouteRequest, Promise<ApiRouteResponse>
|
|
177
|
-
* >() // this empty invocation helps typescript mix defined and inferred types
|
|
178
|
-
* ({
|
|
179
|
-
* routes: apiRoutes, // the route definitions
|
|
180
|
-
* pathExtractor, // how to get the path out of the request format
|
|
181
|
-
* routeMatcher, // logic for matching route (beyond path matching, optional)
|
|
182
|
-
* errorHandler, // any special error handling
|
|
183
|
-
* });
|
|
184
|
-
* ```
|
|
185
|
-
* Note here that among other things we're specifying a generic response format that the response
|
|
186
|
-
* and error handling middleware can use, if any routes have responses that don't adhere to this
|
|
187
|
-
* it'll complain about it.
|
|
188
|
-
*
|
|
189
|
-
* Next, we use the `getRequestResponder` to create a responder for a specific lambda entrypoint:
|
|
190
|
-
* ```
|
|
191
|
-
* export const handler: (request: APIGatewayProxyEventV2): Promise<ApiRouteResponse> =>
|
|
192
|
-
* getRequestResponder(
|
|
193
|
-
* lambdaServices, // the AppServices for this entrypoint
|
|
194
|
-
* lambdaMiddleware // environment specific response middleware (like cors)
|
|
195
|
-
* );
|
|
196
|
-
* ```
|
|
197
|
-
*/
|
|
198
|
-
const makeGetRequestResponder = () => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }) => (services, responseMiddleware) => {
|
|
199
|
-
const appBinderImpl = (app, middleware) => middleware(app, appBinder);
|
|
200
|
-
const appBinder = (0, helpers_1.memoize)(appBinderImpl);
|
|
201
|
-
const boundRoutes = routes().map(bindRoute(services, appBinder, pathExtractor, routeMatcher));
|
|
202
|
-
const boundResponseMiddleware = responseMiddleware ? responseMiddleware(services) : undefined;
|
|
203
|
-
const appLogger = services.logger || (0, console_1.createConsoleLogger)();
|
|
204
|
-
// *note* this opaque promise guard is less generic than i hoped so
|
|
205
|
-
// i'm leaving it here instead of the guards file.
|
|
206
|
-
//
|
|
207
|
-
// its less than ideal because it enforces that the handlers return
|
|
208
|
-
// the same type as the parent promise, usually a handler can be either a
|
|
209
|
-
// promise or a non-promise value and the promise figures it out, but those
|
|
210
|
-
// types are getting complicated quickly here.
|
|
211
|
-
const isPromise = (thing) => thing instanceof Promise;
|
|
212
|
-
return (request) => {
|
|
213
|
-
const logger = appLogger.createSubContext();
|
|
214
|
-
if (logExtractor) {
|
|
215
|
-
logger.setContext(logExtractor(request));
|
|
216
|
-
}
|
|
217
|
-
logger.log('begin request');
|
|
218
|
-
try {
|
|
219
|
-
const route = (0, helpers_1.mapFind)(boundRoutes, (route) => route(request, logger));
|
|
220
|
-
if (route) {
|
|
221
|
-
logger.log(`route matched ${route.name}`);
|
|
222
|
-
const result = boundResponseMiddleware ?
|
|
223
|
-
boundResponseMiddleware(route.executor(), { request, logger }) : route.executor();
|
|
224
|
-
if (isPromise(result) && errorHandler) {
|
|
225
|
-
const errorHandlerWithMiddleware = (e) => boundResponseMiddleware ?
|
|
226
|
-
boundResponseMiddleware(errorHandler(e, logger), { request, logger }) : errorHandler(e, logger);
|
|
227
|
-
return result.catch(errorHandlerWithMiddleware);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
return result;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
else if (boundResponseMiddleware) {
|
|
234
|
-
logger.log('no route matched, returning 404');
|
|
235
|
-
return boundResponseMiddleware(undefined, { request, logger });
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
catch (e) {
|
|
239
|
-
if (errorHandler && e instanceof Error) {
|
|
240
|
-
return boundResponseMiddleware
|
|
241
|
-
? boundResponseMiddleware(errorHandler(e, logger), { request, logger })
|
|
242
|
-
: errorHandler(e, logger);
|
|
243
|
-
}
|
|
244
|
-
throw e;
|
|
245
|
-
}
|
|
246
|
-
return undefined;
|
|
247
|
-
};
|
|
248
|
-
};
|
|
249
|
-
exports.makeGetRequestResponder = makeGetRequestResponder;
|
|
250
|
-
/**
|
|
251
|
-
* Returns a JSON response. Handles serializing the data to JSON and setting the content-type header.
|
|
252
|
-
* @param statusCode e.g. 201
|
|
253
|
-
* @param data the object to be serialized to JSON
|
|
254
|
-
* @param headers HTTP headers
|
|
255
|
-
* @example
|
|
256
|
-
* return apiJsonResponse(
|
|
257
|
-
* 200, {
|
|
258
|
-
* message: "hello, world!",
|
|
259
|
-
* foo: "bar",
|
|
260
|
-
* },
|
|
261
|
-
* { 'X-Frame-Options': 'DENY' }
|
|
262
|
-
* );
|
|
263
|
-
*/
|
|
264
|
-
const apiJsonResponse = (statusCode, data, headers) => ({ statusCode, data, body: JSON.stringify(data), headers: { ...headers, 'content-type': 'application/json' } });
|
|
265
|
-
exports.apiJsonResponse = apiJsonResponse;
|
|
266
|
-
/**
|
|
267
|
-
* Returns a plain text response. Handles setting the content-type header.
|
|
268
|
-
* @param statusCode e.g. 201
|
|
269
|
-
* @param data some string
|
|
270
|
-
* @param headers HTTP headers
|
|
271
|
-
* @example return apiTextResponse(200, 'some text')
|
|
272
|
-
*/
|
|
273
|
-
const apiTextResponse = (statusCode, data, headers) => ({ statusCode, data, body: data, headers: { ...headers, 'content-type': 'text/plain' } });
|
|
274
|
-
exports.apiTextResponse = apiTextResponse;
|
|
275
|
-
/**
|
|
276
|
-
* Returns an HTML response. Handles setting the content-type header.
|
|
277
|
-
* @param statusCode e.g. 201
|
|
278
|
-
* @param data some string
|
|
279
|
-
* @param headers HTTP headers
|
|
280
|
-
* @example return apiHtmlResponse(200, '<b>some text</b>')
|
|
281
|
-
*/
|
|
282
|
-
const apiHtmlResponse = (statusCode, data, headers) => ({ statusCode, data, body: data, headers: { ...headers, 'content-type': 'text/html' } });
|
|
283
|
-
exports.apiHtmlResponse = apiHtmlResponse;
|
|
284
|
-
/** HTTP method enum */
|
|
285
|
-
var METHOD;
|
|
286
|
-
(function (METHOD) {
|
|
287
|
-
METHOD["GET"] = "GET";
|
|
288
|
-
METHOD["HEAD"] = "HEAD";
|
|
289
|
-
METHOD["POST"] = "POST";
|
|
290
|
-
METHOD["PUT"] = "PUT";
|
|
291
|
-
METHOD["PATCH"] = "PATCH";
|
|
292
|
-
METHOD["DELETE"] = "DELETE";
|
|
293
|
-
METHOD["OPTIONS"] = "OPTIONS";
|
|
294
|
-
})(METHOD || (exports.METHOD = METHOD = {}));
|
|
295
|
-
__exportStar(require("./helpers"), exports);
|