vite-plugin-pages2 0.34.11 → 0.34.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -74,23 +74,12 @@ var cacheAllRouteRE = /^\[\.{3}(.*)\]$/;
74
74
  var replaceDynamicRouteRE = /^\[(?:\.{3})?(.*)\]$/;
75
75
  var nuxtDynamicRouteRE = /^_(.*)$/;
76
76
  var nuxtCacheAllRouteRE = /^_$/;
77
- var countSlashRE = /\//g;
78
77
  var replaceIndexRE = /\/?index$/;
79
78
 
80
79
  // src/context.ts
81
80
  var import_node_path4 = require("path");
82
81
  var import_node_process2 = __toESM(require("process"), 1);
83
82
 
84
- // node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs
85
- function toArray(array) {
86
- array = array != null ? array : [];
87
- return Array.isArray(array) ? array : [array];
88
- }
89
- function slash(str) {
90
- return str.replace(/\\/g, "/");
91
- }
92
- var VOID = Symbol("p-void");
93
-
94
83
  // src/files.ts
95
84
  var import_node_path2 = require("path");
96
85
  var import_tinyglobby = require("tinyglobby");
@@ -100,6 +89,15 @@ var import_node_path = require("path");
100
89
  var import_node_url = require("url");
101
90
  var import_debug = __toESM(require("debug"), 1);
102
91
  var import_micromatch = __toESM(require("micromatch"), 1);
92
+ var slashRE = /\\/g;
93
+ function slash(str) {
94
+ return str.replace(slashRE, "/");
95
+ }
96
+ function toArray(value) {
97
+ if (value == null)
98
+ return [];
99
+ return Array.isArray(value) ? value : [value];
100
+ }
103
101
  var debug = {
104
102
  hmr: (0, import_debug.default)("vite-plugin-pages:hmr"),
105
103
  routeBlock: (0, import_debug.default)("vite-plugin-pages:routeBlock"),
@@ -114,7 +112,12 @@ function extsToGlob(extensions) {
114
112
  return extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0] || "";
115
113
  }
116
114
  function countSlash(value) {
117
- return (value.match(countSlashRE) || []).length;
115
+ let count = 0;
116
+ for (let i = 0; i < value.length; i++) {
117
+ if (value[i] === "/")
118
+ count++;
119
+ }
120
+ return count;
118
121
  }
