@openstax/ts-utils 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +90 -62
  2. package/dist/cjs/assertions/index.d.ts +89 -0
  3. package/dist/cjs/assertions/index.js +157 -0
  4. package/dist/cjs/aws/ssmService.d.ts +5 -0
  5. package/dist/cjs/aws/ssmService.js +9 -0
  6. package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
  7. package/dist/cjs/config/awsParameterConfig.js +26 -0
  8. package/dist/cjs/config/envConfig.d.ts +24 -0
  9. package/dist/cjs/config/envConfig.js +57 -0
  10. package/{packages/utils/src/config/index.ts → dist/cjs/config/index.d.ts} +13 -29
  11. package/dist/cjs/config/index.js +35 -0
  12. package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
  13. package/dist/cjs/config/lambdaParameterConfig.js +45 -0
  14. package/dist/cjs/config/replaceConfig.d.ts +14 -0
  15. package/dist/cjs/config/replaceConfig.js +22 -0
  16. package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
  17. package/dist/cjs/config/resolveConfigValue.js +12 -0
  18. package/dist/cjs/errors/index.d.ts +88 -0
  19. package/dist/cjs/errors/index.js +123 -0
  20. package/dist/cjs/fetch/fetchStatusRetry.d.ts +8 -0
  21. package/dist/cjs/fetch/fetchStatusRetry.js +27 -0
  22. package/dist/cjs/fetch/index.d.ts +64 -0
  23. package/dist/cjs/fetch/index.js +55 -0
  24. package/{packages/utils/src/guards/index.ts → dist/cjs/guards/index.d.ts} +7 -10
  25. package/dist/cjs/guards/index.js +44 -0
  26. package/dist/cjs/index.js +20 -0
  27. package/dist/cjs/middleware/apiErrorHandler.d.ts +24 -0
  28. package/dist/cjs/middleware/apiErrorHandler.js +42 -0
  29. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  30. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
  31. package/{packages/utils/src/middleware/index.ts → dist/cjs/middleware/index.d.ts} +5 -53
  32. package/dist/cjs/middleware/index.js +48 -0
  33. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  34. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +44 -0
  35. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +4 -0
  36. package/dist/cjs/middleware/throwNotFoundMiddleware.js +14 -0
  37. package/dist/cjs/misc/hashValue.d.ts +10 -0
  38. package/dist/cjs/misc/hashValue.js +17 -0
  39. package/dist/cjs/misc/helpers.d.ts +124 -0
  40. package/dist/cjs/misc/helpers.js +214 -0
  41. package/dist/cjs/misc/merge.d.ts +21 -0
  42. package/dist/cjs/misc/merge.js +45 -0
  43. package/dist/cjs/misc/partitionSequence.d.ts +35 -0
  44. package/dist/cjs/misc/partitionSequence.js +55 -0
  45. package/dist/cjs/pagination/index.d.ts +91 -0
  46. package/dist/cjs/pagination/index.js +83 -0
  47. package/dist/cjs/routing/helpers.d.ts +57 -0
  48. package/dist/cjs/routing/helpers.js +90 -0
  49. package/dist/cjs/routing/index.d.ts +290 -0
  50. package/dist/cjs/routing/index.js +295 -0
  51. package/dist/cjs/routing/validators/zod.d.ts +4 -0
  52. package/dist/cjs/routing/validators/zod.js +14 -0
  53. package/dist/cjs/services/accountsGateway/index.d.ts +92 -0
  54. package/dist/cjs/services/accountsGateway/index.js +138 -0
  55. package/dist/cjs/services/apiGateway/index.d.ts +68 -0
  56. package/dist/cjs/services/apiGateway/index.js +118 -0
  57. package/dist/cjs/services/authProvider/browser.d.ts +40 -0
  58. package/dist/cjs/services/authProvider/browser.js +155 -0
  59. package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
  60. package/dist/cjs/services/authProvider/decryption.js +73 -0
  61. package/dist/cjs/services/authProvider/index.d.ts +63 -0
  62. package/dist/cjs/services/authProvider/index.js +34 -0
  63. package/dist/cjs/services/authProvider/subrequest.d.ts +13 -0
  64. package/dist/cjs/services/authProvider/subrequest.js +49 -0
  65. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  66. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +91 -0
  67. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  68. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +47 -0
  69. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  70. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +37 -0
  71. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +3 -0
  72. package/dist/cjs/services/authProvider/utils/userSubrequest.js +13 -0
  73. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
  74. package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
  75. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +1 -0
  76. package/dist/cjs/services/documentStore/fileSystemAssert.js +14 -0
  77. package/{packages/utils/src/services/documentStore/index.ts → dist/cjs/services/documentStore/index.d.ts} +8 -8
  78. package/dist/cjs/services/documentStore/index.js +2 -0
  79. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  80. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +233 -0
  81. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +32 -0
  82. package/dist/cjs/services/documentStore/unversioned/file-system.js +214 -0
  83. package/{packages/utils/src/services/documentStore/unversioned/index.ts → dist/cjs/services/documentStore/unversioned/index.d.ts} +0 -2
  84. package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
  85. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +25 -0
  86. package/dist/cjs/services/documentStore/versioned/dynamodb.js +143 -0
  87. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +25 -0
  88. package/dist/cjs/services/documentStore/versioned/file-system.js +73 -0
  89. package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
  90. package/dist/cjs/services/documentStore/versioned/index.js +2 -0
  91. package/dist/cjs/services/exercisesGateway/index.d.ts +67 -0
  92. package/dist/cjs/services/exercisesGateway/index.js +107 -0
  93. package/dist/cjs/services/fileServer/index.d.ts +30 -0
  94. package/dist/cjs/services/fileServer/index.js +19 -0
  95. package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
  96. package/dist/cjs/services/fileServer/localFileServer.js +132 -0
  97. package/dist/cjs/services/fileServer/s3FileServer.d.ts +14 -0
  98. package/dist/cjs/services/fileServer/s3FileServer.js +131 -0
  99. package/dist/cjs/services/launchParams/index.js +7 -0
  100. package/dist/cjs/services/launchParams/signer.d.ts +23 -0
  101. package/dist/cjs/services/launchParams/signer.js +58 -0
  102. package/dist/cjs/services/launchParams/verifier.d.ts +21 -0
  103. package/dist/cjs/services/launchParams/verifier.js +129 -0
  104. package/dist/cjs/services/logger/console.d.ts +4 -0
  105. package/dist/cjs/services/logger/console.js +12 -0
  106. package/{packages/utils/src/services/logger/index.ts → dist/cjs/services/logger/index.d.ts} +9 -23
  107. package/dist/cjs/services/logger/index.js +31 -0
  108. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  109. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
  110. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +72 -0
  111. package/dist/cjs/services/lrsGateway/attempt-utils.js +283 -0
  112. package/dist/cjs/services/lrsGateway/file-system.d.ts +15 -0
  113. package/dist/cjs/services/lrsGateway/file-system.js +150 -0
  114. package/dist/cjs/services/lrsGateway/index.d.ts +122 -0
  115. package/dist/cjs/services/lrsGateway/index.js +148 -0
  116. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +71 -0
  117. package/dist/cjs/services/lrsGateway/xapiUtils.js +145 -0
  118. package/dist/cjs/services/postgresConnection/index.d.ts +28 -0
  119. package/dist/cjs/services/postgresConnection/index.js +65 -0
  120. package/dist/cjs/services/searchProvider/index.d.ts +69 -0
  121. package/dist/cjs/services/searchProvider/index.js +2 -0
  122. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  123. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +191 -0
  124. package/dist/cjs/services/searchProvider/openSearch.d.ts +28 -0
  125. package/dist/cjs/services/searchProvider/openSearch.js +162 -0
  126. package/dist/cjs/services/searchProvider/streamIndexer.d.ts +17 -0
  127. package/dist/cjs/services/searchProvider/streamIndexer.js +41 -0
  128. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  129. package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
  130. package/dist/cjs/types.js +2 -0
  131. package/dist/esm/assertions/index.d.ts +89 -0
  132. package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
  133. package/dist/esm/aws/ssmService.d.ts +5 -0
  134. package/dist/esm/aws/ssmService.js +6 -0
  135. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  136. package/dist/esm/config/awsParameterConfig.js +22 -0
  137. package/dist/esm/config/envConfig.d.ts +24 -0
  138. package/dist/esm/config/envConfig.js +53 -0
  139. package/dist/esm/config/index.d.ts +48 -0
  140. package/dist/esm/config/index.js +17 -0
  141. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  142. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  143. package/dist/esm/config/replaceConfig.d.ts +14 -0
  144. package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
  145. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  146. package/dist/esm/config/resolveConfigValue.js +8 -0
  147. package/dist/esm/errors/index.d.ts +88 -0
  148. package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
  149. package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
  150. package/dist/esm/fetch/fetchStatusRetry.js +23 -0
  151. package/dist/esm/fetch/index.d.ts +64 -0
  152. package/dist/esm/fetch/index.js +46 -0
  153. package/dist/esm/guards/index.d.ts +38 -0
  154. package/dist/esm/guards/index.js +36 -0
  155. package/dist/esm/index.d.ts +4 -0
  156. package/dist/esm/index.js +4 -0
  157. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  158. package/dist/esm/middleware/apiErrorHandler.js +38 -0
  159. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  160. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  161. package/dist/esm/middleware/index.d.ts +47 -0
  162. package/dist/esm/middleware/index.js +44 -0
  163. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  164. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
  165. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  166. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  167. package/dist/esm/misc/hashValue.d.ts +10 -0
  168. package/dist/esm/misc/hashValue.js +13 -0
  169. package/dist/esm/misc/helpers.d.ts +124 -0
  170. package/dist/esm/misc/helpers.js +199 -0
  171. package/dist/esm/misc/merge.d.ts +21 -0
  172. package/dist/esm/misc/merge.js +40 -0
  173. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  174. package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
  175. package/dist/esm/pagination/index.d.ts +91 -0
  176. package/dist/esm/pagination/index.js +77 -0
  177. package/dist/esm/routing/helpers.d.ts +57 -0
  178. package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
  179. package/dist/esm/routing/index.d.ts +290 -0
  180. package/dist/esm/routing/index.js +246 -0
  181. package/dist/esm/routing/validators/zod.d.ts +4 -0
  182. package/dist/esm/routing/validators/zod.js +10 -0
  183. package/dist/esm/services/accountsGateway/index.d.ts +92 -0
  184. package/dist/esm/services/accountsGateway/index.js +131 -0
  185. package/dist/esm/services/apiGateway/index.d.ts +68 -0
  186. package/dist/esm/services/apiGateway/index.js +77 -0
  187. package/dist/esm/services/authProvider/browser.d.ts +40 -0
  188. package/dist/esm/services/authProvider/browser.js +151 -0
  189. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  190. package/dist/esm/services/authProvider/decryption.js +69 -0
  191. package/dist/esm/services/authProvider/index.d.ts +63 -0
  192. package/dist/esm/services/authProvider/index.js +26 -0
  193. package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
  194. package/dist/esm/services/authProvider/subrequest.js +45 -0
  195. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  196. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  197. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  198. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  199. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  200. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  201. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
  202. package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
  203. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  204. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  205. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
  206. package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
  207. package/dist/esm/services/documentStore/index.d.ts +14 -0
  208. package/dist/esm/services/documentStore/index.js +1 -0
  209. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  210. package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
  211. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
  212. package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
  213. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  214. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  215. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
  216. package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
  217. package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
  218. package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
  219. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  220. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  221. package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
  222. package/dist/esm/services/exercisesGateway/index.js +70 -0
  223. package/dist/esm/services/fileServer/index.d.ts +30 -0
  224. package/dist/esm/services/fileServer/index.js +13 -0
  225. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  226. package/dist/esm/services/fileServer/localFileServer.js +125 -0
  227. package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
  228. package/dist/esm/services/fileServer/s3FileServer.js +124 -0
  229. package/dist/esm/services/launchParams/index.d.ts +2 -0
  230. package/dist/esm/services/launchParams/index.js +2 -0
  231. package/dist/esm/services/launchParams/signer.d.ts +23 -0
  232. package/dist/esm/services/launchParams/signer.js +51 -0
  233. package/dist/esm/services/launchParams/verifier.d.ts +21 -0
  234. package/dist/esm/services/launchParams/verifier.js +92 -0
  235. package/dist/esm/services/logger/console.d.ts +4 -0
  236. package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
  237. package/dist/esm/services/logger/index.d.ts +39 -0
  238. package/dist/esm/services/logger/index.js +27 -0
  239. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  240. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  241. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
  242. package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
  243. package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
  244. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  245. package/dist/esm/services/lrsGateway/index.d.ts +122 -0
  246. package/dist/esm/services/lrsGateway/index.js +111 -0
  247. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
  248. package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
  249. package/dist/esm/services/postgresConnection/index.d.ts +28 -0
  250. package/dist/esm/services/postgresConnection/index.js +58 -0
  251. package/dist/esm/services/searchProvider/index.d.ts +69 -0
  252. package/dist/esm/services/searchProvider/index.js +1 -0
  253. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  254. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
  255. package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
  256. package/dist/esm/services/searchProvider/openSearch.js +158 -0
  257. package/dist/esm/services/searchProvider/streamIndexer.d.ts +17 -0
  258. package/dist/esm/services/searchProvider/streamIndexer.js +37 -0
  259. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  260. package/dist/esm/types.d.ts +31 -0
  261. package/dist/esm/types.js +1 -0
  262. package/package.json +234 -12
  263. package/.cfnlintrc +0 -2
  264. package/.github/CODEOWNERS +0 -1
  265. package/.github/workflows/ci.yml +0 -36
  266. package/.github/workflows/lint.yml +0 -55
  267. package/.nvmrc +0 -1
  268. package/.syncignore +0 -4
  269. package/.syncpackrc +0 -18
  270. package/CONTRIBUTING.md +0 -96
  271. package/LICENSE +0 -661
  272. package/Procfile +0 -1
  273. package/app.json +0 -23
  274. package/cspell.json +0 -32
  275. package/deploy/constants.env +0 -21
  276. package/deploy/deploy.bash +0 -157
  277. package/deploy/deployment-alt-region.cfn.yml +0 -70
  278. package/deploy/deployment.cfn.yml +0 -650
  279. package/deploy/destroy-deployment.bash +0 -23
  280. package/deploy/shared.cfn.yml +0 -94
  281. package/docs/lambda-build.md +0 -35
  282. package/packages/frontend/README.md +0 -46
  283. package/packages/frontend/package.json +0 -101
  284. package/packages/frontend/public/favicon.ico +0 -0
  285. package/packages/frontend/public/index.html +0 -107
  286. package/packages/frontend/public/maintenance.html +0 -59
  287. package/packages/frontend/public/manifest.json +0 -15
  288. package/packages/frontend/public/robots.txt +0 -3
  289. package/packages/frontend/script/make-certificate.bash +0 -49
  290. package/packages/frontend/script/server/cli.js +0 -11
  291. package/packages/frontend/script/server/index.js +0 -47
  292. package/packages/frontend/script/start.bash +0 -22
  293. package/packages/frontend/script/trust-localhost.bash +0 -7
  294. package/packages/frontend/src/auth/authProvider.ts +0 -10
  295. package/packages/frontend/src/auth/useAuth.ts +0 -33
  296. package/packages/frontend/src/components/Pagination.tsx +0 -26
  297. package/packages/frontend/src/configProvider/index.ts +0 -53
  298. package/packages/frontend/src/configProvider/use.ts +0 -41
  299. package/packages/frontend/src/core/context/services.spec.tsx +0 -39
  300. package/packages/frontend/src/core/context/services.tsx +0 -16
  301. package/packages/frontend/src/core/index.spec.ts +0 -7
  302. package/packages/frontend/src/core/index.ts +0 -20
  303. package/packages/frontend/src/core/services.tsx +0 -14
  304. package/packages/frontend/src/core/types.ts +0 -3
  305. package/packages/frontend/src/example/api.ts +0 -28
  306. package/packages/frontend/src/example/components/Layout.tsx +0 -23
  307. package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
  308. package/packages/frontend/src/example/screens/Home.tsx +0 -78
  309. package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
  310. package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
  311. package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
  312. package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
  313. package/packages/frontend/src/example/screens/index.ts +0 -9
  314. package/packages/frontend/src/index.css +0 -159
  315. package/packages/frontend/src/index.tsx +0 -67
  316. package/packages/frontend/src/react-app-env.d.ts +0 -1
  317. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
  318. package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
  319. package/packages/frontend/src/routing/middleware.ts +0 -6
  320. package/packages/frontend/src/routing/useQuery.ts +0 -14
  321. package/packages/frontend/src/setupProxy.js +0 -19
  322. package/packages/frontend/src/setupTests.ts +0 -9
  323. package/packages/frontend/src/tests/testServices.tsx +0 -23
  324. package/packages/frontend/tsconfig.json +0 -27
  325. package/packages/lambda/.eslintrc.js +0 -64
  326. package/packages/lambda/jest-global-setup.js +0 -3
  327. package/packages/lambda/jest-setup-after-env.js +0 -1
  328. package/packages/lambda/jest.config.js +0 -31
  329. package/packages/lambda/jest.resolver.js +0 -17
  330. package/packages/lambda/package.json +0 -68
  331. package/packages/lambda/script/build.bash +0 -19
  332. package/packages/lambda/script/bundle-functions.bash +0 -10
  333. package/packages/lambda/script/lambdaLocalProxy.js +0 -16
  334. package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
  335. package/packages/lambda/script/utils/getRouteData.ts +0 -7
  336. package/packages/lambda/script/utils/routeDataLoader.js +0 -8
  337. package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
  338. package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
  339. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
  340. package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
  341. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
  342. package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
  343. package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
  344. package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
  345. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
  346. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
  347. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
  348. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
  349. package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
  350. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
  351. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
  352. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
  353. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
  354. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
  355. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
  356. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
  357. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
  358. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
  359. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
  360. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
  361. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
  362. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
  363. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
  364. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
  365. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
  366. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
  367. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
  368. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
  369. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
  370. package/packages/lambda/tsconfig.json +0 -30
  371. package/packages/lambda/webpack.config.js +0 -97
  372. package/packages/utils/.eslintrc.js +0 -64
  373. package/packages/utils/README.md +0 -118
  374. package/packages/utils/jest-global-setup.js +0 -3
  375. package/packages/utils/jest.config.js +0 -25
  376. package/packages/utils/jest.resolver.js +0 -17
  377. package/packages/utils/package.json +0 -238
  378. package/packages/utils/src/assertions/index.spec.ts +0 -126
  379. package/packages/utils/src/aws/ssmService.ts +0 -7
  380. package/packages/utils/src/config/awsParameterConfig.ts +0 -24
  381. package/packages/utils/src/config/envConfig.ts +0 -58
  382. package/packages/utils/src/config/index.spec.ts +0 -165
  383. package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
  384. package/packages/utils/src/config/resolveConfigValue.ts +0 -10
  385. package/packages/utils/src/errors/index.spec.ts +0 -35
  386. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
  387. package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
  388. package/packages/utils/src/fetch/index.spec.ts +0 -34
  389. package/packages/utils/src/fetch/index.ts +0 -87
  390. package/packages/utils/src/guards/index.spec.ts +0 -58
  391. package/packages/utils/src/index.spec.ts +0 -471
  392. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
  393. package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
  394. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
  395. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
  396. package/packages/utils/src/middleware/index.spec.ts +0 -99
  397. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
  398. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
  399. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
  400. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
  401. package/packages/utils/src/misc/hashValue.ts +0 -18
  402. package/packages/utils/src/misc/helpers.ts +0 -259
  403. package/packages/utils/src/misc/merge.ts +0 -48
  404. package/packages/utils/src/pagination/index.spec.ts +0 -150
  405. package/packages/utils/src/pagination/index.ts +0 -117
  406. package/packages/utils/src/routing/index.spec.ts +0 -553
  407. package/packages/utils/src/routing/index.ts +0 -424
  408. package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
  409. package/packages/utils/src/routing/validators/zod.ts +0 -14
  410. package/packages/utils/src/services/accountsGateway/README.md +0 -3
  411. package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
  412. package/packages/utils/src/services/accountsGateway/index.ts +0 -251
  413. package/packages/utils/src/services/apiGateway/README.md +0 -93
  414. package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
  415. package/packages/utils/src/services/apiGateway/index.ts +0 -189
  416. package/packages/utils/src/services/authProvider/README.md +0 -21
  417. package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
  418. package/packages/utils/src/services/authProvider/browser.ts +0 -209
  419. package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
  420. package/packages/utils/src/services/authProvider/decryption.ts +0 -98
  421. package/packages/utils/src/services/authProvider/index.ts +0 -93
  422. package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
  423. package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
  424. package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
  425. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
  426. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
  427. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
  428. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
  429. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
  430. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
  431. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
  432. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
  433. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
  434. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
  435. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
  436. package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
  437. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
  438. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
  439. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
  440. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
  441. package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
  442. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
  443. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
  444. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
  445. package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
  446. package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
  447. package/packages/utils/src/services/exercisesGateway/README.md +0 -5
  448. package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
  449. package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
  450. package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
  451. package/packages/utils/src/services/fileServer/index.ts +0 -43
  452. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
  453. package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
  454. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
  455. package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
  456. package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
  457. package/packages/utils/src/services/launchParams/signer.ts +0 -73
  458. package/packages/utils/src/services/launchParams/verifier.ts +0 -120
  459. package/packages/utils/src/services/logger/console.spec.ts +0 -29
  460. package/packages/utils/src/services/logger/index.spec.ts +0 -65
  461. package/packages/utils/src/services/lrsGateway/README.md +0 -5
  462. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
  463. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
  464. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
  465. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
  466. package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
  467. package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
  468. package/packages/utils/src/services/lrsGateway/index.ts +0 -257
  469. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
  470. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
  471. package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
  472. package/packages/utils/src/services/postgresConnection/index.ts +0 -84
  473. package/packages/utils/src/services/searchProvider/README.md +0 -3
  474. package/packages/utils/src/services/searchProvider/index.ts +0 -59
  475. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
  476. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
  477. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
  478. package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
  479. package/packages/utils/tsconfig.json +0 -31
  480. package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
  481. package/packages/utils/tsconfig.without-specs.esm.json +0 -7
  482. package/packages/utils/tsconfig.without-specs.json +0 -6
  483. package/scripts/build.bash +0 -24
  484. package/scripts/ci.bash +0 -10
  485. package/scripts/start.bash +0 -29
  486. /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
  487. /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
  488. /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
  489. /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
  490. /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
  491. /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
  492. /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
  493. /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
  494. /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
  495. /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
  496. /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
  497. /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
  498. /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
  499. /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
  500. /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
  501. /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
  502. /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
  503. /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
  504. /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
  505. /package/{packages/utils/script → script}/bin/which.bash +0 -0
  506. /package/{packages/utils/script → script}/bin-entry.bash +0 -0
  507. /package/{packages/utils/script → script}/build.bash +0 -0
