@wren-js/core 0.2.0 → 0.3.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-D0iDClSp.mjs";import{c as f,d as p,l as m,n as h,s as g,u as _}from"./constants-BzbcwnVj.mjs";import{CONFIG_VALID_EXTENSIONS as v,DEFAULTS as y}from"./config.mjs";import{t as b}from"./utils-0wezGh38.mjs";import{existsSync as ee}from"node:fs";import{basename as te,dirname as ne,extname as re,isAbsolute as x,join as S,relative as C,resolve as w}from"node:path";import T from"node:process";import{parseArgs as ie}from"node:util";import{Visitor as ae,createBuilder as oe,createServer as se,defineConfig as ce,isCSSRequest as le,loadConfigFromFile as ue,mergeConfig as E,normalizePath as D,parseSync as O}from"vite";import{mkdir as de,readFile as k,readdir as A,rm as fe,writeFile as pe}from"node:fs/promises";import{pathToFileURL as me}from"node:url";const j=e=>e.split(`
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-DM1Ep_tv.mjs";import{c as f,d as p,l as m,n as h,s as g,u as _}from"./constants-BzbcwnVj.mjs";import{CONFIG_VALID_EXTENSIONS as v,DEFAULTS as y}from"./config.mjs";import{t as b}from"./utils-0wezGh38.mjs";import{existsSync as ee}from"node:fs";import{basename as te,dirname as ne,extname as re,isAbsolute as x,join as S,relative as C,resolve as w}from"node:path";import T from"node:process";import{parseArgs as ie}from"node:util";import{Visitor as ae,createBuilder as oe,createServer as se,defineConfig as ce,isCSSRequest as le,loadConfigFromFile as ue,mergeConfig as E,normalizePath as D,parseSync as O}from"vite";import{mkdir as de,readFile as k,readdir as A,rm as fe,writeFile as pe}from"node:fs/promises";import{pathToFileURL as me}from"node:url";const j=e=>e.split(`
2
2
  `).length-1,he=(e,t,n,r)=>{let i=j(e.slice(t,n))-j(r);return{end:n,start:t,text:i>0?r+`
