@openstax/ts-utils 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +90 -62
  2. package/dist/cjs/assertions/index.d.ts +89 -0
  3. package/dist/cjs/assertions/index.js +157 -0
  4. package/dist/cjs/aws/ssmService.d.ts +5 -0
  5. package/dist/cjs/aws/ssmService.js +9 -0
  6. package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
  7. package/dist/cjs/config/awsParameterConfig.js +26 -0
  8. package/dist/cjs/config/envConfig.d.ts +24 -0
  9. package/dist/cjs/config/envConfig.js +57 -0
  10. package/{packages/utils/src/config/index.ts → dist/cjs/config/index.d.ts} +13 -29
  11. package/dist/cjs/config/index.js +35 -0
  12. package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
  13. package/dist/cjs/config/lambdaParameterConfig.js +45 -0
  14. package/dist/cjs/config/replaceConfig.d.ts +14 -0
  15. package/dist/cjs/config/replaceConfig.js +22 -0
  16. package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
  17. package/dist/cjs/config/resolveConfigValue.js +12 -0
  18. package/dist/cjs/errors/index.d.ts +88 -0
  19. package/dist/cjs/errors/index.js +123 -0
  20. package/dist/cjs/fetch/fetchStatusRetry.d.ts +8 -0
  21. package/dist/cjs/fetch/fetchStatusRetry.js +27 -0
  22. package/dist/cjs/fetch/index.d.ts +64 -0
  23. package/dist/cjs/fetch/index.js +55 -0
  24. package/{packages/utils/src/guards/index.ts → dist/cjs/guards/index.d.ts} +7 -10
  25. package/dist/cjs/guards/index.js +44 -0
  26. package/dist/cjs/index.js +20 -0
  27. package/dist/cjs/middleware/apiErrorHandler.d.ts +24 -0
  28. package/dist/cjs/middleware/apiErrorHandler.js +42 -0
  29. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  30. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
  31. package/{packages/utils/src/middleware/index.ts → dist/cjs/middleware/index.d.ts} +5 -53
  32. package/dist/cjs/middleware/index.js +48 -0
  33. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  34. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +44 -0
  35. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +4 -0
  36. package/dist/cjs/middleware/throwNotFoundMiddleware.js +14 -0
  37. package/dist/cjs/misc/hashValue.d.ts +10 -0
  38. package/dist/cjs/misc/hashValue.js +17 -0
  39. package/dist/cjs/misc/helpers.d.ts +124 -0
  40. package/dist/cjs/misc/helpers.js +214 -0
  41. package/dist/cjs/misc/merge.d.ts +21 -0
  42. package/dist/cjs/misc/merge.js +45 -0
  43. package/dist/cjs/misc/partitionSequence.d.ts +35 -0
  44. package/dist/cjs/misc/partitionSequence.js +55 -0
  45. package/dist/cjs/pagination/index.d.ts +91 -0
  46. package/dist/cjs/pagination/index.js +83 -0
  47. package/dist/cjs/routing/helpers.d.ts +57 -0
  48. package/dist/cjs/routing/helpers.js +90 -0
  49. package/dist/cjs/routing/index.d.ts +290 -0
  50. package/dist/cjs/routing/index.js +295 -0
  51. package/dist/cjs/routing/validators/zod.d.ts +4 -0
  52. package/dist/cjs/routing/validators/zod.js +14 -0
  53. package/dist/cjs/services/accountsGateway/index.d.ts +92 -0
  54. package/dist/cjs/services/accountsGateway/index.js +138 -0
  55. package/dist/cjs/services/apiGateway/index.d.ts +68 -0
  56. package/dist/cjs/services/apiGateway/index.js +118 -0
  57. package/dist/cjs/services/authProvider/browser.d.ts +40 -0
  58. package/dist/cjs/services/authProvider/browser.js +155 -0
  59. package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
  60. package/dist/cjs/services/authProvider/decryption.js +73 -0
  61. package/dist/cjs/services/authProvider/index.d.ts +63 -0
  62. package/dist/cjs/services/authProvider/index.js +34 -0
  63. package/dist/cjs/services/authProvider/subrequest.d.ts +13 -0
  64. package/dist/cjs/services/authProvider/subrequest.js +49 -0
  65. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  66. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +91 -0
  67. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  68. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +47 -0
  69. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  70. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +37 -0
  71. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +3 -0
  72. package/dist/cjs/services/authProvider/utils/userSubrequest.js +13 -0
  73. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
  74. package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
  75. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +1 -0
  76. package/dist/cjs/services/documentStore/fileSystemAssert.js +14 -0
  77. package/{packages/utils/src/services/documentStore/index.ts → dist/cjs/services/documentStore/index.d.ts} +8 -8
  78. package/dist/cjs/services/documentStore/index.js +2 -0
  79. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  80. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +233 -0
  81. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +32 -0
  82. package/dist/cjs/services/documentStore/unversioned/file-system.js +214 -0
  83. package/{packages/utils/src/services/documentStore/unversioned/index.ts → dist/cjs/services/documentStore/unversioned/index.d.ts} +0 -2
  84. package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
  85. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +25 -0
  86. package/dist/cjs/services/documentStore/versioned/dynamodb.js +143 -0
  87. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +25 -0
  88. package/dist/cjs/services/documentStore/versioned/file-system.js +73 -0
  89. package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
  90. package/dist/cjs/services/documentStore/versioned/index.js +2 -0
  91. package/dist/cjs/services/exercisesGateway/index.d.ts +67 -0
  92. package/dist/cjs/services/exercisesGateway/index.js +107 -0
  93. package/dist/cjs/services/fileServer/index.d.ts +30 -0
  94. package/dist/cjs/services/fileServer/index.js +19 -0
  95. package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
  96. package/dist/cjs/services/fileServer/localFileServer.js +132 -0
  97. package/dist/cjs/services/fileServer/s3FileServer.d.ts +14 -0
  98. package/dist/cjs/services/fileServer/s3FileServer.js +131 -0
  99. package/dist/cjs/services/launchParams/index.js +7 -0
  100. package/dist/cjs/services/launchParams/signer.d.ts +23 -0
  101. package/dist/cjs/services/launchParams/signer.js +58 -0
  102. package/dist/cjs/services/launchParams/verifier.d.ts +21 -0
  103. package/dist/cjs/services/launchParams/verifier.js +129 -0
  104. package/dist/cjs/services/logger/console.d.ts +4 -0
  105. package/dist/cjs/services/logger/console.js +12 -0
  106. package/{packages/utils/src/services/logger/index.ts → dist/cjs/services/logger/index.d.ts} +9 -23
  107. package/dist/cjs/services/logger/index.js +31 -0
  108. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  109. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
  110. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +72 -0
  111. package/dist/cjs/services/lrsGateway/attempt-utils.js +283 -0
  112. package/dist/cjs/services/lrsGateway/file-system.d.ts +15 -0
  113. package/dist/cjs/services/lrsGateway/file-system.js +150 -0
  114. package/dist/cjs/services/lrsGateway/index.d.ts +122 -0
  115. package/dist/cjs/services/lrsGateway/index.js +148 -0
  116. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +71 -0
  117. package/dist/cjs/services/lrsGateway/xapiUtils.js +145 -0
  118. package/dist/cjs/services/postgresConnection/index.d.ts +28 -0
  119. package/dist/cjs/services/postgresConnection/index.js +65 -0
  120. package/dist/cjs/services/searchProvider/index.d.ts +69 -0
  121. package/dist/cjs/services/searchProvider/index.js +2 -0
  122. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  123. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +191 -0
  124. package/dist/cjs/services/searchProvider/openSearch.d.ts +28 -0
  125. package/dist/cjs/services/searchProvider/openSearch.js +162 -0
  126. package/dist/cjs/services/searchProvider/streamIndexer.d.ts +17 -0
  127. package/dist/cjs/services/searchProvider/streamIndexer.js +41 -0
  128. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  129. package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
  130. package/dist/cjs/types.js +2 -0
  131. package/dist/esm/assertions/index.d.ts +89 -0
  132. package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
  133. package/dist/esm/aws/ssmService.d.ts +5 -0
  134. package/dist/esm/aws/ssmService.js +6 -0
  135. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  136. package/dist/esm/config/awsParameterConfig.js +22 -0
  137. package/dist/esm/config/envConfig.d.ts +24 -0
  138. package/dist/esm/config/envConfig.js +53 -0
  139. package/dist/esm/config/index.d.ts +48 -0
  140. package/dist/esm/config/index.js +17 -0
  141. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  142. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  143. package/dist/esm/config/replaceConfig.d.ts +14 -0
  144. package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
  145. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  146. package/dist/esm/config/resolveConfigValue.js +8 -0
  147. package/dist/esm/errors/index.d.ts +88 -0
  148. package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
  149. package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
  150. package/dist/esm/fetch/fetchStatusRetry.js +23 -0
  151. package/dist/esm/fetch/index.d.ts +64 -0
  152. package/dist/esm/fetch/index.js +46 -0
  153. package/dist/esm/guards/index.d.ts +38 -0
  154. package/dist/esm/guards/index.js +36 -0
  155. package/dist/esm/index.d.ts +4 -0
  156. package/dist/esm/index.js +4 -0
  157. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  158. package/dist/esm/middleware/apiErrorHandler.js +38 -0
  159. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  160. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  161. package/dist/esm/middleware/index.d.ts +47 -0
  162. package/dist/esm/middleware/index.js +44 -0
  163. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  164. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
  165. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  166. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  167. package/dist/esm/misc/hashValue.d.ts +10 -0
  168. package/dist/esm/misc/hashValue.js +13 -0
  169. package/dist/esm/misc/helpers.d.ts +124 -0
  170. package/dist/esm/misc/helpers.js +199 -0
  171. package/dist/esm/misc/merge.d.ts +21 -0
  172. package/dist/esm/misc/merge.js +40 -0
  173. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  174. package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
  175. package/dist/esm/pagination/index.d.ts +91 -0
  176. package/dist/esm/pagination/index.js +77 -0
  177. package/dist/esm/routing/helpers.d.ts +57 -0
  178. package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
  179. package/dist/esm/routing/index.d.ts +290 -0
  180. package/dist/esm/routing/index.js +246 -0
  181. package/dist/esm/routing/validators/zod.d.ts +4 -0
  182. package/dist/esm/routing/validators/zod.js +10 -0
  183. package/dist/esm/services/accountsGateway/index.d.ts +92 -0
  184. package/dist/esm/services/accountsGateway/index.js +131 -0
  185. package/dist/esm/services/apiGateway/index.d.ts +68 -0
  186. package/dist/esm/services/apiGateway/index.js +77 -0
  187. package/dist/esm/services/authProvider/browser.d.ts +40 -0
  188. package/dist/esm/services/authProvider/browser.js +151 -0
  189. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  190. package/dist/esm/services/authProvider/decryption.js +69 -0
  191. package/dist/esm/services/authProvider/index.d.ts +63 -0
  192. package/dist/esm/services/authProvider/index.js +26 -0
  193. package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
  194. package/dist/esm/services/authProvider/subrequest.js +45 -0
  195. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  196. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  197. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  198. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  199. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  200. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  201. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
  202. package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
  203. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  204. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  205. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
  206. package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
  207. package/dist/esm/services/documentStore/index.d.ts +14 -0
  208. package/dist/esm/services/documentStore/index.js +1 -0
  209. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  210. package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
  211. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
  212. package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
  213. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  214. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  215. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
  216. package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
  217. package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
  218. package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
  219. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  220. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  221. package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
  222. package/dist/esm/services/exercisesGateway/index.js +70 -0
  223. package/dist/esm/services/fileServer/index.d.ts +30 -0
  224. package/dist/esm/services/fileServer/index.js +13 -0
  225. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  226. package/dist/esm/services/fileServer/localFileServer.js +125 -0
  227. package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
  228. package/dist/esm/services/fileServer/s3FileServer.js +124 -0
  229. package/dist/esm/services/launchParams/index.d.ts +2 -0
  230. package/dist/esm/services/launchParams/index.js +2 -0
  231. package/dist/esm/services/launchParams/signer.d.ts +23 -0
  232. package/dist/esm/services/launchParams/signer.js +51 -0
  233. package/dist/esm/services/launchParams/verifier.d.ts +21 -0
  234. package/dist/esm/services/launchParams/verifier.js +92 -0
  235. package/dist/esm/services/logger/console.d.ts +4 -0
  236. package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
  237. package/dist/esm/services/logger/index.d.ts +39 -0
  238. package/dist/esm/services/logger/index.js +27 -0
  239. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  240. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  241. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
  242. package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
  243. package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
  244. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  245. package/dist/esm/services/lrsGateway/index.d.ts +122 -0
  246. package/dist/esm/services/lrsGateway/index.js +111 -0
  247. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
  248. package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
  249. package/dist/esm/services/postgresConnection/index.d.ts +28 -0
  250. package/dist/esm/services/postgresConnection/index.js +58 -0
  251. package/dist/esm/services/searchProvider/index.d.ts +69 -0
  252. package/dist/esm/services/searchProvider/index.js +1 -0
  253. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  254. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
  255. package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
  256. package/dist/esm/services/searchProvider/openSearch.js +158 -0
  257. package/dist/esm/services/searchProvider/streamIndexer.d.ts +17 -0
  258. package/dist/esm/services/searchProvider/streamIndexer.js +37 -0
  259. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  260. package/dist/esm/types.d.ts +31 -0
  261. package/dist/esm/types.js +1 -0
  262. package/package.json +234 -12
  263. package/.cfnlintrc +0 -2
  264. package/.github/CODEOWNERS +0 -1
  265. package/.github/workflows/ci.yml +0 -36
  266. package/.github/workflows/lint.yml +0 -55
  267. package/.nvmrc +0 -1
  268. package/.syncignore +0 -4
  269. package/.syncpackrc +0 -18
  270. package/CONTRIBUTING.md +0 -96
  271. package/LICENSE +0 -661
  272. package/Procfile +0 -1
  273. package/app.json +0 -23
  274. package/cspell.json +0 -32
  275. package/deploy/constants.env +0 -21
  276. package/deploy/deploy.bash +0 -157
  277. package/deploy/deployment-alt-region.cfn.yml +0 -70
  278. package/deploy/deployment.cfn.yml +0 -650
  279. package/deploy/destroy-deployment.bash +0 -23
  280. package/deploy/shared.cfn.yml +0 -94
  281. package/docs/lambda-build.md +0 -35
  282. package/packages/frontend/README.md +0 -46
  283. package/packages/frontend/package.json +0 -101
  284. package/packages/frontend/public/favicon.ico +0 -0
  285. package/packages/frontend/public/index.html +0 -107
  286. package/packages/frontend/public/maintenance.html +0 -59
  287. package/packages/frontend/public/manifest.json +0 -15
  288. package/packages/frontend/public/robots.txt +0 -3
  289. package/packages/frontend/script/make-certificate.bash +0 -49
  290. package/packages/frontend/script/server/cli.js +0 -11
  291. package/packages/frontend/script/server/index.js +0 -47
  292. package/packages/frontend/script/start.bash +0 -22
  293. package/packages/frontend/script/trust-localhost.bash +0 -7
  294. package/packages/frontend/src/auth/authProvider.ts +0 -10
  295. package/packages/frontend/src/auth/useAuth.ts +0 -33
  296. package/packages/frontend/src/components/Pagination.tsx +0 -26
  297. package/packages/frontend/src/configProvider/index.ts +0 -53
  298. package/packages/frontend/src/configProvider/use.ts +0 -41
  299. package/packages/frontend/src/core/context/services.spec.tsx +0 -39
  300. package/packages/frontend/src/core/context/services.tsx +0 -16
  301. package/packages/frontend/src/core/index.spec.ts +0 -7
  302. package/packages/frontend/src/core/index.ts +0 -20
  303. package/packages/frontend/src/core/services.tsx +0 -14
  304. package/packages/frontend/src/core/types.ts +0 -3
  305. package/packages/frontend/src/example/api.ts +0 -28
  306. package/packages/frontend/src/example/components/Layout.tsx +0 -23
  307. package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
  308. package/packages/frontend/src/example/screens/Home.tsx +0 -78
  309. package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
  310. package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
  311. package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
  312. package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
  313. package/packages/frontend/src/example/screens/index.ts +0 -9
  314. package/packages/frontend/src/index.css +0 -159
  315. package/packages/frontend/src/index.tsx +0 -67
  316. package/packages/frontend/src/react-app-env.d.ts +0 -1
  317. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
  318. package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
  319. package/packages/frontend/src/routing/middleware.ts +0 -6
  320. package/packages/frontend/src/routing/useQuery.ts +0 -14
  321. package/packages/frontend/src/setupProxy.js +0 -19
  322. package/packages/frontend/src/setupTests.ts +0 -9
  323. package/packages/frontend/src/tests/testServices.tsx +0 -23
  324. package/packages/frontend/tsconfig.json +0 -27
  325. package/packages/lambda/.eslintrc.js +0 -64
  326. package/packages/lambda/jest-global-setup.js +0 -3
  327. package/packages/lambda/jest-setup-after-env.js +0 -1
  328. package/packages/lambda/jest.config.js +0 -31
  329. package/packages/lambda/jest.resolver.js +0 -17
  330. package/packages/lambda/package.json +0 -68
  331. package/packages/lambda/script/build.bash +0 -19
  332. package/packages/lambda/script/bundle-functions.bash +0 -10
  333. package/packages/lambda/script/lambdaLocalProxy.js +0 -16
  334. package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
  335. package/packages/lambda/script/utils/getRouteData.ts +0 -7
  336. package/packages/lambda/script/utils/routeDataLoader.js +0 -8
  337. package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
  338. package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
  339. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
  340. package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
  341. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
  342. package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
  343. package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
  344. package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
  345. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
  346. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
  347. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
  348. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
  349. package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
  350. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
  351. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
  352. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
  353. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
  354. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
  355. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
  356. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
  357. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
  358. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
  359. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
  360. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
  361. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
  362. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
  363. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
  364. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
  365. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
  366. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
  367. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
  368. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
  369. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
  370. package/packages/lambda/tsconfig.json +0 -30
  371. package/packages/lambda/webpack.config.js +0 -97
  372. package/packages/utils/.eslintrc.js +0 -64
  373. package/packages/utils/README.md +0 -118
  374. package/packages/utils/jest-global-setup.js +0 -3
  375. package/packages/utils/jest.config.js +0 -25
  376. package/packages/utils/jest.resolver.js +0 -17
  377. package/packages/utils/package.json +0 -238
  378. package/packages/utils/src/assertions/index.spec.ts +0 -126
  379. package/packages/utils/src/aws/ssmService.ts +0 -7
  380. package/packages/utils/src/config/awsParameterConfig.ts +0 -24
  381. package/packages/utils/src/config/envConfig.ts +0 -58
  382. package/packages/utils/src/config/index.spec.ts +0 -165
  383. package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
  384. package/packages/utils/src/config/resolveConfigValue.ts +0 -10
  385. package/packages/utils/src/errors/index.spec.ts +0 -35
  386. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
  387. package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
  388. package/packages/utils/src/fetch/index.spec.ts +0 -34
  389. package/packages/utils/src/fetch/index.ts +0 -87
  390. package/packages/utils/src/guards/index.spec.ts +0 -58
  391. package/packages/utils/src/index.spec.ts +0 -471
  392. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
  393. package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
  394. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
  395. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
  396. package/packages/utils/src/middleware/index.spec.ts +0 -99
  397. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
  398. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
  399. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
  400. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
  401. package/packages/utils/src/misc/hashValue.ts +0 -18
  402. package/packages/utils/src/misc/helpers.ts +0 -259
  403. package/packages/utils/src/misc/merge.ts +0 -48
  404. package/packages/utils/src/pagination/index.spec.ts +0 -150
  405. package/packages/utils/src/pagination/index.ts +0 -117
  406. package/packages/utils/src/routing/index.spec.ts +0 -553
  407. package/packages/utils/src/routing/index.ts +0 -424
  408. package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
  409. package/packages/utils/src/routing/validators/zod.ts +0 -14
  410. package/packages/utils/src/services/accountsGateway/README.md +0 -3
  411. package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
  412. package/packages/utils/src/services/accountsGateway/index.ts +0 -251
  413. package/packages/utils/src/services/apiGateway/README.md +0 -93
  414. package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
  415. package/packages/utils/src/services/apiGateway/index.ts +0 -189
  416. package/packages/utils/src/services/authProvider/README.md +0 -21
  417. package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
  418. package/packages/utils/src/services/authProvider/browser.ts +0 -209
  419. package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
  420. package/packages/utils/src/services/authProvider/decryption.ts +0 -98
  421. package/packages/utils/src/services/authProvider/index.ts +0 -93
  422. package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
  423. package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
  424. package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
  425. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
  426. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
  427. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
  428. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
  429. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
  430. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
  431. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
  432. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
  433. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
  434. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
  435. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
  436. package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
  437. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
  438. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
  439. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
  440. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
  441. package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
  442. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
  443. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
  444. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
  445. package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
  446. package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
  447. package/packages/utils/src/services/exercisesGateway/README.md +0 -5
  448. package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
  449. package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
  450. package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
  451. package/packages/utils/src/services/fileServer/index.ts +0 -43
  452. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
  453. package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
  454. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
  455. package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
  456. package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
  457. package/packages/utils/src/services/launchParams/signer.ts +0 -73
  458. package/packages/utils/src/services/launchParams/verifier.ts +0 -120
  459. package/packages/utils/src/services/logger/console.spec.ts +0 -29
  460. package/packages/utils/src/services/logger/index.spec.ts +0 -65
  461. package/packages/utils/src/services/lrsGateway/README.md +0 -5
  462. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
  463. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
  464. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
  465. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
  466. package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
  467. package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
  468. package/packages/utils/src/services/lrsGateway/index.ts +0 -257
  469. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
  470. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
  471. package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
  472. package/packages/utils/src/services/postgresConnection/index.ts +0 -84
  473. package/packages/utils/src/services/searchProvider/README.md +0 -3
  474. package/packages/utils/src/services/searchProvider/index.ts +0 -59
  475. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
  476. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
  477. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
  478. package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
  479. package/packages/utils/tsconfig.json +0 -31
  480. package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
  481. package/packages/utils/tsconfig.without-specs.esm.json +0 -7
  482. package/packages/utils/tsconfig.without-specs.json +0 -6
  483. package/scripts/build.bash +0 -24
  484. package/scripts/ci.bash +0 -10
  485. package/scripts/start.bash +0 -29
  486. /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
  487. /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
  488. /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
  489. /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
  490. /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
  491. /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
  492. /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
  493. /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
  494. /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
  495. /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
  496. /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
  497. /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
  498. /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
  499. /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
  500. /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
  501. /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
  502. /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
  503. /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
  504. /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
  505. /package/{packages/utils/script → script}/bin/which.bash +0 -0
  506. /package/{packages/utils/script → script}/bin-entry.bash +0 -0
  507. /package/{packages/utils/script → script}/build.bash +0 -0
