@openstax/ts-utils 1.33.0 → 1.34.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 (503) hide show
  1. package/.cfnlintrc +2 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/workflows/ci.yml +36 -0
  4. package/.github/workflows/lint.yml +55 -0
  5. package/.nvmrc +1 -0
  6. package/.syncignore +4 -0
  7. package/.syncpackrc +18 -0
  8. package/CONTRIBUTING.md +96 -0
  9. package/LICENSE +661 -0
  10. package/Procfile +1 -0
  11. package/README.md +62 -90
  12. package/app.json +23 -0
  13. package/cspell.json +32 -0
  14. package/deploy/constants.env +21 -0
  15. package/deploy/deploy.bash +157 -0
  16. package/deploy/deployment-alt-region.cfn.yml +70 -0
  17. package/deploy/deployment.cfn.yml +650 -0
  18. package/deploy/destroy-deployment.bash +23 -0
  19. package/deploy/shared.cfn.yml +94 -0
  20. package/docs/lambda-build.md +35 -0
  21. package/package.json +12 -228
  22. package/packages/frontend/README.md +46 -0
  23. package/packages/frontend/package.json +101 -0
  24. package/packages/frontend/public/favicon.ico +0 -0
  25. package/packages/frontend/public/index.html +107 -0
  26. package/packages/frontend/public/maintenance.html +59 -0
  27. package/packages/frontend/public/manifest.json +15 -0
  28. package/packages/frontend/public/robots.txt +3 -0
  29. package/packages/frontend/script/make-certificate.bash +49 -0
  30. package/packages/frontend/script/server/cli.js +11 -0
  31. package/packages/frontend/script/server/index.js +47 -0
  32. package/packages/frontend/script/start.bash +22 -0
  33. package/packages/frontend/script/trust-localhost.bash +7 -0
  34. package/packages/frontend/src/auth/authProvider.ts +10 -0
  35. package/packages/frontend/src/auth/useAuth.ts +33 -0
  36. package/packages/frontend/src/components/Pagination.tsx +26 -0
  37. package/packages/frontend/src/configProvider/index.ts +53 -0
  38. package/packages/frontend/src/configProvider/use.ts +41 -0
  39. package/packages/frontend/src/core/context/services.spec.tsx +39 -0
  40. package/packages/frontend/src/core/context/services.tsx +16 -0
  41. package/packages/frontend/src/core/index.spec.ts +7 -0
  42. package/packages/frontend/src/core/index.ts +20 -0
  43. package/packages/frontend/src/core/services.tsx +14 -0
  44. package/packages/frontend/src/core/types.ts +3 -0
  45. package/packages/frontend/src/example/api.ts +28 -0
  46. package/packages/frontend/src/example/components/Layout.tsx +23 -0
  47. package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
  48. package/packages/frontend/src/example/screens/Home.tsx +78 -0
  49. package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
  50. package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
  51. package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
  52. package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
  53. package/packages/frontend/src/example/screens/index.ts +9 -0
  54. package/packages/frontend/src/index.css +159 -0
  55. package/packages/frontend/src/index.tsx +67 -0
  56. package/packages/frontend/src/react-app-env.d.ts +1 -0
  57. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
  58. package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
  59. package/packages/frontend/src/routing/middleware.ts +6 -0
  60. package/packages/frontend/src/routing/useQuery.ts +14 -0
  61. package/packages/frontend/src/setupProxy.js +19 -0
  62. package/packages/frontend/src/setupTests.ts +9 -0
  63. package/packages/frontend/src/tests/testServices.tsx +23 -0
  64. package/packages/frontend/tsconfig.json +27 -0
  65. package/packages/lambda/.eslintrc.js +64 -0
  66. package/packages/lambda/jest-global-setup.js +3 -0
  67. package/packages/lambda/jest-setup-after-env.js +1 -0
  68. package/packages/lambda/jest.config.js +31 -0
  69. package/packages/lambda/jest.resolver.js +17 -0
  70. package/packages/lambda/package.json +68 -0
  71. package/packages/lambda/script/build.bash +19 -0
  72. package/packages/lambda/script/bundle-functions.bash +10 -0
  73. package/packages/lambda/script/lambdaLocalProxy.js +16 -0
  74. package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
  75. package/packages/lambda/script/utils/getRouteData.ts +7 -0
  76. package/packages/lambda/script/utils/routeDataLoader.js +8 -0
  77. package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
  78. package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
  79. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
  80. package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
  81. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
  82. package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
  83. package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
  84. package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
  85. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
  86. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
  87. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
  88. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
  89. package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
  90. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
  91. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
  92. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
  93. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
  94. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
  95. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
  96. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
  97. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
  98. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
  99. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
  100. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
  101. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
  102. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
  103. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
  104. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
  105. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
  106. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
  107. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
  108. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
  109. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
  110. package/packages/lambda/tsconfig.json +30 -0
  111. package/packages/lambda/webpack.config.js +97 -0
  112. package/packages/utils/.eslintrc.js +64 -0
  113. package/packages/utils/README.md +118 -0
  114. package/packages/utils/jest-global-setup.js +3 -0
  115. package/packages/utils/jest.config.js +25 -0
  116. package/packages/utils/jest.resolver.js +17 -0
  117. package/packages/utils/package.json +238 -0
  118. package/packages/utils/src/assertions/index.spec.ts +126 -0
  119. package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
  120. package/packages/utils/src/aws/ssmService.ts +7 -0
  121. package/packages/utils/src/config/awsParameterConfig.ts +24 -0
  122. package/packages/utils/src/config/envConfig.ts +58 -0
  123. package/packages/utils/src/config/index.spec.ts +165 -0
  124. package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
  125. package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
  126. package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
  127. package/packages/utils/src/config/resolveConfigValue.ts +10 -0
  128. package/packages/utils/src/errors/index.spec.ts +35 -0
  129. package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
  130. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
  131. package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
  132. package/packages/utils/src/fetch/index.spec.ts +34 -0
  133. package/packages/utils/src/fetch/index.ts +87 -0
  134. package/packages/utils/src/guards/index.spec.ts +58 -0
  135. package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
  136. package/packages/utils/src/index.spec.ts +471 -0
  137. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
  138. package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
  139. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
  140. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
  141. package/packages/utils/src/middleware/index.spec.ts +99 -0
  142. package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
  143. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
  144. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
  145. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
  146. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
  147. package/packages/utils/src/misc/hashValue.ts +18 -0
  148. package/packages/utils/src/misc/helpers.ts +259 -0
  149. package/packages/utils/src/misc/merge.ts +48 -0
  150. package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
  151. package/packages/utils/src/pagination/index.spec.ts +150 -0
  152. package/packages/utils/src/pagination/index.ts +117 -0
  153. package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
  154. package/packages/utils/src/routing/index.spec.ts +553 -0
  155. package/packages/utils/src/routing/index.ts +424 -0
  156. package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
  157. package/packages/utils/src/routing/validators/zod.ts +14 -0
  158. package/packages/utils/src/services/accountsGateway/README.md +3 -0
  159. package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
  160. package/packages/utils/src/services/accountsGateway/index.ts +251 -0
  161. package/packages/utils/src/services/apiGateway/README.md +93 -0
  162. package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
  163. package/packages/utils/src/services/apiGateway/index.ts +189 -0
  164. package/packages/utils/src/services/authProvider/README.md +21 -0
  165. package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
  166. package/packages/utils/src/services/authProvider/browser.ts +209 -0
  167. package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
  168. package/packages/utils/src/services/authProvider/decryption.ts +98 -0
  169. package/packages/utils/src/services/authProvider/index.ts +93 -0
  170. package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
  171. package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
  172. package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
  173. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
  174. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
  175. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
  176. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
  177. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
  178. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
  179. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
  180. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
  181. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
  182. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
  183. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
  184. package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
  185. package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
  186. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
  187. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
  188. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
  189. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
  190. package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
  191. package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
  192. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
  193. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
  194. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
  195. package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
  196. package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
  197. package/packages/utils/src/services/exercisesGateway/README.md +5 -0
  198. package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
  199. package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
  200. package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
  201. package/packages/utils/src/services/fileServer/index.ts +43 -0
  202. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
  203. package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
  204. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
  205. package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
  206. package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
  207. package/packages/utils/src/services/launchParams/signer.ts +73 -0
  208. package/packages/utils/src/services/launchParams/verifier.ts +120 -0
  209. package/packages/utils/src/services/logger/console.spec.ts +29 -0
  210. package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
  211. package/packages/utils/src/services/logger/index.spec.ts +65 -0
  212. package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
  213. package/packages/utils/src/services/lrsGateway/README.md +5 -0
  214. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
  215. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
  216. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
  217. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
  218. package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
  219. package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
  220. package/packages/utils/src/services/lrsGateway/index.ts +257 -0
  221. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
  222. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
  223. package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
  224. package/packages/utils/src/services/postgresConnection/index.ts +84 -0
  225. package/packages/utils/src/services/searchProvider/README.md +3 -0
  226. package/packages/utils/src/services/searchProvider/index.ts +59 -0
  227. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
  228. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
  229. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
  230. package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
  231. package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
  232. package/packages/utils/tsconfig.json +31 -0
  233. package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
  234. package/packages/utils/tsconfig.without-specs.esm.json +7 -0
  235. package/packages/utils/tsconfig.without-specs.json +6 -0
  236. package/scripts/build.bash +24 -0
  237. package/scripts/ci.bash +10 -0
  238. package/scripts/start.bash +29 -0
  239. package/dist/cjs/assertions/index.d.ts +0 -89
  240. package/dist/cjs/assertions/index.js +0 -157
  241. package/dist/cjs/aws/ssmService.d.ts +0 -5
  242. package/dist/cjs/aws/ssmService.js +0 -9
  243. package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
  244. package/dist/cjs/config/awsParameterConfig.js +0 -26
  245. package/dist/cjs/config/envConfig.d.ts +0 -24
  246. package/dist/cjs/config/envConfig.js +0 -57
  247. package/dist/cjs/config/index.d.ts +0 -48
  248. package/dist/cjs/config/index.js +0 -35
  249. package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
  250. package/dist/cjs/config/lambdaParameterConfig.js +0 -45
  251. package/dist/cjs/config/replaceConfig.d.ts +0 -14
  252. package/dist/cjs/config/replaceConfig.js +0 -22
  253. package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
  254. package/dist/cjs/config/resolveConfigValue.js +0 -12
  255. package/dist/cjs/errors/index.d.ts +0 -88
  256. package/dist/cjs/errors/index.js +0 -123
  257. package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
  258. package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
  259. package/dist/cjs/fetch/index.d.ts +0 -64
  260. package/dist/cjs/fetch/index.js +0 -55
  261. package/dist/cjs/guards/index.d.ts +0 -38
  262. package/dist/cjs/guards/index.js +0 -44
  263. package/dist/cjs/index.js +0 -20
  264. package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
  265. package/dist/cjs/middleware/apiErrorHandler.js +0 -42
  266. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  267. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
  268. package/dist/cjs/middleware/index.js +0 -48
  269. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  270. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
  271. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
  272. package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
  273. package/dist/cjs/misc/hashValue.d.ts +0 -10
  274. package/dist/cjs/misc/hashValue.js +0 -17
  275. package/dist/cjs/misc/helpers.d.ts +0 -124
  276. package/dist/cjs/misc/helpers.js +0 -214
  277. package/dist/cjs/misc/merge.d.ts +0 -21
  278. package/dist/cjs/misc/merge.js +0 -45
  279. package/dist/cjs/misc/partitionSequence.d.ts +0 -35
  280. package/dist/cjs/misc/partitionSequence.js +0 -55
  281. package/dist/cjs/pagination/index.d.ts +0 -91
  282. package/dist/cjs/pagination/index.js +0 -83
  283. package/dist/cjs/routing/helpers.d.ts +0 -57
  284. package/dist/cjs/routing/helpers.js +0 -90
  285. package/dist/cjs/routing/index.d.ts +0 -290
  286. package/dist/cjs/routing/index.js +0 -295
  287. package/dist/cjs/routing/validators/zod.d.ts +0 -4
  288. package/dist/cjs/routing/validators/zod.js +0 -14
  289. package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
  290. package/dist/cjs/services/accountsGateway/index.js +0 -138
  291. package/dist/cjs/services/apiGateway/index.d.ts +0 -68
  292. package/dist/cjs/services/apiGateway/index.js +0 -118
  293. package/dist/cjs/services/authProvider/browser.d.ts +0 -40
  294. package/dist/cjs/services/authProvider/browser.js +0 -155
  295. package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
  296. package/dist/cjs/services/authProvider/decryption.js +0 -73
  297. package/dist/cjs/services/authProvider/index.d.ts +0 -63
  298. package/dist/cjs/services/authProvider/index.js +0 -34
  299. package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
  300. package/dist/cjs/services/authProvider/subrequest.js +0 -49
  301. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  302. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
  303. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  304. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
  305. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  306. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
  307. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
  308. package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
  309. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
  310. package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
  311. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
  312. package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
  313. package/dist/cjs/services/documentStore/index.js +0 -2
  314. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  315. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
  316. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
  317. package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
  318. package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
  319. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
  320. package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
  321. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
  322. package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
  323. package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
  324. package/dist/cjs/services/documentStore/versioned/index.js +0 -2
  325. package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
  326. package/dist/cjs/services/exercisesGateway/index.js +0 -107
  327. package/dist/cjs/services/fileServer/index.d.ts +0 -30
  328. package/dist/cjs/services/fileServer/index.js +0 -19
  329. package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
  330. package/dist/cjs/services/fileServer/localFileServer.js +0 -132
  331. package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
  332. package/dist/cjs/services/fileServer/s3FileServer.js +0 -131
  333. package/dist/cjs/services/launchParams/index.js +0 -7
  334. package/dist/cjs/services/launchParams/signer.d.ts +0 -23
  335. package/dist/cjs/services/launchParams/signer.js +0 -58
  336. package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
  337. package/dist/cjs/services/launchParams/verifier.js +0 -129
  338. package/dist/cjs/services/logger/console.d.ts +0 -4
  339. package/dist/cjs/services/logger/console.js +0 -12
  340. package/dist/cjs/services/logger/index.d.ts +0 -39
  341. package/dist/cjs/services/logger/index.js +0 -31
  342. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  343. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
  344. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
  345. package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
  346. package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
  347. package/dist/cjs/services/lrsGateway/file-system.js +0 -150
  348. package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
  349. package/dist/cjs/services/lrsGateway/index.js +0 -148
  350. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
  351. package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
  352. package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
  353. package/dist/cjs/services/postgresConnection/index.js +0 -65
  354. package/dist/cjs/services/searchProvider/index.d.ts +0 -67
  355. package/dist/cjs/services/searchProvider/index.js +0 -2
  356. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  357. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
  358. package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
  359. package/dist/cjs/services/searchProvider/openSearch.js +0 -154
  360. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
  361. package/dist/cjs/types.d.ts +0 -31
  362. package/dist/cjs/types.js +0 -2
  363. package/dist/esm/assertions/index.d.ts +0 -89
  364. package/dist/esm/aws/ssmService.d.ts +0 -5
  365. package/dist/esm/aws/ssmService.js +0 -6
  366. package/dist/esm/config/awsParameterConfig.d.ts +0 -10
  367. package/dist/esm/config/awsParameterConfig.js +0 -22
  368. package/dist/esm/config/envConfig.d.ts +0 -24
  369. package/dist/esm/config/envConfig.js +0 -53
  370. package/dist/esm/config/index.js +0 -17
  371. package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
  372. package/dist/esm/config/lambdaParameterConfig.js +0 -38
  373. package/dist/esm/config/replaceConfig.d.ts +0 -14
  374. package/dist/esm/config/resolveConfigValue.d.ts +0 -5
  375. package/dist/esm/config/resolveConfigValue.js +0 -8
  376. package/dist/esm/errors/index.d.ts +0 -88
  377. package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
  378. package/dist/esm/fetch/fetchStatusRetry.js +0 -23
  379. package/dist/esm/fetch/index.d.ts +0 -64
  380. package/dist/esm/fetch/index.js +0 -46
  381. package/dist/esm/guards/index.js +0 -36
  382. package/dist/esm/index.d.ts +0 -4
  383. package/dist/esm/index.js +0 -4
  384. package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
  385. package/dist/esm/middleware/apiErrorHandler.js +0 -38
  386. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  387. package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
  388. package/dist/esm/middleware/index.d.ts +0 -47
  389. package/dist/esm/middleware/index.js +0 -44
  390. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  391. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
  392. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
  393. package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
  394. package/dist/esm/misc/hashValue.d.ts +0 -10
  395. package/dist/esm/misc/hashValue.js +0 -13
  396. package/dist/esm/misc/helpers.d.ts +0 -124
  397. package/dist/esm/misc/helpers.js +0 -199
  398. package/dist/esm/misc/merge.d.ts +0 -21
  399. package/dist/esm/misc/merge.js +0 -40
  400. package/dist/esm/misc/partitionSequence.d.ts +0 -35
  401. package/dist/esm/pagination/index.d.ts +0 -91
  402. package/dist/esm/pagination/index.js +0 -77
  403. package/dist/esm/routing/helpers.d.ts +0 -57
  404. package/dist/esm/routing/index.d.ts +0 -290
  405. package/dist/esm/routing/index.js +0 -246
  406. package/dist/esm/routing/validators/zod.d.ts +0 -4
  407. package/dist/esm/routing/validators/zod.js +0 -10
  408. package/dist/esm/services/accountsGateway/index.d.ts +0 -92
  409. package/dist/esm/services/accountsGateway/index.js +0 -131
  410. package/dist/esm/services/apiGateway/index.d.ts +0 -68
  411. package/dist/esm/services/apiGateway/index.js +0 -77
  412. package/dist/esm/services/authProvider/browser.d.ts +0 -40
  413. package/dist/esm/services/authProvider/browser.js +0 -151
  414. package/dist/esm/services/authProvider/decryption.d.ts +0 -19
  415. package/dist/esm/services/authProvider/decryption.js +0 -69
  416. package/dist/esm/services/authProvider/index.d.ts +0 -63
  417. package/dist/esm/services/authProvider/index.js +0 -26
  418. package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
  419. package/dist/esm/services/authProvider/subrequest.js +0 -45
  420. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  421. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
  422. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  423. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
  424. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  425. package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
  426. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
  427. package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
  428. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
  429. package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
  430. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
  431. package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
  432. package/dist/esm/services/documentStore/index.d.ts +0 -14
  433. package/dist/esm/services/documentStore/index.js +0 -1
  434. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  435. package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
  436. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
  437. package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
  438. package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
  439. package/dist/esm/services/documentStore/unversioned/index.js +0 -1
  440. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
  441. package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
  442. package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
  443. package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
  444. package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
  445. package/dist/esm/services/documentStore/versioned/index.js +0 -1
  446. package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
  447. package/dist/esm/services/exercisesGateway/index.js +0 -70
  448. package/dist/esm/services/fileServer/index.d.ts +0 -30
  449. package/dist/esm/services/fileServer/index.js +0 -13
  450. package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
  451. package/dist/esm/services/fileServer/localFileServer.js +0 -125
  452. package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
  453. package/dist/esm/services/fileServer/s3FileServer.js +0 -124
  454. package/dist/esm/services/launchParams/index.d.ts +0 -2
  455. package/dist/esm/services/launchParams/index.js +0 -2
  456. package/dist/esm/services/launchParams/signer.d.ts +0 -23
  457. package/dist/esm/services/launchParams/signer.js +0 -51
  458. package/dist/esm/services/launchParams/verifier.d.ts +0 -21
  459. package/dist/esm/services/launchParams/verifier.js +0 -92
  460. package/dist/esm/services/logger/console.d.ts +0 -4
  461. package/dist/esm/services/logger/index.js +0 -27
  462. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  463. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
  464. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
  465. package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
  466. package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
  467. package/dist/esm/services/lrsGateway/file-system.js +0 -110
  468. package/dist/esm/services/lrsGateway/index.d.ts +0 -122
  469. package/dist/esm/services/lrsGateway/index.js +0 -111
  470. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
  471. package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
  472. package/dist/esm/services/postgresConnection/index.d.ts +0 -28
  473. package/dist/esm/services/postgresConnection/index.js +0 -58
  474. package/dist/esm/services/searchProvider/index.d.ts +0 -67
  475. package/dist/esm/services/searchProvider/index.js +0 -1
  476. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  477. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
  478. package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
  479. package/dist/esm/services/searchProvider/openSearch.js +0 -150
  480. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
  481. package/dist/esm/types.js +0 -1
  482. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  483. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  500. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  501. /package/{script → packages/utils/script}/build.bash +0 -0
  502. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  503. /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
