@resolid/dev 0.6.0 → 0.7.0

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/http.d.mts CHANGED
@@ -1,11 +1,15 @@
1
- import { RouterContextProvider, ServerBuild, UNSAFE_DataWithResponseInit } from "react-router";
1
+ import { RouterContext, RouterContextProvider, RouterContextProvider as RouterContextProvider$1, UNSAFE_DataWithResponseInit } from "react-router";
2
2
  import { Context, Context as Context$1, Env, Env as Env$1, Hono, Hono as Hono$1, MiddlewareHandler } from "hono";
3
3
  import { Http2Bindings, HttpBindings } from "@hono/node-server";
4
4
  import { Context as Context$2 } from "@netlify/types";
5
+ import { MaybePromise } from "@resolid/utils";
5
6
  import { HonoOptions } from "hono/hono-base";
6
7
  import { BlankEnv } from "hono/types";
7
8
  import { AddressInfo } from "node:net";
8
9
 
10
+ //#region src/http/utils/context.d.ts
11
+ declare const honoContext: RouterContext<Context$1>;
12
+ //#endregion
9
13
  //#region src/http/utils/response.d.ts
10
14
  declare function httpProblem<E>(errors: E): UNSAFE_DataWithResponseInit<{
11
15
  errors: E;
@@ -17,13 +21,11 @@ declare function httpRedirect(url: string, cookie?: string | null, status?: numb
17
21
  type NodeEnv = {
18
22
  Bindings: HttpBindings | Http2Bindings;
19
23
  };
24
+ type ConfigureLoadContext<E extends Env$1 = BlankEnv> = (loadContext: RouterContextProvider$1, context: Context$1<E>, mode?: string) => MaybePromise<void>;
20
25
  interface HonoServerOptions<E extends Env$1 = BlankEnv> {
21
26
  configure?: <E extends Env$1 = BlankEnv>(app: Hono$1<E>) => Promise<void> | void;
22
27
  honoOptions?: HonoOptions<E>;
23
- getLoadContext?: (c: Context$1<E>, options: {
24
- build: ServerBuild;
25
- mode?: string;
26
- }) => Promise<RouterContextProvider> | RouterContextProvider;
28
+ configureLoadContext?: ConfigureLoadContext<E>;
27
29
  }
28
30
  //#endregion
29
31
  //#region src/http/platforms/netlify.d.ts
@@ -55,4 +57,4 @@ type HonoNodeServer = Hono$1<NodeEnv>;
55
57
  declare function createHonoNodeServer(options?: HonoNodeServerOptions): Promise<HonoNodeServer>;
56
58
  declare function cacheControl(seconds: number, immutable?: boolean): MiddlewareHandler;
57
59
  //#endregion
58
- export { type Context, type Env, type Hono, HonoNetlifyServer, HonoNetlifyServerOptions, HonoNodeServer, HonoNodeServerOptions, HonoVercelServer, HonoVercelServerOptions, NetlifyEnv, type NodeEnv, cacheControl, createHonoNetlifyServer, createHonoNodeServer, createHonoVercelServer, httpNotFound, httpProblem, httpRedirect };
60
+ export { type Context, type Env, type Hono, HonoNetlifyServer, HonoNetlifyServerOptions, HonoNodeServer, HonoNodeServerOptions, HonoVercelServer, HonoVercelServerOptions, NetlifyEnv, type NodeEnv, type RouterContextProvider, cacheControl, createHonoNetlifyServer, createHonoNodeServer, createHonoVercelServer, honoContext, httpNotFound, httpProblem, httpRedirect };
package/dist/http.mjs CHANGED
@@ -1 +1 @@
1
- import{RouterContextProvider as e,createRequestHandler as t,data as n}from"react-router";import{handle as r}from"hono/netlify";import{env as i}from"node:process";import{requestId as a}from"hono/request-id";import{randomBytes as o}from"node:crypto";import{Hono as s}from"hono";import*as c from"virtual:react-router/server-build";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";function p(e){return n({errors:e},422)}function m(e=`页面未找到`){throw new Response(e,{status:404})}function h(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 g(e){return async(t,n)=>{t.set(`clientIp`,e(t)),await n()}}function _(e=()=>o(16).toString(`hex`)){return a({generator:e})}function v(e){return async(t,n)=>{t.set(`requestOrigin`,e(t)),await n()}}async function y(n,r){let i=import.meta.env.RESOLID_BASENAME,a=new s(r.honoOptions);r.configure&&await r.configure(a);let o=new s({strict:!1});return o.use(async i=>(async i=>{let a=t(c,n),o=r.getLoadContext?.(i,{build:c,mode:n}),s=(o instanceof Promise?await o:o)??new e;return a(i.req.raw,s)})(i)),a.route(i,o),i&&a.route(`${i}.data`,o),a}async function b(e={}){let t=i.NODE_ENV==`test`?`development`:i.NODE_ENV,{configure:n,...a}=e;return r(await y(t,{configure:async e=>{e.use(g(e=>e.env.context.ip),_(e=>e.env.context.requestId),v(e=>e.env.context.site.url)),await n?.(e)},...a}))}async function x(e={}){let t=i.NODE_ENV==`test`?`development`:i.NODE_ENV,{configure:n,...r}=e;return await y(t,{configure:async e=>{e.use(g(e=>e.req.raw.headers.get(`x-real-ip`)??``),_(e=>e.req.raw.headers.get(`x-vercel-id`)??``),v(()=>`https://${i.VERCEL_PROJECT_PRODUCTION_URL}`)),await n?.(e)},...r})}function S(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 C(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 w(e={}){let t=i.NODE_ENV==`test`?`development`:i.NODE_ENV,n=t==`production`,r=import.meta.env.RESOLID_BASENAME,{port:a,defaultLogger:o,proxy:s,proxyCount:c,ipHeaders:p,...m}=e,h={port:a??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}${i.SERVER_PATH??``}${t&&` (http://${t}:${e.port})`}`)},defaultLogger:o??!n,...m},b=null,x=await y(t,{configure:async e=>{if(n){let t=`${import.meta.env.RESOLID_BUILD_DIR}/client`;e.use(`/${import.meta.env.RESOLID_ASSETS_DIR}/*`,T(3600*24*365,!0),u({root:t})),e.use(`*`,T(3600),u({root:t}))}else e.use(`*`,T(3600),u({root:`./public`}));h.defaultLogger&&e.use(`*`,d()),e.use(g(e=>S(e.req.raw,e.env.incoming.socket,{proxy:s,proxyCount:c,ipHeaders:p})),_(),v(e=>C(e.req.raw,e.env.incoming.socket,s))),await h.configure?.(e)},honoOptions:h.honoOptions,getLoadContext:h.getLoadContext});n&&(b=l({fetch:x.fetch,port:h.port},h.listeningListener));async function w(){b?.close(),await h.onShutdown?.(),process.removeListener(`SIGINT`,w),process.removeListener(`SIGTERM`,w),console.log(`[resolid] Node server shutdown.`),process.exit(0)}return process.on(`SIGTERM`,w),process.on(`SIGINT`,w),import.meta.hot&&(process.removeListener(`SIGINT`,w),process.removeListener(`SIGTERM`,w)),x}function T(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{T as cacheControl,b as createHonoNetlifyServer,w as createHonoNodeServer,x as createHonoVercelServer,m as httpNotFound,p as httpProblem,h 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(!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,5 +1,5 @@
1
- import { Config } from "@react-router/dev/config";
2
1
  import { Simplify } from "@resolid/utils";
2
+ import { Config } from "@react-router/dev/config";
3
3
 
4
4
  //#region src/types/index.d.ts
5
5
  type NodeVersion = 22 | 24;
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as defineDevConfig, i as VitePluginOptions, n as DevConfigOptions, r as ReactRouterConfig, t as DevConfig } from "./index-N6xMou5u.mjs";
1
+ import { a as defineDevConfig, i as VitePluginOptions, n as DevConfigOptions, r as ReactRouterConfig, t as DevConfig } from "./index-BVdfUiQm.mjs";
2
2
  export { DevConfig, DevConfigOptions, ReactRouterConfig, VitePluginOptions, defineDevConfig };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
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.6.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{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)}";
2
2
 
