@openstax/ts-utils 1.34.0 → 1.34.1

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