@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
@@ -1,629 +0,0 @@
1
- import { TextEncoder } from 'util';
2
- import { hashValue } from '../../..';
3
- import { fileSystemUnversionedDocumentStore } from './file-system';
4
-
5
- type TTestDocument = {
6
- coolId: string;
7
- counter?: number;
8
- name: string;
9
- };
10
-
11
- describe('fileSystemUnversionedDocumentStore', () => {
12
- const config = {fileSystem: {tableName: 'db'}};
13
- const middleware = {};
14
- let mkdirSpy: jest.SpyInstance;
15
- let readdirSpy: jest.SpyInstance;
16
- let readFileSpy: jest.SpyInstance;
17
- let writeFileSpy: jest.SpyInstance;
18
- let data: string[];
19
- let dataIndex: number;
20
- let mkdirError: Error | null = null;
21
- let readError: Error | null = null;
22
- let writeError: Error | null = null;
23
- let fs: Pick<typeof import('fs'), 'mkdir' | 'readdir' | 'readFile' | 'writeFile'>;
24
-
25
- let consoleError: jest.SpyInstance;
26
-
27
- beforeEach(() => {
28
- mkdirError = null;
29
- readError = null;
30
- writeError = null;
31
- data = [];
32
- dataIndex = 0;
33
-
34
- consoleError = jest.spyOn(console, 'error').mockImplementation(() => null);
35
-
36
- mkdirSpy = jest.fn()
37
- .mockImplementation((_dir, _options, cb) => cb(mkdirError));
38
- readdirSpy = jest.fn()
39
- .mockImplementation((_dir, cb) => cb(readError, ['123456.json']));
40
- readFileSpy = jest.fn().mockImplementation(
41
- (_file, cb) => cb(readError, Buffer.from(new TextEncoder().encode(data[dataIndex++]).buffer))
42
- );
43
- writeFileSpy = jest.fn()
44
- .mockImplementation((_file, _data, cb) => cb(writeError));
45
-
46
- fs = {mkdir: mkdirSpy, readdir: readdirSpy, readFile: readFileSpy, writeFile: writeFileSpy} as any;
47
- });
48
-
49
- afterEach(() => {
50
- jest.clearAllMocks();
51
- consoleError.mockRestore();
52
- });
53
-
54
- describe('loadAllDocumentsTheBadWay', () => {
55
- it('returns all records', async() => {
56
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
57
- data.push(JSON.stringify(testDoc));
58
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {skipAssert: true});
59
-
60
- expect(await store.loadAllDocumentsTheBadWay()).toEqual([testDoc]);
61
- });
62
-
63
- it('throws on mkdir error', async() => {
64
- mkdirError = new Error('no space left on device');
65
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {skipAssert: false});
66
- await expect(store.loadAllDocumentsTheBadWay()).rejects.toThrow(mkdirError);
67
- });
68
-
69
- it('throws on file read error', async() => {
70
- readError = new Error('foobar error');
71
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
72
- await expect(store.loadAllDocumentsTheBadWay()).rejects.toThrow(readError);
73
- });
74
-
75
- it('throws if data is invalid JSON', async() => {
76
- data.push('not json');
77
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
78
- await expect(store.loadAllDocumentsTheBadWay()).rejects.toThrow('Unexpected token');
79
- });
80
-
81
- it('throws if data is non-object JSON', async() => {
82
- data.push(JSON.stringify('asf'));
83
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
84
-
85
- await expect(store.getItem('my-document-id')).rejects.toThrow('unexpected non-object JSON');
86
- });
87
- });
88
-
89
- describe('getItemsByField', () => {
90
- it('gets items', async() => {
91
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
92
- data.push(JSON.stringify(testDoc));
93
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
94
-
95
- const result = await store.getItemsByField('name', 'my-doc');
96
- expect(result.items).toEqual([testDoc]);
97
- expect(result.nextPageToken).toBeUndefined();
98
- });
99
-
100
- it('gets a second page', async() => {
101
- const testDocs = Array.from({length: 15}, (_, i) => ({coolId: `my-document-id-${i}`, name: 'my-doc'}));
102
- data.push(...testDocs.map(doc => JSON.stringify(doc)));
103
- readdirSpy.mockImplementation((_dir, cb) => cb(readError, testDocs.map(doc => `${hashValue(doc.coolId)}.json`)));
104
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
105
-
106
- const page1 = await store.getItemsByField('name', 'my-doc');
107
- expect(page1.items).toHaveLength(10);
108
- expect(page1.nextPageToken).toBeDefined();
109
-
110
- dataIndex = 0; // reset the mock loader
111
-
112
- const page2 = await store.getItemsByField('name', 'my-doc', page1.nextPageToken);
113
- expect(page2.items).toHaveLength(5);
114
- expect(page2.nextPageToken).toBeUndefined();
115
- });
116
- });
117
-
118
- describe('batchGetItem', () => {
119
- it('allows loading records from multiple files', async() => {
120
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
121
- const testDoc2 = {coolId: 'my-document-id-2', name: 'my-doc-2'};
122
- data.push(JSON.stringify(testDoc));
123
- data.push(JSON.stringify(testDoc2));
124
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
125
-
126
- expect(await store.batchGetItem(['my-document-id', 'my-document-id-2'])).toEqual([testDoc, testDoc2]);
127
- });
128
-
129
- it('returns empty array for non-existent ids', async() => {
130
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
131
- const testDoc2 = {coolId: 'my-document-id-2', name: 'my-doc-2'};
132
- data.push(JSON.stringify(testDoc));
133
- data.push(JSON.stringify(testDoc2));
134
- readError = new Error('file not found');
135
- Object.defineProperty(readError, 'code', { value: 'ENOENT' });
136
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
137
- expect(await store.batchGetItem(['my-document-id', 'my-document-id-2'])).toEqual([]);
138
- });
139
-
140
- it('throws on file read error', async() => {
141
- readError = new Error('foobar error');
142
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
143
- await expect(store.batchGetItem(['my-document-id', 'my-document-id-2'])).rejects.toThrow(readError);
144
- });
145
-
146
- it('throws if data is invalid JSON', async() => {
147
- data.push('not json');
148
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
149
- await expect(store.batchGetItem(['my-document-id', 'my-document-id-2'])).rejects.toThrow('Unexpected token');
150
- });
151
-
152
- it('throws if data is non-object JSON', async() => {
153
- data.push(JSON.stringify('asf'));
154
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
155
-
156
- await expect(store.batchGetItem(['my-document-id', 'my-document-id-2'])).rejects.toThrow('unexpected non-object JSON');
157
- });
158
- });
159
-
160
- describe('getItem', () => {
161
- it('allows loading records from a file', async() => {
162
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
163
- data.push(JSON.stringify(testDoc));
164
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
165
-
166
- expect(await store.getItem('my-document-id')).toEqual(testDoc);
167
- });
168
-
169
- it('returns undefined for non-existent id', async() => {
170
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
171
- data.push(JSON.stringify(testDoc));
172
- readError = new Error('file not found');
173
- Object.defineProperty(readError, 'code', { value: 'ENOENT' });
174
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
175
- expect(await store.getItem('my-document')).toBeUndefined();
176
- });
177
-
178
- it('throws on file read error', async() => {
179
- readError = new Error('foobar error');
180
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
181
- await expect(store.getItem('my-document-id')).rejects.toThrow(readError);
182
- });
183
-
184
- it('throws if data is invalid JSON', async() => {
185
- data.push('not json');
186
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
187
- await expect(store.getItem('my-document-id')).rejects.toThrow('Unexpected token');
188
- });
189
-
190
- it('throws if data is non-object JSON', async() => {
191
- data.push(JSON.stringify('asf'));
192
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
193
-
194
- await expect(store.getItem('my-document-id')).rejects.toThrow('unexpected non-object JSON');
195
- });
196
- });
197
-
198
- describe('incrementItemAttribute', () => {
199
- it('increments the given attribute, starting from 0 if undefined', async() => {
200
- const testDoc = {coolId: 'my-document-id'};
201
- data.push(JSON.stringify(testDoc));
202
- data.push(JSON.stringify({...testDoc, counter: 1}));
203
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
204
-
205
- expect(await store.incrementItemAttribute('my-document-id', 'counter')).toBe(1);
206
- const testData = JSON.stringify({...testDoc, counter: 1}, null, 2);
207
- expect(writeFileSpy).toHaveBeenCalledWith(`file/path/to/db/${hashValue(testDoc.coolId)}.json`, testData, expect.anything());
208
- expect(await store.incrementItemAttribute('my-document-id', 'counter')).toBe(2);
209
- const testData2 = JSON.stringify({...testDoc, counter: 2}, null, 2);
210
- expect(writeFileSpy).toHaveBeenCalledWith(`file/path/to/db/${hashValue(testDoc.coolId)}.json`, testData2, expect.anything());
211
- });
212
-
213
- it('throws if the document does not exist', async() => {
214
- data.push('null');
215
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
216
- await expect(
217
- store.incrementItemAttribute('my-document-id', 'counter')
218
- ).rejects.toThrow('Item with coolId "my-document-id" does not exist');
219
- expect(writeFileSpy).not.toHaveBeenCalled();
220
- });
221
-
222
- it('throws on file write error', async() => {
223
- const testDoc = {coolId: 'my-document-id', counter: 41};
224
- data.push(JSON.stringify(testDoc));
225
- writeError = new Error('foobar error');
226
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
227
- await expect(store.incrementItemAttribute('my-document-id', 'counter')).rejects.toThrow(writeError);
228
- });
229
- });
230
-
231
- describe('patchItem', () => {
232
- beforeAll(() => {
233
- jest.useFakeTimers();
234
- jest.setSystemTime(new Date(2020, 6, 28));
235
- });
236
-
237
- afterAll(() => {
238
- jest.useRealTimers();
239
- });
240
-
241
- it('overwrites only the given attributes and returns updated document', async() => {
242
- const testDoc = {coolId: 'my-document-id', name: 'my-doc', counter: 42};
243
- const testDoc2 = {coolId: 'my-document-id', name: 'my-doc-2'};
244
- data.push(JSON.stringify(testDoc));
245
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
246
- const result = await store.patchItem(testDoc2);
247
- const testData = JSON.stringify({...testDoc2, counter: 42}, null, 2);
248
- expect(writeFileSpy).toHaveBeenCalledWith(`file/path/to/db/${hashValue(testDoc.coolId)}.json`, testData, expect.anything());
249
- expect(result).toEqual({...testDoc2, counter: 42});
250
- });
251
-
252
- it('throws if the key attribute is not provided', async() => {
253
- const testDoc = {name: 'my-doc'};
254
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
255
- await expect(store.patchItem(testDoc)).rejects.toThrow('Key attribute "coolId" is required for patchItem');
256
- });
257
-
258
- it('throws if there are no updates', async() => {
259
- const testDoc = {coolId: 'my-document-id'};
260
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
261
- await expect(store.patchItem(testDoc)).rejects.toThrow('No attributes to update');
262
- });
263
-
264
- it('throws if the document does not exist', async() => {
265
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
266
- data.push('null');
267
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
268
- await expect(store.patchItem(testDoc)).rejects.toThrow('Item with coolId "my-document-id" does not exist');
269
- expect(writeFileSpy).not.toHaveBeenCalled();
270
- });
271
-
272
- it('throws on file write error', async() => {
273
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
274
- data.push(JSON.stringify(testDoc));
275
- writeError = new Error('foobar error');
276
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
277
- await expect(store.patchItem(testDoc)).rejects.toThrow(writeError);
278
- });
279
- });
280
-
281
- describe('putItem', () => {
282
- beforeAll(() => {
283
- jest.useFakeTimers();
284
- jest.setSystemTime(new Date(2020, 6, 28));
285
- });
286
-
287
- afterAll(() => {
288
- jest.useRealTimers();
289
- });
290
-
291
- it('saves and returns new document', async() => {
292
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
293
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
294
- const result = await store.putItem(testDoc);
295
- const testData = JSON.stringify(testDoc, null, 2);
296
- expect(writeFileSpy).toHaveBeenCalledWith(`file/path/to/db/${hashValue(testDoc.coolId)}.json`, testData, expect.anything());
297
- expect(result).toEqual(testDoc);
298
- });
299
-
300
- it('overwrites and returns updated document', async() => {
301
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
302
- const testDoc2 = {coolId: 'my-document-id', name: 'my-doc-2'};
303
- data.push(JSON.stringify(testDoc));
304
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
305
- const result = await store.putItem(testDoc2);
306
- const testData = JSON.stringify(testDoc2, null, 2);
307
- expect(writeFileSpy).toHaveBeenCalledWith(`file/path/to/db/${hashValue(testDoc.coolId)}.json`, testData, expect.anything());
308
- expect(result).toEqual(testDoc2);
309
- });
310
-
311
- it('throws on file write error', async() => {
312
- writeError = new Error('foobar error');
313
- const testDoc = {coolId: 'my-document-id', name: 'my-doc'};
314
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
315
- await expect(store.putItem(testDoc)).rejects.toThrow(writeError);
316
- });
317
- });
318
-
319
- describe('createItem', () => {
320
- it('creates new file with document data', async() => {
321
- const testDoc = {coolId: 'new-document-id', name: 'new-doc'};
322
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
323
-
324
- readFileSpy.mockImplementation((_path, callback) => {
325
- const error = new Error('File not found');
326
- (error as any).code = 'ENOENT';
327
- callback(error);
328
- });
329
-
330
- const result = await store.createItem(testDoc);
331
-
332
- const expectedData = JSON.stringify(testDoc, null, 2);
333
- expect(writeFileSpy).toHaveBeenCalledWith(
334
- `file/path/to/db/${hashValue(testDoc.coolId)}.json`,
335
- expectedData,
336
- expect.anything()
337
- );
338
- expect(result).toEqual(testDoc);
339
- });
340
-
341
- it('throws ConflictError if file already exists', async() => {
342
- const testDoc = {coolId: 'existing-document-id', name: 'existing-doc'};
343
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
344
-
345
- readFileSpy.mockImplementation((_path, callback) => {
346
- callback(null, Buffer.from('{"coolId":"existing-document-id","name":"existing-doc"}'));
347
- });
348
-
349
- await expect(store.createItem(testDoc)).rejects.toThrow('Item with coolId "existing-document-id" already exists');
350
- });
351
-
352
- it('throws on read errors during existence check', async() => {
353
- const testDoc = {coolId: 'new-document-id', name: 'new-doc'};
354
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
355
-
356
- const readError = new Error('Permission denied');
357
- readFileSpy.mockImplementation((_path, callback) => {
358
- callback(readError);
359
- });
360
-
361
- await expect(store.createItem(testDoc)).rejects.toThrow('Permission denied');
362
- });
363
-
364
- it('throws on file write error', async() => {
365
- const testDoc = {coolId: 'new-document-id', name: 'new-doc'};
366
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
367
-
368
- readFileSpy.mockImplementation((_path, callback) => {
369
- const error = new Error('File not found');
370
- (error as any).code = 'ENOENT';
371
- callback(error);
372
- });
373
-
374
- writeError = new Error('Write failed');
375
-
376
- await expect(store.createItem(testDoc)).rejects.toThrow('Write failed');
377
- });
378
- });
379
-
380
- describe('batchCreateItem', () => {
381
- it('creates multiple new files with document data', async() => {
382
- const testDocs = [
383
- {coolId: 'new-document-1', name: 'new-doc-1'},
384
- {coolId: 'new-document-2', name: 'new-doc-2'},
385
- {coolId: 'new-document-3', name: 'new-doc-3'}
386
- ];
387
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
388
-
389
- readFileSpy.mockImplementation((_path, callback) => {
390
- const error = new Error('File not found');
391
- (error as any).code = 'ENOENT';
392
- callback(error);
393
- });
394
-
395
- const result = await store.batchCreateItem(testDocs);
396
-
397
- expect(writeFileSpy).toHaveBeenCalledTimes(3);
398
- testDocs.forEach((testDoc) => {
399
- const expectedData = JSON.stringify(testDoc, null, 2);
400
- expect(writeFileSpy).toHaveBeenCalledWith(
401
- `file/path/to/db/${hashValue(testDoc.coolId)}.json`,
402
- expectedData,
403
- expect.anything()
404
- );
405
- });
406
- expect(result).toEqual({ successful: testDocs, failed: [] });
407
- });
408
-
409
- it('handles empty array', async() => {
410
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
411
-
412
- const result = await store.batchCreateItem([]);
413
-
414
- expect(readFileSpy).not.toHaveBeenCalled();
415
- expect(writeFileSpy).not.toHaveBeenCalled();
416
- expect(result).toEqual({ successful: [], failed: [] });
417
- });
418
-
419
- it('returns successful and failed items when some already exist', async() => {
420
- const testDocs = [
421
- {coolId: 'new-document-1', name: 'new-doc-1'},
422
- {coolId: 'existing-document', name: 'existing-doc'},
423
- {coolId: 'new-document-3', name: 'new-doc-3'}
424
- ];
425
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
426
-
427
- readFileSpy
428
- .mockImplementationOnce((_path, callback) => {
429
- const error = new Error('File not found');
430
- (error as any).code = 'ENOENT';
431
- callback(error);
432
- })
433
- .mockImplementationOnce((_path, callback) => {
434
- callback(null, Buffer.from('{"coolId":"existing-document","name":"existing-doc"}'));
435
- })
436
- .mockImplementationOnce((_path, callback) => {
437
- const error = new Error('File not found');
438
- (error as any).code = 'ENOENT';
439
- callback(error);
440
- });
441
-
442
- const result = await store.batchCreateItem(testDocs);
443
-
444
- expect(result.successful).toEqual([testDocs[0], testDocs[2]]);
445
- expect(result.failed).toHaveLength(1);
446
- expect(result.failed[0].item).toEqual(testDocs[1]);
447
- expect(result.failed[0].error.message).toContain('Item with coolId "existing-document" already exists');
448
- });
449
-
450
- it('returns read errors in failed array', async() => {
451
- const testDocs = [{coolId: 'new-document-1', name: 'new-doc-1'}];
452
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
453
-
454
- const readError = new Error('Permission denied');
455
- readFileSpy.mockImplementation((_path, callback) => {
456
- callback(readError);
457
- });
458
-
459
- const result = await store.batchCreateItem(testDocs);
460
-
461
- expect(result.successful).toEqual([]);
462
- expect(result.failed).toHaveLength(1);
463
- expect(result.failed[0].item).toEqual(testDocs[0]);
464
- expect(result.failed[0].error.message).toBe('Permission denied');
465
- });
466
-
467
- it('returns write errors in failed array', async() => {
468
- const testDocs = [
469
- {coolId: 'new-document-1', name: 'new-doc-1'},
470
- {coolId: 'new-document-2', name: 'new-doc-2'}
471
- ];
472
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
473
-
474
- readFileSpy.mockImplementation((_path, callback) => {
475
- const error = new Error('File not found');
476
- (error as any).code = 'ENOENT';
477
- callback(error);
478
- });
479
-
480
- writeError = new Error('Write failed');
481
-
482
- const result = await store.batchCreateItem(testDocs);
483
-
484
- expect(result.successful).toEqual([]);
485
- expect(result.failed).toHaveLength(2);
486
- expect(result.failed[0].item).toEqual(testDocs[0]);
487
- expect(result.failed[0].error.message).toBe('Write failed');
488
- expect(result.failed[1].item).toEqual(testDocs[1]);
489
- expect(result.failed[1].error.message).toBe('Write failed');
490
- });
491
-
492
- it('processes single item', async() => {
493
- const testDoc = {coolId: 'new-document-1', name: 'new-doc-1'};
494
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
495
-
496
- readFileSpy.mockImplementation((_path, callback) => {
497
- const error = new Error('File not found');
498
- (error as any).code = 'ENOENT';
499
- callback(error);
500
- });
501
-
502
- const result = await store.batchCreateItem([testDoc]);
503
-
504
- expect(writeFileSpy).toHaveBeenCalledTimes(1);
505
- expect(result).toEqual({ successful: [testDoc], failed: [] });
506
- });
507
-
508
- it('ignores concurrency parameter for filesystem', async() => {
509
- const testDocs = [
510
- {coolId: 'new-document-1', name: 'new-doc-1'},
511
- {coolId: 'new-document-2', name: 'new-doc-2'}
512
- ];
513
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId');
514
-
515
- readFileSpy.mockImplementation((_path, callback) => {
516
- const error = new Error('File not found');
517
- (error as any).code = 'ENOENT';
518
- callback(error);
519
- });
520
-
521
- const result = await store.batchCreateItem(testDocs, 100); // High concurrency ignored
522
-
523
- expect(result).toEqual({ successful: testDocs, failed: [] });
524
- });
525
-
526
- it('calls batchAfterWrite instead of individual afterWrite', async() => {
527
- const afterWrite = jest.fn();
528
- const batchAfterWrite = jest.fn();
529
- const testDocs = [
530
- {coolId: 'new-document-1', name: 'new-doc-1'},
531
- {coolId: 'new-document-2', name: 'new-doc-2'}
532
- ];
533
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {afterWrite, batchAfterWrite});
534
-
535
- readFileSpy.mockImplementation((_path, callback) => {
536
- const error = new Error('File not found');
537
- (error as any).code = 'ENOENT';
538
- callback(error);
539
- });
540
-
541
- const result = await store.batchCreateItem(testDocs);
542
-
543
- // Should call batchAfterWrite once with all successful items
544
- expect(batchAfterWrite).toHaveBeenCalledTimes(1);
545
- expect(batchAfterWrite).toHaveBeenCalledWith(testDocs);
546
-
547
- // Should NOT call individual afterWrite when batchAfterWrite is defined
548
- expect(afterWrite).not.toHaveBeenCalled();
549
-
550
- expect(result).toEqual({ successful: testDocs, failed: [] });
551
- });
552
-
553
- it('calls batchAfterWrite only with successful items', async() => {
554
- const batchAfterWrite = jest.fn();
555
- const testDocs = [
556
- {coolId: 'new-document-1', name: 'new-doc-1'},
557
- {coolId: 'existing-document', name: 'existing-doc'},
558
- {coolId: 'new-document-3', name: 'new-doc-3'}
559
- ];
560
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {batchAfterWrite});
561
-
562
- readFileSpy
563
- .mockImplementationOnce((_path, callback) => {
564
- const error = new Error('File not found');
565
- (error as any).code = 'ENOENT';
566
- callback(error);
567
- })
568
- .mockImplementationOnce((_path, callback) => {
569
- callback(null, Buffer.from('{"coolId":"existing-document","name":"existing-doc"}'));
570
- })
571
- .mockImplementationOnce((_path, callback) => {
572
- const error = new Error('File not found');
573
- (error as any).code = 'ENOENT';
574
- callback(error);
575
- });
576
-
577
- const result = await store.batchCreateItem(testDocs);
578
-
579
- // Should call batchAfterWrite with only successful items
580
- expect(batchAfterWrite).toHaveBeenCalledTimes(1);
581
- expect(batchAfterWrite).toHaveBeenCalledWith([testDocs[0], testDocs[2]]);
582
-
583
- expect(result.successful).toEqual([testDocs[0], testDocs[2]]);
584
- expect(result.failed).toHaveLength(1);
585
- });
586
-
587
- it('does not call batchAfterWrite if no items succeed', async() => {
588
- const batchAfterWrite = jest.fn();
589
- const testDocs = [{coolId: 'existing-document', name: 'existing-doc'}];
590
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {batchAfterWrite});
591
-
592
- readFileSpy.mockImplementation((_path, callback) => {
593
- callback(null, Buffer.from('{"coolId":"existing-document","name":"existing-doc"}'));
594
- });
595
-
596
- const result = await store.batchCreateItem(testDocs);
597
-
598
- // Should NOT call batchAfterWrite when no items succeed
599
- expect(batchAfterWrite).not.toHaveBeenCalled();
600
-
601
- expect(result.successful).toEqual([]);
602
- expect(result.failed).toHaveLength(1);
603
- });
604
-
605
- it('falls back to individual afterWrite when batchAfterWrite is not defined', async() => {
606
- const afterWrite = jest.fn();
607
- const testDocs = [
608
- {coolId: 'new-document-1', name: 'new-doc-1'},
609
- {coolId: 'new-document-2', name: 'new-doc-2'}
610
- ];
611
- const store = fileSystemUnversionedDocumentStore({fs, dataDir: 'file/path/to'})<TTestDocument>()(config)(middleware, 'coolId', {afterWrite});
612
-
613
- readFileSpy.mockImplementation((_path, callback) => {
614
- const error = new Error('File not found');
615
- (error as any).code = 'ENOENT';
616
- callback(error);
617
- });
618
-
619
- const result = await store.batchCreateItem(testDocs);
620
-
621
- // Should call afterWrite for each item when batchAfterWrite is not defined
622
- expect(afterWrite).toHaveBeenCalledTimes(2);
623
- expect(afterWrite).toHaveBeenCalledWith(testDocs[0]);
624
- expect(afterWrite).toHaveBeenCalledWith(testDocs[1]);
625
-
626
- expect(result).toEqual({ successful: testDocs, failed: [] });
627
- });
628
- });
629
- });