@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
@@ -0,0 +1,71 @@
1
+ import { AccountsGateway, MappedUserInfo } from '../accountsGateway';
2
+ import { AuthProvider } from '../authProvider';
3
+ import { ActivityState } from './attempt-utils';
4
+ import { LrsGateway } from '.';
5
+ export interface Grade {
6
+ activityProgress: 'Initialized' | 'Started' | 'inProgress' | 'Submitted' | 'Completed';
7
+ comment?: string;
8
+ gradingProgress: 'FullyGraded' | 'Pending' | 'PendingManual' | 'Failed' | 'NotReady';
9
+ scoreGiven: number;
10
+ scoreMaximum: number;
11
+ submission?: {
12
+ startedAt?: string;
13
+ submittedAt?: string;
14
+ };
15
+ userId?: string;
16
+ }
17
+ export declare const getRegistrationAttemptInfo: (lrs: LrsGateway, registration: string, options?: {
18
+ activity?: string;
19
+ anyUser?: boolean;
20
+ currentPreference?: "latest" | "oldest";
21
+ ensureSync?: boolean;
22
+ user?: string;
23
+ }) => Promise<{
24
+ [key: string]: ActivityState;
25
+ }>;
26
+ export declare const getScoreGrade: (score: {
27
+ scaled?: number;
28
+ raw?: number;
29
+ min?: number;
30
+ max?: number;
31
+ }, options: {
32
+ maxScore?: number;
33
+ startedAt?: string;
34
+ submittedAt?: string;
35
+ userId?: string;
36
+ }) => Grade;
37
+ export type Progress = {
38
+ scaled: number;
39
+ max?: number;
40
+ raw?: number;
41
+ };
42
+ export type GradeAndProgress = {
43
+ grade: Grade;
44
+ progress: Progress;
45
+ name?: string;
46
+ };
47
+ export type UserActivityInfo = MappedUserInfo<ActivityState>;
48
+ export declare const getCompletedUserInfosGradeAndProgress: (infos: UserActivityInfo[], scoreMaximum?: number, gradePreference?: "current" | "best") => GradeAndProgress[];
49
+ export declare const getCurrentGrade: (services: {
50
+ lrs: LrsGateway;
51
+ ltiAuthProvider: AuthProvider;
52
+ }, registration: string, options?: {
53
+ currentPreference?: "latest" | "oldest";
54
+ incompleteAttemptCallback?: (info: ActivityState) => Promise<GradeAndProgress>;
55
+ name?: string;
56
+ scoreMaximum?: number;
57
+ userId?: string;
58
+ gradePreference?: "current" | "best";
59
+ }) => Promise<GradeAndProgress | null>;
60
+ export declare const getAssignmentGrades: (services: {
61
+ accountsGateway: AccountsGateway;
62
+ lrs: LrsGateway;
63
+ }, assignmentIRI: string, registration: string, options?: {
64
+ anyUser?: boolean;
65
+ currentPreference?: "latest" | "oldest";
66
+ incompleteAttemptsCallback?: (mappedInfo: UserActivityInfo[]) => Promise<GradeAndProgress[]>;
67
+ platformId?: string;
68
+ scoreMaximum?: number;
69
+ user?: string;
70
+ gradePreference?: "current" | "best";
71
+ }) => Promise<GradeAndProgress[]>;
@@ -0,0 +1,134 @@
1
+ import partition from 'lodash/fp/partition';
2
+ import { roundToPrecision } from '../..';
3
+ import { resolveAttemptInfo } from './attempt-utils';
4
+ export const getRegistrationAttemptInfo = async (lrs, registration, options) => {
5
+ const { currentPreference, ...xapiOptions } = options !== null && options !== void 0 ? options : {};
6
+ const allStatements = await lrs.getAllXapiStatements({ ...xapiOptions, registration });
7
+ // Partition statements for each user
8
+ const statementsPerUser = {};
9
+ allStatements.forEach((statement) => {
10
+ var _a;
11
+ // If we ever support accounts from different statement.actor.account.homePage, this method may need changes
12
+ // (unless we can guarantee the statement.actor.account.name are unique)
13
+ statementsPerUser[_a = statement.actor.account.name] || (statementsPerUser[_a] = []);
14
+ statementsPerUser[statement.actor.account.name].push(statement);
15
+ });
16
+ const result = {};
17
+ for (const [userUuid, userStatements] of Object.entries(statementsPerUser)) {
18
+ result[userUuid] = resolveAttemptInfo(userStatements, { currentPreference });
19
+ }
20
+ return result;
21
+ };
22
+ // generates a payload that can be sent to the LMS, documentation here:
23
+ // lti: http://www.imsglobal.org/spec/lti-ags/v2p0#score-publish-service
24
+ // ltijs: https://cvmcosta.me/ltijs/#/grading
25
+ // Note: "min" is currently completely ignored
26
+ export const getScoreGrade = (score, options) => {
27
+ const { raw, scaled, max } = score;
28
+ const { maxScore, startedAt, submittedAt, userId } = options;
29
+ const scoreMaximum = maxScore !== null && maxScore !== void 0 ? maxScore : 100;
30
+ const scoreGiven = raw && max
31
+ ? scoreMaximum / max * raw
32
+ : scaled
33
+ ? scaled * scoreMaximum
34
+ : 0;
35
+ const submission = {};
36
+ if (startedAt) {
37
+ submission.startedAt = startedAt;
38
+ }
39
+ if (submittedAt) {
40
+ submission.submittedAt = submittedAt;
41
+ }
42
+ return {
43
+ userId,
44
+ activityProgress: submittedAt ? 'Completed' : 'Started',
45
+ // canvas assumes that anything that isn't 'FullyGraded' requires manual grading and displays a "needs grading" icon.
46
+ // if you warp your mind you can consider the portion of the assignment which is completed to be fully graded.
47
+ gradingProgress: 'FullyGraded',
48
+ scoreMaximum,
49
+ scoreGiven: roundToPrecision(scoreGiven, -2),
50
+ submission,
51
+ };
52
+ };
53
+ // These methods assign 0's to incomplete activities
54
+ const pickAttemptAndCompleted = (state, gradePreference) => {
55
+ if (gradePreference === 'best' && state.bestCompletedAttempt) {
56
+ return {
57
+ attempt: state.bestCompletedAttempt,
58
+ completed: state.bestCompletedAttemptCompleted,
59
+ };
60
+ }
61
+ // return current attempt if gradePreference is current
62
+ return {
63
+ attempt: state.currentAttempt,
64
+ completed: state.currentAttemptCompleted,
65
+ };
66
+ };
67
+ const getCompletedActivityStateGradeAndProgress = ({ name, scoreMaximum, state, userId, gradePreference = 'current' }) => {
68
+ var _a;
69
+ const { attempt, completed } = pickAttemptAndCompleted(state, gradePreference);
70
+ return {
71
+ grade: getScoreGrade(((_a = completed === null || completed === void 0 ? void 0 : completed.result) === null || _a === void 0 ? void 0 : _a.score) || {}, {
72
+ maxScore: scoreMaximum,
73
+ startedAt: attempt === null || attempt === void 0 ? void 0 : attempt.timestamp,
74
+ submittedAt: completed === null || completed === void 0 ? void 0 : completed.timestamp,
75
+ userId,
76
+ }),
77
+ progress: {
78
+ scaled: completed ? 1 : 0,
79
+ },
80
+ name,
81
+ };
82
+ };
83
+ export const getCompletedUserInfosGradeAndProgress = (infos, scoreMaximum, gradePreference) => infos.map(({ data, fullName, platformUserId }) => getCompletedActivityStateGradeAndProgress({
84
+ name: fullName,
85
+ scoreMaximum,
86
+ userId: platformUserId,
87
+ state: data,
88
+ gradePreference,
89
+ }));
90
+ export const getCurrentGrade = async (services, registration, options) => {
91
+ var _a;
92
+ const user = await services.ltiAuthProvider.getUser();
93
+ if (!user) {
94
+ return null;
95
+ }
96
+ const userId = (_a = options === null || options === void 0 ? void 0 : options.userId) !== null && _a !== void 0 ? _a : user.uuid;
97
+ const { currentPreference, incompleteAttemptCallback, name, scoreMaximum, gradePreference, } = options !== null && options !== void 0 ? options : {};
98
+ const infoPerUser = await getRegistrationAttemptInfo(services.lrs, registration, { currentPreference });
99
+ const userInfo = infoPerUser[user.uuid];
100
+ if (!userInfo) {
101
+ return getCompletedActivityStateGradeAndProgress({
102
+ name,
103
+ scoreMaximum,
104
+ state: resolveAttemptInfo([]),
105
+ userId,
106
+ gradePreference,
107
+ });
108
+ }
109
+ if (userInfo.currentAttemptCompleted || !incompleteAttemptCallback) {
110
+ return getCompletedActivityStateGradeAndProgress({
111
+ name,
112
+ scoreMaximum,
113
+ state: userInfo,
114
+ userId,
115
+ gradePreference,
116
+ });
117
+ }
118
+ return incompleteAttemptCallback(userInfo);
119
+ };
120
+ export const getAssignmentGrades = async (services, assignmentIRI, registration, options) => {
121
+ const { anyUser, currentPreference, incompleteAttemptsCallback, platformId, scoreMaximum, user, gradePreference = 'current', } = options !== null && options !== void 0 ? options : {};
122
+ const infoPerUserUuid = await getRegistrationAttemptInfo(services.lrs, registration, { activity: assignmentIRI, anyUser, currentPreference, user });
123
+ const mappedInfo = await services.accountsGateway.mapUserUuids(infoPerUserUuid, platformId);
124
+ // If no custom callback, just return graded results based on preference
125
+ if (!incompleteAttemptsCallback) {
126
+ return getCompletedUserInfosGradeAndProgress(mappedInfo, scoreMaximum, gradePreference);
127
+ }
128
+ // Partition based on whether the chosen preference has a completed attempt
129
+ const [incompleteInfo, completedInfo] = partition((info) => {
130
+ const { completed } = pickAttemptAndCompleted(info.data, gradePreference);
131
+ return completed === undefined;
132
+ })(mappedInfo);
133
+ return getCompletedUserInfosGradeAndProgress(completedInfo, scoreMaximum, gradePreference).concat(await incompleteAttemptsCallback(incompleteInfo));
134
+ };
@@ -0,0 +1,28 @@
1
+ import postgres, { Sql } from 'postgres';
2
+ import { ConfigProviderForConfig } from '../../config';
3
+ import type { Logger } from '../logger';
4
+ type Config = {
5
+ host: string;
6
+ readHost: string;
7
+ port: string;
8
+ database: string;
9
+ username: string;
10
+ password: string;
11
+ };
12
+ interface Initializer<C> {
13
+ configSpace?: C;
14
+ }
15
+ export declare const postgresConnection: <C extends string = "local">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => (services: {
16
+ logger: Logger;
17
+ }) => {
18
+ db: () => Promise<postgres.Sql<{}>>;
19
+ dbRead: () => Promise<postgres.Sql<{}>>;
20
+ migrate: (migrations: Migration[]) => Promise<void>;
21
+ down: () => Promise<void[]>;
22
+ };
23
+ export type PostgresConnection = ReturnType<ReturnType<ReturnType<typeof postgresConnection>>>;
24
+ export interface Migration {
25
+ name: string;
26
+ up: (db: Sql) => Promise<void>;
27
+ }
28
+ export {};
@@ -0,0 +1,58 @@
1
+ import postgres from 'postgres';
2
+ import { assertNotNaN } from '../../assertions';
3
+ import { resolveConfigValue } from '../../config';
4
+ import { ifDefined } from '../../guards';
5
+ import { once } from '../../misc/helpers';
6
+ export const postgresConnection = (initializer) => (configProvider) => {
7
+ const config = configProvider[ifDefined(initializer.configSpace, 'local')];
8
+ const host = once(() => resolveConfigValue(config.host));
9
+ const readHost = once(() => resolveConfigValue(config.readHost));
10
+ const connectionOptions = once(async () => ({
11
+ port: assertNotNaN(parseInt(await resolveConfigValue(config.port), 10), new Error('port must be a number')),
12
+ database: await resolveConfigValue(config.database),
13
+ username: await resolveConfigValue(config.username),
14
+ password: await resolveConfigValue(config.password),
15
+ transform: {
16
+ column: { to: postgres.fromCamel, from: postgres.toCamel },
17
+ },
18
+ }));
19
+ const connections = [];
20
+ const sql = once(async () => {
21
+ const options = await connectionOptions();
22
+ const connection = postgres({ ...options, host: await host() });
23
+ connections.push(connection);
24
+ return connection;
25
+ });
26
+ const sqlRead = once(async () => {
27
+ const options = await connectionOptions();
28
+ const connection = postgres({ ...options, host: await readHost() });
29
+ connections.push(connection);
30
+ return connection;
31
+ });
32
+ return (services) => ({
33
+ db: sql,
34
+ dbRead: sqlRead,
35
+ migrate: async (migrations) => {
36
+ await migrate(services, await sql(), migrations);
37
+ },
38
+ down: () => Promise.all(connections.map(c => c.end()))
39
+ });
40
+ };
41
+ async function migrate(services, db, migrations) {
42
+ await db `
43
+ CREATE TABLE IF NOT EXISTS migrations (
44
+ id SERIAL PRIMARY KEY,
45
+ name TEXT NOT NULL,
46
+ ran_at TIMESTAMP NOT NULL DEFAULT NOW()
47
+ )
48
+ `;
49
+ const ranMigrations = await db `SELECT name FROM migrations`;
50
+ for (const migration of migrations) {
51
+ if (ranMigrations.some(({ name }) => name === migration.name)) {
52
+ continue;
53
+ }
54
+ services.logger.log(`Running migration ${migration.name}`);
55
+ await migration.up(db);
56
+ await db `INSERT INTO migrations (name) VALUES (${migration.name})`;
57
+ }
58
+ }
@@ -0,0 +1,69 @@
1
+ export type FieldType = string | string[] | number | boolean;
2
+ export type ESFilter = {
3
+ terms: Record<string, FieldType>;
4
+ } | {
5
+ term: Record<string, FieldType>;
6
+ } | {
7
+ exists: {
8
+ field: string;
9
+ };
10
+ } | {
11
+ nested: {
12
+ path: string;
13
+ query: Filter;
14
+ };
15
+ } | {
16
+ bool: BoolFilter;
17
+ };
18
+ export type Filter = {
19
+ key: string;
20
+ value: FieldType;
21
+ } | ESFilter;
22
+ export type BoolFilter = {
23
+ must?: Filter[];
24
+ must_not?: Filter[];
25
+ should?: Filter[];
26
+ filter?: Filter[];
27
+ minimum_should_match?: number;
28
+ };
29
+ type Field = {
30
+ key: string;
31
+ type?: 'text';
32
+ weight: number;
33
+ } | {
34
+ key: string;
35
+ type: 'keyword';
36
+ } | {
37
+ key: string;
38
+ type: 'boolean';
39
+ };
40
+ export interface IndexOptions<T> {
41
+ body: T;
42
+ id: string;
43
+ version?: number;
44
+ version_type?: 'external' | 'external_gte';
45
+ }
46
+ export type FieldMapping = {
47
+ type: 'keyword' | 'text' | 'boolean';
48
+ } | {
49
+ type: 'date';
50
+ format?: string;
51
+ } | {
52
+ type?: 'nested' | 'object';
53
+ properties: Record<string, FieldMapping>;
54
+ };
55
+ export type FieldMappings = Record<string, FieldMapping>;
56
+ export interface SearchOptions {
57
+ page?: number;
58
+ query: string | undefined;
59
+ fields: Field[];
60
+ filter?: Filter[];
61
+ must?: Filter[];
62
+ must_not?: Filter[];
63
+ should?: Filter[];
64
+ sort?: {
65
+ key: string;
66
+ order: 'asc' | 'desc';
67
+ }[];
68
+ }
69
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { FieldMappings, IndexOptions, SearchOptions } from '.';
2
+ export type Config<T> = {
3
+ mappings: FieldMappings;
4
+ store: {
5
+ loadAllDocumentsTheBadWay: () => Promise<T[]>;
6
+ };
7
+ };
8
+ export declare const memorySearchTheBadWay: () => <T>({ store, mappings }: Config<T>) => {
9
+ deleteIndexIfExists: () => Promise<undefined>;
10
+ ensureIndexCreated: () => Promise<undefined>;
11
+ index: (_options: IndexOptions<T>) => Promise<undefined>;
12
+ bulkIndex: (_items: IndexOptions<T>[]) => Promise<undefined>;
13
+ search: (options: SearchOptions) => Promise<{
14
+ items: T[];
15
+ pageSize: number;
16
+ currentPage: number;
17
+ totalItems: number;
18
+ totalPages: number;
19
+ }>;
20
+ };
@@ -0,0 +1,187 @@
1
+ import { coerceArray } from '../..';
2
+ import { InvalidRequestError } from '../../errors';
3
+ import { isDefined } from '../../guards';
4
+ const MIN_MATCH = 0.5;
5
+ const MAX_RESULTS = 10;
6
+ var MatchType;
7
+ (function (MatchType) {
8
+ MatchType[MatchType["Must"] = 0] = "Must";
9
+ MatchType[MatchType["MustNot"] = 1] = "MustNot";
10
+ MatchType[MatchType["Should"] = 2] = "Should";
11
+ })(MatchType || (MatchType = {}));
12
+ const resolveField = (context, field) => {
13
+ const path = field.startsWith(context.scope + '.')
14
+ ? field.slice(context.scope.length + 1)
15
+ : field;
16
+ return path.split('.').reduce((result, key) => {
17
+ if (result === undefined) {
18
+ throw new Error(`Key "${key}" not found in document resolving ${field}`);
19
+ }
20
+ return result[key];
21
+ }, context.document);
22
+ };
23
+ const getFieldDefinition = (context, field) => {
24
+ let current = context.fields;
25
+ const parts = field.split('.');
26
+ const head = parts.slice(0, -1);
27
+ const tail = parts[parts.length - 1];
28
+ for (const part of head) {
29
+ const currentDefinition = current[part];
30
+ if (!currentDefinition || !('properties' in currentDefinition)) {
31
+ throw new Error(`Field "${field}" not found in mappings`);
32
+ }
33
+ current = currentDefinition.properties;
34
+ }
35
+ if (!current[tail]) {
36
+ throw new Error(`Field "${field}" not found in mappings`);
37
+ }
38
+ return current[tail];
39
+ };
40
+ const getFieldType = (context, field) => {
41
+ const definition = getFieldDefinition(context, field);
42
+ return definition.type;
43
+ };
44
+ const matchNested = (context, nested) => {
45
+ const nestedPath = nested.path;
46
+ const nestedDocuments = resolveField(context, nestedPath);
47
+ if (!Array.isArray(nestedDocuments)) {
48
+ throw new InvalidRequestError(`Nested path "${nestedPath}" is not an array`);
49
+ }
50
+ return nestedDocuments.some(nestedDocument => matchClause({
51
+ ...context,
52
+ scope: nestedPath,
53
+ document: nestedDocument
54
+ }, nested.query));
55
+ };
56
+ const matchExists = (context, exists) => {
57
+ const value = resolveField(context, exists.field);
58
+ return value !== undefined && value !== null;
59
+ };
60
+ const matchTerms = (context, terms) => {
61
+ for (const key in terms) {
62
+ const docValues = coerceArray(resolveField(context, key));
63
+ const coerceValue = getFieldType(context, key) === 'boolean'
64
+ ? (input) => {
65
+ if ([true, 'true', '1', 1].includes(input)) {
66
+ return true;
67
+ }
68
+ if ([false, 'false', '0', 0, ''].includes(input)) {
69
+ return false;
70
+ }
71
+ throw new InvalidRequestError('input is not a valid boolean filter');
72
+ }
73
+ : (x) => x;
74
+ const hasMatch = coerceArray(terms[key]).map(coerceValue).some(v => docValues.includes(v));
75
+ if (!hasMatch) {
76
+ return false;
77
+ }
78
+ }
79
+ return true;
80
+ };
81
+ const matchClause = (context, clause) => {
82
+ const filter = ('key' in clause && 'value' in clause)
83
+ ? { terms: { [clause.key]: clause.value } }
84
+ : clause;
85
+ if ('terms' in filter)
86
+ return matchTerms(context, filter.terms);
87
+ else if ('term' in filter)
88
+ return matchTerms(context, filter.term);
89
+ else if ('exists' in filter)
90
+ return matchExists(context, filter.exists);
91
+ else if ('bool' in filter)
92
+ return matchBool(context, filter.bool);
93
+ else if ('nested' in filter)
94
+ return matchNested(context, filter.nested);
95
+ else
96
+ throw new InvalidRequestError('invalid filter type');
97
+ };
98
+ const matchFilters = (context, filters, matchType) => {
99
+ for (const field of filters) {
100
+ const hasMatch = matchClause(context, field);
101
+ if ((matchType === MatchType.Must && !hasMatch) || (matchType === MatchType.MustNot && hasMatch)) {
102
+ return false;
103
+ }
104
+ else if (matchType === MatchType.Should && hasMatch) {
105
+ return true;
106
+ }
107
+ }
108
+ return matchType !== MatchType.Should;
109
+ };
110
+ const matchBool = (context, filters) => {
111
+ const { must_not, should, must, filter } = filters;
112
+ if ((must === null || must === void 0 ? void 0 : must.length) && !matchFilters(context, must, MatchType.Must)) {
113
+ return false;
114
+ }
115
+ if ((filter === null || filter === void 0 ? void 0 : filter.length) && !matchFilters(context, filter, MatchType.Must)) {
116
+ return false;
117
+ }
118
+ if ((must_not === null || must_not === void 0 ? void 0 : must_not.length) && !matchFilters(context, must_not, MatchType.MustNot)) {
119
+ return false;
120
+ }
121
+ if ((should === null || should === void 0 ? void 0 : should.length) && !matchFilters(context, should, MatchType.Should)) {
122
+ return false;
123
+ }
124
+ return true;
125
+ };
126
+ export const memorySearchTheBadWay = () => ({ store, mappings }) => {
127
+ return {
128
+ // This method is intentionally stubbed because index deletion is not applicable for in-memory storage.
129
+ deleteIndexIfExists: async () => undefined,
130
+ ensureIndexCreated: async () => undefined,
131
+ index: async (_options) => undefined,
132
+ bulkIndex: async (_items) => undefined,
133
+ search: async (options) => {
134
+ const results = (await store.loadAllDocumentsTheBadWay())
135
+ .map(document => {
136
+ let weight = 0;
137
+ if (options.query !== undefined) {
138
+ for (const field of options.fields) {
139
+ if (field.type !== undefined && field.type !== 'text') {
140
+ continue;
141
+ }
142
+ const value = resolveField({ document, fields: mappings, scope: '' }, field.key);
143
+ if (value === undefined || value === null) {
144
+ continue;
145
+ }
146
+ if (typeof value === 'string') {
147
+ if (value.toUpperCase().indexOf(options.query.toUpperCase()) !== -1) {
148
+ weight += (1 * field.weight);
149
+ }
150
+ }
151
+ else {
152
+ throw new Error(`invalid value type when searching in field ${field.key.toString()}`);
153
+ }
154
+ }
155
+ }
156
+ if (!matchBool({ document, fields: mappings, scope: '' }, options)) {
157
+ return undefined;
158
+ }
159
+ return { document, weight };
160
+ })
161
+ .filter(isDefined)
162
+ .filter(r => !options.query || r.weight >= MIN_MATCH);
163
+ results.sort((a, b) => {
164
+ for (const sort of (options.sort || [])) {
165
+ const aValue = resolveField({ document: a.document, fields: mappings, scope: '' }, sort.key);
166
+ const bValue = resolveField({ document: b.document, fields: mappings, scope: '' }, sort.key);
167
+ if (aValue < bValue) {
168
+ return sort.order === 'asc' ? -1 : 1;
169
+ }
170
+ if (aValue > bValue) {
171
+ return sort.order === 'asc' ? 1 : -1;
172
+ }
173
+ }
174
+ return b.weight - a.weight;
175
+ });
176
+ const page = options.page || 1;
177
+ const offset = (page - 1) * MAX_RESULTS;
178
+ return {
179
+ items: results.slice(offset, offset + MAX_RESULTS).map(r => r.document),
180
+ pageSize: MAX_RESULTS,
181
+ currentPage: page,
182
+ totalItems: results.length,
183
+ totalPages: Math.ceil(results.length / MAX_RESULTS)
184
+ };
185
+ },
186
+ };
187
+ };
@@ -0,0 +1,28 @@
1
+ import { ConfigProviderForConfig } from '../../config';
2
+ import { FieldMappings, IndexOptions, SearchOptions } from '.';
3
+ export type Config = {
4
+ node: string;
5
+ region: string;
6
+ };
7
+ export interface Initializer<C> {
8
+ configSpace?: C;
9
+ }
10
+ export type IndexConfig = {
11
+ name: string;
12
+ mappings: FieldMappings;
13
+ pageSize?: number;
14
+ };
15
+ export declare const openSearchService: <C extends string = "deployed">(initializer?: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => <T>(indexConfig: IndexConfig) => {
16
+ ensureIndexCreated: () => Promise<void>;
17
+ deleteIndexIfExists: () => Promise<void>;
18
+ index: (params: IndexOptions<T>) => Promise<void>;
19
+ bulkIndex: (items: IndexOptions<T>[]) => Promise<void>;
20
+ search: (options: SearchOptions) => Promise<{
21
+ items: Exclude<T, undefined>[];
22
+ pageSize: number;
23
+ currentPage: number;
24
+ totalItems: number;
25
+ totalPages: number;
26
+ }>;
27
+ updateMappings: () => Promise<void>;
28
+ };