@openstax/ts-utils 1.34.0 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (507) hide show
  1. package/README.md +90 -62
  2. package/dist/cjs/assertions/index.d.ts +89 -0
  3. package/dist/cjs/assertions/index.js +157 -0
  4. package/dist/cjs/aws/ssmService.d.ts +5 -0
  5. package/dist/cjs/aws/ssmService.js +9 -0
  6. package/dist/cjs/config/awsParameterConfig.d.ts +10 -0
  7. package/dist/cjs/config/awsParameterConfig.js +26 -0
  8. package/dist/cjs/config/envConfig.d.ts +24 -0
  9. package/dist/cjs/config/envConfig.js +57 -0
  10. package/{packages/utils/src/config/index.ts → dist/cjs/config/index.d.ts} +13 -29
  11. package/dist/cjs/config/index.js +35 -0
  12. package/dist/cjs/config/lambdaParameterConfig.d.ts +12 -0
  13. package/dist/cjs/config/lambdaParameterConfig.js +45 -0
  14. package/dist/cjs/config/replaceConfig.d.ts +14 -0
  15. package/dist/cjs/config/replaceConfig.js +22 -0
  16. package/dist/cjs/config/resolveConfigValue.d.ts +5 -0
  17. package/dist/cjs/config/resolveConfigValue.js +12 -0
  18. package/dist/cjs/errors/index.d.ts +88 -0
  19. package/dist/cjs/errors/index.js +123 -0
  20. package/dist/cjs/fetch/fetchStatusRetry.d.ts +8 -0
  21. package/dist/cjs/fetch/fetchStatusRetry.js +27 -0
  22. package/dist/cjs/fetch/index.d.ts +64 -0
  23. package/dist/cjs/fetch/index.js +55 -0
  24. package/{packages/utils/src/guards/index.ts → dist/cjs/guards/index.d.ts} +7 -10
  25. package/dist/cjs/guards/index.js +44 -0
  26. package/dist/cjs/index.js +20 -0
  27. package/dist/cjs/middleware/apiErrorHandler.d.ts +24 -0
  28. package/dist/cjs/middleware/apiErrorHandler.js +42 -0
  29. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  30. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +54 -0
  31. package/{packages/utils/src/middleware/index.ts → dist/cjs/middleware/index.d.ts} +5 -53
  32. package/dist/cjs/middleware/index.js +48 -0
  33. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  34. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +44 -0
  35. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +4 -0
  36. package/dist/cjs/middleware/throwNotFoundMiddleware.js +14 -0
  37. package/dist/cjs/misc/hashValue.d.ts +10 -0
  38. package/dist/cjs/misc/hashValue.js +17 -0
  39. package/dist/cjs/misc/helpers.d.ts +124 -0
  40. package/dist/cjs/misc/helpers.js +214 -0
  41. package/dist/cjs/misc/merge.d.ts +21 -0
  42. package/dist/cjs/misc/merge.js +45 -0
  43. package/dist/cjs/misc/partitionSequence.d.ts +35 -0
  44. package/dist/cjs/misc/partitionSequence.js +55 -0
  45. package/dist/cjs/pagination/index.d.ts +91 -0
  46. package/dist/cjs/pagination/index.js +83 -0
  47. package/dist/cjs/routing/helpers.d.ts +57 -0
  48. package/dist/cjs/routing/helpers.js +90 -0
  49. package/dist/cjs/routing/index.d.ts +290 -0
  50. package/dist/cjs/routing/index.js +295 -0
  51. package/dist/cjs/routing/validators/zod.d.ts +4 -0
  52. package/dist/cjs/routing/validators/zod.js +14 -0
  53. package/dist/cjs/services/accountsGateway/index.d.ts +92 -0
  54. package/dist/cjs/services/accountsGateway/index.js +138 -0
  55. package/dist/cjs/services/apiGateway/index.d.ts +68 -0
  56. package/dist/cjs/services/apiGateway/index.js +118 -0
  57. package/dist/cjs/services/authProvider/browser.d.ts +40 -0
  58. package/dist/cjs/services/authProvider/browser.js +155 -0
  59. package/dist/cjs/services/authProvider/decryption.d.ts +19 -0
  60. package/dist/cjs/services/authProvider/decryption.js +73 -0
  61. package/dist/cjs/services/authProvider/index.d.ts +63 -0
  62. package/dist/cjs/services/authProvider/index.js +34 -0
  63. package/dist/cjs/services/authProvider/subrequest.d.ts +13 -0
  64. package/dist/cjs/services/authProvider/subrequest.js +49 -0
  65. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  66. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +91 -0
  67. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  68. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +47 -0
  69. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  70. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +37 -0
  71. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +3 -0
  72. package/dist/cjs/services/authProvider/utils/userSubrequest.js +13 -0
  73. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +10 -0
  74. package/dist/cjs/services/documentStore/dynamoEncoding.js +52 -0
  75. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +1 -0
  76. package/dist/cjs/services/documentStore/fileSystemAssert.js +14 -0
  77. package/{packages/utils/src/services/documentStore/index.ts → dist/cjs/services/documentStore/index.d.ts} +8 -8
  78. package/dist/cjs/services/documentStore/index.js +2 -0
  79. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  80. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +233 -0
  81. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +32 -0
  82. package/dist/cjs/services/documentStore/unversioned/file-system.js +214 -0
  83. package/{packages/utils/src/services/documentStore/unversioned/index.ts → dist/cjs/services/documentStore/unversioned/index.d.ts} +0 -2
  84. package/dist/cjs/services/documentStore/unversioned/index.js +2 -0
  85. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +25 -0
  86. package/dist/cjs/services/documentStore/versioned/dynamodb.js +143 -0
  87. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +25 -0
  88. package/dist/cjs/services/documentStore/versioned/file-system.js +73 -0
  89. package/dist/cjs/services/documentStore/versioned/index.d.ts +17 -0
  90. package/dist/cjs/services/documentStore/versioned/index.js +2 -0
  91. package/dist/cjs/services/exercisesGateway/index.d.ts +67 -0
  92. package/dist/cjs/services/exercisesGateway/index.js +107 -0
  93. package/dist/cjs/services/fileServer/index.d.ts +30 -0
  94. package/dist/cjs/services/fileServer/index.js +19 -0
  95. package/dist/cjs/services/fileServer/localFileServer.d.ts +13 -0
  96. package/dist/cjs/services/fileServer/localFileServer.js +132 -0
  97. package/dist/cjs/services/fileServer/s3FileServer.d.ts +14 -0
  98. package/dist/cjs/services/fileServer/s3FileServer.js +131 -0
  99. package/dist/cjs/services/launchParams/index.js +7 -0
  100. package/dist/cjs/services/launchParams/signer.d.ts +23 -0
  101. package/dist/cjs/services/launchParams/signer.js +58 -0
  102. package/dist/cjs/services/launchParams/verifier.d.ts +21 -0
  103. package/dist/cjs/services/launchParams/verifier.js +129 -0
  104. package/dist/cjs/services/logger/console.d.ts +4 -0
  105. package/dist/cjs/services/logger/console.js +12 -0
  106. package/{packages/utils/src/services/logger/index.ts → dist/cjs/services/logger/index.d.ts} +9 -23
  107. package/dist/cjs/services/logger/index.js +31 -0
  108. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  109. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +21 -0
  110. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +72 -0
  111. package/dist/cjs/services/lrsGateway/attempt-utils.js +283 -0
  112. package/dist/cjs/services/lrsGateway/file-system.d.ts +15 -0
  113. package/dist/cjs/services/lrsGateway/file-system.js +150 -0
  114. package/dist/cjs/services/lrsGateway/index.d.ts +122 -0
  115. package/dist/cjs/services/lrsGateway/index.js +148 -0
  116. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +71 -0
  117. package/dist/cjs/services/lrsGateway/xapiUtils.js +145 -0
  118. package/dist/cjs/services/postgresConnection/index.d.ts +28 -0
  119. package/dist/cjs/services/postgresConnection/index.js +65 -0
  120. package/dist/cjs/services/searchProvider/index.d.ts +69 -0
  121. package/dist/cjs/services/searchProvider/index.js +2 -0
  122. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  123. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +191 -0
  124. package/dist/cjs/services/searchProvider/openSearch.d.ts +28 -0
  125. package/dist/cjs/services/searchProvider/openSearch.js +162 -0
  126. package/dist/cjs/services/searchProvider/streamIndexer.d.ts +17 -0
  127. package/dist/cjs/services/searchProvider/streamIndexer.js +41 -0
  128. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  129. package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
  130. package/dist/cjs/types.js +2 -0
  131. package/dist/esm/assertions/index.d.ts +89 -0
  132. package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
  133. package/dist/esm/aws/ssmService.d.ts +5 -0
  134. package/dist/esm/aws/ssmService.js +6 -0
  135. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  136. package/dist/esm/config/awsParameterConfig.js +22 -0
  137. package/dist/esm/config/envConfig.d.ts +24 -0
  138. package/dist/esm/config/envConfig.js +53 -0
  139. package/dist/esm/config/index.d.ts +48 -0
  140. package/dist/esm/config/index.js +17 -0
  141. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  142. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  143. package/dist/esm/config/replaceConfig.d.ts +14 -0
  144. package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
  145. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  146. package/dist/esm/config/resolveConfigValue.js +8 -0
  147. package/dist/esm/errors/index.d.ts +88 -0
  148. package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
  149. package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
  150. package/dist/esm/fetch/fetchStatusRetry.js +23 -0
  151. package/dist/esm/fetch/index.d.ts +64 -0
  152. package/dist/esm/fetch/index.js +46 -0
  153. package/dist/esm/guards/index.d.ts +38 -0
  154. package/dist/esm/guards/index.js +36 -0
  155. package/dist/esm/index.d.ts +4 -0
  156. package/dist/esm/index.js +4 -0
  157. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  158. package/dist/esm/middleware/apiErrorHandler.js +38 -0
  159. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  160. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  161. package/dist/esm/middleware/index.d.ts +47 -0
  162. package/dist/esm/middleware/index.js +44 -0
  163. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  164. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
  165. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  166. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  167. package/dist/esm/misc/hashValue.d.ts +10 -0
  168. package/dist/esm/misc/hashValue.js +13 -0
  169. package/dist/esm/misc/helpers.d.ts +124 -0
  170. package/dist/esm/misc/helpers.js +199 -0
  171. package/dist/esm/misc/merge.d.ts +21 -0
  172. package/dist/esm/misc/merge.js +40 -0
  173. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  174. package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
  175. package/dist/esm/pagination/index.d.ts +91 -0
  176. package/dist/esm/pagination/index.js +77 -0
  177. package/dist/esm/routing/helpers.d.ts +57 -0
  178. package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
  179. package/dist/esm/routing/index.d.ts +290 -0
  180. package/dist/esm/routing/index.js +246 -0
  181. package/dist/esm/routing/validators/zod.d.ts +4 -0
  182. package/dist/esm/routing/validators/zod.js +10 -0
  183. package/dist/esm/services/accountsGateway/index.d.ts +92 -0
  184. package/dist/esm/services/accountsGateway/index.js +131 -0
  185. package/dist/esm/services/apiGateway/index.d.ts +68 -0
  186. package/dist/esm/services/apiGateway/index.js +77 -0
  187. package/dist/esm/services/authProvider/browser.d.ts +40 -0
  188. package/dist/esm/services/authProvider/browser.js +151 -0
  189. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  190. package/dist/esm/services/authProvider/decryption.js +69 -0
  191. package/dist/esm/services/authProvider/index.d.ts +63 -0
  192. package/dist/esm/services/authProvider/index.js +26 -0
  193. package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
  194. package/dist/esm/services/authProvider/subrequest.js +45 -0
  195. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  196. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  197. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  198. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  199. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  200. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  201. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
  202. package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
  203. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  204. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  205. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
  206. package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
  207. package/dist/esm/services/documentStore/index.d.ts +14 -0
  208. package/dist/esm/services/documentStore/index.js +1 -0
  209. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  210. package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
  211. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
  212. package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
  213. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  214. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  215. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
  216. package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
  217. package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
  218. package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
  219. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  220. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  221. package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
  222. package/dist/esm/services/exercisesGateway/index.js +70 -0
  223. package/dist/esm/services/fileServer/index.d.ts +30 -0
  224. package/dist/esm/services/fileServer/index.js +13 -0
  225. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  226. package/dist/esm/services/fileServer/localFileServer.js +125 -0
  227. package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
  228. package/dist/esm/services/fileServer/s3FileServer.js +124 -0
  229. package/dist/esm/services/launchParams/index.d.ts +2 -0
  230. package/dist/esm/services/launchParams/index.js +2 -0
  231. package/dist/esm/services/launchParams/signer.d.ts +23 -0
  232. package/dist/esm/services/launchParams/signer.js +51 -0
  233. package/dist/esm/services/launchParams/verifier.d.ts +21 -0
  234. package/dist/esm/services/launchParams/verifier.js +92 -0
  235. package/dist/esm/services/logger/console.d.ts +4 -0
  236. package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
  237. package/dist/esm/services/logger/index.d.ts +39 -0
  238. package/dist/esm/services/logger/index.js +27 -0
  239. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  240. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  241. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
  242. package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
  243. package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
  244. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  245. package/dist/esm/services/lrsGateway/index.d.ts +122 -0
  246. package/dist/esm/services/lrsGateway/index.js +111 -0
  247. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
  248. package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
  249. package/dist/esm/services/postgresConnection/index.d.ts +28 -0
  250. package/dist/esm/services/postgresConnection/index.js +58 -0
  251. package/dist/esm/services/searchProvider/index.d.ts +69 -0
  252. package/dist/esm/services/searchProvider/index.js +1 -0
  253. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  254. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
  255. package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
  256. package/dist/esm/services/searchProvider/openSearch.js +158 -0
  257. package/dist/esm/services/searchProvider/streamIndexer.d.ts +17 -0
  258. package/dist/esm/services/searchProvider/streamIndexer.js +37 -0
  259. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  260. package/dist/esm/types.d.ts +31 -0
  261. package/dist/esm/types.js +1 -0
  262. package/package.json +234 -12
  263. package/.cfnlintrc +0 -2
  264. package/.github/CODEOWNERS +0 -1
  265. package/.github/workflows/ci.yml +0 -36
  266. package/.github/workflows/lint.yml +0 -55
  267. package/.nvmrc +0 -1
  268. package/.syncignore +0 -4
  269. package/.syncpackrc +0 -18
  270. package/CONTRIBUTING.md +0 -96
  271. package/LICENSE +0 -661
  272. package/Procfile +0 -1
  273. package/app.json +0 -23
  274. package/cspell.json +0 -32
  275. package/deploy/constants.env +0 -21
  276. package/deploy/deploy.bash +0 -157
  277. package/deploy/deployment-alt-region.cfn.yml +0 -70
  278. package/deploy/deployment.cfn.yml +0 -650
  279. package/deploy/destroy-deployment.bash +0 -23
  280. package/deploy/shared.cfn.yml +0 -94
  281. package/docs/lambda-build.md +0 -35
  282. package/packages/frontend/README.md +0 -46
  283. package/packages/frontend/package.json +0 -101
  284. package/packages/frontend/public/favicon.ico +0 -0
  285. package/packages/frontend/public/index.html +0 -107
  286. package/packages/frontend/public/maintenance.html +0 -59
  287. package/packages/frontend/public/manifest.json +0 -15
  288. package/packages/frontend/public/robots.txt +0 -3
  289. package/packages/frontend/script/make-certificate.bash +0 -49
  290. package/packages/frontend/script/server/cli.js +0 -11
  291. package/packages/frontend/script/server/index.js +0 -47
  292. package/packages/frontend/script/start.bash +0 -22
  293. package/packages/frontend/script/trust-localhost.bash +0 -7
  294. package/packages/frontend/src/auth/authProvider.ts +0 -10
  295. package/packages/frontend/src/auth/useAuth.ts +0 -33
  296. package/packages/frontend/src/components/Pagination.tsx +0 -26
  297. package/packages/frontend/src/configProvider/index.ts +0 -53
  298. package/packages/frontend/src/configProvider/use.ts +0 -41
  299. package/packages/frontend/src/core/context/services.spec.tsx +0 -39
  300. package/packages/frontend/src/core/context/services.tsx +0 -16
  301. package/packages/frontend/src/core/index.spec.ts +0 -7
  302. package/packages/frontend/src/core/index.ts +0 -20
  303. package/packages/frontend/src/core/services.tsx +0 -14
  304. package/packages/frontend/src/core/types.ts +0 -3
  305. package/packages/frontend/src/example/api.ts +0 -28
  306. package/packages/frontend/src/example/components/Layout.tsx +0 -23
  307. package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
  308. package/packages/frontend/src/example/screens/Home.tsx +0 -78
  309. package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
  310. package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
  311. package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
  312. package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
  313. package/packages/frontend/src/example/screens/index.ts +0 -9
  314. package/packages/frontend/src/index.css +0 -159
  315. package/packages/frontend/src/index.tsx +0 -67
  316. package/packages/frontend/src/react-app-env.d.ts +0 -1
  317. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
  318. package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
  319. package/packages/frontend/src/routing/middleware.ts +0 -6
  320. package/packages/frontend/src/routing/useQuery.ts +0 -14
  321. package/packages/frontend/src/setupProxy.js +0 -19
  322. package/packages/frontend/src/setupTests.ts +0 -9
  323. package/packages/frontend/src/tests/testServices.tsx +0 -23
  324. package/packages/frontend/tsconfig.json +0 -27
  325. package/packages/lambda/.eslintrc.js +0 -64
  326. package/packages/lambda/jest-global-setup.js +0 -3
  327. package/packages/lambda/jest-setup-after-env.js +0 -1
  328. package/packages/lambda/jest.config.js +0 -31
  329. package/packages/lambda/jest.resolver.js +0 -17
  330. package/packages/lambda/package.json +0 -68
  331. package/packages/lambda/script/build.bash +0 -19
  332. package/packages/lambda/script/bundle-functions.bash +0 -10
  333. package/packages/lambda/script/lambdaLocalProxy.js +0 -16
  334. package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
  335. package/packages/lambda/script/utils/getRouteData.ts +0 -7
  336. package/packages/lambda/script/utils/routeDataLoader.js +0 -8
  337. package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
  338. package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
  339. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
  340. package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
  341. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
  342. package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
  343. package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
  344. package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
  345. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
  346. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
  347. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
  348. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
  349. package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
  350. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
  351. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
  352. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
  353. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
  354. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
  355. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
  356. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
  357. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
  358. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
  359. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
  360. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
  361. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
  362. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
  363. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
  364. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
  365. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
  366. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
  367. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
  368. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
  369. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
  370. package/packages/lambda/tsconfig.json +0 -30
  371. package/packages/lambda/webpack.config.js +0 -97
  372. package/packages/utils/.eslintrc.js +0 -64
  373. package/packages/utils/README.md +0 -118
  374. package/packages/utils/jest-global-setup.js +0 -3
  375. package/packages/utils/jest.config.js +0 -25
  376. package/packages/utils/jest.resolver.js +0 -17
  377. package/packages/utils/package.json +0 -238
  378. package/packages/utils/src/assertions/index.spec.ts +0 -126
  379. package/packages/utils/src/aws/ssmService.ts +0 -7
  380. package/packages/utils/src/config/awsParameterConfig.ts +0 -24
  381. package/packages/utils/src/config/envConfig.ts +0 -58
  382. package/packages/utils/src/config/index.spec.ts +0 -165
  383. package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
  384. package/packages/utils/src/config/resolveConfigValue.ts +0 -10
  385. package/packages/utils/src/errors/index.spec.ts +0 -35
  386. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
  387. package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
  388. package/packages/utils/src/fetch/index.spec.ts +0 -34
  389. package/packages/utils/src/fetch/index.ts +0 -87
  390. package/packages/utils/src/guards/index.spec.ts +0 -58
  391. package/packages/utils/src/index.spec.ts +0 -471
  392. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
  393. package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
  394. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
  395. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
  396. package/packages/utils/src/middleware/index.spec.ts +0 -99
  397. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
  398. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
  399. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
  400. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
  401. package/packages/utils/src/misc/hashValue.ts +0 -18
  402. package/packages/utils/src/misc/helpers.ts +0 -259
  403. package/packages/utils/src/misc/merge.ts +0 -48
  404. package/packages/utils/src/pagination/index.spec.ts +0 -150
  405. package/packages/utils/src/pagination/index.ts +0 -117
  406. package/packages/utils/src/routing/index.spec.ts +0 -553
  407. package/packages/utils/src/routing/index.ts +0 -424
  408. package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
  409. package/packages/utils/src/routing/validators/zod.ts +0 -14
  410. package/packages/utils/src/services/accountsGateway/README.md +0 -3
  411. package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
  412. package/packages/utils/src/services/accountsGateway/index.ts +0 -251
  413. package/packages/utils/src/services/apiGateway/README.md +0 -93
  414. package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
  415. package/packages/utils/src/services/apiGateway/index.ts +0 -189
  416. package/packages/utils/src/services/authProvider/README.md +0 -21
  417. package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
  418. package/packages/utils/src/services/authProvider/browser.ts +0 -209
  419. package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
  420. package/packages/utils/src/services/authProvider/decryption.ts +0 -98
  421. package/packages/utils/src/services/authProvider/index.ts +0 -93
  422. package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
  423. package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
  424. package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
  425. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
  426. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
  427. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
  428. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
  429. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
  430. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
  431. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
  432. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
  433. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
  434. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
  435. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
  436. package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
  437. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
  438. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
  439. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
  440. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
  441. package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
  442. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
  443. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
  444. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
  445. package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
  446. package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
  447. package/packages/utils/src/services/exercisesGateway/README.md +0 -5
  448. package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
  449. package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
  450. package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
  451. package/packages/utils/src/services/fileServer/index.ts +0 -43
  452. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
  453. package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
  454. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
  455. package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
  456. package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
  457. package/packages/utils/src/services/launchParams/signer.ts +0 -73
  458. package/packages/utils/src/services/launchParams/verifier.ts +0 -120
  459. package/packages/utils/src/services/logger/console.spec.ts +0 -29
  460. package/packages/utils/src/services/logger/index.spec.ts +0 -65
  461. package/packages/utils/src/services/lrsGateway/README.md +0 -5
  462. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
  463. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
  464. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
  465. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
  466. package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
  467. package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
  468. package/packages/utils/src/services/lrsGateway/index.ts +0 -257
  469. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
  470. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
  471. package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
  472. package/packages/utils/src/services/postgresConnection/index.ts +0 -84
  473. package/packages/utils/src/services/searchProvider/README.md +0 -3
  474. package/packages/utils/src/services/searchProvider/index.ts +0 -59
  475. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
  476. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
  477. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
  478. package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
  479. package/packages/utils/tsconfig.json +0 -31
  480. package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
  481. package/packages/utils/tsconfig.without-specs.esm.json +0 -7
  482. package/packages/utils/tsconfig.without-specs.json +0 -6
  483. package/scripts/build.bash +0 -24
  484. package/scripts/ci.bash +0 -10
  485. package/scripts/start.bash +0 -29
  486. /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
  487. /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
  488. /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
  489. /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
  490. /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
  491. /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
  492. /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
  493. /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
  494. /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
  495. /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
  496. /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
  497. /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
  498. /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
  499. /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
  500. /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
  501. /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
  502. /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
  503. /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
  504. /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
  505. /package/{packages/utils/script → script}/bin/which.bash +0 -0
  506. /package/{packages/utils/script → script}/bin-entry.bash +0 -0
  507. /package/{packages/utils/script → script}/build.bash +0 -0
