codeforlife 2.8.2 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/endpoints/index.cjs.js +2 -0
- package/dist/api/endpoints/index.cjs.js.map +1 -0
- package/dist/api/endpoints/index.d.ts +81 -0
- package/dist/api/endpoints/index.es.js +78 -0
- package/dist/api/endpoints/index.es.js.map +1 -0
- package/dist/api/index.cjs.js +4 -0
- package/dist/api/index.cjs.js.map +1 -0
- package/dist/api/index.d.ts +77 -0
- package/dist/api/index.es.js +541 -0
- package/dist/api/index.es.js.map +1 -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/api.d.ts +123 -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/auth.d.ts +40 -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 +86 -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 +90 -0
- package/dist/components/index.es.js +383 -0
- package/dist/components/index.es.js.map +1 -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 +77 -0
- package/dist/components/page/index.es.js +9 -0
- package/dist/components/page/index.es.js.map +1 -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 +78 -0
- package/dist/components/router/index.es.js +11 -0
- package/dist/components/router/index.es.js.map +1 -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 +75 -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/index.cjs.js +2 -0
- package/dist/features/index.cjs.js.map +1 -0
- package/dist/features/index.d.ts +76 -0
- package/dist/features/index.es.js +47 -0
- package/dist/features/index.es.js.map +1 -0
- package/dist/form.d.ts +40 -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/general.d.ts +53 -0
- package/dist/hooks/index.cjs.js +2 -0
- package/dist/hooks/index.cjs.js.map +1 -0
- package/dist/hooks/index.d.ts +77 -0
- package/dist/hooks/index.es.js +25 -0
- package/dist/hooks/index.es.js.map +1 -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 +78 -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 +73 -0
- package/dist/middlewares/index.es.js +10 -0
- package/dist/middlewares/index.es.js.map +1 -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/router.d.ts +48 -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/schema.d.ts +89 -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/server.cjs.js +6 -0
- package/dist/server.cjs.js.map +1 -0
- package/dist/server.d.ts +129 -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/index.cjs.js +2 -0
- package/dist/settings/index.cjs.js.map +1 -0
- package/dist/settings/index.d.ts +76 -0
- package/dist/settings/index.es.js +17 -0
- package/dist/settings/index.es.js.map +1 -0
- package/dist/slices/index.cjs.js +2 -0
- package/dist/slices/index.cjs.js.map +1 -0
- package/dist/slices/index.d.ts +74 -0
- package/dist/slices/index.es.js +6 -0
- package/dist/slices/index.es.js.map +1 -0
- package/dist/store.d.ts +17 -0
- package/dist/style.css +1 -0
- package/dist/test.d.ts +75 -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 +75 -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 +79 -0
- package/dist/theme/index.es.js +222 -0
- package/dist/theme/index.es.js.map +1 -0
- package/dist/theme.d.ts +19 -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 +144 -0
- package/dist/utils/api.es.js +16 -0
- package/dist/utils/api.es.js.map +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 +100 -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 +97 -0
- package/dist/utils/form.es.js +76 -0
- package/dist/utils/form.es.js.map +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 +102 -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/router.cjs.js +2 -0
- package/dist/utils/router.cjs.js.map +1 -0
- package/dist/utils/router.d.ts +91 -0
- package/dist/utils/router.es.js +33 -0
- package/dist/utils/router.es.js.map +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 +115 -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 +82 -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 +125 -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 +83 -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 +74 -0
- package/dist/utils/window.es.js +11 -0
- package/dist/utils/window.es.js.map +1 -0
- package/dist/window.d.ts +5 -0
- package/package.json +142 -37
- package/.github/workflows/main.yml +0 -55
- package/.prettierignore +0 -1
- package/CHANGELOG.md +0 -2020
- 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 -61
- 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/form.tsx +0 -11
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../node_modules/@reduxjs/toolkit/dist/query/react/rtk-query-react.modern.mjs","../../src/api/tagTypes.ts","../../src/api/createApi.ts"],"sourcesContent":["// src/query/react/index.ts\nimport { buildCreateApi, coreModule } from \"@reduxjs/toolkit/query\";\n\n// src/query/react/module.ts\nimport { formatProdErrorMessage as _formatProdErrorMessage3 } from \"@reduxjs/toolkit\";\nimport { batch as rrBatch, useDispatch as rrUseDispatch, useSelector as rrUseSelector, useStore as rrUseStore } from \"react-redux\";\nimport { createSelector as _createSelector } from \"reselect\";\n\n// src/query/utils/capitalize.ts\nfunction capitalize(str) {\n return str.replace(str[0], str[0].toUpperCase());\n}\n\n// src/query/utils/countObjectKeys.ts\nfunction countObjectKeys(obj) {\n let count = 0;\n for (const _key in obj) {\n count++;\n }\n return count;\n}\n\n// src/query/endpointDefinitions.ts\nfunction isQueryDefinition(e) {\n return e.type === \"query\" /* query */;\n}\nfunction isMutationDefinition(e) {\n return e.type === \"mutation\" /* mutation */;\n}\nfunction isInfiniteQueryDefinition(e) {\n return e.type === \"infinitequery\" /* infinitequery */;\n}\n\n// src/query/tsHelpers.ts\nfunction safeAssign(target, ...args) {\n return Object.assign(target, ...args);\n}\n\n// src/query/react/buildHooks.ts\nimport { formatProdErrorMessage as _formatProdErrorMessage, formatProdErrorMessage as _formatProdErrorMessage2 } from \"@reduxjs/toolkit\";\nimport { QueryStatus, skipToken } from \"@reduxjs/toolkit/query\";\nimport { useCallback, useDebugValue, useEffect as useEffect3, useLayoutEffect, useMemo as useMemo2, useRef as useRef3, useState } from \"react\";\nimport { shallowEqual as shallowEqual2 } from \"react-redux\";\n\n// src/query/react/constants.ts\nvar UNINITIALIZED_VALUE = Symbol();\n\n// src/query/react/useSerializedStableValue.ts\nimport { useEffect, useRef, useMemo } from \"react\";\nimport { copyWithStructuralSharing } from \"@reduxjs/toolkit/query\";\nfunction useStableQueryArgs(queryArgs) {\n const cache = useRef(queryArgs);\n const copy = useMemo(() => copyWithStructuralSharing(cache.current, queryArgs), [queryArgs]);\n useEffect(() => {\n if (cache.current !== copy) {\n cache.current = copy;\n }\n }, [copy]);\n return copy;\n}\n\n// src/query/react/useShallowStableValue.ts\nimport { useEffect as useEffect2, useRef as useRef2 } from \"react\";\nimport { shallowEqual } from \"react-redux\";\nfunction useShallowStableValue(value) {\n const cache = useRef2(value);\n useEffect2(() => {\n if (!shallowEqual(cache.current, value)) {\n cache.current = value;\n }\n }, [value]);\n return shallowEqual(cache.current, value) ? cache.current : value;\n}\n\n// src/query/react/buildHooks.ts\nvar canUseDOM = () => !!(typeof window !== \"undefined\" && typeof window.document !== \"undefined\" && typeof window.document.createElement !== \"undefined\");\nvar isDOM = /* @__PURE__ */ canUseDOM();\nvar isRunningInReactNative = () => typeof navigator !== \"undefined\" && navigator.product === \"ReactNative\";\nvar isReactNative = /* @__PURE__ */ isRunningInReactNative();\nvar getUseIsomorphicLayoutEffect = () => isDOM || isReactNative ? useLayoutEffect : useEffect3;\nvar useIsomorphicLayoutEffect = /* @__PURE__ */ getUseIsomorphicLayoutEffect();\nvar noPendingQueryStateSelector = (selected) => {\n if (selected.isUninitialized) {\n return {\n ...selected,\n isUninitialized: false,\n isFetching: true,\n isLoading: selected.data !== void 0 ? false : true,\n status: QueryStatus.pending\n };\n }\n return selected;\n};\nfunction pick(obj, ...keys) {\n const ret = {};\n keys.forEach((key) => {\n ret[key] = obj[key];\n });\n return ret;\n}\nvar COMMON_HOOK_DEBUG_FIELDS = [\"data\", \"status\", \"isLoading\", \"isSuccess\", \"isError\", \"error\"];\nfunction buildHooks({\n api,\n moduleOptions: {\n batch,\n hooks: {\n useDispatch,\n useSelector,\n useStore\n },\n unstable__sideEffectsInRender,\n createSelector\n },\n serializeQueryArgs,\n context\n}) {\n const usePossiblyImmediateEffect = unstable__sideEffectsInRender ? (cb) => cb() : useEffect3;\n return {\n buildQueryHooks,\n buildInfiniteQueryHooks,\n buildMutationHook,\n usePrefetch\n };\n function queryStatePreSelector(currentState, lastResult, queryArgs) {\n if (lastResult?.endpointName && currentState.isUninitialized) {\n const {\n endpointName\n } = lastResult;\n const endpointDefinition = context.endpointDefinitions[endpointName];\n if (queryArgs !== skipToken && serializeQueryArgs({\n queryArgs: lastResult.originalArgs,\n endpointDefinition,\n endpointName\n }) === serializeQueryArgs({\n queryArgs,\n endpointDefinition,\n endpointName\n })) lastResult = void 0;\n }\n let data = currentState.isSuccess ? currentState.data : lastResult?.data;\n if (data === void 0) data = currentState.data;\n const hasData = data !== void 0;\n const isFetching = currentState.isLoading;\n const isLoading = (!lastResult || lastResult.isLoading || lastResult.isUninitialized) && !hasData && isFetching;\n const isSuccess = currentState.isSuccess || hasData && (isFetching && !lastResult?.isError || currentState.isUninitialized);\n return {\n ...currentState,\n data,\n currentData: currentState.data,\n isFetching,\n isLoading,\n isSuccess\n };\n }\n function infiniteQueryStatePreSelector(currentState, lastResult, queryArgs) {\n if (lastResult?.endpointName && currentState.isUninitialized) {\n const {\n endpointName\n } = lastResult;\n const endpointDefinition = context.endpointDefinitions[endpointName];\n if (queryArgs !== skipToken && serializeQueryArgs({\n queryArgs: lastResult.originalArgs,\n endpointDefinition,\n endpointName\n }) === serializeQueryArgs({\n queryArgs,\n endpointDefinition,\n endpointName\n })) lastResult = void 0;\n }\n let data = currentState.isSuccess ? currentState.data : lastResult?.data;\n if (data === void 0) data = currentState.data;\n const hasData = data !== void 0;\n const isFetching = currentState.isLoading;\n const isLoading = (!lastResult || lastResult.isLoading || lastResult.isUninitialized) && !hasData && isFetching;\n const isSuccess = currentState.isSuccess || isFetching && hasData;\n return {\n ...currentState,\n data,\n currentData: currentState.data,\n isFetching,\n isLoading,\n isSuccess\n };\n }\n function usePrefetch(endpointName, defaultOptions) {\n const dispatch = useDispatch();\n const stableDefaultOptions = useShallowStableValue(defaultOptions);\n return useCallback((arg, options) => dispatch(api.util.prefetch(endpointName, arg, {\n ...stableDefaultOptions,\n ...options\n })), [endpointName, dispatch, stableDefaultOptions]);\n }\n function useQuerySubscriptionCommonImpl(endpointName, arg, {\n refetchOnReconnect,\n refetchOnFocus,\n refetchOnMountOrArgChange,\n skip = false,\n pollingInterval = 0,\n skipPollingIfUnfocused = false,\n ...rest\n } = {}) {\n const {\n initiate\n } = api.endpoints[endpointName];\n const dispatch = useDispatch();\n const subscriptionSelectorsRef = useRef3(void 0);\n if (!subscriptionSelectorsRef.current) {\n const returnedValue = dispatch(api.internalActions.internal_getRTKQSubscriptions());\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof returnedValue !== \"object\" || typeof returnedValue?.type === \"string\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage(37) : `Warning: Middleware for RTK-Query API at reducerPath \"${api.reducerPath}\" has not been added to the store.\n You must add the middleware for RTK-Query to function correctly!`);\n }\n }\n subscriptionSelectorsRef.current = returnedValue;\n }\n const stableArg = useStableQueryArgs(skip ? skipToken : arg);\n const stableSubscriptionOptions = useShallowStableValue({\n refetchOnReconnect,\n refetchOnFocus,\n pollingInterval,\n skipPollingIfUnfocused\n });\n const initialPageParam = rest.initialPageParam;\n const stableInitialPageParam = useShallowStableValue(initialPageParam);\n const promiseRef = useRef3(void 0);\n let {\n queryCacheKey,\n requestId\n } = promiseRef.current || {};\n let currentRenderHasSubscription = false;\n if (queryCacheKey && requestId) {\n currentRenderHasSubscription = subscriptionSelectorsRef.current.isRequestSubscribed(queryCacheKey, requestId);\n }\n const subscriptionRemoved = !currentRenderHasSubscription && promiseRef.current !== void 0;\n usePossiblyImmediateEffect(() => {\n if (subscriptionRemoved) {\n promiseRef.current = void 0;\n }\n }, [subscriptionRemoved]);\n usePossiblyImmediateEffect(() => {\n const lastPromise = promiseRef.current;\n if (typeof process !== \"undefined\" && process.env.NODE_ENV === \"removeMeOnCompilation\") {\n console.log(subscriptionRemoved);\n }\n if (stableArg === skipToken) {\n lastPromise?.unsubscribe();\n promiseRef.current = void 0;\n return;\n }\n const lastSubscriptionOptions = promiseRef.current?.subscriptionOptions;\n if (!lastPromise || lastPromise.arg !== stableArg) {\n lastPromise?.unsubscribe();\n const promise = dispatch(initiate(stableArg, {\n subscriptionOptions: stableSubscriptionOptions,\n forceRefetch: refetchOnMountOrArgChange,\n ...isInfiniteQueryDefinition(context.endpointDefinitions[endpointName]) ? {\n initialPageParam: stableInitialPageParam\n } : {}\n }));\n promiseRef.current = promise;\n } else if (stableSubscriptionOptions !== lastSubscriptionOptions) {\n lastPromise.updateSubscriptionOptions(stableSubscriptionOptions);\n }\n }, [dispatch, initiate, refetchOnMountOrArgChange, stableArg, stableSubscriptionOptions, subscriptionRemoved, stableInitialPageParam, endpointName]);\n return [promiseRef, dispatch, initiate, stableSubscriptionOptions];\n }\n function buildUseQueryState(endpointName, preSelector) {\n const useQueryState = (arg, {\n skip = false,\n selectFromResult\n } = {}) => {\n const {\n select\n } = api.endpoints[endpointName];\n const stableArg = useStableQueryArgs(skip ? skipToken : arg);\n const lastValue = useRef3(void 0);\n const selectDefaultResult = useMemo2(() => (\n // Normally ts-ignores are bad and should be avoided, but we're\n // already casting this selector to be `Selector<any>` anyway,\n // so the inconsistencies don't matter here\n // @ts-ignore\n createSelector([\n // @ts-ignore\n select(stableArg),\n (_, lastResult) => lastResult,\n (_) => stableArg\n ], preSelector, {\n memoizeOptions: {\n resultEqualityCheck: shallowEqual2\n }\n })\n ), [select, stableArg]);\n const querySelector = useMemo2(() => selectFromResult ? createSelector([selectDefaultResult], selectFromResult, {\n devModeChecks: {\n identityFunctionCheck: \"never\"\n }\n }) : selectDefaultResult, [selectDefaultResult, selectFromResult]);\n const currentState = useSelector((state) => querySelector(state, lastValue.current), shallowEqual2);\n const store = useStore();\n const newLastValue = selectDefaultResult(store.getState(), lastValue.current);\n useIsomorphicLayoutEffect(() => {\n lastValue.current = newLastValue;\n }, [newLastValue]);\n return currentState;\n };\n return useQueryState;\n }\n function usePromiseRefUnsubscribeOnUnmount(promiseRef) {\n useEffect3(() => {\n return () => {\n promiseRef.current?.unsubscribe?.();\n promiseRef.current = void 0;\n };\n }, [promiseRef]);\n }\n function refetchOrErrorIfUnmounted(promiseRef) {\n if (!promiseRef.current) throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage2(38) : \"Cannot refetch a query that has not been started yet.\");\n return promiseRef.current.refetch();\n }\n function buildQueryHooks(endpointName) {\n const useQuerySubscription = (arg, options = {}) => {\n const [promiseRef] = useQuerySubscriptionCommonImpl(endpointName, arg, options);\n usePromiseRefUnsubscribeOnUnmount(promiseRef);\n return useMemo2(() => ({\n /**\n * A method to manually refetch data for the query\n */\n refetch: () => refetchOrErrorIfUnmounted(promiseRef)\n }), [promiseRef]);\n };\n const useLazyQuerySubscription = ({\n refetchOnReconnect,\n refetchOnFocus,\n pollingInterval = 0,\n skipPollingIfUnfocused = false\n } = {}) => {\n const {\n initiate\n } = api.endpoints[endpointName];\n const dispatch = useDispatch();\n const [arg, setArg] = useState(UNINITIALIZED_VALUE);\n const promiseRef = useRef3(void 0);\n const stableSubscriptionOptions = useShallowStableValue({\n refetchOnReconnect,\n refetchOnFocus,\n pollingInterval,\n skipPollingIfUnfocused\n });\n usePossiblyImmediateEffect(() => {\n const lastSubscriptionOptions = promiseRef.current?.subscriptionOptions;\n if (stableSubscriptionOptions !== lastSubscriptionOptions) {\n promiseRef.current?.updateSubscriptionOptions(stableSubscriptionOptions);\n }\n }, [stableSubscriptionOptions]);\n const subscriptionOptionsRef = useRef3(stableSubscriptionOptions);\n usePossiblyImmediateEffect(() => {\n subscriptionOptionsRef.current = stableSubscriptionOptions;\n }, [stableSubscriptionOptions]);\n const trigger = useCallback(function(arg2, preferCacheValue = false) {\n let promise;\n batch(() => {\n promiseRef.current?.unsubscribe();\n promiseRef.current = promise = dispatch(initiate(arg2, {\n subscriptionOptions: subscriptionOptionsRef.current,\n forceRefetch: !preferCacheValue\n }));\n setArg(arg2);\n });\n return promise;\n }, [dispatch, initiate]);\n const reset = useCallback(() => {\n if (promiseRef.current?.queryCacheKey) {\n dispatch(api.internalActions.removeQueryResult({\n queryCacheKey: promiseRef.current?.queryCacheKey\n }));\n }\n }, [dispatch]);\n useEffect3(() => {\n return () => {\n promiseRef?.current?.unsubscribe();\n };\n }, []);\n useEffect3(() => {\n if (arg !== UNINITIALIZED_VALUE && !promiseRef.current) {\n trigger(arg, true);\n }\n }, [arg, trigger]);\n return useMemo2(() => [trigger, arg, {\n reset\n }], [trigger, arg, reset]);\n };\n const useQueryState = buildUseQueryState(endpointName, queryStatePreSelector);\n return {\n useQueryState,\n useQuerySubscription,\n useLazyQuerySubscription,\n useLazyQuery(options) {\n const [trigger, arg, {\n reset\n }] = useLazyQuerySubscription(options);\n const queryStateResults = useQueryState(arg, {\n ...options,\n skip: arg === UNINITIALIZED_VALUE\n });\n const info = useMemo2(() => ({\n lastArg: arg\n }), [arg]);\n return useMemo2(() => [trigger, {\n ...queryStateResults,\n reset\n }, info], [trigger, queryStateResults, reset, info]);\n },\n useQuery(arg, options) {\n const querySubscriptionResults = useQuerySubscription(arg, options);\n const queryStateResults = useQueryState(arg, {\n selectFromResult: arg === skipToken || options?.skip ? void 0 : noPendingQueryStateSelector,\n ...options\n });\n const debugValue = pick(queryStateResults, ...COMMON_HOOK_DEBUG_FIELDS);\n useDebugValue(debugValue);\n return useMemo2(() => ({\n ...queryStateResults,\n ...querySubscriptionResults\n }), [queryStateResults, querySubscriptionResults]);\n }\n };\n }\n function buildInfiniteQueryHooks(endpointName) {\n const useInfiniteQuerySubscription = (arg, options = {}) => {\n const [promiseRef, dispatch, initiate, stableSubscriptionOptions] = useQuerySubscriptionCommonImpl(endpointName, arg, options);\n const subscriptionOptionsRef = useRef3(stableSubscriptionOptions);\n usePossiblyImmediateEffect(() => {\n subscriptionOptionsRef.current = stableSubscriptionOptions;\n }, [stableSubscriptionOptions]);\n const trigger = useCallback(function(arg2, direction) {\n let promise;\n batch(() => {\n promiseRef.current?.unsubscribe();\n promiseRef.current = promise = dispatch(initiate(arg2, {\n subscriptionOptions: subscriptionOptionsRef.current,\n direction\n }));\n });\n return promise;\n }, [promiseRef, dispatch, initiate]);\n usePromiseRefUnsubscribeOnUnmount(promiseRef);\n const stableArg = useStableQueryArgs(options.skip ? skipToken : arg);\n const refetch = useCallback(() => refetchOrErrorIfUnmounted(promiseRef), [promiseRef]);\n return useMemo2(() => {\n const fetchNextPage = () => {\n return trigger(stableArg, \"forward\");\n };\n const fetchPreviousPage = () => {\n return trigger(stableArg, \"backward\");\n };\n return {\n trigger,\n /**\n * A method to manually refetch data for the query\n */\n refetch,\n fetchNextPage,\n fetchPreviousPage\n };\n }, [refetch, trigger, stableArg]);\n };\n const useInfiniteQueryState = buildUseQueryState(endpointName, infiniteQueryStatePreSelector);\n return {\n useInfiniteQueryState,\n useInfiniteQuerySubscription,\n useInfiniteQuery(arg, options) {\n const {\n refetch,\n fetchNextPage,\n fetchPreviousPage\n } = useInfiniteQuerySubscription(arg, options);\n const queryStateResults = useInfiniteQueryState(arg, {\n selectFromResult: arg === skipToken || options?.skip ? void 0 : noPendingQueryStateSelector,\n ...options\n });\n const debugValue = pick(queryStateResults, ...COMMON_HOOK_DEBUG_FIELDS, \"hasNextPage\", \"hasPreviousPage\");\n useDebugValue(debugValue);\n return useMemo2(() => ({\n ...queryStateResults,\n fetchNextPage,\n fetchPreviousPage,\n refetch\n }), [queryStateResults, fetchNextPage, fetchPreviousPage, refetch]);\n }\n };\n }\n function buildMutationHook(name) {\n return ({\n selectFromResult,\n fixedCacheKey\n } = {}) => {\n const {\n select,\n initiate\n } = api.endpoints[name];\n const dispatch = useDispatch();\n const [promise, setPromise] = useState();\n useEffect3(() => () => {\n if (!promise?.arg.fixedCacheKey) {\n promise?.reset();\n }\n }, [promise]);\n const triggerMutation = useCallback(function(arg) {\n const promise2 = dispatch(initiate(arg, {\n fixedCacheKey\n }));\n setPromise(promise2);\n return promise2;\n }, [dispatch, initiate, fixedCacheKey]);\n const {\n requestId\n } = promise || {};\n const selectDefaultResult = useMemo2(() => select({\n fixedCacheKey,\n requestId: promise?.requestId\n }), [fixedCacheKey, promise, select]);\n const mutationSelector = useMemo2(() => selectFromResult ? createSelector([selectDefaultResult], selectFromResult) : selectDefaultResult, [selectFromResult, selectDefaultResult]);\n const currentState = useSelector(mutationSelector, shallowEqual2);\n const originalArgs = fixedCacheKey == null ? promise?.arg.originalArgs : void 0;\n const reset = useCallback(() => {\n batch(() => {\n if (promise) {\n setPromise(void 0);\n }\n if (fixedCacheKey) {\n dispatch(api.internalActions.removeMutationResult({\n requestId,\n fixedCacheKey\n }));\n }\n });\n }, [dispatch, fixedCacheKey, promise, requestId]);\n const debugValue = pick(currentState, ...COMMON_HOOK_DEBUG_FIELDS, \"endpointName\");\n useDebugValue(debugValue);\n const finalState = useMemo2(() => ({\n ...currentState,\n originalArgs,\n reset\n }), [currentState, originalArgs, reset]);\n return useMemo2(() => [triggerMutation, finalState], [triggerMutation, finalState]);\n };\n }\n}\n\n// src/query/react/module.ts\nvar reactHooksModuleName = /* @__PURE__ */ Symbol();\nvar reactHooksModule = ({\n batch = rrBatch,\n hooks = {\n useDispatch: rrUseDispatch,\n useSelector: rrUseSelector,\n useStore: rrUseStore\n },\n createSelector = _createSelector,\n unstable__sideEffectsInRender = false,\n ...rest\n} = {}) => {\n if (process.env.NODE_ENV !== \"production\") {\n const hookNames = [\"useDispatch\", \"useSelector\", \"useStore\"];\n let warned = false;\n for (const hookName of hookNames) {\n if (countObjectKeys(rest) > 0) {\n if (rest[hookName]) {\n if (!warned) {\n console.warn(\"As of RTK 2.0, the hooks now need to be specified as one object, provided under a `hooks` key:\\n`reactHooksModule({ hooks: { useDispatch, useSelector, useStore } })`\");\n warned = true;\n }\n }\n hooks[hookName] = rest[hookName];\n }\n if (typeof hooks[hookName] !== \"function\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage3(36) : `When using custom hooks for context, all ${hookNames.length} hooks need to be provided: ${hookNames.join(\", \")}.\nHook ${hookName} was either not provided or not a function.`);\n }\n }\n }\n return {\n name: reactHooksModuleName,\n init(api, {\n serializeQueryArgs\n }, context) {\n const anyApi = api;\n const {\n buildQueryHooks,\n buildInfiniteQueryHooks,\n buildMutationHook,\n usePrefetch\n } = buildHooks({\n api,\n moduleOptions: {\n batch,\n hooks,\n unstable__sideEffectsInRender,\n createSelector\n },\n serializeQueryArgs,\n context\n });\n safeAssign(anyApi, {\n usePrefetch\n });\n safeAssign(context, {\n batch\n });\n return {\n injectEndpoint(endpointName, definition) {\n if (isQueryDefinition(definition)) {\n const {\n useQuery,\n useLazyQuery,\n useLazyQuerySubscription,\n useQueryState,\n useQuerySubscription\n } = buildQueryHooks(endpointName);\n safeAssign(anyApi.endpoints[endpointName], {\n useQuery,\n useLazyQuery,\n useLazyQuerySubscription,\n useQueryState,\n useQuerySubscription\n });\n api[`use${capitalize(endpointName)}Query`] = useQuery;\n api[`useLazy${capitalize(endpointName)}Query`] = useLazyQuery;\n }\n if (isMutationDefinition(definition)) {\n const useMutation = buildMutationHook(endpointName);\n safeAssign(anyApi.endpoints[endpointName], {\n useMutation\n });\n api[`use${capitalize(endpointName)}Mutation`] = useMutation;\n } else if (isInfiniteQueryDefinition(definition)) {\n const {\n useInfiniteQuery,\n useInfiniteQuerySubscription,\n useInfiniteQueryState\n } = buildInfiniteQueryHooks(endpointName);\n safeAssign(anyApi.endpoints[endpointName], {\n useInfiniteQuery,\n useInfiniteQuerySubscription,\n useInfiniteQueryState\n });\n api[`use${capitalize(endpointName)}InfiniteQuery`] = useInfiniteQuery;\n }\n }\n };\n }\n };\n};\n\n// src/query/react/index.ts\nexport * from \"@reduxjs/toolkit/query\";\n\n// src/query/react/ApiProvider.tsx\nimport { configureStore, formatProdErrorMessage as _formatProdErrorMessage4 } from \"@reduxjs/toolkit\";\nimport { useContext } from \"react\";\nimport { useEffect as useEffect4 } from \"react\";\nimport * as React from \"react\";\nimport { Provider, ReactReduxContext } from \"react-redux\";\nimport { setupListeners } from \"@reduxjs/toolkit/query\";\nfunction ApiProvider(props) {\n const context = props.context || ReactReduxContext;\n const existingContext = useContext(context);\n if (existingContext) {\n throw new Error(process.env.NODE_ENV === \"production\" ? _formatProdErrorMessage4(35) : \"Existing Redux context detected. If you already have a store set up, please use the traditional Redux setup.\");\n }\n const [store] = React.useState(() => configureStore({\n reducer: {\n [props.api.reducerPath]: props.api.reducer\n },\n middleware: (gDM) => gDM().concat(props.api.middleware)\n }));\n useEffect4(() => props.setupListeners === false ? void 0 : setupListeners(store.dispatch, props.setupListeners), [props.setupListeners, store.dispatch]);\n return /* @__PURE__ */ React.createElement(Provider, { store, context }, props.children);\n}\n\n// src/query/react/index.ts\nvar createApi = /* @__PURE__ */ buildCreateApi(coreModule(), reactHooksModule());\nexport {\n ApiProvider,\n UNINITIALIZED_VALUE,\n createApi,\n reactHooksModule,\n reactHooksModuleName\n};\n//# sourceMappingURL=rtk-query-react.modern.mjs.map","const tagTypes = [\n // These are the tags for the common models used throughout our system.\n // https://github.com/ocadotechnology/codeforlife-package-python/tree/main/codeforlife/user/models\n // NOTE: Don't use the \"Teacher\" and \"Student\" tags. Use \"User\" instead.\n \"User\",\n \"School\",\n \"Class\",\n \"AuthFactor\",\n] as const\n\nexport default tagTypes\nexport type TagTypes = (typeof tagTypes)[number]\n","import {\n type Api,\n type BaseQueryApi,\n type FetchArgs,\n type FetchBaseQueryError,\n type FetchBaseQueryMeta,\n type MutationDefinition,\n type QueryReturnValue,\n createApi as _createApi,\n type coreModuleName,\n fetchBaseQuery,\n type reactHooksModuleName,\n} from \"@reduxjs/toolkit/query/react\"\n\nimport defaultTagTypes, { type TagTypes as DefaultTagTypes } from \"./tagTypes\"\nimport { SERVICE_API_URL } from \"../settings\"\nimport { buildLogoutEndpoint } from \"./endpoints/session\"\nimport { getCsrfCookie } from \"../utils/auth\"\nimport { isSafeHttpMethod } from \"../utils/api\"\n\n// TODO: decide if we want to keep any of this.\n// export function handleResponseError(error: FetchBaseQueryError): void {\n// if (\n// error.status === 400 &&\n// typeof error.data === \"object\" &&\n// error.data !== null\n// ) {\n// // Parse the error's data from snake_case to camelCase.\n// snakeCaseToCamelCase(error.data)\n// } else if (error.status === 401) {\n// // TODO: redirect to appropriate login page based on user type.\n// window.location.href = `${PORTAL_BASE_URL}/login/teacher`\n// } else {\n// // Catch-all error pages by status-code.\n// window.location.href = `${PORTAL_BASE_URL}/error/${\n// [403, 404].includes(error.status as number) ? error.status : 500\n// }`\n// }\n// }\n\nexport default function createApi<TagTypes extends string = never>({\n tagTypes = [],\n}: {\n tagTypes?: readonly TagTypes[]\n} = {}): Api<\n (\n args: string | FetchArgs,\n api: BaseQueryApi,\n extraOptions: {},\n ) => Promise<\n QueryReturnValue<unknown, FetchBaseQueryError, FetchBaseQueryMeta>\n >,\n { logout: MutationDefinition<null, any, any, null, any, any> },\n \"api\",\n TagTypes | DefaultTagTypes,\n typeof coreModuleName | typeof reactHooksModuleName\n> {\n const fetch = fetchBaseQuery({\n baseUrl: `${SERVICE_API_URL}/`,\n credentials: \"include\",\n prepareHeaders: (headers, endpoint) => {\n const { type, arg } = endpoint as typeof endpoint & {\n arg: string | FetchArgs\n }\n const method = typeof arg === \"string\" ? \"GET\" : arg.method || \"GET\"\n\n if (type === \"mutation\" || !isSafeHttpMethod(method)) {\n const csrfToken = getCsrfCookie()\n if (csrfToken) headers.set(\"x-csrftoken\", csrfToken)\n }\n\n return headers\n },\n })\n\n const api = _createApi({\n // https://redux-toolkit.js.org/rtk-query/usage/customizing-queries#implementing-a-custom-basequery\n baseQuery: async (args: string | FetchArgs, api, extraOptions) => {\n if (api.type === \"mutation\" && getCsrfCookie() === undefined) {\n // Get the CSRF token.\n const { error } = await fetch(\n { url: \"/csrf/cookie/\", method: \"GET\" },\n api,\n {},\n )\n\n // Validate we got the CSRF token.\n if (error !== undefined) {\n console.error(error)\n // TODO\n // window.location.href = `${PORTAL_BASE_URL}/error/500`\n }\n if (getCsrfCookie() === undefined) {\n // TODO\n // window.location.href = `${PORTAL_BASE_URL}/error/500`\n }\n }\n\n // Send the HTTP request and fetch the response.\n return await fetch(args, api, extraOptions)\n },\n tagTypes: [...defaultTagTypes, ...tagTypes],\n endpoints: () => ({}),\n })\n\n return api.injectEndpoints({\n endpoints: build => ({\n logout: buildLogoutEndpoint<null, null>(api, build),\n }),\n })\n}\n"],"names":["capitalize","str","countObjectKeys","obj","count","_key","isQueryDefinition","isMutationDefinition","isInfiniteQueryDefinition","safeAssign","target","args","UNINITIALIZED_VALUE","useStableQueryArgs","queryArgs","cache","useRef","copy","useMemo","copyWithStructuralSharing","useEffect","useShallowStableValue","value","useRef2","useEffect2","shallowEqual","canUseDOM","isDOM","isRunningInReactNative","isReactNative","getUseIsomorphicLayoutEffect","useLayoutEffect","useEffect3","useIsomorphicLayoutEffect","noPendingQueryStateSelector","selected","QueryStatus","pick","keys","ret","key","COMMON_HOOK_DEBUG_FIELDS","buildHooks","api","batch","useDispatch","useSelector","useStore","unstable__sideEffectsInRender","createSelector","serializeQueryArgs","context","usePossiblyImmediateEffect","cb","buildQueryHooks","buildInfiniteQueryHooks","buildMutationHook","usePrefetch","queryStatePreSelector","currentState","lastResult","endpointName","endpointDefinition","skipToken","data","hasData","isFetching","isLoading","isSuccess","infiniteQueryStatePreSelector","defaultOptions","dispatch","stableDefaultOptions","useCallback","arg","options","useQuerySubscriptionCommonImpl","refetchOnReconnect","refetchOnFocus","refetchOnMountOrArgChange","skip","pollingInterval","skipPollingIfUnfocused","rest","initiate","subscriptionSelectorsRef","useRef3","returnedValue","_formatProdErrorMessage","stableArg","stableSubscriptionOptions","initialPageParam","stableInitialPageParam","promiseRef","queryCacheKey","requestId","currentRenderHasSubscription","subscriptionRemoved","lastPromise","lastSubscriptionOptions","promise","buildUseQueryState","preSelector","selectFromResult","select","lastValue","selectDefaultResult","useMemo2","_","shallowEqual2","querySelector","state","store","newLastValue","usePromiseRefUnsubscribeOnUnmount","refetchOrErrorIfUnmounted","_formatProdErrorMessage2","useQuerySubscription","useLazyQuerySubscription","setArg","useState","subscriptionOptionsRef","trigger","arg2","preferCacheValue","reset","useQueryState","queryStateResults","info","querySubscriptionResults","debugValue","useDebugValue","useInfiniteQuerySubscription","direction","refetch","useInfiniteQueryState","fetchNextPage","fetchPreviousPage","name","fixedCacheKey","setPromise","triggerMutation","promise2","mutationSelector","originalArgs","finalState","reactHooksModuleName","reactHooksModule","rrBatch","hooks","rrUseDispatch","rrUseSelector","rrUseStore","_createSelector","hookNames","warned","hookName","_formatProdErrorMessage3","anyApi","definition","useQuery","useLazyQuery","useMutation","useInfiniteQuery","createApi","buildCreateApi","coreModule","tagTypes","fetch","fetchBaseQuery","SERVICE_API_URL","headers","endpoint","type","method","isSafeHttpMethod","csrfToken","getCsrfCookie","_createApi","extraOptions","error","defaultTagTypes","build","buildLogoutEndpoint"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { j as u } from "./jsx-runtime-Dpn_P65e.js";
|
|
2
|
+
import { Stack as h, Typography as m, CircularProgress as p } from "@mui/material";
|
|
3
|
+
import "react";
|
|
4
|
+
import { getNestedProperty as g } from "./utils/general.es.js";
|
|
5
|
+
import "yup";
|
|
6
|
+
import { SyncProblem as y } from "@mui/icons-material";
|
|
7
|
+
const S = () => /* @__PURE__ */ u.jsxs(h, { alignItems: "center", alignContent: "center", children: [
|
|
8
|
+
/* @__PURE__ */ u.jsx(y, { color: "error" }),
|
|
9
|
+
/* @__PURE__ */ u.jsx(m, { color: "error.main", children: "Failed to sync data" })
|
|
10
|
+
] });
|
|
11
|
+
function T(r, e) {
|
|
12
|
+
if (e.url && Object.entries(e.url).forEach(([i, s]) => {
|
|
13
|
+
r = r.replace(`<${i}>`, String(s));
|
|
14
|
+
}), e.search) {
|
|
15
|
+
const i = [];
|
|
16
|
+
for (const s in e.search) {
|
|
17
|
+
const a = e.search[s];
|
|
18
|
+
if (a !== void 0)
|
|
19
|
+
if (Array.isArray(a))
|
|
20
|
+
for (const o of a) i.push([s, String(o)]);
|
|
21
|
+
else
|
|
22
|
+
i.push([s, String(a)]);
|
|
23
|
+
}
|
|
24
|
+
i.length !== 0 && (r += `?${new URLSearchParams(i).toString()}`);
|
|
25
|
+
}
|
|
26
|
+
return r;
|
|
27
|
+
}
|
|
28
|
+
function d(r) {
|
|
29
|
+
return typeof r == "number" || typeof r == "string";
|
|
30
|
+
}
|
|
31
|
+
function j(r) {
|
|
32
|
+
return { type: r, id: "LIST" };
|
|
33
|
+
}
|
|
34
|
+
function L(r, e) {
|
|
35
|
+
const {
|
|
36
|
+
includeListTag: i = !1,
|
|
37
|
+
argKeysAreIds: s = !1,
|
|
38
|
+
id: a = "id"
|
|
39
|
+
} = e || {};
|
|
40
|
+
function o(t, f = i) {
|
|
41
|
+
const n = t.map((l) => ({ type: r, id: String(l) }));
|
|
42
|
+
return f && n.push(j(r)), n;
|
|
43
|
+
}
|
|
44
|
+
function c(t) {
|
|
45
|
+
return g(t, a);
|
|
46
|
+
}
|
|
47
|
+
return (t, f, n) => {
|
|
48
|
+
if (!f) {
|
|
49
|
+
if (n) {
|
|
50
|
+
if (d(n)) return o([n]);
|
|
51
|
+
if (Array.isArray(n)) {
|
|
52
|
+
if (n.length && d(n[0]))
|
|
53
|
+
return o(n);
|
|
54
|
+
} else if (typeof n == "object" && s)
|
|
55
|
+
return o(Object.keys(n));
|
|
56
|
+
}
|
|
57
|
+
if (t)
|
|
58
|
+
return Array.isArray(t) ? o(t.map(c)) : c(t) !== void 0 ? o([c(t)]) : o(t.data.map(c), !0);
|
|
59
|
+
}
|
|
60
|
+
return o([]);
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function C(r, e) {
|
|
64
|
+
if (r === e) throw Error("List and detail are the same.");
|
|
65
|
+
return { list: r, detail: e };
|
|
66
|
+
}
|
|
67
|
+
function N(r, e, i) {
|
|
68
|
+
const { data: s, isLoading: a, isSuccess: o } = r, c = r.error, {
|
|
69
|
+
loading: t = /* @__PURE__ */ u.jsx(p, {}),
|
|
70
|
+
error: f = /* @__PURE__ */ u.jsx(S, {})
|
|
71
|
+
} = i || {};
|
|
72
|
+
if (c)
|
|
73
|
+
return console.error(c), f;
|
|
74
|
+
if (a) return t;
|
|
75
|
+
if (s) return e(s);
|
|
76
|
+
if (o) throw Error("Expected to get data from API but got nothing.");
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
function O(r) {
|
|
80
|
+
return ["GET", "HEAD", "OPTIONS", "TRACE"].includes(r.toUpperCase());
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
S,
|
|
84
|
+
d as a,
|
|
85
|
+
T as b,
|
|
86
|
+
N as h,
|
|
87
|
+
O as i,
|
|
88
|
+
j as l,
|
|
89
|
+
C as m,
|
|
90
|
+
L as t
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=api-Cbyt3rw0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-Cbyt3rw0.js","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC<SyncErrorProps> = () => (\n <Stack alignItems=\"center\" alignContent=\"center\">\n <SyncProblemIcon color=\"error\" />\n <Typography color=\"error.main\">Failed to sync data</Typography>\n </Stack>\n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record<string, unknown>\n\nexport interface Tag<Type extends string> {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model<Id extends ModelId, MFields extends Fields = Fields> = {\n id: Id\n} & Omit<MFields, \"id\">\n\nexport type Schemas<M extends Model<any>> = {\n [K in keyof M]-?: SchemaMap<M[K]>\n}\n\nexport type Result<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Pick<M, \"id\" | MFields>\n\nexport type Arg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Required<M, RequiredFields> & Optional<M, OptionalFields>\n\n// -----------------------------------------------------------------------------\n// CRUD Types\n// https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions\n// -----------------------------------------------------------------------------\n\n// Create\n\nexport type CreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type CreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Arg<M, RequiredFields, OptionalFields>\n\nexport type BulkCreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkCreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Read\n\nexport type RetrieveResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type RetrieveArg<M extends Model<any>> = M[\"id\"]\n\nexport interface ListResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> {\n count: number\n offset: number\n limit: number\n max_limit: number\n data: Array<Result<M, MFields> & ExtraFields>\n}\n\nexport type ListArg<Filters extends Fields = Fields> = {\n limit: number\n offset: number\n} & Partial<Omit<Filters, \"limit\" | \"offset\">>\n\n// Update\n\nexport type UpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\ntype UpdateWithBody<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields>,\n> = Pick<M, \"id\"> & Arg<M, RequiredFields, OptionalFields>\n\n// NOTE: Sometimes update does not require a body. For example, if calling the\n// \"refresh\" action on an invitation object updates the expiry date to be 24\n// hours from now. In this case, you only need to pass the ID of the object.\nexport type UpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\"> = never,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = [RequiredFields] extends [never]\n ? [OptionalFields] extends [never]\n ? M[\"id\"]\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n\nexport type BulkUpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkUpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Record<M[\"id\"], Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Delete\n\nexport type DestroyResult = null\n\nexport type DestroyArg<M extends Model<any>> = M[\"id\"]\n\nexport type BulkDestroyResult = null\n\nexport type BulkDestroyArg<M extends Model<any>> = Array<M[\"id\"]>\n\n// -----------------------------------------------------------------------------\n// Functions\n// -----------------------------------------------------------------------------\n\nexport function buildUrl(\n url: string,\n params: {\n search?: Fields\n url?: Fields\n },\n): string {\n if (params.url) {\n Object.entries(params.url).forEach(([key, value]) => {\n url = url.replace(`<${key}>`, String(value))\n })\n }\n\n if (params.search) {\n const searchParams: string[][] = []\n for (const key in params.search) {\n const values = params.search[key]\n if (values === undefined) continue\n\n if (Array.isArray(values)) {\n for (const value of values) searchParams.push([key, String(value)])\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n searchParams.push([key, String(values)])\n }\n }\n\n if (searchParams.length !== 0) {\n url += `?${new URLSearchParams(searchParams).toString()}`\n }\n }\n\n return url\n}\n\nexport function isModelId(value: unknown): boolean {\n return typeof value === \"number\" || typeof value === \"string\"\n}\n\nexport function listTag<Type extends string>(type: Type): Tag<Type> {\n return { type, id: \"LIST\" }\n}\n\nexport type TagDataOptions = Partial<{\n includeListTag: boolean\n argKeysAreIds: boolean\n id: string\n}>\n\nexport function tagData<Type extends string, M extends Model<any>>(\n type: Type,\n options?: TagDataOptions,\n): (\n result:\n | Result<M, any>\n | Array<Result<M, any>>\n | ListResult<M, any>\n | null\n | undefined,\n error: FetchBaseQueryError | undefined,\n arg:\n | Arg<M, any>\n | Array<Arg<M, any>>\n | Record<M[\"id\"], Arg<M, any>>\n | ListArg<any>\n | Array<M[\"id\"]>\n | string\n | number\n | undefined,\n) => Array<Tag<Type>> {\n const {\n includeListTag = false,\n argKeysAreIds = false,\n id = \"id\",\n } = options || {}\n\n function tags(\n ids: ModelId[],\n list: boolean = includeListTag,\n ): Array<Tag<Type>> {\n const tags = ids.map(id => ({ type, id: String(id) }))\n if (list) tags.push(listTag(type))\n return tags\n }\n\n function getModelId(result: Result<M, any>) {\n return getNestedProperty(result, id) as ModelId\n }\n\n return (result, error, arg) => {\n if (!error) {\n if (arg) {\n // The argument is an ID.\n if (isModelId(arg)) return tags([arg as ModelId])\n\n // The argument is an array of IDs.\n if (Array.isArray(arg)) {\n if (arg.length && isModelId(arg[0])) {\n return tags(arg as Array<M[\"id\"]>)\n }\n }\n // The argument is an object that contains the id field.\n else if (typeof arg === \"object\" && argKeysAreIds) {\n return tags(Object.keys(arg as Record<M[\"id\"], any>))\n }\n }\n\n if (result) {\n // The result is an array of models that contain the id field.\n if (Array.isArray(result)) {\n return tags(result.map(getModelId))\n }\n\n // The result is a model that contains the id field.\n if (getModelId(result as Result<M, any>) !== undefined) {\n return tags([getModelId(result as Result<M, any>)])\n }\n\n // The result is a list that contains an array of models that contain\n // the id field.\n return tags((result as ListResult<M, any>).data.map(getModelId), true)\n }\n }\n\n return tags([])\n }\n}\n\nexport function modelUrls(list: string, detail: string) {\n if (list === detail) throw Error(\"List and detail are the same.\")\n\n return { list, detail }\n}\n\nexport type HandleQueryStateOptions = Partial<{\n loading: ReactNode\n error: ReactNode\n}>\n\nexport function handleResultState<QueryArg, ResultType>(\n result:\n | TypedUseQueryHookResult<ResultType, QueryArg, any>\n | TypedUseQueryStateResult<ResultType, QueryArg, any>\n | TypedUseMutationResult<ResultType, QueryArg, any>,\n children: (data: NonNullable<ResultType>) => ReactNode,\n options?: HandleQueryStateOptions,\n): ReactNode {\n const { data, isLoading, isSuccess } = result\n const error = result.error as string | undefined\n\n const {\n loading: loadingNode = <CircularProgress />,\n error: errorNode = <SyncError />,\n } = options || {}\n\n // An error occurred.\n if (error) {\n console.error(error)\n return errorNode\n }\n\n // Busy calling the API.\n if (isLoading) return loadingNode\n\n // Called the API and got data.\n if (data) return children(data)\n\n // Called the API and did not get data.\n if (isSuccess) throw Error(\"Expected to get data from API but got nothing.\")\n\n // Have yet to call the API.\n return loadingNode\n}\n\nexport function isSafeHttpMethod(method: string) {\n // https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"].includes(method.toUpperCase())\n}\n"],"names":["SyncError","jsxs","Stack","jsx","SyncProblemIcon","Typography","buildUrl","url","params","key","value","searchParams","values","isModelId","listTag","type","tagData","options","includeListTag","argKeysAreIds","id","tags","ids","list","getModelId","result","getNestedProperty","error","arg","modelUrls","detail","handleResultState","children","data","isLoading","isSuccess","loadingNode","CircularProgress","errorNode","isSafeHttpMethod","method"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const f=require("./jsx-runtime-CeSfJrVB.cjs"),d=require("@mui/material");require("react");const y=require("./utils/general.cjs.js");require("yup");const x=require("@mui/icons-material"),h=()=>f.jsxRuntimeExports.jsxs(d.Stack,{alignItems:"center",alignContent:"center",children:[f.jsxRuntimeExports.jsx(x.SyncProblem,{color:"error"}),f.jsxRuntimeExports.jsx(d.Typography,{color:"error.main",children:"Failed to sync data"})]});function S(r,t){if(t.url&&Object.entries(t.url).forEach(([o,s])=>{r=r.replace(`<${o}>`,String(s))}),t.search){const o=[];for(const s in t.search){const c=t.search[s];if(c!==void 0)if(Array.isArray(c))for(const i of c)o.push([s,String(i)]);else o.push([s,String(c)])}o.length!==0&&(r+=`?${new URLSearchParams(o).toString()}`)}return r}function l(r){return typeof r=="number"||typeof r=="string"}function g(r){return{type:r,id:"LIST"}}function m(r,t){const{includeListTag:o=!1,argKeysAreIds:s=!1,id:c="id"}=t||{};function i(e,u=o){const n=e.map(p=>({type:r,id:String(p)}));return u&&n.push(g(r)),n}function a(e){return y.getNestedProperty(e,c)}return(e,u,n)=>{if(!u){if(n){if(l(n))return i([n]);if(Array.isArray(n)){if(n.length&&l(n[0]))return i(n)}else if(typeof n=="object"&&s)return i(Object.keys(n))}if(e)return Array.isArray(e)?i(e.map(a)):a(e)!==void 0?i([a(e)]):i(e.data.map(a),!0)}return i([])}}function j(r,t){if(r===t)throw Error("List and detail are the same.");return{list:r,detail:t}}function E(r,t,o){const{data:s,isLoading:c,isSuccess:i}=r,a=r.error,{loading:e=f.jsxRuntimeExports.jsx(d.CircularProgress,{}),error:u=f.jsxRuntimeExports.jsx(h,{})}=o||{};if(a)return console.error(a),u;if(c)return e;if(s)return t(s);if(i)throw Error("Expected to get data from API but got nothing.");return e}function A(r){return["GET","HEAD","OPTIONS","TRACE"].includes(r.toUpperCase())}exports.SyncError=h;exports.buildUrl=S;exports.handleResultState=E;exports.isModelId=l;exports.isSafeHttpMethod=A;exports.listTag=g;exports.modelUrls=j;exports.tagData=m;
|
|
2
|
+
//# sourceMappingURL=api-CnMfjRk3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-CnMfjRk3.cjs","sources":["../src/components/SyncError.tsx","../src/utils/api.tsx"],"sourcesContent":["import { Stack, Typography } from \"@mui/material\"\nimport { type FC } from \"react\"\nimport { SyncProblem as SyncProblemIcon } from \"@mui/icons-material\"\n\nexport interface SyncErrorProps {}\n\nconst SyncError: FC<SyncErrorProps> = () => (\n <Stack alignItems=\"center\" alignContent=\"center\">\n <SyncProblemIcon color=\"error\" />\n <Typography color=\"error.main\">Failed to sync data</Typography>\n </Stack>\n)\n\nexport default SyncError\n","import type {\n FetchBaseQueryError,\n TypedUseMutationResult,\n TypedUseQueryHookResult,\n TypedUseQueryStateResult,\n} from \"@reduxjs/toolkit/query/react\"\nimport { CircularProgress } from \"@mui/material\"\nimport { type ReactNode } from \"react\"\n\nimport { type Optional, type Required, getNestedProperty } from \"./general\"\nimport { type SchemaMap } from \"./schema\"\nimport SyncError from \"../components/SyncError\"\n\n// -----------------------------------------------------------------------------\n// Model Types\n// -----------------------------------------------------------------------------\n\n// The fields of a model.\nexport type Fields = Record<string, unknown>\n\nexport interface Tag<Type extends string> {\n type: Type\n id: string\n}\n\nexport type ModelId = string | number\n\n/**\n * A data model.\n * Id: The type of Id.\n * Data: The data fields.\n */\nexport type Model<Id extends ModelId, MFields extends Fields = Fields> = {\n id: Id\n} & Omit<MFields, \"id\">\n\nexport type Schemas<M extends Model<any>> = {\n [K in keyof M]-?: SchemaMap<M[K]>\n}\n\nexport type Result<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Pick<M, \"id\" | MFields>\n\nexport type Arg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Required<M, RequiredFields> & Optional<M, OptionalFields>\n\n// -----------------------------------------------------------------------------\n// CRUD Types\n// https://www.django-rest-framework.org/api-guide/viewsets/#viewset-actions\n// -----------------------------------------------------------------------------\n\n// Create\n\nexport type CreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type CreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = Arg<M, RequiredFields, OptionalFields>\n\nexport type BulkCreateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkCreateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Read\n\nexport type RetrieveResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\nexport type RetrieveArg<M extends Model<any>> = M[\"id\"]\n\nexport interface ListResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> {\n count: number\n offset: number\n limit: number\n max_limit: number\n data: Array<Result<M, MFields> & ExtraFields>\n}\n\nexport type ListArg<Filters extends Fields = Fields> = {\n limit: number\n offset: number\n} & Partial<Omit<Filters, \"limit\" | \"offset\">>\n\n// Update\n\nexport type UpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n> = Result<M, MFields>\n\ntype UpdateWithBody<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields>,\n> = Pick<M, \"id\"> & Arg<M, RequiredFields, OptionalFields>\n\n// NOTE: Sometimes update does not require a body. For example, if calling the\n// \"refresh\" action on an invitation object updates the expiry date to be 24\n// hours from now. In this case, you only need to pass the ID of the object.\nexport type UpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\"> = never,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n> = [RequiredFields] extends [never]\n ? [OptionalFields] extends [never]\n ? M[\"id\"]\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n : UpdateWithBody<M, RequiredFields, OptionalFields>\n\nexport type BulkUpdateResult<\n M extends Model<any>,\n MFields extends keyof Omit<M, \"id\"> = never,\n ExtraFields extends Fields = Fields,\n> = Array<Result<M, MFields> & ExtraFields>\n\nexport type BulkUpdateArg<\n M extends Model<any>,\n RequiredFields extends keyof Omit<M, \"id\">,\n OptionalFields extends keyof Omit<M, \"id\" | RequiredFields> = never,\n ExtraFields extends Fields = Fields,\n> = Record<M[\"id\"], Arg<M, RequiredFields, OptionalFields> & ExtraFields>\n\n// Delete\n\nexport type DestroyResult = null\n\nexport type DestroyArg<M extends Model<any>> = M[\"id\"]\n\nexport type BulkDestroyResult = null\n\nexport type BulkDestroyArg<M extends Model<any>> = Array<M[\"id\"]>\n\n// -----------------------------------------------------------------------------\n// Functions\n// -----------------------------------------------------------------------------\n\nexport function buildUrl(\n url: string,\n params: {\n search?: Fields\n url?: Fields\n },\n): string {\n if (params.url) {\n Object.entries(params.url).forEach(([key, value]) => {\n url = url.replace(`<${key}>`, String(value))\n })\n }\n\n if (params.search) {\n const searchParams: string[][] = []\n for (const key in params.search) {\n const values = params.search[key]\n if (values === undefined) continue\n\n if (Array.isArray(values)) {\n for (const value of values) searchParams.push([key, String(value)])\n } else {\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n searchParams.push([key, String(values)])\n }\n }\n\n if (searchParams.length !== 0) {\n url += `?${new URLSearchParams(searchParams).toString()}`\n }\n }\n\n return url\n}\n\nexport function isModelId(value: unknown): boolean {\n return typeof value === \"number\" || typeof value === \"string\"\n}\n\nexport function listTag<Type extends string>(type: Type): Tag<Type> {\n return { type, id: \"LIST\" }\n}\n\nexport type TagDataOptions = Partial<{\n includeListTag: boolean\n argKeysAreIds: boolean\n id: string\n}>\n\nexport function tagData<Type extends string, M extends Model<any>>(\n type: Type,\n options?: TagDataOptions,\n): (\n result:\n | Result<M, any>\n | Array<Result<M, any>>\n | ListResult<M, any>\n | null\n | undefined,\n error: FetchBaseQueryError | undefined,\n arg:\n | Arg<M, any>\n | Array<Arg<M, any>>\n | Record<M[\"id\"], Arg<M, any>>\n | ListArg<any>\n | Array<M[\"id\"]>\n | string\n | number\n | undefined,\n) => Array<Tag<Type>> {\n const {\n includeListTag = false,\n argKeysAreIds = false,\n id = \"id\",\n } = options || {}\n\n function tags(\n ids: ModelId[],\n list: boolean = includeListTag,\n ): Array<Tag<Type>> {\n const tags = ids.map(id => ({ type, id: String(id) }))\n if (list) tags.push(listTag(type))\n return tags\n }\n\n function getModelId(result: Result<M, any>) {\n return getNestedProperty(result, id) as ModelId\n }\n\n return (result, error, arg) => {\n if (!error) {\n if (arg) {\n // The argument is an ID.\n if (isModelId(arg)) return tags([arg as ModelId])\n\n // The argument is an array of IDs.\n if (Array.isArray(arg)) {\n if (arg.length && isModelId(arg[0])) {\n return tags(arg as Array<M[\"id\"]>)\n }\n }\n // The argument is an object that contains the id field.\n else if (typeof arg === \"object\" && argKeysAreIds) {\n return tags(Object.keys(arg as Record<M[\"id\"], any>))\n }\n }\n\n if (result) {\n // The result is an array of models that contain the id field.\n if (Array.isArray(result)) {\n return tags(result.map(getModelId))\n }\n\n // The result is a model that contains the id field.\n if (getModelId(result as Result<M, any>) !== undefined) {\n return tags([getModelId(result as Result<M, any>)])\n }\n\n // The result is a list that contains an array of models that contain\n // the id field.\n return tags((result as ListResult<M, any>).data.map(getModelId), true)\n }\n }\n\n return tags([])\n }\n}\n\nexport function modelUrls(list: string, detail: string) {\n if (list === detail) throw Error(\"List and detail are the same.\")\n\n return { list, detail }\n}\n\nexport type HandleQueryStateOptions = Partial<{\n loading: ReactNode\n error: ReactNode\n}>\n\nexport function handleResultState<QueryArg, ResultType>(\n result:\n | TypedUseQueryHookResult<ResultType, QueryArg, any>\n | TypedUseQueryStateResult<ResultType, QueryArg, any>\n | TypedUseMutationResult<ResultType, QueryArg, any>,\n children: (data: NonNullable<ResultType>) => ReactNode,\n options?: HandleQueryStateOptions,\n): ReactNode {\n const { data, isLoading, isSuccess } = result\n const error = result.error as string | undefined\n\n const {\n loading: loadingNode = <CircularProgress />,\n error: errorNode = <SyncError />,\n } = options || {}\n\n // An error occurred.\n if (error) {\n console.error(error)\n return errorNode\n }\n\n // Busy calling the API.\n if (isLoading) return loadingNode\n\n // Called the API and got data.\n if (data) return children(data)\n\n // Called the API and did not get data.\n if (isSuccess) throw Error(\"Expected to get data from API but got nothing.\")\n\n // Have yet to call the API.\n return loadingNode\n}\n\nexport function isSafeHttpMethod(method: string) {\n // https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.2.1\n return [\"GET\", \"HEAD\", \"OPTIONS\", \"TRACE\"].includes(method.toUpperCase())\n}\n"],"names":["SyncError","jsxs","Stack","jsx","SyncProblemIcon","Typography","buildUrl","url","params","key","value","searchParams","values","isModelId","listTag","type","tagData","options","includeListTag","argKeysAreIds","id","tags","ids","list","getModelId","result","getNestedProperty","error","arg","modelUrls","detail","handleResultState","children","data","isLoading","isSuccess","loadingNode","CircularProgress","errorNode","isSafeHttpMethod","method"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useState as m } from "react";
|
|
2
|
+
function u(s) {
|
|
3
|
+
const { page: a = 0, limit: o = 150 } = s || {}, [p, f] = m({
|
|
4
|
+
page: a,
|
|
5
|
+
limit: o,
|
|
6
|
+
offset: a * o
|
|
7
|
+
});
|
|
8
|
+
return [p, (t) => {
|
|
9
|
+
f(({ page: c, limit: e }) => {
|
|
10
|
+
const g = typeof t == "function" ? t({ page: c, limit: e }) : t;
|
|
11
|
+
let i = g.page;
|
|
12
|
+
const n = g.limit;
|
|
13
|
+
return n !== e && (i = 0), { page: i, limit: n, offset: i * n };
|
|
14
|
+
});
|
|
15
|
+
}];
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
u
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=api-Cs4Y-WeI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-Cs4Y-WeI.js","sources":["../src/hooks/api.tsx"],"sourcesContent":["import { type Dispatch, type SetStateAction, useState } from \"react\"\n\nexport type Pagination = { page: number; limit: number; offset: number }\nexport type SetPagination = Dispatch<\n SetStateAction<{ page: number; limit: number }>\n>\nexport type UsePaginationOptions = Partial<{\n page: number\n limit: number\n}>\n\nexport function usePagination(\n options?: UsePaginationOptions,\n): [Pagination, SetPagination] {\n const { page = 0, limit = 150 } = options || {}\n\n const [pagination, _setPagination] = useState<Pagination>({\n page,\n limit,\n offset: page * limit,\n })\n\n const setPagination: SetPagination = value => {\n _setPagination(({ page: previousPage, limit: previousLimit }) => {\n const pagination =\n typeof value === \"function\"\n ? value({ page: previousPage, limit: previousLimit })\n : value\n let page = pagination.page\n const limit = pagination.limit\n\n if (limit !== previousLimit) page = 0\n\n return { page, limit, offset: page * limit }\n })\n }\n\n return [pagination, setPagination]\n}\n"],"names":["usePagination","options","page","limit","pagination","_setPagination","useState","value","previousPage","previousLimit"],"mappings":";AAWO,SAASA,EACdC,GAC6B;AAC7B,QAAM,EAAE,MAAAC,IAAO,GAAG,OAAAC,IAAQ,IAAA,IAAQF,KAAW,CAAA,GAEvC,CAACG,GAAYC,CAAc,IAAIC,EAAqB;AAAA,IACxD,MAAAJ;AAAA,IACA,OAAAC;AAAA,IACA,QAAQD,IAAOC;AAAA,EAAA,CAChB;AAiBD,SAAO,CAACC,GAf6B,CAAAG,MAAS;AAC5C,IAAAF,EAAe,CAAC,EAAE,MAAMG,GAAc,OAAOC,QAAoB;AAC/D,YAAML,IACJ,OAAOG,KAAU,aACbA,EAAM,EAAE,MAAMC,GAAc,OAAOC,EAAA,CAAe,IAClDF;AACN,UAAIL,IAAOE,EAAW;AACtB,YAAMD,IAAQC,EAAW;AAEzB,aAAID,MAAUM,MAAeP,IAAO,IAE7B,EAAE,MAAAA,GAAM,OAAAC,GAAO,QAAQD,IAAOC,EAAAA;AAAAA,IACvC,CAAC;AAAA,EACH,CAEiC;AACnC;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const r=require("react");function u(g){const{page:a=0,limit:e=150}=g||{},[c,f]=r.useState({page:a,limit:e,offset:a*e});return[c,t=>{f(({page:p,limit:o})=>{const s=typeof t=="function"?t({page:p,limit:o}):t;let i=s.page;const n=s.limit;return n!==o&&(i=0),{page:i,limit:n,offset:i*n}})}]}exports.usePagination=u;
|
|
2
|
+
//# sourceMappingURL=api-DIgp_6Vr.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-DIgp_6Vr.cjs","sources":["../src/hooks/api.tsx"],"sourcesContent":["import { type Dispatch, type SetStateAction, useState } from \"react\"\n\nexport type Pagination = { page: number; limit: number; offset: number }\nexport type SetPagination = Dispatch<\n SetStateAction<{ page: number; limit: number }>\n>\nexport type UsePaginationOptions = Partial<{\n page: number\n limit: number\n}>\n\nexport function usePagination(\n options?: UsePaginationOptions,\n): [Pagination, SetPagination] {\n const { page = 0, limit = 150 } = options || {}\n\n const [pagination, _setPagination] = useState<Pagination>({\n page,\n limit,\n offset: page * limit,\n })\n\n const setPagination: SetPagination = value => {\n _setPagination(({ page: previousPage, limit: previousLimit }) => {\n const pagination =\n typeof value === \"function\"\n ? value({ page: previousPage, limit: previousLimit })\n : value\n let page = pagination.page\n const limit = pagination.limit\n\n if (limit !== previousLimit) page = 0\n\n return { page, limit, offset: page * limit }\n })\n }\n\n return [pagination, setPagination]\n}\n"],"names":["usePagination","options","page","limit","pagination","_setPagination","useState","value","previousPage","previousLimit"],"mappings":"sCAWO,SAASA,EACdC,EAC6B,CAC7B,KAAM,CAAE,KAAAC,EAAO,EAAG,MAAAC,EAAQ,GAAA,EAAQF,GAAW,CAAA,EAEvC,CAACG,EAAYC,CAAc,EAAIC,WAAqB,CACxD,KAAAJ,EACA,MAAAC,EACA,OAAQD,EAAOC,CAAA,CAChB,EAiBD,MAAO,CAACC,EAf6BG,GAAS,CAC5CF,EAAe,CAAC,CAAE,KAAMG,EAAc,MAAOC,KAAoB,CAC/D,MAAML,EACJ,OAAOG,GAAU,WACbA,EAAM,CAAE,KAAMC,EAAc,MAAOC,CAAA,CAAe,EAClDF,EACN,IAAIL,EAAOE,EAAW,KACtB,MAAMD,EAAQC,EAAW,MAEzB,OAAID,IAAUM,IAAeP,EAAO,GAE7B,CAAE,KAAAA,EAAM,MAAAC,EAAO,OAAQD,EAAOC,CAAAA,CACvC,CAAC,CACH,CAEiC,CACnC"}
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { AnyObject } from 'yup';
|
|
2
|
+
import { BooleanSchema } from 'yup';
|
|
3
|
+
import { DateSchema } from 'yup';
|
|
4
|
+
import { FetchBaseQueryError } from '@reduxjs/toolkit/query/react';
|
|
5
|
+
import { Flags } from 'yup';
|
|
6
|
+
import { NumberSchema } from 'yup';
|
|
7
|
+
import { ObjectSchema } from 'yup';
|
|
8
|
+
import { ReactNode } from 'react';
|
|
9
|
+
import { Schema } from 'yup';
|
|
10
|
+
import { StringSchema } from 'yup';
|
|
11
|
+
import { TypedUseMutationResult } from '@reduxjs/toolkit/query/react';
|
|
12
|
+
import { TypedUseQueryHookResult } from '@reduxjs/toolkit/query/react';
|
|
13
|
+
import { TypedUseQueryStateResult } from '@reduxjs/toolkit/query/react';
|
|
14
|
+
|
|
15
|
+
export declare type Arg<M extends Model<any>, RequiredFields extends keyof Omit<M, "id">, OptionalFields extends keyof Omit<M, "id" | RequiredFields> = never> = Required_2<M, RequiredFields> & Optional<M, OptionalFields>;
|
|
16
|
+
|
|
17
|
+
export declare function buildUrl(url: string, params: {
|
|
18
|
+
search?: Fields;
|
|
19
|
+
url?: Fields;
|
|
20
|
+
}): string;
|
|
21
|
+
|
|
22
|
+
export declare type BulkCreateArg<M extends Model<any>, RequiredFields extends keyof Omit<M, "id">, OptionalFields extends keyof Omit<M, "id" | RequiredFields> = never, ExtraFields extends Fields = Fields> = Array<Arg<M, RequiredFields, OptionalFields> & ExtraFields>;
|
|
23
|
+
|
|
24
|
+
export declare type BulkCreateResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never, ExtraFields extends Fields = Fields> = Array<Result<M, MFields> & ExtraFields>;
|
|
25
|
+
|
|
26
|
+
export declare type BulkDestroyArg<M extends Model<any>> = Array<M["id"]>;
|
|
27
|
+
|
|
28
|
+
export declare type BulkDestroyResult = null;
|
|
29
|
+
|
|
30
|
+
export declare type BulkUpdateArg<M extends Model<any>, RequiredFields extends keyof Omit<M, "id">, OptionalFields extends keyof Omit<M, "id" | RequiredFields> = never, ExtraFields extends Fields = Fields> = Record<M["id"], Arg<M, RequiredFields, OptionalFields> & ExtraFields>;
|
|
31
|
+
|
|
32
|
+
export declare type BulkUpdateResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never, ExtraFields extends Fields = Fields> = Array<Result<M, MFields> & ExtraFields>;
|
|
33
|
+
|
|
34
|
+
export declare type CreateArg<M extends Model<any>, RequiredFields extends keyof Omit<M, "id">, OptionalFields extends keyof Omit<M, "id" | RequiredFields> = never> = Arg<M, RequiredFields, OptionalFields>;
|
|
35
|
+
|
|
36
|
+
export declare type CreateResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never> = Result<M, MFields>;
|
|
37
|
+
|
|
38
|
+
export declare type DestroyArg<M extends Model<any>> = M["id"];
|
|
39
|
+
|
|
40
|
+
export declare type DestroyResult = null;
|
|
41
|
+
|
|
42
|
+
export declare type Fields = Record<string, unknown>;
|
|
43
|
+
|
|
44
|
+
export declare type HandleQueryStateOptions = Partial<{
|
|
45
|
+
loading: ReactNode;
|
|
46
|
+
error: ReactNode;
|
|
47
|
+
}>;
|
|
48
|
+
|
|
49
|
+
export declare function handleResultState<QueryArg, ResultType>(result: TypedUseQueryHookResult<ResultType, QueryArg, any> | TypedUseQueryStateResult<ResultType, QueryArg, any> | TypedUseMutationResult<ResultType, QueryArg, any>, children: (data: NonNullable<ResultType>) => ReactNode, options?: HandleQueryStateOptions): ReactNode;
|
|
50
|
+
|
|
51
|
+
export declare function isModelId(value: unknown): boolean;
|
|
52
|
+
|
|
53
|
+
export declare function isSafeHttpMethod(method: string): boolean;
|
|
54
|
+
|
|
55
|
+
export declare type ListArg<Filters extends Fields = Fields> = {
|
|
56
|
+
limit: number;
|
|
57
|
+
offset: number;
|
|
58
|
+
} & Partial<Omit<Filters, "limit" | "offset">>;
|
|
59
|
+
|
|
60
|
+
export declare interface ListResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never, ExtraFields extends Fields = Fields> {
|
|
61
|
+
count: number;
|
|
62
|
+
offset: number;
|
|
63
|
+
limit: number;
|
|
64
|
+
max_limit: number;
|
|
65
|
+
data: Array<Result<M, MFields> & ExtraFields>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export declare function listTag<Type extends string>(type: Type): Tag<Type>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* A data model.
|
|
72
|
+
* Id: The type of Id.
|
|
73
|
+
* Data: The data fields.
|
|
74
|
+
*/
|
|
75
|
+
export declare type Model<Id extends ModelId, MFields extends Fields = Fields> = {
|
|
76
|
+
id: Id;
|
|
77
|
+
} & Omit<MFields, "id">;
|
|
78
|
+
|
|
79
|
+
export declare type ModelId = string | number;
|
|
80
|
+
|
|
81
|
+
export declare function modelUrls(list: string, detail: string): {
|
|
82
|
+
list: string;
|
|
83
|
+
detail: string;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
declare type Optional<T, K extends keyof T> = Partial<Pick<T, K>>;
|
|
87
|
+
|
|
88
|
+
declare type Required_2<T, K extends keyof T> = {
|
|
89
|
+
[P in K]-?: T[P];
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
export declare type Result<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never> = Pick<M, "id" | MFields>;
|
|
93
|
+
|
|
94
|
+
export declare type RetrieveArg<M extends Model<any>> = M["id"];
|
|
95
|
+
|
|
96
|
+
export declare type RetrieveResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never> = Result<M, MFields>;
|
|
97
|
+
|
|
98
|
+
declare type SchemaMap<TType, TContext = AnyObject, TDefault = any, TFlags extends Flags = ""> = NonNullable<TType> extends string ? StringSchema<TType extends undefined ? TType | undefined : TType, TContext, TDefault, TFlags> : NonNullable<TType> extends number ? NumberSchema<TType extends undefined ? TType | undefined : TType, TContext, TDefault, TFlags> : NonNullable<TType> extends boolean ? BooleanSchema<TType extends undefined ? TType | undefined : TType, TContext, TDefault, TFlags> : NonNullable<TType> extends Date ? DateSchema<TType extends undefined ? TType | undefined : TType, TContext, TDefault, TFlags> : NonNullable<TType> extends object ? ObjectSchema<TType extends undefined ? TType | undefined : TType, TContext, TDefault, TFlags> : Schema<TType, TContext, TDefault, TFlags>;
|
|
99
|
+
|
|
100
|
+
export declare type Schemas<M extends Model<any>> = {
|
|
101
|
+
[K in keyof M]-?: SchemaMap<M[K]>;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export declare interface Tag<Type extends string> {
|
|
105
|
+
type: Type;
|
|
106
|
+
id: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export declare function tagData<Type extends string, M extends Model<any>>(type: Type, options?: TagDataOptions): (result: Result<M, any> | Array<Result<M, any>> | ListResult<M, any> | null | undefined, error: FetchBaseQueryError | undefined, arg: Arg<M, any> | Array<Arg<M, any>> | Record<M["id"], Arg<M, any>> | ListArg<any> | Array<M["id"]> | string | number | undefined) => Array<Tag<Type>>;
|
|
110
|
+
|
|
111
|
+
export declare type TagDataOptions = Partial<{
|
|
112
|
+
includeListTag: boolean;
|
|
113
|
+
argKeysAreIds: boolean;
|
|
114
|
+
id: string;
|
|
115
|
+
}>;
|
|
116
|
+
|
|
117
|
+
export declare type UpdateArg<M extends Model<any>, RequiredFields extends keyof Omit<M, "id"> = never, OptionalFields extends keyof Omit<M, "id" | RequiredFields> = never> = [RequiredFields] extends [never] ? [OptionalFields] extends [never] ? M["id"] : UpdateWithBody<M, RequiredFields, OptionalFields> : UpdateWithBody<M, RequiredFields, OptionalFields>;
|
|
118
|
+
|
|
119
|
+
export declare type UpdateResult<M extends Model<any>, MFields extends keyof Omit<M, "id"> = never> = Result<M, MFields>;
|
|
120
|
+
|
|
121
|
+
declare type UpdateWithBody<M extends Model<any>, RequiredFields extends keyof Omit<M, "id">, OptionalFields extends keyof Omit<M, "id" | RequiredFields>> = Pick<M, "id"> & Arg<M, RequiredFields, OptionalFields>;
|
|
122
|
+
|
|
123
|
+
export { }
|