@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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { assertDefined, assertErrorInstanceOf, assertFalse, assertInstanceOf, assertNotNaN, assertString, assertTrue } from '.';
|
|
2
|
+
|
|
3
|
+
describe('assertNotNaN', () => {
|
|
4
|
+
it('throws when NaN', () => {
|
|
5
|
+
expect(() => assertNotNaN(NaN)).toThrow();
|
|
6
|
+
});
|
|
7
|
+
it('returns thing when not NaN', () => {
|
|
8
|
+
expect(() => assertNotNaN('asdf')).not.toThrow();
|
|
9
|
+
expect(assertNotNaN('asdf')).toBe('asdf');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe('assertDefined', () => {
|
|
14
|
+
it('returns value', () => {
|
|
15
|
+
expect(assertDefined('foo', 'error')).toBe('foo');
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('throws on undefined', () => {
|
|
19
|
+
expect(() =>
|
|
20
|
+
assertDefined(undefined, 'error')
|
|
21
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('assertTrue', () => {
|
|
26
|
+
it('returns value', () => {
|
|
27
|
+
expect(assertTrue(true, 'error')).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('throws on not true', () => {
|
|
31
|
+
expect(() =>
|
|
32
|
+
assertTrue(undefined, 'error')
|
|
33
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
34
|
+
expect(() =>
|
|
35
|
+
assertTrue(3, 'error')
|
|
36
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
37
|
+
expect(() =>
|
|
38
|
+
assertTrue(false, 'error')
|
|
39
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
describe('assertFalse', () => {
|
|
44
|
+
it('returns value', () => {
|
|
45
|
+
expect(assertFalse(false, 'error')).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('throws on not false', () => {
|
|
49
|
+
expect(() =>
|
|
50
|
+
assertFalse(undefined, 'error')
|
|
51
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
52
|
+
expect(() =>
|
|
53
|
+
assertFalse(3, 'error')
|
|
54
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
55
|
+
expect(() =>
|
|
56
|
+
assertFalse(true, 'error')
|
|
57
|
+
).toThrowErrorMatchingInlineSnapshot('"error"');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('assertString', () => {
|
|
62
|
+
it('returns value', () => {
|
|
63
|
+
expect(assertString('string')).toBe('string');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('throws on undefined', () => {
|
|
67
|
+
expect(() =>
|
|
68
|
+
assertString(undefined, new Error('cool error'))
|
|
69
|
+
).toThrowErrorMatchingInlineSnapshot('"cool error"');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('throws on not a string', () => {
|
|
73
|
+
expect(() =>
|
|
74
|
+
assertString(5, () => { throw new Error('cool error'); })
|
|
75
|
+
).toThrowErrorMatchingInlineSnapshot('"cool error"');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
describe('assertInstanceOf', () => {
|
|
80
|
+
it('returns value cast to the correct type, or throws if the value is not an instanceof the constructor', () => {
|
|
81
|
+
class A {}
|
|
82
|
+
class B extends A {
|
|
83
|
+
// This property makes it so type A cannot be assigned to type B
|
|
84
|
+
someProp = true;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const a = new A;
|
|
88
|
+
const b = new B;
|
|
89
|
+
|
|
90
|
+
// We call these methods just to verify the returned types are correct
|
|
91
|
+
const acceptsA = (a: A) => a;
|
|
92
|
+
const acceptsB = (b: B) => b;
|
|
93
|
+
|
|
94
|
+
expect(acceptsA(assertInstanceOf(a, A, 'not instanceof'))).toBe(a);
|
|
95
|
+
expect(acceptsA(assertInstanceOf(b, A, 'not instanceof'))).toBe(b);
|
|
96
|
+
expect(acceptsA(assertInstanceOf(b as A, A, 'not instanceof'))).toBe(b);
|
|
97
|
+
expect(() => acceptsA(assertInstanceOf(a, B, 'not instanceof'))).toThrow('not instanceof');
|
|
98
|
+
expect(acceptsA(assertInstanceOf(b, B, 'not instanceof'))).toBe(b);
|
|
99
|
+
expect(acceptsA(assertInstanceOf(b as A, B, 'not instanceof'))).toBe(b);
|
|
100
|
+
|
|
101
|
+
expect(() => acceptsB(assertInstanceOf(a, B, 'not instanceof'))).toThrow('not instanceof');
|
|
102
|
+
expect(acceptsB(assertInstanceOf(b, B, 'not instanceof'))).toBe(b);
|
|
103
|
+
expect(acceptsB(assertInstanceOf(b as A, B, 'not instanceof'))).toBe(b);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('assertErrorInstanceOf', () => {
|
|
108
|
+
it('works with Error and subclasses, rethrows original argument if check fails', () => {
|
|
109
|
+
const syntaxError = new SyntaxError;
|
|
110
|
+
const error = new Error;
|
|
111
|
+
expect(assertErrorInstanceOf(syntaxError, SyntaxError)).toBe(syntaxError);
|
|
112
|
+
expect(() => assertErrorInstanceOf(error, SyntaxError)).toThrow(error);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('throws an Error if original argument is not an instance of Error', () => {
|
|
116
|
+
const error = 'I am Error';
|
|
117
|
+
expect(() => assertErrorInstanceOf(error, SyntaxError)).toThrow(
|
|
118
|
+
`assertErrorInstanceOf received non-Error argument of type "${
|
|
119
|
+
typeof error}" and string representation "${error}"`
|
|
120
|
+
);
|
|
121
|
+
expect(() => assertErrorInstanceOf(error as unknown, SyntaxError)).toThrow(
|
|
122
|
+
`assertErrorInstanceOf received non-Error argument of type "${
|
|
123
|
+
typeof error}" and string representation "${error}"`
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
@@ -11,18 +11,22 @@
|
|
|
11
11
|
* stack trace more useful, and allows you to use specific error types
|
|
12
12
|
* that might be handled differently.
|
|
13
13
|
*/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
|
|
15
|
+
export type AssertionFailed = string | Error | (() => never) | undefined;
|
|
16
|
+
|
|
17
|
+
export const doThrow = (failed: AssertionFailed): never => {
|
|
18
|
+
if (typeof failed === 'string') {
|
|
19
|
+
throw new Error(failed);
|
|
20
|
+
}
|
|
21
|
+
if (failed instanceof Error) {
|
|
22
|
+
throw failed;
|
|
23
|
+
}
|
|
24
|
+
if (!failed) {
|
|
25
|
+
throw new Error();
|
|
26
|
+
}
|
|
27
|
+
return failed();
|
|
25
28
|
};
|
|
29
|
+
|
|
26
30
|
/**
|
|
27
31
|
* Asserts that the given value is true.
|
|
28
32
|
*
|
|
@@ -33,12 +37,14 @@ export const doThrow = (failed) => {
|
|
|
33
37
|
* @example const definitelyTrue = assertTrue(randomThing, new Error('thing was not true'));
|
|
34
38
|
* @returns the value that was asserted
|
|
35
39
|
*/
|
|
36
|
-
export const assertTrue = (x, failed) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
40
|
+
export const assertTrue = <X>(x: X, failed?: AssertionFailed) => {
|
|
41
|
+
if (typeof x !== 'boolean' || x !== true) {
|
|
42
|
+
return doThrow(failed);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return x;
|
|
41
46
|
};
|
|
47
|
+
|
|
42
48
|
/**
|
|
43
49
|
* Asserts that the given value is false.
|
|
44
50
|
*
|
|
@@ -49,12 +55,14 @@ export const assertTrue = (x, failed) => {
|
|
|
49
55
|
* @example const definitelyFalse = assertFalse(randomThing, new Error('thing was not false'));
|
|
50
56
|
* @returns the value that was asserted
|
|
51
57
|
*/
|
|
52
|
-
export const assertFalse = (x, failed) => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
58
|
+
export const assertFalse = <X>(x: X, failed?: AssertionFailed) => {
|
|
59
|
+
if (typeof x !== 'boolean' || x !== false) {
|
|
60
|
+
return doThrow(failed);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return x;
|
|
57
64
|
};
|
|
65
|
+
|
|
58
66
|
/**
|
|
59
67
|
* Asserts that the given value is defined.
|
|
60
68
|
*
|
|
@@ -65,12 +73,14 @@ export const assertFalse = (x, failed) => {
|
|
|
65
73
|
* @example const definitelyDefined = assertDefined(randomThing, new Error('thing was undefined'));
|
|
66
74
|
* @returns the value that was asserted, with a type that excludes undefined
|
|
67
75
|
*/
|
|
68
|
-
export const assertDefined = (x, failed) => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
export const assertDefined = <X>(x: X, failed?: AssertionFailed) => {
|
|
77
|
+
if (x === undefined) {
|
|
78
|
+
return doThrow(failed);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return x as Exclude<X, undefined>;
|
|
73
82
|
};
|
|
83
|
+
|
|
74
84
|
/**
|
|
75
85
|
* Asserts that the given value is a string.
|
|
76
86
|
*
|
|
@@ -81,12 +91,14 @@ export const assertDefined = (x, failed) => {
|
|
|
81
91
|
* @example const definitelyAString = assertString(randomThing, new Error('thing is not a string'));
|
|
82
92
|
* @returns the value that was asserted
|
|
83
93
|
*/
|
|
84
|
-
export const assertString = (x, failed) => {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
export const assertString = <X>(x: X, failed?: AssertionFailed): string => {
|
|
95
|
+
if (typeof x !== 'string') {
|
|
96
|
+
return doThrow(failed);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return x;
|
|
89
100
|
};
|
|
101
|
+
|
|
90
102
|
/**
|
|
91
103
|
* Asserts that the given value is not `NaN`. Does not assert that the value is a number.
|
|
92
104
|
*
|
|
@@ -97,16 +109,18 @@ export const assertString = (x, failed) => {
|
|
|
97
109
|
* @example const definitelyNotNotANumber = assertNotNaN(randomThing, new Error('thing was NaN'));
|
|
98
110
|
* @returns the value that was asserted
|
|
99
111
|
*/
|
|
100
|
-
export const assertNotNaN = (thing, failed) => {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
112
|
+
export const assertNotNaN = <T>(thing: T, failed?: AssertionFailed): T => {
|
|
113
|
+
if (typeof thing === 'number' && isNaN(thing)) {
|
|
114
|
+
return doThrow(failed);
|
|
115
|
+
}
|
|
116
|
+
return thing;
|
|
105
117
|
};
|
|
118
|
+
|
|
106
119
|
/**
|
|
107
120
|
* @deprecated use assertNotNaN instead
|
|
108
121
|
*/
|
|
109
122
|
export const notNaN = assertNotNaN;
|
|
123
|
+
|
|
110
124
|
/**
|
|
111
125
|
* Asserts that the first argument is an instance of the second.
|
|
112
126
|
*
|
|
@@ -118,12 +132,13 @@ export const notNaN = assertNotNaN;
|
|
|
118
132
|
* @example const definitelySyntaxError = assertInstanceOf(error, SyntaxError, new Error('argument was not a SyntaxError'));
|
|
119
133
|
* @returns the value that was asserted
|
|
120
134
|
*/
|
|
121
|
-
export const assertInstanceOf = (thing, constructable, failed) => {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
135
|
+
export const assertInstanceOf = <T>(thing: any, constructable: Function & { new(...args: any[]): T }, failed?: AssertionFailed): T => {
|
|
136
|
+
if (thing instanceof constructable) {
|
|
137
|
+
return thing;
|
|
138
|
+
}
|
|
139
|
+
return doThrow(failed);
|
|
126
140
|
};
|
|
141
|
+
|
|
127
142
|
/**
|
|
128
143
|
* Asserts that the error in the first argument is an instance of the error given as the
|
|
129
144
|
* second argument
|
|
@@ -135,12 +150,12 @@ export const assertInstanceOf = (thing, constructable, failed) => {
|
|
|
135
150
|
* @throws the original error if the check fails
|
|
136
151
|
* @see assertInstanceOf
|
|
137
152
|
*/
|
|
138
|
-
export const assertErrorInstanceOf = (thing, constructable) => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
153
|
+
export const assertErrorInstanceOf = <T extends Error>(thing: unknown, constructable: Function & { new(...args: any[]): T }): T => {
|
|
154
|
+
if (thing instanceof Error) {
|
|
155
|
+
return assertInstanceOf(thing, constructable, thing);
|
|
156
|
+
} else {
|
|
157
|
+
// this separate branch prevents an unknown non-Error thing from being passed to the assertion as an AssertionFailed
|
|
158
|
+
throw new Error(`assertErrorInstanceOf received non-Error argument of type "${
|
|
159
|
+
typeof thing}" and string representation "${thing}"`);
|
|
160
|
+
}
|
|
146
161
|
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {GetParameterCommand} from '@aws-sdk/client-ssm';
|
|
2
|
+
import { assertDefined } from '../assertions';
|
|
3
|
+
import { ssmService } from '../aws/ssmService';
|
|
4
|
+
import { resolveConfigValue } from './resolveConfigValue';
|
|
5
|
+
import { ConfigValueProvider } from '.';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Returns a value from the AWS Parameter Store.
|
|
9
|
+
*
|
|
10
|
+
* @param parameterName the name of the parameter; can be a literal name (string) or can itself
|
|
11
|
+
* be accessed via another parameter by giving a configuration value provider.
|
|
12
|
+
* @example const someValue = resolveConfig(awsParameterConfig('some-parameter-name'));
|
|
13
|
+
* @returns the configuration value provider for the value
|
|
14
|
+
*/
|
|
15
|
+
export const awsParameterConfig = (parameterName: ConfigValueProvider<string>): ConfigValueProvider<string> => {
|
|
16
|
+
return async() => {
|
|
17
|
+
const command = new GetParameterCommand({Name: await resolveConfigValue(parameterName), WithDecryption: true});
|
|
18
|
+
// send() throws ParameterNotFound if the parameter is missing,
|
|
19
|
+
// so it's not clear what missing Parameter or Value mean
|
|
20
|
+
const response = await ssmService().send(command);
|
|
21
|
+
const parameter = assertDefined(response.Parameter, `aws GetParameter response missing Parameter key for ${parameterName}"`);
|
|
22
|
+
return assertDefined(parameter.Value, `aws GetParameter response missing Parameter.Value key for ${parameterName}"`);
|
|
23
|
+
};
|
|
24
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { resolveConfigValue } from './resolveConfigValue';
|
|
2
|
+
import type { ConfigValueProvider } from '.';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A list of environment variables that were requested at build time. Used by webpack to
|
|
6
|
+
* capture build-time environment variables values.
|
|
7
|
+
*/
|
|
8
|
+
export const ENV_BUILD_CONFIGS: string[] = [];
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Returns an environment variable from the process environment. Depending on the `type` in the
|
|
12
|
+
* call to get the variable, the variable's value may be what it was at build time, not at runtime.
|
|
13
|
+
* The return value is not the variable value itself, but rather a provider that has to be called
|
|
14
|
+
* to read the variable value (meaning, this is safe to call even if the variable doesn't exist,
|
|
15
|
+
* because someone else later needs to call the provider to get the value -- that call may explode,
|
|
16
|
+
* but this one won't).
|
|
17
|
+
*
|
|
18
|
+
* @param name The name of the environment variable to retrieve.
|
|
19
|
+
* @param type The mode for accessing the variable. Defaults to `'build'`, i.e. getting the
|
|
20
|
+
* variable as it was set at build time (webpack is connected here to make this possible). This
|
|
21
|
+
* argument can also be `'runtime'` in which case the value at build time is ignored and the
|
|
22
|
+
* variable is pulled live from `process.env`.
|
|
23
|
+
* @param [defaultValue] The default value to use if the variable is not found.
|
|
24
|
+
*
|
|
25
|
+
* @example const config = { configValue: envConfig('environment_variable_name') };
|
|
26
|
+
*/
|
|
27
|
+
export const envConfig = (
|
|
28
|
+
name: string, type?: 'build' | 'runtime', defaultValue?: ConfigValueProvider<string>
|
|
29
|
+
): ConfigValueProvider<string> => {
|
|
30
|
+
// this doesn't use a default parameter value because of a:
|
|
31
|
+
// "Regular parameters should not come after default parameters."
|
|
32
|
+
// error that occurs when the defaultValue optional default of `undefined`
|
|
33
|
+
// gets optimized out, causing a problem in cloudfront functions.
|
|
34
|
+
type ??= 'build';
|
|
35
|
+
|
|
36
|
+
if (type === 'build') {
|
|
37
|
+
ENV_BUILD_CONFIGS.push(name);
|
|
38
|
+
}
|
|
39
|
+
return (): string | Promise<string> => {
|
|
40
|
+
/*global __PROCESS_ENV*/
|
|
41
|
+
// @ts-ignore - hack to get around the way webpack/define works
|
|
42
|
+
// - https://github.com/webpack/webpack/issues/14800
|
|
43
|
+
// - https://github.com/webpack/webpack/issues/5392
|
|
44
|
+
// also, spread operator not supported in cloudfront functions
|
|
45
|
+
const envs: typeof process.env = Object.assign({}, process.env, typeof __PROCESS_ENV !== 'undefined' ? __PROCESS_ENV : {});
|
|
46
|
+
const value = envs[name];
|
|
47
|
+
|
|
48
|
+
if (value === undefined) {
|
|
49
|
+
if (defaultValue === undefined) {
|
|
50
|
+
throw new Error(`expected to find environment variable with name: ${name}`);
|
|
51
|
+
} else {
|
|
52
|
+
return resolveConfigValue(defaultValue);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
};
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { ParameterNotFound, SSM } from '@aws-sdk/client-ssm';
|
|
2
|
+
import fetch from 'node-fetch';
|
|
3
|
+
import { awsParameterConfig, ENV_BUILD_CONFIGS, envConfig, lambdaParameterConfig, replaceConfig, resolveConfigValue, stubConfig } from '.';
|
|
4
|
+
|
|
5
|
+
jest.mock('@aws-sdk/client-ssm', () => {
|
|
6
|
+
const sendSpy = jest.fn(() => Promise.resolve()) as any;
|
|
7
|
+
return {
|
|
8
|
+
...jest.requireActual('@aws-sdk/client-ssm'),
|
|
9
|
+
SSM: class {
|
|
10
|
+
static sendSpy = sendSpy;
|
|
11
|
+
send(...a: any[]) { return sendSpy(...a); }
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
jest.mock('node-fetch', jest.fn);
|
|
17
|
+
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
jest.clearAllMocks();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe('envConfig', () => {
|
|
23
|
+
it('collects build configs', () => {
|
|
24
|
+
envConfig('build config');
|
|
25
|
+
expect(ENV_BUILD_CONFIGS).toContain('build config');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('ignores runtime configs', () => {
|
|
29
|
+
envConfig('runtime config', 'runtime');
|
|
30
|
+
expect(ENV_BUILD_CONFIGS).not.toContain('runtime config');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('returns config value', async() => {
|
|
34
|
+
process.env.MY_COOL_CONFIG = 'cool';
|
|
35
|
+
expect(await resolveConfigValue(envConfig('MY_COOL_CONFIG'))).toBe('cool');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('uses __PROCESS_ENV', async() => {
|
|
39
|
+
(global as any).__PROCESS_ENV = {MY_COOL_CONFIG_2: 'cool2'};
|
|
40
|
+
expect(await resolveConfigValue(envConfig('MY_COOL_CONFIG_2'))).toBe('cool2');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('returns defaultValue if env variable is absent', async() => {
|
|
44
|
+
expect(
|
|
45
|
+
await resolveConfigValue(envConfig('MY_COOL_CONFIG_3', 'runtime', 'cool3'))
|
|
46
|
+
).toBe('cool3');
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('works with any ConfigValueProvider<string> as a defaultValue', async() => {
|
|
50
|
+
expect(
|
|
51
|
+
await resolveConfigValue(envConfig('MY_COOL_CONFIG_3', 'runtime', () => Promise.resolve('cool4')))
|
|
52
|
+
).toBe('cool4');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('throws an error if the env variable is undefined and there is no defaultValue', async() => {
|
|
56
|
+
await expect(resolveConfigValue(envConfig('MY_UNCOOL_CONFIG', 'runtime'))).rejects.toThrow(
|
|
57
|
+
'expected to find environment variable with name: MY_UNCOOL_CONFIG'
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe('resolveConfigValue', () => {
|
|
63
|
+
it('resolves string', async() => {
|
|
64
|
+
expect(await resolveConfigValue('asdf')).toBe('asdf');
|
|
65
|
+
});
|
|
66
|
+
it('resolves function', async() => {
|
|
67
|
+
expect(await resolveConfigValue(() => 'asdf')).toBe('asdf');
|
|
68
|
+
});
|
|
69
|
+
it('resolves promise function', async() => {
|
|
70
|
+
expect(await resolveConfigValue(() => Promise.resolve('asdf'))).toBe('asdf');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('awsParameterConfig', () => {
|
|
75
|
+
const sendSpy: jest.SpyInstance = (SSM as any).sendSpy;
|
|
76
|
+
|
|
77
|
+
it('resolves parameter', async() => {
|
|
78
|
+
sendSpy.mockReturnValueOnce(Promise.resolve({Parameter: {Value: 'parameterValue'}}));
|
|
79
|
+
expect(await resolveConfigValue(awsParameterConfig('parameterName'))).toBe('parameterValue');
|
|
80
|
+
expect(sendSpy).toHaveBeenCalledWith(
|
|
81
|
+
expect.objectContaining({input: {Name: 'parameterName', WithDecryption: true}})
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('throws when parameter is not found', async() => {
|
|
86
|
+
sendSpy.mockImplementationOnce(async() => {throw new ParameterNotFound({$metadata: {}});});
|
|
87
|
+
await expect(
|
|
88
|
+
resolveConfigValue(awsParameterConfig('parameterName'))
|
|
89
|
+
).rejects.toThrow(ParameterNotFound);
|
|
90
|
+
expect(sendSpy).toHaveBeenCalledWith(
|
|
91
|
+
expect.objectContaining({input: {Name: 'parameterName', WithDecryption: true}})
|
|
92
|
+
);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe('lambdaParameterConfig', () => {
|
|
97
|
+
const fetchSpy = fetch as unknown as jest.SpyInstance;
|
|
98
|
+
|
|
99
|
+
beforeAll(() => {
|
|
100
|
+
fetchSpy.mockReturnValueOnce(Promise.resolve());
|
|
101
|
+
process.env['AWS_SESSION_TOKEN'] = 'someToken';
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
afterAll(() => delete process.env['AWS_SESSION_TOKEN']);
|
|
105
|
+
|
|
106
|
+
it('resolves parameter', async() => {
|
|
107
|
+
fetchSpy.mockReturnValueOnce(
|
|
108
|
+
Promise.resolve(
|
|
109
|
+
{ ok: true, json: () => Promise.resolve({ Parameter: { Value: 'parameterValue' } }) }
|
|
110
|
+
)
|
|
111
|
+
);
|
|
112
|
+
expect(
|
|
113
|
+
await resolveConfigValue(lambdaParameterConfig(async() => 'parameterName'))
|
|
114
|
+
).toBe('parameterValue');
|
|
115
|
+
expect(fetchSpy).toHaveBeenCalledWith(
|
|
116
|
+
'http://localhost:2773/systemsmanager/parameters/get?name=parameterName&withDecryption=true',
|
|
117
|
+
{ headers: { 'X-Aws-Parameters-Secrets-Token': 'someToken' } }
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('throws when parameter is not found', async() => {
|
|
122
|
+
fetchSpy.mockReturnValueOnce(
|
|
123
|
+
Promise.resolve({ ok: false, status: 404, statusText: 'Not Found' })
|
|
124
|
+
);
|
|
125
|
+
await expect(
|
|
126
|
+
resolveConfigValue(lambdaParameterConfig(async() => 'parameterName'))
|
|
127
|
+
).rejects.toThrow('HTTP Error Response');
|
|
128
|
+
expect(fetchSpy).toHaveBeenCalledWith(
|
|
129
|
+
'http://localhost:2773/systemsmanager/parameters/get?name=parameterName&withDecryption=true',
|
|
130
|
+
{ headers: { 'X-Aws-Parameters-Secrets-Token': 'someToken' } }
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('stubConfig', () => {
|
|
136
|
+
it('stubs', async() => {
|
|
137
|
+
expect(await resolveConfigValue(stubConfig('stubbed'))).toBe('stubbed');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe('replaceConfig', () => {
|
|
142
|
+
it('replaces string', async() => {
|
|
143
|
+
const result = replaceConfig('base [token] value', {
|
|
144
|
+
'[token]': 'replaced'
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
expect(await resolveConfigValue(result)).toBe('base replaced value');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('replaces with async values', async() => {
|
|
151
|
+
const result = replaceConfig('base [token] value', {
|
|
152
|
+
'[token]': stubConfig('replaced')
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
expect(await resolveConfigValue(result)).toBe('base replaced value');
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('replaces with async base', async() => {
|
|
159
|
+
const result = replaceConfig(stubConfig('base [token] value'), {
|
|
160
|
+
'[token]': stubConfig('replaced')
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
expect(await resolveConfigValue(result)).toBe('base replaced value');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -2,46 +2,62 @@
|
|
|
2
2
|
* A simple type alias for a string that represents a configuration value. Currently only string values are supported to maintain compatibility with environment variables, but this type is future proofing against allowing other types like `number` as possible config values.
|
|
3
3
|
*/
|
|
4
4
|
export type ConfigValue = string;
|
|
5
|
+
|
|
5
6
|
/**
|
|
6
7
|
* A configuration object that may contain nested configuration objects or configuration values.
|
|
7
8
|
*/
|
|
8
|
-
export type Config = {
|
|
9
|
-
|
|
10
|
-
};
|
|
9
|
+
export type Config = {[key: string]: Config | ConfigValue};
|
|
10
|
+
|
|
11
11
|
/**
|
|
12
12
|
* Either a function that returns a `ConfigValue` or a `Promise` that resolves to a `ConfigValue`,
|
|
13
13
|
* or just a `ConfigValue`.
|
|
14
14
|
*/
|
|
15
15
|
export type ConfigValueProvider<V extends ConfigValue = ConfigValue> = (() => Promise<V> | V) | V;
|
|
16
|
+
|
|
16
17
|
/**
|
|
17
18
|
* A configuration object that may contain nested configuration objects or configuration value providers.
|
|
18
19
|
*/
|
|
19
|
-
export type ConfigProvider = {
|
|
20
|
-
|
|
21
|
-
};
|
|
20
|
+
export type ConfigProvider = {[key: string]: ConfigProvider | ConfigValueProvider};
|
|
21
|
+
|
|
22
22
|
/**
|
|
23
23
|
* Conditional type that resolves to the type of configuration object for the given configuration
|
|
24
24
|
* provider. Also resolves to a config value type if the given type is a config value.
|
|
25
25
|
*/
|
|
26
|
-
export type ConfigForConfigProvider<T> = T extends ConfigValue
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
export type ConfigForConfigProvider<T> = T extends ConfigValue
|
|
27
|
+
? T
|
|
28
|
+
: T extends ConfigProvider
|
|
29
|
+
? {[key in keyof T]: ConfigForConfigProvider<T[key]>}
|
|
30
|
+
: T extends ConfigValueProvider<infer R>
|
|
31
|
+
? R
|
|
32
|
+
: never;
|
|
33
|
+
|
|
29
34
|
/**
|
|
30
35
|
* Conditional type that resolves to the `ConfigProvider` type for the given configuration
|
|
31
36
|
* type (`ConfigValue` or `Config`). The resulting type is either a `ConfigValueProvider` or
|
|
32
37
|
* a `ConfigProvider`.
|
|
33
38
|
*/
|
|
34
|
-
export type ConfigProviderForConfig<T> = T extends ConfigValue
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
export type ConfigProviderForConfig<T> = T extends ConfigValue
|
|
40
|
+
? ConfigValueProvider<T>
|
|
41
|
+
: T extends Config
|
|
42
|
+
? {[key in keyof T]: ConfigProviderForConfig<T[key]>}
|
|
43
|
+
: never;
|
|
44
|
+
|
|
37
45
|
export * from './resolveConfigValue';
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* ===========
|
|
49
|
+
* re-usable config providers
|
|
50
|
+
* ===========
|
|
51
|
+
* */
|
|
52
|
+
|
|
38
53
|
/**
|
|
39
54
|
* stub, mostly for testing. sometimes it helps please typescript to use this if you have
|
|
40
55
|
* two configs you want to have the same type but one is a fixed string and one is a complicated provider
|
|
41
56
|
*
|
|
42
57
|
* @example const config = { configValue: stubConfig('just-a-string') };
|
|
43
58
|
*/
|
|
44
|
-
export
|
|
59
|
+
export const stubConfig = <V extends ConfigValue>(configValue: V): ConfigValueProvider<V> => configValue;
|
|
60
|
+
|
|
45
61
|
export * from './envConfig';
|
|
46
62
|
export * from './replaceConfig';
|
|
47
63
|
export * from './awsParameterConfig';
|