3
3
  `.repeat(i):r}},ge=(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)},_e=/^(?:[a-z][a-z\d+.-]*:|\/\/)/i,M=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},N=({value:e})=>{if(e?.type===`Literal`)return e.value;if(e?.type===`JSXExpressionContainer`)return M(e.expression)},ve=(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=N(r)),n.kept.push(t))}return n},ye=({key:e})=>e.type===`Identifier`?e.name:e.type===`Literal`?e.value:null,be=({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||ye(e)!==`__html`)continue;let t=M(e.value);return t===void 0?void 0:[t,e.value.start+1]}},xe=(e,t)=>{if(t)return be(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=M(r.expression);return i===void 0?void 0:[i,r.expression.start+1]},Se=({name:e})=>e.type===`JSXIdentifier`&&e.name===`script`,P=(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}=ve(e,t.openingElement),u=c&&N(c),d=u!==void 0&&!_e.test(u);if(l!==`module`){d&&p.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 m=xe(t,i);if(!m){r.push(`<script type="module"> content must be a static string to be bundled.`);return}let[h,g]=m;h.trim()!==``&&n.push({...f,code:h,codeStart:g,index:o++,kind:`inline`})};return new ae({JSXElement(e){c(e),Se(e.openingElement)&&l(e)},JSXFragment:c}).visit(a),{scripts:n,warnings:r}},F=`virtual:${d}-page-scripts`,I=`__wrenPageScripts`,L=`${F}:route:`,R=`\0${L}`,z=`\0${g}`,B=/\?wren-script=(\d+)\.ts$/,V=`__wren-page-scripts.mjs`,H=`\0${f}`,U=(e,t)=>{let n=D(C(e,t));return n.startsWith(`../`)||x(n)?`@fs/${D(t).replace(/^\//,``)}`:n},W=e=>Object.fromEntries(e.toSorted(([e],[t])=>e<t?-1:1)),G=e=>te(e,re(e)),Ce=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:`${G(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:G(i.id)}},we=async(e,t,n)=>{let r=await k(t,`utf8`),i=P(r,t).scripts.find(e=>e.kind===`inline`&&e.index===n);return i?.kind===`inline`?{code:`
4
4
  `.repeat(j(r.slice(0,i.codeStart)))+i.code,map:null}:e.error(`Inline page script #${n} not found in ${t}.`)},Te=e=>{let t=/* @__PURE__ */ new Map,n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Map,i=/* @__PURE__ */ new Map,a=/* @__PURE__ */ new Map,o=/* @__PURE__ */ new Map,s,c=[],l=(e,n)=>{let r=U(e,n.id),i=t.get(r)??{...n,key:r};return t.set(r,i),i},u=(e,t)=>{let n=/* @__PURE__ */ new Set,a=/* @__PURE__ */ new Set,o=e=>{if(!a.has(e)){a.add(e);for(let t of r.get(e)??[])n.add(t);for(let t of i.get(e)?.values()??[])for(let e of t)n.add(e);for(let n of t(e))o(n)}};return o(e),[...n]},m=async(e,t,n,i)=>{let{scripts:a,warnings:o}=P(t,n),s=a.map(({end:e,replacement:n,start:r})=>he(t,r,e,n));if(!i)return s;for(let t of o)e.warn(t);let c=await Promise.all(a.map(t=>Ce(e,t,n))),{root:u}=e.environment.config;return r.set(n,c.flatMap(e=>e?[l(u,e)]:[])),s.filter((e,t)=>c[t])},v=(e,t,n)=>{if(!n)return`\nexport const ${h} = async () => (await import(${JSON.stringify(L+encodeURIComponent(e))})).default;\n`;let r=U(t,e);return a.set(e,r),`\nimport ${I} from ${JSON.stringify(F)};export const ${h} = () => ${I}.routes[${JSON.stringify(r)}];\n`},y=(e,t)=>{let n=u(t,t=>c.flatMap(({moduleGraph:n})=>{let r=n.getModuleById(t);return r?.file&&x(r.file)&&e.addWatchFile(r.file),Array.from(r?.importedModules??[],e=>e.id).filter(e=>e!==null&&!le(e))})),{base:r}=e.environment.config;return`export default ${JSON.stringify(n.map(e=>r+e.key))};`};return{buildApp:{async handler(e){let r=[...t.values()],i=r.filter(e=>!e.url).map(e=>e.key);if(i.length>0)throw Error(`[${d}] Page scripts were not bundled by the client environment (server environments must build first): ${i.join(`, `)}`);let s={routes:W(Array.from(a,([e,t])=>[t,u(e,e=>o.get(e)??[]).map(e=>e.url)])),scripts:W(r.map(e=>[e.key,e.url]))},c=`export default ${JSON.stringify(s)};\n`;await Promise.all([...n].map(async t=>{let{build:n,root:r}=e.environments[t].config;await pe(w(r,n.outDir,V),c)}))},order:`post`},buildEnd(){if(this.environment.mode===`build`)for(let e of this.getModuleIds()){let t=this.getModuleInfo(e);if(!t)continue;let n=[...t.importedIds,...t.dynamicallyImportedIds];o.set(e,[...o.get(e)??[],...n])}},buildStart(){let{mode:e,name:n}=this.environment;if(e===`build`&&n===`client`)for(let e of t.values())e.reference=this.emitFile({id:e.id,name:`scripts/${e.name}`,preserveSignature:`exports-only`,type:`chunk`})},configResolved(t){s=`${D(w(t.root,e))}/`},configureServer(e){c=Object.values(e.environments)},enforce:`pre`,generateBundle(){if(this.environment.name!==`client`)return;let{base:e}=this.environment.config;for(let n of t.values())n.reference&&(n.url=e+this.getFileName(n.reference))},load:{filter:{id:[B,RegExp(`^${H}`),RegExp(`^${R}`),RegExp(`^${z}$`)]},async handler(e){let{config:t,mode:n}=this.environment;if(e===z)return`export {};`;if(e.startsWith(H)){let r=e.slice(H.length),{key:i}=l(t.root,{id:r,name:G(r)});return n===`build`?`import ${I} from ${JSON.stringify(F)};export default ${I}.scripts[${JSON.stringify(i)}];`:`export default ${JSON.stringify(t.base+i)};`}if(e.startsWith(R))return y(this,decodeURIComponent(e.slice(R.length)));let r=B.exec(e);return r?we(this,e.slice(0,r.index),Number(r[1])):null}},name:`${d}-page-scripts`,renderChunk(e,t){if(!e.includes(F))return null;this.environment.config.build.write&&n.add(this.environment.name);let r=D(C(ne(t.fileName),V)),i=r.startsWith(`.`)?r:`./${r}`;return{code:e.replaceAll(F,i),map:null}},resolveId:{filter:{id:RegExp(`^(?:${g}|${f}|${F})`)},async handler(e,t){if(e.startsWith(`virtual:wrenjs-hoist:`)){if(t&&this.environment.config.consumer===`server`){let n=await this.resolve(e.slice(g.length),t);if(!n?.id.startsWith(H))return this.error(`"${e}" must resolve to a Wren page script (${t}).`);let r=n.id.slice(H.length),a=l(this.environment.config.root,{id:r,name:G(r)}),o=i.get(t)??/* @__PURE__ */ new Map,s=o.get(this.environment.name)??/* @__PURE__ */ new Set;i.set(t,o.set(this.environment.name,s.add(a)))}return z}return e.startsWith(`virtual:wrenjs-script-url:`)||e.startsWith(L)?`\0${e}`:e===F?{external:!0,id:e}:null}},sharedDuringBuild:!0,transform:{filter:{id:p},async handler(e,t){let{config:n,mode:a}=this.environment,o=n.consumer===`server`,c=o&&t.startsWith(s)&&_.test(t),l=e.includes(`<script`)?await m(this,e,t,o):[];if(l.length===0&&r.delete(t),i.get(t)?.delete(this.environment.name),l.length===0&&!c)return null;let u=c?v(t,n.root,a===`build`):``;return{code:ge(e,l)+u,map:null}}}}},Ee=/<link\b(?=[^>]*\srel="stylesheet")(?![^>]*\s(?:disabled|media)\b)[^>]*\shref="([^"]+)"[^>]*>/gi,De=/\sdata-precedence="[^"]*"/i,Oe=/<\/(style)/gi,ke=(e,t,n,r)=>{for(let i of Object.values(e)){if(i.type!==`asset`||!i.fileName.endsWith(`.css`))continue;let e=Buffer.from(i.source);e.byteLength<n&&r.set(t+i.fileName,e.toString().replace(Oe,`<\\/$1`))}},Ae=(e,t)=>{let n=e.indexOf(`</head>`);return n===-1&&(n=e.length),e.slice(0,n).replace(Ee,(e,n)=>{let r=t.get(n);if(r===void 0)return e;let i=De.exec(e)?.[0]??``,a=`<style data-href="${n}"${i}>${r}</style>`;return i?`${a}<link disabled type="text/x-inlined"${e.slice(5)}`:a})+e.slice(n)},je=async(e,t,n=`http://localhost`,r=!1,i=/* @__PURE__ */ new Map)=>{let a=new URL(n);if(!/^https?:$/.test(a.protocol)||a.href!==`${a.origin}/`)throw Error(`build.prerender.origin must be an HTTP(S) origin.`);let o=/* @__PURE__ */ new Set,s=/* @__PURE__ */ new Set,c=async({pathname:e,response:n})=>{let r=b(e);if(n.status!==200)throw Error(`Cannot prerender ${r}: HTTP ${n.status}.`);let a=n.headers.get(`content-type`)?.startsWith(`text/html`),c=a?S(r.slice(1),`index.html`):r.slice(1);if(o.has(r)||s.has(c))throw Error(`Conflicting prerender artifact: ${r}.`);o.add(r),s.add(c);let l=S(t,c);await de(ne(l),{recursive:!0}),await pe(l,a&&i.size>0?Ae(await n.text(),i):new Uint8Array(await n.arrayBuffer()))},l=0;return await Promise.all(e.map(async e=>{let t=await e.getPaths(r);await Promise.all(t.map(async t=>{let n=b(t);if(o.has(n))throw Error(`Multiple prerender providers claim ${n}.`);let r=await e.render(new Request(new URL(n,a)));if(await Promise.all(r.map(c)),!o.has(n))throw Error(`Prerender renderer did not return ${n}.`);l++}))})),l},Me=e=>{let t=e.integrations?.flatMap(({prerender:e})=>e?[{...e,output:``,reference:``}]:[])??[],n=e.build?.inlineCSS,r=n===!0?1/0:n||0,i=/* @__PURE__ */ new Map;return{apply:`build`,buildApp:{async handler(n){if(!t.length)return;let r=await Promise.all(t.map(async({environment:e,output:t})=>{if(!t)throw Error(`No prerender entry was built for ${e}.`);return import(
@@ -1 +1 @@
1
- import"./constants-BzbcwnVj.mjs";var e=`0.2.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
+ import"./constants-BzbcwnVj.mjs";var e=`0.3.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-D0iDClSp.mjs";import{u as b}from"./constants-BzbcwnVj.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-DM1Ep_tv.mjs";import{u as b}from"./constants-BzbcwnVj.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-NFDT2hyY.mjs";
1
+ import { n as RouteEntry, t as RadixTrie } from "../types-22Kbdbsg.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-D0iDClSp.mjs";import{t as e}from"../utils-0wezGh38.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-DM1Ep_tv.mjs";import{t as e}from"../utils-0wezGh38.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 { i as RouteStack, r as RouteModule } from "../types-NFDT2hyY.mjs";
1
+ import { i as RouteStack, r as RouteModule } from "../types-22Kbdbsg.mjs";
2
2
  //#region src/runtime/router/index.d.ts
3
3
  export declare function matchRouteToStack<T extends RouteStack = RouteStack>(path?: string): Promise<T | undefined> | T | undefined;
4
4
  //#endregion
@@ -80,18 +80,23 @@ interface RouteEntry {
80
80
  proxies?: (() => Promise<RouteModule>)[];
81
81
  stack: () => Promise<RouteStackModules> | RouteStackModules;
82
82
  }
83
+ type RouteHead<TElement = unknown> = ({ data, params, request }: RouteHeadParams) => Promise<TElement> | TElement;
84
+ interface RouteHeadParams extends RouteLoaderParams {
85
+ data?: ReturnType<RouteLoader>;
86
+ }
83
87
  type RouteLoader<TDefault = unknown> = ({ params, request }: RouteLoaderParams) => Promise<TDefault>;
84
88
  interface RouteLoaderParams {
85
89
  params?: Record<string, string>;
86
90
  request: Request;
87
91
  }
88
- interface RouteModule<TDefault = unknown, THandler = unknown> {
92
+ interface RouteModule<TDefault = unknown, THandler = unknown, THead = unknown> {
89
93
  config?: RouteConfig;
90
94
  default: TDefault;
91
95
  DELETE?: THandler;
92
96
  GET?: THandler;
93
97
  getStaticPaths?: () => Promise<string[]> | string[];
94
98
  HEAD?: THandler;
99
+ head?: RouteHead<THead>;
95
100
  loader?: RouteLoader<TDefault>;
96
101
  OPTIONS?: THandler;
97
102
  PATCH?: THandler;
package/dist/types.d.ts CHANGED
@@ -79,6 +79,16 @@ export interface RouteEntry {
79
79
  stack: () => Promise<RouteStackModules> | RouteStackModules;
80
80
  }
81
81
 
82
+ export type RouteHead<TElement = unknown> = ({
83
+ data,
84
+ params,
85
+ request,
86
+ }: RouteHeadParams) => Promise<TElement> | TElement;
87
+
88
+ export interface RouteHeadParams extends RouteLoaderParams {
89
+ data?: ReturnType<RouteLoader>;
90
+ }
91
+
82
92
  export type RouteLoader<TDefault = unknown> = ({
83
93
  params,
84
94
  request,
@@ -89,7 +99,7 @@ export interface RouteLoaderParams {
89
99
  request: Request;
90
100
  }
91
101
 
92
- export interface RouteModule<TDefault = unknown, THandler = unknown> {
102
+ export interface RouteModule<TDefault = unknown, THandler = unknown, THead = unknown> {
93
103
  config?: RouteConfig;
94
104
  default: TDefault;
95
105
  DELETE?: THandler;
@@ -97,6 +107,7 @@ export interface RouteModule<TDefault = unknown, THandler = unknown> {
97
107
 
98
108
  getStaticPaths?: () => Promise<string[]> | string[];
99
109
  HEAD?: THandler;
110
+ head?: RouteHead<THead>;
100
111
  loader?: RouteLoader<TDefault>;
101
112
  OPTIONS?: THandler;
102
113
  PATCH?: THandler;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wren-js/core",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Framework agnostic utilities for the wrenjs meta-framework",
5
5
  "keywords": [
6
6
  "@wren-js/core",