@wren-js/core 0.12.0 → 0.13.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/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{_ as e,b as t,d as n,f as r,g as i,h as a,l as o,m as s,t as c,u as l,v as u,y as d}from"./constants-B3ndZB9W.mjs";import{c as f,d as p,f as m,l as h,n as g,p as _}from"./constants-CB936btA.mjs";import{CONFIG_VALID_EXTENSIONS as v,DEFAULTS as y}from"./config.mjs";import{t as b}from"./utils-li1KYQ1O.mjs";import{existsSync as ee}from"node:fs";import{basename as te,dirname as x,extname as ne,isAbsolute as re,join as ie,relative as S,resolve as C}from"node:path";import w from"node:process";import{parseArgs as ae}from"node:util";import{Visitor as T,createBuilder as oe,createServer as se,defineConfig as ce,isCSSRequest as le,loadConfigFromFile as ue,loadEnv as de,mergeConfig as E,normalizePath as D,parseSync as O,perEnvironmentState as fe,resolveEnvPrefix as pe,transformWithOxc as me}from"vite";import{mkdir as he,readFile as k,readdir as ge,rm as A,writeFile as j}from"node:fs/promises";import{pathToFileURL as _e}from"node:url";const M=e=>w.platform===`win32`?e.toUpperCase():e,ve=()=>{let e=/* @__PURE__ */ new Map;return(t,n)=>{for(let[t,n]of e)w.env[t]===n&&delete w.env[t];e.clear();let r=new Set(Object.keys(w.env).map(M)),i=de(t,n,``);for(let[t,n]of Object.entries(i)){let i=M(t);r.has(i)||(w.env[t]=n,e.set(i,n))}}},ye=(e,t)=>{let n=n=>typeof n==`string`&&!Object.hasOwn(e,n)&&!t.some(e=>n.startsWith(e)),r=e=>n(e)&&Object.hasOwn(globalThis.process.env,e);return new Proxy(e,{get(e,t,n){return r(t)?globalThis.process.env[t]:Reflect.get(e,t,n)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(r(t)?globalThis.process.env:e,t)},has(e,t){return Reflect.has(e,t)||r(t)},ownKeys(e){return[...Reflect.ownKeys(e),...Object.keys(globalThis.process.env).filter(n)]}})},N=`virtual:${d}-server-env`,P=`\0${N}`,F=`import.meta.env.`,be=()=>{let e=fe(({config:e})=>{let t=Object.fromEntries(Object.entries(e.env).map(([e,t])=>[F+e,JSON.stringify(t)]));for(let[n,r]of Object.entries(e.define??{}))n.startsWith(F)&&(t[n]=typeof r==`string`?r:JSON.stringify(r)??`undefined`);return t[`${F}SSR`]=`true`,t});return{applyToEnvironment:e=>e.config.consumer===`server`,load:{filter:{id:RegExp(`^${P}$`)},handler(){let t=Object.entries(e(this)).map(([e,t])=>`${JSON.stringify(e.slice(16))}: ${t}`),n=pe({envPrefix:this.environment.config.envPrefix});return`export default (${ye.toString()})({${t.join(`,`)}}, ${JSON.stringify(n)});`}},name:`${d}-server-env`,resolveId:{filter:{id:RegExp(`^${N}$`)},handler:()=>P},transform:{filter:{code:/\bmeta\b/,id:/\.[cm]?[jt]sx?(?:$|\?)/},handler(t,n){if(n===P)return null;let r=`__wrenServerEnv`;if(t.includes(r)||t.includes(`\\u`)){let{errors:e,program:i}=O(n.split(`?`)[0],t);if(e.length>0)return this.error(e[0].message);let a=/* @__PURE__ */ new Set;for(new T({Identifier:e=>void a.add(e.name)}).visit(i);a.has(r);)r+=`_`}return me(t,n,{define:{...e(this),"import.meta.env":r},inject:{[r]:[N,`default`]},jsx:`preserve`,tsconfig:!1})}}}},I=e=>{let t=0;for(let n=e.indexOf(`
1
+ import{_ as e,b as t,d as n,f as r,g as i,h as a,l as o,m as s,t as c,u as l,v as u,y as d}from"./constants-DEZyjgyc.mjs";import{c as f,d as p,f as m,l as h,n as g,p as _}from"./constants-CB936btA.mjs";import{CONFIG_VALID_EXTENSIONS as v,DEFAULTS as y}from"./config.mjs";import{t as b}from"./utils-li1KYQ1O.mjs";import{existsSync as ee}from"node:fs";import{basename as te,dirname as x,extname as ne,isAbsolute as re,join as ie,relative as S,resolve as C}from"node:path";import w from"node:process";import{parseArgs as ae}from"node:util";import{Visitor as T,createBuilder as oe,createServer as se,defineConfig as ce,isCSSRequest as le,loadConfigFromFile as ue,loadEnv as de,mergeConfig as E,normalizePath as D,parseSync as O,perEnvironmentState as fe,resolveEnvPrefix as pe,transformWithOxc as me}from"vite";import{mkdir as he,readFile as k,readdir as ge,rm as A,writeFile as j}from"node:fs/promises";import{pathToFileURL as _e}from"node:url";const M=e=>w.platform===`win32`?e.toUpperCase():e,ve=()=>{let e=/* @__PURE__ */ new Map;return(t,n)=>{for(let[t,n]of e)w.env[t]===n&&delete w.env[t];e.clear();let r=new Set(Object.keys(w.env).map(M)),i=de(t,n,``);for(let[t,n]of Object.entries(i)){let i=M(t);r.has(i)||(w.env[t]=n,e.set(i,n))}}},ye=(e,t)=>{let n=n=>typeof n==`string`&&!Object.hasOwn(e,n)&&!t.some(e=>n.startsWith(e)),r=e=>n(e)&&Object.hasOwn(globalThis.process.env,e);return new Proxy(e,{get(e,t,n){return r(t)?globalThis.process.env[t]:Reflect.get(e,t,n)},getOwnPropertyDescriptor(e,t){return Reflect.getOwnPropertyDescriptor(r(t)?globalThis.process.env:e,t)},has(e,t){return Reflect.has(e,t)||r(t)},ownKeys(e){return[...Reflect.ownKeys(e),...Object.keys(globalThis.process.env).filter(n)]}})},N=`virtual:${d}-server-env`,P=`\0${N}`,F=`import.meta.env.`,be=()=>{let e=fe(({config:e})=>{let t=Object.fromEntries(Object.entries(e.env).map(([e,t])=>[F+e,JSON.stringify(t)]));for(let[n,r]of Object.entries(e.define??{}))n.startsWith(F)&&(t[n]=typeof r==`string`?r:JSON.stringify(r)??`undefined`);return t[`${F}SSR`]=`true`,t});return{applyToEnvironment:e=>e.config.consumer===`server`,load:{filter:{id:RegExp(`^${P}$`)},handler(){let t=Object.entries(e(this)).map(([e,t])=>`${JSON.stringify(e.slice(16))}: ${t}`),n=pe({envPrefix:this.environment.config.envPrefix});return`export default (${ye.toString()})({${t.join(`,`)}}, ${JSON.stringify(n)});`}},name:`${d}-server-env`,resolveId:{filter:{id:RegExp(`^${N}$`)},handler:()=>P},transform:{filter:{code:/\bmeta\b/,id:/\.[cm]?[jt]sx?(?:$|\?)/},handler(t,n){if(n===P)return null;let r=`__wrenServerEnv`;if(t.includes(r)||t.includes(`\\u`)){let{errors:e,program:i}=O(n.split(`?`)[0],t);if(e.length>0)return this.error(e[0].message);let a=/* @__PURE__ */ new Set;for(new T({Identifier:e=>void a.add(e.name)}).visit(i);a.has(r);)r+=`_`}return me(t,n,{define:{...e(this),"import.meta.env":r},inject:{[r]:[N,`default`]},jsx:`preserve`,tsconfig:!1})}}}},I=e=>{let t=0;for(let n=e.indexOf(`
2
2
  `);n!==-1;n=e.indexOf(`
3
3
  `,n+1))t++;return t},xe=(e,t,n,r)=>{let i=I(e.slice(t,n))-I(r);return{end:n,start:t,text:i>0?r+`
4
4
  `.repeat(i):r}},Se=(e,t)=>{let n=``,r=0;for(let{end:i,start:a,text:o}of t.toSorted((e,t)=>e.start-t.start))n+=e.slice(r,a)+o,r=i;return n+e.slice(r)},L=e=>te(e,ne(e)),Ce=e=>Object.fromEntries(e.toSorted(([e],[t])=>e<t?-1:1)),we=e=>{let t=[];for(let{entries:n}of e)for(let{exportName:e,isType:r}of n){if(r)continue;let n=e.kind===`Default`?`default`:e.name;n!==null&&t.push(n)}return t},Te=/^(?:[a-z][a-z\d+.-]*:|\/\/)/i,R=e=>{if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0)return e.quasis[0]?.value.cooked??void 0},z=({value:e})=>{if(e?.type===`Literal`)return e.value;if(e?.type===`JSXExpressionContainer`)return R(e.expression)},Ee=(e,t)=>{let n={kept:[]};for(let r of t.attributes){let t=e.slice(r.start,r.end);if(r.type!==`JSXAttribute`||r.name.type!==`JSXIdentifier`){n.kept.push(t);continue}let{name:i}=r.name;i===`src`?n.src=r:i===`dangerouslySetInnerHTML`?n.html=r:(i===`type`&&(n.type=z(r)),n.kept.push(t))}return n},De=({key:e})=>e.type===`Identifier`?e.name:e.type===`Literal`?e.value:null,Oe=({value:e})=>{let t=e?.type===`JSXExpressionContainer`?e.expression:void 0;if(t?.type===`ObjectExpression`)for(let e of t.properties){if(e.type!==`Property`||e.computed||De(e)!==`__html`)continue;let t=R(e.value);return t===void 0?void 0:[t,e.value.start+1]}},ke=(e,t)=>{if(t)return Oe(t);let n=e.children.filter(e=>e.type!==`JSXText`||e.value.trim()!==``);if(n.length===0)return[``,e.start];if(n.length!==1)return;let[r]=n;if(r.type===`JSXText`)return[r.value,r.start];if(r.type!==`JSXExpressionContainer`)return;let i=R(r.expression);return i===void 0?void 0:[i,r.expression.start+1]},Ae=({name:e})=>e.type===`JSXIdentifier`&&e.name===`script`,B=(e,t)=>{let n=[],r=[],{errors:i,program:a}=O(t,e);if(i.length>0)return{scripts:n,warnings:r};let o=0,s=/* @__PURE__ */ new Set,c=e=>{for(let t of e.children)s.add(t.start)},l=t=>{let{html:i,kept:a,src:c,type:l}=Ee(e,t.openingElement),u=c&&z(c),d=u!==void 0&&!Te.test(u);if(l!==`module`){d&&_.test(u)&&r.push(`<script src="${u}"> is not bundled; add type="module" to make it a page script.`);return}let f={attributes:a,end:t.end,replacement:s.has(t.start)?``:`<></>`,start:t.start};if(c){d&&n.push({...f,kind:`src`,src:u});return}let p=ke(t,i);if(!p){r.push(`<script type="module"> content must be a static string to be bundled.`);return}let[m,h]=p;m.trim()!==``&&n.push({...f,code:m,codeStart:h,index:o++,kind:`inline`})};return new T({JSXElement(e){c(e),Ae(e.openingElement)&&l(e)},JSXFragment:c}).visit(a),{scripts:n,warnings:r}},V=`virtual:${d}-page-scripts`,H=`__wrenPageScripts`,U=`${V}:route:`,W=`\0${U}`,G=`\0${f}`,K=/\?wren-script=(\d+)\.ts$/,q=`__wren-page-scripts.mjs`,J=`\0${h}`,Y=(e,t)=>{let n=D(S(e,t));return n.startsWith(`../`)||re(n)?`@fs/${D(t).replace(/^\//,``)}`:n},je=async(e,t,n)=>{let r=t.attributes.filter(e=>!/^type\b/.test(e));if(r.length>0&&e.warn(`Page script attributes are dropped when hoisted: ${r.join(` `)}`),t.kind===`inline`)return{id:`${n}?wren-script=${t.index}.ts`,name:`${L(n)}-${t.index}`};let i=await e.resolve(t.src,n);if(!i||i.external||i.id.includes(`/node_modules/`))e.warn(`Page script "${t.src}" must resolve to a project file; left as is.`);else return{id:i.id,name:L(i.id)}},Me=async(e,t,n)=>{let r=await k(t,`utf8`),i=B(r,t).scripts.find(e=>e.kind===`inline`&&e.index===n);return i?.kind===`inline`?{code:`
@@ -1 +1 @@
1
- var e=`0.12.0`;const t=`wrenjs`,n=e,r=`ROOT`,i=`PAGE`,a=`API`,o=`NOT_FOUND`,s=`LAYOUT`,c=`PROXY`,l=`___root`,u=`__layout`,d=`__not-found`,f=`__proxy`,p=`GET`,m=`DELETE`,h=`HEAD`,g=`OPTIONS`,_=`PATCH`,v=`POST`,y=`PUT`,b=[`GET`,m,h,g,_,v,`PUT`];export{c as _,g as a,n as b,y as c,f as d,l as f,i as g,o as h,h as i,u as l,s as m,m as n,_ as o,a as p,p as r,v as s,b as t,d as u,r as v,t as y};
1
+ var e=`0.13.0`;const t=`wrenjs`,n=e,r=`ROOT`,i=`PAGE`,a=`API`,o=`NOT_FOUND`,s=`LAYOUT`,c=`PROXY`,l=`___root`,u=`__layout`,d=`__not-found`,f=`__proxy`,p=`GET`,m=`DELETE`,h=`HEAD`,g=`OPTIONS`,_=`PATCH`,v=`POST`,y=`PUT`,b=[`GET`,m,h,g,_,v,`PUT`];export{c as _,g as a,n as b,y as c,f as d,l as f,i as g,o as h,h as i,u as l,s as m,m as n,_ as o,a as p,p as r,v as s,b as t,d as u,r as v,t as y};
@@ -1 +1 @@
1
- import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v,y}from"./constants-B3ndZB9W.mjs";import{f as b}from"./constants-CB936btA.mjs";export{g as ENTRY_API_EXPORTS,d as ENTRY_FILEROUTE_API_EXPORT_DELETE,m as ENTRY_FILEROUTE_API_EXPORT_GET,c as ENTRY_FILEROUTE_API_EXPORT_HEAD,t as ENTRY_FILEROUTE_API_EXPORT_OPTIONS,f as ENTRY_FILEROUTE_API_EXPORT_PATCH,h as ENTRY_FILEROUTE_API_EXPORT_POST,r as ENTRY_FILEROUTE_API_EXPORT_PUT,l as ENTRY_FILEROUTE_LAYOUT,_ as ENTRY_FILEROUTE_NOT_FOUND,i as ENTRY_FILEROUTE_PROXY,a as ENTRY_FILEROUTE_ROOT,p as ENTRY_KIND_API,u as ENTRY_KIND_LAYOUT,s as ENTRY_KIND_NOT_FOUND,o as ENTRY_KIND_PAGE,e as ENTRY_KIND_PROXY,v as ENTRY_KIND_ROOT,b as ROUTE_MODULE_RE,y as WREN_NAME,n as WREN_VERSION};
1
+ import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v,y}from"./constants-DEZyjgyc.mjs";import{f as b}from"./constants-CB936btA.mjs";export{g as ENTRY_API_EXPORTS,d as ENTRY_FILEROUTE_API_EXPORT_DELETE,m as ENTRY_FILEROUTE_API_EXPORT_GET,c as ENTRY_FILEROUTE_API_EXPORT_HEAD,t as ENTRY_FILEROUTE_API_EXPORT_OPTIONS,f as ENTRY_FILEROUTE_API_EXPORT_PATCH,h as ENTRY_FILEROUTE_API_EXPORT_POST,r as ENTRY_FILEROUTE_API_EXPORT_PUT,l as ENTRY_FILEROUTE_LAYOUT,_ as ENTRY_FILEROUTE_NOT_FOUND,i as ENTRY_FILEROUTE_PROXY,a as ENTRY_FILEROUTE_ROOT,p as ENTRY_KIND_API,u as ENTRY_KIND_LAYOUT,s as ENTRY_KIND_NOT_FOUND,o as ENTRY_KIND_PAGE,e as ENTRY_KIND_PROXY,v as ENTRY_KIND_ROOT,b as ROUTE_MODULE_RE,y as WREN_NAME,n as WREN_VERSION};
@@ -1,4 +1,4 @@
1
- import { n as RouteEntry, t as RadixTrie } from "../types-B5lgdAKl.mjs";
1
+ import { n as RouteEntry, t as RadixTrie } from "../types-BMcFdUPW.mjs";
2
2
  //#region src/runtime/prerender/index.d.ts
3
3
  export declare const getPrerenderPaths: (manifest: {
4
4
  dynamicRoutes: RadixTrie<RouteEntry>;
@@ -1 +1 @@
1
- import"../constants-B3ndZB9W.mjs";import{t as e}from"../utils-li1KYQ1O.mjs";function*t(e){e.e&&(yield e.e),e.w&&(yield e.w);for(let n of Object.values(e.s))yield*t(n);e.p&&(yield*t(e.p));for(let n of e.m??[])yield*t(n.node)}const n=async(e,t,n)=>{if(e.kind!==`PAGE`)return[];let r=await Promise.all([e.module(),...e.layouts?.map(e=>e())??[]]);if(!n&&!r.some(e=>e.config?.prerender===!0))return[];if(!e.params?.length){if(!t)throw Error(`A static prerender route must have a pathname.`);return[t]}let[i]=r;if(!i.getStaticPaths)throw Error(`Prerendered route ${t} must export getStaticPaths().`);return i.getStaticPaths()},r=async(r,i=!1)=>{let{dynamicRoutes:a,staticRoutes:o={}}=r,s=await Promise.all([...Object.entries(o).map(([e,t])=>n(t,e,i)),...Array.from(t(a),e=>n(e,e.pattern,i))]);return[...new Set(s.flat().map(t=>e(t)))]};export{r as getPrerenderPaths};
1
+ import"../constants-DEZyjgyc.mjs";import{t as e}from"../utils-li1KYQ1O.mjs";function*t(e){e.e&&(yield e.e),e.w&&(yield e.w);for(let n of Object.values(e.s))yield*t(n);e.p&&(yield*t(e.p));for(let n of e.m??[])yield*t(n.node)}const n=async(e,t,n)=>{if(e.kind!==`PAGE`)return[];let r=await Promise.all([e.module(),...e.layouts?.map(e=>e())??[]]);if(!n&&!r.some(e=>e.config?.prerender===!0))return[];if(!e.params?.length){if(!t)throw Error(`A static prerender route must have a pathname.`);return[t]}let[i]=r;if(!i.getStaticPaths)throw Error(`Prerendered route ${t} must export getStaticPaths().`);return i.getStaticPaths()},r=async(r,i=!1)=>{let{dynamicRoutes:a,staticRoutes:o={}}=r,s=await Promise.all([...Object.entries(o).map(([e,t])=>n(t,e,i)),...Array.from(t(a),e=>n(e,e.pattern,i))]);return[...new Set(s.flat().map(t=>e(t)))]};export{r as getPrerenderPaths};
@@ -1,4 +1,4 @@
1
- import { a as WrenContext, i as RouteStack, r as RouteModule } from "../types-B5lgdAKl.mjs";
1
+ import { a as WrenContext, i as RouteStack, r as RouteModule } from "../types-BMcFdUPW.mjs";
2
2
  //#region src/runtime/router/index.d.ts
3
3
  export declare function matchRouteToStack<T extends RouteStack = RouteStack>(path?: string, context?: WrenContext): Promise<T | undefined> | T | undefined;
4
4
  //#endregion
@@ -51,7 +51,23 @@ declare module "virtual:wrenjs-routes" {
51
51
  //#region src/types.d.ts
52
52
  declare global {
53
53
  namespace Wren {
54
+ type ApiHandler<TParams extends RouteParams = RouteParams> = RouteApiHandler<TParams>;
55
+ type ApiParams<TParams extends RouteParams = RouteParams> = RouteApiParams<TParams>;
56
+ type Config = RouteConfig;
54
57
  interface Context {}
58
+ type GetStaticPaths = () => Promise<string[]> | string[];
59
+ type Head<TParams extends RouteParams = RouteParams, TData = unknown> = RouteHead<IntegrationHead, TParams, TData>;
60
+ type HeadProps<TParams extends RouteParams = RouteParams, TData = unknown> = RouteHeadParams<TParams, TData>;
61
+ interface Integration {}
62
+ type Layout<TData = unknown> = RouteComponent<LayoutProps<TData>, IntegrationNode>;
63
+ type LayoutProps<TData = unknown> = RouteLayoutProps<IntegrationNode, TData>;
64
+ type Loader<TReturn = unknown, TParams extends RouteParams = RouteParams> = RouteLoader<TReturn, TParams>;
65
+ type LoaderProps<TParams extends RouteParams = RouteParams> = RouteLoaderParams<TParams>;
66
+ type Page<TParams extends RouteParams = RouteParams, TData = unknown> = RouteComponent<PageProps<TParams, TData>, IntegrationNode>;
67
+ type PageProps<TParams extends RouteParams = RouteParams, TData = unknown> = RoutePageProps<TParams, TData>;
68
+ type Proxy<TParams extends RouteParams = RouteParams> = RouteProxy<TParams>;
69
+ type ProxyContext<TParams extends RouteParams = RouteParams> = RouteProxyContext<TParams>;
70
+ type ProxyNext = () => Promise<Response>;
55
71
  }
56
72
  }
57
73
  interface Entry$1 {
@@ -74,6 +90,12 @@ interface RadixTrie$1<Route = Entry$1> {
74
90
  w?: Route;
75
91
  }
76
92
  type RedirectStatus = 301 | 302 | 303 | 307 | 308;
93
+ type RouteApiHandler<TParams extends RouteParams = RouteParams> = (request: Request, route: RouteApiParams<TParams>) => Promise<Response> | Response;
94
+ interface RouteApiParams<TParams extends RouteParams = RouteParams> {
95
+ context: WrenContext;
96
+ params: TParams;
97
+ }
98
+ type RouteComponent<TProps, TNode> = (props: TProps) => Promise<TNode> | TNode;
77
99
  interface RouteConfig {
78
100
  headers?: Readonly<Record<string, string>>;
79
101
  prerender?: boolean;
@@ -87,14 +109,20 @@ interface RouteEntry {
87
109
  proxies?: (() => Promise<RouteModule>)[];
88
110
  stack: () => Promise<RouteStackModules> | RouteStackModules;
89
111
  }
90
- type RouteHead<TElement = unknown> = ({ data, params, request }: RouteHeadParams) => Promise<TElement> | TElement;
91
- interface RouteHeadParams extends RouteLoaderParams {
92
- data?: ReturnType<RouteLoader>;
112
+ type RouteHead<TElement = unknown, TParams extends RouteParams = RouteParams, TData = unknown> = ({ data, params, request }: RouteHeadParams<TParams, TData>) => Promise<TElement> | TElement;
113
+ interface RouteHeadParams<TParams extends RouteParams = RouteParams, TData = unknown> extends RouteLoaderParams<TParams> {
114
+ data?: Promise<TData>;
115
+ }
116
+ interface RouteLayoutProps<TChildren = unknown, TData = unknown> {
117
+ children?: TChildren;
118
+ context?: WrenContext;
119
+ data?: Promise<TData>;
120
+ request?: Request;
93
121
  }
94
- type RouteLoader<TDefault = unknown> = ({ params, request }: RouteLoaderParams) => Promise<TDefault>;
95
- interface RouteLoaderParams {
122
+ type RouteLoader<TReturn = unknown, TParams extends RouteParams = RouteParams> = ({ params, request }: RouteLoaderParams<TParams>) => Promise<TReturn>;
123
+ interface RouteLoaderParams<TParams extends RouteParams = RouteParams> {
96
124
  context: WrenContext;
97
- params?: Record<string, string>;
125
+ params?: TParams;
98
126
  request: Request;
99
127
  }
100
128
  interface RouteModule<TDefault = unknown, THandler = unknown, THead = unknown> {
@@ -102,7 +130,7 @@ interface RouteModule<TDefault = unknown, THandler = unknown, THead = unknown> {
102
130
  default: TDefault;
103
131
  DELETE?: THandler;
104
132
  GET?: THandler;
105
- getStaticPaths?: () => Promise<string[]> | string[];
133
+ getStaticPaths?: Wren.GetStaticPaths;
106
134
  HEAD?: THandler;
107
135
  head?: RouteHead<THead>;
108
136
  loader?: RouteLoader<TDefault>;
@@ -111,18 +139,25 @@ interface RouteModule<TDefault = unknown, THandler = unknown, THead = unknown> {
111
139
  POST?: THandler;
112
140
  PUT?: THandler;
113
141
  }
142
+ interface RoutePageProps<TParams extends RouteParams = RouteParams, TData = unknown> {
143
+ context?: WrenContext;
144
+ data?: Promise<TData>;
145
+ params?: TParams;
146
+ request?: Request;
147
+ }
148
+ type RouteParams = Record<string, string>;
114
149
  /** A `__proxy` default export. Return a `Response` to short-circuit, or nothing to continue. */
115
- type RouteProxy = (context: RouteProxyContext, next: RouteProxyNext) => Promise<Response | void> | Response | void;
116
- interface RouteProxyContext {
150
+ type RouteProxy<TParams extends RouteParams = RouteParams> = (context: RouteProxyContext<TParams>, next: RouteProxyNext) => Promise<Response | void> | Response | void;
151
+ interface RouteProxyContext<TParams extends RouteParams = RouteParams> {
117
152
  context: WrenContext;
118
- params: Record<string, string>;
153
+ params: TParams;
119
154
  redirect: (location: string | URL, status?: RedirectStatus) => Response;
120
155
  request: Request;
121
156
  /** The page URL, without the Flight request suffix. */
122
157
  url: URL;
123
158
  }
124
159
  /** Runs the inner proxies and the route handler; may be called once. */
125
- type RouteProxyNext = () => Promise<Response>;
160
+ type RouteProxyNext = Wren.ProxyNext;
126
161
  interface RouteStack<TModule extends RouteModule = RouteModule, TLayout extends RouteModule = RouteModule, TProxy extends RouteModule = RouteModule<RouteProxy>> {
127
162
  context: WrenContext;
128
163
  kind: "API" | "NOT_FOUND" | "PAGE";
@@ -133,5 +168,11 @@ interface RouteStack<TModule extends RouteModule = RouteModule, TLayout extends
133
168
  }
134
169
  type RouteStackModules = Pick<Required<RouteStack>, "layouts" | "module" | "proxies">;
135
170
  type WrenContext = Wren.Context;
171
+ type IntegrationHead = Wren.Integration extends {
172
+ head: infer THead;
173
+ } ? THead : IntegrationNode;
174
+ type IntegrationNode = Wren.Integration extends {
175
+ node: infer TNode;
176
+ } ? TNode : unknown;
136
177
  //#endregion
137
178
  export { WrenContext as a, RouteStack as i, RouteEntry as n, RouteModule as r, RadixTrie$1 as t };
package/dist/types.d.ts CHANGED
@@ -8,7 +8,39 @@ import "./virtual-wrenjs-routes.d.ts";
8
8
 
9
9
  declare global {
10
10
  namespace Wren {
11
+ type ApiHandler<TParams extends RouteParams = RouteParams> = RouteApiHandler<TParams>;
12
+ type ApiParams<TParams extends RouteParams = RouteParams> = RouteApiParams<TParams>;
13
+ type Config = RouteConfig;
11
14
  interface Context {}
15
+ type GetStaticPaths = () => Promise<string[]> | string[];
16
+ type Head<TParams extends RouteParams = RouteParams, TData = unknown> = RouteHead<
17
+ IntegrationHead,
18
+ TParams,
19
+ TData
20
+ >;
21
+ type HeadProps<TParams extends RouteParams = RouteParams, TData = unknown> = RouteHeadParams<
22
+ TParams,
23
+ TData
24
+ >;
25
+ interface Integration {}
26
+ type Layout<TData = unknown> = RouteComponent<LayoutProps<TData>, IntegrationNode>;
27
+ type LayoutProps<TData = unknown> = RouteLayoutProps<IntegrationNode, TData>;
28
+ type Loader<TReturn = unknown, TParams extends RouteParams = RouteParams> = RouteLoader<
29
+ TReturn,
30
+ TParams
31
+ >;
32
+ type LoaderProps<TParams extends RouteParams = RouteParams> = RouteLoaderParams<TParams>;
33
+ type Page<TParams extends RouteParams = RouteParams, TData = unknown> = RouteComponent<
34
+ PageProps<TParams, TData>,
35
+ IntegrationNode
36
+ >;
37
+ type PageProps<TParams extends RouteParams = RouteParams, TData = unknown> = RoutePageProps<
38
+ TParams,
39
+ TData
40
+ >;
41
+ type Proxy<TParams extends RouteParams = RouteParams> = RouteProxy<TParams>;
42
+ type ProxyContext<TParams extends RouteParams = RouteParams> = RouteProxyContext<TParams>;
43
+ type ProxyNext = () => Promise<Response>;
12
44
  }
13
45
  }
14
46
 
@@ -72,7 +104,17 @@ export interface RoutableEntry {
72
104
  routes: Entry[];
73
105
  }
74
106
 
75
- export type RouteApiParams = Pick<RouteStack, "context" | "params">;
107
+ export type RouteApiHandler<TParams extends RouteParams = RouteParams> = (
108
+ request: Request,
109
+ route: RouteApiParams<TParams>,
110
+ ) => Promise<Response> | Response;
111
+
112
+ export interface RouteApiParams<TParams extends RouteParams = RouteParams> {
113
+ context: WrenContext;
114
+ params: TParams;
115
+ }
116
+
117
+ export type RouteComponent<TProps, TNode> = (props: TProps) => Promise<TNode> | TNode;
76
118
 
77
119
  export interface RouteConfig {
78
120
  headers?: Readonly<Record<string, string>>;
@@ -90,24 +132,34 @@ export interface RouteEntry {
90
132
  stack: () => Promise<RouteStackModules> | RouteStackModules;
91
133
  }
92
134
 
93
- export type RouteHead<TElement = unknown> = ({
94
- data,
95
- params,
96
- request,
97
- }: RouteHeadParams) => Promise<TElement> | TElement;
135
+ export type RouteHead<
136
+ TElement = unknown,
137
+ TParams extends RouteParams = RouteParams,
138
+ TData = unknown,
139
+ > = ({ data, params, request }: RouteHeadParams<TParams, TData>) => Promise<TElement> | TElement;
140
+
141
+ export interface RouteHeadParams<
142
+ TParams extends RouteParams = RouteParams,
143
+ TData = unknown,
144
+ > extends RouteLoaderParams<TParams> {
145
+ data?: Promise<TData>;
146
+ }
98
147
 
99
- export interface RouteHeadParams extends RouteLoaderParams {
100
- data?: ReturnType<RouteLoader>;
148
+ export interface RouteLayoutProps<TChildren = unknown, TData = unknown> {
149
+ children?: TChildren;
150
+ context?: WrenContext;
151
+ data?: Promise<TData>;
152
+ request?: Request;
101
153
  }
102
154
 
103
- export type RouteLoader<TDefault = unknown> = ({
155
+ export type RouteLoader<TReturn = unknown, TParams extends RouteParams = RouteParams> = ({
104
156
  params,
105
157
  request,
106
- }: RouteLoaderParams) => Promise<TDefault>;
158
+ }: RouteLoaderParams<TParams>) => Promise<TReturn>;
107
159
 
108
- export interface RouteLoaderParams {
160
+ export interface RouteLoaderParams<TParams extends RouteParams = RouteParams> {
109
161
  context: WrenContext;
110
- params?: Record<string, string>;
162
+ params?: TParams;
111
163
  request: Request;
112
164
  }
113
165
 
@@ -117,7 +169,7 @@ export interface RouteModule<TDefault = unknown, THandler = unknown, THead = unk
117
169
  DELETE?: THandler;
118
170
  GET?: THandler;
119
171
 
120
- getStaticPaths?: () => Promise<string[]> | string[];
172
+ getStaticPaths?: Wren.GetStaticPaths;
121
173
  HEAD?: THandler;
122
174
  head?: RouteHead<THead>;
123
175
  loader?: RouteLoader<TDefault>;
@@ -127,15 +179,24 @@ export interface RouteModule<TDefault = unknown, THandler = unknown, THead = unk
127
179
  PUT?: THandler;
128
180
  }
129
181
 
182
+ export interface RoutePageProps<TParams extends RouteParams = RouteParams, TData = unknown> {
183
+ context?: WrenContext;
184
+ data?: Promise<TData>;
185
+ params?: TParams;
186
+ request?: Request;
187
+ }
188
+
189
+ export type RouteParams = Record<string, string>;
190
+
130
191
  /** A `__proxy` default export. Return a `Response` to short-circuit, or nothing to continue. */
131
- export type RouteProxy = (
132
- context: RouteProxyContext,
192
+ export type RouteProxy<TParams extends RouteParams = RouteParams> = (
193
+ context: RouteProxyContext<TParams>,
133
194
  next: RouteProxyNext,
134
195
  ) => Promise<Response | void> | Response | void;
135
196
 
136
- export interface RouteProxyContext {
197
+ export interface RouteProxyContext<TParams extends RouteParams = RouteParams> {
137
198
  context: WrenContext;
138
- params: Record<string, string>;
199
+ params: TParams;
139
200
  redirect: (location: string | URL, status?: RedirectStatus) => Response;
140
201
  request: Request;
141
202
  /** The page URL, without the Flight request suffix. */
@@ -143,7 +204,7 @@ export interface RouteProxyContext {
143
204
  }
144
205
 
145
206
  /** Runs the inner proxies and the route handler; may be called once. */
146
- export type RouteProxyNext = () => Promise<Response>;
207
+ export type RouteProxyNext = Wren.ProxyNext;
147
208
 
148
209
  export interface RouteStack<
149
210
  TModule extends RouteModule = RouteModule,
@@ -162,4 +223,8 @@ export type RouteStackModules = Pick<Required<RouteStack>, "layouts" | "module"
162
223
 
163
224
  export type WrenContext = Wren.Context;
164
225
 
226
+ type IntegrationHead = Wren.Integration extends { head: infer THead } ? THead : IntegrationNode;
227
+
228
+ type IntegrationNode = Wren.Integration extends { node: infer TNode } ? TNode : unknown;
229
+
165
230
  export type { fetch } from "virtual:wrenjs-fetch";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wren-js/core",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Framework agnostic utilities for the wrenjs meta-framework",
5
5
  "keywords": [
6
6
  "@wren-js/core",