@openstax/ts-utils 1.34.0 → 1.34.1

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