Skip to content

Commit 742e65e

Browse files
committed
feat(vue): add route key and meta to route context
This allows the developer to use their own key for the routeMap matching, as well as provide meta data per route. This also re-exports beforeEach handlers, so that they can be overridden in the virtual files.
1 parent f2fa98c commit 742e65e

File tree

10 files changed

+31
-10
lines changed

10 files changed

+31
-10
lines changed

packages/fastify-vue/context.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ export default class RouteContext {
2525
// Populated
2626
this.head = {}
2727
this.data = route.data
28+
this.key = route.key
29+
this.meta = route.meta
2830
this.state = null
2931
// Route settings
3032
this.layout = route.layout
@@ -51,6 +53,8 @@ export default class RouteContext {
5153
state: this.state,
5254
data: this.data,
5355
head: this.head,
56+
key: this.key,
57+
meta: this.meta,
5458
layout: this.layout,
5559
getMeta: this.getMeta,
5660
getData: this.getData,

packages/fastify-vue/rendering.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { createHtmlTemplates } from './templating.js'
66

77
export async function createRenderFunction ({ routes, create }) {
88
// Used when hydrating Vue Router on the client
9-
const routeMap = Object.fromEntries(routes.map(_ => [_.path, _]))
9+
const routeMap = Object.fromEntries(routes.map(_ => [_.key, _]))
1010
// Registered as reply.render()
1111
return function () {
1212
if (this.request.route.streaming) {

packages/fastify-vue/routing.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export async function createRoute ({ client, errorHandler, route }, scope, confi
4141
}
4242

4343
// Used when hydrating Vue Router on the client
44-
const routeMap = Object.fromEntries(client.routes.map(_ => [_.path, _]))
44+
const routeMap = Object.fromEntries(client.routes.map(_ => [_.key, _]))
4545

4646
// Extend with route context initialization module
4747
RouteContext.extend(client.context)
@@ -139,7 +139,8 @@ export async function createRoute ({ client, errorHandler, route }, scope, confi
139139

140140
if (route.getData) {
141141
// If getData is provided, register JSON endpoint for it
142-
scope.get(`/-/data${routePath}`, {
142+
const dataPath = (route.dataPath ?? route.path).replace(/:[^+]+\+/, '*')
143+
scope.get(`/-/data${dataPath}`, {
143144
onRequest,
144145
async handler (req, reply) {
145146
reply.send(await route.getData(req.route))

packages/fastify-vue/server.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class Routes extends Array {
66
return {
77
id: route.id,
88
path: route.path,
9+
key: route.key,
910
name: route.name,
1011
layout: route.layout,
1112
getData: !!route.getData,
@@ -29,6 +30,7 @@ export async function createRoutes (fromPromise, { param } = { param: /\[([.\w]+
2930
id: routeDef.path,
3031
name: routeDef.path ?? routeModule.path,
3132
path: routeDef.path ?? routeModule.path,
33+
key: routeDef.path ?? routeModule.path,
3234
...routeModule,
3335
}
3436
}),
@@ -61,11 +63,13 @@ export async function createRoutes (fromPromise, { param } = { param: /\[([.\w]+
6163
.replace(param, (_, m) => `:${m}`)
6264
// Replace '/index' with '/'
6365
.replace(/\/index$/, '/')
64-
// Remove trailing slashs
66+
// Remove trailing slashes
6567
.replace(/(.+)\/+$/, (...m) => m[1]),
6668
...routeModule,
6769
}
6870

71+
route.key = route.path
72+
6973
if (route.name === '') {
7074
route.name = 'catch-all'
7175
}

packages/fastify-vue/virtual-ts/create.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {
44
createHistory,
55
serverRouteContext,
66
routeLayout,
7-
createBeforeEachHandler,
87
} from '@fastify/vue/client'
8+
import { createClientBeforeEachHandler, createServerBeforeEachHandler } from '$app/index.ts'
99
import { createHead as createClientHead } from '@unhead/vue/client'
1010
import { createHead as createServerHead } from '@unhead/vue/server'
1111

@@ -40,9 +40,12 @@ export default async function create (ctx) {
4040
}
4141

4242
if (isServer) {
43+
if (createServerBeforeEachHandler) {
44+
router.beforeEach(createServerBeforeEachHandler(ctx))
45+
}
4346
instance.provide(serverRouteContext, ctxHydration)
4447
} else {
45-
router.beforeEach(createBeforeEachHandler(ctx, layoutRef))
48+
router.beforeEach(createClientBeforeEachHandler(ctx, layoutRef))
4649
}
4750

4851
instance.use(router)

packages/fastify-vue/virtual-ts/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import { createRoutes } from '@fastify/vue/server'
2+
export { createBeforeEachHandler as createClientBeforeEachHandler } from '@fastify/vue/client'
3+
4+
export const createServerBeforeEachHandler = null
25

36
export default {
47
routes: createRoutes(import('$app/routes.ts')),

packages/fastify-vue/virtual-ts/mount.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ async function mountApp (...targets) {
88
const ctxHydration = await extendContext(window.route, context)
99
const resolvedRoutes = await hydrateRoutes(routes)
1010
const routeMap = Object.fromEntries(
11-
resolvedRoutes.map((route) => [route.path, route]),
11+
resolvedRoutes.map((route) => [route.key, route]),
1212
)
1313
const { instance, router } = await create({
1414
ctxHydration,

packages/fastify-vue/virtual/create.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {
44
createHistory,
55
serverRouteContext,
66
routeLayout,
7-
createBeforeEachHandler,
87
} from '@fastify/vue/client'
8+
import { createClientBeforeEachHandler, createServerBeforeEachHandler } from '$app/index.js'
99
import { createHead as createClientHead } from '@unhead/vue/client'
1010
import { createHead as createServerHead } from '@unhead/vue/server'
1111

@@ -40,9 +40,12 @@ export default async function create (ctx) {
4040
}
4141

4242
if (isServer) {
43+
if (createServerBeforeEachHandler) {
44+
router.beforeEach(createServerBeforeEachHandler(ctx))
45+
}
4346
instance.provide(serverRouteContext, ctxHydration)
4447
} else {
45-
router.beforeEach(createBeforeEachHandler(ctx, layoutRef))
48+
router.beforeEach(createClientBeforeEachHandler(ctx, layoutRef))
4649
}
4750

4851
instance.use(router)

packages/fastify-vue/virtual/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import { createRoutes } from '@fastify/vue/server'
2+
export { createBeforeEachHandler as createClientBeforeEachHandler } from '@fastify/vue/client'
3+
4+
export const createServerBeforeEachHandler = null
25

36
export default {
47
routes: createRoutes(import('$app/routes.js')),

packages/fastify-vue/virtual/mount.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ async function mountApp (...targets) {
99
const ctxHydration = await extendContext(window.route, context)
1010
const resolvedRoutes = await hydrateRoutes(routes)
1111
const routeMap = Object.fromEntries(
12-
resolvedRoutes.map((route) => [route.path, route]),
12+
resolvedRoutes.map((route) => [route.key, route]),
1313
)
1414
const { instance, router } = await create({
1515
ctxHydration,

0 commit comments

Comments
 (0)