@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,139 +0,0 @@
1
- import { DynamoDB, PutItemCommand, QueryCommand, ScanCommand } from '@aws-sdk/client-dynamodb';
2
- import { once } from '../../..';
3
- import { resolveConfigValue } from '../../../config';
4
- import { ifDefined } from '../../../guards';
5
- import { decodeDynamoDocument, encodeDynamoAttribute, encodeDynamoDocument } from '../dynamoEncoding';
6
- // i'm not really excited about getAuthor being required, but ts is getting confused about the type when unspecified
7
- export const dynamoVersionedDocumentStore = (initializer) => {
8
- const init = ifDefined(initializer, {});
9
- const dynamodb = once(() => { var _a; return (_a = init.dynamoClient) !== null && _a !== void 0 ? _a : new DynamoDB({ apiVersion: '2012-08-10' }); });
10
- return () => (configProvider) => (_, hashKey, options) => {
11
- const tableName = once(() => resolveConfigValue(configProvider[ifDefined(init.configSpace, 'dynamodb')].tableName));
12
- return {
13
- loadAllDocumentsTheBadWay: async () => {
14
- const loadAllResults = async (ExclusiveStartKey) => {
15
- var _a;
16
- const cmd = new ScanCommand({ TableName: await tableName(), ExclusiveStartKey });
17
- const result = await dynamodb().send(cmd);
18
- const resultItems = ((_a = result.Items) === null || _a === void 0 ? void 0 : _a.map(decodeDynamoDocument)) || [];
19
- if (result.LastEvaluatedKey) {
20
- return [...resultItems, ...await loadAllResults(result.LastEvaluatedKey)];
21
- }
22
- return resultItems;
23
- };
24
- const allResults = await loadAllResults().then(results => results.reduce((result, document) => {
25
- const current = result.get(document[hashKey]);
26
- if (!current || current.timestamp < document.timestamp) {
27
- return result.set(document[hashKey], document);
28
- }
29
- return result;
30
- }, new Map()));
31
- return Array.from(allResults.values());
32
- },
33
- getVersions: async (id, startVersion) => {
34
- const cmd = new QueryCommand({
35
- TableName: await tableName(),
36
- KeyConditionExpression: '#hk = :hkv',
37
- ExpressionAttributeValues: {
38
- ':hkv': encodeDynamoAttribute(id)
39
- },
40
- ExpressionAttributeNames: {
41
- '#hk': hashKey.toString()
42
- },
43
- ...(startVersion
44
- ? { ExclusiveStartKey: {
45
- [hashKey]: encodeDynamoAttribute(id),
46
- timestamp: { N: startVersion.toString() }
47
- } }
48
- : {}),
49
- ScanIndexForward: false,
50
- });
51
- return dynamodb().send(cmd).then(result => {
52
- var _a;
53
- const items = (_a = result.Items) === null || _a === void 0 ? void 0 : _a.map(decodeDynamoDocument);
54
- if (!items || items.length === 0) {
55
- return undefined;
56
- }
57
- return {
58
- items,
59
- nextPageToken: result.LastEvaluatedKey ? decodeDynamoDocument(result.LastEvaluatedKey).timestamp : undefined
60
- };
61
- });
62
- },
63
- getItem: async (id, timestamp) => {
64
- let keyConditionExpression = '#hk = :hkv';
65
- const expressionAttributeNames = {
66
- '#hk': hashKey.toString()
67
- };
68
- const expressionAttributeValues = {
69
- ':hkv': encodeDynamoAttribute(id)
70
- };
71
- if (timestamp) {
72
- keyConditionExpression += ' and #ts = :tsv';
73
- expressionAttributeNames['#ts'] = 'timestamp';
74
- expressionAttributeValues[':tsv'] = encodeDynamoAttribute(timestamp);
75
- }
76
- const cmd = new QueryCommand({
77
- TableName: await tableName(),
78
- KeyConditionExpression: keyConditionExpression,
79
- ExpressionAttributeNames: expressionAttributeNames,
80
- ExpressionAttributeValues: expressionAttributeValues,
81
- ScanIndexForward: false,
82
- Limit: 1
83
- });
84
- return dynamodb().send(cmd).then(result => {
85
- var _a;
86
- return (_a = result.Items) === null || _a === void 0 ? void 0 : _a.map(decodeDynamoDocument)[0];
87
- });
88
- },
89
- /* prepares a new version of a document with the given data, then allows some additional
90
- * changes to be input to a `save` function that actually saves it. useful for additional
91
- * changes based on the new document version or author. the document version and author
92
- * cannot be modified */
93
- prepareItem: async (item, ...authorArgs) => {
94
- // this getAuthor type is terrible
95
- const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
96
- const timestamp = new Date().getTime();
97
- return {
98
- document: { ...item, timestamp, author },
99
- save: async (changes) => {
100
- var _a;
101
- const document = {
102
- ...item,
103
- ...changes,
104
- timestamp,
105
- author
106
- };
107
- const cmd = new PutItemCommand({
108
- TableName: await tableName(),
109
- Item: encodeDynamoDocument(document),
110
- });
111
- const updatedDoc = await dynamodb().send(cmd)
112
- .then(() => document);
113
- await ((_a = options === null || options === void 0 ? void 0 : options.afterWrite) === null || _a === void 0 ? void 0 : _a.call(options, updatedDoc));
114
- return updatedDoc;
115
- }
116
- };
117
- },
118
- /* saves a new version of a document with the given data */
119
- putItem: async (item, ...authorArgs) => {
120
- var _a;
121
- // this getAuthor type is terrible
122
- const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
123
- const document = {
124
- ...item,
125
- timestamp: new Date().getTime(),
126
- author
127
- };
128
- const cmd = new PutItemCommand({
129
- TableName: await tableName(),
130
- Item: encodeDynamoDocument(document),
131
- });
132
- const updatedDoc = await dynamodb().send(cmd)
133
- .then(() => document);
134
- await ((_a = options === null || options === void 0 ? void 0 : options.afterWrite) === null || _a === void 0 ? void 0 : _a.call(options, updatedDoc));
135
- return updatedDoc;
136
- },
137
- };
138
- };
139
- };
@@ -1,25 +0,0 @@
1
- import { Config } from '..';
2
- import { ConfigProviderForConfig } from '../../../config';
3
- import { VersionedDocumentAuthor, VersionedTDocument } from '.';
4
- interface Initializer<C> {
5
- dataDir: string;
6
- fs?: Pick<typeof import('fs'), 'mkdir' | 'readdir' | 'readFile' | 'writeFile'>;
7
- configSpace?: C;
8
- }
9
- export declare const fileSystemVersionedDocumentStore: <C extends string = "fileSystem">(initializer: Initializer<C>) => <T extends VersionedTDocument<T>>() => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => <K extends keyof T, A extends undefined | ((...a: any[]) => Promise<VersionedDocumentAuthor>)>(_: {}, hashKey: K, options?: {
10
- getAuthor?: A;
11
- skipAssert?: boolean;
12
- }) => {
13
- loadAllDocumentsTheBadWay: () => Promise<T[]>;
14
- getVersions: (id: T[K], startVersion?: number) => Promise<{
15
- items: T[];
16
- nextPageToken: number | undefined;
17
- } | undefined>;
18
- getItem: (id: T[K], timestamp?: number) => Promise<T | undefined>;
19
- prepareItem: (item: Omit<T, "timestamp" | "author">, ...authorArgs: A extends Function ? Parameters<A> : [VersionedDocumentAuthor]) => Promise<{
20
- document: T;
21
- save: (changes?: Partial<Omit<T, "timestamp" | "author">>) => Promise<T>;
22
- }>;
23
- putItem: (item: Omit<T, "timestamp" | "author">, ...authorArgs: A extends Function ? Parameters<A> : [VersionedDocumentAuthor]) => Promise<T>;
24
- };
25
- export {};
@@ -1,69 +0,0 @@
1
- import { assertNoUndefined } from '../fileSystemAssert';
2
- import { fileSystemUnversionedDocumentStore } from '../unversioned/file-system';
3
- const PAGE_LIMIT = 5;
4
- export const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, options) => {
5
- var _a;
6
- const skipAssert = (_a = options === null || options === void 0 ? void 0 : options.skipAssert) !== null && _a !== void 0 ? _a : false;
7
- const unversionedDocuments = fileSystemUnversionedDocumentStore(initializer)()(configProvider)({}, 'id', { skipAssert });
8
- return {
9
- loadAllDocumentsTheBadWay: () => {
10
- return unversionedDocuments.loadAllDocumentsTheBadWay().then(documents => documents.map(document => {
11
- return document.items[document.items.length - 1];
12
- }));
13
- },
14
- getVersions: async (id, startVersion) => {
15
- if (!skipAssert)
16
- assertNoUndefined(id, ['id']);
17
- const item = await unversionedDocuments.getItem(id);
18
- const versions = item === null || item === void 0 ? void 0 : item.items.reverse();
19
- if (!versions) {
20
- return undefined;
21
- }
22
- const startIndex = startVersion ? versions.findIndex(version => version.timestamp === startVersion) + 1 : 0;
23
- const items = versions.slice(startIndex, startIndex + PAGE_LIMIT);
24
- const hasMore = (startIndex + 5) < versions.length;
25
- return {
26
- items,
27
- nextPageToken: hasMore ? items[items.length - 1].timestamp : undefined
28
- };
29
- },
30
- getItem: async (id, timestamp) => {
31
- if (!skipAssert)
32
- assertNoUndefined(id, ['id']);
33
- const item = await unversionedDocuments.getItem(id);
34
- if (timestamp) {
35
- return item === null || item === void 0 ? void 0 : item.items.find(version => version.timestamp === timestamp);
36
- }
37
- return item ? item.items[item.items.length - 1] : undefined;
38
- },
39
- prepareItem: async (item, ...authorArgs) => {
40
- // this getAuthor type is terrible
41
- const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
42
- const timestamp = new Date().getTime();
43
- return {
44
- document: { ...item, timestamp, author },
45
- save: async (changes) => {
46
- var _a;
47
- const document = { ...item, ...changes, timestamp, author };
48
- if (!skipAssert)
49
- assertNoUndefined(document);
50
- const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
51
- const updated = { ...container, items: [...container.items, document] };
52
- await unversionedDocuments.putItem(updated);
53
- return document;
54
- }
55
- };
56
- },
57
- putItem: async (item, ...authorArgs) => {
58
- var _a;
59
- const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
60
- const document = { ...item, timestamp: new Date().getTime(), author };
61
- if (!skipAssert)
62
- assertNoUndefined(document);
63
- const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
64
- const updated = { ...container, items: [...container.items, document] };
65
- await unversionedDocuments.putItem(updated);
66
- return document;
67
- },
68
- };
69
- };
@@ -1,17 +0,0 @@
1
- import { TDocument } from '..';
2
- import { dynamoVersionedDocumentStore } from './dynamodb';
3
- export type VersionedDocumentAuthor = {
4
- type: 'user';
5
- uuid: string;
6
- name: string;
7
- reason?: string;
8
- } | {
9
- type: 'system';
10
- reason: string;
11
- };
12
- export type VersionedDocumentRequiredFields = {
13
- timestamp: number;
14
- author: VersionedDocumentAuthor;
15
- };
16
- export type VersionedTDocument<T> = TDocument<T> & VersionedDocumentRequiredFields;
17
- export type VersionedDocumentStoreCreator = typeof dynamoVersionedDocumentStore;
@@ -1 +0,0 @@
1
- export {};
@@ -1,67 +0,0 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { GenericFetch } from '../../fetch';
3
- export type Config = {
4
- defaultCorrectness?: string;
5
- exercisesHost: string;
6
- exercisesAuthToken: string;
7
- };
8
- interface Initializer<C> {
9
- configSpace?: C;
10
- fetch: GenericFetch;
11
- }
12
- export type Answer = {
13
- id: number;
14
- content_html: string;
15
- correctness?: string;
16
- feedback_html?: string;
17
- };
18
- export type Solution = {
19
- images: any[];
20
- solution_type: string;
21
- content_html: string;
22
- };
23
- export type Question = {
24
- id: number;
25
- is_answer_order_important: boolean;
26
- stimulus_html: string;
27
- stem_html: string;
28
- answers: Answer[];
29
- hints: string[];
30
- formats: string[];
31
- combo_choices: any[];
32
- collaborator_solutions?: Solution[];
33
- community_solutions?: Solution[];
34
- };
35
- export type Exercise = {
36
- images: any[];
37
- tags: string[];
38
- uuid: string;
39
- group_uuid: string;
40
- number: number;
41
- version: number;
42
- uid: string;
43
- published_at: string;
44
- solutions_are_public: boolean;
45
- authors: any[];
46
- copyright_holders: any[];
47
- derived_from: any[];
48
- is_vocab: boolean;
49
- questions: Question[];
50
- delegations: any[];
51
- versions: number[];
52
- stimulus_html: string;
53
- };
54
- export type ExercisesSearchResults = {
55
- total_count: number;
56
- items: Exercise[];
57
- };
58
- export type ExercisesSearchResultsWithDigest = ExercisesSearchResults & {
59
- digest: string;
60
- };
61
- export declare const exercisesGateway: <C extends string = "exercises">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => (_: {}) => {
62
- searchDigest: (query: string, page?: number, per_page?: number) => Promise<string>;
63
- get: (uuid: string) => Promise<Exercise | undefined>;
64
- search: (query: string, page?: number, per_page?: number) => Promise<ExercisesSearchResultsWithDigest>;
65
- };
66
- export type ExercisesGateway = ReturnType<ReturnType<ReturnType<typeof exercisesGateway>>>;
67
- export {};
@@ -1,70 +0,0 @@
1
- import * as queryString from 'query-string';
2
- import { once } from '../..';
3
- import { assertString } from '../../assertions';
4
- import { resolveConfigValue } from '../../config';
5
- import { ifDefined } from '../../guards';
6
- import { METHOD } from '../../routing';
7
- export const exercisesGateway = (initializer) => (configProvider) => {
8
- const config = configProvider[ifDefined(initializer.configSpace, 'exercises')];
9
- const exercisesHost = once(() => resolveConfigValue(config.exercisesHost));
10
- const exercisesAuthToken = once(() => resolveConfigValue(config.exercisesAuthToken));
11
- const defaultCorrectness = once(() => resolveConfigValue(config.defaultCorrectness || ''));
12
- const doDefaultCorrectness = async (exercise) => {
13
- if (await defaultCorrectness() !== 'true') {
14
- return exercise;
15
- }
16
- for (const question of exercise.questions) {
17
- const existingCorrect = question.answers.find(answer => answer.correctness !== undefined);
18
- if (question.answers.length < 1 || existingCorrect) {
19
- continue;
20
- }
21
- const defaultCorrectIndex = question.id % question.answers.length;
22
- const defaultCorrect = question.answers[defaultCorrectIndex];
23
- const defaultHint = `<em>random default: the correct answer is ${defaultCorrect.id}: ${defaultCorrect.content_html.slice(0, 20)}</em>`;
24
- question.stem_html += `\n<br>${defaultHint}`;
25
- question.collaborator_solutions = [
26
- { solution_type: 'detailed', images: [], content_html: defaultHint }
27
- ];
28
- for (let index = 0; index < question.answers.length; index++) {
29
- const answer = question.answers[index];
30
- answer.correctness = defaultCorrectIndex === index ? '1.0' : '0.0';
31
- answer.feedback_html = defaultCorrectIndex === index ? 'This is the good one!' : defaultHint;
32
- }
33
- }
34
- return exercise;
35
- };
36
- return (_) => {
37
- const request = async (method, path, query = undefined) => {
38
- const host = (await exercisesHost()).replace(/\/+$/, '');
39
- const baseUrl = `${host}/api/${path}`;
40
- const url = query ? `${baseUrl}?${queryString.stringify(query)}` : baseUrl;
41
- return initializer.fetch(url, {
42
- headers: {
43
- Authorization: `Bearer ${await exercisesAuthToken()}`,
44
- },
45
- method,
46
- });
47
- };
48
- const searchDigest = async (query, page = 1, per_page = 100) => {
49
- const response = await request(METHOD.HEAD, 'exercises', { query, page, per_page });
50
- return assertString(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint HEAD did not return an X-Digest header');
51
- };
52
- const search = async (query, page = 1, per_page = 100) => {
53
- const response = await request(METHOD.GET, 'exercises', { query, page, per_page });
54
- const digest = assertString(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint GET did not return an X-Digest header');
55
- const { items, total_count } = await response.json();
56
- return { digest, items: await Promise.all(items.map(doDefaultCorrectness)), total_count };
57
- };
58
- const get = async (uuid) => {
59
- const response = await request(METHOD.GET, `exercises/${uuid}`);
60
- return response.status === 404
61
- ? undefined
62
- : response.json().then(doDefaultCorrectness);
63
- };
64
- return {
65
- searchDigest,
66
- get,
67
- search,
68
- };
69
- };
70
- };
@@ -1,30 +0,0 @@
1
- export type FileValue = {
2
- dataType: 'file';
3
- mimeType: string;
4
- path: string;
5
- label: string;
6
- };
7
- export type FolderValue = {
8
- dataType: 'folder';
9
- files: FileValue[];
10
- };
11
- export declare const isFileValue: (thing: any) => thing is FileValue;
12
- export declare const isFolderValue: (thing: any) => thing is FolderValue;
13
- export interface FileServerAdapter {
14
- putFileContent: (source: FileValue, content: string) => Promise<FileValue>;
15
- getSignedViewerUrl: (source: FileValue) => Promise<string>;
16
- getPublicViewerUrl: (source: FileValue) => Promise<string>;
17
- getFileContent: (source: FileValue) => Promise<Buffer>;
18
- getSignedFileUploadConfig: () => Promise<{
19
- url: string;
20
- payload: {
21
- [key: string]: string;
22
- };
23
- }>;
24
- copyFileTo: (source: FileValue, destinationPath: string) => Promise<FileValue>;
25
- copyFileToDirectory: (source: FileValue, destinationDirectory: string) => Promise<FileValue>;
26
- isTemporaryUpload: (source: FileValue) => boolean;
27
- getFileChecksum: (source: FileValue) => Promise<string>;
28
- filesEqual: (sourceA: FileValue, sourceB: FileValue) => Promise<boolean>;
29
- }
30
- export declare const isFileOrFolder: (thing: any) => thing is FileValue | FolderValue;
@@ -1,13 +0,0 @@
1
- import { isPlainObject } from '../../guards';
2
- export const isFileValue = (thing) => isPlainObject(thing)
3
- && Object.keys(thing).every(key => ['dataType', 'path', 'label', 'mimeType'].includes(key))
4
- && thing.dataType === 'file'
5
- && typeof thing.mimeType === 'string'
6
- && typeof thing.path === 'string'
7
- && typeof thing.label === 'string';
8
- export const isFolderValue = (thing) => isPlainObject(thing)
9
- && Object.keys(thing).every(key => ['dataType', 'files'].includes(key))
10
- && thing.dataType === 'folder'
11
- && thing.files instanceof Array
12
- && thing.files.every(isFileValue);
13
- export const isFileOrFolder = (thing) => isFileValue(thing) || isFolderValue(thing);
@@ -1,13 +0,0 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { FileServerAdapter } from '.';
3
- export type Config = {
4
- port?: string;
5
- host?: string;
6
- storagePrefix: string;
7
- };
8
- interface Initializer<C> {
9
- dataDir: string;
10
- configSpace?: C;
11
- }
12
- export declare const localFileServer: <C extends string = "local">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => FileServerAdapter;
13
- export {};
@@ -1,125 +0,0 @@
1
- /* cspell:ignore originalname */
2
- import crypto from 'crypto';
3
- import fs from 'fs';
4
- import https from 'https';
5
- import path from 'path';
6
- import cors from 'cors';
7
- import express from 'express';
8
- import multer from 'multer';
9
- import { v4 as uuid } from 'uuid';
10
- import { assertString } from '../../assertions';
11
- import { resolveConfigValue } from '../../config';
12
- import { ifDefined } from '../../guards';
13
- import { memoize } from '../../misc/helpers';
14
- /* istanbul ignore next */
15
- const startServer = memoize((port, uploadDir) => {
16
- // TODO - re-evaluate the `preservePath` behavior to match whatever s3 does
17
- const upload = multer({ dest: uploadDir, preservePath: true });
18
- const fileServerApp = express();
19
- fileServerApp.use(cors());
20
- fileServerApp.use(express.static(uploadDir));
21
- fileServerApp.post('/', upload.single('file'), async (req, res) => {
22
- const file = req.file;
23
- if (!file) {
24
- return res.status(400).send({ message: 'file is required' });
25
- }
26
- const destinationName = req.body.key.replace('${filename}', file.originalname);
27
- const destinationPath = path.join(uploadDir, destinationName);
28
- const destinationDirectory = path.dirname(destinationPath);
29
- await fs.promises.mkdir(destinationDirectory, { recursive: true });
30
- await fs.promises.rename(file.path, destinationPath);
31
- res.status(201).send();
32
- });
33
- const server = https.createServer({
34
- key: fs.readFileSync(assertString(process.env.SSL_KEY_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
35
- cert: fs.readFileSync(assertString(process.env.SSL_CRT_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
36
- }, fileServerApp);
37
- server.once('error', function (err) {
38
- if (err.code === 'EADDRINUSE') {
39
- // when the local dev server reloads files on every request it doesn't
40
- // actually tear down the old modules, so this server only starts on the
41
- // first execution and changes in its code will not be reloaded
42
- return;
43
- }
44
- throw err;
45
- });
46
- server.listen(port);
47
- return true;
48
- });
49
- export const localFileServer = (initializer) => (configProvider) => {
50
- const config = configProvider[ifDefined(initializer.configSpace, 'local')];
51
- const port = resolveConfigValue(config.port || '');
52
- const host = resolveConfigValue(config.host || '');
53
- const storagePrefix = resolveConfigValue(config.storagePrefix);
54
- const fileDir = storagePrefix.then((prefix) => path.join(initializer.dataDir, prefix));
55
- Promise.all([port, fileDir])
56
- .then(([port, fileDir]) => port && startServer(port, fileDir));
57
- const getSignedViewerUrl = async (source) => {
58
- return `https://${await host}:${await port}/${source.path}`;
59
- };
60
- const getPublicViewerUrl = async (source) => {
61
- return `https://${await host}:${await port}/${source.path}`;
62
- };
63
- const getFileContent = async (source) => {
64
- const filePath = path.join(await fileDir, source.path);
65
- return fs.promises.readFile(filePath);
66
- };
67
- const putFileContent = async (source, content) => {
68
- const filePath = path.join(await fileDir, source.path);
69
- const directory = path.dirname(filePath);
70
- await fs.promises.mkdir(directory, { recursive: true });
71
- await fs.promises.writeFile(filePath, content);
72
- return source;
73
- };
74
- const getSignedFileUploadConfig = async () => {
75
- const prefix = 'uploads/' + uuid();
76
- return {
77
- url: `https://${await host}:${await port}/`,
78
- payload: {
79
- key: prefix + '/${filename}',
80
- }
81
- };
82
- };
83
- const copyFileTo = async (source, destinationPath) => {
84
- const sourcePath = path.join(await fileDir, source.path);
85
- const destPath = path.join(await fileDir, destinationPath);
86
- const destDirectory = path.dirname(destPath);
87
- await fs.promises.mkdir(destDirectory, { recursive: true });
88
- await fs.promises.copyFile(sourcePath, destPath);
89
- return {
90
- ...source,
91
- path: destinationPath
92
- };
93
- };
94
- const copyFileToDirectory = async (source, destination) => {
95
- const destinationPath = path.join(destination, source.label);
96
- return copyFileTo(source, destinationPath);
97
- };
98
- const isTemporaryUpload = (source) => {
99
- return source.path.indexOf('uploads/') === 0;
100
- };
101
- const getFileChecksum = async (source) => {
102
- const filePath = path.join(await fileDir, source.path);
103
- const fileContent = await fs.promises.readFile(filePath);
104
- return crypto.createHash('md5').update(fileContent).digest('hex');
105
- };
106
- const filesEqual = async (sourceA, sourceB) => {
107
- const [aSum, bSum] = await Promise.all([
108
- getFileChecksum(sourceA),
109
- getFileChecksum(sourceB)
110
- ]);
111
- return aSum === bSum;
112
- };
113
- return {
114
- getSignedViewerUrl,
115
- getPublicViewerUrl,
116
- getFileContent,
117
- putFileContent,
118
- getSignedFileUploadConfig,
119
- copyFileTo,
120
- copyFileToDirectory,
121
- isTemporaryUpload,
122
- getFileChecksum,
123
- filesEqual,
124
- };
125
- };
@@ -1,14 +0,0 @@
1
- import { S3Client } from '@aws-sdk/client-s3';
2
- import { ConfigProviderForConfig } from '../../config';
3
- import { FileServerAdapter } from '.';
4
- export type Config = {
5
- bucketName: string;
6
- bucketRegion: string;
7
- publicViewerDomain?: string;
8
- };
9
- interface Initializer<C> {
10
- configSpace?: C;
11
- getS3Client?: (...args: ConstructorParameters<typeof S3Client>) => S3Client;
12
- }
13
- export declare const s3FileServer: <C extends string = "deployed">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => FileServerAdapter;
14
- export {};