3
3
  export const config = {
4
4
  path: ${Array.isArray(s)?JSON.stringify(s):`"${s}"`},
package/dist/vite.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as VitePluginOptions } from "./index-N6xMou5u.mjs";
1
+ import { i as VitePluginOptions } from "./index-BVdfUiQm.mjs";
2
2
  import { Plugin } from "vite";
3
3
 
4
4
  //#region src/vite/index.d.ts
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,environmentBuildContext:s}=n.__reactRouterPluginContext,c=t(a,i.appDirectory);return{entryFile:e(c,r.entryFile),appDir:c,buildDir:t(a,i.buildDirectory),assetsDir:n.build?.assetsDir??`assets`,ssrBuild:s?.name===`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{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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolid/dev",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "description": "Development utils for Resolid applications",
6
6
  "keywords": [
@@ -61,29 +61,26 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@hono/node-server": "^2.0.5",
64
+ "@netlify/types": "^2.8.0",
65
+ "@react-router/dev": "^8.0.1",
64
66
  "@resolid/utils": "^1.6.1",
65
67
  "@vercel/nft": "^1.10.2",
66
68
  "fast-glob": "^3.3.3",
67
- "hono": "^4.12.25",
69
+ "hono": "^4.12.26",
68
70
  "minimatch": "^10.2.5",
69
71
  "rolldown": "^1.1.1"
70
72
  },
71
73
  "devDependencies": {
72
- "@react-router/dev": "^8.0.0",
73
74
  "@types/react": "^19.2.17",
74
75
  "@types/react-dom": "^19.2.3",
75
- "react": "^19.2.7",
76
- "react-dom": "^19.2.7",
77
76
  "tsdown": "^0.22.3"
78
77
  },
79
78
  "peerDependencies": {
80
- "@netlify/types": "^2.8.0",
81
- "@react-router/dev": "^8.0.0",
82
- "@react-router/node": "^8.0.0",
79
+ "@react-router/node": "^8.0.1",
83
80
  "isbot": "^5.1.43",
84
81
  "react": "^19.2.7",
85
82
  "react-dom": "^19.2.7",
86
- "react-router": "^8.0.0",
83
+ "react-router": "^8.0.1",
87
84
  "vite": "^8.0.16"
88
85
  },
89
86
  "engines": {