{"version":3,"file":"index.cjs","sources":["../src/const.ts","../src/helpers.ts","../src/core/FSRouter.ts","../src/core/FSTree.ts","../src/core/ReactPages.ts","../src/unplugin.ts"],"sourcesContent":["export const pkgName = process.env.PKG_NAME;\nexport const pkgVersion = process.env.PKG_VERSION;\nexport const officialLink = 'https://github.com/FrontEndDev-org/unplugin-react-pages';\n","import { assignWith, isArray, isObject } from 'lodash-es';\n\nexport type DeepPartial<T> = {\n  [P in keyof T]?: DeepPartial<T[P]>;\n};\n\nexport function withDefaults<T>(defaults: T, inputs?: DeepPartial<T>) {\n  return assignWith(defaults, inputs, (v1, v2) => {\n    if (isObject(v1)) {\n      // eslint-disable-next-line\n      return withDefaults(v1, v2);\n    }\n\n    // eslint-disable-next-line\n    return v2 === undefined ? v1 : v2;\n  });\n}\n\nexport function indentLine(line: string, size = 0) {\n  return ' '.repeat(size) + line;\n}\n\ninterface JSXLike {\n  tag: string;\n  props?: Record<string, string>;\n  children?: JSXLike[];\n}\n\nexport function jsxLikeStringify(jsxLike: JSXLike) {\n  const stringify = (jsx: JSXLike): string => {\n    const arg1 = jsx.props\n      ? `{${Object.entries(jsx.props)\n          .map(([key, value]) => `${key}: ${value}`)\n          .join(', ')}}`\n      : 'null';\n    const arg2 = jsx.children ? `, ${jsx.children.map(stringify).join(', ')}` : '';\n    return `createElement(${jsx.tag}, ${arg1}${arg2})`;\n  };\n  return stringify(jsxLike);\n}\n\nexport function ensureArray(el: string | string[] | undefined) {\n  return isArray(el) ? el : el ? [el] : [];\n}\n","import nodePath from 'node:path';\nimport { indentLine, jsxLikeStringify } from '../helpers';\nimport type { FSNode, FSTree } from './FSTree';\nimport { pkgName, pkgVersion } from '../const';\n\nclass PageRoute {\n  parent?: LayoutRoute;\n  constructor(readonly fsNode: FSNode) {}\n\n  get id() {\n    return this.fsNode.id;\n  }\n\n  get path() {\n    const paths = [this.fsNode.path];\n    const find = (fsNode?: FSNode) => {\n      if (!fsNode) return;\n\n      // 有分组 depth = 1 结束\n      if (fsNode.group && fsNode.depth === 1) {\n        paths.unshift(fsNode.path);\n        return;\n      }\n\n      // 直到包含路由的节点为止\n      if (!fsNode.group && fsNode.layoutFileName) {\n        return;\n      }\n\n      paths.unshift(fsNode.path);\n      find(fsNode.parent);\n    };\n\n    find(this.fsNode.parent);\n    return paths.length === 0 || (paths.length === 1 && paths.at(0) === '') ? '' : nodePath.join(...paths);\n  }\n\n  render(indent = 0, tabSize = 4) {\n    const indent_1 = indent * tabSize;\n    const indent_2 = (indent + 1) * tabSize;\n    const lines = [\n      //\n      indentLine('{', indent_1),\n    ];\n\n    // path\n    lines.push(indentLine(`path: ${JSON.stringify(this.path)},`, indent_2));\n\n    // element\n    const pageName = FSRouter.makePageComponentName(this.fsNode.id);\n    const element = jsxLikeStringify({\n      tag: 'Suspense',\n      props: {},\n      children: [{ tag: pageName }],\n    });\n    lines.push(indentLine(`element: ${element},`, indent_2));\n    lines.push(indentLine('},', indent_1));\n\n    return lines;\n  }\n}\n\nclass LayoutRoute {\n  parent?: LayoutRoute;\n  children: (LayoutRoute | PageRoute)[] = [];\n  constructor(readonly fsNode: FSNode) {}\n\n  get id() {\n    return this.fsNode.id;\n  }\n\n  render(indent = 0, tabSize = 4) {\n    const indent_1 = indent * tabSize;\n    const indent_2 = (indent + 1) * tabSize;\n    const lines = [\n      //\n      indentLine('{', indent_1),\n    ];\n\n    // element\n    const layoutName = FSRouter.makeLayoutComponentName(this.fsNode.id);\n    const element = jsxLikeStringify({\n      tag: 'Suspense',\n      props: {},\n      children: [{ tag: layoutName }],\n    });\n    lines.push(indentLine(`element: ${element},`, indent_2));\n\n    if (this.children.length) {\n      lines.push(indentLine('children: [', indent_2));\n      lines.push(...this.children.flatMap((child) => child.render(indent + 2, tabSize)));\n      lines.push(indentLine('],', indent_2));\n    }\n\n    lines.push(indentLine('},', indent_1));\n    return lines;\n  }\n}\n\nexport class FSRouter {\n  constructor(readonly fsTree: FSTree) {}\n\n  pageRoutes = new Map<number, PageRoute>();\n  addPageNode(fsNode: FSNode) {\n    this.pageRoutes.set(fsNode.id, new PageRoute(fsNode));\n  }\n\n  layoutRoutes = new Map<number, LayoutRoute>();\n  addLayoutNode(fsNode: FSNode) {\n    this.layoutRoutes.set(fsNode.id, new LayoutRoute(fsNode));\n  }\n\n  build() {\n    this.pageRoutes.forEach((pageRoute) => {\n      const find = (node: FSNode) => {\n        if (node.layoutFileName) {\n          const layoutRoute = this.layoutRoutes.get(node.id);\n\n          if (layoutRoute) {\n            pageRoute.parent = layoutRoute;\n            layoutRoute.children.push(pageRoute);\n            return;\n          }\n        }\n\n        if (node.parent) find(node.parent);\n      };\n\n      find(pageRoute.fsNode);\n    });\n\n    this.layoutRoutes.forEach((layoutRoute) => {\n      const find = (node: FSNode) => {\n        const parent = node.parent;\n        if (!parent) return;\n\n        // 独立分组布局根节点\n        if (node.group && node.depth === 1) return;\n\n        if (parent.layoutFileName) {\n          const parentRoute = this.layoutRoutes.get(parent.id);\n\n          if (parentRoute) {\n            layoutRoute.parent = parentRoute;\n            parentRoute.children.push(layoutRoute);\n            return;\n          }\n        }\n\n        find(parent);\n      };\n\n      find(layoutRoute.fsNode);\n    });\n  }\n\n  render(tabSize = 4) {\n    const importPages = ['// pages'];\n    const importLayouts = ['// layouts'];\n\n    const pageLines: string[] = [];\n    this.pageRoutes.forEach((route) => {\n      const importName = FSRouter.makePageComponentName(route.id);\n      importPages.push(`const ${importName} = lazy(() => import(\"${route.fsNode.pageFile}\"));`);\n\n      if (!route.parent) {\n        pageLines.push(...route.render(0, tabSize));\n      }\n    });\n\n    const layoutLines: string[] = [];\n    this.layoutRoutes.forEach((route) => {\n      const importName = FSRouter.makeLayoutComponentName(route.id);\n      importLayouts.push(`const ${importName} = lazy(() => import(\"${route.fsNode.layoutFile}\"));`);\n\n      if (!route.parent) {\n        layoutLines.push(...route.render(0, tabSize));\n      }\n    });\n\n    return [\n      '/**',\n      ` * generated by ${pkgName}@${pkgVersion}`,\n      ' * @ref https://github.com/FrontEndDev-org/unplugin-react-pages',\n      ' * @ref https://react.dev',\n      ' * @ref https://reactrouter.com',\n      ' */',\n      '',\n      'import { Suspense, lazy, createElement } from \"react\";',\n      'import { Outlet } from \"react-router-dom\";',\n      '',\n      ...importPages,\n      '',\n      ...importLayouts,\n      '',\n      'export const routes = [',\n      ...pageLines,\n      ...layoutLines,\n      '];',\n      '',\n    ].join('\\n');\n  }\n\n  // TODO\n  update() {}\n\n  static makeLayoutComponentName(id: number) {\n    return `Layout_${id}`;\n  }\n\n  static makePageComponentName(id: number) {\n    return `Page_${id}`;\n  }\n}\n","import nodePath from 'node:path';\nimport type { Logger } from 'vite';\nimport { isNumber } from 'lodash-es';\nimport { FSRouter } from './FSRouter';\n\nexport interface PageMeta {\n  pageFileName: string;\n  depth: number;\n  group?: string;\n  dirName: string;\n  pathName: string;\n}\n\nexport type FileType = 'page' | 'layout' | 'loader' | 'action' | 'error' | 'loading' | 'not-found';\n\nexport class FSNode {\n  id: number;\n\n  /**\n   * 分组\n   */\n  group?: string;\n\n  /**\n   * 深度，起始为 0\n   */\n  depth: number;\n  /**\n   * 【唯一】所在目录，相对于 cwd\n   */\n  dirName: string;\n  /**\n   * 路径名\n   */\n  pathName: string;\n  /**\n   * 页面，未声明页面时为空字符串\n   * @ref https://reactrouter.com/en/main/route/route#elementcomponent\n   */\n  pageFileName: string;\n  /**\n   * https://reactrouter.com/en/main/start/concepts#layout-routes\n   */\n  layoutFileName?: string;\n  /**\n   * @ref https://reactrouter.com/en/main/route/loader\n   */\n  loaderFileName?: string;\n  /**\n   * @ref https://reactrouter.com/en/main/route/action\n   */\n  actionFileName?: string;\n  /**\n   * @ref https://reactrouter.com/en/main/route/error-element\n   */\n  errorFileName?: string;\n  /**\n   * @ref https://react.dev/reference/react/Suspense\n   */\n  loadingFileName?: string;\n  /**\n   * @ref https://reactrouter.com/en/main/start/faq#how-do-i-add-a-no-match-404-route-in-react-router-v6\n   */\n  notFoundFileName?: string;\n\n  children: FSNode[] = [];\n  parent?: FSNode;\n\n  constructor(\n    readonly tree: FSTree,\n    pageMeta: PageMeta,\n  ) {\n    const { pageFileName, depth, group, dirName, pathName } = pageMeta;\n\n    this.id = this.tree.nextId();\n\n    this.pageFileName = pageFileName;\n    this.depth = depth;\n    this.group = group;\n    this.dirName = dirName;\n    this.pathName = pathName;\n\n    this.layoutFileName = this._resolveFileName('layout');\n    this.loaderFileName = this._resolveFileName('loader');\n    this.actionFileName = this._resolveFileName('action');\n    this.errorFileName = this._resolveFileName('error');\n    this.loadingFileName = this._resolveFileName('loading');\n    this.notFoundFileName = this._resolveFileName('not-found');\n\n    this.tree.dirMap.set(dirName, this);\n\n    if (this.pageFileName) {\n      this.tree.fsRouter.addPageNode(this);\n    }\n\n    if (this.layoutFileName) {\n      this.tree.fsRouter.addLayoutNode(this);\n    }\n\n    if (depth === 0) {\n      this.tree.root = this;\n    }\n\n    this._linking();\n  }\n\n  update(meta: PageMeta) {\n    Object.assign(this, meta);\n  }\n\n  get path() {\n    return this.pathName === '.'\n      ? ''\n      : this.pathName.startsWith('[') && this.pathName.endsWith(']')\n        ? `:${this.pathName.slice(1, -1)}`\n        : this.pathName.startsWith('(') && this.pathName.endsWith(')')\n          ? this.pathName.slice(1, -1)\n          : this.pathName;\n  }\n\n  get pageFile() {\n    return nodePath.join(this.tree.cwd, this.dirName, this.pageFileName);\n  }\n\n  private _resolveFileName(fileType: FileType) {\n    return this.tree.options.resolveFileName(this, fileType);\n  }\n\n  private _resolveFile(fileName?: string) {\n    return fileName && nodePath.join(this.tree.cwd, this.dirName, fileName);\n  }\n\n  get layoutFile() {\n    return this._resolveFile(this.layoutFileName);\n  }\n\n  get actionFile() {\n    return this._resolveFile(this.actionFileName);\n  }\n\n  get loaderFile() {\n    return this._resolveFile(this.loaderFileName);\n  }\n\n  get errorFile() {\n    return this._resolveFile(this.errorFileName);\n  }\n\n  get loadingFile() {\n    return this._resolveFile(this.loadingFileName);\n  }\n\n  get notFoundFile() {\n    return this._resolveFile(this.notFoundFileName);\n  }\n\n  private _linking() {\n    const { depth, dirName: dir } = this;\n    const parentDepth = depth - 1;\n    const parentDir = nodePath.dirname(dir);\n    const parentName = nodePath.basename(parentDir);\n    const parentGroup = depth > 0 ? this.group : undefined;\n\n    if (depth < 1) return;\n\n    const parent = this.tree.dirMap.get(parentDir);\n\n    if (parent) {\n      this.parent = parent;\n      parent.children.push(this);\n    } else {\n      const newParent = new FSNode(this.tree, {\n        pageFileName: '',\n        depth: parentDepth,\n        dirName: parentDir,\n        pathName: parentName,\n        group: parentGroup,\n      });\n\n      this.parent = newParent;\n      newParent.children.push(this);\n    }\n  }\n\n  static parse(pageFile: string): PageMeta {\n    const segments = pageFile.split('/');\n    // 去除末尾 page.tsx\n    // path/to/page.tsx -> [path, to, page.tsx]\n    // -> [path, to]\n    const pageFileName = segments.pop()!;\n    const depth = segments.length;\n    const pathName = segments.at(-1) || '.';\n    const dirName = segments.join('/') || '.';\n    const firstSeg = segments.at(0);\n    const group =\n      depth > 0 && firstSeg?.startsWith('(') && firstSeg?.endsWith(')') ? firstSeg?.slice(1, -1) : undefined;\n    return { pageFileName, depth, dirName, pathName, group };\n  }\n\n  static create(tree: FSTree, meta: PageMeta) {\n    return new FSNode(tree, meta);\n  }\n}\n\nexport interface FSTreeOptions {\n  cwd: string;\n  logger: Logger;\n  resolveFileName: (fsNode: FSNode, fileType: FileType) => string | undefined;\n  resolveDuplicate: (fsNode: FSNode, duplicatePages: string[]) => number | undefined;\n}\n\nexport class FSTree {\n  root?: FSNode;\n  dirMap = new Map<string, FSNode>();\n  fsRouter = new FSRouter(this);\n\n  constructor(readonly options: FSTreeOptions) {}\n\n  get cwd() {\n    return this.options.cwd;\n  }\n\n  get logger() {\n    return this.options.logger;\n  }\n\n  mount(pages: string[]) {\n    if (this.dirMap.size) {\n      this.logger.info(`prepare to mount pages...`);\n      this.root = undefined;\n      this.dirMap.clear();\n      this.fsRouter = new FSRouter(this);\n    }\n\n    this.logger.info(`mount pages: ${JSON.stringify(pages)}`);\n    pages.forEach((page) => {\n      const meta = FSNode.parse(page);\n      const fsNode = this.dirMap.get(meta.dirName);\n\n      if (fsNode) {\n        if (fsNode.pageFileName) {\n          this.logger.info(`fsNode page already exists [${fsNode.pageFileName}, ${meta.pageFileName}]`);\n          const chooseIndex = this.options.resolveDuplicate(fsNode, [fsNode.pageFileName, meta.pageFileName]);\n          this.logger.info(`choose index: ${chooseIndex}`);\n\n          if (isNumber(chooseIndex) && chooseIndex > -1) {\n            fsNode.update(meta);\n          }\n        } else {\n          fsNode.update(meta);\n        }\n      } else {\n        FSNode.create(this, meta);\n      }\n    });\n    this.logger.info(`build router`);\n    this.fsRouter.build();\n  }\n\n  // // TODO\n  // addFileByType(fileType: FileType, fileName: string) {\n  //     this.logger.info(`add file type: ${fileType} -> ${fileName}`);\n  // }\n\n  // // TODO\n  // removeFileByType(fileType: FileType, fileName: string) {\n  //     this.logger.info(`remove file type: ${fileType}`);\n  // }\n\n  render(tabSize = 4) {\n    return this.fsRouter.render(tabSize);\n  }\n\n  private _id = 0;\n  nextId() {\n    return this._id++;\n  }\n\n  static makeLayoutComponentName(id: number) {\n    return `Layout_${id}`;\n  }\n\n  static makePageComponentName(id: number) {\n    return `Page_${id}`;\n  }\n}\n","import nodeFS from 'node:fs';\nimport nodePath from 'node:path';\nimport { glob } from 'glob';\nimport { type Logger, type ViteDevServer, createLogger, normalizePath } from 'vite';\nimport { pkgName } from '../const';\nimport { ensureArray } from '../helpers';\nimport type { PluginOptions } from '../plugin';\nimport { FSTree } from './FSTree';\n\nexport type ReactPagesChange = (this: ReactPages) => unknown;\nexport class ReactPages {\n  logger: Logger;\n  fsTree: FSTree;\n  absPagesDir: string;\n\n  constructor(\n    readonly cwd: string,\n    readonly options: PluginOptions,\n  ) {\n    this.logger = createLogger(options.logLevel, { prefix: `[${pkgName}]` });\n    this.logger.info(`new Options: ${JSON.stringify(options)}`);\n    this.absPagesDir = nodePath.join(this.cwd, options.pagesDir);\n    this.fsTree = new FSTree({\n      cwd: nodePath.join('/', options.pagesDir),\n      logger: this.logger,\n      resolveFileName: (page, fileType) => {\n        const fileNames = ensureArray(this.options.fileNames[fileType]);\n        if (fileNames.length === 0) return;\n\n        return fileNames.find((fileName) => {\n          const absFile = nodePath.join(this.absPagesDir, page.dirName, fileName);\n          return nodeFS.existsSync(absFile) && nodeFS.statSync(absFile).isFile();\n        });\n      },\n      resolveDuplicate: (fsNode, duplicatePages) => {\n        const fileNames = ensureArray(this.options.fileNames.page);\n        if (fileNames.length === 0) return;\n\n        for (let i = 0; i < fileNames.length; i++) {\n          if (duplicatePages.includes(fileNames[i])) return i;\n        }\n      },\n    });\n  }\n\n  async generate() {\n    if (!this.isSetup) {\n      this.logger.info(`is not setup, try to setup again`);\n      await this.setup();\n    }\n\n    const output = this.fsTree.render();\n    this.logger.info(`Generated: ${output}`);\n    return output;\n  }\n\n  private _inPagesDir(path: string) {\n    return path.startsWith(this.absPagesDir);\n  }\n\n  private devServer?: ViteDevServer;\n  private onChange?: () => unknown;\n  async watch(devServer: ViteDevServer, onChange: ReactPagesChange) {\n    this.devServer = devServer;\n    this.onChange = onChange;\n    this.logger.info(`setup`);\n\n    devServer.watcher.on('unlink', (path) => {\n      if (!this._inPagesDir(path)) return;\n\n      void this.removeFile(path);\n    });\n\n    devServer.watcher.on('add', (path) => {\n      if (!this._inPagesDir(path)) return;\n\n      void this.addFile(path);\n    });\n\n    devServer.watcher.on('change', (path) => {\n      if (!this._inPagesDir(path)) return;\n\n      void this.updateFile(path);\n    });\n\n    await this.setup();\n  }\n\n  private _isSetup = false;\n  get isSetup() {\n    return this._isSetup;\n  }\n\n  async setup() {\n    if (this.isSetup) {\n      this.logger.error(`is already setup`);\n      return;\n    }\n\n    this.logger.info(`setup react pages ${this.absPagesDir}`);\n\n    const pageFileNames = ensureArray(this.options.fileNames.page);\n\n    if (pageFileNames.length > 0) {\n      const pageFiles = await glob(\n        nodePath.join('**', pageFileNames.length > 1 ? `{${pageFileNames.join(',')}}` : pageFileNames[0]),\n        {\n          cwd: this.absPagesDir,\n          nodir: true,\n          dot: false,\n          ignore: this.options.excludes,\n        },\n      );\n      const pageFiles2 = pageFiles.map(normalizePath);\n      // .sort((a, b) => a.split(nodePath.sep).length - b.split(nodePath.sep).length);\n      this.logger.info(`Page files: ${JSON.stringify(pageFiles2)}`);\n      this.fsTree.mount(pageFiles2);\n    } else {\n      this.logger.error(`No page file name specified`);\n    }\n  }\n\n  teardown() {\n    this.logger.info(`teardown`);\n    this._isSetup = false;\n  }\n\n  async addFile(file: string) {\n    this.logger.info(`Add file: ${file}`);\n    // TODO 临时\n    await this.setup();\n    this.onChange?.();\n  }\n\n  updateFile(file: string) {\n    this.logger.info(`Update file: ${file}`);\n  }\n\n  async removeFile(file: string) {\n    this.logger.info(`Remove file: ${file}`);\n    // TODO 临时\n    await this.setup();\n    this.onChange?.();\n  }\n}\n","import { createUnplugin } from 'unplugin';\nimport { pkgName } from './const';\nimport { ReactPages } from './core/ReactPages';\nimport { type DeepPartial, withDefaults } from './helpers';\nimport type { PluginOptions } from './plugin';\n\nexport type UserPluginOptions = DeepPartial<PluginOptions>;\n\n// @ref https://cn.vitejs.dev/guide/api-plugin#virtual-modules-convention\nconst virtualModuleId = 'virtual:react-pages';\nconst resolvedVirtualModuleId = `\\0${virtualModuleId}`;\n\nconst defaultPluginOptions: () => PluginOptions = () => ({\n  debug: false,\n  pagesDir: 'src/pages',\n  logLevel: 'error',\n  disableLazy: false,\n  caseSensitive: false,\n  fileNames: {\n    page: ['page.jsx', 'page.tsx'],\n    action: ['action.jsx', 'action.tsx'],\n    layout: ['layout.jsx', 'layout.tsx'],\n    error: ['error.jsx', 'error.tsx'],\n    loading: ['loading.jsx', 'loading.tsx'],\n    loader: ['loader.jsx', 'loader.tsx'],\n    'not-found': ['not-found.jsx', 'not-found.tsx'],\n  },\n  excludes: ['**/node_modules/**'],\n});\n\nexport const reactPages = createUnplugin<UserPluginOptions>((options) => {\n  let reactPages: ReactPages | null = null;\n\n  return {\n    name: pkgName,\n    enforce: 'pre',\n\n    buildStart() {\n      reactPages = new ReactPages(process.cwd(), withDefaults(defaultPluginOptions(), options));\n    },\n\n    buildEnd() {\n      reactPages?.teardown();\n    },\n\n    resolveId(id) {\n      if (id !== virtualModuleId) return;\n\n      return resolvedVirtualModuleId;\n    },\n\n    loadInclude(id) {\n      return id === resolvedVirtualModuleId;\n    },\n\n    async load(id) {\n      if (id !== resolvedVirtualModuleId) return;\n\n      return reactPages?.generate();\n    },\n  };\n});\n"],"names":["assignWith","isObject","isArray","isNumber","createLogger","glob","normalizePath","createUnplugin","reactPages"],"mappings":"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"}