@resolid/dev 0.1.0 → 0.1.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
@@ -17,6 +17,108 @@ yarn add @resolid/dev
17
17
  bun add @resolid/dev
18
18
  ```
19
19
 
20
+ ## What is included
21
+
22
+ - `defineDevConfig` (`@resolid/dev`): generate unified `vitePluginOptions` and `reactRouterConfig`.
23
+ - `resolidVite` (`@resolid/dev/vite`): combine Resolid plugin behavior with React Router Vite
24
+ plugin.
25
+ - Route helpers (`@resolid/dev/routes`):`flexRoutes`, `relativeFactory`, `prefix`, `route`,
26
+ `layout`, `index`.
27
+ - Router helpers (`@resolid/dev/router`): `mergeMeta`.
28
+ - Server-side router helpers (`@resolid/dev/router.server`):
29
+ `createRequestIdMiddleware`, `httpNotFound`, `getClientIp`, `getRequestOrigin`.
30
+ - Server adapters (`@resolid/dev/server`): `createServer`, `nodeConfig`, `netlifyConfig`,
31
+ `vercelConfig`.
32
+
33
+ ## Usage patterns
34
+
35
+ ### 1) Central config
36
+
37
+ ```ts
38
+ // resolid.config.ts
39
+ import { defineDevConfig } from "@resolid/dev";
40
+ import { env } from "node:process";
41
+
42
+ export const { vitePluginOptions, reactRouterConfig } = defineDevConfig({
43
+ appDirectory: "src",
44
+ nodeVersion: 24,
45
+ platform: env.VERCEL == 1 ? "vercel" : env.NETLIFY ? "netlify" : "node",
46
+ reactRouterConfig: {
47
+ future: {
48
+ unstable_optimizeDeps: true,
49
+ },
50
+ },
51
+ });
52
+ ```
53
+
54
+ ### 2) Vite config
55
+
56
+ ```ts
57
+ // vite.config.ts
58
+ import { resolidVite } from "@resolid/dev/vite";
59
+ import { defineConfig } from "vite";
60
+ import { vitePluginOptions } from "./resolid.config";
61
+
62
+ export default defineConfig({
63
+ plugins: [resolidVite(vitePluginOptions)],
64
+ });
65
+ ```
66
+
67
+ ### 3) React Router config
68
+
69
+ ```ts
70
+ // react-router.config.ts
71
+ import { reactRouterConfig } from "./resolid.config";
72
+
73
+ export default reactRouterConfig;
74
+ ```
75
+
76
+ ### 4) Server entry
77
+
78
+ ```ts
79
+ // src/server.ts
80
+ import { createServer, netlifyConfig, nodeConfig, vercelConfig } from "@resolid/dev/server";
81
+
82
+ export default await createServer((platform) => {
83
+ switch (platform) {
84
+ case "vercel":
85
+ return vercelConfig({});
86
+ case "netlify":
87
+ return netlifyConfig({});
88
+ default:
89
+ return nodeConfig({});
90
+ }
91
+ });
92
+ ```
93
+
94
+ ### 5) React Router document
95
+
96
+ Visit: https://reactrouter.com/home
97
+
98
+ ### 6) Flex routes
99
+
100
+ ```ts
101
+ // src/routes.ts
102
+ import { flexRoutes, type RouteConfig } from "@resolid/dev/routes";
103
+
104
+ export default flexRoutes() satisfies RouteConfig;
105
+ ```
106
+
107
+ #### Router Rules
108
+
109
+ - Routes are defined and nested using folders, very similar to how HTML files are laid out on the nginx server
110
+ - The `_layout` file wraps all downstream routes, which require an `<Outlet />` to render sub-routes
111
+ - The `_index` file is the default file for the folder, for example: `/users/_index.tsx` will match `/users`
112
+ - Variables are represented by `$` in the file path, for example: `/users/$id/edit.tsx` will match `/users/123/edit`
113
+ - Enclosing a route segment in parentheses will make the segment optional, for example: `/($lang)/categories.tsx` will
114
+ match `/categories`, `/zh/categories`
115
+ - You can use `[]` to escape special characters in routing conventions, for example: `/make-[$$$]-fast-online.tsx` will
116
+ match `/make-$$$-fast-online`
117
+ - Files and folders prefixed with `_` become invisible, allowing folder organization without affecting routing paths,
118
+ for example: `/_legal-pages/privacy-policy.tsx` will match `/ privacy-policy`
119
+ - `$.tsx` splash route will match the rest of the URL, including slashes, e.g. `/files/$.tsx` will match `/files`,
120
+ `/files/one`, `/files/one/two`
121
+
20
122
  ## License
21
123
 
22
124
  MIT License (MIT). Please see [LICENSE](./LICENSE) for more information.
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.1.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,legalComments:`none`},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=e=>{let{nodeVersion:t}=e;return{name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig:()=>({buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await b({includeFiles:e.includeFiles,nodeVersion:t,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(e,n,r,i)=>{console.log(`Coping Netlify function files for ${r}...`);let a=await E(i,await C([e.netlifyFunctionDir,r],!0),e.nftCache),o=e.serverRoutes.find(e=>e.bundleId==r)?.path,s=o?[o,`${o}/*`]:`/*`;await c(d(e.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.1.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,legalComments:`none`},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=e=>{let{nodeVersion:t}=e;return{name:`@resolid/react-router-hono-netlify-preset`,reactRouterConfig:()=>({buildEnd:async({buildManifest:n,reactRouterConfig:r,viteConfig:i})=>{await b({includeFiles:e.includeFiles,nodeVersion:t,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(e,n,r,i)=>{console.log(`Coping Netlify function files for ${r}...`);let a=await E(i,await C([e.netlifyFunctionDir,r],!0),e.nftCache),o=e.serverRoutes.find(e=>e.bundleId==r)?.path,s=o?[o,`${o}/*`]:`/*`;await c(d(e.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.d.mts CHANGED
@@ -1,10 +1,17 @@
1
- import { RouteConfig, RouteConfigEntry, index, layout, prefix, route } from "@react-router/dev/routes";
1
+ import { RouteConfig, RouteConfigEntry, RouteConfigEntry as RouteConfigEntry$1, index, index as index$1, layout, layout as layout$1, prefix, route, route as route$1 } from "@react-router/dev/routes";
2
2
 
3
- //#region src/routes/index.d.ts
3
+ //#region src/routes/relative/index.d.ts
4
4
  declare function relativeFactory(directory: string): {
5
- route: typeof route;
6
- index: typeof index;
7
- layout: typeof layout;
5
+ route: typeof route$1;
6
+ index: typeof index$1;
7
+ layout: typeof layout$1;
8
8
  };
9
9
  //#endregion
10
- export { type RouteConfig, type RouteConfigEntry, index, layout, prefix, relativeFactory, route };
10
+ //#region src/routes/flex/index.d.ts
11
+ type FolderRoutesOptions = {
12
+ routesDirectory?: string;
13
+ ignoredRouteFiles?: string[];
14
+ };
15
+ declare function flexRoutes(options?: FolderRoutesOptions): Promise<RouteConfigEntry$1[]>;
16
+ //#endregion
17
+ export { FolderRoutesOptions, type RouteConfig, type RouteConfigEntry, flexRoutes, index, layout, prefix, relativeFactory, route };
package/dist/routes.mjs CHANGED
@@ -1 +1,3 @@
1
- import{relative as e,resolve as t}from"node:path";import{getAppDirectory as n,index as r,layout as i,prefix as a,route as o}from"@react-router/dev/routes";function s(a){let s=n();return{route:(n,r,...i)=>o(n,e(s,t(a,r)),...i),index:(n,...i)=>r(e(s,t(a,n)),...i),layout:(n,...r)=>i(e(s,t(a,n)),...r)}}export{r as index,i as layout,a as prefix,s as relativeFactory,o as route};
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,index as c,layout as l,layout as u,prefix as d,route as f,route as p}from"@react-router/dev/routes";import{makeRe as m}from"minimatch";function h(e){let t=o();return{route:(n,a,...o)=>p(n,r(t,i(e,a)),...o),index:(n,...a)=>c(r(t,i(e,n)),...a),layout:(n,...a)=>u(r(t,i(e,n)),...a)}}async function g(t,i,a=t){for(let o of await e(t,{withFileTypes:!0,encoding:`utf8`})){let e=n(t,o.name);o.isDirectory()?await g(e,i,a):o.isFile()&&i(r(a,e))}}function _(e,t=`root`){let n={};for(let t in e){let r=e[t];n[t]={id:r.id,file:r.file,path:r.path,index:r.index,caseSensitive:r.caseSensitive}}let r=[];for(let i in n){let a=n[i],{parentId:o}=e[a.id];if(o===t)r.push(a);else{let e=o&&n[o];e&&(e.children=e.children||[],e.children.push(a))}}return r}function v(e,r){let i={},a=new Map,o=new Map;for(let i of r){let r=C(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 S,c=Array.from(a).sort(([e],[t])=>t.length-e.length);for(let[t,n]of c){let[r,a]=y(t.slice(e.length+1)),o=t.slice(-6)==`_index`;i[t]={file:n,id:t,path:b(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
+ `);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 y(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 b(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 x=Symbol(`PrefixLookupTrieEndSymbol`);var S=class{root={[x]:!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]={[x]:!1}),t=t[n];t[x]=!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[x]&&r(n)&&(t[x]=!1,e.push(n)),e}};function C(e){return e.split(a.sep).join(`/`)}const w=[`.js`,`.jsx`,`.ts`,`.tsx`,`.md`,`.mdx`];async function T(e={}){let{routesDirectory:r=`routes`,ignoredRouteFiles:i=[]}=e,a=o(),s=i.map(e=>m(e)).filter(e=>!!e),c=[];return await g(n(a,r),e=>{s.some(t=>t.test(e))||w.includes(t(e))&&c.push(e)}),_(v(r,c))}export{T as flexRoutes,s as index,l as layout,d as prefix,h as relativeFactory,f as route};
package/dist/server.d.mts CHANGED
@@ -51,4 +51,4 @@ declare const netlifyConfig: PlatformConfig<HonoNetlifyServerOptions>;
51
51
  declare const vercelConfig: PlatformConfig<HonoVercelServerOptions>;
52
52
  declare const createServer: (factory: (platform: Platform) => HonoNodeServerOptions | HonoNetlifyServerOptions | HonoVercelServerOptions | undefined) => Promise<((req: Request, context: NetlifyContext) => Response | Promise<Response>) | ((incoming: IncomingMessage | Http2ServerRequest, outgoing: ServerResponse | Http2ServerResponse) => Promise<void>) | Hono<NodeEnv>>;
53
53
  //#endregion
54
- export { type Hono, type HonoContext, type NetlifyContext, type NodeEnv, cacheControl, createServer, netlifyConfig, nodeConfig, vercelConfig };
54
+ export { type Hono, type HonoContext, type NetlifyContext, type NodeEnv, type Platform, cacheControl, createServer, netlifyConfig, nodeConfig, vercelConfig };
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{reactRouter as o}from"@react-router/dev/vite";import{makeRe as s}from"minimatch";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(s(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),...o()]}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{makeRe as a}from"minimatch";import{getRequestListener as o}from"@hono/node-server";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(`/`),o=[RegExp(`^(?=\\/${n}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`),RegExp(`^(?=\\/${n}\\/.*\\/\\..*\\/.*)`)];if(n!=r&&(o.push(RegExp(`^(?=\\/${r}\\/)((?!.*\\.data(\\?|$)).*\\..*(\\?.*)?$)`)),o.push(RegExp(`^(?=\\/${r}\\/.*\\/\\..*\\/.*)`))),t)for(let e of t)if(e instanceof RegExp)o.push(e);else try{o.push(a(e))}catch{}return o}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=``,a;return{name:`@resolid/vite-dev-plugin`,enforce:`post`,config(e){if(a=c(e,t),!a)return;let n={define:{"import.meta.env.RESOLID_PLATFORM":JSON.stringify(t.platform),"import.meta.env.RESOLID_BUILD_DIR":JSON.stringify(a.buildDir),"import.meta.env.RESOLID_ASSETS_DIR":JSON.stringify(a.assetsDir)},ssr:{noExternal:[`@resolid/dev`]}};if(!a.future?.v8_viteEnvironmentApi&&!a.ssrBuild)return n;let r={build:{target:`node${t.nodeVersion}`,rollupOptions:{input:a.entryFile}}};return a.future?.v8_viteEnvironmentApi?{...n,environments:{ssr:r}}:{...n,...r}},configResolved(e){if(i=e.publicDir,a?.buildManifest?.serverBundles)for(let t of Object.keys(a.buildManifest.serverBundles))e.environments[`ssrBundle_${t}`]&&(e.environments[`ssrBundle_${t}`].build.rollupOptions.input=a.entryFile)},async configureServer(s){if(!a)return;let c=l(a.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=a.entryFile,p=a.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 o(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 ADDED
@@ -0,0 +1,7 @@
1
+ interface ImportMetaEnv {
2
+ readonly RESOLID_PLATFORM: "node" | "vercel" | "netlify";
3
+ }
4
+
5
+ interface ImportMeta {
6
+ readonly env: ImportMetaEnv;
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolid/dev",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "private": false,
5
5
  "description": "Development utils for Resolid applications",
6
6
  "keywords": [
@@ -27,7 +27,8 @@
27
27
  },
28
28
  "files": [
29
29
  "cli",
30
- "dist"
30
+ "dist",
31
+ "env.d.ts"
31
32
  ],
32
33
  "type": "module",
33
34
  "sideEffects": false,
@@ -37,6 +38,9 @@
37
38
  "types": "./dist/index.d.mts",
38
39
  "import": "./dist/index.mjs"
39
40
  },
41
+ "./env": {
42
+ "types": "./env.d.ts"
43
+ },
40
44
  "./routes": {
41
45
  "types": "./dist/routes.d.mts",
42
46
  "import": "./dist/routes.mjs"
@@ -56,17 +60,13 @@
56
60
  "./vite": {
57
61
  "types": "./dist/vite.d.mts",
58
62
  "import": "./dist/vite.mjs"
59
- }
63
+ },
64
+ "./package.json": "./package.json"
60
65
  },
61
66
  "publishConfig": {
62
67
  "access": "public",
63
68
  "provenance": true
64
69
  },
65
- "scripts": {
66
- "build": "tsdown",
67
- "lint": "oxlint",
68
- "typecheck": "tsc --noEmit"
69
- },
70
70
  "dependencies": {
71
71
  "@hono/node-server": "^1.19.9",
72
72
  "@react-router/dev": "^7.13.1",
@@ -89,5 +89,11 @@
89
89
  },
90
90
  "engines": {
91
91
  "node": "^22.13.0 || >=24"
92
+ },
93
+ "scripts": {
94
+ "build": "tsdown",
95
+ "lint": "oxlint",
96
+ "test": "vitest run",
97
+ "typecheck": "tsc --noEmit"
92
98
  }
93
- }
99
+ }