@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.
Files changed (504) hide show
  1. package/.cfnlintrc +2 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/workflows/ci.yml +36 -0
  4. package/.github/workflows/lint.yml +55 -0
  5. package/.nvmrc +1 -0
  6. package/.syncignore +4 -0
  7. package/.syncpackrc +18 -0
  8. package/CONTRIBUTING.md +96 -0
  9. package/LICENSE +661 -0
  10. package/Procfile +1 -0
  11. package/README.md +62 -90
  12. package/app.json +23 -0
  13. package/cspell.json +32 -0
  14. package/deploy/constants.env +21 -0
  15. package/deploy/deploy.bash +157 -0
  16. package/deploy/deployment-alt-region.cfn.yml +70 -0
  17. package/deploy/deployment.cfn.yml +650 -0
  18. package/deploy/destroy-deployment.bash +23 -0
  19. package/deploy/shared.cfn.yml +94 -0
  20. package/docs/lambda-build.md +35 -0
  21. package/package.json +12 -228
  22. package/packages/frontend/README.md +46 -0
  23. package/packages/frontend/package.json +101 -0
  24. package/packages/frontend/public/favicon.ico +0 -0
  25. package/packages/frontend/public/index.html +107 -0
  26. package/packages/frontend/public/maintenance.html +59 -0
  27. package/packages/frontend/public/manifest.json +15 -0
  28. package/packages/frontend/public/robots.txt +3 -0
  29. package/packages/frontend/script/make-certificate.bash +49 -0
  30. package/packages/frontend/script/server/cli.js +11 -0
  31. package/packages/frontend/script/server/index.js +47 -0
  32. package/packages/frontend/script/start.bash +22 -0
  33. package/packages/frontend/script/trust-localhost.bash +7 -0
  34. package/packages/frontend/src/auth/authProvider.ts +10 -0
  35. package/packages/frontend/src/auth/useAuth.ts +33 -0
  36. package/packages/frontend/src/components/Pagination.tsx +26 -0
  37. package/packages/frontend/src/configProvider/index.ts +53 -0
  38. package/packages/frontend/src/configProvider/use.ts +41 -0
  39. package/packages/frontend/src/core/context/services.spec.tsx +39 -0
  40. package/packages/frontend/src/core/context/services.tsx +16 -0
  41. package/packages/frontend/src/core/index.spec.ts +7 -0
  42. package/packages/frontend/src/core/index.ts +20 -0
  43. package/packages/frontend/src/core/services.tsx +14 -0
  44. package/packages/frontend/src/core/types.ts +3 -0
  45. package/packages/frontend/src/example/api.ts +28 -0
  46. package/packages/frontend/src/example/components/Layout.tsx +23 -0
  47. package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
  48. package/packages/frontend/src/example/screens/Home.tsx +78 -0
  49. package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
  50. package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
  51. package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
  52. package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
  53. package/packages/frontend/src/example/screens/index.ts +9 -0
  54. package/packages/frontend/src/index.css +159 -0
  55. package/packages/frontend/src/index.tsx +67 -0
  56. package/packages/frontend/src/react-app-env.d.ts +1 -0
  57. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
  58. package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
  59. package/packages/frontend/src/routing/middleware.ts +6 -0
  60. package/packages/frontend/src/routing/useQuery.ts +14 -0
  61. package/packages/frontend/src/setupProxy.js +19 -0
  62. package/packages/frontend/src/setupTests.ts +9 -0
  63. package/packages/frontend/src/tests/testServices.tsx +23 -0
  64. package/packages/frontend/tsconfig.json +27 -0
  65. package/packages/lambda/.eslintrc.js +64 -0
  66. package/packages/lambda/jest-global-setup.js +3 -0
  67. package/packages/lambda/jest-setup-after-env.js +1 -0
  68. package/packages/lambda/jest.config.js +31 -0
  69. package/packages/lambda/jest.resolver.js +17 -0
  70. package/packages/lambda/package.json +68 -0
  71. package/packages/lambda/script/build.bash +19 -0
  72. package/packages/lambda/script/bundle-functions.bash +10 -0
  73. package/packages/lambda/script/lambdaLocalProxy.js +16 -0
  74. package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
  75. package/packages/lambda/script/utils/getRouteData.ts +7 -0
  76. package/packages/lambda/script/utils/routeDataLoader.js +8 -0
  77. package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
  78. package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
  79. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
  80. package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
  81. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
  82. package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
  83. package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
  84. package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
  85. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
  86. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
  87. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
  88. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
  89. package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
  90. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
  91. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
  92. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
  93. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
  94. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
  95. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
  96. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
  97. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
  98. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
  99. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
  100. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
  101. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
  102. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
  103. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
  104. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
  105. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
  106. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
  107. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
  108. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
  109. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
  110. package/packages/lambda/tsconfig.json +30 -0
  111. package/packages/lambda/webpack.config.js +97 -0
  112. package/packages/utils/.eslintrc.js +64 -0
  113. package/packages/utils/README.md +118 -0
  114. package/packages/utils/jest-global-setup.js +3 -0
  115. package/packages/utils/jest.config.js +25 -0
  116. package/packages/utils/jest.resolver.js +17 -0
  117. package/packages/utils/package.json +238 -0
  118. package/packages/utils/src/assertions/index.spec.ts +126 -0
  119. package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
  120. package/packages/utils/src/aws/ssmService.ts +7 -0
  121. package/packages/utils/src/config/awsParameterConfig.ts +24 -0
  122. package/packages/utils/src/config/envConfig.ts +58 -0
  123. package/packages/utils/src/config/index.spec.ts +165 -0
  124. package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
  125. package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
  126. package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
  127. package/packages/utils/src/config/resolveConfigValue.ts +10 -0
  128. package/packages/utils/src/errors/index.spec.ts +35 -0
  129. package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
  130. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
  131. package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
  132. package/packages/utils/src/fetch/index.spec.ts +34 -0
  133. package/packages/utils/src/fetch/index.ts +87 -0
  134. package/packages/utils/src/guards/index.spec.ts +58 -0
  135. package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
  136. package/packages/utils/src/index.spec.ts +471 -0
  137. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
  138. package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
  139. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
  140. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
  141. package/packages/utils/src/middleware/index.spec.ts +99 -0
  142. package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
  143. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
  144. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
  145. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
  146. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
  147. package/packages/utils/src/misc/hashValue.ts +18 -0
  148. package/packages/utils/src/misc/helpers.ts +259 -0
  149. package/packages/utils/src/misc/merge.ts +48 -0
  150. package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
  151. package/packages/utils/src/pagination/index.spec.ts +150 -0
  152. package/packages/utils/src/pagination/index.ts +117 -0
  153. package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
  154. package/packages/utils/src/routing/index.spec.ts +553 -0
  155. package/packages/utils/src/routing/index.ts +424 -0
  156. package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
  157. package/packages/utils/src/routing/validators/zod.ts +14 -0
  158. package/packages/utils/src/services/accountsGateway/README.md +3 -0
  159. package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
  160. package/packages/utils/src/services/accountsGateway/index.ts +251 -0
  161. package/packages/utils/src/services/apiGateway/README.md +93 -0
  162. package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
  163. package/packages/utils/src/services/apiGateway/index.ts +189 -0
  164. package/packages/utils/src/services/authProvider/README.md +21 -0
  165. package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
  166. package/packages/utils/src/services/authProvider/browser.ts +209 -0
  167. package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
  168. package/packages/utils/src/services/authProvider/decryption.ts +98 -0
  169. package/packages/utils/src/services/authProvider/index.ts +93 -0
  170. package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
  171. package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
  172. package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
  173. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
  174. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
  175. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
  176. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
  177. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
  178. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
  179. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
  180. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
  181. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
  182. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
  183. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
  184. package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
  185. package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
  186. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
  187. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
  188. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
  189. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
  190. package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
  191. package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
  192. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
  193. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
  194. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
  195. package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
  196. package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
  197. package/packages/utils/src/services/exercisesGateway/README.md +5 -0
  198. package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
  199. package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
  200. package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
  201. package/packages/utils/src/services/fileServer/index.ts +43 -0
  202. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
  203. package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
  204. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
  205. package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
  206. package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
  207. package/packages/utils/src/services/launchParams/signer.ts +73 -0
  208. package/packages/utils/src/services/launchParams/verifier.ts +120 -0
  209. package/packages/utils/src/services/logger/console.spec.ts +29 -0
  210. package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
  211. package/packages/utils/src/services/logger/index.spec.ts +65 -0
  212. package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
  213. package/packages/utils/src/services/lrsGateway/README.md +5 -0
  214. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
  215. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
  216. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
  217. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
  218. package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
  219. package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
  220. package/packages/utils/src/services/lrsGateway/index.ts +257 -0
  221. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
  222. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
  223. package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
  224. package/packages/utils/src/services/postgresConnection/index.ts +84 -0
  225. package/packages/utils/src/services/searchProvider/README.md +3 -0
  226. package/packages/utils/src/services/searchProvider/index.ts +59 -0
  227. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
  228. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
  229. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
  230. package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
  231. package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
  232. package/packages/utils/tsconfig.json +31 -0
  233. package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
  234. package/packages/utils/tsconfig.without-specs.esm.json +7 -0
  235. package/packages/utils/tsconfig.without-specs.json +6 -0
  236. package/scripts/build.bash +24 -0
  237. package/scripts/ci.bash +10 -0
  238. package/scripts/start.bash +29 -0
  239. package/dist/cjs/assertions/index.d.ts +0 -89
  240. package/dist/cjs/assertions/index.js +0 -157
  241. package/dist/cjs/aws/ssmService.d.ts +0 -5
  242. package/dist/cjs/aws/ssmService.js +0 -9
  243. package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
  244. package/dist/cjs/config/awsParameterConfig.js +0 -26
  245. package/dist/cjs/config/envConfig.d.ts +0 -24
  246. package/dist/cjs/config/envConfig.js +0 -57
  247. package/dist/cjs/config/index.d.ts +0 -48
  248. package/dist/cjs/config/index.js +0 -35
  249. package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
  250. package/dist/cjs/config/lambdaParameterConfig.js +0 -45
  251. package/dist/cjs/config/replaceConfig.d.ts +0 -14
  252. package/dist/cjs/config/replaceConfig.js +0 -22
  253. package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
  254. package/dist/cjs/config/resolveConfigValue.js +0 -12
  255. package/dist/cjs/errors/index.d.ts +0 -88
  256. package/dist/cjs/errors/index.js +0 -123
  257. package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
  258. package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
  259. package/dist/cjs/fetch/index.d.ts +0 -64
  260. package/dist/cjs/fetch/index.js +0 -55
  261. package/dist/cjs/guards/index.d.ts +0 -38
  262. package/dist/cjs/guards/index.js +0 -44
  263. package/dist/cjs/index.js +0 -20
  264. package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
  265. package/dist/cjs/middleware/apiErrorHandler.js +0 -42
  266. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  267. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
  268. package/dist/cjs/middleware/index.js +0 -48
  269. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  270. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
  271. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
  272. package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
  273. package/dist/cjs/misc/hashValue.d.ts +0 -10
  274. package/dist/cjs/misc/hashValue.js +0 -17
  275. package/dist/cjs/misc/helpers.d.ts +0 -124
  276. package/dist/cjs/misc/helpers.js +0 -214
  277. package/dist/cjs/misc/merge.d.ts +0 -21
  278. package/dist/cjs/misc/merge.js +0 -45
  279. package/dist/cjs/misc/partitionSequence.d.ts +0 -35
  280. package/dist/cjs/misc/partitionSequence.js +0 -55
  281. package/dist/cjs/pagination/index.d.ts +0 -91
  282. package/dist/cjs/pagination/index.js +0 -83
  283. package/dist/cjs/routing/helpers.d.ts +0 -57
  284. package/dist/cjs/routing/helpers.js +0 -90
  285. package/dist/cjs/routing/index.d.ts +0 -290
  286. package/dist/cjs/routing/index.js +0 -295
  287. package/dist/cjs/routing/validators/zod.d.ts +0 -4
  288. package/dist/cjs/routing/validators/zod.js +0 -14
  289. package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
  290. package/dist/cjs/services/accountsGateway/index.js +0 -138
  291. package/dist/cjs/services/apiGateway/index.d.ts +0 -68
  292. package/dist/cjs/services/apiGateway/index.js +0 -118
  293. package/dist/cjs/services/authProvider/browser.d.ts +0 -40
  294. package/dist/cjs/services/authProvider/browser.js +0 -155
  295. package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
  296. package/dist/cjs/services/authProvider/decryption.js +0 -73
  297. package/dist/cjs/services/authProvider/index.d.ts +0 -63
  298. package/dist/cjs/services/authProvider/index.js +0 -34
  299. package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
  300. package/dist/cjs/services/authProvider/subrequest.js +0 -49
  301. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  302. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
  303. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  304. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
  305. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  306. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
  307. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
  308. package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
  309. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
  310. package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
  311. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
  312. package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
  313. package/dist/cjs/services/documentStore/index.js +0 -2
  314. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  315. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
  316. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
  317. package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
  318. package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
  319. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
  320. package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
  321. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
  322. package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
  323. package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
  324. package/dist/cjs/services/documentStore/versioned/index.js +0 -2
  325. package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
  326. package/dist/cjs/services/exercisesGateway/index.js +0 -107
  327. package/dist/cjs/services/fileServer/index.d.ts +0 -30
  328. package/dist/cjs/services/fileServer/index.js +0 -19
  329. package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
  330. package/dist/cjs/services/fileServer/localFileServer.js +0 -132
  331. package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
  332. package/dist/cjs/services/fileServer/s3FileServer.js +0 -132
  333. package/dist/cjs/services/launchParams/index.js +0 -7
  334. package/dist/cjs/services/launchParams/signer.d.ts +0 -23
  335. package/dist/cjs/services/launchParams/signer.js +0 -58
  336. package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
  337. package/dist/cjs/services/launchParams/verifier.js +0 -129
  338. package/dist/cjs/services/logger/console.d.ts +0 -4
  339. package/dist/cjs/services/logger/console.js +0 -12
  340. package/dist/cjs/services/logger/index.d.ts +0 -39
  341. package/dist/cjs/services/logger/index.js +0 -31
  342. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  343. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
  344. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
  345. package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
  346. package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
  347. package/dist/cjs/services/lrsGateway/file-system.js +0 -150
  348. package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
  349. package/dist/cjs/services/lrsGateway/index.js +0 -148
  350. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
  351. package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
  352. package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
  353. package/dist/cjs/services/postgresConnection/index.js +0 -65
  354. package/dist/cjs/services/searchProvider/index.d.ts +0 -67
  355. package/dist/cjs/services/searchProvider/index.js +0 -2
  356. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  357. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
  358. package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
  359. package/dist/cjs/services/searchProvider/openSearch.js +0 -154
  360. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
  361. package/dist/cjs/types.d.ts +0 -31
  362. package/dist/cjs/types.js +0 -2
  363. package/dist/esm/assertions/index.d.ts +0 -89
  364. package/dist/esm/aws/ssmService.d.ts +0 -5
  365. package/dist/esm/aws/ssmService.js +0 -6
  366. package/dist/esm/config/awsParameterConfig.d.ts +0 -10
  367. package/dist/esm/config/awsParameterConfig.js +0 -22
  368. package/dist/esm/config/envConfig.d.ts +0 -24
  369. package/dist/esm/config/envConfig.js +0 -53
  370. package/dist/esm/config/index.js +0 -17
  371. package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
  372. package/dist/esm/config/lambdaParameterConfig.js +0 -38
  373. package/dist/esm/config/replaceConfig.d.ts +0 -14
  374. package/dist/esm/config/resolveConfigValue.d.ts +0 -5
  375. package/dist/esm/config/resolveConfigValue.js +0 -8
  376. package/dist/esm/errors/index.d.ts +0 -88
  377. package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
  378. package/dist/esm/fetch/fetchStatusRetry.js +0 -23
  379. package/dist/esm/fetch/index.d.ts +0 -64
  380. package/dist/esm/fetch/index.js +0 -46
  381. package/dist/esm/guards/index.js +0 -36
  382. package/dist/esm/index.d.ts +0 -4
  383. package/dist/esm/index.js +0 -4
  384. package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
  385. package/dist/esm/middleware/apiErrorHandler.js +0 -38
  386. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  387. package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
  388. package/dist/esm/middleware/index.d.ts +0 -47
  389. package/dist/esm/middleware/index.js +0 -44
  390. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  391. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
  392. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
  393. package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
  394. package/dist/esm/misc/hashValue.d.ts +0 -10
  395. package/dist/esm/misc/hashValue.js +0 -13
  396. package/dist/esm/misc/helpers.d.ts +0 -124
  397. package/dist/esm/misc/helpers.js +0 -199
  398. package/dist/esm/misc/merge.d.ts +0 -21
  399. package/dist/esm/misc/merge.js +0 -40
  400. package/dist/esm/misc/partitionSequence.d.ts +0 -35
  401. package/dist/esm/pagination/index.d.ts +0 -91
  402. package/dist/esm/pagination/index.js +0 -77
  403. package/dist/esm/routing/helpers.d.ts +0 -57
  404. package/dist/esm/routing/index.d.ts +0 -290
  405. package/dist/esm/routing/index.js +0 -246
  406. package/dist/esm/routing/validators/zod.d.ts +0 -4
  407. package/dist/esm/routing/validators/zod.js +0 -10
  408. package/dist/esm/services/accountsGateway/index.d.ts +0 -92
  409. package/dist/esm/services/accountsGateway/index.js +0 -131
  410. package/dist/esm/services/apiGateway/index.d.ts +0 -68
  411. package/dist/esm/services/apiGateway/index.js +0 -77
  412. package/dist/esm/services/authProvider/browser.d.ts +0 -40
  413. package/dist/esm/services/authProvider/browser.js +0 -151
  414. package/dist/esm/services/authProvider/decryption.d.ts +0 -19
  415. package/dist/esm/services/authProvider/decryption.js +0 -69
  416. package/dist/esm/services/authProvider/index.d.ts +0 -63
  417. package/dist/esm/services/authProvider/index.js +0 -26
  418. package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
  419. package/dist/esm/services/authProvider/subrequest.js +0 -45
  420. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  421. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
  422. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  423. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
  424. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  425. package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
  426. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
  427. package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
  428. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
  429. package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
  430. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
  431. package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
  432. package/dist/esm/services/documentStore/index.d.ts +0 -14
  433. package/dist/esm/services/documentStore/index.js +0 -1
  434. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  435. package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
  436. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
  437. package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
  438. package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
  439. package/dist/esm/services/documentStore/unversioned/index.js +0 -1
  440. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
  441. package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
  442. package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
  443. package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
  444. package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
  445. package/dist/esm/services/documentStore/versioned/index.js +0 -1
  446. package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
  447. package/dist/esm/services/exercisesGateway/index.js +0 -70
  448. package/dist/esm/services/fileServer/index.d.ts +0 -30
  449. package/dist/esm/services/fileServer/index.js +0 -13
  450. package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
  451. package/dist/esm/services/fileServer/localFileServer.js +0 -125
  452. package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
  453. package/dist/esm/services/fileServer/s3FileServer.js +0 -125
  454. package/dist/esm/services/launchParams/index.d.ts +0 -2
  455. package/dist/esm/services/launchParams/index.js +0 -2
  456. package/dist/esm/services/launchParams/signer.d.ts +0 -23
  457. package/dist/esm/services/launchParams/signer.js +0 -51
  458. package/dist/esm/services/launchParams/verifier.d.ts +0 -21
  459. package/dist/esm/services/launchParams/verifier.js +0 -92
  460. package/dist/esm/services/logger/console.d.ts +0 -4
  461. package/dist/esm/services/logger/index.js +0 -27
  462. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  463. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
  464. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
  465. package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
  466. package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
  467. package/dist/esm/services/lrsGateway/file-system.js +0 -110
  468. package/dist/esm/services/lrsGateway/index.d.ts +0 -122
  469. package/dist/esm/services/lrsGateway/index.js +0 -111
  470. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
  471. package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
  472. package/dist/esm/services/postgresConnection/index.d.ts +0 -28
  473. package/dist/esm/services/postgresConnection/index.js +0 -58
  474. package/dist/esm/services/searchProvider/index.d.ts +0 -67
  475. package/dist/esm/services/searchProvider/index.js +0 -1
  476. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  477. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
  478. package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
  479. package/dist/esm/services/searchProvider/openSearch.js +0 -150
  480. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
  481. package/dist/esm/types.js +0 -1
  482. package/script/bin/.init-params-script.bash.swp +0 -0
  483. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  500. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  501. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  502. /package/{script → packages/utils/script}/build.bash +0 -0
  503. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  504. /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
