@resolid/dev 0.7.0 → 0.7.2

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/README.md CHANGED
@@ -20,8 +20,6 @@ pnpm add -D @resolid/dev @react-router/dev
20
20
  plugin.
21
21
  - Route helpers (`@resolid/dev/routes`):`flexRoutes`, `relativeFactory`.
22
22
  - Router helpers (`@resolid/dev/router`): `mergeMeta`.
23
- - HTTP server helpers (`@resolid/dev/http.server`):
24
- `requestId`, `clientIp`, `requestOrigin`, `httpProblem`, `httpNotFound`, `httpRedirect`.
25
23
  - HTTP platform adapters (`@resolid/dev/http.server`): `createHonoNodeServer`,
26
24
  `createHonoNetlifyServer`, `createHonoVercelServer`.
27
25
 
package/dist/http.mjs CHANGED
@@ -1 +1 @@
1
- import{RouterContextProvider as e,createContext as t,createRequestHandler as n,data as r}from"react-router";import{handle as i}from"hono/netlify";import{env as a}from"node:process";import{requestId as o}from"hono/request-id";import{randomBytes as s}from"node:crypto";import{Hono as c}from"hono";import{serve as l}from"@hono/node-server";import{serveStatic as u}from"@hono/node-server/serve-static";import{logger as d}from"hono/logger";import{networkInterfaces as f}from"node:os";const p=t();function m(e){return r({errors:e},422)}function h(e=`页面未找到`){throw new Response(e,{status:404})}function g(e,t=null,n=302){let r=new Headers;throw r.set(`Location`,e),t&&r.set(`Set-Cookie`,t),new Response(null,{status:n,headers:r})}function _(e){return async(t,n)=>{t.set(`clientIp`,e(t)),await n()}}function v(e=()=>s(16).toString(`hex`)){return o({generator:e})}function y(e){return async(t,n)=>{t.set(`requestOrigin`,e(t)),await n()}}async function b(t,r){let i=import.meta.env.RESOLID_BASENAME,a=new c(r.honoOptions);r.configure&&await r.configure(a);let o=new c({strict:!1});return o.use(async i=>(async i=>{let a=n(await import(`virtual:react-router/server-build`),t),o=new e;return o.set(p,i),await r.configureLoadContext?.(o,i,t),a(i.req.raw,o)})(i)),a.route(i,o),i&&a.route(`${i}.data`,o),a}async function x(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,{configure:n,...r}=e;return i(await b(t,{configure:async e=>{e.use(_(e=>e.env.context.ip),v(e=>e.env.context.requestId),y(e=>e.env.context.site.url)),await n?.(e)},...r}))}async function S(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,{configure:n,...r}=e;return await b(t,{configure:async e=>{e.use(_(e=>e.req.raw.headers.get(`x-real-ip`)??``),v(e=>e.req.raw.headers.get(`x-vercel-id`)??``),y(()=>`https://${a.VERCEL_PROJECT_PRODUCTION_URL}`)),await n?.(e)},...r})}function C(e,t,n){let{proxy:r=!1,proxyCount:i=0,ipHeaders:a=`x-forwarded-for`}=n??{},o=e.headers.get(a),s=r&&o?o.split(/\s*,\s*/):[];return i>0&&(s=s.slice(-i)),s[0]??t.remoteAddress??``}function w(e,t,n=!1){return`${t.encrypted?`https`:(n?e.headers.get(`x-forwarded-proto`):null)?.split(/\s*,\s*/)[0]??`http`}://${(n?e.headers.get(`x-forwarded-host`):null)?.split(/\s*,\s*/)[0]??e.headers.get(`host`)}`}async function T(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,n=t==`production`,r=import.meta.env.RESOLID_BASENAME,{port:i,defaultLogger:o,proxy:s,proxyCount:c,ipHeaders:p,...m}=e,h={port:i??3e3,listeningListener:e=>{console.log(`🚀 Server started on port ${e.port}`);let t=Object.values(f()).flat().find(e=>String(e?.family).includes(`4`)&&!e?.internal)?.address;console.log(`[resolid] http://localhost:${e.port}${r}${a.SERVER_PATH??``}${t&&` (http://${t}:${e.port})`}`)},defaultLogger:o??!n,...m},g=null,x=await b(t,{configure:async e=>{if(n){let t=`${import.meta.env.RESOLID_BUILD_DIR}/client`;e.use(`/${import.meta.env.RESOLID_ASSETS_DIR}/*`,E(3600*24*365,!0),u({root:t})),e.use(`*`,E(3600),u({root:t}))}else e.use(`*`,E(3600),u({root:`./public`}));h.defaultLogger&&e.use(`*`,d()),e.use(_(e=>C(e.req.raw,e.env.incoming.socket,{proxy:s,proxyCount:c,ipHeaders:p})),v(),y(e=>w(e.req.raw,e.env.incoming.socket,s))),await h.configure?.(e)},honoOptions:h.honoOptions,configureLoadContext:h.configureLoadContext});n&&(g=l({fetch:x.fetch,port:h.port},h.listeningListener));async function S(){g?.close(),await h.onShutdown?.(),process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S),console.log(`[resolid] Node server shutdown.`),process.exit(0)}return process.on(`SIGTERM`,S),process.on(`SIGINT`,S),import.meta.hot&&(process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S)),x}function E(e,t=!1){return async(n,r)=>{if(!n.req.path.match(/\.[a-zA-Z0-9]+$/)||n.req.path.endsWith(`.data`))return r();await r(),n.res.ok&&n.header(`Cache-Control`,`public, max-age=${e}${t?`, immutable`:``}`)}}export{E as cacheControl,x as createHonoNetlifyServer,T as createHonoNodeServer,S as createHonoVercelServer,p as honoContext,h as httpNotFound,m as httpProblem,g as httpRedirect};
1
+ import{RouterContextProvider as e,createContext as t,createRequestHandler as n,data as r}from"react-router";import{handle as i}from"hono/netlify";import{env as a}from"node:process";import{requestId as o}from"hono/request-id";import{randomBytes as s}from"node:crypto";import{Hono as c}from"hono";import{serve as l}from"@hono/node-server";import{serveStatic as u}from"@hono/node-server/serve-static";import{logger as d}from"hono/logger";import{networkInterfaces as f}from"node:os";const p=t();function m(e){return r({errors:e},422)}function h(e=`页面未找到`){throw new Response(e,{status:404})}function g(e,t=null,n=302){let r=new Headers;throw r.set(`Location`,e),t&&r.set(`Set-Cookie`,t),new Response(null,{status:n,headers:r})}function _(e){return async(t,n)=>{t.set(`clientIp`,e(t)),await n()}}function v(e=()=>s(16).toString(`hex`)){return o({generator:e})}function y(e){return async(t,n)=>{t.set(`requestOrigin`,e(t)),await n()}}async function b(t,r){let i=import.meta.env.RESOLID_BASENAME,a=new c(r.honoOptions);r.configure&&await r.configure(a);let o=new c({strict:!1});return o.use(async i=>(async i=>{let a=n(await import(`virtual:react-router/server-build`),t),o=new e;return o.set(p,i),await r.configureLoadContext?.(o,i,t),a(i.req.raw,o)})(i)),a.route(i,o),i&&a.route(`${i}.data`,o),a}async function x(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,{configure:n,...r}=e;return i(await b(t,{configure:async e=>{e.use(_(e=>e.env.context.ip),v(e=>e.env.context.requestId),y(e=>e.env.context.site.url)),await n?.(e)},...r}))}async function S(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,{configure:n,...r}=e;return await b(t,{configure:async e=>{e.use(_(e=>e.req.raw.headers.get(`x-real-ip`)??``),v(e=>e.req.raw.headers.get(`x-vercel-id`)??``),y(()=>`https://${a.VERCEL_PROJECT_PRODUCTION_URL}`)),await n?.(e)},...r})}function C(e,t,n){let{proxy:r=!1,proxyCount:i=0,ipHeaders:a=`x-forwarded-for`}=n??{},o=e.headers.get(a),s=r&&o?o.split(/\s*,\s*/):[];return i>0&&(s=s.slice(-i)),s[0]??t.remoteAddress??``}function w(e,t,n=!1){return`${t.encrypted?`https`:(n?e.headers.get(`x-forwarded-proto`):null)?.split(/\s*,\s*/)[0]??`http`}://${(n?e.headers.get(`x-forwarded-host`):null)?.split(/\s*,\s*/)[0]??e.headers.get(`host`)}`}async function T(e={}){let t=a.NODE_ENV==`test`?`development`:a.NODE_ENV,n=t==`production`,r=import.meta.env.RESOLID_BASENAME,{port:i,defaultLogger:o,proxy:s,proxyCount:c,ipHeaders:p,...m}=e,h={port:i??3e3,listeningListener:e=>{console.log(`🚀 Server started on port ${e.port}`);let t=Object.values(f()).flat().find(e=>String(e?.family).includes(`4`)&&!e?.internal)?.address;console.log(`[resolid] http://localhost:${e.port}${r}${a.SERVER_PATH??``}${t&&` (http://${t}:${e.port})`}`)},defaultLogger:o??!n,...m},g=null,x=await b(t,{configure:async e=>{if(n){let t=`${import.meta.env.RESOLID_BUILD_DIR}/client`;e.use(`/${import.meta.env.RESOLID_ASSETS_DIR}/*`,E(3600*24*365,!0),u({root:t})),e.use(`*`,E(3600),u({root:t}))}else e.use(`*`,E(3600),u({root:`./public`}));h.defaultLogger&&e.use(`*`,d()),e.use(_(e=>C(e.req.raw,e.env.incoming.socket,{proxy:s,proxyCount:c,ipHeaders:p})),v(),y(e=>w(e.req.raw,e.env.incoming.socket,s))),await h.configure?.(e)},honoOptions:h.honoOptions,configureLoadContext:h.configureLoadContext});n&&(g=l({fetch:x.fetch,port:h.port},h.listeningListener));async function S(){g?.close(),await h.onShutdown?.(),process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S),console.log(`[resolid] Node server shutdown.`),process.exit(0)}return process.on(`SIGTERM`,S),process.on(`SIGINT`,S),import.meta.hot&&(process.removeListener(`SIGINT`,S),process.removeListener(`SIGTERM`,S)),x}function E(e,t=!1){return async(n,r)=>{if(!/\.[a-zA-Z0-9]+$/.test(n.req.path)||n.req.path.endsWith(`.data`))return r();await r(),n.res.ok&&n.header(`Cache-Control`,`public, max-age=${e}${t?`, immutable`:``}`)}}export{E as cacheControl,x as createHonoNetlifyServer,T as createHonoNodeServer,S as createHonoVercelServer,p as honoContext,h as httpNotFound,m as httpProblem,g as httpRedirect};
package/dist/index.mjs CHANGED
@@ -1,10 +1,10 @@
1
- import{cp as e,mkdir as t,readFile as n,readdir as r,realpath as i,rm as a,stat as o,symlink as s,writeFile as c}from"node:fs/promises";import{basename as l,dirname as u,join as d,relative as f}from"node:path";import p from"fast-glob";import{existsSync as m}from"node:fs";import{build as h}from"rolldown";import{esmExternalRequirePlugin as g}from"rolldown/plugins";import{searchForWorkspaceRoot as _}from"vite";var v=`@resolid/dev`,y=`0.7.0`;async function b({includeFiles:t=[],nodeVersion:r,serverPlatform:i,buildManifest:o,reactRouterConfig:s,viteConfig:c,buildStart:l,buildBundleEnd:m}){let _=c.root,{assetsDir:v}=c.build,y=JSON.parse(await n(d(_,`package.json`),`utf8`)),b=x(y.dependencies??{},c.ssr.external),C=d(s.buildDirectory,`server`),w=o?.serverBundles??{site:{id:`site`,file:f(_,d(C,s.serverBuildFile))}},T=t.length>0?await p(t,{cwd:_}):[],E=await l();await Promise.all(Object.entries(w).map(async([,t])=>{let n=t.id,o=d(_,t.file),s=u(o);await S(d(s,`package.json`),y,b,r),console.log(`Bundle file for ${n}...`);let c=d(s,`server.mjs`);await h({experimental:{lazyBarrel:!1},input:o,output:{file:c,codeSplitting:!1,minify:`dce-only`,comments:!1},platform:`node`,transform:{define:{"process.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.RESOLID_PLATFORM":JSON.stringify(i)},target:`node${r}`},external:[`vite`,...Object.keys(b)],plugins:[g({external:[`vite`,...Object.keys(b)],skipDuplicateCheck:!0})]}),await a(d(s,v),{force:!0,recursive:!0}),await a(o,{force:!0}),await Promise.all(T.map(t=>e(t,d(C,t),{recursive:!0}))),await m?.(E,s,n,c,b)}))}function x(e,t){let n=Array.isArray(t)?t.filter(e=>![`react-router`,`@react-router/architect`,`@react-router/cloudflare`,`@react-router/dev`,`@react-router/express`,`@react-router/node`,`@react-router/serve`].includes(e)):t;return Object.keys(e).filter(e=>n===void 0?!1:n===!0?!0:n.includes(e)).reduce((t,n)=>(t[n]=e[n]??``,t),{})}async function S(e,t,n,r){let i={name:t.name,type:t.type,version:t.version,scripts:{postinstall:t.scripts?.postinstall??``},dependencies:n,engines:{node:`${r}.x`}};await c(e,JSON.stringify(i,null,2),`utf8`)}async function C(e,n=!1){let r=d(...e);return n&&await a(r,{recursive:!0,force:!0}),await t(r,{recursive:!0}),r}function w(e){if(e?.routeIdToServerBundleId){let t=Object.values(e.routes).filter(e=>e.id!=`root`).map(t=>{let n=[...T(e.routes,t.parentId),t.path].join(`/`);return{id:t.id,path:`/${n}`}}),n={};for(let[r,i]of Object.entries(e.routeIdToServerBundleId)){n[i]??=[];for(let e of t)e.id==r&&n[i].push(e.path)}let r={};for(let[e,t]of Object.entries(n)){t.sort((e,t)=>e.length<t.length?-1:1);for(let n of t)!r[n]&&!Object.keys(r).find(t=>r[t].bundleId==e&&n.startsWith(r[t].path))&&(r[n]={path:n,bundleId:e})}let i=Object.values(r).map(e=>({path:e.path.endsWith(`/`)?e.path.slice(0,-1):e.path,bundleId:e.bundleId}));return i.sort((e,t)=>e.path.length>t.path.length?-1:1),i}return[{path:``,bundleId:`site`}]}function T(e,t){if(t==null)return[];let n=[],r=t=>{let i=e[t];i.parentId&&r(i.parentId),i.path&&n.push(i.path)};return r(t),n}async function E(n,a,c){let p=_(n),{nodeFileTrace:h}=await import(`@vercel/nft`),g=await h([n],{base:p,cache:c}),v=Array.from(g.fileList).map(e=>d(p,e)),y=u(v[0]);for(let e of v.slice(1))for(;!e.startsWith(y);)y=u(y);return await Promise.all(v.map(async c=>{let p=d(a,f(y,c)),h=await i(c),g=h!==c,_=(await o(c)).isDirectory();if(await t(u(p),{recursive:!0}),c==n){let t=u(n),i=u(p);await Promise.all((await r(t)).filter(e=>e!==l(n)).map(n=>e(d(t,n),d(i,n),{recursive:!0})))}g?m(p)||await s(f(u(p),d(a,f(y,h))),p,_?`dir`:`file`):_||await e(c,p)})),f(y,n)}function D({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig(){return{async buildEnd({buildManifest:n,reactRouterConfig:r,viteConfig:i}){await b({nodeVersion:e,serverPlatform:`netlify`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,async buildStart(){let e=await C([i.root,`.netlify`,`v1`],!0);return await O(i.build.assetsDir,d(e,`config.json`)),{netlifyRoot:e,netlifyFunctionDir:await C([e,`functions`]),serverRoutes:w(n),nftCache:{}}},async buildBundleEnd(t,n,r,i){console.log(`Coping Netlify function files for ${r}...`);let a=await E(i,await C([t.netlifyFunctionDir,r],!0),t.nftCache),o=t.serverRoutes.find(e=>e.bundleId==r)?.path,s=o?[o,`${o}/*`]:`/*`;await c(d(t.netlifyFunctionDir,`${r}.mjs`),`export { default } from "./${d(r,a)}";
1
+ import{cp as e,mkdir as t,readFile as n,readdir as r,realpath as i,rm as a,stat as o,symlink as s,writeFile as c}from"node:fs/promises";import l from"node:path";import u from"fast-glob";import{existsSync as d}from"node:fs";import{build as f}from"rolldown";import{esmExternalRequirePlugin as p}from"rolldown/plugins";import{searchForWorkspaceRoot as m}from"vite";var h=`@resolid/dev`,g=`0.7.2`;async function _({includeFiles:t=[],nodeVersion:r,serverPlatform:i,buildManifest:o,reactRouterConfig:s,viteConfig:c,buildStart:d,buildBundleEnd:m}){let h=c.root,{assetsDir:g}=c.build,_=JSON.parse(await n(l.join(h,`package.json`),`utf-8`)),b=v(_.dependencies??{},c.ssr.external),x=l.join(s.buildDirectory,`server`),S=o?.serverBundles??{site:{id:`site`,file:l.relative(h,l.join(x,s.serverBuildFile))}},C=t.length>0?await u(t,{cwd:h}):[],w=await d();await Promise.all(Object.entries(S).map(async([,t])=>{let n=t.id,o=l.join(h,t.file),s=l.dirname(o);await y(l.join(s,`package.json`),_,b,r),console.log(`Bundle file for ${n}...`);let c=l.join(s,`server.mjs`);await f({experimental:{lazyBarrel:!1},input:o,output:{file:c,codeSplitting:!1,minify:`dce-only`,comments:!1},platform:`node`,transform:{define:{"process.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.RESOLID_PLATFORM":JSON.stringify(i)},target:`node${r}`},external:[`vite`,...Object.keys(b)],plugins:[p({external:[`vite`,...Object.keys(b)],skipDuplicateCheck:!0})]}),await a(l.join(s,g),{force:!0,recursive:!0}),await a(o,{force:!0}),await Promise.all(C.map(t=>e(t,l.join(x,t),{recursive:!0}))),await m?.(w,s,n,c,b)}))}function v(e,t){let n=Array.isArray(t)?t.filter(e=>![`react-router`,`@react-router/architect`,`@react-router/cloudflare`,`@react-router/dev`,`@react-router/express`,`@react-router/node`,`@react-router/serve`].includes(e)):t;if(n===void 0)return{};let r={};for(let t of Object.keys(e))(n===!0||n.includes(t))&&(r[t]=e[t]??``);return r}async function y(e,t,n,r){let i={name:t.name,type:t.type,version:t.version,scripts:{postinstall:t.scripts?.postinstall??``},dependencies:n,engines:{node:`${r}.x`}};await c(e,JSON.stringify(i,null,2),`utf-8`)}async function b(e,n=!1){let r=l.join(...e);return n&&await a(r,{recursive:!0,force:!0}),await t(r,{recursive:!0}),r}function x(e){if(e?.routeIdToServerBundleId){let t=Object.values(e.routes).filter(e=>e.id!=`root`).map(t=>{let n=[...S(e.routes,t.parentId),t.path].join(`/`);return{id:t.id,path:`/${n}`}}),n={};for(let[r,i]of Object.entries(e.routeIdToServerBundleId)){n[i]??=[];for(let e of t)e.id==r&&n[i].push(e.path)}let r={};for(let[e,t]of Object.entries(n)){t.sort((e,t)=>e.length<t.length?-1:1);for(let n of t)!r[n]&&!Object.keys(r).some(t=>r[t].bundleId==e&&n.startsWith(r[t].path))&&(r[n]={path:n,bundleId:e})}let i=Object.values(r).map(e=>({path:e.path.endsWith(`/`)?e.path.slice(0,-1):e.path,bundleId:e.bundleId}));return i.sort((e,t)=>e.path.length>t.path.length?-1:1),i}return[{path:``,bundleId:`site`}]}function S(e,t){if(t==null)return[];let n=[],r=t=>{let i=e[t];i.parentId&&r(i.parentId),i.path&&n.push(i.path)};return r(t),n}async function C(n,a,c){let u=m(n),{nodeFileTrace:f}=await import(`@vercel/nft`),p=[...(await f([n],{base:u,cache:c})).fileList].map(e=>l.join(u,e)),h=l.dirname(p[0]);for(let e of p.slice(1))for(;!e.startsWith(h);)h=l.dirname(h);return await Promise.all(p.map(async c=>{let u=l.join(a,l.relative(h,c)),f=await i(c),p=f!==c,m=(await o(c)).isDirectory();if(await t(l.dirname(u),{recursive:!0}),c==n){let t=l.basename(n),i=l.dirname(n),a=l.dirname(u),o=await r(i),s=[];for(let n of o)n!==t&&s.push(e(l.join(i,n),l.join(a,n),{recursive:!0}));await Promise.all(s)}p?d(u)||await s(l.relative(l.dirname(u),l.join(a,l.relative(h,f))),u,m?`dir`:`file`):m||await e(c,u)})),l.relative(h,n)}function w({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig(){return{async buildEnd({buildManifest:n,reactRouterConfig:r,viteConfig:i}){await _({nodeVersion:e,serverPlatform:`netlify`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,async buildStart(){let e=await b([i.root,`.netlify`,`v1`],!0);return await T(i.build.assetsDir,l.join(e,`config.json`)),{netlifyRoot:e,netlifyFunctionDir:await b([e,`functions`]),serverRoutes:x(n),nftCache:{}}},async buildBundleEnd(t,n,r,i){console.log(`Coping Netlify function files for ${r}...`);let a=await C(i,await b([t.netlifyFunctionDir,r],!0),t.nftCache),o=t.serverRoutes.find(e=>e.bundleId==r)?.path,s=o?[o,`${o}/*`]:`/*`;await c(l.join(t.netlifyFunctionDir,`${r}.mjs`),`export { default } from "./${l.join(r,a)}";
2
2
 
3
3
  export const config = {
4
4
  path: ${Array.isArray(s)?JSON.stringify(s):`"${s}"`},
5
5
  displayName: "${r} server",
6
- generator: "${v}@${y}",
6
+ generator: "${h}@${g}",
7
7
  preferStatic: true,
8
8
  nodeVersion: ${e}
9
9
  };
10
- `,`utf8`)}})}}}}}async function O(e,t){console.log(`Writing Netlify config file...`);let n={headers:[]};n.headers.push({for:`^/${e}/.*`,values:{"Cache-Control":`public, max-age=31536000, immutable`}}),await c(t,JSON.stringify(n,null,2),`utf8`)}function k({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-node-preset`,reactRouterConfig(){return{async buildEnd({buildManifest:n,reactRouterConfig:r,viteConfig:i}){await b({nodeVersion:e,serverPlatform:`node`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,buildStart(){console.log(`Bundle Node Server for production...`)}})}}}}}function A({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-vercel-preset`,reactRouterConfig(){return{buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await b({nodeVersion:e,serverPlatform:`vercel`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,async buildStart(){let e=await C([i.root,`.vercel`,`output`],!0);return await j(d(r.buildDirectory,`client`),e),await M(i.build.assetsDir,n,d(e,`config.json`)),{vercelOutput:e,nftCache:{}}},async buildBundleEnd(t,n,r,i){console.log(`Coping Vercel function files for ${r}...`);let a=await C([t.vercelOutput,`functions`,`_${r}.func`],!0),o=await E(i,a,t.nftCache);await c(d(a,`.vc-config.json`),JSON.stringify({handler:o,runtime:`nodejs${e}.x`,launcherType:`Nodejs`,supportsResponseStreaming:!0},null,2),`utf8`)}})}}}}}async function j(t,n){console.log(`Copying assets...`);let r=await C([n,`static`]);await e(t,r,{recursive:!0,force:!0}),await a(d(r,`.vite`),{recursive:!0,force:!0})}async function M(e,t,n){console.log(`Writing Vercel config file...`);let r={version:3,routes:[],framework:{slug:`vite`}};r.routes.push({src:`^/${e}/.*`,headers:{"Cache-Control":`public, max-age=31536000, immutable`},continue:!0}),r.routes.push({handle:`filesystem`});let i=w(t);for(let e of i)e.path.length>0?r.routes.push({src:`^${e.path}(?:/.*)?$`,dest:`_${e.bundleId}`}):r.routes.push({src:`^/.*$`,dest:`_${e.bundleId}`});await c(n,JSON.stringify(r,null,2),`utf8`)}const N=({platform:e=`node`,nodeVersion:t=24,entryFile:n=`server.ts`,appDirectory:r=`src`,includeFiles:i=[],reactRouterConfig:a={},devExclude:o})=>{let s=(e==`netlify`?D:e==`vercel`?A:k)({nodeVersion:t,includeFiles:i}),{future:c,presets:l,...u}=a;return{vitePluginOptions:{platform:e,nodeVersion:t,entryFile:n,devExclude:o},reactRouterConfig:{...u,appDirectory:r,ssr:!0,serverModuleFormat:`esm`,presets:l?[...l,s]:[s],future:c}}};export{N as defineDevConfig};
10
+ `,`utf-8`)}})}}}}}async function T(e,t){console.log(`Writing Netlify config file...`);let n={headers:[]};n.headers.push({for:`^/${e}/.*`,values:{"Cache-Control":`public, max-age=31536000, immutable`}}),await c(t,JSON.stringify(n,null,2),`utf-8`)}function E({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-node-preset`,reactRouterConfig(){return{async buildEnd({buildManifest:n,reactRouterConfig:r,viteConfig:i}){await _({nodeVersion:e,serverPlatform:`node`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,buildStart(){console.log(`Bundle Node Server for production...`)}})}}}}}function D({nodeVersion:e,includeFiles:t}){return{name:`@resolid/react-router-hono-vercel-preset`,reactRouterConfig(){return{buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await _({nodeVersion:e,serverPlatform:`vercel`,includeFiles:t,buildManifest:n,reactRouterConfig:r,viteConfig:i,async buildStart(){let e=await b([i.root,`.vercel`,`output`],!0);return await O(l.join(r.buildDirectory,`client`),e),await k(i.build.assetsDir,n,l.join(e,`config.json`)),{vercelOutput:e,nftCache:{}}},async buildBundleEnd(t,n,r,i){console.log(`Coping Vercel function files for ${r}...`);let a=await b([t.vercelOutput,`functions`,`_${r}.func`],!0),o=await C(i,a,t.nftCache);await c(l.join(a,`.vc-config.json`),JSON.stringify({handler:o,runtime:`nodejs${e}.x`,launcherType:`Nodejs`,supportsResponseStreaming:!0},null,2),`utf-8`)}})}}}}}async function O(t,n){console.log(`Copying assets...`);let r=await b([n,`static`]);await e(t,r,{recursive:!0,force:!0}),await a(l.join(r,`.vite`),{recursive:!0,force:!0})}async function k(e,t,n){console.log(`Writing Vercel config file...`);let r={version:3,routes:[],framework:{slug:`vite`}};r.routes.push({src:`^/${e}/.*`,headers:{"Cache-Control":`public, max-age=31536000, immutable`},continue:!0},{handle:`filesystem`});let i=x(t);for(let e of i)e.path.length>0?r.routes.push({src:`^${e.path}(?:/.*)?$`,dest:`_${e.bundleId}`}):r.routes.push({src:`^/.*$`,dest:`_${e.bundleId}`});await c(n,JSON.stringify(r,null,2),`utf-8`)}const A=({platform:e=`node`,nodeVersion:t=24,entryFile:n=`server.ts`,appDirectory:r=`src`,includeFiles:i=[],reactRouterConfig:a={},devExclude:o})=>{let s=(e==`netlify`?w:e==`vercel`?D:E)({nodeVersion:t,includeFiles:i}),{future:c,presets:l,...u}=a;return{vitePluginOptions:{platform:e,nodeVersion:t,entryFile:n,devExclude:o},reactRouterConfig:{...u,appDirectory:r,ssr:!0,serverModuleFormat:`esm`,presets:l?[...l,s]:[s],future:c}}};export{A as defineDevConfig};
package/dist/router.mjs CHANGED
@@ -1 +1 @@
1
- import{Link as e,NavLink as t,useLocation as n,useNavigate as r,useNavigation as i}from"react-router";import{jsx as a}from"react/jsx-runtime";import{useEffect as o,useRef as s,useState as c}from"react";function l(e,t=` - `){return n=>{let r=e(n),i=n.matches.reduceRight((e,t)=>{for(let n of t.meta)e.findIndex(e=>`name`in e&&`name`in n?e.name===n.name:`property`in e&&`property`in n?e.property===n.property:`title`in e&&`title`in n?e.title===n.title:!1)==-1&&e.push(n);return e},r),a=[],o=[];for(let e of i)`title`in e?typeof e.title==`string`&&e.title.length>0&&a.push(...e.title.split(t)):o.push(e);return o.unshift({title:[...new Set(a)].join(t)}),o}}function u(t){let{state:n,to:r,...i}=t;return a(e,{to:r,state:{...n,previous:!0},...i})}function d(e){let{state:n,to:r,...i}=e;return a(t,{to:r,state:{...n,previous:!0},...i})}function f(e=`/`){let t=r(),{state:i}=n();return async()=>{await(i?.previous?t(-1):t(e))}}function p(){let e=i(),t=e.state!==`idle`,n=s(null),[r,a]=c(!1);return o(()=>{if(!n.current)return;Promise.allSettled(n.current.getAnimations().map(({finished:e})=>e)).then(()=>{t||a(!1)});let e=t?setTimeout(()=>a(!0),100):null;return()=>{e&&clearTimeout(e)}},[t]),{ref:n,active:t,animating:r,state:e.state}}export{u as HistoryLink,d as HistoryNavLink,l as mergeMeta,f as useHistoryBack,p as useRouteProgress};
1
+ import{Link as e,NavLink as t,useLocation as n,useNavigate as r,useNavigation as i}from"react-router";import{jsx as a}from"react/jsx-runtime";import{useEffect as o,useRef as s,useState as c}from"react";function l(e,t=` - `){return n=>{let r=[...e(n)];for(let e=n.matches.length-1;e>=0;e--){let t=n.matches[e];for(let e of t.meta)r.findIndex(t=>`name`in t&&`name`in e?t.name===e.name:`property`in t&&`property`in e?t.property===e.property:`title`in t&&`title`in e?t.title===e.title:!1)===-1&&r.push(e)}let i=[],a=[];for(let e of r)`title`in e?typeof e.title==`string`&&e.title.length>0&&i.push(...e.title.split(t)):a.push(e);return a.unshift({title:[...new Set(i)].join(t)}),a}}function u(t){let{state:n,to:r,...i}=t;return a(e,{to:r,state:{...n,previous:!0},...i})}function d(e){let{state:n,to:r,...i}=e;return a(t,{to:r,state:{...n,previous:!0},...i})}function f(e=`/`){let t=r(),{state:i}=n();return async()=>{await(i?.previous?t(-1):t(e))}}function p(){let e=i(),t=e.state!==`idle`,n=s(null),[r,a]=c(!1);return o(()=>{if(!n.current)return;Promise.allSettled(n.current.getAnimations().map(({finished:e})=>e)).then(()=>{t||a(!1)});let e=t?setTimeout(()=>a(!0),100):null;return()=>{e&&clearTimeout(e)}},[t]),{ref:n,active:t,animating:r,state:e.state}}export{u as HistoryLink,d as HistoryNavLink,l as mergeMeta,f as useHistoryBack,p as useRouteProgress};
package/dist/routes.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import{readdir as e}from"node:fs/promises";import{extname as t,join as n,relative as r,resolve as i,win32 as a}from"node:path";import{getAppDirectory as o,index as s,layout as c,route as l}from"@react-router/dev/routes";import{makeRe as u}from"minimatch";function d(e){let t=o();return{route:(n,a,...o)=>l(n,r(t,i(e,a)),...o),index:(n,...a)=>s(r(t,i(e,n)),...a),layout:(n,...a)=>c(r(t,i(e,n)),...a)}}async function f(t,i,a=t){let o=await e(t,{withFileTypes:!0,encoding:`utf8`});await Promise.all(o.map(async e=>{let o=n(t,e.name);if(e.isDirectory())return f(o,i,a);e.isFile()&&i(r(a,o))}))}function p(e,t=`root`){let n={};for(let[t,r]of Object.entries(e))n[t]={id:r.id,file:r.file,path:r.path,index:r.index,caseSensitive:r.caseSensitive};let r=[];for(let[,i]of Object.entries(n)){let{parentId:a}=e[i.id];if(a===t)r.push(i);else{let e=a&&n[a];e&&(e.children??=[],e.children.push(i))}}return r}function m(e,r){let i={},a=new Map,o=new Map;for(let i of r){let r=y(n(e,i)),s=r.slice(0,-t(r).length),c=s.slice(-7)==`_layout`?s.slice(0,-8):s,l=a.get(c);if(l){let e=o.get(c)??[l];e.push(r),o.set(c,e);continue}a.set(c,r)}let s=new v,c=Array.from(a).sort(([e],[t])=>t.length-e.length);for(let[t,n]of c){let[r,a]=h(t.slice(e.length+1)),o=t.slice(-6)==`_index`;i[t]={file:n,id:t,path:g(r,a,o)},o&&(i[t].index=!0);let c=s.findAndRemove(t,e=>[`.`,`/`].includes(e.slice(t.length).charAt(0)));if(s.add(t),c.length>0)for(let e of c)i[e].parentId=t}let l=new Map;for(let[e]of c){let t=i[e];if(!t.parentId)continue;let n=l.get(t.parentId)??[];n.push(t),l.set(t.parentId,n)}let u=new Map,d=new Map;for(let[t]of c){let n=i[t],r=n.path??``,a=n.parentId?i[n.parentId]:null,o=n.path;a?.path&&o&&(o=o.slice(a.path.length).replace(/^\//,``).replace(/\/$/,``)),n.parentId??=`root`,n.path=o?.length==0?void 0:o;let s=n.id.replace(RegExp(`^${e}/`),``).split(/[./]/).pop();if(s?.[0]==`_`&&s!==`_index`)continue;let c=r+(n.index?`?index`:``),l=u.get(c);if(u.set(c,n),l&&(r||n.index)){let e=d.get(r);e??=[l],e.push(n),d.set(r,e)}}if(o.size>0)for(let[e,t]of o.entries()){let[n,...r]=t,i=r.map(e=>`⭕ ${e}`).join(`
2
- `);console.error(`!Route ID 冲突: "${e}"\n\n下列路由都定义了相同的路由 ID,但只有第一个会生效\n\n🟢 ${n}\n${i}\n`)}if(d.size>0)for(let[e,t]of d.entries()){for(let e=1;e<t.length;e++)delete i[t[e].id];let[n,...r]=t.map(e=>e.file),a=e[0]==`/`?e:`/${e}`,o=r.map(e=>`⭕ ${e}`).join(`
3
- `);console.error(`! Route 路径冲突: "${a}"\n\n下列路由都定义了相同的 URL,但只有第一个会生效\n\n🟢 ${n}\n${o}\n`)}return i}function h(e){let t=[],n=[],r=0,i=``,a=``,o=`NORMAL`,s=(e,r)=>{if(e){if(r.includes(`*`)||r.includes(`:`)||r.includes(`?`))throw Error("路由文件或目录中不能存在 `*` `:` `?` 特殊字符");t.push(e),n.push(r)}};for(;r<e.length;){let t=e[r];switch(r++,o){case`NORMAL`:if(t&&[`.`,`/`].includes(t)){s(i,a),i=``,a=``,o=`NORMAL`;break}if(t===`[`){o=`ESCAPE`,a+=t;break}if(t===`(`){o=`OPTIONAL`,a+=t;break}if(!i&&t==`$`){r===e.length?(i+=`*`,a+=t):(i+=`:`,a+=t);break}i+=t,a+=t;break;case`ESCAPE`:if(t===`]`){o=`NORMAL`,a+=t;break}i+=t,a+=t;break;case`OPTIONAL`:if(t===`)`){i+=`?`,a+=t,o=`NORMAL`;break}if(t===`[`){o=`OPTIONAL_ESCAPE`,a+=t;break}if(!i&&t===`$`){r===e.length?(i+=`*`,a+=t):(i+=`:`,a+=t);break}i+=t,a+=t;break;case`OPTIONAL_ESCAPE`:if(t===`]`){o=`OPTIONAL`,a+=t;break}i+=t,a+=t;break}}return s(i,a),[t,n]}function g(e,t,n){let r=[],i=n?e.slice(0,-1):e;for(let e=0;e<i.length;e++){let n=t[e],a=i[e];a.startsWith(`_`)&&n.startsWith(`_`)||(a.endsWith(`_`)&&n.endsWith(`_`)&&(a=a.slice(0,-1)),r.push(a))}return r.length?r.join(`/`):void 0}const _=Symbol(`PrefixLookupTrieEndSymbol`);var v=class{root={[_]:!1};add(e){if(!e)throw Error(`Cannot add empty string to PrefixLookupTrie`);let t=this.root;for(let n of e)t[n]??={[_]:!1},t=t[n];t[_]=!0}findAndRemove(e,t){let n=this.root;for(let t of e){if(!n[t])return[];n=n[t]}return this.#e([],n,e,t)}#e(e,t,n,r){for(let i of Object.keys(t))this.#e(e,t[i],n+i,r);return t[_]&&r(n)&&(t[_]=!1,e.push(n)),e}};function y(e){return e.split(a.sep).join(`/`)}const b=[`.js`,`.jsx`,`.ts`,`.tsx`,`.md`,`.mdx`];async function x(e={}){let{routesDirectory:r=`routes`,ignoredRouteFiles:i=[]}=e,a=o(),s=i.map(e=>u(e)).filter(e=>!!e),c=[];return await f(n(a,r),e=>{s.some(t=>t.test(e))||b.includes(t(e))&&c.push(e)}),p(m(r,c))}export{x as flexRoutes,d as relativeFactory};
1
+ import{readdir as e}from"node:fs/promises";import t from"node:path";import{getAppDirectory as n,index as r,layout as i,route as a}from"@react-router/dev/routes";import{makeRe as o}from"minimatch";function s(e){let o=n();return{route:(n,r,...i)=>a(n,t.relative(o,t.resolve(e,r)),...i),index:(n,...i)=>r(t.relative(o,t.resolve(e,n)),...i),layout:(n,...r)=>i(t.relative(o,t.resolve(e,n)),...r)}}async function c(n,r,i=n){let a=await e(n,{withFileTypes:!0,encoding:`utf-8`});await Promise.all(a.map(async e=>{let a=t.join(n,e.name);if(e.isDirectory())return c(a,r,i);e.isFile()&&r(t.relative(i,a))}))}function l(e,t=`root`){let n={};for(let[t,r]of Object.entries(e))n[t]={id:r.id,file:r.file,path:r.path,index:r.index,caseSensitive:r.caseSensitive};let r=[];for(let[,i]of Object.entries(n)){let{parentId:a}=e[i.id];if(a===t)r.push(i);else{let e=a&&n[a];e&&(e.children??=[],e.children.push(i))}}return r}function u(e,n){let r={},i=new Map,a=new Map;for(let r of n){let n=h(t.join(e,r)),o=n.slice(0,-t.extname(n).length),s=o.slice(-7)==`_layout`?o.slice(0,-8):o,c=i.get(s);if(c){let e=a.get(s)??[c];e.push(n),a.set(s,e);continue}i.set(s,n)}let o=new m,s=[...i].sort(([e],[t])=>t.length-e.length);for(let[t,n]of s){let[i,a]=d(t.slice(e.length+1)),s=t.slice(-6)==`_index`;r[t]={file:n,id:t,path:f(i,a,s)},s&&(r[t].index=!0);let c=o.findAndRemove(t,e=>[`.`,`/`].includes(e.slice(t.length).charAt(0)));if(o.add(t),c.length>0)for(let e of c)r[e].parentId=t}let c=new Map;for(let[e]of s){let t=r[e];if(!t.parentId)continue;let n=c.get(t.parentId)??[];n.push(t),c.set(t.parentId,n)}let l=new Map,u=new Map;for(let[t]of s){let n=r[t],i=n.path??``,a=n.parentId?r[n.parentId]:null,o=n.path;a?.path&&o&&(o=o.slice(a.path.length).replace(/^\//,``).replace(/\/$/,``)),n.parentId??=`root`,n.path=o?.length==0?void 0:o;let s=n.id.replace(RegExp(`^${e}/`),``).split(/[./]/).pop();if(s?.[0]==`_`&&s!==`_index`)continue;let c=i+(n.index?`?index`:``),d=l.get(c);if(l.set(c,n),d&&(i||n.index)){let e=u.get(i);e??=[d],e.push(n),u.set(i,e)}}if(a.size>0)for(let[e,t]of a.entries()){let[n,...r]=t,i=r.map(e=>`⭕ ${e}`).join(`
2
+ `);console.error(`!Route ID 冲突: "${e}"\n\n下列路由都定义了相同的路由 ID,但只有第一个会生效\n\n🟢 ${n}\n${i}\n`)}if(u.size>0)for(let[e,t]of u.entries()){for(let e=1;e<t.length;e++)delete r[t[e].id];let[n,...i]=t.map(e=>e.file),a=e[0]==`/`?e:`/${e}`,o=i.map(e=>`⭕ ${e}`).join(`
3
+ `);console.error(`! Route 路径冲突: "${a}"\n\n下列路由都定义了相同的 URL,但只有第一个会生效\n\n🟢 ${n}\n${o}\n`)}return r}function d(e){let t=[],n=[],r=0,i=``,a=``,o=`NORMAL`,s=(e,r)=>{if(e){if(r.includes(`*`)||r.includes(`:`)||r.includes(`?`))throw Error("路由文件或目录中不能存在 `*` `:` `?` 特殊字符");t.push(e),n.push(r)}};for(;r<e.length;){let t=e[r];switch(r++,o){case`NORMAL`:if(t&&[`.`,`/`].includes(t)){s(i,a),i=``,a=``,o=`NORMAL`;break}if(t===`[`){o=`ESCAPE`,a+=t;break}if(t===`(`){o=`OPTIONAL`,a+=t;break}if(!i&&t==`$`){r===e.length?(i+=`*`,a+=t):(i+=`:`,a+=t);break}i+=t,a+=t;break;case`ESCAPE`:if(t===`]`){o=`NORMAL`,a+=t;break}i+=t,a+=t;break;case`OPTIONAL`:if(t===`)`){i+=`?`,a+=t,o=`NORMAL`;break}if(t===`[`){o=`OPTIONAL_ESCAPE`,a+=t;break}if(!i&&t===`$`){r===e.length?(i+=`*`,a+=t):(i+=`:`,a+=t);break}i+=t,a+=t;break;case`OPTIONAL_ESCAPE`:if(t===`]`){o=`OPTIONAL`,a+=t;break}i+=t,a+=t;break}}return s(i,a),[t,n]}function f(e,t,n){let r=[],i=n?e.slice(0,-1):e;for(let e=0;e<i.length;e++){let n=t[e],a=i[e];a.startsWith(`_`)&&n.startsWith(`_`)||(a.endsWith(`_`)&&n.endsWith(`_`)&&(a=a.slice(0,-1)),r.push(a))}return r.length?r.join(`/`):void 0}const p=Symbol(`PrefixLookupTrieEndSymbol`);var m=class{root={[p]:!1};add(e){if(!e)throw Error(`Cannot add empty string to PrefixLookupTrie`);let t=this.root;for(let n of e)t[n]??={[p]:!1},t=t[n];t[p]=!0}findAndRemove(e,t){let n=this.root;for(let t of e){if(!n[t])return[];n=n[t]}return this.#e([],n,e,t)}#e(e,t,n,r){for(let i of Object.keys(t))this.#e(e,t[i],n+i,r);return t[p]&&r(n)&&(t[p]=!1,e.push(n)),e}};function h(e){return e.split(t.win32.sep).join(`/`)}const g=new Set([`.js`,`.jsx`,`.ts`,`.tsx`,`.md`,`.mdx`]);async function _(e={}){let{routesDirectory:r=`routes`,ignoredRouteFiles:i=[]}=e,a=n(),s=i.map(e=>o(e)).filter(e=>!!e),d=[];return await c(t.join(a,r),e=>{s.some(t=>t.test(e))||g.has(t.extname(e))&&d.push(e)}),l(u(r,d))}export{_ as flexRoutes,s as relativeFactory};
package/dist/vite.mjs CHANGED
@@ -1 +1 @@
1
- import{join as e,relative as t}from"node:path";import{existsSync as n,statSync as r}from"node:fs";import{normalizePath as i}from"vite";import{getRequestListener as a}from"@hono/node-server";import{makeRe as o}from"minimatch";import{reactRouter as s}from"@react-router/dev/vite";function c(n,r){if(!(`__reactRouterPluginContext`in n))return;let{reactRouterConfig:i,rootDirectory:a,buildManifest:o}=n.__reactRouterPluginContext,s=t(a,i.appDirectory);return{entryFile:e(s,r.entryFile),appDir:s,buildDir:t(a,i.buildDirectory),assetsDir:n.build?.assetsDir??`assets`,ssrBuild:i.ssr,basename:i.basename,future:i.future,buildManifest:o}}function l(e,t){let n=i(e),[r]=n.split(`/`),a=[RegExp(`^(?=\\/${n}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`),RegExp(`^(?=\\/${n}\\/.*\\/\\..*\\/.*)`)];if(n!=r&&(a.push(RegExp(`^(?=\\/${r}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`)),a.push(RegExp(`^(?=\\/${r}\\/.*\\/\\..*\\/.*)`))),t)for(let e of t)if(e instanceof RegExp)a.push(e);else try{a.push(o(e))}catch{}return a}function u(e,t){if(e.includes(`/node_modules/`)||e.startsWith(`/@`)||e.includes(`?import`))return!0;for(let n of t)if(n.test(e))return!0;return!1}function d(t){let i=``,o;return{name:`@resolid/vite-dev-plugin`,enforce:`post`,config(e){if(o=c(e,t),!o)return;let n={define:{"import.meta.env.RESOLID_PLATFORM":JSON.stringify(t.platform),"import.meta.env.RESOLID_BASENAME":JSON.stringify(o.basename),"import.meta.env.RESOLID_BUILD_DIR":JSON.stringify(o.buildDir),"import.meta.env.RESOLID_ASSETS_DIR":JSON.stringify(o.assetsDir)},ssr:{noExternal:[`@resolid/dev`]},optimizeDeps:{exclude:[`@resolid/dev/http.server`]}};if(!o.ssrBuild)return n;let r={build:{target:`node${t.nodeVersion}`,rolldownOptions:{input:o.entryFile,output:{codeSplitting:!1},onwarn(e,t){e.code===`UNUSED_EXTERNAL_IMPORT`&&e.message.includes(`react`)||t(e)}}}};return{...n,environments:{ssr:r}}},configResolved(e){if(i=e.publicDir,o?.buildManifest?.serverBundles)for(let t of Object.keys(o.buildManifest.serverBundles))e.environments[`ssrBundle_${t}`]&&(e.environments[`ssrBundle_${t}`].build.rolldownOptions.input=o.entryFile)},async configureServer(s){if(!o)return;let c=l(o.appDir,t.devExclude);s.middlewares.use(await(async t=>async(s,l,d)=>{if(s.url){let t=e(i,s.url);try{if(n(t)&&r(t).isFile())return d()}catch{}}if(s.url&&u(s.url,c))return d();let f=o.entryFile,p=(await t.environments.ssr.runner.import(f)).default;if(!p)return d(Error(`Failed to find default export from ${f}`));await a(async e=>{let t=await p.fetch(e,{incoming:s,outgoing:l});if(!(t instanceof Response))throw t;return t},{overrideGlobalObjects:!1,errorHandler:e=>{let n;e instanceof Error?(n=e,t.ssrFixStacktrace(n)):n=Error(typeof e==`string`?`The response is not an instance of "Response", but: ${e}`:`Unknown error: ${String(e)}`),d(n)}})(s,l)})(s))},handleHotUpdate({server:e,modules:t}){if(t.some(e=>e._ssrModule))return e.hot.send({type:`full-reload`}),[]}}}function f(e){return[d(e),...s()]}export{f as resolidVite};
1
+ import e from"node:path";import{existsSync as t,statSync as n}from"node:fs";import{normalizePath as r}from"vite";import{getRequestListener as i}from"@hono/node-server";import{makeRe as a}from"minimatch";import{reactRouter as o}from"@react-router/dev/vite";function s(t,n){if(!(`__reactRouterPluginContext`in t))return;let{reactRouterConfig:r,rootDirectory:i,buildManifest:a}=t.__reactRouterPluginContext,o=e.relative(i,r.appDirectory);return{entryFile:e.join(o,n.entryFile),appDir:o,buildDir:e.relative(i,r.buildDirectory),assetsDir:t.build?.assetsDir??`assets`,ssrBuild:r.ssr,basename:r.basename,future:r.future,buildManifest:a}}function c(e,t){let n=r(e),[i]=n.split(`/`),o=[RegExp(`^(?=\\/${n}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`),RegExp(`^(?=\\/${n}\\/.*\\/\\..*\\/.*)`)];if(n!=i&&o.push(RegExp(`^(?=\\/${i}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`),RegExp(`^(?=\\/${i}\\/.*\\/\\..*\\/.*)`)),t)for(let e of t)if(e instanceof RegExp)o.push(e);else try{o.push(a(e))}catch{}return o}function l(e,t){if(e.includes(`/node_modules/`)||e.startsWith(`/@`)||e.includes(`?import`))return!0;for(let n of t)if(n.test(e))return!0;return!1}function u(r){let a=``,o;return{name:`@resolid/vite-dev-plugin`,enforce:`post`,config(e){if(o=s(e,r),!o)return;let t={define:{"import.meta.env.RESOLID_PLATFORM":JSON.stringify(r.platform),"import.meta.env.RESOLID_BASENAME":JSON.stringify(o.basename),"import.meta.env.RESOLID_BUILD_DIR":JSON.stringify(o.buildDir),"import.meta.env.RESOLID_ASSETS_DIR":JSON.stringify(o.assetsDir)},ssr:{noExternal:[`@resolid/dev`]},optimizeDeps:{exclude:[`@resolid/dev/http.server`]}};if(!o.ssrBuild)return t;let n={build:{target:`node${r.nodeVersion}`,rolldownOptions:{input:o.entryFile,output:{codeSplitting:!1},onwarn(e,t){e.code===`UNUSED_EXTERNAL_IMPORT`&&e.message.includes(`react`)||t(e)}}}};return{...t,environments:{ssr:n}}},configResolved(e){if(a=e.publicDir,o?.buildManifest?.serverBundles)for(let t of Object.keys(o.buildManifest.serverBundles))e.environments[`ssrBundle_${t}`]&&(e.environments[`ssrBundle_${t}`].build.rolldownOptions.input=o.entryFile)},async configureServer(s){if(!o)return;let u=c(o.appDir,r.devExclude);s.middlewares.use(await(async r=>async(s,c,d)=>{if(s.url){let r=e.join(a,s.url);try{if(t(r)&&n(r).isFile())return d()}catch{}}if(s.url&&l(s.url,u))return d();let f=o.entryFile,{default:p}=await r.environments.ssr.runner.import(f);if(!p)return d(Error(`Failed to find default export from ${f}`));await i(async e=>{let t=await p.fetch(e,{incoming:s,outgoing:c});if(!(t instanceof Response))throw t;return t},{overrideGlobalObjects:!1,errorHandler:e=>{let t;e instanceof Error?(t=e,r.ssrFixStacktrace(t)):t=Error(typeof e==`string`?`The response is not an instance of "Response", but: ${e}`:`Unknown error: ${String(e)}`),d(t)}})(s,c)})(s))},handleHotUpdate({server:e,modules:t}){if(t.some(e=>e._ssrModule))return e.hot.send({type:`full-reload`}),[]}}}function d(e){return[u(e),...o()]}export{d as resolidVite};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolid/dev",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "private": false,
5
5
  "description": "Development utils for Resolid applications",
6
6
  "keywords": [
@@ -60,15 +60,15 @@
60
60
  "provenance": true
61
61
  },
62
62
  "dependencies": {
63
- "@hono/node-server": "^2.0.5",
63
+ "@hono/node-server": "^2.0.8",
64
64
  "@netlify/types": "^2.8.0",
65
- "@react-router/dev": "^8.0.1",
66
- "@resolid/utils": "^1.6.1",
65
+ "@react-router/dev": "^8.1.0",
66
+ "@resolid/utils": "^1.6.3",
67
67
  "@vercel/nft": "^1.10.2",
68
68
  "fast-glob": "^3.3.3",
69
- "hono": "^4.12.26",
69
+ "hono": "^4.12.28",
70
70
  "minimatch": "^10.2.5",
71
- "rolldown": "^1.1.1"
71
+ "rolldown": "^1.1.4"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@types/react": "^19.2.17",
@@ -76,12 +76,12 @@
76
76
  "tsdown": "^0.22.3"
77
77
  },
78
78
  "peerDependencies": {
79
- "@react-router/node": "^8.0.1",
80
- "isbot": "^5.1.43",
79
+ "@react-router/node": "^8.1.0",
80
+ "isbot": "^5.2.0",
81
81
  "react": "^19.2.7",
82
82
  "react-dom": "^19.2.7",
83
- "react-router": "^8.0.1",
84
- "vite": "^8.0.16"
83
+ "react-router": "^8.1.0",
84
+ "vite": "^8.1.3"
85
85
  },
86
86
  "engines": {
87
87
  "node": "^22.22.0 || >=24"