diff --git a/playground/src/routes/custom-name.vue b/playground/src/routes/custom-name.vue index 4b261be07..deaab6df3 100644 --- a/playground/src/routes/custom-name.vue +++ b/playground/src/routes/custom-name.vue @@ -1,5 +1,8 @@ { - "name": "a rebel" + "name": "a rebel", + "meta": { + "requiresAuth": true + } } diff --git a/src/codegen/__snapshots__/generateRouteRecords.spec.ts.snap b/src/codegen/__snapshots__/generateRouteRecords.spec.ts.snap index 7cebdf791..5fc90982d 100644 --- a/src/codegen/__snapshots__/generateRouteRecords.spec.ts.snap +++ b/src/codegen/__snapshots__/generateRouteRecords.spec.ts.snap @@ -37,6 +37,21 @@ exports[`generateRouteRecord > adds children and name when folder and component ]" `; +exports[`generateRouteRecord > adds meta data 1`] = ` +"[ + { + path: '/', + name: '/', + component: () => import('index.vue'), + /* no children */ + meta: { + \\"auth\\": true, + \\"title\\": \\"Home\\" + } + } +]" +`; + exports[`generateRouteRecord > correctly names index.vue files 1`] = ` "[ { diff --git a/src/codegen/generateRouteRecords.spec.ts b/src/codegen/generateRouteRecords.spec.ts index 3a9fb8e68..f198f2309 100644 --- a/src/codegen/generateRouteRecords.spec.ts +++ b/src/codegen/generateRouteRecords.spec.ts @@ -115,4 +115,17 @@ describe('generateRouteRecord', () => { expect(generateRouteRecord(tree)).toMatchSnapshot() }) }) + + it('adds meta data', () => { + const tree = createPrefixTree(DEFAULT_OPTIONS) + const node = tree.insert('index.vue') + node.mergeCustomRouteBlock({ + meta: { + auth: true, + title: 'Home', + }, + }) + + expect(generateRouteRecord(tree)).toMatchSnapshot() + }) }) diff --git a/src/codegen/generateRouteRecords.ts b/src/codegen/generateRouteRecords.ts index 8acbbcf84..dcedafe1c 100644 --- a/src/codegen/generateRouteRecords.ts +++ b/src/codegen/generateRouteRecords.ts @@ -1,10 +1,6 @@ import type { TreeLeaf } from '../core/tree' -export function generateRouteRecord( - node: TreeLeaf, - indent = 0, - parent: TreeLeaf | null = null -): string { +export function generateRouteRecord(node: TreeLeaf, indent = 0): string { // root if (node.value.path === '/' && indent === 0) { return `[ @@ -36,11 +32,11 @@ ${indentStr}${ ? `children: [ ${node .getSortedChildren() - .map((child) => generateRouteRecord(child, indent + 2, node)) + .map((child) => generateRouteRecord(child, indent + 2)) .join(',\n')} ${indentStr}],` : '/* no children */' - } + }${formatMeta(node.meta, indentStr)} ${startIndent}}` } @@ -59,3 +55,14 @@ ${files .join(',\n')} ${indentStr}},` } + +function formatMeta(meta: string, indent: string): string { + const formatted = + meta && + meta + .split('\n') + .map((line) => indent + line) + .join('\n') + + return formatted ? '\n' + indent + 'meta: ' + formatted.trimStart() : '' +} diff --git a/src/core/tree.ts b/src/core/tree.ts index bb28f4fa6..051e77d60 100644 --- a/src/core/tree.ts +++ b/src/core/tree.ts @@ -109,6 +109,12 @@ export class TreeLeaf { return this.value.overrides.name || this.options.getRouteName(this) } + get meta() { + return this.value.overrides.meta + ? JSON.stringify(this.value.overrides.meta, null, 2) + : '' + } + isRoot() { return this.value.path === '/' && !this.value.filePaths.size }