@resolid/dev 0.3.0 → 0.3.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
@@ -18,13 +18,12 @@ pnpm add -D @resolid/dev @react-router/dev
18
18
  - `defineDevConfig` (`@resolid/dev`): generate unified `vitePluginOptions` and `reactRouterConfig`.
19
19
  - `resolidVite` (`@resolid/dev/vite`): combine Resolid plugin behavior with React Router Vite
20
20
  plugin.
21
- - Route helpers (`@resolid/dev/routes`):`flexRoutes`, `relativeFactory`, `prefix`, `route`,
22
- `layout`, `index`.
21
+ - Route helpers (`@resolid/dev/routes`):`flexRoutes`, `relativeFactory`.
23
22
  - Router helpers (`@resolid/dev/router`): `mergeMeta`.
24
- - Server-side router helpers (`@resolid/dev/router.server`):
25
- `createRequestIdMiddleware`, `httpNotFound`, `getClientIp`, `getRequestOrigin`.
26
- - Server adapters (`@resolid/dev/server`): `createServer`, `nodeConfig`, `netlifyConfig`,
27
- `vercelConfig`.
23
+ - HTTP server helpers (`@resolid/dev/http.server`):
24
+ `requestId`, `clientIp`, `requestOrigin`, `httpProblem`, `httpNotFound`, `httpRedirect`.
25
+ - HTTP platform adapters (`@resolid/dev/http.server`): `createHonoNodeServer`,
26
+ `createHonoNetlifyServer`, `createHonoVercelServer`.
28
27
 
29
28
  ## Usage patterns
30
29
 
@@ -73,18 +72,11 @@ export default reactRouterConfig;
73
72
 
74
73
  ```ts
75
74
  // src/server.ts
76
- import { createServer, netlifyConfig, nodeConfig, vercelConfig } from "@resolid/dev/server";
77
-
78
- export default await createServer((platform) => {
79
- switch (platform) {
80
- case "vercel":
81
- return vercelConfig({});
82
- case "netlify":
83
- return netlifyConfig({});
84
- default:
85
- return nodeConfig({});
86
- }
87
- });
75
+ import { createHonoVercelServer, createHonoNodeServer } from "@resolid/dev/http.server";
76
+
77
+ export default await (import.meta.env.RESOLID_PLATFORM == "vercel"
78
+ ? createHonoVercelServer()
79
+ : createHonoNodeServer());
88
80
  ```
89
81
 
90
82
  ### 5) React Router document
package/dist/http.d.mts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { RouterContextProvider, ServerBuild, UNSAFE_DataWithResponseInit } from "react-router";
2
- import { Context, Env, Hono, MiddlewareHandler } from "hono";
2
+ import { Context, Env, Env as Env$1, Hono, Hono as Hono$1, MiddlewareHandler } from "hono";
3
3
  import { Http2Bindings, HttpBindings } from "@hono/node-server";
4
+ import { RequestIdVariables } from "hono/request-id";
4
5
  import { Context as Context$1 } from "@netlify/types";
5
6
  import { HonoOptions } from "hono/hono-base";
6
7
  import { BlankEnv } from "hono/types";
@@ -8,79 +9,92 @@ import { IncomingMessage, ServerResponse } from "http";
8
9
  import { Http2ServerRequest, Http2ServerResponse } from "http2";
9
10
  import { AddressInfo } from "node:net";
10
11
 
11
- //#region src/http/middlewares/request-id.d.ts
12
- declare function getRequestId(context: Readonly<RouterContextProvider> | Context): string;
13
- //#endregion
14
- //#region src/http/middlewares/request-origin.d.ts
15
- declare function getRequestOrigin(context: Readonly<RouterContextProvider> | Context): string | undefined;
16
- type RequestOriginVariables = {
17
- requestOrigin: string | undefined;
18
- };
19
- declare module "hono" {
20
- interface ContextVariableMap extends RequestOriginVariables {}
21
- }
12
+ //#region src/http/utils/response.d.ts
13
+ declare function httpProblem<E>(errors: E): UNSAFE_DataWithResponseInit<{
14
+ errors: E;
15
+ }>;
16
+ declare function httpNotFound(message?: string): never;
17
+ declare function httpRedirect(url: string, cookie?: string | null, status?: number): never;
22
18
  //#endregion
