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