codeforlife 2.8.3 → 2.9.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 (454) hide show
  1. package/dist/Countdown-DFI1RljW.js +28 -0
  2. package/dist/Countdown-DFI1RljW.js.map +1 -0
  3. package/dist/Countdown-zY3nMzmi.cjs +2 -0
  4. package/dist/Countdown-zY3nMzmi.cjs.map +1 -0
  5. package/dist/Image-D5jC9UoX.js +21 -0
  6. package/dist/Image-D5jC9UoX.js.map +1 -0
  7. package/dist/Image-mgT45r_B.cjs +2 -0
  8. package/dist/Image-mgT45r_B.cjs.map +1 -0
  9. package/dist/LinkButton-BYFkvL_O.cjs +2 -0
  10. package/dist/LinkButton-BYFkvL_O.cjs.map +1 -0
  11. package/dist/LinkButton-oK0RThqn.js +12 -0
  12. package/dist/LinkButton-oK0RThqn.js.map +1 -0
  13. package/dist/Navigate-Dq47aqC8.js +25 -0
  14. package/dist/Navigate-Dq47aqC8.js.map +1 -0
  15. package/dist/Navigate-dQocLhzN.cjs +2 -0
  16. package/dist/Navigate-dQocLhzN.cjs.map +1 -0
  17. package/dist/api/createApi.d.ts +7 -0
  18. package/dist/api/endpoints/authFactor.d.ts +11 -0
  19. package/dist/api/endpoints/index.cjs.js +2 -0
  20. package/dist/api/endpoints/index.cjs.js.map +1 -0
  21. package/dist/api/endpoints/index.d.ts +9 -0
  22. package/dist/api/endpoints/index.es.js +78 -0
  23. package/dist/api/endpoints/index.es.js.map +1 -0
  24. package/dist/api/endpoints/klass.d.ts +26 -0
  25. package/dist/api/endpoints/school.d.ts +11 -0
  26. package/dist/api/endpoints/session.d.ts +9 -0
  27. package/dist/api/endpoints/user.d.ts +19 -0
  28. package/dist/api/index.cjs.js +4 -0
  29. package/dist/api/index.cjs.js.map +1 -0
  30. package/dist/api/index.d.ts +5 -0
  31. package/dist/api/index.es.js +541 -0
  32. package/dist/api/index.es.js.map +1 -0
  33. package/dist/api/models.d.ts +92 -0
  34. package/dist/api/schemas.d.ts +20 -0
  35. package/dist/api/tagTypes.d.ts +3 -0
  36. package/dist/api/urls.d.ts +31 -0
  37. package/dist/api-Cbyt3rw0.js +92 -0
  38. package/dist/api-Cbyt3rw0.js.map +1 -0
  39. package/dist/api-CnMfjRk3.cjs +2 -0
  40. package/dist/api-CnMfjRk3.cjs.map +1 -0
  41. package/dist/api-Cs4Y-WeI.js +20 -0
  42. package/dist/api-Cs4Y-WeI.js.map +1 -0
  43. package/dist/api-DIgp_6Vr.cjs +2 -0
  44. package/dist/api-DIgp_6Vr.cjs.map +1 -0
  45. package/dist/auth-BPfUPjmM.js +237 -0
  46. package/dist/auth-BPfUPjmM.js.map +1 -0
  47. package/dist/auth-Vf1MgMci.cjs +2 -0
  48. package/dist/auth-Vf1MgMci.cjs.map +1 -0
  49. package/dist/components/App.d.ts +18 -0
  50. package/dist/components/ClickableTooltip.d.ts +6 -0
  51. package/dist/components/CopyIconButton.d.ts +7 -0
  52. package/dist/components/CopyIconButton.test.d.ts +1 -0
  53. package/dist/components/Countdown.d.ts +9 -0
  54. package/dist/components/DownloadFileButton.d.ts +13 -0
  55. package/dist/components/ElevatedAppBar.d.ts +8 -0
  56. package/dist/components/Image.d.ts +10 -0
  57. package/dist/components/InputFileButton.d.ts +7 -0
  58. package/dist/components/ItemizedList.d.ts +11 -0
  59. package/dist/components/OrderedGrid.d.ts +21 -0
  60. package/dist/components/ScrollIntoViewLink.d.ts +8 -0
  61. package/dist/components/SyncError.d.ts +5 -0
  62. package/dist/components/TablePagination.d.ts +20 -0
  63. package/dist/components/YouTubeVideo.d.ts +7 -0
  64. package/dist/components/form/ApiAutocompleteField.d.ts +14 -0
  65. package/dist/components/form/AutocompleteField.d.ts +11 -0
  66. package/dist/components/form/CheckboxField.d.ts +11 -0
  67. package/dist/components/form/CountryField.d.ts +10 -0
  68. package/dist/components/form/DatePickerField.d.ts +10 -0
  69. package/dist/components/form/EmailField.d.ts +5 -0
  70. package/dist/components/form/FirstNameField.d.ts +5 -0
  71. package/dist/components/form/Form.d.ts +36 -0
  72. package/dist/components/form/OtpField.d.ts +5 -0
  73. package/dist/components/form/PasswordField.d.ts +9 -0
  74. package/dist/components/form/RepeatField.d.ts +9 -0
  75. package/dist/components/form/SubmitButton.d.ts +6 -0
  76. package/dist/components/form/TextField.d.ts +14 -0
  77. package/dist/components/form/UkCountyField.d.ts +10 -0
  78. package/dist/components/form/index.cjs.js +2 -0
  79. package/dist/components/form/index.cjs.js.map +1 -0
  80. package/dist/components/form/index.d.ts +14 -0
  81. package/dist/components/form/index.es.js +18 -0
  82. package/dist/components/form/index.es.js.map +1 -0
  83. package/dist/components/index.cjs.js +11 -0
  84. package/dist/components/index.cjs.js.map +1 -0
  85. package/dist/components/index.d.ts +18 -0
  86. package/dist/components/index.es.js +383 -0
  87. package/dist/components/index.es.js.map +1 -0
  88. package/dist/components/page/Banner.d.ts +13 -0
  89. package/dist/components/page/Notification.d.ts +10 -0
  90. package/dist/components/page/Page.d.ts +19 -0
  91. package/dist/components/page/Section.d.ts +7 -0
  92. package/dist/components/page/TabBar.d.ts +13 -0
  93. package/dist/components/page/index.cjs.js +2 -0
  94. package/dist/components/page/index.cjs.js.map +1 -0
  95. package/dist/components/page/index.d.ts +5 -0
  96. package/dist/components/page/index.es.js +9 -0
  97. package/dist/components/page/index.es.js.map +1 -0
  98. package/dist/components/router/Link.d.ts +9 -0
  99. package/dist/components/router/LinkButton.d.ts +9 -0
  100. package/dist/components/router/LinkIconButton.d.ts +9 -0
  101. package/dist/components/router/LinkListItem.d.ts +9 -0
  102. package/dist/components/router/LinkTab.d.ts +9 -0
  103. package/dist/components/router/Navigate.d.ts +15 -0
  104. package/dist/components/router/index.cjs.js +2 -0
  105. package/dist/components/router/index.cjs.js.map +1 -0
  106. package/dist/components/router/index.d.ts +6 -0
  107. package/dist/components/router/index.es.js +11 -0
  108. package/dist/components/router/index.es.js.map +1 -0
  109. package/dist/components/table/CellStack.d.ts +7 -0
  110. package/dist/components/table/Table.d.ts +12 -0
  111. package/dist/components/table/index.cjs.js +2 -0
  112. package/dist/components/table/index.cjs.js.map +1 -0
  113. package/dist/components/table/index.d.ts +3 -0
  114. package/dist/components/table/index.es.js +9 -0
  115. package/dist/components/table/index.es.js.map +1 -0
  116. package/dist/en-gb-B_rK7Jx1.js +20 -0
  117. package/dist/en-gb-B_rK7Jx1.js.map +1 -0
  118. package/dist/en-gb-CpyEkKq3.cjs +2 -0
  119. package/dist/en-gb-CpyEkKq3.cjs.map +1 -0
  120. package/dist/features/InactiveDialog.d.ts +7 -0
  121. package/dist/features/ScreenTimeDialog.d.ts +7 -0
  122. package/dist/features/index.cjs.js +2 -0
  123. package/dist/features/index.cjs.js.map +1 -0
  124. package/dist/features/index.d.ts +4 -0
  125. package/dist/features/index.es.js +47 -0
  126. package/dist/features/index.es.js.map +1 -0
  127. package/dist/general-BPbbmkeX.cjs +2 -0
  128. package/dist/general-BPbbmkeX.cjs.map +1 -0
  129. package/dist/general-CtTJPCJn.js +58 -0
  130. package/dist/general-CtTJPCJn.js.map +1 -0
  131. package/dist/hooks/api.d.ts +15 -0
  132. package/dist/hooks/auth.d.ts +46 -0
  133. package/{src/hooks/form.tsx → dist/hooks/form.d.ts} +2 -5
  134. package/dist/hooks/general.d.ts +13 -0
  135. package/dist/hooks/index.cjs.js +2 -0
  136. package/dist/hooks/index.cjs.js.map +1 -0
  137. package/dist/hooks/index.d.ts +5 -0
  138. package/dist/hooks/index.es.js +25 -0
  139. package/dist/hooks/index.es.js.map +1 -0
  140. package/dist/hooks/router.d.ts +29 -0
  141. package/dist/index-2W--_sNE.js +30 -0
  142. package/dist/index-2W--_sNE.js.map +1 -0
  143. package/dist/index-BUMdUVBH.cjs +5 -0
  144. package/dist/index-BUMdUVBH.cjs.map +1 -0
  145. package/dist/index-B_Zy_zwA.cjs +2 -0
  146. package/dist/index-B_Zy_zwA.cjs.map +1 -0
  147. package/dist/index-BgsynEGX.cjs +2 -0
  148. package/dist/index-BgsynEGX.cjs.map +1 -0
  149. package/dist/index-CA-ugBSa.cjs +2 -0
  150. package/dist/index-CA-ugBSa.cjs.map +1 -0
  151. package/dist/index-CNtOlJ49.js +572 -0
  152. package/dist/index-CNtOlJ49.js.map +1 -0
  153. package/dist/index-DkM_cG3a.js +237 -0
  154. package/dist/index-DkM_cG3a.js.map +1 -0
  155. package/dist/index-Dqp7dpn3.js +1111 -0
  156. package/dist/index-Dqp7dpn3.js.map +1 -0
  157. package/dist/index.cjs.js +2 -0
  158. package/dist/index.cjs.js.map +1 -0
  159. package/dist/index.d.ts +2 -0
  160. package/dist/index.es.js +7 -0
  161. package/dist/index.es.js.map +1 -0
  162. package/dist/jsx-runtime-CeSfJrVB.cjs +31 -0
  163. package/dist/jsx-runtime-CeSfJrVB.cjs.map +1 -0
  164. package/dist/jsx-runtime-Dpn_P65e.js +634 -0
  165. package/dist/jsx-runtime-Dpn_P65e.js.map +1 -0
  166. package/dist/middlewares/index.cjs.js +2 -0
  167. package/dist/middlewares/index.cjs.js.map +1 -0
  168. package/dist/middlewares/index.d.ts +1 -0
  169. package/dist/middlewares/index.es.js +10 -0
  170. package/dist/middlewares/index.es.js.map +1 -0
  171. package/dist/middlewares/session.d.ts +2 -0
  172. package/dist/palette-CE2mKYse.cjs +2 -0
  173. package/dist/palette-CE2mKYse.cjs.map +1 -0
  174. package/dist/palette-C_L0akN_.js +43 -0
  175. package/dist/palette-C_L0akN_.js.map +1 -0
  176. package/dist/rtk-query.modern-CjetfYPg.js +3038 -0
  177. package/dist/rtk-query.modern-CjetfYPg.js.map +1 -0
  178. package/dist/rtk-query.modern-PBCErCqb.cjs +15 -0
  179. package/dist/rtk-query.modern-PBCErCqb.cjs.map +1 -0
  180. package/dist/schemas-BZbJpkD5.cjs +2 -0
  181. package/dist/schemas-BZbJpkD5.cjs.map +1 -0
  182. package/dist/schemas-DlOtf2vf.js +162 -0
  183. package/dist/schemas-DlOtf2vf.js.map +1 -0
  184. package/dist/scripts/index.d.ts +0 -0
  185. package/dist/server.cjs.js +6 -0
  186. package/dist/server.cjs.js.map +1 -0
  187. package/dist/server.d.ts +44 -0
  188. package/dist/server.es.js +127 -0
  189. package/dist/server.es.js.map +1 -0
  190. package/dist/session-CE2U7oL1.cjs +2 -0
  191. package/dist/session-CE2U7oL1.cjs.map +1 -0
  192. package/dist/session-CacrgFSv.cjs +2 -0
  193. package/dist/session-CacrgFSv.cjs.map +1 -0
  194. package/dist/session-D312kYKk.js +32 -0
  195. package/dist/session-D312kYKk.js.map +1 -0
  196. package/dist/session-oI-Ht2C8.js +30 -0
  197. package/dist/session-oI-Ht2C8.js.map +1 -0
  198. package/dist/settings/custom.d.ts +11 -0
  199. package/dist/settings/index.cjs.js +2 -0
  200. package/dist/settings/index.cjs.js.map +1 -0
  201. package/dist/settings/index.d.ts +4 -0
  202. package/dist/settings/index.es.js +17 -0
  203. package/dist/settings/index.es.js.map +1 -0
  204. package/dist/settings/vite.d.ts +10 -0
  205. package/dist/setupTests.d.ts +0 -0
  206. package/dist/slices/createSlice.d.ts +3 -0
  207. package/dist/slices/index.cjs.js +2 -0
  208. package/dist/slices/index.cjs.js.map +1 -0
  209. package/dist/slices/index.d.ts +2 -0
  210. package/dist/slices/index.es.js +6 -0
  211. package/dist/slices/index.es.js.map +1 -0
  212. package/dist/slices/session.d.ts +28 -0
  213. package/dist/style.css +1 -0
  214. package/dist/theme/ThemedBox.d.ts +10 -0
  215. package/dist/theme/colors.d.ts +18 -0
  216. package/dist/theme/components/MuiAccordion.d.ts +3 -0
  217. package/dist/theme/components/MuiAutocomplete.d.ts +3 -0
  218. package/dist/theme/components/MuiButton.d.ts +3 -0
  219. package/dist/theme/components/MuiCardActions.d.ts +3 -0
  220. package/dist/theme/components/MuiCheckbox.d.ts +3 -0
  221. package/dist/theme/components/MuiContainer.d.ts +3 -0
  222. package/dist/theme/components/MuiDialog.d.ts +3 -0
  223. package/dist/theme/components/MuiFormControlLabel.d.ts +3 -0
  224. package/dist/theme/components/MuiFormHelperText.d.ts +3 -0
  225. package/dist/theme/components/MuiGrid2.d.ts +3 -0
  226. package/dist/theme/components/MuiInputBase.d.ts +3 -0
  227. package/dist/theme/components/MuiLink.d.ts +3 -0
  228. package/dist/theme/components/MuiList.d.ts +3 -0
  229. package/dist/theme/components/MuiListItemText.d.ts +3 -0
  230. package/dist/theme/components/MuiMenu.d.ts +3 -0
  231. package/dist/theme/components/MuiMenuItem.d.ts +3 -0
  232. package/dist/theme/components/MuiSelect.d.ts +3 -0
  233. package/dist/theme/components/MuiTab.d.ts +3 -0
  234. package/dist/theme/components/MuiTable.d.ts +3 -0
  235. package/dist/theme/components/MuiTableBody.d.ts +3 -0
  236. package/dist/theme/components/MuiTableHead.d.ts +3 -0
  237. package/dist/theme/components/MuiTabs.d.ts +3 -0
  238. package/dist/theme/components/MuiTextField.d.ts +3 -0
  239. package/dist/theme/components/MuiToolbar.d.ts +3 -0
  240. package/dist/theme/components/MuiTypography.d.ts +3 -0
  241. package/dist/theme/components/_components.d.ts +11 -0
  242. package/dist/theme/components/index.cjs.js +2 -0
  243. package/dist/theme/components/index.cjs.js.map +1 -0
  244. package/dist/theme/components/index.d.ts +3 -0
  245. package/dist/theme/components/index.es.js +6 -0
  246. package/dist/theme/components/index.es.js.map +1 -0
  247. package/dist/theme/index.cjs.js +2 -0
  248. package/dist/theme/index.cjs.js.map +1 -0
  249. package/dist/theme/index.d.ts +7 -0
  250. package/dist/theme/index.es.js +222 -0
  251. package/dist/theme/index.es.js.map +1 -0
  252. package/dist/theme/palette.d.ts +79 -0
  253. package/dist/theme/spacing.d.ts +1 -0
  254. package/dist/theme/typography.d.ts +4 -0
  255. package/dist/urls-DtHr1d3H.js +14 -0
  256. package/dist/urls-DtHr1d3H.js.map +1 -0
  257. package/dist/urls-MaVXL_C2.cjs +2 -0
  258. package/dist/urls-MaVXL_C2.cjs.map +1 -0
  259. package/dist/utils/api.cjs.js +2 -0
  260. package/dist/utils/api.cjs.js.map +1 -0
  261. package/dist/utils/api.d.ts +72 -0
  262. package/dist/utils/api.es.js +16 -0
  263. package/dist/utils/api.es.js.map +1 -0
  264. package/dist/utils/api.test.d.ts +1 -0
  265. package/dist/utils/auth.cjs.js +2 -0
  266. package/dist/utils/auth.cjs.js.map +1 -0
  267. package/dist/utils/auth.d.ts +28 -0
  268. package/dist/utils/auth.es.js +117 -0
  269. package/dist/utils/auth.es.js.map +1 -0
  270. package/dist/utils/form.cjs.js +2 -0
  271. package/dist/utils/form.cjs.js.map +1 -0
  272. package/dist/utils/form.d.ts +25 -0
  273. package/dist/utils/form.es.js +76 -0
  274. package/dist/utils/form.es.js.map +1 -0
  275. package/dist/utils/form.test.d.ts +1 -0
  276. package/dist/utils/general.cjs.js +2 -0
  277. package/dist/utils/general.cjs.js.map +1 -0
  278. package/dist/utils/general.d.ts +30 -0
  279. package/{src/utils/general.ts → dist/utils/general.es.js} +87 -165
  280. package/dist/utils/general.es.js.map +1 -0
  281. package/dist/utils/general.test.d.ts +1 -0
  282. package/dist/utils/router.cjs.js +2 -0
  283. package/dist/utils/router.cjs.js.map +1 -0
  284. package/dist/utils/router.d.ts +19 -0
  285. package/dist/utils/router.es.js +33 -0
  286. package/dist/utils/router.es.js.map +1 -0
  287. package/dist/utils/router.test.d.ts +1 -0
  288. package/dist/utils/schema.cjs.js +2 -0
  289. package/dist/utils/schema.cjs.js.map +1 -0
  290. package/dist/utils/schema.d.ts +43 -0
  291. package/dist/utils/schema.es.js +123 -0
  292. package/dist/utils/schema.es.js.map +1 -0
  293. package/dist/utils/store.cjs.js +2 -0
  294. package/dist/utils/store.cjs.js.map +1 -0
  295. package/dist/utils/store.d.ts +10 -0
  296. package/dist/utils/store.es.js +20 -0
  297. package/dist/utils/store.es.js.map +1 -0
  298. package/dist/utils/test.cjs.js +2 -0
  299. package/dist/utils/test.cjs.js.map +1 -0
  300. package/dist/utils/test.d.ts +53 -0
  301. package/dist/utils/test.es.js +60 -0
  302. package/dist/utils/test.es.js.map +1 -0
  303. package/dist/utils/theme.cjs.js +2 -0
  304. package/dist/utils/theme.cjs.js.map +1 -0
  305. package/dist/utils/theme.d.ts +11 -0
  306. package/dist/utils/theme.es.js +12 -0
  307. package/dist/utils/theme.es.js.map +1 -0
  308. package/dist/utils/window.cjs.js +2 -0
  309. package/dist/utils/window.cjs.js.map +1 -0
  310. package/dist/utils/window.d.ts +2 -0
  311. package/dist/utils/window.es.js +11 -0
  312. package/dist/utils/window.es.js.map +1 -0
  313. package/package.json +142 -37
  314. package/.github/workflows/main.yml +0 -55
  315. package/.prettierignore +0 -1
  316. package/CHANGELOG.md +0 -2027
  317. package/CONTRIBUTING.md +0 -3
  318. package/eslint.config.js +0 -17
  319. package/src/api/createApi.ts +0 -91
  320. package/src/api/endpoints/authFactor.ts +0 -31
  321. package/src/api/endpoints/index.ts +0 -9
  322. package/src/api/endpoints/klass.ts +0 -87
  323. package/src/api/endpoints/school.ts +0 -34
  324. package/src/api/endpoints/session.ts +0 -47
  325. package/src/api/endpoints/user.ts +0 -70
  326. package/src/api/index.ts +0 -5
  327. package/src/api/models.ts +0 -145
  328. package/src/api/schemas.ts +0 -243
  329. package/src/api/tagTypes.ts +0 -12
  330. package/src/api/urls.ts +0 -13
  331. package/src/components/App.css +0 -38
  332. package/src/components/App.tsx +0 -152
  333. package/src/components/ClickableTooltip.tsx +0 -43
  334. package/src/components/CopyIconButton.test.tsx +0 -16
  335. package/src/components/CopyIconButton.tsx +0 -27
  336. package/src/components/Countdown.tsx +0 -42
  337. package/src/components/DownloadFileButton.tsx +0 -55
  338. package/src/components/ElevatedAppBar.tsx +0 -41
  339. package/src/components/Image.tsx +0 -41
  340. package/src/components/InputFileButton.tsx +0 -27
  341. package/src/components/ItemizedList.tsx +0 -63
  342. package/src/components/OrderedGrid.tsx +0 -92
  343. package/src/components/ScrollIntoViewLink.tsx +0 -22
  344. package/src/components/SyncError.tsx +0 -14
  345. package/src/components/TablePagination.tsx +0 -142
  346. package/src/components/YouTubeVideo.tsx +0 -26
  347. package/src/components/form/ApiAutocompleteField.tsx +0 -187
  348. package/src/components/form/AutocompleteField.tsx +0 -135
  349. package/src/components/form/CheckboxField.tsx +0 -86
  350. package/src/components/form/CountryField.tsx +0 -75
  351. package/src/components/form/DatePickerField.tsx +0 -126
  352. package/src/components/form/EmailField.tsx +0 -38
  353. package/src/components/form/FirstNameField.tsx +0 -40
  354. package/src/components/form/Form.tsx +0 -165
  355. package/src/components/form/OtpField.tsx +0 -28
  356. package/src/components/form/PasswordField.tsx +0 -71
  357. package/src/components/form/RepeatField.tsx +0 -123
  358. package/src/components/form/SubmitButton.tsx +0 -57
  359. package/src/components/form/TextField.tsx +0 -150
  360. package/src/components/form/UkCountyField.tsx +0 -68
  361. package/src/components/form/index.tsx +0 -35
  362. package/src/components/index.ts +0 -28
  363. package/src/components/page/Banner.tsx +0 -95
  364. package/src/components/page/Notification.tsx +0 -71
  365. package/src/components/page/Page.tsx +0 -73
  366. package/src/components/page/Section.tsx +0 -21
  367. package/src/components/page/TabBar.tsx +0 -131
  368. package/src/components/page/index.ts +0 -10
  369. package/src/components/router/Link.tsx +0 -23
  370. package/src/components/router/LinkButton.tsx +0 -22
  371. package/src/components/router/LinkIconButton.tsx +0 -22
  372. package/src/components/router/LinkListItem.tsx +0 -22
  373. package/src/components/router/LinkTab.tsx +0 -22
  374. package/src/components/router/Navigate.tsx +0 -33
  375. package/src/components/router/index.tsx +0 -9
  376. package/src/components/table/CellStack.tsx +0 -19
  377. package/src/components/table/Table.tsx +0 -55
  378. package/src/components/table/index.tsx +0 -8
  379. package/src/features/InactiveDialog.tsx +0 -40
  380. package/src/features/ScreenTimeDialog.tsx +0 -30
  381. package/src/features/index.ts +0 -4
  382. package/src/fonts/ttf/Inter-VariableFont_slnt,wght.ttf +0 -0
  383. package/src/fonts/ttf/SpaceGrotesk-VariableFont_wght.ttf +0 -0
  384. package/src/hooks/api.tsx +0 -39
  385. package/src/hooks/auth.tsx +0 -397
  386. package/src/hooks/general.tsx +0 -110
  387. package/src/hooks/index.ts +0 -5
  388. package/src/hooks/router.tsx +0 -168
  389. package/src/images/svg/brain.svg +0 -1
  390. package/src/index.ts +0 -2
  391. package/src/middlewares/index.ts +0 -1
  392. package/src/middlewares/session.ts +0 -21
  393. package/src/scripts/freshDesk.js +0 -473
  394. package/src/scripts/index.ts +0 -1
  395. package/src/server.js +0 -187
  396. package/src/settings/custom.ts +0 -22
  397. package/src/settings/index.ts +0 -7
  398. package/src/settings/vite.ts +0 -26
  399. package/src/setupTests.ts +0 -2
  400. package/src/slices/createSlice.ts +0 -8
  401. package/src/slices/index.ts +0 -2
  402. package/src/slices/session.ts +0 -32
  403. package/src/theme/ThemedBox.tsx +0 -265
  404. package/src/theme/colors.ts +0 -57
  405. package/src/theme/components/MuiAccordion.tsx +0 -13
  406. package/src/theme/components/MuiAutocomplete.tsx +0 -11
  407. package/src/theme/components/MuiButton.ts +0 -70
  408. package/src/theme/components/MuiCardActions.tsx +0 -12
  409. package/src/theme/components/MuiCheckbox.ts +0 -12
  410. package/src/theme/components/MuiContainer.ts +0 -19
  411. package/src/theme/components/MuiDialog.tsx +0 -16
  412. package/src/theme/components/MuiFormControlLabel.ts +0 -18
  413. package/src/theme/components/MuiFormHelperText.ts +0 -12
  414. package/src/theme/components/MuiGrid2.ts +0 -16
  415. package/src/theme/components/MuiInputBase.ts +0 -14
  416. package/src/theme/components/MuiLink.ts +0 -41
  417. package/src/theme/components/MuiList.ts +0 -12
  418. package/src/theme/components/MuiListItemText.ts +0 -18
  419. package/src/theme/components/MuiMenu.ts +0 -14
  420. package/src/theme/components/MuiMenuItem.ts +0 -15
  421. package/src/theme/components/MuiSelect.ts +0 -16
  422. package/src/theme/components/MuiTab.ts +0 -29
  423. package/src/theme/components/MuiTable.ts +0 -29
  424. package/src/theme/components/MuiTableBody.ts +0 -15
  425. package/src/theme/components/MuiTableHead.ts +0 -26
  426. package/src/theme/components/MuiTabs.ts +0 -26
  427. package/src/theme/components/MuiTextField.ts +0 -86
  428. package/src/theme/components/MuiToolbar.ts +0 -11
  429. package/src/theme/components/MuiTypography.ts +0 -12
  430. package/src/theme/components/_components.ts +0 -95
  431. package/src/theme/components/index.ts +0 -57
  432. package/src/theme/index.ts +0 -25
  433. package/src/theme/palette.ts +0 -98
  434. package/src/theme/spacing.ts +0 -8
  435. package/src/theme/typography.ts +0 -101
  436. package/src/utils/api.test.ts +0 -19
  437. package/src/utils/api.tsx +0 -339
  438. package/src/utils/auth.ts +0 -78
  439. package/src/utils/form.test.ts +0 -50
  440. package/src/utils/form.ts +0 -193
  441. package/src/utils/general.test.ts +0 -55
  442. package/src/utils/router.test.ts +0 -156
  443. package/src/utils/router.ts +0 -67
  444. package/src/utils/schema.ts +0 -290
  445. package/src/utils/store.ts +0 -31
  446. package/src/utils/test.tsx +0 -82
  447. package/src/utils/theme.tsx +0 -83
  448. package/src/utils/window.ts +0 -11
  449. package/src/vite-env.d.ts +0 -1
  450. package/tsconfig.app.json +0 -4
  451. package/tsconfig.json +0 -7
  452. package/tsconfig.node.json +0 -4
  453. package/types/fixes.d.ts +0 -18
  454. package/vite.config.ts +0 -23
