@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,262 +0,0 @@
1
- import partition from 'lodash/fp/partition';
2
- import { roundToPrecision } from '../..';
3
- import { AccountsGateway, MappedUserInfo } from '../accountsGateway';
4
- import { AuthProvider } from '../authProvider';
5
- import { ActivityState, resolveAttemptInfo } from './attempt-utils';
6
- import { LrsGateway, XapiStatement } from '.';
7
-
8
- export interface Grade {
9
- activityProgress: 'Initialized' | 'Started' | 'inProgress' | 'Submitted' | 'Completed';
10
- comment?: string;
11
- gradingProgress: 'FullyGraded' | 'Pending' | 'PendingManual' | 'Failed' | 'NotReady';
12
- scoreGiven: number;
13
- scoreMaximum: number;
14
- submission?: {
15
- startedAt?: string;
16
- submittedAt?: string;
17
- };
18
- userId?: string;
19
- }
20
-
21
- export const getRegistrationAttemptInfo = async(lrs: LrsGateway, registration: string, options?: {
22
- activity?: string;
23
- anyUser?: boolean;
24
- currentPreference?: 'latest' | 'oldest';
25
- ensureSync?: boolean;
26
- user?: string;
27
- }) => {
28
- const { currentPreference, ...xapiOptions } = options ?? {};
29
- const allStatements = await lrs.getAllXapiStatements({ ...xapiOptions, registration });
30
-
31
- // Partition statements for each user
32
- const statementsPerUser: { [key: string]: XapiStatement[] } = {};
33
- allStatements.forEach((statement) => {
34
- // If we ever support accounts from different statement.actor.account.homePage, this method may need changes
35
- // (unless we can guarantee the statement.actor.account.name are unique)
36
- statementsPerUser[statement.actor.account.name] ||= [];
37
- statementsPerUser[statement.actor.account.name].push(statement);
38
- });
39
-
40
- const result: { [key: string]: ReturnType<typeof resolveAttemptInfo> } = {};
41
- for (const [userUuid, userStatements] of Object.entries(statementsPerUser)) {
42
- result[userUuid] = resolveAttemptInfo(userStatements, { currentPreference });
43
- }
44
-
45
- return result;
46
- };
47
-
48
- // generates a payload that can be sent to the LMS, documentation here:
49
- // lti: http://www.imsglobal.org/spec/lti-ags/v2p0#score-publish-service
50
- // ltijs: https://cvmcosta.me/ltijs/#/grading
51
- // Note: "min" is currently completely ignored
52
- export const getScoreGrade = (
53
- score: { scaled?: number; raw?: number; min?: number; max?: number },
54
- options: { maxScore?: number; startedAt?: string; submittedAt?: string; userId?: string }
55
- ): Grade => {
56
- const { raw, scaled, max } = score;
57
- const { maxScore, startedAt, submittedAt, userId } = options;
58
-
59
- const scoreMaximum = maxScore ?? 100;
60
-
61
- const scoreGiven = raw && max
62
- ? scoreMaximum / max * raw
63
- : scaled
64
- ? scaled * scoreMaximum
65
- : 0
66
- ;
67
-
68
- const submission: { startedAt?: string; submittedAt?: string } = {};
69
- if (startedAt) {
70
- submission.startedAt = startedAt;
71
- }
72
- if (submittedAt) {
73
- submission.submittedAt = submittedAt;
74
- }
75
-
76
- return {
77
- userId,
78
- activityProgress: submittedAt ? 'Completed' : 'Started',
79
- // canvas assumes that anything that isn't 'FullyGraded' requires manual grading and displays a "needs grading" icon.
80
- // if you warp your mind you can consider the portion of the assignment which is completed to be fully graded.
81
- gradingProgress: 'FullyGraded',
82
- scoreMaximum,
83
- scoreGiven: roundToPrecision(scoreGiven, -2),
84
- submission,
85
- };
86
- };
87
-
88
- export type Progress = {
89
- scaled: number;
90
- max?: number;
91
- raw?: number;
92
- };
93
-
94
- export type GradeAndProgress = {
95
- grade: Grade;
96
- progress: Progress;
97
- name?: string;
98
- };
99
-
100
- export type UserActivityInfo = MappedUserInfo<ActivityState>;
101
-
102
- // These methods assign 0's to incomplete activities
103
- const pickAttemptAndCompleted = (
104
- state: ActivityState,
105
- gradePreference: 'current' | 'best'
106
- ): { attempt?: XapiStatement; completed?: XapiStatement } => {
107
-
108
- if (gradePreference === 'best' && state.bestCompletedAttempt) {
109
- return {
110
- attempt: state.bestCompletedAttempt,
111
- completed: state.bestCompletedAttemptCompleted,
112
- };
113
- }
114
-
115
- // return current attempt if gradePreference is current
116
- return {
117
- attempt: state.currentAttempt,
118
- completed: state.currentAttemptCompleted,
119
- };
120
- };
121
-
122
- const getCompletedActivityStateGradeAndProgress = ({ name, scoreMaximum, state, userId, gradePreference = 'current' }: {
123
- name?: string; scoreMaximum?: number; state: ActivityState; userId?: string; gradePreference?: 'current' | 'best';
124
- }): GradeAndProgress => {
125
- const { attempt, completed } = pickAttemptAndCompleted(state, gradePreference);
126
-
127
- return {
128
- grade: getScoreGrade(
129
- completed?.result?.score || {},
130
- {
131
- maxScore: scoreMaximum,
132
- startedAt: attempt?.timestamp,
133
- submittedAt: completed?.timestamp,
134
- userId,
135
- }
136
- ),
137
- progress: {
138
- scaled: completed ? 1 : 0,
139
- },
140
- name,
141
- };
142
- };
143
-
144
- export const getCompletedUserInfosGradeAndProgress = (
145
- infos: UserActivityInfo[],
146
- scoreMaximum?: number,
147
- gradePreference?: 'current' | 'best'
148
- ) =>
149
- infos.map(
150
- ({ data, fullName, platformUserId }) =>
151
- getCompletedActivityStateGradeAndProgress({
152
- name: fullName,
153
- scoreMaximum,
154
- userId: platformUserId,
155
- state: data,
156
- gradePreference,
157
- })
158
- );
159
-
160
- export const getCurrentGrade = async(
161
- services: {
162
- lrs: LrsGateway;
163
- ltiAuthProvider: AuthProvider;
164
- },
165
- registration: string,
166
- options?: {
167
- currentPreference?: 'latest' | 'oldest';
168
- incompleteAttemptCallback?: (info: ActivityState) => Promise<GradeAndProgress>;
169
- name?: string;
170
- scoreMaximum?: number;
171
- userId?: string;
172
- gradePreference?: 'current' | 'best';
173
- }): Promise<GradeAndProgress | null> => {
174
- const user = await services.ltiAuthProvider.getUser();
175
- if (!user) { return null; }
176
-
177
- const userId = options?.userId ?? user.uuid;
178
- const {
179
- currentPreference,
180
- incompleteAttemptCallback,
181
- name,
182
- scoreMaximum,
183
- gradePreference,
184
- } = options ?? {};
185
-
186
- const infoPerUser = await getRegistrationAttemptInfo(services.lrs, registration, { currentPreference });
187
- const userInfo = infoPerUser[user.uuid];
188
-
189
- if (!userInfo) {
190
- return getCompletedActivityStateGradeAndProgress({
191
- name,
192
- scoreMaximum,
193
- state: resolveAttemptInfo([]),
194
- userId,
195
- gradePreference,
196
- });
197
- }
198
- if (userInfo.currentAttemptCompleted || !incompleteAttemptCallback) {
199
- return getCompletedActivityStateGradeAndProgress({
200
- name,
201
- scoreMaximum,
202
- state: userInfo,
203
- userId,
204
- gradePreference,
205
- });
206
- }
207
-
208
- return incompleteAttemptCallback(userInfo);
209
- };
210
-
211
- export const getAssignmentGrades = async(
212
- services: {
213
- accountsGateway: AccountsGateway;
214
- lrs: LrsGateway;
215
- },
216
- assignmentIRI: string,
217
- registration: string,
218
- options?: {
219
- anyUser?: boolean;
220
- currentPreference?: 'latest' | 'oldest';
221
- incompleteAttemptsCallback?: (mappedInfo: UserActivityInfo[]) => Promise<GradeAndProgress[]>;
222
- platformId?: string;
223
- scoreMaximum?: number;
224
- user?: string;
225
- gradePreference?: 'current' | 'best';
226
- }
227
- ): Promise<GradeAndProgress[]> => {
228
- const {
229
- anyUser,
230
- currentPreference,
231
- incompleteAttemptsCallback,
232
- platformId,
233
- scoreMaximum,
234
- user,
235
- gradePreference = 'current',
236
- } = options ?? {};
237
-
238
- const infoPerUserUuid = await getRegistrationAttemptInfo(
239
- services.lrs, registration, { activity: assignmentIRI, anyUser, currentPreference, user }
240
- );
241
-
242
- const mappedInfo = await services.accountsGateway.mapUserUuids(
243
- infoPerUserUuid, platformId
244
- );
245
-
246
- // If no custom callback, just return graded results based on preference
247
- if (!incompleteAttemptsCallback) {
248
- return getCompletedUserInfosGradeAndProgress(mappedInfo, scoreMaximum, gradePreference);
249
- }
250
-
251
- // Partition based on whether the chosen preference has a completed attempt
252
- const [incompleteInfo, completedInfo] = partition(
253
- (info: UserActivityInfo) => {
254
- const { completed } = pickAttemptAndCompleted(info.data, gradePreference);
255
- return completed === undefined;
256
- }
257
- )(mappedInfo);
258
-
259
- return getCompletedUserInfosGradeAndProgress(completedInfo, scoreMaximum, gradePreference).concat(
260
- await incompleteAttemptsCallback(incompleteInfo)
261
- );
262
- };
@@ -1,170 +0,0 @@
1
- import postgres from 'postgres';
2
- import { createCoreLogger } from '../logger';
3
- import { PostgresConnection, postgresConnection } from '.';
4
-
5
- jest.mock('postgres');
6
-
7
-
8
- const postgresSpy = postgres as any as jest.Mock;
9
- afterEach(() => {
10
- jest.clearAllMocks();
11
- jest.resetAllMocks();
12
- });
13
-
14
- describe('postgresConnection', () => {
15
- const config = {
16
- local: {
17
- host: 'cool host',
18
- readHost: 'cool read host',
19
- port: '3',
20
- database: 'cool database',
21
- username: 'cool username',
22
- password: 'cool password'
23
- }
24
- };
25
- let connection: PostgresConnection;
26
-
27
- beforeEach(() => {
28
- const logger = createCoreLogger(jest.fn());
29
- const services = {logger};
30
- connection = postgresConnection({})(config)(services);
31
- });
32
-
33
- it('initializes connection', async () => {
34
- await connection.db();
35
- expect(postgresSpy.mock.calls[0][0]).toEqual({
36
- database: 'cool database',
37
- host: 'cool host',
38
- password: 'cool password',
39
- port: 3,
40
- transform: expect.anything(),
41
- username: 'cool username',
42
- });
43
- });
44
-
45
- it('initializes readonly connection', async () => {
46
- await connection.dbRead();
47
- expect(postgresSpy.mock.calls[0][0]).toEqual({
48
- database: 'cool database',
49
- host: 'cool read host',
50
- password: 'cool password',
51
- port: 3,
52
- transform: expect.anything(),
53
- username: 'cool username',
54
- });
55
- });
56
-
57
- describe('migrations', () => {
58
- it('creates migrations table', async () => {
59
- const dbSpy = jest.fn((..._: any[]) => []);
60
- postgresSpy.mockReturnValue(dbSpy);
61
- await connection.migrate([]);
62
- expect(dbSpy.mock.calls[0][0]).toMatchInlineSnapshot(`
63
- [
64
- "
65
- CREATE TABLE IF NOT EXISTS migrations (
66
- id SERIAL PRIMARY KEY,
67
- name TEXT NOT NULL,
68
- ran_at TIMESTAMP NOT NULL DEFAULT NOW()
69
- )
70
- ",
71
- ]
72
- `);
73
- });
74
-
75
- it('runs migration and records it', async () => {
76
- const dbSpy = jest.fn(() => []);
77
- const up = jest.fn();
78
- postgresSpy.mockReturnValue(dbSpy);
79
- await connection.migrate([{name: 'test', up}]);
80
- expect(up).toHaveBeenCalled();
81
- expect(dbSpy.mock.calls.slice(2)).toMatchInlineSnapshot(`
82
- [
83
- [
84
- [
85
- "INSERT INTO migrations (name) VALUES (",
86
- ")",
87
- ],
88
- "test",
89
- ],
90
- ]
91
- `);
92
- });
93
-
94
- it('doesn\'t run migration if already run', async () => {
95
- const dbSpy = jest.fn((query: string[]) => query[0] === 'SELECT name FROM migrations'
96
- ? [{name: 'test'}]
97
- : []
98
- );
99
- const up = jest.fn();
100
- postgresSpy.mockReturnValue(dbSpy);
101
- await connection.migrate([{name: 'test', up}]);
102
- expect(up).not.toHaveBeenCalled();
103
- expect(dbSpy.mock.calls.slice(2)).toMatchInlineSnapshot('[]');
104
- });
105
- });
106
-
107
- describe('down', () => {
108
- it('does nothing if no connections are established', async () => {
109
- const downSpy = jest.fn();
110
- postgresSpy.mockReturnValue({end: downSpy});
111
- await connection.down();
112
- expect(downSpy).not.toHaveBeenCalled();
113
- });
114
-
115
- it('tears down db connection', async () => {
116
- const downSpy = jest.fn();
117
- postgresSpy.mockReturnValue({end: downSpy});
118
-
119
- await connection.db();
120
-
121
- expect(postgresSpy).toHaveBeenCalledTimes(1);
122
- expect(postgresSpy.mock.calls[0][0]).toEqual(expect.objectContaining({
123
- host: 'cool host',
124
- }));
125
-
126
- await connection.down();
127
-
128
- expect(downSpy).toHaveBeenCalledTimes(1);
129
- });
130
-
131
- it('tears down dbRead connection', async () => {
132
- const downSpy = jest.fn();
133
- postgresSpy.mockReturnValue({end: downSpy});
134
-
135
- await connection.dbRead();
136
-
137
- expect(postgresSpy).toHaveBeenCalledTimes(1);
138
- expect(postgresSpy.mock.calls[0][0]).toEqual(expect.objectContaining({
139
- host: 'cool read host',
140
- }));
141
-
142
- await connection.down();
143
-
144
- expect(downSpy).toHaveBeenCalledTimes(1);
145
- });
146
-
147
- it('tears down db and dbRead connection', async () => {
148
- const downSpy1 = jest.fn();
149
- const downSpy2 = jest.fn();
150
- postgresSpy.mockReturnValueOnce({end: downSpy1});
151
- postgresSpy.mockReturnValueOnce({end: downSpy2});
152
-
153
- await connection.db();
154
- await connection.dbRead();
155
-
156
- expect(postgresSpy).toHaveBeenCalledTimes(2);
157
- expect(postgresSpy.mock.calls[0][0]).toEqual(expect.objectContaining({
158
- host: 'cool host',
159
- }));
160
- expect(postgresSpy.mock.calls[1][0]).toEqual(expect.objectContaining({
161
- host: 'cool read host',
162
- }));
163
-
164
- await connection.down();
165
-
166
- expect(downSpy1).toHaveBeenCalledTimes(1);
167
- expect(downSpy2).toHaveBeenCalledTimes(1);
168
- });
169
- });
170
- });
@@ -1,84 +0,0 @@
1
- import postgres, {Sql} from 'postgres';
2
- import { assertNotNaN } from '../../assertions';
3
- import { ConfigProviderForConfig, resolveConfigValue } from '../../config';
4
- import { ifDefined } from '../../guards';
5
- import { once } from '../../misc/helpers';
6
- import type { Logger } from '../logger';
7
-
8
- type Config = {
9
- host: string;
10
- readHost: string;
11
- port: string;
12
- database: string;
13
- username: string;
14
- password: string;
15
- };
16
- interface Initializer<C> {
17
- configSpace?: C;
18
- }
19
-
20
- export const postgresConnection = <C extends string = 'local'>(initializer: Initializer<C>) => (configProvider: {[_key in C]: ConfigProviderForConfig<Config>}) => {
21
- const config = configProvider[ifDefined(initializer.configSpace, 'local' as C)];
22
- const host = once(() => resolveConfigValue(config.host));
23
- const readHost = once(() => resolveConfigValue(config.readHost));
24
- const connectionOptions = once(async() => ({
25
- port: assertNotNaN(parseInt(await resolveConfigValue(config.port), 10), new Error('port must be a number')),
26
- database: await resolveConfigValue(config.database),
27
- username: await resolveConfigValue(config.username),
28
- password: await resolveConfigValue(config.password),
29
- transform: {
30
- column: {to: postgres.fromCamel, from: postgres.toCamel},
31
- },
32
- }));
33
- const connections: Sql[] = [];
34
- const sql = once(async() => {
35
- const options = await connectionOptions();
36
- const connection = postgres({...options, host: await host()});
37
- connections.push(connection);
38
- return connection;
39
- });
40
- const sqlRead = once(async() => {
41
- const options = await connectionOptions();
42
- const connection = postgres({...options, host: await readHost()});
43
- connections.push(connection);
44
- return connection;
45
- });
46
-
47
- return (services: {logger: Logger}) => ({
48
- db: sql,
49
- dbRead: sqlRead,
50
- migrate: async(migrations: Migration[]) => {
51
- await migrate(services, await sql(), migrations);
52
- },
53
- down: () => Promise.all(connections.map(c => c.end()))
54
- });
55
- };
56
-
57
- export type PostgresConnection = ReturnType<ReturnType<ReturnType<typeof postgresConnection>>>;
58
-
59
- export interface Migration {
60
- name: string;
61
- up: (db: Sql) => Promise<void>;
62
- }
63
-
64
- async function migrate(services: {logger: Logger}, db: Sql, migrations: Migration[]) {
65
- await db`
66
- CREATE TABLE IF NOT EXISTS migrations (
67
- id SERIAL PRIMARY KEY,
68
- name TEXT NOT NULL,
69
- ran_at TIMESTAMP NOT NULL DEFAULT NOW()
70
- )
71
- `;
72
-
73
- const ranMigrations = await db`SELECT name FROM migrations`;
74
-
75
- for (const migration of migrations) {
76
- if (ranMigrations.some(({name}) => name === migration.name)) {
77
- continue;
78
- }
79
-
80
- services.logger.log(`Running migration ${migration.name}`);
81
- await migration.up(db);
82
- await db`INSERT INTO migrations (name) VALUES (${migration.name})`;
83
- }
84
- }
@@ -1,3 +0,0 @@
1
- # searchProvider
2
-
3
- provides searching/filtering for entity data, currently integrates with any of the VersionedDocumentStore drivers to provide **in memory** filtering, so it loads all the documents every time. ElasticSearch support will be added at some point. currently it seems like the dynamo scan cost is likely to be less than the Elastic cluster cost for our immediate use cases.
@@ -1,59 +0,0 @@
1
-
2
- export type FieldType = string | string[] | number | boolean;
3
-
4
- /* sorta migrating towards more raw ES stuff in the filters */
5
- export type ESFilter = {
6
- terms: Record<string, FieldType>;
7
- } | {
8
- term: Record<string, FieldType>;
9
- } | {
10
- exists: { field: string };
11
- } | {
12
- nested: { path: string; query: Filter };
13
- } | {
14
- bool: BoolFilter;
15
- };
16
- export type Filter = {
17
- key: string;
18
- value: FieldType;
19
- } | ESFilter;
20
-
21
- export type BoolFilter = {
22
- must?: Filter[];
23
- must_not?: Filter[];
24
- should?: Filter[];
25
- filter?: Filter[];
26
- minimum_should_match?: number;
27
- };
28
-
29
- type Field =
30
- {key: string; type?: 'text'; weight: number}
31
- | {key: string; type: 'keyword'}
32
- | {key: string; type: 'boolean'};
33
-
34
- export interface IndexOptions<T> {
35
- body: T;
36
- id: string;
37
- }
38
-
39
- export type FieldMapping = {
40
- type: 'keyword' | 'text' | 'boolean';
41
- } | {
42
- type: 'date'; format?: string;
43
- } | {
44
- type?: 'nested' | 'object';
45
- properties: Record<string, FieldMapping>;
46
- };
47
-
48
- export type FieldMappings = Record<string, FieldMapping>;
49
-
50
- export interface SearchOptions {
51
- page?: number;
52
- query: string | undefined;
53
- fields: Field[];
54
- filter?: Filter[];
55
- must?: Filter[];
56
- must_not?: Filter[];
57
- should?: Filter[];
58
- sort?: {key: string; order: 'asc' | 'desc'}[];
59
- }