@openstax/ts-utils 1.33.1 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/.cfnlintrc +2 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/workflows/ci.yml +36 -0
  4. package/.github/workflows/lint.yml +55 -0
  5. package/.nvmrc +1 -0
  6. package/.syncignore +4 -0
  7. package/.syncpackrc +18 -0
  8. package/CONTRIBUTING.md +96 -0
  9. package/LICENSE +661 -0
  10. package/Procfile +1 -0
  11. package/README.md +62 -90
  12. package/app.json +23 -0
  13. package/cspell.json +32 -0
  14. package/deploy/constants.env +21 -0
  15. package/deploy/deploy.bash +157 -0
  16. package/deploy/deployment-alt-region.cfn.yml +70 -0
  17. package/deploy/deployment.cfn.yml +650 -0
  18. package/deploy/destroy-deployment.bash +23 -0
  19. package/deploy/shared.cfn.yml +94 -0
  20. package/docs/lambda-build.md +35 -0
  21. package/package.json +12 -228
  22. package/packages/frontend/README.md +46 -0
  23. package/packages/frontend/package.json +101 -0
  24. package/packages/frontend/public/favicon.ico +0 -0
  25. package/packages/frontend/public/index.html +107 -0
  26. package/packages/frontend/public/maintenance.html +59 -0
  27. package/packages/frontend/public/manifest.json +15 -0
  28. package/packages/frontend/public/robots.txt +3 -0
  29. package/packages/frontend/script/make-certificate.bash +49 -0
  30. package/packages/frontend/script/server/cli.js +11 -0
  31. package/packages/frontend/script/server/index.js +47 -0
  32. package/packages/frontend/script/start.bash +22 -0
  33. package/packages/frontend/script/trust-localhost.bash +7 -0
  34. package/packages/frontend/src/auth/authProvider.ts +10 -0
  35. package/packages/frontend/src/auth/useAuth.ts +33 -0
  36. package/packages/frontend/src/components/Pagination.tsx +26 -0
  37. package/packages/frontend/src/configProvider/index.ts +53 -0
  38. package/packages/frontend/src/configProvider/use.ts +41 -0
  39. package/packages/frontend/src/core/context/services.spec.tsx +39 -0
  40. package/packages/frontend/src/core/context/services.tsx +16 -0
  41. package/packages/frontend/src/core/index.spec.ts +7 -0
  42. package/packages/frontend/src/core/index.ts +20 -0
  43. package/packages/frontend/src/core/services.tsx +14 -0
  44. package/packages/frontend/src/core/types.ts +3 -0
  45. package/packages/frontend/src/example/api.ts +28 -0
  46. package/packages/frontend/src/example/components/Layout.tsx +23 -0
  47. package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
  48. package/packages/frontend/src/example/screens/Home.tsx +78 -0
  49. package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
  50. package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
  51. package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
  52. package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
  53. package/packages/frontend/src/example/screens/index.ts +9 -0
  54. package/packages/frontend/src/index.css +159 -0
  55. package/packages/frontend/src/index.tsx +67 -0
  56. package/packages/frontend/src/react-app-env.d.ts +1 -0
  57. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
  58. package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
  59. package/packages/frontend/src/routing/middleware.ts +6 -0
  60. package/packages/frontend/src/routing/useQuery.ts +14 -0
  61. package/packages/frontend/src/setupProxy.js +19 -0
  62. package/packages/frontend/src/setupTests.ts +9 -0
  63. package/packages/frontend/src/tests/testServices.tsx +23 -0
  64. package/packages/frontend/tsconfig.json +27 -0
  65. package/packages/lambda/.eslintrc.js +64 -0
  66. package/packages/lambda/jest-global-setup.js +3 -0
  67. package/packages/lambda/jest-setup-after-env.js +1 -0
  68. package/packages/lambda/jest.config.js +31 -0
  69. package/packages/lambda/jest.resolver.js +17 -0
  70. package/packages/lambda/package.json +68 -0
  71. package/packages/lambda/script/build.bash +19 -0
  72. package/packages/lambda/script/bundle-functions.bash +10 -0
  73. package/packages/lambda/script/lambdaLocalProxy.js +16 -0
  74. package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
  75. package/packages/lambda/script/utils/getRouteData.ts +7 -0
  76. package/packages/lambda/script/utils/routeDataLoader.js +8 -0
  77. package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
  78. package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
  79. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
  80. package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
  81. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
  82. package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
  83. package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
  84. package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
  85. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
  86. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
  87. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
  88. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
  89. package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
  90. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
  91. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
  92. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
  93. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
  94. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
  95. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
  96. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
  97. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
  98. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
  99. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
  100. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
  101. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
  102. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
  103. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
  104. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
  105. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
  106. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
  107. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
  108. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
  109. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
  110. package/packages/lambda/tsconfig.json +30 -0
  111. package/packages/lambda/webpack.config.js +97 -0
  112. package/packages/utils/.eslintrc.js +64 -0
  113. package/packages/utils/README.md +118 -0
  114. package/packages/utils/jest-global-setup.js +3 -0
  115. package/packages/utils/jest.config.js +25 -0
  116. package/packages/utils/jest.resolver.js +17 -0
  117. package/packages/utils/package.json +238 -0
  118. package/packages/utils/src/assertions/index.spec.ts +126 -0
  119. package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
  120. package/packages/utils/src/aws/ssmService.ts +7 -0
  121. package/packages/utils/src/config/awsParameterConfig.ts +24 -0
  122. package/packages/utils/src/config/envConfig.ts +58 -0
  123. package/packages/utils/src/config/index.spec.ts +165 -0
  124. package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
  125. package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
  126. package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
  127. package/packages/utils/src/config/resolveConfigValue.ts +10 -0
  128. package/packages/utils/src/errors/index.spec.ts +35 -0
  129. package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
  130. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
  131. package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
  132. package/packages/utils/src/fetch/index.spec.ts +34 -0
  133. package/packages/utils/src/fetch/index.ts +87 -0
  134. package/packages/utils/src/guards/index.spec.ts +58 -0
  135. package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
  136. package/packages/utils/src/index.spec.ts +471 -0
  137. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
  138. package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
  139. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
  140. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
  141. package/packages/utils/src/middleware/index.spec.ts +99 -0
  142. package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
  143. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
  144. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
  145. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
  146. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
  147. package/packages/utils/src/misc/hashValue.ts +18 -0
  148. package/packages/utils/src/misc/helpers.ts +259 -0
  149. package/packages/utils/src/misc/merge.ts +48 -0
  150. package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
  151. package/packages/utils/src/pagination/index.spec.ts +150 -0
  152. package/packages/utils/src/pagination/index.ts +117 -0
  153. package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
  154. package/packages/utils/src/routing/index.spec.ts +553 -0
  155. package/packages/utils/src/routing/index.ts +424 -0
  156. package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
  157. package/packages/utils/src/routing/validators/zod.ts +14 -0
  158. package/packages/utils/src/services/accountsGateway/README.md +3 -0
  159. package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
  160. package/packages/utils/src/services/accountsGateway/index.ts +251 -0
  161. package/packages/utils/src/services/apiGateway/README.md +93 -0
  162. package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
  163. package/packages/utils/src/services/apiGateway/index.ts +189 -0
  164. package/packages/utils/src/services/authProvider/README.md +21 -0
  165. package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
  166. package/packages/utils/src/services/authProvider/browser.ts +209 -0
  167. package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
  168. package/packages/utils/src/services/authProvider/decryption.ts +98 -0
  169. package/packages/utils/src/services/authProvider/index.ts +93 -0
  170. package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
  171. package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
  172. package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
  173. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
  174. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
  175. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
  176. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
  177. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
  178. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
  179. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
  180. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
  181. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
  182. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
  183. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
  184. package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
  185. package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
  186. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
  187. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
  188. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
  189. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
  190. package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
  191. package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
  192. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
  193. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
  194. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
  195. package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
  196. package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
  197. package/packages/utils/src/services/exercisesGateway/README.md +5 -0
  198. package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
  199. package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
  200. package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
  201. package/packages/utils/src/services/fileServer/index.ts +43 -0
  202. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
  203. package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
  204. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
  205. package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
  206. package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
  207. package/packages/utils/src/services/launchParams/signer.ts +73 -0
  208. package/packages/utils/src/services/launchParams/verifier.ts +120 -0
  209. package/packages/utils/src/services/logger/console.spec.ts +29 -0
  210. package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
  211. package/packages/utils/src/services/logger/index.spec.ts +65 -0
  212. package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
  213. package/packages/utils/src/services/lrsGateway/README.md +5 -0
  214. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
  215. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
  216. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
  217. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
  218. package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
  219. package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
  220. package/packages/utils/src/services/lrsGateway/index.ts +257 -0
  221. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
  222. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
  223. package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
  224. package/packages/utils/src/services/postgresConnection/index.ts +84 -0
  225. package/packages/utils/src/services/searchProvider/README.md +3 -0
  226. package/packages/utils/src/services/searchProvider/index.ts +59 -0
  227. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
  228. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
  229. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
  230. package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
  231. package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
  232. package/packages/utils/tsconfig.json +31 -0
  233. package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
  234. package/packages/utils/tsconfig.without-specs.esm.json +7 -0
  235. package/packages/utils/tsconfig.without-specs.json +6 -0
  236. package/scripts/build.bash +24 -0
  237. package/scripts/ci.bash +10 -0
  238. package/scripts/start.bash +29 -0
  239. package/dist/cjs/assertions/index.d.ts +0 -89
  240. package/dist/cjs/assertions/index.js +0 -157
  241. package/dist/cjs/aws/ssmService.d.ts +0 -5
  242. package/dist/cjs/aws/ssmService.js +0 -9
  243. package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
  244. package/dist/cjs/config/awsParameterConfig.js +0 -26
  245. package/dist/cjs/config/envConfig.d.ts +0 -24
  246. package/dist/cjs/config/envConfig.js +0 -57
  247. package/dist/cjs/config/index.d.ts +0 -48
  248. package/dist/cjs/config/index.js +0 -35
  249. package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
  250. package/dist/cjs/config/lambdaParameterConfig.js +0 -45
  251. package/dist/cjs/config/replaceConfig.d.ts +0 -14
  252. package/dist/cjs/config/replaceConfig.js +0 -22
  253. package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
  254. package/dist/cjs/config/resolveConfigValue.js +0 -12
  255. package/dist/cjs/errors/index.d.ts +0 -88
  256. package/dist/cjs/errors/index.js +0 -123
  257. package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
  258. package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
  259. package/dist/cjs/fetch/index.d.ts +0 -64
  260. package/dist/cjs/fetch/index.js +0 -55
  261. package/dist/cjs/guards/index.d.ts +0 -38
  262. package/dist/cjs/guards/index.js +0 -44
  263. package/dist/cjs/index.js +0 -20
  264. package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
  265. package/dist/cjs/middleware/apiErrorHandler.js +0 -42
  266. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  267. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
  268. package/dist/cjs/middleware/index.js +0 -48
  269. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  270. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
  271. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
  272. package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
  273. package/dist/cjs/misc/hashValue.d.ts +0 -10
  274. package/dist/cjs/misc/hashValue.js +0 -17
  275. package/dist/cjs/misc/helpers.d.ts +0 -124
  276. package/dist/cjs/misc/helpers.js +0 -214
  277. package/dist/cjs/misc/merge.d.ts +0 -21
  278. package/dist/cjs/misc/merge.js +0 -45
  279. package/dist/cjs/misc/partitionSequence.d.ts +0 -35
  280. package/dist/cjs/misc/partitionSequence.js +0 -55
  281. package/dist/cjs/pagination/index.d.ts +0 -91
  282. package/dist/cjs/pagination/index.js +0 -83
  283. package/dist/cjs/routing/helpers.d.ts +0 -57
  284. package/dist/cjs/routing/helpers.js +0 -90
  285. package/dist/cjs/routing/index.d.ts +0 -290
  286. package/dist/cjs/routing/index.js +0 -295
  287. package/dist/cjs/routing/validators/zod.d.ts +0 -4
  288. package/dist/cjs/routing/validators/zod.js +0 -14
  289. package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
  290. package/dist/cjs/services/accountsGateway/index.js +0 -138
  291. package/dist/cjs/services/apiGateway/index.d.ts +0 -68
  292. package/dist/cjs/services/apiGateway/index.js +0 -118
  293. package/dist/cjs/services/authProvider/browser.d.ts +0 -40
  294. package/dist/cjs/services/authProvider/browser.js +0 -155
  295. package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
  296. package/dist/cjs/services/authProvider/decryption.js +0 -73
  297. package/dist/cjs/services/authProvider/index.d.ts +0 -63
  298. package/dist/cjs/services/authProvider/index.js +0 -34
  299. package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
  300. package/dist/cjs/services/authProvider/subrequest.js +0 -49
  301. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  302. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
  303. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  304. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
  305. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  306. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
  307. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
  308. package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
  309. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
  310. package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
  311. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
  312. package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
  313. package/dist/cjs/services/documentStore/index.js +0 -2
  314. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  315. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
  316. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
  317. package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
  318. package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
  319. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
  320. package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
  321. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
  322. package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
  323. package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
  324. package/dist/cjs/services/documentStore/versioned/index.js +0 -2
  325. package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
  326. package/dist/cjs/services/exercisesGateway/index.js +0 -107
  327. package/dist/cjs/services/fileServer/index.d.ts +0 -30
  328. package/dist/cjs/services/fileServer/index.js +0 -19
  329. package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
  330. package/dist/cjs/services/fileServer/localFileServer.js +0 -132
  331. package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
  332. package/dist/cjs/services/fileServer/s3FileServer.js +0 -132
  333. package/dist/cjs/services/launchParams/index.js +0 -7
  334. package/dist/cjs/services/launchParams/signer.d.ts +0 -23
  335. package/dist/cjs/services/launchParams/signer.js +0 -58
  336. package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
  337. package/dist/cjs/services/launchParams/verifier.js +0 -129
  338. package/dist/cjs/services/logger/console.d.ts +0 -4
  339. package/dist/cjs/services/logger/console.js +0 -12
  340. package/dist/cjs/services/logger/index.d.ts +0 -39
  341. package/dist/cjs/services/logger/index.js +0 -31
  342. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  343. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
  344. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
  345. package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
  346. package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
  347. package/dist/cjs/services/lrsGateway/file-system.js +0 -150
  348. package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
  349. package/dist/cjs/services/lrsGateway/index.js +0 -148
  350. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
  351. package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
  352. package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
  353. package/dist/cjs/services/postgresConnection/index.js +0 -65
  354. package/dist/cjs/services/searchProvider/index.d.ts +0 -67
  355. package/dist/cjs/services/searchProvider/index.js +0 -2
  356. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  357. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
  358. package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
  359. package/dist/cjs/services/searchProvider/openSearch.js +0 -154
  360. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
  361. package/dist/cjs/types.d.ts +0 -31
  362. package/dist/cjs/types.js +0 -2
  363. package/dist/esm/assertions/index.d.ts +0 -89
  364. package/dist/esm/aws/ssmService.d.ts +0 -5
  365. package/dist/esm/aws/ssmService.js +0 -6
  366. package/dist/esm/config/awsParameterConfig.d.ts +0 -10
  367. package/dist/esm/config/awsParameterConfig.js +0 -22
  368. package/dist/esm/config/envConfig.d.ts +0 -24
  369. package/dist/esm/config/envConfig.js +0 -53
  370. package/dist/esm/config/index.js +0 -17
  371. package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
  372. package/dist/esm/config/lambdaParameterConfig.js +0 -38
  373. package/dist/esm/config/replaceConfig.d.ts +0 -14
  374. package/dist/esm/config/resolveConfigValue.d.ts +0 -5
  375. package/dist/esm/config/resolveConfigValue.js +0 -8
  376. package/dist/esm/errors/index.d.ts +0 -88
  377. package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
  378. package/dist/esm/fetch/fetchStatusRetry.js +0 -23
  379. package/dist/esm/fetch/index.d.ts +0 -64
  380. package/dist/esm/fetch/index.js +0 -46
  381. package/dist/esm/guards/index.js +0 -36
  382. package/dist/esm/index.d.ts +0 -4
  383. package/dist/esm/index.js +0 -4
  384. package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
  385. package/dist/esm/middleware/apiErrorHandler.js +0 -38
  386. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  387. package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
  388. package/dist/esm/middleware/index.d.ts +0 -47
  389. package/dist/esm/middleware/index.js +0 -44
  390. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  391. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
  392. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
  393. package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
  394. package/dist/esm/misc/hashValue.d.ts +0 -10
  395. package/dist/esm/misc/hashValue.js +0 -13
  396. package/dist/esm/misc/helpers.d.ts +0 -124
  397. package/dist/esm/misc/helpers.js +0 -199
  398. package/dist/esm/misc/merge.d.ts +0 -21
  399. package/dist/esm/misc/merge.js +0 -40
  400. package/dist/esm/misc/partitionSequence.d.ts +0 -35
  401. package/dist/esm/pagination/index.d.ts +0 -91
  402. package/dist/esm/pagination/index.js +0 -77
  403. package/dist/esm/routing/helpers.d.ts +0 -57
  404. package/dist/esm/routing/index.d.ts +0 -290
  405. package/dist/esm/routing/index.js +0 -246
  406. package/dist/esm/routing/validators/zod.d.ts +0 -4
  407. package/dist/esm/routing/validators/zod.js +0 -10
  408. package/dist/esm/services/accountsGateway/index.d.ts +0 -92
  409. package/dist/esm/services/accountsGateway/index.js +0 -131
  410. package/dist/esm/services/apiGateway/index.d.ts +0 -68
  411. package/dist/esm/services/apiGateway/index.js +0 -77
  412. package/dist/esm/services/authProvider/browser.d.ts +0 -40
  413. package/dist/esm/services/authProvider/browser.js +0 -151
  414. package/dist/esm/services/authProvider/decryption.d.ts +0 -19
  415. package/dist/esm/services/authProvider/decryption.js +0 -69
  416. package/dist/esm/services/authProvider/index.d.ts +0 -63
  417. package/dist/esm/services/authProvider/index.js +0 -26
  418. package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
  419. package/dist/esm/services/authProvider/subrequest.js +0 -45
  420. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  421. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
  422. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  423. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
  424. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  425. package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
  426. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
  427. package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
  428. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
  429. package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
  430. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
  431. package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
  432. package/dist/esm/services/documentStore/index.d.ts +0 -14
  433. package/dist/esm/services/documentStore/index.js +0 -1
  434. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  435. package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
  436. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
  437. package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
  438. package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
  439. package/dist/esm/services/documentStore/unversioned/index.js +0 -1
  440. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
  441. package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
  442. package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
  443. package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
  444. package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
  445. package/dist/esm/services/documentStore/versioned/index.js +0 -1
  446. package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
  447. package/dist/esm/services/exercisesGateway/index.js +0 -70
  448. package/dist/esm/services/fileServer/index.d.ts +0 -30
  449. package/dist/esm/services/fileServer/index.js +0 -13
  450. package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
  451. package/dist/esm/services/fileServer/localFileServer.js +0 -125
  452. package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
  453. package/dist/esm/services/fileServer/s3FileServer.js +0 -125
  454. package/dist/esm/services/launchParams/index.d.ts +0 -2
  455. package/dist/esm/services/launchParams/index.js +0 -2
  456. package/dist/esm/services/launchParams/signer.d.ts +0 -23
  457. package/dist/esm/services/launchParams/signer.js +0 -51
  458. package/dist/esm/services/launchParams/verifier.d.ts +0 -21
  459. package/dist/esm/services/launchParams/verifier.js +0 -92
  460. package/dist/esm/services/logger/console.d.ts +0 -4
  461. package/dist/esm/services/logger/index.js +0 -27
  462. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  463. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
  464. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
  465. package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
  466. package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
  467. package/dist/esm/services/lrsGateway/file-system.js +0 -110
  468. package/dist/esm/services/lrsGateway/index.d.ts +0 -122
  469. package/dist/esm/services/lrsGateway/index.js +0 -111
  470. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
  471. package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
  472. package/dist/esm/services/postgresConnection/index.d.ts +0 -28
  473. package/dist/esm/services/postgresConnection/index.js +0 -58
  474. package/dist/esm/services/searchProvider/index.d.ts +0 -67
  475. package/dist/esm/services/searchProvider/index.js +0 -1
  476. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  477. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
  478. package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
  479. package/dist/esm/services/searchProvider/openSearch.js +0 -150
  480. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
  481. package/dist/esm/types.js +0 -1
  482. package/script/bin/.init-params-script.bash.swp +0 -0
  483. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  500. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  501. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  502. /package/{script → packages/utils/script}/build.bash +0 -0
  503. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  504. /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
