Skip to content

Commit 85d8472

Browse files
committed
fix: move extension handling outside of tree
Fix #400 BREAKING CHANGE: `Tree` and `PrefixTree` insert method expects a path without the file extension. They also expect the fullpath of the file as a second argument (it used to be optional). This aligns better with their responsibility. ```ts // replace tree.insert('file.vue') // with tree.insert('file', resolve('file.vue')) ``` This shouldn't affect most users as the Tree implementation are used internally to represent the folder structure.
1 parent 9d21d2d commit 85d8472

File tree

12 files changed

+243
-327
lines changed

12 files changed

+243
-327
lines changed

e2e/fixtures/filenames/multi-extensions/about.vue

Whitespace-only changes.

e2e/fixtures/filenames/multi-extensions/docs/[...pathMatch].vue

Whitespace-only changes.

e2e/fixtures/filenames/multi-extensions/docs/index.md

Whitespace-only changes.

e2e/fixtures/filenames/multi-extensions/index.vue

Whitespace-only changes.

src/codegen/__snapshots__/generateRouteRecords.spec.ts.snap

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ exports[`generateRouteRecord > adds children and name when folder and component
3737
]"
3838
`;
3939

40-
exports[`generateRouteRecord > correctly names index.vue files 1`] = `
40+
exports[`generateRouteRecord > correctly names index files 1`] = `
4141
"[
4242
{
4343
path: '/',
@@ -483,14 +483,14 @@ exports[`generateRouteRecord > nested children 2`] = `
483483
exports[`generateRouteRecord > raw paths insertions > dedupes sync imports for the same component 1`] = `
484484
"[
485485
{
486-
path: '/a/b.vue',
487-
name: '/a/b.vue',
486+
path: '/a/b',
487+
name: '/a/b',
488488
component: _page_0,
489489
/* no children */
490490
},
491491
{
492-
path: '/a/c.vue',
493-
name: '/a/c.vue',
492+
path: '/a/c',
493+
name: '/a/c',
494494
component: _page_0,
495495
/* no children */
496496
}

src/codegen/generateRouteMap.spec.ts

Lines changed: 38 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ function formatExports(exports: string) {
1616
describe('generateRouteNamedMap', () => {
1717
it('works with some paths at root', () => {
1818
const tree = new PrefixTree(DEFAULT_OPTIONS)
19-
tree.insert('index.vue')
20-
tree.insert('a.vue')
21-
tree.insert('b.vue')
22-
tree.insert('c.vue')
19+
tree.insert('index')
20+
tree.insert('a')
21+
tree.insert('b')
22+
tree.insert('c')
2323
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
2424
"export interface RouteNamedMap {
2525
'/': RouteRecordInfo<'/', '/', Record<never, never>, Record<never, never>>,
@@ -32,13 +32,13 @@ describe('generateRouteNamedMap', () => {
3232

3333
it('adds params', () => {
3434
const tree = new PrefixTree(DEFAULT_OPTIONS)
35-
tree.insert('[a].vue')
36-
tree.insert('partial-[a].vue')
37-
tree.insert('[[a]].vue') // optional
38-
tree.insert('partial-[[a]].vue') // partial-optional
39-
tree.insert('[a]+.vue') // repeated
40-
tree.insert('[[a]]+.vue') // optional repeated
41-
tree.insert('[...a].vue') // splat
35+
tree.insert('[a]')
36+
tree.insert('partial-[a]')
37+
tree.insert('[[a]]') // optional
38+
tree.insert('partial-[[a]]') // partial-optional
39+
tree.insert('[a]+') // repeated
40+
tree.insert('[[a]]+') // optional repeated
41+
tree.insert('[...a]') // splat
4242
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
4343
"export interface RouteNamedMap {
4444
'/[a]': RouteRecordInfo<'/[a]', '/:a', { a: ParamValue<true> }, { a: ParamValue<false> }>,
@@ -68,10 +68,10 @@ describe('generateRouteNamedMap', () => {
6868

6969
it('handles nested params in folders', () => {
7070
const tree = new PrefixTree(DEFAULT_OPTIONS)
71-
tree.insert('n/[a]/index.vue') // normal
72-
tree.insert('n/[a]/other.vue')
73-
tree.insert('n/[a]/[b].vue')
74-
tree.insert('n/[a]/[c]/other-[d].vue')
71+
tree.insert('n/[a]/index') // normal
72+
tree.insert('n/[a]/other')
73+
tree.insert('n/[a]/[b]')
74+
tree.insert('n/[a]/[c]/other-[d]')
7575
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
7676
"export interface RouteNamedMap {
7777
'/n/[a]/': RouteRecordInfo<'/n/[a]/', '/n/:a', { a: ParamValue<true> }, { a: ParamValue<false> }>,
@@ -84,12 +84,12 @@ describe('generateRouteNamedMap', () => {
8484

8585
it('adds nested params', () => {
8686
const tree = new PrefixTree(DEFAULT_OPTIONS)
87-
tree.insert('n/[a].vue') // normal
88-
// tree.insert('n/partial-[a].vue') // partial
89-
tree.insert('n/[[a]].vue') // optional
90-
tree.insert('n/[a]+.vue') // repeated
91-
tree.insert('n/[[a]]+.vue') // optional repeated
92-
tree.insert('n/[...a].vue') // splat
87+
tree.insert('n/[a]') // normal
88+
// tree.insert('n/partial-[a]') // partial
89+
tree.insert('n/[[a]]') // optional
90+
tree.insert('n/[a]+') // repeated
91+
tree.insert('n/[[a]]+') // optional repeated
92+
tree.insert('n/[...a]') // splat
9393
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
9494
"export interface RouteNamedMap {
9595
'/n/[a]': RouteRecordInfo<'/n/[a]', '/n/:a', { a: ParamValue<true> }, { a: ParamValue<false> }>,
@@ -108,9 +108,9 @@ describe('generateRouteNamedMap', () => {
108108
})
109109
)
110110

111-
tree.insert('[lang]/index.vue', 'src/pages/index.vue')
112-
tree.insert('[lang]/a.vue', 'src/pages/a.vue')
113-
tree.insert('[lang]/[id].vue', 'src/pages/[id].vue')
111+
tree.insert('[lang]/index', 'src/pages/index.vue')
112+
tree.insert('[lang]/a', 'src/pages/a.vue')
113+
tree.insert('[lang]/[id]', 'src/pages/[id].vue')
114114

115115
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
116116
"export interface RouteNamedMap {
@@ -123,14 +123,14 @@ describe('generateRouteNamedMap', () => {
123123

124124
it('nested children', () => {
125125
const tree = new PrefixTree(DEFAULT_OPTIONS)
126-
tree.insert('a/a.vue')
127-
tree.insert('a/b.vue')
128-
tree.insert('a/c.vue')
129-
tree.insert('b/b.vue')
130-
tree.insert('b/c.vue')
131-
tree.insert('b/d.vue')
132-
tree.insert('c.vue')
133-
tree.insert('d.vue')
126+
tree.insert('a/a')
127+
tree.insert('a/b')
128+
tree.insert('a/c')
129+
tree.insert('b/b')
130+
tree.insert('b/c')
131+
tree.insert('b/d')
132+
tree.insert('c')
133+
tree.insert('d')
134134
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
135135
"export interface RouteNamedMap {
136136
'/a/a': RouteRecordInfo<'/a/a', '/a/a', Record<never, never>, Record<never, never>>,
@@ -147,9 +147,9 @@ describe('generateRouteNamedMap', () => {
147147

148148
it('keeps parent path overrides', () => {
149149
const tree = new PrefixTree(DEFAULT_OPTIONS)
150-
const parent = tree.insert('parent.vue')
151-
const child = tree.insert('parent/child.vue')
152-
parent.value.setOverride('parent.vue', { path: '/' })
150+
const parent = tree.insert('parent')
151+
const child = tree.insert('parent/child')
152+
parent.value.setOverride('parent', { path: '/' })
153153
expect(child.fullPath).toBe('/child')
154154
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
155155
"export interface RouteNamedMap {
@@ -166,9 +166,9 @@ describe('generateRouteNamedMap', () => {
166166
})
167167
)
168168

169-
tree.insert('[lang]/index.vue', 'src/pages/index.vue')
170-
tree.insert('[lang]/a.vue', 'src/pages/a.vue')
171-
tree.insert('[lang]/[id].vue', 'src/pages/[id].vue')
169+
tree.insert('[lang]/index', 'src/pages/index.vue')
170+
tree.insert('[lang]/a', 'src/pages/a.vue')
171+
tree.insert('[lang]/[id]', 'src/pages/[id].vue')
172172

173173
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
174174
"export interface RouteNamedMap {
@@ -178,32 +178,6 @@ describe('generateRouteNamedMap', () => {
178178
}"
179179
`)
180180
})
181-
182-
// https://github.com/posva/unplugin-vue-router/issues/274
183-
it('removes routeFolders.extensions from the path', () => {
184-
const tree = new PrefixTree(
185-
resolveOptions({
186-
extensions: ['.pagina.vue'],
187-
routesFolder: [
188-
{ src: 'src/pages', extensions: ['.page.vue'] },
189-
{ src: 'src/paginas', extensions: ['.pagina.md'] },
190-
],
191-
})
192-
)
193-
194-
tree.insert('other.pagina.md', resolve('src/paginas/other.pagina.md'))
195-
tree.insert('index.page.vue', resolve('src/pages/index.page.vue'))
196-
tree.insert('about.page.vue', resolve('src/pages/about.page.vue'))
197-
tree.insert('ignored.pagina.vue', resolve('src/pages/ignored.pagine.vue'))
198-
199-
expect(formatExports(generateRouteNamedMap(tree))).toMatchInlineSnapshot(`
200-
"export interface RouteNamedMap {
201-
'/': RouteRecordInfo<'/', '/', Record<never, never>, Record<never, never>>,
202-
'/about': RouteRecordInfo<'/about', '/about', Record<never, never>, Record<never, never>>,
203-
'/other': RouteRecordInfo<'/other', '/other', Record<never, never>, Record<never, never>>,
204-
}"
205-
`)
206-
})
207181
})
208182

209183
/**

0 commit comments

Comments
 (0)