@openstax/ts-utils 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (503) hide show
  1. package/.cfnlintrc +2 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.github/workflows/ci.yml +36 -0
  4. package/.github/workflows/lint.yml +55 -0
  5. package/.nvmrc +1 -0
  6. package/.syncignore +4 -0
  7. package/.syncpackrc +18 -0
  8. package/CONTRIBUTING.md +96 -0
  9. package/LICENSE +661 -0
  10. package/Procfile +1 -0
  11. package/README.md +62 -90
  12. package/app.json +23 -0
  13. package/cspell.json +32 -0
  14. package/deploy/constants.env +21 -0
  15. package/deploy/deploy.bash +157 -0
  16. package/deploy/deployment-alt-region.cfn.yml +70 -0
  17. package/deploy/deployment.cfn.yml +650 -0
  18. package/deploy/destroy-deployment.bash +23 -0
  19. package/deploy/shared.cfn.yml +94 -0
  20. package/docs/lambda-build.md +35 -0
  21. package/package.json +12 -228
  22. package/packages/frontend/README.md +46 -0
  23. package/packages/frontend/package.json +101 -0
  24. package/packages/frontend/public/favicon.ico +0 -0
  25. package/packages/frontend/public/index.html +107 -0
  26. package/packages/frontend/public/maintenance.html +59 -0
  27. package/packages/frontend/public/manifest.json +15 -0
  28. package/packages/frontend/public/robots.txt +3 -0
  29. package/packages/frontend/script/make-certificate.bash +49 -0
  30. package/packages/frontend/script/server/cli.js +11 -0
  31. package/packages/frontend/script/server/index.js +47 -0
  32. package/packages/frontend/script/start.bash +22 -0
  33. package/packages/frontend/script/trust-localhost.bash +7 -0
  34. package/packages/frontend/src/auth/authProvider.ts +10 -0
  35. package/packages/frontend/src/auth/useAuth.ts +33 -0
  36. package/packages/frontend/src/components/Pagination.tsx +26 -0
  37. package/packages/frontend/src/configProvider/index.ts +53 -0
  38. package/packages/frontend/src/configProvider/use.ts +41 -0
  39. package/packages/frontend/src/core/context/services.spec.tsx +39 -0
  40. package/packages/frontend/src/core/context/services.tsx +16 -0
  41. package/packages/frontend/src/core/index.spec.ts +7 -0
  42. package/packages/frontend/src/core/index.ts +20 -0
  43. package/packages/frontend/src/core/services.tsx +14 -0
  44. package/packages/frontend/src/core/types.ts +3 -0
  45. package/packages/frontend/src/example/api.ts +28 -0
  46. package/packages/frontend/src/example/components/Layout.tsx +23 -0
  47. package/packages/frontend/src/example/screens/Home.spec.tsx +68 -0
  48. package/packages/frontend/src/example/screens/Home.tsx +78 -0
  49. package/packages/frontend/src/example/screens/ThingList.spec.tsx +60 -0
  50. package/packages/frontend/src/example/screens/ThingList.tsx +75 -0
  51. package/packages/frontend/src/example/screens/ThingView.spec.tsx +71 -0
  52. package/packages/frontend/src/example/screens/ThingView.tsx +47 -0
  53. package/packages/frontend/src/example/screens/index.ts +9 -0
  54. package/packages/frontend/src/index.css +159 -0
  55. package/packages/frontend/src/index.tsx +67 -0
  56. package/packages/frontend/src/react-app-env.d.ts +1 -0
  57. package/packages/frontend/src/routing/components/RouteLink.spec.tsx +55 -0
  58. package/packages/frontend/src/routing/components/RouteLink.tsx +35 -0
  59. package/packages/frontend/src/routing/middleware.ts +6 -0
  60. package/packages/frontend/src/routing/useQuery.ts +14 -0
  61. package/packages/frontend/src/setupProxy.js +19 -0
  62. package/packages/frontend/src/setupTests.ts +9 -0
  63. package/packages/frontend/src/tests/testServices.tsx +23 -0
  64. package/packages/frontend/tsconfig.json +27 -0
  65. package/packages/lambda/.eslintrc.js +64 -0
  66. package/packages/lambda/jest-global-setup.js +3 -0
  67. package/packages/lambda/jest-setup-after-env.js +1 -0
  68. package/packages/lambda/jest.config.js +31 -0
  69. package/packages/lambda/jest.resolver.js +17 -0
  70. package/packages/lambda/package.json +68 -0
  71. package/packages/lambda/script/build.bash +19 -0
  72. package/packages/lambda/script/bundle-functions.bash +10 -0
  73. package/packages/lambda/script/lambdaLocalProxy.js +16 -0
  74. package/packages/lambda/script/lambdaLocalProxy.spec.ts +147 -0
  75. package/packages/lambda/script/utils/getRouteData.ts +7 -0
  76. package/packages/lambda/script/utils/routeDataLoader.js +8 -0
  77. package/packages/lambda/script/utils/routeDataLoader.spec.ts +8 -0
  78. package/packages/lambda/src/functions/serviceApi/core/index.ts +7 -0
  79. package/packages/lambda/src/functions/serviceApi/core/request.spec.ts +38 -0
  80. package/packages/lambda/src/functions/serviceApi/core/request.ts +42 -0
  81. package/packages/lambda/src/functions/serviceApi/core/routes.spec.ts +7 -0
  82. package/packages/lambda/src/functions/serviceApi/core/routes.ts +10 -0
  83. package/packages/lambda/src/functions/serviceApi/core/services.ts +9 -0
  84. package/packages/lambda/src/functions/serviceApi/core/types.ts +13 -0
  85. package/packages/lambda/src/functions/serviceApi/entry/lambda/https-xray.ts +4 -0
  86. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.spec.ts +48 -0
  87. package/packages/lambda/src/functions/serviceApi/entry/lambda/index.ts +58 -0
  88. package/packages/lambda/src/functions/serviceApi/entry/lambda/services.ts +36 -0
  89. package/packages/lambda/src/functions/serviceApi/entry/local.ts +71 -0
  90. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.spec.ts +16 -0
  91. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentSearchMiddleware.ts +41 -0
  92. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.spec.ts +78 -0
  93. package/packages/lambda/src/functions/serviceApi/versions/v0/example/documentStoreMiddleware.ts +70 -0
  94. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.spec.ts +306 -0
  95. package/packages/lambda/src/functions/serviceApi/versions/v0/example/routes.ts +176 -0
  96. package/packages/lambda/src/functions/serviceApi/versions/v0/index.spec.ts +263 -0
  97. package/packages/lambda/src/functions/serviceApi/versions/v0/index.ts +134 -0
  98. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.spec.ts +23 -0
  99. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/authMiddleware.ts +32 -0
  100. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.spec.ts +10 -0
  101. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/configMiddleware.ts +7 -0
  102. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.spec.ts +13 -0
  103. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/frontendFileServerMiddleware.ts +23 -0
  104. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.spec.ts +9 -0
  105. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/paginationMiddleware.ts +9 -0
  106. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.spec.ts +12 -0
  107. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/searchMiddleware.ts +21 -0
  108. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.spec.ts +21 -0
  109. package/packages/lambda/src/functions/serviceApi/versions/v0/middleware/userRoleValidatorMiddleware.ts +18 -0
  110. package/packages/lambda/tsconfig.json +30 -0
  111. package/packages/lambda/webpack.config.js +97 -0
  112. package/packages/utils/.eslintrc.js +64 -0
  113. package/packages/utils/README.md +118 -0
  114. package/packages/utils/jest-global-setup.js +3 -0
  115. package/packages/utils/jest.config.js +25 -0
  116. package/packages/utils/jest.resolver.js +17 -0
  117. package/packages/utils/package.json +238 -0
  118. package/packages/utils/src/assertions/index.spec.ts +126 -0
  119. package/{dist/esm/assertions/index.js → packages/utils/src/assertions/index.ts} +64 -49
  120. package/packages/utils/src/aws/ssmService.ts +7 -0
  121. package/packages/utils/src/config/awsParameterConfig.ts +24 -0
  122. package/packages/utils/src/config/envConfig.ts +58 -0
  123. package/packages/utils/src/config/index.spec.ts +165 -0
  124. package/{dist/esm/config/index.d.ts → packages/utils/src/config/index.ts} +29 -13
  125. package/packages/utils/src/config/lambdaParameterConfig.ts +49 -0
  126. package/{dist/esm/config/replaceConfig.js → packages/utils/src/config/replaceConfig.ts} +16 -6
  127. package/packages/utils/src/config/resolveConfigValue.ts +10 -0
  128. package/packages/utils/src/errors/index.spec.ts +35 -0
  129. package/{dist/esm/errors/index.js → packages/utils/src/errors/index.ts} +57 -41
  130. package/packages/utils/src/fetch/fetchStatusRetry.spec.ts +197 -0
  131. package/packages/utils/src/fetch/fetchStatusRetry.ts +33 -0
  132. package/packages/utils/src/fetch/index.spec.ts +34 -0
  133. package/packages/utils/src/fetch/index.ts +87 -0
  134. package/packages/utils/src/guards/index.spec.ts +58 -0
  135. package/{dist/esm/guards/index.d.ts → packages/utils/src/guards/index.ts} +10 -7
  136. package/packages/utils/src/index.spec.ts +471 -0
  137. package/packages/utils/src/middleware/apiErrorHandler.spec.ts +65 -0
  138. package/packages/utils/src/middleware/apiErrorHandler.ts +67 -0
  139. package/packages/utils/src/middleware/apiSlowResponseMiddleware.spec.ts +184 -0
  140. package/packages/utils/src/middleware/apiSlowResponseMiddleware.ts +71 -0
  141. package/packages/utils/src/middleware/index.spec.ts +99 -0
  142. package/{dist/cjs/middleware/index.d.ts → packages/utils/src/middleware/index.ts} +53 -5
  143. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.spec.ts +103 -0
  144. package/packages/utils/src/middleware/lambdaCorsResponseMiddleware.ts +52 -0
  145. package/packages/utils/src/middleware/throwNotFoundMiddleware.spec.ts +20 -0
  146. package/packages/utils/src/middleware/throwNotFoundMiddleware.ts +11 -0
  147. package/packages/utils/src/misc/hashValue.ts +18 -0
  148. package/packages/utils/src/misc/helpers.ts +259 -0
  149. package/packages/utils/src/misc/merge.ts +48 -0
  150. package/{dist/esm/misc/partitionSequence.js → packages/utils/src/misc/partitionSequence.ts} +23 -15
  151. package/packages/utils/src/pagination/index.spec.ts +150 -0
  152. package/packages/utils/src/pagination/index.ts +117 -0
  153. package/{dist/esm/routing/helpers.js → packages/utils/src/routing/helpers.ts} +42 -30
  154. package/packages/utils/src/routing/index.spec.ts +553 -0
  155. package/packages/utils/src/routing/index.ts +424 -0
  156. package/packages/utils/src/routing/validators/zod.spec.ts +16 -0
  157. package/packages/utils/src/routing/validators/zod.ts +14 -0
  158. package/packages/utils/src/services/accountsGateway/README.md +3 -0
  159. package/packages/utils/src/services/accountsGateway/index.spec.ts +518 -0
  160. package/packages/utils/src/services/accountsGateway/index.ts +251 -0
  161. package/packages/utils/src/services/apiGateway/README.md +93 -0
  162. package/packages/utils/src/services/apiGateway/index.spec.ts +254 -0
  163. package/packages/utils/src/services/apiGateway/index.ts +189 -0
  164. package/packages/utils/src/services/authProvider/README.md +21 -0
  165. package/packages/utils/src/services/authProvider/browser.spec.ts +391 -0
  166. package/packages/utils/src/services/authProvider/browser.ts +209 -0
  167. package/packages/utils/src/services/authProvider/decryption.spec.ts +337 -0
  168. package/packages/utils/src/services/authProvider/decryption.ts +98 -0
  169. package/packages/utils/src/services/authProvider/index.ts +93 -0
  170. package/packages/utils/src/services/authProvider/stub.spec.ts +29 -0
  171. package/packages/utils/src/services/authProvider/subrequest.spec.ts +105 -0
  172. package/packages/utils/src/services/authProvider/subrequest.ts +68 -0
  173. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.spec.ts +128 -0
  174. package/packages/utils/src/services/authProvider/utils/decryptAndVerify.ts +106 -0
  175. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.spec.ts +26 -0
  176. package/packages/utils/src/services/authProvider/utils/embeddedAuthProvider.ts +57 -0
  177. package/packages/utils/src/services/authProvider/utils/userRoleValidator.spec.ts +135 -0
  178. package/packages/utils/src/services/authProvider/utils/userRoleValidator.ts +49 -0
  179. package/packages/utils/src/services/authProvider/utils/userSubrequest.spec.ts +26 -0
  180. package/packages/utils/src/services/authProvider/utils/userSubrequest.ts +10 -0
  181. package/packages/utils/src/services/documentStore/dynamoEncoding.ts +57 -0
  182. package/packages/utils/src/services/documentStore/fileSystemAssert.spec.ts +43 -0
  183. package/packages/utils/src/services/documentStore/fileSystemAssert.ts +10 -0
  184. package/{dist/cjs/services/documentStore/index.d.ts → packages/utils/src/services/documentStore/index.ts} +8 -8
  185. package/packages/utils/src/services/documentStore/unversioned/README.md +13 -0
  186. package/packages/utils/src/services/documentStore/unversioned/dynamodb.spec.ts +859 -0
  187. package/packages/utils/src/services/documentStore/unversioned/dynamodb.ts +243 -0
  188. package/packages/utils/src/services/documentStore/unversioned/file-system.spec.ts +629 -0
  189. package/packages/utils/src/services/documentStore/unversioned/file-system.ts +194 -0
  190. package/{dist/cjs/services/documentStore/unversioned/index.d.ts → packages/utils/src/services/documentStore/unversioned/index.ts} +2 -0
  191. package/packages/utils/src/services/documentStore/versioned/README.md +13 -0
  192. package/packages/utils/src/services/documentStore/versioned/dynamodb.spec.ts +376 -0
  193. package/packages/utils/src/services/documentStore/versioned/dynamodb.ts +167 -0
  194. package/packages/utils/src/services/documentStore/versioned/file-system.spec.ts +262 -0
  195. package/packages/utils/src/services/documentStore/versioned/file-system.ts +90 -0
  196. package/packages/utils/src/services/documentStore/versioned/index.ts +25 -0
  197. package/packages/utils/src/services/exercisesGateway/README.md +5 -0
  198. package/packages/utils/src/services/exercisesGateway/index.spec.ts +326 -0
  199. package/packages/utils/src/services/exercisesGateway/index.ts +163 -0
  200. package/packages/utils/src/services/fileServer/index.spec.ts +88 -0
  201. package/packages/utils/src/services/fileServer/index.ts +43 -0
  202. package/packages/utils/src/services/fileServer/localFileServer.spec.ts +182 -0
  203. package/packages/utils/src/services/fileServer/localFileServer.ts +159 -0
  204. package/packages/utils/src/services/fileServer/s3FileServer.spec.ts +266 -0
  205. package/packages/utils/src/services/fileServer/s3FileServer.ts +155 -0
  206. package/packages/utils/src/services/launchParams/index.spec.ts +366 -0
  207. package/packages/utils/src/services/launchParams/signer.ts +73 -0
  208. package/packages/utils/src/services/launchParams/verifier.ts +120 -0
  209. package/packages/utils/src/services/logger/console.spec.ts +29 -0
  210. package/{dist/esm/services/logger/console.js → packages/utils/src/services/logger/console.ts} +5 -2
  211. package/packages/utils/src/services/logger/index.spec.ts +65 -0
  212. package/{dist/esm/services/logger/index.d.ts → packages/utils/src/services/logger/index.ts} +23 -9
  213. package/packages/utils/src/services/lrsGateway/README.md +5 -0
  214. package/packages/utils/src/services/lrsGateway/addStatementDefaultFields.ts +22 -0
  215. package/packages/utils/src/services/lrsGateway/attempt-utils.spec.ts +847 -0
  216. package/packages/utils/src/services/lrsGateway/attempt-utils.ts +358 -0
  217. package/packages/utils/src/services/lrsGateway/file-system.spec.ts +363 -0
  218. package/packages/utils/src/services/lrsGateway/file-system.ts +165 -0
  219. package/packages/utils/src/services/lrsGateway/index.spec.ts +194 -0
  220. package/packages/utils/src/services/lrsGateway/index.ts +257 -0
  221. package/packages/utils/src/services/lrsGateway/xapiUtils.spec.ts +887 -0
  222. package/packages/utils/src/services/lrsGateway/xapiUtils.ts +262 -0
  223. package/packages/utils/src/services/postgresConnection/index.spec.ts +170 -0
  224. package/packages/utils/src/services/postgresConnection/index.ts +84 -0
  225. package/packages/utils/src/services/searchProvider/README.md +3 -0
  226. package/packages/utils/src/services/searchProvider/index.ts +59 -0
  227. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.spec.ts +526 -0
  228. package/packages/utils/src/services/searchProvider/memorySearchTheBadWay.ts +223 -0
  229. package/packages/utils/src/services/searchProvider/openSearch.spec.ts +926 -0
  230. package/packages/utils/src/services/searchProvider/openSearch.ts +195 -0
  231. package/{dist/esm/types.d.ts → packages/utils/src/types.ts} +34 -6
  232. package/packages/utils/tsconfig.json +31 -0
  233. package/packages/utils/tsconfig.without-specs.cjs.json +7 -0
  234. package/packages/utils/tsconfig.without-specs.esm.json +7 -0
  235. package/packages/utils/tsconfig.without-specs.json +6 -0
  236. package/scripts/build.bash +24 -0
  237. package/scripts/ci.bash +10 -0
  238. package/scripts/start.bash +29 -0
  239. package/dist/cjs/assertions/index.d.ts +0 -89
  240. package/dist/cjs/assertions/index.js +0 -157
  241. package/dist/cjs/aws/ssmService.d.ts +0 -5
  242. package/dist/cjs/aws/ssmService.js +0 -9
  243. package/dist/cjs/config/awsParameterConfig.d.ts +0 -10
  244. package/dist/cjs/config/awsParameterConfig.js +0 -26
  245. package/dist/cjs/config/envConfig.d.ts +0 -24
  246. package/dist/cjs/config/envConfig.js +0 -57
  247. package/dist/cjs/config/index.d.ts +0 -48
  248. package/dist/cjs/config/index.js +0 -35
  249. package/dist/cjs/config/lambdaParameterConfig.d.ts +0 -12
  250. package/dist/cjs/config/lambdaParameterConfig.js +0 -45
  251. package/dist/cjs/config/replaceConfig.d.ts +0 -14
  252. package/dist/cjs/config/replaceConfig.js +0 -22
  253. package/dist/cjs/config/resolveConfigValue.d.ts +0 -5
  254. package/dist/cjs/config/resolveConfigValue.js +0 -12
  255. package/dist/cjs/errors/index.d.ts +0 -88
  256. package/dist/cjs/errors/index.js +0 -123
  257. package/dist/cjs/fetch/fetchStatusRetry.d.ts +0 -8
  258. package/dist/cjs/fetch/fetchStatusRetry.js +0 -27
  259. package/dist/cjs/fetch/index.d.ts +0 -64
  260. package/dist/cjs/fetch/index.js +0 -55
  261. package/dist/cjs/guards/index.d.ts +0 -38
  262. package/dist/cjs/guards/index.js +0 -44
  263. package/dist/cjs/index.js +0 -20
  264. package/dist/cjs/middleware/apiErrorHandler.d.ts +0 -24
  265. package/dist/cjs/middleware/apiErrorHandler.js +0 -42
  266. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  267. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +0 -54
  268. package/dist/cjs/middleware/index.js +0 -48
  269. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  270. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +0 -44
  271. package/dist/cjs/middleware/throwNotFoundMiddleware.d.ts +0 -4
  272. package/dist/cjs/middleware/throwNotFoundMiddleware.js +0 -14
  273. package/dist/cjs/misc/hashValue.d.ts +0 -10
  274. package/dist/cjs/misc/hashValue.js +0 -17
  275. package/dist/cjs/misc/helpers.d.ts +0 -124
  276. package/dist/cjs/misc/helpers.js +0 -214
  277. package/dist/cjs/misc/merge.d.ts +0 -21
  278. package/dist/cjs/misc/merge.js +0 -45
  279. package/dist/cjs/misc/partitionSequence.d.ts +0 -35
  280. package/dist/cjs/misc/partitionSequence.js +0 -55
  281. package/dist/cjs/pagination/index.d.ts +0 -91
  282. package/dist/cjs/pagination/index.js +0 -83
  283. package/dist/cjs/routing/helpers.d.ts +0 -57
  284. package/dist/cjs/routing/helpers.js +0 -90
  285. package/dist/cjs/routing/index.d.ts +0 -290
  286. package/dist/cjs/routing/index.js +0 -295
  287. package/dist/cjs/routing/validators/zod.d.ts +0 -4
  288. package/dist/cjs/routing/validators/zod.js +0 -14
  289. package/dist/cjs/services/accountsGateway/index.d.ts +0 -92
  290. package/dist/cjs/services/accountsGateway/index.js +0 -138
  291. package/dist/cjs/services/apiGateway/index.d.ts +0 -68
  292. package/dist/cjs/services/apiGateway/index.js +0 -118
  293. package/dist/cjs/services/authProvider/browser.d.ts +0 -40
  294. package/dist/cjs/services/authProvider/browser.js +0 -155
  295. package/dist/cjs/services/authProvider/decryption.d.ts +0 -19
  296. package/dist/cjs/services/authProvider/decryption.js +0 -73
  297. package/dist/cjs/services/authProvider/index.d.ts +0 -63
  298. package/dist/cjs/services/authProvider/index.js +0 -34
  299. package/dist/cjs/services/authProvider/subrequest.d.ts +0 -13
  300. package/dist/cjs/services/authProvider/subrequest.js +0 -49
  301. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  302. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +0 -91
  303. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  304. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.js +0 -47
  305. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  306. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +0 -37
  307. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +0 -3
  308. package/dist/cjs/services/authProvider/utils/userSubrequest.js +0 -13
  309. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +0 -10
  310. package/dist/cjs/services/documentStore/dynamoEncoding.js +0 -52
  311. package/dist/cjs/services/documentStore/fileSystemAssert.d.ts +0 -1
  312. package/dist/cjs/services/documentStore/fileSystemAssert.js +0 -14
  313. package/dist/cjs/services/documentStore/index.js +0 -2
  314. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  315. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +0 -233
  316. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +0 -32
  317. package/dist/cjs/services/documentStore/unversioned/file-system.js +0 -214
  318. package/dist/cjs/services/documentStore/unversioned/index.js +0 -2
  319. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +0 -25
  320. package/dist/cjs/services/documentStore/versioned/dynamodb.js +0 -143
  321. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +0 -25
  322. package/dist/cjs/services/documentStore/versioned/file-system.js +0 -73
  323. package/dist/cjs/services/documentStore/versioned/index.d.ts +0 -17
  324. package/dist/cjs/services/documentStore/versioned/index.js +0 -2
  325. package/dist/cjs/services/exercisesGateway/index.d.ts +0 -67
  326. package/dist/cjs/services/exercisesGateway/index.js +0 -107
  327. package/dist/cjs/services/fileServer/index.d.ts +0 -30
  328. package/dist/cjs/services/fileServer/index.js +0 -19
  329. package/dist/cjs/services/fileServer/localFileServer.d.ts +0 -13
  330. package/dist/cjs/services/fileServer/localFileServer.js +0 -132
  331. package/dist/cjs/services/fileServer/s3FileServer.d.ts +0 -14
  332. package/dist/cjs/services/fileServer/s3FileServer.js +0 -131
  333. package/dist/cjs/services/launchParams/index.js +0 -7
  334. package/dist/cjs/services/launchParams/signer.d.ts +0 -23
  335. package/dist/cjs/services/launchParams/signer.js +0 -58
  336. package/dist/cjs/services/launchParams/verifier.d.ts +0 -21
  337. package/dist/cjs/services/launchParams/verifier.js +0 -129
  338. package/dist/cjs/services/logger/console.d.ts +0 -4
  339. package/dist/cjs/services/logger/console.js +0 -12
  340. package/dist/cjs/services/logger/index.d.ts +0 -39
  341. package/dist/cjs/services/logger/index.js +0 -31
  342. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  343. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +0 -21
  344. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +0 -70
  345. package/dist/cjs/services/lrsGateway/attempt-utils.js +0 -258
  346. package/dist/cjs/services/lrsGateway/file-system.d.ts +0 -15
  347. package/dist/cjs/services/lrsGateway/file-system.js +0 -150
  348. package/dist/cjs/services/lrsGateway/index.d.ts +0 -122
  349. package/dist/cjs/services/lrsGateway/index.js +0 -148
  350. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +0 -68
  351. package/dist/cjs/services/lrsGateway/xapiUtils.js +0 -109
  352. package/dist/cjs/services/postgresConnection/index.d.ts +0 -28
  353. package/dist/cjs/services/postgresConnection/index.js +0 -65
  354. package/dist/cjs/services/searchProvider/index.d.ts +0 -67
  355. package/dist/cjs/services/searchProvider/index.js +0 -2
  356. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  357. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +0 -191
  358. package/dist/cjs/services/searchProvider/openSearch.d.ts +0 -28
  359. package/dist/cjs/services/searchProvider/openSearch.js +0 -154
  360. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +0 -1
  361. package/dist/cjs/types.d.ts +0 -31
  362. package/dist/cjs/types.js +0 -2
  363. package/dist/esm/assertions/index.d.ts +0 -89
  364. package/dist/esm/aws/ssmService.d.ts +0 -5
  365. package/dist/esm/aws/ssmService.js +0 -6
  366. package/dist/esm/config/awsParameterConfig.d.ts +0 -10
  367. package/dist/esm/config/awsParameterConfig.js +0 -22
  368. package/dist/esm/config/envConfig.d.ts +0 -24
  369. package/dist/esm/config/envConfig.js +0 -53
  370. package/dist/esm/config/index.js +0 -17
  371. package/dist/esm/config/lambdaParameterConfig.d.ts +0 -12
  372. package/dist/esm/config/lambdaParameterConfig.js +0 -38
  373. package/dist/esm/config/replaceConfig.d.ts +0 -14
  374. package/dist/esm/config/resolveConfigValue.d.ts +0 -5
  375. package/dist/esm/config/resolveConfigValue.js +0 -8
  376. package/dist/esm/errors/index.d.ts +0 -88
  377. package/dist/esm/fetch/fetchStatusRetry.d.ts +0 -8
  378. package/dist/esm/fetch/fetchStatusRetry.js +0 -23
  379. package/dist/esm/fetch/index.d.ts +0 -64
  380. package/dist/esm/fetch/index.js +0 -46
  381. package/dist/esm/guards/index.js +0 -36
  382. package/dist/esm/index.d.ts +0 -4
  383. package/dist/esm/index.js +0 -4
  384. package/dist/esm/middleware/apiErrorHandler.d.ts +0 -24
  385. package/dist/esm/middleware/apiErrorHandler.js +0 -38
  386. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +0 -23
  387. package/dist/esm/middleware/apiSlowResponseMiddleware.js +0 -50
  388. package/dist/esm/middleware/index.d.ts +0 -47
  389. package/dist/esm/middleware/index.js +0 -44
  390. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +0 -20
  391. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +0 -40
  392. package/dist/esm/middleware/throwNotFoundMiddleware.d.ts +0 -4
  393. package/dist/esm/middleware/throwNotFoundMiddleware.js +0 -10
  394. package/dist/esm/misc/hashValue.d.ts +0 -10
  395. package/dist/esm/misc/hashValue.js +0 -13
  396. package/dist/esm/misc/helpers.d.ts +0 -124
  397. package/dist/esm/misc/helpers.js +0 -199
  398. package/dist/esm/misc/merge.d.ts +0 -21
  399. package/dist/esm/misc/merge.js +0 -40
  400. package/dist/esm/misc/partitionSequence.d.ts +0 -35
  401. package/dist/esm/pagination/index.d.ts +0 -91
  402. package/dist/esm/pagination/index.js +0 -77
  403. package/dist/esm/routing/helpers.d.ts +0 -57
  404. package/dist/esm/routing/index.d.ts +0 -290
  405. package/dist/esm/routing/index.js +0 -246
  406. package/dist/esm/routing/validators/zod.d.ts +0 -4
  407. package/dist/esm/routing/validators/zod.js +0 -10
  408. package/dist/esm/services/accountsGateway/index.d.ts +0 -92
  409. package/dist/esm/services/accountsGateway/index.js +0 -131
  410. package/dist/esm/services/apiGateway/index.d.ts +0 -68
  411. package/dist/esm/services/apiGateway/index.js +0 -77
  412. package/dist/esm/services/authProvider/browser.d.ts +0 -40
  413. package/dist/esm/services/authProvider/browser.js +0 -151
  414. package/dist/esm/services/authProvider/decryption.d.ts +0 -19
  415. package/dist/esm/services/authProvider/decryption.js +0 -69
  416. package/dist/esm/services/authProvider/index.d.ts +0 -63
  417. package/dist/esm/services/authProvider/index.js +0 -26
  418. package/dist/esm/services/authProvider/subrequest.d.ts +0 -13
  419. package/dist/esm/services/authProvider/subrequest.js +0 -45
  420. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +0 -28
  421. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +0 -85
  422. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +0 -26
  423. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.js +0 -40
  424. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +0 -13
  425. package/dist/esm/services/authProvider/utils/userRoleValidator.js +0 -33
  426. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +0 -3
  427. package/dist/esm/services/authProvider/utils/userSubrequest.js +0 -6
  428. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +0 -10
  429. package/dist/esm/services/documentStore/dynamoEncoding.js +0 -45
  430. package/dist/esm/services/documentStore/fileSystemAssert.d.ts +0 -1
  431. package/dist/esm/services/documentStore/fileSystemAssert.js +0 -10
  432. package/dist/esm/services/documentStore/index.d.ts +0 -14
  433. package/dist/esm/services/documentStore/index.js +0 -1
  434. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +0 -31
  435. package/dist/esm/services/documentStore/unversioned/dynamodb.js +0 -226
  436. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +0 -32
  437. package/dist/esm/services/documentStore/unversioned/file-system.js +0 -174
  438. package/dist/esm/services/documentStore/unversioned/index.d.ts +0 -2
  439. package/dist/esm/services/documentStore/unversioned/index.js +0 -1
  440. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +0 -25
  441. package/dist/esm/services/documentStore/versioned/dynamodb.js +0 -139
  442. package/dist/esm/services/documentStore/versioned/file-system.d.ts +0 -25
  443. package/dist/esm/services/documentStore/versioned/file-system.js +0 -69
  444. package/dist/esm/services/documentStore/versioned/index.d.ts +0 -17
  445. package/dist/esm/services/documentStore/versioned/index.js +0 -1
  446. package/dist/esm/services/exercisesGateway/index.d.ts +0 -67
  447. package/dist/esm/services/exercisesGateway/index.js +0 -70
  448. package/dist/esm/services/fileServer/index.d.ts +0 -30
  449. package/dist/esm/services/fileServer/index.js +0 -13
  450. package/dist/esm/services/fileServer/localFileServer.d.ts +0 -13
  451. package/dist/esm/services/fileServer/localFileServer.js +0 -125
  452. package/dist/esm/services/fileServer/s3FileServer.d.ts +0 -14
  453. package/dist/esm/services/fileServer/s3FileServer.js +0 -124
  454. package/dist/esm/services/launchParams/index.d.ts +0 -2
  455. package/dist/esm/services/launchParams/index.js +0 -2
  456. package/dist/esm/services/launchParams/signer.d.ts +0 -23
  457. package/dist/esm/services/launchParams/signer.js +0 -51
  458. package/dist/esm/services/launchParams/verifier.d.ts +0 -21
  459. package/dist/esm/services/launchParams/verifier.js +0 -92
  460. package/dist/esm/services/logger/console.d.ts +0 -4
  461. package/dist/esm/services/logger/index.js +0 -27
  462. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +0 -5
  463. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +0 -14
  464. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +0 -70
  465. package/dist/esm/services/lrsGateway/attempt-utils.js +0 -236
  466. package/dist/esm/services/lrsGateway/file-system.d.ts +0 -15
  467. package/dist/esm/services/lrsGateway/file-system.js +0 -110
  468. package/dist/esm/services/lrsGateway/index.d.ts +0 -122
  469. package/dist/esm/services/lrsGateway/index.js +0 -111
  470. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +0 -68
  471. package/dist/esm/services/lrsGateway/xapiUtils.js +0 -99
  472. package/dist/esm/services/postgresConnection/index.d.ts +0 -28
  473. package/dist/esm/services/postgresConnection/index.js +0 -58
  474. package/dist/esm/services/searchProvider/index.d.ts +0 -67
  475. package/dist/esm/services/searchProvider/index.js +0 -1
  476. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +0 -20
  477. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +0 -187
  478. package/dist/esm/services/searchProvider/openSearch.d.ts +0 -28
  479. package/dist/esm/services/searchProvider/openSearch.js +0 -150
  480. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +0 -1
  481. package/dist/esm/types.js +0 -1
  482. /package/{script → packages/utils/script}/bin/copy-from-template.bash +0 -0
  483. /package/{script → packages/utils/script}/bin/delete-stack.bash +0 -0
  484. /package/{script → packages/utils/script}/bin/deploy.bash +0 -0
  485. /package/{script → packages/utils/script}/bin/destroy-deployment.bash +0 -0
  486. /package/{script → packages/utils/script}/bin/empty-bucket.bash +0 -0
  487. /package/{script → packages/utils/script}/bin/get-arg.bash +0 -0
  488. /package/{script → packages/utils/script}/bin/get-deployed-environments.bash +0 -0
  489. /package/{script → packages/utils/script}/bin/get-env-param.bash +0 -0
  490. /package/{script → packages/utils/script}/bin/get-kwarg.bash +0 -0
  491. /package/{script → packages/utils/script}/bin/get-stack-param.bash +0 -0
  492. /package/{script → packages/utils/script}/bin/has-flag.bash +0 -0
  493. /package/{script → packages/utils/script}/bin/init-constants-script.bash +0 -0
  494. /package/{script → packages/utils/script}/bin/init-params-script.bash +0 -0
  495. /package/{script → packages/utils/script}/bin/stack-exists.bash +0 -0
  496. /package/{script → packages/utils/script}/bin/update-utils.bash +0 -0
  497. /package/{script → packages/utils/script}/bin/upload-pager-duty-endpoints.bash +0 -0
  498. /package/{script → packages/utils/script}/bin/upload-params.bash +0 -0
  499. /package/{script → packages/utils/script}/bin/which.bash +0 -0
  500. /package/{script → packages/utils/script}/bin-entry.bash +0 -0
  501. /package/{script → packages/utils/script}/build.bash +0 -0
  502. /package/{dist/cjs/index.d.ts → packages/utils/src/index.ts} +0 -0
  503. /package/{dist/cjs/services/launchParams/index.d.ts → packages/utils/src/services/launchParams/index.ts} +0 -0
