@stacksjs/actions 0.70.77 → 0.70.79

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/blog.d.ts CHANGED
@@ -3,6 +3,12 @@
3
3
  * non-blog paths. Handles the listing, posts, the RSS feed, and the sitemap.
4
4
  */
5
5
  export declare function renderBlog(req: Request): Promise<Response | null>;
6
+ /*.md` frontmatter with NO BunPress dependency, so they work in
7
+ * dev and production alike. Returns null for any non-feed path (the stx page
8
+ * layer then handles /blog and /blog/<slug>). Absolute URLs use the configured
9
+ * site url (blog config), never the loopback request origin.
10
+ */
11
+ export declare function renderBlogFeed(req: Request): Promise<Response | null>;
6
12
  /**
7
13
  * Build the blog to a static directory the same way /docs is built (see
8
14
  * config/cloud.ts). Emits clean-URL pages (`<slug>/index.html`), the listing,
package/dist/blog.js CHANGED
@@ -1,9 +1,9 @@
1
1
  // @bun
2
- import"./chunk-v0hqskdk.js";import{existsSync as x,mkdirSync as C,readdirSync as n,readFileSync as y,writeFileSync as c}from"fs";import{homedir as b}from"os";import{join as B}from"path";var M=B(process.cwd(),"content/blog"),E=B(M,".theme.css"),X={title:"The Stacks Blog",description:"Notes from building a full-stack TypeScript framework whose only dependencies are TypeScript and Bun.",siteTitle:"Stacks Blog",author:"The Stacks Team",url:"https://stacksjs.com",nav:[{text:"Blog",link:"/blog"},{text:"Docs",link:"/docs"},{text:"GitHub",link:"https://github.com/stacksjs/stacks"}],themes:["colored","light","dark"],defaultTheme:"colored",colophon:'Built with Stacks \xB7 TypeScript &amp; Bun \xB7 <a href="/blog/feed.xml">RSS</a>',emptyTitle:"No posts yet",emptyText:"The first one is in the works. Leave your email and it will land in your inbox the moment it ships."},I=null;function k(){if(!I)I=(async()=>{try{let z=(await import(B(process.cwd(),"config/blog.ts"))).default??{},J={...X,...z};if(!z.siteTitle&&z.title)J.siteTitle=z.title;return J}catch{return X}})();return I}var O=null;async function S(){if(!O)O=(async()=>{let G=[B(b(),"Code/Tools/bunpress/packages/bunpress/dist/src/index.js"),B(process.cwd(),"pantry/@stacksjs/bunpress/dist/src/index.js"),"@stacksjs/bunpress"];for(let z of G)try{if(z.startsWith("@")||x(z))return await import(z)}catch{}return null})();return O}function $(G){return String(G).replace(/[&<>"]/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[z])}function L(G){return String(G).replace(/[&<>"']/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[z])}function U(G,z){return`${G.replace(/\/$/,"")}/blog/${z}`}function o(G){if(!G)return"";let z=new Date(G);return Number.isNaN(z.getTime())?G:z.toUTCString()}async function i(G){let z=await k(),J=G||z.url,W=A().slice(0,50).map((Z)=>{let V=U(J,Z.slug);return` <item>
2
+ import"./chunk-v0hqskdk.js";import{existsSync as R,mkdirSync as C,readdirSync as b,readFileSync as X,writeFileSync as o}from"fs";import{homedir as i}from"os";import{join as B}from"path";var M=B(process.cwd(),"content/blog"),E=B(M,".theme.css"),y={title:"The Stacks Blog",description:"Notes from building a full-stack TypeScript framework whose only dependencies are TypeScript and Bun.",siteTitle:"Stacks Blog",author:"The Stacks Team",url:"https://stacksjs.com",nav:[{text:"Blog",link:"/blog"},{text:"Docs",link:"/docs"},{text:"GitHub",link:"https://github.com/stacksjs/stacks"}],themes:["colored","light","dark"],defaultTheme:"colored",colophon:'Built with Stacks \xB7 TypeScript &amp; Bun \xB7 <a href="/blog/feed.xml">RSS</a>',emptyTitle:"No posts yet",emptyText:"The first one is in the works. Leave your email and it will land in your inbox the moment it ships."},q=null;function w(){if(!q)q=(async()=>{try{let z=(await import(B(process.cwd(),"config/blog.ts"))).default??{},J={...y,...z};if(!z.siteTitle&&z.title)J.siteTitle=z.title;return J}catch{return y}})();return q}var O=null;async function U(){if(!O)O=(async()=>{let G=[B(i(),"Code/Tools/bunpress/packages/bunpress/dist/src/index.js"),B(process.cwd(),"pantry/@stacksjs/bunpress/dist/src/index.js"),"@stacksjs/bunpress"];for(let z of G)try{if(z.startsWith("@")||R(z))return await import(z)}catch{}return null})();return O}function $(G){return String(G).replace(/[&<>"]/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[z])}function L(G){return String(G).replace(/[&<>"']/g,(z)=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[z])}function S(G,z){return`${G.replace(/\/$/,"")}/blog/${z}`}function r(G){if(!G)return"";let z=new Date(G);return Number.isNaN(z.getTime())?G:z.toUTCString()}async function H(G){let z=await w(),J=G||z.url,W=x().slice(0,50).map((Z)=>{let V=S(J,Z.slug);return` <item>
3
3
  <title>${L(Z.fm.title||Z.slug)}</title>
4
4
  <link>${L(V)}</link>
5
5
  <guid>${L(V)}</guid>
6
- <pubDate>${L(o(Z.fm.date))}</pubDate>
6
+ <pubDate>${L(r(Z.fm.date))}</pubDate>
7
7
  <description>${L(Z.fm.description||"")}</description>
8
8
  </item>`}).join(`
9
9
  `);return`<?xml version="1.0" encoding="UTF-8"?>
@@ -14,12 +14,12 @@ import"./chunk-v0hqskdk.js";import{existsSync as x,mkdirSync as C,readdirSync as
14
14
  <description>${L(z.description)}</description>
15
15
  ${W}
16
16
  </channel>
17
- </rss>`}async function r(G){let z=await k(),J=G||z.url;return`<?xml version="1.0" encoding="UTF-8"?>
17
+ </rss>`}async function h(G){let z=await w(),J=G||z.url;return`<?xml version="1.0" encoding="UTF-8"?>
18
18
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
19
- ${[`${J}/blog`,...A().map((W)=>U(J,W.slug))].map((W)=>` <url><loc>${L(W)}</loc></url>`).join(`
19
+ ${[`${J}/blog`,...x().map((W)=>S(J,W.slug))].map((W)=>` <url><loc>${L(W)}</loc></url>`).join(`
20
20
  `)}
21
21
  </urlset>`}function m(G){let z=G.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);if(!z)return{data:{},body:G};let J={},Y=z[1]??"";for(let W of Y.split(`
22
- `)){let Z=W.indexOf(":");if(Z===-1)continue;let V=W.slice(0,Z).trim(),Q=W.slice(Z+1).trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))Q=Q.slice(1,-1);J[V]=Q}return{data:J,body:z[2]??""}}function h(G){if(!G)return"";let z=new Date(G);if(Number.isNaN(z.getTime()))return G;return`${["January","February","March","April","May","June","July","August","September","October","November","December"][z.getUTCMonth()]} ${z.getUTCDate()}, ${z.getUTCFullYear()}`}var P={colored:{label:"Park theme",glyph:"\uD83C\uDF32"},light:{label:"Light theme",glyph:"\u2600"},dark:{label:"Dark theme",glyph:"\uD83C\uDF19"}};async function F(){let G=await k(),z=G.themes.length?G.themes:X.themes,J=z.includes(G.defaultTheme)?G.defaultTheme:z[0],Y=z.map((Z)=>`<button type="button" data-t="${Z}" title="${P[Z].label}" aria-label="${P[Z].label}" onclick="stxBlogTheme('${Z}')">${P[Z].glyph}</button>`).join(`
22
+ `)){let Z=W.indexOf(":");if(Z===-1)continue;let V=W.slice(0,Z).trim(),Q=W.slice(Z+1).trim();if(Q.startsWith('"')&&Q.endsWith('"')||Q.startsWith("'")&&Q.endsWith("'"))Q=Q.slice(1,-1);J[V]=Q}return{data:J,body:z[2]??""}}function T(G){if(!G)return"";let z=new Date(G);if(Number.isNaN(z.getTime()))return G;return`${["January","February","March","April","May","June","July","August","September","October","November","December"][z.getUTCMonth()]} ${z.getUTCDate()}, ${z.getUTCFullYear()}`}var P={colored:{label:"Park theme",glyph:"\uD83C\uDF32"},light:{label:"Light theme",glyph:"\u2600"},dark:{label:"Dark theme",glyph:"\uD83C\uDF19"}};async function D(){let G=await w(),z=G.themes.length?G.themes:y.themes,J=z.includes(G.defaultTheme)?G.defaultTheme:z[0],Y=z.map((Z)=>`<button type="button" data-t="${Z}" title="${P[Z].label}" aria-label="${P[Z].label}" onclick="stxBlogTheme('${Z}')">${P[Z].glyph}</button>`).join(`
23
23
  `),W=z.length>1?`<div class="blog-theme-toggle" role="group" aria-label="Theme">
24
24
  ${Y}
25
25
  </div>`:"";return`<script>
@@ -52,45 +52,45 @@ ${[`${J}/blog`,...A().map((W)=>U(J,W.slug))].map((W)=>` <url><loc>${L(W)}</loc>
52
52
  }
53
53
  })()
54
54
  </script>
55
- ${W}`}async function D(){return`<div class="blog-landscape" aria-hidden="true">
55
+ ${W}`}async function F(){return`<div class="blog-landscape" aria-hidden="true">
56
56
  <span class="ridge"></span>
57
57
  <span class="river"></span>
58
- <p class="colophon">${(await k()).colophon}</p>
59
- </div>`}async function w(G,z){let J=await k(),Y=x(E)?y(E,"utf-8"):"",W=G.defaultConfig.markdown?.css||"";return{...G.defaultConfig,title:z.title||J.title,description:z.description||J.description,docsDir:M,theme:"vitepress",markdown:{...G.defaultConfig.markdown,css:`${W}
60
- ${Y}`},themeConfig:{siteTitle:J.siteTitle,nav:J.nav}}}function A(){if(!x(M))return[];return n(M).filter((G)=>G.endsWith(".md")).map((G)=>{let{data:z}=m(y(B(M,G),"utf-8"));return{slug:G.replace(/\.md$/,""),fm:z}}).filter((G)=>!!G.fm.title&&!!G.fm.date).sort((G,z)=>{let J=G.fm.featured==="true"?1:0,Y=z.fm.featured==="true"?1:0;if(J!==Y)return Y-J;return(z.fm.date||"").localeCompare(G.fm.date||"")})}async function l(G){return G.wrapInLayout(await F()+`
58
+ <p class="colophon">${(await w()).colophon}</p>
59
+ </div>`}async function v(G,z){let J=await w(),Y=R(E)?X(E,"utf-8"):"",W=G.defaultConfig.markdown?.css||"";return{...G.defaultConfig,title:z.title||J.title,description:z.description||J.description,docsDir:M,theme:"vitepress",markdown:{...G.defaultConfig.markdown,css:`${W}
60
+ ${Y}`},themeConfig:{siteTitle:J.siteTitle,nav:J.nav}}}function x(){if(!R(M))return[];return b(M).filter((G)=>G.endsWith(".md")).map((G)=>{let{data:z}=m(X(B(M,G),"utf-8"));return{slug:G.replace(/\.md$/,""),fm:z}}).filter((G)=>!!G.fm.title&&!!G.fm.date).sort((G,z)=>{let J=G.fm.featured==="true"?1:0,Y=z.fm.featured==="true"?1:0;if(J!==Y)return Y-J;return(z.fm.date||"").localeCompare(G.fm.date||"")})}async function l(G){return G.wrapInLayout(await D()+`
61
61
  <a class="blog-back" href="/blog">\u2190 All posts</a>
62
62
  <div class="blog-404">
63
63
  <span class="blog-404-art" aria-hidden="true"></span>
64
64
  <h1>Nothing here</h1>
65
65
  <p>This post doesn't exist (or it moved). Head back to <a href="/blog">all posts</a>.</p>
66
- </div>`+await D(),await w(G,{title:"Not found"}),"/blog","page")}async function H(G,z,J){let Y=await k(),W=B(M,`${z}.md`);if(!x(W))return null;let Z=y(W,"utf-8"),{html:V,frontmatter:Q}=await G.markdownToHtml(Z,M);if(!Q.title||!Q.date)return null;let K=Q.author||Y.author,v=$(K.charAt(0).toUpperCase()),R=`
66
+ </div>`+await F(),await v(G,{title:"Not found"}),"/blog","page")}async function u(G,z,J){let Y=await w(),W=B(M,`${z}.md`);if(!R(W))return null;let Z=X(W,"utf-8"),{html:V,frontmatter:Q}=await G.markdownToHtml(Z,M);if(!Q.title||!Q.date)return null;let K=Q.author||Y.author,k=$(K.charAt(0).toUpperCase()),j=`
67
67
  <a class="blog-back" href="/blog">\u2190 All posts</a>
68
68
  <div class="blog-post-head">
69
69
  <h1>${$(Q.title||z)}</h1>
70
70
  <p class="blog-post-meta">
71
71
  <span class="author">${$(K)}</span>
72
72
  <span class="dot">\xB7</span>
73
- <time>${$(h(Q.date))}</time>
73
+ <time>${$(T(Q.date))}</time>
74
74
  </p>
75
75
  ${Q.poster?`<figure class="blog-post-poster"><img src="${$(Q.poster)}" alt="${$(Q.title||"")}"></figure>`:""}
76
- </div>`,j=Q.authorBio?`<aside class="blog-author-card">
77
- <div class="avatar">${v}</div>
76
+ </div>`,I=Q.authorBio?`<aside class="blog-author-card">
77
+ <div class="avatar">${k}</div>
78
78
  <div><span class="name">${$(K)}</span><p class="bio">${$(Q.authorBio)}</p></div>
79
- </aside>`:"",_=`${J}/blog/${z}`,g=`
79
+ </aside>`:"",_=`${J}/blog/${z}`,n=`
80
80
  <div class="blog-share">
81
81
  <span class="blog-share-label">Share</span>
82
82
  <a href="https://twitter.com/intent/tweet?url=${encodeURIComponent(_)}&text=${encodeURIComponent(Q.title||"")}" target="_blank" rel="noreferrer">X / Twitter</a>
83
83
  <a href="https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(_)}" target="_blank" rel="noreferrer">LinkedIn</a>
84
- </div>`,N=A().filter((q)=>q.slug!==z).slice(0,3),f=N.length?`<nav class="blog-more">
84
+ </div>`,N=x().filter((A)=>A.slug!==z).slice(0,3),c=N.length?`<nav class="blog-more">
85
85
  <h2>More from the blog</h2>
86
- <ul>${N.map((q)=>`<li><a href="/blog/${$(q.slug)}">${$(q.fm.title||q.slug)}</a></li>`).join("")}</ul>
87
- </nav>`:"";return G.wrapInLayout(await F()+R+V+j+g+f+await D(),await w(G,Q),`/blog/${z}`,"page")}async function T(G){let z=await k(),Y=A().map((V)=>{let Q=V.fm.featured==="true",K=V.fm.poster?`<div class="blog-card-media"><img src="${$(V.fm.poster)}" alt="" loading="lazy"></div>`:"";return`<a class="blog-card${Q?" is-featured":""}" href="/blog/${$(V.slug)}">
86
+ <ul>${N.map((A)=>`<li><a href="/blog/${$(A.slug)}">${$(A.fm.title||A.slug)}</a></li>`).join("")}</ul>
87
+ </nav>`:"";return G.wrapInLayout(await D()+j+V+I+n+c+await F(),await v(G,Q),`/blog/${z}`,"page")}async function d(G){let z=await w(),Y=x().map((V)=>{let Q=V.fm.featured==="true",K=V.fm.poster?`<div class="blog-card-media"><img src="${$(V.fm.poster)}" alt="" loading="lazy"></div>`:"";return`<a class="blog-card${Q?" is-featured":""}" href="/blog/${$(V.slug)}">
88
88
  ${K}
89
89
  <div>
90
90
  ${Q?'<span class="blog-card-flag">Featured</span>':""}
91
91
  <h2 class="blog-card-title">${$(V.fm.title||V.slug)}</h2>
92
92
  <p class="blog-card-excerpt">${$((V.fm.description||"").slice(0,180))}</p>
93
- <div class="blog-card-meta">${$(V.fm.author||z.author)} \xB7 ${$(h(V.fm.date))}</div>
93
+ <div class="blog-card-meta">${$(V.fm.author||z.author)} \xB7 ${$(T(V.fm.date))}</div>
94
94
  </div>
95
95
  </a>`}).join(`
96
96
  `),W=`
@@ -145,4 +145,4 @@ ${Y}`},themeConfig:{siteTitle:J.siteTitle,nav:J.nav}}}function A(){if(!x(M))retu
145
145
  <h1>${$(z.title)}</h1>
146
146
  <p>${$(z.description)}</p>
147
147
  </div>
148
- <div class="blog-cards">${Y||W}</div>`;return G.wrapInLayout(await F()+Z+await D(),await w(G,{title:z.title,description:z.description}),"/blog","page")}async function u(G,z){let J=await k(),Y={...await w(G,{title:J.title}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildRssFeed==="function"?G.buildRssFeed(M,Y,{enabled:!0,title:J.title,description:J.description,maxItems:50}):i(z)}async function d(G,z){let J={...await w(G,{title:"Blog"}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildSitemap==="function"?G.buildSitemap(M,J):r(z)}async function s(G){if(G.method!=="GET"&&G.method!=="HEAD")return null;let z=new URL(G.url),{pathname:J}=z,Y=J==="/blog/feed.xml",W=J==="/blog/sitemap.xml",Z=J==="/blog"||J==="/blog/"||/^\/blog\/[^/.]+$/.test(J);if(!Y&&!W&&!Z)return null;let V=await S();if(!V)return null;let Q=(R,j=200)=>new Response(R,{status:j,headers:{"Content-Type":"text/html; charset=utf-8"}});if(Y)return new Response(await u(V,z.origin),{headers:{"Content-Type":"application/rss+xml; charset=utf-8"}});if(W)return new Response(await d(V,z.origin),{headers:{"Content-Type":"application/xml; charset=utf-8"}});if(J==="/blog"||J==="/blog/")return Q(await T(V));let K=J.replace(/^\/blog\//,"").replace(/\/$/,""),v=await H(V,K,z.origin);return v?Q(v):Q(await l(V),404)}async function e(G={outDir:"dist/blog"}){let z=G.outDir||"dist/blog",J=(G.baseUrl||(await k()).url).replace(/\/$/,""),Y=await S();if(!Y)throw Error("[blog] BunPress not found \u2014 cannot build the blog.");C(z,{recursive:!0});let W=(V,Q)=>{let K=B(z,V);C(B(K,".."),{recursive:!0}),c(K,Q,"utf-8")};W("index.html",await T(Y));let Z=A();for(let V of Z){let Q=await H(Y,V.slug,J);if(Q)W(B(V.slug,"index.html"),Q)}W("feed.xml",await u(Y,J)),W("sitemap.xml",await d(Y,J)),console.log(`[blog] built ${Z.length} post(s) + listing, feed.xml, sitemap.xml \u2192 ${z}`)}export{s as renderBlog,e as buildBlog};
148
+ <div class="blog-cards">${Y||W}</div>`;return G.wrapInLayout(await D()+Z+await F(),await v(G,{title:z.title,description:z.description}),"/blog","page")}async function g(G,z){let J=await w(),Y={...await v(G,{title:J.title}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildRssFeed==="function"?G.buildRssFeed(M,Y,{enabled:!0,title:J.title,description:J.description,maxItems:50}):H(z)}async function f(G,z){let J={...await v(G,{title:"Blog"}),sitemap:{enabled:!0,baseUrl:`${z}/blog`}};return typeof G.buildSitemap==="function"?G.buildSitemap(M,J):h(z)}async function s(G){if(G.method!=="GET"&&G.method!=="HEAD")return null;let z=new URL(G.url),{pathname:J}=z,Y=J==="/blog/feed.xml",W=J==="/blog/sitemap.xml",Z=J==="/blog"||J==="/blog/"||/^\/blog\/[^/.]+$/.test(J);if(!Y&&!W&&!Z)return null;let V=await U();if(!V)return null;let Q=(j,I=200)=>new Response(j,{status:I,headers:{"Content-Type":"text/html; charset=utf-8"}});if(Y)return new Response(await g(V,z.origin),{headers:{"Content-Type":"application/rss+xml; charset=utf-8"}});if(W)return new Response(await f(V,z.origin),{headers:{"Content-Type":"application/xml; charset=utf-8"}});if(J==="/blog"||J==="/blog/")return Q(await d(V));let K=J.replace(/^\/blog\//,"").replace(/\/$/,""),k=await u(V,K,z.origin);return k?Q(k):Q(await l(V),404)}async function e(G){if(G.method!=="GET"&&G.method!=="HEAD")return null;let{pathname:z}=new URL(G.url);if(z==="/blog/feed.xml")return new Response(await H(""),{headers:{"Content-Type":"application/rss+xml; charset=utf-8"}});if(z==="/blog/sitemap.xml")return new Response(await h(""),{headers:{"Content-Type":"application/xml; charset=utf-8"}});return null}async function zz(G={outDir:"dist/blog"}){let z=G.outDir||"dist/blog",J=(G.baseUrl||(await w()).url).replace(/\/$/,""),Y=await U();if(!Y)throw Error("[blog] BunPress not found \u2014 cannot build the blog.");C(z,{recursive:!0});let W=(V,Q)=>{let K=B(z,V);C(B(K,".."),{recursive:!0}),o(K,Q,"utf-8")};W("index.html",await d(Y));let Z=x();for(let V of Z){let Q=await u(Y,V.slug,J);if(Q)W(B(V.slug,"index.html"),Q)}W("feed.xml",await g(Y,J)),W("sitemap.xml",await f(Y,J)),console.log(`[blog] built ${Z.length} post(s) + listing, feed.xml, sitemap.xml \u2192 ${z}`)}export{e as renderBlogFeed,s as renderBlog,zz as buildBlog};
package/dist/dev/views.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{qb as O}from"../chunk-v0hqskdk.js";import{AsyncLocalStorage as g}from"async_hooks";import{existsSync as I}from"fs";import{config as G,overridesReady as h}from"@stacksjs/config";import{projectPath as Y}from"@stacksjs/path";var B=new g;function Z(){return B.getStore()??globalThis.__stxServeContext}globalThis.requestContext={cookie(z){return Z()?.cookies?.[z]??null},url(){return Z()?.url??""},locale(){return Z()?.locale??"de"}};var T=Y("serve.ts");try{if(await Bun.file(T).exists())await import(T);else await A()}catch{await A()}function p(z){let H={},J=z.headers.get("cookie")||"";if(!J)return H;for(let M of J.split(";")){let U=M.trim(),Q=U.indexOf("=");if(Q===-1)continue;let N=U.slice(0,Q).trim(),X=U.slice(Q+1).trim();if(!N)continue;try{H[N]=decodeURIComponent(X)}catch{H[N]=X}}return H}async function A(){await h;let{injectGlobalAutoImports:z,isApiBoundRequest:H,proxyToBackend:J}=await import("@stacksjs/server"),{applyRequestLocale:M}=await import("@stacksjs/i18n");await z();let{serve:U}=await import("../chunk-hv8tkjw2.js"),{site:Q,i18n:N}=await q(),X="resources/views",$="storage/framework/defaults/resources/views",L=await V(["resources/views/layouts","resources/layouts"])??"resources/views/layouts",w="storage/framework/defaults/resources/layouts",b=await V(["resources/views/components","resources/components"])??"resources/views/components",R=Number(process.env.PORT)||3000,y=Number(process.env.PORT_API)||3008,m=Number(process.env.PORT_DOCS)||G.ports?.docs||3006,C=`http://127.0.0.1:${y}`,j=`http://127.0.0.1:${m}`,v=G?.auth?.defaultTokenName??"auth-token";await U({patterns:[X,$],port:R,componentsDir:"storage/framework/defaults/resources/components",layoutsDir:L,partialsDir:b,fallbackLayoutsDir:w,fallbackPartialsDir:$,quiet:!0,...N&&{i18n:N},...Q?.url&&{site:Q},auth:{cookieName:v,redirectTo:"/login"},onRequest:async(K)=>{let W=new URL(K.url),{maintenanceGate:x}=await import("@stacksjs/server"),F=await x(K);if(F)return F;let{renderBlog:S}=await import("../blog.js"),_=await S(K);if(_)return _;if(W.pathname==="/docs"||W.pathname.startsWith("/docs/"))return J(K,j,"/docs");if(H(K,W.pathname))return J(K,C);if(N&&K.method==="GET"){let E=W.pathname.match(/^\/locale\/([a-z]{2}(?:-[a-z]{2})?)\/?$/i);if(E){let{createLocaleSwitchResponse:k}=await import("@stacksjs/i18n");return k(K,E[1],N)}}let P=await M(K),D={cookies:p(K),url:K.url,locale:P};return globalThis.__stxServeSearch=W.search,globalThis.__stxServeContext=D,B.enterWith(D),null}})}async function V(z){for(let H of z)if(I(Y(H)))return H;return null}function f(z){let H=z.i18n.locales,J=z.i18n.defaultLocale??H[0];return{locales:H,defaultLocale:J,labels:z.i18n.labels??Object.fromEntries(H.map((M)=>[M,M.toUpperCase()])),translations:{},pickerSelector:z.i18n.pickerSelector??"#lang-picker"}}async function d(z){try{let{resolveI18n:H}=await import("@stacksjs/stx");if(typeof H==="function"){let J=H(z,Y());if(J)return J}}catch{}return f(z)}async function q(){let z=Y("site.config.ts");if(!I(z))return{};try{let J=(await import(z)).default;if(!J)return{};if(!J.i18n)return{site:J};let M=await d(J);return{site:J,i18n:M}}catch{}return{}}
2
+ import{qb as O}from"../chunk-v0hqskdk.js";import{AsyncLocalStorage as k}from"async_hooks";import{existsSync as D}from"fs";import{config as T,overridesReady as P}from"@stacksjs/config";import{projectPath as Z}from"@stacksjs/path";var L=new k;function _(){return L.getStore()??globalThis.__stxServeContext}globalThis.requestContext={cookie(z){return _()?.cookies?.[z]??null},url(){return _()?.url??""},locale(){return _()?.locale??"de"}};var A=Z("serve.ts");try{if(await Bun.file(A).exists())await import(A);else await V()}catch{await V()}function g(z){let H={},J=z.headers.get("cookie")||"";if(!J)return H;for(let M of J.split(";")){let X=M.trim(),U=X.indexOf("=");if(U===-1)continue;let N=X.slice(0,U).trim(),$=X.slice(U+1).trim();if(!N)continue;try{H[N]=decodeURIComponent($)}catch{H[N]=$}}return H}async function V(){await P;let{injectGlobalAutoImports:z,isApiBoundRequest:H,proxyToBackend:J}=await import("@stacksjs/server"),{applyRequestLocale:M}=await import("@stacksjs/i18n");await z();let{serve:X}=await import("../chunk-hv8tkjw2.js"),{site:U,i18n:N}=await f(),$="resources/views",E="storage/framework/defaults/resources/views",w=await I(["resources/views/layouts","resources/layouts"])??"resources/views/layouts",B="storage/framework/defaults/resources/layouts",b=await I(["resources/views/components","resources/components"])??"resources/views/components",R=Number(process.env.PORT)||3000,y=Number(process.env.PORT_API)||3008,m=Number(process.env.PORT_DOCS)||T.ports?.docs||3006,C=`http://127.0.0.1:${y}`,v=`http://127.0.0.1:${m}`,j=T?.auth?.defaultTokenName??"auth-token";await X({patterns:[$,E],port:R,componentsDir:"storage/framework/defaults/resources/components",layoutsDir:w,partialsDir:b,fallbackLayoutsDir:B,fallbackPartialsDir:E,quiet:!0,...N&&{i18n:N},...U?.url&&{site:U},auth:{cookieName:j,redirectTo:"/login"},onRequest:async(K)=>{let Y=new URL(K.url),{maintenanceGate:x}=await import("@stacksjs/server"),F=await x(K);if(F)return F;if(D(Z("resources/views/blog.stx"))){let{renderBlogFeed:W}=await import("../blog.js"),Q=await W(K);if(Q)return Q}else{let{renderBlog:W}=await import("../blog.js"),Q=await W(K);if(Q)return Q}if(Y.pathname==="/docs"||Y.pathname.startsWith("/docs/"))return J(K,v,"/docs");if(H(K,Y.pathname))return J(K,C);if(N&&K.method==="GET"){let W=Y.pathname.match(/^\/locale\/([a-z]{2}(?:-[a-z]{2})?)\/?$/i);if(W){let{createLocaleSwitchResponse:Q}=await import("@stacksjs/i18n");return Q(K,W[1],N)}}let S=await M(K),G={cookies:g(K),url:K.url,locale:S};return globalThis.__stxServeSearch=Y.search,globalThis.__stxServeContext=G,L.enterWith(G),null}})}async function I(z){for(let H of z)if(D(Z(H)))return H;return null}function h(z){let H=z.i18n.locales,J=z.i18n.defaultLocale??H[0];return{locales:H,defaultLocale:J,labels:z.i18n.labels??Object.fromEntries(H.map((M)=>[M,M.toUpperCase()])),translations:{},pickerSelector:z.i18n.pickerSelector??"#lang-picker"}}async function p(z){try{let{resolveI18n:H}=await import("@stacksjs/stx");if(typeof H==="function"){let J=H(z,Z());if(J)return J}}catch{}return h(z)}async function f(){let z=Z("site.config.ts");if(!D(z))return{};try{let J=(await import(z)).default;if(!J)return{};if(!J.i18n)return{site:J};let M=await p(J);return{site:J,i18n:M}}catch{}return{}}
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import"../chunk-v0hqskdk.js";import{env as P,envEnum as R}from"@stacksjs/env";import{log as T}from"@stacksjs/logging";import{path as I}from"@stacksjs/path";import{storage as D}from"@stacksjs/storage";var O=["APP_NAME","APP_ENV","APP_KEY","APP_URL","APP_DOMAIN","APP_MAINTENANCE","APP_MAINTENANCE_SECRET","APP_COMING_SOON","APP_COMING_SOON_SECRET","APP_ROOT","DEBUG","PORT","PORT_BACKEND","PORT_ADMIN","PORT_LIBRARY","PORT_DESKTOP","PORT_EMAIL","PORT_DOCS","PORT_INSPECT","PORT_API","PORT_SYSTEM_TRAY","API_PREFIX","DOCS_PREFIX","DB_CONNECTION","DB_HOST","DB_PORT","DB_DATABASE","DB_DATABASE_PATH","DB_USERNAME","DB_PASSWORD","DB_PREFIX","DB_SCHEMA","DB_QUERY_LOGGING_ENABLED","DB_QUERY_LOGGING_SLOW_THRESHOLD","DB_QUERY_LOGGING_RETENTION_DAYS","DB_QUERY_LOGGING_PRUNE_FREQUENCY","DB_QUERY_LOGGING_ANALYSIS_ENABLED","DB_QUERY_LOGGING_ANALYZE_ALL","DB_QUERY_LOGGING_EXPLAIN_PLAN","DB_QUERY_LOGGING_SUGGESTIONS","DATABASE_URL","AWS_ACCOUNT_ID","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_DEFAULT_REGION","AWS_DEFAULT_PASSWORD","AWS_REGION","AWS_HOSTED_ZONE_ID","AWS_S3_BUCKET","AWS_S3_PREFIX","AWS_SES_REGION","MAIL_MAILER","MAIL_HOST","MAIL_PORT","MAIL_USERNAME","MAIL_PASSWORD","MAIL_ENCRYPTION","MAIL_FROM_NAME","MAIL_FROM_ADDRESS","MAIL_DOMAIN","MAIL_DRIVER","MAIL_SERVER_MODE","MAIL_SERVER_PATH","SEARCH_ENGINE_DRIVER","MEILISEARCH_HOST","MEILISEARCH_KEY","STRIPE_SECRET_KEY","STRIPE_PUBLISHABLE_KEY","FRONTEND_APP_ENV","FRONTEND_APP_URL","REALTIME_MODE","BROADCAST_DRIVER","BROADCAST_HOST","BROADCAST_PORT","BROADCAST_SCHEME","BROADCAST_APP_ID","BROADCAST_APP_KEY","BROADCAST_APP_SECRET","BROADCAST_CORS_ORIGIN","BROADCAST_DEBUG","BROADCAST_REDIS_ENABLED","BROADCAST_REDIS_PREFIX","BROADCAST_RATE_LIMIT_ENABLED","BROADCAST_METRICS_ENABLED","REDIS_HOST","REDIS_PORT","REDIS_PASSWORD","PUSHER_APP_ID","PUSHER_APP_KEY","PUSHER_APP_SECRET","PUSHER_APP_CLUSTER","PUSHER_APP_USE_TLS","SSL_DOMAINS","LETSENCRYPT_EMAIL","CONNECT_INSTANCE_ALIAS","PHONE_NOTIFY_EMAIL","PHONE_FORWARD_NUMBER","STORAGE_DRIVER","STORAGE_ROOT","STORAGE_PUBLIC_URL","QUEUE_DRIVER","AUTH_USERNAME_FIELD","AUTH_PASSWORD_FIELD","AUTH_TOKEN_EXPIRY","AUTH_TOKEN_ROTATION","AUTH_PASSWORD_RESET_EXPIRE","AUTH_PASSWORD_RESET_THROTTLE"];T.info("Generating type env files...");var N=`
2
+ import"../chunk-v0hqskdk.js";import{env as I,envEnum as R}from"@stacksjs/env";import{log as T}from"@stacksjs/logging";import{path as P}from"@stacksjs/path";import{storage as D}from"@stacksjs/storage";var O=["APP_NAME","APP_ENV","APP_KEY","APP_URL","APP_DOMAIN","APP_MAINTENANCE","APP_MAINTENANCE_SECRET","APP_COMING_SOON","APP_COMING_SOON_SECRET","APP_ROOT","DEBUG","PORT","PORT_BACKEND","PORT_ADMIN","PORT_LIBRARY","PORT_DESKTOP","PORT_EMAIL","PORT_DOCS","PORT_INSPECT","PORT_API","PORT_SYSTEM_TRAY","API_PREFIX","DOCS_PREFIX","DB_CONNECTION","DB_HOST","DB_PORT","DB_DATABASE","DB_DATABASE_PATH","DB_USERNAME","DB_PASSWORD","DB_PREFIX","DB_SCHEMA","DB_QUERY_LOGGING_ENABLED","DB_QUERY_LOGGING_SLOW_THRESHOLD","DB_QUERY_LOGGING_RETENTION_DAYS","DB_QUERY_LOGGING_PRUNE_FREQUENCY","DB_QUERY_LOGGING_ANALYSIS_ENABLED","DB_QUERY_LOGGING_ANALYZE_ALL","DB_QUERY_LOGGING_EXPLAIN_PLAN","DB_QUERY_LOGGING_SUGGESTIONS","DB_MIGRATE_CONFIRM","DB_MIGRATE_FRESH","DATABASE_URL","AWS_ACCOUNT_ID","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_DEFAULT_REGION","AWS_DEFAULT_PASSWORD","AWS_REGION","AWS_HOSTED_ZONE_ID","AWS_S3_BUCKET","AWS_S3_PREFIX","AWS_SES_REGION","MAIL_MAILER","MAIL_HOST","MAIL_PORT","MAIL_USERNAME","MAIL_PASSWORD","MAIL_ENCRYPTION","MAIL_FROM_NAME","MAIL_FROM_ADDRESS","MAIL_DOMAIN","MAIL_DRIVER","MAIL_SERVER_MODE","MAIL_SERVER_PATH","SEARCH_ENGINE_DRIVER","MEILISEARCH_HOST","MEILISEARCH_KEY","STRIPE_SECRET_KEY","STRIPE_PUBLISHABLE_KEY","FRONTEND_APP_ENV","FRONTEND_APP_URL","REALTIME_MODE","BROADCAST_DRIVER","BROADCAST_HOST","BROADCAST_PORT","BROADCAST_SCHEME","BROADCAST_APP_ID","BROADCAST_APP_KEY","BROADCAST_APP_SECRET","BROADCAST_CORS_ORIGIN","BROADCAST_DEBUG","BROADCAST_REDIS_ENABLED","BROADCAST_REDIS_PREFIX","BROADCAST_RATE_LIMIT_ENABLED","BROADCAST_METRICS_ENABLED","REDIS_HOST","REDIS_PORT","REDIS_PASSWORD","PUSHER_APP_ID","PUSHER_APP_KEY","PUSHER_APP_SECRET","PUSHER_APP_CLUSTER","PUSHER_APP_USE_TLS","SSL_DOMAINS","LETSENCRYPT_EMAIL","CONNECT_INSTANCE_ALIAS","PHONE_NOTIFY_EMAIL","PHONE_FORWARD_NUMBER","STORAGE_DRIVER","STORAGE_ROOT","STORAGE_PUBLIC_URL","QUEUE_DRIVER","AUTH_USERNAME_FIELD","AUTH_PASSWORD_FIELD","AUTH_TOKEN_EXPIRY","AUTH_TOKEN_ROTATION","AUTH_PASSWORD_RESET_EXPIRE","AUTH_PASSWORD_RESET_THROTTLE"];T.info("Generating type env files...");var N=`
3
3
  // This file is auto-generated by Stacks. Do not edit this file manually.
4
4
  // If you want to change the environment variables, please edit the .env file.
5
5
  //
@@ -7,11 +7,11 @@ import"../chunk-v0hqskdk.js";import{env as P,envEnum as R}from"@stacksjs/env";im
7
7
 
8
8
  declare module 'bun' {
9
9
  namespace env {
10
- ${O.map((E)=>{let A=typeof P[E],_=P[E];if(!_)if(R[E])A=R[E]?.map((S)=>`'${S}'`).join(" | "),_=R[E]?.[0];else switch(A){case"number":_="0";break;case"boolean":_=!1;break;default:_=""}if(A="string",typeof _==="string"){if(_.toLowerCase()==="true"||_.toLowerCase()==="false")A="boolean";else if(!Number.isNaN(Number.parseFloat(_))&&Number.isFinite(Number(_)))A="number";else if(R[E])A=R[E].map((S)=>`'${S}'`).join(" | ")}else if(typeof _==="number")A="number";else if(typeof _==="boolean")A="boolean";return`const ${E}: ${A}`}).join(`
10
+ ${O.map((E)=>{let A=typeof I[E],_=I[E];if(!_)if(R[E])A=R[E]?.map((S)=>`'${S}'`).join(" | "),_=R[E]?.[0];else switch(A){case"number":_="0";break;case"boolean":_=!1;break;default:_=""}if(A="string",typeof _==="string"){if(_.toLowerCase()==="true"||_.toLowerCase()==="false")A="boolean";else if(!Number.isNaN(Number.parseFloat(_))&&Number.isFinite(Number(_)))A="number";else if(R[E])A=R[E].map((S)=>`'${S}'`).join(" | ")}else if(typeof _==="number")A="number";else if(typeof _==="boolean")A="boolean";return`const ${E}: ${A}`}).join(`
11
11
  `)}
12
12
  }
13
13
  }
14
- `;await D.writeFile(I.frameworkPath("types/env.d.ts"),N);T.info(" - ./storage/framework/env.ts");var L=`
14
+ `;await D.writeFile(P.frameworkPath("types/env.d.ts"),N);T.info(" - ./storage/framework/env.ts");var L=`
15
15
  // This file is auto-generated by Stacks. Do not edit this file manually.
16
16
  // If you want to change the environment variables, please edit the .env file.
17
17
  //
@@ -23,4 +23,4 @@ export const envKeys = [
23
23
  ] as const
24
24
 
25
25
  export type EnvKey = typeof envKeys[number]
26
- `;await D.writeFile(I.frameworkPath("env.ts"),L);T.info(" - ./storage/framework/env.d.ts");
26
+ `;await D.writeFile(P.frameworkPath("env.ts"),L);T.info(" - ./storage/framework/env.d.ts");
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/actions",
3
3
  "type": "module",
4
- "version": "0.70.77",
4
+ "version": "0.70.79",
5
5
  "description": "The Stacks actions.",
6
6
  "author": "Chris Breuer",
7
7
  "contributors": [
@@ -64,27 +64,27 @@
64
64
  "@stacksjs/bumpx": "^0.2.6",
65
65
  "@stacksjs/bunpress": "^0.1.12",
66
66
  "@stacksjs/logsmith": "^0.2.3",
67
- "@stacksjs/ts-cloud": "^0.7.16",
67
+ "@stacksjs/ts-cloud": "^0.7.17",
68
68
  "@stacksjs/ts-md": "^0.1.1"
69
69
  },
70
70
  "devDependencies": {
71
- "@stacksjs/api": "0.70.77",
72
- "@stacksjs/cli": "0.70.77",
73
- "@stacksjs/config": "0.70.77",
74
- "@stacksjs/database": "0.70.77",
71
+ "@stacksjs/api": "0.70.79",
72
+ "@stacksjs/cli": "0.70.79",
73
+ "@stacksjs/config": "0.70.79",
74
+ "@stacksjs/database": "0.70.79",
75
75
  "@stacksjs/tlsx": "^0.13.2",
76
76
  "better-dx": "^0.2.16",
77
- "@stacksjs/dns": "0.70.77",
78
- "@stacksjs/enums": "0.70.77",
79
- "@stacksjs/env": "0.70.77",
80
- "@stacksjs/error-handling": "0.70.77",
81
- "@stacksjs/logging": "0.70.77",
82
- "@stacksjs/path": "0.70.77",
83
- "@stacksjs/security": "0.70.77",
84
- "@stacksjs/storage": "0.70.77",
85
- "@stacksjs/strings": "0.70.77",
86
- "@stacksjs/utils": "0.70.77",
87
- "@stacksjs/validation": "0.70.77"
77
+ "@stacksjs/dns": "0.70.79",
78
+ "@stacksjs/enums": "0.70.79",
79
+ "@stacksjs/env": "0.70.79",
80
+ "@stacksjs/error-handling": "0.70.79",
81
+ "@stacksjs/logging": "0.70.79",
82
+ "@stacksjs/path": "0.70.79",
83
+ "@stacksjs/security": "0.70.79",
84
+ "@stacksjs/storage": "0.70.79",
85
+ "@stacksjs/strings": "0.70.79",
86
+ "@stacksjs/utils": "0.70.79",
87
+ "@stacksjs/validation": "0.70.79"
88
88
  },
89
89
  "peerDependencies": {
90
90
  "pickier": "^0.1.28"