@@ -0,0 +1,2 @@
1
+ "use strict";const g=require("yup"),h=require("./utils/general.cjs.js"),t=require("./utils/schema.cjs.js");require("./jsx-runtime-CeSfJrVB.cjs");require("@mui/material");require("react");require("@mui/icons-material");function f(n){const c=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const i in n)if(i!=="default"){const l=Object.getOwnPropertyDescriptor(n,i);Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>n[i]})}}return c.default=n,Object.freeze(c)}const e=f(g),r={user:t.numericId(),teacher:t.numericId(),student:t.numericId(),school:t.numericId(),klass:t.uppercaseAsciiAlphanumericString().length(5),authFactor:t.numericId(),otpBypassToken:t.numericId()},a={id:r.teacher.required(),school:r.school,is_admin:e.bool().required()},m={id:r.student.required(),school:r.school.required(),klass:r.klass.required(),auto_gen_password:e.string().required()},s={id:r.user.required(),requesting_to_join_class:r.klass,first_name:t.unicodeAlphanumericString({spaces:!0,specialChars:"-'"}).required().max(150),last_name:t.unicodeAlphanumericString({spaces:!0,specialChars:"-'"}).max(150),last_login:e.date(),email:e.string().email(),password:e.string().required(),is_staff:e.bool().required(),is_active:e.bool().required(),date_joined:e.date().required(),teacher:e.object(a).optional(),student:e.object(m).optional()},u={...s,password:s.password.min(10,"must be at least 10 characters long").matches(/[A-Z]/,"must contain at least one uppercase letter").matches(/[a-z]/,"must contain at least one lowercase letter").matches(/[0-9]/,"must contain at least one digit").matches(/[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/,"must contain at least one special character"),email:s.email.required(),last_name:s.last_name.required(),teacher:s.teacher.required(),student:e.string().oneOf([void 0])},o={...a,school:a.school.required()},d={...u,teacher:e.object(o)},p={...o,is_admin:o.is_admin.isTrue()},S={...d,teacher:e.object(p)},_={...o,is_admin:o.is_admin.isFalse()},b={...d,teacher:e.object(_)},q={...a,school:e.string().oneOf([void 0]),is_admin:a.is_admin.isFalse()},O={...u,teacher:e.object(q)},T={...s,password:s.password.min(6,"must be at least 6 characters long"),email:s.email.oneOf([void 0]),last_name:s.last_name.oneOf([void 0]),teacher:e.string().oneOf([void 0]),student:s.student.required()},j={...s,password:s.password.min(8,"must be at least 8 characters long").matches(/[A-Z]/,"must contain at least one uppercase letter").matches(/[a-z]/,"must contain at least one lowercase letter").matches(/[0-9]/,"must contain at least one digit"),email:s.email.required(),last_name:s.last_name.required(),teacher:e.string().oneOf([void 0]),student:e.string().oneOf([void 0])},y={...a,user:r.user.required()},A={...o,user:r.user.required()},k={...p,user:r.user.required()},w={..._,user:r.user.required()},v={...q,user:r.user.required()},U={...m,user:r.user.required()},I={id:r.school.required(),name:t.unicodeAlphanumericString({spaces:!0,specialChars:"'."}).required().max(200),country:e.string().oneOf(h.COUNTRY_ISO_CODES),uk_county:e.string().oneOf(h.UK_COUNTIES)},C={id:r.klass.required(),teacher:r.teacher.required(),school:r.school.required(),name:t.unicodeAlphanumericString({spaces:!0,specialChars:"-_"}).required().max(200),read_classmates_data:e.bool().required(),receive_requests_until:e.date()},F={id:r.authFactor.required(),user:r.user.required(),type:e.string().oneOf(["otp"]).required()},N={id:r.otpBypassToken.required(),user:r.user.required(),token:t.lowercaseAsciiAlphanumericString().required().length(8)},x=Object.freeze(Object.defineProperty({__proto__:null,adminSchoolTeacher:k,adminSchoolTeacherUser:S,authFactor:F,indyUser:j,klass:C,nonAdminSchoolTeacher:w,nonAdminSchoolTeacherUser:b,nonSchoolTeacher:v,nonSchoolTeacherUser:O,otpBypassToken:N,school:I,schoolTeacher:A,schoolTeacherUser:d,student:U,studentUser:T,teacher:y,teacherUser:u,user:s},Symbol.toStringTag,{value:"Module"}));exports.schemas=x;exports.user=s;
2
+ //# sourceMappingURL=schemas-BZbJpkD5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas-BZbJpkD5.cjs","sources":["../src/api/schemas.ts"],"sourcesContent":["import * as yup from \"yup\"\n\nimport type {\n AdminSchoolTeacher,\n AdminSchoolTeacherUser,\n AuthFactor,\n Class,\n IndependentUser,\n NonAdminSchoolTeacher,\n NonAdminSchoolTeacherUser,\n NonSchoolTeacher,\n NonSchoolTeacherUser,\n OtpBypassToken,\n School,\n SchoolTeacher,\n SchoolTeacherUser,\n Student,\n StudentUser,\n Teacher,\n TeacherUser,\n User,\n} from \"./models\"\nimport { COUNTRY_ISO_CODES, UK_COUNTIES } from \"../utils/general\"\nimport {\n lowercaseAsciiAlphanumericString,\n numericId,\n unicodeAlphanumericString,\n uppercaseAsciiAlphanumericString,\n} from \"../utils/schema\"\nimport { type Schemas } from \"../utils/api\"\n\n// NOTE: do not use .required() here.\nconst id = {\n user: numericId(),\n teacher: numericId(),\n student: numericId(),\n school: numericId(),\n klass: uppercaseAsciiAlphanumericString().length(5),\n authFactor: numericId(),\n otpBypassToken: numericId(),\n}\n\n// -----------------------------------------------------------------------------\n// User Schemas\n// -----------------------------------------------------------------------------\n\nconst _userTeacher: Omit<Schemas<Teacher>, \"user\"> = {\n id: id.teacher.required(),\n school: id.school,\n is_admin: yup.bool().required(),\n}\n\nconst _userStudent: Omit<Schemas<Student>, \"user\"> = {\n id: id.student.required(),\n school: id.school.required(),\n klass: id.klass.required(),\n auto_gen_password: yup.string().required(),\n}\n\nexport const user: Schemas<User> = {\n id: id.user.required(),\n requesting_to_join_class: id.klass,\n first_name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-'\",\n })\n .required()\n .max(150),\n last_name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-'\",\n }).max(150),\n last_login: yup.date(),\n email: yup.string().email(),\n password: yup.string().required(),\n is_staff: yup.bool().required(),\n is_active: yup.bool().required(),\n date_joined: yup.date().required(),\n teacher: yup.object(_userTeacher).optional(),\n student: yup.object(_userStudent).optional(),\n}\n\nexport const teacherUser: Schemas<TeacherUser> = {\n ...user,\n password: user.password\n .min(10, \"must be at least 10 characters long\")\n .matches(/[A-Z]/, \"must contain at least one uppercase letter\")\n .matches(/[a-z]/, \"must contain at least one lowercase letter\")\n .matches(/[0-9]/, \"must contain at least one digit\")\n .matches(\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\n \"must contain at least one special character\",\n ),\n email: user.email.required(),\n last_name: user.last_name.required(),\n teacher: user.teacher.required(),\n student: yup.string().oneOf([undefined]),\n}\n\nconst _userSchoolTeacher: Omit<Schemas<SchoolTeacher>, \"user\"> = {\n ..._userTeacher,\n school: _userTeacher.school.required(),\n}\n\nexport const schoolTeacherUser: Schemas<SchoolTeacherUser> = {\n ...teacherUser,\n teacher: yup.object(_userSchoolTeacher),\n}\n\nconst _userAdminSchoolTeacher: Omit<Schemas<AdminSchoolTeacher>, \"user\"> = {\n ..._userSchoolTeacher,\n is_admin: _userSchoolTeacher.is_admin.isTrue(),\n}\n\nexport const adminSchoolTeacherUser: Schemas<AdminSchoolTeacherUser> = {\n ...schoolTeacherUser,\n teacher: yup.object(_userAdminSchoolTeacher),\n}\n\nconst _userNonAdminSchoolTeacher: Omit<\n Schemas<NonAdminSchoolTeacher>,\n \"user\"\n> = {\n ..._userSchoolTeacher,\n is_admin: _userSchoolTeacher.is_admin.isFalse(),\n}\n\nexport const nonAdminSchoolTeacherUser: Schemas<NonAdminSchoolTeacherUser> = {\n ...schoolTeacherUser,\n teacher: yup.object(_userNonAdminSchoolTeacher),\n}\n\nconst _userNonSchoolTeacher: Omit<Schemas<NonSchoolTeacher>, \"user\"> = {\n ..._userTeacher,\n school: yup.string().oneOf([undefined]),\n is_admin: _userTeacher.is_admin.isFalse(),\n}\n\nexport const nonSchoolTeacherUser: Schemas<NonSchoolTeacherUser> = {\n ...teacherUser,\n teacher: yup.object(_userNonSchoolTeacher),\n}\n\nexport const studentUser: Schemas<StudentUser> = {\n ...user,\n password: user.password.min(6, \"must be at least 6 characters long\"),\n email: user.email.oneOf([undefined]),\n last_name: user.last_name.oneOf([undefined]),\n teacher: yup.string().oneOf([undefined]),\n student: user.student.required(),\n}\n\nexport const indyUser: Schemas<IndependentUser> = {\n ...user,\n password: user.password\n .min(8, \"must be at least 8 characters long\")\n .matches(/[A-Z]/, \"must contain at least one uppercase letter\")\n .matches(/[a-z]/, \"must contain at least one lowercase letter\")\n .matches(/[0-9]/, \"must contain at least one digit\"),\n email: user.email.required(),\n last_name: user.last_name.required(),\n teacher: yup.string().oneOf([undefined]),\n student: yup.string().oneOf([undefined]),\n}\n\n// -----------------------------------------------------------------------------\n// Teacher Schemas\n// -----------------------------------------------------------------------------\n\nexport const teacher: Schemas<Teacher> = {\n ..._userTeacher,\n user: id.user.required(),\n}\n\nexport const schoolTeacher: Schemas<SchoolTeacher> = {\n ..._userSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const adminSchoolTeacher: Schemas<AdminSchoolTeacher> = {\n ..._userAdminSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const nonAdminSchoolTeacher: Schemas<NonAdminSchoolTeacher> = {\n ..._userNonAdminSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const nonSchoolTeacher: Schemas<NonSchoolTeacher> = {\n ..._userNonSchoolTeacher,\n user: id.user.required(),\n}\n\n// -----------------------------------------------------------------------------\n// Other Schemas\n// -----------------------------------------------------------------------------\n\nexport const student: Schemas<Student> = {\n ..._userStudent,\n user: id.user.required(),\n}\n\nexport const school: Schemas<School> = {\n id: id.school.required(),\n name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"'.\",\n })\n .required()\n .max(200),\n country: yup.string().oneOf(COUNTRY_ISO_CODES),\n uk_county: yup.string().oneOf(UK_COUNTIES),\n}\n\nexport const klass: Schemas<Class> = {\n id: id.klass.required(),\n teacher: id.teacher.required(),\n school: id.school.required(),\n name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-_\",\n })\n .required()\n .max(200),\n read_classmates_data: yup.bool().required(),\n receive_requests_until: yup.date(),\n}\n\nexport const authFactor: Schemas<AuthFactor> = {\n id: id.authFactor.required(),\n user: id.user.required(),\n type: yup\n .string()\n .oneOf([\"otp\"] as const)\n .required(),\n}\n\nexport const otpBypassToken: Schemas<OtpBypassToken> = {\n id: id.otpBypassToken.required(),\n user: id.user.required(),\n token: lowercaseAsciiAlphanumericString().required().length(8),\n}\n"],"names":["id","numericId","uppercaseAsciiAlphanumericString","_userTeacher","yup","_userStudent","user","unicodeAlphanumericString","teacherUser","_userSchoolTeacher","schoolTeacherUser","_userAdminSchoolTeacher","adminSchoolTeacherUser","_userNonAdminSchoolTeacher","nonAdminSchoolTeacherUser","_userNonSchoolTeacher","nonSchoolTeacherUser","studentUser","indyUser","teacher","schoolTeacher","adminSchoolTeacher","nonAdminSchoolTeacher","nonSchoolTeacher","student","school","COUNTRY_ISO_CODES","UK_COUNTIES","klass","authFactor","otpBypassToken","lowercaseAsciiAlphanumericString"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import * as e from "yup";
2
+ import { UK_COUNTIES as m, COUNTRY_ISO_CODES as p } from "./utils/general.es.js";
3
+ import { numericId as t, uppercaseAsciiAlphanumericString as _, unicodeAlphanumericString as i, lowercaseAsciiAlphanumericString as q } from "./utils/schema.es.js";
4
+ import "./jsx-runtime-Dpn_P65e.js";
5
+ import "@mui/material";
6
+ import "react";
7
+ import "@mui/icons-material";
8
+ const s = {
9
+ user: t(),
10
+ teacher: t(),
11
+ student: t(),
12
+ school: t(),
13
+ klass: _().length(5),
14
+ authFactor: t(),
15
+ otpBypassToken: t()
16
+ }, a = {
17
+ id: s.teacher.required(),
18
+ school: s.school,
19
+ is_admin: e.bool().required()
20
+ }, u = {
21
+ id: s.student.required(),
22
+ school: s.school.required(),
23
+ klass: s.klass.required(),
24
+ auto_gen_password: e.string().required()
25
+ }, r = {
26
+ id: s.user.required(),
27
+ requesting_to_join_class: s.klass,
28
+ first_name: i({
29
+ spaces: !0,
30
+ specialChars: "-'"
31
+ }).required().max(150),
32
+ last_name: i({
33
+ spaces: !0,
34
+ specialChars: "-'"
35
+ }).max(150),
36
+ last_login: e.date(),
37
+ email: e.string().email(),
38
+ password: e.string().required(),
39
+ is_staff: e.bool().required(),
40
+ is_active: e.bool().required(),
41
+ date_joined: e.date().required(),
42
+ teacher: e.object(a).optional(),
43
+ student: e.object(u).optional()
44
+ }, n = {
45
+ ...r,
46
+ password: r.password.min(10, "must be at least 10 characters long").matches(/[A-Z]/, "must contain at least one uppercase letter").matches(/[a-z]/, "must contain at least one lowercase letter").matches(/[0-9]/, "must contain at least one digit").matches(
47
+ /[!@#$%^&*()_+\-=[\]{};':"\\|,.<>/?]/,
48
+ "must contain at least one special character"
49
+ ),
50
+ email: r.email.required(),
51
+ last_name: r.last_name.required(),
52
+ teacher: r.teacher.required(),
53
+ student: e.string().oneOf([void 0])
54
+ }, o = {
55
+ ...a,
56
+ school: a.school.required()
57
+ }, c = {
58
+ ...n,
59
+ teacher: e.object(o)
60
+ }, d = {
61
+ ...o,
62
+ is_admin: o.is_admin.isTrue()
63
+ }, g = {
64
+ ...c,
65
+ teacher: e.object(d)
66
+ }, l = {
67
+ ...o,
68
+ is_admin: o.is_admin.isFalse()
69
+ }, T = {
70
+ ...c,
71
+ teacher: e.object(l)
72
+ }, h = {
73
+ ...a,
74
+ school: e.string().oneOf([void 0]),
75
+ is_admin: a.is_admin.isFalse()
76
+ }, S = {
77
+ ...n,
78
+ teacher: e.object(h)
79
+ }, f = {
80
+ ...r,
81
+ password: r.password.min(6, "must be at least 6 characters long"),
82
+ email: r.email.oneOf([void 0]),
83
+ last_name: r.last_name.oneOf([void 0]),
84
+ teacher: e.string().oneOf([void 0]),
85
+ student: r.student.required()
86
+ }, b = {
87
+ ...r,
88
+ password: r.password.min(8, "must be at least 8 characters long").matches(/[A-Z]/, "must contain at least one uppercase letter").matches(/[a-z]/, "must contain at least one lowercase letter").matches(/[0-9]/, "must contain at least one digit"),
89
+ email: r.email.required(),
90
+ last_name: r.last_name.required(),
91
+ teacher: e.string().oneOf([void 0]),
92
+ student: e.string().oneOf([void 0])
93
+ }, O = {
94
+ ...a,
95
+ user: s.user.required()
96
+ }, k = {
97
+ ...o,
98
+ user: s.user.required()
99
+ }, w = {
100
+ ...d,
101
+ user: s.user.required()
102
+ }, A = {
103
+ ...l,
104
+ user: s.user.required()
105
+ }, j = {
106
+ ...h,
107
+ user: s.user.required()
108
+ }, v = {
109
+ ...u,
110
+ user: s.user.required()
111
+ }, y = {
112
+ id: s.school.required(),
113
+ name: i({
114
+ spaces: !0,
115
+ specialChars: "'."
116
+ }).required().max(200),
117
+ country: e.string().oneOf(p),
118
+ uk_county: e.string().oneOf(m)
119
+ }, U = {
120
+ id: s.klass.required(),
121
+ teacher: s.teacher.required(),
122
+ school: s.school.required(),
123
+ name: i({
124
+ spaces: !0,
125
+ specialChars: "-_"
126
+ }).required().max(200),
127
+ read_classmates_data: e.bool().required(),
128
+ receive_requests_until: e.date()
129
+ }, C = {
130
+ id: s.authFactor.required(),
131
+ user: s.user.required(),
132
+ type: e.string().oneOf(["otp"]).required()
133
+ }, x = {
134
+ id: s.otpBypassToken.required(),
135
+ user: s.user.required(),
136
+ token: q().required().length(8)
137
+ }, Z = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
138
+ __proto__: null,
139
+ adminSchoolTeacher: w,
140
+ adminSchoolTeacherUser: g,
141
+ authFactor: C,
142
+ indyUser: b,
143
+ klass: U,
144
+ nonAdminSchoolTeacher: A,
145
+ nonAdminSchoolTeacherUser: T,
146
+ nonSchoolTeacher: j,
147
+ nonSchoolTeacherUser: S,
148
+ otpBypassToken: x,
149
+ school: y,
150
+ schoolTeacher: k,
151
+ schoolTeacherUser: c,
152
+ student: v,
153
+ studentUser: f,
154
+ teacher: O,
155
+ teacherUser: n,
156
+ user: r
157
+ }, Symbol.toStringTag, { value: "Module" }));
158
+ export {
159
+ Z as s,
160
+ r as u
161
+ };
162
+ //# sourceMappingURL=schemas-DlOtf2vf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas-DlOtf2vf.js","sources":["../src/api/schemas.ts"],"sourcesContent":["import * as yup from \"yup\"\n\nimport type {\n AdminSchoolTeacher,\n AdminSchoolTeacherUser,\n AuthFactor,\n Class,\n IndependentUser,\n NonAdminSchoolTeacher,\n NonAdminSchoolTeacherUser,\n NonSchoolTeacher,\n NonSchoolTeacherUser,\n OtpBypassToken,\n School,\n SchoolTeacher,\n SchoolTeacherUser,\n Student,\n StudentUser,\n Teacher,\n TeacherUser,\n User,\n} from \"./models\"\nimport { COUNTRY_ISO_CODES, UK_COUNTIES } from \"../utils/general\"\nimport {\n lowercaseAsciiAlphanumericString,\n numericId,\n unicodeAlphanumericString,\n uppercaseAsciiAlphanumericString,\n} from \"../utils/schema\"\nimport { type Schemas } from \"../utils/api\"\n\n// NOTE: do not use .required() here.\nconst id = {\n user: numericId(),\n teacher: numericId(),\n student: numericId(),\n school: numericId(),\n klass: uppercaseAsciiAlphanumericString().length(5),\n authFactor: numericId(),\n otpBypassToken: numericId(),\n}\n\n// -----------------------------------------------------------------------------\n// User Schemas\n// -----------------------------------------------------------------------------\n\nconst _userTeacher: Omit<Schemas<Teacher>, \"user\"> = {\n id: id.teacher.required(),\n school: id.school,\n is_admin: yup.bool().required(),\n}\n\nconst _userStudent: Omit<Schemas<Student>, \"user\"> = {\n id: id.student.required(),\n school: id.school.required(),\n klass: id.klass.required(),\n auto_gen_password: yup.string().required(),\n}\n\nexport const user: Schemas<User> = {\n id: id.user.required(),\n requesting_to_join_class: id.klass,\n first_name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-'\",\n })\n .required()\n .max(150),\n last_name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-'\",\n }).max(150),\n last_login: yup.date(),\n email: yup.string().email(),\n password: yup.string().required(),\n is_staff: yup.bool().required(),\n is_active: yup.bool().required(),\n date_joined: yup.date().required(),\n teacher: yup.object(_userTeacher).optional(),\n student: yup.object(_userStudent).optional(),\n}\n\nexport const teacherUser: Schemas<TeacherUser> = {\n ...user,\n password: user.password\n .min(10, \"must be at least 10 characters long\")\n .matches(/[A-Z]/, \"must contain at least one uppercase letter\")\n .matches(/[a-z]/, \"must contain at least one lowercase letter\")\n .matches(/[0-9]/, \"must contain at least one digit\")\n .matches(\n /[!@#$%^&*()_+\\-=[\\]{};':\"\\\\|,.<>/?]/,\n \"must contain at least one special character\",\n ),\n email: user.email.required(),\n last_name: user.last_name.required(),\n teacher: user.teacher.required(),\n student: yup.string().oneOf([undefined]),\n}\n\nconst _userSchoolTeacher: Omit<Schemas<SchoolTeacher>, \"user\"> = {\n ..._userTeacher,\n school: _userTeacher.school.required(),\n}\n\nexport const schoolTeacherUser: Schemas<SchoolTeacherUser> = {\n ...teacherUser,\n teacher: yup.object(_userSchoolTeacher),\n}\n\nconst _userAdminSchoolTeacher: Omit<Schemas<AdminSchoolTeacher>, \"user\"> = {\n ..._userSchoolTeacher,\n is_admin: _userSchoolTeacher.is_admin.isTrue(),\n}\n\nexport const adminSchoolTeacherUser: Schemas<AdminSchoolTeacherUser> = {\n ...schoolTeacherUser,\n teacher: yup.object(_userAdminSchoolTeacher),\n}\n\nconst _userNonAdminSchoolTeacher: Omit<\n Schemas<NonAdminSchoolTeacher>,\n \"user\"\n> = {\n ..._userSchoolTeacher,\n is_admin: _userSchoolTeacher.is_admin.isFalse(),\n}\n\nexport const nonAdminSchoolTeacherUser: Schemas<NonAdminSchoolTeacherUser> = {\n ...schoolTeacherUser,\n teacher: yup.object(_userNonAdminSchoolTeacher),\n}\n\nconst _userNonSchoolTeacher: Omit<Schemas<NonSchoolTeacher>, \"user\"> = {\n ..._userTeacher,\n school: yup.string().oneOf([undefined]),\n is_admin: _userTeacher.is_admin.isFalse(),\n}\n\nexport const nonSchoolTeacherUser: Schemas<NonSchoolTeacherUser> = {\n ...teacherUser,\n teacher: yup.object(_userNonSchoolTeacher),\n}\n\nexport const studentUser: Schemas<StudentUser> = {\n ...user,\n password: user.password.min(6, \"must be at least 6 characters long\"),\n email: user.email.oneOf([undefined]),\n last_name: user.last_name.oneOf([undefined]),\n teacher: yup.string().oneOf([undefined]),\n student: user.student.required(),\n}\n\nexport const indyUser: Schemas<IndependentUser> = {\n ...user,\n password: user.password\n .min(8, \"must be at least 8 characters long\")\n .matches(/[A-Z]/, \"must contain at least one uppercase letter\")\n .matches(/[a-z]/, \"must contain at least one lowercase letter\")\n .matches(/[0-9]/, \"must contain at least one digit\"),\n email: user.email.required(),\n last_name: user.last_name.required(),\n teacher: yup.string().oneOf([undefined]),\n student: yup.string().oneOf([undefined]),\n}\n\n// -----------------------------------------------------------------------------\n// Teacher Schemas\n// -----------------------------------------------------------------------------\n\nexport const teacher: Schemas<Teacher> = {\n ..._userTeacher,\n user: id.user.required(),\n}\n\nexport const schoolTeacher: Schemas<SchoolTeacher> = {\n ..._userSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const adminSchoolTeacher: Schemas<AdminSchoolTeacher> = {\n ..._userAdminSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const nonAdminSchoolTeacher: Schemas<NonAdminSchoolTeacher> = {\n ..._userNonAdminSchoolTeacher,\n user: id.user.required(),\n}\n\nexport const nonSchoolTeacher: Schemas<NonSchoolTeacher> = {\n ..._userNonSchoolTeacher,\n user: id.user.required(),\n}\n\n// -----------------------------------------------------------------------------\n// Other Schemas\n// -----------------------------------------------------------------------------\n\nexport const student: Schemas<Student> = {\n ..._userStudent,\n user: id.user.required(),\n}\n\nexport const school: Schemas<School> = {\n id: id.school.required(),\n name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"'.\",\n })\n .required()\n .max(200),\n country: yup.string().oneOf(COUNTRY_ISO_CODES),\n uk_county: yup.string().oneOf(UK_COUNTIES),\n}\n\nexport const klass: Schemas<Class> = {\n id: id.klass.required(),\n teacher: id.teacher.required(),\n school: id.school.required(),\n name: unicodeAlphanumericString({\n spaces: true,\n specialChars: \"-_\",\n })\n .required()\n .max(200),\n read_classmates_data: yup.bool().required(),\n receive_requests_until: yup.date(),\n}\n\nexport const authFactor: Schemas<AuthFactor> = {\n id: id.authFactor.required(),\n user: id.user.required(),\n type: yup\n .string()\n .oneOf([\"otp\"] as const)\n .required(),\n}\n\nexport const otpBypassToken: Schemas<OtpBypassToken> = {\n id: id.otpBypassToken.required(),\n user: id.user.required(),\n token: lowercaseAsciiAlphanumericString().required().length(8),\n}\n"],"names":["id","numericId","uppercaseAsciiAlphanumericString","_userTeacher","yup","_userStudent","user","unicodeAlphanumericString","teacherUser","_userSchoolTeacher","schoolTeacherUser","_userAdminSchoolTeacher","adminSchoolTeacherUser","_userNonAdminSchoolTeacher","nonAdminSchoolTeacherUser","_userNonSchoolTeacher","nonSchoolTeacherUser","studentUser","indyUser","teacher","schoolTeacher","adminSchoolTeacher","nonAdminSchoolTeacher","nonSchoolTeacher","student","school","COUNTRY_ISO_CODES","UK_COUNTIES","klass","authFactor","otpBypassToken","lowercaseAsciiAlphanumericString"],"mappings":"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"}
File without changes
@@ -0,0 +1,6 @@
1
+ "use strict";var m=Object.create;var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var S=(i,s,a,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let e of C(s))!k.call(i,e)&&e!==a&&l(i,e,{get:()=>s[e],enumerable:!(t=u(s,e))||t.enumerable});return i};var o=(i,s,a)=>(a=i!=null?m(v(i)):{},S(s||!i||!i.__esModule?l(a,"default",{value:i,enumerable:!0}):a,i));const y=require("memory-cache"),w=require("express"),p=require("node:fs/promises");class f{envIsProduction;templateHtml;hostname;mode;port;base;app;cache;healthCheckCacheKey;healthCheckCacheTimeout;healthCheckStatusCodes;constructor({mode:s,port:a,base:t}={}){this.envIsProduction=process.env.NODE_ENV==="production",this.templateHtml="",this.hostname=this.envIsProduction?"0.0.0.0":"127.0.0.1",this.mode=s||process.env.MODE||"development",this.port=a||(process.env.PORT?Number(process.env.PORT):this.envIsProduction?8080:5173),this.base=t||process.env.BASE||"/",this.app=w(),this.cache=new y.Cache,this.healthCheckCacheKey="health-check",this.healthCheckCacheTimeout=3e4,this.healthCheckStatusCodes={healthy:200,startingUp:503,shuttingDown:503,unhealthy:503,unknown:503}}getHealthCheck(s){return{healthStatus:"healthy",additionalInfo:"All healthy."}}handleHealthCheck(s,a){let t=this.cache.get(this.healthCheckCacheKey);if(t===null){const e=this.getHealthCheck(s);e.healthStatus!=="healthy"&&console.warn(`health check: ${JSON.stringify(e)}`),t={appId:process.env.APP_ID||"REPLACE_ME",healthStatus:e.healthStatus,lastCheckedTimestamp:new Date().toISOString(),additionalInformation:e.additionalInfo,startupTimestamp:new Date().toISOString(),appVersion:process.env.APP_VERSION||"REPLACE_ME",details:e.details||[]},this.cache.put(this.healthCheckCacheKey,t,this.healthCheckCacheTimeout)}a.status(this.healthCheckStatusCodes[t.healthStatus]).json(t)}async handleServeHtml(s,a,t,e){try{const h=s.originalUrl.replace(this.base,""),[n,r]=await t(h),c=await n(h),d=r.replace("<!--app-head-->",c.head??"").replace("<!--app-html-->",c.html??"");a.status(200).set({"Content-Type":"text/html"}).send(d)}catch(h){if(h instanceof Error){console.error(h.stack);const n=e(h);a.status(500).end(n)}}}async run(){this.app.get("/health-check",(t,e)=>{this.handleHealthCheck(t,e)});let s,a;if(this.envIsProduction){const t=(await import("compression")).default,e=(await import("sirv")).default;this.templateHtml=await p.readFile("./dist/client/index.html","utf-8"),this.app.use(t()),this.app.use(this.base,e("./dist/client",{extensions:[]})),s=async()=>{const h=(await import("../../../dist/server/entry-server.js")).render,n=this.templateHtml;return[h,n]},a=()=>{}}else{const{createServer:t}=await import("vite"),e=await t({server:{middlewareMode:!0},appType:"custom",base:this.base,mode:this.mode});this.app.use(e.middlewares),s=async h=>{const n=(await e.ssrLoadModule("/src/entry-server.tsx")).render;let r=await p.readFile("./index.html","utf-8");return r=await e.transformIndexHtml(h,r),[n,r]},a=h=>(e.ssrFixStacktrace(h),h.stack)}this.app.get("*",async(t,e)=>{await this.handleServeHtml(t,e,s,a)}),this.app.listen(this.port,this.hostname,()=>{let t=`Server started.
2
+ url: http://${this.hostname}:${this.port}
3
+ environment: ${process.env.NODE_ENV}
4
+ `;this.envIsProduction||(t+=`mode: ${this.mode}
5
+ `),console.log(t)})}}module.exports=f;
6
+ //# sourceMappingURL=server.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs.js","sources":["../src/server.ts"],"sourcesContent":["/**\n * © Ocado Group\n * Created on 13/12/2024 at 12:15:05(+00:00).\n *\n * A server for an app in a live environment.\n * Based off: https://github.com/bluwy/create-vite-extra/blob/master/template-ssr-react-ts/server.js\n */\n\nimport { Cache, type CacheClass } from \"memory-cache\"\nimport express, { type Express, type Request, type Response } from \"express\"\nimport fs from \"node:fs/promises\"\n\ntype Mode = \"development\" | \"staging\" | \"production\"\ntype Options = Partial<{\n mode: Mode\n port: number\n base: string\n}>\n\ntype HealthStatus =\n | \"healthy\"\n | \"startingUp\"\n | \"shuttingDown\"\n | \"unhealthy\"\n | \"unknown\"\ntype HealthCheck = {\n healthStatus: HealthStatus\n additionalInfo: string\n details?: Array<{\n name: string\n description: string\n health: HealthStatus\n }>\n}\ntype HealthCheckResponse = {\n appId: string\n healthStatus: HealthStatus\n lastCheckedTimestamp: string\n additionalInformation: string\n startupTimestamp: string\n appVersion: string\n details: Array<{\n name: string\n description: string\n health: HealthStatus\n }>\n}\n\ntype Render = (path: string) => Promise<{ head?: string; html?: string }>\ntype EntryModule = { render: Render }\ntype RenderAndTemplate = [Render, string]\ntype GetRenderAndTemplate = (path: string) => Promise<RenderAndTemplate>\ntype OnServeError = (error: Error) => string | undefined\n\nexport default class Server {\n envIsProduction: boolean\n templateHtml: string\n hostname: string\n mode: Mode\n port: number\n base: string\n app: Express\n cache: CacheClass<string, any>\n healthCheckCacheKey: string\n healthCheckCacheTimeout: number\n healthCheckStatusCodes: Record<HealthStatus, number>\n\n constructor({ mode, port, base }: Options = {}) {\n this.envIsProduction = process.env.NODE_ENV === \"production\"\n this.templateHtml = \"\"\n this.hostname = this.envIsProduction ? \"0.0.0.0\" : \"127.0.0.1\"\n\n this.mode = mode || (process.env.MODE as Mode) || \"development\"\n this.port =\n port ||\n (process.env.PORT\n ? Number(process.env.PORT)\n : this.envIsProduction\n ? 8080\n : 5173)\n this.base = base || process.env.BASE || \"/\"\n\n this.app = express()\n this.cache = new Cache()\n\n this.healthCheckCacheKey = \"health-check\"\n this.healthCheckCacheTimeout = 30000\n this.healthCheckStatusCodes = {\n // The app is running normally.\n healthy: 200,\n // The app is performing app-specific initialisation which must\n // complete before it will serve normal application requests\n // (perhaps the app is warming a cache or something similar). You\n // only need to use this status if your app will be in a start-up\n // mode for a prolonged period of time.\n startingUp: 503,\n // The app is shutting down. As with startingUp, you only need to\n // use this status if your app takes a prolonged amount of time\n // to shutdown, perhaps because it waits for a long-running\n // process to complete before shutting down.\n shuttingDown: 503,\n // The app is not running normally.\n unhealthy: 503,\n // The app is not able to report its own state.\n unknown: 503,\n }\n }\n\n // @ts-expect-error unused var\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getHealthCheck(request: Request): HealthCheck {\n return {\n healthStatus: \"healthy\",\n additionalInfo: \"All healthy.\",\n }\n }\n\n handleHealthCheck(request: Request, response: Response): void {\n let value: HealthCheckResponse = this.cache.get(\n this.healthCheckCacheKey,\n ) as HealthCheckResponse\n if (value === null) {\n const healthCheck = this.getHealthCheck(request)\n\n if (healthCheck.healthStatus !== \"healthy\") {\n console.warn(`health check: ${JSON.stringify(healthCheck)}`)\n }\n\n value = {\n appId: process.env.APP_ID || \"REPLACE_ME\",\n healthStatus: healthCheck.healthStatus,\n lastCheckedTimestamp: new Date().toISOString(),\n additionalInformation: healthCheck.additionalInfo,\n startupTimestamp: new Date().toISOString(),\n appVersion: process.env.APP_VERSION || \"REPLACE_ME\",\n details: healthCheck.details || [],\n }\n\n this.cache.put(\n this.healthCheckCacheKey,\n value,\n this.healthCheckCacheTimeout,\n )\n }\n\n response.status(this.healthCheckStatusCodes[value.healthStatus]).json(value)\n }\n\n async handleServeHtml(\n request: Request,\n response: Response,\n getRenderAndTemplate: GetRenderAndTemplate,\n onServeError: OnServeError,\n ): Promise<void> {\n try {\n const path = request.originalUrl.replace(this.base, \"\")\n\n const [render, template] = await getRenderAndTemplate(path)\n\n const rendered = await render(path)\n\n const html = template\n .replace(`<!--app-head-->`, rendered.head ?? \"\")\n .replace(`<!--app-html-->`, rendered.html ?? \"\")\n\n response.status(200).set({ \"Content-Type\": \"text/html\" }).send(html)\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.stack)\n const body = onServeError(error)\n response.status(500).end(body)\n }\n }\n }\n\n async run() {\n this.app.get(\"/health-check\", (request, response) => {\n this.handleHealthCheck(request, response)\n })\n\n let getRenderAndTemplate: GetRenderAndTemplate\n let onServeError: OnServeError\n if (this.envIsProduction) {\n const compression = (await import(\"compression\")).default\n const sirv = (await import(\"sirv\")).default\n\n this.templateHtml = await fs.readFile(\"./dist/client/index.html\", \"utf-8\")\n\n this.app.use(compression())\n this.app.use(this.base, sirv(\"./dist/client\", { extensions: [] }))\n\n getRenderAndTemplate = async () => {\n const render = (\n (await import(\n // @ts-expect-error only present after building installing app.\n \"../../../dist/server/entry-server.js\"\n )) as EntryModule\n ).render\n\n // Use cached template.\n const template = this.templateHtml\n\n return [render, template]\n }\n\n onServeError = () => undefined\n } else {\n const { createServer } = await import(\"vite\")\n\n const vite = await createServer({\n server: { middlewareMode: true },\n appType: \"custom\",\n base: this.base,\n mode: this.mode,\n })\n\n this.app.use(vite.middlewares)\n\n getRenderAndTemplate = async path => {\n const render = (\n (await vite.ssrLoadModule(\"/src/entry-server.tsx\")) as EntryModule\n ).render\n\n // Always read fresh template.\n let template = await fs.readFile(\"./index.html\", \"utf-8\")\n template = await vite.transformIndexHtml(path, template)\n\n return [render, template]\n }\n\n onServeError = error => {\n vite.ssrFixStacktrace(error)\n return error.stack\n }\n }\n\n this.app.get(\"*\", async (request, response) => {\n await this.handleServeHtml(\n request,\n response,\n getRenderAndTemplate,\n onServeError,\n )\n })\n\n this.app.listen(this.port, this.hostname, () => {\n let startMessage =\n \"Server started.\\n\" +\n `url: http://${this.hostname}:${this.port}\\n` +\n `environment: ${process.env.NODE_ENV}\\n`\n\n if (!this.envIsProduction) startMessage += `mode: ${this.mode}\\n`\n\n console.log(startMessage)\n })\n }\n}\n"],"names":["Server","mode","port","base","express","Cache","request","response","value","healthCheck","getRenderAndTemplate","onServeError","path","render","template","rendered","html","error","body","compression","sirv","fs","createServer","vite","startMessage"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { CacheClass } from 'memory-cache';
2
+ import { Express, Request, Response } from 'express';
3
+ type Mode = "development" | "staging" | "production";
4
+ type Options = Partial<{
5
+ mode: Mode;
6
+ port: number;
7
+ base: string;
8
+ }>;
9
+ type HealthStatus = "healthy" | "startingUp" | "shuttingDown" | "unhealthy" | "unknown";
10
+ type HealthCheck = {
11
+ healthStatus: HealthStatus;
12
+ additionalInfo: string;
13
+ details?: Array<{
14
+ name: string;
15
+ description: string;
16
+ health: HealthStatus;
17
+ }>;
18
+ };
19
+ type Render = (path: string) => Promise<{
20
+ head?: string;
21
+ html?: string;
22
+ }>;
23
+ type RenderAndTemplate = [Render, string];
24
+ type GetRenderAndTemplate = (path: string) => Promise<RenderAndTemplate>;
25
+ type OnServeError = (error: Error) => string | undefined;
26
+ export default class Server {
27
+ envIsProduction: boolean;
28
+ templateHtml: string;
29
+ hostname: string;
30
+ mode: Mode;
31
+ port: number;
32
+ base: string;
33
+ app: Express;
34
+ cache: CacheClass<string, any>;
35
+ healthCheckCacheKey: string;
36
+ healthCheckCacheTimeout: number;
37
+ healthCheckStatusCodes: Record<HealthStatus, number>;
38
+ constructor({ mode, port, base }?: Options);
39
+ getHealthCheck(request: Request): HealthCheck;
40
+ handleHealthCheck(request: Request, response: Response): void;
41
+ handleServeHtml(request: Request, response: Response, getRenderAndTemplate: GetRenderAndTemplate, onServeError: OnServeError): Promise<void>;
42
+ run(): Promise<void>;
43
+ }
44
+ export {};
@@ -0,0 +1,127 @@
1
+ import { Cache as l } from "memory-cache";
2
+ import p from "express";
3
+ import o from "node:fs/promises";
4
+ class v {
5
+ envIsProduction;
6
+ templateHtml;
7
+ hostname;
8
+ mode;
9
+ port;
10
+ base;
11
+ app;
12
+ cache;
13
+ healthCheckCacheKey;
14
+ healthCheckCacheTimeout;
15
+ healthCheckStatusCodes;
16
+ constructor({ mode: s, port: h, base: e } = {}) {
17
+ this.envIsProduction = process.env.NODE_ENV === "production", this.templateHtml = "", this.hostname = this.envIsProduction ? "0.0.0.0" : "127.0.0.1", this.mode = s || process.env.MODE || "development", this.port = h || (process.env.PORT ? Number(process.env.PORT) : this.envIsProduction ? 8080 : 5173), this.base = e || process.env.BASE || "/", this.app = p(), this.cache = new l(), this.healthCheckCacheKey = "health-check", this.healthCheckCacheTimeout = 3e4, this.healthCheckStatusCodes = {
18
+ // The app is running normally.
19
+ healthy: 200,
20
+ // The app is performing app-specific initialisation which must
21
+ // complete before it will serve normal application requests
22
+ // (perhaps the app is warming a cache or something similar). You
23
+ // only need to use this status if your app will be in a start-up
24
+ // mode for a prolonged period of time.
25
+ startingUp: 503,
26
+ // The app is shutting down. As with startingUp, you only need to
27
+ // use this status if your app takes a prolonged amount of time
28
+ // to shutdown, perhaps because it waits for a long-running
29
+ // process to complete before shutting down.
30
+ shuttingDown: 503,
31
+ // The app is not running normally.
32
+ unhealthy: 503,
33
+ // The app is not able to report its own state.
34
+ unknown: 503
35
+ };
36
+ }
37
+ // @ts-expect-error unused var
38
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
+ getHealthCheck(s) {
40
+ return {
41
+ healthStatus: "healthy",
42
+ additionalInfo: "All healthy."
43
+ };
44
+ }
45
+ handleHealthCheck(s, h) {
46
+ let e = this.cache.get(
47
+ this.healthCheckCacheKey
48
+ );
49
+ if (e === null) {
50
+ const t = this.getHealthCheck(s);
51
+ t.healthStatus !== "healthy" && console.warn(`health check: ${JSON.stringify(t)}`), e = {
52
+ appId: process.env.APP_ID || "REPLACE_ME",
53
+ healthStatus: t.healthStatus,
54
+ lastCheckedTimestamp: (/* @__PURE__ */ new Date()).toISOString(),
55
+ additionalInformation: t.additionalInfo,
56
+ startupTimestamp: (/* @__PURE__ */ new Date()).toISOString(),
57
+ appVersion: process.env.APP_VERSION || "REPLACE_ME",
58
+ details: t.details || []
59
+ }, this.cache.put(
60
+ this.healthCheckCacheKey,
61
+ e,
62
+ this.healthCheckCacheTimeout
63
+ );
64
+ }
65
+ h.status(this.healthCheckStatusCodes[e.healthStatus]).json(e);
66
+ }
67
+ async handleServeHtml(s, h, e, t) {
68
+ try {
69
+ const a = s.originalUrl.replace(this.base, ""), [i, r] = await e(a), n = await i(a), c = r.replace("<!--app-head-->", n.head ?? "").replace("<!--app-html-->", n.html ?? "");
70
+ h.status(200).set({ "Content-Type": "text/html" }).send(c);
71
+ } catch (a) {
72
+ if (a instanceof Error) {
73
+ console.error(a.stack);
74
+ const i = t(a);
75
+ h.status(500).end(i);
76
+ }
77
+ }
78
+ }
79
+ async run() {
80
+ this.app.get("/health-check", (e, t) => {
81
+ this.handleHealthCheck(e, t);
82
+ });
83
+ let s, h;
84
+ if (this.envIsProduction) {
85
+ const e = (await import("compression")).default, t = (await import("sirv")).default;
86
+ this.templateHtml = await o.readFile("./dist/client/index.html", "utf-8"), this.app.use(e()), this.app.use(this.base, t("./dist/client", { extensions: [] })), s = async () => {
87
+ const a = (await import(
88
+ // @ts-expect-error only present after building installing app.
89
+ "../../../dist/server/entry-server.js"
90
+ )).render, i = this.templateHtml;
91
+ return [a, i];
92
+ }, h = () => {
93
+ };
94
+ } else {
95
+ const { createServer: e } = await import("vite"), t = await e({
96
+ server: { middlewareMode: !0 },
97
+ appType: "custom",
98
+ base: this.base,
99
+ mode: this.mode
100
+ });
101
+ this.app.use(t.middlewares), s = async (a) => {
102
+ const i = (await t.ssrLoadModule("/src/entry-server.tsx")).render;
103
+ let r = await o.readFile("./index.html", "utf-8");
104
+ return r = await t.transformIndexHtml(a, r), [i, r];
105
+ }, h = (a) => (t.ssrFixStacktrace(a), a.stack);
106
+ }
107
+ this.app.get("*", async (e, t) => {
108
+ await this.handleServeHtml(
109
+ e,
110
+ t,
111
+ s,
112
+ h
113
+ );
114
+ }), this.app.listen(this.port, this.hostname, () => {
115
+ let e = `Server started.
116
+ url: http://${this.hostname}:${this.port}
117
+ environment: ${process.env.NODE_ENV}
118
+ `;
119
+ this.envIsProduction || (e += `mode: ${this.mode}
120
+ `), console.log(e);
121
+ });
122
+ }
123
+ }
124
+ export {
125
+ v as default
126
+ };
127
+ //# sourceMappingURL=server.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.es.js","sources":["../src/server.ts"],"sourcesContent":["/**\n * © Ocado Group\n * Created on 13/12/2024 at 12:15:05(+00:00).\n *\n * A server for an app in a live environment.\n * Based off: https://github.com/bluwy/create-vite-extra/blob/master/template-ssr-react-ts/server.js\n */\n\nimport { Cache, type CacheClass } from \"memory-cache\"\nimport express, { type Express, type Request, type Response } from \"express\"\nimport fs from \"node:fs/promises\"\n\ntype Mode = \"development\" | \"staging\" | \"production\"\ntype Options = Partial<{\n mode: Mode\n port: number\n base: string\n}>\n\ntype HealthStatus =\n | \"healthy\"\n | \"startingUp\"\n | \"shuttingDown\"\n | \"unhealthy\"\n | \"unknown\"\ntype HealthCheck = {\n healthStatus: HealthStatus\n additionalInfo: string\n details?: Array<{\n name: string\n description: string\n health: HealthStatus\n }>\n}\ntype HealthCheckResponse = {\n appId: string\n healthStatus: HealthStatus\n lastCheckedTimestamp: string\n additionalInformation: string\n startupTimestamp: string\n appVersion: string\n details: Array<{\n name: string\n description: string\n health: HealthStatus\n }>\n}\n\ntype Render = (path: string) => Promise<{ head?: string; html?: string }>\ntype EntryModule = { render: Render }\ntype RenderAndTemplate = [Render, string]\ntype GetRenderAndTemplate = (path: string) => Promise<RenderAndTemplate>\ntype OnServeError = (error: Error) => string | undefined\n\nexport default class Server {\n envIsProduction: boolean\n templateHtml: string\n hostname: string\n mode: Mode\n port: number\n base: string\n app: Express\n cache: CacheClass<string, any>\n healthCheckCacheKey: string\n healthCheckCacheTimeout: number\n healthCheckStatusCodes: Record<HealthStatus, number>\n\n constructor({ mode, port, base }: Options = {}) {\n this.envIsProduction = process.env.NODE_ENV === \"production\"\n this.templateHtml = \"\"\n this.hostname = this.envIsProduction ? \"0.0.0.0\" : \"127.0.0.1\"\n\n this.mode = mode || (process.env.MODE as Mode) || \"development\"\n this.port =\n port ||\n (process.env.PORT\n ? Number(process.env.PORT)\n : this.envIsProduction\n ? 8080\n : 5173)\n this.base = base || process.env.BASE || \"/\"\n\n this.app = express()\n this.cache = new Cache()\n\n this.healthCheckCacheKey = \"health-check\"\n this.healthCheckCacheTimeout = 30000\n this.healthCheckStatusCodes = {\n // The app is running normally.\n healthy: 200,\n // The app is performing app-specific initialisation which must\n // complete before it will serve normal application requests\n // (perhaps the app is warming a cache or something similar). You\n // only need to use this status if your app will be in a start-up\n // mode for a prolonged period of time.\n startingUp: 503,\n // The app is shutting down. As with startingUp, you only need to\n // use this status if your app takes a prolonged amount of time\n // to shutdown, perhaps because it waits for a long-running\n // process to complete before shutting down.\n shuttingDown: 503,\n // The app is not running normally.\n unhealthy: 503,\n // The app is not able to report its own state.\n unknown: 503,\n }\n }\n\n // @ts-expect-error unused var\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n getHealthCheck(request: Request): HealthCheck {\n return {\n healthStatus: \"healthy\",\n additionalInfo: \"All healthy.\",\n }\n }\n\n handleHealthCheck(request: Request, response: Response): void {\n let value: HealthCheckResponse = this.cache.get(\n this.healthCheckCacheKey,\n ) as HealthCheckResponse\n if (value === null) {\n const healthCheck = this.getHealthCheck(request)\n\n if (healthCheck.healthStatus !== \"healthy\") {\n console.warn(`health check: ${JSON.stringify(healthCheck)}`)\n }\n\n value = {\n appId: process.env.APP_ID || \"REPLACE_ME\",\n healthStatus: healthCheck.healthStatus,\n lastCheckedTimestamp: new Date().toISOString(),\n additionalInformation: healthCheck.additionalInfo,\n startupTimestamp: new Date().toISOString(),\n appVersion: process.env.APP_VERSION || \"REPLACE_ME\",\n details: healthCheck.details || [],\n }\n\n this.cache.put(\n this.healthCheckCacheKey,\n value,\n this.healthCheckCacheTimeout,\n )\n }\n\n response.status(this.healthCheckStatusCodes[value.healthStatus]).json(value)\n }\n\n async handleServeHtml(\n request: Request,\n response: Response,\n getRenderAndTemplate: GetRenderAndTemplate,\n onServeError: OnServeError,\n ): Promise<void> {\n try {\n const path = request.originalUrl.replace(this.base, \"\")\n\n const [render, template] = await getRenderAndTemplate(path)\n\n const rendered = await render(path)\n\n const html = template\n .replace(`<!--app-head-->`, rendered.head ?? \"\")\n .replace(`<!--app-html-->`, rendered.html ?? \"\")\n\n response.status(200).set({ \"Content-Type\": \"text/html\" }).send(html)\n } catch (error) {\n if (error instanceof Error) {\n console.error(error.stack)\n const body = onServeError(error)\n response.status(500).end(body)\n }\n }\n }\n\n async run() {\n this.app.get(\"/health-check\", (request, response) => {\n this.handleHealthCheck(request, response)\n })\n\n let getRenderAndTemplate: GetRenderAndTemplate\n let onServeError: OnServeError\n if (this.envIsProduction) {\n const compression = (await import(\"compression\")).default\n const sirv = (await import(\"sirv\")).default\n\n this.templateHtml = await fs.readFile(\"./dist/client/index.html\", \"utf-8\")\n\n this.app.use(compression())\n this.app.use(this.base, sirv(\"./dist/client\", { extensions: [] }))\n\n getRenderAndTemplate = async () => {\n const render = (\n (await import(\n // @ts-expect-error only present after building installing app.\n \"../../../dist/server/entry-server.js\"\n )) as EntryModule\n ).render\n\n // Use cached template.\n const template = this.templateHtml\n\n return [render, template]\n }\n\n onServeError = () => undefined\n } else {\n const { createServer } = await import(\"vite\")\n\n const vite = await createServer({\n server: { middlewareMode: true },\n appType: \"custom\",\n base: this.base,\n mode: this.mode,\n })\n\n this.app.use(vite.middlewares)\n\n getRenderAndTemplate = async path => {\n const render = (\n (await vite.ssrLoadModule(\"/src/entry-server.tsx\")) as EntryModule\n ).render\n\n // Always read fresh template.\n let template = await fs.readFile(\"./index.html\", \"utf-8\")\n template = await vite.transformIndexHtml(path, template)\n\n return [render, template]\n }\n\n onServeError = error => {\n vite.ssrFixStacktrace(error)\n return error.stack\n }\n }\n\n this.app.get(\"*\", async (request, response) => {\n await this.handleServeHtml(\n request,\n response,\n getRenderAndTemplate,\n onServeError,\n )\n })\n\n this.app.listen(this.port, this.hostname, () => {\n let startMessage =\n \"Server started.\\n\" +\n `url: http://${this.hostname}:${this.port}\\n` +\n `environment: ${process.env.NODE_ENV}\\n`\n\n if (!this.envIsProduction) startMessage += `mode: ${this.mode}\\n`\n\n console.log(startMessage)\n })\n }\n}\n"],"names":["Server","mode","port","base","express","Cache","request","response","value","healthCheck","getRenderAndTemplate","onServeError","path","render","template","rendered","html","error","body","compression","sirv","fs","createServer","vite","startMessage"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const i=require("js-cookie"),c=require("./settings/index.cjs.js"),t=require("@reduxjs/toolkit"),n=t.buildCreateSlice({creators:{asyncThunk:t.asyncThunkCreator}}),g={isLoggedIn:!!i.get(c.SESSION_METADATA_COOKIE_NAME)},o=n({name:"session",initialState:g,reducers:e=>({login:e.reducer(s=>{s.isLoggedIn=!0}),logout:e.reducer(s=>{s.isLoggedIn=!1})}),selectors:{selectIsLoggedIn:e=>e.isLoggedIn}}),{login:r,logout:l}=o.actions,{selectIsLoggedIn:u}=o.selectors;exports.createSlice=n;exports.login=r;exports.logout=l;exports.selectIsLoggedIn=u;exports.sessionSlice=o;
2
+ //# sourceMappingURL=session-CE2U7oL1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-CE2U7oL1.cjs","sources":["../src/slices/createSlice.ts","../src/slices/session.ts"],"sourcesContent":["import { asyncThunkCreator, buildCreateSlice } from \"@reduxjs/toolkit\"\n\n// `buildCreateSlice` allows us to create a slice with async thunks.\nconst createSlice = buildCreateSlice({\n creators: { asyncThunk: asyncThunkCreator },\n})\n\nexport default createSlice\n","import Cookies from \"js-cookie\"\n\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport createSlice from \"./createSlice\"\n\nexport interface SessionState {\n isLoggedIn: boolean\n}\n\nconst initialState: SessionState = {\n isLoggedIn: Boolean(Cookies.get(SESSION_METADATA_COOKIE_NAME)),\n}\n\nconst sessionSlice = createSlice({\n name: \"session\",\n initialState,\n reducers: create => ({\n login: create.reducer(state => {\n state.isLoggedIn = true\n }),\n logout: create.reducer(state => {\n state.isLoggedIn = false\n }),\n }),\n selectors: {\n selectIsLoggedIn: session => session.isLoggedIn,\n },\n})\n\nexport default sessionSlice\nexport const { login, logout } = sessionSlice.actions\nexport const { selectIsLoggedIn } = sessionSlice.selectors\n"],"names":["createSlice","buildCreateSlice","asyncThunkCreator","initialState","Cookies","SESSION_METADATA_COOKIE_NAME","sessionSlice","create","state","session","login","logout","selectIsLoggedIn"],"mappings":"6GAGMA,EAAcC,EAAAA,iBAAiB,CACnC,SAAU,CAAE,WAAYC,EAAAA,iBAAA,CAC1B,CAAC,ECIKC,EAA6B,CACjC,WAAY,EAAQC,EAAQ,IAAIC,EAAAA,4BAA4B,CAC9D,EAEMC,EAAeN,EAAY,CAC/B,KAAM,UACN,aAAAG,EACA,SAAUI,IAAW,CACnB,MAAOA,EAAO,QAAQC,GAAS,CAC7BA,EAAM,WAAa,EACrB,CAAC,EACD,OAAQD,EAAO,QAAQC,GAAS,CAC9BA,EAAM,WAAa,EACrB,CAAC,CAAA,GAEH,UAAW,CACT,oBAA6BC,EAAQ,UAAA,CAEzC,CAAC,EAGY,CAAE,MAAAC,EAAO,OAAAC,CAAA,EAAWL,EAAa,QACjC,CAAE,iBAAAM,CAAA,EAAqBN,EAAa"}
@@ -0,0 +1,2 @@
1
+ "use strict";const u=require("./session-CE2U7oL1.cjs");function a(n,i="session/login/"){return n.mutation({query:o=>({url:i,method:"POST",body:o}),async onQueryStarted(o,{dispatch:r,queryFulfilled:t}){try{await t,r(u.login())}catch(e){console.error("Failed to call login endpoint...",e)}}})}function s(n,i,o="session/logout/"){return i.mutation({query:()=>({url:o,method:"POST"}),async onQueryStarted(r,{dispatch:t,queryFulfilled:e}){try{await e}catch(l){console.error("Failed to call logout endpoint...",l)}finally{t(u.logout()),t(n.util.resetApiState())}}})}exports.buildLoginEndpoint=a;exports.buildLogoutEndpoint=s;
2
+ //# sourceMappingURL=session-CacrgFSv.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-CacrgFSv.cjs","sources":["../src/api/endpoints/session.ts"],"sourcesContent":["import { type Api, type EndpointBuilder } from \"@reduxjs/toolkit/query/react\"\n\nimport { login, logout } from \"../../slices/session\"\n\nexport type ExchangeOAuth2CodeArg = {\n code: string\n code_verifier: string\n redirect_uri: string\n}\n\nexport function buildLoginEndpoint<ResultType, QueryArg>(\n build: EndpointBuilder<any, any, any>,\n url: string = \"session/login/\",\n) {\n return build.mutation<ResultType, QueryArg>({\n query: body => ({ url, method: \"POST\", body }),\n async onQueryStarted(_, { dispatch, queryFulfilled }) {\n try {\n await queryFulfilled\n dispatch(login())\n } catch (error) {\n console.error(\"Failed to call login endpoint...\", error)\n }\n },\n })\n}\n\nexport function buildLogoutEndpoint<ResultType, QueryArg>(\n api: Api<any, any, any, any, any>,\n build: EndpointBuilder<any, any, any>,\n url: string = \"session/logout/\",\n) {\n return build.mutation<ResultType, QueryArg>({\n query: () => ({ url, method: \"POST\" }),\n async onQueryStarted(_, { dispatch, queryFulfilled }) {\n try {\n await queryFulfilled\n } catch (error) {\n console.error(\"Failed to call logout endpoint...\", error)\n } finally {\n dispatch(logout())\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n dispatch(api.util.resetApiState())\n }\n },\n })\n}\n"],"names":["buildLoginEndpoint","build","url","body","_","dispatch","queryFulfilled","login","error","buildLogoutEndpoint","api","logout"],"mappings":"uDAUO,SAASA,EACdC,EACAC,EAAc,iBACd,CACA,OAAOD,EAAM,SAA+B,CAC1C,MAAOE,IAAS,CAAE,IAAAD,EAAK,OAAQ,OAAQ,KAAAC,IACvC,MAAM,eAAeC,EAAG,CAAE,SAAAC,EAAU,eAAAC,GAAkB,CACpD,GAAI,CACF,MAAMA,EACND,EAASE,EAAAA,OAAO,CAClB,OAASC,EAAO,CACd,QAAQ,MAAM,mCAAoCA,CAAK,CACzD,CACF,CAAA,CACD,CACH,CAEO,SAASC,EACdC,EACAT,EACAC,EAAc,kBACd,CACA,OAAOD,EAAM,SAA+B,CAC1C,MAAO,KAAO,CAAE,IAAAC,EAAK,OAAQ,MAAA,GAC7B,MAAM,eAAeE,EAAG,CAAE,SAAAC,EAAU,eAAAC,GAAkB,CACpD,GAAI,CACF,MAAMA,CACR,OAASE,EAAO,CACd,QAAQ,MAAM,oCAAqCA,CAAK,CAC1D,QAAA,CACEH,EAASM,EAAAA,QAAQ,EAEjBN,EAASK,EAAI,KAAK,eAAe,CACnC,CACF,CAAA,CACD,CACH"}
@@ -0,0 +1,32 @@
1
+ import { l, a as u } from "./session-oI-Ht2C8.js";
2
+ function c(n, r = "session/login/") {
3
+ return n.mutation({
4
+ query: (o) => ({ url: r, method: "POST", body: o }),
5
+ async onQueryStarted(o, { dispatch: a, queryFulfilled: t }) {
6
+ try {
7
+ await t, a(u());
8
+ } catch (e) {
9
+ console.error("Failed to call login endpoint...", e);
10
+ }
11
+ }
12
+ });
13
+ }
14
+ function d(n, r, o = "session/logout/") {
15
+ return r.mutation({
16
+ query: () => ({ url: o, method: "POST" }),
17
+ async onQueryStarted(a, { dispatch: t, queryFulfilled: e }) {
18
+ try {
19
+ await e;
20
+ } catch (i) {
21
+ console.error("Failed to call logout endpoint...", i);
22
+ } finally {
23
+ t(l()), t(n.util.resetApiState());
24
+ }
25
+ }
26
+ });
27
+ }
28
+ export {
29
+ c as a,
30
+ d as b
31
+ };
32
+ //# sourceMappingURL=session-D312kYKk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-D312kYKk.js","sources":["../src/api/endpoints/session.ts"],"sourcesContent":["import { type Api, type EndpointBuilder } from \"@reduxjs/toolkit/query/react\"\n\nimport { login, logout } from \"../../slices/session\"\n\nexport type ExchangeOAuth2CodeArg = {\n code: string\n code_verifier: string\n redirect_uri: string\n}\n\nexport function buildLoginEndpoint<ResultType, QueryArg>(\n build: EndpointBuilder<any, any, any>,\n url: string = \"session/login/\",\n) {\n return build.mutation<ResultType, QueryArg>({\n query: body => ({ url, method: \"POST\", body }),\n async onQueryStarted(_, { dispatch, queryFulfilled }) {\n try {\n await queryFulfilled\n dispatch(login())\n } catch (error) {\n console.error(\"Failed to call login endpoint...\", error)\n }\n },\n })\n}\n\nexport function buildLogoutEndpoint<ResultType, QueryArg>(\n api: Api<any, any, any, any, any>,\n build: EndpointBuilder<any, any, any>,\n url: string = \"session/logout/\",\n) {\n return build.mutation<ResultType, QueryArg>({\n query: () => ({ url, method: \"POST\" }),\n async onQueryStarted(_, { dispatch, queryFulfilled }) {\n try {\n await queryFulfilled\n } catch (error) {\n console.error(\"Failed to call logout endpoint...\", error)\n } finally {\n dispatch(logout())\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access\n dispatch(api.util.resetApiState())\n }\n },\n })\n}\n"],"names":["buildLoginEndpoint","build","url","body","_","dispatch","queryFulfilled","login","error","buildLogoutEndpoint","api","logout"],"mappings":";AAUO,SAASA,EACdC,GACAC,IAAc,kBACd;AACA,SAAOD,EAAM,SAA+B;AAAA,IAC1C,OAAO,CAAAE,OAAS,EAAE,KAAAD,GAAK,QAAQ,QAAQ,MAAAC;IACvC,MAAM,eAAeC,GAAG,EAAE,UAAAC,GAAU,gBAAAC,KAAkB;AACpD,UAAI;AACF,cAAMA,GACND,EAASE,GAAO;AAAA,MAClB,SAASC,GAAO;AACd,gBAAQ,MAAM,oCAAoCA,CAAK;AAAA,MACzD;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAEO,SAASC,EACdC,GACAT,GACAC,IAAc,mBACd;AACA,SAAOD,EAAM,SAA+B;AAAA,IAC1C,OAAO,OAAO,EAAE,KAAAC,GAAK,QAAQ,OAAA;AAAA,IAC7B,MAAM,eAAeE,GAAG,EAAE,UAAAC,GAAU,gBAAAC,KAAkB;AACpD,UAAI;AACF,cAAMA;AAAA,MACR,SAASE,GAAO;AACd,gBAAQ,MAAM,qCAAqCA,CAAK;AAAA,MAC1D,UAAA;AACE,QAAAH,EAASM,GAAQ,GAEjBN,EAASK,EAAI,KAAK,eAAe;AAAA,MACnC;AAAA,IACF;AAAA,EAAA,CACD;AACH;"}
@@ -0,0 +1,30 @@
1
+ import t from "js-cookie";
2
+ import { SESSION_METADATA_COOKIE_NAME as n } from "./settings/index.es.js";
3
+ import { buildCreateSlice as r, asyncThunkCreator as c } from "@reduxjs/toolkit";
4
+ const i = r({
5
+ creators: { asyncThunk: c }
6
+ }), a = {
7
+ isLoggedIn: !!t.get(n)
8
+ }, o = i({
9
+ name: "session",
10
+ initialState: a,
11
+ reducers: (e) => ({
12
+ login: e.reducer((s) => {
13
+ s.isLoggedIn = !0;
14
+ }),
15
+ logout: e.reducer((s) => {
16
+ s.isLoggedIn = !1;
17
+ })
18
+ }),
19
+ selectors: {
20
+ selectIsLoggedIn: (e) => e.isLoggedIn
21
+ }
22
+ }), { login: I, logout: u } = o.actions, { selectIsLoggedIn: m } = o.selectors;
23
+ export {
24
+ I as a,
25
+ m as b,
26
+ i as c,
27
+ u as l,
28
+ o as s
29
+ };
30
+ //# sourceMappingURL=session-oI-Ht2C8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-oI-Ht2C8.js","sources":["../src/slices/createSlice.ts","../src/slices/session.ts"],"sourcesContent":["import { asyncThunkCreator, buildCreateSlice } from \"@reduxjs/toolkit\"\n\n// `buildCreateSlice` allows us to create a slice with async thunks.\nconst createSlice = buildCreateSlice({\n creators: { asyncThunk: asyncThunkCreator },\n})\n\nexport default createSlice\n","import Cookies from \"js-cookie\"\n\nimport { SESSION_METADATA_COOKIE_NAME } from \"../settings\"\nimport createSlice from \"./createSlice\"\n\nexport interface SessionState {\n isLoggedIn: boolean\n}\n\nconst initialState: SessionState = {\n isLoggedIn: Boolean(Cookies.get(SESSION_METADATA_COOKIE_NAME)),\n}\n\nconst sessionSlice = createSlice({\n name: \"session\",\n initialState,\n reducers: create => ({\n login: create.reducer(state => {\n state.isLoggedIn = true\n }),\n logout: create.reducer(state => {\n state.isLoggedIn = false\n }),\n }),\n selectors: {\n selectIsLoggedIn: session => session.isLoggedIn,\n },\n})\n\nexport default sessionSlice\nexport const { login, logout } = sessionSlice.actions\nexport const { selectIsLoggedIn } = sessionSlice.selectors\n"],"names":["createSlice","buildCreateSlice","asyncThunkCreator","initialState","Cookies","SESSION_METADATA_COOKIE_NAME","sessionSlice","create","state","session","login","logout","selectIsLoggedIn"],"mappings":";;;AAGA,MAAMA,IAAcC,EAAiB;AAAA,EACnC,UAAU,EAAE,YAAYC,EAAA;AAC1B,CAAC,GCIKC,IAA6B;AAAA,EACjC,YAAY,EAAQC,EAAQ,IAAIC,CAA4B;AAC9D,GAEMC,IAAeN,EAAY;AAAA,EAC/B,MAAM;AAAA,EACN,cAAAG;AAAA,EACA,UAAU,CAAAI,OAAW;AAAA,IACnB,OAAOA,EAAO,QAAQ,CAAAC,MAAS;AAC7B,MAAAA,EAAM,aAAa;AAAA,IACrB,CAAC;AAAA,IACD,QAAQD,EAAO,QAAQ,CAAAC,MAAS;AAC9B,MAAAA,EAAM,aAAa;AAAA,IACrB,CAAC;AAAA,EAAA;AAAA,EAEH,WAAW;AAAA,IACT,kBAAkB,OAAWC,EAAQ;AAAA,EAAA;AAEzC,CAAC,GAGY,EAAE,OAAAC,GAAO,QAAAC,EAAA,IAAWL,EAAa,SACjC,EAAE,kBAAAM,EAAA,IAAqBN,EAAa;"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This file contains all of our custom settings we define for our own purposes.
3
+ *
4
+ * This file is based on:
5
+ * https://github.com/ocadotechnology/codeforlife-package-python/blob/main/codeforlife/settings/custom.py
6
+ */
7
+ export declare const SERVICE_NAME: string;
8
+ export declare const SERVICE_API_URL: string;
9
+ export declare const CSRF_COOKIE_NAME: string;
10
+ export declare const SESSION_COOKIE_NAME: string;
11
+ export declare const SESSION_METADATA_COOKIE_NAME: string;
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o={},E=o,t=E.VITE_SERVICE_NAME??"REPLACE_ME",O=E.VITE_SERVICE_API_URL??"http://localhost:8000",s=`${t}_csrftoken`,n=E.VITE_SESSION_COOKIE_NAME??"session_key",A=E.VITE_SESSION_METADATA_COOKIE_NAME??"session_metadata",I={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},_=I,R=_.MODE,c=_.BASE_URL,M=_.PROD,D=_.DEV,C=_.SSR,N={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1},V=new Proxy(N,{get:(S,e)=>S[`VITE_${e}`]});exports.BASE_URL=c;exports.CSRF_COOKIE_NAME=s;exports.DEV=D;exports.MODE=R;exports.PROD=M;exports.SERVICE_API_URL=O;exports.SERVICE_NAME=t;exports.SESSION_COOKIE_NAME=n;exports.SESSION_METADATA_COOKIE_NAME=A;exports.SSR=C;exports.default=V;
2
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/settings/custom.ts","../../src/settings/vite.ts","../../src/settings/index.ts"],"sourcesContent":["/**\n * This file contains all of our custom settings we define for our own purposes.\n *\n * This file is based on:\n * https://github.com/ocadotechnology/codeforlife-package-python/blob/main/codeforlife/settings/custom.py\n */\n\n// Shorthand to access environment variables.\nconst env = import.meta.env as Record<string, string | undefined>\n\n// The name of the current service.\nexport const SERVICE_NAME = env.VITE_SERVICE_NAME ?? \"REPLACE_ME\"\n\n// The api url of the current service.\nexport const SERVICE_API_URL =\n env.VITE_SERVICE_API_URL ?? \"http://localhost:8000\"\n\n// The names of cookies.\nexport const CSRF_COOKIE_NAME = `${SERVICE_NAME}_csrftoken`\nexport const SESSION_COOKIE_NAME = env.VITE_SESSION_COOKIE_NAME ?? \"session_key\"\nexport const SESSION_METADATA_COOKIE_NAME =\n env.VITE_SESSION_METADATA_COOKIE_NAME ?? \"session_metadata\"\n","/**\n * This file contains all of vite's environment variables.\n *\n * https://vite.dev/guide/env-and-mode#env-variables\n */\n\n// Shorthand to access environment variables.\nconst env = import.meta.env\n\n// The mode the app is running in.\nexport const MODE = env.MODE\n\n// The base url the app is being served from.\n// This is determined by the base config option.\nexport const BASE_URL = env.BASE_URL\n\n// Whether the app is running in production (running the dev server with\n// NODE_ENV='production' or running an app built with NODE_ENV='production').\nexport const PROD = env.PROD\n\n// Whether the app is running in development (always the opposite of\n// import.meta.env.PROD)\nexport const DEV = env.DEV\n\n// Whether the app is running in the server.\nexport const SSR = env.SSR\n","// Shorthand to access environment variables.\nexport default new Proxy(import.meta.env, {\n get: (target, name: string) => target[`VITE_${name}`] as string,\n}) as Record<string, string>\n\nexport * from \"./custom\"\nexport * from \"./vite\"\n"],"names":["env","__vite_import_meta_env__","SERVICE_NAME","SERVICE_API_URL","CSRF_COOKIE_NAME","SESSION_COOKIE_NAME","SESSION_METADATA_COOKIE_NAME","MODE","BASE_URL","PROD","DEV","SSR","index","target","name"],"mappings":"uHAQMA,EAAMC,EAGCC,EAAeF,EAAI,mBAAqB,aAGxCG,EACXH,EAAI,sBAAwB,wBAGjBI,EAAmB,GAAGF,CAAY,aAClCG,EAAsBL,EAAI,0BAA4B,cACtDM,EACXN,EAAI,mCAAqC,4ECdrCA,EAAMC,EAGCM,EAAOP,EAAI,KAIXQ,EAAWR,EAAI,SAIfS,EAAOT,EAAI,KAIXU,EAAMV,EAAI,IAGVW,EAAMX,EAAI,6DCxBvBY,EAAe,IAAI,MAAMX,EAAiB,CACxC,IAAK,CAACY,EAAQC,IAAiBD,EAAO,QAAQC,CAAI,EAAE,CACtD,CAAC"}
@@ -0,0 +1,4 @@
1
+ declare const _default: Record<string, string>;
2
+ export default _default;
3
+ export * from './custom';
4
+ export * from './vite';
@@ -0,0 +1,17 @@
1
+ const s = {}, E = s, S = E.VITE_SERVICE_NAME ?? "REPLACE_ME", O = E.VITE_SERVICE_API_URL ?? "http://localhost:8000", c = `${S}_csrftoken`, A = E.VITE_SESSION_COOKIE_NAME ?? "session_key", I = E.VITE_SESSION_METADATA_COOKIE_NAME ?? "session_metadata", n = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }, _ = n, R = _.MODE, D = _.BASE_URL, M = _.PROD, a = _.DEV, V = _.SSR, e = { BASE_URL: "/", DEV: !1, MODE: "production", PROD: !0, SSR: !1 }, i = new Proxy(e, {
2
+ get: (t, o) => t[`VITE_${o}`]
3
+ });
4
+ export {
5
+ D as BASE_URL,
6
+ c as CSRF_COOKIE_NAME,
7
+ a as DEV,
8
+ R as MODE,
9
+ M as PROD,
10
+ O as SERVICE_API_URL,
11
+ S as SERVICE_NAME,
12
+ A as SESSION_COOKIE_NAME,
13
+ I as SESSION_METADATA_COOKIE_NAME,
14
+ V as SSR,
15
+ i as default
16
+ };
17
+ //# sourceMappingURL=index.es.js.map