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.
- package/dist/Countdown-DFI1RljW.js +28 -0
- package/dist/Countdown-DFI1RljW.js.map +1 -0
- package/dist/Countdown-zY3nMzmi.cjs +2 -0
- package/dist/Countdown-zY3nMzmi.cjs.map +1 -0
- package/dist/Image-D5jC9UoX.js +21 -0
- package/dist/Image-D5jC9UoX.js.map +1 -0
- package/dist/Image-mgT45r_B.cjs +2 -0
- package/dist/Image-mgT45r_B.cjs.map +1 -0
- package/dist/LinkButton-BYFkvL_O.cjs +2 -0
- package/dist/LinkButton-BYFkvL_O.cjs.map +1 -0
- package/dist/LinkButton-oK0RThqn.js +12 -0
- package/dist/LinkButton-oK0RThqn.js.map +1 -0
- package/dist/Navigate-Dq47aqC8.js +25 -0
- package/dist/Navigate-Dq47aqC8.js.map +1 -0
- package/dist/Navigate-dQocLhzN.cjs +2 -0
- package/dist/Navigate-dQocLhzN.cjs.map +1 -0
- package/dist/api/createApi.d.ts +7 -0
- package/dist/api/endpoints/authFactor.d.ts +11 -0
- package/dist/api/endpoints/index.cjs.js +2 -0
- package/dist/api/endpoints/index.cjs.js.map +1 -0
- package/dist/api/endpoints/index.d.ts +9 -0
- package/dist/api/endpoints/index.es.js +78 -0
- package/dist/api/endpoints/index.es.js.map +1 -0
- package/dist/api/endpoints/klass.d.ts +26 -0
- package/dist/api/endpoints/school.d.ts +11 -0
- package/dist/api/endpoints/session.d.ts +9 -0
- package/dist/api/endpoints/user.d.ts +19 -0
- package/dist/api/index.cjs.js +4 -0
- package/dist/api/index.cjs.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.es.js +541 -0
- package/dist/api/index.es.js.map +1 -0
- package/dist/api/models.d.ts +92 -0
- package/dist/api/schemas.d.ts +20 -0
- package/dist/api/tagTypes.d.ts +3 -0
- package/dist/api/urls.d.ts +31 -0
- package/dist/api-Cbyt3rw0.js +92 -0
- package/dist/api-Cbyt3rw0.js.map +1 -0
- package/dist/api-CnMfjRk3.cjs +2 -0
- package/dist/api-CnMfjRk3.cjs.map +1 -0
- package/dist/api-Cs4Y-WeI.js +20 -0
- package/dist/api-Cs4Y-WeI.js.map +1 -0
- package/dist/api-DIgp_6Vr.cjs +2 -0
- package/dist/api-DIgp_6Vr.cjs.map +1 -0
- package/dist/auth-BPfUPjmM.js +237 -0
- package/dist/auth-BPfUPjmM.js.map +1 -0
- package/dist/auth-Vf1MgMci.cjs +2 -0
- package/dist/auth-Vf1MgMci.cjs.map +1 -0
- package/dist/components/App.d.ts +18 -0
- package/dist/components/ClickableTooltip.d.ts +6 -0
- package/dist/components/CopyIconButton.d.ts +7 -0
- package/dist/components/CopyIconButton.test.d.ts +1 -0
- package/dist/components/Countdown.d.ts +9 -0
- package/dist/components/DownloadFileButton.d.ts +13 -0
- package/dist/components/ElevatedAppBar.d.ts +8 -0
- package/dist/components/Image.d.ts +10 -0
- package/dist/components/InputFileButton.d.ts +7 -0
- package/dist/components/ItemizedList.d.ts +11 -0
- package/dist/components/OrderedGrid.d.ts +21 -0
- package/dist/components/ScrollIntoViewLink.d.ts +8 -0
- package/dist/components/SyncError.d.ts +5 -0
- package/dist/components/TablePagination.d.ts +20 -0
- package/dist/components/YouTubeVideo.d.ts +7 -0
- package/dist/components/form/ApiAutocompleteField.d.ts +14 -0
- package/dist/components/form/AutocompleteField.d.ts +11 -0
- package/dist/components/form/CheckboxField.d.ts +11 -0
- package/dist/components/form/CountryField.d.ts +10 -0
- package/dist/components/form/DatePickerField.d.ts +10 -0
- package/dist/components/form/EmailField.d.ts +5 -0
- package/dist/components/form/FirstNameField.d.ts +5 -0
- package/dist/components/form/Form.d.ts +36 -0
- package/dist/components/form/OtpField.d.ts +5 -0
- package/dist/components/form/PasswordField.d.ts +9 -0
- package/dist/components/form/RepeatField.d.ts +9 -0
- package/dist/components/form/SubmitButton.d.ts +6 -0
- package/dist/components/form/TextField.d.ts +14 -0
- package/dist/components/form/UkCountyField.d.ts +10 -0
- package/dist/components/form/index.cjs.js +2 -0
- package/dist/components/form/index.cjs.js.map +1 -0
- package/dist/components/form/index.d.ts +14 -0
- package/dist/components/form/index.es.js +18 -0
- package/dist/components/form/index.es.js.map +1 -0
- package/dist/components/index.cjs.js +11 -0
- package/dist/components/index.cjs.js.map +1 -0
- package/dist/components/index.d.ts +18 -0
- package/dist/components/index.es.js +383 -0
- package/dist/components/index.es.js.map +1 -0
- package/dist/components/page/Banner.d.ts +13 -0
- package/dist/components/page/Notification.d.ts +10 -0
- package/dist/components/page/Page.d.ts +19 -0
- package/dist/components/page/Section.d.ts +7 -0
- package/dist/components/page/TabBar.d.ts +13 -0
- package/dist/components/page/index.cjs.js +2 -0
- package/dist/components/page/index.cjs.js.map +1 -0
- package/dist/components/page/index.d.ts +5 -0
- package/dist/components/page/index.es.js +9 -0
- package/dist/components/page/index.es.js.map +1 -0
- package/dist/components/router/Link.d.ts +9 -0
- package/dist/components/router/LinkButton.d.ts +9 -0
- package/dist/components/router/LinkIconButton.d.ts +9 -0
- package/dist/components/router/LinkListItem.d.ts +9 -0
- package/dist/components/router/LinkTab.d.ts +9 -0
- package/dist/components/router/Navigate.d.ts +15 -0
- package/dist/components/router/index.cjs.js +2 -0
- package/dist/components/router/index.cjs.js.map +1 -0
- package/dist/components/router/index.d.ts +6 -0
- package/dist/components/router/index.es.js +11 -0
- package/dist/components/router/index.es.js.map +1 -0
- package/dist/components/table/CellStack.d.ts +7 -0
- package/dist/components/table/Table.d.ts +12 -0
- package/dist/components/table/index.cjs.js +2 -0
- package/dist/components/table/index.cjs.js.map +1 -0
- package/dist/components/table/index.d.ts +3 -0
- package/dist/components/table/index.es.js +9 -0
- package/dist/components/table/index.es.js.map +1 -0
- package/dist/en-gb-B_rK7Jx1.js +20 -0
- package/dist/en-gb-B_rK7Jx1.js.map +1 -0
- package/dist/en-gb-CpyEkKq3.cjs +2 -0
- package/dist/en-gb-CpyEkKq3.cjs.map +1 -0
- package/dist/features/InactiveDialog.d.ts +7 -0
- package/dist/features/ScreenTimeDialog.d.ts +7 -0
- package/dist/features/index.cjs.js +2 -0
- package/dist/features/index.cjs.js.map +1 -0
- package/dist/features/index.d.ts +4 -0
- package/dist/features/index.es.js +47 -0
- package/dist/features/index.es.js.map +1 -0
- package/dist/general-BPbbmkeX.cjs +2 -0
- package/dist/general-BPbbmkeX.cjs.map +1 -0
- package/dist/general-CtTJPCJn.js +58 -0
- package/dist/general-CtTJPCJn.js.map +1 -0
- package/dist/hooks/api.d.ts +15 -0
- package/dist/hooks/auth.d.ts +46 -0
- package/{src/hooks/form.tsx → dist/hooks/form.d.ts} +2 -5
- package/dist/hooks/general.d.ts +13 -0
- package/dist/hooks/index.cjs.js +2 -0
- package/dist/hooks/index.cjs.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.es.js +25 -0
- package/dist/hooks/index.es.js.map +1 -0
- package/dist/hooks/router.d.ts +29 -0
- package/dist/index-2W--_sNE.js +30 -0
- package/dist/index-2W--_sNE.js.map +1 -0
- package/dist/index-BUMdUVBH.cjs +5 -0
- package/dist/index-BUMdUVBH.cjs.map +1 -0
- package/dist/index-B_Zy_zwA.cjs +2 -0
- package/dist/index-B_Zy_zwA.cjs.map +1 -0
- package/dist/index-BgsynEGX.cjs +2 -0
- package/dist/index-BgsynEGX.cjs.map +1 -0
- package/dist/index-CA-ugBSa.cjs +2 -0
- package/dist/index-CA-ugBSa.cjs.map +1 -0
- package/dist/index-CNtOlJ49.js +572 -0
- package/dist/index-CNtOlJ49.js.map +1 -0
- package/dist/index-DkM_cG3a.js +237 -0
- package/dist/index-DkM_cG3a.js.map +1 -0
- package/dist/index-Dqp7dpn3.js +1111 -0
- package/dist/index-Dqp7dpn3.js.map +1 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +7 -0
- package/dist/index.es.js.map +1 -0
- package/dist/jsx-runtime-CeSfJrVB.cjs +31 -0
- package/dist/jsx-runtime-CeSfJrVB.cjs.map +1 -0
- package/dist/jsx-runtime-Dpn_P65e.js +634 -0
- package/dist/jsx-runtime-Dpn_P65e.js.map +1 -0
- package/dist/middlewares/index.cjs.js +2 -0
- package/dist/middlewares/index.cjs.js.map +1 -0
- package/dist/middlewares/index.d.ts +1 -0
- package/dist/middlewares/index.es.js +10 -0
- package/dist/middlewares/index.es.js.map +1 -0
- package/dist/middlewares/session.d.ts +2 -0
- package/dist/palette-CE2mKYse.cjs +2 -0
- package/dist/palette-CE2mKYse.cjs.map +1 -0
- package/dist/palette-C_L0akN_.js +43 -0
- package/dist/palette-C_L0akN_.js.map +1 -0
- package/dist/rtk-query.modern-CjetfYPg.js +3038 -0
- package/dist/rtk-query.modern-CjetfYPg.js.map +1 -0
- package/dist/rtk-query.modern-PBCErCqb.cjs +15 -0
- package/dist/rtk-query.modern-PBCErCqb.cjs.map +1 -0
- package/dist/schemas-BZbJpkD5.cjs +2 -0
- package/dist/schemas-BZbJpkD5.cjs.map +1 -0
- package/dist/schemas-DlOtf2vf.js +162 -0
- package/dist/schemas-DlOtf2vf.js.map +1 -0
- package/dist/scripts/index.d.ts +0 -0
- package/dist/server.cjs.js +6 -0
- package/dist/server.cjs.js.map +1 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.es.js +127 -0
- package/dist/server.es.js.map +1 -0
- package/dist/session-CE2U7oL1.cjs +2 -0
- package/dist/session-CE2U7oL1.cjs.map +1 -0
- package/dist/session-CacrgFSv.cjs +2 -0
- package/dist/session-CacrgFSv.cjs.map +1 -0
- package/dist/session-D312kYKk.js +32 -0
- package/dist/session-D312kYKk.js.map +1 -0
- package/dist/session-oI-Ht2C8.js +30 -0
- package/dist/session-oI-Ht2C8.js.map +1 -0
- package/dist/settings/custom.d.ts +11 -0
- package/dist/settings/index.cjs.js +2 -0
- package/dist/settings/index.cjs.js.map +1 -0
- package/dist/settings/index.d.ts +4 -0
- package/dist/settings/index.es.js +17 -0
- package/dist/settings/index.es.js.map +1 -0
- package/dist/settings/vite.d.ts +10 -0
- package/dist/setupTests.d.ts +0 -0
- package/dist/slices/createSlice.d.ts +3 -0
- package/dist/slices/index.cjs.js +2 -0
- package/dist/slices/index.cjs.js.map +1 -0
- package/dist/slices/index.d.ts +2 -0
- package/dist/slices/index.es.js +6 -0
- package/dist/slices/index.es.js.map +1 -0
- package/dist/slices/session.d.ts +28 -0
- package/dist/style.css +1 -0
- package/dist/theme/ThemedBox.d.ts +10 -0
- package/dist/theme/colors.d.ts +18 -0
- package/dist/theme/components/MuiAccordion.d.ts +3 -0
- package/dist/theme/components/MuiAutocomplete.d.ts +3 -0
- package/dist/theme/components/MuiButton.d.ts +3 -0
- package/dist/theme/components/MuiCardActions.d.ts +3 -0
- package/dist/theme/components/MuiCheckbox.d.ts +3 -0
- package/dist/theme/components/MuiContainer.d.ts +3 -0
- package/dist/theme/components/MuiDialog.d.ts +3 -0
- package/dist/theme/components/MuiFormControlLabel.d.ts +3 -0
- package/dist/theme/components/MuiFormHelperText.d.ts +3 -0
- package/dist/theme/components/MuiGrid2.d.ts +3 -0
- package/dist/theme/components/MuiInputBase.d.ts +3 -0
- package/dist/theme/components/MuiLink.d.ts +3 -0
- package/dist/theme/components/MuiList.d.ts +3 -0
- package/dist/theme/components/MuiListItemText.d.ts +3 -0
- package/dist/theme/components/MuiMenu.d.ts +3 -0
- package/dist/theme/components/MuiMenuItem.d.ts +3 -0
- package/dist/theme/components/MuiSelect.d.ts +3 -0
- package/dist/theme/components/MuiTab.d.ts +3 -0
- package/dist/theme/components/MuiTable.d.ts +3 -0
- package/dist/theme/components/MuiTableBody.d.ts +3 -0
- package/dist/theme/components/MuiTableHead.d.ts +3 -0
- package/dist/theme/components/MuiTabs.d.ts +3 -0
- package/dist/theme/components/MuiTextField.d.ts +3 -0
- package/dist/theme/components/MuiToolbar.d.ts +3 -0
- package/dist/theme/components/MuiTypography.d.ts +3 -0
- package/dist/theme/components/_components.d.ts +11 -0
- package/dist/theme/components/index.cjs.js +2 -0
- package/dist/theme/components/index.cjs.js.map +1 -0
- package/dist/theme/components/index.d.ts +3 -0
- package/dist/theme/components/index.es.js +6 -0
- package/dist/theme/components/index.es.js.map +1 -0
- package/dist/theme/index.cjs.js +2 -0
- package/dist/theme/index.cjs.js.map +1 -0
- package/dist/theme/index.d.ts +7 -0
- package/dist/theme/index.es.js +222 -0
- package/dist/theme/index.es.js.map +1 -0
- package/dist/theme/palette.d.ts +79 -0
- package/dist/theme/spacing.d.ts +1 -0
- package/dist/theme/typography.d.ts +4 -0
- package/dist/urls-DtHr1d3H.js +14 -0
- package/dist/urls-DtHr1d3H.js.map +1 -0
- package/dist/urls-MaVXL_C2.cjs +2 -0
- package/dist/urls-MaVXL_C2.cjs.map +1 -0
- package/dist/utils/api.cjs.js +2 -0
- package/dist/utils/api.cjs.js.map +1 -0
- package/dist/utils/api.d.ts +72 -0
- package/dist/utils/api.es.js +16 -0
- package/dist/utils/api.es.js.map +1 -0
- package/dist/utils/api.test.d.ts +1 -0
- package/dist/utils/auth.cjs.js +2 -0
- package/dist/utils/auth.cjs.js.map +1 -0
- package/dist/utils/auth.d.ts +28 -0
- package/dist/utils/auth.es.js +117 -0
- package/dist/utils/auth.es.js.map +1 -0
- package/dist/utils/form.cjs.js +2 -0
- package/dist/utils/form.cjs.js.map +1 -0
- package/dist/utils/form.d.ts +25 -0
- package/dist/utils/form.es.js +76 -0
- package/dist/utils/form.es.js.map +1 -0
- package/dist/utils/form.test.d.ts +1 -0
- package/dist/utils/general.cjs.js +2 -0
- package/dist/utils/general.cjs.js.map +1 -0
- package/dist/utils/general.d.ts +30 -0
- package/{src/utils/general.ts → dist/utils/general.es.js} +87 -165
- package/dist/utils/general.es.js.map +1 -0
- package/dist/utils/general.test.d.ts +1 -0
- package/dist/utils/router.cjs.js +2 -0
- package/dist/utils/router.cjs.js.map +1 -0
- package/dist/utils/router.d.ts +19 -0
- package/dist/utils/router.es.js +33 -0
- package/dist/utils/router.es.js.map +1 -0
- package/dist/utils/router.test.d.ts +1 -0
- package/dist/utils/schema.cjs.js +2 -0
- package/dist/utils/schema.cjs.js.map +1 -0
- package/dist/utils/schema.d.ts +43 -0
- package/dist/utils/schema.es.js +123 -0
- package/dist/utils/schema.es.js.map +1 -0
- package/dist/utils/store.cjs.js +2 -0
- package/dist/utils/store.cjs.js.map +1 -0
- package/dist/utils/store.d.ts +10 -0
- package/dist/utils/store.es.js +20 -0
- package/dist/utils/store.es.js.map +1 -0
- package/dist/utils/test.cjs.js +2 -0
- package/dist/utils/test.cjs.js.map +1 -0
- package/dist/utils/test.d.ts +53 -0
- package/dist/utils/test.es.js +60 -0
- package/dist/utils/test.es.js.map +1 -0
- package/dist/utils/theme.cjs.js +2 -0
- package/dist/utils/theme.cjs.js.map +1 -0
- package/dist/utils/theme.d.ts +11 -0
- package/dist/utils/theme.es.js +12 -0
- package/dist/utils/theme.es.js.map +1 -0
- package/dist/utils/window.cjs.js +2 -0
- package/dist/utils/window.cjs.js.map +1 -0
- package/dist/utils/window.d.ts +2 -0
- package/dist/utils/window.es.js +11 -0
- package/dist/utils/window.es.js.map +1 -0
- package/package.json +142 -37
- package/.github/workflows/main.yml +0 -55
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -2027
- package/CONTRIBUTING.md +0 -3
- package/eslint.config.js +0 -17
- package/src/api/createApi.ts +0 -91
- package/src/api/endpoints/authFactor.ts +0 -31
- package/src/api/endpoints/index.ts +0 -9
- package/src/api/endpoints/klass.ts +0 -87
- package/src/api/endpoints/school.ts +0 -34
- package/src/api/endpoints/session.ts +0 -47
- package/src/api/endpoints/user.ts +0 -70
- package/src/api/index.ts +0 -5
- package/src/api/models.ts +0 -145
- package/src/api/schemas.ts +0 -243
- package/src/api/tagTypes.ts +0 -12
- package/src/api/urls.ts +0 -13
- package/src/components/App.css +0 -38
- package/src/components/App.tsx +0 -152
- package/src/components/ClickableTooltip.tsx +0 -43
- package/src/components/CopyIconButton.test.tsx +0 -16
- package/src/components/CopyIconButton.tsx +0 -27
- package/src/components/Countdown.tsx +0 -42
- package/src/components/DownloadFileButton.tsx +0 -55
- package/src/components/ElevatedAppBar.tsx +0 -41
- package/src/components/Image.tsx +0 -41
- package/src/components/InputFileButton.tsx +0 -27
- package/src/components/ItemizedList.tsx +0 -63
- package/src/components/OrderedGrid.tsx +0 -92
- package/src/components/ScrollIntoViewLink.tsx +0 -22
- package/src/components/SyncError.tsx +0 -14
- package/src/components/TablePagination.tsx +0 -142
- package/src/components/YouTubeVideo.tsx +0 -26
- package/src/components/form/ApiAutocompleteField.tsx +0 -187
- package/src/components/form/AutocompleteField.tsx +0 -135
- package/src/components/form/CheckboxField.tsx +0 -86
- package/src/components/form/CountryField.tsx +0 -75
- package/src/components/form/DatePickerField.tsx +0 -126
- package/src/components/form/EmailField.tsx +0 -38
- package/src/components/form/FirstNameField.tsx +0 -40
- package/src/components/form/Form.tsx +0 -165
- package/src/components/form/OtpField.tsx +0 -28
- package/src/components/form/PasswordField.tsx +0 -71
- package/src/components/form/RepeatField.tsx +0 -123
- package/src/components/form/SubmitButton.tsx +0 -57
- package/src/components/form/TextField.tsx +0 -150
- package/src/components/form/UkCountyField.tsx +0 -68
- package/src/components/form/index.tsx +0 -35
- package/src/components/index.ts +0 -28
- package/src/components/page/Banner.tsx +0 -95
- package/src/components/page/Notification.tsx +0 -71
- package/src/components/page/Page.tsx +0 -73
- package/src/components/page/Section.tsx +0 -21
- package/src/components/page/TabBar.tsx +0 -131
- package/src/components/page/index.ts +0 -10
- package/src/components/router/Link.tsx +0 -23
- package/src/components/router/LinkButton.tsx +0 -22
- package/src/components/router/LinkIconButton.tsx +0 -22
- package/src/components/router/LinkListItem.tsx +0 -22
- package/src/components/router/LinkTab.tsx +0 -22
- package/src/components/router/Navigate.tsx +0 -33
- package/src/components/router/index.tsx +0 -9
- package/src/components/table/CellStack.tsx +0 -19
- package/src/components/table/Table.tsx +0 -55
- package/src/components/table/index.tsx +0 -8
- package/src/features/InactiveDialog.tsx +0 -40
- package/src/features/ScreenTimeDialog.tsx +0 -30
- package/src/features/index.ts +0 -4
- package/src/fonts/ttf/Inter-VariableFont_slnt,wght.ttf +0 -0
- package/src/fonts/ttf/SpaceGrotesk-VariableFont_wght.ttf +0 -0
- package/src/hooks/api.tsx +0 -39
- package/src/hooks/auth.tsx +0 -397
- package/src/hooks/general.tsx +0 -110
- package/src/hooks/index.ts +0 -5
- package/src/hooks/router.tsx +0 -168
- package/src/images/svg/brain.svg +0 -1
- package/src/index.ts +0 -2
- package/src/middlewares/index.ts +0 -1
- package/src/middlewares/session.ts +0 -21
- package/src/scripts/freshDesk.js +0 -473
- package/src/scripts/index.ts +0 -1
- package/src/server.js +0 -187
- package/src/settings/custom.ts +0 -22
- package/src/settings/index.ts +0 -7
- package/src/settings/vite.ts +0 -26
- package/src/setupTests.ts +0 -2
- package/src/slices/createSlice.ts +0 -8
- package/src/slices/index.ts +0 -2
- package/src/slices/session.ts +0 -32
- package/src/theme/ThemedBox.tsx +0 -265
- package/src/theme/colors.ts +0 -57
- package/src/theme/components/MuiAccordion.tsx +0 -13
- package/src/theme/components/MuiAutocomplete.tsx +0 -11
- package/src/theme/components/MuiButton.ts +0 -70
- package/src/theme/components/MuiCardActions.tsx +0 -12
- package/src/theme/components/MuiCheckbox.ts +0 -12
- package/src/theme/components/MuiContainer.ts +0 -19
- package/src/theme/components/MuiDialog.tsx +0 -16
- package/src/theme/components/MuiFormControlLabel.ts +0 -18
- package/src/theme/components/MuiFormHelperText.ts +0 -12
- package/src/theme/components/MuiGrid2.ts +0 -16
- package/src/theme/components/MuiInputBase.ts +0 -14
- package/src/theme/components/MuiLink.ts +0 -41
- package/src/theme/components/MuiList.ts +0 -12
- package/src/theme/components/MuiListItemText.ts +0 -18
- package/src/theme/components/MuiMenu.ts +0 -14
- package/src/theme/components/MuiMenuItem.ts +0 -15
- package/src/theme/components/MuiSelect.ts +0 -16
- package/src/theme/components/MuiTab.ts +0 -29
- package/src/theme/components/MuiTable.ts +0 -29
- package/src/theme/components/MuiTableBody.ts +0 -15
- package/src/theme/components/MuiTableHead.ts +0 -26
- package/src/theme/components/MuiTabs.ts +0 -26
- package/src/theme/components/MuiTextField.ts +0 -86
- package/src/theme/components/MuiToolbar.ts +0 -11
- package/src/theme/components/MuiTypography.ts +0 -12
- package/src/theme/components/_components.ts +0 -95
- package/src/theme/components/index.ts +0 -57
- package/src/theme/index.ts +0 -25
- package/src/theme/palette.ts +0 -98
- package/src/theme/spacing.ts +0 -8
- package/src/theme/typography.ts +0 -101
- package/src/utils/api.test.ts +0 -19
- package/src/utils/api.tsx +0 -339
- package/src/utils/auth.ts +0 -78
- package/src/utils/form.test.ts +0 -50
- package/src/utils/form.ts +0 -193
- package/src/utils/general.test.ts +0 -55
- package/src/utils/router.test.ts +0 -156
- package/src/utils/router.ts +0 -67
- package/src/utils/schema.ts +0 -290
- package/src/utils/store.ts +0 -31
- package/src/utils/test.tsx +0 -82
- package/src/utils/theme.tsx +0 -83
- package/src/utils/window.ts +0 -11
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.app.json +0 -4
- package/tsconfig.json +0 -7
- package/tsconfig.node.json +0 -4
- package/types/fixes.d.ts +0 -18
- 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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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,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
|