@openstax/ts-utils 1.34.0 → 1.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/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 +67 -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 +154 -0
  126. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -0
  127. package/{packages/utils/src/types.ts → dist/cjs/types.d.ts} +6 -34
  128. package/dist/cjs/types.js +2 -0
  129. package/dist/esm/assertions/index.d.ts +89 -0
  130. package/{packages/utils/src/assertions/index.ts → dist/esm/assertions/index.js} +49 -64
  131. package/dist/esm/aws/ssmService.d.ts +5 -0
  132. package/dist/esm/aws/ssmService.js +6 -0
  133. package/dist/esm/config/awsParameterConfig.d.ts +10 -0
  134. package/dist/esm/config/awsParameterConfig.js +22 -0
  135. package/dist/esm/config/envConfig.d.ts +24 -0
  136. package/dist/esm/config/envConfig.js +53 -0
  137. package/dist/esm/config/index.d.ts +48 -0
  138. package/dist/esm/config/index.js +17 -0
  139. package/dist/esm/config/lambdaParameterConfig.d.ts +12 -0
  140. package/dist/esm/config/lambdaParameterConfig.js +38 -0
  141. package/dist/esm/config/replaceConfig.d.ts +14 -0
  142. package/{packages/utils/src/config/replaceConfig.ts → dist/esm/config/replaceConfig.js} +6 -16
  143. package/dist/esm/config/resolveConfigValue.d.ts +5 -0
  144. package/dist/esm/config/resolveConfigValue.js +8 -0
  145. package/dist/esm/errors/index.d.ts +88 -0
  146. package/{packages/utils/src/errors/index.ts → dist/esm/errors/index.js} +41 -57
  147. package/dist/esm/fetch/fetchStatusRetry.d.ts +8 -0
  148. package/dist/esm/fetch/fetchStatusRetry.js +23 -0
  149. package/dist/esm/fetch/index.d.ts +64 -0
  150. package/dist/esm/fetch/index.js +46 -0
  151. package/dist/esm/guards/index.d.ts +38 -0
  152. package/dist/esm/guards/index.js +36 -0
  153. package/dist/esm/index.d.ts +4 -0
  154. package/dist/esm/index.js +4 -0
  155. package/dist/esm/middleware/apiErrorHandler.d.ts +24 -0
  156. package/dist/esm/middleware/apiErrorHandler.js +38 -0
  157. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +23 -0
  158. package/dist/esm/middleware/apiSlowResponseMiddleware.js +50 -0
  159. package/dist/esm/middleware/index.d.ts +47 -0
  160. package/dist/esm/middleware/index.js +44 -0
  161. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +20 -0
  162. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +40 -0
  163. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +4 -0
  164. package/dist/esm/middleware/throwNotFoundMiddleware.js +10 -0
  165. package/dist/esm/misc/hashValue.d.ts +10 -0
  166. package/dist/esm/misc/hashValue.js +13 -0
  167. package/dist/esm/misc/helpers.d.ts +124 -0
  168. package/dist/esm/misc/helpers.js +199 -0
  169. package/dist/esm/misc/merge.d.ts +21 -0
  170. package/dist/esm/misc/merge.js +40 -0
  171. package/dist/esm/misc/partitionSequence.d.ts +35 -0
  172. package/{packages/utils/src/misc/partitionSequence.ts → dist/esm/misc/partitionSequence.js} +15 -23
  173. package/dist/esm/pagination/index.d.ts +91 -0
  174. package/dist/esm/pagination/index.js +77 -0
  175. package/dist/esm/routing/helpers.d.ts +57 -0
  176. package/{packages/utils/src/routing/helpers.ts → dist/esm/routing/helpers.js} +30 -42
  177. package/dist/esm/routing/index.d.ts +290 -0
  178. package/dist/esm/routing/index.js +246 -0
  179. package/dist/esm/routing/validators/zod.d.ts +4 -0
  180. package/dist/esm/routing/validators/zod.js +10 -0
  181. package/dist/esm/services/accountsGateway/index.d.ts +92 -0
  182. package/dist/esm/services/accountsGateway/index.js +131 -0
  183. package/dist/esm/services/apiGateway/index.d.ts +68 -0
  184. package/dist/esm/services/apiGateway/index.js +77 -0
  185. package/dist/esm/services/authProvider/browser.d.ts +40 -0
  186. package/dist/esm/services/authProvider/browser.js +151 -0
  187. package/dist/esm/services/authProvider/decryption.d.ts +19 -0
  188. package/dist/esm/services/authProvider/decryption.js +69 -0
  189. package/dist/esm/services/authProvider/index.d.ts +63 -0
  190. package/dist/esm/services/authProvider/index.js +26 -0
  191. package/dist/esm/services/authProvider/subrequest.d.ts +13 -0
  192. package/dist/esm/services/authProvider/subrequest.js +45 -0
  193. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +28 -0
  194. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +85 -0
  195. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +26 -0
  196. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +40 -0
  197. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +13 -0
  198. package/dist/esm/services/authProvider/utils/userRoleValidator.js +33 -0
  199. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +3 -0
  200. package/dist/esm/services/authProvider/utils/userSubrequest.js +6 -0
  201. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +10 -0
  202. package/dist/esm/services/documentStore/dynamoEncoding.js +45 -0
  203. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +1 -0
  204. package/dist/esm/services/documentStore/fileSystemAssert.js +10 -0
  205. package/dist/esm/services/documentStore/index.d.ts +14 -0
  206. package/dist/esm/services/documentStore/index.js +1 -0
  207. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +31 -0
  208. package/dist/esm/services/documentStore/unversioned/dynamodb.js +226 -0
  209. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +32 -0
  210. package/dist/esm/services/documentStore/unversioned/file-system.js +174 -0
  211. package/dist/esm/services/documentStore/unversioned/index.d.ts +2 -0
  212. package/dist/esm/services/documentStore/unversioned/index.js +1 -0
  213. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +25 -0
  214. package/dist/esm/services/documentStore/versioned/dynamodb.js +139 -0
  215. package/dist/esm/services/documentStore/versioned/file-system.d.ts +25 -0
  216. package/dist/esm/services/documentStore/versioned/file-system.js +69 -0
  217. package/dist/esm/services/documentStore/versioned/index.d.ts +17 -0
  218. package/dist/esm/services/documentStore/versioned/index.js +1 -0
  219. package/dist/esm/services/exercisesGateway/index.d.ts +67 -0
  220. package/dist/esm/services/exercisesGateway/index.js +70 -0
  221. package/dist/esm/services/fileServer/index.d.ts +30 -0
  222. package/dist/esm/services/fileServer/index.js +13 -0
  223. package/dist/esm/services/fileServer/localFileServer.d.ts +13 -0
  224. package/dist/esm/services/fileServer/localFileServer.js +125 -0
  225. package/dist/esm/services/fileServer/s3FileServer.d.ts +14 -0
  226. package/dist/esm/services/fileServer/s3FileServer.js +124 -0
  227. package/dist/esm/services/launchParams/index.d.ts +2 -0
  228. package/dist/esm/services/launchParams/index.js +2 -0
  229. package/dist/esm/services/launchParams/signer.d.ts +23 -0
  230. package/dist/esm/services/launchParams/signer.js +51 -0
  231. package/dist/esm/services/launchParams/verifier.d.ts +21 -0
  232. package/dist/esm/services/launchParams/verifier.js +92 -0
  233. package/dist/esm/services/logger/console.d.ts +4 -0
  234. package/{packages/utils/src/services/logger/console.ts → dist/esm/services/logger/console.js} +2 -5
  235. package/dist/esm/services/logger/index.d.ts +39 -0
  236. package/dist/esm/services/logger/index.js +27 -0
  237. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +5 -0
  238. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +14 -0
  239. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +72 -0
  240. package/dist/esm/services/lrsGateway/attempt-utils.js +261 -0
  241. package/dist/esm/services/lrsGateway/file-system.d.ts +15 -0
  242. package/dist/esm/services/lrsGateway/file-system.js +110 -0
  243. package/dist/esm/services/lrsGateway/index.d.ts +122 -0
  244. package/dist/esm/services/lrsGateway/index.js +111 -0
  245. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +71 -0
  246. package/dist/esm/services/lrsGateway/xapiUtils.js +134 -0
  247. package/dist/esm/services/postgresConnection/index.d.ts +28 -0
  248. package/dist/esm/services/postgresConnection/index.js +58 -0
  249. package/dist/esm/services/searchProvider/index.d.ts +67 -0
  250. package/dist/esm/services/searchProvider/index.js +1 -0
  251. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +20 -0
  252. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +187 -0
  253. package/dist/esm/services/searchProvider/openSearch.d.ts +28 -0
  254. package/dist/esm/services/searchProvider/openSearch.js +150 -0
  255. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -0
  256. package/dist/esm/types.d.ts +31 -0
  257. package/dist/esm/types.js +1 -0
  258. package/package.json +228 -12
  259. package/.cfnlintrc +0 -2
  260. package/.github/CODEOWNERS +0 -1
  261. package/.github/workflows/ci.yml +0 -36
  262. package/.github/workflows/lint.yml +0 -55
  263. package/.nvmrc +0 -1
  264. package/.syncignore +0 -4
  265. package/.syncpackrc +0 -18
  266. package/CONTRIBUTING.md +0 -96
  267. package/LICENSE +0 -661
  268. package/Procfile +0 -1
  269. package/app.json +0 -23
  270. package/cspell.json +0 -32
  271. package/deploy/constants.env +0 -21
  272. package/deploy/deploy.bash +0 -157
  273. package/deploy/deployment-alt-region.cfn.yml +0 -70
  274. package/deploy/deployment.cfn.yml +0 -650
  275. package/deploy/destroy-deployment.bash +0 -23
  276. package/deploy/shared.cfn.yml +0 -94
  277. package/docs/lambda-build.md +0 -35
  278. package/packages/frontend/README.md +0 -46
  279. package/packages/frontend/package.json +0 -101
  280. package/packages/frontend/public/favicon.ico +0 -0
  281. package/packages/frontend/public/index.html +0 -107
  282. package/packages/frontend/public/maintenance.html +0 -59
  283. package/packages/frontend/public/manifest.json +0 -15
  284. package/packages/frontend/public/robots.txt +0 -3
  285. package/packages/frontend/script/make-certificate.bash +0 -49
  286. package/packages/frontend/script/server/cli.js +0 -11
  287. package/packages/frontend/script/server/index.js +0 -47
  288. package/packages/frontend/script/start.bash +0 -22
  289. package/packages/frontend/script/trust-localhost.bash +0 -7
  290. package/packages/frontend/src/auth/authProvider.ts +0 -10
  291. package/packages/frontend/src/auth/useAuth.ts +0 -33
  292. package/packages/frontend/src/components/Pagination.tsx +0 -26
  293. package/packages/frontend/src/configProvider/index.ts +0 -53
  294. package/packages/frontend/src/configProvider/use.ts +0 -41
  295. package/packages/frontend/src/core/context/services.spec.tsx +0 -39
  296. package/packages/frontend/src/core/context/services.tsx +0 -16
  297. package/packages/frontend/src/core/index.spec.ts +0 -7
  298. package/packages/frontend/src/core/index.ts +0 -20
  299. package/packages/frontend/src/core/services.tsx +0 -14
  300. package/packages/frontend/src/core/types.ts +0 -3
  301. package/packages/frontend/src/example/api.ts +0 -28
  302. package/packages/frontend/src/example/components/Layout.tsx +0 -23
  303. package/packages/frontend/src/example/screens/Home.spec.tsx +0 -68
  304. package/packages/frontend/src/example/screens/Home.tsx +0 -78
  305. package/packages/frontend/src/example/screens/ThingList.spec.tsx +0 -60
  306. package/packages/frontend/src/example/screens/ThingList.tsx +0 -75
  307. package/packages/frontend/src/example/screens/ThingView.spec.tsx +0 -71
  308. package/packages/frontend/src/example/screens/ThingView.tsx +0 -47
  309. package/packages/frontend/src/example/screens/index.ts +0 -9
  310. package/packages/frontend/src/index.css +0 -159
  311. package/packages/frontend/src/index.tsx +0 -67
  312. package/packages/frontend/src/react-app-env.d.ts +0 -1
  313. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +0 -55
  314. package/packages/frontend/src/routing/components/RouteLink.tsx +0 -35
  315. package/packages/frontend/src/routing/middleware.ts +0 -6
  316. package/packages/frontend/src/routing/useQuery.ts +0 -14
  317. package/packages/frontend/src/setupProxy.js +0 -19
  318. package/packages/frontend/src/setupTests.ts +0 -9
  319. package/packages/frontend/src/tests/testServices.tsx +0 -23
  320. package/packages/frontend/tsconfig.json +0 -27
  321. package/packages/lambda/.eslintrc.js +0 -64
  322. package/packages/lambda/jest-global-setup.js +0 -3
  323. package/packages/lambda/jest-setup-after-env.js +0 -1
  324. package/packages/lambda/jest.config.js +0 -31
  325. package/packages/lambda/jest.resolver.js +0 -17
  326. package/packages/lambda/package.json +0 -68
  327. package/packages/lambda/script/build.bash +0 -19
  328. package/packages/lambda/script/bundle-functions.bash +0 -10
  329. package/packages/lambda/script/lambdaLocalProxy.js +0 -16
  330. package/packages/lambda/script/lambdaLocalProxy.spec.ts +0 -147
  331. package/packages/lambda/script/utils/getRouteData.ts +0 -7
  332. package/packages/lambda/script/utils/routeDataLoader.js +0 -8
  333. package/packages/lambda/script/utils/routeDataLoader.spec.ts +0 -8
  334. package/packages/lambda/src/functions/serviceApi/core/index.ts +0 -7
  335. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +0 -38
  336. package/packages/lambda/src/functions/serviceApi/core/request.ts +0 -42
  337. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +0 -7
  338. package/packages/lambda/src/functions/serviceApi/core/routes.ts +0 -10
  339. package/packages/lambda/src/functions/serviceApi/core/services.ts +0 -9
  340. package/packages/lambda/src/functions/serviceApi/core/types.ts +0 -13
  341. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +0 -4
  342. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +0 -48
  343. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +0 -58
  344. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +0 -36
  345. package/packages/lambda/src/functions/serviceApi/entry/local.ts +0 -71
  346. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +0 -16
  347. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +0 -41
  348. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +0 -78
  349. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +0 -70
  350. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +0 -306
  351. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +0 -176
  352. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +0 -263
  353. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +0 -134
  354. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +0 -23
  355. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +0 -32
  356. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +0 -10
  357. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +0 -7
  358. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +0 -13
  359. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +0 -23
  360. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +0 -9
  361. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +0 -9
  362. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +0 -12
  363. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +0 -21
  364. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +0 -21
  365. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +0 -18
  366. package/packages/lambda/tsconfig.json +0 -30
  367. package/packages/lambda/webpack.config.js +0 -97
  368. package/packages/utils/.eslintrc.js +0 -64
  369. package/packages/utils/README.md +0 -118
  370. package/packages/utils/jest-global-setup.js +0 -3
  371. package/packages/utils/jest.config.js +0 -25
  372. package/packages/utils/jest.resolver.js +0 -17
  373. package/packages/utils/package.json +0 -238
  374. package/packages/utils/src/assertions/index.spec.ts +0 -126
  375. package/packages/utils/src/aws/ssmService.ts +0 -7
  376. package/packages/utils/src/config/awsParameterConfig.ts +0 -24
  377. package/packages/utils/src/config/envConfig.ts +0 -58
  378. package/packages/utils/src/config/index.spec.ts +0 -165
  379. package/packages/utils/src/config/lambdaParameterConfig.ts +0 -49
  380. package/packages/utils/src/config/resolveConfigValue.ts +0 -10
  381. package/packages/utils/src/errors/index.spec.ts +0 -35
  382. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +0 -197
  383. package/packages/utils/src/fetch/fetchStatusRetry.ts +0 -33
  384. package/packages/utils/src/fetch/index.spec.ts +0 -34
  385. package/packages/utils/src/fetch/index.ts +0 -87
  386. package/packages/utils/src/guards/index.spec.ts +0 -58
  387. package/packages/utils/src/index.spec.ts +0 -471
  388. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +0 -65
  389. package/packages/utils/src/middleware/apiErrorHandler.ts +0 -67
  390. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +0 -184
  391. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +0 -71
  392. package/packages/utils/src/middleware/index.spec.ts +0 -99
  393. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +0 -103
  394. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +0 -52
  395. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +0 -20
  396. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +0 -11
  397. package/packages/utils/src/misc/hashValue.ts +0 -18
  398. package/packages/utils/src/misc/helpers.ts +0 -259
  399. package/packages/utils/src/misc/merge.ts +0 -48
  400. package/packages/utils/src/pagination/index.spec.ts +0 -150
  401. package/packages/utils/src/pagination/index.ts +0 -117
  402. package/packages/utils/src/routing/index.spec.ts +0 -553
  403. package/packages/utils/src/routing/index.ts +0 -424
  404. package/packages/utils/src/routing/validators/zod.spec.ts +0 -16
  405. package/packages/utils/src/routing/validators/zod.ts +0 -14
  406. package/packages/utils/src/services/accountsGateway/README.md +0 -3
  407. package/packages/utils/src/services/accountsGateway/index.spec.ts +0 -518
  408. package/packages/utils/src/services/accountsGateway/index.ts +0 -251
  409. package/packages/utils/src/services/apiGateway/README.md +0 -93
  410. package/packages/utils/src/services/apiGateway/index.spec.ts +0 -254
  411. package/packages/utils/src/services/apiGateway/index.ts +0 -189
  412. package/packages/utils/src/services/authProvider/README.md +0 -21
  413. package/packages/utils/src/services/authProvider/browser.spec.ts +0 -391
  414. package/packages/utils/src/services/authProvider/browser.ts +0 -209
  415. package/packages/utils/src/services/authProvider/decryption.spec.ts +0 -337
  416. package/packages/utils/src/services/authProvider/decryption.ts +0 -98
  417. package/packages/utils/src/services/authProvider/index.ts +0 -93
  418. package/packages/utils/src/services/authProvider/stub.spec.ts +0 -29
  419. package/packages/utils/src/services/authProvider/subrequest.spec.ts +0 -105
  420. package/packages/utils/src/services/authProvider/subrequest.ts +0 -68
  421. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +0 -128
  422. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +0 -106
  423. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +0 -26
  424. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +0 -57
  425. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +0 -135
  426. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +0 -49
  427. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +0 -26
  428. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +0 -10
  429. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +0 -57
  430. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +0 -43
  431. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +0 -10
  432. package/packages/utils/src/services/documentStore/unversioned/README.md +0 -13
  433. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +0 -859
  434. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +0 -243
  435. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +0 -629
  436. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +0 -194
  437. package/packages/utils/src/services/documentStore/versioned/README.md +0 -13
  438. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +0 -376
  439. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +0 -167
  440. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +0 -262
  441. package/packages/utils/src/services/documentStore/versioned/file-system.ts +0 -90
  442. package/packages/utils/src/services/documentStore/versioned/index.ts +0 -25
  443. package/packages/utils/src/services/exercisesGateway/README.md +0 -5
  444. package/packages/utils/src/services/exercisesGateway/index.spec.ts +0 -326
  445. package/packages/utils/src/services/exercisesGateway/index.ts +0 -163
  446. package/packages/utils/src/services/fileServer/index.spec.ts +0 -88
  447. package/packages/utils/src/services/fileServer/index.ts +0 -43
  448. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +0 -182
  449. package/packages/utils/src/services/fileServer/localFileServer.ts +0 -159
  450. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +0 -266
  451. package/packages/utils/src/services/fileServer/s3FileServer.ts +0 -155
  452. package/packages/utils/src/services/launchParams/index.spec.ts +0 -366
  453. package/packages/utils/src/services/launchParams/signer.ts +0 -73
  454. package/packages/utils/src/services/launchParams/verifier.ts +0 -120
  455. package/packages/utils/src/services/logger/console.spec.ts +0 -29
  456. package/packages/utils/src/services/logger/index.spec.ts +0 -65
  457. package/packages/utils/src/services/lrsGateway/README.md +0 -5
  458. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +0 -22
  459. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +0 -847
  460. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +0 -358
  461. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +0 -363
  462. package/packages/utils/src/services/lrsGateway/file-system.ts +0 -165
  463. package/packages/utils/src/services/lrsGateway/index.spec.ts +0 -194
  464. package/packages/utils/src/services/lrsGateway/index.ts +0 -257
  465. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +0 -887
  466. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +0 -262
  467. package/packages/utils/src/services/postgresConnection/index.spec.ts +0 -170
  468. package/packages/utils/src/services/postgresConnection/index.ts +0 -84
  469. package/packages/utils/src/services/searchProvider/README.md +0 -3
  470. package/packages/utils/src/services/searchProvider/index.ts +0 -59
  471. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +0 -526
  472. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +0 -223
  473. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +0 -926
  474. package/packages/utils/src/services/searchProvider/openSearch.ts +0 -195
  475. package/packages/utils/tsconfig.json +0 -31
  476. package/packages/utils/tsconfig.without-specs.cjs.json +0 -7
  477. package/packages/utils/tsconfig.without-specs.esm.json +0 -7
  478. package/packages/utils/tsconfig.without-specs.json +0 -6
  479. package/scripts/build.bash +0 -24
  480. package/scripts/ci.bash +0 -10
  481. package/scripts/start.bash +0 -29
  482. /package/{packages/utils/src/index.ts → dist/cjs/index.d.ts} +0 -0
  483. /package/{packages/utils/src/services/launchParams/index.ts → dist/cjs/services/launchParams/index.d.ts} +0 -0
  484. /package/{packages/utils/script → script}/bin/copy-from-template.bash +0 -0
  485. /package/{packages/utils/script → script}/bin/delete-stack.bash +0 -0
  486. /package/{packages/utils/script → script}/bin/deploy.bash +0 -0
  487. /package/{packages/utils/script → script}/bin/destroy-deployment.bash +0 -0
  488. /package/{packages/utils/script → script}/bin/empty-bucket.bash +0 -0
  489. /package/{packages/utils/script → script}/bin/get-arg.bash +0 -0
  490. /package/{packages/utils/script → script}/bin/get-deployed-environments.bash +0 -0
  491. /package/{packages/utils/script → script}/bin/get-env-param.bash +0 -0
  492. /package/{packages/utils/script → script}/bin/get-kwarg.bash +0 -0
  493. /package/{packages/utils/script → script}/bin/get-stack-param.bash +0 -0
  494. /package/{packages/utils/script → script}/bin/has-flag.bash +0 -0
  495. /package/{packages/utils/script → script}/bin/init-constants-script.bash +0 -0
  496. /package/{packages/utils/script → script}/bin/init-params-script.bash +0 -0
  497. /package/{packages/utils/script → script}/bin/stack-exists.bash +0 -0
  498. /package/{packages/utils/script → script}/bin/update-utils.bash +0 -0
  499. /package/{packages/utils/script → script}/bin/upload-pager-duty-endpoints.bash +0 -0
  500. /package/{packages/utils/script → script}/bin/upload-params.bash +0 -0
  501. /package/{packages/utils/script → script}/bin/which.bash +0 -0
  502. /package/{packages/utils/script → script}/bin-entry.bash +0 -0
  503. /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
- });