23
19
  //#region src/http/middlewares/client-ip.d.ts
24
- declare function getClientIp(context: Readonly<RouterContextProvider> | Context): string;
25
20
  type ClientIpVariables = {
26
21
  clientIp: string;
27
22
  };
28
23
  declare module "hono" {
29
24
  interface ContextVariableMap extends ClientIpVariables {}
30
25
  }
26
+ type ClientIpGetter = (c: Context) => string;
27
+ declare function clientIp(getter: ClientIpGetter): MiddlewareHandler;
31
28
  //#endregion
32
- //#region src/http/utils/response.d.ts
33
- declare function httpProblem<E>(errors: E): UNSAFE_DataWithResponseInit<{
34
- errors: E;
35
- }>;
36
- declare function httpNotFound(message?: string): never;
37
- declare function httpRedirect(url: string, cookie?: string | null, status?: number): never;
29
+ //#region src/http/middlewares/request-id.d.ts
30
+ type RequestIdGenerator = (c: Context) => string;
31
+ declare module "hono" {
32
+ interface ContextVariableMap extends RequestIdVariables {}
33
+ }
34
+ declare function requestId(generator?: RequestIdGenerator): MiddlewareHandler;
35
+ //#endregion
36
+ //#region src/http/middlewares/request-origin.d.ts
37
+ type RequestOriginVariables = {
38
+ requestOrigin: string | undefined;
39
+ };
40
+ declare module "hono" {
41
+ interface ContextVariableMap extends RequestOriginVariables {}
42
+ }
43
+ type RequestOriginGetter = (c: Context) => string | undefined;
44
+ declare function requestOrigin(getter: RequestOriginGetter): MiddlewareHandler;
38
45
  //#endregion
39
46
  //#region src/http/utils/server.d.ts
