@openstax/ts-utils 1.33.1 → 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 (504) 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 -132
  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 -125
  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/bin/.init-params-script.bash.swp +0 -0
  483. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  500. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  501. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  502. /package/{script → packages/utils/script}/build.bash +0 -0
  503. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  504. /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
@@ -1,99 +0,0 @@
1
- import partition from 'lodash/fp/partition';
2
- import { roundToPrecision } from '../..';
3
- import { resolveAttemptInfo } from './attempt-utils';
4
- export const getRegistrationAttemptInfo = async (lrs, registration, options) => {
5
- const { currentPreference, ...xapiOptions } = options !== null && options !== void 0 ? options : {};
6
- const allStatements = await lrs.getAllXapiStatements({ ...xapiOptions, registration });
7
- // Partition statements for each user
8
- const statementsPerUser = {};
9
- allStatements.forEach((statement) => {
10
- var _a;
11
- // If we ever support accounts from different statement.actor.account.homePage, this method may need changes
12
- // (unless we can guarantee the statement.actor.account.name are unique)
13
- statementsPerUser[_a = statement.actor.account.name] || (statementsPerUser[_a] = []);
14
- statementsPerUser[statement.actor.account.name].push(statement);
15
- });
16
- const result = {};
17
- for (const [userUuid, userStatements] of Object.entries(statementsPerUser)) {
18
- result[userUuid] = resolveAttemptInfo(userStatements, { currentPreference });
19
- }
20
- return result;
21
- };
22
- // generates a payload that can be sent to the LMS, documentation here:
23
- // lti: http://www.imsglobal.org/spec/lti-ags/v2p0#score-publish-service
24
- // ltijs: https://cvmcosta.me/ltijs/#/grading
25
- // Note: "min" is currently completely ignored
26
- export const getScoreGrade = (score, options) => {
27
- const { raw, scaled, max } = score;
28
- const { maxScore, startedAt, submittedAt, userId } = options;
29
- const scoreMaximum = maxScore !== null && maxScore !== void 0 ? maxScore : 100;
30
- const scoreGiven = raw && max
31
- ? scoreMaximum / max * raw
32
- : scaled
33
- ? scaled * scoreMaximum
34
- : 0;
35
- const submission = {};
36
- if (startedAt) {
37
- submission.startedAt = startedAt;
38
- }
39
- if (submittedAt) {
40
- submission.submittedAt = submittedAt;
41
- }
42
- return {
43
- userId,
44
- activityProgress: submittedAt ? 'Completed' : 'Started',
45
- // canvas assumes that anything that isn't 'FullyGraded' requires manual grading and displays a "needs grading" icon.
46
- // if you warp your mind you can consider the portion of the assignment which is completed to be fully graded.
47
- gradingProgress: 'FullyGraded',
48
- scoreMaximum,
49
- scoreGiven: roundToPrecision(scoreGiven, -2),
50
- submission,
51
- };
52
- };
53
- // These methods assign 0's to incomplete activities
54
- const getCompletedActivityStateGradeAndProgress = ({ name, scoreMaximum, state, userId }) => {
55
- var _a, _b, _c, _d;
56
- return ({
57
- grade: getScoreGrade(((_b = (_a = state.currentAttemptCompleted) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.score) || {}, {
58
- maxScore: scoreMaximum,
59
- startedAt: (_c = state.currentAttempt) === null || _c === void 0 ? void 0 : _c.timestamp,
60
- submittedAt: (_d = state.currentAttemptCompleted) === null || _d === void 0 ? void 0 : _d.timestamp,
61
- userId,
62
- }),
63
- progress: {
64
- scaled: state.currentAttemptCompleted ? 1 : 0,
65
- },
66
- name,
67
- });
68
- };
69
- const getCompletedUserInfosGradeAndProgress = (infos, scoreMaximum) => infos.map(({ data, fullName, platformUserId }) => getCompletedActivityStateGradeAndProgress({
70
- name: fullName, scoreMaximum, userId: platformUserId, state: data
71
- }));
72
- export const getCurrentGrade = async (services, registration, options) => {
73
- var _a;
74
- const user = await services.ltiAuthProvider.getUser();
75
- if (!user) {
76
- return null;
77
- }
78
- const userId = (_a = options === null || options === void 0 ? void 0 : options.userId) !== null && _a !== void 0 ? _a : user.uuid;
79
- const { currentPreference, incompleteAttemptCallback, name, scoreMaximum } = options !== null && options !== void 0 ? options : {};
80
- const infoPerUser = await getRegistrationAttemptInfo(services.lrs, registration, { currentPreference });
81
- const userInfo = infoPerUser[user.uuid];
82
- if (!userInfo) {
83
- return getCompletedActivityStateGradeAndProgress({ name, scoreMaximum, state: resolveAttemptInfo([]), userId });
84
- }
85
- if (userInfo.currentAttemptCompleted || !incompleteAttemptCallback) {
86
- return getCompletedActivityStateGradeAndProgress({ name, scoreMaximum, state: userInfo, userId });
87
- }
88
- return incompleteAttemptCallback(userInfo);
89
- };
90
- export const getAssignmentGrades = async (services, assignmentIRI, registration, options) => {
91
- const { anyUser, currentPreference, incompleteAttemptsCallback, platformId, scoreMaximum, user } = options !== null && options !== void 0 ? options : {};
92
- const infoPerUserUuid = await getRegistrationAttemptInfo(services.lrs, registration, { activity: assignmentIRI, anyUser, currentPreference, user });
93
- const mappedInfo = await services.accountsGateway.mapUserUuids(infoPerUserUuid, platformId);
94
- if (!incompleteAttemptsCallback) {
95
- return getCompletedUserInfosGradeAndProgress(mappedInfo, scoreMaximum);
96
- }
97
- const [incompleteInfo, completedInfo] = partition((info) => info.data.currentAttemptCompleted === undefined)(mappedInfo);
98
- return getCompletedUserInfosGradeAndProgress(completedInfo, scoreMaximum).concat(await incompleteAttemptsCallback(incompleteInfo));
99
- };
@@ -1,28 +0,0 @@
1
- import postgres, { Sql } from 'postgres';
2
- import { ConfigProviderForConfig } from '../../config';
3
- import type { Logger } from '../logger';
4
- type Config = {
5
- host: string;
6
- readHost: string;
7
- port: string;
8
- database: string;
9
- username: string;
10
- password: string;
11
- };
12
- interface Initializer<C> {
13
- configSpace?: C;
14
- }
15
- export declare const postgresConnection: <C extends string = "local">(initializer: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => (services: {
16
- logger: Logger;
17
- }) => {
18
- db: () => Promise<postgres.Sql<{}>>;
19
- dbRead: () => Promise<postgres.Sql<{}>>;
20
- migrate: (migrations: Migration[]) => Promise<void>;
21
- down: () => Promise<void[]>;
22
- };
23
- export type PostgresConnection = ReturnType<ReturnType<ReturnType<typeof postgresConnection>>>;
24
- export interface Migration {
25
- name: string;
26
- up: (db: Sql) => Promise<void>;
27
- }
28
- export {};
@@ -1,58 +0,0 @@
1
- import postgres from 'postgres';
2
- import { assertNotNaN } from '../../assertions';
3
- import { resolveConfigValue } from '../../config';
4
- import { ifDefined } from '../../guards';
5
- import { once } from '../../misc/helpers';
6
- export const postgresConnection = (initializer) => (configProvider) => {
7
- const config = configProvider[ifDefined(initializer.configSpace, 'local')];
8
- const host = once(() => resolveConfigValue(config.host));
9
- const readHost = once(() => resolveConfigValue(config.readHost));
10
- const connectionOptions = once(async () => ({
11
- port: assertNotNaN(parseInt(await resolveConfigValue(config.port), 10), new Error('port must be a number')),
12
- database: await resolveConfigValue(config.database),
13
- username: await resolveConfigValue(config.username),
14
- password: await resolveConfigValue(config.password),
15
- transform: {
16
- column: { to: postgres.fromCamel, from: postgres.toCamel },
17
- },
18
- }));
19
- const connections = [];
20
- const sql = once(async () => {
21
- const options = await connectionOptions();
22
- const connection = postgres({ ...options, host: await host() });
23
- connections.push(connection);
24
- return connection;
25
- });
26
- const sqlRead = once(async () => {
27
- const options = await connectionOptions();
28
- const connection = postgres({ ...options, host: await readHost() });
29
- connections.push(connection);
30
- return connection;
31
- });
32
- return (services) => ({
33
- db: sql,
34
- dbRead: sqlRead,
35
- migrate: async (migrations) => {
36
- await migrate(services, await sql(), migrations);
37
- },
38
- down: () => Promise.all(connections.map(c => c.end()))
39
- });
40
- };
41
- async function migrate(services, db, migrations) {
42
- await db `
43
- CREATE TABLE IF NOT EXISTS migrations (
44
- id SERIAL PRIMARY KEY,
45
- name TEXT NOT NULL,
46
- ran_at TIMESTAMP NOT NULL DEFAULT NOW()
47
- )
48
- `;
49
- const ranMigrations = await db `SELECT name FROM migrations`;
50
- for (const migration of migrations) {
51
- if (ranMigrations.some(({ name }) => name === migration.name)) {
52
- continue;
53
- }
54
- services.logger.log(`Running migration ${migration.name}`);
55
- await migration.up(db);
56
- await db `INSERT INTO migrations (name) VALUES (${migration.name})`;
57
- }
58
- }
@@ -1,67 +0,0 @@
1
- export type FieldType = string | string[] | number | boolean;
2
- export type ESFilter = {
3
- terms: Record<string, FieldType>;
4
- } | {
5
- term: Record<string, FieldType>;
6
- } | {
7
- exists: {
8
- field: string;
9
- };
10
- } | {
11
- nested: {
12
- path: string;
13
- query: Filter;
14
- };
15
- } | {
16
- bool: BoolFilter;
17
- };
18
- export type Filter = {
19
- key: string;
20
- value: FieldType;
21
- } | ESFilter;
22
- export type BoolFilter = {
23
- must?: Filter[];
24
- must_not?: Filter[];
25
- should?: Filter[];
26
- filter?: Filter[];
27
- minimum_should_match?: number;
28
- };
29
- type Field = {
30
- key: string;
31
- type?: 'text';
32
- weight: number;
33
- } | {
34
- key: string;
35
- type: 'keyword';
36
- } | {
37
- key: string;
38
- type: 'boolean';
39
- };
40
- export interface IndexOptions<T> {
41
- body: T;
42
- id: string;
43
- }
44
- export type FieldMapping = {
45
- type: 'keyword' | 'text' | 'boolean';
46
- } | {
47
- type: 'date';
48
- format?: string;
49
- } | {
50
- type?: 'nested' | 'object';
51
- properties: Record<string, FieldMapping>;
52
- };
53
- export type FieldMappings = Record<string, FieldMapping>;
54
- export interface SearchOptions {
55
- page?: number;
56
- query: string | undefined;
57
- fields: Field[];
58
- filter?: Filter[];
59
- must?: Filter[];
60
- must_not?: Filter[];
61
- should?: Filter[];
62
- sort?: {
63
- key: string;
64
- order: 'asc' | 'desc';
65
- }[];
66
- }
67
- export {};
@@ -1 +0,0 @@
1
- export {};
@@ -1,20 +0,0 @@
1
- import { FieldMappings, IndexOptions, SearchOptions } from '.';
2
- export type Config<T> = {
3
- mappings: FieldMappings;
4
- store: {
5
- loadAllDocumentsTheBadWay: () => Promise<T[]>;
6
- };
7
- };
8
- export declare const memorySearchTheBadWay: () => <T>({ store, mappings }: Config<T>) => {
9
- deleteIndexIfExists: () => Promise<undefined>;
10
- ensureIndexCreated: () => Promise<undefined>;
11
- index: (_options: IndexOptions<T>) => Promise<undefined>;
12
- bulkIndex: (_items: IndexOptions<T>[]) => Promise<undefined>;
13
- search: (options: SearchOptions) => Promise<{
14
- items: T[];
15
- pageSize: number;
16
- currentPage: number;
17
- totalItems: number;
18
- totalPages: number;
19
- }>;
20
- };
@@ -1,187 +0,0 @@
1
- import { coerceArray } from '../..';
2
- import { InvalidRequestError } from '../../errors';
3
- import { isDefined } from '../../guards';
4
- const MIN_MATCH = 0.5;
5
- const MAX_RESULTS = 10;
6
- var MatchType;
7
- (function (MatchType) {
8
- MatchType[MatchType["Must"] = 0] = "Must";
9
- MatchType[MatchType["MustNot"] = 1] = "MustNot";
10
- MatchType[MatchType["Should"] = 2] = "Should";
11
- })(MatchType || (MatchType = {}));
12
- const resolveField = (context, field) => {
13
- const path = field.startsWith(context.scope + '.')
14
- ? field.slice(context.scope.length + 1)
15
- : field;
16
- return path.split('.').reduce((result, key) => {
17
- if (result === undefined) {
18
- throw new Error(`Key "${key}" not found in document resolving ${field}`);
19
- }
20
- return result[key];
21
- }, context.document);
22
- };
23
- const getFieldDefinition = (context, field) => {
24
- let current = context.fields;
25
- const parts = field.split('.');
26
- const head = parts.slice(0, -1);
27
- const tail = parts[parts.length - 1];
28
- for (const part of head) {
29
- const currentDefinition = current[part];
30
- if (!currentDefinition || !('properties' in currentDefinition)) {
31
- throw new Error(`Field "${field}" not found in mappings`);
32
- }
33
- current = currentDefinition.properties;
34
- }
35
- if (!current[tail]) {
36
- throw new Error(`Field "${field}" not found in mappings`);
37
- }
38
- return current[tail];
39
- };
40
- const getFieldType = (context, field) => {
41
- const definition = getFieldDefinition(context, field);
42
- return definition.type;
43
- };
44
- const matchNested = (context, nested) => {
45
- const nestedPath = nested.path;
46
- const nestedDocuments = resolveField(context, nestedPath);
47
- if (!Array.isArray(nestedDocuments)) {
48
- throw new InvalidRequestError(`Nested path "${nestedPath}" is not an array`);
49
- }
50
- return nestedDocuments.some(nestedDocument => matchClause({
51
- ...context,
52
- scope: nestedPath,
53
- document: nestedDocument
54
- }, nested.query));
55
- };
56
- const matchExists = (context, exists) => {
57
- const value = resolveField(context, exists.field);
58
- return value !== undefined && value !== null;
59
- };
60
- const matchTerms = (context, terms) => {
61
- for (const key in terms) {
62
- const docValues = coerceArray(resolveField(context, key));
63
- const coerceValue = getFieldType(context, key) === 'boolean'
64
- ? (input) => {
65
- if ([true, 'true', '1', 1].includes(input)) {
66
- return true;
67
- }
68
- if ([false, 'false', '0', 0, ''].includes(input)) {
69
- return false;
70
- }
71
- throw new InvalidRequestError('input is not a valid boolean filter');
72
- }
73
- : (x) => x;
74
- const hasMatch = coerceArray(terms[key]).map(coerceValue).some(v => docValues.includes(v));
75
- if (!hasMatch) {
76
- return false;
77
- }
78
- }
79
- return true;
80
- };
81
- const matchClause = (context, clause) => {
82
- const filter = ('key' in clause && 'value' in clause)
83
- ? { terms: { [clause.key]: clause.value } }
84
- : clause;
85
- if ('terms' in filter)
86
- return matchTerms(context, filter.terms);
87
- else if ('term' in filter)
88
- return matchTerms(context, filter.term);
89
- else if ('exists' in filter)
90
- return matchExists(context, filter.exists);
91
- else if ('bool' in filter)
92
- return matchBool(context, filter.bool);
93
- else if ('nested' in filter)
94
- return matchNested(context, filter.nested);
95
- else
96
- throw new InvalidRequestError('invalid filter type');
97
- };
98
- const matchFilters = (context, filters, matchType) => {
99
- for (const field of filters) {
100
- const hasMatch = matchClause(context, field);
101
- if ((matchType === MatchType.Must && !hasMatch) || (matchType === MatchType.MustNot && hasMatch)) {
102
- return false;
103
- }
104
- else if (matchType === MatchType.Should && hasMatch) {
105
- return true;
106
- }
107
- }
108
- return matchType !== MatchType.Should;
109
- };
110
- const matchBool = (context, filters) => {
111
- const { must_not, should, must, filter } = filters;
112
- if ((must === null || must === void 0 ? void 0 : must.length) && !matchFilters(context, must, MatchType.Must)) {
113
- return false;
114
- }
115
- if ((filter === null || filter === void 0 ? void 0 : filter.length) && !matchFilters(context, filter, MatchType.Must)) {
116
- return false;
117
- }
118
- if ((must_not === null || must_not === void 0 ? void 0 : must_not.length) && !matchFilters(context, must_not, MatchType.MustNot)) {
119
- return false;
120
- }
121
- if ((should === null || should === void 0 ? void 0 : should.length) && !matchFilters(context, should, MatchType.Should)) {
122
- return false;
123
- }
124
- return true;
125
- };
126
- export const memorySearchTheBadWay = () => ({ store, mappings }) => {
127
- return {
128
- // This method is intentionally stubbed because index deletion is not applicable for in-memory storage.
129
- deleteIndexIfExists: async () => undefined,
130
- ensureIndexCreated: async () => undefined,
131
- index: async (_options) => undefined,
132
- bulkIndex: async (_items) => undefined,
133
- search: async (options) => {
134
- const results = (await store.loadAllDocumentsTheBadWay())
135
- .map(document => {
136
- let weight = 0;
137
- if (options.query !== undefined) {
138
- for (const field of options.fields) {
139
- if (field.type !== undefined && field.type !== 'text') {
140
- continue;
141
- }
142
- const value = resolveField({ document, fields: mappings, scope: '' }, field.key);
143
- if (value === undefined || value === null) {
144
- continue;
145
- }
146
- if (typeof value === 'string') {
147
- if (value.toUpperCase().indexOf(options.query.toUpperCase()) !== -1) {
148
- weight += (1 * field.weight);
149
- }
150
- }
151
- else {
152
- throw new Error(`invalid value type when searching in field ${field.key.toString()}`);
153
- }
154
- }
155
- }
156
- if (!matchBool({ document, fields: mappings, scope: '' }, options)) {
157
- return undefined;
158
- }
159
- return { document, weight };
160
- })
161
- .filter(isDefined)
162
- .filter(r => !options.query || r.weight >= MIN_MATCH);
163
- results.sort((a, b) => {
164
- for (const sort of (options.sort || [])) {
165
- const aValue = resolveField({ document: a.document, fields: mappings, scope: '' }, sort.key);
166
- const bValue = resolveField({ document: b.document, fields: mappings, scope: '' }, sort.key);
167
- if (aValue < bValue) {
168
- return sort.order === 'asc' ? -1 : 1;
169
- }
170
- if (aValue > bValue) {
171
- return sort.order === 'asc' ? 1 : -1;
172
- }
173
- }
174
- return b.weight - a.weight;
175
- });
176
- const page = options.page || 1;
177
- const offset = (page - 1) * MAX_RESULTS;
178
- return {
179
- items: results.slice(offset, offset + MAX_RESULTS).map(r => r.document),
180
- pageSize: MAX_RESULTS,
181
- currentPage: page,
182
- totalItems: results.length,
183
- totalPages: Math.ceil(results.length / MAX_RESULTS)
184
- };
185
- },
186
- };
187
- };
@@ -1,28 +0,0 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { FieldMappings, IndexOptions, SearchOptions } from '.';
3
- export type Config = {
4
- node: string;
5
- region: string;
6
- };
7
- export interface Initializer<C> {
8
- configSpace?: C;
9
- }
10
- export type IndexConfig = {
11
- name: string;
12
- mappings: FieldMappings;
13
- pageSize?: number;
14
- };
15
- export declare const openSearchService: <C extends string = "deployed">(initializer?: Initializer<C>) => (configProvider: { [_key in C]: ConfigProviderForConfig<Config>; }) => <T>(indexConfig: IndexConfig) => {
16
- ensureIndexCreated: () => Promise<void>;
17
- deleteIndexIfExists: () => Promise<void>;
18
- index: (params: IndexOptions<T>) => Promise<void>;
19
- bulkIndex: (items: IndexOptions<T>[]) => Promise<void>;
20
- search: (options: SearchOptions) => Promise<{
21
- items: Exclude<T, undefined>[];
22
- pageSize: number;
23
- currentPage: number;
24
- totalItems: number;
25
- totalPages: number;
26
- }>;
27
- updateMappings: () => Promise<void>;
28
- };
@@ -1,150 +0,0 @@
1
- // cspell:ignore opensearch, Sigv
2
- import { defaultProvider } from '@aws-sdk/credential-provider-node';
3
- import { Client } from '@opensearch-project/opensearch';
4
- import { AwsSigv4Signer } from '@opensearch-project/opensearch/aws';
5
- import { resolveConfigValue } from '../../config';
6
- import { ifDefined, isDefined } from '../../guards';
7
- import { once } from '../../misc/helpers';
8
- const mapFilter = (filter) => {
9
- if ('key' in filter && 'value' in filter) {
10
- const { key } = filter;
11
- const values = filter.value instanceof Array ? filter.value : [filter.value];
12
- return { terms: { [key]: values } };
13
- }
14
- else {
15
- return filter;
16
- }
17
- };
18
- export const openSearchService = (initializer = {}) => (configProvider) => {
19
- const config = configProvider[ifDefined(initializer.configSpace, 'deployed')];
20
- const client = once(async () => new Client({
21
- ...AwsSigv4Signer({
22
- getCredentials: () => defaultProvider()(),
23
- region: await resolveConfigValue(config.region),
24
- service: 'es',
25
- }),
26
- maxRetries: 4, // default is 3
27
- requestTimeout: 5000, // default is 30000
28
- pingTimeout: 2000, // default is 30000
29
- node: await resolveConfigValue(config.node),
30
- }));
31
- return (indexConfig) => {
32
- const pageSize = indexConfig.pageSize || 10;
33
- const deleteIndexIfExists = async () => {
34
- const { indices } = await client();
35
- const index = indexConfig.name;
36
- const { body } = await indices.exists({ index });
37
- if (body) {
38
- await indices.delete({ index });
39
- }
40
- };
41
- const ensureIndexCreated = async () => {
42
- const { indices } = await client();
43
- const index = indexConfig.name;
44
- const { body } = await indices.exists({ index });
45
- if (!body) {
46
- await indices.create({
47
- index,
48
- body: {
49
- mappings: {
50
- dynamic: false,
51
- properties: indexConfig.mappings
52
- }
53
- }
54
- });
55
- }
56
- };
57
- const index = async (params) => {
58
- const openSearchClient = await client();
59
- await openSearchClient.index({
60
- index: indexConfig.name,
61
- body: params.body,
62
- id: params.id,
63
- refresh: true
64
- }, {
65
- requestTimeout: 10000,
66
- maxRetries: 1,
67
- });
68
- };
69
- const bulkIndex = async (items) => {
70
- const openSearchClient = await client();
71
- await openSearchClient.bulk({
72
- index: indexConfig.name,
73
- body: items.flatMap((item) => [
74
- { index: { _id: item.id } },
75
- item.body
76
- ]),
77
- refresh: true
78
- }, {
79
- requestTimeout: 10000,
80
- maxRetries: 1,
81
- });
82
- };
83
- const search = async (options) => {
84
- var _a;
85
- const body = {
86
- query: { bool: {} },
87
- track_total_hits: true,
88
- size: pageSize
89
- };
90
- if (options.query) {
91
- body.query.bool.must = [{
92
- multi_match: {
93
- fields: options.fields.map((field) => 'weight' in field ? `${field.key}^${field.weight}` : field.key),
94
- query: options.query
95
- }
96
- }];
97
- }
98
- const { must_not, should, must, filter } = options;
99
- if (filter && filter.length > 0) {
100
- body.query.bool.filter = filter.map(mapFilter);
101
- }
102
- if (must && must.length > 0) {
103
- (_a = body.query.bool).must || (_a.must = []);
104
- body.query.bool.must = body.query.bool.must.concat(must.map(mapFilter));
105
- }
106
- if (must_not && must_not.length > 0) {
107
- body.query.bool.must_not = must_not.map(mapFilter);
108
- }
109
- if (should && should.length > 0) {
110
- body.query.bool.should = should.map(mapFilter);
111
- body.query.bool.minimum_should_match = 1;
112
- }
113
- if (options.sort && options.sort.length > 0) {
114
- body.sort = options.sort.map(sort => ({
115
- [sort.key]: { order: sort.order }
116
- }));
117
- }
118
- if (options.page) {
119
- body.from = (options.page - 1) * pageSize;
120
- }
121
- const response = await (await client()).search({
122
- body,
123
- index: indexConfig.name
124
- });
125
- if (response.statusCode !== 200) {
126
- throw new Error(`Unexpected status code: ${response.statusCode} from OpenSearch`);
127
- }
128
- const hits = response.body.hits;
129
- const items = hits.hits.map((hit) => hit._source).filter(isDefined);
130
- const currentPage = options.page || 1;
131
- const { total } = hits;
132
- const totalItems = typeof total === 'number' ? total : total.value;
133
- const totalPages = Math.ceil(totalItems / pageSize) || 1;
134
- return { items, pageSize, currentPage, totalItems, totalPages };
135
- };
136
- const updateMappings = async () => {
137
- const { indices } = await client();
138
- await indices.putMapping({
139
- index: indexConfig.name,
140
- body: {
141
- properties: indexConfig.mappings
142
- }
143
- }, {
144
- requestTimeout: 10000,
145
- maxRetries: 1,
146
- });
147
- };
148
- return { ensureIndexCreated, deleteIndexIfExists, index, bulkIndex, search, updateMappings };
149
- };
150
- };