@@ -1,847 +0,0 @@
1
- import addDate from 'date-fns/add';
2
- import formatISO from 'date-fns/formatISO';
3
- import subDate from 'date-fns/sub';
4
- import {v4 as uuid} from 'uuid';
5
- import * as utils from './attempt-utils';
6
- import { LrsGateway } from '.';
7
-
8
- afterEach(() => {
9
- jest.clearAllMocks();
10
- });
11
-
12
- beforeEach(() => {
13
- jest.useFakeTimers();
14
- jest.setSystemTime(new Date(2020, 1, 1));
15
- });
16
-
17
- const defaultStatementFields = () => ({
18
- id: uuid(),
19
- timestamp: formatISO(new Date()),
20
- actor: {
21
- account: {
22
- homePage: 'https://openstax.org' as const,
23
- name: uuid(),
24
- },
25
- objectType: 'Agent' as const,
26
- },
27
- });
28
-
29
- const mockLrsGateway = {getXapiStatements: jest.fn(), getMoreXapiStatements: jest.fn(), getAllXapiStatements: jest.fn(), putXapiStatements: jest.fn()};
30
-
31
- describe('resolveAttemptInfo', () => {
32
- it('works with no statements', () => {
33
- const result = utils.resolveAttemptInfo([]);
34
- expect(result).toEqual({
35
- attempts: 0,
36
- completedAttempts: 0,
37
- currentAttempt: undefined,
38
- currentAttemptCompleted: undefined,
39
- currentAttemptStatements: [],
40
- mostRecentAttemptWithCompleted: undefined,
41
- mostRecentAttemptWithCompletedCompleted: undefined,
42
- });
43
- });
44
-
45
- it('finds an attempt', () => {
46
- const attempt = {
47
- ...defaultStatementFields(),
48
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}),
49
- stored: '2025-01-01T01:01:01Z',
50
- };
51
- const result = utils.resolveAttemptInfo([attempt], { activityIRI: 'my cool activity' });
52
- expect(result).toEqual({
53
- attempts: 1,
54
- completedAttempts: 0,
55
- currentAttempt: attempt,
56
- currentAttemptCompleted: undefined,
57
- currentAttemptStatements: [],
58
- mostRecentAttemptWithCompleted: undefined,
59
- mostRecentAttemptWithCompletedCompleted: undefined,
60
- });
61
- });
62
-
63
- it('uses most recent attempt as current', () => {
64
- const attempt1 = {
65
- ...defaultStatementFields(),
66
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
67
- };
68
- const attempt2 = {
69
- ...defaultStatementFields(),
70
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}),
71
- timestamp: formatISO(subDate(new Date(), {hours: 1})),
72
- };
73
- const result = utils.resolveAttemptInfo([attempt1, attempt2], { activityIRI: 'my cool activity' });
74
- expect(result).toEqual({
75
- attempts: 2,
76
- completedAttempts: 0,
77
- currentAttempt: attempt1,
78
- currentAttemptCompleted: undefined,
79
- currentAttemptStatements: [],
80
- mostRecentAttemptWithCompleted: undefined,
81
- mostRecentAttemptWithCompletedCompleted: undefined,
82
- });
83
- });
84
-
85
- it('uses oldest attempt as current', () => {
86
- const attempt1 = {
87
- ...defaultStatementFields(),
88
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}),
89
- stored: defaultStatementFields().timestamp,
90
- };
91
- const attempt2 = {
92
- ...defaultStatementFields(),
93
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}),
94
- timestamp: formatISO(addDate(new Date(), {hours: 1})),
95
- };
96
- const result = utils.resolveAttemptInfo([attempt1, attempt2], { activityIRI: 'my cool activity', currentPreference: 'oldest'});
97
- expect(result).toEqual({
98
- attempts: 2,
99
- completedAttempts: 0,
100
- currentAttempt: attempt1,
101
- currentAttemptCompleted: undefined,
102
- currentAttemptStatements: [],
103
- mostRecentAttemptWithCompleted: undefined,
104
- mostRecentAttemptWithCompletedCompleted: undefined,
105
- });
106
- });
107
-
108
- it('uses input attempt as current', () => {
109
- const attempt1 = {
110
- ...defaultStatementFields(),
111
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
112
- };
113
- const attempt2 = {
114
- ...defaultStatementFields(),
115
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}),
116
- timestamp: formatISO(subDate(new Date(), {hours: 1})),
117
- };
118
- const result = utils.resolveAttemptInfo([attempt1, attempt2], { activityIRI: 'my cool activity', currentAttempt: attempt2.id});
119
- expect(result).toEqual({
120
- attempts: 2,
121
- completedAttempts: 0,
122
- currentAttempt: attempt2,
123
- currentAttemptCompleted: undefined,
124
- currentAttemptStatements: [],
125
- mostRecentAttemptWithCompleted: undefined,
126
- mostRecentAttemptWithCompletedCompleted: undefined,
127
- });
128
- });
129
-
130
- it('ignores attempt for other activity', () => {
131
- const attempt = {
132
- ...defaultStatementFields(),
133
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
134
- };
135
- const result = utils.resolveAttemptInfo([attempt], { activityIRI: 'other activity' });
136
- expect(result).toEqual({
137
- attempts: 0,
138
- completedAttempts: 0,
139
- currentAttempt: undefined,
140
- currentAttemptCompleted: undefined,
141
- currentAttemptStatements: [],
142
- mostRecentAttemptWithCompleted: undefined,
143
- mostRecentAttemptWithCompletedCompleted: undefined,
144
- });
145
- });
146
-
147
- it('collects attempt events (and ignores other events)', () => {
148
- const attempt = {
149
- ...defaultStatementFields(),
150
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
151
- };
152
- const otherEvent = {
153
- ...defaultStatementFields(),
154
- ...utils.createStatement({id: 'did a thing'}, {iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, attempt.id)
155
- };
156
- const otherEvent2 = {
157
- ...defaultStatementFields(),
158
- ...utils.createStatement({id: 'did a thing'}, {iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, 'foo')
159
- };
160
- const otherEvent3 = {
161
- ...defaultStatementFields(),
162
- ...utils.createStatement({id: 'did a thing'}, {iri: 'other activity', type: 'cool type', name: 'the activity name'}, attempt.id)
163
- };
164
- const result = utils.resolveAttemptInfo([attempt, otherEvent, otherEvent2, otherEvent3], { activityIRI: 'my cool activity' });
165
- expect(result).toEqual({
166
- attempts: 1,
167
- completedAttempts: 0,
168
- currentAttempt: attempt,
169
- currentAttemptCompleted: undefined,
170
- currentAttemptStatements: [otherEvent],
171
- mostRecentAttemptWithCompleted: undefined,
172
- mostRecentAttemptWithCompletedCompleted: undefined,
173
- });
174
- });
175
-
176
- it('finds a completed attempt', () => {
177
- const attempt = {
178
- ...defaultStatementFields(),
179
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
180
- };
181
- const otherEvent = {
182
- ...defaultStatementFields(),
183
- ...utils.createStatement({id: 'did a thing'}, {iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, attempt.id)
184
- };
185
- const completed = {
186
- ...defaultStatementFields(),
187
- ...utils.createCompletedStatement(attempt)
188
- };
189
- const otherEvent3 = {
190
- ...defaultStatementFields(),
191
- ...utils.createStatement({id: 'did a thing'}, {iri: 'other activity', type: 'cool type', name: 'the activity name'}, attempt.id)
192
- };
193
- const result = utils.resolveAttemptInfo([attempt, otherEvent, completed, otherEvent3], { activityIRI: 'my cool activity' });
194
- expect(result).toEqual({
195
- attempts: 1,
196
- completedAttempts: 1,
197
- currentAttempt: attempt,
198
- currentAttemptCompleted: completed,
199
- currentAttemptStatements: [otherEvent],
200
- mostRecentAttemptWithCompleted: attempt,
201
- mostRecentAttemptWithCompletedCompleted: completed,
202
- });
203
- });
204
-
205
- it('finds a completed attempt and a newer uncompleted event', () => {
206
- const olderAttempt = {
207
- ...defaultStatementFields(),
208
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
209
- };
210
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
211
- const oldAttempt = {
212
- ...defaultStatementFields(),
213
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
214
- };
215
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
216
- const attempt = {
217
- ...defaultStatementFields(),
218
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
219
- };
220
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
221
- const otherEvent = {
222
- ...defaultStatementFields(),
223
- ...utils.createStatement({id: 'did a thing'}, {iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, attempt.id)
224
- };
225
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
226
- const completed = {
227
- ...defaultStatementFields(),
228
- ...utils.createCompletedStatement(attempt)
229
- };
230
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
231
- const malformed = {
232
- ...defaultStatementFields(),
233
- object: {
234
- definition: {
235
- name: {
236
- 'en-US': 'asdf',
237
- },
238
- type: 'cool type',
239
- },
240
- id: 'my cool activity',
241
- objectType: 'Activity' as const
242
- },
243
- verb: {id: 'http://adlnet.gov/expapi/verbs/completed'},
244
- };
245
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
246
- const newAttempt = {
247
- ...defaultStatementFields(),
248
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
249
- };
250
- const result = utils.resolveAttemptInfo([malformed, olderAttempt, attempt, otherEvent, completed, newAttempt, oldAttempt], { activityIRI: 'my cool activity' });
251
- expect(result).toEqual({
252
- attempts: 4,
253
- completedAttempts: 1,
254
- currentAttempt: newAttempt,
255
- currentAttemptCompleted: undefined,
256
- currentAttemptStatements: [],
257
- mostRecentAttemptWithCompleted: attempt,
258
- mostRecentAttemptWithCompletedCompleted: completed,
259
- });
260
- });
261
-
262
- it('finds most recent attempt with completed', () => {
263
- const oldAttempt = {
264
- ...defaultStatementFields(),
265
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
266
- };
267
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
268
- const attempt1 = {
269
- ...defaultStatementFields(),
270
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
271
- };
272
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
273
- const completed1 = {
274
- ...defaultStatementFields(),
275
- ...utils.createCompletedStatement(attempt1)
276
- };
277
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
278
- const attempt = {
279
- ...defaultStatementFields(),
280
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
281
- };
282
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
283
- const completed = {
284
- ...defaultStatementFields(),
285
- ...utils.createCompletedStatement(attempt)
286
- };
287
- const result = utils.resolveAttemptInfo([oldAttempt, completed, attempt, completed1, attempt1], { activityIRI: 'my cool activity' });
288
- expect(result).toEqual({
289
- attempts: 3,
290
- completedAttempts: 2,
291
- currentAttempt: attempt,
292
- currentAttemptCompleted: completed,
293
- currentAttemptStatements: [],
294
- mostRecentAttemptWithCompleted: attempt,
295
- mostRecentAttemptWithCompletedCompleted: completed,
296
- });
297
- });
298
-
299
- it('finds most recent attempt with completed without any options', () => {
300
- const oldAttempt = {
301
- ...defaultStatementFields(),
302
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
303
- };
304
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
305
- const attempt1 = {
306
- ...defaultStatementFields(),
307
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
308
- };
309
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
310
- const completed1 = {
311
- ...defaultStatementFields(),
312
- ...utils.createCompletedStatement(attempt1)
313
- };
314
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
315
- const attempt = {
316
- ...defaultStatementFields(),
317
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
318
- };
319
- jest.setSystemTime(addDate(new Date(), {hours: 1}));
320
- const completed = {
321
- ...defaultStatementFields(),
322
- ...utils.createCompletedStatement(attempt)
323
- };
324
- const result = utils.resolveAttemptInfo([oldAttempt, completed, attempt, completed1, attempt1]);
325
- expect(result).toEqual({
326
- attempts: 3,
327
- completedAttempts: 2,
328
- currentAttempt: attempt,
329
- currentAttemptCompleted: completed,
330
- currentAttemptStatements: [],
331
- mostRecentAttemptWithCompleted: attempt,
332
- mostRecentAttemptWithCompletedCompleted: completed,
333
- });
334
- });
335
-
336
- it('ignores records from other parent attempts', () => {
337
- const parentAttempt1 = {
338
- ...defaultStatementFields(),
339
- ...utils.createAttemptStatement({iri: 'my parent activity', type: 'parent type', name: 'cool parent'})
340
- };
341
- const parentAttempt2 = {
342
- ...defaultStatementFields(),
343
- ...utils.createAttemptStatement({iri: 'my parent activity', type: 'parent type', name: 'cool parent'})
344
- };
345
- const attempt1 = {
346
- ...defaultStatementFields(),
347
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, {iri: 'my parent activity', attempt: parentAttempt1.id})
348
- };
349
- const otherEvent = {
350
- ...defaultStatementFields(),
351
- ...utils.createStatement({id: 'did a thing'}, {iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, attempt1.id, 'my parent activity')
352
- };
353
- const attempt2 = {
354
- ...defaultStatementFields(),
355
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, {iri: 'my parent activity', attempt: parentAttempt2.id})
356
- };
357
- const completed2 = {
358
- ...defaultStatementFields(),
359
- ...utils.createCompletedStatement(attempt2)
360
- };
361
- const malformed = {
362
- ...defaultStatementFields(),
363
- object: {
364
- definition: {
365
- name: {
366
- 'en-US': 'asdf',
367
- },
368
- type: 'cool type',
369
- },
370
- id: 'my cool activity',
371
- objectType: 'Activity' as const
372
- },
373
- verb: {id: 'http://adlnet.gov/expapi/verbs/attempted'},
374
- };
375
- const completed3 = {
376
- ...defaultStatementFields(),
377
- ...utils.createCompletedStatement(malformed)
378
- };
379
- const result = utils.resolveAttemptInfo([malformed, attempt1, otherEvent, attempt2, completed2, completed3], { activityIRI: 'my cool activity', parentActivityAttempt: parentAttempt2.id});
380
- expect(result).toEqual({
381
- attempts: 1,
382
- completedAttempts: 1,
383
- currentAttempt: attempt2,
384
- currentAttemptCompleted: completed2,
385
- currentAttemptStatements: [],
386
- mostRecentAttemptWithCompleted: attempt2,
387
- mostRecentAttemptWithCompletedCompleted: completed2,
388
- });
389
- });
390
-
391
- it('selects bestCompletedAttempt based on highest score', () => {
392
-
393
- const attempt1 = {
394
- ...defaultStatementFields(),
395
- ...utils.createAttemptStatement({ iri: 'activity-id', type: 'type', name: 'activity' })
396
- };
397
- const attempt2 = {
398
- ...defaultStatementFields(),
399
- ...utils.createAttemptStatement({ iri: 'activity-id', type: 'type', name: 'activity' })
400
- };
401
- const attempt3 = {
402
- ...defaultStatementFields(),
403
- ...utils.createAttemptStatement({ iri: 'activity-id', type: 'type', name: 'activity' }),
404
- timestamp: formatISO(addDate(new Date(), {hours: 1})),
405
-
406
- };
407
-
408
-
409
- const completed1 = {
410
- ...defaultStatementFields(),
411
- ...utils.createCompletedStatement(attempt1, {score: {raw: 3, max: 5, min: 0, scaled: 0.6}}),
412
- };
413
- const completed2 = {
414
- ...defaultStatementFields(),
415
- ...utils.createCompletedStatement(attempt2, {score: {raw: 5, max: 5, min: 0, scaled: 1}}),
416
- };
417
- const completed3 = {
418
- ...defaultStatementFields(),
419
- ...utils.createCompletedStatement(attempt3, {score: {raw: 4, max: 5, min: 0, scaled: 0.8}}),
420
-
421
- };
422
-
423
- const result = utils.resolveAttemptInfo(
424
- [attempt1, completed1, attempt2, completed2, attempt3, completed3],
425
- { activityIRI: 'activity-id' }
426
- );
427
- expect(result).toEqual({
428
- attempts: 3,
429
- bestCompletedAttempt: attempt2,
430
- bestCompletedAttemptCompleted: completed2,
431
- completedAttempts: 3,
432
- currentAttempt: attempt3,
433
- currentAttemptCompleted: completed3,
434
- currentAttemptStatements: [],
435
- mostRecentAttemptWithCompleted: attempt3,
436
- mostRecentAttemptWithCompletedCompleted: completed3,
437
- });
438
- });
439
-
440
- });
441
-
442
- describe('putCompletedStatement', () => {
443
- it('calls gateway', () => {
444
- const putXapiStatements = jest.fn((x => Promise.resolve(x.map(s => ({...defaultStatementFields(), ...s})))) as LrsGateway['putXapiStatements']);
445
- const gateway = {...mockLrsGateway, putXapiStatements} as LrsGateway;
446
- const attempt = {
447
- ...defaultStatementFields(),
448
- id: 'attempt id',
449
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
450
- };
451
- utils.putCompletedStatement(gateway, attempt, undefined);
452
- expect(putXapiStatements.mock.calls).toHaveLength(1);
453
- expect(putXapiStatements.mock.calls[0][0]).toMatchInlineSnapshot(`
454
- [
455
- {
456
- "context": {
457
- "statement": {
458
- "id": "attempt id",
459
- "objectType": "StatementRef",
460
- },
461
- },
462
- "object": {
463
- "definition": {
464
- "extensions": {},
465
- "name": {
466
- "en-US": "the activity name",
467
- },
468
- "type": "cool type",
469
- },
470
- "id": "my cool activity",
471
- "objectType": "Activity",
472
- },
473
- "result": {
474
- "duration": "P0Y0M0DT0H0M0S",
475
- },
476
- "verb": {
477
- "display": {
478
- "en-US": "Completed",
479
- },
480
- "id": "http://adlnet.gov/expapi/verbs/completed",
481
- },
482
- },
483
- ]
484
- `);
485
- });
486
- });
487
-
488
- describe('putAttemptStatement', () => {
489
- it('calls gateway', () => {
490
- const putXapiStatements = jest.fn((x => Promise.resolve(x.map(s => ({...defaultStatementFields(), ...s})))) as LrsGateway['putXapiStatements']);
491
- const gateway = {...mockLrsGateway, putXapiStatements} as LrsGateway;
492
- utils.putAttemptStatement(gateway, {iri: 'my cool activity', type: 'cool type', name: 'activity name'});
493
- expect(putXapiStatements.mock.calls).toHaveLength(1);
494
- expect(putXapiStatements.mock.calls[0][0]).toMatchInlineSnapshot(`
495
- [
496
- {
497
- "object": {
498
- "definition": {
499
- "extensions": {},
500
- "name": {
501
- "en-US": "activity name",
502
- },
503
- "type": "cool type",
504
- },
505
- "id": "my cool activity",
506
- "objectType": "Activity",
507
- },
508
- "verb": {
509
- "display": {
510
- "en-US": "Attempted",
511
- },
512
- "id": "http://adlnet.gov/expapi/verbs/attempted",
513
- },
514
- },
515
- ]
516
- `);
517
- });
518
- });
519
-
520
- describe('loadStatementsForActivityAndFirstChildren', () => {
521
- it('calls gateway', () => {
522
- const getAllXapiStatements = jest.fn((() => Promise.resolve([])) as LrsGateway['getAllXapiStatements']);
523
- const gateway = {...mockLrsGateway, getAllXapiStatements} as LrsGateway;
524
- utils.loadStatementsForActivityAndFirstChildren(gateway, 'my cool activity');
525
- expect(getAllXapiStatements.mock.calls).toHaveLength(1);
526
- expect(getAllXapiStatements.mock.calls[0][0]).toEqual({activity: 'my cool activity', related_activities: true});
527
- });
528
-
529
- it('calls gateway with attempt', () => {
530
- const getAllXapiStatements = jest.fn((() => Promise.resolve([])) as LrsGateway['getAllXapiStatements']);
531
- const gateway = {...mockLrsGateway, getAllXapiStatements} as LrsGateway;
532
- utils.loadStatementsForActivityAndFirstChildren(gateway, 'my cool activity', { attempt: 'attempt id' });
533
- expect(getAllXapiStatements.mock.calls).toHaveLength(1);
534
- expect(getAllXapiStatements.mock.calls[0][0]).toEqual({activity: 'my cool activity', related_activities: true, registration: 'attempt id'});
535
- });
536
- });
537
-
538
- describe('loadActivityAttemptInfo', () => {
539
- it('finds an attempt', async () => {
540
- const attempt = {
541
- ...defaultStatementFields(),
542
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
543
- };
544
- const getAllXapiStatements = jest.fn((() => Promise.resolve([attempt])) as LrsGateway['getAllXapiStatements']);
545
- const gateway = {...mockLrsGateway, getAllXapiStatements} as LrsGateway;
546
- const result = await utils.loadActivityAttemptInfo(gateway, 'my cool activity');
547
- expect(result).toEqual({
548
- attempts: 1,
549
- completedAttempts: 0,
550
- currentAttempt: attempt,
551
- currentAttemptCompleted: undefined,
552
- currentAttemptStatements: [],
553
- mostRecentAttemptWithCompleted: undefined,
554
- mostRecentAttemptWithCompletedCompleted: undefined,
555
- });
556
- });
557
-
558
- it('filters on registration if parentActivityAttempt is specified', async () => {
559
- const attempt = {
560
- ...defaultStatementFields(),
561
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
562
- };
563
- const getAllXapiStatements = jest.fn((() => Promise.resolve([attempt])) as LrsGateway['getAllXapiStatements']);
564
- const gateway = {...mockLrsGateway, getAllXapiStatements} as LrsGateway;
565
- await utils.loadActivityAttemptInfo(gateway, 'my cool activity', {parentActivityAttempt: 'some uuid'});
566
- expect(getAllXapiStatements).toHaveBeenCalledWith(expect.objectContaining({
567
- registration: 'some uuid'
568
- }));
569
- });
570
- });
571
-
572
- describe('matchAttemptCompleted', () => {
573
- it('matches attempt', () => {
574
- const attempt = {
575
- ...defaultStatementFields(),
576
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
577
- };
578
- const completed = {
579
- ...defaultStatementFields(),
580
- ...utils.createCompletedStatement(attempt)
581
- };
582
- expect(utils.matchAttemptCompleted(attempt)(completed)).toBe(true);
583
- });
584
-
585
- it('does not match other attempt', () => {
586
- const attempt1 = {
587
- ...defaultStatementFields(),
588
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
589
- };
590
- const attempt2 = {
591
- ...defaultStatementFields(),
592
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
593
- };
594
- const completed = {
595
- ...defaultStatementFields(),
596
- ...utils.createCompletedStatement(attempt1)
597
- };
598
- expect(utils.matchAttemptCompleted(attempt2)(completed)).toBe(false);
599
- });
600
-
601
- it('does not match completed without context (malformed)', () => {
602
- const attempt = {
603
- ...defaultStatementFields(),
604
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
605
- };
606
- const {context, ...completed} = {
607
- ...defaultStatementFields(),
608
- ...utils.createCompletedStatement(attempt)
609
- };
610
- expect(utils.matchAttemptCompleted(attempt)(completed)).toBe(false);
611
- });
612
-
613
- it('does not match completed without context statement (malformed)', () => {
614
- const attempt = {
615
- ...defaultStatementFields(),
616
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
617
- };
618
- const completed = {
619
- ...defaultStatementFields(),
620
- ...utils.createCompletedStatement(attempt),
621
- context: {}
622
- };
623
- expect(utils.matchAttemptCompleted(attempt)(completed)).toBe(false);
624
- });
625
-
626
- it('matches attempt with registration', () => {
627
- const attempt = {
628
- ...defaultStatementFields(),
629
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, {attempt: 'registration'})
630
- };
631
- const completed = {
632
- ...defaultStatementFields(),
633
- ...utils.createCompletedStatement(attempt)
634
- };
635
- expect(utils.matchAttemptCompleted(attempt)(completed)).toBe(true);
636
- });
637
- });
638
-
639
- describe('createAttemptStatement', () => {
640
- it('creates with no context', () => {
641
- expect(
642
- utils.createAttemptStatement({ iri: 'my cool activity', type: 'cool type', name: 'the activity name' })).
643
- toMatchInlineSnapshot(`
644
- {
645
- "object": {
646
- "definition": {
647
- "extensions": {},
648
- "name": {
649
- "en-US": "the activity name",
650
- },
651
- "type": "cool type",
652
- },
653
- "id": "my cool activity",
654
- "objectType": "Activity",
655
- },
656
- "verb": {
657
- "display": {
658
- "en-US": "Attempted",
659
- },
660
- "id": "http://adlnet.gov/expapi/verbs/attempted",
661
- },
662
- }
663
- `);
664
- });
665
-
666
- it('creates with parent iri', () => {
667
- expect(
668
- utils.createAttemptStatement({ iri: 'my cool activity', type: 'cool type', name: 'the activity name' }, { iri: 'parent iri' })).
669
- toMatchInlineSnapshot(`
670
- {
671
- "context": {
672
- "contextActivities": {
673
- "parent": [
674
- {
675
- "id": "parent iri",
676
- "objectType": "Activity",
677
- },
678
- ],
679
- },
680
- },
681
- "object": {
682
- "definition": {
683
- "extensions": {},
684
- "name": {
685
- "en-US": "the activity name",
686
- },
687
- "type": "cool type",
688
- },
689
- "id": "my cool activity",
690
- "objectType": "Activity",
691
- },
692
- "verb": {
693
- "display": {
694
- "en-US": "Attempted",
695
- },
696
- "id": "http://adlnet.gov/expapi/verbs/attempted",
697
- },
698
- }
699
- `);
700
- });
701
-
702
- it('creates with parent attempt', () => {
703
- expect(
704
- utils.createAttemptStatement({ iri: 'my cool activity', type: 'cool type', name: 'the activity name' }, { attempt: 'parent attempt' })).
705
- toMatchInlineSnapshot(`
706
- {
707
- "context": {
708
- "registration": "parent attempt",
709
- },
710
- "object": {
711
- "definition": {
712
- "extensions": {},
713
- "name": {
714
- "en-US": "the activity name",
715
- },
716
- "type": "cool type",
717
- },
718
- "id": "my cool activity",
719
- "objectType": "Activity",
720
- },
721
- "verb": {
722
- "display": {
723
- "en-US": "Attempted",
724
- },
725
- "id": "http://adlnet.gov/expapi/verbs/attempted",
726
- },
727
- }
728
- `);
729
- });
730
- });
731
-
732
- describe('createAttemptActivityStatement', () => {
733
- it('creates', () => {
734
- const attempt = {
735
- ...defaultStatementFields(),
736
- id: 'attempt id',
737
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
738
- };
739
- expect(utils.createAttemptActivityStatement(attempt, { id: 'verb' })).toMatchInlineSnapshot(`
740
- {
741
- "context": {
742
- "registration": "attempt id",
743
- },
744
- "object": {
745
- "definition": {
746
- "extensions": {},
747
- "name": {
748
- "en-US": "the activity name",
749
- },
750
- "type": "cool type",
751
- },
752
- "id": "my cool activity",
753
- "objectType": "Activity",
754
- },
755
- "verb": {
756
- "id": "verb",
757
- },
758
- }
759
- `);
760
- });
761
-
762
- it('creates with result', () => {
763
- const attempt = {
764
- ...defaultStatementFields(),
765
- id: 'attempt id',
766
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
767
- };
768
- expect(utils.createAttemptActivityStatement(attempt, { id: 'verb' }, { response: 'cool response' })).toMatchInlineSnapshot(`
769
- {
770
- "context": {
771
- "registration": "attempt id",
772
- },
773
- "object": {
774
- "definition": {
775
- "extensions": {},
776
- "name": {
777
- "en-US": "the activity name",
778
- },
779
- "type": "cool type",
780
- },
781
- "id": "my cool activity",
782
- "objectType": "Activity",
783
- },
784
- "result": {
785
- "response": "cool response",
786
- },
787
- "verb": {
788
- "id": "verb",
789
- },
790
- }
791
- `);
792
- });
793
-
794
- it('keeps attempt context activities', () => {
795
- const attempt = {
796
- ...defaultStatementFields(),
797
- id: 'attempt id',
798
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'}, {iri: 'parent iri'})
799
- };
800
- expect(utils.createAttemptActivityStatement(attempt, { id: 'verb' }, { response: 'cool response' })).toMatchInlineSnapshot(`
801
- {
802
- "context": {
803
- "contextActivities": {
804
- "parent": [
805
- {
806
- "id": "parent iri",
807
- "objectType": "Activity",
808
- },
809
- ],
810
- },
811
- "registration": "attempt id",
812
- },
813
- "object": {
814
- "definition": {
815
- "extensions": {},
816
- "name": {
817
- "en-US": "the activity name",
818
- },
819
- "type": "cool type",
820
- },
821
- "id": "my cool activity",
822
- "objectType": "Activity",
823
- },
824
- "result": {
825
- "response": "cool response",
826
- },
827
- "verb": {
828
- "id": "verb",
829
- },
830
- }
831
- `);
832
- });
833
- });
834
-
835
- describe('putAttemptActivityStatement', () => {
836
- it('calls gateway', async() => {
837
- const putXapiStatements = jest.fn().mockReturnValue(Promise.resolve([]));
838
- const attempt = {
839
- ...defaultStatementFields(),
840
- id: 'attempt id',
841
- ...utils.createAttemptStatement({iri: 'my cool activity', type: 'cool type', name: 'the activity name'})
842
- };
843
- await utils.putAttemptActivityStatement({...mockLrsGateway, putXapiStatements}, attempt, {id: 'verb'});
844
-
845
- expect(putXapiStatements).toHaveBeenCalled();
846
- });
847
- });