vite-plugin-pages2 0.34.4 → 0.34.5

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
@@ -81,7 +81,7 @@ var replaceIndexRE = /\/?index$/;
81
81
  var import_node_path4 = require("path");
82
82
  var import_node_process2 = __toESM(require("process"), 1);
83
83
 
84
- // node_modules/.pnpm/@antfu+utils@9.2.0/node_modules/@antfu/utils/dist/index.mjs
84
+ // node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs
85
85
  function toArray(array) {
86
86
  array = array != null ? array : [];
87
87
  return Array.isArray(array) ? array : [array];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/context.ts","../node_modules/.pnpm/@antfu+utils@9.2.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.find(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.find(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 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\nfunction pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\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});\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, 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\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(/\\/$/, ''),\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\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(/^\\//, '').replace(/\\/$/, '')\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\n\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(/(\\s)/g, '')\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\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(/^\\//, '')\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\n\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(/^\\//, '')\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\n\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(/^\\//, '')\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","parent","prepareRoutes","parent","extractComments","YAMLParser","JSON5","fs","prepareRoutes","parent","route","colors","process","process"]}
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.find(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.find(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\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(/\\/$/, ''),\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\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(/^\\//, '').replace(/\\/$/, '')\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\n\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(/(\\s)/g, '')\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\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(/^\\//, '')\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\n\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(/^\\//, '')\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\n\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(/^\\//, '')\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","parent","prepareRoutes","parent","extractComments","YAMLParser","JSON5","fs","prepareRoutes","parent","route","colors","process","process"]}
package/dist/index.js CHANGED
@@ -43,7 +43,7 @@ var replaceIndexRE = /\/?index$/;
43
43
  import { join as join2, resolve as resolve3 } from "path";
44
44
  import process2 from "process";
45
45
 
46
- // node_modules/.pnpm/@antfu+utils@9.2.0/node_modules/@antfu/utils/dist/index.mjs
46
+ // node_modules/.pnpm/@antfu+utils@9.3.0/node_modules/@antfu/utils/dist/index.mjs
47
47
  function toArray(array) {
48
48
  array = array != null ? array : [];
49
49
  return Array.isArray(array) ? array : [array];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/context.ts","../node_modules/.pnpm/@antfu+utils@9.2.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 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\nfunction pLimit(concurrency) {\n\tvalidateConcurrency(concurrency);\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst resumeNext = () => {\n\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t\t// Since `pendingCount` has been decreased by one, increase `activeCount` by one.\n\t\t\tactiveCount++;\n\t\t}\n\t};\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tresumeNext();\n\t};\n\n\tconst run = async (function_, resolve, arguments_) => {\n\t\tconst result = (async () => function_(...arguments_))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (function_, resolve, arguments_) => {\n\t\t// Queue `internalResolve` instead of the `run` function\n\t\t// to preserve asynchronous context.\n\t\tnew Promise(internalResolve => {\n\t\t\tqueue.enqueue(internalResolve);\n\t\t}).then(\n\t\t\trun.bind(undefined, function_, resolve, arguments_),\n\t\t);\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// after the `internalResolve` function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency) {\n\t\t\t\tresumeNext();\n\t\t\t}\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});\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, 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\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(/\\/$/, ''),\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\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(/^\\//, '').replace(/\\/$/, '')\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\n\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(/(\\s)/g, '')\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\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(/^\\//, '')\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\n\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(/^\\//, '')\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\n\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(/^\\//, '')\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.find(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.find(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","parent","prepareRoutes","parent","prepareRoutes","parent","route","resolve","process","resolve","join"]}
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\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(/\\/$/, ''),\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\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(/^\\//, '').replace(/\\/$/, '')\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\n\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(/(\\s)/g, '')\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\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(/^\\//, '')\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\n\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(/^\\//, '')\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\n\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(/^\\//, '')\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.find(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.find(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","parent","prepareRoutes","parent","prepareRoutes","parent","route","resolve","process","resolve","join"]}
package/package.json CHANGED
@@ -1,135 +1,135 @@
1
- {
2
- "name": "vite-plugin-pages2",
3
- "type": "module",
4
- "version": "0.34.4",
5
- "packageManager": "pnpm@10.14.0",
6
- "description": "File system base vue-router plugin for Vite",
7
- "author": "wuc656 <wuc656@gmail.com>, hannoeru <me@hanlee.co>",
8
- "license": "MIT",
9
- "homepage": "https://github.com/wuc656/vite-plugin-pages",
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/wuc656/vite-plugin-pages.git"
13
- },
14
- "bugs": "https://github.com/wuc656/vite-plugin-pages/issues",
15
- "keywords": [
16
- "vite",
17
- "vue",
18
- "vue-router",
19
- "react",
20
- "react-router",
21
- "solid-js",
22
- "@solidjs/router",
23
- "file-system-based",
24
- "routing"
25
- ],
26
- "exports": {
27
- ".": {
28
- "types": "./dist/index.d.ts",
29
- "import": "./dist/index.js",
30
- "require": "./dist/index.cjs"
31
- },
32
- "./client": {
33
- "types": "./client.d.ts"
34
- },
35
- "./client-react": {
36
- "types": "./client-react.d.ts"
37
- },
38
- "./client-solid": {
39
- "types": "./client-solid.d.ts"
40
- }
41
- },
42
- "main": "dist/index.js",
43
- "types": "dist/index.d.ts",
44
- "files": [
45
- "LICENSE",
46
- "client-react.d.ts",
47
- "client-solid.d.ts",
48
- "client.d.ts",
49
- "dist"
50
- ],
51
- "scripts": {
52
- "dev": "npm run build -- --watch --ignore-watch examples",
53
- "build": "tsup",
54
- "play": "pnpm --filter vue dev",
55
- "play:react": "pnpm --filter react dev",
56
- "prepublishOnly": "npm run build",
57
- "release": "bumpp --commit --tag --push && npm publish",
58
- "publish:ci": "esno scripts/publish.ts",
59
- "test": "vitest",
60
- "test:e2e": "vitest -c vitest.config.e2e.ts",
61
- "test:ui": "vitest --ui",
62
- "lint": "eslint .",
63
- "lint:fix": "eslint . --fix",
64
- "type-check": "tsc --noEmit"
65
- },
66
- "peerDependencies": {
67
- "@vue/compiler-sfc": "^2.7.0 || ^3.0.0",
68
- "vite": "^2.0.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
69
- },
70
- "peerDependenciesMeta": {
71
- "@solidjs/router": {
72
- "optional": true
73
- },
74
- "@vue/compiler-sfc": {
75
- "optional": true
76
- },
77
- "react-router": {
78
- "optional": true
79
- },
80
- "vue-router": {
81
- "optional": true
82
- }
83
- },
84
- "dependencies": {
85
- "@types/debug": "^4.1.12",
86
- "debug": "^4.4.1",
87
- "dequal": "^2.0.3",
88
- "extract-comments": "^1.1.0",
89
- "json5": "^2.2.3",
90
- "local-pkg": "^1.1.1",
91
- "micromatch": "^4.0.8",
92
- "picocolors": "^1.1.1",
93
- "tinyglobby": "^0.2.14",
94
- "yaml": "^2.8.1"
95
- },
96
- "devDependencies": {
97
- "@antfu/eslint-config": "^5.2.1",
98
- "@antfu/utils": "^9.2.0",
99
- "@solidjs/router": "^0.15.3",
100
- "@types/micromatch": "^4.0.9",
101
- "@types/node": "^24.2.1",
102
- "@vitest/ui": "^3.2.4",
103
- "@vue/compiler-sfc": "^3.5.18",
104
- "bumpp": "^10.2.3",
105
- "eslint": "^9.33.0",
106
- "esno": "^4.8.0",
107
- "playwright": "^1.54.2",
108
- "react": "^19.1.1",
109
- "react-router": "^7.8.0",
110
- "solid-js": "^1.9.9",
111
- "tsup": "^8.5.0",
112
- "typescript": "^5.9.2",
113
- "vite": "^7.1.2",
114
- "vitest": "^3.2.4",
115
- "vue": "^3.5.18",
116
- "vue-router": "^4.5.1"
117
- },
118
- "pnpm": {
119
- "peerDependencyRules": {
120
- "allowedVersions": {
121
- "eslint": "*"
122
- }
123
- },
124
- "overrides": {
125
- "array-flatten": "npm:@nolyfill/array-flatten@^1.0.44",
126
- "is-core-module": "npm:@nolyfill/is-core-module@^1.0.39",
127
- "safe-buffer": "npm:@nolyfill/safe-buffer@^1.0.44",
128
- "safer-buffer": "npm:@nolyfill/safer-buffer@^1.0.44",
129
- "side-channel": "npm:@nolyfill/side-channel@^1.0.44"
130
- },
131
- "onlyBuiltDependencies": [
132
- "esbuild"
133
- ]
134
- }
135
- }
1
+ {
2
+ "name": "vite-plugin-pages2",
3
+ "type": "module",
4
+ "version": "0.34.5",
5
+ "packageManager": "pnpm@10.18.1",
6
+ "description": "File system base vue-router plugin for Vite",
7
+ "author": "wuc656 <wuc656@gmail.com>, hannoeru <me@hanlee.co>",
8
+ "license": "MIT",
9
+ "homepage": "https://github.com/wuc656/vite-plugin-pages",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/wuc656/vite-plugin-pages.git"
13
+ },
14
+ "bugs": "https://github.com/wuc656/vite-plugin-pages/issues",
15
+ "keywords": [
16
+ "vite",
17
+ "vue",
18
+ "vue-router",
19
+ "react",
20
+ "react-router",
21
+ "solid-js",
22
+ "@solidjs/router",
23
+ "file-system-based",
24
+ "routing"
25
+ ],
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js",
30
+ "require": "./dist/index.cjs"
31
+ },
32
+ "./client": {
33
+ "types": "./client.d.ts"
34
+ },
35
+ "./client-react": {
36
+ "types": "./client-react.d.ts"
37
+ },
38
+ "./client-solid": {
39
+ "types": "./client-solid.d.ts"
40
+ }
41
+ },
42
+ "main": "dist/index.js",
43
+ "types": "dist/index.d.ts",
44
+ "files": [
45
+ "LICENSE",
46
+ "client-react.d.ts",
47
+ "client-solid.d.ts",
48
+ "client.d.ts",
49
+ "dist"
50
+ ],
51
+ "scripts": {
52
+ "dev": "npm run build -- --watch --ignore-watch examples",
53
+ "build": "tsup",
54
+ "play": "pnpm --filter vue dev",
55
+ "play:react": "pnpm --filter react dev",
56
+ "prepublishOnly": "npm run build",
57
+ "release": "bumpp --commit --tag --push && npm publish",
58
+ "publish:ci": "tsx scripts/publish.ts",
59
+ "test": "vitest",
60
+ "test:e2e": "vitest -c vitest.config.e2e.ts",
61
+ "test:ui": "vitest --ui",
62
+ "lint": "eslint .",
63
+ "lint:fix": "eslint . --fix",
64
+ "type-check": "tsc --noEmit"
65
+ },
66
+ "peerDependencies": {
67
+ "@vue/compiler-sfc": "^2.7.0 || ^3.0.0",
68
+ "vite": "^2.0.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
69
+ },
70
+ "peerDependenciesMeta": {
71
+ "@solidjs/router": {
72
+ "optional": true
73
+ },
74
+ "@vue/compiler-sfc": {
75
+ "optional": true
76
+ },
77
+ "react-router": {
78
+ "optional": true
79
+ },
80
+ "vue-router": {
81
+ "optional": true
82
+ }
83
+ },
84
+ "dependencies": {
85
+ "@types/debug": "^4.1.12",
86
+ "debug": "^4.4.3",
87
+ "dequal": "^2.0.3",
88
+ "extract-comments": "^1.1.0",
89
+ "json5": "^2.2.3",
90
+ "local-pkg": "^1.1.2",
91
+ "micromatch": "^4.0.8",
92
+ "picocolors": "^1.1.1",
93
+ "tinyglobby": "^0.2.15",
94
+ "yaml": "^2.8.1"
95
+ },
96
+ "devDependencies": {
97
+ "@antfu/eslint-config": "^5.4.1",
98
+ "@antfu/utils": "^9.3.0",
99
+ "@solidjs/router": "^0.15.3",
100
+ "@types/micromatch": "^4.0.9",
101
+ "@types/node": "^24.7.0",
102
+ "@vitest/ui": "^3.2.4",
103
+ "@vue/compiler-sfc": "^3.5.22",
104
+ "bumpp": "^10.3.1",
105
+ "eslint": "^9.37.0",
106
+ "playwright": "^1.56.0",
107
+ "react": "^19.2.0",
108
+ "react-router": "^7.9.3",
109
+ "solid-js": "^1.9.9",
110
+ "tsup": "^8.5.0",
111
+ "tsx": "^4.20.6",
112
+ "typescript": "^5.9.3",
113
+ "vite": "^7.1.9",
114
+ "vitest": "^3.2.4",
115
+ "vue": "^3.5.22",
116
+ "vue-router": "^4.5.1"
117
+ },
118
+ "pnpm": {
119
+ "peerDependencyRules": {
120
+ "allowedVersions": {
121
+ "eslint": "*"
122
+ }
123
+ },
124
+ "overrides": {
125
+ "array-flatten": "npm:@nolyfill/array-flatten@^1.0.44",
126
+ "is-core-module": "npm:@nolyfill/is-core-module@^1.0.39",
127
+ "safe-buffer": "npm:@nolyfill/safe-buffer@^1.0.44",
128
+ "safer-buffer": "npm:@nolyfill/safer-buffer@^1.0.44",
129
+ "side-channel": "npm:@nolyfill/side-channel@^1.0.44"
130
+ },
131
+ "onlyBuiltDependencies": [
132
+ "esbuild"
133
+ ]
134
+ }
135
+ }