@@ -0,0 +1,25 @@
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 {};
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fileSystemVersionedDocumentStore = void 0;
4
+ const fileSystemAssert_1 = require("../fileSystemAssert");
5
+ const file_system_1 = require("../unversioned/file-system");
6
+ const PAGE_LIMIT = 5;
7
+ const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, options) => {
8
+ var _a;
9
+ const skipAssert = (_a = options === null || options === void 0 ? void 0 : options.skipAssert) !== null && _a !== void 0 ? _a : false;
10
+ const unversionedDocuments = (0, file_system_1.fileSystemUnversionedDocumentStore)(initializer)()(configProvider)({}, 'id', { skipAssert });
11
+ return {
12
+ loadAllDocumentsTheBadWay: () => {
13
+ return unversionedDocuments.loadAllDocumentsTheBadWay().then(documents => documents.map(document => {
14
+ return document.items[document.items.length - 1];
15
+ }));
16
+ },
17
+ getVersions: async (id, startVersion) => {
18
+ if (!skipAssert)
19
+ (0, fileSystemAssert_1.assertNoUndefined)(id, ['id']);
20
+ const item = await unversionedDocuments.getItem(id);
21
+ const versions = item === null || item === void 0 ? void 0 : item.items.reverse();
22
+ if (!versions) {
23
+ return undefined;
24
+ }
25
+ const startIndex = startVersion ? versions.findIndex(version => version.timestamp === startVersion) + 1 : 0;
26
+ const items = versions.slice(startIndex, startIndex + PAGE_LIMIT);
27
+ const hasMore = (startIndex + 5) < versions.length;
28
+ return {
29
+ items,
30
+ nextPageToken: hasMore ? items[items.length - 1].timestamp : undefined
31
+ };
32
+ },
33
+ getItem: async (id, timestamp) => {
34
+ if (!skipAssert)
35
+ (0, fileSystemAssert_1.assertNoUndefined)(id, ['id']);
36
+ const item = await unversionedDocuments.getItem(id);
37
+ if (timestamp) {
38
+ return item === null || item === void 0 ? void 0 : item.items.find(version => version.timestamp === timestamp);
39
+ }
40
+ return item ? item.items[item.items.length - 1] : undefined;
41
+ },
42
+ prepareItem: async (item, ...authorArgs) => {
43
+ // this getAuthor type is terrible
44
+ const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
45
+ const timestamp = new Date().getTime();
46
+ return {
47
+ document: { ...item, timestamp, author },
48
+ save: async (changes) => {
49
+ var _a;
50
+ const document = { ...item, ...changes, timestamp, author };
51
+ if (!skipAssert)
52
+ (0, fileSystemAssert_1.assertNoUndefined)(document);
53
+ const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
54
+ const updated = { ...container, items: [...container.items, document] };
55
+ await unversionedDocuments.putItem(updated);
56
+ return document;
57
+ }
58
+ };
59
+ },
60
+ putItem: async (item, ...authorArgs) => {
61
+ var _a;
62
+ const author = (options === null || options === void 0 ? void 0 : options.getAuthor) ? await options.getAuthor(...authorArgs) : authorArgs[0];
63
+ const document = { ...item, timestamp: new Date().getTime(), author };
64
+ if (!skipAssert)
65
+ (0, fileSystemAssert_1.assertNoUndefined)(document);
66
+ const container = (_a = await unversionedDocuments.getItem(document[hashKey])) !== null && _a !== void 0 ? _a : { id: document[hashKey], items: [] };
67
+ const updated = { ...container, items: [...container.items, document] };
68
+ await unversionedDocuments.putItem(updated);
69
+ return document;
70
+ },
71
+ };
72
+ };
73
+ exports.fileSystemVersionedDocumentStore = fileSystemVersionedDocumentStore;
@@ -0,0 +1,17 @@
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;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,67 @@
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 {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.exercisesGateway = void 0;
37
+ const queryString = __importStar(require("query-string"));
38
+ const __1 = require("../..");
39
+ const assertions_1 = require("../../assertions");
40
+ const config_1 = require("../../config");
41
+ const guards_1 = require("../../guards");
42
+ const routing_1 = require("../../routing");
43
+ const exercisesGateway = (initializer) => (configProvider) => {
44
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'exercises')];
45
+ const exercisesHost = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.exercisesHost));
46
+ const exercisesAuthToken = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.exercisesAuthToken));
47
+ const defaultCorrectness = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.defaultCorrectness || ''));
48
+ const doDefaultCorrectness = async (exercise) => {
49
+ if (await defaultCorrectness() !== 'true') {
50
+ return exercise;
51
+ }
52
+ for (const question of exercise.questions) {
53
+ const existingCorrect = question.answers.find(answer => answer.correctness !== undefined);
54
+ if (question.answers.length < 1 || existingCorrect) {
55
+ continue;
56
+ }
57
+ const defaultCorrectIndex = question.id % question.answers.length;
58
+ const defaultCorrect = question.answers[defaultCorrectIndex];
59
+ const defaultHint = `<em>random default: the correct answer is ${defaultCorrect.id}: ${defaultCorrect.content_html.slice(0, 20)}</em>`;
60
+ question.stem_html += `\n<br>${defaultHint}`;
61
+ question.collaborator_solutions = [
62
+ { solution_type: 'detailed', images: [], content_html: defaultHint }
63
+ ];
64
+ for (let index = 0; index < question.answers.length; index++) {
65
+ const answer = question.answers[index];
66
+ answer.correctness = defaultCorrectIndex === index ? '1.0' : '0.0';
67
+ answer.feedback_html = defaultCorrectIndex === index ? 'This is the good one!' : defaultHint;
68
+ }
69
+ }
70
+ return exercise;
71
+ };
72
+ return (_) => {
73
+ const request = async (method, path, query = undefined) => {
74
+ const host = (await exercisesHost()).replace(/\/+$/, '');
75
+ const baseUrl = `${host}/api/${path}`;
76
+ const url = query ? `${baseUrl}?${queryString.stringify(query)}` : baseUrl;
77
+ return initializer.fetch(url, {
78
+ headers: {
79
+ Authorization: `Bearer ${await exercisesAuthToken()}`,
80
+ },
81
+ method,
82
+ });
83
+ };
84
+ const searchDigest = async (query, page = 1, per_page = 100) => {
85
+ const response = await request(routing_1.METHOD.HEAD, 'exercises', { query, page, per_page });
86
+ return (0, assertions_1.assertString)(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint HEAD did not return an X-Digest header');
87
+ };
88
+ const search = async (query, page = 1, per_page = 100) => {
89
+ const response = await request(routing_1.METHOD.GET, 'exercises', { query, page, per_page });
90
+ const digest = (0, assertions_1.assertString)(response.headers.get('X-Digest'), 'OpenStax Exercises search endpoint GET did not return an X-Digest header');
91
+ const { items, total_count } = await response.json();
92
+ return { digest, items: await Promise.all(items.map(doDefaultCorrectness)), total_count };
93
+ };
94
+ const get = async (uuid) => {
95
+ const response = await request(routing_1.METHOD.GET, `exercises/${uuid}`);
96
+ return response.status === 404
97
+ ? undefined
98
+ : response.json().then(doDefaultCorrectness);
99
+ };
100
+ return {
101
+ searchDigest,
102
+ get,
103
+ search,
104
+ };
105
+ };
106
+ };
107
+ exports.exercisesGateway = exercisesGateway;
@@ -0,0 +1,30 @@
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;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFileOrFolder = exports.isFolderValue = exports.isFileValue = void 0;
4
+ const guards_1 = require("../../guards");
5
+ const isFileValue = (thing) => (0, guards_1.isPlainObject)(thing)
6
+ && Object.keys(thing).every(key => ['dataType', 'path', 'label', 'mimeType'].includes(key))
7
+ && thing.dataType === 'file'
8
+ && typeof thing.mimeType === 'string'
9
+ && typeof thing.path === 'string'
10
+ && typeof thing.label === 'string';
11
+ exports.isFileValue = isFileValue;
12
+ const isFolderValue = (thing) => (0, guards_1.isPlainObject)(thing)
13
+ && Object.keys(thing).every(key => ['dataType', 'files'].includes(key))
14
+ && thing.dataType === 'folder'
15
+ && thing.files instanceof Array
16
+ && thing.files.every(exports.isFileValue);
17
+ exports.isFolderValue = isFolderValue;
18
+ const isFileOrFolder = (thing) => (0, exports.isFileValue)(thing) || (0, exports.isFolderValue)(thing);
19
+ exports.isFileOrFolder = isFileOrFolder;
@@ -0,0 +1,13 @@
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 {};
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.localFileServer = void 0;
7
+ /* cspell:ignore originalname */
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const https_1 = __importDefault(require("https"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const cors_1 = __importDefault(require("cors"));
13
+ const express_1 = __importDefault(require("express"));
14
+ const multer_1 = __importDefault(require("multer"));
15
+ const uuid_1 = require("uuid");
16
+ const assertions_1 = require("../../assertions");
17
+ const config_1 = require("../../config");
18
+ const guards_1 = require("../../guards");
19
+ const helpers_1 = require("../../misc/helpers");
20
+ /* istanbul ignore next */
21
+ const startServer = (0, helpers_1.memoize)((port, uploadDir) => {
22
+ // TODO - re-evaluate the `preservePath` behavior to match whatever s3 does
23
+ const upload = (0, multer_1.default)({ dest: uploadDir, preservePath: true });
24
+ const fileServerApp = (0, express_1.default)();
25
+ fileServerApp.use((0, cors_1.default)());
26
+ fileServerApp.use(express_1.default.static(uploadDir));
27
+ fileServerApp.post('/', upload.single('file'), async (req, res) => {
28
+ const file = req.file;
29
+ if (!file) {
30
+ return res.status(400).send({ message: 'file is required' });
31
+ }
32
+ const destinationName = req.body.key.replace('${filename}', file.originalname);
33
+ const destinationPath = path_1.default.join(uploadDir, destinationName);
34
+ const destinationDirectory = path_1.default.dirname(destinationPath);
35
+ await fs_1.default.promises.mkdir(destinationDirectory, { recursive: true });
36
+ await fs_1.default.promises.rename(file.path, destinationPath);
37
+ res.status(201).send();
38
+ });
39
+ const server = https_1.default.createServer({
40
+ key: fs_1.default.readFileSync((0, assertions_1.assertString)(process.env.SSL_KEY_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
41
+ cert: fs_1.default.readFileSync((0, assertions_1.assertString)(process.env.SSL_CRT_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
42
+ }, fileServerApp);
43
+ server.once('error', function (err) {
44
+ if (err.code === 'EADDRINUSE') {
45
+ // when the local dev server reloads files on every request it doesn't
46
+ // actually tear down the old modules, so this server only starts on the
47
+ // first execution and changes in its code will not be reloaded
48
+ return;
49
+ }
50
+ throw err;
51
+ });
52
+ server.listen(port);
53
+ return true;
54
+ });
55
+ const localFileServer = (initializer) => (configProvider) => {
56
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'local')];
57
+ const port = (0, config_1.resolveConfigValue)(config.port || '');
58
+ const host = (0, config_1.resolveConfigValue)(config.host || '');
59
+ const storagePrefix = (0, config_1.resolveConfigValue)(config.storagePrefix);
60
+ const fileDir = storagePrefix.then((prefix) => path_1.default.join(initializer.dataDir, prefix));
61
+ Promise.all([port, fileDir])
62
+ .then(([port, fileDir]) => port && startServer(port, fileDir));
63
+ const getSignedViewerUrl = async (source) => {
64
+ return `https://${await host}:${await port}/${source.path}`;
65
+ };
66
+ const getPublicViewerUrl = async (source) => {
67
+ return `https://${await host}:${await port}/${source.path}`;
68
+ };
69
+ const getFileContent = async (source) => {
70
+ const filePath = path_1.default.join(await fileDir, source.path);
71
+ return fs_1.default.promises.readFile(filePath);
72
+ };
73
+ const putFileContent = async (source, content) => {
74
+ const filePath = path_1.default.join(await fileDir, source.path);
75
+ const directory = path_1.default.dirname(filePath);
76
+ await fs_1.default.promises.mkdir(directory, { recursive: true });
77
+ await fs_1.default.promises.writeFile(filePath, content);
78
+ return source;
79
+ };
80
+ const getSignedFileUploadConfig = async () => {
81
+ const prefix = 'uploads/' + (0, uuid_1.v4)();
82
+ return {
83
+ url: `https://${await host}:${await port}/`,
84
+ payload: {
85
+ key: prefix + '/${filename}',
86
+ }
87
+ };
88
+ };
89
+ const copyFileTo = async (source, destinationPath) => {
90
+ const sourcePath = path_1.default.join(await fileDir, source.path);
91
+ const destPath = path_1.default.join(await fileDir, destinationPath);
92
+ const destDirectory = path_1.default.dirname(destPath);
93
+ await fs_1.default.promises.mkdir(destDirectory, { recursive: true });
94
+ await fs_1.default.promises.copyFile(sourcePath, destPath);
95
+ return {
96
+ ...source,
97
+ path: destinationPath
98
+ };
99
+ };
100
+ const copyFileToDirectory = async (source, destination) => {
101
+ const destinationPath = path_1.default.join(destination, source.label);
102
+ return copyFileTo(source, destinationPath);
103
+ };
104
+ const isTemporaryUpload = (source) => {
105
+ return source.path.indexOf('uploads/') === 0;
106
+ };
107
+ const getFileChecksum = async (source) => {
108
+ const filePath = path_1.default.join(await fileDir, source.path);
109
+ const fileContent = await fs_1.default.promises.readFile(filePath);
110
+ return crypto_1.default.createHash('md5').update(fileContent).digest('hex');
111
+ };
112
+ const filesEqual = async (sourceA, sourceB) => {
113
+ const [aSum, bSum] = await Promise.all([
114
+ getFileChecksum(sourceA),
115
+ getFileChecksum(sourceB)
116
+ ]);
117
+ return aSum === bSum;
118
+ };
119
+ return {
120
+ getSignedViewerUrl,
121
+ getPublicViewerUrl,
122
+ getFileContent,
123
+ putFileContent,
124
+ getSignedFileUploadConfig,
125
+ copyFileTo,
126
+ copyFileToDirectory,
127
+ isTemporaryUpload,
128
+ getFileChecksum,
129
+ filesEqual,
130
+ };
131
+ };
132
+ exports.localFileServer = localFileServer;
@@ -0,0 +1,14 @@
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 {};
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.s3FileServer = void 0;
7
+ /* cspell:ignore presigner */
8
+ const path_1 = __importDefault(require("path"));
9
+ const client_s3_1 = require("@aws-sdk/client-s3");
10
+ const s3_presigned_post_1 = require("@aws-sdk/s3-presigned-post");
11
+ const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
12
+ const uuid_1 = require("uuid");
13
+ const __1 = require("../..");
14
+ const assertions_1 = require("../../assertions");
15
+ const config_1 = require("../../config");
16
+ const guards_1 = require("../../guards");
17
+ const s3FileServer = (initializer) => (configProvider) => {
18
+ const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'deployed')];
19
+ const bucketName = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketName));
20
+ const bucketRegion = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.bucketRegion));
21
+ const publicViewerDomain = (0, __1.once)(() => 'publicViewerDomain' in config && config.publicViewerDomain
22
+ ? (0, config_1.resolveConfigValue)(config.publicViewerDomain)
23
+ : undefined);
24
+ const s3Service = (0, __1.once)(async () => {
25
+ var _a, _b;
26
+ const args = { apiVersion: '2012-08-10', region: await bucketRegion() };
27
+ return (_b = (_a = initializer.getS3Client) === null || _a === void 0 ? void 0 : _a.call(initializer, args)) !== null && _b !== void 0 ? _b : new client_s3_1.S3Client(args);
28
+ });
29
+ /*
30
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html
31
+ */
32
+ const getSignedViewerUrl = async (source) => {
33
+ const bucket = (await bucketName());
34
+ const command = new client_s3_1.GetObjectCommand({ Bucket: bucket, Key: source.path });
35
+ return (0, s3_request_presigner_1.getSignedUrl)(await s3Service(), command, {
36
+ expiresIn: 3600, // 1 hour
37
+ });
38
+ };
39
+ const getPublicViewerUrl = async (source) => {
40
+ const host = (0, assertions_1.assertDefined)(await publicViewerDomain(), new Error(`Tried to get public viewer URL for ${source.path} but no publicViewerDomain configured`));
41
+ return `https://${host}/${source.path}`;
42
+ };
43
+ const getFileContent = async (source) => {
44
+ const bucket = await bucketName();
45
+ const command = new client_s3_1.GetObjectCommand({ Bucket: bucket, Key: source.path });
46
+ const response = await (await s3Service()).send(command);
47
+ return Buffer.from(await (0, assertions_1.assertDefined)(response.Body, new Error('Invalid Response from s3')).transformToByteArray());
48
+ };
49
+ const putFileContent = async (source, content) => {
50
+ const bucket = await bucketName();
51
+ const command = new client_s3_1.PutObjectCommand({
52
+ Bucket: bucket,
53
+ Key: source.path,
54
+ Body: content,
55
+ ContentType: source.mimeType,
56
+ });
57
+ await (await s3Service()).send(command);
58
+ return source;
59
+ };
60
+ /*
61
+ * https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/modules/_aws_sdk_s3_presigned_post.html
62
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/HTTPPOSTExamples.html
63
+ * https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html
64
+ */
65
+ const getSignedFileUploadConfig = async () => {
66
+ const prefix = 'uploads/' + (0, uuid_1.v4)();
67
+ const bucket = (await bucketName());
68
+ const Conditions = [
69
+ { acl: 'private' },
70
+ { bucket },
71
+ ['starts-with', '$key', prefix]
72
+ ];
73
+ const defaultFields = {
74
+ acl: 'private',
75
+ };
76
+ const { url, fields } = await (0, s3_presigned_post_1.createPresignedPost)(await s3Service(), {
77
+ Bucket: bucket,
78
+ Key: prefix + '/${filename}',
79
+ Conditions,
80
+ Fields: defaultFields,
81
+ Expires: 3600, // 1 hour
82
+ });
83
+ return {
84
+ url, payload: fields
85
+ };
86
+ };
87
+ const copyFileTo = async (source, destinationPath) => {
88
+ const bucket = (await bucketName());
89
+ const destinationPathWithoutLeadingSlash = destinationPath.replace(/^\//, '');
90
+ const command = new client_s3_1.CopyObjectCommand({
91
+ Bucket: bucket,
92
+ Key: destinationPathWithoutLeadingSlash,
93
+ CopySource: path_1.default.join(bucket, source.path),
94
+ });
95
+ await (await s3Service()).send(command);
96
+ return {
97
+ ...source,
98
+ path: destinationPathWithoutLeadingSlash
99
+ };
100
+ };
101
+ const copyFileToDirectory = async (source, destination) => {
102
+ const destinationPath = path_1.default.join(destination, source.label);
103
+ return copyFileTo(source, destinationPath);
104
+ };
105
+ const isTemporaryUpload = (source) => {
106
+ return source.path.indexOf('uploads/') === 0;
107
+ };
108
+ const getFileChecksum = async (source) => {
109
+ const bucket = (await bucketName());
110
+ const command = new client_s3_1.HeadObjectCommand({ Bucket: bucket, Key: source.path });
111
+ const response = await (await s3Service()).send(command);
112
+ return (0, assertions_1.assertDefined)(response.ETag);
113
+ };
114
+ const filesEqual = async (sourceA, sourceB) => {
115
+ const [aSum, bSum] = await Promise.all([getFileChecksum(sourceA), getFileChecksum(sourceB)]);
116
+ return aSum === bSum;
117
+ };
118
+ return {
119
+ getFileContent,
120
+ putFileContent,
121
+ getSignedViewerUrl,
122
+ getPublicViewerUrl,
123
+ getSignedFileUploadConfig,
124
+ copyFileTo,
125
+ copyFileToDirectory,
126
+ isTemporaryUpload,
127
+ getFileChecksum,
128
+ filesEqual,
129
+ };
130
+ };
131
+ exports.s3FileServer = s3FileServer;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLaunchVerifier = exports.createLaunchSigner = void 0;
4
+ var signer_1 = require("./signer");
5
+ Object.defineProperty(exports, "createLaunchSigner", { enumerable: true, get: function () { return signer_1.createLaunchSigner; } });
6
+ var verifier_1 = require("./verifier");
7
+ Object.defineProperty(exports, "createLaunchVerifier", { enumerable: true, get: function () { return verifier_1.createLaunchVerifier; } });