40
- interface NodeEnv {
47
+ type NodeEnv = {
41
48
  Bindings: HttpBindings | Http2Bindings;
42
- }
43
- interface HonoServerBaseOptions<E extends Env = BlankEnv> {
44
- configure?: <E extends Env = BlankEnv>(app: Hono<E>) => Promise<void> | void;
49
+ };
50
+ interface HonoServerOptions<E extends Env$1 = BlankEnv> {
51
+ configure?: <E extends Env$1 = BlankEnv>(app: Hono$1<E>) => Promise<void> | void;
45
52
  honoOptions?: HonoOptions<E>;
46
- onShutdown?: () => Promise<void> | void;
47
- getLoadContext?: (context: Context<E>, options: {
53
+ getLoadContext?: (c: Context<E>, options: {
48
54
  build: ServerBuild;
49
55
  mode?: string;
50
56
  }) => Promise<RouterContextProvider> | RouterContextProvider;
51
57
  }
52
58
  //#endregion
53
59
  //#region src/http/platforms/netlify.d.ts
54
- interface NetlifyEnv {
60
+ type NetlifyEnv = {
55
61
  Bindings: {
56
62
  context: Context$1;
57
63
  };
58
- }
59
- type HonoNetlifyServerOptions = HonoServerBaseOptions<NetlifyEnv>;
64
+ };
65
+ type HonoNetlifyServerOptions = HonoServerOptions<NetlifyEnv>;
60
66
  type HonoNetlifyServer = (req: Request, context: Context$1) => Response | Promise<Response>;
61
67
  declare function createHonoNetlifyServer(options?: HonoNetlifyServerOptions): Promise<HonoNetlifyServer>;
68
+ declare function netlifyClientIpGetter(): ClientIpGetter;
69
+ declare function netlifyRequestIdGenerator(): RequestIdGenerator;
70
+ declare function netlifyRequestOriginGetter(): RequestOriginGetter;
62
71
  //#endregion
63
72
  //#region src/http/platforms/vercel.d.ts
64
- type HonoVercelServerOptions = HonoServerBaseOptions<NodeEnv>;
73
+ type HonoVercelServerOptions = HonoServerOptions<NodeEnv>;
65
74
  type HonoVercelServer = (incoming: IncomingMessage | Http2ServerRequest, outgoing: ServerResponse | Http2ServerResponse) => Promise<void>;
66
75
  declare const createHonoVercelServer: (options?: HonoVercelServerOptions) => Promise<HonoVercelServer>;
76
+ declare function vercelClientIpGetter(): ClientIpGetter;
77
+ declare function vercelRequestIdGenerator(): RequestIdGenerator;
78
+ declare function vercelRequestOriginGetter(): RequestOriginGetter;
67
79
  //#endregion
68
80
  //#region src/http/utils/request.d.ts
69
81
  interface GetClientIpOptions {
70
- proxy: boolean;
82
+ proxy?: boolean;
71
83
  proxyCount?: number;
72
84
  ipHeaders?: string;
73
85
  }
74
86
  //#endregion
75
87
  //#region src/http/platforms/node.d.ts
76
- type HonoNodeServerOptions = HonoServerBaseOptions<NodeEnv> & {
88
+ type HonoNodeServerOptions = HonoServerOptions<NodeEnv> & {
77
89
  port?: number;
78
90
  defaultLogger?: boolean;
79
91
  listeningListener?: (info: AddressInfo) => void;
80
- getClientIpOptions?: GetClientIpOptions;
92
+ onShutdown?: () => Promise<void> | void;
81
93
  };
82
- type HonoNodeServer = Hono<NodeEnv>;
94
+ type HonoNodeServer = Hono$1<NodeEnv>;
83
95
  declare function createHonoNodeServer(options?: HonoNodeServerOptions): Promise<HonoNodeServer>;
84
96
  declare function cacheControl(seconds: number, immutable?: boolean): MiddlewareHandler;
97
+ declare function nodeClientIpGetter(getClientIpOptions?: GetClientIpOptions): ClientIpGetter;
98
+ declare function nodeRequestOriginGetter(proxy?: boolean): RequestOriginGetter;
85
99
  //#endregion
86
- export { HonoNetlifyServer, HonoNetlifyServerOptions, HonoNodeServer, HonoNodeServerOptions, HonoVercelServer, HonoVercelServerOptions, cacheControl, createHonoNetlifyServer, createHonoNodeServer, createHonoVercelServer, getClientIp, getRequestId, getRequestOrigin, httpNotFound, httpProblem, httpRedirect };
100
+ export { ClientIpGetter, type Env, type Hono, HonoNetlifyServer, HonoNetlifyServerOptions, HonoNodeServer, HonoNodeServerOptions, HonoVercelServer, HonoVercelServerOptions, NetlifyEnv, type NodeEnv, RequestIdGenerator, RequestOriginGetter, cacheControl, clientIp, createHonoNetlifyServer, createHonoNodeServer, createHonoVercelServer, httpNotFound, httpProblem, httpRedirect, netlifyClientIpGetter, netlifyRequestIdGenerator, netlifyRequestOriginGetter, nodeClientIpGetter, nodeRequestOriginGetter, requestId, requestOrigin, vercelClientIpGetter, vercelRequestIdGenerator, vercelRequestOriginGetter };
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 a,{env as o}from"node:process";import{Hono as s}from"hono";import{requestId as c}from"hono/request-id";import{handle as l}from"@hono/node-server/vercel";import{serve as u}from"@hono/node-server";import{serveStatic as d}from"@hono/node-server/serve-static";import{logger as f}from"hono/logger";import{randomBytes as p}from"node:crypto";import{networkInterfaces as m}from"node:os";const h=t();function g(t){return t instanceof e?t.get(h):t.get(`requestId`)}const _=t();function v(t){return t instanceof e?t.get(_):t.get(`requestOrigin`)}function y(e){return async(t,n)=>{t.set(`requestOrigin`,e(t)),await n()}}const b=t();function x(t){return t instanceof e?t.get(b):t.get(`clientIp`)}function S(e){return async(t,n)=>{t.set(`clientIp`,e(t)),await n()}}function C(e){return r({errors:e},422)}function w(e=`页面未找到`){throw new Response(e,{status:404})}function T(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})}async function E(t,r){let i=new s(r.honoOptions),o=await import(`virtual:react-router/server-build`);i.use(`*`,S(r.getClientIp),c({generator:r.getRequestId}),y(r.getRequestOrigin)),r.configure&&await r.configure(i),i.use(`*`,async i=>(async i=>{let a=r.getLoadContext?.(i,{build:o,mode:t}),s=(a instanceof Promise?await a:a)??new e;return s.set(b,i.get(`clientIp`)),s.set(h,i.get(`requestId`)),s.set(_,i.get(`requestOrigin`)),n(o,t)(i.req.raw,s)})(i));async function l(){r.onShutdown?.(),a.removeListener(`SIGINT`,l),a.removeListener(`SIGTERM`,l),a.exit(0)}return a.on(`SIGINT`,l),a.on(`SIGTERM`,l),i}async function D(e={}){return i(await E(o.NODE_ENV==`test`?`development`:o.NODE_ENV,{...e,getClientIp:e=>e.env.context.ip,getRequestId:e=>e.env.context.requestId,getRequestOrigin:e=>e.env.context.site.url}))}const O=async(e={})=>l(await E(o.NODE_ENV==`test`?`development`:o.NODE_ENV,{...e,getClientIp:e=>e.req.raw.headers.get(`x-real-ip`)??``,getRequestId:e=>e.req.raw.headers.get(`x-vercel-id`)??``,getRequestOrigin:()=>`https://${o.VERCEL_PROJECT_PRODUCTION_URL}`}));function k(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 A(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 j(e={}){let t=o.NODE_ENV==`test`?`development`:o.NODE_ENV,n=t==`production`,r={port:Number(o.PORT)||3e3,listeningListener:e=>{console.log(`🚀 Server started on port ${e.port}`);let t=Object.values(m()).flat().find(e=>String(e?.family).includes(`4`)&&!e?.internal)?.address,n=o.SERVE_PATH?o.SERVE_PATH:``;console.log(`[resolid] http://localhost:${e.port}${n}${t&&` (http://${t}:${e.port})`}`)},...e,defaultLogger:e.defaultLogger??!n},i=null,a=await E(t,{configure:async e=>{if(n){let t=`${import.meta.env.RESOLID_BUILD_DIR}/client`;e.use(`/${import.meta.env.RESOLID_ASSETS_DIR}/*`,M(3600*24*365,!0),d({root:t})),e.use(`*`,M(3600),d({root:t}))}else e.use(`*`,M(3600),d({root:`./public`}));r.defaultLogger&&e.use(`*`,f()),await r.configure?.(e)},honoOptions:r.honoOptions,getLoadContext:r.getLoadContext,onShutdown:async()=>{i?.close(),r.onShutdown?.()},getClientIp:e=>k(e.req.raw,e.env.incoming.socket,r.getClientIpOptions),getRequestId:()=>p(16).toString(`hex`),getRequestOrigin:e=>A(e.req.raw,e.env.incoming.socket,r.getClientIpOptions?.proxy)});return n&&(i=u({...a,port:r.port},r.listeningListener)),a}function M(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{M as cacheControl,D as createHonoNetlifyServer,j as createHonoNodeServer,O as createHonoVercelServer,x as getClientIp,g as getRequestId,v as getRequestOrigin,w as httpNotFound,C as httpProblem,T as httpRedirect};
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{Hono as a}from"hono";import*as o from"virtual:react-router/server-build";import{handle as s}from"@hono/node-server/vercel";import{serve as c}from"@hono/node-server";import{serveStatic as l}from"@hono/node-server/serve-static";import{logger as u}from"hono/logger";import{networkInterfaces as d}from"node:os";import{requestId as f}from"hono/request-id";import{randomBytes as p}from"node:crypto";function m(e){return n({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})}async function _(n,r){let i=import.meta.env.RESOLID_BASENAME,s=new a(r.honoOptions);r.configure&&await r.configure(s);let c=new a({strict:!1});return c.use(async i=>(async i=>{let a=t(o,n),s=r.getLoadContext?.(i,{build:o,mode:n}),c=(s instanceof Promise?await s:s)??new e;return Object.assign(c,{hono:i}),a(i.req.raw,c)})(i)),s.route(`${i}`,c),i&&s.route(`${i}.data`,c),s}async function v(e={}){return r(await _(i.NODE_ENV==`test`?`development`:i.NODE_ENV,{...e}))}function y(){return e=>e.env.context.ip}function b(){return e=>e.env.context.requestId}function x(){return e=>e.env.context.site.url}const S=async(e={})=>s(await _(i.NODE_ENV==`test`?`development`:i.NODE_ENV,{...e}));function C(){return e=>e.req.raw.headers.get(`x-real-ip`)??``}function w(){return e=>e.req.raw.headers.get(`x-vercel-id`)??``}function T(){return()=>`https://${i.VERCEL_PROJECT_PRODUCTION_URL}`}function E(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 D(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 O(e={}){let t=i.NODE_ENV==`test`?`development`:i.NODE_ENV,n=t==`production`,r=import.meta.env.RESOLID_BASENAME,a={port:e.port||3e3,listeningListener:e=>{console.log(`🚀 Server started on port ${e.port}`);let t=Object.values(d()).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})`}`)},...e,defaultLogger:e.defaultLogger??!n},o=null,s=await _(t,{configure:async e=>{if(n){let t=`${import.meta.env.RESOLID_BUILD_DIR}/client`;e.use(`/${import.meta.env.RESOLID_ASSETS_DIR}/*`,k(3600*24*365,!0),l({root:t})),e.use(`*`,k(3600),l({root:t}))}else e.use(`*`,k(3600),l({root:`./public`}));a.defaultLogger&&e.use(`*`,u()),await a.configure?.(e)},honoOptions:a.honoOptions,getLoadContext:a.getLoadContext});n&&(o=c({...s,port:a.port},a.listeningListener));async function f(){o?.close(),a.onShutdown?.(),process.removeListener(`SIGINT`,f),process.removeListener(`SIGTERM`,f),console.log(`[resolid] Node server shutdown.`),process.exit(0)}return process.on(`SIGTERM`,f),process.on(`SIGINT`,f),import.meta.hot&&(process.removeListener(`SIGINT`,f),process.removeListener(`SIGTERM`,f)),s}function k(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`:``}`)}}function A(e={}){return t=>E(t.req.raw,t.env.incoming.socket,e)}function j(e=!1){return t=>D(t.req.raw,t.env.incoming.socket,e)}function M(e=()=>p(16).toString(`hex`)){return f({generator:e})}function N(e){return async(t,n)=>{t.set(`requestOrigin`,e(t)),await n()}}function P(e){return async(t,n)=>{t.set(`clientIp`,e(t)),await n()}}export{k as cacheControl,P as clientIp,v as createHonoNetlifyServer,O as createHonoNodeServer,S as createHonoVercelServer,h as httpNotFound,m as httpProblem,g as httpRedirect,y as netlifyClientIpGetter,b as netlifyRequestIdGenerator,x as netlifyRequestOriginGetter,A as nodeClientIpGetter,j as nodeRequestOriginGetter,M as requestId,N as requestOrigin,C as vercelClientIpGetter,w as vercelRequestIdGenerator,T as vercelRequestOriginGetter};
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-CyAg_-Yx.mjs";
1
+ import { a as defineDevConfig, i as VitePluginOptions, n as DevConfigOptions, r as ReactRouterConfig, t as DevConfig } from "./index-8N78dt-J.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.3.0`;async function b({includeFiles:t=[],nodeVersion:r=22,buildManifest:i,reactRouterConfig:o,viteConfig:s,buildStart:c,buildBundleEnd:l}){let m=s.root,_=s.build.assetsDir??`assets`,v=JSON.parse(await n(d(m,`package.json`),`utf8`)),y=x(v.dependencies??{},s.ssr.external),b=d(o.buildDirectory,`server`),C=i?.serverBundles??{site:{id:`site`,file:f(m,d(b,o.serverBuildFile))}},w=t?.length>0?await p(t,{cwd:m}):[],T=await c();await Promise.all(Object.entries(C).map(async([,t])=>{let n=t.id,i=d(m,t.file),o=u(i);await S(d(o,`package.json`),v,y,r),console.log(`Bundle file for ${n}...`);let s=d(o,`server.mjs`);await h({input:i,output:{file:s,codeSplitting:!1,minify:`dce-only`,comments:{legal:!1}},platform:`node`,transform:{define:{"process.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.NODE_ENV":JSON.stringify(`production`)},target:`node${r}`},external:[`vite`,...Object.keys(y)],plugins:[g({external:[`vite`,...Object.keys(y)],skipDuplicateCheck:!0})]}),await a(d(o,_),{force:!0,recursive:!0}),await a(i,{force:!0}),await Promise.all(w.map(t=>e(t,d(b,t),{recursive:!0}))),await l?.(T,o,n,s,y)}))}function x(e,t){let n=Array.isArray(t)?t.filter(e=>![`react-router`,`react-router-dom`,`@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]||(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)}const D=({nodeVersion:e,includeFiles:t})=>({name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig:()=>({buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await b({includeFiles:t,nodeVersion:e,buildManifest:n,reactRouterConfig:r,viteConfig:i,buildStart:async()=>{let e=await C([i.root,`.netlify`,`v1`],!0);return await O(i.build.assetsDir??`assets`,d(e,`config.json`)),{netlifyRoot:e,netlifyFunctionDir:await C([e,`functions`]),serverRoutes:w(n),nftCache:{}}},buildBundleEnd:async(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.3.2`;async function b({includeFiles:t=[],nodeVersion:r=22,buildManifest:i,reactRouterConfig:o,viteConfig:s,buildStart:c,buildBundleEnd:l}){let m=s.root,_=s.build.assetsDir??`assets`,v=JSON.parse(await n(d(m,`package.json`),`utf8`)),y=x(v.dependencies??{},s.ssr.external),b=d(o.buildDirectory,`server`),C=i?.serverBundles??{site:{id:`site`,file:f(m,d(b,o.serverBuildFile))}},w=t?.length>0?await p(t,{cwd:m}):[],T=await c();await Promise.all(Object.entries(C).map(async([,t])=>{let n=t.id,i=d(m,t.file),o=u(i);await S(d(o,`package.json`),v,y,r),console.log(`Bundle file for ${n}...`);let s=d(o,`server.mjs`);await h({input:i,output:{file:s,codeSplitting:!1,minify:`dce-only`,comments:{legal:!1}},platform:`node`,transform:{define:{"process.env.NODE_ENV":JSON.stringify(`production`),"import.meta.env.NODE_ENV":JSON.stringify(`production`)},target:`node${r}`},external:[`vite`,...Object.keys(y)],plugins:[g({external:[`vite`,...Object.keys(y)],skipDuplicateCheck:!0})]}),await a(d(o,_),{force:!0,recursive:!0}),await a(i,{force:!0}),await Promise.all(w.map(t=>e(t,d(b,t),{recursive:!0}))),await l?.(T,o,n,s,y)}))}function x(e,t){let n=Array.isArray(t)?t.filter(e=>![`react-router`,`react-router-dom`,`@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]||(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)}const D=({nodeVersion:e,includeFiles:t})=>({name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig:()=>({buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await b({includeFiles:t,nodeVersion:e,buildManifest:n,reactRouterConfig:r,viteConfig:i,buildStart:async()=>{let e=await C([i.root,`.netlify`,`v1`],!0);return await O(i.build.assetsDir??`assets`,d(e,`config.json`)),{netlifyRoot:e,netlifyFunctionDir:await C([e,`functions`]),serverRoutes:w(n),nftCache:{}}},buildBundleEnd:async(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/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){for(let o of await e(t,{withFileTypes:!0,encoding:`utf8`})){let e=n(t,o.name);o.isDirectory()?await f(e,i,a):o.isFile()&&i(r(a,e))}}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||[],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||void 0;let s=n.id.replace(RegExp(`^${e}/`),``).split(/[./]/).pop();if(s&&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(`
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||[],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||void 0;let s=n.id.replace(RegExp(`^${e}/`),``).split(/[./]/).pop();if(s&&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
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
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]||(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};
package/dist/vite.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { i as VitePluginOptions } from "./index-CyAg_-Yx.mjs";
1
+ import { i as VitePluginOptions } from "./index-8N78dt-J.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`,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_BUILD_DIR":JSON.stringify(o.buildDir),"import.meta.env.RESOLID_ASSETS_DIR":JSON.stringify(o.assetsDir)},ssr:{noExternal:[`@resolid/dev`]}};if(!o.future?.v8_viteEnvironmentApi&&!o.ssrBuild)return n;let r={build:{target:`node${t.nodeVersion}`,rollupOptions:{input:o.entryFile}}};return o.future?.v8_viteEnvironmentApi?{...n,environments:{ssr:r}}:{...n,...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.rollupOptions.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=o.future?.v8_viteEnvironmentApi?(await t.environments.ssr.runner.import(f)).default:(await t.ssrLoadModule(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=typeof e==`string`?Error(`The response is not an instance of "Response", but: ${e}`):Error(`Unknown error: ${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,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`]}};if(!o.future?.v8_viteEnvironmentApi&&!o.ssrBuild)return n;let r={build:{target:`node${t.nodeVersion}`,rollupOptions:{input:o.entryFile,output:{manualChunks:void 0},onwarn(e,t){e.code===`UNUSED_EXTERNAL_IMPORT`&&e.message.includes(`react`)||t(e)}}}};return o.future?.v8_viteEnvironmentApi?{...n,environments:{ssr:r}}:{...n,...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.rollupOptions.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=o.future?.v8_viteEnvironmentApi?(await t.environments.ssr.runner.import(f)).default:(await t.ssrLoadModule(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=typeof e==`string`?Error(`The response is not an instance of "Response", but: ${e}`):Error(`Unknown error: ${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/env.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { Context } from "hono";
2
+
1
3
  interface ImportMetaEnv {
2
4
  readonly RESOLID_PLATFORM: "node" | "vercel" | "netlify";
3
5
  }
@@ -5,3 +7,12 @@ interface ImportMetaEnv {
5
7
  interface ImportMeta {
6
8
  readonly env: ImportMetaEnv;
7
9
  }
10
+
11
+ type HonoContext = {
12
+ hono: Context;
13
+ };
14
+
15
+ declare module "react-router" {
16
+ // oxlint-disable-next-line typescript/no-empty-object-type
17
+ interface RouterContextProvider extends HonoContext {}
18
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolid/dev",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "private": false,
5
5
  "description": "Development utils for Resolid applications",
6
6
  "keywords": [
@@ -60,23 +60,23 @@
60
60
  "provenance": true
61
61
  },
62
62
  "dependencies": {
63
- "@hono/node-server": "^1.19.9",
64
- "@resolid/utils": "^1.2.7",
63
+ "@hono/node-server": "^1.19.11",
64
+ "@resolid/utils": "^1.3.2",
65
65
  "@vercel/nft": "^1.3.2",
66
66
  "fast-glob": "^3.3.3",
67
- "hono": "^4.12.3",
67
+ "hono": "^4.12.8",
68
68
  "minimatch": "^10.2.4",
69
69
  "rolldown": "latest"
70
70
  },
71
71
  "devDependencies": {
72
72
  "@react-router/dev": "^7.13.1",
73
- "tsdown": "^0.20.3"
73
+ "tsdown": "^0.21.4"
74
74
  },
75
75
  "peerDependencies": {
76
- "@netlify/types": "^2.3.0",
76
+ "@netlify/types": "^2.4.0",
77
77
  "@react-router/dev": "^7.13.1",
78
78
  "@react-router/node": "^7.13.1",
79
- "isbot": "^5.1.35",
79
+ "isbot": "^5.1.36",
80
80
  "react-router": "^7.13.1",
81
81
  "vite": "^7.3.1"
82
82
  },