mirror of
https://github.com/nuxt/nuxt.git
synced 2025-01-30 23:32:38 +00:00
Co-authored-by: Pooya Parsa <pyapar@gmail.com>
This commit is contained in:
parent
f7153a3172
commit
a3058eebae
@ -27,7 +27,7 @@
|
|||||||
"estree-walker": "^2.0.2",
|
"estree-walker": "^2.0.2",
|
||||||
"fs-extra": "^10.0.0",
|
"fs-extra": "^10.0.0",
|
||||||
"magic-string": "^0.25.7",
|
"magic-string": "^0.25.7",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"node-fetch": "^3.0.0",
|
"node-fetch": "^3.0.0",
|
||||||
"nuxi": "3.0.0",
|
"nuxi": "3.0.0",
|
||||||
"nuxt-vite": "^0.3.5",
|
"nuxt-vite": "^0.3.5",
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
"hookable": "^5.0.0",
|
"hookable": "^5.0.0",
|
||||||
"jiti": "^1.12.9",
|
"jiti": "^1.12.9",
|
||||||
"lodash.template": "^4.5.0",
|
"lodash.template": "^4.5.0",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"pathe": "^0.2.0",
|
"pathe": "^0.2.0",
|
||||||
"pkg-types": "^0.2.1",
|
"pkg-types": "^0.2.1",
|
||||||
"rc9": "^1.2.0",
|
"rc9": "^1.2.0",
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
"jiti": "^1.12.9",
|
"jiti": "^1.12.9",
|
||||||
"listhen": "^0.2.5",
|
"listhen": "^0.2.5",
|
||||||
"mime": "^2.5.2",
|
"mime": "^2.5.2",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"node-fetch": "^3.0.0",
|
"node-fetch": "^3.0.0",
|
||||||
"ohmyfetch": "^0.3.1",
|
"ohmyfetch": "^0.3.1",
|
||||||
"ora": "^6.0.1",
|
"ora": "^6.0.1",
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
"flat": "^5.0.2",
|
"flat": "^5.0.2",
|
||||||
"jiti": "^1.12.9",
|
"jiti": "^1.12.9",
|
||||||
"listhen": "^0.2.5",
|
"listhen": "^0.2.5",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"mri": "^1.2.0",
|
"mri": "^1.2.0",
|
||||||
"p-debounce": "^4.0.0",
|
"p-debounce": "^4.0.0",
|
||||||
"pathe": "^0.2.0",
|
"pathe": "^0.2.0",
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
"hash-sum": "^2.0.0",
|
"hash-sum": "^2.0.0",
|
||||||
"hookable": "^5.0.0",
|
"hookable": "^5.0.0",
|
||||||
"ignore": "^5.1.8",
|
"ignore": "^5.1.8",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"murmurhash-es": "^0.1.1",
|
"murmurhash-es": "^0.1.1",
|
||||||
"nuxi": "3.0.0",
|
"nuxi": "3.0.0",
|
||||||
"ohmyfetch": "^0.3.1",
|
"ohmyfetch": "^0.3.1",
|
||||||
|
@ -163,13 +163,17 @@ function parseSegment (segment: string) {
|
|||||||
state = SegmentParserState.catchall
|
state = SegmentParserState.catchall
|
||||||
}
|
}
|
||||||
if (c === ']') {
|
if (c === ']') {
|
||||||
consumeBuffer()
|
if (!buffer) {
|
||||||
|
throw new Error('Empty param')
|
||||||
|
} else {
|
||||||
|
consumeBuffer()
|
||||||
|
}
|
||||||
state = SegmentParserState.initial
|
state = SegmentParserState.initial
|
||||||
} else if (PARAM_CHAR_RE.test(c)) {
|
} else if (PARAM_CHAR_RE.test(c)) {
|
||||||
buffer += c
|
buffer += c
|
||||||
} else {
|
} else {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Ignored character "${c}" while building param "${buffer}" from "segment"`)
|
// console.debug(`[pages]Ignored character "${c}" while building param "${buffer}" from "segment"`)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
193
packages/nuxt3/test/pages.test.ts
Normal file
193
packages/nuxt3/test/pages.test.ts
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
import { expect } from 'chai'
|
||||||
|
import { generateRoutesFromFiles } from '../src/pages/utils'
|
||||||
|
|
||||||
|
describe('pages:generateRoutesFromFiles', () => {
|
||||||
|
const pagesDir = 'pages'
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
description: 'should generate correct route for 404',
|
||||||
|
files: [`${pagesDir}/404.vue`],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: '404',
|
||||||
|
path: '/:catchAll(.*)*',
|
||||||
|
file: `${pagesDir}/404.vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct routes for index pages',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/index.vue`,
|
||||||
|
`${pagesDir}/parent/index.vue`,
|
||||||
|
`${pagesDir}/parent/child/index.vue`
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'index',
|
||||||
|
path: '/',
|
||||||
|
file: `${pagesDir}/index.vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'parent',
|
||||||
|
path: '/parent',
|
||||||
|
file: `${pagesDir}/parent/index.vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'parent-child',
|
||||||
|
path: '/parent/child',
|
||||||
|
file: `${pagesDir}/parent/child/index.vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct routes for parent/child',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/parent.vue`,
|
||||||
|
`${pagesDir}/parent/child.vue`
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'parent',
|
||||||
|
path: '/parent',
|
||||||
|
file: `${pagesDir}/parent.vue`,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
name: 'parent-child',
|
||||||
|
path: 'child',
|
||||||
|
file: `${pagesDir}/parent/child.vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct route for snake_case file',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/snake_case.vue`
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'snake_case',
|
||||||
|
path: '/snake_case',
|
||||||
|
file: `${pagesDir}/snake_case.vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct route for kebab-case file',
|
||||||
|
files: [`${pagesDir}/kebab-case.vue`],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'kebab-case',
|
||||||
|
path: '/kebab-case',
|
||||||
|
file: `${pagesDir}/kebab-case.vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct dynamic routes',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/[slug].vue`,
|
||||||
|
`${pagesDir}/sub/[slug].vue`,
|
||||||
|
`${pagesDir}/[sub]/route-[slug].vue`
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'slug',
|
||||||
|
path: '/:slug?',
|
||||||
|
file: `${pagesDir}/[slug].vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'sub-slug',
|
||||||
|
path: '/sub/:slug?',
|
||||||
|
file: `${pagesDir}/sub/[slug].vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'sub-route-slug',
|
||||||
|
path: '/:sub/route-:slug',
|
||||||
|
file: `${pagesDir}/[sub]/route-[slug].vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should generate correct catch-all route',
|
||||||
|
files: [`${pagesDir}/[...slug].vue`],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'slug',
|
||||||
|
path: '/:slug(.*)*',
|
||||||
|
file: `${pagesDir}/[...slug].vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should throw unfinished param error for dynamic route',
|
||||||
|
files: [`${pagesDir}/[slug.vue`],
|
||||||
|
error: 'Unfinished param "slug"'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should throw empty param error for dynamic route',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/[].vue`
|
||||||
|
],
|
||||||
|
error: 'Empty param'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: 'should only allow "_" & "." as special character for dynamic route',
|
||||||
|
files: [
|
||||||
|
`${pagesDir}/[a1_1a].vue`,
|
||||||
|
`${pagesDir}/[b2.2b].vue`,
|
||||||
|
`${pagesDir}/[c3@3c].vue`,
|
||||||
|
`${pagesDir}/[d4-4d].vue`
|
||||||
|
],
|
||||||
|
output: [
|
||||||
|
{
|
||||||
|
name: 'a1_1a',
|
||||||
|
path: '/:a1_1a?',
|
||||||
|
file: `${pagesDir}/[a1_1a].vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'b2.2b',
|
||||||
|
path: '/:b2.2b?',
|
||||||
|
file: `${pagesDir}/[b2.2b].vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'c33c',
|
||||||
|
path: '/:c33c?',
|
||||||
|
file: `${pagesDir}/[c3@3c].vue`,
|
||||||
|
children: []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'd44d',
|
||||||
|
path: '/:d44d?',
|
||||||
|
file: `${pagesDir}/[d4-4d].vue`,
|
||||||
|
children: []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
for (const test of tests) {
|
||||||
|
it(test.description, async () => {
|
||||||
|
if (test.error) {
|
||||||
|
expect(() => generateRoutesFromFiles(test.files, pagesDir)).to.throws(test.error)
|
||||||
|
} else {
|
||||||
|
expect(await generateRoutesFromFiles(test.files, pagesDir)).to.deep.equal(test.output)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
@ -34,7 +34,7 @@
|
|||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"memfs": "^3.3.0",
|
"memfs": "^3.3.0",
|
||||||
"mini-css-extract-plugin": "^2.4.2",
|
"mini-css-extract-plugin": "^2.4.2",
|
||||||
"mlly": "^0.2.10",
|
"mlly": "^0.3.0",
|
||||||
"pathe": "^0.2.0",
|
"pathe": "^0.2.0",
|
||||||
"pify": "^5.0.0",
|
"pify": "^5.0.0",
|
||||||
"postcss": "^8.3.9",
|
"postcss": "^8.3.9",
|
||||||
|
28
yarn.lock
28
yarn.lock
@ -2401,7 +2401,7 @@ __metadata:
|
|||||||
estree-walker: ^2.0.2
|
estree-walker: ^2.0.2
|
||||||
fs-extra: ^10.0.0
|
fs-extra: ^10.0.0
|
||||||
magic-string: ^0.25.7
|
magic-string: ^0.25.7
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
node-fetch: ^3.0.0
|
node-fetch: ^3.0.0
|
||||||
nuxi: 3.0.0
|
nuxi: 3.0.0
|
||||||
nuxt-vite: ^0.3.5
|
nuxt-vite: ^0.3.5
|
||||||
@ -2591,7 +2591,7 @@ __metadata:
|
|||||||
hookable: ^5.0.0
|
hookable: ^5.0.0
|
||||||
jiti: ^1.12.9
|
jiti: ^1.12.9
|
||||||
lodash.template: ^4.5.0
|
lodash.template: ^4.5.0
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
pathe: ^0.2.0
|
pathe: ^0.2.0
|
||||||
pkg-types: ^0.2.1
|
pkg-types: ^0.2.1
|
||||||
rc9: ^1.2.0
|
rc9: ^1.2.0
|
||||||
@ -2663,7 +2663,7 @@ __metadata:
|
|||||||
jiti: ^1.12.9
|
jiti: ^1.12.9
|
||||||
listhen: ^0.2.5
|
listhen: ^0.2.5
|
||||||
mime: ^2.5.2
|
mime: ^2.5.2
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
node-fetch: ^3.0.0
|
node-fetch: ^3.0.0
|
||||||
ohmyfetch: ^0.3.1
|
ohmyfetch: ^0.3.1
|
||||||
ora: ^6.0.1
|
ora: ^6.0.1
|
||||||
@ -2887,7 +2887,7 @@ __metadata:
|
|||||||
lodash-es: ^4.17.21
|
lodash-es: ^4.17.21
|
||||||
memfs: ^3.3.0
|
memfs: ^3.3.0
|
||||||
mini-css-extract-plugin: ^2.4.2
|
mini-css-extract-plugin: ^2.4.2
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
pathe: ^0.2.0
|
pathe: ^0.2.0
|
||||||
pify: ^5.0.0
|
pify: ^5.0.0
|
||||||
postcss: ^8.3.9
|
postcss: ^8.3.9
|
||||||
@ -13031,15 +13031,6 @@ fsevents@~2.3.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"mlly@npm:^0.2.10":
|
|
||||||
version: 0.2.10
|
|
||||||
resolution: "mlly@npm:0.2.10"
|
|
||||||
dependencies:
|
|
||||||
import-meta-resolve: ^1.1.1
|
|
||||||
checksum: a7b9f9e046389eb8263ae57bf6738084dd40319ce1608b31dd66a72baf15e35bfb9d8a7dcde33f4c6f3b5da4788b8e94c65e9fa519c508ab5b339f4e6de255bc
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"mlly@npm:^0.2.6":
|
"mlly@npm:^0.2.6":
|
||||||
version: 0.2.9
|
version: 0.2.9
|
||||||
resolution: "mlly@npm:0.2.9"
|
resolution: "mlly@npm:0.2.9"
|
||||||
@ -13049,6 +13040,13 @@ fsevents@~2.3.2:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"mlly@npm:^0.3.0":
|
||||||
|
version: 0.3.0
|
||||||
|
resolution: "mlly@npm:0.3.0"
|
||||||
|
checksum: be9bf1fd8bd547425073462496e2bd6c7affab00bc7bb075d9ddb19f6c748ecbc1e691ed5ec3d2862aac987091b90113494a5d24109e10e5ac01ea2ac5ef3782
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"mocha@npm:^9.1.3":
|
"mocha@npm:^9.1.3":
|
||||||
version: 9.1.3
|
version: 9.1.3
|
||||||
resolution: "mocha@npm:9.1.3"
|
resolution: "mocha@npm:9.1.3"
|
||||||
@ -13806,7 +13804,7 @@ fsevents@~2.3.2:
|
|||||||
fsevents: ~2.3.2
|
fsevents: ~2.3.2
|
||||||
jiti: ^1.12.9
|
jiti: ^1.12.9
|
||||||
listhen: ^0.2.5
|
listhen: ^0.2.5
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
mri: ^1.2.0
|
mri: ^1.2.0
|
||||||
p-debounce: ^4.0.0
|
p-debounce: ^4.0.0
|
||||||
pathe: ^0.2.0
|
pathe: ^0.2.0
|
||||||
@ -13904,7 +13902,7 @@ fsevents@~2.3.2:
|
|||||||
hash-sum: ^2.0.0
|
hash-sum: ^2.0.0
|
||||||
hookable: ^5.0.0
|
hookable: ^5.0.0
|
||||||
ignore: ^5.1.8
|
ignore: ^5.1.8
|
||||||
mlly: ^0.2.10
|
mlly: ^0.3.0
|
||||||
murmurhash-es: ^0.1.1
|
murmurhash-es: ^0.1.1
|
||||||
nuxi: 3.0.0
|
nuxi: 3.0.0
|
||||||
ohmyfetch: ^0.3.1
|
ohmyfetch: ^0.3.1
|
||||||
|
Loading…
Reference in New Issue
Block a user