UNPKG

@generouted/tanstack-react-router

Version:

Generated file-based routes for TanStack React Router and Vite

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