@generouted/tanstack-react-router
Version:
Generated file-based routes for TanStack React Router and Vite
31 lines (25 loc) • 6.01 kB
JavaScript
var Y=Object.defineProperty,Z=Object.defineProperties;var k=Object.getOwnPropertyDescriptors;var P=Object.getOwnPropertySymbols;var z=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var L=(t,n,e)=>n in t?Y(t,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):t[n]=e,f=(t,n)=>{for(var e in n||(n={}))z.call(n,e)&&L(t,e,n[e]);if(P)for(var e of P(n))A.call(n,e)&&L(t,e,n[e]);return t},D=(t,n)=>Z(t,k(n));var N=(t,n)=>{var e={};for(var o in t)z.call(t,o)&&n.indexOf(o)<0&&(e[o]=t[o]);if(t!=null&&P)for(var o of P(t))n.indexOf(o)<0&&A.call(t,o)&&(e[o]=t[o]);return e};import it from"path";import{writeFileSync as rt}from"fs";import st from"fast-glob";import{readFileSync as tt}from"fs";var S={route:[/^.*\/src\/pages\/|^\/pages\/|\.(jsx|tsx|mdx)$/g,""],splat:[/\[\.{3}\w+\]/g,"*"],param:[/\[([^\]]+)\]/g,":$1"],slash:[/^index$|\./g,"/"],optional:[/^-(:?[\w-]+|\*)/,"$1?"]},v=t=>t.replace(...S.route).replace(/\W/g,""),et=t=>({default:/^export\s+default\s/gm.test(t),loader:/^export\s+(const|function|async function|let)\s+Loader\W/gm.test(t),action:/^export\s+(const|function|async function|let)\s+Action\W/gm.test(t),pending:/^export\s+(const|function|async function|let)\s+Pending\W/gm.test(t),catch_:/^export\s+(const|function|let)\s+Catch\W/gm.test(t)}),G=(t,n,e)=>{let o=t.filter(c=>!c.includes("/_")||/(_app|_layout)\.(jsx|tsx)$/.test(c)).sort((c,a)=>c.localeCompare(a)),g=o.map(c=>v(c)),h={},w=o.reduce((c,a)=>{let _=tt(a,{encoding:"utf-8"}),p=v(a);if(h[p]=et(_),!h[p].default||["_app","404"].includes(p)||g.includes(p+"_layout"))return c;let m=n(a,h[p],p),u=a.replace(...e.route).replace(...e.splat).replace(...e.param).split("/").filter(Boolean);return u.reduce((r,x,s)=>{var E,T;let l=x.replace(...e.slash).replace(...e.optional),d=s===0,R=s===u.length-1&&u.length>1,C=!d&&!R,Q=x==="_layout",U=/\([\w-]+\)/.test(l),B=/^\w|\//.test(l)?"unshift":"push";if(d&&u.length===1)return c.push(f({id:p,pid:"root",path:l},m)),r;if(d||C){let i=d?c:r.children,F=v(u.slice(0,s+1).join("")),$=i==null?void 0:i.find(W=>W.path===l||W.id===F),V=(r==null?void 0:r.id)||"root",X=U?{}:{path:l};return $?(E=$.children)!=null||($.children=[]):i==null||i[B](D(f({},X),{id:F,pid:V,children:[]})),$||(i==null?void 0:i[B==="unshift"?0:i.length-1])}if(Q){let i=u.slice(0,s-1).join("")||"root";return Object.assign(r,f({id:r.id||r.path,pid:i},m))}return R&&((T=r==null?void 0:r.children)==null||T[B](f({id:p,pid:(r==null?void 0:r.id)||"root",path:l},m))),r},{}),c},[]),O={_app:g.includes("_app"),_404:g.includes("404")},j=g.length-Object.values(O).filter(Boolean).length;return{routes:w,preserved:O,exports:h,count:j}};import{execSync as ot}from"child_process";import{existsSync as M}from"fs";import nt from"path";var I=nt.resolve("./node_modules/.bin/prettier"),J=t=>{!M(I)||!M(t)||ot(`${I} --write --cache ${t}`)};var q=`// Generouted, changes to this file will be overridden
import { Fragment } from 'react'
import { Outlet, RouterProvider, createLazyRoute, createRootRoute, createRoute, createRouter } from '@tanstack/react-router'
// imports
// modules
const config = root.addChildren([
// config,
_404,
])
const router = createRouter({ routeTree: config })
export const routes = config
export const Routes = () => <RouterProvider router={router} />
declare module '@tanstack/react-router' {
interface Register {
router: typeof router
}
}
`;var y=Object.assign(S,{param:[/\[([^\]]+)\]/g,"$$$1"],optional:[/^-(\$?[\w-]+)/,"$1?"]}),ct=async()=>{let n=await st(["./src/pages/**/[\\w[-]*.{jsx,tsx}"],{onlyFiles:!0}),e=[],o=[],{routes:g,preserved:h,exports:w,count:O}=G(n,(a,_,p="")=>{let{loader:m,action:u,pending:r,catch_:x}=_,s=a.replace(...y.route),l=`import('./pages/${s}')`,d=s.replace(...y.splat).replace(...y.param).replace(/\(|\)|\/?_layout/g,"").replace(/\/?index|\./g,"/").replace(/(\w)\/$/g,"$1").split("/").map(C=>C.replace(...y.optional)).join("/");return{_path:d.length>1?`/${d}`:d,_module:l,_loader:m?`
// @ts-ignore
loader: (...args) => ${l}.then((m) => m.Loader(...args))`:"",_action:"",_component:"component: m.default",_pendingComponent:r?"pendingComponent: m.Pending":"",_errorComponent:x?"errorComponent: m.Catch":""}},y);h._app&&w._app.default?(e.push("import App from './pages/_app'"),o.push("const root = createRootRoute({ component: App || Outlet })")):o.push("const root = createRootRoute({ component: Outlet })"),h._404&&w[404].default?(e.push("import NoMatch from './pages/404'"),o.push("const _404 = createRoute({ getParentRoute: () => root, path: '*', component: NoMatch || Fragment })")):o.push("const _404 = createRoute({ getParentRoute: () => root, path: '*', component: Fragment })");let j=JSON.stringify(g,function(a,_){if(a==="id"){let p=this,{id:m,pid:u,path:r}=p,s=N(p,["id","pid","path"]),l=[s._component,s._pendingComponent,s._errorComponent].filter(Boolean),d=[r?`path: '${r}'`:`id: '${m}'`,s._loader,s._action].filter(Boolean),R=`const ${m} = createRoute({ getParentRoute: () => ${u}, ${d.join(", ")} })`;o.push(s._module?`${R}.lazy(() =>
${s._module}.then((m) => createLazyRoute('${s._path}')({ ${l.join(", ")} }))
)`:R)}if(!(["pid","path"].includes(a)||a.startsWith("_")))return _}).replace(/"id":"([\w-]+)"/g,"$1").replace(/^\[|\]$|{|}/g,"").replace(/\[/g,"([").replace(/\]/g,"])").replace(/,"children":/g,".addChildren").replace(/\),/g,`),
`);return{content:q.replace("// imports",e.join(`
`)).replace("// modules",o.join(`
`)).replace("// config",j),count:O}},H="",b=async t=>{let n=Date.now(),{content:e,count:o}=await ct();console.log(`${new Date().toLocaleTimeString()} [generouted] ${o} routes in ${Date.now()-n} ms`),H!==e&&(H=e,rt(`./src/${t.output}`,e),t.format&&J(`./src/${t.output}`))};var K={output:"routes.gen.tsx",format:!0};function at(t){let n=f(f({},K),t);return{name:"generouted/tanstack-react-router",enforce:"pre",configureServer(e){let o=(g="")=>g.includes(it.normalize("/src/pages/"))?b(n):null;e.watcher.on("add",o),e.watcher.on("change",o),e.watcher.on("unlink",o)},buildStart(){return b(n)}}}export{at as default};