- export const doThrow = (failed) => {
15
- if (typeof failed === 'string') {
16
- throw new Error(failed);
17
- }
18
- if (failed instanceof Error) {
19
- throw failed;
20
- }
21
- if (!failed) {
22
- throw new Error();
23
- }
24
- return failed();
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
- if (typeof x !== 'boolean' || x !== true) {
38
- return doThrow(failed);
39
- }
40
- return x;
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
- if (typeof x !== 'boolean' || x !== false) {
54
- return doThrow(failed);
55
- }
56
- return x;
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
- if (x === undefined) {
70
- return doThrow(failed);
71
- }
72
- return x;
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
- if (typeof x !== 'string') {
86
- return doThrow(failed);
87
- }
88
- return x;
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
- if (typeof thing === 'number' && isNaN(thing)) {
102
- return doThrow(failed);
103
- }
104
- return thing;
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
- if (thing instanceof constructable) {
123
- return thing;
124
- }
125
- return doThrow(failed);
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
- if (thing instanceof Error) {
140
- return assertInstanceOf(thing, constructable, thing);
141
- }
142
- else {
143
- // this separate branch prevents an unknown non-Error thing from being passed to the assertion as an AssertionFailed
144
- throw new Error(`assertErrorInstanceOf received non-Error argument of type "${typeof thing}" and string representation "${thing}"`);
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,7 @@
1
+ import {SSM} from '@aws-sdk/client-ssm';
2
+ import { once } from '..';
3
+
4
+ /**
5
+ * A memoized instance of the AWS SSM client.
6
+ */
7
+ export const ssmService = once(() => new SSM({apiVersion: '2012-08-10'}));
@@ -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
- [key: string]: Config | ConfigValue;
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
- [key: string]: ConfigProvider | ConfigValueProvider;
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 ? T : T extends ConfigProvider ? {
27
- [key in keyof T]: ConfigForConfigProvider<T[key]>;
28
- } : T extends ConfigValueProvider<infer R> ? R : never;
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 ? ConfigValueProvider<T> : T extends Config ? {
35
- [key in keyof T]: ConfigProviderForConfig<T[key]>;
36
- } : never;
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 declare const stubConfig: <V extends ConfigValue>(configValue: V) => ConfigValueProvider<V>;
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';