@@ -0,0 +1,59 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <!-- spell-checker: ignore TFCS -->
5
+ <meta charset="utf-8" />
6
+ <title>OpenStax</title>
7
+ <meta name="robots" content="noindex" />
8
+ <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
9
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
10
+ <meta name="theme-color" content="#000000" />
11
+ <meta
12
+ name="description"
13
+ content="OpenStax"
14
+ />
15
+ <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
16
+ <!--
17
+ manifest.json provides metadata used when your web app is installed on a
18
+ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
19
+ -->
20
+ <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
21
+
22
+ <script>
23
+ window.dataLayer = window.dataLayer || [];
24
+ window.dataLayer.push({
25
+ 'os.release_id':'%REACT_APP_CODE_VERSION%',
26
+ 'os.app':'%REACT_APP_NAME%',
27
+ 'os.user':window._OX_USER_DATA,
28
+ });
29
+ </script>
30
+
31
+ <style>
32
+ html {
33
+ font-family: Helvetica, Arial, sans-serif;
34
+ font-size: 62.5%;
35
+ text-size-adjust: 100%;
36
+ }
37
+ body {
38
+ padding: 3rem;
39
+ font-size: 1.6rem;
40
+ -webkit-font-smoothing: antialiased;
41
+ }
42
+
43
+ h3 {
44
+ font-weight: 400;
45
+ font-size: 2.2rem;
46
+ margin-top: 0;
47
+ }
48
+ </style>
49
+
50
+ <!-- Google Tag Manager -->
51
+ <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
52
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
53
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
54
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
55
+ })(window,document,'script','dataLayer','GTM-W6N7PB');</script>
56
+ <!-- End Google Tag Manager -->
57
+ </head>
58
+ <body></body>
59
+ </html>
@@ -0,0 +1,15 @@
1
+ {
2
+ "short_name": "OpenStax",
3
+ "name": "OpenStax",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ }
10
+ ],
11
+ "start_url": ".",
12
+ "display": "standalone",
13
+ "theme_color": "#000000",
14
+ "background_color": "#ffffff"
15
+ }
@@ -0,0 +1,3 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow: /
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bash
2
+ # spell-checker: ignore pipefail newkey outform keyout extfile
3
+ set -euo pipefail; if [ -n "${DEBUG-}" ]; then set -x; fi
4
+
5
+ project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )"
6
+ shared_certificate_dir=~/.openstax/certs
7
+
8
+ mkdir -p "$project_dir/data"
9
+ mkdir -p "$shared_certificate_dir"
10
+ cd "$project_dir/data"
11
+
12
+ host=${HOST:-localhost}
13
+
14
+ # links about this logic
15
+ # - https://stackoverflow.com/questions/43929436/subject-alternative-name-missing-err-ssl-version-or-cipher-mismatch
16
+ # - https://stackoverflow.com/questions/64597721/neterr-cert-validity-too-long-the-server-certificate-has-a-validity-period-t
17
+ # - https://devopscube.com/create-self-signed-certificates-openssl/
18
+
19
+ if [ ! -f "$shared_certificate_dir/CA.cer" ] || [ ! -f "$shared_certificate_dir/CA.pvk" ]; then
20
+ echo "creating self signed authority"
21
+ cat << EOF > "$shared_certificate_dir/cert.cfn"
22
+ [ req ]
23
+ distinguished_name = req_distinguished_name
24
+ x509_extensions = root_ca
25
+
26
+ [ req_distinguished_name ]
27
+ commonName = openstax.local
28
+
29
+ [ root_ca ]
30
+ basicConstraints = critical, CA:true
31
+ EOF
32
+ openssl req -x509 -sha256 -days 356 -nodes -newkey rsa:2048 -config "$shared_certificate_dir/cert.cfn" -subj "/CN=Openstax.local" \
33
+ -keyout "$shared_certificate_dir/CA.pvk" \
34
+ -out "$shared_certificate_dir/CA.cer"
35
+ fi
36
+
37
+ if [ ! -f "$host.pvk" ] || [ ! -f "$host.cer" ]; then
38
+ cat << EOF > "$project_dir/data/$host.ext"
39
+ subjectAltName = @alt_names
40
+ extendedKeyUsage = serverAuth
41
+
42
+ [alt_names]
43
+ DNS.1 = $host
44
+ EOF
45
+ openssl req -newkey rsa:2048 -keyout "$host.pvk" -out "$host.req" -subj /CN="$host" -sha256 -nodes
46
+ openssl x509 -req \
47
+ -CA "$shared_certificate_dir/CA.cer" -CAkey "$shared_certificate_dir/CA.pvk" \
48
+ -in "$host.req" -out "$host.cer" -days 397 -extfile "$host.ext" -sha256
49
+ fi
@@ -0,0 +1,11 @@
1
+ // tslint:disable:no-console
2
+ const { argv } = require('yargs');
3
+ const { startServer } = require('.');
4
+
5
+ startServer(argv)
6
+ .then(({port}) => console.log(`WEBSERVER: running on port: ${port}`))
7
+ .catch((e) => {
8
+ console.error(e.message);
9
+ process.exit(1);
10
+ })
11
+ ;
@@ -0,0 +1,47 @@
1
+ const express = require('express');
2
+ const http = require('http');
3
+ const path = require('path');
4
+ const serveStatic = require('serve-static');
5
+ const setupProxy = require('../../src/setupProxy');
6
+
7
+ const makeFallback = (serve) => (req, res, next) => {
8
+ req.url = '/index.html';
9
+ serve(req, res, next);
10
+ };
11
+
12
+ const makeServe = (baseDir) => {
13
+ return serveStatic(baseDir, {redirect: false});
14
+ };
15
+
16
+ const makeOptions = (options) => ({
17
+ port: process.env.PORT,
18
+ ...options,
19
+ baseDir: path.join(__dirname, '../../build'),
20
+ onlyProxy: !!options.onlyProxy,
21
+ });
22
+
23
+ const makeMiddleware = (options) => {
24
+ const app = express();
25
+
26
+ setupProxy(app);
27
+
28
+ if (!options.onlyProxy) {
29
+ const serve = makeServe(options.baseDir);
30
+ app.use(serve);
31
+ app.use(makeFallback(serve));
32
+ }
33
+
34
+ return app;
35
+ };
36
+
37
+ const startServer = (options) => new Promise((resolve) => {
38
+ const serverConfig = makeOptions(options);
39
+ const app = makeMiddleware(serverConfig);
40
+ const server = http.createServer(app);
41
+
42
+ server.listen(serverConfig.port, () => resolve({server, port: serverConfig.port}));
43
+ });
44
+
45
+ module.exports = {
46
+ startServer
47
+ };
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+ # spell-checker: ignore pipefail
3
+ set -euo pipefail; if [ -n "${DEBUG-}" ]; then set -x; fi
4
+
5
+ project_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )"
6
+ shared_certificate_dir=~/.openstax/certs
7
+
8
+ mkdir -p "$project_dir/data"
9
+
10
+ ./script/make-certificate.bash
11
+
12
+ cd "$project_dir"
13
+
14
+ # nodejs does not use system certs by default
15
+ # - https://github.com/nodejs/node/issues/39657
16
+ export NODE_EXTRA_CA_CERTS="$shared_certificate_dir/CA.cer"
17
+ export SSL_CRT_FILE="$project_dir/data/${HOST:-localhost}.cer"
18
+ export SSL_KEY_FILE="$project_dir/data/${HOST:-localhost}.pvk";
19
+ export HTTPS=true
20
+ export BROWSER=none
21
+
22
+ yarn react-scripts start
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env bash
2
+ # spell-checker: ignore pipefail Keychains keychain
3
+ set -euo pipefail; if [ -n "${DEBUG-}" ]; then set -x; fi
4
+
5
+ shared_certificate_dir=~/.openstax/certs
6
+
7
+ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "$shared_certificate_dir"/CA.cer
@@ -0,0 +1,10 @@
1
+ import { browserAuthProvider } from '@openstax/ts-utils/services/authProvider/browser';
2
+ import { FrontendConfigProvider } from '../configProvider';
3
+
4
+ export const createAuthProvider = (
5
+ ...args: Parameters<typeof browserAuthProvider>
6
+ ) => (configProvider: FrontendConfigProvider) => browserAuthProvider(...args)({
7
+ auth: {
8
+ accountsBase: () => configProvider.getValue('accountsBase'),
9
+ }
10
+ });
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { User } from "@openstax/ts-utils/services/authProvider";
3
+ import { useServices } from "../core/context/services";
4
+ import { useSetAppError } from '@openstax/ui-components';
5
+ import { FetchState, fetchSuccess, fetchLoading } from "@openstax/ts-utils/fetch";
6
+ import { useFrontendConfigValue } from '../configProvider/use';
7
+
8
+ export const useAuth = () => {
9
+ const authProvider = useServices().authProvider;
10
+ const setAppError = useSetAppError();
11
+ const [state, setUser] = React.useState<FetchState<User | undefined, string>>(fetchLoading());
12
+
13
+ React.useEffect(() => {
14
+ authProvider.getUser()
15
+ .then(user => setUser(fetchSuccess(user)))
16
+ .catch(setAppError);
17
+ }, [authProvider, setAppError]);
18
+
19
+ return state;
20
+ };
21
+
22
+ export const useUserRoles = () => {
23
+ const roleValidator = useServices().roleValidator;
24
+ const [state, setRoles] = React.useState<FetchState<string[], string>>(fetchLoading());
25
+
26
+ React.useEffect(() => {
27
+ roleValidator.getUserRoles().then(roles => setRoles(fetchSuccess(roles)));
28
+ }, [roleValidator]);
29
+
30
+ return state;
31
+ };
32
+
33
+ export const useAccountsBase = () => useFrontendConfigValue('accountsBase');
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import * as UI from '@openstax/ui-components';
3
+ import { useQuery } from 'routing/useQuery';
4
+ import queryString from 'query-string';
5
+ import { useRouteLinkOnClick } from 'routing/components/RouteLink';
6
+
7
+ export const Pagination = (props: {
8
+ currentPage: number;
9
+ totalPages: number;
10
+ totalItems?: number;
11
+ pageSize?: number;
12
+ }) => {
13
+ const query = useQuery();
14
+ const navigate = useRouteLinkOnClick();
15
+
16
+ return <UI.Pagination
17
+ {...props} showFromEnd={1} showFromCurrent={1}
18
+ Page={({ page, current }) => {
19
+ return <UI.LinkForPage
20
+ page={page} current={current}
21
+ href={"?" + queryString.stringify({ ...query, page })}
22
+ onClick={navigate}
23
+ />;
24
+ }}
25
+ />;
26
+ };
@@ -0,0 +1,53 @@
1
+ /* eslint-disable import/no-webpack-loader-syntax */
2
+ import { TRoutes as ApiRoutes } from '@project/lambdas/build/src/functions/serviceApi/core/routes';
3
+ import type {
4
+ FrontendConfigProvider as LambdaFrontendConfigProvider
5
+ } from '@project/lambdas/build/src/functions/serviceApi/versions/v0';
6
+ import { once } from '@openstax/ts-utils';
7
+ import { ConfigForConfigProvider } from '@openstax/ts-utils/config';
8
+ import type { createApiGateway } from '@openstax/ts-utils/services/apiGateway';
9
+ // @ts-ignore-next-line
10
+ import routes from '!!val-loader!@project/lambdas/build/script/utils/routeDataLoader';
11
+
12
+ export type FrontendConfig = ConfigForConfigProvider<LambdaFrontendConfigProvider>;
13
+
14
+ const config = {
15
+ apiBase: () => '/'
16
+ };
17
+
18
+ const getApiGateway = (makeApiGateway: ReturnType<typeof createApiGateway>) => {
19
+ return makeApiGateway<ApiRoutes>(config, routes);
20
+ };
21
+
22
+ declare global {
23
+ interface Window {
24
+ _OX_FRONTEND_CONFIG?: FrontendConfig;
25
+ }
26
+ }
27
+
28
+ const loadConfig = (apiGateway: ReturnType<typeof getApiGateway>) => async() => {
29
+ if (window._OX_FRONTEND_CONFIG) { return window._OX_FRONTEND_CONFIG; }
30
+
31
+ // For backwards compatibility. Remove if the frontend config is removed from this API.
32
+ const response = await apiGateway.apiV0Info({});
33
+ const loadedResponse = await (await response.acceptStatus(200)).load();
34
+ return loadedResponse.config;
35
+ };
36
+
37
+ export const frontendConfigProvider = (makeApiGateway: ReturnType<typeof createApiGateway>) => {
38
+ const apiGateway = getApiGateway(makeApiGateway);
39
+ const getConfig = once(loadConfig(apiGateway));
40
+
41
+ const getValue = async(name: keyof FrontendConfig) => {
42
+ const frontendConfig = await getConfig();
43
+ if (name in frontendConfig) {
44
+ return frontendConfig[name];
45
+ }
46
+ throw new Error(`Frontend Config variable ${name} not found in in /api/v0/info`);
47
+ };
48
+
49
+ return { getConfig, getValue };
50
+ };
51
+
52
+
53
+ export type FrontendConfigProvider = ReturnType<typeof frontendConfigProvider>;
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import { fetchError, FetchStateType, fetchSuccess, fetchLoading, FetchState } from '@openstax/ts-utils/fetch';
3
+ import { useSetAppError } from '@openstax/ui-components';
4
+ import { FrontendConfig } from '.';
5
+ import { useServices } from '../core/context/services';
6
+
7
+ export const useFrontendConfig = () => {
8
+ const frontendConfigProvider = useServices().configProvider;
9
+ const [frontendConfig, setFrontendConfig] = React.useState<FetchState<FrontendConfig, string>>(fetchLoading());
10
+ const setAppError = useSetAppError();
11
+
12
+ React.useEffect(() => {
13
+ frontendConfigProvider.getConfig()
14
+ .then((ee) => setFrontendConfig(fetchSuccess(ee)))
15
+ .catch(setAppError);
16
+ }, [frontendConfigProvider, setAppError]);
17
+
18
+ return frontendConfig;
19
+ };
20
+
21
+ export const useFrontendConfigValue = (name: keyof FrontendConfig) => {
22
+ const [frontendConfigValue, setFrontendConfigValue] = React.useState<
23
+ FetchState<string, string>
24
+ >(fetchLoading());
25
+ const frontendConfig = useFrontendConfig();
26
+
27
+ React.useEffect(() => {
28
+ if (frontendConfig.type === FetchStateType.SUCCESS) {
29
+ const data = frontendConfig.data[name];
30
+ setFrontendConfigValue(previous => data
31
+ ? fetchSuccess(data)
32
+ : fetchError('configuration missing', previous)
33
+ );
34
+ } else if (frontendConfig.type === FetchStateType.ERROR) {
35
+ setFrontendConfigValue(previous => fetchError('error loading config', previous));
36
+ }
37
+ }, [frontendConfig, name]);
38
+
39
+
40
+ return frontendConfigValue;
41
+ };
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { ServiceContext, serviceProviderMiddleware } from "./services";
4
+ import { AppServices } from "../types";
5
+
6
+ afterEach(() => {
7
+ jest.resetAllMocks();
8
+ });
9
+
10
+ describe('ServicesContext', () => {
11
+ it('throws without a provider', () => {
12
+ jest.spyOn(console, 'error').mockReturnValue(undefined);
13
+
14
+ const Test = () => {
15
+ React.useContext(ServiceContext)();
16
+
17
+ return <div />;
18
+ };
19
+
20
+ expect(() => render(<Test />)).toThrow();
21
+ });
22
+ });
23
+
24
+ describe('serviceProviderMiddleware', () => {
25
+ it('provides services', () => {
26
+ const services = {text: 'cool text'} as any as AppServices;
27
+
28
+ const InnerTest = () => {
29
+ const services = React.useContext(ServiceContext)();
30
+ return <span>{(services as any).text}</span>;
31
+ };
32
+ const Test = () => <>{serviceProviderMiddleware(services)(<InnerTest />)}</>;
33
+
34
+ render(<Test />);
35
+
36
+ const textElement = screen.getByText(/cool text/i);
37
+ expect(textElement).toBeInTheDocument();
38
+ });
39
+ });
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import { AppServices } from "../types";
3
+
4
+ export const ServiceContext = React.createContext<() => AppServices>(
5
+ () => { throw new Error('context not provided'); }
6
+ );
7
+
8
+ export const serviceProviderMiddleware = (services: AppServices) => (route: React.ReactNode) =>
9
+ <ServiceContext.Provider value={() => services}>
10
+ {route}
11
+ </ServiceContext.Provider>
12
+ ;
13
+
14
+ export const useServices = () => {
15
+ return React.useContext(ServiceContext)();
16
+ };
@@ -0,0 +1,7 @@
1
+ import { routes } from ".";
2
+
3
+ describe('gets routes', () => {
4
+ it('doesn\'t error', () => {
5
+ expect(routes).not.toThrow();
6
+ });
7
+ });
@@ -0,0 +1,20 @@
1
+ import {ReactNode} from 'react';
2
+ import { makeRenderRouteUrl } from '@openstax/ts-utils/routing';
3
+ import { getKeyValue } from '@openstax/ts-utils';
4
+ import { exampleRoutes } from "../example/screens";
5
+ import { makeGetRequestResponder } from '@openstax/ts-utils/routing';
6
+ import { AppServices } from './types';
7
+ import { Location } from "history";
8
+
9
+ export const routes = () => ([
10
+ ...exampleRoutes(),
11
+ ]);
12
+
13
+ export type TRoutes = (ReturnType<typeof routes>)[number];
14
+
15
+ export const renderRouteUrl = makeRenderRouteUrl<TRoutes>();
16
+
17
+ export const getRequestResponder = makeGetRequestResponder<AppServices, TRoutes, Location, ReactNode>()({
18
+ routes,
19
+ pathExtractor: getKeyValue('pathname'),
20
+ });
@@ -0,0 +1,14 @@
1
+ import React, {ReactNode} from 'react';
2
+ import { makeCreateRoute } from '@openstax/ts-utils/routing';
3
+ import { makeComposeMiddleware } from '@openstax/ts-utils/middleware';
4
+ import { AppServices } from './types';
5
+ import { Location } from "history";
6
+
7
+ export const composeRequestServiceMiddleware = makeComposeMiddleware<AppServices, {request: Location}>();
8
+ export const composeResponseServiceMiddleware = makeComposeMiddleware<AppServices, ReactNode>();
9
+
10
+ export const createRoute = makeCreateRoute<AppServices, Location>();
11
+
12
+ export const makeScreen = <P,>(Screen: React.ComponentType<P>) => (params: {} extends P ? undefined : P) => {
13
+ return <Screen {...params as any} />;
14
+ };
@@ -0,0 +1,3 @@
1
+ import { BrowserServices } from "..";
2
+
3
+ export type AppServices = BrowserServices;
@@ -0,0 +1,28 @@
1
+ /* eslint-disable import/no-webpack-loader-syntax */
2
+ import {TRoutes as ApiRoutes} from '@project/lambdas/build/src/functions/serviceApi/core/routes';
3
+ // @ts-ignore-next-line
4
+ import routes from '!!val-loader!@project/lambdas/build/script/utils/routeDataLoader';
5
+ import { AppServices } from "../core/types";
6
+ import { useServices } from "../core/context/services";
7
+ import {assertDefined} from "@openstax/ts-utils/assertions";
8
+ import React from 'react';
9
+
10
+ // TODO - figure out how to wire the envConfig into the CRA build
11
+ const config = {
12
+ apiBase: () => process.env.NODE_ENV === 'production'
13
+ ? assertDefined(process.env.REACT_APP_API_BASE_URL, 'REACT_APP_API_BASE_URL must be provided in production')
14
+ : '/'
15
+ };
16
+
17
+ export const createApiClient = (app: AppServices) => {
18
+ return app.createApiGateway<ApiRoutes>(config, routes, app);
19
+ };
20
+
21
+ export const useApiClient = () => {
22
+ const services = useServices();
23
+ const apiClientRef = React.useRef(createApiClient(services));
24
+ return apiClientRef.current;
25
+ };
26
+
27
+
28
+ export type ApiClient = ReturnType<typeof createApiClient>;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { BodyPortal, BodyPortalSlotsContext } from '@openstax/ui-components';
3
+ import { thingListScreen } from '../screens/ThingList';
4
+ import { homeScreen } from '../screens/Home';
5
+ import { RouteLink } from '../../routing/components/RouteLink';
6
+
7
+ interface Props {
8
+ title: string;
9
+ }
10
+
11
+ export const Layout = (props: React.PropsWithChildren<Props>) => {
12
+
13
+ return <BodyPortalSlotsContext.Provider value={['nav', 'root']}>
14
+ <BodyPortal slot='nav' tagName='nav'>
15
+ <ol>
16
+ <li><RouteLink route={homeScreen}>Home</RouteLink></li>
17
+ <li><RouteLink route={thingListScreen}>Thing List</RouteLink></li>
18
+ </ol>
19
+ </BodyPortal>
20
+ <h1>{props.title}</h1>
21
+ {props.children}
22
+ </BodyPortalSlotsContext.Provider>;
23
+ };
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ import { render, screen, waitFor } from '@testing-library/react';
3
+ import { homeScreen } from "./Home";
4
+ import { TestServiceProvider, testApiGateway } from "../../tests/testServices";
5
+ import { ApiUser, stubAuthProvider } from "@openstax/ts-utils/services/authProvider";
6
+ import { UpdatableUserFields } from "@openstax/ts-utils/services/authProvider/browser";
7
+
8
+ beforeEach(() => {
9
+ testApiGateway.apiV0Info = jest.fn().mockReturnValue(Promise.resolve({
10
+ acceptStatus: (...num: number[]) => Promise.resolve({load: () => ({message: 'message'})}),
11
+ }));
12
+ });
13
+
14
+ afterEach(() => {
15
+ delete testApiGateway.apiV0Info;
16
+ jest.clearAllMocks();
17
+ });
18
+
19
+ describe('Home', () => {
20
+ it('renders logged out', async() => {
21
+ const services = {
22
+ configProvider: {
23
+ getConfig: async() => ({
24
+ roleApplication: 'test',
25
+ exampleMessage: 'hello from /api/v0/info',
26
+ }),
27
+ } as any,
28
+ };
29
+ render(<TestServiceProvider {...services}>{homeScreen.handler(undefined, {} as any)}</TestServiceProvider>);
30
+
31
+ await waitFor(() => {
32
+ const linkElement = screen.getByText(/login/i);
33
+ expect(linkElement).toBeInTheDocument();
34
+ });
35
+ });
36
+
37
+ it('renders logged in', async() => {
38
+ const token = '';
39
+ const user = {} as ApiUser;
40
+ const services = {
41
+ authProvider: {
42
+ ...stubAuthProvider(user),
43
+ getAuthToken: () => Promise.resolve(token),
44
+ getAuthorizedUrl: (url: string) => url,
45
+ getAuthorizedLinkUrl: (url: string) => url,
46
+ getAuthorizedEmbedUrl: (url: string) => url,
47
+ updateUser: (_updates: UpdatableUserFields) => Promise.resolve({user, token}),
48
+ },
49
+ configProvider: {
50
+ getConfig: async() => ({
51
+ roleApplication: 'test',
52
+ exampleMessage: 'hello from /api/v0/info',
53
+ }),
54
+ } as any,
55
+ };
56
+ render(<TestServiceProvider {...services}>{homeScreen.handler(undefined, {} as any)}</TestServiceProvider>);
57
+
58
+ await waitFor(() => {
59
+ const messageElement = screen.getByText('hello from /api/v0/info');
60
+ expect(messageElement).toBeInTheDocument();
61
+ });
62
+
63
+ await waitFor(() => {
64
+ const linkElement = screen.getByText(/logout/i);
65
+ expect(linkElement).toBeInTheDocument();
66
+ });
67
+ });
68
+ });