@@ -1,236 +0,0 @@
1
- /*
2
- * the structure of xapi statements for handling multiple attempts of an activity
3
- * including the option of a parent activity/attempt such that a new attempt
4
- * of a parent activity inherently creates a new attempt scope for sub-activities
5
- * is done by convention using certain context and verb pieces of a statement.
6
- * this module provides helpers for creating and retrieving statements according
7
- * to this convention.
8
- */
9
- import formatISODuration from 'date-fns/formatISODuration';
10
- import intervalToDuration from 'date-fns/intervalToDuration';
11
- import isAfter from 'date-fns/isAfter';
12
- import isBefore from 'date-fns/isBefore';
13
- import parseISO from 'date-fns/parseISO';
14
- var Verb;
15
- (function (Verb) {
16
- Verb["Attempted"] = "http://adlnet.gov/expapi/verbs/attempted";
17
- Verb["Completed"] = "http://adlnet.gov/expapi/verbs/completed";
18
- })(Verb || (Verb = {}));
19
- export const matchAttempt = (statement) => statement.verb.id === Verb.Attempted;
20
- export const matchAttemptCompleted = (attempt) => (statement) => {
21
- var _a, _b;
22
- return statement.verb.id === Verb.Completed
23
- && statement.context !== undefined
24
- && ((_a = statement.context.statement) === null || _a === void 0 ? void 0 : _a.id) === attempt.id
25
- && statement.context.registration === ((_b = attempt.context) === null || _b === void 0 ? void 0 : _b.registration);
26
- };
27
- export const resolveAttempts = (statements, options) => statements.filter(statement => {
28
- var _a;
29
- return matchAttempt(statement)
30
- && (!(options === null || options === void 0 ? void 0 : options.activityIRI) || statement.object.id === options.activityIRI)
31
- && (!(options === null || options === void 0 ? void 0 : options.parentActivityAttempt) || ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === options.parentActivityAttempt);
32
- });
33
- export const resolveCompletedForAttempt = (statements, attempt, activityIRI) => statements.find(statement => matchAttemptCompleted(attempt)(statement)
34
- && (!activityIRI || statement.object.id === activityIRI));
35
- export const oldestStatement = (statements) => statements.reduce((result, statement) => result && isBefore(parseISO('stored' in result && result.stored ? result.stored : result.timestamp), parseISO(statement.timestamp)) ? result : statement, statements[0]);
36
- export const mostRecentStatement = (statements) => statements.reduce((result, statement) => result && isAfter(parseISO('stored' in result && result.stored ? result.stored : result.timestamp), parseISO(statement.timestamp)) ? result : statement, statements[0]);
37
- export const resolveAttemptInfo = (statements, options) => {
38
- // TODO optimize. i'm 100% that this could all be done in one iteration but i'm not messing around with that for now.
39
- const attempts = resolveAttempts(statements, options);
40
- /* attempts that have a completed statement */
41
- const completedAttempts = attempts.filter(attempt => !!resolveCompletedForAttempt(statements, attempt, options === null || options === void 0 ? void 0 : options.activityIRI));
42
- /* the last attempt sorted by timestamp */
43
- const currentAttempt = (options === null || options === void 0 ? void 0 : options.currentAttempt)
44
- ? attempts.find(attempt => attempt.id === options.currentAttempt)
45
- : (options === null || options === void 0 ? void 0 : options.currentPreference) === 'oldest'
46
- ? oldestStatement(attempts)
47
- : mostRecentStatement(attempts);
48
- /* all statements for the current attempt (doesn't include the attempt or completed statements) */
49
- const currentAttemptStatements = currentAttempt ? statements.filter(statement => {
50
- var _a;
51
- return (!(options === null || options === void 0 ? void 0 : options.activityIRI) || statement.object.id === options.activityIRI)
52
- && ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === currentAttempt.id;
53
- }) : [];
54
- const currentAttemptCompleted = currentAttempt && resolveCompletedForAttempt(statements, currentAttempt, options === null || options === void 0 ? void 0 : options.activityIRI);
55
- const mostRecentAttemptWithCompleted = completedAttempts.reduce((current, attempt) => current && isAfter(parseISO(current.timestamp), parseISO(attempt.timestamp)) ? current : attempt, completedAttempts[0]);
56
- const mostRecentAttemptWithCompletedCompleted = mostRecentAttemptWithCompleted
57
- && resolveCompletedForAttempt(statements, mostRecentAttemptWithCompleted, options === null || options === void 0 ? void 0 : options.activityIRI);
58
- /*
59
- * the structure allows for the possibility of multiple incomplete attempts.
60
- * the implementation can choose at its discretion to ignore the currentAttempt
61
- * and instead make a new one, for instance if the implementation desires
62
- * an attempt timeout feature
63
- */
64
- return {
65
- attempts: attempts.length,
66
- completedAttempts: completedAttempts.length,
67
- currentAttempt,
68
- currentAttemptCompleted: currentAttemptCompleted,
69
- currentAttemptStatements,
70
- mostRecentAttemptWithCompleted,
71
- mostRecentAttemptWithCompletedCompleted,
72
- };
73
- };
74
- /*
75
- * loads all statements (for this actor) that have the given activityIRI as the object.id or the context.contextActivities.parent.id
76
- *
77
- * note: if you filter on attempt you're only gonna get the `Attempted` statements from the child activities, subsequent child activity
78
- * statements would then have to be fetched using
79
- * `gateway.getAllXapiStatements({ activity: childActivityIRI, registration: childAttemptStatementID })`.
80
- * this is because child activities could have multiple attempts under one attempt on the parent activity.
81
- */
82
- export const loadStatementsForActivityAndFirstChildren = (gateway, activityIRI, options) => {
83
- const { attempt, ...partialOptions } = options ? options : { attempt: undefined };
84
- const getOptions = attempt ? { registration: attempt, ...partialOptions } : partialOptions;
85
- return gateway.getAllXapiStatements({
86
- activity: activityIRI,
87
- related_activities: true,
88
- ...getOptions,
89
- });
90
- };
91
- export const loadActivityAttemptInfo = async (gateway, activityIRI, options) => {
92
- const { parentActivityAttempt, ...partialOptions } = options ? options : { parentActivityAttempt: undefined };
93
- const loadOptions = parentActivityAttempt ? { ...partialOptions, registration: parentActivityAttempt } : partialOptions;
94
- return resolveAttemptInfo(await gateway.getAllXapiStatements({ ...loadOptions, activity: activityIRI }), { ...options, activityIRI });
95
- };
96
- export const createStatement = (verb, activity, attempt, parentActivityIRI) => {
97
- return {
98
- context: {
99
- ...(parentActivityIRI ? {
100
- contextActivities: {
101
- parent: [
102
- {
103
- id: parentActivityIRI,
104
- objectType: 'Activity',
105
- },
106
- ],
107
- },
108
- } : {}),
109
- registration: attempt,
110
- },
111
- object: {
112
- definition: {
113
- extensions: {
114
- ...activity.extensions
115
- },
116
- name: {
117
- 'en-US': activity.name,
118
- },
119
- type: activity.type,
120
- },
121
- id: activity.iri,
122
- objectType: 'Activity'
123
- },
124
- verb,
125
- };
126
- };
127
- /*
128
- * activity:
129
- * - iri: the IRI formatted id for this activity
130
- * - type: the IRI formatted activity type (eg: http://id.tincanapi.com/activitytype/school-assignment)
131
- * - name: the plaintext name of the activity, for reporting
132
- *
133
- * parentActivity:
134
- * - iri: the IRI formatted id for the parent activity
135
- * - attempt: the statement id for the parent attempt (the object of which should be the parentActivity.iri)
136
- */
137
- export const createAttemptStatement = (activity, parentActivity) => {
138
- return {
139
- ...((parentActivity === null || parentActivity === void 0 ? void 0 : parentActivity.iri) || (parentActivity === null || parentActivity === void 0 ? void 0 : parentActivity.attempt) ? {
140
- context: {
141
- ...(parentActivity.iri ? {
142
- contextActivities: {
143
- parent: [
144
- {
145
- id: parentActivity.iri,
146
- objectType: 'Activity',
147
- },
148
- ],
149
- },
150
- } : {}),
151
- ...(parentActivity.attempt ? {
152
- registration: parentActivity.attempt,
153
- } : {})
154
- },
155
- } : {}),
156
- object: {
157
- definition: {
158
- extensions: {
159
- ...activity.extensions
160
- },
161
- name: {
162
- 'en-US': activity.name,
163
- },
164
- type: activity.type,
165
- },
166
- id: activity.iri,
167
- objectType: 'Activity'
168
- },
169
- verb: {
170
- display: { 'en-US': 'Attempted' },
171
- id: Verb.Attempted,
172
- },
173
- };
174
- };
175
- /* resolves with the statement id */
176
- export const putAttemptStatement = async (gateway, activity, parentActivity) => {
177
- return (await gateway.putXapiStatements([createAttemptStatement(activity, parentActivity)]))[0];
178
- };
179
- /*
180
- * creates a statement under the given attempt.
181
- *
182
- * `result` optional context for the attempt result (score, selected answer, etc)
183
- */
184
- export const createAttemptActivityStatement = (attemptStatement, verb, result) => {
185
- var _a;
186
- return {
187
- context: {
188
- ...(((_a = attemptStatement.context) === null || _a === void 0 ? void 0 : _a.contextActivities) ? {
189
- contextActivities: attemptStatement.context.contextActivities,
190
- } : {}),
191
- registration: attemptStatement.id,
192
- },
193
- object: attemptStatement.object,
194
- verb: verb,
195
- ...(result ? { result } : {}),
196
- };
197
- };
198
- export const putAttemptActivityStatement = async (gateway, attemptStatement, verb, result) => {
199
- return (await gateway.putXapiStatements([createAttemptActivityStatement(attemptStatement, verb, result)]))[0];
200
- };
201
- /*
202
- * creates a statement that completes the given attempt.
203
- *
204
- * `result` optional context for the attempt result (score, selected answer, etc)
205
- */
206
- export const createCompletedStatement = (attemptStatement, result) => {
207
- var _a, _b;
208
- return {
209
- context: {
210
- ...(((_a = attemptStatement.context) === null || _a === void 0 ? void 0 : _a.contextActivities) ? {
211
- contextActivities: attemptStatement.context.contextActivities,
212
- } : {}),
213
- ...(((_b = attemptStatement.context) === null || _b === void 0 ? void 0 : _b.registration) ? {
214
- registration: attemptStatement.context.registration,
215
- } : {}),
216
- statement: {
217
- objectType: 'StatementRef',
218
- id: attemptStatement.id,
219
- }
220
- },
221
- object: attemptStatement.object,
222
- verb: {
223
- display: { 'en-US': 'Completed' },
224
- id: Verb.Completed,
225
- },
226
- result: {
227
- duration: formatISODuration(intervalToDuration({
228
- start: parseISO(attemptStatement.timestamp), end: new Date()
229
- })),
230
- ...result,
231
- }
232
- };
233
- };
234
- export const putCompletedStatement = async (gateway, attemptStatement, result) => {
235
- return (await gateway.putXapiStatements([createCompletedStatement(attemptStatement, result)]))[0];
236
- };
@@ -1,15 +0,0 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { AuthProvider } from '../authProvider';
3
- import { LrsGateway } from '.';
4
- type Config = {
5
- name: string;
6
- };
7
- interface Initializer<C> {
8
- dataDir: string;
9
- fs?: Pick<typeof import('fs'), 'readFile' | 'writeFile'>;
10
- configSpace?: C;
11
- }
12
- export declare const fileSystemLrsGateway: <C extends string = "fileSystem">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => ({ authProvider }: {
13
- authProvider: AuthProvider;
14
- }) => LrsGateway;
15
- export {};
@@ -1,110 +0,0 @@
1
- import * as fsModule from 'fs';
2
- import path from 'path';
3
- import formatISO from 'date-fns/formatISO';
4
- import { v4 as uuid } from 'uuid';
5
- import { assertDefined } from '../../assertions';
6
- import { resolveConfigValue } from '../../config';
7
- import { UnauthorizedError } from '../../errors';
8
- import { ifDefined } from '../../guards';
9
- const pageSize = 5;
10
- export const fileSystemLrsGateway = (initializer) => (configProvider) => ({ authProvider }) => {
11
- const name = resolveConfigValue(configProvider[initializer.configSpace || 'fileSystem'].name);
12
- const filePath = name.then((fileName) => path.join(initializer.dataDir, fileName));
13
- const { readFile, writeFile } = ifDefined(initializer.fs, fsModule);
14
- let data;
15
- const load = filePath.then(path => new Promise(resolve => {
16
- readFile(path, (err, readData) => {
17
- if (err) {
18
- console.error(err);
19
- }
20
- else {
21
- try {
22
- data = JSON.parse(readData.toString());
23
- if (typeof data !== 'object' || !(data instanceof Array)) {
24
- data = undefined;
25
- }
26
- }
27
- catch (e) {
28
- console.error(e);
29
- }
30
- }
31
- resolve();
32
- });
33
- }));
34
- let previousSave;
35
- const putXapiStatements = async (statements) => {
36
- const user = assertDefined(await authProvider.getUser(), new UnauthorizedError);
37
- const statementsWithDefaults = statements.map(statement => ({
38
- ...statement,
39
- id: uuid(),
40
- actor: {
41
- account: {
42
- homePage: 'https://openstax.org',
43
- name: user.uuid,
44
- },
45
- objectType: 'Agent',
46
- },
47
- timestamp: formatISO(new Date()),
48
- }));
49
- await load;
50
- await previousSave;
51
- const path = await filePath;
52
- const save = previousSave = new Promise(resolve => {
53
- data = data || [];
54
- data.push(...statementsWithDefaults.map(statement => ({ ...statement, stored: statement.timestamp })));
55
- writeFile(path, JSON.stringify(data, null, 2), () => resolve());
56
- });
57
- await save;
58
- return statementsWithDefaults;
59
- };
60
- const getAllXapiStatements = async ({ user, anyUser, fetchUntil, ...options }) => {
61
- const authUser = await authProvider.getUser();
62
- await load;
63
- let filteredData = (data || []).filter(statement => {
64
- var _a, _b, _c, _d;
65
- const statementDate = new Date(statement.timestamp);
66
- const sinceDate = options.since ? new Date(options.since) : null;
67
- const untilDate = options.until ? new Date(options.until) : null;
68
- return (anyUser === true || statement.actor.account.name === (user || assertDefined(authUser, new UnauthorizedError()).uuid))
69
- && (!options.verb || statement.verb.id === options.verb)
70
- && (!options.registration || ((_a = statement.context) === null || _a === void 0 ? void 0 : _a.registration) === options.registration)
71
- && (!options.activity || (options.related_activities
72
- ? ((statement.object.id === options.activity && statement.object.objectType === 'Activity')
73
- || (!!((_d = (_c = (_b = statement.context) === null || _b === void 0 ? void 0 : _b.contextActivities) === null || _c === void 0 ? void 0 : _c.parent) === null || _d === void 0 ? void 0 : _d.find(parent => parent.id === options.activity && parent.objectType === 'Activity'))))
74
- : (statement.object.id === options.activity && statement.object.objectType === 'Activity')))
75
- && (!sinceDate || statementDate >= sinceDate)
76
- && (!untilDate || statementDate <= untilDate);
77
- });
78
- if (fetchUntil) {
79
- for (let i = 0; i < filteredData.length; i += pageSize) {
80
- if (fetchUntil(filteredData.slice(0, i + pageSize))) {
81
- filteredData = filteredData.slice(0, i + pageSize);
82
- break;
83
- }
84
- }
85
- }
86
- return filteredData;
87
- };
88
- const getMoreXapiStatements = async (more) => {
89
- const { args, offset } = JSON.parse(more);
90
- const allResults = await getAllXapiStatements(...args);
91
- const end = offset + pageSize;
92
- return {
93
- more: allResults.length > end ? JSON.stringify({ args, offset: end }) : '',
94
- statements: allResults.slice(offset, end)
95
- };
96
- };
97
- const getXapiStatements = async (...args) => {
98
- const allResults = await getAllXapiStatements(...args);
99
- return {
100
- more: allResults.length > pageSize ? JSON.stringify({ args, offset: pageSize }) : '',
101
- statements: allResults.slice(0, pageSize)
102
- };
103
- };
104
- return {
105
- putXapiStatements,
106
- getAllXapiStatements,
107
- getXapiStatements,
108
- getMoreXapiStatements,
109
- };
110
- };
@@ -1,122 +0,0 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { GenericFetch } from '../../fetch';
3
- import { WithRequired } from '../../types';
4
- import { AuthProvider } from '../authProvider';
5
- import { Logger } from '../logger';
6
- type Config = {
7
- lrsHost: string;
8
- lrsAuthorization: string;
9
- };
10
- interface Initializer<C> {
11
- configSpace?: C;
12
- fetch: GenericFetch;
13
- }
14
- export interface XapiStatement {
15
- actor: {
16
- account: {
17
- homePage: 'https://openstax.org';
18
- name: string;
19
- };
20
- objectType: 'Agent';
21
- };
22
- id: string;
23
- context?: {
24
- contextActivities?: {
25
- parent?: [
26
- {
27
- id: string;
28
- objectType: 'Activity';
29
- }
30
- ];
31
- };
32
- statement?: {
33
- objectType: 'StatementRef';
34
- id: string;
35
- };
36
- registration?: string;
37
- platform?: string;
38
- };
39
- object: {
40
- definition?: {
41
- extensions?: {
42
- [key: string]: string;
43
- };
44
- name: {
45
- [key: string]: string;
46
- };
47
- type: string;
48
- };
49
- id: string;
50
- objectType: 'Activity';
51
- };
52
- result?: {
53
- score?: {
54
- scaled?: number;
55
- raw?: number;
56
- min?: number;
57
- max?: number;
58
- };
59
- success?: boolean;
60
- completion?: boolean;
61
- response?: string;
62
- duration?: string;
63
- extensions?: {
64
- [key: string]: string;
65
- };
66
- };
67
- verb: {
68
- display?: {
69
- [key: string]: string;
70
- };
71
- id: string;
72
- };
73
- timestamp: string;
74
- stored?: string;
75
- }
76
- export type SavedXapiStatement = WithRequired<XapiStatement, 'stored'>;
77
- export type EagerXapiStatement = Omit<XapiStatement, 'stored'>;
78
- export type UXapiStatement = XapiStatement | EagerXapiStatement | SavedXapiStatement;
79
- export type LrsGateway = ReturnType<ReturnType<ReturnType<typeof lrsGateway>>>;
80
- export type LrsProvider = ReturnType<ReturnType<typeof lrsGateway>>;
81
- export declare const lrsGateway: <C extends string = "lrs">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => ({ authProvider, logger }: {
82
- authProvider: AuthProvider;
83
- logger: Logger;
84
- }) => {
85
- putXapiStatements: (statements: Array<(Pick<XapiStatement, "object" | "verb" | "context" | "result"> & {
86
- id?: string;
87
- }) | UXapiStatement>) => Promise<EagerXapiStatement[]>;
88
- getXapiStatements: (params: {
89
- verb?: string;
90
- activity?: string;
91
- registration?: string;
92
- related_activities?: boolean;
93
- user?: string;
94
- anyUser?: boolean;
95
- since?: string;
96
- until?: string;
97
- } & {
98
- ensureSync?: boolean;
99
- }) => Promise<{
100
- more: string;
101
- statements: XapiStatement[];
102
- }>;
103
- getMoreXapiStatements: (more: string) => Promise<{
104
- more: string;
105
- statements: XapiStatement[];
106
- }>;
107
- getAllXapiStatements: ({ fetchUntil, ...params }: ({
108
- verb?: string;
109
- activity?: string;
110
- registration?: string;
111
- related_activities?: boolean;
112
- user?: string;
113
- anyUser?: boolean;
114
- since?: string;
115
- until?: string;
116
- } & {
117
- ensureSync?: boolean;
118
- }) & {
119
- fetchUntil?: (statements: XapiStatement[]) => boolean;
120
- }) => Promise<XapiStatement[]>;
121
- };
122
- export {};
@@ -1,111 +0,0 @@
1
- import * as queryString from 'query-string';
2
- import { once } from '../..';
3
- import { assertDefined } from '../../assertions';
4
- import { resolveConfigValue } from '../../config';
5
- import { UnauthorizedError } from '../../errors';
6
- import { fetchStatusRetry } from '../../fetch/fetchStatusRetry';
7
- import { ifDefined } from '../../guards';
8
- import { retryWithDelay } from '../../misc/helpers';
9
- import { METHOD } from '../../routing';
10
- import { addStatementDefaultFields } from './addStatementDefaultFields';
11
- export const lrsGateway = (initializer) => (configProvider) => {
12
- const config = configProvider[ifDefined(initializer.configSpace, 'lrs')];
13
- const lrsHost = once(() => resolveConfigValue(config.lrsHost));
14
- const lrsAuthorization = once(() => resolveConfigValue(config.lrsAuthorization));
15
- return ({ authProvider, logger }) => {
16
- const fetcher = fetchStatusRetry(initializer.fetch, {
17
- logger,
18
- retries: 2,
19
- wait: 1000,
20
- status: [502]
21
- });
22
- // Note: This method actually uses POST
23
- const putXapiStatements = async (statements) => {
24
- const user = assertDefined(await authProvider.getUser(), new UnauthorizedError);
25
- const statementsWithDefaults = statements.map(statement => addStatementDefaultFields(statement, user));
26
- const response = await fetcher((await lrsHost()).replace(/\/+$/, '') + '/data/xAPI/statements', {
27
- body: JSON.stringify(statementsWithDefaults),
28
- headers: {
29
- Authorization: await lrsAuthorization(),
30
- 'Content-Type': 'application/json',
31
- 'X-Experience-API-Version': '1.0.0',
32
- },
33
- method: METHOD.POST,
34
- });
35
- if (![200, 201].includes(response.status)) {
36
- throw new Error(`Unexpected LRS POST statements response code ${response.status} with body:
37
-
38
- ${await response.text()}`);
39
- }
40
- await response.json();
41
- return statementsWithDefaults;
42
- };
43
- // Note: This code does not currently handle a single statement response,
44
- // which can return 404 if the statement is not found
45
- const formatGetXapiStatementsResponse = async (response) => {
46
- if (response.status !== 200) {
47
- throw new Error(`Unexpected LRS GET statements response code ${response.status} with body:
48
-
49
- ${await response.text()}`);
50
- }
51
- return response.json();
52
- };
53
- const getMoreXapiStatements = async (more) => fetcher((await lrsHost()).replace(/\/+$/, '') + more, {
54
- headers: {
55
- Authorization: await lrsAuthorization(),
56
- 'X-Experience-API-Version': '1.0.0',
57
- },
58
- }).then(formatGetXapiStatementsResponse);
59
- const fetchXapiStatements = async ({ user, anyUser, ...options }) => fetcher((await lrsHost()).replace(/\/+$/, '') + '/data/xAPI/statements?' + queryString.stringify({
60
- ...options,
61
- ...(anyUser === true ? {} : {
62
- agent: JSON.stringify({
63
- account: {
64
- homePage: 'https://openstax.org',
65
- name: user || assertDefined(await authProvider.getUser(), new UnauthorizedError()).uuid,
66
- },
67
- objectType: 'Agent',
68
- }),
69
- })
70
- }), {
71
- headers: {
72
- Authorization: await lrsAuthorization(),
73
- 'X-Experience-API-Version': '1.0.0',
74
- },
75
- });
76
- const getXapiStatements = async (params) => {
77
- const { ensureSync, ...fetchParams } = params;
78
- if (ensureSync) {
79
- const date = new Date();
80
- return retryWithDelay(async (abort) => {
81
- // this function retries for the consistency, if the fetch errors just abort
82
- const response = await fetchXapiStatements(fetchParams).catch(abort);
83
- const consistentThrough = response.headers.get('X-Experience-API-Consistent-Through');
84
- if (!consistentThrough || new Date(consistentThrough) < date) {
85
- throw new Error(`xAPI consistent through ${consistentThrough}; not in sync with current date ${date.toISOString()}.`);
86
- }
87
- return formatGetXapiStatementsResponse(response);
88
- }, { retries: 4, logger });
89
- }
90
- else {
91
- return fetchXapiStatements(fetchParams).then(formatGetXapiStatementsResponse);
92
- }
93
- };
94
- const getAllXapiStatements = async ({ fetchUntil, ...params }) => {
95
- const loadRemaining = async (result) => {
96
- if (!result.more || (fetchUntil && fetchUntil(result.statements))) {
97
- return result.statements;
98
- }
99
- const { more, statements } = await getMoreXapiStatements(result.more);
100
- return loadRemaining({ more, statements: [...result.statements, ...statements] });
101
- };
102
- return loadRemaining(await getXapiStatements(params));
103
- };
104
- return {
105
- putXapiStatements,
106
- getXapiStatements,
107
- getMoreXapiStatements,
108
- getAllXapiStatements,
109
- };
110
- };
111
- };
@@ -1,68 +0,0 @@
1
- import { AccountsGateway, MappedUserInfo } from '../accountsGateway';
2
- import { AuthProvider } from '../authProvider';
3
- import { ActivityState } from './attempt-utils';
4
- import { LrsGateway } from '.';
5
- export interface Grade {
6
- activityProgress: 'Initialized' | 'Started' | 'inProgress' | 'Submitted' | 'Completed';
7
- comment?: string;
8
- gradingProgress: 'FullyGraded' | 'Pending' | 'PendingManual' | 'Failed' | 'NotReady';
9
- scoreGiven: number;
10
- scoreMaximum: number;
11
- submission?: {
12
- startedAt?: string;
13
- submittedAt?: string;
14
- };
15
- userId?: string;
16
- }
17
- export declare const getRegistrationAttemptInfo: (lrs: LrsGateway, registration: string, options?: {
18
- activity?: string;
19
- anyUser?: boolean;
20
- currentPreference?: "latest" | "oldest";
21
- ensureSync?: boolean;
22
- user?: string;
23
- }) => Promise<{
24
- [key: string]: ActivityState;
25
- }>;
26
- export declare const getScoreGrade: (score: {
27
- scaled?: number;
28
- raw?: number;
29
- min?: number;
30
- max?: number;
31
- }, options: {
32
- maxScore?: number;
33
- startedAt?: string;
34
- submittedAt?: string;
35
- userId?: string;
36
- }) => Grade;
37
- export type Progress = {
38
- scaled: number;
39
- max?: number;
40
- raw?: number;
41
- };
42
- export type GradeAndProgress = {
43
- grade: Grade;
44
- progress: Progress;
45
- name?: string;
46
- };
47
- export declare const getCurrentGrade: (services: {
48
- lrs: LrsGateway;
49
- ltiAuthProvider: AuthProvider;
50
- }, registration: string, options?: {
51
- currentPreference?: "latest" | "oldest";
52
- incompleteAttemptCallback?: (info: ActivityState) => Promise<GradeAndProgress>;
53
- name?: string;
54
- scoreMaximum?: number;
55
- userId?: string;
56
- }) => Promise<GradeAndProgress | null>;
57
- export type UserActivityInfo = MappedUserInfo<ActivityState>;
58
- export declare const getAssignmentGrades: (services: {
59
- accountsGateway: AccountsGateway;
60
- lrs: LrsGateway;
61
- }, assignmentIRI: string, registration: string, options?: {
62
- anyUser?: boolean;
63
- currentPreference?: "latest" | "oldest";
64
- incompleteAttemptsCallback?: (mappedInfo: UserActivityInfo[]) => Promise<GradeAndProgress[]>;
65
- platformId?: string;
66
- scoreMaximum?: number;
67
- user?: string;
68
- }) => Promise<GradeAndProgress[]>;