@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,182 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { localFileServer } from './localFileServer';
4
- import { FileServerAdapter } from '.';
5
-
6
- jest.mock('https', () => ({
7
- createServer: () => ({
8
- listen: jest.fn(),
9
- once: jest.fn(),
10
- })
11
- }));
12
-
13
- jest.mock('uuid', () => ({
14
- v4: () => 'test-uuid'
15
- }));
16
-
17
- describe('localFileServer', () => {
18
- const dataDir = path.join(__dirname, '../../..');
19
- let fileServer: FileServerAdapter;
20
-
21
- beforeEach(() => {
22
- Object.assign(process.env, {
23
- SSL_KEY_FILE: path.join(dataDir, 'dist', 'cjs/index.d.ts'),
24
- SSL_CRT_FILE: path.join(dataDir, 'dist', 'cjs/index.d.ts'),
25
- });
26
- fileServer = localFileServer({ configSpace: 'test', dataDir })({ test: { storagePrefix: 'dist', port: '8080', host: 'cool-host' } });
27
- });
28
-
29
- it('gets local file contents', async() => {
30
- const content = await fileServer.getFileContent({
31
- dataType: 'file',
32
- mimeType: 'text/typescript',
33
- path: 'cjs/index.d.ts',
34
- label: 'index.d.ts',
35
- });
36
- expect(content.toString()).toBeTruthy();
37
- });
38
-
39
- it('throws if the file does not exist', async() => {
40
- await expect(fileServer.getFileContent({
41
- dataType: 'file',
42
- mimeType: 'text/typescript',
43
- path: 'cjs/does-not-exist.d.ts',
44
- label: 'does-not-exist.d.ts',
45
- })).rejects.toThrow('ENOENT');
46
- });
47
-
48
- it('gets signed url', async() => {
49
- const url = await fileServer.getSignedViewerUrl({
50
- dataType: 'file',
51
- mimeType: 'text/typescript',
52
- path: 'cjs/index.d.ts',
53
- label: 'index.d.ts',
54
- });
55
- expect(url).toBe('https://cool-host:8080/cjs/index.d.ts');
56
- });
57
-
58
- it('gets public viewer url', async() => {
59
- const url = await fileServer.getPublicViewerUrl({
60
- dataType: 'file',
61
- mimeType: 'text/typescript',
62
- path: 'cjs/index.d.ts',
63
- label: 'index.d.ts',
64
- });
65
- expect(url).toBe('https://cool-host:8080/cjs/index.d.ts');
66
- });
67
-
68
- it('puts file content', async() => {
69
- fileServer = localFileServer({ configSpace: 'test', dataDir })({ test: { storagePrefix: 'dist' } });
70
- await expect(fileServer.putFileContent({
71
- dataType: 'file',
72
- mimeType: 'text/typescript',
73
- path: 'cjs/coolFile.d.ts',
74
- label: 'coolFile.d.ts',
75
- }, 'content')).resolves.not.toThrow();
76
- });
77
-
78
- it('gets signed upload config', async() => {
79
- const config = await fileServer.getSignedFileUploadConfig();
80
- expect(config).toEqual({
81
- url: 'https://cool-host:8080/',
82
- payload: { key: 'uploads/test-uuid/${filename}' }
83
- });
84
- });
85
-
86
- it('copies file to destination', async() => {
87
- // Create a source file to copy
88
- const sourceFile = {
89
- dataType: 'file' as const,
90
- mimeType: 'text/typescript',
91
- path: 'cjs/index.d.ts',
92
- label: 'index.d.ts',
93
- };
94
-
95
- const result = await fileServer.copyFileTo(sourceFile, 'cjs/copied-index.d.ts');
96
-
97
- expect(result).toEqual({
98
- dataType: 'file',
99
- mimeType: 'text/typescript',
100
- path: 'cjs/copied-index.d.ts',
101
- label: 'index.d.ts',
102
- });
103
-
104
- // Verify the file was actually copied
105
- const copiedFilePath = path.join(dataDir, 'dist', 'cjs/copied-index.d.ts');
106
- expect(fs.existsSync(copiedFilePath)).toBe(true);
107
-
108
- // Clean up
109
- await fs.promises.unlink(copiedFilePath);
110
- });
111
-
112
- it('copies file to directory', async() => {
113
- const sourceFile = {
114
- dataType: 'file' as const,
115
- mimeType: 'text/typescript',
116
- path: 'cjs/index.d.ts',
117
- label: 'index.d.ts',
118
- };
119
-
120
- const result = await fileServer.copyFileToDirectory(sourceFile, 'cjs/copied/');
121
-
122
- expect(result).toEqual({
123
- dataType: 'file',
124
- mimeType: 'text/typescript',
125
- path: 'cjs/copied/index.d.ts',
126
- label: 'index.d.ts',
127
- });
128
-
129
- // Clean up
130
- const copiedFilePath = path.join(dataDir, 'dist', 'cjs/copied/index.d.ts');
131
- if (fs.existsSync(copiedFilePath)) {
132
- await fs.promises.unlink(copiedFilePath);
133
- await fs.promises.rmdir(path.dirname(copiedFilePath));
134
- }
135
- });
136
-
137
- it('identifies temporary uploads', () => {
138
- expect(fileServer.isTemporaryUpload({
139
- dataType: 'file',
140
- mimeType: 'text/html',
141
- path: 'uploads/test-file.html',
142
- label: 'test-file.html',
143
- })).toBe(true);
144
-
145
- expect(fileServer.isTemporaryUpload({
146
- dataType: 'file',
147
- mimeType: 'text/html',
148
- path: 'permanent/test-file.html',
149
- label: 'test-file.html',
150
- })).toBe(false);
151
- });
152
-
153
- it('gets file checksum', async() => {
154
- const checksum = await fileServer.getFileChecksum({
155
- dataType: 'file',
156
- mimeType: 'text/typescript',
157
- path: 'cjs/index.d.ts',
158
- label: 'index.d.ts',
159
- });
160
- expect(typeof checksum).toBe('string');
161
- expect(checksum).toHaveLength(32); // MD5 hash length
162
- });
163
-
164
- it('compares files for equality', async() => {
165
- const fileA = {
166
- dataType: 'file' as const,
167
- mimeType: 'text/typescript',
168
- path: 'cjs/index.d.ts',
169
- label: 'index.d.ts',
170
- };
171
-
172
- const fileB = {
173
- dataType: 'file' as const,
174
- mimeType: 'text/typescript',
175
- path: 'cjs/index.d.ts', // Same file
176
- label: 'index.d.ts',
177
- };
178
-
179
- const equal = await fileServer.filesEqual(fileA, fileB);
180
- expect(equal).toBe(true);
181
- });
182
- });
@@ -1,159 +0,0 @@
1
- /* cspell:ignore originalname */
2
- import crypto from 'crypto';
3
- import fs from 'fs';
4
- import https from 'https';
5
- import path from 'path';
6
- import cors from 'cors';
7
- import express from 'express';
8
- import multer from 'multer';
9
- import { v4 as uuid } from 'uuid';
10
- import { assertString } from '../../assertions';
11
- import { ConfigProviderForConfig, resolveConfigValue } from '../../config';
12
- import { ifDefined } from '../../guards';
13
- import { memoize } from '../../misc/helpers';
14
- import { FileServerAdapter, FileValue } from '.';
15
-
16
- export type Config = {
17
- port?: string;
18
- host?: string;
19
- storagePrefix: string;
20
- };
21
- interface Initializer<C> {
22
- dataDir: string;
23
- configSpace?: C;
24
- }
25
-
26
- /* istanbul ignore next */
27
- const startServer = memoize((port: string, uploadDir: string) => {
28
- // TODO - re-evaluate the `preservePath` behavior to match whatever s3 does
29
- const upload = multer({dest: uploadDir, preservePath: true});
30
- const fileServerApp = express();
31
-
32
- fileServerApp.use(cors());
33
- fileServerApp.use(express.static(uploadDir));
34
- fileServerApp.post('/', upload.single('file'), async (req, res) => {
35
- const file = req.file;
36
-
37
- if (!file) {
38
- return res.status(400).send({message: 'file is required'});
39
- }
40
-
41
- const destinationName = req.body.key.replace('${filename}', file.originalname);
42
- const destinationPath = path.join(uploadDir, destinationName);
43
- const destinationDirectory = path.dirname(destinationPath);
44
-
45
- await fs.promises.mkdir(destinationDirectory, { recursive: true });
46
- await fs.promises.rename(file.path, destinationPath);
47
- res.status(201).send();
48
- });
49
-
50
- const server = https.createServer({
51
- key: fs.readFileSync(assertString(process.env.SSL_KEY_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
52
- cert: fs.readFileSync(assertString(process.env.SSL_CRT_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
53
- }, fileServerApp);
54
-
55
- server.once('error', function(err) {
56
- if ((err as any).code === 'EADDRINUSE') {
57
- // when the local dev server reloads files on every request it doesn't
58
- // actually tear down the old modules, so this server only starts on the
59
- // first execution and changes in its code will not be reloaded
60
- return;
61
- }
62
- throw err;
63
- });
64
-
65
- server.listen(port);
66
-
67
- return true;
68
- });
69
-
70
- export const localFileServer = <C extends string = 'local'>(initializer: Initializer<C>) => (configProvider: {[_key in C]: ConfigProviderForConfig<Config>}): FileServerAdapter => {
71
- const config = configProvider[ifDefined(initializer.configSpace, 'local' as C)];
72
- const port = resolveConfigValue(config.port || '');
73
- const host = resolveConfigValue(config.host || '');
74
- const storagePrefix = resolveConfigValue(config.storagePrefix);
75
-
76
- const fileDir = storagePrefix.then((prefix) => path.join(initializer.dataDir, prefix));
77
-
78
- Promise.all([port, fileDir])
79
- .then(([port, fileDir]) => port && startServer(port, fileDir));
80
-
81
- const getSignedViewerUrl = async (source: FileValue) => {
82
- return `https://${await host}:${await port}/${source.path}`;
83
- };
84
- const getPublicViewerUrl = async (source: FileValue) => {
85
- return `https://${await host}:${await port}/${source.path}`;
86
- };
87
- const getFileContent = async (source: FileValue) => {
88
- const filePath = path.join(await fileDir, source.path);
89
- return fs.promises.readFile(filePath);
90
- };
91
- const putFileContent = async (source: FileValue, content: string) => {
92
- const filePath = path.join(await fileDir, source.path);
93
- const directory = path.dirname(filePath);
94
- await fs.promises.mkdir(directory, { recursive: true });
95
- await fs.promises.writeFile(filePath, content);
96
- return source;
97
- };
98
-
99
- const getSignedFileUploadConfig = async() => {
100
- const prefix = 'uploads/' + uuid();
101
-
102
- return {
103
- url: `https://${await host}:${await port}/`,
104
- payload: {
105
- key: prefix + '/${filename}',
106
- }
107
- };
108
- };
109
-
110
- const copyFileTo = async (source: FileValue, destinationPath: string) => {
111
- const sourcePath = path.join(await fileDir, source.path);
112
- const destPath = path.join(await fileDir, destinationPath);
113
- const destDirectory = path.dirname(destPath);
114
-
115
- await fs.promises.mkdir(destDirectory, { recursive: true });
116
- await fs.promises.copyFile(sourcePath, destPath);
117
-
118
- return {
119
- ...source,
120
- path: destinationPath
121
- };
122
- };
123
-
124
- const copyFileToDirectory = async (source: FileValue, destination: string) => {
125
- const destinationPath = path.join(destination, source.label);
126
- return copyFileTo(source, destinationPath);
127
- };
128
-
129
- const isTemporaryUpload = (source: FileValue) => {
130
- return source.path.indexOf('uploads/') === 0;
131
- };
132
-
133
- const getFileChecksum = async (source: FileValue) => {
134
- const filePath = path.join(await fileDir, source.path);
135
- const fileContent = await fs.promises.readFile(filePath);
136
- return crypto.createHash('md5').update(fileContent).digest('hex');
137
- };
138
-
139
- const filesEqual = async (sourceA: FileValue, sourceB: FileValue) => {
140
- const [aSum, bSum] = await Promise.all([
141
- getFileChecksum(sourceA),
142
- getFileChecksum(sourceB)
143
- ]);
144
- return aSum === bSum;
145
- };
146
-
147
- return {
148
- getSignedViewerUrl,
149
- getPublicViewerUrl,
150
- getFileContent,
151
- putFileContent,
152
- getSignedFileUploadConfig,
153
- copyFileTo,
154
- copyFileToDirectory,
155
- isTemporaryUpload,
156
- getFileChecksum,
157
- filesEqual,
158
- };
159
- };
@@ -1,266 +0,0 @@
1
- /* cspell:ignore presigner */
2
- import * as awsSdk from '@aws-sdk/client-s3';
3
- import { s3FileServer } from './s3FileServer';
4
-
5
- jest.mock('@aws-sdk/client-s3', () => {
6
- const sendSpy = jest.fn(() => Promise.reject(new Error('error'))) as any;
7
- class S3Client {
8
- static sendSpy = sendSpy;
9
- send(...a: any[]) { return S3Client.sendSpy(...a); }
10
- }
11
- return {
12
- ...jest.requireActual('@aws-sdk/client-s3'),
13
- S3Client: S3Client,
14
- };
15
- });
16
-
17
- jest.mock('@aws-sdk/s3-request-presigner', () => ({
18
- getSignedUrl: () => Promise.resolve('cool url')
19
- }));
20
-
21
- jest.mock('@aws-sdk/s3-presigned-post', () => ({
22
- createPresignedPost: () => Promise.resolve({
23
- url: 'https://test.s3.amazonaws.com/',
24
- fields: { key: 'uploads/test-uuid/${filename}', acl: 'private' }
25
- })
26
- }));
27
-
28
- jest.mock('uuid', () => ({
29
- v4: () => 'test-uuid'
30
- }));
31
-
32
- describe('s3FileServer', () => {
33
- const bucketRegion = 'us-east-1';
34
- const bucketName = 'test';
35
- const path = 'build/index.html';
36
- const defaultSendSpy: jest.SpyInstance = (awsSdk.S3Client as any).sendSpy;
37
-
38
- const body = 'contents';
39
- const Body = { transformToByteArray: () => Buffer.from(body) };
40
- let send: jest.SpyInstance;
41
- let getS3Client: () => awsSdk.S3Client;
42
-
43
- beforeEach(() => {
44
- send = jest.fn(({ input }) => {
45
- const { Bucket, Key } = input;
46
- if (Bucket !== bucketName) {
47
- throw new awsSdk.NoSuchBucket({ $metadata: {}, message: 'The specified bucket does not exist.' });
48
- }
49
- if (Key !== path) {
50
- throw new awsSdk.NoSuchKey({ $metadata: {}, message: 'The specified key does not exist.' });
51
- }
52
- return { Body };
53
- });
54
-
55
- getS3Client = (() => ({send})) as unknown as typeof getS3Client;
56
- });
57
-
58
- afterEach(() => {
59
- jest.clearAllMocks();
60
- });
61
-
62
- describe('when the S3 bucket exists', () => {
63
- let fileServer: ReturnType<ReturnType<typeof s3FileServer>>;
64
-
65
- beforeEach(() => {
66
- fileServer = s3FileServer({ configSpace: 'test', getS3Client })({ test: { bucketName, bucketRegion } });
67
- });
68
-
69
- it('gets S3 file contents', async() => {
70
- const content = await fileServer.getFileContent({
71
- dataType: 'file',
72
- mimeType: 'text/html',
73
- path,
74
- label: 'index.html',
75
- });
76
- expect(content.toString()).toBe(body);
77
- });
78
-
79
- it('throws if the key does not exist', async() => {
80
- await expect(fileServer.getFileContent({
81
- dataType: 'file',
82
- mimeType: 'text/html',
83
- path: 'build/does-not-exist.html',
84
- label: 'does-not-exist.html',
85
- })).rejects.toThrow('The specified key does not exist.');
86
- });
87
-
88
- it('gets signed url', async() => {
89
- const url = await fileServer.getSignedViewerUrl({
90
- dataType: 'file',
91
- mimeType: 'text/typescript',
92
- path: 'cjs/index.d.ts',
93
- label: 'index.d.ts',
94
- });
95
- expect(url).toBe('cool url');
96
- });
97
-
98
- it('throws when getting public viewer url without publicViewerDomain configured', async() => {
99
- await expect(fileServer.getPublicViewerUrl({
100
- dataType: 'file',
101
- mimeType: 'text/typescript',
102
- path: 'cjs/index.d.ts',
103
- label: 'index.d.ts',
104
- })).rejects.toThrow('Tried to get public viewer URL for cjs/index.d.ts but no publicViewerDomain configured');
105
- });
106
-
107
- it('puts file content', async() => {
108
- send.mockImplementation(() => {});
109
- await expect(fileServer.putFileContent({
110
- dataType: 'file',
111
- mimeType: 'text/typescript',
112
- path: 'cjs/coolFile.d.ts',
113
- label: 'coolFile.d.ts',
114
- }, 'content')).resolves.not.toThrow();
115
- });
116
-
117
- it('gets signed upload config', async() => {
118
- const config = await fileServer.getSignedFileUploadConfig();
119
- expect(config).toEqual({
120
- url: 'https://test.s3.amazonaws.com/',
121
- payload: { key: 'uploads/test-uuid/${filename}', acl: 'private' }
122
- });
123
- });
124
-
125
- it('copies file to destination', async() => {
126
- send.mockImplementation(() => {});
127
- const result = await fileServer.copyFileTo({
128
- dataType: 'file',
129
- mimeType: 'text/html',
130
- path: 'uploads/test-file.html',
131
- label: 'test-file.html',
132
- }, 'permanent/test-file.html');
133
-
134
- expect(result).toEqual({
135
- dataType: 'file',
136
- mimeType: 'text/html',
137
- path: 'permanent/test-file.html',
138
- label: 'test-file.html',
139
- });
140
- });
141
-
142
- it('copies file to directory', async() => {
143
- send.mockImplementation(() => {});
144
- const result = await fileServer.copyFileToDirectory({
145
- dataType: 'file',
146
- mimeType: 'text/html',
147
- path: 'uploads/test-file.html',
148
- label: 'test-file.html',
149
- }, 'permanent/');
150
-
151
- expect(result).toEqual({
152
- dataType: 'file',
153
- mimeType: 'text/html',
154
- path: 'permanent/test-file.html',
155
- label: 'test-file.html',
156
- });
157
- });
158
-
159
- it('identifies temporary uploads', () => {
160
- expect(fileServer.isTemporaryUpload({
161
- dataType: 'file',
162
- mimeType: 'text/html',
163
- path: 'uploads/test-file.html',
164
- label: 'test-file.html',
165
- })).toBe(true);
166
-
167
- expect(fileServer.isTemporaryUpload({
168
- dataType: 'file',
169
- mimeType: 'text/html',
170
- path: 'permanent/test-file.html',
171
- label: 'test-file.html',
172
- })).toBe(false);
173
- });
174
-
175
- it('gets file checksum', async() => {
176
- send.mockImplementation(() => ({ ETag: '"checksum123"' }));
177
- const checksum = await fileServer.getFileChecksum({
178
- dataType: 'file',
179
- mimeType: 'text/html',
180
- path: 'test-file.html',
181
- label: 'test-file.html',
182
- });
183
- expect(checksum).toBe('"checksum123"');
184
- });
185
-
186
- it('compares files for equality', async() => {
187
- send.mockImplementation(() => ({ ETag: '"checksum123"' }));
188
-
189
- const fileA = {
190
- dataType: 'file' as const,
191
- mimeType: 'text/html',
192
- path: 'fileA.html',
193
- label: 'fileA.html',
194
- };
195
-
196
- const fileB = {
197
- dataType: 'file' as const,
198
- mimeType: 'text/html',
199
- path: 'fileB.html',
200
- label: 'fileB.html',
201
- };
202
-
203
- const equal = await fileServer.filesEqual(fileA, fileB);
204
- expect(equal).toBe(true);
205
- });
206
- });
207
-
208
- it('works without client override', async() => {
209
- defaultSendSpy.mockImplementation(({ input }) => {
210
- const { Bucket, Key } = input;
211
- if (Bucket !== bucketName) {
212
- throw new awsSdk.NoSuchBucket({ $metadata: {}, message: 'The specified bucket does not exist.' });
213
- }
214
- if (Key !== path) {
215
- throw new awsSdk.NoSuchKey({ $metadata: {}, message: 'The specified key does not exist.' });
216
- }
217
- return { Body };
218
- });
219
-
220
- const fileServer = s3FileServer({ configSpace: 'test' })({ test: { bucketName, bucketRegion } });
221
-
222
- const content = await fileServer.getFileContent({
223
- dataType: 'file',
224
- mimeType: 'text/html',
225
- path,
226
- label: 'index.html',
227
- });
228
- expect(content.toString()).toBe(body);
229
-
230
- expect(send).not.toHaveBeenCalled();
231
- expect(defaultSendSpy).toHaveBeenCalled();
232
- });
233
-
234
- it('throws if the bucket does not exist', async() => {
235
- const fileServer = s3FileServer({ configSpace: 'test', getS3Client })(
236
- { test: { bucketName: 'does-not-exist', bucketRegion } }
237
- );
238
-
239
- await expect(fileServer.getFileContent({
240
- dataType: 'file',
241
- mimeType: 'text/html',
242
- path,
243
- label: 'index.html',
244
- })).rejects.toThrow('The specified bucket does not exist.');
245
- });
246
-
247
- describe('with publicViewerDomain configured', () => {
248
- let fileServer: ReturnType<ReturnType<typeof s3FileServer>>;
249
-
250
- beforeEach(() => {
251
- fileServer = s3FileServer({ configSpace: 'test', getS3Client })({
252
- test: { bucketName, bucketRegion, publicViewerDomain: 'cdn.example.com' }
253
- });
254
- });
255
-
256
- it('gets public viewer url', async() => {
257
- const url = await fileServer.getPublicViewerUrl({
258
- dataType: 'file',
259
- mimeType: 'text/typescript',
260
- path: 'cjs/index.d.ts',
261
- label: 'index.d.ts',
262
- });
263
- expect(url).toBe('https://cdn.example.com/cjs/index.d.ts');
264
- });
265
- });
266
- });