119
122
  function isPagesDir(path, options) {
120
123
  for (const page of options.dirs) {
@@ -281,7 +284,7 @@ var multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//g;
281
284
  var singlelineCommentsRE = /\/\/.*/g;
282
285
  var VUE_MD_EXT_RE2 = /(\s)/g;
283
286
  function replaceFunction(_, value) {
284
- if (typeof value === "function" || typeof value === "function") {
287
+ if (typeof value === "function") {
285
288
  const fnBody = value.toString().replace(multilineCommentsRE, "").replace(singlelineCommentsRE, "").replace(VUE_MD_EXT_RE2, "");
286
289
  if (fnBody.length < 8 || fnBody.substring(0, 8) !== "function")
287
290
  return `_NuFrRa_${fnBody}`;
@@ -332,6 +335,27 @@ export default routes;`;
332
335
 
333
336
  // src/resolvers/react.ts
334
337
  var VUE_MD_EXT_RE3 = /^\//;
338
+ function sortReactRoutes(routes) {
339
+ routes.sort((a, b) => {
340
+ const weight = (r) => {
341
+ var _a;
342
+ const p = (_a = r.path) != null ? _a : "";
343
+ if (p === "/")
344
+ return 0;
345
+ if (p === "*")
346
+ return 3;
347
+ if (p.startsWith(":"))
348
+ return 2;
349
+ return 1;
350
+ };
351
+ return weight(a) - weight(b);
352
+ });
353
+ for (const route of routes) {
354
+ if (route.children)
355
+ sortReactRoutes(route.children);
356
+ }
357
+ return routes;
358
+ }
335
359
  function prepareRoutes(routes, options, parent) {
336
360
  var _a, _b;
337
361
  for (const route of routes) {
@@ -386,6 +410,7 @@ async function computeReactRoutes(ctx) {
386
410
  parentRoutes.push(route);
387
411
  }
388
412
  });
413
+ sortReactRoutes(routes);
389
414
  let finalRoutes = prepareRoutes(routes, ctx.options);
390
415
  finalRoutes = await ((_b = (_a = ctx.options).onRoutesGenerated) == null ? void 0 : _b.call(_a, finalRoutes)) || finalRoutes;
391
416
  return finalRoutes;
@@ -517,12 +542,13 @@ var import_dequal = require("dequal");
517
542
  var import_picocolors = __toESM(require("picocolors"), 1);
518
543
 
519
544
  // src/customBlock.ts
520
- var import_node_fs = __toESM(require("fs"), 1);
545
+ var import_promises = require("fs/promises");
521
546
  var import_extract_comments = __toESM(require("extract-comments"), 1);
522
547
  var import_json5 = __toESM(require("json5"), 1);
523
548
  var import_local_pkg = require("local-pkg");
524
549
  var import_yaml = require("yaml");
525
550
  var routeJSXReg = /^\s+(route)\s+/gm;
551
+ var _compilerSfc;
526
552
  function parseJSX(code) {
527
553
  return (0, import_extract_comments.default)(code).slice(0, 1).filter((comment) => routeJSXReg.test(comment.value) && comment.value.includes(":") && comment.loc.start.line === 1);
528
554
  }
@@ -542,7 +568,9 @@ ${err.message}`);
542
568
  }
543
569
  async function parseSFC(code) {
544
570
  try {
545
- const { parse } = await (0, import_local_pkg.importModule)("@vue/compiler-sfc");
571
+ if (!_compilerSfc)
572
+ _compilerSfc = await (0, import_local_pkg.importModule)("@vue/compiler-sfc");
573
+ const { parse } = _compilerSfc;
546
574
  return parse(code, {
547
575
  pad: "space"
548
576
  }).descriptor || parse({
@@ -580,7 +608,7 @@ ${err.message}`);
580
608
  }
581
609
  }
582
610
  async function getRouteBlock(path, options) {
583
- const content = import_node_fs.default.readFileSync(path, "utf8");
611
+ const content = await (0, import_promises.readFile)(path, "utf8");
584
612
  const parsedSFC = await parseSFC(content);
585
613
  const blockStr = parsedSFC == null ? void 0 : parsedSFC.customBlocks.find((b) => b.type === "route");
586
614
  const parsedJSX = parseJSX(content);
@@ -598,9 +626,10 @@ async function getRouteBlock(path, options) {
598
626
  var VUE_MD_EXT_RE5 = /^\//;
599
627
  function prepareRoutes3(ctx, routes, parent) {
600
628
  var _a, _b, _c, _d;
629
+ const indexSuffixRE = new RegExp(`${ctx.options.routeNameSeparator}index$`);
601
630
  for (const route of routes) {
602
631
  if (route.name)
603
- route.name = route.name.replace(new RegExp(`${ctx.options.routeNameSeparator}index$`), "");
632
+ route.name = route.name.replace(indexSuffixRE, "");
604
633
  if (parent)
605
634
  route.path = (_a = route.path) == null ? void 0 : _a.replace(VUE_MD_EXT_RE5, "");
606
635
  if (route.children)
@@ -622,6 +651,7 @@ async function computeVueRoutes(ctx, customBlockMap) {
622
651
  const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options;
623
652
  const pageRoutes = [...ctx.pageRouteMap.values()].sort((a, b) => countSlash(a.route) - countSlash(b.route));
624
653
  const routes = [];
654
+ const routePaths = new Set(pageRoutes.map((p) => p.route));
625
655
  pageRoutes.forEach((page) => {
626
656
  const pathNodes = page.route.split("/");
627
657
  const component = importPath === "relative" ? page.path.replace(ctx.root, "") : page.path;
@@ -664,10 +694,7 @@ async function computeVueRoutes(ctx, customBlockMap) {
664
694
  else
665
695
  route.path += "(.*)";
666
696
  } else if (nuxtStyle && i === pathNodes.length - 1) {
667
- const isIndexFound = pageRoutes.find(({ route: route2 }) => {
668
- return route2 === page.route.replace(pathNodes[i], "index");
669
- });
670
- if (!isIndexFound)
697
+ if (!routePaths.has(page.route.replace(pathNodes[i], "index")))
671
698
  route.path += "?";
672
699
  }
673
700
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/context.ts","../node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs","../src/files.ts","../src/utils.ts","../src/options.ts","../src/stringify.ts","../src/resolvers/react.ts","../src/resolvers/solid.ts","../src/resolvers/vue.ts","../src/customBlock.ts"],"sourcesContent":["import type { Plugin } from 'vite'\r\nimport type { UserOptions } from './types'\r\nimport { MODULE_ID_VIRTUAL, ROUTE_BLOCK_ID_VIRTUAL, routeBlockQueryRE } from './constants'\r\n\r\nimport { PageContext } from './context'\r\nimport { parsePageRequest } from './utils'\r\n\r\nfunction pagesPlugin(userOptions: UserOptions = {}): Plugin {\r\n let ctx: PageContext\r\n\r\n return {\r\n name: 'vite-plugin-pages',\r\n enforce: 'pre',\r\n async configResolved(config) {\r\n // auto set resolver for react project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('vite:react'))\r\n ) {\r\n userOptions.resolver = 'react'\r\n }\r\n\r\n // auto set resolver for solid project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('solid'))\r\n ) {\r\n userOptions.resolver = 'solid'\r\n }\r\n\r\n ctx = new PageContext(userOptions, config.root)\r\n ctx.setLogger(config.logger)\r\n await ctx.searchGlob()\r\n },\r\n api: {\r\n getResolvedRoutes() {\r\n return ctx.options.resolver.getComputedRoutes(ctx)\r\n },\r\n },\r\n configureServer(server) {\r\n ctx.setupViteServer(server)\r\n },\r\n resolveId(id) {\r\n if (ctx.options.moduleIds.includes(id))\r\n return `${MODULE_ID_VIRTUAL}?id=${id}`\r\n\r\n if (routeBlockQueryRE.test(id))\r\n return ROUTE_BLOCK_ID_VIRTUAL\r\n\r\n return null\r\n },\r\n async load(id) {\r\n const {\r\n moduleId,\r\n pageId,\r\n } = parsePageRequest(id)\r\n\r\n if (moduleId === MODULE_ID_VIRTUAL && pageId && ctx.options.moduleIds.includes(pageId))\r\n return ctx.resolveRoutes()\r\n\r\n if (id === ROUTE_BLOCK_ID_VIRTUAL) {\r\n return {\r\n code: 'export default {};',\r\n map: null,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n }\r\n}\r\n\r\nexport { syncIndexResolver } from './options'\r\nexport type {\r\n ReactRoute,\r\n SolidRoute,\r\n VueRoute,\r\n} from './resolvers'\r\n\r\nexport {\r\n reactResolver,\r\n solidResolver,\r\n vueResolver,\r\n} from './resolvers'\r\nexport * from './types'\r\nexport { PageContext }\r\nexport default pagesPlugin\r\n","export const MODULE_IDS = [\r\n '~pages',\r\n '~react-pages',\r\n '~solid-pages',\r\n 'pages-generated',\r\n 'virtual:generated-pages',\r\n 'virtual:generated-pages-react',\r\n]\r\n\r\nexport const MODULE_ID_VIRTUAL = 'virtual:vite-plugin-pages/generated-pages'\r\nexport const ROUTE_BLOCK_ID_VIRTUAL = 'virtual:vite-plugin-pages/route-block'\r\nexport const ROUTE_IMPORT_NAME = '__pages_import_$1__'\r\n\r\nexport const routeBlockQueryRE = /\\?vue&type=route/\r\n\r\nexport const dynamicRouteRE = /^\\[(.+)\\]$/\r\nexport const cacheAllRouteRE = /^\\[\\.{3}(.*)\\]$/\r\nexport const replaceDynamicRouteRE = /^\\[(?:\\.{3})?(.*)\\]$/\r\n\r\nexport const nuxtDynamicRouteRE = /^_(.*)$/\r\nexport const nuxtCacheAllRouteRE = /^_$/\r\n\r\nexport const countSlashRE = /\\//g\r\n\r\nexport const replaceIndexRE = /\\/?index$/\r\n","import type { Logger, ViteDevServer } from 'vite'\r\nimport type { PageOptions, ResolvedOptions, UserOptions } from './types'\r\nimport { join, resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { slash, toArray } from '@antfu/utils'\r\nimport { getPageFiles } from './files'\r\nimport { resolveOptions } from './options'\r\n\r\nimport { debug, invalidatePagesModule, isTarget } from './utils'\r\n\r\nexport interface PageRoute {\r\n path: string\r\n route: string\r\n}\r\n\r\nexport class PageContext {\r\n private _server: ViteDevServer | undefined\r\n private _pageRouteMap = new Map<string, PageRoute>()\r\n\r\n rawOptions: UserOptions\r\n root: string\r\n options: ResolvedOptions\r\n logger?: Logger\r\n\r\n constructor(userOptions: UserOptions, viteRoot: string = process.cwd()) {\r\n this.rawOptions = userOptions\r\n this.root = slash(viteRoot)\r\n debug.env('root', this.root)\r\n this.options = resolveOptions(userOptions, this.root)\r\n debug.options(this.options)\r\n }\r\n\r\n setLogger(logger: Logger) {\r\n this.logger = logger\r\n }\r\n\r\n setupViteServer(server: ViteDevServer) {\r\n if (this._server === server)\r\n return\r\n\r\n this._server = server\r\n this.setupWatcher(server.watcher)\r\n }\r\n\r\n setupWatcher(watcher: ViteDevServer['watcher']) {\r\n watcher\r\n .on('unlink', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n await this.removePage(path)\r\n this.onUpdate()\r\n })\r\n watcher\r\n .on('add', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this.options.dirs.find(i => path.startsWith(slash(resolve(this.root, i.dir))))!\r\n await this.addPage(path, page)\r\n this.onUpdate()\r\n })\r\n\r\n watcher\r\n .on('change', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this._pageRouteMap.get(path)\r\n if (page)\r\n await this.options.resolver.hmr?.changed?.(this, path)\r\n })\r\n }\r\n\r\n async addPage(path: string | string[], pageDir: PageOptions) {\r\n debug.pages('add', path)\r\n for (const p of toArray(path)) {\r\n const pageDirPath = slash(resolve(this.root, pageDir.dir))\r\n const extension = this.options.extensions.find(ext => p.endsWith(`.${ext}`))\r\n if (!extension)\r\n continue\r\n\r\n const route = slash(join(pageDir.baseRoute, p.replace(`${pageDirPath}/`, '').replace(`.${extension}`, '')))\r\n this._pageRouteMap.set(p, {\r\n path: p,\r\n route,\r\n })\r\n await this.options.resolver.hmr?.added?.(this, p)\r\n }\r\n }\r\n\r\n async removePage(path: string) {\r\n debug.pages('remove', path)\r\n this._pageRouteMap.delete(path)\r\n await this.options.resolver.hmr?.removed?.(this, path)\r\n }\r\n\r\n onUpdate() {\r\n if (!this._server)\r\n return\r\n\r\n invalidatePagesModule(this._server)\r\n debug.hmr('Reload generated pages.')\r\n this._server.ws.send({\r\n type: 'full-reload',\r\n })\r\n }\r\n\r\n async resolveRoutes() {\r\n return this.options.resolver.resolveRoutes(this)\r\n }\r\n\r\n async searchGlob() {\r\n const pageDirFiles = this.options.dirs.map((page) => {\r\n const pagesDirPath = slash(resolve(this.options.root, page.dir))\r\n const files = getPageFiles(pagesDirPath, this.options, page)\r\n debug.search(page.dir, files)\r\n return {\r\n ...page,\r\n files: files.map(file => slash(file)),\r\n }\r\n })\r\n\r\n for (const page of pageDirFiles)\r\n await this.addPage(page.files, page)\r\n\r\n debug.cache(this.pageRouteMap)\r\n }\r\n\r\n get debug() {\r\n return debug\r\n }\r\n\r\n get pageRouteMap() {\r\n return this._pageRouteMap\r\n }\r\n}\r\n","function clamp(n, min, max) {\n return Math.min(max, Math.max(min, n));\n}\nfunction sum(...args) {\n return flattenArrayable(args).reduce((a, b) => a + b, 0);\n}\nfunction lerp(min, max, t) {\n const interpolation = clamp(t, 0, 1);\n return min + (max - min) * interpolation;\n}\nfunction remap(n, inMin, inMax, outMin, outMax) {\n const interpolation = (n - inMin) / (inMax - inMin);\n return lerp(outMin, outMax, interpolation);\n}\n\nfunction toArray(array) {\n array = array ?? [];\n return Array.isArray(array) ? array : [array];\n}\nfunction flattenArrayable(array) {\n return toArray(array).flat(1);\n}\nfunction mergeArrayable(...args) {\n return args.flatMap((i) => toArray(i));\n}\nfunction partition(array, ...filters) {\n const result = Array.from({ length: filters.length + 1 }).fill(null).map(() => []);\n array.forEach((e, idx, arr) => {\n let i = 0;\n for (const filter of filters) {\n if (filter(e, idx, arr)) {\n result[i].push(e);\n return;\n }\n i += 1;\n }\n result[i].push(e);\n });\n return result;\n}\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueBy(array, equalFn) {\n return array.reduce((acc, cur) => {\n const index = acc.findIndex((item) => equalFn(cur, item));\n if (index === -1)\n acc.push(cur);\n return acc;\n }, []);\n}\nfunction last(array) {\n return at(array, -1);\n}\nfunction remove(array, value) {\n if (!array)\n return false;\n const index = array.indexOf(value);\n if (index >= 0) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\nfunction at(array, index) {\n const len = array.length;\n if (!len)\n return void 0;\n if (index < 0)\n index += len;\n return array[index];\n}\nfunction range(...args) {\n let start, stop, step;\n if (args.length === 1) {\n start = 0;\n step = 1;\n [stop] = args;\n } else {\n [start, stop, step = 1] = args;\n }\n const arr = [];\n let current = start;\n while (current < stop) {\n arr.push(current);\n current += step || 1;\n }\n return arr;\n}\nfunction move(arr, from, to) {\n arr.splice(to, 0, arr.splice(from, 1)[0]);\n return arr;\n}\nfunction clampArrayRange(n, arr) {\n return clamp(n, 0, arr.length - 1);\n}\nfunction sample(arr, quantity) {\n return Array.from({ length: quantity }, (_) => arr[Math.round(Math.random() * (arr.length - 1))]);\n}\nfunction shuffle(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\nfunction filterInPlace(array, predicate) {\n for (let i = array.length; i--; i >= 0) {\n if (!predicate(array[i], i, array))\n array.splice(i, 1);\n }\n return array;\n}\n\nfunction assert(condition, message) {\n if (!condition)\n throw new Error(message);\n}\nconst toString = (v) => Object.prototype.toString.call(v);\nfunction getTypeName(v) {\n if (v === null)\n return \"null\";\n const type = toString(v).slice(8, -1).toLowerCase();\n return typeof v === \"object\" || typeof v === \"function\" ? type : typeof v;\n}\nfunction noop() {\n}\n\nfunction isDeepEqual(value1, value2) {\n const type1 = getTypeName(value1);\n const type2 = getTypeName(value2);\n if (type1 !== type2)\n return false;\n if (type1 === \"array\") {\n if (value1.length !== value2.length)\n return false;\n return value1.every((item, i) => {\n return isDeepEqual(item, value2[i]);\n });\n }\n if (type1 === \"object\") {\n const keyArr = Object.keys(value1);\n if (keyArr.length !== Object.keys(value2).length)\n return false;\n return keyArr.every((key) => {\n return isDeepEqual(value1[key], value2[key]);\n });\n }\n return Object.is(value1, value2);\n}\n\nfunction batchInvoke(functions) {\n functions.forEach((fn) => fn && fn());\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction tap(value, callback) {\n callback(value);\n return value;\n}\n\nfunction notNullish(v) {\n return v != null;\n}\nfunction noNull(v) {\n return v !== null;\n}\nfunction notUndefined(v) {\n return v !== void 0;\n}\nfunction isTruthy(v) {\n return Boolean(v);\n}\n\nconst isDef = (val) => typeof val !== \"undefined\";\nconst isBoolean = (val) => typeof val === \"boolean\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isNumber = (val) => typeof val === \"number\";\nconst isString = (val) => typeof val === \"string\";\nconst isObject = (val) => toString(val) === \"[object Object]\";\nconst isUndefined = (val) => toString(val) === \"[object Undefined]\";\nconst isNull = (val) => toString(val) === \"[object Null]\";\nconst isRegExp = (val) => toString(val) === \"[object RegExp]\";\nconst isDate = (val) => toString(val) === \"[object Date]\";\nfunction isPrimitive(val) {\n return !val || Object(val) !== val;\n}\nconst isWindow = (val) => typeof window !== \"undefined\" && toString(val) === \"[object Window]\";\nconst isBrowser = typeof window !== \"undefined\";\n\nfunction slash(str) {\n return str.replace(/\\\\/g, \"/\");\n}\nfunction ensurePrefix(prefix, str) {\n if (!str.startsWith(prefix))\n return prefix + str;\n return str;\n}\nfunction ensureSuffix(suffix, str) {\n if (!str.endsWith(suffix))\n return str + suffix;\n return str;\n}\nfunction template(str, ...args) {\n const [firstArg, fallback] = args;\n if (isObject(firstArg)) {\n const vars = firstArg;\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => vars[key] || ((typeof fallback === \"function\" ? fallback(key) : fallback) ?? key));\n } else {\n return str.replace(/\\{(\\d+)\\}/g, (_, key) => {\n const index = Number(key);\n if (Number.isNaN(index))\n return key;\n return args[index];\n });\n }\n}\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction randomStr(size = 16, dict = urlAlphabet) {\n let id = \"\";\n let i = size;\n const len = dict.length;\n while (i--)\n id += dict[Math.random() * len | 0];\n return id;\n}\nfunction capitalize(str) {\n return str[0].toUpperCase() + str.slice(1).toLowerCase();\n}\nconst _reFullWs = /^\\s*$/;\nfunction unindent(str) {\n const lines = (typeof str === \"string\" ? str : str[0]).split(\"\\n\");\n const whitespaceLines = lines.map((line) => _reFullWs.test(line));\n const commonIndent = lines.reduce((min, line, idx) => {\n if (whitespaceLines[idx])\n return min;\n const indent = line.match(/^\\s*/)?.[0].length;\n return indent === void 0 ? min : Math.min(min, indent);\n }, Number.POSITIVE_INFINITY);\n let emptyLinesHead = 0;\n while (emptyLinesHead < lines.length && whitespaceLines[emptyLinesHead])\n emptyLinesHead++;\n let emptyLinesTail = 0;\n while (emptyLinesTail < lines.length && whitespaceLines[lines.length - emptyLinesTail - 1])\n emptyLinesTail++;\n return lines.slice(emptyLinesHead, lines.length - emptyLinesTail).map((line) => line.slice(commonIndent)).join(\"\\n\");\n}\n\nfunction objectMap(obj, fn) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => fn(k, v)).filter(notNullish)\n );\n}\nfunction isKeyOf(obj, k) {\n return k in obj;\n}\nfunction objectKeys(obj) {\n return Object.keys(obj);\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction deepMerge(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (source === void 0)\n return target;\n if (isMergableObject(target) && isMergableObject(source)) {\n objectKeys(source).forEach((key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\")\n return;\n if (isMergableObject(source[key])) {\n if (!target[key])\n target[key] = {};\n if (isMergableObject(target[key])) {\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n } else {\n target[key] = source[key];\n }\n });\n }\n return deepMerge(target, ...sources);\n}\nfunction deepMergeWithArray(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (source === void 0)\n return target;\n if (Array.isArray(target) && Array.isArray(source))\n target.push(...source);\n if (isMergableObject(target) && isMergableObject(source)) {\n objectKeys(source).forEach((key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\")\n return;\n if (Array.isArray(source[key])) {\n if (!target[key])\n target[key] = [];\n deepMergeWithArray(target[key], source[key]);\n } else if (isMergableObject(source[key])) {\n if (!target[key])\n target[key] = {};\n deepMergeWithArray(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n });\n }\n return deepMergeWithArray(target, ...sources);\n}\nfunction isMergableObject(item) {\n return isObject(item) && !Array.isArray(item);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction clearUndefined(obj) {\n Object.keys(obj).forEach((key) => obj[key] === void 0 ? delete obj[key] : {});\n return obj;\n}\nfunction hasOwnProperty(obj, v) {\n if (obj == null)\n return false;\n return Object.prototype.hasOwnProperty.call(obj, v);\n}\nconst _objectIdMap = /* @__PURE__ */ new WeakMap();\nfunction objectId(obj) {\n if (isPrimitive(obj))\n return obj;\n if (!_objectIdMap.has(obj)) {\n _objectIdMap.set(obj, randomStr());\n }\n return _objectIdMap.get(obj);\n}\n\n/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nclass Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n\nfunction pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tmap: {\n\t\t\tasync value(array, function_) {\n\t\t\t\tconst promises = array.map((value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n\nconst VOID = Symbol(\"p-void\");\nclass PInstance extends Promise {\n constructor(items = [], options) {\n super(() => {\n });\n this.items = items;\n this.options = options;\n }\n promises = /* @__PURE__ */ new Set();\n get promise() {\n let batch;\n const items = [...Array.from(this.items), ...Array.from(this.promises)];\n if (this.options?.concurrency) {\n const limit = pLimit(this.options.concurrency);\n batch = Promise.all(items.map((p2) => limit(() => p2)));\n } else {\n batch = Promise.all(items);\n }\n return batch.then((l) => l.filter((i) => i !== VOID));\n }\n add(...args) {\n args.forEach((i) => {\n this.promises.add(i);\n });\n }\n map(fn) {\n return new PInstance(\n Array.from(this.items).map(async (i, idx) => {\n const v = await i;\n if (v === VOID)\n return VOID;\n return fn(v, idx);\n }),\n this.options\n );\n }\n filter(fn) {\n return new PInstance(\n Array.from(this.items).map(async (i, idx) => {\n const v = await i;\n const r = await fn(v, idx);\n if (!r)\n return VOID;\n return v;\n }),\n this.options\n );\n }\n forEach(fn) {\n return this.map(fn).then();\n }\n reduce(fn, initialValue) {\n return this.promise.then((array) => array.reduce(fn, initialValue));\n }\n clear() {\n this.promises.clear();\n }\n then(onfulfilled, onrejected) {\n return this.promise.then(onfulfilled, onrejected);\n }\n catch(fn) {\n return this.promise.catch(fn);\n }\n finally(fn) {\n return this.promise.finally(fn);\n }\n}\nfunction p(items, options) {\n return new PInstance(items, options);\n}\n\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction sleep(ms, callback) {\n return new Promise(\n (resolve) => setTimeout(async () => {\n await callback?.();\n resolve();\n }, ms)\n );\n}\nfunction createPromiseLock() {\n const locks = [];\n return {\n async run(fn) {\n const p = fn();\n locks.push(p);\n try {\n return await p;\n } finally {\n remove(locks, p);\n }\n },\n async wait() {\n await Promise.allSettled(locks);\n },\n isWaiting() {\n return Boolean(locks.length);\n },\n clear() {\n locks.length = 0;\n }\n };\n}\nfunction createControlledPromise() {\n let resolve, reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n}\n\nconst timestamp = () => +Date.now();\n\n/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher)\n * are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through,\n * as-is, to `callback` when the throttled-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.noTrailing] - Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds\n * while the throttled-function is being called. If noTrailing is false or unspecified, callback will be executed\n * one final time after the last throttled-function call. (After the throttled-function has not been called for\n * `delay` milliseconds, the internal counter is reset).\n * @param {boolean} [options.noLeading] - Optional, defaults to false. If noLeading is false, the first throttled-function call will execute callback\n * immediately. If noLeading is true, the first the callback execution will be skipped. It should be noted that\n * callback will never executed if both noLeading = true and noTrailing = true.\n * @param {boolean} [options.debounceMode] - If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is\n * false (at end), schedule `callback` to execute after `delay` ms.\n *\n * @returns {Function} A new, throttled, function.\n */\nfunction throttle$1 (delay, callback, options) {\n var _ref = options || {},\n _ref$noTrailing = _ref.noTrailing,\n noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing,\n _ref$noLeading = _ref.noLeading,\n noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading,\n _ref$debounceMode = _ref.debounceMode,\n debounceMode = _ref$debounceMode === void 0 ? undefined : _ref$debounceMode;\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n\n\n var timeoutID;\n var cancelled = false; // Keep track of the last time `callback` was executed.\n\n var lastExec = 0; // Function to clear existing timeout\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID);\n }\n } // Function to cancel next exec\n\n\n function cancel(options) {\n var _ref2 = options || {},\n _ref2$upcomingOnly = _ref2.upcomingOnly,\n upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly;\n\n clearExistingTimeout();\n cancelled = !upcomingOnly;\n }\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n\n\n function wrapper() {\n for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) {\n arguments_[_key] = arguments[_key];\n }\n\n var self = this;\n var elapsed = Date.now() - lastExec;\n\n if (cancelled) {\n return;\n } // Execute `callback` and update the `lastExec` timestamp.\n\n\n function exec() {\n lastExec = Date.now();\n callback.apply(self, arguments_);\n }\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n\n\n function clear() {\n timeoutID = undefined;\n }\n\n if (!noLeading && debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`\n * and noLeading != true.\n */\n exec();\n }\n\n clearExistingTimeout();\n\n if (debounceMode === undefined && elapsed > delay) {\n if (noLeading) {\n /*\n * In throttle mode with noLeading, if `delay` time has\n * been exceeded, update `lastExec` and schedule `callback`\n * to execute after `delay` ms.\n */\n lastExec = Date.now();\n\n if (!noTrailing) {\n timeoutID = setTimeout(debounceMode ? clear : exec, delay);\n }\n } else {\n /*\n * In throttle mode without noLeading, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec();\n }\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\n }\n }\n\n wrapper.cancel = cancel; // Return the wrapper function.\n\n return wrapper;\n}\n\n/* eslint-disable no-undefined */\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n *\n * @returns {Function} A new, debounced function.\n */\n\nfunction debounce$1 (delay, callback, options) {\n var _ref = options || {},\n _ref$atBegin = _ref.atBegin,\n atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin;\n\n return throttle$1(delay, callback, {\n debounceMode: atBegin !== false\n });\n}\n\nfunction throttle(...args) {\n return throttle$1(...args);\n}\nfunction debounce(...args) {\n return debounce$1(...args);\n}\n\nexport { assert, at, batchInvoke, capitalize, clamp, clampArrayRange, clearUndefined, createControlledPromise, createPromiseLock, createSingletonPromise, debounce, deepMerge, deepMergeWithArray, ensurePrefix, ensureSuffix, filterInPlace, flattenArrayable, getTypeName, hasOwnProperty, invoke, isBoolean, isBrowser, isDate, isDeepEqual, isDef, isFunction, isKeyOf, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isTruthy, isUndefined, isWindow, last, lerp, mergeArrayable, move, noNull, noop, notNullish, notUndefined, objectEntries, objectId, objectKeys, objectMap, objectOmit, objectPick, p, partition, randomStr, range, remap, remove, sample, shuffle, slash, sleep, sum, tap, template, throttle, timestamp, toArray, toString, unindent, uniq, uniqueBy };\n","import type { PageOptions, ResolvedOptions } from './types'\r\nimport { join } from 'node:path'\r\nimport { slash } from '@antfu/utils'\r\nimport { globSync } from 'tinyglobby'\r\n\r\nimport { extsToGlob } from './utils'\r\n\r\n/**\r\n * Resolves the page dirs for its for its given globs\r\n */\r\nconst VUE_MD_EXT_RE = /\\/$/\r\nexport function getPageDirs(PageOptions: PageOptions, root: string, exclude: string[]): PageOptions[] {\r\n const dirs = globSync(slash(PageOptions.dir), {\r\n ignore: exclude,\r\n onlyDirectories: true,\r\n dot: true,\r\n expandDirectories: false,\r\n cwd: root,\r\n })\r\n\r\n const pageDirs = dirs.map(dir => ({\r\n ...PageOptions,\r\n dir: dir.replace(VUE_MD_EXT_RE, ''),\r\n }))\r\n\r\n return pageDirs\r\n}\r\n\r\n/**\r\n * Resolves the files that are valid pages for the given context.\r\n */\r\nexport function getPageFiles(path: string, options: ResolvedOptions, pageOptions?: PageOptions): string[] {\r\n const {\r\n exclude,\r\n extensions,\r\n } = options\r\n\r\n const ext = extsToGlob(extensions)\r\n const pattern = pageOptions?.filePattern ?? `**/*.${ext}`\r\n\r\n const files = globSync(pattern, {\r\n ignore: exclude,\r\n onlyFiles: true,\r\n cwd: path,\r\n }).map(p => slash(join(path, p)))\r\n\r\n return files\r\n}\r\n","import type { ModuleNode, ViteDevServer } from 'vite'\r\nimport type { ResolvedOptions } from './types'\r\nimport { resolve, win32 } from 'node:path'\r\nimport { URLSearchParams } from 'node:url'\r\nimport { slash } from '@antfu/utils'\r\nimport Debug from 'debug'\r\nimport micromatch from 'micromatch'\r\n\r\nimport { cacheAllRouteRE, countSlashRE, dynamicRouteRE, MODULE_ID_VIRTUAL, nuxtCacheAllRouteRE, nuxtDynamicRouteRE, replaceDynamicRouteRE, replaceIndexRE } from './constants'\r\n\r\nexport const debug = {\r\n hmr: Debug('vite-plugin-pages:hmr'),\r\n routeBlock: Debug('vite-plugin-pages:routeBlock'),\r\n options: Debug('vite-plugin-pages:options'),\r\n pages: Debug('vite-plugin-pages:pages'),\r\n search: Debug('vite-plugin-pages:search'),\r\n env: Debug('vite-plugin-pages:env'),\r\n cache: Debug('vite-plugin-pages:cache'),\r\n resolver: Debug('vite-plugin-pages:resolver'),\r\n}\r\n\r\nexport function extsToGlob(extensions: string[]) {\r\n return extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0] || ''\r\n}\r\n\r\nexport function countSlash(value: string) {\r\n return (value.match(countSlashRE) || []).length\r\n}\r\n\r\nfunction isPagesDir(path: string, options: ResolvedOptions) {\r\n for (const page of options.dirs) {\r\n const dirPath = slash(resolve(options.root, page.dir))\r\n if (path.startsWith(dirPath))\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isTarget(path: string, options: ResolvedOptions) {\r\n return isPagesDir(path, options) && !micromatch.isMatch(path, options.exclude) && options.extensionsRE.test(path)\r\n}\r\n\r\nexport function isDynamicRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtDynamicRouteRE.test(routePath)\r\n : dynamicRouteRE.test(routePath)\r\n}\r\n\r\nexport function isCatchAllRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtCacheAllRouteRE.test(routePath)\r\n : cacheAllRouteRE.test(routePath)\r\n}\r\n\r\nexport function resolveImportMode(\r\n filepath: string,\r\n options: ResolvedOptions,\r\n) {\r\n const mode = options.importMode\r\n if (typeof mode === 'function')\r\n return mode(filepath, options)\r\n return mode\r\n}\r\n\r\nexport function invalidatePagesModule(server: ViteDevServer) {\r\n const { moduleGraph } = server\r\n const mods = moduleGraph.getModulesByFile(MODULE_ID_VIRTUAL)\r\n if (mods) {\r\n const seen = new Set<ModuleNode>()\r\n mods.forEach((mod) => {\r\n moduleGraph.invalidateModule(mod, seen)\r\n })\r\n }\r\n}\r\n\r\nexport function normalizeCase(str: string, caseSensitive: boolean) {\r\n if (!caseSensitive)\r\n return str.toLocaleLowerCase()\r\n return str\r\n}\r\n\r\nexport function normalizeName(name: string, isDynamic: boolean, nuxtStyle = false) {\r\n if (!isDynamic)\r\n return name\r\n\r\n return nuxtStyle\r\n ? name.replace(nuxtDynamicRouteRE, '$1') || 'all'\r\n : name.replace(replaceDynamicRouteRE, '$1')\r\n}\r\n\r\nexport function buildReactRoutePath(node: string, nuxtStyle = false): string | undefined {\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n\r\n if (isDynamic) {\r\n if (isCatchAll)\r\n return '*'\r\n\r\n return `:${normalizedName}`\r\n }\r\n\r\n return `${normalizedName}`\r\n}\r\n\r\n// https://github.dev/remix-run/remix/blob/264e3f8884c5cafd8d06acc3e01153b376745b7c/packages/remix-dev/config/routesConvention.ts#L105\r\nexport function buildReactRemixRoutePath(node: string): string | undefined {\r\n const escapeStart = '['\r\n const escapeEnd = ']'\r\n let result = ''\r\n let rawSegmentBuffer = ''\r\n\r\n let inEscapeSequence = 0\r\n let skipSegment = false\r\n for (let i = 0; i < node.length; i++) {\r\n const char = node.charAt(i)\r\n const lastChar = i > 0 ? node.charAt(i - 1) : undefined\r\n const nextChar = i < node.length - 1 ? node.charAt(i + 1) : undefined\r\n\r\n function isNewEscapeSequence() {\r\n return (\r\n !inEscapeSequence && char === escapeStart && lastChar !== escapeStart\r\n )\r\n }\r\n\r\n function isCloseEscapeSequence() {\r\n return inEscapeSequence && char === escapeEnd && nextChar !== escapeEnd\r\n }\r\n\r\n function isStartOfLayoutSegment() {\r\n return char === '_' && nextChar === '_' && !rawSegmentBuffer\r\n }\r\n\r\n if (skipSegment) {\r\n if (char === '/' || char === '.' || char === win32.sep)\r\n skipSegment = false\r\n\r\n continue\r\n }\r\n\r\n if (isNewEscapeSequence()) {\r\n inEscapeSequence++\r\n continue\r\n }\r\n\r\n if (isCloseEscapeSequence()) {\r\n inEscapeSequence--\r\n continue\r\n }\r\n\r\n if (inEscapeSequence) {\r\n result += char\r\n continue\r\n }\r\n\r\n if (char === '/' || char === win32.sep || char === '.') {\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n else result += '/'\r\n\r\n rawSegmentBuffer = ''\r\n continue\r\n }\r\n\r\n if (isStartOfLayoutSegment()) {\r\n skipSegment = true\r\n continue\r\n }\r\n\r\n rawSegmentBuffer += char\r\n\r\n if (char === '$') {\r\n result += typeof nextChar === 'undefined' ? '*' : ':'\r\n continue\r\n }\r\n\r\n result += char\r\n }\r\n\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n\r\n return result || undefined\r\n}\r\n\r\nexport function parsePageRequest(id: string) {\r\n const [moduleId, rawQuery] = id.split('?', 2)\r\n const query = new URLSearchParams(rawQuery)\r\n const pageId = query.get('id')\r\n return {\r\n moduleId,\r\n query,\r\n pageId,\r\n }\r\n}\r\n","import type { ImportModeResolver, ResolvedOptions, UserOptions } from './types'\r\nimport { resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { slash, toArray } from '@antfu/utils'\r\n\r\nimport { MODULE_IDS } from './constants'\r\nimport { getPageDirs } from './files'\r\nimport { reactResolver, solidResolver, vueResolver } from './resolvers'\r\n\r\nconst VUE_MD_EXT_RE = /^\\//\r\nconst VUE_MD_EXT_RE1 = /\\/$/\r\nfunction resolvePageDirs(dirs: UserOptions['dirs'], root: string, exclude: string[]) {\r\n dirs = toArray(dirs)\r\n return dirs.flatMap((dir) => {\r\n const option = typeof dir === 'string'\r\n ? { dir, baseRoute: '' }\r\n : dir\r\n\r\n option.dir = slash(resolve(root, option.dir)).replace(`${root}/`, '')\r\n option.baseRoute = option.baseRoute.replace(VUE_MD_EXT_RE, '').replace(VUE_MD_EXT_RE1, '')\r\n\r\n return getPageDirs(option, root, exclude)\r\n })\r\n}\r\n\r\nexport const syncIndexResolver: ImportModeResolver = (filepath, options) => {\r\n for (const page of options.dirs) {\r\n if (page.baseRoute === '' && filepath.startsWith(`/${page.dir}/index`))\r\n return 'sync'\r\n }\r\n return 'async'\r\n}\r\n\r\nfunction getResolver(originalResolver: UserOptions['resolver']) {\r\n let resolver = originalResolver || 'vue'\r\n\r\n if (typeof resolver !== 'string')\r\n return resolver\r\n\r\n switch (resolver) {\r\n case 'vue':\r\n resolver = vueResolver()\r\n break\r\n case 'react':\r\n resolver = reactResolver()\r\n break\r\n case 'solid':\r\n resolver = solidResolver()\r\n break\r\n default:\r\n throw new Error(`Unsupported resolver: ${resolver}`)\r\n }\r\n return resolver\r\n}\r\n\r\nexport function resolveOptions(userOptions: UserOptions, viteRoot?: string): ResolvedOptions {\r\n const {\r\n dirs = ['src/pages'],\r\n routeBlockLang = 'json5',\r\n exclude = ['node_modules', '.git', '**/__*__/**'],\r\n caseSensitive = false,\r\n routeNameSeparator = '-',\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n } = userOptions\r\n\r\n const root = viteRoot || slash(process.cwd())\r\n\r\n const importMode = userOptions.importMode || syncIndexResolver\r\n\r\n const importPath = userOptions.importPath || 'relative'\r\n\r\n const resolver = getResolver(userOptions.resolver)\r\n\r\n const extensions = userOptions.extensions || resolver.resolveExtensions()\r\n\r\n const extensionsRE = new RegExp(`\\\\.(${extensions.join('|')})$`)\r\n\r\n const resolvedDirs = resolvePageDirs(dirs, root, exclude)\r\n\r\n const routeStyle = userOptions.routeStyle || 'next'\r\n\r\n const moduleIds = userOptions.moduleId\r\n ? [userOptions.moduleId]\r\n : resolver.resolveModuleIds?.() || MODULE_IDS\r\n\r\n const resolvedOptions: ResolvedOptions = {\r\n dirs: resolvedDirs,\r\n routeStyle,\r\n routeBlockLang,\r\n moduleIds,\r\n root,\r\n extensions,\r\n importMode,\r\n importPath,\r\n exclude,\r\n caseSensitive,\r\n resolver,\r\n extensionsRE,\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n routeNameSeparator,\r\n }\r\n\r\n return resolvedOptions\r\n}\r\n","import type { ResolvedOptions } from './types'\r\nimport { ROUTE_IMPORT_NAME } from './constants'\r\n\r\nimport { resolveImportMode } from './utils'\r\n\r\nconst componentRE = /\"(?:component|element)\":(\"(.*?)\")/g\r\nconst hasFunctionRE = /\"(?:props|beforeEnter)\":(\"(.*?)\")/g\r\n\r\nconst multilineCommentsRE = /\\/\\*(.|[\\r\\n])*?\\*\\//g\r\nconst singlelineCommentsRE = /\\/\\/.*/g\r\nconst VUE_MD_EXT_RE = /(\\s)/g\r\nfunction replaceFunction(_: any, value: any) {\r\n if (typeof value === 'function' || typeof value === 'function') {\r\n const fnBody = value.toString()\r\n .replace(multilineCommentsRE, '')\r\n .replace(singlelineCommentsRE, '')\r\n .replace(VUE_MD_EXT_RE, '')\r\n\r\n // ES6 Arrow Function\r\n if (fnBody.length < 8 || fnBody.substring(0, 8) !== 'function')\r\n return `_NuFrRa_${fnBody}`\r\n\r\n return fnBody\r\n }\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * Creates a stringified Vue Router route definition.\r\n */\r\nexport function stringifyRoutes(\r\n preparedRoutes: any[],\r\n options: ResolvedOptions,\r\n) {\r\n const importsMap: Map<string, string> = new Map()\r\n\r\n function getImportString(path: string, importName: string) {\r\n const mode = resolveImportMode(path, options)\r\n return mode === 'sync'\r\n ? `import ${importName} from \"${path}\"`\r\n : `const ${importName} = ${\r\n options.resolver.stringify?.dynamicImport?.(path) || `() => import(\"${path}\")`\r\n }`\r\n }\r\n\r\n function componentReplacer(str: string, replaceStr: string, path: string) {\r\n let importName = importsMap.get(path)\r\n\r\n if (!importName)\r\n importName = ROUTE_IMPORT_NAME.replace('$1', `${importsMap.size}`)\r\n\r\n importsMap.set(path, importName)\r\n\r\n importName = options.resolver.stringify?.component?.(importName) || importName\r\n\r\n return str.replace(replaceStr, importName)\r\n }\r\n\r\n function functionReplacer(str: string, replaceStr: string, content: string) {\r\n if (content.startsWith('function'))\r\n return str.replace(replaceStr, content)\r\n\r\n if (content.startsWith('_NuFrRa_'))\r\n return str.replace(replaceStr, content.slice(8))\r\n\r\n return str\r\n }\r\n\r\n const stringRoutes = JSON\r\n .stringify(preparedRoutes, replaceFunction)\r\n .replace(componentRE, componentReplacer)\r\n .replace(hasFunctionRE, functionReplacer)\r\n\r\n const imports = Array.from(importsMap).map(args => getImportString(...args))\r\n\r\n return {\r\n imports,\r\n stringRoutes,\r\n }\r\n}\r\n\r\nexport function generateClientCode(routes: any[], options: ResolvedOptions) {\r\n const { imports, stringRoutes } = stringifyRoutes(routes, options)\r\n const code = `${imports.join(';\\n')};\\n\\nconst routes = ${stringRoutes};\\n\\nexport default routes;`\r\n return options.resolver.stringify?.final?.(code) || code\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface ReactRouteBase {\r\n caseSensitive?: boolean\r\n children?: ReactRouteBase[]\r\n element?: string\r\n index?: boolean\r\n path?: string\r\n rawRoute: string\r\n}\r\n\r\nexport interface ReactRoute extends Omit<Optional<ReactRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: ReactRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n routes: ReactRoute[],\r\n options: ResolvedOptions,\r\n parent?: ReactRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(route.children, options, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeReactRoutes(ctx: PageContext): Promise<ReactRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: ReactRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n\r\n const route: ReactRouteBase = {\r\n caseSensitive,\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n if (i === pathNodes.length - 1)\r\n route.element = element\r\n\r\n const isIndexRoute = normalizeCase(node, caseSensitive).endsWith('index')\r\n\r\n if (!route.path && isIndexRoute) {\r\n route.path = '/'\r\n }\r\n else if (!isIndexRoute) {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node)\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle)\r\n }\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exits in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n const exits = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exits)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(routes, ctx.options)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveReactRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeReactRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function reactResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~react-pages', 'virtual:generated-pages-react']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveReactRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeReactRoutes(ctx)\r\n },\r\n stringify: {\r\n component: path => `React.createElement(${path})`,\r\n dynamicImport: path => `React.lazy(() => import(\"${path}\"))`,\r\n final: code => `import React from \"react\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface SolidRouteBase {\r\n rawRoute: string\r\n path: string\r\n children?: SolidRouteBase[]\r\n component?: string\r\n element?: string\r\n}\r\n\r\nexport interface SolidRoute extends Omit<Optional<SolidRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: SolidRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n options: ResolvedOptions,\r\n routes: SolidRoute[],\r\n parent?: SolidRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(options, route.children, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeSolidRoutes(ctx: PageContext): Promise<SolidRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: SolidRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const normalizedPath = normalizeCase(node, caseSensitive)\r\n\r\n const route: SolidRouteBase = {\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n // Check parent exists\r\n const parent = parentRoutes.find(parent =>\r\n pathNodes.slice(0, i).join('/') === parent.rawRoute,\r\n )\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n if (i === pathNodes.length - 1) {\r\n route.element = element\r\n route.component = component\r\n }\r\n\r\n if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node) || ''\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle) || ''\r\n }\r\n\r\n const exist = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exist)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(ctx.options, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveSolidRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeSolidRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function solidResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~solid-pages']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveSolidRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeSolidRoutes(ctx)\r\n },\r\n stringify: {\r\n dynamicImport: path => `Solid.lazy(() => import(\"${path}\"))`,\r\n final: code => `import * as Solid from \"solid-js\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { CustomBlock, Optional, PageResolver } from '../types'\r\nimport { dequal } from 'dequal'\r\nimport colors from 'picocolors'\r\n\r\nimport { getRouteBlock } from '../customBlock'\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n countSlash,\r\n isCatchAllRoute,\r\n isDynamicRoute,\r\n normalizeCase,\r\n normalizeName,\r\n} from '../utils'\r\n\r\nexport interface VueRouteBase {\r\n name: string\r\n path: string\r\n props?: boolean\r\n component: string\r\n children?: VueRouteBase[]\r\n customBlock?: CustomBlock\r\n rawRoute: string\r\n}\r\n\r\nexport interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'children'> {\r\n children?: VueRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n ctx: PageContext,\r\n routes: VueRoute[],\r\n parent?: VueRoute,\r\n) {\r\n for (const route of routes) {\r\n if (route.name)\r\n route.name = route.name.replace(new RegExp(`${ctx.options.routeNameSeparator}index$`), '')\r\n\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(ctx, route.children, route)\r\n\r\n if (route.children?.find(c => c.name === route.name))\r\n delete route.name\r\n\r\n route.props = true\r\n\r\n delete route.rawRoute\r\n\r\n if (route.customBlock) {\r\n Object.assign(route, route.customBlock || {})\r\n delete route.customBlock\r\n }\r\n\r\n Object.assign(route, ctx.options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>): Promise<VueRoute[]> {\r\n const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: VueRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n // add leading slash to component path if not already there\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const customBlock = customBlockMap.get(page.path)\r\n\r\n const route: VueRouteBase = {\r\n name: '',\r\n path: '',\r\n component,\r\n customBlock,\r\n rawRoute: page.route,\r\n }\r\n\r\n let parentRoutes = routes\r\n let dynamicRoute = false\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n const normalizedPath = normalizeCase(normalizedName, caseSensitive)\r\n\r\n if (isDynamic)\r\n dynamicRoute = true\r\n\r\n route.name += route.name ? `${routeNameSeparator}${normalizedName}` : normalizedName\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n // Reset path\r\n route.path = ''\r\n }\r\n else if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (isDynamic) {\r\n route.path += `/:${normalizedName}`\r\n // Catch-all route\r\n if (isCatchAll) {\r\n if (i === 0)\r\n // root cache all route include children\r\n route.path += '(.*)*'\r\n else\r\n // nested cache all route not include children\r\n route.path += '(.*)'\r\n }\r\n else if (nuxtStyle && i === pathNodes.length - 1) {\r\n // we need to search if the folder provide `index.vue`\r\n const isIndexFound = pageRoutes.find(({ route }) => {\r\n return route === page.route.replace(pathNodes[i], 'index')\r\n })\r\n if (!isIndexFound)\r\n route.path += '?'\r\n }\r\n }\r\n else {\r\n route.path += `/${normalizedPath}`\r\n }\r\n }\r\n }\r\n\r\n // put dynamic routes at the end\r\n if (dynamicRoute)\r\n parentRoutes.push(route)\r\n else\r\n parentRoutes.unshift(route)\r\n })\r\n\r\n let finalRoutes = prepareRoutes(ctx, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>) {\r\n const finalRoutes = await computeVueRoutes(ctx, customBlockMap)\r\n\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function vueResolver(): PageResolver {\r\n const customBlockMap = new Map<string, CustomBlock>()\r\n\r\n async function checkCustomBlockChange(ctx: PageContext, path: string) {\r\n const exitsCustomBlock = customBlockMap.get(path)\r\n let customBlock: CustomBlock | undefined\r\n try {\r\n customBlock = await getRouteBlock(path, ctx.options)\r\n }\r\n catch (error: any) {\r\n ctx.logger?.error(colors.red(`[vite-plugin-pages] ${error.message}`))\r\n return\r\n }\r\n if (!exitsCustomBlock && !customBlock)\r\n return\r\n\r\n if (!customBlock) {\r\n customBlockMap.delete(path)\r\n ctx.debug.routeBlock('%s deleted', path)\r\n return\r\n }\r\n if (!exitsCustomBlock || !dequal(exitsCustomBlock, customBlock)) {\r\n ctx.debug.routeBlock('%s old: %O', path, exitsCustomBlock)\r\n ctx.debug.routeBlock('%s new: %O', path, customBlock)\r\n customBlockMap.set(path, customBlock)\r\n ctx.onUpdate()\r\n }\r\n }\r\n\r\n return {\r\n resolveExtensions() {\r\n return ['vue', 'ts', 'js']\r\n },\r\n resolveModuleIds() {\r\n return ['~pages', 'pages-generated', 'virtual:generated-pages']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveVueRoutes(ctx, customBlockMap)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeVueRoutes(ctx, customBlockMap)\r\n },\r\n hmr: {\r\n added: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n changed: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n removed: async (_ctx, path) => {\r\n customBlockMap.delete(path)\r\n },\r\n },\r\n }\r\n}\r\n","import type { SFCBlock, SFCDescriptor } from '@vue/compiler-sfc'\r\nimport type { CustomBlock, ParsedJSX, ResolvedOptions } from './types'\r\nimport fs from 'node:fs'\r\n\r\n// @ts-expect-error no type\r\nimport extractComments from 'extract-comments'\r\n\r\nimport JSON5 from 'json5'\r\nimport { importModule } from 'local-pkg'\r\nimport { parse as YAMLParser } from 'yaml'\r\nimport { debug } from './utils'\r\n\r\nconst routeJSXReg = /^\\s+(route)\\s+/gm\r\n\r\nexport function parseJSX(code: string): ParsedJSX[] {\r\n return extractComments(code).slice(0, 1).filter((comment: ParsedJSX) => routeJSXReg.test(comment.value) && comment.value.includes(':') && comment.loc.start.line === 1)\r\n}\r\n\r\nexport function parseYamlComment(code: ParsedJSX[], path: string): CustomBlock {\r\n return code.reduce((memo, item) => {\r\n const { value } = item\r\n const v = value.replace(routeJSXReg, '')\r\n debug.routeBlock(`use ${v} parser`)\r\n try {\r\n const yamlResult = YAMLParser(v)\r\n\r\n return {\r\n ...memo,\r\n ...yamlResult,\r\n }\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of comment in ${path}\\n${err.message}`)\r\n }\r\n }, {})\r\n}\r\n\r\nexport async function parseSFC(code: string): Promise<SFCDescriptor> {\r\n try {\r\n const { parse } = await importModule('@vue/compiler-sfc') as typeof import('@vue/compiler-sfc')\r\n return parse(code, {\r\n pad: 'space',\r\n }).descriptor\r\n // for @vue/compiler-sfc ^2.7\r\n || (parse as any)({\r\n source: code,\r\n })\r\n }\r\n catch {\r\n throw new Error('[vite-plugin-pages] Vue3\\'s \"@vue/compiler-sfc\" is required.')\r\n }\r\n}\r\n\r\nexport function parseCustomBlock(block: SFCBlock, filePath: string, options: ResolvedOptions): any {\r\n const lang = block.lang ?? options.routeBlockLang\r\n\r\n debug.routeBlock(`use ${lang} parser`)\r\n\r\n if (lang === 'json5') {\r\n try {\r\n return JSON5.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON5 format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'json') {\r\n try {\r\n return JSON.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'yaml' || lang === 'yml') {\r\n try {\r\n return YAMLParser(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n}\r\n\r\nexport async function getRouteBlock(path: string, options: ResolvedOptions) {\r\n const content = fs.readFileSync(path, 'utf8')\r\n\r\n const parsedSFC = await parseSFC(content)\r\n const blockStr = parsedSFC?.customBlocks.find(b => b.type === 'route')\r\n\r\n const parsedJSX = parseJSX(content)\r\n\r\n if (!blockStr && parsedJSX.length === 0)\r\n return\r\n\r\n let result\r\n\r\n if (blockStr)\r\n result = parseCustomBlock(blockStr, path, options) as CustomBlock\r\n\r\n if (parsedJSX.length > 0)\r\n result = parseYamlComment(parsedJSX, path) as CustomBlock\r\n\r\n return result\r\n}\r\n"],"mappings":"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","names":["import_node_path","import_node_process","import_node_path","Debug","micromatch","isNewEscapeSequence","isCloseEscapeSequence","isStartOfLayoutSegment","import_node_path","VUE_MD_EXT_RE","VUE_MD_EXT_RE","parent","VUE_MD_EXT_RE","prepareRoutes","parent","extractComments","YAMLParser","JSON5","fs","VUE_MD_EXT_RE","prepareRoutes","parent","route","colors","VUE_MD_EXT_RE","process","process"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/context.ts","../src/files.ts","../src/utils.ts","../src/options.ts","../src/stringify.ts","../src/resolvers/react.ts","../src/resolvers/solid.ts","../src/resolvers/vue.ts","../src/customBlock.ts"],"sourcesContent":["import type { Plugin } from 'vite'\r\nimport type { UserOptions } from './types'\r\nimport { MODULE_ID_VIRTUAL, ROUTE_BLOCK_ID_VIRTUAL, routeBlockQueryRE } from './constants'\r\n\r\nimport { PageContext } from './context'\r\nimport { parsePageRequest } from './utils'\r\n\r\nfunction pagesPlugin(userOptions: UserOptions = {}): Plugin {\r\n let ctx: PageContext\r\n\r\n return {\r\n name: 'vite-plugin-pages',\r\n enforce: 'pre',\r\n async configResolved(config) {\r\n // auto set resolver for react project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('vite:react'))\r\n ) {\r\n userOptions.resolver = 'react'\r\n }\r\n\r\n // auto set resolver for solid project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('solid'))\r\n ) {\r\n userOptions.resolver = 'solid'\r\n }\r\n\r\n ctx = new PageContext(userOptions, config.root)\r\n ctx.setLogger(config.logger)\r\n await ctx.searchGlob()\r\n },\r\n api: {\r\n getResolvedRoutes() {\r\n return ctx.options.resolver.getComputedRoutes(ctx)\r\n },\r\n },\r\n configureServer(server) {\r\n ctx.setupViteServer(server)\r\n },\r\n resolveId(id) {\r\n if (ctx.options.moduleIds.includes(id))\r\n return `${MODULE_ID_VIRTUAL}?id=${id}`\r\n\r\n if (routeBlockQueryRE.test(id))\r\n return ROUTE_BLOCK_ID_VIRTUAL\r\n\r\n return null\r\n },\r\n async load(id) {\r\n const {\r\n moduleId,\r\n pageId,\r\n } = parsePageRequest(id)\r\n\r\n if (moduleId === MODULE_ID_VIRTUAL && pageId && ctx.options.moduleIds.includes(pageId))\r\n return ctx.resolveRoutes()\r\n\r\n if (id === ROUTE_BLOCK_ID_VIRTUAL) {\r\n return {\r\n code: 'export default {};',\r\n map: null,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n }\r\n}\r\n\r\nexport { syncIndexResolver } from './options'\r\nexport type {\r\n ReactRoute,\r\n SolidRoute,\r\n VueRoute,\r\n} from './resolvers'\r\n\r\nexport {\r\n reactResolver,\r\n solidResolver,\r\n vueResolver,\r\n} from './resolvers'\r\nexport * from './types'\r\nexport { PageContext }\r\nexport default pagesPlugin\r\n","export const MODULE_IDS = [\r\n '~pages',\r\n '~react-pages',\r\n '~solid-pages',\r\n 'pages-generated',\r\n 'virtual:generated-pages',\r\n 'virtual:generated-pages-react',\r\n]\r\n\r\nexport const MODULE_ID_VIRTUAL = 'virtual:vite-plugin-pages/generated-pages'\r\nexport const ROUTE_BLOCK_ID_VIRTUAL = 'virtual:vite-plugin-pages/route-block'\r\nexport const ROUTE_IMPORT_NAME = '__pages_import_$1__'\r\n\r\nexport const routeBlockQueryRE = /\\?vue&type=route/\r\n\r\nexport const dynamicRouteRE = /^\\[(.+)\\]$/\r\nexport const cacheAllRouteRE = /^\\[\\.{3}(.*)\\]$/\r\nexport const replaceDynamicRouteRE = /^\\[(?:\\.{3})?(.*)\\]$/\r\n\r\nexport const nuxtDynamicRouteRE = /^_(.*)$/\r\nexport const nuxtCacheAllRouteRE = /^_$/\r\n\r\nexport const replaceIndexRE = /\\/?index$/\r\n","import type { Logger, ViteDevServer } from 'vite'\r\nimport type { PageOptions, ResolvedOptions, UserOptions } from './types'\r\nimport { join, resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { getPageFiles } from './files'\r\nimport { resolveOptions } from './options'\r\n\r\nimport { debug, invalidatePagesModule, isTarget, slash, toArray } from './utils'\r\n\r\nexport interface PageRoute {\r\n path: string\r\n route: string\r\n}\r\n\r\nexport class PageContext {\r\n private _server: ViteDevServer | undefined\r\n private _pageRouteMap = new Map<string, PageRoute>()\r\n\r\n rawOptions: UserOptions\r\n root: string\r\n options: ResolvedOptions\r\n logger?: Logger\r\n\r\n constructor(userOptions: UserOptions, viteRoot: string = process.cwd()) {\r\n this.rawOptions = userOptions\r\n this.root = slash(viteRoot)\r\n debug.env('root', this.root)\r\n this.options = resolveOptions(userOptions, this.root)\r\n debug.options(this.options)\r\n }\r\n\r\n setLogger(logger: Logger) {\r\n this.logger = logger\r\n }\r\n\r\n setupViteServer(server: ViteDevServer) {\r\n if (this._server === server)\r\n return\r\n\r\n this._server = server\r\n this.setupWatcher(server.watcher)\r\n }\r\n\r\n setupWatcher(watcher: ViteDevServer['watcher']) {\r\n watcher\r\n .on('unlink', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n await this.removePage(path)\r\n this.onUpdate()\r\n })\r\n watcher\r\n .on('add', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this.options.dirs.find(i => path.startsWith(slash(resolve(this.root, i.dir))))!\r\n await this.addPage(path, page)\r\n this.onUpdate()\r\n })\r\n\r\n watcher\r\n .on('change', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this._pageRouteMap.get(path)\r\n if (page)\r\n await this.options.resolver.hmr?.changed?.(this, path)\r\n })\r\n }\r\n\r\n async addPage(path: string | string[], pageDir: PageOptions) {\r\n debug.pages('add', path)\r\n for (const p of toArray(path)) {\r\n const pageDirPath = slash(resolve(this.root, pageDir.dir))\r\n const extension = this.options.extensions.find(ext => p.endsWith(`.${ext}`))\r\n if (!extension)\r\n continue\r\n\r\n const route = slash(join(pageDir.baseRoute, p.replace(`${pageDirPath}/`, '').replace(`.${extension}`, '')))\r\n this._pageRouteMap.set(p, {\r\n path: p,\r\n route,\r\n })\r\n await this.options.resolver.hmr?.added?.(this, p)\r\n }\r\n }\r\n\r\n async removePage(path: string) {\r\n debug.pages('remove', path)\r\n this._pageRouteMap.delete(path)\r\n await this.options.resolver.hmr?.removed?.(this, path)\r\n }\r\n\r\n onUpdate() {\r\n if (!this._server)\r\n return\r\n\r\n invalidatePagesModule(this._server)\r\n debug.hmr('Reload generated pages.')\r\n this._server.ws.send({\r\n type: 'full-reload',\r\n })\r\n }\r\n\r\n async resolveRoutes() {\r\n return this.options.resolver.resolveRoutes(this)\r\n }\r\n\r\n async searchGlob() {\r\n const pageDirFiles = this.options.dirs.map((page) => {\r\n const pagesDirPath = slash(resolve(this.options.root, page.dir))\r\n const files = getPageFiles(pagesDirPath, this.options, page)\r\n debug.search(page.dir, files)\r\n return {\r\n ...page,\r\n files: files.map(file => slash(file)),\r\n }\r\n })\r\n\r\n for (const page of pageDirFiles)\r\n await this.addPage(page.files, page)\r\n\r\n debug.cache(this.pageRouteMap)\r\n }\r\n\r\n get debug() {\r\n return debug\r\n }\r\n\r\n get pageRouteMap() {\r\n return this._pageRouteMap\r\n }\r\n}\r\n","import type { PageOptions, ResolvedOptions } from './types'\r\nimport { join } from 'node:path'\r\nimport { globSync } from 'tinyglobby'\r\n\r\nimport { extsToGlob, slash } from './utils'\r\n\r\n/**\r\n * Resolves the page dirs for its for its given globs\r\n */\r\nconst VUE_MD_EXT_RE = /\\/$/\r\nexport function getPageDirs(PageOptions: PageOptions, root: string, exclude: string[]): PageOptions[] {\r\n const dirs = globSync(slash(PageOptions.dir), {\r\n ignore: exclude,\r\n onlyDirectories: true,\r\n dot: true,\r\n expandDirectories: false,\r\n cwd: root,\r\n })\r\n\r\n const pageDirs = dirs.map(dir => ({\r\n ...PageOptions,\r\n dir: dir.replace(VUE_MD_EXT_RE, ''),\r\n }))\r\n\r\n return pageDirs\r\n}\r\n\r\n/**\r\n * Resolves the files that are valid pages for the given context.\r\n */\r\nexport function getPageFiles(path: string, options: ResolvedOptions, pageOptions?: PageOptions): string[] {\r\n const {\r\n exclude,\r\n extensions,\r\n } = options\r\n\r\n const ext = extsToGlob(extensions)\r\n const pattern = pageOptions?.filePattern ?? `**/*.${ext}`\r\n\r\n const files = globSync(pattern, {\r\n ignore: exclude,\r\n onlyFiles: true,\r\n cwd: path,\r\n }).map(p => slash(join(path, p)))\r\n\r\n return files\r\n}\r\n","import type { ModuleNode, ViteDevServer } from 'vite'\r\nimport type { ResolvedOptions } from './types'\r\nimport { resolve, win32 } from 'node:path'\r\nimport { URLSearchParams } from 'node:url'\r\nimport Debug from 'debug'\r\nimport micromatch from 'micromatch'\r\n\r\nimport { cacheAllRouteRE, dynamicRouteRE, MODULE_ID_VIRTUAL, nuxtCacheAllRouteRE, nuxtDynamicRouteRE, replaceDynamicRouteRE, replaceIndexRE } from './constants'\r\n\r\nconst slashRE = /\\\\/g\r\n\r\nexport function slash(str: string) {\r\n return str.replace(slashRE, '/')\r\n}\r\n\r\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\r\n if (value == null)\r\n return []\r\n return Array.isArray(value) ? value : [value]\r\n}\r\n\r\nexport const debug = {\r\n hmr: Debug('vite-plugin-pages:hmr'),\r\n routeBlock: Debug('vite-plugin-pages:routeBlock'),\r\n options: Debug('vite-plugin-pages:options'),\r\n pages: Debug('vite-plugin-pages:pages'),\r\n search: Debug('vite-plugin-pages:search'),\r\n env: Debug('vite-plugin-pages:env'),\r\n cache: Debug('vite-plugin-pages:cache'),\r\n resolver: Debug('vite-plugin-pages:resolver'),\r\n}\r\n\r\nexport function extsToGlob(extensions: string[]) {\r\n return extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0] || ''\r\n}\r\n\r\nexport function countSlash(value: string) {\r\n let count = 0\r\n for (let i = 0; i < value.length; i++) {\r\n if (value[i] === '/')\r\n count++\r\n }\r\n return count\r\n}\r\n\r\nfunction isPagesDir(path: string, options: ResolvedOptions) {\r\n for (const page of options.dirs) {\r\n const dirPath = slash(resolve(options.root, page.dir))\r\n if (path.startsWith(dirPath))\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isTarget(path: string, options: ResolvedOptions) {\r\n return isPagesDir(path, options) && !micromatch.isMatch(path, options.exclude) && options.extensionsRE.test(path)\r\n}\r\n\r\nexport function isDynamicRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtDynamicRouteRE.test(routePath)\r\n : dynamicRouteRE.test(routePath)\r\n}\r\n\r\nexport function isCatchAllRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtCacheAllRouteRE.test(routePath)\r\n : cacheAllRouteRE.test(routePath)\r\n}\r\n\r\nexport function resolveImportMode(\r\n filepath: string,\r\n options: ResolvedOptions,\r\n) {\r\n const mode = options.importMode\r\n if (typeof mode === 'function')\r\n return mode(filepath, options)\r\n return mode\r\n}\r\n\r\nexport function invalidatePagesModule(server: ViteDevServer) {\r\n const { moduleGraph } = server\r\n const mods = moduleGraph.getModulesByFile(MODULE_ID_VIRTUAL)\r\n if (mods) {\r\n const seen = new Set<ModuleNode>()\r\n mods.forEach((mod) => {\r\n moduleGraph.invalidateModule(mod, seen)\r\n })\r\n }\r\n}\r\n\r\nexport function normalizeCase(str: string, caseSensitive: boolean) {\r\n if (!caseSensitive)\r\n return str.toLocaleLowerCase()\r\n return str\r\n}\r\n\r\nexport function normalizeName(name: string, isDynamic: boolean, nuxtStyle = false) {\r\n if (!isDynamic)\r\n return name\r\n\r\n return nuxtStyle\r\n ? name.replace(nuxtDynamicRouteRE, '$1') || 'all'\r\n : name.replace(replaceDynamicRouteRE, '$1')\r\n}\r\n\r\nexport function buildReactRoutePath(node: string, nuxtStyle = false): string | undefined {\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n\r\n if (isDynamic) {\r\n if (isCatchAll)\r\n return '*'\r\n\r\n return `:${normalizedName}`\r\n }\r\n\r\n return `${normalizedName}`\r\n}\r\n\r\n// https://github.dev/remix-run/remix/blob/264e3f8884c5cafd8d06acc3e01153b376745b7c/packages/remix-dev/config/routesConvention.ts#L105\r\nexport function buildReactRemixRoutePath(node: string): string | undefined {\r\n const escapeStart = '['\r\n const escapeEnd = ']'\r\n let result = ''\r\n let rawSegmentBuffer = ''\r\n\r\n let inEscapeSequence = 0\r\n let skipSegment = false\r\n for (let i = 0; i < node.length; i++) {\r\n const char = node.charAt(i)\r\n const lastChar = i > 0 ? node.charAt(i - 1) : undefined\r\n const nextChar = i < node.length - 1 ? node.charAt(i + 1) : undefined\r\n\r\n function isNewEscapeSequence() {\r\n return (\r\n !inEscapeSequence && char === escapeStart && lastChar !== escapeStart\r\n )\r\n }\r\n\r\n function isCloseEscapeSequence() {\r\n return inEscapeSequence && char === escapeEnd && nextChar !== escapeEnd\r\n }\r\n\r\n function isStartOfLayoutSegment() {\r\n return char === '_' && nextChar === '_' && !rawSegmentBuffer\r\n }\r\n\r\n if (skipSegment) {\r\n if (char === '/' || char === '.' || char === win32.sep)\r\n skipSegment = false\r\n\r\n continue\r\n }\r\n\r\n if (isNewEscapeSequence()) {\r\n inEscapeSequence++\r\n continue\r\n }\r\n\r\n if (isCloseEscapeSequence()) {\r\n inEscapeSequence--\r\n continue\r\n }\r\n\r\n if (inEscapeSequence) {\r\n result += char\r\n continue\r\n }\r\n\r\n if (char === '/' || char === win32.sep || char === '.') {\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n else result += '/'\r\n\r\n rawSegmentBuffer = ''\r\n continue\r\n }\r\n\r\n if (isStartOfLayoutSegment()) {\r\n skipSegment = true\r\n continue\r\n }\r\n\r\n rawSegmentBuffer += char\r\n\r\n if (char === '$') {\r\n result += typeof nextChar === 'undefined' ? '*' : ':'\r\n continue\r\n }\r\n\r\n result += char\r\n }\r\n\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n\r\n return result || undefined\r\n}\r\n\r\nexport function parsePageRequest(id: string) {\r\n const [moduleId, rawQuery] = id.split('?', 2)\r\n const query = new URLSearchParams(rawQuery)\r\n const pageId = query.get('id')\r\n return {\r\n moduleId,\r\n query,\r\n pageId,\r\n }\r\n}\r\n","import type { ImportModeResolver, ResolvedOptions, UserOptions } from './types'\r\nimport { resolve } from 'node:path'\r\nimport process from 'node:process'\r\n\r\nimport { MODULE_IDS } from './constants'\r\nimport { getPageDirs } from './files'\r\nimport { reactResolver, solidResolver, vueResolver } from './resolvers'\r\nimport { slash, toArray } from './utils'\r\n\r\nconst VUE_MD_EXT_RE = /^\\//\r\nconst VUE_MD_EXT_RE1 = /\\/$/\r\nfunction resolvePageDirs(dirs: UserOptions['dirs'], root: string, exclude: string[]) {\r\n dirs = toArray(dirs)\r\n return dirs.flatMap((dir) => {\r\n const option = typeof dir === 'string'\r\n ? { dir, baseRoute: '' }\r\n : dir\r\n\r\n option.dir = slash(resolve(root, option.dir)).replace(`${root}/`, '')\r\n option.baseRoute = option.baseRoute.replace(VUE_MD_EXT_RE, '').replace(VUE_MD_EXT_RE1, '')\r\n\r\n return getPageDirs(option, root, exclude)\r\n })\r\n}\r\n\r\nexport const syncIndexResolver: ImportModeResolver = (filepath, options) => {\r\n for (const page of options.dirs) {\r\n if (page.baseRoute === '' && filepath.startsWith(`/${page.dir}/index`))\r\n return 'sync'\r\n }\r\n return 'async'\r\n}\r\n\r\nfunction getResolver(originalResolver: UserOptions['resolver']) {\r\n let resolver = originalResolver || 'vue'\r\n\r\n if (typeof resolver !== 'string')\r\n return resolver\r\n\r\n switch (resolver) {\r\n case 'vue':\r\n resolver = vueResolver()\r\n break\r\n case 'react':\r\n resolver = reactResolver()\r\n break\r\n case 'solid':\r\n resolver = solidResolver()\r\n break\r\n default:\r\n throw new Error(`Unsupported resolver: ${resolver}`)\r\n }\r\n return resolver\r\n}\r\n\r\nexport function resolveOptions(userOptions: UserOptions, viteRoot?: string): ResolvedOptions {\r\n const {\r\n dirs = ['src/pages'],\r\n routeBlockLang = 'json5',\r\n exclude = ['node_modules', '.git', '**/__*__/**'],\r\n caseSensitive = false,\r\n routeNameSeparator = '-',\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n } = userOptions\r\n\r\n const root = viteRoot || slash(process.cwd())\r\n\r\n const importMode = userOptions.importMode || syncIndexResolver\r\n\r\n const importPath = userOptions.importPath || 'relative'\r\n\r\n const resolver = getResolver(userOptions.resolver)\r\n\r\n const extensions = userOptions.extensions || resolver.resolveExtensions()\r\n\r\n const extensionsRE = new RegExp(`\\\\.(${extensions.join('|')})$`)\r\n\r\n const resolvedDirs = resolvePageDirs(dirs, root, exclude)\r\n\r\n const routeStyle = userOptions.routeStyle || 'next'\r\n\r\n const moduleIds = userOptions.moduleId\r\n ? [userOptions.moduleId]\r\n : resolver.resolveModuleIds?.() || MODULE_IDS\r\n\r\n const resolvedOptions: ResolvedOptions = {\r\n dirs: resolvedDirs,\r\n routeStyle,\r\n routeBlockLang,\r\n moduleIds,\r\n root,\r\n extensions,\r\n importMode,\r\n importPath,\r\n exclude,\r\n caseSensitive,\r\n resolver,\r\n extensionsRE,\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n routeNameSeparator,\r\n }\r\n\r\n return resolvedOptions\r\n}\r\n","import type { ResolvedOptions } from './types'\r\nimport { ROUTE_IMPORT_NAME } from './constants'\r\n\r\nimport { resolveImportMode } from './utils'\r\n\r\nconst componentRE = /\"(?:component|element)\":(\"(.*?)\")/g\r\nconst hasFunctionRE = /\"(?:props|beforeEnter)\":(\"(.*?)\")/g\r\n\r\nconst multilineCommentsRE = /\\/\\*(.|[\\r\\n])*?\\*\\//g\r\nconst singlelineCommentsRE = /\\/\\/.*/g\r\nconst VUE_MD_EXT_RE = /(\\s)/g\r\nfunction replaceFunction(_: any, value: any) {\r\n if (typeof value === 'function') {\r\n const fnBody = value.toString()\r\n .replace(multilineCommentsRE, '')\r\n .replace(singlelineCommentsRE, '')\r\n .replace(VUE_MD_EXT_RE, '')\r\n\r\n // ES6 Arrow Function\r\n if (fnBody.length < 8 || fnBody.substring(0, 8) !== 'function')\r\n return `_NuFrRa_${fnBody}`\r\n\r\n return fnBody\r\n }\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * Creates a stringified Vue Router route definition.\r\n */\r\nexport function stringifyRoutes(\r\n preparedRoutes: any[],\r\n options: ResolvedOptions,\r\n) {\r\n const importsMap: Map<string, string> = new Map()\r\n\r\n function getImportString(path: string, importName: string) {\r\n const mode = resolveImportMode(path, options)\r\n return mode === 'sync'\r\n ? `import ${importName} from \"${path}\"`\r\n : `const ${importName} = ${\r\n options.resolver.stringify?.dynamicImport?.(path) || `() => import(\"${path}\")`\r\n }`\r\n }\r\n\r\n function componentReplacer(str: string, replaceStr: string, path: string) {\r\n let importName = importsMap.get(path)\r\n\r\n if (!importName)\r\n importName = ROUTE_IMPORT_NAME.replace('$1', `${importsMap.size}`)\r\n\r\n importsMap.set(path, importName)\r\n\r\n importName = options.resolver.stringify?.component?.(importName) || importName\r\n\r\n return str.replace(replaceStr, importName)\r\n }\r\n\r\n function functionReplacer(str: string, replaceStr: string, content: string) {\r\n if (content.startsWith('function'))\r\n return str.replace(replaceStr, content)\r\n\r\n if (content.startsWith('_NuFrRa_'))\r\n return str.replace(replaceStr, content.slice(8))\r\n\r\n return str\r\n }\r\n\r\n const stringRoutes = JSON\r\n .stringify(preparedRoutes, replaceFunction)\r\n .replace(componentRE, componentReplacer)\r\n .replace(hasFunctionRE, functionReplacer)\r\n\r\n const imports = Array.from(importsMap).map(args => getImportString(...args))\r\n\r\n return {\r\n imports,\r\n stringRoutes,\r\n }\r\n}\r\n\r\nexport function generateClientCode(routes: any[], options: ResolvedOptions) {\r\n const { imports, stringRoutes } = stringifyRoutes(routes, options)\r\n const code = `${imports.join(';\\n')};\\n\\nconst routes = ${stringRoutes};\\n\\nexport default routes;`\r\n return options.resolver.stringify?.final?.(code) || code\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface ReactRouteBase {\r\n caseSensitive?: boolean\r\n children?: ReactRouteBase[]\r\n element?: string\r\n index?: boolean\r\n path?: string\r\n rawRoute: string\r\n}\r\n\r\nexport interface ReactRoute extends Omit<Optional<ReactRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: ReactRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\n\r\n/**\r\n * Sort child routes so React Router matches in correct priority order.\r\n * React Router v6+ matches routes in array order (first-match-wins),\r\n * so more specific routes must come before less specific ones.\r\n *\r\n * Priority (lowest weight first):\r\n * 0 — index route (path \"/\")\r\n * 1 — static route (e.g. \"about\", \"blog/today\")\r\n * 2 — dynamic route (e.g. \":id\")\r\n * 3 — catch-all (path \"*\")\r\n */\r\nfunction sortReactRoutes(routes: ReactRouteBase[]): ReactRouteBase[] {\r\n routes.sort((a, b) => {\r\n const weight = (r: ReactRouteBase): number => {\r\n const p = r.path ?? ''\r\n if (p === '/')\r\n return 0\r\n if (p === '*')\r\n return 3\r\n if (p.startsWith(':'))\r\n return 2\r\n return 1\r\n }\r\n return weight(a) - weight(b)\r\n })\r\n for (const route of routes) {\r\n if (route.children)\r\n sortReactRoutes(route.children)\r\n }\r\n return routes\r\n}\r\n\r\nfunction prepareRoutes(\r\n routes: ReactRoute[],\r\n options: ResolvedOptions,\r\n parent?: ReactRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(route.children, options, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeReactRoutes(ctx: PageContext): Promise<ReactRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: ReactRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n\r\n const route: ReactRouteBase = {\r\n caseSensitive,\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n if (i === pathNodes.length - 1)\r\n route.element = element\r\n\r\n const isIndexRoute = normalizeCase(node, caseSensitive).endsWith('index')\r\n\r\n if (!route.path && isIndexRoute) {\r\n route.path = '/'\r\n }\r\n else if (!isIndexRoute) {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node)\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle)\r\n }\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exits in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n const exits = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exits)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort children so static routes come before dynamic/catch-all routes\r\n sortReactRoutes(routes)\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(routes, ctx.options)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveReactRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeReactRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function reactResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~react-pages', 'virtual:generated-pages-react']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveReactRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeReactRoutes(ctx)\r\n },\r\n stringify: {\r\n component: path => `React.createElement(${path})`,\r\n dynamicImport: path => `React.lazy(() => import(\"${path}\"))`,\r\n final: code => `import React from \"react\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface SolidRouteBase {\r\n rawRoute: string\r\n path: string\r\n children?: SolidRouteBase[]\r\n component?: string\r\n element?: string\r\n}\r\n\r\nexport interface SolidRoute extends Omit<Optional<SolidRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: SolidRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n options: ResolvedOptions,\r\n routes: SolidRoute[],\r\n parent?: SolidRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(options, route.children, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeSolidRoutes(ctx: PageContext): Promise<SolidRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: SolidRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const normalizedPath = normalizeCase(node, caseSensitive)\r\n\r\n const route: SolidRouteBase = {\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n // Check parent exists\r\n const parent = parentRoutes.find(parent =>\r\n pathNodes.slice(0, i).join('/') === parent.rawRoute,\r\n )\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n if (i === pathNodes.length - 1) {\r\n route.element = element\r\n route.component = component\r\n }\r\n\r\n if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node) || ''\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle) || ''\r\n }\r\n\r\n const exist = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exist)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(ctx.options, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveSolidRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeSolidRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function solidResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~solid-pages']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveSolidRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeSolidRoutes(ctx)\r\n },\r\n stringify: {\r\n dynamicImport: path => `Solid.lazy(() => import(\"${path}\"))`,\r\n final: code => `import * as Solid from \"solid-js\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { CustomBlock, Optional, PageResolver } from '../types'\r\nimport { dequal } from 'dequal'\r\nimport colors from 'picocolors'\r\n\r\nimport { getRouteBlock } from '../customBlock'\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n countSlash,\r\n isCatchAllRoute,\r\n isDynamicRoute,\r\n normalizeCase,\r\n normalizeName,\r\n} from '../utils'\r\n\r\nexport interface VueRouteBase {\r\n name: string\r\n path: string\r\n props?: boolean\r\n component: string\r\n children?: VueRouteBase[]\r\n customBlock?: CustomBlock\r\n rawRoute: string\r\n}\r\n\r\nexport interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'children'> {\r\n children?: VueRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n ctx: PageContext,\r\n routes: VueRoute[],\r\n parent?: VueRoute,\r\n) {\r\n const indexSuffixRE = new RegExp(`${ctx.options.routeNameSeparator}index$`)\r\n for (const route of routes) {\r\n if (route.name)\r\n route.name = route.name.replace(indexSuffixRE, '')\r\n\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(ctx, route.children, route)\r\n\r\n if (route.children?.find(c => c.name === route.name))\r\n delete route.name\r\n\r\n route.props = true\r\n\r\n delete route.rawRoute\r\n\r\n if (route.customBlock) {\r\n Object.assign(route, route.customBlock || {})\r\n delete route.customBlock\r\n }\r\n\r\n Object.assign(route, ctx.options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>): Promise<VueRoute[]> {\r\n const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: VueRouteBase[] = []\r\n\r\n // Precompute route path set for O(1) index lookup in nuxt dynamic routes\r\n const routePaths = new Set(pageRoutes.map(p => p.route))\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n // add leading slash to component path if not already there\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const customBlock = customBlockMap.get(page.path)\r\n\r\n const route: VueRouteBase = {\r\n name: '',\r\n path: '',\r\n component,\r\n customBlock,\r\n rawRoute: page.route,\r\n }\r\n\r\n let parentRoutes = routes\r\n let dynamicRoute = false\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n const normalizedPath = normalizeCase(normalizedName, caseSensitive)\r\n\r\n if (isDynamic)\r\n dynamicRoute = true\r\n\r\n route.name += route.name ? `${routeNameSeparator}${normalizedName}` : normalizedName\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n // Reset path\r\n route.path = ''\r\n }\r\n else if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (isDynamic) {\r\n route.path += `/:${normalizedName}`\r\n // Catch-all route\r\n if (isCatchAll) {\r\n if (i === 0)\r\n // root cache all route include children\r\n route.path += '(.*)*'\r\n else\r\n // nested cache all route not include children\r\n route.path += '(.*)'\r\n }\r\n else if (nuxtStyle && i === pathNodes.length - 1) {\r\n // we need to search if the folder provide `index.vue`\r\n if (!routePaths.has(page.route.replace(pathNodes[i], 'index')))\r\n route.path += '?'\r\n }\r\n }\r\n else {\r\n route.path += `/${normalizedPath}`\r\n }\r\n }\r\n }\r\n\r\n // put dynamic routes at the end\r\n if (dynamicRoute)\r\n parentRoutes.push(route)\r\n else\r\n parentRoutes.unshift(route)\r\n })\r\n\r\n let finalRoutes = prepareRoutes(ctx, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>) {\r\n const finalRoutes = await computeVueRoutes(ctx, customBlockMap)\r\n\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function vueResolver(): PageResolver {\r\n const customBlockMap = new Map<string, CustomBlock>()\r\n\r\n async function checkCustomBlockChange(ctx: PageContext, path: string) {\r\n const exitsCustomBlock = customBlockMap.get(path)\r\n let customBlock: CustomBlock | undefined\r\n try {\r\n customBlock = await getRouteBlock(path, ctx.options)\r\n }\r\n catch (error: any) {\r\n ctx.logger?.error(colors.red(`[vite-plugin-pages] ${error.message}`))\r\n return\r\n }\r\n if (!exitsCustomBlock && !customBlock)\r\n return\r\n\r\n if (!customBlock) {\r\n customBlockMap.delete(path)\r\n ctx.debug.routeBlock('%s deleted', path)\r\n return\r\n }\r\n if (!exitsCustomBlock || !dequal(exitsCustomBlock, customBlock)) {\r\n ctx.debug.routeBlock('%s old: %O', path, exitsCustomBlock)\r\n ctx.debug.routeBlock('%s new: %O', path, customBlock)\r\n customBlockMap.set(path, customBlock)\r\n ctx.onUpdate()\r\n }\r\n }\r\n\r\n return {\r\n resolveExtensions() {\r\n return ['vue', 'ts', 'js']\r\n },\r\n resolveModuleIds() {\r\n return ['~pages', 'pages-generated', 'virtual:generated-pages']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveVueRoutes(ctx, customBlockMap)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeVueRoutes(ctx, customBlockMap)\r\n },\r\n hmr: {\r\n added: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n changed: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n removed: async (_ctx, path) => {\r\n customBlockMap.delete(path)\r\n },\r\n },\r\n }\r\n}\r\n","import type { SFCBlock, SFCDescriptor } from '@vue/compiler-sfc'\r\nimport type { CustomBlock, ParsedJSX, ResolvedOptions } from './types'\r\nimport { readFile } from 'node:fs/promises'\r\n\r\n// @ts-expect-error no type\r\nimport extractComments from 'extract-comments'\r\n\r\nimport JSON5 from 'json5'\r\nimport { importModule } from 'local-pkg'\r\nimport { parse as YAMLParser } from 'yaml'\r\nimport { debug } from './utils'\r\n\r\nconst routeJSXReg = /^\\s+(route)\\s+/gm\r\n\r\nlet _compilerSfc: typeof import('@vue/compiler-sfc') | undefined\r\n\r\nexport function parseJSX(code: string): ParsedJSX[] {\r\n return extractComments(code).slice(0, 1).filter((comment: ParsedJSX) => routeJSXReg.test(comment.value) && comment.value.includes(':') && comment.loc.start.line === 1)\r\n}\r\n\r\nexport function parseYamlComment(code: ParsedJSX[], path: string): CustomBlock {\r\n return code.reduce((memo, item) => {\r\n const { value } = item\r\n const v = value.replace(routeJSXReg, '')\r\n debug.routeBlock(`use ${v} parser`)\r\n try {\r\n const yamlResult = YAMLParser(v)\r\n\r\n return {\r\n ...memo,\r\n ...yamlResult,\r\n }\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of comment in ${path}\\n${err.message}`)\r\n }\r\n }, {})\r\n}\r\n\r\nexport async function parseSFC(code: string): Promise<SFCDescriptor> {\r\n try {\r\n if (!_compilerSfc)\r\n _compilerSfc = await importModule('@vue/compiler-sfc') as typeof import('@vue/compiler-sfc')\r\n const { parse } = _compilerSfc\r\n return parse(code, {\r\n pad: 'space',\r\n }).descriptor\r\n // for @vue/compiler-sfc ^2.7\r\n || (parse as any)({\r\n source: code,\r\n })\r\n }\r\n catch {\r\n throw new Error('[vite-plugin-pages] Vue3\\'s \"@vue/compiler-sfc\" is required.')\r\n }\r\n}\r\n\r\nexport function parseCustomBlock(block: SFCBlock, filePath: string, options: ResolvedOptions): any {\r\n const lang = block.lang ?? options.routeBlockLang\r\n\r\n debug.routeBlock(`use ${lang} parser`)\r\n\r\n if (lang === 'json5') {\r\n try {\r\n return JSON5.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON5 format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'json') {\r\n try {\r\n return JSON.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'yaml' || lang === 'yml') {\r\n try {\r\n return YAMLParser(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n}\r\n\r\nexport async function getRouteBlock(path: string, options: ResolvedOptions) {\r\n const content = await readFile(path, 'utf8')\r\n\r\n const parsedSFC = await parseSFC(content)\r\n const blockStr = parsedSFC?.customBlocks.find(b => b.type === 'route')\r\n\r\n const parsedJSX = parseJSX(content)\r\n\r\n if (!blockStr && parsedJSX.length === 0)\r\n return\r\n\r\n let result\r\n\r\n if (blockStr)\r\n result = parseCustomBlock(blockStr, path, options) as CustomBlock\r\n\r\n if (parsedJSX.length > 0)\r\n result = parseYamlComment(parsedJSX, path) as CustomBlock\r\n\r\n return result\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,oBAAoB;AAC1B,IAAM,yBAAyB;AAC/B,IAAM,oBAAoB;AAE1B,IAAM,oBAAoB;AAE1B,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,wBAAwB;AAE9B,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB;AAE5B,IAAM,iBAAiB;;;ACpB9B,IAAAA,oBAA8B;AAC9B,IAAAC,uBAAoB;;;ACFpB,IAAAC,oBAAqB;AACrB,wBAAyB;;;ACAzB,uBAA+B;AAC/B,sBAAgC;AAChC,mBAAkB;AAClB,wBAAuB;AAIvB,IAAM,UAAU;AAET,SAAS,MAAM,KAAa;AACjC,SAAO,IAAI,QAAQ,SAAS,GAAG;AACjC;AAEO,SAAS,QAAW,OAAwC;AACjE,MAAI,SAAS;AACX,WAAO,CAAC;AACV,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAEO,IAAM,QAAQ;AAAA,EACnB,SAAK,aAAAC,SAAM,uBAAuB;AAAA,EAClC,gBAAY,aAAAA,SAAM,8BAA8B;AAAA,EAChD,aAAS,aAAAA,SAAM,2BAA2B;AAAA,EAC1C,WAAO,aAAAA,SAAM,yBAAyB;AAAA,EACtC,YAAQ,aAAAA,SAAM,0BAA0B;AAAA,EACxC,SAAK,aAAAA,SAAM,uBAAuB;AAAA,EAClC,WAAO,aAAAA,SAAM,yBAAyB;AAAA,EACtC,cAAU,aAAAA,SAAM,4BAA4B;AAC9C;AAEO,SAAS,WAAW,YAAsB;AAC/C,SAAO,WAAW,SAAS,IAAI,IAAI,WAAW,KAAK,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK;AAChF;AAEO,SAAS,WAAW,OAAe;AACxC,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,MAAM,CAAC,MAAM;AACf;AAAA,EACJ;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAc,SAA0B;AAC1D,aAAW,QAAQ,QAAQ,MAAM;AAC/B,UAAM,UAAU,UAAM,0BAAQ,QAAQ,MAAM,KAAK,GAAG,CAAC;AACrD,QAAI,KAAK,WAAW,OAAO;AACzB,aAAO;AAAA,EACX;AACA,SAAO;AACT;AAEO,SAAS,SAAS,MAAc,SAA0B;AAC/D,SAAO,WAAW,MAAM,OAAO,KAAK,CAAC,kBAAAC,QAAW,QAAQ,MAAM,QAAQ,OAAO,KAAK,QAAQ,aAAa,KAAK,IAAI;AAClH;AAEO,SAAS,eAAe,WAAmB,YAAY,OAAO;AACnE,SAAO,YACH,mBAAmB,KAAK,SAAS,IACjC,eAAe,KAAK,SAAS;AACnC;AAEO,SAAS,gBAAgB,WAAmB,YAAY,OAAO;AACpE,SAAO,YACH,oBAAoB,KAAK,SAAS,IAClC,gBAAgB,KAAK,SAAS;AACpC;AAEO,SAAS,kBACd,UACA,SACA;AACA,QAAM,OAAO,QAAQ;AACrB,MAAI,OAAO,SAAS;AAClB,WAAO,KAAK,UAAU,OAAO;AAC/B,SAAO;AACT;AAEO,SAAS,sBAAsB,QAAuB;AAC3D,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,OAAO,YAAY,iBAAiB,iBAAiB;AAC3D,MAAI,MAAM;AACR,UAAM,OAAO,oBAAI,IAAgB;AACjC,SAAK,QAAQ,CAAC,QAAQ;AACpB,kBAAY,iBAAiB,KAAK,IAAI;AAAA,IACxC,CAAC;AAAA,EACH;AACF;AAEO,SAAS,cAAc,KAAa,eAAwB;AACjE,MAAI,CAAC;AACH,WAAO,IAAI,kBAAkB;AAC/B,SAAO;AACT;AAEO,SAAS,cAAc,MAAc,WAAoB,YAAY,OAAO;AACjF,MAAI,CAAC;AACH,WAAO;AAET,SAAO,YACH,KAAK,QAAQ,oBAAoB,IAAI,KAAK,QAC1C,KAAK,QAAQ,uBAAuB,IAAI;AAC9C;AAEO,SAAS,oBAAoB,MAAc,YAAY,OAA2B;AACvF,QAAM,YAAY,eAAe,MAAM,SAAS;AAChD,QAAM,aAAa,gBAAgB,MAAM,SAAS;AAClD,QAAM,iBAAiB,cAAc,MAAM,WAAW,SAAS;AAE/D,MAAI,WAAW;AACb,QAAI;AACF,aAAO;AAET,WAAO,IAAI,cAAc;AAAA,EAC3B;AAEA,SAAO,GAAG,cAAc;AAC1B;AAGO,SAAS,yBAAyB,MAAkC;AACzE,QAAM,cAAc;AACpB,QAAM,YAAY;AAClB,MAAI,SAAS;AACb,MAAI,mBAAmB;AAEvB,MAAI,mBAAmB;AACvB,MAAI,cAAc;AAClB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAKpC,QAASC,uBAAT,WAA+B;AAC7B,aACE,CAAC,oBAAoB,SAAS,eAAe,aAAa;AAAA,IAE9D,GAESC,yBAAT,WAAiC;AAC/B,aAAO,oBAAoB,SAAS,aAAa,aAAa;AAAA,IAChE,GAESC,0BAAT,WAAkC;AAChC,aAAO,SAAS,OAAO,aAAa,OAAO,CAAC;AAAA,IAC9C;AAZS,8BAAAF,sBAMA,wBAAAC,wBAIA,yBAAAC;AAdT,UAAM,OAAO,KAAK,OAAO,CAAC;AAC1B,UAAM,WAAW,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI;AAC9C,UAAM,WAAW,IAAI,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI;AAgB5D,QAAI,aAAa;AACf,UAAI,SAAS,OAAO,SAAS,OAAO,SAAS,uBAAM;AACjD,sBAAc;AAEhB;AAAA,IACF;AAEA,QAAIF,qBAAoB,GAAG;AACzB;AACA;AAAA,IACF;AAEA,QAAIC,uBAAsB,GAAG;AAC3B;AACA;AAAA,IACF;AAEA,QAAI,kBAAkB;AACpB,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,uBAAM,OAAO,SAAS,KAAK;AACtD,UAAI,qBAAqB,WAAW,OAAO,SAAS,OAAO;AACzD,iBAAS,OAAO,QAAQ,gBAAgB,EAAE;AAAA,UACvC,WAAU;AAEf,yBAAmB;AACnB;AAAA,IACF;AAEA,QAAIC,wBAAuB,GAAG;AAC5B,oBAAc;AACd;AAAA,IACF;AAEA,wBAAoB;AAEpB,QAAI,SAAS,KAAK;AAChB,gBAAU,OAAO,aAAa,cAAc,MAAM;AAClD;AAAA,IACF;AAEA,cAAU;AAAA,EACZ;AAEA,MAAI,qBAAqB,WAAW,OAAO,SAAS,OAAO;AACzD,aAAS,OAAO,QAAQ,gBAAgB,EAAE;AAE5C,SAAO,UAAU;AACnB;AAEO,SAAS,iBAAiB,IAAY;AAC3C,QAAM,CAAC,UAAU,QAAQ,IAAI,GAAG,MAAM,KAAK,CAAC;AAC5C,QAAM,QAAQ,IAAI,gCAAgB,QAAQ;AAC1C,QAAM,SAAS,MAAM,IAAI,IAAI;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADzMA,IAAM,gBAAgB;AACf,SAAS,YAAY,aAA0B,MAAc,SAAkC;AACpG,QAAM,WAAO,4BAAS,MAAM,YAAY,GAAG,GAAG;AAAA,IAC5C,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,KAAK;AAAA,IACL,mBAAmB;AAAA,IACnB,KAAK;AAAA,EACP,CAAC;AAED,QAAM,WAAW,KAAK,IAAI,SAAQ,iCAC7B,cAD6B;AAAA,IAEhC,KAAK,IAAI,QAAQ,eAAe,EAAE;AAAA,EACpC,EAAE;AAEF,SAAO;AACT;AAKO,SAAS,aAAa,MAAc,SAA0B,aAAqC;AA9B1G;AA+BE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,MAAM,WAAW,UAAU;AACjC,QAAM,WAAU,gDAAa,gBAAb,YAA4B,QAAQ,GAAG;AAEvD,QAAM,YAAQ,4BAAS,SAAS;AAAA,IAC9B,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,KAAK;AAAA,EACP,CAAC,EAAE,IAAI,OAAK,UAAM,wBAAK,MAAM,CAAC,CAAC,CAAC;AAEhC,SAAO;AACT;;;AE7CA,IAAAC,oBAAwB;AACxB,0BAAoB;;;ACGpB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAEtB,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAC7B,IAAMC,iBAAgB;AACtB,SAAS,gBAAgB,GAAQ,OAAY;AAC3C,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,SAAS,MAAM,SAAS,EAC3B,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,sBAAsB,EAAE,EAChC,QAAQA,gBAAe,EAAE;AAG5B,QAAI,OAAO,SAAS,KAAK,OAAO,UAAU,GAAG,CAAC,MAAM;AAClD,aAAO,WAAW,MAAM;AAE1B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,SAAS,gBACd,gBACA,SACA;AACA,QAAM,aAAkC,oBAAI,IAAI;AAEhD,WAAS,gBAAgB,MAAc,YAAoB;AArC7D;AAsCI,UAAM,OAAO,kBAAkB,MAAM,OAAO;AAC5C,WAAO,SAAS,SACZ,UAAU,UAAU,UAAU,IAAI,MAClC,SAAS,UAAU,QACnB,mBAAQ,SAAS,cAAjB,mBAA4B,kBAA5B,4BAA4C,UAAS,iBAAiB,IAAI,IAC5E;AAAA,EACJ;AAEA,WAAS,kBAAkB,KAAa,YAAoB,MAAc;AA9C5E;AA+CI,QAAI,aAAa,WAAW,IAAI,IAAI;AAEpC,QAAI,CAAC;AACH,mBAAa,kBAAkB,QAAQ,MAAM,GAAG,WAAW,IAAI,EAAE;AAEnE,eAAW,IAAI,MAAM,UAAU;AAE/B,mBAAa,mBAAQ,SAAS,cAAjB,mBAA4B,cAA5B,4BAAwC,gBAAe;AAEpE,WAAO,IAAI,QAAQ,YAAY,UAAU;AAAA,EAC3C;AAEA,WAAS,iBAAiB,KAAa,YAAoB,SAAiB;AAC1E,QAAI,QAAQ,WAAW,UAAU;AAC/B,aAAO,IAAI,QAAQ,YAAY,OAAO;AAExC,QAAI,QAAQ,WAAW,UAAU;AAC/B,aAAO,IAAI,QAAQ,YAAY,QAAQ,MAAM,CAAC,CAAC;AAEjD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,KAClB,UAAU,gBAAgB,eAAe,EACzC,QAAQ,aAAa,iBAAiB,EACtC,QAAQ,eAAe,gBAAgB;AAE1C,QAAM,UAAU,MAAM,KAAK,UAAU,EAAE,IAAI,UAAQ,gBAAgB,GAAG,IAAI,CAAC;AAE3E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,QAAe,SAA0B;AAlF5E;AAmFE,QAAM,EAAE,SAAS,aAAa,IAAI,gBAAgB,QAAQ,OAAO;AACjE,QAAM,OAAO,GAAG,QAAQ,KAAK,KAAK,CAAC;AAAA;AAAA,iBAAuB,YAAY;AAAA;AAAA;AACtE,WAAO,mBAAQ,SAAS,cAAjB,mBAA4B,UAA5B,4BAAoC,UAAS;AACtD;;;AC/DA,IAAMC,iBAAgB;AAatB,SAAS,gBAAgB,QAA4C;AACnE,SAAO,KAAK,CAAC,GAAG,MAAM;AACpB,UAAM,SAAS,CAAC,MAA8B;AAtClD;AAuCM,YAAM,KAAI,OAAE,SAAF,YAAU;AACpB,UAAI,MAAM;AACR,eAAO;AACT,UAAI,MAAM;AACR,eAAO;AACT,UAAI,EAAE,WAAW,GAAG;AAClB,eAAO;AACT,aAAO;AAAA,IACT;AACA,WAAO,OAAO,CAAC,IAAI,OAAO,CAAC;AAAA,EAC7B,CAAC;AACD,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM;AACR,sBAAgB,MAAM,QAAQ;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,cACP,QACA,SACA,QACA;AA7DF;AA8DE,aAAW,SAAS,QAAQ;AAC1B,QAAI;AACF,YAAM,QAAO,WAAM,SAAN,mBAAY,QAAQA,gBAAe;AAElD,QAAI,MAAM;AACR,YAAM,WAAW,cAAc,MAAM,UAAU,SAAS,KAAK;AAE/D,WAAO,MAAM;AAEb,WAAO,OAAO,SAAO,aAAQ,gBAAR,iCAAsB,OAAO,YAAW,CAAC,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB,KAAyC;AA7E3E;AA8EE,QAAM,EAAE,YAAY,eAAe,WAAW,IAAI,IAAI;AACtD,QAAM,YAAY,eAAe;AAEjC,QAAM,aAAa,CAAC,GAAG,IAAI,aAAa,OAAO,CAAC,EAE7C,KAAK,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,CAAC;AAE3D,QAAM,SAA2B,CAAC;AAElC,aAAW,QAAQ,CAAC,SAAS;AAC3B,UAAM,YAAY,KAAK,MAAM,MAAM,GAAG;AACtC,UAAM,UAAU,eAAe,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,IAAI,KAAK;AACnF,QAAI,eAAe;AAEnB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,OAAO,UAAU,CAAC;AAExB,YAAM,QAAwB;AAAA,QAC5B;AAAA,QACA,MAAM;AAAA,QACN,UAAU,UAAU,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MAC9C;AAEA,UAAI,MAAM,UAAU,SAAS;AAC3B,cAAM,UAAU;AAElB,YAAM,eAAe,cAAc,MAAM,aAAa,EAAE,SAAS,OAAO;AAExE,UAAI,CAAC,MAAM,QAAQ,cAAc;AAC/B,cAAM,OAAO;AAAA,MACf,WACS,CAAC,cAAc;AACtB,YAAI,eAAe;AACjB,gBAAM,OAAO,yBAAyB,IAAI;AAAA;AAE1C,gBAAM,OAAO,oBAAoB,MAAM,SAAS;AAAA,MACpD;AAGA,YAAM,SAAS,aAAa,KAAK,CAACC,YAAW;AAC3C,eAAO,UAAU,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,MAAMA,QAAO;AAAA,MACpD,CAAC;AAED,UAAI,QAAQ;AAEV,eAAO,WAAW,OAAO,YAAY,CAAC;AAEtC,uBAAe,OAAO;AAAA,MACxB;AAEA,YAAM,QAAQ,aAAa,KAAK,CAACA,YAAW;AAC1C,eAAO,UAAU,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,MAAMA,QAAO;AAAA,MACxD,CAAC;AACD,UAAI,CAAC;AACH,qBAAa,KAAK,KAAK;AAAA,IAC3B;AAAA,EACF,CAAC;AAGD,kBAAgB,MAAM;AAGtB,MAAI,cAAc,cAAc,QAAQ,IAAI,OAAO;AAEnD,gBAAe,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,iBAAiB;AAEtE,SAAO;AACT;AAEA,eAAe,mBAAmB,KAAkB;AAnJpD;AAoJE,QAAM,cAAc,MAAM,mBAAmB,GAAG;AAChD,MAAI,SAAS,mBAAmB,aAAa,IAAI,OAAO;AACxD,WAAU,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,YAAY;AAC5D,SAAO;AACT;AAEO,SAAS,gBAA8B;AAC5C,SAAO;AAAA,IACL,mBAAmB;AACjB,aAAO,CAAC,gBAAgB,+BAA+B;AAAA,IACzD;AAAA,IACA,oBAAoB;AAClB,aAAO,CAAC,OAAO,OAAO,MAAM,IAAI;AAAA,IAClC;AAAA,IACA,MAAM,cAAc,KAAK;AACvB,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,IACA,MAAM,kBAAkB,KAAK;AAC3B,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,IACA,WAAW;AAAA,MACT,WAAW,UAAQ,uBAAuB,IAAI;AAAA,MAC9C,eAAe,UAAQ,4BAA4B,IAAI;AAAA,MACvD,OAAO,UAAQ;AAAA,EAA+B,IAAI;AAAA,IACpD;AAAA,EACF;AACF;;;ACxJA,IAAMC,iBAAgB;AACtB,SAASC,eACP,SACA,QACA,QACA;AA3BF;AA4BE,aAAW,SAAS,QAAQ;AAC1B,QAAI;AACF,YAAM,QAAO,WAAM,SAAN,mBAAY,QAAQD,gBAAe;AAElD,QAAI,MAAM;AACR,YAAM,WAAWC,eAAc,SAAS,MAAM,UAAU,KAAK;AAE/D,WAAO,MAAM;AAEb,WAAO,OAAO,SAAO,aAAQ,gBAAR,iCAAsB,OAAO,YAAW,CAAC,CAAC;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB,KAAyC;AA3C3E;AA4CE,QAAM,EAAE,YAAY,eAAe,WAAW,IAAI,IAAI;AACtD,QAAM,YAAY,eAAe;AAEjC,QAAM,aAAa,CAAC,GAAG,IAAI,aAAa,OAAO,CAAC,EAE7C,KAAK,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,CAAC;AAE3D,QAAM,SAA2B,CAAC;AAElC,aAAW,QAAQ,CAAC,SAAS;AAC3B,UAAM,YAAY,KAAK,MAAM,MAAM,GAAG;AAEtC,UAAM,YAAY,eAAe,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,IAAI,KAAK;AACrF,UAAM,UAAU,eAAe,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,IAAI,KAAK;AAEnF,QAAI,eAAe;AAEnB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,OAAO,UAAU,CAAC;AACxB,YAAM,iBAAiB,cAAc,MAAM,aAAa;AAExD,YAAM,QAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,UAAU,UAAU,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG;AAAA,MAC9C;AAGA,YAAM,SAAS,aAAa;AAAA,QAAK,CAAAC,YAC/B,UAAU,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,MAAMA,QAAO;AAAA,MAC7C;AAEA,UAAI,QAAQ;AAEV,eAAO,WAAW,OAAO,YAAY,CAAC;AAEtC,uBAAe,OAAO;AAAA,MACxB;AAEA,UAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,cAAM,UAAU;AAChB,cAAM,YAAY;AAAA,MACpB;AAEA,UAAI,mBAAmB,SAAS;AAC9B,YAAI,CAAC,MAAM;AACT,gBAAM,OAAO;AAAA,MACjB,WACS,mBAAmB,SAAS;AACnC,YAAI,eAAe;AACjB,gBAAM,OAAO,yBAAyB,IAAI,KAAK;AAAA;AAE/C,gBAAM,OAAO,oBAAoB,MAAM,SAAS,KAAK;AAAA,MACzD;AAEA,YAAM,QAAQ,aAAa,KAAK,CAACA,YAAW;AAC1C,eAAO,UAAU,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,MAAMA,QAAO;AAAA,MACxD,CAAC;AACD,UAAI,CAAC;AACH,qBAAa,KAAK,KAAK;AAAA,IAC3B;AAAA,EACF,CAAC;AAGD,MAAI,cAAcD,eAAc,IAAI,SAAS,MAAM;AAEnD,gBAAe,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,iBAAiB;AAEtE,SAAO;AACT;AAEA,eAAe,mBAAmB,KAAkB;AAlHpD;AAmHE,QAAM,cAAc,MAAM,mBAAmB,GAAG;AAChD,MAAI,SAAS,mBAAmB,aAAa,IAAI,OAAO;AACxD,WAAU,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,YAAY;AAC5D,SAAO;AACT;AAEO,SAAS,gBAA8B;AAC5C,SAAO;AAAA,IACL,mBAAmB;AACjB,aAAO,CAAC,cAAc;AAAA,IACxB;AAAA,IACA,oBAAoB;AAClB,aAAO,CAAC,OAAO,OAAO,MAAM,IAAI;AAAA,IAClC;AAAA,IACA,MAAM,cAAc,KAAK;AACvB,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,IACA,MAAM,kBAAkB,KAAK;AAC3B,aAAO,mBAAmB,GAAG;AAAA,IAC/B;AAAA,IACA,WAAW;AAAA,MACT,eAAe,UAAQ,4BAA4B,IAAI;AAAA,MACvD,OAAO,UAAQ;AAAA,EAAuC,IAAI;AAAA,IAC5D;AAAA,EACF;AACF;;;AC1IA,oBAAuB;AACvB,wBAAmB;;;ACDnB,sBAAyB;AAGzB,8BAA4B;AAE5B,mBAAkB;AAClB,uBAA6B;AAC7B,kBAAoC;AAGpC,IAAM,cAAc;AAEpB,IAAI;AAEG,SAAS,SAAS,MAA2B;AAClD,aAAO,wBAAAE,SAAgB,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,YAAuB,YAAY,KAAK,QAAQ,KAAK,KAAK,QAAQ,MAAM,SAAS,GAAG,KAAK,QAAQ,IAAI,MAAM,SAAS,CAAC;AACxK;AAEO,SAAS,iBAAiB,MAAmB,MAA2B;AAC7E,SAAO,KAAK,OAAO,CAAC,MAAM,SAAS;AACjC,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,IAAI,MAAM,QAAQ,aAAa,EAAE;AACvC,UAAM,WAAW,OAAO,CAAC,SAAS;AAClC,QAAI;AACF,YAAM,iBAAa,YAAAC,OAAW,CAAC;AAE/B,aAAO,kCACF,OACA;AAAA,IAEP,SACO,KAAU;AACf,YAAM,IAAI,MAAM,qCAAqC,IAAI;AAAA,EAAK,IAAI,OAAO,EAAE;AAAA,IAC7E;AAAA,EACF,GAAG,CAAC,CAAC;AACP;AAEA,eAAsB,SAAS,MAAsC;AACnE,MAAI;AACF,QAAI,CAAC;AACH,qBAAe,UAAM,+BAAa,mBAAmB;AACvD,UAAM,EAAE,MAAM,IAAI;AAClB,WAAO,MAAM,MAAM;AAAA,MACjB,KAAK;AAAA,IACP,CAAC,EAAE,cAEC,MAAc;AAAA,MAChB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,SACM;AACJ,UAAM,IAAI,MAAM,6DAA8D;AAAA,EAChF;AACF;AAEO,SAAS,iBAAiB,OAAiB,UAAkB,SAA+B;AAzDnG;AA0DE,QAAM,QAAO,WAAM,SAAN,YAAc,QAAQ;AAEnC,QAAM,WAAW,OAAO,IAAI,SAAS;AAErC,MAAI,SAAS,SAAS;AACpB,QAAI;AACF,aAAO,aAAAC,QAAM,MAAM,MAAM,OAAO;AAAA,IAClC,SACO,KAAU;AACf,YAAM,IAAI,MAAM,4BAA4B,MAAM,IAAI,gBAAgB,QAAQ;AAAA,EAAK,IAAI,OAAO,EAAE;AAAA,IAClG;AAAA,EACF,WACS,SAAS,QAAQ;AACxB,QAAI;AACF,aAAO,KAAK,MAAM,MAAM,OAAO;AAAA,IACjC,SACO,KAAU;AACf,YAAM,IAAI,MAAM,2BAA2B,MAAM,IAAI,gBAAgB,QAAQ;AAAA,EAAK,IAAI,OAAO,EAAE;AAAA,IACjG;AAAA,EACF,WACS,SAAS,UAAU,SAAS,OAAO;AAC1C,QAAI;AACF,iBAAO,YAAAD,OAAW,MAAM,OAAO;AAAA,IACjC,SACO,KAAU;AACf,YAAM,IAAI,MAAM,2BAA2B,MAAM,IAAI,gBAAgB,QAAQ;AAAA,EAAK,IAAI,OAAO,EAAE;AAAA,IACjG;AAAA,EACF;AACF;AAEA,eAAsB,cAAc,MAAc,SAA0B;AAC1E,QAAM,UAAU,UAAM,0BAAS,MAAM,MAAM;AAE3C,QAAM,YAAY,MAAM,SAAS,OAAO;AACxC,QAAM,WAAW,uCAAW,aAAa,KAAK,OAAK,EAAE,SAAS;AAE9D,QAAM,YAAY,SAAS,OAAO;AAElC,MAAI,CAAC,YAAY,UAAU,WAAW;AACpC;AAEF,MAAI;AAEJ,MAAI;AACF,aAAS,iBAAiB,UAAU,MAAM,OAAO;AAEnD,MAAI,UAAU,SAAS;AACrB,aAAS,iBAAiB,WAAW,IAAI;AAE3C,SAAO;AACT;;;ADhFA,IAAME,iBAAgB;AACtB,SAASC,eACP,KACA,QACA,QACA;AAjCF;AAkCE,QAAM,gBAAgB,IAAI,OAAO,GAAG,IAAI,QAAQ,kBAAkB,QAAQ;AAC1E,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM;AACR,YAAM,OAAO,MAAM,KAAK,QAAQ,eAAe,EAAE;AAEnD,QAAI;AACF,YAAM,QAAO,WAAM,SAAN,mBAAY,QAAQD,gBAAe;AAElD,QAAI,MAAM;AACR,YAAM,WAAWC,eAAc,KAAK,MAAM,UAAU,KAAK;AAE3D,SAAI,WAAM,aAAN,mBAAgB,KAAK,OAAK,EAAE,SAAS,MAAM;AAC7C,aAAO,MAAM;AAEf,UAAM,QAAQ;AAEd,WAAO,MAAM;AAEb,QAAI,MAAM,aAAa;AACrB,aAAO,OAAO,OAAO,MAAM,eAAe,CAAC,CAAC;AAC5C,aAAO,MAAM;AAAA,IACf;AAEA,WAAO,OAAO,SAAO,eAAI,SAAQ,gBAAZ,4BAA0B,OAAO,YAAW,CAAC,CAAC;AAAA,EACrE;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,KAAkB,gBAA+D;AA/DjH;AAgEE,QAAM,EAAE,YAAY,eAAe,YAAY,mBAAmB,IAAI,IAAI;AAE1E,QAAM,aAAa,CAAC,GAAG,IAAI,aAAa,OAAO,CAAC,EAE7C,KAAK,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,KAAK,CAAC;AAE3D,QAAM,SAAyB,CAAC;AAGhC,QAAM,aAAa,IAAI,IAAI,WAAW,IAAI,OAAK,EAAE,KAAK,CAAC;AAEvD,aAAW,QAAQ,CAAC,SAAS;AAC3B,UAAM,YAAY,KAAK,MAAM,MAAM,GAAG;AAGtC,UAAM,YAAY,eAAe,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,IAAI,KAAK;AACrF,UAAM,cAAc,eAAe,IAAI,KAAK,IAAI;AAEhD,UAAM,QAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU,KAAK;AAAA,IACjB;AAEA,QAAI,eAAe;AACnB,QAAI,eAAe;AAEnB,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,OAAO,UAAU,CAAC;AACxB,YAAM,YAAY,eAAe;AACjC,YAAM,YAAY,eAAe,MAAM,SAAS;AAChD,YAAM,aAAa,gBAAgB,MAAM,SAAS;AAClD,YAAM,iBAAiB,cAAc,MAAM,WAAW,SAAS;AAC/D,YAAM,iBAAiB,cAAc,gBAAgB,aAAa;AAElE,UAAI;AACF,uBAAe;AAEjB,YAAM,QAAQ,MAAM,OAAO,GAAG,kBAAkB,GAAG,cAAc,KAAK;AAGtE,YAAM,SAAS,aAAa,KAAK,CAACC,YAAW;AAC3C,eAAO,UAAU,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,GAAG,MAAMA,QAAO;AAAA,MACxD,CAAC;AAED,UAAI,QAAQ;AAEV,eAAO,WAAW,OAAO,YAAY,CAAC;AAEtC,uBAAe,OAAO;AAEtB,cAAM,OAAO;AAAA,MACf,WACS,mBAAmB,SAAS;AACnC,YAAI,CAAC,MAAM;AACT,gBAAM,OAAO;AAAA,MACjB,WACS,mBAAmB,SAAS;AACnC,YAAI,WAAW;AACb,gBAAM,QAAQ,KAAK,cAAc;AAEjC,cAAI,YAAY;AACd,gBAAI,MAAM;AAER,oBAAM,QAAQ;AAAA;AAGd,oBAAM,QAAQ;AAAA,UAClB,WACS,aAAa,MAAM,UAAU,SAAS,GAAG;AAEhD,gBAAI,CAAC,WAAW,IAAI,KAAK,MAAM,QAAQ,UAAU,CAAC,GAAG,OAAO,CAAC;AAC3D,oBAAM,QAAQ;AAAA,UAClB;AAAA,QACF,OACK;AACH,gBAAM,QAAQ,IAAI,cAAc;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACF,mBAAa,KAAK,KAAK;AAAA;AAEvB,mBAAa,QAAQ,KAAK;AAAA,EAC9B,CAAC;AAED,MAAI,cAAcD,eAAc,KAAK,MAAM;AAE3C,gBAAe,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,iBAAiB;AAEtE,SAAO;AACT;AAEA,eAAe,iBAAiB,KAAkB,gBAA0C;AAjK5F;AAkKE,QAAM,cAAc,MAAM,iBAAiB,KAAK,cAAc;AAE9D,MAAI,SAAS,mBAAmB,aAAa,IAAI,OAAO;AACxD,WAAU,QAAM,eAAI,SAAQ,sBAAZ,4BAAgC,YAAY;AAC5D,SAAO;AACT;AAEO,SAAS,cAA4B;AAC1C,QAAM,iBAAiB,oBAAI,IAAyB;AAEpD,iBAAe,uBAAuB,KAAkB,MAAc;AA5KxE;AA6KI,UAAM,mBAAmB,eAAe,IAAI,IAAI;AAChD,QAAI;AACJ,QAAI;AACF,oBAAc,MAAM,cAAc,MAAM,IAAI,OAAO;AAAA,IACrD,SACO,OAAY;AACjB,gBAAI,WAAJ,mBAAY,MAAM,kBAAAE,QAAO,IAAI,uBAAuB,MAAM,OAAO,EAAE;AACnE;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,CAAC;AACxB;AAEF,QAAI,CAAC,aAAa;AAChB,qBAAe,OAAO,IAAI;AAC1B,UAAI,MAAM,WAAW,cAAc,IAAI;AACvC;AAAA,IACF;AACA,QAAI,CAAC,oBAAoB,KAAC,sBAAO,kBAAkB,WAAW,GAAG;AAC/D,UAAI,MAAM,WAAW,cAAc,MAAM,gBAAgB;AACzD,UAAI,MAAM,WAAW,cAAc,MAAM,WAAW;AACpD,qBAAe,IAAI,MAAM,WAAW;AACpC,UAAI,SAAS;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,oBAAoB;AAClB,aAAO,CAAC,OAAO,MAAM,IAAI;AAAA,IAC3B;AAAA,IACA,mBAAmB;AACjB,aAAO,CAAC,UAAU,mBAAmB,yBAAyB;AAAA,IAChE;AAAA,IACA,MAAM,cAAc,KAAK;AACvB,aAAO,iBAAiB,KAAK,cAAc;AAAA,IAC7C;AAAA,IACA,MAAM,kBAAkB,KAAK;AAC3B,aAAO,iBAAiB,KAAK,cAAc;AAAA,IAC7C;AAAA,IACA,KAAK;AAAA,MACH,OAAO,OAAO,KAAK,SAAS,uBAAuB,KAAK,IAAI;AAAA,MAC5D,SAAS,OAAO,KAAK,SAAS,uBAAuB,KAAK,IAAI;AAAA,MAC9D,SAAS,OAAO,MAAM,SAAS;AAC7B,uBAAe,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACF;;;AJlNA,IAAMC,iBAAgB;AACtB,IAAM,iBAAiB;AACvB,SAAS,gBAAgB,MAA2B,MAAc,SAAmB;AACnF,SAAO,QAAQ,IAAI;AACnB,SAAO,KAAK,QAAQ,CAAC,QAAQ;AAC3B,UAAM,SAAS,OAAO,QAAQ,WAC1B,EAAE,KAAK,WAAW,GAAG,IACrB;AAEJ,WAAO,MAAM,UAAM,2BAAQ,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,KAAK,EAAE;AACpE,WAAO,YAAY,OAAO,UAAU,QAAQA,gBAAe,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AAEzF,WAAO,YAAY,QAAQ,MAAM,OAAO;AAAA,EAC1C,CAAC;AACH;AAEO,IAAM,oBAAwC,CAAC,UAAU,YAAY;AAC1E,aAAW,QAAQ,QAAQ,MAAM;AAC/B,QAAI,KAAK,cAAc,MAAM,SAAS,WAAW,IAAI,KAAK,GAAG,QAAQ;AACnE,aAAO;AAAA,EACX;AACA,SAAO;AACT;AAEA,SAAS,YAAY,kBAA2C;AAC9D,MAAI,WAAW,oBAAoB;AAEnC,MAAI,OAAO,aAAa;AACtB,WAAO;AAET,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,iBAAW,YAAY;AACvB;AAAA,IACF,KAAK;AACH,iBAAW,cAAc;AACzB;AAAA,IACF,KAAK;AACH,iBAAW,cAAc;AACzB;AAAA,IACF;AACE,YAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,eAAe,aAA0B,UAAoC;AAvD7F;AAwDE,QAAM;AAAA,IACJ,OAAO,CAAC,WAAW;AAAA,IACnB,iBAAiB;AAAA,IACjB,UAAU,CAAC,gBAAgB,QAAQ,aAAa;AAAA,IAChD,gBAAgB;AAAA,IAChB,qBAAqB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,OAAO,YAAY,MAAM,oBAAAC,QAAQ,IAAI,CAAC;AAE5C,QAAM,aAAa,YAAY,cAAc;AAE7C,QAAM,aAAa,YAAY,cAAc;AAE7C,QAAM,WAAW,YAAY,YAAY,QAAQ;AAEjD,QAAM,aAAa,YAAY,cAAc,SAAS,kBAAkB;AAExE,QAAM,eAAe,IAAI,OAAO,OAAO,WAAW,KAAK,GAAG,CAAC,IAAI;AAE/D,QAAM,eAAe,gBAAgB,MAAM,MAAM,OAAO;AAExD,QAAM,aAAa,YAAY,cAAc;AAE7C,QAAM,YAAY,YAAY,WAC1B,CAAC,YAAY,QAAQ,MACrB,cAAS,qBAAT,sCAAiC;AAErC,QAAM,kBAAmC;AAAA,IACvC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;;;AH7FO,IAAM,cAAN,MAAkB;AAAA,EASvB,YAAY,aAA0B,WAAmB,qBAAAC,QAAQ,IAAI,GAAG;AAPxE,SAAQ,gBAAgB,oBAAI,IAAuB;AAQjD,SAAK,aAAa;AAClB,SAAK,OAAO,MAAM,QAAQ;AAC1B,UAAM,IAAI,QAAQ,KAAK,IAAI;AAC3B,SAAK,UAAU,eAAe,aAAa,KAAK,IAAI;AACpD,UAAM,QAAQ,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEA,UAAU,QAAgB;AACxB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,gBAAgB,QAAuB;AACrC,QAAI,KAAK,YAAY;AACnB;AAEF,SAAK,UAAU;AACf,SAAK,aAAa,OAAO,OAAO;AAAA,EAClC;AAAA,EAEA,aAAa,SAAmC;AAC9C,YACG,GAAG,UAAU,OAAO,SAAS;AAC5B,aAAO,MAAM,IAAI;AACjB,UAAI,CAAC,SAAS,MAAM,KAAK,OAAO;AAC9B;AACF,YAAM,KAAK,WAAW,IAAI;AAC1B,WAAK,SAAS;AAAA,IAChB,CAAC;AACH,YACG,GAAG,OAAO,OAAO,SAAS;AACzB,aAAO,MAAM,IAAI;AACjB,UAAI,CAAC,SAAS,MAAM,KAAK,OAAO;AAC9B;AACF,YAAM,OAAO,KAAK,QAAQ,KAAK,KAAK,OAAK,KAAK,WAAW,UAAM,2BAAQ,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1F,YAAM,KAAK,QAAQ,MAAM,IAAI;AAC7B,WAAK,SAAS;AAAA,IAChB,CAAC;AAEH,YACG,GAAG,UAAU,OAAO,SAAS;AA/DpC;AAgEQ,aAAO,MAAM,IAAI;AACjB,UAAI,CAAC,SAAS,MAAM,KAAK,OAAO;AAC9B;AACF,YAAM,OAAO,KAAK,cAAc,IAAI,IAAI;AACxC,UAAI;AACF,gBAAM,gBAAK,QAAQ,SAAS,QAAtB,mBAA2B,YAA3B,4BAAqC,MAAM;AAAA,IACrD,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,QAAQ,MAAyB,SAAsB;AAzE/D;AA0EI,UAAM,MAAM,OAAO,IAAI;AACvB,eAAW,KAAK,QAAQ,IAAI,GAAG;AAC7B,YAAM,cAAc,UAAM,2BAAQ,KAAK,MAAM,QAAQ,GAAG,CAAC;AACzD,YAAM,YAAY,KAAK,QAAQ,WAAW,KAAK,SAAO,EAAE,SAAS,IAAI,GAAG,EAAE,CAAC;AAC3E,UAAI,CAAC;AACH;AAEF,YAAM,QAAQ,UAAM,wBAAK,QAAQ,WAAW,EAAE,QAAQ,GAAG,WAAW,KAAK,EAAE,EAAE,QAAQ,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;AAC1G,WAAK,cAAc,IAAI,GAAG;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AACD,cAAM,gBAAK,QAAQ,SAAS,QAAtB,mBAA2B,UAA3B,4BAAmC,MAAM;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAc;AA1FjC;AA2FI,UAAM,MAAM,UAAU,IAAI;AAC1B,SAAK,cAAc,OAAO,IAAI;AAC9B,YAAM,gBAAK,QAAQ,SAAS,QAAtB,mBAA2B,YAA3B,4BAAqC,MAAM;AAAA,EACnD;AAAA,EAEA,WAAW;AACT,QAAI,CAAC,KAAK;AACR;AAEF,0BAAsB,KAAK,OAAO;AAClC,UAAM,IAAI,yBAAyB;AACnC,SAAK,QAAQ,GAAG,KAAK;AAAA,MACnB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB;AACpB,WAAO,KAAK,QAAQ,SAAS,cAAc,IAAI;AAAA,EACjD;AAAA,EAEA,MAAM,aAAa;AACjB,UAAM,eAAe,KAAK,QAAQ,KAAK,IAAI,CAAC,SAAS;AACnD,YAAM,eAAe,UAAM,2BAAQ,KAAK,QAAQ,MAAM,KAAK,GAAG,CAAC;AAC/D,YAAM,QAAQ,aAAa,cAAc,KAAK,SAAS,IAAI;AAC3D,YAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,aAAO,iCACF,OADE;AAAA,QAEL,OAAO,MAAM,IAAI,UAAQ,MAAM,IAAI,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAED,eAAW,QAAQ;AACjB,YAAM,KAAK,QAAQ,KAAK,OAAO,IAAI;AAErC,UAAM,MAAM,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK;AAAA,EACd;AACF;;;AFhIA,SAAS,YAAY,cAA2B,CAAC,GAAW;AAC1D,MAAI;AAEJ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,eAAe,QAAQ;AAE3B,UACE,CAAC,YAAY,YACV,OAAO,QAAQ,KAAK,OAAK,EAAE,KAAK,SAAS,YAAY,CAAC,GACzD;AACA,oBAAY,WAAW;AAAA,MACzB;AAGA,UACE,CAAC,YAAY,YACV,OAAO,QAAQ,KAAK,OAAK,EAAE,KAAK,SAAS,OAAO,CAAC,GACpD;AACA,oBAAY,WAAW;AAAA,MACzB;AAEA,YAAM,IAAI,YAAY,aAAa,OAAO,IAAI;AAC9C,UAAI,UAAU,OAAO,MAAM;AAC3B,YAAM,IAAI,WAAW;AAAA,IACvB;AAAA,IACA,KAAK;AAAA,MACH,oBAAoB;AAClB,eAAO,IAAI,QAAQ,SAAS,kBAAkB,GAAG;AAAA,MACnD;AAAA,IACF;AAAA,IACA,gBAAgB,QAAQ;AACtB,UAAI,gBAAgB,MAAM;AAAA,IAC5B;AAAA,IACA,UAAU,IAAI;AACZ,UAAI,IAAI,QAAQ,UAAU,SAAS,EAAE;AACnC,eAAO,GAAG,iBAAiB,OAAO,EAAE;AAEtC,UAAI,kBAAkB,KAAK,EAAE;AAC3B,eAAO;AAET,aAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,IAAI;AACb,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF,IAAI,iBAAiB,EAAE;AAEvB,UAAI,aAAa,qBAAqB,UAAU,IAAI,QAAQ,UAAU,SAAS,MAAM;AACnF,eAAO,IAAI,cAAc;AAE3B,UAAI,OAAO,wBAAwB;AACjC,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK;AAAA,QACP;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAgBA,IAAO,gBAAQ;","names":["import_node_path","import_node_process","import_node_path","Debug","micromatch","isNewEscapeSequence","isCloseEscapeSequence","isStartOfLayoutSegment","import_node_path","VUE_MD_EXT_RE","VUE_MD_EXT_RE","parent","VUE_MD_EXT_RE","prepareRoutes","parent","extractComments","YAMLParser","JSON5","VUE_MD_EXT_RE","prepareRoutes","parent","colors","VUE_MD_EXT_RE","process","process"]}
package/dist/index.d.cts CHANGED
@@ -1,11 +1,6 @@
1
1
  import { Logger, ViteDevServer, Plugin } from 'vite';
2
2
  import * as debug from 'debug';
3
3
 
4
- /**
5
- * Promise, or maybe not
6
- */
7
- type Awaitable<T> = T | PromiseLike<T>;
8
-
9
4
  interface PageRoute {
10
5
  path: string;
11
6
  route: string;
@@ -78,6 +73,7 @@ interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'ch
78
73
  }
79
74
  declare function vueResolver(): PageResolver;
80
75
 
76
+ type Awaitable<T> = T | Promise<T>;
81
77
  type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
82
78
  type ImportMode = 'sync' | 'async';
83
79
  type ImportModeResolver = (filepath: string, pluginOptions: ResolvedOptions) => ImportMode;
@@ -223,4 +219,4 @@ declare const syncIndexResolver: ImportModeResolver;
223
219
 
224
220
  declare function pagesPlugin(userOptions?: UserOptions): Plugin;
225
221
 
226
- export { type CustomBlock, type ImportMode, type ImportModeResolver, type InternalPageResolvers, type Optional, PageContext, type PageOptions, type PageResolver, type ParsedJSX, type ReactRoute, type ResolvedOptions, type SolidRoute, type UserOptions, type VueRoute, pagesPlugin as default, reactResolver, solidResolver, syncIndexResolver, vueResolver };
222
+ export { type Awaitable, type CustomBlock, type ImportMode, type ImportModeResolver, type InternalPageResolvers, type Optional, PageContext, type PageOptions, type PageResolver, type ParsedJSX, type ReactRoute, type ResolvedOptions, type SolidRoute, type UserOptions, type VueRoute, pagesPlugin as default, reactResolver, solidResolver, syncIndexResolver, vueResolver };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,6 @@
1
1
  import { Logger, ViteDevServer, Plugin } from 'vite';
2
2
  import * as debug from 'debug';
3
3
 
4
- /**
5
- * Promise, or maybe not
6
- */
7
- type Awaitable<T> = T | PromiseLike<T>;
8
-
9
4
  interface PageRoute {
10
5
  path: string;
11
6
  route: string;
@@ -78,6 +73,7 @@ interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'ch
78
73
  }
79
74
  declare function vueResolver(): PageResolver;
80
75
 
76
+ type Awaitable<T> = T | Promise<T>;
81
77
  type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>;
82
78
  type ImportMode = 'sync' | 'async';
83
79
  type ImportModeResolver = (filepath: string, pluginOptions: ResolvedOptions) => ImportMode;
@@ -223,4 +219,4 @@ declare const syncIndexResolver: ImportModeResolver;
223
219
 
224
220
  declare function pagesPlugin(userOptions?: UserOptions): Plugin;
225
221
 
226
- export { type CustomBlock, type ImportMode, type ImportModeResolver, type InternalPageResolvers, type Optional, PageContext, type PageOptions, type PageResolver, type ParsedJSX, type ReactRoute, type ResolvedOptions, type SolidRoute, type UserOptions, type VueRoute, pagesPlugin as default, reactResolver, solidResolver, syncIndexResolver, vueResolver };
222
+ export { type Awaitable, type CustomBlock, type ImportMode, type ImportModeResolver, type InternalPageResolvers, type Optional, PageContext, type PageOptions, type PageResolver, type ParsedJSX, type ReactRoute, type ResolvedOptions, type SolidRoute, type UserOptions, type VueRoute, pagesPlugin as default, reactResolver, solidResolver, syncIndexResolver, vueResolver };
package/dist/index.js CHANGED
@@ -36,23 +36,12 @@ var cacheAllRouteRE = /^\[\.{3}(.*)\]$/;
36
36
  var replaceDynamicRouteRE = /^\[(?:\.{3})?(.*)\]$/;
37
37
  var nuxtDynamicRouteRE = /^_(.*)$/;
38
38
  var nuxtCacheAllRouteRE = /^_$/;
39
- var countSlashRE = /\//g;
40
39
  var replaceIndexRE = /\/?index$/;
41
40
 
42
41
  // src/context.ts
43
42
  import { join as join2, resolve as resolve3 } from "path";
44
43
  import process2 from "process";
45
44
 
46
- // node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs
47
- function toArray(array) {
48
- array = array != null ? array : [];
49
- return Array.isArray(array) ? array : [array];
50
- }
51
- function slash(str) {
52
- return str.replace(/\\/g, "/");
53
- }
54
- var VOID = Symbol("p-void");
55
-
56
45
  // src/files.ts
57
46
  import { join } from "path";
58
47
  import { globSync } from "tinyglobby";
@@ -62,6 +51,15 @@ import { resolve, win32 } from "path";
62
51
  import { URLSearchParams } from "url";
63
52
  import Debug from "debug";
64
53
  import micromatch from "micromatch";
54
+ var slashRE = /\\/g;
55
+ function slash(str) {
56
+ return str.replace(slashRE, "/");
57
+ }
58
+ function toArray(value) {
59
+ if (value == null)
60
+ return [];
61
+ return Array.isArray(value) ? value : [value];
62
+ }
65
63
  var debug = {
66
64
  hmr: Debug("vite-plugin-pages:hmr"),
67
65
  routeBlock: Debug("vite-plugin-pages:routeBlock"),
@@ -76,7 +74,12 @@ function extsToGlob(extensions) {
76
74
  return extensions.length > 1 ? `{${extensions.join(",")}}` : extensions[0] || "";
77
75
  }
78
76
  function countSlash(value) {
79
- return (value.match(countSlashRE) || []).length;
77
+ let count = 0;
78
+ for (let i = 0; i < value.length; i++) {
79
+ if (value[i] === "/")
80
+ count++;
81
+ }
82
+ return count;
80
83
  }
81
84
  function isPagesDir(path, options) {
82
85
  for (const page of options.dirs) {
@@ -243,7 +246,7 @@ var multilineCommentsRE = /\/\*(.|[\r\n])*?\*\//g;
243
246
  var singlelineCommentsRE = /\/\/.*/g;
244
247
  var VUE_MD_EXT_RE2 = /(\s)/g;
245
248
  function replaceFunction(_, value) {
246
- if (typeof value === "function" || typeof value === "function") {
249
+ if (typeof value === "function") {
247
250
  const fnBody = value.toString().replace(multilineCommentsRE, "").replace(singlelineCommentsRE, "").replace(VUE_MD_EXT_RE2, "");
248
251
  if (fnBody.length < 8 || fnBody.substring(0, 8) !== "function")
249
252
  return `_NuFrRa_${fnBody}`;
@@ -294,6 +297,27 @@ export default routes;`;
294
297
 
295
298
  // src/resolvers/react.ts
296
299
  var VUE_MD_EXT_RE3 = /^\//;
300
+ function sortReactRoutes(routes) {
301
+ routes.sort((a, b) => {
302
+ const weight = (r) => {
303
+ var _a;
304
+ const p = (_a = r.path) != null ? _a : "";
305
+ if (p === "/")
306
+ return 0;
307
+ if (p === "*")
308
+ return 3;
309
+ if (p.startsWith(":"))
310
+ return 2;
311
+ return 1;
312
+ };
313
+ return weight(a) - weight(b);
314
+ });
315
+ for (const route of routes) {
316
+ if (route.children)
317
+ sortReactRoutes(route.children);
318
+ }
319
+ return routes;
320
+ }
297
321
  function prepareRoutes(routes, options, parent) {
298
322
  var _a, _b;
299
323
  for (const route of routes) {
@@ -348,6 +372,7 @@ async function computeReactRoutes(ctx) {
348
372
  parentRoutes.push(route);
349
373
  }
350
374
  });
375
+ sortReactRoutes(routes);
351
376
  let finalRoutes = prepareRoutes(routes, ctx.options);
352
377
  finalRoutes = await ((_b = (_a = ctx.options).onRoutesGenerated) == null ? void 0 : _b.call(_a, finalRoutes)) || finalRoutes;
353
378
  return finalRoutes;
@@ -479,12 +504,13 @@ import { dequal } from "dequal";
479
504
  import colors from "picocolors";
480
505
 
481
506
  // src/customBlock.ts
482
- import fs from "fs";
507
+ import { readFile } from "fs/promises";
483
508
  import extractComments from "extract-comments";
484
509
  import JSON5 from "json5";
485
510
  import { importModule } from "local-pkg";
486
511
  import { parse as YAMLParser } from "yaml";
487
512
  var routeJSXReg = /^\s+(route)\s+/gm;
513
+ var _compilerSfc;
488
514
  function parseJSX(code) {
489
515
  return extractComments(code).slice(0, 1).filter((comment) => routeJSXReg.test(comment.value) && comment.value.includes(":") && comment.loc.start.line === 1);
490
516
  }
@@ -504,7 +530,9 @@ ${err.message}`);
504
530
  }
505
531
  async function parseSFC(code) {
506
532
  try {
507
- const { parse } = await importModule("@vue/compiler-sfc");
533
+ if (!_compilerSfc)
534
+ _compilerSfc = await importModule("@vue/compiler-sfc");
535
+ const { parse } = _compilerSfc;
508
536
  return parse(code, {
509
537
  pad: "space"
510
538
  }).descriptor || parse({
@@ -542,7 +570,7 @@ ${err.message}`);
542
570
  }
543
571
  }
544
572
  async function getRouteBlock(path, options) {
545
- const content = fs.readFileSync(path, "utf8");
573
+ const content = await readFile(path, "utf8");
546
574
  const parsedSFC = await parseSFC(content);
547
575
  const blockStr = parsedSFC == null ? void 0 : parsedSFC.customBlocks.find((b) => b.type === "route");
548
576
  const parsedJSX = parseJSX(content);
@@ -560,9 +588,10 @@ async function getRouteBlock(path, options) {
560
588
  var VUE_MD_EXT_RE5 = /^\//;
561
589
  function prepareRoutes3(ctx, routes, parent) {
562
590
  var _a, _b, _c, _d;
591
+ const indexSuffixRE = new RegExp(`${ctx.options.routeNameSeparator}index$`);
563
592
  for (const route of routes) {
564
593
  if (route.name)
565
- route.name = route.name.replace(new RegExp(`${ctx.options.routeNameSeparator}index$`), "");
594
+ route.name = route.name.replace(indexSuffixRE, "");
566
595
  if (parent)
567
596
  route.path = (_a = route.path) == null ? void 0 : _a.replace(VUE_MD_EXT_RE5, "");
568
597
  if (route.children)
@@ -584,6 +613,7 @@ async function computeVueRoutes(ctx, customBlockMap) {
584
613
  const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options;
585
614
  const pageRoutes = [...ctx.pageRouteMap.values()].sort((a, b) => countSlash(a.route) - countSlash(b.route));
586
615
  const routes = [];
616
+ const routePaths = new Set(pageRoutes.map((p) => p.route));
587
617
  pageRoutes.forEach((page) => {
588
618
  const pathNodes = page.route.split("/");
589
619
  const component = importPath === "relative" ? page.path.replace(ctx.root, "") : page.path;
@@ -626,10 +656,7 @@ async function computeVueRoutes(ctx, customBlockMap) {
626
656
  else
627
657
  route.path += "(.*)";
628
658
  } else if (nuxtStyle && i === pathNodes.length - 1) {
629
- const isIndexFound = pageRoutes.find(({ route: route2 }) => {
630
- return route2 === page.route.replace(pathNodes[i], "index");
631
- });
632
- if (!isIndexFound)
659
+ if (!routePaths.has(page.route.replace(pathNodes[i], "index")))
633
660
  route.path += "?";
634
661
  }
635
662
  } else {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/context.ts","../node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs","../src/files.ts","../src/utils.ts","../src/options.ts","../src/stringify.ts","../src/resolvers/react.ts","../src/resolvers/solid.ts","../src/resolvers/vue.ts","../src/customBlock.ts","../src/index.ts"],"sourcesContent":["export const MODULE_IDS = [\r\n '~pages',\r\n '~react-pages',\r\n '~solid-pages',\r\n 'pages-generated',\r\n 'virtual:generated-pages',\r\n 'virtual:generated-pages-react',\r\n]\r\n\r\nexport const MODULE_ID_VIRTUAL = 'virtual:vite-plugin-pages/generated-pages'\r\nexport const ROUTE_BLOCK_ID_VIRTUAL = 'virtual:vite-plugin-pages/route-block'\r\nexport const ROUTE_IMPORT_NAME = '__pages_import_$1__'\r\n\r\nexport const routeBlockQueryRE = /\\?vue&type=route/\r\n\r\nexport const dynamicRouteRE = /^\\[(.+)\\]$/\r\nexport const cacheAllRouteRE = /^\\[\\.{3}(.*)\\]$/\r\nexport const replaceDynamicRouteRE = /^\\[(?:\\.{3})?(.*)\\]$/\r\n\r\nexport const nuxtDynamicRouteRE = /^_(.*)$/\r\nexport const nuxtCacheAllRouteRE = /^_$/\r\n\r\nexport const countSlashRE = /\\//g\r\n\r\nexport const replaceIndexRE = /\\/?index$/\r\n","import type { Logger, ViteDevServer } from 'vite'\r\nimport type { PageOptions, ResolvedOptions, UserOptions } from './types'\r\nimport { join, resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { slash, toArray } from '@antfu/utils'\r\nimport { getPageFiles } from './files'\r\nimport { resolveOptions } from './options'\r\n\r\nimport { debug, invalidatePagesModule, isTarget } from './utils'\r\n\r\nexport interface PageRoute {\r\n path: string\r\n route: string\r\n}\r\n\r\nexport class PageContext {\r\n private _server: ViteDevServer | undefined\r\n private _pageRouteMap = new Map<string, PageRoute>()\r\n\r\n rawOptions: UserOptions\r\n root: string\r\n options: ResolvedOptions\r\n logger?: Logger\r\n\r\n constructor(userOptions: UserOptions, viteRoot: string = process.cwd()) {\r\n this.rawOptions = userOptions\r\n this.root = slash(viteRoot)\r\n debug.env('root', this.root)\r\n this.options = resolveOptions(userOptions, this.root)\r\n debug.options(this.options)\r\n }\r\n\r\n setLogger(logger: Logger) {\r\n this.logger = logger\r\n }\r\n\r\n setupViteServer(server: ViteDevServer) {\r\n if (this._server === server)\r\n return\r\n\r\n this._server = server\r\n this.setupWatcher(server.watcher)\r\n }\r\n\r\n setupWatcher(watcher: ViteDevServer['watcher']) {\r\n watcher\r\n .on('unlink', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n await this.removePage(path)\r\n this.onUpdate()\r\n })\r\n watcher\r\n .on('add', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this.options.dirs.find(i => path.startsWith(slash(resolve(this.root, i.dir))))!\r\n await this.addPage(path, page)\r\n this.onUpdate()\r\n })\r\n\r\n watcher\r\n .on('change', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this._pageRouteMap.get(path)\r\n if (page)\r\n await this.options.resolver.hmr?.changed?.(this, path)\r\n })\r\n }\r\n\r\n async addPage(path: string | string[], pageDir: PageOptions) {\r\n debug.pages('add', path)\r\n for (const p of toArray(path)) {\r\n const pageDirPath = slash(resolve(this.root, pageDir.dir))\r\n const extension = this.options.extensions.find(ext => p.endsWith(`.${ext}`))\r\n if (!extension)\r\n continue\r\n\r\n const route = slash(join(pageDir.baseRoute, p.replace(`${pageDirPath}/`, '').replace(`.${extension}`, '')))\r\n this._pageRouteMap.set(p, {\r\n path: p,\r\n route,\r\n })\r\n await this.options.resolver.hmr?.added?.(this, p)\r\n }\r\n }\r\n\r\n async removePage(path: string) {\r\n debug.pages('remove', path)\r\n this._pageRouteMap.delete(path)\r\n await this.options.resolver.hmr?.removed?.(this, path)\r\n }\r\n\r\n onUpdate() {\r\n if (!this._server)\r\n return\r\n\r\n invalidatePagesModule(this._server)\r\n debug.hmr('Reload generated pages.')\r\n this._server.ws.send({\r\n type: 'full-reload',\r\n })\r\n }\r\n\r\n async resolveRoutes() {\r\n return this.options.resolver.resolveRoutes(this)\r\n }\r\n\r\n async searchGlob() {\r\n const pageDirFiles = this.options.dirs.map((page) => {\r\n const pagesDirPath = slash(resolve(this.options.root, page.dir))\r\n const files = getPageFiles(pagesDirPath, this.options, page)\r\n debug.search(page.dir, files)\r\n return {\r\n ...page,\r\n files: files.map(file => slash(file)),\r\n }\r\n })\r\n\r\n for (const page of pageDirFiles)\r\n await this.addPage(page.files, page)\r\n\r\n debug.cache(this.pageRouteMap)\r\n }\r\n\r\n get debug() {\r\n return debug\r\n }\r\n\r\n get pageRouteMap() {\r\n return this._pageRouteMap\r\n }\r\n}\r\n","function clamp(n, min, max) {\n return Math.min(max, Math.max(min, n));\n}\nfunction sum(...args) {\n return flattenArrayable(args).reduce((a, b) => a + b, 0);\n}\nfunction lerp(min, max, t) {\n const interpolation = clamp(t, 0, 1);\n return min + (max - min) * interpolation;\n}\nfunction remap(n, inMin, inMax, outMin, outMax) {\n const interpolation = (n - inMin) / (inMax - inMin);\n return lerp(outMin, outMax, interpolation);\n}\n\nfunction toArray(array) {\n array = array ?? [];\n return Array.isArray(array) ? array : [array];\n}\nfunction flattenArrayable(array) {\n return toArray(array).flat(1);\n}\nfunction mergeArrayable(...args) {\n return args.flatMap((i) => toArray(i));\n}\nfunction partition(array, ...filters) {\n const result = Array.from({ length: filters.length + 1 }).fill(null).map(() => []);\n array.forEach((e, idx, arr) => {\n let i = 0;\n for (const filter of filters) {\n if (filter(e, idx, arr)) {\n result[i].push(e);\n return;\n }\n i += 1;\n }\n result[i].push(e);\n });\n return result;\n}\nfunction uniq(array) {\n return Array.from(new Set(array));\n}\nfunction uniqueBy(array, equalFn) {\n return array.reduce((acc, cur) => {\n const index = acc.findIndex((item) => equalFn(cur, item));\n if (index === -1)\n acc.push(cur);\n return acc;\n }, []);\n}\nfunction last(array) {\n return at(array, -1);\n}\nfunction remove(array, value) {\n if (!array)\n return false;\n const index = array.indexOf(value);\n if (index >= 0) {\n array.splice(index, 1);\n return true;\n }\n return false;\n}\nfunction at(array, index) {\n const len = array.length;\n if (!len)\n return void 0;\n if (index < 0)\n index += len;\n return array[index];\n}\nfunction range(...args) {\n let start, stop, step;\n if (args.length === 1) {\n start = 0;\n step = 1;\n [stop] = args;\n } else {\n [start, stop, step = 1] = args;\n }\n const arr = [];\n let current = start;\n while (current < stop) {\n arr.push(current);\n current += step || 1;\n }\n return arr;\n}\nfunction move(arr, from, to) {\n arr.splice(to, 0, arr.splice(from, 1)[0]);\n return arr;\n}\nfunction clampArrayRange(n, arr) {\n return clamp(n, 0, arr.length - 1);\n}\nfunction sample(arr, quantity) {\n return Array.from({ length: quantity }, (_) => arr[Math.round(Math.random() * (arr.length - 1))]);\n}\nfunction shuffle(array) {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n}\nfunction filterInPlace(array, predicate) {\n for (let i = array.length; i--; i >= 0) {\n if (!predicate(array[i], i, array))\n array.splice(i, 1);\n }\n return array;\n}\n\nfunction assert(condition, message) {\n if (!condition)\n throw new Error(message);\n}\nconst toString = (v) => Object.prototype.toString.call(v);\nfunction getTypeName(v) {\n if (v === null)\n return \"null\";\n const type = toString(v).slice(8, -1).toLowerCase();\n return typeof v === \"object\" || typeof v === \"function\" ? type : typeof v;\n}\nfunction noop() {\n}\n\nfunction isDeepEqual(value1, value2) {\n const type1 = getTypeName(value1);\n const type2 = getTypeName(value2);\n if (type1 !== type2)\n return false;\n if (type1 === \"array\") {\n if (value1.length !== value2.length)\n return false;\n return value1.every((item, i) => {\n return isDeepEqual(item, value2[i]);\n });\n }\n if (type1 === \"object\") {\n const keyArr = Object.keys(value1);\n if (keyArr.length !== Object.keys(value2).length)\n return false;\n return keyArr.every((key) => {\n return isDeepEqual(value1[key], value2[key]);\n });\n }\n return Object.is(value1, value2);\n}\n\nfunction batchInvoke(functions) {\n functions.forEach((fn) => fn && fn());\n}\nfunction invoke(fn) {\n return fn();\n}\nfunction tap(value, callback) {\n callback(value);\n return value;\n}\n\nfunction notNullish(v) {\n return v != null;\n}\nfunction noNull(v) {\n return v !== null;\n}\nfunction notUndefined(v) {\n return v !== void 0;\n}\nfunction isTruthy(v) {\n return Boolean(v);\n}\n\nconst isDef = (val) => typeof val !== \"undefined\";\nconst isBoolean = (val) => typeof val === \"boolean\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isNumber = (val) => typeof val === \"number\";\nconst isString = (val) => typeof val === \"string\";\nconst isObject = (val) => toString(val) === \"[object Object]\";\nconst isUndefined = (val) => toString(val) === \"[object Undefined]\";\nconst isNull = (val) => toString(val) === \"[object Null]\";\nconst isRegExp = (val) => toString(val) === \"[object RegExp]\";\nconst isDate = (val) => toString(val) === \"[object Date]\";\nfunction isPrimitive(val) {\n return !val || Object(val) !== val;\n}\nconst isWindow = (val) => typeof window !== \"undefined\" && toString(val) === \"[object Window]\";\nconst isBrowser = typeof window !== \"undefined\";\n\nfunction slash(str) {\n return str.replace(/\\\\/g, \"/\");\n}\nfunction ensurePrefix(prefix, str) {\n if (!str.startsWith(prefix))\n return prefix + str;\n return str;\n}\nfunction ensureSuffix(suffix, str) {\n if (!str.endsWith(suffix))\n return str + suffix;\n return str;\n}\nfunction template(str, ...args) {\n const [firstArg, fallback] = args;\n if (isObject(firstArg)) {\n const vars = firstArg;\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => vars[key] || ((typeof fallback === \"function\" ? fallback(key) : fallback) ?? key));\n } else {\n return str.replace(/\\{(\\d+)\\}/g, (_, key) => {\n const index = Number(key);\n if (Number.isNaN(index))\n return key;\n return args[index];\n });\n }\n}\nconst urlAlphabet = \"useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict\";\nfunction randomStr(size = 16, dict = urlAlphabet) {\n let id = \"\";\n let i = size;\n const len = dict.length;\n while (i--)\n id += dict[Math.random() * len | 0];\n return id;\n}\nfunction capitalize(str) {\n return str[0].toUpperCase() + str.slice(1).toLowerCase();\n}\nconst _reFullWs = /^\\s*$/;\nfunction unindent(str) {\n const lines = (typeof str === \"string\" ? str : str[0]).split(\"\\n\");\n const whitespaceLines = lines.map((line) => _reFullWs.test(line));\n const commonIndent = lines.reduce((min, line, idx) => {\n if (whitespaceLines[idx])\n return min;\n const indent = line.match(/^\\s*/)?.[0].length;\n return indent === void 0 ? min : Math.min(min, indent);\n }, Number.POSITIVE_INFINITY);\n let emptyLinesHead = 0;\n while (emptyLinesHead < lines.length && whitespaceLines[emptyLinesHead])\n emptyLinesHead++;\n let emptyLinesTail = 0;\n while (emptyLinesTail < lines.length && whitespaceLines[lines.length - emptyLinesTail - 1])\n emptyLinesTail++;\n return lines.slice(emptyLinesHead, lines.length - emptyLinesTail).map((line) => line.slice(commonIndent)).join(\"\\n\");\n}\n\nfunction objectMap(obj, fn) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => fn(k, v)).filter(notNullish)\n );\n}\nfunction isKeyOf(obj, k) {\n return k in obj;\n}\nfunction objectKeys(obj) {\n return Object.keys(obj);\n}\nfunction objectEntries(obj) {\n return Object.entries(obj);\n}\nfunction deepMerge(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (source === void 0)\n return target;\n if (isMergableObject(target) && isMergableObject(source)) {\n objectKeys(source).forEach((key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\")\n return;\n if (isMergableObject(source[key])) {\n if (!target[key])\n target[key] = {};\n if (isMergableObject(target[key])) {\n deepMerge(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n } else {\n target[key] = source[key];\n }\n });\n }\n return deepMerge(target, ...sources);\n}\nfunction deepMergeWithArray(target, ...sources) {\n if (!sources.length)\n return target;\n const source = sources.shift();\n if (source === void 0)\n return target;\n if (Array.isArray(target) && Array.isArray(source))\n target.push(...source);\n if (isMergableObject(target) && isMergableObject(source)) {\n objectKeys(source).forEach((key) => {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\")\n return;\n if (Array.isArray(source[key])) {\n if (!target[key])\n target[key] = [];\n deepMergeWithArray(target[key], source[key]);\n } else if (isMergableObject(source[key])) {\n if (!target[key])\n target[key] = {};\n deepMergeWithArray(target[key], source[key]);\n } else {\n target[key] = source[key];\n }\n });\n }\n return deepMergeWithArray(target, ...sources);\n}\nfunction isMergableObject(item) {\n return isObject(item) && !Array.isArray(item);\n}\nfunction objectPick(obj, keys, omitUndefined = false) {\n return keys.reduce((n, k) => {\n if (k in obj) {\n if (!omitUndefined || obj[k] !== void 0)\n n[k] = obj[k];\n }\n return n;\n }, {});\n}\nfunction objectOmit(obj, keys, omitUndefined = false) {\n return Object.fromEntries(Object.entries(obj).filter(([key, value]) => {\n return (!omitUndefined || value !== void 0) && !keys.includes(key);\n }));\n}\nfunction clearUndefined(obj) {\n Object.keys(obj).forEach((key) => obj[key] === void 0 ? delete obj[key] : {});\n return obj;\n}\nfunction hasOwnProperty(obj, v) {\n if (obj == null)\n return false;\n return Object.prototype.hasOwnProperty.call(obj, v);\n}\nconst _objectIdMap = /* @__PURE__ */ new WeakMap();\nfunction objectId(obj) {\n if (isPrimitive(obj))\n return obj;\n if (!_objectIdMap.has(obj)) {\n _objectIdMap.set(obj, randomStr());\n }\n return _objectIdMap.get(obj);\n}\n\n/*\nHow it works:\n`this.#head` is an instance of `Node` which keeps track of its current value and nests another instance of `Node` that keeps the value that comes after it. When a value is provided to `.enqueue()`, the code needs to iterate through `this.#head`, going deeper and deeper to find the last value. However, iterating through every single item is slow. This problem is solved by saving a reference to the last value as `this.#tail` so that it can reference it to add a new value.\n*/\n\nclass Node {\n\tvalue;\n\tnext;\n\n\tconstructor(value) {\n\t\tthis.value = value;\n\t}\n}\n\nclass Queue {\n\t#head;\n\t#tail;\n\t#size;\n\n\tconstructor() {\n\t\tthis.clear();\n\t}\n\n\tenqueue(value) {\n\t\tconst node = new Node(value);\n\n\t\tif (this.#head) {\n\t\t\tthis.#tail.next = node;\n\t\t\tthis.#tail = node;\n\t\t} else {\n\t\t\tthis.#head = node;\n\t\t\tthis.#tail = node;\n\t\t}\n\n\t\tthis.#size++;\n\t}\n\n\tdequeue() {\n\t\tconst current = this.#head;\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#head = this.#head.next;\n\t\tthis.#size--;\n\t\treturn current.value;\n\t}\n\n\tpeek() {\n\t\tif (!this.#head) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn this.#head.value;\n\n\t\t// TODO: Node.js 18.\n\t\t// return this.#head?.value;\n\t}\n\n\tclear() {\n\t\tthis.#head = undefined;\n\t\tthis.#tail = undefined;\n\t\tthis.#size = 0;\n\t}\n\n\tget size() {\n\t\treturn this.#size;\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tlet current = this.#head;\n\n\t\twhile (current) {\n\t\t\tyield current.value;\n\t\t\tcurrent = current.next;\n\t\t}\n\t}\n\n\t* drain() {\n\t\twhile (this.#head) {\n\t\t\tyield this.dequeue();\n\t\t}\n\t}\n}\n\nfunction pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\t// Process the next queued function if we're under the concurrency limit\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tactiveCount++;\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\t// Execute the function and capture the result promise\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\t// Resolve immediately with the promise (don't wait for completion)\n\t\tresolve(result);\n\n\t\t// Wait for the function to complete (success or failure)\n\t\t// We catch errors here to prevent unhandled rejections,\n\t\t// but the original promise rejection is preserved for the caller\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\t// Decrement active count and process next queued function\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue the internal resolve function instead of the run function\n\t\t// to preserve the asynchronous execution context.\n\t\tnew Promise(internalResolve => { // eslint-disable-line promise/param-names\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(run.bind(undefined, function_, resolve, arguments_)); // eslint-disable-line promise/prefer-await-to-then\n\n\t\t// Start processing immediately if we haven't reached the concurrency limit\n\t\tif (activeCount < concurrency) {\n\t\t\tresumeNext();\n\t\t}\n\t};\n\n\tconst generator = (function_, ...arguments_) => new Promise(resolve => {\n\t\tenqueue(function_, resolve, arguments_);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue() {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t\tconcurrency: {\n\t\t\tget: () => concurrency,\n\n\t\t\tset(newConcurrency) {\n\t\t\t\tvalidateConcurrency(newConcurrency);\n\t\t\t\tconcurrency = newConcurrency;\n\n\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t// eslint-disable-next-line no-unmodified-loop-condition\n\t\t\t\t\twhile (activeCount < concurrency && queue.size > 0) {\n\t\t\t\t\t\tresumeNext();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t\tmap: {\n\t\t\tasync value(array, function_) {\n\t\t\t\tconst promises = array.map((value, index) => this(function_, value, index));\n\t\t\t\treturn Promise.all(promises);\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n\nfunction validateConcurrency(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n}\n\nconst VOID = Symbol(\"p-void\");\nclass PInstance extends Promise {\n constructor(items = [], options) {\n super(() => {\n });\n this.items = items;\n this.options = options;\n }\n promises = /* @__PURE__ */ new Set();\n get promise() {\n let batch;\n const items = [...Array.from(this.items), ...Array.from(this.promises)];\n if (this.options?.concurrency) {\n const limit = pLimit(this.options.concurrency);\n batch = Promise.all(items.map((p2) => limit(() => p2)));\n } else {\n batch = Promise.all(items);\n }\n return batch.then((l) => l.filter((i) => i !== VOID));\n }\n add(...args) {\n args.forEach((i) => {\n this.promises.add(i);\n });\n }\n map(fn) {\n return new PInstance(\n Array.from(this.items).map(async (i, idx) => {\n const v = await i;\n if (v === VOID)\n return VOID;\n return fn(v, idx);\n }),\n this.options\n );\n }\n filter(fn) {\n return new PInstance(\n Array.from(this.items).map(async (i, idx) => {\n const v = await i;\n const r = await fn(v, idx);\n if (!r)\n return VOID;\n return v;\n }),\n this.options\n );\n }\n forEach(fn) {\n return this.map(fn).then();\n }\n reduce(fn, initialValue) {\n return this.promise.then((array) => array.reduce(fn, initialValue));\n }\n clear() {\n this.promises.clear();\n }\n then(onfulfilled, onrejected) {\n return this.promise.then(onfulfilled, onrejected);\n }\n catch(fn) {\n return this.promise.catch(fn);\n }\n finally(fn) {\n return this.promise.finally(fn);\n }\n}\nfunction p(items, options) {\n return new PInstance(items, options);\n}\n\nfunction createSingletonPromise(fn) {\n let _promise;\n function wrapper() {\n if (!_promise)\n _promise = fn();\n return _promise;\n }\n wrapper.reset = async () => {\n const _prev = _promise;\n _promise = void 0;\n if (_prev)\n await _prev;\n };\n return wrapper;\n}\nfunction sleep(ms, callback) {\n return new Promise(\n (resolve) => setTimeout(async () => {\n await callback?.();\n resolve();\n }, ms)\n );\n}\nfunction createPromiseLock() {\n const locks = [];\n return {\n async run(fn) {\n const p = fn();\n locks.push(p);\n try {\n return await p;\n } finally {\n remove(locks, p);\n }\n },\n async wait() {\n await Promise.allSettled(locks);\n },\n isWaiting() {\n return Boolean(locks.length);\n },\n clear() {\n locks.length = 0;\n }\n };\n}\nfunction createControlledPromise() {\n let resolve, reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n}\n\nconst timestamp = () => +Date.now();\n\n/* eslint-disable no-undefined,no-param-reassign,no-shadow */\n\n/**\n * Throttle execution of a function. Especially useful for rate limiting\n * execution of handlers on events like resize and scroll.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher)\n * are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through,\n * as-is, to `callback` when the throttled-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.noTrailing] - Optional, defaults to false. If noTrailing is true, callback will only execute every `delay` milliseconds\n * while the throttled-function is being called. If noTrailing is false or unspecified, callback will be executed\n * one final time after the last throttled-function call. (After the throttled-function has not been called for\n * `delay` milliseconds, the internal counter is reset).\n * @param {boolean} [options.noLeading] - Optional, defaults to false. If noLeading is false, the first throttled-function call will execute callback\n * immediately. If noLeading is true, the first the callback execution will be skipped. It should be noted that\n * callback will never executed if both noLeading = true and noTrailing = true.\n * @param {boolean} [options.debounceMode] - If `debounceMode` is true (at begin), schedule `clear` to execute after `delay` ms. If `debounceMode` is\n * false (at end), schedule `callback` to execute after `delay` ms.\n *\n * @returns {Function} A new, throttled, function.\n */\nfunction throttle$1 (delay, callback, options) {\n var _ref = options || {},\n _ref$noTrailing = _ref.noTrailing,\n noTrailing = _ref$noTrailing === void 0 ? false : _ref$noTrailing,\n _ref$noLeading = _ref.noLeading,\n noLeading = _ref$noLeading === void 0 ? false : _ref$noLeading,\n _ref$debounceMode = _ref.debounceMode,\n debounceMode = _ref$debounceMode === void 0 ? undefined : _ref$debounceMode;\n /*\n * After wrapper has stopped being called, this timeout ensures that\n * `callback` is executed at the proper times in `throttle` and `end`\n * debounce modes.\n */\n\n\n var timeoutID;\n var cancelled = false; // Keep track of the last time `callback` was executed.\n\n var lastExec = 0; // Function to clear existing timeout\n\n function clearExistingTimeout() {\n if (timeoutID) {\n clearTimeout(timeoutID);\n }\n } // Function to cancel next exec\n\n\n function cancel(options) {\n var _ref2 = options || {},\n _ref2$upcomingOnly = _ref2.upcomingOnly,\n upcomingOnly = _ref2$upcomingOnly === void 0 ? false : _ref2$upcomingOnly;\n\n clearExistingTimeout();\n cancelled = !upcomingOnly;\n }\n /*\n * The `wrapper` function encapsulates all of the throttling / debouncing\n * functionality and when executed will limit the rate at which `callback`\n * is executed.\n */\n\n\n function wrapper() {\n for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) {\n arguments_[_key] = arguments[_key];\n }\n\n var self = this;\n var elapsed = Date.now() - lastExec;\n\n if (cancelled) {\n return;\n } // Execute `callback` and update the `lastExec` timestamp.\n\n\n function exec() {\n lastExec = Date.now();\n callback.apply(self, arguments_);\n }\n /*\n * If `debounceMode` is true (at begin) this is used to clear the flag\n * to allow future `callback` executions.\n */\n\n\n function clear() {\n timeoutID = undefined;\n }\n\n if (!noLeading && debounceMode && !timeoutID) {\n /*\n * Since `wrapper` is being called for the first time and\n * `debounceMode` is true (at begin), execute `callback`\n * and noLeading != true.\n */\n exec();\n }\n\n clearExistingTimeout();\n\n if (debounceMode === undefined && elapsed > delay) {\n if (noLeading) {\n /*\n * In throttle mode with noLeading, if `delay` time has\n * been exceeded, update `lastExec` and schedule `callback`\n * to execute after `delay` ms.\n */\n lastExec = Date.now();\n\n if (!noTrailing) {\n timeoutID = setTimeout(debounceMode ? clear : exec, delay);\n }\n } else {\n /*\n * In throttle mode without noLeading, if `delay` time has been exceeded, execute\n * `callback`.\n */\n exec();\n }\n } else if (noTrailing !== true) {\n /*\n * In trailing throttle mode, since `delay` time has not been\n * exceeded, schedule `callback` to execute `delay` ms after most\n * recent execution.\n *\n * If `debounceMode` is true (at begin), schedule `clear` to execute\n * after `delay` ms.\n *\n * If `debounceMode` is false (at end), schedule `callback` to\n * execute after `delay` ms.\n */\n timeoutID = setTimeout(debounceMode ? clear : exec, debounceMode === undefined ? delay - elapsed : delay);\n }\n }\n\n wrapper.cancel = cancel; // Return the wrapper function.\n\n return wrapper;\n}\n\n/* eslint-disable no-undefined */\n/**\n * Debounce execution of a function. Debouncing, unlike throttling,\n * guarantees that a function is only executed a single time, either at the\n * very beginning of a series of calls, or at the very end.\n *\n * @param {number} delay - A zero-or-greater delay in milliseconds. For event callbacks, values around 100 or 250 (or even higher) are most useful.\n * @param {Function} callback - A function to be executed after delay milliseconds. The `this` context and all arguments are passed through, as-is,\n * to `callback` when the debounced-function is executed.\n * @param {object} [options] - An object to configure options.\n * @param {boolean} [options.atBegin] - Optional, defaults to false. If atBegin is false or unspecified, callback will only be executed `delay` milliseconds\n * after the last debounced-function call. If atBegin is true, callback will be executed only at the first debounced-function call.\n * (After the throttled-function has not been called for `delay` milliseconds, the internal counter is reset).\n *\n * @returns {Function} A new, debounced function.\n */\n\nfunction debounce$1 (delay, callback, options) {\n var _ref = options || {},\n _ref$atBegin = _ref.atBegin,\n atBegin = _ref$atBegin === void 0 ? false : _ref$atBegin;\n\n return throttle$1(delay, callback, {\n debounceMode: atBegin !== false\n });\n}\n\nfunction throttle(...args) {\n return throttle$1(...args);\n}\nfunction debounce(...args) {\n return debounce$1(...args);\n}\n\nexport { assert, at, batchInvoke, capitalize, clamp, clampArrayRange, clearUndefined, createControlledPromise, createPromiseLock, createSingletonPromise, debounce, deepMerge, deepMergeWithArray, ensurePrefix, ensureSuffix, filterInPlace, flattenArrayable, getTypeName, hasOwnProperty, invoke, isBoolean, isBrowser, isDate, isDeepEqual, isDef, isFunction, isKeyOf, isNull, isNumber, isObject, isPrimitive, isRegExp, isString, isTruthy, isUndefined, isWindow, last, lerp, mergeArrayable, move, noNull, noop, notNullish, notUndefined, objectEntries, objectId, objectKeys, objectMap, objectOmit, objectPick, p, partition, randomStr, range, remap, remove, sample, shuffle, slash, sleep, sum, tap, template, throttle, timestamp, toArray, toString, unindent, uniq, uniqueBy };\n","import type { PageOptions, ResolvedOptions } from './types'\r\nimport { join } from 'node:path'\r\nimport { slash } from '@antfu/utils'\r\nimport { globSync } from 'tinyglobby'\r\n\r\nimport { extsToGlob } from './utils'\r\n\r\n/**\r\n * Resolves the page dirs for its for its given globs\r\n */\r\nconst VUE_MD_EXT_RE = /\\/$/\r\nexport function getPageDirs(PageOptions: PageOptions, root: string, exclude: string[]): PageOptions[] {\r\n const dirs = globSync(slash(PageOptions.dir), {\r\n ignore: exclude,\r\n onlyDirectories: true,\r\n dot: true,\r\n expandDirectories: false,\r\n cwd: root,\r\n })\r\n\r\n const pageDirs = dirs.map(dir => ({\r\n ...PageOptions,\r\n dir: dir.replace(VUE_MD_EXT_RE, ''),\r\n }))\r\n\r\n return pageDirs\r\n}\r\n\r\n/**\r\n * Resolves the files that are valid pages for the given context.\r\n */\r\nexport function getPageFiles(path: string, options: ResolvedOptions, pageOptions?: PageOptions): string[] {\r\n const {\r\n exclude,\r\n extensions,\r\n } = options\r\n\r\n const ext = extsToGlob(extensions)\r\n const pattern = pageOptions?.filePattern ?? `**/*.${ext}`\r\n\r\n const files = globSync(pattern, {\r\n ignore: exclude,\r\n onlyFiles: true,\r\n cwd: path,\r\n }).map(p => slash(join(path, p)))\r\n\r\n return files\r\n}\r\n","import type { ModuleNode, ViteDevServer } from 'vite'\r\nimport type { ResolvedOptions } from './types'\r\nimport { resolve, win32 } from 'node:path'\r\nimport { URLSearchParams } from 'node:url'\r\nimport { slash } from '@antfu/utils'\r\nimport Debug from 'debug'\r\nimport micromatch from 'micromatch'\r\n\r\nimport { cacheAllRouteRE, countSlashRE, dynamicRouteRE, MODULE_ID_VIRTUAL, nuxtCacheAllRouteRE, nuxtDynamicRouteRE, replaceDynamicRouteRE, replaceIndexRE } from './constants'\r\n\r\nexport const debug = {\r\n hmr: Debug('vite-plugin-pages:hmr'),\r\n routeBlock: Debug('vite-plugin-pages:routeBlock'),\r\n options: Debug('vite-plugin-pages:options'),\r\n pages: Debug('vite-plugin-pages:pages'),\r\n search: Debug('vite-plugin-pages:search'),\r\n env: Debug('vite-plugin-pages:env'),\r\n cache: Debug('vite-plugin-pages:cache'),\r\n resolver: Debug('vite-plugin-pages:resolver'),\r\n}\r\n\r\nexport function extsToGlob(extensions: string[]) {\r\n return extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0] || ''\r\n}\r\n\r\nexport function countSlash(value: string) {\r\n return (value.match(countSlashRE) || []).length\r\n}\r\n\r\nfunction isPagesDir(path: string, options: ResolvedOptions) {\r\n for (const page of options.dirs) {\r\n const dirPath = slash(resolve(options.root, page.dir))\r\n if (path.startsWith(dirPath))\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isTarget(path: string, options: ResolvedOptions) {\r\n return isPagesDir(path, options) && !micromatch.isMatch(path, options.exclude) && options.extensionsRE.test(path)\r\n}\r\n\r\nexport function isDynamicRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtDynamicRouteRE.test(routePath)\r\n : dynamicRouteRE.test(routePath)\r\n}\r\n\r\nexport function isCatchAllRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtCacheAllRouteRE.test(routePath)\r\n : cacheAllRouteRE.test(routePath)\r\n}\r\n\r\nexport function resolveImportMode(\r\n filepath: string,\r\n options: ResolvedOptions,\r\n) {\r\n const mode = options.importMode\r\n if (typeof mode === 'function')\r\n return mode(filepath, options)\r\n return mode\r\n}\r\n\r\nexport function invalidatePagesModule(server: ViteDevServer) {\r\n const { moduleGraph } = server\r\n const mods = moduleGraph.getModulesByFile(MODULE_ID_VIRTUAL)\r\n if (mods) {\r\n const seen = new Set<ModuleNode>()\r\n mods.forEach((mod) => {\r\n moduleGraph.invalidateModule(mod, seen)\r\n })\r\n }\r\n}\r\n\r\nexport function normalizeCase(str: string, caseSensitive: boolean) {\r\n if (!caseSensitive)\r\n return str.toLocaleLowerCase()\r\n return str\r\n}\r\n\r\nexport function normalizeName(name: string, isDynamic: boolean, nuxtStyle = false) {\r\n if (!isDynamic)\r\n return name\r\n\r\n return nuxtStyle\r\n ? name.replace(nuxtDynamicRouteRE, '$1') || 'all'\r\n : name.replace(replaceDynamicRouteRE, '$1')\r\n}\r\n\r\nexport function buildReactRoutePath(node: string, nuxtStyle = false): string | undefined {\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n\r\n if (isDynamic) {\r\n if (isCatchAll)\r\n return '*'\r\n\r\n return `:${normalizedName}`\r\n }\r\n\r\n return `${normalizedName}`\r\n}\r\n\r\n// https://github.dev/remix-run/remix/blob/264e3f8884c5cafd8d06acc3e01153b376745b7c/packages/remix-dev/config/routesConvention.ts#L105\r\nexport function buildReactRemixRoutePath(node: string): string | undefined {\r\n const escapeStart = '['\r\n const escapeEnd = ']'\r\n let result = ''\r\n let rawSegmentBuffer = ''\r\n\r\n let inEscapeSequence = 0\r\n let skipSegment = false\r\n for (let i = 0; i < node.length; i++) {\r\n const char = node.charAt(i)\r\n const lastChar = i > 0 ? node.charAt(i - 1) : undefined\r\n const nextChar = i < node.length - 1 ? node.charAt(i + 1) : undefined\r\n\r\n function isNewEscapeSequence() {\r\n return (\r\n !inEscapeSequence && char === escapeStart && lastChar !== escapeStart\r\n )\r\n }\r\n\r\n function isCloseEscapeSequence() {\r\n return inEscapeSequence && char === escapeEnd && nextChar !== escapeEnd\r\n }\r\n\r\n function isStartOfLayoutSegment() {\r\n return char === '_' && nextChar === '_' && !rawSegmentBuffer\r\n }\r\n\r\n if (skipSegment) {\r\n if (char === '/' || char === '.' || char === win32.sep)\r\n skipSegment = false\r\n\r\n continue\r\n }\r\n\r\n if (isNewEscapeSequence()) {\r\n inEscapeSequence++\r\n continue\r\n }\r\n\r\n if (isCloseEscapeSequence()) {\r\n inEscapeSequence--\r\n continue\r\n }\r\n\r\n if (inEscapeSequence) {\r\n result += char\r\n continue\r\n }\r\n\r\n if (char === '/' || char === win32.sep || char === '.') {\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n else result += '/'\r\n\r\n rawSegmentBuffer = ''\r\n continue\r\n }\r\n\r\n if (isStartOfLayoutSegment()) {\r\n skipSegment = true\r\n continue\r\n }\r\n\r\n rawSegmentBuffer += char\r\n\r\n if (char === '$') {\r\n result += typeof nextChar === 'undefined' ? '*' : ':'\r\n continue\r\n }\r\n\r\n result += char\r\n }\r\n\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n\r\n return result || undefined\r\n}\r\n\r\nexport function parsePageRequest(id: string) {\r\n const [moduleId, rawQuery] = id.split('?', 2)\r\n const query = new URLSearchParams(rawQuery)\r\n const pageId = query.get('id')\r\n return {\r\n moduleId,\r\n query,\r\n pageId,\r\n }\r\n}\r\n","import type { ImportModeResolver, ResolvedOptions, UserOptions } from './types'\r\nimport { resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { slash, toArray } from '@antfu/utils'\r\n\r\nimport { MODULE_IDS } from './constants'\r\nimport { getPageDirs } from './files'\r\nimport { reactResolver, solidResolver, vueResolver } from './resolvers'\r\n\r\nconst VUE_MD_EXT_RE = /^\\//\r\nconst VUE_MD_EXT_RE1 = /\\/$/\r\nfunction resolvePageDirs(dirs: UserOptions['dirs'], root: string, exclude: string[]) {\r\n dirs = toArray(dirs)\r\n return dirs.flatMap((dir) => {\r\n const option = typeof dir === 'string'\r\n ? { dir, baseRoute: '' }\r\n : dir\r\n\r\n option.dir = slash(resolve(root, option.dir)).replace(`${root}/`, '')\r\n option.baseRoute = option.baseRoute.replace(VUE_MD_EXT_RE, '').replace(VUE_MD_EXT_RE1, '')\r\n\r\n return getPageDirs(option, root, exclude)\r\n })\r\n}\r\n\r\nexport const syncIndexResolver: ImportModeResolver = (filepath, options) => {\r\n for (const page of options.dirs) {\r\n if (page.baseRoute === '' && filepath.startsWith(`/${page.dir}/index`))\r\n return 'sync'\r\n }\r\n return 'async'\r\n}\r\n\r\nfunction getResolver(originalResolver: UserOptions['resolver']) {\r\n let resolver = originalResolver || 'vue'\r\n\r\n if (typeof resolver !== 'string')\r\n return resolver\r\n\r\n switch (resolver) {\r\n case 'vue':\r\n resolver = vueResolver()\r\n break\r\n case 'react':\r\n resolver = reactResolver()\r\n break\r\n case 'solid':\r\n resolver = solidResolver()\r\n break\r\n default:\r\n throw new Error(`Unsupported resolver: ${resolver}`)\r\n }\r\n return resolver\r\n}\r\n\r\nexport function resolveOptions(userOptions: UserOptions, viteRoot?: string): ResolvedOptions {\r\n const {\r\n dirs = ['src/pages'],\r\n routeBlockLang = 'json5',\r\n exclude = ['node_modules', '.git', '**/__*__/**'],\r\n caseSensitive = false,\r\n routeNameSeparator = '-',\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n } = userOptions\r\n\r\n const root = viteRoot || slash(process.cwd())\r\n\r\n const importMode = userOptions.importMode || syncIndexResolver\r\n\r\n const importPath = userOptions.importPath || 'relative'\r\n\r\n const resolver = getResolver(userOptions.resolver)\r\n\r\n const extensions = userOptions.extensions || resolver.resolveExtensions()\r\n\r\n const extensionsRE = new RegExp(`\\\\.(${extensions.join('|')})$`)\r\n\r\n const resolvedDirs = resolvePageDirs(dirs, root, exclude)\r\n\r\n const routeStyle = userOptions.routeStyle || 'next'\r\n\r\n const moduleIds = userOptions.moduleId\r\n ? [userOptions.moduleId]\r\n : resolver.resolveModuleIds?.() || MODULE_IDS\r\n\r\n const resolvedOptions: ResolvedOptions = {\r\n dirs: resolvedDirs,\r\n routeStyle,\r\n routeBlockLang,\r\n moduleIds,\r\n root,\r\n extensions,\r\n importMode,\r\n importPath,\r\n exclude,\r\n caseSensitive,\r\n resolver,\r\n extensionsRE,\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n routeNameSeparator,\r\n }\r\n\r\n return resolvedOptions\r\n}\r\n","import type { ResolvedOptions } from './types'\r\nimport { ROUTE_IMPORT_NAME } from './constants'\r\n\r\nimport { resolveImportMode } from './utils'\r\n\r\nconst componentRE = /\"(?:component|element)\":(\"(.*?)\")/g\r\nconst hasFunctionRE = /\"(?:props|beforeEnter)\":(\"(.*?)\")/g\r\n\r\nconst multilineCommentsRE = /\\/\\*(.|[\\r\\n])*?\\*\\//g\r\nconst singlelineCommentsRE = /\\/\\/.*/g\r\nconst VUE_MD_EXT_RE = /(\\s)/g\r\nfunction replaceFunction(_: any, value: any) {\r\n if (typeof value === 'function' || typeof value === 'function') {\r\n const fnBody = value.toString()\r\n .replace(multilineCommentsRE, '')\r\n .replace(singlelineCommentsRE, '')\r\n .replace(VUE_MD_EXT_RE, '')\r\n\r\n // ES6 Arrow Function\r\n if (fnBody.length < 8 || fnBody.substring(0, 8) !== 'function')\r\n return `_NuFrRa_${fnBody}`\r\n\r\n return fnBody\r\n }\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * Creates a stringified Vue Router route definition.\r\n */\r\nexport function stringifyRoutes(\r\n preparedRoutes: any[],\r\n options: ResolvedOptions,\r\n) {\r\n const importsMap: Map<string, string> = new Map()\r\n\r\n function getImportString(path: string, importName: string) {\r\n const mode = resolveImportMode(path, options)\r\n return mode === 'sync'\r\n ? `import ${importName} from \"${path}\"`\r\n : `const ${importName} = ${\r\n options.resolver.stringify?.dynamicImport?.(path) || `() => import(\"${path}\")`\r\n }`\r\n }\r\n\r\n function componentReplacer(str: string, replaceStr: string, path: string) {\r\n let importName = importsMap.get(path)\r\n\r\n if (!importName)\r\n importName = ROUTE_IMPORT_NAME.replace('$1', `${importsMap.size}`)\r\n\r\n importsMap.set(path, importName)\r\n\r\n importName = options.resolver.stringify?.component?.(importName) || importName\r\n\r\n return str.replace(replaceStr, importName)\r\n }\r\n\r\n function functionReplacer(str: string, replaceStr: string, content: string) {\r\n if (content.startsWith('function'))\r\n return str.replace(replaceStr, content)\r\n\r\n if (content.startsWith('_NuFrRa_'))\r\n return str.replace(replaceStr, content.slice(8))\r\n\r\n return str\r\n }\r\n\r\n const stringRoutes = JSON\r\n .stringify(preparedRoutes, replaceFunction)\r\n .replace(componentRE, componentReplacer)\r\n .replace(hasFunctionRE, functionReplacer)\r\n\r\n const imports = Array.from(importsMap).map(args => getImportString(...args))\r\n\r\n return {\r\n imports,\r\n stringRoutes,\r\n }\r\n}\r\n\r\nexport function generateClientCode(routes: any[], options: ResolvedOptions) {\r\n const { imports, stringRoutes } = stringifyRoutes(routes, options)\r\n const code = `${imports.join(';\\n')};\\n\\nconst routes = ${stringRoutes};\\n\\nexport default routes;`\r\n return options.resolver.stringify?.final?.(code) || code\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface ReactRouteBase {\r\n caseSensitive?: boolean\r\n children?: ReactRouteBase[]\r\n element?: string\r\n index?: boolean\r\n path?: string\r\n rawRoute: string\r\n}\r\n\r\nexport interface ReactRoute extends Omit<Optional<ReactRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: ReactRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n routes: ReactRoute[],\r\n options: ResolvedOptions,\r\n parent?: ReactRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(route.children, options, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeReactRoutes(ctx: PageContext): Promise<ReactRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: ReactRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n\r\n const route: ReactRouteBase = {\r\n caseSensitive,\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n if (i === pathNodes.length - 1)\r\n route.element = element\r\n\r\n const isIndexRoute = normalizeCase(node, caseSensitive).endsWith('index')\r\n\r\n if (!route.path && isIndexRoute) {\r\n route.path = '/'\r\n }\r\n else if (!isIndexRoute) {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node)\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle)\r\n }\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exits in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n const exits = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exits)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(routes, ctx.options)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveReactRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeReactRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function reactResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~react-pages', 'virtual:generated-pages-react']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveReactRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeReactRoutes(ctx)\r\n },\r\n stringify: {\r\n component: path => `React.createElement(${path})`,\r\n dynamicImport: path => `React.lazy(() => import(\"${path}\"))`,\r\n final: code => `import React from \"react\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface SolidRouteBase {\r\n rawRoute: string\r\n path: string\r\n children?: SolidRouteBase[]\r\n component?: string\r\n element?: string\r\n}\r\n\r\nexport interface SolidRoute extends Omit<Optional<SolidRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: SolidRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n options: ResolvedOptions,\r\n routes: SolidRoute[],\r\n parent?: SolidRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(options, route.children, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeSolidRoutes(ctx: PageContext): Promise<SolidRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: SolidRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const normalizedPath = normalizeCase(node, caseSensitive)\r\n\r\n const route: SolidRouteBase = {\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n // Check parent exists\r\n const parent = parentRoutes.find(parent =>\r\n pathNodes.slice(0, i).join('/') === parent.rawRoute,\r\n )\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n if (i === pathNodes.length - 1) {\r\n route.element = element\r\n route.component = component\r\n }\r\n\r\n if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node) || ''\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle) || ''\r\n }\r\n\r\n const exist = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exist)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(ctx.options, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveSolidRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeSolidRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function solidResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~solid-pages']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveSolidRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeSolidRoutes(ctx)\r\n },\r\n stringify: {\r\n dynamicImport: path => `Solid.lazy(() => import(\"${path}\"))`,\r\n final: code => `import * as Solid from \"solid-js\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { CustomBlock, Optional, PageResolver } from '../types'\r\nimport { dequal } from 'dequal'\r\nimport colors from 'picocolors'\r\n\r\nimport { getRouteBlock } from '../customBlock'\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n countSlash,\r\n isCatchAllRoute,\r\n isDynamicRoute,\r\n normalizeCase,\r\n normalizeName,\r\n} from '../utils'\r\n\r\nexport interface VueRouteBase {\r\n name: string\r\n path: string\r\n props?: boolean\r\n component: string\r\n children?: VueRouteBase[]\r\n customBlock?: CustomBlock\r\n rawRoute: string\r\n}\r\n\r\nexport interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'children'> {\r\n children?: VueRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n ctx: PageContext,\r\n routes: VueRoute[],\r\n parent?: VueRoute,\r\n) {\r\n for (const route of routes) {\r\n if (route.name)\r\n route.name = route.name.replace(new RegExp(`${ctx.options.routeNameSeparator}index$`), '')\r\n\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(ctx, route.children, route)\r\n\r\n if (route.children?.find(c => c.name === route.name))\r\n delete route.name\r\n\r\n route.props = true\r\n\r\n delete route.rawRoute\r\n\r\n if (route.customBlock) {\r\n Object.assign(route, route.customBlock || {})\r\n delete route.customBlock\r\n }\r\n\r\n Object.assign(route, ctx.options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>): Promise<VueRoute[]> {\r\n const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: VueRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n // add leading slash to component path if not already there\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const customBlock = customBlockMap.get(page.path)\r\n\r\n const route: VueRouteBase = {\r\n name: '',\r\n path: '',\r\n component,\r\n customBlock,\r\n rawRoute: page.route,\r\n }\r\n\r\n let parentRoutes = routes\r\n let dynamicRoute = false\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n const normalizedPath = normalizeCase(normalizedName, caseSensitive)\r\n\r\n if (isDynamic)\r\n dynamicRoute = true\r\n\r\n route.name += route.name ? `${routeNameSeparator}${normalizedName}` : normalizedName\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n // Reset path\r\n route.path = ''\r\n }\r\n else if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (isDynamic) {\r\n route.path += `/:${normalizedName}`\r\n // Catch-all route\r\n if (isCatchAll) {\r\n if (i === 0)\r\n // root cache all route include children\r\n route.path += '(.*)*'\r\n else\r\n // nested cache all route not include children\r\n route.path += '(.*)'\r\n }\r\n else if (nuxtStyle && i === pathNodes.length - 1) {\r\n // we need to search if the folder provide `index.vue`\r\n const isIndexFound = pageRoutes.find(({ route }) => {\r\n return route === page.route.replace(pathNodes[i], 'index')\r\n })\r\n if (!isIndexFound)\r\n route.path += '?'\r\n }\r\n }\r\n else {\r\n route.path += `/${normalizedPath}`\r\n }\r\n }\r\n }\r\n\r\n // put dynamic routes at the end\r\n if (dynamicRoute)\r\n parentRoutes.push(route)\r\n else\r\n parentRoutes.unshift(route)\r\n })\r\n\r\n let finalRoutes = prepareRoutes(ctx, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>) {\r\n const finalRoutes = await computeVueRoutes(ctx, customBlockMap)\r\n\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function vueResolver(): PageResolver {\r\n const customBlockMap = new Map<string, CustomBlock>()\r\n\r\n async function checkCustomBlockChange(ctx: PageContext, path: string) {\r\n const exitsCustomBlock = customBlockMap.get(path)\r\n let customBlock: CustomBlock | undefined\r\n try {\r\n customBlock = await getRouteBlock(path, ctx.options)\r\n }\r\n catch (error: any) {\r\n ctx.logger?.error(colors.red(`[vite-plugin-pages] ${error.message}`))\r\n return\r\n }\r\n if (!exitsCustomBlock && !customBlock)\r\n return\r\n\r\n if (!customBlock) {\r\n customBlockMap.delete(path)\r\n ctx.debug.routeBlock('%s deleted', path)\r\n return\r\n }\r\n if (!exitsCustomBlock || !dequal(exitsCustomBlock, customBlock)) {\r\n ctx.debug.routeBlock('%s old: %O', path, exitsCustomBlock)\r\n ctx.debug.routeBlock('%s new: %O', path, customBlock)\r\n customBlockMap.set(path, customBlock)\r\n ctx.onUpdate()\r\n }\r\n }\r\n\r\n return {\r\n resolveExtensions() {\r\n return ['vue', 'ts', 'js']\r\n },\r\n resolveModuleIds() {\r\n return ['~pages', 'pages-generated', 'virtual:generated-pages']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveVueRoutes(ctx, customBlockMap)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeVueRoutes(ctx, customBlockMap)\r\n },\r\n hmr: {\r\n added: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n changed: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n removed: async (_ctx, path) => {\r\n customBlockMap.delete(path)\r\n },\r\n },\r\n }\r\n}\r\n","import type { SFCBlock, SFCDescriptor } from '@vue/compiler-sfc'\r\nimport type { CustomBlock, ParsedJSX, ResolvedOptions } from './types'\r\nimport fs from 'node:fs'\r\n\r\n// @ts-expect-error no type\r\nimport extractComments from 'extract-comments'\r\n\r\nimport JSON5 from 'json5'\r\nimport { importModule } from 'local-pkg'\r\nimport { parse as YAMLParser } from 'yaml'\r\nimport { debug } from './utils'\r\n\r\nconst routeJSXReg = /^\\s+(route)\\s+/gm\r\n\r\nexport function parseJSX(code: string): ParsedJSX[] {\r\n return extractComments(code).slice(0, 1).filter((comment: ParsedJSX) => routeJSXReg.test(comment.value) && comment.value.includes(':') && comment.loc.start.line === 1)\r\n}\r\n\r\nexport function parseYamlComment(code: ParsedJSX[], path: string): CustomBlock {\r\n return code.reduce((memo, item) => {\r\n const { value } = item\r\n const v = value.replace(routeJSXReg, '')\r\n debug.routeBlock(`use ${v} parser`)\r\n try {\r\n const yamlResult = YAMLParser(v)\r\n\r\n return {\r\n ...memo,\r\n ...yamlResult,\r\n }\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of comment in ${path}\\n${err.message}`)\r\n }\r\n }, {})\r\n}\r\n\r\nexport async function parseSFC(code: string): Promise<SFCDescriptor> {\r\n try {\r\n const { parse } = await importModule('@vue/compiler-sfc') as typeof import('@vue/compiler-sfc')\r\n return parse(code, {\r\n pad: 'space',\r\n }).descriptor\r\n // for @vue/compiler-sfc ^2.7\r\n || (parse as any)({\r\n source: code,\r\n })\r\n }\r\n catch {\r\n throw new Error('[vite-plugin-pages] Vue3\\'s \"@vue/compiler-sfc\" is required.')\r\n }\r\n}\r\n\r\nexport function parseCustomBlock(block: SFCBlock, filePath: string, options: ResolvedOptions): any {\r\n const lang = block.lang ?? options.routeBlockLang\r\n\r\n debug.routeBlock(`use ${lang} parser`)\r\n\r\n if (lang === 'json5') {\r\n try {\r\n return JSON5.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON5 format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'json') {\r\n try {\r\n return JSON.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'yaml' || lang === 'yml') {\r\n try {\r\n return YAMLParser(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n}\r\n\r\nexport async function getRouteBlock(path: string, options: ResolvedOptions) {\r\n const content = fs.readFileSync(path, 'utf8')\r\n\r\n const parsedSFC = await parseSFC(content)\r\n const blockStr = parsedSFC?.customBlocks.find(b => b.type === 'route')\r\n\r\n const parsedJSX = parseJSX(content)\r\n\r\n if (!blockStr && parsedJSX.length === 0)\r\n return\r\n\r\n let result\r\n\r\n if (blockStr)\r\n result = parseCustomBlock(blockStr, path, options) as CustomBlock\r\n\r\n if (parsedJSX.length > 0)\r\n result = parseYamlComment(parsedJSX, path) as CustomBlock\r\n\r\n return result\r\n}\r\n","import type { Plugin } from 'vite'\r\nimport type { UserOptions } from './types'\r\nimport { MODULE_ID_VIRTUAL, ROUTE_BLOCK_ID_VIRTUAL, routeBlockQueryRE } from './constants'\r\n\r\nimport { PageContext } from './context'\r\nimport { parsePageRequest } from './utils'\r\n\r\nfunction pagesPlugin(userOptions: UserOptions = {}): Plugin {\r\n let ctx: PageContext\r\n\r\n return {\r\n name: 'vite-plugin-pages',\r\n enforce: 'pre',\r\n async configResolved(config) {\r\n // auto set resolver for react project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('vite:react'))\r\n ) {\r\n userOptions.resolver = 'react'\r\n }\r\n\r\n // auto set resolver for solid project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('solid'))\r\n ) {\r\n userOptions.resolver = 'solid'\r\n }\r\n\r\n ctx = new PageContext(userOptions, config.root)\r\n ctx.setLogger(config.logger)\r\n await ctx.searchGlob()\r\n },\r\n api: {\r\n getResolvedRoutes() {\r\n return ctx.options.resolver.getComputedRoutes(ctx)\r\n },\r\n },\r\n configureServer(server) {\r\n ctx.setupViteServer(server)\r\n },\r\n resolveId(id) {\r\n if (ctx.options.moduleIds.includes(id))\r\n return `${MODULE_ID_VIRTUAL}?id=${id}`\r\n\r\n if (routeBlockQueryRE.test(id))\r\n return ROUTE_BLOCK_ID_VIRTUAL\r\n\r\n return null\r\n },\r\n async load(id) {\r\n const {\r\n moduleId,\r\n pageId,\r\n } = parsePageRequest(id)\r\n\r\n if (moduleId === MODULE_ID_VIRTUAL && pageId && ctx.options.moduleIds.includes(pageId))\r\n return ctx.resolveRoutes()\r\n\r\n if (id === ROUTE_BLOCK_ID_VIRTUAL) {\r\n return {\r\n code: 'export default {};',\r\n map: null,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n }\r\n}\r\n\r\nexport { syncIndexResolver } from './options'\r\nexport type {\r\n ReactRoute,\r\n SolidRoute,\r\n VueRoute,\r\n} from './resolvers'\r\n\r\nexport {\r\n reactResolver,\r\n solidResolver,\r\n vueResolver,\r\n} from './resolvers'\r\nexport * from './types'\r\nexport { PageContext }\r\nexport default pagesPlugin\r\n"],"mappings":"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","names":["join","resolve","process","isNewEscapeSequence","isCloseEscapeSequence","isStartOfLayoutSegment","resolve","VUE_MD_EXT_RE","VUE_MD_EXT_RE","parent","VUE_MD_EXT_RE","prepareRoutes","parent","VUE_MD_EXT_RE","prepareRoutes","parent","route","VUE_MD_EXT_RE","resolve","process","resolve","join"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/context.ts","../src/files.ts","../src/utils.ts","../src/options.ts","../src/stringify.ts","../src/resolvers/react.ts","../src/resolvers/solid.ts","../src/resolvers/vue.ts","../src/customBlock.ts","../src/index.ts"],"sourcesContent":["export const MODULE_IDS = [\r\n '~pages',\r\n '~react-pages',\r\n '~solid-pages',\r\n 'pages-generated',\r\n 'virtual:generated-pages',\r\n 'virtual:generated-pages-react',\r\n]\r\n\r\nexport const MODULE_ID_VIRTUAL = 'virtual:vite-plugin-pages/generated-pages'\r\nexport const ROUTE_BLOCK_ID_VIRTUAL = 'virtual:vite-plugin-pages/route-block'\r\nexport const ROUTE_IMPORT_NAME = '__pages_import_$1__'\r\n\r\nexport const routeBlockQueryRE = /\\?vue&type=route/\r\n\r\nexport const dynamicRouteRE = /^\\[(.+)\\]$/\r\nexport const cacheAllRouteRE = /^\\[\\.{3}(.*)\\]$/\r\nexport const replaceDynamicRouteRE = /^\\[(?:\\.{3})?(.*)\\]$/\r\n\r\nexport const nuxtDynamicRouteRE = /^_(.*)$/\r\nexport const nuxtCacheAllRouteRE = /^_$/\r\n\r\nexport const replaceIndexRE = /\\/?index$/\r\n","import type { Logger, ViteDevServer } from 'vite'\r\nimport type { PageOptions, ResolvedOptions, UserOptions } from './types'\r\nimport { join, resolve } from 'node:path'\r\nimport process from 'node:process'\r\nimport { getPageFiles } from './files'\r\nimport { resolveOptions } from './options'\r\n\r\nimport { debug, invalidatePagesModule, isTarget, slash, toArray } from './utils'\r\n\r\nexport interface PageRoute {\r\n path: string\r\n route: string\r\n}\r\n\r\nexport class PageContext {\r\n private _server: ViteDevServer | undefined\r\n private _pageRouteMap = new Map<string, PageRoute>()\r\n\r\n rawOptions: UserOptions\r\n root: string\r\n options: ResolvedOptions\r\n logger?: Logger\r\n\r\n constructor(userOptions: UserOptions, viteRoot: string = process.cwd()) {\r\n this.rawOptions = userOptions\r\n this.root = slash(viteRoot)\r\n debug.env('root', this.root)\r\n this.options = resolveOptions(userOptions, this.root)\r\n debug.options(this.options)\r\n }\r\n\r\n setLogger(logger: Logger) {\r\n this.logger = logger\r\n }\r\n\r\n setupViteServer(server: ViteDevServer) {\r\n if (this._server === server)\r\n return\r\n\r\n this._server = server\r\n this.setupWatcher(server.watcher)\r\n }\r\n\r\n setupWatcher(watcher: ViteDevServer['watcher']) {\r\n watcher\r\n .on('unlink', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n await this.removePage(path)\r\n this.onUpdate()\r\n })\r\n watcher\r\n .on('add', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this.options.dirs.find(i => path.startsWith(slash(resolve(this.root, i.dir))))!\r\n await this.addPage(path, page)\r\n this.onUpdate()\r\n })\r\n\r\n watcher\r\n .on('change', async (path) => {\r\n path = slash(path)\r\n if (!isTarget(path, this.options))\r\n return\r\n const page = this._pageRouteMap.get(path)\r\n if (page)\r\n await this.options.resolver.hmr?.changed?.(this, path)\r\n })\r\n }\r\n\r\n async addPage(path: string | string[], pageDir: PageOptions) {\r\n debug.pages('add', path)\r\n for (const p of toArray(path)) {\r\n const pageDirPath = slash(resolve(this.root, pageDir.dir))\r\n const extension = this.options.extensions.find(ext => p.endsWith(`.${ext}`))\r\n if (!extension)\r\n continue\r\n\r\n const route = slash(join(pageDir.baseRoute, p.replace(`${pageDirPath}/`, '').replace(`.${extension}`, '')))\r\n this._pageRouteMap.set(p, {\r\n path: p,\r\n route,\r\n })\r\n await this.options.resolver.hmr?.added?.(this, p)\r\n }\r\n }\r\n\r\n async removePage(path: string) {\r\n debug.pages('remove', path)\r\n this._pageRouteMap.delete(path)\r\n await this.options.resolver.hmr?.removed?.(this, path)\r\n }\r\n\r\n onUpdate() {\r\n if (!this._server)\r\n return\r\n\r\n invalidatePagesModule(this._server)\r\n debug.hmr('Reload generated pages.')\r\n this._server.ws.send({\r\n type: 'full-reload',\r\n })\r\n }\r\n\r\n async resolveRoutes() {\r\n return this.options.resolver.resolveRoutes(this)\r\n }\r\n\r\n async searchGlob() {\r\n const pageDirFiles = this.options.dirs.map((page) => {\r\n const pagesDirPath = slash(resolve(this.options.root, page.dir))\r\n const files = getPageFiles(pagesDirPath, this.options, page)\r\n debug.search(page.dir, files)\r\n return {\r\n ...page,\r\n files: files.map(file => slash(file)),\r\n }\r\n })\r\n\r\n for (const page of pageDirFiles)\r\n await this.addPage(page.files, page)\r\n\r\n debug.cache(this.pageRouteMap)\r\n }\r\n\r\n get debug() {\r\n return debug\r\n }\r\n\r\n get pageRouteMap() {\r\n return this._pageRouteMap\r\n }\r\n}\r\n","import type { PageOptions, ResolvedOptions } from './types'\r\nimport { join } from 'node:path'\r\nimport { globSync } from 'tinyglobby'\r\n\r\nimport { extsToGlob, slash } from './utils'\r\n\r\n/**\r\n * Resolves the page dirs for its for its given globs\r\n */\r\nconst VUE_MD_EXT_RE = /\\/$/\r\nexport function getPageDirs(PageOptions: PageOptions, root: string, exclude: string[]): PageOptions[] {\r\n const dirs = globSync(slash(PageOptions.dir), {\r\n ignore: exclude,\r\n onlyDirectories: true,\r\n dot: true,\r\n expandDirectories: false,\r\n cwd: root,\r\n })\r\n\r\n const pageDirs = dirs.map(dir => ({\r\n ...PageOptions,\r\n dir: dir.replace(VUE_MD_EXT_RE, ''),\r\n }))\r\n\r\n return pageDirs\r\n}\r\n\r\n/**\r\n * Resolves the files that are valid pages for the given context.\r\n */\r\nexport function getPageFiles(path: string, options: ResolvedOptions, pageOptions?: PageOptions): string[] {\r\n const {\r\n exclude,\r\n extensions,\r\n } = options\r\n\r\n const ext = extsToGlob(extensions)\r\n const pattern = pageOptions?.filePattern ?? `**/*.${ext}`\r\n\r\n const files = globSync(pattern, {\r\n ignore: exclude,\r\n onlyFiles: true,\r\n cwd: path,\r\n }).map(p => slash(join(path, p)))\r\n\r\n return files\r\n}\r\n","import type { ModuleNode, ViteDevServer } from 'vite'\r\nimport type { ResolvedOptions } from './types'\r\nimport { resolve, win32 } from 'node:path'\r\nimport { URLSearchParams } from 'node:url'\r\nimport Debug from 'debug'\r\nimport micromatch from 'micromatch'\r\n\r\nimport { cacheAllRouteRE, dynamicRouteRE, MODULE_ID_VIRTUAL, nuxtCacheAllRouteRE, nuxtDynamicRouteRE, replaceDynamicRouteRE, replaceIndexRE } from './constants'\r\n\r\nconst slashRE = /\\\\/g\r\n\r\nexport function slash(str: string) {\r\n return str.replace(slashRE, '/')\r\n}\r\n\r\nexport function toArray<T>(value: T | T[] | null | undefined): T[] {\r\n if (value == null)\r\n return []\r\n return Array.isArray(value) ? value : [value]\r\n}\r\n\r\nexport const debug = {\r\n hmr: Debug('vite-plugin-pages:hmr'),\r\n routeBlock: Debug('vite-plugin-pages:routeBlock'),\r\n options: Debug('vite-plugin-pages:options'),\r\n pages: Debug('vite-plugin-pages:pages'),\r\n search: Debug('vite-plugin-pages:search'),\r\n env: Debug('vite-plugin-pages:env'),\r\n cache: Debug('vite-plugin-pages:cache'),\r\n resolver: Debug('vite-plugin-pages:resolver'),\r\n}\r\n\r\nexport function extsToGlob(extensions: string[]) {\r\n return extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0] || ''\r\n}\r\n\r\nexport function countSlash(value: string) {\r\n let count = 0\r\n for (let i = 0; i < value.length; i++) {\r\n if (value[i] === '/')\r\n count++\r\n }\r\n return count\r\n}\r\n\r\nfunction isPagesDir(path: string, options: ResolvedOptions) {\r\n for (const page of options.dirs) {\r\n const dirPath = slash(resolve(options.root, page.dir))\r\n if (path.startsWith(dirPath))\r\n return true\r\n }\r\n return false\r\n}\r\n\r\nexport function isTarget(path: string, options: ResolvedOptions) {\r\n return isPagesDir(path, options) && !micromatch.isMatch(path, options.exclude) && options.extensionsRE.test(path)\r\n}\r\n\r\nexport function isDynamicRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtDynamicRouteRE.test(routePath)\r\n : dynamicRouteRE.test(routePath)\r\n}\r\n\r\nexport function isCatchAllRoute(routePath: string, nuxtStyle = false) {\r\n return nuxtStyle\r\n ? nuxtCacheAllRouteRE.test(routePath)\r\n : cacheAllRouteRE.test(routePath)\r\n}\r\n\r\nexport function resolveImportMode(\r\n filepath: string,\r\n options: ResolvedOptions,\r\n) {\r\n const mode = options.importMode\r\n if (typeof mode === 'function')\r\n return mode(filepath, options)\r\n return mode\r\n}\r\n\r\nexport function invalidatePagesModule(server: ViteDevServer) {\r\n const { moduleGraph } = server\r\n const mods = moduleGraph.getModulesByFile(MODULE_ID_VIRTUAL)\r\n if (mods) {\r\n const seen = new Set<ModuleNode>()\r\n mods.forEach((mod) => {\r\n moduleGraph.invalidateModule(mod, seen)\r\n })\r\n }\r\n}\r\n\r\nexport function normalizeCase(str: string, caseSensitive: boolean) {\r\n if (!caseSensitive)\r\n return str.toLocaleLowerCase()\r\n return str\r\n}\r\n\r\nexport function normalizeName(name: string, isDynamic: boolean, nuxtStyle = false) {\r\n if (!isDynamic)\r\n return name\r\n\r\n return nuxtStyle\r\n ? name.replace(nuxtDynamicRouteRE, '$1') || 'all'\r\n : name.replace(replaceDynamicRouteRE, '$1')\r\n}\r\n\r\nexport function buildReactRoutePath(node: string, nuxtStyle = false): string | undefined {\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n\r\n if (isDynamic) {\r\n if (isCatchAll)\r\n return '*'\r\n\r\n return `:${normalizedName}`\r\n }\r\n\r\n return `${normalizedName}`\r\n}\r\n\r\n// https://github.dev/remix-run/remix/blob/264e3f8884c5cafd8d06acc3e01153b376745b7c/packages/remix-dev/config/routesConvention.ts#L105\r\nexport function buildReactRemixRoutePath(node: string): string | undefined {\r\n const escapeStart = '['\r\n const escapeEnd = ']'\r\n let result = ''\r\n let rawSegmentBuffer = ''\r\n\r\n let inEscapeSequence = 0\r\n let skipSegment = false\r\n for (let i = 0; i < node.length; i++) {\r\n const char = node.charAt(i)\r\n const lastChar = i > 0 ? node.charAt(i - 1) : undefined\r\n const nextChar = i < node.length - 1 ? node.charAt(i + 1) : undefined\r\n\r\n function isNewEscapeSequence() {\r\n return (\r\n !inEscapeSequence && char === escapeStart && lastChar !== escapeStart\r\n )\r\n }\r\n\r\n function isCloseEscapeSequence() {\r\n return inEscapeSequence && char === escapeEnd && nextChar !== escapeEnd\r\n }\r\n\r\n function isStartOfLayoutSegment() {\r\n return char === '_' && nextChar === '_' && !rawSegmentBuffer\r\n }\r\n\r\n if (skipSegment) {\r\n if (char === '/' || char === '.' || char === win32.sep)\r\n skipSegment = false\r\n\r\n continue\r\n }\r\n\r\n if (isNewEscapeSequence()) {\r\n inEscapeSequence++\r\n continue\r\n }\r\n\r\n if (isCloseEscapeSequence()) {\r\n inEscapeSequence--\r\n continue\r\n }\r\n\r\n if (inEscapeSequence) {\r\n result += char\r\n continue\r\n }\r\n\r\n if (char === '/' || char === win32.sep || char === '.') {\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n else result += '/'\r\n\r\n rawSegmentBuffer = ''\r\n continue\r\n }\r\n\r\n if (isStartOfLayoutSegment()) {\r\n skipSegment = true\r\n continue\r\n }\r\n\r\n rawSegmentBuffer += char\r\n\r\n if (char === '$') {\r\n result += typeof nextChar === 'undefined' ? '*' : ':'\r\n continue\r\n }\r\n\r\n result += char\r\n }\r\n\r\n if (rawSegmentBuffer === 'index' && result.endsWith('index'))\r\n result = result.replace(replaceIndexRE, '')\r\n\r\n return result || undefined\r\n}\r\n\r\nexport function parsePageRequest(id: string) {\r\n const [moduleId, rawQuery] = id.split('?', 2)\r\n const query = new URLSearchParams(rawQuery)\r\n const pageId = query.get('id')\r\n return {\r\n moduleId,\r\n query,\r\n pageId,\r\n }\r\n}\r\n","import type { ImportModeResolver, ResolvedOptions, UserOptions } from './types'\r\nimport { resolve } from 'node:path'\r\nimport process from 'node:process'\r\n\r\nimport { MODULE_IDS } from './constants'\r\nimport { getPageDirs } from './files'\r\nimport { reactResolver, solidResolver, vueResolver } from './resolvers'\r\nimport { slash, toArray } from './utils'\r\n\r\nconst VUE_MD_EXT_RE = /^\\//\r\nconst VUE_MD_EXT_RE1 = /\\/$/\r\nfunction resolvePageDirs(dirs: UserOptions['dirs'], root: string, exclude: string[]) {\r\n dirs = toArray(dirs)\r\n return dirs.flatMap((dir) => {\r\n const option = typeof dir === 'string'\r\n ? { dir, baseRoute: '' }\r\n : dir\r\n\r\n option.dir = slash(resolve(root, option.dir)).replace(`${root}/`, '')\r\n option.baseRoute = option.baseRoute.replace(VUE_MD_EXT_RE, '').replace(VUE_MD_EXT_RE1, '')\r\n\r\n return getPageDirs(option, root, exclude)\r\n })\r\n}\r\n\r\nexport const syncIndexResolver: ImportModeResolver = (filepath, options) => {\r\n for (const page of options.dirs) {\r\n if (page.baseRoute === '' && filepath.startsWith(`/${page.dir}/index`))\r\n return 'sync'\r\n }\r\n return 'async'\r\n}\r\n\r\nfunction getResolver(originalResolver: UserOptions['resolver']) {\r\n let resolver = originalResolver || 'vue'\r\n\r\n if (typeof resolver !== 'string')\r\n return resolver\r\n\r\n switch (resolver) {\r\n case 'vue':\r\n resolver = vueResolver()\r\n break\r\n case 'react':\r\n resolver = reactResolver()\r\n break\r\n case 'solid':\r\n resolver = solidResolver()\r\n break\r\n default:\r\n throw new Error(`Unsupported resolver: ${resolver}`)\r\n }\r\n return resolver\r\n}\r\n\r\nexport function resolveOptions(userOptions: UserOptions, viteRoot?: string): ResolvedOptions {\r\n const {\r\n dirs = ['src/pages'],\r\n routeBlockLang = 'json5',\r\n exclude = ['node_modules', '.git', '**/__*__/**'],\r\n caseSensitive = false,\r\n routeNameSeparator = '-',\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n } = userOptions\r\n\r\n const root = viteRoot || slash(process.cwd())\r\n\r\n const importMode = userOptions.importMode || syncIndexResolver\r\n\r\n const importPath = userOptions.importPath || 'relative'\r\n\r\n const resolver = getResolver(userOptions.resolver)\r\n\r\n const extensions = userOptions.extensions || resolver.resolveExtensions()\r\n\r\n const extensionsRE = new RegExp(`\\\\.(${extensions.join('|')})$`)\r\n\r\n const resolvedDirs = resolvePageDirs(dirs, root, exclude)\r\n\r\n const routeStyle = userOptions.routeStyle || 'next'\r\n\r\n const moduleIds = userOptions.moduleId\r\n ? [userOptions.moduleId]\r\n : resolver.resolveModuleIds?.() || MODULE_IDS\r\n\r\n const resolvedOptions: ResolvedOptions = {\r\n dirs: resolvedDirs,\r\n routeStyle,\r\n routeBlockLang,\r\n moduleIds,\r\n root,\r\n extensions,\r\n importMode,\r\n importPath,\r\n exclude,\r\n caseSensitive,\r\n resolver,\r\n extensionsRE,\r\n extendRoute,\r\n onRoutesGenerated,\r\n onClientGenerated,\r\n routeNameSeparator,\r\n }\r\n\r\n return resolvedOptions\r\n}\r\n","import type { ResolvedOptions } from './types'\r\nimport { ROUTE_IMPORT_NAME } from './constants'\r\n\r\nimport { resolveImportMode } from './utils'\r\n\r\nconst componentRE = /\"(?:component|element)\":(\"(.*?)\")/g\r\nconst hasFunctionRE = /\"(?:props|beforeEnter)\":(\"(.*?)\")/g\r\n\r\nconst multilineCommentsRE = /\\/\\*(.|[\\r\\n])*?\\*\\//g\r\nconst singlelineCommentsRE = /\\/\\/.*/g\r\nconst VUE_MD_EXT_RE = /(\\s)/g\r\nfunction replaceFunction(_: any, value: any) {\r\n if (typeof value === 'function') {\r\n const fnBody = value.toString()\r\n .replace(multilineCommentsRE, '')\r\n .replace(singlelineCommentsRE, '')\r\n .replace(VUE_MD_EXT_RE, '')\r\n\r\n // ES6 Arrow Function\r\n if (fnBody.length < 8 || fnBody.substring(0, 8) !== 'function')\r\n return `_NuFrRa_${fnBody}`\r\n\r\n return fnBody\r\n }\r\n\r\n return value\r\n}\r\n\r\n/**\r\n * Creates a stringified Vue Router route definition.\r\n */\r\nexport function stringifyRoutes(\r\n preparedRoutes: any[],\r\n options: ResolvedOptions,\r\n) {\r\n const importsMap: Map<string, string> = new Map()\r\n\r\n function getImportString(path: string, importName: string) {\r\n const mode = resolveImportMode(path, options)\r\n return mode === 'sync'\r\n ? `import ${importName} from \"${path}\"`\r\n : `const ${importName} = ${\r\n options.resolver.stringify?.dynamicImport?.(path) || `() => import(\"${path}\")`\r\n }`\r\n }\r\n\r\n function componentReplacer(str: string, replaceStr: string, path: string) {\r\n let importName = importsMap.get(path)\r\n\r\n if (!importName)\r\n importName = ROUTE_IMPORT_NAME.replace('$1', `${importsMap.size}`)\r\n\r\n importsMap.set(path, importName)\r\n\r\n importName = options.resolver.stringify?.component?.(importName) || importName\r\n\r\n return str.replace(replaceStr, importName)\r\n }\r\n\r\n function functionReplacer(str: string, replaceStr: string, content: string) {\r\n if (content.startsWith('function'))\r\n return str.replace(replaceStr, content)\r\n\r\n if (content.startsWith('_NuFrRa_'))\r\n return str.replace(replaceStr, content.slice(8))\r\n\r\n return str\r\n }\r\n\r\n const stringRoutes = JSON\r\n .stringify(preparedRoutes, replaceFunction)\r\n .replace(componentRE, componentReplacer)\r\n .replace(hasFunctionRE, functionReplacer)\r\n\r\n const imports = Array.from(importsMap).map(args => getImportString(...args))\r\n\r\n return {\r\n imports,\r\n stringRoutes,\r\n }\r\n}\r\n\r\nexport function generateClientCode(routes: any[], options: ResolvedOptions) {\r\n const { imports, stringRoutes } = stringifyRoutes(routes, options)\r\n const code = `${imports.join(';\\n')};\\n\\nconst routes = ${stringRoutes};\\n\\nexport default routes;`\r\n return options.resolver.stringify?.final?.(code) || code\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface ReactRouteBase {\r\n caseSensitive?: boolean\r\n children?: ReactRouteBase[]\r\n element?: string\r\n index?: boolean\r\n path?: string\r\n rawRoute: string\r\n}\r\n\r\nexport interface ReactRoute extends Omit<Optional<ReactRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: ReactRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\n\r\n/**\r\n * Sort child routes so React Router matches in correct priority order.\r\n * React Router v6+ matches routes in array order (first-match-wins),\r\n * so more specific routes must come before less specific ones.\r\n *\r\n * Priority (lowest weight first):\r\n * 0 — index route (path \"/\")\r\n * 1 — static route (e.g. \"about\", \"blog/today\")\r\n * 2 — dynamic route (e.g. \":id\")\r\n * 3 — catch-all (path \"*\")\r\n */\r\nfunction sortReactRoutes(routes: ReactRouteBase[]): ReactRouteBase[] {\r\n routes.sort((a, b) => {\r\n const weight = (r: ReactRouteBase): number => {\r\n const p = r.path ?? ''\r\n if (p === '/')\r\n return 0\r\n if (p === '*')\r\n return 3\r\n if (p.startsWith(':'))\r\n return 2\r\n return 1\r\n }\r\n return weight(a) - weight(b)\r\n })\r\n for (const route of routes) {\r\n if (route.children)\r\n sortReactRoutes(route.children)\r\n }\r\n return routes\r\n}\r\n\r\nfunction prepareRoutes(\r\n routes: ReactRoute[],\r\n options: ResolvedOptions,\r\n parent?: ReactRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(route.children, options, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeReactRoutes(ctx: PageContext): Promise<ReactRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: ReactRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n\r\n const route: ReactRouteBase = {\r\n caseSensitive,\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n if (i === pathNodes.length - 1)\r\n route.element = element\r\n\r\n const isIndexRoute = normalizeCase(node, caseSensitive).endsWith('index')\r\n\r\n if (!route.path && isIndexRoute) {\r\n route.path = '/'\r\n }\r\n else if (!isIndexRoute) {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node)\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle)\r\n }\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exits in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n const exits = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exits)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort children so static routes come before dynamic/catch-all routes\r\n sortReactRoutes(routes)\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(routes, ctx.options)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveReactRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeReactRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function reactResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~react-pages', 'virtual:generated-pages-react']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveReactRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeReactRoutes(ctx)\r\n },\r\n stringify: {\r\n component: path => `React.createElement(${path})`,\r\n dynamicImport: path => `React.lazy(() => import(\"${path}\"))`,\r\n final: code => `import React from \"react\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { Optional, PageResolver, ResolvedOptions } from '../types'\r\n\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n buildReactRemixRoutePath,\r\n buildReactRoutePath,\r\n countSlash,\r\n normalizeCase,\r\n} from '../utils'\r\n\r\nexport interface SolidRouteBase {\r\n rawRoute: string\r\n path: string\r\n children?: SolidRouteBase[]\r\n component?: string\r\n element?: string\r\n}\r\n\r\nexport interface SolidRoute extends Omit<Optional<SolidRouteBase, 'rawRoute' | 'path'>, 'children'> {\r\n children?: SolidRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n options: ResolvedOptions,\r\n routes: SolidRoute[],\r\n parent?: SolidRoute,\r\n) {\r\n for (const route of routes) {\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(options, route.children, route)\r\n\r\n delete route.rawRoute\r\n\r\n Object.assign(route, options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeSolidRoutes(ctx: PageContext): Promise<SolidRoute[]> {\r\n const { routeStyle, caseSensitive, importPath } = ctx.options\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: SolidRouteBase[] = []\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const element = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n\r\n let parentRoutes = routes\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const normalizedPath = normalizeCase(node, caseSensitive)\r\n\r\n const route: SolidRouteBase = {\r\n path: '',\r\n rawRoute: pathNodes.slice(0, i + 1).join('/'),\r\n }\r\n\r\n // Check parent exists\r\n const parent = parentRoutes.find(parent =>\r\n pathNodes.slice(0, i).join('/') === parent.rawRoute,\r\n )\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n }\r\n\r\n if (i === pathNodes.length - 1) {\r\n route.element = element\r\n route.component = component\r\n }\r\n\r\n if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (routeStyle === 'remix')\r\n route.path = buildReactRemixRoutePath(node) || ''\r\n else\r\n route.path = buildReactRoutePath(node, nuxtStyle) || ''\r\n }\r\n\r\n const exist = parentRoutes.some((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n if (!exist)\r\n parentRoutes.push(route)\r\n }\r\n })\r\n\r\n // sort by dynamic routes\r\n let finalRoutes = prepareRoutes(ctx.options, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveSolidRoutes(ctx: PageContext) {\r\n const finalRoutes = await computeSolidRoutes(ctx)\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function solidResolver(): PageResolver {\r\n return {\r\n resolveModuleIds() {\r\n return ['~solid-pages']\r\n },\r\n resolveExtensions() {\r\n return ['tsx', 'jsx', 'ts', 'js']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveSolidRoutes(ctx)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeSolidRoutes(ctx)\r\n },\r\n stringify: {\r\n dynamicImport: path => `Solid.lazy(() => import(\"${path}\"))`,\r\n final: code => `import * as Solid from \"solid-js\";\\n${code}`,\r\n },\r\n }\r\n}\r\n","import type { PageContext } from '../context'\r\nimport type { CustomBlock, Optional, PageResolver } from '../types'\r\nimport { dequal } from 'dequal'\r\nimport colors from 'picocolors'\r\n\r\nimport { getRouteBlock } from '../customBlock'\r\nimport { generateClientCode } from '../stringify'\r\nimport {\r\n countSlash,\r\n isCatchAllRoute,\r\n isDynamicRoute,\r\n normalizeCase,\r\n normalizeName,\r\n} from '../utils'\r\n\r\nexport interface VueRouteBase {\r\n name: string\r\n path: string\r\n props?: boolean\r\n component: string\r\n children?: VueRouteBase[]\r\n customBlock?: CustomBlock\r\n rawRoute: string\r\n}\r\n\r\nexport interface VueRoute extends Omit<Optional<VueRouteBase, 'rawRoute' | 'name'>, 'children'> {\r\n children?: VueRoute[]\r\n}\r\nconst VUE_MD_EXT_RE = /^\\//\r\nfunction prepareRoutes(\r\n ctx: PageContext,\r\n routes: VueRoute[],\r\n parent?: VueRoute,\r\n) {\r\n const indexSuffixRE = new RegExp(`${ctx.options.routeNameSeparator}index$`)\r\n for (const route of routes) {\r\n if (route.name)\r\n route.name = route.name.replace(indexSuffixRE, '')\r\n\r\n if (parent)\r\n route.path = route.path?.replace(VUE_MD_EXT_RE, '')\r\n\r\n if (route.children)\r\n route.children = prepareRoutes(ctx, route.children, route)\r\n\r\n if (route.children?.find(c => c.name === route.name))\r\n delete route.name\r\n\r\n route.props = true\r\n\r\n delete route.rawRoute\r\n\r\n if (route.customBlock) {\r\n Object.assign(route, route.customBlock || {})\r\n delete route.customBlock\r\n }\r\n\r\n Object.assign(route, ctx.options.extendRoute?.(route, parent) || {})\r\n }\r\n\r\n return routes\r\n}\r\n\r\nasync function computeVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>): Promise<VueRoute[]> {\r\n const { routeStyle, caseSensitive, importPath, routeNameSeparator } = ctx.options\r\n\r\n const pageRoutes = [...ctx.pageRouteMap.values()]\r\n // sort routes for HMR\r\n .sort((a, b) => countSlash(a.route) - countSlash(b.route))\r\n\r\n const routes: VueRouteBase[] = []\r\n\r\n // Precompute route path set for O(1) index lookup in nuxt dynamic routes\r\n const routePaths = new Set(pageRoutes.map(p => p.route))\r\n\r\n pageRoutes.forEach((page) => {\r\n const pathNodes = page.route.split('/')\r\n\r\n // add leading slash to component path if not already there\r\n const component = importPath === 'relative' ? page.path.replace(ctx.root, '') : page.path\r\n const customBlock = customBlockMap.get(page.path)\r\n\r\n const route: VueRouteBase = {\r\n name: '',\r\n path: '',\r\n component,\r\n customBlock,\r\n rawRoute: page.route,\r\n }\r\n\r\n let parentRoutes = routes\r\n let dynamicRoute = false\r\n\r\n for (let i = 0; i < pathNodes.length; i++) {\r\n const node = pathNodes[i]\r\n const nuxtStyle = routeStyle === 'nuxt'\r\n const isDynamic = isDynamicRoute(node, nuxtStyle)\r\n const isCatchAll = isCatchAllRoute(node, nuxtStyle)\r\n const normalizedName = normalizeName(node, isDynamic, nuxtStyle)\r\n const normalizedPath = normalizeCase(normalizedName, caseSensitive)\r\n\r\n if (isDynamic)\r\n dynamicRoute = true\r\n\r\n route.name += route.name ? `${routeNameSeparator}${normalizedName}` : normalizedName\r\n\r\n // Check parent exits\r\n const parent = parentRoutes.find((parent) => {\r\n return pathNodes.slice(0, i + 1).join('/') === parent.rawRoute\r\n })\r\n\r\n if (parent) {\r\n // Make sure children exist in parent\r\n parent.children = parent.children || []\r\n // Append to parent's children\r\n parentRoutes = parent.children\r\n // Reset path\r\n route.path = ''\r\n }\r\n else if (normalizedPath === 'index') {\r\n if (!route.path)\r\n route.path = '/'\r\n }\r\n else if (normalizedPath !== 'index') {\r\n if (isDynamic) {\r\n route.path += `/:${normalizedName}`\r\n // Catch-all route\r\n if (isCatchAll) {\r\n if (i === 0)\r\n // root cache all route include children\r\n route.path += '(.*)*'\r\n else\r\n // nested cache all route not include children\r\n route.path += '(.*)'\r\n }\r\n else if (nuxtStyle && i === pathNodes.length - 1) {\r\n // we need to search if the folder provide `index.vue`\r\n if (!routePaths.has(page.route.replace(pathNodes[i], 'index')))\r\n route.path += '?'\r\n }\r\n }\r\n else {\r\n route.path += `/${normalizedPath}`\r\n }\r\n }\r\n }\r\n\r\n // put dynamic routes at the end\r\n if (dynamicRoute)\r\n parentRoutes.push(route)\r\n else\r\n parentRoutes.unshift(route)\r\n })\r\n\r\n let finalRoutes = prepareRoutes(ctx, routes)\r\n\r\n finalRoutes = (await ctx.options.onRoutesGenerated?.(finalRoutes)) || finalRoutes\r\n\r\n return finalRoutes\r\n}\r\n\r\nasync function resolveVueRoutes(ctx: PageContext, customBlockMap: Map<string, CustomBlock>) {\r\n const finalRoutes = await computeVueRoutes(ctx, customBlockMap)\r\n\r\n let client = generateClientCode(finalRoutes, ctx.options)\r\n client = (await ctx.options.onClientGenerated?.(client)) || client\r\n return client\r\n}\r\n\r\nexport function vueResolver(): PageResolver {\r\n const customBlockMap = new Map<string, CustomBlock>()\r\n\r\n async function checkCustomBlockChange(ctx: PageContext, path: string) {\r\n const exitsCustomBlock = customBlockMap.get(path)\r\n let customBlock: CustomBlock | undefined\r\n try {\r\n customBlock = await getRouteBlock(path, ctx.options)\r\n }\r\n catch (error: any) {\r\n ctx.logger?.error(colors.red(`[vite-plugin-pages] ${error.message}`))\r\n return\r\n }\r\n if (!exitsCustomBlock && !customBlock)\r\n return\r\n\r\n if (!customBlock) {\r\n customBlockMap.delete(path)\r\n ctx.debug.routeBlock('%s deleted', path)\r\n return\r\n }\r\n if (!exitsCustomBlock || !dequal(exitsCustomBlock, customBlock)) {\r\n ctx.debug.routeBlock('%s old: %O', path, exitsCustomBlock)\r\n ctx.debug.routeBlock('%s new: %O', path, customBlock)\r\n customBlockMap.set(path, customBlock)\r\n ctx.onUpdate()\r\n }\r\n }\r\n\r\n return {\r\n resolveExtensions() {\r\n return ['vue', 'ts', 'js']\r\n },\r\n resolveModuleIds() {\r\n return ['~pages', 'pages-generated', 'virtual:generated-pages']\r\n },\r\n async resolveRoutes(ctx) {\r\n return resolveVueRoutes(ctx, customBlockMap)\r\n },\r\n async getComputedRoutes(ctx) {\r\n return computeVueRoutes(ctx, customBlockMap)\r\n },\r\n hmr: {\r\n added: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n changed: async (ctx, path) => checkCustomBlockChange(ctx, path),\r\n removed: async (_ctx, path) => {\r\n customBlockMap.delete(path)\r\n },\r\n },\r\n }\r\n}\r\n","import type { SFCBlock, SFCDescriptor } from '@vue/compiler-sfc'\r\nimport type { CustomBlock, ParsedJSX, ResolvedOptions } from './types'\r\nimport { readFile } from 'node:fs/promises'\r\n\r\n// @ts-expect-error no type\r\nimport extractComments from 'extract-comments'\r\n\r\nimport JSON5 from 'json5'\r\nimport { importModule } from 'local-pkg'\r\nimport { parse as YAMLParser } from 'yaml'\r\nimport { debug } from './utils'\r\n\r\nconst routeJSXReg = /^\\s+(route)\\s+/gm\r\n\r\nlet _compilerSfc: typeof import('@vue/compiler-sfc') | undefined\r\n\r\nexport function parseJSX(code: string): ParsedJSX[] {\r\n return extractComments(code).slice(0, 1).filter((comment: ParsedJSX) => routeJSXReg.test(comment.value) && comment.value.includes(':') && comment.loc.start.line === 1)\r\n}\r\n\r\nexport function parseYamlComment(code: ParsedJSX[], path: string): CustomBlock {\r\n return code.reduce((memo, item) => {\r\n const { value } = item\r\n const v = value.replace(routeJSXReg, '')\r\n debug.routeBlock(`use ${v} parser`)\r\n try {\r\n const yamlResult = YAMLParser(v)\r\n\r\n return {\r\n ...memo,\r\n ...yamlResult,\r\n }\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of comment in ${path}\\n${err.message}`)\r\n }\r\n }, {})\r\n}\r\n\r\nexport async function parseSFC(code: string): Promise<SFCDescriptor> {\r\n try {\r\n if (!_compilerSfc)\r\n _compilerSfc = await importModule('@vue/compiler-sfc') as typeof import('@vue/compiler-sfc')\r\n const { parse } = _compilerSfc\r\n return parse(code, {\r\n pad: 'space',\r\n }).descriptor\r\n // for @vue/compiler-sfc ^2.7\r\n || (parse as any)({\r\n source: code,\r\n })\r\n }\r\n catch {\r\n throw new Error('[vite-plugin-pages] Vue3\\'s \"@vue/compiler-sfc\" is required.')\r\n }\r\n}\r\n\r\nexport function parseCustomBlock(block: SFCBlock, filePath: string, options: ResolvedOptions): any {\r\n const lang = block.lang ?? options.routeBlockLang\r\n\r\n debug.routeBlock(`use ${lang} parser`)\r\n\r\n if (lang === 'json5') {\r\n try {\r\n return JSON5.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON5 format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'json') {\r\n try {\r\n return JSON.parse(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid JSON format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n else if (lang === 'yaml' || lang === 'yml') {\r\n try {\r\n return YAMLParser(block.content)\r\n }\r\n catch (err: any) {\r\n throw new Error(`Invalid YAML format of <${block.type}> content in ${filePath}\\n${err.message}`)\r\n }\r\n }\r\n}\r\n\r\nexport async function getRouteBlock(path: string, options: ResolvedOptions) {\r\n const content = await readFile(path, 'utf8')\r\n\r\n const parsedSFC = await parseSFC(content)\r\n const blockStr = parsedSFC?.customBlocks.find(b => b.type === 'route')\r\n\r\n const parsedJSX = parseJSX(content)\r\n\r\n if (!blockStr && parsedJSX.length === 0)\r\n return\r\n\r\n let result\r\n\r\n if (blockStr)\r\n result = parseCustomBlock(blockStr, path, options) as CustomBlock\r\n\r\n if (parsedJSX.length > 0)\r\n result = parseYamlComment(parsedJSX, path) as CustomBlock\r\n\r\n return result\r\n}\r\n","import type { Plugin } from 'vite'\r\nimport type { UserOptions } from './types'\r\nimport { MODULE_ID_VIRTUAL, ROUTE_BLOCK_ID_VIRTUAL, routeBlockQueryRE } from './constants'\r\n\r\nimport { PageContext } from './context'\r\nimport { parsePageRequest } from './utils'\r\n\r\nfunction pagesPlugin(userOptions: UserOptions = {}): Plugin {\r\n let ctx: PageContext\r\n\r\n return {\r\n name: 'vite-plugin-pages',\r\n enforce: 'pre',\r\n async configResolved(config) {\r\n // auto set resolver for react project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('vite:react'))\r\n ) {\r\n userOptions.resolver = 'react'\r\n }\r\n\r\n // auto set resolver for solid project\r\n if (\r\n !userOptions.resolver\r\n && config.plugins.some(i => i.name.includes('solid'))\r\n ) {\r\n userOptions.resolver = 'solid'\r\n }\r\n\r\n ctx = new PageContext(userOptions, config.root)\r\n ctx.setLogger(config.logger)\r\n await ctx.searchGlob()\r\n },\r\n api: {\r\n getResolvedRoutes() {\r\n return ctx.options.resolver.getComputedRoutes(ctx)\r\n },\r\n },\r\n configureServer(server) {\r\n ctx.setupViteServer(server)\r\n },\r\n resolveId(id) {\r\n if (ctx.options.moduleIds.includes(id))\r\n return `${MODULE_ID_VIRTUAL}?id=${id}`\r\n\r\n if (routeBlockQueryRE.test(id))\r\n return ROUTE_BLOCK_ID_VIRTUAL\r\n\r\n return null\r\n },\r\n async load(id) {\r\n const {\r\n moduleId,\r\n pageId,\r\n } = parsePageRequest(id)\r\n\r\n if (moduleId === MODULE_ID_VIRTUAL && pageId && ctx.options.moduleIds.includes(pageId))\r\n return ctx.resolveRoutes()\r\n\r\n if (id === ROUTE_BLOCK_ID_VIRTUAL) {\r\n return {\r\n code: 'export default {};',\r\n map: null,\r\n }\r\n }\r\n\r\n return null\r\n },\r\n }\r\n}\r\n\r\nexport { syncIndexResolver } from './options'\r\nexport type {\r\n ReactRoute,\r\n SolidRoute,\r\n VueRoute,\r\n} from './resolvers'\r\n\r\nexport {\r\n reactResolver,\r\n solidResolver,\r\n vueResolver,\r\n} from './resolvers'\r\nexport * from './types'\r\nexport { PageContext }\r\nexport default pagesPlugin\r\n"],"mappings":"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","names":["join","resolve","process","isNewEscapeSequence","isCloseEscapeSequence","isStartOfLayoutSegment","resolve","VUE_MD_EXT_RE","VUE_MD_EXT_RE","parent","VUE_MD_EXT_RE","prepareRoutes","parent","VUE_MD_EXT_RE","prepareRoutes","parent","VUE_MD_EXT_RE","resolve","process","resolve","join"]}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "vite-plugin-pages2",
3
3
  "type": "module",
4
- "version": "0.34.11",
5
- "packageManager": "pnpm@10.32.1",
4
+ "version": "0.34.12",
5
+ "packageManager": "pnpm@11.1.2",
6
6
  "description": "File system base vue-router plugin for Vite",
7
7
  "author": "wuc656 <wuc656@gmail.com>, hannoeru <me@hanlee.co>",
8
8
  "license": "MIT",
@@ -53,7 +53,7 @@
53
53
  "build": "tsup",
54
54
  "play": "pnpm --filter vue dev",
55
55
  "play:react": "pnpm --filter react dev",
56
- "prepublishOnly": "npm run build",
56
+ "prepublishOnly": "pnpm run build",
57
57
  "release": "bumpp --commit --tag --push && npm publish",
58
58
  "publish:ci": "tsx scripts/publish.ts",
59
59
  "test": "vitest",
@@ -82,7 +82,7 @@
82
82
  }
83
83
  },
84
84
  "dependencies": {
85
- "@types/debug": "^4.1.12",
85
+ "@types/debug": "^4.1.13",
86
86
  "debug": "^4.4.3",
87
87
  "dequal": "^2.0.3",
88
88
  "extract-comments": "^1.1.0",
@@ -90,30 +90,29 @@
90
90
  "local-pkg": "^1.1.2",
91
91
  "micromatch": "^4.0.8",
92
92
  "picocolors": "^1.1.1",
93
- "tinyglobby": "^0.2.15",
94
- "yaml": "^2.8.2"
93
+ "tinyglobby": "^0.2.16",
94
+ "yaml": "^2.9.0"
95
95
  },
96
96
  "devDependencies": {
97
- "@antfu/eslint-config": "^7.7.3",
98
- "@antfu/utils": "^9.3.0",
97
+ "@antfu/eslint-config": "^9.0.0",
99
98
  "@solidjs/router": "^0.16.1",
100
99
  "@types/micromatch": "^4.0.10",
101
- "@types/node": "^25.5.0",
102
- "@vitest/ui": "^4.1.0",
103
- "@vue/compiler-sfc": "^3.5.30",
104
- "baseline-browser-mapping": "^2.10.8",
105
- "bumpp": "^11.0.1",
106
- "eslint": "^10.0.3",
107
- "playwright": "^1.58.2",
108
- "react": "^19.2.4",
109
- "react-router": "^7.13.1",
110
- "solid-js": "^1.9.11",
100
+ "@types/node": "^25.8.0",
101
+ "@vitest/ui": "^4.1.6",
102
+ "@vue/compiler-sfc": "^3.5.34",
103
+ "baseline-browser-mapping": "^2.10.29",
104
+ "bumpp": "^11.1.0",
105
+ "eslint": "^10.3.0",
106
+ "playwright": "^1.60.0",
107
+ "react": "^19.2.6",
108
+ "react-router": "^7.15.1",
109
+ "solid-js": "^1.9.12",
111
110
  "tsup": "^8.5.1",
112
- "tsx": "^4.21.0",
113
- "typescript": "^5.9.3",
114
- "vite": "^8.0.1",
115
- "vitest": "^4.1.0",
116
- "vue": "^3.5.30",
117
- "vue-router": "^5.0.3"
111
+ "tsx": "^4.22.0",
112
+ "typescript": "^6.0.3",
113
+ "vite": "^8.0.13",
114
+ "vitest": "^4.1.6",
115
+ "vue": "^3.5.34",
116
+ "vue-router": "^5.0.7"
118
117
  }
119
118
  }