Skip to content

Commit 81f48ff

Browse files
authored
feat: setup for routes (#1529)
1 parent 1db94f3 commit 81f48ff

File tree

8 files changed

+123
-72
lines changed

8 files changed

+123
-72
lines changed

docs/.vitepress/config.ts

+4
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ const Customizations: (DefaultTheme.NavItemWithLink | DefaultTheme.NavItemChildr
148148
text: 'Configure Parser',
149149
link: '/custom/config-parser',
150150
},
151+
{
152+
text: 'Configure Routes',
153+
link: '/custom/config-routes',
154+
},
151155
{
152156
text: 'Configure Shortcuts',
153157
link: '/custom/config-shortcuts',

docs/custom/config-routes.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Configure Routes
2+
3+
<Environment type="client" />
4+
5+
Add your pages to the Slidev app.
6+
7+
## Usage
8+
9+
Create `./setup/routes.ts` with the following content:
10+
11+
```ts
12+
import { defineRoutesSetup } from '@slidev/types'
13+
14+
export default defineRoutesSetup((routes) => {
15+
return [
16+
...routes,
17+
{
18+
path: '/my-page',
19+
component: () => import('../pages/my-page.vue'),
20+
},
21+
]
22+
})
23+
```
24+
25+
Learn more about routes in the [Vue Router documentation](https://router.vuejs.org/).

packages/client/routes.ts

-68
This file was deleted.

packages/client/setup/main.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { createVClickDirectives } from '../modules/v-click'
99
import { createVMarkDirective } from '../modules/v-mark'
1010
import { createVDragDirective } from '../modules/v-drag'
1111
import { createVMotionDirectives } from '../modules/v-motion'
12-
import { routes } from '../routes'
12+
import setupRoutes from '../setup/routes'
1313
import setups from '#slidev/setups/main'
1414

1515
import '#slidev/styles'
@@ -28,7 +28,7 @@ export default async function setupMain(app: App) {
2828
history: __SLIDEV_HASH_ROUTE__
2929
? createWebHashHistory(import.meta.env.BASE_URL)
3030
: createWebHistory(import.meta.env.BASE_URL),
31-
routes,
31+
routes: setupRoutes(),
3232
})
3333

3434
app.use(router)

packages/client/setup/routes.ts

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import type { RouteLocationNormalized, RouteRecordRaw } from 'vue-router'
2+
import configs from '#slidev/configs'
3+
import setups from '#slidev/setups/routes'
4+
5+
export default function setupRoutes() {
6+
const routes: RouteRecordRaw[] = []
7+
8+
if (__SLIDEV_FEATURE_PRESENTER__) {
9+
function passwordGuard(to: RouteLocationNormalized) {
10+
if (!configs.remote || configs.remote === to.query.password)
11+
return true
12+
if (configs.remote && to.query.password === undefined) {
13+
// eslint-disable-next-line no-alert
14+
const password = prompt('Enter password')
15+
if (configs.remote === password)
16+
return true
17+
}
18+
if (to.params.no)
19+
return { path: `/${to.params.no}` }
20+
return { path: '' }
21+
}
22+
23+
routes.push(
24+
{
25+
name: 'entry',
26+
path: '/entry',
27+
component: () => import('../pages/entry.vue'),
28+
},
29+
{
30+
name: 'overview',
31+
path: '/overview',
32+
component: () => import('../pages/overview.vue'),
33+
},
34+
{
35+
name: 'notes',
36+
path: '/notes',
37+
component: () => import('../pages/notes.vue'),
38+
beforeEnter: passwordGuard,
39+
},
40+
{
41+
name: 'presenter',
42+
path: '/presenter/:no',
43+
component: () => import('../pages/presenter.vue'),
44+
beforeEnter: passwordGuard,
45+
},
46+
{
47+
path: '/presenter',
48+
redirect: { path: '/presenter/1' },
49+
},
50+
)
51+
}
52+
53+
if (__SLIDEV_HAS_SERVER__) {
54+
routes.push(
55+
{
56+
name: 'print',
57+
path: '/print',
58+
component: () => import('../pages/print.vue'),
59+
},
60+
{
61+
path: '/presenter/print',
62+
component: () => import('../pages/presenter/print.vue'),
63+
},
64+
)
65+
}
66+
67+
routes.push(
68+
{
69+
name: 'play',
70+
path: '/:no',
71+
component: () => import('../pages/play.vue'),
72+
},
73+
{
74+
path: '',
75+
redirect: { path: '/1' },
76+
},
77+
)
78+
79+
return setups.reduce((routes, setup) => setup(routes), routes)
80+
}

packages/slidev/node/virtual/setups.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ function createSetupTemplate(name: string): VirtualModuleTemplate {
2828
}
2929

3030
// setups
31-
const setupModules = ['shiki', 'code-runners', 'monaco', 'mermaid', 'main', 'root', 'shortcuts', 'context-menu']
31+
const setupModules = ['shiki', 'code-runners', 'monaco', 'mermaid', 'main', 'root', 'routes', 'shortcuts', 'context-menu']
3232

3333
export const templateSetups = setupModules.map(createSetupTemplate)

packages/types/client.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ declare module '#slidev/setups/shortcuts' {
9797
export default setups
9898
}
9999

100+
declare module '#slidev/setups/routes' {
101+
import type { RoutesSetup } from '@slidev/types'
102+
103+
const setups: RoutesSetup[]
104+
export default setups
105+
}
106+
100107
declare module '#slidev/setups/context-menu' {
101108
import type { ContextMenuSetup } from '@slidev/types'
102109

packages/types/src/setups.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Awaitable } from '@antfu/utils'
22
import type * as monaco from 'monaco-editor'
33
import type { App, ComputedRef, Ref } from 'vue'
4-
import type { Router } from 'vue-router'
4+
import type { RouteRecordRaw, Router } from 'vue-router'
55
import type mermaid from 'mermaid'
66
import type { KatexOptions } from 'katex'
77
import type { BuiltinLanguage, BuiltinTheme, CodeOptionsMeta, CodeOptionsThemes, CodeToHastOptionsCommon, Highlighter, LanguageInput } from 'shiki'
@@ -73,6 +73,7 @@ export type PreparserSetup = (filepath: string) => SlidevPreparserExtension
7373
export type MonacoSetup = (m: typeof monaco) => Awaitable<MonacoSetupReturn | void>
7474
export type AppSetup = (context: AppContext) => Awaitable<void>
7575
export type RootSetup = () => Awaitable<void>
76+
export type RoutesSetup = (routes: RouteRecordRaw[]) => RouteRecordRaw[]
7677
export type MermaidSetup = () => Partial<MermaidOptions> | void
7778
export type ShortcutsSetup = (nav: NavOperations, defaultShortcuts: ShortcutOptions[]) => Array<ShortcutOptions>
7879
export type CodeRunnersSetup = (runners: CodeRunnerProviders) => Awaitable<CodeRunnerProviders | void>
@@ -86,6 +87,8 @@ export const defineShikiSetup = defineSetup<ShikiSetup>
8687
export const defineUnoSetup = defineSetup<UnoSetup>
8788
export const defineMonacoSetup = defineSetup<MonacoSetup>
8889
export const defineAppSetup = defineSetup<AppSetup>
90+
export const defineRootSetup = defineSetup<RootSetup>
91+
export const defineRoutesSetup = defineSetup<RoutesSetup>
8992
export const defineMermaidSetup = defineSetup<MermaidSetup>
9093
export const defineKatexSetup = defineSetup<KatexSetup>
9194
export const defineShortcutsSetup = defineSetup<ShortcutsSetup>

0 commit comments

Comments
 (0)