@openstax/ts-utils 1.34.0 → 1.34.1

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