feat: re-add route names, meta and props via definePage

This commit is contained in:
Dominik Pschenitschni 2025-01-17 14:57:06 +01:00
parent bdecb283e4
commit 20b77061ad
44 changed files with 210 additions and 55 deletions

View File

@ -8,5 +8,10 @@
<script setup lang="ts">
import {useTitle} from '@/composables/useTitle'
definePage({
name: 'not-found',
alias: '/:pathMatch(.*)*',
})
useTitle(() => '404')
</script>

View File

@ -71,6 +71,11 @@ import PasswordResetModel from '@/models/passwordReset'
import PasswordResetService from '@/services/passwordReset'
import Message from '@/components/misc/Message.vue'
definePage({
name: 'user.password-reset.request',
meta: { title: 'user.auth.resetPassword' },
})
const passwordResetService = shallowReactive(new PasswordResetService())
const passwordReset = ref(new PasswordResetModel())
const errorMsg = ref('')

View File

@ -161,6 +161,11 @@ import {useConfigStore} from '@/stores/config'
import {useTitle} from '@/composables/useTitle'
definePage({
name: 'user.login',
meta: { title: 'user.auth.login' },
})
const {t} = useI18n({useScope: 'global'})
useTitle(() => t('user.auth.login'))

View File

@ -58,6 +58,11 @@ import PasswordResetService from '@/services/passwordReset'
import Message from '@/components/misc/Message.vue'
import Password from '@/components/input/Password.vue'
definePage({
name: 'user.password-reset.reset',
meta: { title: 'user.auth.resetPassword' },
})
const credentials = reactive({
password: '',
})

View File

@ -129,6 +129,11 @@ import {useAuthStore} from '@/stores/auth'
import {useConfigStore} from '@/stores/config'
import {validatePassword} from '@/helpers/validatePasswort'
definePage({
name: 'user.register',
meta: { title: 'user.auth.createAccount' },
})
const {t} = useI18n()
const authStore = useAuthStore()
const configStore = useConfigStore()

View File

@ -32,6 +32,8 @@ import {computed} from 'vue'
import {useConfigStore} from '@/stores/config'
definePage({ name: 'about' })
const configStore = useConfigStore()
const apiVersion = computed(() => configStore.version)
</script>

View File

@ -34,6 +34,8 @@ import {useRedirectToLastVisited} from '@/composables/useRedirectToLastVisited'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'openid.auth' })
const {t} = useI18n({useScope: 'global'})
const route = useRoute()

View File

