@openstax/ts-utils 1.34.0 → 1.35.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/README.md +90 -62
- package/dist/cjs/assertions/index.d.ts +89 -0
- package/dist/cjs/assertions/index.js +157 -0
- package/dist/cjs/aws/ssmService.d.ts +5 -0
- package/dist/cjs/aws/ssmService.js +9 -0
- package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
- package/dist/cjs/config/awsParameterConfig.js +26 -0
- package/dist/cjs/config/envConfig.d.ts +24 -0
- package/dist/cjs/config/envConfig.js +57 -0
- package/{packages/utils/src/config/index.ts → dist/cjs/config/index.d.ts} +13 -29
- package/dist/cjs/config/index.js +35 -0
- package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
- package/dist/cjs/config/lambdaParameterConfig.js +45 -0
- package/dist/cjs/config/replaceConfig.d.ts +14 -0
- package/dist/cjs/config/replaceConfig.js +22 -0
- package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
- package/dist/cjs/config/resolveConfigValue.js +12 -0
- package/dist/cjs/errors/index.d.ts +88 -0
- package/dist/cjs/errors/index.js +123 -0
- package/dist/cjs/fetch/fetchStatusRetry.d.ts +8 -0
- package/dist/cjs/fetch/fetchStatusRetry.js +27 -0
- package/dist/cjs/fetch/index.d.ts +64 -0
- package/dist/cjs/fetch/index.js +55 -0
- package/{packages/utils/src/guards/index.ts → dist/cjs/guards/index.d.ts} +7 -10
- package/dist/cjs/guards/index.js +44 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/middleware/apiErrorHandler.d.ts +24 -0
- package/dist/cjs/middleware/apiErrorHandler.js +42 -0
- package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
- package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
- package/{packages/utils/src/middleware/index.ts → dist/cjs/middleware/index.d.ts} +5 -53
- package/dist/cjs/middleware/index.js +48 -0
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
- package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +44 -0
- package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +4 -0
- package/dist/cjs/middleware/throwNotFoundMiddleware.js +14 -0
- package/dist/cjs/misc/hashValue.d.ts +10 -0
- package/dist/cjs/misc/hashValue.js +17 -0
- package/dist/cjs/misc/helpers.d.ts +124 -0
- package/dist/cjs/misc/helpers.js +214 -0
- package/dist/cjs/misc/merge.d.ts +21 -0
- package/dist/cjs/misc/merge.js +45 -0
- package/dist/cjs/misc/partitionSequence.d.ts +35 -0
- package/dist/cjs/misc/partitionSequence.js +55 -0
- package/dist/cjs/pagination/index.d.ts +91 -0
- package/dist/cjs/pagination/index.js +83 -0
- package/dist/cjs/routing/helpers.d.ts +57 -0
- package/dist/cjs/routing/helpers.js +90 -0
- package/dist/cjs/routing/index.d.ts +290 -0
- package/dist/cjs/routing/index.js +295 -0
- package/dist/cjs/routing/validators/zod.d.ts +4 -0
- package/dist/cjs/routing/validators/zod.js +14 -0
- package/dist/cjs/services/accountsGateway/index.d.ts +92 -0
- package/dist/cjs/services/accountsGateway/index.js +138 -0
- package/dist/cjs/services/apiGateway/index.d.ts +68 -0
- package/dist/cjs/services/apiGateway/index.js +118 -0
- package/dist/cjs/services/authProvider/browser.d.ts +40 -0
- package/dist/cjs/services/authProvider/browser.js +155 -0
- package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
- package/dist/cjs/services/authProvider/decryption.js +73 -0
- package/dist/cjs/services/authProvider/index.d.ts +63 -0
- package/dist/cjs/services/authProvider/index.js +34 -0
- package/dist/cjs/services/authProvider/subrequest.d.ts +13 -0
- package/dist/cjs/services/authProvider/subrequest.js +49 -0
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
- package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +91 -0
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
- package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +47 -0
- package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +13 -0
- package/dist/cjs/services/authProvider/utils/userRoleValidator.js +37 -0
- package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +3 -0
- package/dist/cjs/services/authProvider/utils/userSubrequest.js +13 -0
- package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
- package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
- package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +1 -0
- package/dist/cjs/services/documentStore/fileSystemAssert.js +14 -0
- package/{packages/utils/src/services/documentStore/index.ts → dist/cjs/services/documentStore/index.d.ts} +8 -8
- package/dist/cjs/services/documentStore/index.js +2 -0
- package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +31 -0
- package/dist/cjs/services/documentStore/unversioned/dynamodb.js +233 -0
- package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +32 -0
- package/dist/cjs/services/documentStore/unversioned/file-system.js +214 -0
- package/{packages/utils/src/services/documentStore/unversioned/index.ts → dist/cjs/services/documentStore/unversioned/index.d.ts} +0 -2
- package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
- package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +25 -0
- package/dist/cjs/services/documentStore/versioned/dynamodb.js +143 -0
- package/dist/cjs/services/documentStore/versioned/file-system.d.ts +25 -0
- package/dist/cjs/services/documentStore/versioned/file-system.js +73 -0
- package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
- package/dist/cjs/services/documentStore/versioned/index.js +2 -0
- package/dist/cjs/services/exercisesGateway/index.d.ts +67 -0
- package/dist/cjs/services/exercisesGateway/index.js +107 -0
- package/dist/cjs/services/fileServer/index.d.ts +30 -0
- package/dist/cjs/services/fileServer/index.js +19 -0
- package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
- package/dist/cjs/services/fileServer/localFileServer.js +132 -0
- package/dist/cjs/services/fileServer/s3FileServer.d.ts +14 -0
- package/dist/cjs/services/fileServer/s3FileServer.js +131 -0
- package/dist/cjs/services/launchParams/index.js +7 -0
- package/dist/cjs/services/launchParams/signer.d.ts +23 -0
- package/dist/cjs/services/launchParams/signer.js +58 -0
- package/dist/cjs/services/launchParams/verifier.d.ts +21 -0
- package/dist/cjs/services/launchParams/verifier.js +129 -0
- package/dist/cjs/services/logger/console.d.ts +4 -0
- package/dist/cjs/services/logger/console.js +12 -0
- package/{packages/utils/src/services/logger/index.ts → dist/cjs/services/logger/index.d.ts} +9 -23
- package/dist/cjs/services/logger/index.js +31 -0
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
- package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
- package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +72 -0
- package/dist/cjs/services/lrsGateway/attempt-utils.js +283 -0
- package/dist/cjs/services/lrsGateway/file-system.d.ts +15 -0
- package/dist/cjs/services/lrsGateway/file-system.js +150 -0
- package/dist/cjs/services/lrsGateway/index.d.ts +122 -0
- package/dist/cjs/services/lrsGateway/index.js +148 -0
- package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +71 -0
- package/dist/cjs/services/lrsGateway/xapiUtils.js +145 -0
- package/dist/cjs/services/postgresConnection/index.d.ts +28 -0
- package/dist/cjs/services/postgresConnection/index.js +65 -0
- package/dist/cjs/services/searchProvider/index.d.ts +69 -0
- package/dist/cjs/services/searchProvider/index.js +2 -0
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
- package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +191 -0
- package/dist/cjs/services/searchProvider/openSearch.d.ts +28 -0
- package/dist/cjs/services/searchProvider/openSearch.js +162 -0
- package/dist/cjs/services/searchProvider/streamIndexer.d.ts +17 -0
- package/dist/cjs/services/searchProvider/streamIndexer.js +41 -0
- package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
- package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
- package/dist/cjs/types.js +2 -0
- package/dist/esm/assertions/index.d.ts +89 -0
- package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
- package/dist/esm/aws/ssmService.d.ts +5 -0
- package/dist/esm/aws/ssmService.js +6 -0
- package/dist/esm/config/awsParameterConfig.d.ts +10 -0
- package/dist/esm/config/awsParameterConfig.js +22 -0
- package/dist/esm/config/envConfig.d.ts +24 -0
- package/dist/esm/config/envConfig.js +53 -0
- package/dist/esm/config/index.d.ts +48 -0
- package/dist/esm/config/index.js +17 -0
- package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
- package/dist/esm/config/lambdaParameterConfig.js +38 -0
- package/dist/esm/config/replaceConfig.d.ts +14 -0
- package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
- package/dist/esm/config/resolveConfigValue.d.ts +5 -0
- package/dist/esm/config/resolveConfigValue.js +8 -0
- package/dist/esm/errors/index.d.ts +88 -0
- package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
- package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
- package/dist/esm/fetch/fetchStatusRetry.js +23 -0
- package/dist/esm/fetch/index.d.ts +64 -0
- package/dist/esm/fetch/index.js +46 -0
- package/dist/esm/guards/index.d.ts +38 -0
- package/dist/esm/guards/index.js +36 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
- package/dist/esm/middleware/apiErrorHandler.js +38 -0
- package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
- package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
- package/dist/esm/middleware/index.d.ts +47 -0
- package/dist/esm/middleware/index.js +44 -0
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
- package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
- package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
- package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
- package/dist/esm/misc/hashValue.d.ts +10 -0
- package/dist/esm/misc/hashValue.js +13 -0
- package/dist/esm/misc/helpers.d.ts +124 -0
- package/dist/esm/misc/helpers.js +199 -0
- package/dist/esm/misc/merge.d.ts +21 -0
- package/dist/esm/misc/merge.js +40 -0
- package/dist/esm/misc/partitionSequence.d.ts +35 -0
- package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
- package/dist/esm/pagination/index.d.ts +91 -0
- package/dist/esm/pagination/index.js +77 -0
- package/dist/esm/routing/helpers.d.ts +57 -0
- package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
- package/dist/esm/routing/index.d.ts +290 -0
- package/dist/esm/routing/index.js +246 -0
- package/dist/esm/routing/validators/zod.d.ts +4 -0
- package/dist/esm/routing/validators/zod.js +10 -0
- package/dist/esm/services/accountsGateway/index.d.ts +92 -0
- package/dist/esm/services/accountsGateway/index.js +131 -0
- package/dist/esm/services/apiGateway/index.d.ts +68 -0
- package/dist/esm/services/apiGateway/index.js +77 -0
- package/dist/esm/services/authProvider/browser.d.ts +40 -0
- package/dist/esm/services/authProvider/browser.js +151 -0
- package/dist/esm/services/authProvider/decryption.d.ts +19 -0
- package/dist/esm/services/authProvider/decryption.js +69 -0
- package/dist/esm/services/authProvider/index.d.ts +63 -0
- package/dist/esm/services/authProvider/index.js +26 -0
- package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
- package/dist/esm/services/authProvider/subrequest.js +45 -0
- package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
- package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
- package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
- package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
- package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
- package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
- package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
- package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
- package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
- package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
- package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
- package/dist/esm/services/documentStore/index.d.ts +14 -0
- package/dist/esm/services/documentStore/index.js +1 -0
- package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
- package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
- package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
- package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
- package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
- package/dist/esm/services/documentStore/unversioned/index.js +1 -0
- package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
- package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
- package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
- package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
- package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
- package/dist/esm/services/documentStore/versioned/index.js +1 -0
- package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
- package/dist/esm/services/exercisesGateway/index.js +70 -0
- package/dist/esm/services/fileServer/index.d.ts +30 -0
- package/dist/esm/services/fileServer/index.js +13 -0
- package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
- package/dist/esm/services/fileServer/localFileServer.js +125 -0
- package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
- package/dist/esm/services/fileServer/s3FileServer.js +124 -0
- package/dist/esm/services/launchParams/index.d.ts +2 -0
- package/dist/esm/services/launchParams/index.js +2 -0
- package/dist/esm/services/launchParams/signer.d.ts +23 -0
- package/dist/esm/services/launchParams/signer.js +51 -0
- package/dist/esm/services/launchParams/verifier.d.ts +21 -0
- package/dist/esm/services/launchParams/verifier.js +92 -0
- package/dist/esm/services/logger/console.d.ts +4 -0
- package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
- package/dist/esm/services/logger/index.d.ts +39 -0
- package/dist/esm/services/logger/index.js +27 -0
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
- package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
- package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
- package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
- package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
- package/dist/esm/services/lrsGateway/file-system.js +110 -0
- package/dist/esm/services/lrsGateway/index.d.ts +122 -0
- package/dist/esm/services/lrsGateway/index.js +111 -0
- package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
- package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
- package/dist/esm/services/postgresConnection/index.d.ts +28 -0
- package/dist/esm/services/postgresConnection/index.js +58 -0
- package/dist/esm/services/searchProvider/index.d.ts +69 -0
- package/dist/esm/services/searchProvider/index.js +1 -0
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
- package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
- package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
- package/dist/esm/services/searchProvider/openSearch.js +158 -0
- package/dist/esm/services/searchProvider/streamIndexer.d.ts +17 -0
- package/dist/esm/services/searchProvider/streamIndexer.js +37 -0
- package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +31 -0
- package/dist/esm/types.js +1 -0
- package/package.json +234 -12
- package/.cfnlintrc +0 -2
- package/.github/CODEOWNERS +0 -1
- package/.github/workflows/ci.yml +0 -36
- package/.github/workflows/lint.yml +0 -55
- package/.nvmrc +0 -1
- package/.syncignore +0 -4
- package/.syncpackrc +0 -18
- package/CONTRIBUTING.md +0 -96
- package/LICENSE +0 -661
- package/Procfile +0 -1
- package/app.json +0 -23
- package/cspell.json +0 -32
- package/deploy/constants.env +0 -21
- package/deploy/deploy.bash +0 -157
- package/deploy/deployment-alt-region.cfn.yml +0 -70
- package/deploy/deployment.cfn.yml +0 -650
- package/deploy/destroy-deployment.bash +0 -23
- package/deploy/shared.cfn.yml +0 -94
- package/docs/lambda-build.md +0 -35
- package/packages/frontend/README.md +0 -46
- package/packages/frontend/package.json +0 -101
- package/packages/frontend/public/favicon.ico +0 -0
- package/packages/frontend/public/index.html +0 -107
- package/packages/frontend/public/maintenance.html +0 -59
- package/packages/frontend/public/manifest.json +0 -15
- package/packages/frontend/public/robots.txt +0 -3
- package/packages/frontend/script/make-certificate.bash +0 -49
- package/packages/frontend/script/server/cli.js +0 -11
- package/packages/frontend/script/server/index.js +0 -47
- package/packages/frontend/script/start.bash +0 -22
- package/packages/frontend/script/trust-localhost.bash +0 -7
- package/packages/frontend/src/auth/authProvider.ts +0 -10
- package/packages/frontend/src/auth/useAuth.ts +0 -33
- package/packages/frontend/src/components/Pagination.tsx +0 -26
- package/packages/frontend/src/configProvider/index.ts +0 -53
- package/packages/frontend/src/configProvider/use.ts +0 -41
- package/packages/frontend/src/core/context/services.spec.tsx +0 -39
- package/packages/frontend/src/core/context/services.tsx +0 -16
- package/packages/frontend/src/core/index.spec.ts +0 -7
- package/packages/frontend/src/core/index.ts +0 -20
- package/packages/frontend/src/core/services.tsx +0 -14
- package/packages/frontend/src/core/types.ts +0 -3
- package/packages/frontend/src/example/api.ts +0 -28
- package/packages/frontend/src/example/components/Layout.tsx +0 -23
- package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
- package/packages/frontend/src/example/screens/Home.tsx +0 -78
- package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
- package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
- package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
- package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
- package/packages/frontend/src/example/screens/index.ts +0 -9
- package/packages/frontend/src/index.css +0 -159
- package/packages/frontend/src/index.tsx +0 -67
- package/packages/frontend/src/react-app-env.d.ts +0 -1
- package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
- package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
- package/packages/frontend/src/routing/middleware.ts +0 -6
- package/packages/frontend/src/routing/useQuery.ts +0 -14
- package/packages/frontend/src/setupProxy.js +0 -19
- package/packages/frontend/src/setupTests.ts +0 -9
- package/packages/frontend/src/tests/testServices.tsx +0 -23
- package/packages/frontend/tsconfig.json +0 -27
- package/packages/lambda/.eslintrc.js +0 -64
- package/packages/lambda/jest-global-setup.js +0 -3
- package/packages/lambda/jest-setup-after-env.js +0 -1
- package/packages/lambda/jest.config.js +0 -31
- package/packages/lambda/jest.resolver.js +0 -17
- package/packages/lambda/package.json +0 -68
- package/packages/lambda/script/build.bash +0 -19
- package/packages/lambda/script/bundle-functions.bash +0 -10
- package/packages/lambda/script/lambdaLocalProxy.js +0 -16
- package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
- package/packages/lambda/script/utils/getRouteData.ts +0 -7
- package/packages/lambda/script/utils/routeDataLoader.js +0 -8
- package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
- package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
- package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
- package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
- package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
- package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
- package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
- package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
- package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
- package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
- package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
- package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
- package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
- package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
- package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
- package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
- package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
- package/packages/lambda/tsconfig.json +0 -30
- package/packages/lambda/webpack.config.js +0 -97
- package/packages/utils/.eslintrc.js +0 -64
- package/packages/utils/README.md +0 -118
- package/packages/utils/jest-global-setup.js +0 -3
- package/packages/utils/jest.config.js +0 -25
- package/packages/utils/jest.resolver.js +0 -17
- package/packages/utils/package.json +0 -238
- package/packages/utils/src/assertions/index.spec.ts +0 -126
- package/packages/utils/src/aws/ssmService.ts +0 -7
- package/packages/utils/src/config/awsParameterConfig.ts +0 -24
- package/packages/utils/src/config/envConfig.ts +0 -58
- package/packages/utils/src/config/index.spec.ts +0 -165
- package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
- package/packages/utils/src/config/resolveConfigValue.ts +0 -10
- package/packages/utils/src/errors/index.spec.ts +0 -35
- package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
- package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
- package/packages/utils/src/fetch/index.spec.ts +0 -34
- package/packages/utils/src/fetch/index.ts +0 -87
- package/packages/utils/src/guards/index.spec.ts +0 -58
- package/packages/utils/src/index.spec.ts +0 -471
- package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
- package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
- package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
- package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
- package/packages/utils/src/middleware/index.spec.ts +0 -99
- package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
- package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
- package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
- package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
- package/packages/utils/src/misc/hashValue.ts +0 -18
- package/packages/utils/src/misc/helpers.ts +0 -259
- package/packages/utils/src/misc/merge.ts +0 -48
- package/packages/utils/src/pagination/index.spec.ts +0 -150
- package/packages/utils/src/pagination/index.ts +0 -117
- package/packages/utils/src/routing/index.spec.ts +0 -553
- package/packages/utils/src/routing/index.ts +0 -424
- package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
- package/packages/utils/src/routing/validators/zod.ts +0 -14
- package/packages/utils/src/services/accountsGateway/README.md +0 -3
- package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
- package/packages/utils/src/services/accountsGateway/index.ts +0 -251
- package/packages/utils/src/services/apiGateway/README.md +0 -93
- package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
- package/packages/utils/src/services/apiGateway/index.ts +0 -189
- package/packages/utils/src/services/authProvider/README.md +0 -21
- package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
- package/packages/utils/src/services/authProvider/browser.ts +0 -209
- package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
- package/packages/utils/src/services/authProvider/decryption.ts +0 -98
- package/packages/utils/src/services/authProvider/index.ts +0 -93
- package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
- package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
- package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
- package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
- package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
- package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
- package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
- package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
- package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
- package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
- package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
- package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
- package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
- package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
- package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
- package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
- package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
- package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
- package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
- package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
- package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
- package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
- package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
- package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
- package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
- package/packages/utils/src/services/exercisesGateway/README.md +0 -5
- package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
- package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
- package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
- package/packages/utils/src/services/fileServer/index.ts +0 -43
- package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
- package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
- package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
- package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
- package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
- package/packages/utils/src/services/launchParams/signer.ts +0 -73
- package/packages/utils/src/services/launchParams/verifier.ts +0 -120
- package/packages/utils/src/services/logger/console.spec.ts +0 -29
- package/packages/utils/src/services/logger/index.spec.ts +0 -65
- package/packages/utils/src/services/lrsGateway/README.md +0 -5
- package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
- package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
- package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
- package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
- package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
- package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
- package/packages/utils/src/services/lrsGateway/index.ts +0 -257
- package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
- package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
- package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
- package/packages/utils/src/services/postgresConnection/index.ts +0 -84
- package/packages/utils/src/services/searchProvider/README.md +0 -3
- package/packages/utils/src/services/searchProvider/index.ts +0 -59
- package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
- package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
- package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
- package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
- package/packages/utils/tsconfig.json +0 -31
- package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
- package/packages/utils/tsconfig.without-specs.esm.json +0 -7
- package/packages/utils/tsconfig.without-specs.json +0 -6
- package/scripts/build.bash +0 -24
- package/scripts/ci.bash +0 -10
- package/scripts/start.bash +0 -29
- /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
- /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
- /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
- /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
- /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
- /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
- /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
- /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
- /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
- /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
- /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
- /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
- /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
- /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
- /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
- /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
- /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
- /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
- /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
- /package/{packages/utils/script → script}/bin/which.bash +0 -0
- /package/{packages/utils/script → script}/bin-entry.bash +0 -0
- /package/{packages/utils/script → script}/build.bash +0 -0
|
@@ -1,126 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,24 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,58 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,165 +0,0 @@
|
|
|
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
|
-
});
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { GetParameterCommandOutput } from '@aws-sdk/client-ssm';
|
|
2
|
-
import fetch from 'node-fetch';
|
|
3
|
-
import { assertDefined } from '../assertions';
|
|
4
|
-
import { retryWithDelay } from '../misc/helpers';
|
|
5
|
-
import { envConfig } from './envConfig';
|
|
6
|
-
import { ConfigValueProvider, resolveConfigValue } from '.';
|
|
7
|
-
|
|
8
|
-
const lambdaExtensionUrl = 'http://localhost:2773';
|
|
9
|
-
let lambdaExtensionReadyPromise: Promise<unknown>;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Returns a value from the AWS Parameter Store. Can only be used during in AWS Lambda, and
|
|
13
|
-
* requires that the AWS Parameters and Secrets Lambda Extension Layer be included in the Lambda.
|
|
14
|
-
* This extension has built-in caching for requested parameters.
|
|
15
|
-
*
|
|
16
|
-
* @param parameterName the name of the parameter; can be a literal name (string) or can itself
|
|
17
|
-
* be accessed via another parameter by giving a configuration value provider.
|
|
18
|
-
* @example const someValue = resolveConfig(lambdaParameterConfig('some-parameter-name'));
|
|
19
|
-
* @returns the configuration value provider for the value
|
|
20
|
-
*/
|
|
21
|
-
export const lambdaParameterConfig = (parameterName: ConfigValueProvider<string>): ConfigValueProvider<string> => async() => {
|
|
22
|
-
const token = await resolveConfigValue(envConfig('AWS_SESSION_TOKEN', 'runtime'));
|
|
23
|
-
const name = await resolveConfigValue(parameterName);
|
|
24
|
-
|
|
25
|
-
if (!lambdaExtensionReadyPromise) {
|
|
26
|
-
// This request will return 400 Bad Request,
|
|
27
|
-
// but we only care that it'll block until the extension is ready
|
|
28
|
-
lambdaExtensionReadyPromise = retryWithDelay(() => fetch(lambdaExtensionUrl));
|
|
29
|
-
}
|
|
30
|
-
await lambdaExtensionReadyPromise;
|
|
31
|
-
|
|
32
|
-
const resp = await retryWithDelay(() => fetch(
|
|
33
|
-
// Port 2773 is the default port for the extension
|
|
34
|
-
`${lambdaExtensionUrl}/systemsmanager/parameters/get?name=${name}&withDecryption=true`,
|
|
35
|
-
{ headers: { 'X-Aws-Parameters-Secrets-Token': token } }
|
|
36
|
-
));
|
|
37
|
-
|
|
38
|
-
if (resp.ok) {
|
|
39
|
-
const response = await resp.json() as GetParameterCommandOutput;
|
|
40
|
-
const parameter = assertDefined(
|
|
41
|
-
response.Parameter, `aws GetParameter response missing Parameter key for ${name}"`
|
|
42
|
-
);
|
|
43
|
-
return assertDefined(parameter.Value, `aws GetParameter response missing Parameter.Value key for ${name}"`);
|
|
44
|
-
} else {
|
|
45
|
-
throw new Error(
|
|
46
|
-
`HTTP Error Response ${resp.status} ${resp.statusText} while fetching parameter ${name}`
|
|
47
|
-
);
|
|
48
|
-
}
|
|
49
|
-
};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ConfigValue, ConfigValueProvider } from '.';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* resolves a config value into a string, to be used inside of things that are provided configurations
|
|
5
|
-
*/
|
|
6
|
-
export const resolveConfigValue = async<V extends ConfigValue>(provider: ConfigValueProvider<V>): Promise<V> => {
|
|
7
|
-
return typeof provider === 'function'
|
|
8
|
-
? await provider()
|
|
9
|
-
: provider;
|
|
10
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { ConflictError, ForbiddenError, InvalidRequestError, NotFoundError, SessionExpiredError, UnauthorizedError } from '.';
|
|
2
|
-
|
|
3
|
-
describe('errorIsType', () => {
|
|
4
|
-
it('returns true for same error type', () => {
|
|
5
|
-
expect(InvalidRequestError.matches(new InvalidRequestError())).toBe(true);
|
|
6
|
-
});
|
|
7
|
-
it('returns false for different error type', () => {
|
|
8
|
-
expect(InvalidRequestError.matches(new UnauthorizedError())).toBe(false);
|
|
9
|
-
});
|
|
10
|
-
it('returns false random input', () => {
|
|
11
|
-
expect(InvalidRequestError.matches(new Error())).toBe(false);
|
|
12
|
-
expect(InvalidRequestError.matches('asdf')).toBe(false);
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe('custom error constructors', () => {
|
|
17
|
-
it('use TYPE as default message', () => {
|
|
18
|
-
expect(new InvalidRequestError().message).toBe(InvalidRequestError.TYPE);
|
|
19
|
-
expect(new UnauthorizedError().message).toBe(UnauthorizedError.TYPE);
|
|
20
|
-
expect(new ForbiddenError().message).toBe(ForbiddenError.TYPE);
|
|
21
|
-
expect(new NotFoundError().message).toBe(NotFoundError.TYPE);
|
|
22
|
-
expect(new SessionExpiredError().message).toBe(SessionExpiredError.TYPE);
|
|
23
|
-
expect(new ConflictError().message).toBe(ConflictError.TYPE);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('allow custom messages', () => {
|
|
27
|
-
const customMessage = 'Some Error';
|
|
28
|
-
expect(new InvalidRequestError(customMessage).message).toBe(customMessage);
|
|
29
|
-
expect(new UnauthorizedError(customMessage).message).toBe(customMessage);
|
|
30
|
-
expect(new ForbiddenError(customMessage).message).toBe(customMessage);
|
|
31
|
-
expect(new NotFoundError(customMessage).message).toBe(customMessage);
|
|
32
|
-
expect(new SessionExpiredError(customMessage).message).toBe(customMessage);
|
|
33
|
-
expect(new ConflictError(customMessage).message).toBe(customMessage);
|
|
34
|
-
});
|
|
35
|
-
});
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { fetchStatusRetry } from './fetchStatusRetry';
|
|
2
|
-
import { Response } from '.';
|
|
3
|
-
|
|
4
|
-
describe('fetchStatusRetry', () => {
|
|
5
|
-
let setTimeoutSpy: jest.SpyInstance;
|
|
6
|
-
let timeouts: Array<number | undefined>;
|
|
7
|
-
|
|
8
|
-
const doBeforeEach = () => {
|
|
9
|
-
timeouts = [];
|
|
10
|
-
setTimeoutSpy = jest.spyOn(global, 'setTimeout')
|
|
11
|
-
.mockImplementation((fn, timeout) => {
|
|
12
|
-
timeouts.push(timeout);
|
|
13
|
-
fn();
|
|
14
|
-
return 1 as any;
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const doAfterEach = () => {
|
|
19
|
-
setTimeoutSpy.mockReset();
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
beforeEach(doBeforeEach);
|
|
23
|
-
afterEach(doAfterEach);
|
|
24
|
-
|
|
25
|
-
it('fetches normally', async() => {
|
|
26
|
-
const base = jest.fn();
|
|
27
|
-
const withRetry = fetchStatusRetry(base, {status: [502], retries: 7});
|
|
28
|
-
|
|
29
|
-
const response: Response = {
|
|
30
|
-
status: 200,
|
|
31
|
-
headers: {get: () => 'application/json'},
|
|
32
|
-
json: () => Promise.resolve({}),
|
|
33
|
-
text: () => Promise.resolve('some error')
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
37
|
-
|
|
38
|
-
expect(await withRetry('/some/url')).toBe(response);
|
|
39
|
-
expect(base).toHaveBeenCalledTimes(1);
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it('fetches normally with no statuses', async() => {
|
|
43
|
-
const base = jest.fn();
|
|
44
|
-
const withRetry = fetchStatusRetry(base, {retries: 7});
|
|
45
|
-
|
|
46
|
-
const response: Response = {
|
|
47
|
-
status: 200,
|
|
48
|
-
headers: {get: () => 'application/json'},
|
|
49
|
-
json: () => Promise.resolve({}),
|
|
50
|
-
text: () => Promise.resolve('some error')
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
54
|
-
|
|
55
|
-
expect(await withRetry('/some/url')).toBe(response);
|
|
56
|
-
expect(base).toHaveBeenCalledTimes(1);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('retries on bad status', async() => {
|
|
60
|
-
const base = jest.fn();
|
|
61
|
-
const withRetry = fetchStatusRetry(base, {status: [502], retries: 7});
|
|
62
|
-
|
|
63
|
-
base.mockReturnValueOnce(Promise.resolve({
|
|
64
|
-
status: 502,
|
|
65
|
-
headers: {get: () => 'application/json'},
|
|
66
|
-
json: () => Promise.resolve({}),
|
|
67
|
-
text: () => Promise.resolve('some error')
|
|
68
|
-
}));
|
|
69
|
-
|
|
70
|
-
const response: Response = {
|
|
71
|
-
status: 200,
|
|
72
|
-
headers: {get: () => 'application/json'},
|
|
73
|
-
json: () => Promise.resolve({}),
|
|
74
|
-
text: () => Promise.resolve('some error')
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
78
|
-
|
|
79
|
-
expect(await withRetry('/some/url')).toBe(response);
|
|
80
|
-
expect(base).toHaveBeenCalledTimes(2);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
it('has limited retries', async() => {
|
|
84
|
-
const base = jest.fn();
|
|
85
|
-
const withRetry = fetchStatusRetry(base, {status: [502], retries: 1});
|
|
86
|
-
|
|
87
|
-
base.mockReturnValueOnce(Promise.resolve({
|
|
88
|
-
status: 502,
|
|
89
|
-
headers: {get: () => 'application/json'},
|
|
90
|
-
json: () => Promise.resolve({}),
|
|
91
|
-
text: () => Promise.resolve('some error')
|
|
92
|
-
}));
|
|
93
|
-
base.mockReturnValueOnce(Promise.resolve({
|
|
94
|
-
status: 502,
|
|
95
|
-
headers: {get: () => 'application/json'},
|
|
96
|
-
json: () => Promise.resolve({}),
|
|
97
|
-
text: () => Promise.resolve('some error')
|
|
98
|
-
}));
|
|
99
|
-
|
|
100
|
-
const response: Response = {
|
|
101
|
-
status: 200,
|
|
102
|
-
headers: {get: () => 'application/json'},
|
|
103
|
-
json: () => Promise.resolve({}),
|
|
104
|
-
text: () => Promise.resolve('some error')
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
108
|
-
|
|
109
|
-
await expect(withRetry('/some/url')).rejects.toThrowErrorMatchingInlineSnapshot('"fetch failed /some/url -- 502: some error"');
|
|
110
|
-
expect(base).toHaveBeenCalledTimes(2);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('retries on failed fetch', async() => {
|
|
114
|
-
const base = jest.fn();
|
|
115
|
-
const withRetry = fetchStatusRetry(base, {status: [502], retries: 7});
|
|
116
|
-
|
|
117
|
-
base.mockReturnValueOnce(Promise.reject(new Error('type error failed to fetch or whatever')));
|
|
118
|
-
|
|
119
|
-
const response: Response = {
|
|
120
|
-
status: 200,
|
|
121
|
-
headers: {get: () => 'application/json'},
|
|
122
|
-
json: () => Promise.resolve({}),
|
|
123
|
-
text: () => Promise.resolve('some error')
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
127
|
-
|
|
128
|
-
expect(await withRetry('/some/url')).toBe(response);
|
|
129
|
-
expect(base).toHaveBeenCalledTimes(2);
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
it('has limited retries on failed to fetch', async() => {
|
|
133
|
-
const base = jest.fn();
|
|
134
|
-
const withRetry = fetchStatusRetry(base, {status: [502], retries: 1});
|
|
135
|
-
|
|
136
|
-
base.mockReturnValueOnce(Promise.reject(new Error('type error failed to fetch or whatever')));
|
|
137
|
-
base.mockReturnValueOnce(Promise.reject(new Error('type error failed to fetch or whatever')));
|
|
138
|
-
|
|
139
|
-
const response: Response = {
|
|
140
|
-
status: 200,
|
|
141
|
-
headers: {get: () => 'application/json'},
|
|
142
|
-
json: () => Promise.resolve({}),
|
|
143
|
-
text: () => Promise.resolve('some error')
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
147
|
-
|
|
148
|
-
await expect(withRetry('/some/url')).rejects.toThrowErrorMatchingInlineSnapshot('"type error failed to fetch or whatever"');
|
|
149
|
-
expect(base).toHaveBeenCalledTimes(2);
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
describe('timeout functionality', () => {
|
|
153
|
-
beforeEach(() => {
|
|
154
|
-
setTimeoutSpy.mockRestore();
|
|
155
|
-
jest.useFakeTimers();
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
afterEach(() => {
|
|
159
|
-
jest.useRealTimers();
|
|
160
|
-
doBeforeEach();
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('fetches normally with timeout option but completes before timeout', async() => {
|
|
164
|
-
const base = jest.fn();
|
|
165
|
-
const withRetry = fetchStatusRetry(base, {status: [502], timeout: 1000, retries: 1});
|
|
166
|
-
|
|
167
|
-
const response: Response = {
|
|
168
|
-
status: 200,
|
|
169
|
-
headers: {get: () => 'application/json'},
|
|
170
|
-
json: () => Promise.resolve({}),
|
|
171
|
-
text: () => Promise.resolve('some error')
|
|
172
|
-
};
|
|
173
|
-
|
|
174
|
-
base.mockReturnValue(Promise.resolve(response));
|
|
175
|
-
|
|
176
|
-
const result = withRetry('/some/url');
|
|
177
|
-
expect(await result).toBe(response);
|
|
178
|
-
expect(base).toHaveBeenCalledTimes(1);
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it('times out when request takes too long', async() => {
|
|
182
|
-
const base = jest.fn();
|
|
183
|
-
const withRetry = fetchStatusRetry(base, {timeout: 100, retries: 0});
|
|
184
|
-
|
|
185
|
-
const pendingPromise = new Promise(() => {});
|
|
186
|
-
base.mockReturnValue(pendingPromise);
|
|
187
|
-
|
|
188
|
-
const resultPromise = withRetry('/some/url');
|
|
189
|
-
|
|
190
|
-
jest.advanceTimersByTime(100);
|
|
191
|
-
|
|
192
|
-
await expect(resultPromise).rejects.toThrowErrorMatchingInlineSnapshot('"fetch timeout after 100ms: /some/url"');
|
|
193
|
-
expect(base).toHaveBeenCalledTimes(1);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
});
|
|
197
|
-
});
|