@openstax/ts-utils 1.34.0 → 1.34.1

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