@ -17,6 +17,12 @@
import type {IProject} from '@/modelTypes/IProject'
import {useSavedFilter} from '@/services/savedFilter'
definePage({
name: 'filter.settings.delete',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const props = defineProps<{
projectId: IProject['id'],
}>()

View File

@ -77,6 +77,12 @@ import {useSavedFilter} from '@/services/savedFilter'
import type {IProject} from '@/modelTypes/IProject'
definePage({
name: 'filter.settings.edit',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const props = defineProps<{
projectId: IProject['id'],
}>()

View File

@ -88,6 +88,11 @@ import Filters from '@/components/project/partials/Filters.vue'
import {useSavedFilter} from '@/services/savedFilter'
definePage({
name: 'filters.create',
meta: { showAsModal: true },
})
const {
filter,
filters,

View File

@ -149,6 +149,8 @@ import {useLabelStore} from '@/stores/labels'
import { useTitle } from '@/composables/useTitle'
definePage({ name: 'labels.index' })
const {t} = useI18n({useScope: 'global'})
const labelEditLabel = ref<ILabel>(new LabelModel())

View File

@ -54,6 +54,8 @@ import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import {getRandomColorHex} from '@/helpers/color/randomColor'
definePage({ name: 'labels.create' })
const router = useRouter()
const {t} = useI18n({useScope: 'global'})

View File

@ -110,16 +110,6 @@
</div>
</template>
<script lang="ts">
export default {
beforeRouteEnter(to) {
if (MIGRATORS[to.params.service as string] === undefined) {
return {name: 'not-found'}
}
},
}
</script>
<script setup lang="ts">
import {computed, ref, shallowReactive} from 'vue'
import {useI18n} from 'vue-i18n'
@ -138,6 +128,19 @@ import {useTitle} from '@/composables/useTitle'
import {useProjectStore} from '@/stores/projects'
import {getErrorText} from '@/message'
definePage({
name: 'migrate.service',
props: route => ({
service: route.params.service as string,
code: route.query.code as string,
}),
beforeEnter(to) {
if (MIGRATORS[to.params.service as string] === undefined) {
return {name: 'not-found'}
}
},
})
const props = defineProps<{
service: string,
code?: string,

View File

@ -48,6 +48,8 @@ import {useStorage} from '@vueuse/core'
import {useProjectStore} from '@/stores/projects'
definePage({ name: 'projects.index' })
const {t} = useI18n()
const projectStore = useProjectStore()

View File

@ -65,6 +65,14 @@ import {useProjectStore} from '@/stores/projects'
import ProjectSearch from '@/components/tasks/partials/ProjectSearch.vue'
import type {IProject} from '@/modelTypes/IProject'
definePage({
name: 'project.create',
props: route => ({ parentProjectId: Number(route.params.parentProjectId as string) }),
meta: {
showAsModal: true,
},
})
const props = defineProps<{
parentProjectId?: number,
}>()

View File

@ -25,6 +25,12 @@ import {computed} from 'vue'
import DOMPurify from 'dompurify'
import {useProjectStore} from '@/stores/projects'
definePage({
name: 'project.info',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const props = defineProps<{
projectId: number
}>()

View File

@ -28,6 +28,12 @@ import {useTitle} from '@/composables/useTitle'
import {useBaseStore} from '@/stores/base'
import {useProjectStore} from '@/stores/projects'
definePage({
name: 'project.settings.archive',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const {t} = useI18n({useScope: 'global'})
const projectStore = useProjectStore()
const router = useRouter()

View File

@ -133,6 +133,12 @@ import {useTitle} from '@/composables/useTitle'
import CreateEdit from '@/components/misc/CreateEdit.vue'
import {success} from '@/message'
definePage({
name: 'project.settings.background',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const SEARCH_DEBOUNCE = 300
const {t} = useI18n({useScope: 'global'})

View File

@ -41,6 +41,12 @@ import Loading from '@/components/misc/Loading.vue'
import {useProjectStore} from '@/stores/projects'
import TaskService from '@/services/task'
definePage({
name: 'project.settings.delete',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const {t} = useI18n({useScope: 'global'})
const projectStore = useProjectStore()
const route = useRoute()

View File

@ -24,6 +24,12 @@ import {useTitle} from '@/composables/useTitle'
import {useProject, useProjectStore} from '@/stores/projects'
import type {IProject} from '@/modelTypes/IProject'
definePage({
name: 'project.settings.duplicate',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const {t} = useI18n({useScope: 'global'})
useTitle(() => t('project.duplicate.title'))

View File

@ -101,6 +101,12 @@ import {useProject} from '@/stores/projects'
import {useTitle} from '@/composables/useTitle'
import {RIGHTS} from '@/constants/rights'
definePage({
name: 'project.settings.edit',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const props = defineProps<{
projectId: IProject['id'],
}>()

View File

@ -48,6 +48,12 @@ import userTeam from '@/components/sharing/UserTeam.vue'
import {useBaseStore} from '@/stores/base'
import {useConfigStore} from '@/stores/config'
definePage({
name: 'project.settings.share',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const {t} = useI18n({useScope: 'global'})
const project = ref<IProject>()

View File

@ -16,6 +16,12 @@ import Message from '@/components/misc/Message.vue'
import draggable from 'zhyswan-vuedraggable'
import {calculateItemPosition} from '@/helpers/calculateItemPosition'
definePage({
name: 'project.settings.views',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const props = defineProps<{
projectId: number
}>()

View File

@ -25,6 +25,12 @@ import FancyCheckbox from '@/components/input/FancyCheckbox.vue'
import {success} from '@/message'
import {isValidHttpUrl} from '@/helpers/isValidHttpUrl'
definePage({
name: 'project.settings.webhooks',
meta: { showAsModal: true },
props: route => ({ projectId: Number(route.params.projectId as string) }),
})
const {t} = useI18n({useScope: 'global'})
const project = ref<IProject>()

View File

@ -55,6 +55,8 @@ import {useBaseStore} from '@/stores/base'
import {useAuthStore} from '@/stores/auth'
import {useRedirectToLastVisited} from '@/composables/useRedirectToLastVisited'
definePage({ name: 'link-share.auth' })
const {t} = useI18n({useScope: 'global'})
useTitle(t('sharing.authenticating'))
const {getLastVisitedRoute} = useRedirectToLastVisited()

View File

@ -644,6 +644,11 @@ import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import type {Action as MessageAction} from '@/message'
definePage({
name: 'task.detail',
props: route => ({ taskId: Number(route.params.id as string) }),
})
const props = defineProps<{
taskId: ITask['id'],
backdropView?: RouteLocation['fullPath'],

View File

@ -6,7 +6,7 @@
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
import {getNextWeekDate} from '@/helpers/time/getNextWeekDate'
import ShowTasks from '@/components/tasks/ShowTasks.vue';
import ShowTasks from '@/components/tasks/ShowTasks.vue'
definePage({
name: 'tasks.range',
@ -15,7 +15,7 @@ definePage({
dateTo: parseDateOrString(route.query.to as string, getNextWeekDate()),
showNulls: route.query.showNulls === 'true',
showOverdue: route.query.showOverdue === 'true',
})
}),
})
const props = defineProps<{

View File

@ -46,6 +46,8 @@ import { useI18n } from 'vue-i18n'
import TeamService from '@/services/team'
import { useTitle } from '@/composables/useTitle'
definePage({ name: 'teams.index' })
const { t } = useI18n({useScope: 'global'})
useTitle(() => t('team.title'))

View File

@ -282,6 +282,8 @@ import type {ITeam} from '@/modelTypes/ITeam'
import type {IUser} from '@/modelTypes/IUser'
import type {ITeamMember} from '@/modelTypes/ITeamMember'
definePage({ name: 'teams.edit' })
const authStore = useAuthStore()
const configStore = useConfigStore()
const route = useRoute()

View File

@ -74,6 +74,11 @@ import {success} from '@/message'
import {useConfigStore} from '@/stores/config'
definePage({
name: 'teams.create',
meta: { showAsModal: true },
})
const {t} = useI18n()
const title = computed(() => t('team.create.title'))
useTitle(title)

View File

@ -47,6 +47,8 @@ import {ref, computed, reactive} from 'vue'
import DataExportService from '@/services/dataExport'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.export.download' })
const dataExportService = reactive(new DataExportService())
const password = ref('')
const errPasswordRequired = ref(false)

View File

@ -32,6 +32,8 @@ import { useConfigStore } from '@/stores/config'
import { useAuthStore } from '@/stores/auth'
import {useRoute} from 'vue-router'
definePage({ name: 'user.settings' })
const { t } = useI18n({useScope: 'global'})
useTitle(() => t('user.settings.title'))

View File

@ -14,6 +14,8 @@ import {useI18n} from 'vue-i18n'
import Message from '@/components/misc/Message.vue'
import type {IApiToken} from '@/modelTypes/IApiToken'
definePage({ name: 'user.settings.apiTokens' })
const service = new ApiTokenService()
const tokens = ref<IApiToken[]>([])
const apiDocsUrl = window.API_URL + '/docs'

View File

@ -81,6 +81,8 @@ import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.settings.avatar' })
const {t} = useI18n({useScope: 'global'})
const authStore = useAuthStore()

View File

@ -114,6 +114,8 @@ import type {ICaldavToken} from '@/modelTypes/ICaldavToken'
import {useConfigStore} from '@/stores/config'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.settings.caldav' })
const copy = useCopyToClipboard()
const {t} = useI18n({useScope: 'global'})

View File

@ -58,6 +58,8 @@ import {useTitle} from '@/composables/useTitle'
import {success} from '@/message'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.settings.data-export' })
const {t} = useI18n({useScope: 'global'})
const authStore = useAuthStore()

View File

@ -126,6 +126,8 @@ import {success} from '@/message'
import {useAuthStore} from '@/stores/auth'
import {useConfigStore} from '@/stores/config'
definePage({ name: 'user.settings.deletion' })
const {t} = useI18n({useScope: 'global'})
useTitle(() => `${t('user.deletion.title')} - ${t('user.settings.title')}`)

View File

@ -62,6 +62,8 @@ import {success} from '@/message'
import {useTitle} from '@/composables/useTitle'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.settings.email-update' })
const {t} = useI18n({useScope: 'global'})
useTitle(() => `${t('user.settings.updateEmailTitle')} - ${t('user.settings.title')}`)

View File

@ -239,6 +239,8 @@ import type {IUserSettings} from '@/modelTypes/IUserSettings'
import {isSavedFilter} from '@/services/savedFilter'
import {DEFAULT_PROJECT_VIEW_SETTINGS} from '@/modelTypes/IProjectView'
definePage({ name: 'user.settings.general' })
const {t} = useI18n({useScope: 'global'})
useTitle(() => `${t('user.settings.general.title')} - ${t('user.settings.title')}`)

View File

@ -28,6 +28,8 @@ import {MIGRATORS} from '@/helpers/migrators'
import {useTitle} from '@/composables/useTitle'
import {useConfigStore} from '@/stores/config'
definePage({ name: 'migrate.start' })
const {t} = useI18n({useScope: 'global'})
useTitle(() => t('migrate.title'))

View File

@ -83,6 +83,8 @@ import {useTitle} from '@/composables/useTitle'
import {success, error} from '@/message'
import {useAuthStore} from '@/stores/auth'
definePage({ name: 'user.settings.password-update' })
const passwordUpdateService = shallowReactive(new PasswordUpdateService())
const passwordUpdate = reactive(new PasswordUpdateModel())
const passwordConfirm = ref('')

View File

@ -110,6 +110,8 @@ import {useTitle} from '@/composables/useTitle'
import {useConfigStore} from '@/stores/config'
import type {ITotp} from '@/modelTypes/ITotp'
definePage({ name: 'user.settings.totp' })
const {t} = useI18n({useScope: 'global'})
useTitle(() => `${t('user.settings.totp.title')} - ${t('user.settings.title')}`)

View File

@ -4,8 +4,6 @@ import { routes, handleHotUpdate } from 'vue-router/auto-routes'
import {saveLastVisited} from '@/helpers/saveLastVisited'
import {getProjectViewId} from '@/helpers/projectView'
import {parseDateOrString} from '@/helpers/time/parseDateOrString'
import {getNextWeekDate} from '@/helpers/time/getNextWeekDate'
import {LINK_SHARE_HASH_PREFIX} from '@/constants/linkShareHash'
import {useAuthStore} from '@/stores/auth'

View File

@ -18,49 +18,49 @@ declare module 'vue-router/auto-routes' {
* Route name map generated by unplugin-vue-router
*/
export interface RouteNamedMap {
'/[[auth]]/get-password-reset': RouteRecordInfo<'/[[auth]]/get-password-reset', '/:auth?/get-password-reset', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'/[[auth]]/login': RouteRecordInfo<'/[[auth]]/login', '/:auth?/login', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'/[[auth]]/password-reset': RouteRecordInfo<'/[[auth]]/password-reset', '/:auth?/password-reset', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'/[[auth]]/register': RouteRecordInfo<'/[[auth]]/register', '/:auth?/register', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'/[[...path]]+': RouteRecordInfo<'/[[...path]]+', '/:path(.*)*', { path?: ParamValueZeroOrMore<true> }, { path?: ParamValueZeroOrMore<false> }>,
'user.password-reset.request': RouteRecordInfo<'user.password-reset.request', '/:auth?/get-password-reset', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'user.login': RouteRecordInfo<'user.login', '/:auth?/login', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'user.password-reset.reset': RouteRecordInfo<'user.password-reset.reset', '/:auth?/password-reset', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'user.register': RouteRecordInfo<'user.register', '/:auth?/register', { auth?: ParamValueZeroOrOne<true> }, { auth?: ParamValueZeroOrOne<false> }>,
'not-found': RouteRecordInfo<'not-found', '/:path(.*)*', { path?: ParamValueZeroOrMore<true> }, { path?: ParamValueZeroOrMore<false> }>,
'home': RouteRecordInfo<'home', '/(home)', Record<never, never>, Record<never, never>>,
'/about': RouteRecordInfo<'/about', '/about', Record<never, never>, Record<never, never>>,
'/auth/openid/[provider]': RouteRecordInfo<'/auth/openid/[provider]', '/auth/openid/:provider', { provider: ParamValue<true> }, { provider: ParamValue<false> }>,
'/filters/[projectId]/settings/delete': RouteRecordInfo<'/filters/[projectId]/settings/delete', '/filters/:projectId/settings/delete', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/filters/[projectId]/settings/edit': RouteRecordInfo<'/filters/[projectId]/settings/edit', '/filters/:projectId/settings/edit', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/filters/new': RouteRecordInfo<'/filters/new', '/filters/new', Record<never, never>, Record<never, never>>,
'/labels/(labels)': RouteRecordInfo<'/labels/(labels)', '/labels/(labels)', Record<never, never>, Record<never, never>>,
'/labels/new': RouteRecordInfo<'/labels/new', '/labels/new', Record<never, never>, Record<never, never>>,
'/migrate/[service]': RouteRecordInfo<'/migrate/[service]', '/migrate/:service', { service: ParamValue<true> }, { service: ParamValue<false> }>,
'/projects/[[parentProjectId]]/new': RouteRecordInfo<'/projects/[[parentProjectId]]/new', '/projects/:parentProjectId?/new', { parentProjectId?: ParamValueZeroOrOne<true> }, { parentProjectId?: ParamValueZeroOrOne<false> }>,
'about': RouteRecordInfo<'about', '/about', Record<never, never>, Record<never, never>>,
'openid.auth': RouteRecordInfo<'openid.auth', '/auth/openid/:provider', { provider: ParamValue<true> }, { provider: ParamValue<false> }>,
'filter.settings.delete': RouteRecordInfo<'filter.settings.delete', '/filters/:projectId/settings/delete', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'filter.settings.edit': RouteRecordInfo<'filter.settings.edit', '/filters/:projectId/settings/edit', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'filters.create': RouteRecordInfo<'filters.create', '/filters/new', Record<never, never>, Record<never, never>>,
'labels.index': RouteRecordInfo<'labels.index', '/labels/(labels)', Record<never, never>, Record<never, never>>,
'labels.create': RouteRecordInfo<'labels.create', '/labels/new', Record<never, never>, Record<never, never>>,
'migrate.service': RouteRecordInfo<'migrate.service', '/migrate/:service', { service: ParamValue<true> }, { service: ParamValue<false> }>,
'project.create': RouteRecordInfo<'project.create', '/projects/:parentProjectId?/new', { parentProjectId?: ParamValueZeroOrOne<true> }, { parentProjectId?: ParamValueZeroOrOne<false> }>,
'/projects/[projectId]/[[viewId]]': RouteRecordInfo<'/projects/[projectId]/[[viewId]]', '/projects/:projectId/:viewId?', { projectId: ParamValue<true>, viewId?: ParamValueZeroOrOne<true> }, { projectId: ParamValue<false>, viewId?: ParamValueZeroOrOne<false> }>,
'/projects/[projectId]/info': RouteRecordInfo<'/projects/[projectId]/info', '/projects/:projectId/info', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/archive': RouteRecordInfo<'/projects/[projectId]/settings/archive', '/projects/:projectId/settings/archive', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/background': RouteRecordInfo<'/projects/[projectId]/settings/background', '/projects/:projectId/settings/background', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/delete': RouteRecordInfo<'/projects/[projectId]/settings/delete', '/projects/:projectId/settings/delete', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/duplicate': RouteRecordInfo<'/projects/[projectId]/settings/duplicate', '/projects/:projectId/settings/duplicate', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/edit': RouteRecordInfo<'/projects/[projectId]/settings/edit', '/projects/:projectId/settings/edit', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/share': RouteRecordInfo<'/projects/[projectId]/settings/share', '/projects/:projectId/settings/share', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/views': RouteRecordInfo<'/projects/[projectId]/settings/views', '/projects/:projectId/settings/views', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/[projectId]/settings/webhooks': RouteRecordInfo<'/projects/[projectId]/settings/webhooks', '/projects/:projectId/settings/webhooks', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'/projects/(projects)': RouteRecordInfo<'/projects/(projects)', '/projects/(projects)', Record<never, never>, Record<never, never>>,
'/share/[share]/auth': RouteRecordInfo<'/share/[share]/auth', '/share/:share/auth', { share: ParamValue<true> }, { share: ParamValue<false> }>,
'/task/[id]': RouteRecordInfo<'/task/[id]', '/task/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,
'project.info': RouteRecordInfo<'project.info', '/projects/:projectId/info', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.archive': RouteRecordInfo<'project.settings.archive', '/projects/:projectId/settings/archive', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.background': RouteRecordInfo<'project.settings.background', '/projects/:projectId/settings/background', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.delete': RouteRecordInfo<'project.settings.delete', '/projects/:projectId/settings/delete', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.duplicate': RouteRecordInfo<'project.settings.duplicate', '/projects/:projectId/settings/duplicate', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.edit': RouteRecordInfo<'project.settings.edit', '/projects/:projectId/settings/edit', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.share': RouteRecordInfo<'project.settings.share', '/projects/:projectId/settings/share', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.views': RouteRecordInfo<'project.settings.views', '/projects/:projectId/settings/views', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'project.settings.webhooks': RouteRecordInfo<'project.settings.webhooks', '/projects/:projectId/settings/webhooks', { projectId: ParamValue<true> }, { projectId: ParamValue<false> }>,
'projects.index': RouteRecordInfo<'projects.index', '/projects/(projects)', Record<never, never>, Record<never, never>>,
'link-share.auth': RouteRecordInfo<'link-share.auth', '/share/:share/auth', { share: ParamValue<true> }, { share: ParamValue<false> }>,
'task.detail': RouteRecordInfo<'task.detail', '/task/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,
'tasks.range': RouteRecordInfo<'tasks.range', '/tasks/by/upcoming', Record<never, never>, Record<never, never>>,
'/teams/[id]/edit': RouteRecordInfo<'/teams/[id]/edit', '/teams/:id/edit', { id: ParamValue<true> }, { id: ParamValue<false> }>,
'/teams/(teams)': RouteRecordInfo<'/teams/(teams)', '/teams/(teams)', Record<never, never>, Record<never, never>>,
'/teams/new': RouteRecordInfo<'/teams/new', '/teams/new', Record<never, never>, Record<never, never>>,
'/user/export/download': RouteRecordInfo<'/user/export/download', '/user/export/download', Record<never, never>, Record<never, never>>,
'/user/settings': RouteRecordInfo<'/user/settings', '/user/settings', Record<never, never>, Record<never, never>>,
'/user/settings/api-tokens': RouteRecordInfo<'/user/settings/api-tokens', '/user/settings/api-tokens', Record<never, never>, Record<never, never>>,
'/user/settings/avatar': RouteRecordInfo<'/user/settings/avatar', '/user/settings/avatar', Record<never, never>, Record<never, never>>,
'/user/settings/caldav': RouteRecordInfo<'/user/settings/caldav', '/user/settings/caldav', Record<never, never>, Record<never, never>>,
'/user/settings/data-export': RouteRecordInfo<'/user/settings/data-export', '/user/settings/data-export', Record<never, never>, Record<never, never>>,
'/user/settings/deletion': RouteRecordInfo<'/user/settings/deletion', '/user/settings/deletion', Record<never, never>, Record<never, never>>,
'/user/settings/email-update': RouteRecordInfo<'/user/settings/email-update', '/user/settings/email-update', Record<never, never>, Record<never, never>>,
'/user/settings/general': RouteRecordInfo<'/user/settings/general', '/user/settings/general', Record<never, never>, Record<never, never>>,
'/user/settings/migrate': RouteRecordInfo<'/user/settings/migrate', '/user/settings/migrate', Record<never, never>, Record<never, never>>,
'/user/settings/password-update': RouteRecordInfo<'/user/settings/password-update', '/user/settings/password-update', Record<never, never>, Record<never, never>>,
'/user/settings/totp': RouteRecordInfo<'/user/settings/totp', '/user/settings/totp', Record<never, never>, Record<never, never>>,
'teams.edit': RouteRecordInfo<'teams.edit', '/teams/:id/edit', { id: ParamValue<true> }, { id: ParamValue<false> }>,
'teams.index': RouteRecordInfo<'teams.index', '/teams/(teams)', Record<never, never>, Record<never, never>>,
'teams.create': RouteRecordInfo<'teams.create', '/teams/new', Record<never, never>, Record<never, never>>,
'user.export.download': RouteRecordInfo<'user.export.download', '/user/export/download', Record<never, never>, Record<never, never>>,
'user.settings': RouteRecordInfo<'user.settings', '/user/settings', Record<never, never>, Record<never, never>>,
'user.settings.apiTokens': RouteRecordInfo<'user.settings.apiTokens', '/user/settings/api-tokens', Record<never, never>, Record<never, never>>,
'user.settings.avatar': RouteRecordInfo<'user.settings.avatar', '/user/settings/avatar', Record<never, never>, Record<never, never>>,
'user.settings.caldav': RouteRecordInfo<'user.settings.caldav', '/user/settings/caldav', Record<never, never>, Record<never, never>>,
'user.settings.data-export': RouteRecordInfo<'user.settings.data-export', '/user/settings/data-export', Record<never, never>, Record<never, never>>,
'user.settings.deletion': RouteRecordInfo<'user.settings.deletion', '/user/settings/deletion', Record<never, never>, Record<never, never>>,
'user.settings.email-update': RouteRecordInfo<'user.settings.email-update', '/user/settings/email-update', Record<never, never>, Record<never, never>>,
'user.settings.general': RouteRecordInfo<'user.settings.general', '/user/settings/general', Record<never, never>, Record<never, never>>,
'migrate.start': RouteRecordInfo<'migrate.start', '/user/settings/migrate', Record<never, never>, Record<never, never>>,
'user.settings.password-update': RouteRecordInfo<'user.settings.password-update', '/user/settings/password-update', Record<never, never>, Record<never, never>>,
'user.settings.totp': RouteRecordInfo<'user.settings.totp', '/user/settings/totp', Record<never, never>, Record<never, never>>,
}
}