diff --git a/package.json b/package.json index 6576379e1..27f7dbb01 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,7 @@ "typescript": "^4.9.5", "unplugin-auto-import": "^0.15.0", "vite": "^4.1.4", + "vite-plugin-vue-markdown": "^0.22.4", "vitest": "^0.29.1", "vue": "^3.2.47", "vue-router": "^4.1.6", diff --git a/playground/src/docs/real/index.md b/playground/src/docs/real/index.md new file mode 100644 index 000000000..aaeb4563e --- /dev/null +++ b/playground/src/docs/real/index.md @@ -0,0 +1 @@ +# Only some pages should be included diff --git a/playground/src/docs/should-be-ignored.md b/playground/src/docs/should-be-ignored.md new file mode 100644 index 000000000..2906c608d --- /dev/null +++ b/playground/src/docs/should-be-ignored.md @@ -0,0 +1,3 @@ +# Ignored + +This file is at the root so it will get ignored diff --git a/playground/typed-router.d.ts b/playground/typed-router.d.ts index d2b1a12a2..dbd0013c5 100644 --- a/playground/typed-router.d.ts +++ b/playground/typed-router.d.ts @@ -53,8 +53,7 @@ declare module 'vue-router/auto/routes' { 'deep the most rebel': RouteRecordInfo<'deep the most rebel', '/deep-most-rebel', Record, Record>, '/deep/nesting/works/custom-path': RouteRecordInfo<'/deep/nesting/works/custom-path', '/deep-surprise-:id(\d+)', Record, Record>, 'deep a rebel': RouteRecordInfo<'deep a rebel', '/deep/nesting/works/custom-name', Record, Record>, - '/docs/:lang/': RouteRecordInfo<'/docs/:lang/', '/docs/:lang', Record, Record>, - '/docs/:lang/about': RouteRecordInfo<'/docs/:lang/about', '/docs/:lang/about', Record, Record>, + '/docs/:lang/real/': RouteRecordInfo<'/docs/:lang/real/', '/docs/:lang/real', Record, Record>, '/from-root': RouteRecordInfo<'/from-root', '/from-root', Record, Record>, 'the most rebel': RouteRecordInfo<'the most rebel', '/most-rebel', Record, Record>, '/multiple-[a]-[b]-params': RouteRecordInfo<'/multiple-[a]-[b]-params', '/multiple-:a-:b-params', { a: ParamValue, b: ParamValue }, { a: ParamValue, b: ParamValue }>, diff --git a/playground/vite.config.ts b/playground/vite.config.ts index f517a92a8..4c53b7ef5 100644 --- a/playground/vite.config.ts +++ b/playground/vite.config.ts @@ -1,6 +1,7 @@ import { fileURLToPath, URL } from 'url' import { defineConfig } from 'vite' import Inspect from 'vite-plugin-inspect' +import Markdown from 'vite-plugin-vue-markdown' // @ts-ignore: the plugin should not be checked in the playground import VueRouter from '../src/vite' import { @@ -81,6 +82,8 @@ export default defineConfig({ { src: 'src/docs', path: 'docs/:lang/', + filePatterns: ['*/**/*'], + extensions: ['.md'], }, // { // src: 'src/features/', @@ -99,7 +102,10 @@ export default defineConfig({ // './src/pages/**/*.spec.ts', ], }), - Vue({}), + Vue({ + include: [/\.vue$/, /\.md$/] + }), + Markdown(), AutoImport({ imports: [VueRouterAutoImports], }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b3965fc0b..b9ef8b1b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,7 @@ importers: unplugin: ^1.1.0 unplugin-auto-import: ^0.15.0 vite: ^4.1.4 + vite-plugin-vue-markdown: ^0.22.4 vitest: ^0.29.1 vue: ^3.2.47 vue-router: ^4.1.6 @@ -77,6 +78,7 @@ importers: typescript: 4.9.5 unplugin-auto-import: 0.15.0_rollup@3.17.3 vite: 4.1.4 + vite-plugin-vue-markdown: 0.22.4_rollup@3.17.3+vite@4.1.4 vitest: 0.29.1 vue: 3.2.47 vue-router: 4.1.6_vue@3.2.47 @@ -1121,6 +1123,26 @@ packages: - supports-color dev: true + /@mdit-vue/plugin-component/0.11.2: + resolution: {integrity: sha512-ucFiEULCkLcCG1Tf1MfG5u5PS4BIXWIeKGHRGsXxz1ix2GbZWKFVgWEdNEckBu8s75Fv1WJLIOiAYZyri2f1nw==} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: true + + /@mdit-vue/plugin-frontmatter/0.11.1: + resolution: {integrity: sha512-AdZJInjD1pTJXlfhuoBS5ycuIQ3ewBfY0R/XHM3TRDEaDHQJHxouUCpCyijZmpdljTU45lFetIowaKtAi7GBog==} + dependencies: + '@mdit-vue/types': 0.11.0 + '@types/markdown-it': 12.2.3 + gray-matter: 4.0.3 + markdown-it: 13.0.1 + dev: true + + /@mdit-vue/types/0.11.0: + resolution: {integrity: sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ==} + dev: true + /@netlify/functions/1.4.0: resolution: {integrity: sha512-gy7ULTIRroc2/jyFVGx1djCmmBMVisIwrvkqggq5B6iDcInRSy2Tpkm+V5C63hKJVkNRskKWtLQKm9ecCaQTjA==} engines: {node: '>=8.3.0'} @@ -1737,6 +1759,21 @@ packages: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true + /@types/linkify-it/3.0.2: + resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} + dev: true + + /@types/markdown-it/12.2.3: + resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + dependencies: + '@types/linkify-it': 3.0.2 + '@types/mdurl': 1.0.2 + dev: true + + /@types/mdurl/1.0.2: + resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} + dev: true + /@types/mime/1.3.2: resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} dev: true @@ -2747,6 +2784,16 @@ packages: readable-stream: 3.6.0 dev: true + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: true @@ -4528,6 +4575,11 @@ packages: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true + /entities/3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + dev: true + /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -4854,6 +4906,12 @@ packages: tsx: 3.8.0 dev: true + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -5009,6 +5067,13 @@ packages: - supports-color dev: true + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + /external-editor/3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} @@ -5504,6 +5569,16 @@ packages: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true + /gray-matter/4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: true + /gzip-size/6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -5928,6 +6003,11 @@ packages: hasBin: true dev: true + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6141,6 +6221,14 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -6247,6 +6335,12 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /linkify-it/4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + dependencies: + uc.micro: 1.0.6 + dev: true + /lint-staged/13.1.2_enquirer@2.3.6: resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==} engines: {node: ^14.13.1 || >=16.0.0} @@ -6568,10 +6662,25 @@ packages: engines: {node: '>=8'} dev: true + /markdown-it/13.0.1: + resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} + hasBin: true + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + dev: true + /mdn-data/2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} dev: true + /mdurl/1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: true + /media-typer/0.3.0: resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} @@ -8844,6 +8953,14 @@ packages: /scule/1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + /section-matter/1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: true + /select-hose/2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} dev: true @@ -9171,6 +9288,10 @@ packages: readable-stream: 3.6.0 dev: true + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + /ssri/8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -9273,6 +9394,11 @@ packages: ansi-regex: 6.0.1 dev: true + /strip-bom-string/1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: true + /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -9782,6 +9908,10 @@ packages: hasBin: true dev: true + /uc.micro/1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + dev: true + /ufo/1.0.1: resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} dev: true @@ -10179,6 +10309,23 @@ packages: - supports-color dev: true + /vite-plugin-vue-markdown/0.22.4_rollup@3.17.3+vite@4.1.4: + resolution: {integrity: sha512-+kDzqGI5Lq0Wa6M4EJtV7cqOIHgGp6g4jcazXljQKLl9Og4fRs6FuGAPa2HiJ44Z9es85LAPiPbTjwrZEGEUKA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0-0 || ^4.0.0 + dependencies: + '@antfu/utils': 0.7.2 + '@mdit-vue/plugin-component': 0.11.2 + '@mdit-vue/plugin-frontmatter': 0.11.1 + '@mdit-vue/types': 0.11.0 + '@rollup/pluginutils': 5.0.2_rollup@3.17.3 + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + vite: 4.1.4 + transitivePeerDependencies: + - rollup + dev: true + /vite/4.1.4: resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} diff --git a/src/core/context.ts b/src/core/context.ts index c1d76a7e1..ba60dd812 100644 --- a/src/core/context.ts +++ b/src/core/context.ts @@ -55,7 +55,7 @@ export function createRoutesContext(options: ResolvedOptions) { } const globalPattern = appendExtensionListToPattern( - options.filePattern, + options.filePatterns, options.extensions ) @@ -67,9 +67,9 @@ export function createRoutesContext(options: ResolvedOptions) { } // override the pattern if the folder has a custom pattern - const pattern = folder.filePattern + const pattern = folder.filePatterns ? appendExtensionListToPattern( - folder.filePattern, + folder.filePatterns, // also override the extensions if the folder has a custom extensions folder.extensions || options.extensions ) diff --git a/src/core/utils.ts b/src/core/utils.ts index 66e0a2364..a0949f303 100644 --- a/src/core/utils.ts +++ b/src/core/utils.ts @@ -260,15 +260,17 @@ export function asRoutePath( * @returns */ export function appendExtensionListToPattern( - filePattern: string, + filePatterns: string | string[], extensions: string[] -) { - return ( - filePattern + - (extensions.length === 1 +): string[] | string { + const extensionPattern = + extensions.length === 1 ? extensions[0] : `.{${extensions .map((extension) => extension.replace('.', '')) - .join(',')}}`) - ) + .join(',')}}` + + return Array.isArray(filePatterns) + ? filePatterns.map((filePattern) => `${filePattern}${extensionPattern}`) + : `${filePatterns}${extensionPattern}` } diff --git a/src/options.ts b/src/options.ts index b88784e9b..81fd656a5 100644 --- a/src/options.ts +++ b/src/options.ts @@ -19,7 +19,7 @@ export interface RoutesFolderOption { /** * Allows to override the global `filePattern` option for this folder. */ - filePattern?: string + filePatterns?: string | string[] /** * Allows to override the global `extensions` option for this folder. @@ -56,7 +56,7 @@ export interface ResolvedOptions { * e.g. `**‍/*.{vue,md}` if `extensions` is set to `['.vue', '.md']`. * @default "**‍/*" */ - filePattern: string + filePatterns: string | string[] /** * Method to generate the name of a route. @@ -137,7 +137,7 @@ export const DEFAULT_OPTIONS: ResolvedOptions = { extensions: ['.vue'], exclude: [], routesFolder: [{ src: 'src/pages' }], - filePattern: '**/*', + filePatterns: '**/*', routeBlockLang: 'json5', getRouteName: getFileBasedRouteName, dataFetching: false,