@@ -1,21 +0,0 @@
1
- import type { UnionToIntersection } from '../types';
2
- /**
3
- * Takes two objects and returns an array of the keys that are common to both, with a type
4
- * limited to those keys.
5
- *
6
- * @param thing1 some object
7
- * @param thing2 another object
8
- * @returns an array of keys, type-limited to those keys
9
- */
10
- export declare const getCommonProperties: <T1 extends {}, T2 extends {}>(thing1: T1, thing2: T2) => Array<keyof T1 & keyof T2>;
11
- /**
12
- * recursive merge properties of inputs. values are merged if they are
13
- * plain objects or arrays, otherwise if the same property exists in both
14
- * objects the value from the second argument will win.
15
- *
16
- * unlike lodash merge, this will not change object references for values that
17
- * exist only in one parameter.
18
- *
19
- * @example merge({thing: 'one'}, {thing: 'two', otherKey: 'one'}, {coolKey: 'coolValue'});
20
- */
21
- export declare const merge: <T extends Array<{}>>(...[thing1, ...tail]: T) => UnionToIntersection<T[number]>;
@@ -1,40 +0,0 @@
1
- import { isPlainObject } from '../guards';
2
- /**
3
- * Takes two objects and returns an array of the keys that are common to both, with a type
4
- * limited to those keys.
5
- *
6
- * @param thing1 some object
7
- * @param thing2 another object
8
- * @returns an array of keys, type-limited to those keys
9
- */
10
- export const getCommonProperties = (thing1, thing2) => Object.keys(thing1).filter((key) => Object.keys(thing2).includes(key));
11
- /**
12
- * recursive merge properties of inputs. values are merged if they are
13
- * plain objects or arrays, otherwise if the same property exists in both
14
- * objects the value from the second argument will win.
15
- *
16
- * unlike lodash merge, this will not change object references for values that
17
- * exist only in one parameter.
18
- *
19
- * @example merge({thing: 'one'}, {thing: 'two', otherKey: 'one'}, {coolKey: 'coolValue'});
20
- */
21
- export const merge = (...[thing1, ...tail]) => {
22
- const mergedTail = tail.length > 0
23
- ? merge(...tail)
24
- : null;
25
- if (!mergedTail) {
26
- return thing1;
27
- }
28
- return {
29
- ...thing1,
30
- ...mergedTail,
31
- ...getCommonProperties(thing1, mergedTail).reduce((result, property) => ({
32
- ...result,
33
- ...(isPlainObject(thing1[property]) && isPlainObject(mergedTail[property])
34
- ? { [property]: merge(thing1[property], mergedTail[property]) }
35
- : (Array.isArray(thing1[property]) && Array.isArray(mergedTail[property]))
36
- ? { [property]: [...thing1[property], ...mergedTail[property]] }
37
- : {}),
38
- }), {}),
39
- };
40
- };
@@ -1,35 +0,0 @@
1
- /**
2
- * partitions a sequence based on a partition function returning {value: any; matches?: boolean}
3
- * - if the function returns `matches` explicitly then adjacent matching elements will
4
- * be grouped and the predicate value in the result will be from the last item in the group
5
- * - if the function returns only a value then matching will be evaluated based on the deep
6
- * equality of the value with its neighbors
7
- *
8
- * this is different from lodash/partition and lodash/groupBy because:
9
- * - it preserves the order of the items, items will only be grouped if they are already adjacent
10
- * - there can be any number of groups
11
- * - it tells you the partition value
12
- * - the partition value can be reduced, if you care (so you can like, partition on sequential values)
13
- *
14
- * simple predicate:
15
- * returns: [[0, [1,2]], [1, [3,4,5]]]
16
- * partitionSequence((n: number) => ({value: Math.floor(n / 3)}), [1,2,3,4,5])
17
- *
18
- * mutating partition:
19
- * returns: [
20
- * [{min: 1,max: 3}, [1,2,3]],
21
- * [{min: 5,max: 6}, [5,6]],
22
- * [{min: 8,max: 8}, [8]],
23
- * ]
24
- * partitionSequence(
25
- * (n: number, p?: {min: number; max: number}) =>
26
- * p && p.max + 1 === n
27
- * ? {value: {...p, max: n}, matches: true}
28
- * : {value: {min: n, max: n}, matches: false}
29
- * , [1,2,3,5,6,8]
30
- * )
31
- */
32
- export declare const partitionSequence: <T, P>(getPartition: (thing: T, previous?: P) => {
33
- matches?: boolean;
34
- value: P;
35
- }, sequence: T[]) => [P, T[]][];
@@ -1,91 +0,0 @@
1
- import { QueryParams, RouteMatchRecord } from '../routing';
2
- export type PaginationHandler<Pa, Q extends QueryParams> = <R>(queryParams: Q, match: RouteMatchRecord<R>) => Pa & {
3
- getUnusedQueryParams: () => Q;
4
- };
5
- /**
6
- * helper to create middleware with the given paginator. aside from taking care of annoying to write pagination logic, these helpers also make
7
- * sure that all item list responses have the same formatting.
8
- *
9
- * eg:
10
- * const getQueryParams = getKeyValueOr('queryStringParameters', {} as QueryParams);
11
- * const setUnusedQueryParams = putKeyValue('queryStringParameters');
12
- *
13
- * export const loadMorePaginationMiddleware = createPaginationMiddleware<ApiRouteRequest>()({getQueryParams, setUnusedQueryParams, paginator: loadMorePagination});
14
- * export const pageNumberPaginationMiddleware = createPaginationMiddleware<ApiRouteRequest>()({getQueryParams, setUnusedQueryParams, paginator: pageNumberPagination});
15
- *
16
- * eg the pagination middleware then provides your necessary inputs (getPageToken... in this case) and formats the response:
17
- * const result = await services.myDocumentStore.getVersions(key, services.pagination.getPageTokenNumber());
18
- *
19
- * if (!result) {
20
- * throw new NotFoundError('requested item not found');
21
- * }
22
- *
23
- * return apiJsonResponse(200, services.pagination.getPaginationResponse(result));
24
- */
25
- export declare const createPaginationMiddleware: <Ri, Q extends QueryParams = {
26
- [key: string]: string | undefined;
27
- }, R = any>() => <Pa>({ getQueryParams, setUnusedQueryParams, paginator }: {
28
- getQueryParams: (request: Ri) => Q;
29
- setUnusedQueryParams: (request: Ri, query: Q) => Ri;
30
- paginator: PaginationHandler<Pa, Q>;
31
- }) => <M extends {
32
- request: Ri;
33
- }>() => (middleware: M, match: RouteMatchRecord<R>) => M & {
34
- pagination: Pa & {
35
- getUnusedQueryParams: () => Q;
36
- };
37
- };
38
- export declare const loadMorePagination: <R, Q extends QueryParams>(queryParams: Q, { route, params }: RouteMatchRecord<R>) => {
39
- getUnusedQueryParams: () => Omit<Q, "pageToken">;
40
- getPageTokenString: () => string | string[] | null | undefined;
41
- getPageTokenNumber: () => number | undefined;
42
- getPaginationResponse: <T>({ items, ...meta }: LoadMorePaginationResultInput<T>) => {
43
- items: T[];
44
- meta: {
45
- nextPageToken: string | number | undefined;
46
- };
47
- links: {
48
- nextPage: string | undefined;
49
- };
50
- };
51
- };
52
- /**
53
- * if you're writing a data loader, this is what you need to return to be compatible with the loadMore style paginator.
54
- * this is how the response formatter knows the token for the next page to put in the response metadata.
55
- * */
56
- export interface LoadMorePaginationResultInput<T> {
57
- items: T[];
58
- nextPageToken: string | number | undefined;
59
- }
60
- export declare const pageNumberPagination: <R, Q extends QueryParams>(queryParams: Q, { route, params }: RouteMatchRecord<R>) => {
61
- getUnusedQueryParams: () => Omit<Q, "page">;
62
- getPaginationParams: () => {
63
- page: number | undefined;
64
- };
65
- getPaginationResponse: <T>({ items, ...meta }: PageNumberPaginationResultInput<T>) => {
66
- items: T[];
67
- meta: {
68
- pageSize: number;
69
- currentPage: number;
70
- totalItems: number;
71
- totalPages: number;
72
- };
73
- links: {
74
- firstPage: string;
75
- lastPage: string;
76
- nextPage: string | undefined;
77
- prevPage: string | undefined;
78
- };
79
- };
80
- };
81
- /**
82
- * if you're writing a data loader, this is what you need to return to be compatible with the pageNumber style paginator.
83
- * this is how the response formatter knows the information to put in the response metadata.
84
- * */
85
- export interface PageNumberPaginationResultInput<T> {
86
- items: T[];
87
- pageSize: number;
88
- currentPage: number;
89
- totalItems: number;
90
- totalPages: number;
91
- }
@@ -1,77 +0,0 @@
1
- import { notNaN } from '../assertions';
2
- import { InvalidRequestError } from '../errors';
3
- import { renderAnyRouteUrl } from '../routing';
4
- /**
5
- * helper to create middleware with the given paginator. aside from taking care of annoying to write pagination logic, these helpers also make
6
- * sure that all item list responses have the same formatting.
7
- *
8
- * eg:
9
- * const getQueryParams = getKeyValueOr('queryStringParameters', {} as QueryParams);
10
- * const setUnusedQueryParams = putKeyValue('queryStringParameters');
11
- *
12
- * export const loadMorePaginationMiddleware = createPaginationMiddleware<ApiRouteRequest>()({getQueryParams, setUnusedQueryParams, paginator: loadMorePagination});
13
- * export const pageNumberPaginationMiddleware = createPaginationMiddleware<ApiRouteRequest>()({getQueryParams, setUnusedQueryParams, paginator: pageNumberPagination});
14
- *
15
- * eg the pagination middleware then provides your necessary inputs (getPageToken... in this case) and formats the response:
16
- * const result = await services.myDocumentStore.getVersions(key, services.pagination.getPageTokenNumber());
17
- *
18
- * if (!result) {
19
- * throw new NotFoundError('requested item not found');
20
- * }
21
- *
22
- * return apiJsonResponse(200, services.pagination.getPaginationResponse(result));
23
- */
24
- export const createPaginationMiddleware = () => ({ getQueryParams, setUnusedQueryParams, paginator }) => () => (middleware, match) => {
25
- const queryParams = getQueryParams(middleware.request);
26
- const pagination = paginator(queryParams, match);
27
- // remove pagination params from downstream logic
28
- middleware.request = setUnusedQueryParams(middleware.request, pagination.getUnusedQueryParams());
29
- return { ...middleware, pagination };
30
- };
31
- export const loadMorePagination = (queryParams, { route, params }) => {
32
- const { pageToken, ...otherParams } = queryParams;
33
- return {
34
- getUnusedQueryParams: () => otherParams,
35
- getPageTokenString: () => pageToken,
36
- getPageTokenNumber: () => pageToken && typeof pageToken === 'string'
37
- ? notNaN(parseInt(pageToken, 10), () => { throw new InvalidRequestError(); })
38
- : undefined,
39
- getPaginationResponse: ({ items, ...meta }) => {
40
- return {
41
- items,
42
- meta,
43
- links: {
44
- nextPage: meta.nextPageToken
45
- ? renderAnyRouteUrl(route, params, { ...queryParams, pageToken: meta.nextPageToken.toString() })
46
- : undefined,
47
- }
48
- };
49
- },
50
- };
51
- };
52
- export const pageNumberPagination = (queryParams, { route, params }) => {
53
- const { page, ...otherParams } = queryParams;
54
- const numberPage = page && typeof page === 'string'
55
- ? notNaN(parseInt(page, 10), () => { throw new InvalidRequestError(); })
56
- : undefined;
57
- return {
58
- getUnusedQueryParams: () => otherParams,
59
- getPaginationParams: () => ({ page: numberPage }),
60
- getPaginationResponse: ({ items, ...meta }) => {
61
- return {
62
- items,
63
- meta,
64
- links: {
65
- firstPage: renderAnyRouteUrl(route, params, { ...queryParams, page: '1' }),
66
- lastPage: renderAnyRouteUrl(route, params, { ...queryParams, page: meta.totalPages.toString() }),
67
- nextPage: meta.currentPage < meta.totalPages
68
- ? renderAnyRouteUrl(route, params, { ...queryParams, page: (meta.currentPage + 1).toString() })
69
- : undefined,
70
- prevPage: meta.currentPage > 1
71
- ? renderAnyRouteUrl(route, params, { ...queryParams, page: (meta.currentPage - 1).toString() })
72
- : undefined
73
- }
74
- };
75
- },
76
- };
77
- };
@@ -1,57 +0,0 @@
1
- import type { HttpHeaders } from '.';
2
- /**
3
- * Get the value of a header, case insensitive; note if there are multiple headers of the same
4
- * value, this only returns the first value
5
- *
6
- * @param headers
7
- * @param name the name of the header, case ignored
8
- */
9
- export declare const getHeader: (headers: HttpHeaders, name: string) => string | undefined;
10
- /**
11
- * Gets the body of a request
12
- * @param request
13
- * @throws InvalidRequestError if the content type is not application/json or not parsable
14
- */
15
- export declare const getRequestBody: (request: {
16
- headers: HttpHeaders;
17
- body?: string | undefined;
18
- }) => any;
19
- /**
20
- * stub validator because writing validators is annoying
21
- */
22
- export declare const unsafePayloadValidator: <T>() => (input: any) => input is T;
23
- /**
24
- * Middleware that validates the request payload and adds it to the middleware (with key `payload`)
25
- * so it can be accessed downstream.
26
- *
27
- * This middleware accomplishes a few things:
28
- * - establishes type of payload for route body logic
29
- * - validates the payload for route logic
30
- * - establishes type of payload for client logic calling this route
31
- *
32
- * @param validator a guard function that takes the request payload and returns true if it is valid,
33
- * narrowing the type of the payload to the correct type
34
- * @throws InvalidRequestError if the payload is not valid
35
- *
36
- * @example
37
- * export const exampleRoute = createRoute({
38
- * name: 'exampleRoute', method: METHOD.POST, path: '/example/:id',
39
- * requestServiceProvider: composeServiceMiddleware(
40
- * // here we are adding to previously composed middleware
41
- * requestServiceProvider,
42
- * requestPayloadProvider(validatePayload)
43
- * )},
44
- * async(params: {id: string}, services) => {
45
- * const result = await services.myDocumentStore.putItem({
46
- * ...services.payload,
47
- * id: params.id,
48
- * });
49
- * return apiJsonResponse(201, result);
50
- * }
51
- * );
52
- */
53
- export declare const requestPayloadProvider: <T>(validator: (input: any) => input is T) => () => <M extends {
54
- request: Parameters<typeof getRequestBody>[0];
55
- }>(requestServices: M) => M & {
56
- payload: T;
57
- };
@@ -1,290 +0,0 @@
1
- import { Logger } from '../services/logger';
2
- /** HTTP query parameters */
3
- export type QueryParams = Record<string, string | undefined | string[] | null>;
4
- /**
5
- * The type for a map of string substitutions to use when building route paths, e.g. a route may
6
- * be defined as `'/api/:id'` and then rendered as `'/api/123'` when the `id` route param is set
7
- * to `'123'`
8
- */
9
- export type RouteParams = {
10
- [key: string]: string;
11
- };
12
- /** A type that is compatible with any `Route` type */
13
- export type AnyRoute<R> = R extends Route<infer N, infer P, infer Sa, infer Sr, infer Ri, infer Ro> ? Route<N, P, Sa, Sr, Ri, Ro> : never;
14
- export type AnySpecificRoute<R, Sa, Ri, Ro> = R extends Route<infer N, infer P, Sa, infer Sr, Ri, Ro> & infer E ? Route<N, P, Sa, Sr, Ri, Ro> & E : never;
15
- /** The inferred "route output" (`Ro`) type for a given route */
16
- export type OutputForRoute<R> = R extends Route<any, any, any, any, any, infer Ro> ? Ro : never;
17
- /** The inferred type for the params of the provided route type, `R`; may be undefined */
18
- export type ParamsForRoute<R> = R extends Route<any, infer P, any, any, any, any> ? P : never;
19
- /** The inferred type for the request services of the provided route type, `R`. */
20
- export type RequestServicesForRoute<R> = R extends Route<any, any, any, infer Sr, any, any> ? Sr : never;
21
- /** The type for the params of the provided route type, `R`; will be `{}` if undefined */
22
- export type ParamsForRouteOrEmpty<R> = ParamsForRoute<R> extends undefined ? {} : Exclude<ParamsForRoute<R>, undefined>;
23
- /** derives the route match type for this route, which includes the route itself and the matching params. */
24
- export type RouteMatchRecord<R> = R extends AnyRoute<R> ? {
25
- route: R;
26
- params: ParamsForRoute<R>;
27
- } : never;
28
- type Flatten<T> = T extends any ? {
29
- [K in keyof T]: T[K];
30
- } : never;
31
- export type ExternalRoute<R> = R extends Route<infer N, infer P, infer Sa, infer Sr, infer Ri, infer Ro> & infer E ? Route<N, P, Sa, Sr extends {
32
- payload: any;
33
- } ? Flatten<Pick<Sr, 'payload'>> : Record<string, never>, Ri, Ro> & Flatten<Omit<E, 'name' | 'path' | 'handler' | 'requestServiceProvider'>> : never;
34
- /** this utility simplifies the route type to remove stuff that is only
35
- * relevant internal to the route, like the service types, keeping only
36
- * the payload type which is necessary for the apiGateway
37
- *
38
- * this helps avoid the "type too complicated" error that typescript throws
39
- * when there are a lot of routes with complex services
40
- **/
41
- export declare const routesList: <R>(routes: R[]) => ExternalRoute<R>[];
42
- /**
43
- * The conditional type for the payload for a given route, `R`. This isn't a route structure, its
44
- * a convention based on the request middleware
45
- */
46
- export type PayloadForRoute<R> = RequestServicesForRoute<R> extends {
47
- payload: any;
48
- } ? RequestServicesForRoute<R>['payload'] : undefined;
49
- type RequestServiceProvider<Sa, Sr, Ri> = (app: Sa) => <R>(middleware: {
50
- request: Ri;
51
- logger: Logger;
52
- }, match: RouteMatchRecord<R>) => Sr;
53
- type RouteHandler<P, Sr, Ro> = (params: P, request: Sr) => Ro;
54
- type Route<N extends string, P extends RouteParams | undefined, Sa, Sr, Ri, Ro> = (Sr extends undefined ? {
55
- requestServiceProvider?: RequestServiceProvider<Sa, Sr, Ri> | undefined;
56
- } : {
57
- requestServiceProvider: RequestServiceProvider<Sa, Sr, Ri>;
58
- }) & {
59
- name: N;
60
- path: string;
61
- handler: (params: P, request: Sr) => Ro;
62
- };
63
- type CreateRouteConfig<Sa, Sr, Ri, N extends string, Ex> = (Sr extends undefined ? {
64
- requestServiceProvider?: RequestServiceProvider<Sa, Sr, Ri> | undefined;
65
- } : {
66
- requestServiceProvider: RequestServiceProvider<Sa, Sr, Ri>;
67
- }) & {
68
- name: N;
69
- path: string;
70
- } & Ex;
71
- /**
72
- * Interface for a function that creates a route. There are two overloaded signatures, because
73
- * sometimes typescript can't figure out the value of `Sr` between the handler and the service
74
- * provider. Forcing it through the provider types first by putting the handler in a subsequent
75
- * argument seems to help.
76
- */
77
- export interface CreateRoute<Sa, Ri, Ex> {
78
- <N extends string, Ro, Sr extends unknown | undefined = undefined, P extends RouteParams | undefined = undefined>(config: CreateRouteConfig<Sa, Sr, Ri, N, Ex> & {
79
- handler: RouteHandler<P, Sr, Ro>;
80
- }): Route<N, P, Sa, Sr, Ri, Ro> & Ex;
81
- <N extends string, Ro, Sr extends unknown | undefined, P extends RouteParams | undefined = undefined>(config: CreateRouteConfig<Sa, Sr, Ri, N, Ex>, handler: RouteHandler<P, Sr, Ro>): Route<N, P, Sa, Sr, Ri, Ro> & Ex;
82
- }
83
- /**
84
- * Makes a createRoute function that can be used to create routes (this is a factory factory). The
85
- * `makeCreateRoute` function is typically called once in the backend and once in the frontend to
86
- * set the types for the resulting `createRoute` function -- that latter function is called once
87
- * per route. E.g. for the backend, the call could look like:
88
- *
89
- * ```
90
- * export const createRoute = makeCreateRoute<AppServices, ApiRouteRequest, {
91
- * method: METHOD;
92
- * }>();
93
- * ```
94
- *
95
- * Notes:
96
- * * The `{method: METHOD}` defines the `Ex` extension type; here, the `method` property is only
97
- * relevant to backend routes.
98
- * * when defining the `createRoute` method, only the request input format is defined, the output
99
- * format is derived from the routes.
100
- *
101
- * When calling the resulting `createRoute` function, the only required params of the route are the
102
- * name, path, and handler. Other params can be added to the type and then later used in the
103
- * routeMatcher.
104
- *
105
- * eg when defining requestServiceProvider in line, the types have a hard time, it helps to put in another argument:
106
- * ```
107
- * export const exampleRoute = createRoute({
108
- * name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
109
- * requestServiceProvider: composeServiceMiddleware({
110
- * cookieAuthMiddleware,
111
- * documentStoreMiddleware,
112
- * }},
113
- * async(params: {key: string}, services) => {
114
- * const result = await services.myDocumentStore.getItem(params.key);
115
- *
116
- * if (!result) {
117
- * throw new NotFoundError('requested item not found');
118
- * }
119
- *
120
- * return apiJsonResponse(200, result);
121
- * }
122
- * );
123
- * ```
124
- * eg when using a pre-existing provider variable the types work better:
125
- * ```
126
- * export const exampleRoute = createRoute({
127
- * name: 'exampleRoute', method: METHOD.GET, path: '/api/example/:key',
128
- * requestServiceProvider,
129
- * handler: async(params: {key: string}, services) => {
130
- * const result = await services.myDocumentStore.getItem(params.key);
131
- *
132
- * if (!result) {
133
- * throw new NotFoundError('requested item not found');
134
- * }
135
- *
136
- * return apiJsonResponse(200, result);
137
- * }
138
- * });
139
- * ```
140
- */
141
- export declare const makeCreateRoute: <Sa, Ri, Ex = {}>() => CreateRoute<Sa, Ri, Ex>;
142
- /**
143
- * Makes a renderRouteUrl function that can be used to render route paths (this is a factory
144
- * factory). The returned function takes a `route`, `params`, and `query` and returns a string
145
- * with the params and query substituted into the route path.
146
- *
147
- * this function is initialized using the Ru type which indicates the specific routes wired into
148
- * the application, which means that if you try to build a url with a route which is not wired
149
- * into the router you will get a type error. this is a feature to prevent referencing routes that
150
- * don't exist or aren't handling requests properly.
151
- *
152
- * if you are making a helper function or need to render a route outside your application, you
153
- * can use the `renderAnyRouteUrl` function
154
- */
155
- export declare const makeRenderRouteUrl: <Ru extends {
156
- path: string;
157
- }>() => <R>(route: ExternalRoute<R> extends Ru ? R & {
158
- path: string;
159
- } : R extends Ru ? R : never, params: ParamsForRoute<R>, query?: QueryParams) => string;
160
- /**
161
- * A pre-made result from `makeRenderRouteUrl`, this function interpolates parameter and query
162
- * arguments into a route path.
163
- *
164
- * prefer using `renderRouteUrl` initialized with your applications route union
165
- * when possible to help catch improperly initialized routes.
166
- *
167
- * @param route the route that has a `path` to be interpolated
168
- * @param params the parameters to interpolate into the route path
169
- * @param query the query parameters to add to the route path
170
- * @returns the interpolated route path
171
- */
172
- export declare const renderAnyRouteUrl: <R>(route: ExternalRoute<R> extends any ? R & {
173
- path: string;
174
- } : R extends any ? R : never, params: ParamsForRoute<R>, query?: QueryParams) => string;
175
- type RequestPathExtractor<Ri> = (request: Ri) => string;
176
- type RequestLogExtractor<Ri> = (request: Ri) => JsonCompatibleStruct;
177
- type RequestRouteMatcher<Ri, R> = (request: Ri, route: R) => boolean;
178
- type CompatibleServices<T1> = keyof T1 extends 'logger' ? T1 extends {
179
- logger: Logger;
180
- } ? T1 : never : T1 & {
181
- logger?: Logger;
182
- };
183
- type RequestResponder<Sa, Ri, Ro> = {
184
- (services: CompatibleServices<Sa>): (request: Ri) => Ro | undefined;
185
- <RoF>(services: CompatibleServices<Sa>, responseMiddleware: (app: Sa) => (response: Ro | undefined, request: {
186
- request: Ri;
187
- logger: Logger;
188
- }) => RoF): (request: Ri) => RoF;
189
- };
190
- /**
191
- * A factory factory for creating request responders (functions that take a request and return a
192
- * response -- these functions let us implement Lambda `handler` functions).
193
- *
194
- * Use it in two steps. First, call it with the general business logic that defines routes, logs,
195
- * errors, etc:
196
- * ```
197
- * const getRequestResponder = makeGetRequestResponder<
198
- * AppServices, TRoutes, ApiRouteRequest, Promise<ApiRouteResponse>
199
- * >() // this empty invocation helps typescript mix defined and inferred types
200
- * ({
201
- * routes: apiRoutes, // the route definitions
202
- * pathExtractor, // how to get the path out of the request format
203
- * routeMatcher, // logic for matching route (beyond path matching, optional)
204
- * errorHandler, // any special error handling
205
- * });
206
- * ```
207
- * Note here that among other things we're specifying a generic response format that the response
208
- * and error handling middleware can use, if any routes have responses that don't adhere to this
209
- * it'll complain about it.
210
- *
211
- * Next, we use the `getRequestResponder` to create a responder for a specific lambda entrypoint:
212
- * ```
213
- * export const handler: (request: APIGatewayProxyEventV2): Promise<ApiRouteResponse> =>
214
- * getRequestResponder(
215
- * lambdaServices, // the AppServices for this entrypoint
216
- * lambdaMiddleware // environment specific response middleware (like cors)
217
- * );
218
- * ```
219
- */
220
- export declare const makeGetRequestResponder: <Sa, Ru, Ri, Ro>() => ({ routes, pathExtractor, routeMatcher, errorHandler, logExtractor }: {
221
- routes: () => AnySpecificRoute<Ru, Sa, Ri, Ro>[];
222
- pathExtractor: RequestPathExtractor<Ri>;
223
- logExtractor?: RequestLogExtractor<Ri>;
224
- routeMatcher?: RequestRouteMatcher<Ri, AnySpecificRoute<Ru, Sa, Ri, Ro>>;
225
- errorHandler?: (e: Error, logger: Logger) => Ro;
226
- }) => RequestResponder<Sa, Ri, Ro>;
227
- /** HTTP Headers */
228
- export type HttpHeaders = {
229
- [key: string]: string | undefined | string[];
230
- };
231
- /** A type that works in JSON */
232
- export type JsonCompatibleValue = string | number | null | undefined | boolean;
233
- /** A JSON array type */
234
- export type JsonCompatibleArray = Array<JsonCompatibleValue | JsonCompatibleStruct | JsonCompatibleStruct>;
235
- /** A JSON object type */
236
- export type JsonCompatibleStruct = {
237
- [key: string]: JsonCompatibleStruct | JsonCompatibleValue | JsonCompatibleArray;
238
- };
239
- /** The type for an API response */
240
- export type ApiResponse<S extends number, T> = {
241
- isBase64Encoded?: boolean;
242
- statusCode: S;
243
- data: T;
244
- body: string;
245
- headers?: {
246
- [key: string]: string;
247
- };
248
- };
249
- /**
250
- * Returns a JSON response. Handles serializing the data to JSON and setting the content-type header.
251
- * @param statusCode e.g. 201
252
- * @param data the object to be serialized to JSON
253
- * @param headers HTTP headers
254
- * @example
255
- * return apiJsonResponse(
256
- * 200, {
257
- * message: "hello, world!",
258
- * foo: "bar",
259
- * },
260
- * { 'X-Frame-Options': 'DENY' }
261
- * );
262
- */
263
- export declare const apiJsonResponse: <S extends number, T extends JsonCompatibleStruct>(statusCode: S, data: T, headers?: HttpHeaders) => ApiResponse<S, T>;
264
- /**
265
- * Returns a plain text response. Handles setting the content-type header.
266
- * @param statusCode e.g. 201
267
- * @param data some string
268
- * @param headers HTTP headers
269
- * @example return apiTextResponse(200, 'some text')
270
- */
271
- export declare const apiTextResponse: <S extends number>(statusCode: S, data: string, headers?: HttpHeaders) => ApiResponse<S, string>;
272
- /**
273
- * Returns an HTML response. Handles setting the content-type header.
274
- * @param statusCode e.g. 201
275
- * @param data some string
276
- * @param headers HTTP headers
277
- * @example return apiHtmlResponse(200, '<b>some text</b>')
278
- */
279
- export declare const apiHtmlResponse: <S extends number>(statusCode: S, data: string, headers?: HttpHeaders) => ApiResponse<S, string>;
280
- /** HTTP method enum */
281
- export declare enum METHOD {
282
- GET = "GET",
283
- HEAD = "HEAD",
284
- POST = "POST",
285
- PUT = "PUT",
286
- PATCH = "PATCH",
287
- DELETE = "DELETE",
288
- OPTIONS = "OPTIONS"
289
- }
290
- export * from './helpers';