@@ -1,16 +0,0 @@
1
- import { CreateSearchProvider } from '../middleware/searchMiddleware';
2
- import { documentSearchMiddleware } from './documentSearchMiddleware';
3
- import { ExampleDocumentStore } from './documentStoreMiddleware';
4
-
5
- describe('documentSearchMiddleware', () => {
6
- it('creates it', () => {
7
- const createSearchProviderSpy = jest.fn();
8
- const services = {
9
- createSearchProvider: createSearchProviderSpy as unknown as CreateSearchProvider,
10
- exampleDocumentStore: {} as ExampleDocumentStore,
11
- };
12
- const middleware = documentSearchMiddleware()(services);
13
- expect(middleware).toHaveProperty('exampleDocumentSearch');
14
- expect(services.createSearchProvider).toHaveBeenCalled();
15
- });
16
- });
@@ -1,41 +0,0 @@
1
- import { IndexConfig } from '@openstax/ts-utils/services/searchProvider/openSearch';
2
- import { CreateSearchProvider } from '../middleware/searchMiddleware';
3
- import { ExampleDocumentStore } from './documentStoreMiddleware';
4
-
5
- const indexConfig: IndexConfig = {
6
- name: 'example_example_document',
7
- mappings: {
8
- id: { type: 'keyword' },
9
- name: { type: 'text' },
10
- description: { type: 'text' },
11
- author: {
12
- properties: {
13
- uuid: {type: 'keyword'},
14
- },
15
- },
16
- },
17
- pageSize: 10,
18
- };
19
-
20
- /*
21
- * this is an example of a dedicated search provider middleware,
22
- * however because of the dependency loop created by the local
23
- * memory search, the document store middleware also has the search
24
- * provider embedded (so that it can update documents when they're
25
- * mutated) and in general it will be easier to just search through
26
- * the document store directly
27
- */
28
- export const documentSearchMiddleware = <M extends {
29
- exampleDocumentStore: ExampleDocumentStore;
30
- createSearchProvider: CreateSearchProvider;
31
- }>() => (middleware: M) => {
32
- const exampleDocumentSearch = middleware.createSearchProvider({
33
- store: middleware.exampleDocumentStore,
34
- ...indexConfig
35
- });
36
-
37
- return {
38
- ...middleware,
39
- exampleDocumentSearch,
40
- };
41
- };
@@ -1,78 +0,0 @@
1
- import { stubAuthProvider, User } from '@openstax/ts-utils/services/authProvider';
2
- import { AppServices } from '../../../core';
3
- import { CreateSearchProvider } from '../middleware/searchMiddleware';
4
- import { documentStoreMiddleware } from './documentStoreMiddleware';
5
-
6
- describe('documentStoreMiddleware', () => {
7
- const envBack = process.env;
8
-
9
- beforeEach(() => {
10
- process.env = {...process.env};
11
- });
12
-
13
- afterEach(() => {
14
- process.env = envBack;
15
- });
16
-
17
- it('getAuthor produces audit entry', async() => {
18
- process.env.ExampleDocumentTableName = 'some_name';
19
- const authProvider = stubAuthProvider({uuid: 'a uuid', name: 'a name'} as User);
20
- const searchSpy = jest.fn();
21
- const createSearchProviderSpy = jest.fn().mockReturnValue({search: searchSpy});
22
-
23
- let getAuthor: any;
24
-
25
- const versionedDocumentStoreInner = jest.fn((_1, _2, options) => { getAuthor = options.getAuthor;});
26
- const versionedDocumentStore = jest.fn().mockReturnValue(jest.fn().mockReturnValue(versionedDocumentStoreInner));
27
- const services = {authProvider, createSearchProvider: createSearchProviderSpy as CreateSearchProvider};
28
- documentStoreMiddleware({versionedDocumentStore} as unknown as AppServices)(services);
29
-
30
- expect(getAuthor).toBeDefined();
31
- expect(await getAuthor()).toEqual({
32
- type: 'user',
33
- uuid: 'a uuid',
34
- name: 'a name',
35
- });
36
- expect(await getAuthor('a reason')).toEqual({
37
- type: 'user',
38
- uuid: 'a uuid',
39
- name: 'a name',
40
- reason: 'a reason',
41
- });
42
- });
43
-
44
- it('getAuthor throws without user', async() => {
45
- process.env.ExampleDocumentTableName = 'some_name';
46
- const authProvider = stubAuthProvider();
47
- const searchSpy = jest.fn();
48
- const createSearchProviderSpy = jest.fn().mockReturnValue({search: searchSpy});
49
-
50
- let getAuthor: any;
51
-
52
- const versionedDocumentStoreInner = jest.fn((_1, _2, options) => { getAuthor = options.getAuthor;});
53
- const versionedDocumentStore = jest.fn().mockReturnValue(jest.fn().mockReturnValue(versionedDocumentStoreInner));
54
- const services = {authProvider, createSearchProvider: createSearchProviderSpy as CreateSearchProvider};
55
- documentStoreMiddleware({versionedDocumentStore} as unknown as AppServices)(services);
56
-
57
- expect(getAuthor).toBeDefined();
58
- await expect(getAuthor()).rejects.toThrow();
59
- });
60
-
61
- it('indexes search on afterWrite', async() => {
62
- const authProvider = stubAuthProvider({uuid: 'a uuid', name: 'a name'} as User);
63
- const searchSpy = jest.fn();
64
- const indexSpy = jest.fn();
65
- const createSearchProviderSpy = jest.fn().mockReturnValue({search: searchSpy, index: indexSpy});
66
-
67
- let afterWrite: any;
68
-
69
- const versionedDocumentStoreInner = jest.fn((_1, _2, options) => { afterWrite = options.afterWrite;});
70
- const versionedDocumentStore = jest.fn().mockReturnValue(jest.fn().mockReturnValue(versionedDocumentStoreInner));
71
- const services = {authProvider, createSearchProvider: createSearchProviderSpy as CreateSearchProvider};
72
- documentStoreMiddleware({versionedDocumentStore} as unknown as AppServices)(services);
73
-
74
- const payload = {id: 'some id', name: 'some name', description: 'some description'};
75
- await afterWrite(payload);
76
- expect(indexSpy).toHaveBeenCalledWith(expect.objectContaining({id: 'some id', body: payload}));
77
- });
78
- });
@@ -1,70 +0,0 @@
1
- import { assertDefined } from '@openstax/ts-utils/assertions';
2
- import { envConfig } from '@openstax/ts-utils/config';
3
- import { UnauthorizedError } from '@openstax/ts-utils/errors';
4
- import { AuthProvider } from '@openstax/ts-utils/services/authProvider';
5
- import { VersionedDocumentRequiredFields } from '@openstax/ts-utils/services/documentStore/versioned';
6
- import { IndexConfig } from '@openstax/ts-utils/services/searchProvider/openSearch';
7
- import { AppServices } from '../../../core';
8
- import { CreateSearchProvider } from '../middleware/searchMiddleware';
9
-
10
- const searchIndexConfig: IndexConfig = {
11
- name: 'example_example_document',
12
- mappings: {
13
- id: { type: 'keyword' },
14
- name: { type: 'text' },
15
- description: { type: 'text' },
16
- author: {
17
- properties: {
18
- uuid: {type: 'keyword'},
19
- },
20
- },
21
- },
22
- pageSize: 10,
23
- };
24
-
25
- export type ExampleDocument = {
26
- id: string;
27
- name: string;
28
- description: string;
29
- } & VersionedDocumentRequiredFields;
30
-
31
- const config = {
32
- fileSystem: {
33
- tableName: 'example-document'
34
- },
35
- dynamodb: {
36
- tableName: envConfig('EXAMPLE_TABLE_NAME', 'runtime'),
37
- }
38
- };
39
-
40
- export const documentStoreMiddleware = <M extends {
41
- authProvider: AuthProvider;
42
- createSearchProvider: CreateSearchProvider;
43
- }>(app: AppServices) => {
44
- const makeExampleDocumentStore = app.versionedDocumentStore<ExampleDocument>()(config);
45
-
46
- return (middleware: M) => {
47
- const getAuthor = async(reason?: string) => {
48
- const user = assertDefined(await middleware.authProvider.getUser(), new UnauthorizedError());
49
- return {type: 'user' as const, uuid: user.uuid, name: user.name, ...(reason ? {reason} : {})};
50
- };
51
- const afterWrite = async(item: ExampleDocument) => {
52
- await exampleDocumentSearch.index({id: item.id, body: item});
53
- };
54
- const exampleDocumentStore = makeExampleDocumentStore(middleware, 'id', {getAuthor, afterWrite});
55
- const exampleDocumentSearch = middleware.createSearchProvider({
56
- store: exampleDocumentStore,
57
- ...searchIndexConfig
58
- });
59
-
60
- return {
61
- ...middleware,
62
- exampleDocumentStore: {
63
- ...exampleDocumentStore,
64
- search: exampleDocumentSearch.search,
65
- },
66
- };
67
- };
68
- };
69
-
70
- export type ExampleDocumentStore = ReturnType<ReturnType<typeof documentStoreMiddleware>>['exampleDocumentStore'];
@@ -1,306 +0,0 @@
1
- import { ApiRouteRequest } from '../../../core';
2
- import { apiV0AccessControl, apiV0ExampleError, apiV0ExampleReverseRouting, apiV0GetExampleDoc, apiV0GetExampleDocHistory, apiV0SearchExampleDoc, apiV0WriteExampleDoc } from './routes';
3
-
4
- let request: ApiRouteRequest;
5
-
6
- beforeEach(async () => {
7
- request = {} as ApiRouteRequest;
8
- });
9
-
10
- afterEach(() => {
11
- jest.clearAllMocks();
12
- });
13
-
14
- describe('apiV0ExampleReverseRouting', () => {
15
- it('matches snapshot', async() => {
16
- const response = await apiV0ExampleReverseRouting.handler(undefined, {request} as any);
17
- expect(response).toMatchInlineSnapshot(`
18
- {
19
- "body": "{"links":{"apiV0GetExampleDoc":"/api/v0/get-example-document/foo","apiV0WriteExampleDoc":"/api/v0/write-example-document/bar"}}",
20
- "data": {
21
- "links": {
22
- "apiV0GetExampleDoc": "/api/v0/get-example-document/foo",
23
- "apiV0WriteExampleDoc": "/api/v0/write-example-document/bar",
24
- },
25
- },
26
- "headers": {
27
- "content-type": "application/json",
28
- },
29
- "statusCode": 200,
30
- }
31
- `);
32
- });
33
- });
34
-
35
- describe('apiV0AccessControl', () => {
36
- it('fails', async() => {
37
- const assertUserRole = jest.fn().mockImplementation(() => { throw new Error(); });
38
- const requestServices = {
39
- roleValidator: {assertUserRole}
40
- } as any;
41
- await expect(() => apiV0AccessControl.handler(undefined, requestServices)).rejects.toThrow();
42
- });
43
-
44
- it('passes', async() => {
45
- const assertUserRole = jest.fn();
46
- const requestServices = {
47
- roleValidator: {assertUserRole}
48
- } as any;
49
- await expect(apiV0AccessControl.handler(undefined, requestServices)).resolves.not.toThrow();
50
- });
51
- });
52
-
53
- describe('apiV0SearchExampleDoc', () => {
54
- it('searches', async() => {
55
- const search = jest.fn();
56
- const requestServices = {
57
- pagination: {
58
- getPaginationParams: () => ({}),
59
- getPaginationResponse: (x: any) => x,
60
- },
61
- exampleDocumentSearch: {search},
62
- request: {
63
- queryStringParameters: {
64
- query: 'cool query',
65
- someFilter: 'filter value'
66
- }
67
- }
68
- } as any;
69
- search.mockReturnValue([{result: 'value'}]);
70
- const result = await apiV0SearchExampleDoc.handler(undefined, requestServices);
71
-
72
- expect(search).toHaveBeenCalledWith(expect.objectContaining({
73
- query: 'cool query',
74
- filter: [{key: 'someFilter', value: ['filter value']}]
75
- }));
76
- expect(result).toMatchInlineSnapshot(`
77
- {
78
- "body": "[{"result":"value"}]",
79
- "data": [
80
- {
81
- "result": "value",
82
- },
83
- ],
84
- "headers": {
85
- "content-type": "application/json",
86
- },
87
- "statusCode": 200,
88
- }
89
- `);
90
- });
91
-
92
- it('works with no query', async() => {
93
- const search = jest.fn();
94
- const requestServices = {
95
- pagination: {
96
- getPaginationParams: () => ({}),
97
- getPaginationResponse: (x: any) => x,
98
- },
99
- exampleDocumentSearch: {search},
100
- request: {
101
- }
102
- } as any;
103
- search.mockReturnValue([{result: 'value'}]);
104
- const result = await apiV0SearchExampleDoc.handler(undefined, requestServices);
105
-
106
- expect(search).toHaveBeenCalledWith(expect.objectContaining({
107
- query: undefined,
108
- filter: []
109
- }));
110
- expect(result).toMatchInlineSnapshot(`
111
- {
112
- "body": "[{"result":"value"}]",
113
- "data": [
114
- {
115
- "result": "value",
116
- },
117
- ],
118
- "headers": {
119
- "content-type": "application/json",
120
- },
121
- "statusCode": 200,
122
- }
123
- `);
124
- });
125
-
126
- it('omits empty filters', async() => {
127
- const search = jest.fn();
128
- const requestServices = {
129
- pagination: {
130
- getPaginationParams: () => ({}),
131
- getPaginationResponse: (x: any) => x,
132
- },
133
- exampleDocumentSearch: {search},
134
- request: {
135
- queryStringParameters: {
136
- query: 'cool query',
137
- someFilter: ''
138
- }
139
- }
140
- } as any;
141
- search.mockReturnValue([{result: 'value'}]);
142
- const result = await apiV0SearchExampleDoc.handler(undefined, requestServices);
143
-
144
- expect(search).toHaveBeenCalledWith(expect.objectContaining({
145
- query: 'cool query',
146
- filter: []
147
- }));
148
- expect(result).toMatchInlineSnapshot(`
149
- {
150
- "body": "[{"result":"value"}]",
151
- "data": [
152
- {
153
- "result": "value",
154
- },
155
- ],
156
- "headers": {
157
- "content-type": "application/json",
158
- },
159
- "statusCode": 200,
160
- }
161
- `);
162
- });
163
- });
164
-
165
- describe('apiV0GetExampleDocHistory', () => {
166
- it('gets versions', async() => {
167
- const getVersions = jest.fn();
168
- const requestServices = {
169
- pagination: {
170
- getPageTokenNumber: () => 1111,
171
- getPaginationResponse: (x: any) => x,
172
- },
173
- exampleDocumentStore: {getVersions}
174
- } as any;
175
- getVersions.mockReturnValue([{foo: 'bar'}]);
176
- const result = await apiV0GetExampleDocHistory.handler({key: 'example-id'}, requestServices);
177
-
178
- expect(getVersions).toHaveBeenCalledWith('example-id', 1111);
179
- expect(result).toMatchInlineSnapshot(`
180
- {
181
- "body": "[{"foo":"bar"}]",
182
- "data": [
183
- {
184
- "foo": "bar",
185
- },
186
- ],
187
- "headers": {
188
- "content-type": "application/json",
189
- },
190
- "statusCode": 200,
191
- }
192
- `);
193
- });
194
-
195
- it('returns 404 for missing item', async() => {
196
- const getVersions = jest.fn();
197
- const requestServices = {
198
- pagination: {
199
- getPageTokenNumber: () => 1111,
200
- getPaginationResponse: (x: any) => x,
201
- },
202
- exampleDocumentStore: {getVersions}
203
- } as any;
204
- getVersions.mockReturnValue(undefined);
205
- const result = await apiV0GetExampleDocHistory.handler({key: 'example-id'}, requestServices);
206
-
207
- expect(getVersions).toHaveBeenCalledWith('example-id', 1111);
208
- expect(result).toMatchInlineSnapshot(`
209
- {
210
- "body": "{"message":"requested item not found"}",
211
- "data": {
212
- "message": "requested item not found",
213
- },
214
- "headers": {
215
- "content-type": "application/json",
216
- },
217
- "statusCode": 404,
218
- }
219
- `);
220
- });
221
- });
222
-
223
- describe('apiV0GetExampleDoc', () => {
224
- it('returns result from document store', async() => {
225
- const getItem = jest.fn();
226
- const requestServices = {
227
- exampleDocumentStore: {getItem}
228
- } as any;
229
- getItem.mockReturnValue({foo: 'bar'});
230
- const result = await apiV0GetExampleDoc.handler({key: 'example-id'}, requestServices);
231
-
232
- expect(getItem).toHaveBeenCalledWith('example-id');
233
- expect(result).toMatchInlineSnapshot(`
234
- {
235
- "body": "{"foo":"bar"}",
236
- "data": {
237
- "foo": "bar",
238
- },
239
- "headers": {
240
- "content-type": "application/json",
241
- },
242
- "statusCode": 200,
243
- }
244
- `);
245
- });
246
-
247
- it('returns 404 for missing item', async() => {
248
- const getItem = jest.fn();
249
- const requestServices = {
250
- exampleDocumentStore: {getItem}
251
- } as any;
252
- getItem.mockReturnValue(undefined);
253
- const result = await apiV0GetExampleDoc.handler({key: 'example-id'}, requestServices);
254
-
255
- expect(getItem).toHaveBeenCalledWith('example-id');
256
- expect(result).toMatchInlineSnapshot(`
257
- {
258
- "body": "{"message":"requested item not found"}",
259
- "data": {
260
- "message": "requested item not found",
261
- },
262
- "headers": {
263
- "content-type": "application/json",
264
- },
265
- "statusCode": 404,
266
- }
267
- `);
268
- });
269
- });
270
-
271
- describe('apiV0WriteExampleDoc', () => {
272
- it('saves item', async() => {
273
- const item = {asdf: 'foo'};
274
- const putItem = jest.fn();
275
- const requestServices = {
276
- request,
277
- exampleDocumentStore: {putItem},
278
- payload: item
279
- } as any;
280
- putItem.mockReturnValue(Promise.resolve({...item, id: 'example-id'}));
281
- const result = await apiV0WriteExampleDoc.handler({key: 'example-id'}, requestServices);
282
-
283
- expect(putItem).toHaveBeenCalledWith({...item, id: 'example-id'});
284
-
285
- expect(result).toMatchInlineSnapshot(`
286
- {
287
- "body": "{"asdf":"foo","id":"example-id"}",
288
- "data": {
289
- "asdf": "foo",
290
- "id": "example-id",
291
- },
292
- "headers": {
293
- "content-type": "application/json",
294
- },
295
- "statusCode": 201,
296
- }
297
- `);
298
- });
299
- });
300
-
301
- describe('apiV0ExampleError', () => {
302
- it('saves item', async() => {
303
- const requestServices = {} as any;
304
- await expect(apiV0ExampleError.handler(undefined, requestServices)).rejects.toThrow();
305
- });
306
- });
@@ -1,176 +0,0 @@
1
- import { isDefined } from '@openstax/ts-utils/guards';
2
- import { apiJsonResponse, ApiResponse, apiTextResponse, METHOD, requestPayloadProvider, routesList } from '@openstax/ts-utils/routing';
3
- import { zodPayloadValidator } from '@openstax/ts-utils/routing/validators/zod';
4
- import { z } from 'zod';
5
- import { renderRouteUrl } from '../../../core/routes';
6
- import { composeServiceMiddleware, createRoute } from '../../../core/services';
7
- import { authMiddleware } from '../middleware/authMiddleware';
8
- import { loadMorePaginationMiddleware, pageNumberPaginationMiddleware } from '../middleware/paginationMiddleware';
9
- import { searchMiddleware } from '../middleware/searchMiddleware';
10
- import { userRoleValidatorMiddleware } from '../middleware/userRoleValidatorMiddleware';
11
- import { documentSearchMiddleware } from './documentSearchMiddleware';
12
- import { documentStoreMiddleware } from './documentStoreMiddleware';
13
-
14
- // shared middleware can be gathered separately like this
15
- const requestServiceProvider = composeServiceMiddleware(
16
- authMiddleware,
17
- userRoleValidatorMiddleware,
18
- searchMiddleware,
19
- documentStoreMiddleware,
20
- documentSearchMiddleware,
21
- );
22
-
23
- export const apiV0ExampleError = createRoute({name: 'apiV0ExampleError', method: METHOD.GET, path: '/api/v0/example-error',
24
- requestServiceProvider, // if you don't need any other middleware just pass it through
25
- handler: async() => {
26
- throw new Error('cool message');
27
- }
28
- });
29
-
30
- export const apiV0AccessControl = createRoute({name: 'apiV0AccessControl', method: METHOD.GET, path: '/api/v0/access-control',
31
- requestServiceProvider, // if you don't need any other middleware just pass it through
32
- handler: async(_: undefined, {roleValidator}) => {
33
-
34
- await roleValidator.assertUserRole(['admin', 'manager']);
35
-
36
- return apiTextResponse(200, 'for sure either an admin or a manager');
37
- }
38
- });
39
-
40
- export const apiV0ExampleReverseRouting = createRoute({name: 'apiV0ExampleReverseRouting', method: METHOD.GET, path: '/api/v0/example',
41
- requestServiceProvider,
42
- /*
43
- * you can provide an explicit response type like this, or let typescript figure it out from the return statements,
44
- * in either case the apiGateway helper will pull this response type through to the client code.
45
- */
46
- handler: async(): Promise<ApiResponse<200, {links: {[key: string]: string}}>> => {
47
- return apiJsonResponse(200, {
48
- links: {
49
- [apiV0GetExampleDoc.name]: renderRouteUrl(apiV0GetExampleDoc, {key: 'foo'}),
50
- [apiV0WriteExampleDoc.name]: renderRouteUrl(apiV0WriteExampleDoc, {key: 'bar'}),
51
- }
52
- });
53
- }
54
- });
55
-
56
- /*
57
- * loading version history of a document is an example of "load more" style pagination, this is necessary
58
- * because of the way dynamodb does its pagination
59
- */
60
- export const apiV0GetExampleDocHistory = createRoute({name: 'apiV0GetExampleDocHistory', method: METHOD.GET, path: '/api/v0/get-example-document/:key/history',
61
- requestServiceProvider: composeServiceMiddleware( // more middleware can be composed in the same way
62
- requestServiceProvider,
63
- loadMorePaginationMiddleware,
64
- )},
65
- /*
66
- * if you specify the requestServiceProvider inline, like the previous line, then TS has trouble figuring out the types if
67
- * the handler is part of the same argument, so in this case you need to specify the handler in the second argument
68
- */
69
- async(params: {key: string}, services) => {
70
- const result = await services.exampleDocumentStore.getVersions(params.key, services.pagination.getPageTokenNumber());
71
-
72
- /*
73
- * if a route returns more than one response format, the apiGateway will help clients keep track of that
74
- * and provides a narrowing helper based on the status code (the client can also just throw on unexpected statuses)
75
- */
76
- if (!result) {
77
- return apiJsonResponse(404, { message: 'requested item not found' });
78
- }
79
-
80
- return apiJsonResponse(200, services.pagination.getPaginationResponse(result));
81
- }
82
- );
83
-
84
- export const apiV0GetExampleDoc = createRoute({name: 'apiV0GetExampleDoc', method: METHOD.GET, path: '/api/v0/get-example-document/:key',
85
- requestServiceProvider,
86
- handler: async(params: {key: string}, services) => {
87
- const result = await services.exampleDocumentStore.getItem(params.key);
88
-
89
- if (!result) {
90
- return apiJsonResponse(404, { message: 'requested item not found' });
91
- }
92
-
93
- return apiJsonResponse(200, result);
94
- }
95
- });
96
-
97
- /*
98
- * document search is an example of "page number" style pagination, this is necessary
99
- * because of the way elastic search does its pagination
100
- */
101
- export const apiV0SearchExampleDoc = createRoute({name: 'apiV0SearchExampleDoc', method: METHOD.GET, path: '/api/v0/search-example-document',
102
- requestServiceProvider: composeServiceMiddleware(
103
- requestServiceProvider,
104
- pageNumberPaginationMiddleware,
105
- )},
106
- async(_: undefined, services) => {
107
- const queryParams = services.request.queryStringParameters || {};
108
- const {query, ...filters} = queryParams;
109
-
110
- const result = await services.exampleDocumentSearch.search({
111
- ...services.pagination.getPaginationParams(),
112
- query,
113
- filter: Object.entries(filters).map(([key, value]) => key && value
114
- ? {key, value: value.split(',')}
115
- : undefined
116
- ).filter(isDefined),
117
- fields: [
118
- {key: 'name', weight: 5},
119
- {key: 'description', weight: 1}
120
- ]
121
- });
122
-
123
- return apiJsonResponse(200,
124
- services.pagination.getPaginationResponse(result)
125
- );
126
- }
127
- );
128
-
129
- /*
130
- * zod is a validation library that generates a type for the payload.
131
- *
132
- * if the payload type generated by zod and the application type expected by your documentStore
133
- * don't line up, you will correctly get a typescript error.
134
- *
135
- * the `zodPayloadValidator` takes the zod schema and throws a ValidationError if validation fails.
136
- *
137
- * zod generates robust failure messages that are included on the ValidationError response and
138
- * can be shown in the UI.
139
- */
140
- const exampleDocValidator = z.object({
141
- name: z.string()
142
- .min(1, {message: 'name is required'})
143
- .max(100, {message: 'name is too long'}),
144
- description: z.string()
145
- .min(1, {message: 'description is required'})
146
- .max(100, {message: 'description is too long'}),
147
- }).strict();
148
-
149
-
150
- export const apiV0WriteExampleDoc = createRoute({name: 'apiV0WriteExampleDoc', method: METHOD.POST, path: '/api/v0/write-example-document/:key',
151
- requestServiceProvider: composeServiceMiddleware(
152
- requestServiceProvider,
153
- /*
154
- * the presence of this requestPayloadProvider and the type provided by the validator/guard you pass into it is what
155
- * allows the apiGateway to provide a strong payload type
156
- */
157
- requestPayloadProvider(zodPayloadValidator(exampleDocValidator))
158
- )},
159
- async(params: {key: string}, services) => {
160
- const result = await services.exampleDocumentStore.putItem({
161
- ...services.payload,
162
- id: params.key,
163
- });
164
- return apiJsonResponse(201, result);
165
- }
166
- );
167
-
168
- export const apiV0ExampleRoutes = () => routesList([
169
- apiV0ExampleError,
170
- apiV0AccessControl,
171
- apiV0ExampleReverseRouting,
172
- apiV0GetExampleDocHistory,
173
- apiV0GetExampleDoc,
174
- apiV0SearchExampleDoc,
175
- apiV0WriteExampleDoc,
176
- ]);