@stacksjs/api 0.70.232 → 0.70.234

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.
Files changed (2) hide show
  1. package/dist/index.js +7 -7
  2. package/package.json +2 -4
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  // @bun
2
- var ZO=Object.defineProperty;var zO=($)=>$;function LO($,O){this[$]=zO.bind(null,O)}var D$=($,O)=>{for(var J in O)ZO($,J,{get:O[J],enumerable:!0,configurable:!0,set:LO.bind(O,J)})};var a=($,O)=>()=>($&&(O=$($=0)),O);var o=import.meta.require;var E$;var Q$=a(()=>{E$={api:"api",v1:{path:"v1",prefix:"v1"}}});var I$={};D$(I$,{default:()=>E$});var F$=a(()=>{Q$();Q$()});function KO($){let O=$;return O?.code==="SQLITE_CONSTRAINT_UNIQUE"||O?.code==="SQLITE_CONSTRAINT"||O?.code==="23505"||O?.errno===1062||/unique|duplicate/i.test(O?.message??"")}function W$($,O,J){let G=$;if($ instanceof Error&&typeof G.status==="number"&&Number.isInteger(G.status)&&G.status>=400&&G.status<600){let Z={error:$.message};if(G.details!==void 0)Z.details=G.details;return{status:G.status,body:Z}}if(KO($))return{status:409,body:{error:`${O} already exists`}};return{status:500,body:{error:`Failed to ${J} ${O}`,detail:String($)}}}function F($){return $.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function X$($){let O={};for(let[J,G]of Object.entries($))O[F(J)]=G;return O}function M$($){if(!$)return[];let O=Object.entries($.attributes??{}).filter(([,J])=>J?.fillable===!0).map(([J])=>J);for(let J of $.belongsTo??[]){if(typeof J!=="string"||!J.trim())continue;let G=F(J.trim()).split("_").filter(Boolean);if(G.length===0)continue;let Z=`${G[0]}${G.slice(1).map((z)=>`${z[0]?.toUpperCase()}${z.slice(1)}`).join("")}Id`;O.push(Z)}return[...new Set(O)]}function Y$($,O){if(!$||O.length===0)return{};let J={};for(let G of O){if(G in $){J[G]=$[G];continue}let Z=F(G);if(Z!==G&&Z in $)J[G]=$[Z]}return J}function C$($,O){if($?.name!=="date"||O instanceof Date||typeof O!=="string")return O;let J=/^(\d{4})-(\d{2})-(\d{2})$/.exec(O);if(!J)return O;let G=Number(J[1]),Z=Number(J[2]),z=Number(J[3]),K=new Date(Date.UTC(G,Z-1,z));if(K.getUTCFullYear()!==G||K.getUTCMonth()!==Z-1||K.getUTCDate()!==z)return O;return K}function x$($,O){if(!O.length)return $;let J={...$};for(let G of O)delete J[G],delete J[F(G)];return J}function l($,O){if(!$||O.length===0)return $;let J={...$};for(let G of O)delete J[G],delete J[F(G)];return J}function k$($,O){let J=new Map;for(let G of[...Object.keys($??{}),...QO]){let Z=F(G);if(!/^\w+$/.test(Z))continue;J.set(G,Z),J.set(Z,Z)}for(let G of O)J.delete(G),J.delete(F(G));return J}function R$($,O,J){if(!O)return $;let G=String(O).split(",").map((z)=>z.trim()).filter(Boolean),Z=$;for(let z of G){let K=z.startsWith("-"),Y=K?z.slice(1):z;if(!/^\w+$/.test(Y))continue;let W=J.get(Y);if(!W)continue;Z=Z.orderBy(W,K?"desc":"asc")}return Z}function XO($){try{return JSON.parse($)}catch{return $}}function YO($){try{return JSON.parse($)}catch{return[]}}function T$($,O,J){if(!$||typeof $!=="object"||!O||Object.keys(O).length===0)return $;let G={...$};for(let[Z,z]of Object.entries(O)){let K=typeof z==="string"?WO[z]:z;if(!K||typeof K[J]!=="function")continue;if(Object.prototype.hasOwnProperty.call(G,Z))G[Z]=K[J](G[Z]);let Y=F(Z);if(Y!==Z&&Object.prototype.hasOwnProperty.call(G,Y))G[Y]=K[J](G[Y])}return G}function P$($){let O=typeof $==="object"&&$!==null&&"middleware"in $,J=$?.middleware,G=Array.isArray(J)?J.filter((Z)=>typeof Z==="string"&&Z.length>0):typeof J==="string"&&J?[J]:[];return{read:G,write:O?G:["auth"],declared:O}}function f$($){let O=Number.parseInt($.get("page")||String(1),10),J=Number.isFinite(O)?Math.max(1,O):1,G=Number.parseInt($.get("per_page")||String(V$),10),Z=Math.min(Number.isFinite(G)?Math.max(1,G):V$,xO);return{page:J,perPage:Z,offset:(J-1)*Z}}function Z$($,O){let J=new URL($.toString());return J.searchParams.set("page",String(O)),`${J.pathname}${J.search}`}function z$($,O,J,G,Z,z){let K=(O-1)*J,Y=G===0,W={page:O,per_page:J,from:Y?null:K+1,to:Y?null:K+G,has_more_pages:Z,prev_page_url:O>1?Z$($,O-1):null,next_page_url:Z?Z$($,O+1):null};if(z!==void 0&&!Number.isNaN(z)){let Q=Math.max(1,Math.ceil(z/J));W.total=z,W.last_page=Q,W.first_page_url=Z$($,1),W.last_page_url=Z$($,Q)}return W}function B$($,O,J,G,Z,z){let{page:K,...Y}=z$($,O,J,G,Z,z);return{current_page:K,...Y}}var QO,WO,V$=15,xO=100;var y$=a(()=>{QO=["id","uuid","created_at","updated_at","deleted_at"];WO={string:{get:($)=>$!=null?String($):null,set:($)=>$!=null?String($):null},number:{get:($)=>$!=null?Number($):null,set:($)=>$!=null?Number($):null},integer:{get:($)=>$!=null?Math.trunc(Number($)):null,set:($)=>$!=null?Math.trunc(Number($)):null},float:{get:($)=>$!=null?Number.parseFloat(String($)):null,set:($)=>$!=null?Number.parseFloat(String($)):null},boolean:{get:($)=>$===1||$==="1"||$===!0||$==="true",set:($)=>$===!0||$===1||$==="1"||$==="true"?1:0},json:{get:($)=>$==null?null:typeof $==="string"?XO($):$,set:($)=>$==null?null:typeof $==="string"?$:JSON.stringify($)},datetime:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString():$},date:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString().split("T")[0]:$},array:{get:($)=>$==null?[]:Array.isArray($)?$:typeof $==="string"?YO($):[],set:($)=>$==null?null:Array.isArray($)?JSON.stringify($):$}}});import{readdirSync as TO}from"fs";import{basename as BO,extname as b$,join as jO}from"path";function SO($){let O=[],J=(G)=>{let Z;try{Z=TO(G,{withFileTypes:!0})}catch{return}for(let z of Z){let K=jO(G,z.name);if(z.isDirectory()){J(K);continue}if(![".ts",".js"].includes(b$(z.name)))continue;if(z.name.startsWith(".")||z.name.startsWith("index"))continue;O.push(K)}};return J($),O.sort()}async function g$($,O,J){for(let G of SO($))try{let Z=b$(G),z=await import(`${G}?t=${Date.now()}`),K=z.default??z,Y=K.name??BO(G,Z);O[Y]={...K,name:Y}}catch(Z){J?.(G,Z)}}async function q$($){let O={};return await g$($.defaultsRoot,O,$.onImportError),await g$($.userRoot,O,$.onImportError),O}var c$=()=>{};var d$={};D$(d$,{default:()=>_O});import{route as h}from"@stacksjs/router";import{env as n}from"@stacksjs/env";import{projectPath as t$,storagePath as AO}from"@stacksjs/path";import{createQueryBuilder as NO,defaultConfig as w$,setConfig as v$}from"@stacksjs/query-builder";import{HttpError as m}from"@stacksjs/error-handling";import{log as A$}from"@stacksjs/logging";function u($,O){return h.routes.some((J)=>J.method===$&&J.path===O)}function o$($){if(!$.attributes)return[];return Object.entries($.attributes).filter(([O,J])=>J.hidden===!0).map(([O])=>O)}function h$($,O,J){let G=$,Z=O,z=J,K=Z?.attributes??{},Y={};for(let[W,Q]of Object.entries(K)){let U=Q?.validation?.rule;if(!U||typeof U.validate!=="function")continue;let M=Object.prototype.hasOwnProperty.call(G,W);if(!M&&z==="updating")continue;let C=C$(U,M?G[W]:void 0),_=U.validate(C);if(!_?.valid&&Array.isArray(_?.errors)&&_.errors.length>0)Y[W]=_.errors.map((y)=>Q?.validation?.message?.[y?.code]??y?.message??"invalid")}return Object.keys(Y).length===0?{valid:!0}:{valid:!1,errors:Y}}function p$($){if($.endsWith("y")&&!/[aeiou]y$/i.test($))return`${$.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test($))return`${$}es`;return`${$}s`}async function m$($,O,J,G){if(!$.length)return $;let Z=J.split(",").map((Q)=>Q.trim()).filter(Boolean);if(!Z.length)return $;let z=Array.isArray(O.belongsTo)?O.belongsTo:[],K=Array.isArray(O.hasMany)?O.hasMany:[],Y=Array.isArray(O.hasOne)?O.hasOne:[],W=new Map;for(let Q of z)W.set(F(Q),{kind:"belongsTo",modelName:Q});for(let Q of Y)W.set(F(Q),{kind:"hasOne",modelName:Q});for(let Q of K)W.set(p$(F(Q)),{kind:"hasMany",modelName:Q});for(let Q of Z){let U=W.get(Q);if(!U)continue;let M=G[U.modelName];if(!M)continue;let C=M.table||p$(F(U.modelName)),_=o$(M),y=(H)=>l(O$(H,M),_);if(U.kind==="belongsTo"||U.kind==="hasOne"){let H=`${F(U.modelName)}_id`,q=[...new Set($.map((x)=>x[H]).filter((x)=>x!=null))];if(!q.length){for(let x of $)x[Q]=null;continue}let P=await f.selectFrom(C).whereIn("id",q).get(),g=new Map;for(let x of P??[])g.set(String(x.id),y(x));for(let x of $)x[Q]=g.get(String(x[H]))??null}else{let H=String(O.name??""),q=`${F(H)}_id`,P=[...new Set($.map((L)=>L.id).filter((L)=>L!=null))];if(!P.length){for(let L of $)L[Q]=[];continue}let g=await f.selectFrom(C).whereIn(q,P).get(),x=new Map;for(let L of g??[]){let X=String(L[q]),T=x.get(X)??[];T.push(y(L)),x.set(X,T)}for(let L of $)L[Q]=x.get(String(L.id))??[]}}return $}async function i$($,O){let J=O?.set;if(!J||typeof J!=="object")return $;let G={...$};for(let[Z,z]of Object.entries(J)){if(typeof z!=="function"||!(Z in G))continue;try{G[Z]=await z(G)}catch{}}return G}function n$($,O){return T$($,O?.casts,"set")}function O$($,O){return T$($,O?.casts,"get")}function B($,O=200){return new Response(JSON.stringify($),{status:O,headers:{"Content-Type":"application/json"}})}async function S$($){if(Number($.headers?.get?.("content-length")??0)>L$)throw new m(413,`Request body exceeds ${L$}-byte limit`);if($.jsonBody&&typeof $.jsonBody==="object")return $.jsonBody;if($.formBody&&typeof $.formBody==="object")return $.formBody;try{let J=await $.clone().text();if(J.length>L$)throw new m(413,`Request body exceeds ${L$}-byte limit`);if(!J)return{};let G=JSON.parse(J);return G&&typeof G==="object"&&!Array.isArray(G)?G:{}}catch(J){if(J instanceof m)throw J;throw new m(400,`Invalid JSON body: ${J.message}`)}}function K$($){if($==null)return null;if(typeof $==="number")return Number.isFinite($)&&$>0?$:null;if(typeof $==="string"){let O=$.trim();if(!O)return null;if(/^\d+$/.test(O)){let J=Number(O);return Number.isFinite(J)&&J>0?J:null}return O}return null}function l$($){let O=$.bearerToken;if(typeof O==="function"){let G=O.call($);if(G)return G}let J=$.headers?.get?.("authorization")||$.headers?.get?.("Authorization")||"";if(typeof J==="string"&&J.startsWith("Bearer "))return J.substring(7);return null}async function s($){let O=$._authenticatedUser;if(O)return O;let J=l$($);if(!J)return null;try{let{Auth:G}=await import("@stacksjs/auth"),Z=await G.getUserFromToken(J);if(Z)$._authenticatedUser=Z;return Z||null}catch{return null}}function e($,O){if($==null||O==null)return!1;if(Array.isArray(O))return O.some((J)=>String(J)===String($));return String($)===String(O)}function DO($){let O=$?.attributes||{},J=(G)=>Object.prototype.hasOwnProperty.call(O,G);return J("teamId")||J("team_id")?"team_id":null}function UO($){let O=l$($),J=$.headers?.get?.("cookie")||"";return{bearerToken:()=>O,cookies:{get:(G)=>{for(let Z of J.split(";")){let z=Z.indexOf("=");if(z===-1)continue;if(Z.slice(0,z).trim()===G)return decodeURIComponent(Z.slice(z+1).trim())}return null}}}}function s$($){if($?.ownership)return $.ownership;let O=DO($);if(!O)return null;return{field:O,resolve:async(J,G)=>{let{resolveAuthenticatedTeamId:Z}=await import("@stacksjs/auth");return Z(UO(G))}}}async function $$($,O,J){let G=s$($);if(!G||!G.field||typeof G.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let Z=typeof G.bypass==="function"?!!G.bypass(O,J):!1,z=null;try{z=await G.resolve(O,J)}catch{z=null}return{enforced:!0,value:z,field:String(G.field),bypass:Z}}async function u$($,O,J,G){let Z=$?.authedFill?.[O];if(!Z)return{};if(typeof Z==="function")try{let z=await Z(J,G);return z&&typeof z==="object"?z:{}}catch{return{}}if(typeof Z==="object"){let z={};for(let[K,Y]of Object.entries(Z))try{z[K]=typeof Y==="function"?await Y(J,G):Y}catch{}return z}return{}}var HO,j$,f,L$=1048576,_O;var r$=a(async()=>{y$();c$();HO=t$("config/qb.ts");try{let $=(await import(HO)).default;v$($??w$)}catch{A$.debug("[orm] No config/qb.ts override found \u2014 deriving config from DB_CONNECTION");let $=n.DB_CONNECTION||"sqlite";v$({...w$,dialect:$,database:$==="sqlite"?{database:n.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:n.DB_DATABASE||"stacks",host:n.DB_HOST||"127.0.0.1",port:n.DB_PORT||($==="postgres"?5432:3306),username:n.DB_USERNAME||($==="postgres"?"postgres":"root"),password:n.DB_PASSWORD||""}})}j$=await q$({defaultsRoot:AO("framework/defaults/app/Models"),userRoot:t$("app/Models"),onImportError:($,O)=>A$.warn(`[orm] Could not load model ${$}: ${O.message}`)}),f=NO();for(let[$,O]of Object.entries(j$)){let J=O.traits?.useApi;if(!J)continue;let G=typeof J==="object"?J:{},Z=G.uri||O.table||$.toLowerCase()+"s",z=G.routes||["index","show","store","update","destroy"],K=O.table||Z,Y=M$(O),W=o$(O),Q=`/api/${Z}`,U=k$(O.attributes,W),{read:M,write:C,declared:_}=P$(J);if(["store","update","destroy"].some((x)=>z.includes(x))&&_&&C.length===0)A$.warn(`[orm] ${$}: registering UNAUTHENTICATED mutating routes at ${Q} (explicit \`middleware: []\` opt-out)`);let H=!!s$(O),q=H&&!M.includes("auth")?["auth",...M]:M,P=(x,L=q)=>{let X=x;for(let T of L)if(X&&typeof X.middleware==="function")X=X.middleware(T);return X};if(z.includes("index")&&!u("GET",Q))P(h.get(Q,async(x)=>{try{let L=new URL(x.url),{page:X,perPage:T,offset:S}=f$(L.searchParams),A=L.searchParams.get("sort"),j=f.selectFrom(K);j=R$(j,A,U);let b=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[k,R]of L.searchParams.entries()){if(b.has(k)||!R)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(k))continue;let i=U.get(k);if(i)j=j.where(i,"=",R)}let D=L.searchParams.get("search");if(D&&Y.length>0){let k=Y.slice(0,5);j=j.where((R)=>{for(let i of k)R=R.orWhere(F(i),"like",`%${D}%`);return R})}let E=L.searchParams.get("fields");if(E){let k=E.split(",").map((R)=>R.trim()).filter((R)=>/^[a-z_][a-z0-9_]*$/i.test(R)).map((R)=>F(R));if(k.length>0)j=j.select(k)}let I=!!O.traits?.useSoftDeletes,V=L.searchParams.get("withTrashed")==="true",p=L.searchParams.get("onlyTrashed")==="true";if(I&&!V)j=p?j.whereNotNull("deleted_at"):j.whereNull("deleted_at");let N=H?await $$(O,await s(x),x):{enforced:!1,value:null,field:"",bypass:!1};if(N.enforced&&!N.bypass){if(N.value==null||Array.isArray(N.value)&&N.value.length===0){let k=B$(L,X,T,0,!1,void 0);return new Response(JSON.stringify({data:[],...k,meta:z$(L,X,T,0,!1,void 0)}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}j=Array.isArray(N.value)?j.where(N.field,"in",N.value):j.where(N.field,"=",N.value)}let w=await j.limit(T+1).offset(S).get()||[],v=w.length>T,r=(v?w.slice(0,T):w).map((k)=>l(O$(k,O),W)),H$=L.searchParams.get("include");if(H$)r=await m$(r,O,H$,j$);let JO=L.searchParams.get("with_count")==="true",t;if(JO)try{let k=f.selectFrom(K);if(N.enforced&&!N.bypass&&N.value!=null)k=Array.isArray(N.value)?k.where(N.field,"in",N.value):k.where(N.field,"=",N.value);let R=await k.count(),i=typeof R==="number"?R:Number(R?.count??R);if(Number.isFinite(i))t=i}catch{}let G$={"Content-Type":"application/json"};if(t!==void 0&&!Number.isNaN(t))G$["X-Total-Count"]=String(t);G$["Cache-Control"]=N.enforced&&!N.bypass?"private, no-store":"public, max-age=15, must-revalidate",G$.Vary="Authorization";let GO=B$(L,X,T,r.length,v,t);return new Response(JSON.stringify({data:r,...GO,meta:z$(L,X,T,r.length,v,t)}),{status:200,headers:G$})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to fetch ${Z}`,detail:String(L)},500)}}));if(z.includes("show")&&!u("GET",`${Q}/{id}`))P(h.get(`${Q}/{id}`,async(x)=>{try{let L=K$(x.params?.id);if(L==null)return B({error:"Invalid ID parameter"},400);let X=await f.selectFrom(K).where({id:L}).executeTakeFirst();if(!X)return B({error:`${$} not found`},404);let T=new URL(x.url);if(O.traits?.useSoftDeletes&&X.deleted_at&&T.searchParams.get("withTrashed")!=="true")return B({error:`${$} not found`},404);let S=H?await $$(O,await s(x),x):{enforced:!1,value:null,field:"",bypass:!1};if(S.enforced&&!S.bypass){if(S.value==null||!e(X[S.field],S.value))return B({error:`${$} not found`},404)}let A=l(O$(X,O),W),j=T.searchParams.get("include");if(j){let[V]=await m$([A],O,j,j$);A=V}let b=A?.updated_at||A?.created_at,D=b?`W/"${A.id}-${String(b)}"`:void 0,E=x.headers?.get?.("if-none-match");if(D&&E&&E===D)return new Response(null,{status:304,headers:{ETag:D}});let I={"Content-Type":"application/json"};if(D)I.ETag=D;return I["Cache-Control"]=S.enforced&&!S.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:A}),{status:200,headers:I})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to fetch ${$}`,detail:String(L)},500)}}));if(z.includes("store")&&!u("POST",Q))P(h.post(Q,async(x)=>{try{let L=await S$(x),X=x$(L,W),T=Y$(X,Y),S=await s(x);if(S){let I=await u$(O,"creating",S,x);for(let[V,p]of Object.entries(I))if(p!==void 0&&p!==null&&T[V]===void 0)T[V]=p}if(Object.keys(T).length===0)return B({error:"No fillable fields provided"},422);let A=h$(T,O,"creating");if(!A.valid)return B({error:"Validation failed",errors:A.errors},422);if(O.traits?.useTimestamps!==!1){let I=new Date().toISOString();T.created_at=I,T.updated_at=I}let j=await i$(T,O),b=X$(n$(j,O)),D=await f.insertInto(K).values(b).execute(),E=b;try{let I=D?.lastInsertRowid??D?.insertId??D;if(I){let V=await f.selectFrom(K).where({id:I}).executeTakeFirst();if(V)E=V}}catch{}return B({data:l(O$(E,O),W)},201)}catch(L){let{status:X,body:T}=W$(L,$,"create");return B(T,X)}}),C);if(z.includes("update")){let x=async(L)=>{try{let X=K$(L.params?.id);if(X==null)return B({error:"Invalid ID parameter"},400);let T=await S$(L),S=x$(T,W),A=Y$(S,Y),j=await s(L);if(j){let N=await u$(O,"updating",j,L);for(let[w,v]of Object.entries(N))if(v!==void 0&&v!==null&&A[w]===void 0)A[w]=v}if(Object.keys(A).length===0)return B({error:"No fillable fields provided"},422);let b=h$(A,O,"updating");if(!b.valid)return B({error:"Validation failed",errors:b.errors},422);let D=await f.selectFrom(K).where({id:X}).executeTakeFirst();if(!D)return B({error:`${$} not found`},404);let E=await $$(O,j,L);if(E.enforced&&!E.bypass){if(!j)return B({error:"Auth required"},401);let N=D[E.field];if(!e(N,E.value))return B({error:`Not your ${$}`},403);let w=Object.keys(A).find((v)=>F(v)===F(E.field));if(w!==void 0&&!e(A[w],E.value))return B({error:`Cannot reassign ${$} ownership`},403)}if(O.traits?.useTimestamps!==!1)A.updated_at=new Date().toISOString();let I=await i$(A,O),V=X$(n$(I,O));await f.updateTable(K).set(V).where({id:X}).execute();let p={...D,...V};try{let N=await f.selectFrom(K).where({id:X}).executeTakeFirst();if(N)p=N}catch{}return B({data:l(O$(p,O),W)})}catch(X){let{status:T,body:S}=W$(X,$,"update");return B(S,T)}};if(!u("PUT",`${Q}/{id}`))P(h.put(`${Q}/{id}`,x),C);if(!u("PATCH",`${Q}/{id}`))P(h.patch(`${Q}/{id}`,x),C)}let g=!!O.traits?.useSoftDeletes;if(z.includes("destroy")&&!u("DELETE",`${Q}/{id}`))P(h.delete(`${Q}/{id}`,async(x)=>{try{let L=K$(x.params?.id);if(L==null)return B({error:"Invalid ID parameter"},400);let X=await f.selectFrom(K).where({id:L}).executeTakeFirst();if(!X)return B({error:`${$} not found`},404);let T=await s(x),S=await $$(O,T,x);if(S.enforced&&!S.bypass){if(!T)return B({error:"Auth required"},401);let A=X[S.field];if(!e(A,S.value))return B({error:`Not your ${$}`},403)}if(g){let A=new Date().toISOString();await f.updateTable(K).set({deleted_at:A,updated_at:A}).where({id:L}).execute()}else await f.deleteFrom(K).where({id:L}).execute();return new Response(null,{status:204})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to delete ${$}`,detail:String(L)},500)}}),C);if(z.includes("destroy")&&!u("POST",`${Q}/bulk-delete`))P(h.post(`${Q}/bulk-delete`,async(x)=>{try{let X=(await S$(x))?.ids;if(!Array.isArray(X)||X.length===0)return B({error:"An array of IDs is required"},422);if(X.length>100)return B({error:"Cannot delete more than 100 records at once"},422);let T=[],S=[];for(let D of X){let E=K$(D);if(E!=null)T.push(E);else S.push(D)}if(S.length>0)return B({error:"Invalid IDs in batch",invalid:S},422);let A=await s(x),j=await $$(O,A,x);if(j.enforced&&!j.bypass){if(!A)return B({error:"Auth required"},401);if(j.value==null)return B({error:"Caller has no ownership identity"},403);let D=await f.selectFrom(K).select(["id",j.field]).execute(),E=new Set(D.filter((V)=>e(V[j.field],j.value)).map((V)=>String(V.id))),I=T.filter((V)=>!E.has(String(V)));if(I.length>0)return B({error:`Cannot delete ${$} you don't own`,ids:I},403)}let b=new Date().toISOString();for(let D of T)if(g)await f.updateTable(K).set({deleted_at:b,updated_at:b}).where({id:D}).execute();else await f.deleteFrom(K).where({id:D}).execute();return B({message:`Successfully deleted ${T.length} ${Z}`})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to bulk delete ${Z}`,detail:String(L)},500)}}),C)}_O=h});class U${data;status;headers;isOk;constructor($,O,J,G){this.data=$;this.status=O;this.headers=J;this.isOk=G}ok(){return this.status===200}created(){return this.status===201}accepted(){return this.status===202}noContent(){return this.status===204}movedPermanently(){return this.status===301}found(){return this.status===302}badRequest(){return this.status===400}unauthorized(){return this.status===401}paymentRequired(){return this.status===402}forbidden(){return this.status===403}notFound(){return this.status===404}requestTimeout(){return this.status===408}conflict(){return this.status===409}unprocessableEntity(){return this.status===422}tooManyRequests(){return this.status===429}serverError(){return this.status===500}}class _${defaultHeaders={Accept:"application/json","Content-Type":"application/json"};queryParams;bodyData;isFormData=!1;customHeaders={};attachments=[];isMultipart=!1;digestAuth;withQueryParams($){return this.queryParams=$,this}withHeaders($){return this.customHeaders={...this.customHeaders,...$},this}accept($){return this.defaultHeaders.Accept=$,this}acceptJson(){return this.accept("application/json")}withToken($){return this.customHeaders.Authorization=`Bearer ${$}`,this}withBasicAuth($,O){let J=btoa(`${$}:${O}`);return this.customHeaders.Authorization=`Basic ${J}`,this}withDigestAuth($,O){return this.digestAuth={username:$,password:O},this}withBody($){return this.bodyData=$,this}asForm(){return this.isFormData=!0,this.defaultHeaders["Content-Type"]="application/x-www-form-urlencoded",this}attach($,O,J,G){let Z=typeof O==="string"?new Blob([O],{type:G?.["Content-Type"]||"text/plain"}):O;return this.attachments.push({name:$,content:Z,filename:J,headers:G}),this.isMultipart=!0,delete this.defaultHeaders["Content-Type"],this}getHeaders(){return{...this.defaultHeaders,...this.customHeaders}}addQueryParams($){if(!this.queryParams)return $;let O=new URLSearchParams;Object.entries(this.queryParams).forEach(([Z,z])=>{if(z!=null)O.append(Z,String(z))});let J=O.toString();if(!J)return $;let G=$.includes("?");return $+(G?"&":"?")+J}async formatBody($){let O=$||this.bodyData;if(this.isMultipart){let J=new FormData;if(O)Object.entries(O).forEach(([G,Z])=>{J.append(G,String(Z))});for(let G of this.attachments)if(G.headers){let Z=G.content instanceof Blob?new Blob([G.content],{type:G.headers["Content-Type"]}):G.content;J.append(G.name,Z,G.filename)}else J.append(G.name,G.content,G.filename);return J}if(this.isFormData&&O){let J=new URLSearchParams;return Object.entries(O).forEach(([G,Z])=>{if(Z!=null)J.append(G,String(Z))}),J.toString()}return O?JSON.stringify(O):void 0}resetState(){this.queryParams=void 0,this.bodyData=void 0,this.isFormData=!1,this.isMultipart=!1,this.customHeaders={},this.attachments=[],this.digestAuth=void 0,this.defaultHeaders["Content-Type"]="application/json"}async handleDigestAuth($,O,J,G){if($.status!==401||!this.digestAuth)return $;let Z=$.headers.get("WWW-Authenticate");if(!Z?.startsWith("Digest "))return $;let z=Z.substring(7).split(",").reduce((_,y)=>{let[H,q]=y.trim().split("=");if(H)_[H]=q?.replace(/["']/g,"")??"";return _},{}),K=await this.generateMD5(`${this.digestAuth.username}:${z.realm}:${this.digestAuth.password}`),Y=await this.generateMD5(`${J}:${O}`),W="00000001",Q=await this.generateMD5(Date.now().toString()).then((_)=>_.substring(0,8)),U=await this.generateMD5(`${K}:${z.nonce}:${W}:${Q}:${z.qop}:${Y}`),M={username:`"${this.digestAuth.username}"`,realm:`"${z.realm}"`,nonce:`"${z.nonce}"`,uri:`"${O}"`,algorithm:z.algorithm?`"${z.algorithm}"`:void 0,qop:`"${z.qop}"`,nc:W,cnonce:`"${Q}"`,response:`"${U}"`,opaque:z.opaque?`"${z.opaque}"`:void 0},C=Object.entries(M).filter(([_,y])=>y!==void 0).map(([_,y])=>`${_}=${y}`).join(", ");return this.customHeaders.Authorization=`Digest ${C}`,fetch(O,{method:J,headers:this.getHeaders(),body:G?this.formatBody(G):void 0})}async generateMD5($){let J=new TextEncoder().encode($),G=await crypto.subtle.digest("SHA-256",J);return Array.from(new Uint8Array(G)).map((z)=>z.toString(16).padStart(2,"0")).join("")}async request($,O,J){let G=this.addQueryParams($),Z=await this.formatBody(J),z=await fetch(G,{method:O,headers:this.getHeaders(),body:Z});if(this.digestAuth)z=await this.handleDigestAuth(z,G,O,J);let K=await z.json();return this.resetState(),new U$(K,z.status,z.headers,z.ok)}async get($){return this.request($,"GET")}async post($,O){return this.request($,"POST",O)}async put($,O){return this.request($,"PUT",O)}async patch($,O){return this.request($,"PATCH",O)}async delete($){return this.request($,"DELETE")}}var fO=new _$;import{path as EO}from"@stacksjs/path";function IO($){if(!$||typeof $!=="object")return{type:"string"};let O=$,J=O._type??"string",G={type:J==="array"?"array":J};if(typeof O._min==="number")G[J==="string"?"minLength":"minimum"]=O._min;if(typeof O._max==="number")G[J==="string"?"maxLength":"maximum"]=O._max;if(O._email)G.format="email";if(O._url)G.format="uri";if(O._uuid)G.format="uuid";if(Array.isArray(O._enum))G.enum=O._enum;return G}async function FO($){if(typeof $!=="string"||!$.includes("Actions"))return null;try{let{path:O}=await import("@stacksjs/path"),J=[O.appPath(`${$}.ts`),O.storagePath(`framework/defaults/app/${$}.ts`)];for(let G of J)try{if(!await Bun.file(G).exists())continue;let K=(await import(G)).default;if(K&&typeof K==="object"&&"validations"in K){let Y=K.validations;return Y&&typeof Y==="object"?Y:null}return null}catch{}}catch{}return null}async function dO($={}){let O=$.portable??!0,{listRegisteredRoutes:J}=await import("@stacksjs/router");try{let{loadRoutes:W}=await import("@stacksjs/router"),{default:Q}=await Promise.resolve().then(() => (F$(),I$));await W(Q)}catch(W){let Q=W instanceof Error?W.message:String(W);if(O)throw Error(`[generateOpenApi] Refusing to emit a partial spec: failed to load routes/api.ts + framework routes: ${Q}`);console.warn(`[generateOpenApi] Failed to load routes/api.ts + framework routes: ${Q}`)}try{await r$().then(() => d$)}catch(W){let Q=W instanceof Error?W.message:String(W);if(O)throw Error(`[generateOpenApi] Refusing to emit a partial spec: failed to load useApi-generated ORM routes: ${Q}`);console.warn(`[generateOpenApi] Failed to load useApi-generated ORM routes: ${Q}`)}let G=(W)=>W.replace(/(^|\/):(\w+)(?=$|\/)/g,"$1{$2}"),Z=[...J()].map((W)=>({route:W,oasPath:G(W.path),method:W.method.toLowerCase()})).sort((W,Q)=>{if(W.oasPath!==Q.oasPath)return W.oasPath<Q.oasPath?-1:1;return W.method<Q.method?-1:W.method>Q.method?1:0});if(O&&Z.length===0)throw Error("[generateOpenApi] Refusing to emit an empty spec: no routes were registered. This usually means route loading failed silently rather than that the app has no API.");let z="Stacks API";if(!O)try{let{config:W}=await import("@stacksjs/config");if(W.app?.name)z=`${W.app.name} API`}catch{}let K={openapi:"3.0.0",info:{title:z,version:"1.0.0"},paths:{},components:{schemas:{}}},Y=new Set;for(let{route:W,oasPath:Q,method:U}of Z){if(!K.paths[Q])K.paths[Q]={};let M=[];for(let H of W.path.matchAll(/\{(\w+)\}/g))if(H[1])M.push(H[1]);for(let H of W.path.matchAll(/(?:^|\/):(\w+)(?=$|\/)/g))if(H[1])M.push(H[1]);let C=W.name??`${U}_${Q.replace(/[^a-z0-9]/gi,"_")}`,_=C;if(Y.has(_)){_=`${C}_${U}`;let H=2;while(Y.has(_))_=`${C}_${U}_${H++}`}Y.add(_);let y={summary:W.name??W.path,operationId:_,parameters:M.map((H)=>({name:H,in:"path",required:!0,schema:{type:"string"}})),responses:{200:{description:"Successful response",content:{"application/json":{schema:{type:"object"}}}},422:{description:"Validation failed"},500:{description:"Server error"}}};if(U!=="get"&&U!=="head"&&W.name){let q=`Actions/${W.name.split(".").map((g)=>g.charAt(0).toUpperCase()+g.slice(1)).join("")}Action`,P=await FO(q);if(P&&Object.keys(P).length>0){let g={type:"object",properties:{},required:[]},x=g.properties,L=g.required;for(let[X,T]of Object.entries(P)){let S=T?.rule;if(x[X]=IO(S),S?._required)L.push(X)}if(L.length===0)delete g.required;y.requestBody={required:L.length>0,content:{"application/json":{schema:g}}}}}K.paths[Q][U]=y}if($.write!==!1){let Q=Bun.file(EO.frameworkPath("api/openapi.json")).writer();Q.write(JSON.stringify(K,null,2)),await Q.end()}return K}var VO=["get","put","post","delete","options","head","patch","trace"];function MO($){return typeof $==="string"?JSON.stringify($):String($)}function d($){if(!$)return"unknown";if($.enum?.length)return $.enum.map(MO).join(" | ");if($.type==="string")return"string";if($.type==="number"||$.type==="integer")return"number";if($.type==="boolean")return"boolean";if($.type==="null")return"null";if($.type==="array")return`Array<${d($.items)}>`;if($.type==="object"||$.properties||$.additionalProperties){let O=new Set($.required||[]),J=Object.entries($.properties||{}).map(([G,Z])=>`${JSON.stringify(G)}${O.has(G)?"":"?"}: ${d(Z)}`);if($.additionalProperties){let G=$.additionalProperties===!0?"unknown":d($.additionalProperties);J.push(`[key: string]: ${G}`)}return J.length?`{ ${J.join("; ")} }`:"Record<string, unknown>"}return"unknown"}function CO($=[]){return` parameters: {
2
+ var $O=Object.defineProperty;var OO=($)=>$;function JO($,O){this[$]=OO.bind(null,O)}var GO=($,O)=>{for(var J in O)$O($,J,{get:O[J],enumerable:!0,configurable:!0,set:JO.bind(O,J)})};var K$=($,O)=>()=>($&&(O=$($=0)),O);var o=import.meta.require;function ZO($){let O=$;return O?.code==="SQLITE_CONSTRAINT_UNIQUE"||O?.code==="SQLITE_CONSTRAINT"||O?.code==="23505"||O?.errno===1062||/unique|duplicate/i.test(O?.message??"")}function Q$($,O,J){let G=$;if($ instanceof Error&&typeof G.status==="number"&&Number.isInteger(G.status)&&G.status>=400&&G.status<600){let Z={error:$.message};if(G.details!==void 0)Z.details=G.details;return{status:G.status,body:Z}}if(ZO($))return{status:409,body:{error:`${O} already exists`}};return{status:500,body:{error:`Failed to ${J} ${O}`,detail:String($)}}}function F($){return $.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function W$($){let O={};for(let[J,G]of Object.entries($))O[F(J)]=G;return O}function _$($){if(!$)return[];let O=Object.entries($.attributes??{}).filter(([,J])=>J?.fillable===!0).map(([J])=>J);for(let J of $.belongsTo??[]){if(typeof J!=="string"||!J.trim())continue;let G=F(J.trim()).split("_").filter(Boolean);if(G.length===0)continue;let Z=`${G[0]}${G.slice(1).map((z)=>`${z[0]?.toUpperCase()}${z.slice(1)}`).join("")}Id`;O.push(Z)}return[...new Set(O)]}function X$($,O){if(!$||O.length===0)return{};let J={};for(let G of O){if(G in $){J[G]=$[G];continue}let Z=F(G);if(Z!==G&&Z in $)J[G]=$[Z]}return J}function E$($,O){if($?.name!=="date"||O instanceof Date||typeof O!=="string")return O;let J=/^(\d{4})-(\d{2})-(\d{2})$/.exec(O);if(!J)return O;let G=Number(J[1]),Z=Number(J[2]),z=Number(J[3]),K=new Date(Date.UTC(G,Z-1,z));if(K.getUTCFullYear()!==G||K.getUTCMonth()!==Z-1||K.getUTCDate()!==z)return O;return K}function Y$($,O){if(!O.length)return $;let J={...$};for(let G of O)delete J[G],delete J[F(G)];return J}function s($,O){if(!$||O.length===0)return $;let J={...$};for(let G of O)delete J[G],delete J[F(G)];return J}function I$($,O){let J=new Map;for(let G of[...Object.keys($??{}),...zO]){let Z=F(G);if(!/^\w+$/.test(Z))continue;J.set(G,Z),J.set(Z,Z)}for(let G of O)J.delete(G),J.delete(F(G));return J}function F$($,O,J){if(!O)return $;let G=String(O).split(",").map((z)=>z.trim()).filter(Boolean),Z=$;for(let z of G){let K=z.startsWith("-"),Y=K?z.slice(1):z;if(!/^\w+$/.test(Y))continue;let W=J.get(Y);if(!W)continue;Z=Z.orderBy(W,K?"desc":"asc")}return Z}function KO($){try{return JSON.parse($)}catch{return $}}function QO($){try{return JSON.parse($)}catch{return[]}}function x$($,O,J){if(!$||typeof $!=="object"||!O||Object.keys(O).length===0)return $;let G={...$};for(let[Z,z]of Object.entries(O)){let K=typeof z==="string"?LO[z]:z;if(!K||typeof K[J]!=="function")continue;if(Object.prototype.hasOwnProperty.call(G,Z))G[Z]=K[J](G[Z]);let Y=F(Z);if(Y!==Z&&Object.prototype.hasOwnProperty.call(G,Y))G[Y]=K[J](G[Y])}return G}function V$($){let O=typeof $==="object"&&$!==null&&"middleware"in $,J=$?.middleware,G=Array.isArray(J)?J.filter((Z)=>typeof Z==="string"&&Z.length>0):typeof J==="string"&&J?[J]:[];return{read:G,write:O?G:["auth"],declared:O}}function M$($){let O=Number.parseInt($.get("page")||String(1),10),J=Number.isFinite(O)?Math.max(1,O):1,G=Number.parseInt($.get("per_page")||String(U$),10),Z=Math.min(Number.isFinite(G)?Math.max(1,G):U$,WO);return{page:J,perPage:Z,offset:(J-1)*Z}}function G$($,O){let J=new URL($.toString());return J.searchParams.set("page",String(O)),`${J.pathname}${J.search}`}function Z$($,O,J,G,Z,z){let K=(O-1)*J,Y=G===0,W={page:O,per_page:J,from:Y?null:K+1,to:Y?null:K+G,has_more_pages:Z,prev_page_url:O>1?G$($,O-1):null,next_page_url:Z?G$($,O+1):null};if(z!==void 0&&!Number.isNaN(z)){let Q=Math.max(1,Math.ceil(z/J));W.total=z,W.last_page=Q,W.first_page_url=G$($,1),W.last_page_url=G$($,Q)}return W}function T$($,O,J,G,Z,z){let{page:K,...Y}=Z$($,O,J,G,Z,z);return{current_page:K,...Y}}var zO,LO,U$=15,WO=100;var C$=K$(()=>{zO=["id","uuid","created_at","updated_at","deleted_at"];LO={string:{get:($)=>$!=null?String($):null,set:($)=>$!=null?String($):null},number:{get:($)=>$!=null?Number($):null,set:($)=>$!=null?Number($):null},integer:{get:($)=>$!=null?Math.trunc(Number($)):null,set:($)=>$!=null?Math.trunc(Number($)):null},float:{get:($)=>$!=null?Number.parseFloat(String($)):null,set:($)=>$!=null?Number.parseFloat(String($)):null},boolean:{get:($)=>$===1||$==="1"||$===!0||$==="true",set:($)=>$===!0||$===1||$==="1"||$==="true"?1:0},json:{get:($)=>$==null?null:typeof $==="string"?KO($):$,set:($)=>$==null?null:typeof $==="string"?$:JSON.stringify($)},datetime:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString():$},date:{get:($)=>$?new Date($):null,set:($)=>$ instanceof Date?$.toISOString().split("T")[0]:$},array:{get:($)=>$==null?[]:Array.isArray($)?$:typeof $==="string"?QO($):[],set:($)=>$==null?null:Array.isArray($)?JSON.stringify($):$}}});import{readdirSync as XO}from"fs";import{basename as YO,extname as R$,join as xO}from"path";function TO($){let O=[],J=(G)=>{let Z;try{Z=XO(G,{withFileTypes:!0})}catch{return}for(let z of Z){let K=xO(G,z.name);if(z.isDirectory()){J(K);continue}if(![".ts",".js"].includes(R$(z.name)))continue;if(z.name.startsWith(".")||z.name.startsWith("index"))continue;O.push(K)}};return J($),O.sort()}async function k$($,O,J){for(let G of TO($))try{let Z=R$(G),z=await import(`${G}?t=${Date.now()}`),K=z.default??z,Y=K.name??YO(G,Z);O[Y]={...K,name:Y}}catch(Z){J?.(G,Z)}}async function f$($){let O={};return await k$($.defaultsRoot,O,$.onImportError),await k$($.userRoot,O,$.onImportError),O}var P$=()=>{};var u$={};GO(u$,{default:()=>HO});import{route as h}from"@stacksjs/router";import{env as n}from"@stacksjs/env";import{projectPath as p$,storagePath as BO}from"@stacksjs/path";import{createQueryBuilder as jO,defaultConfig as y$,setConfig as g$}from"@stacksjs/query-builder";import{HttpError as m}from"@stacksjs/error-handling";import{log as S$}from"@stacksjs/logging";function u($,O){return h.routes.some((J)=>J.method===$&&J.path===O)}function m$($){if(!$.attributes)return[];return Object.entries($.attributes).filter(([O,J])=>J.hidden===!0).map(([O])=>O)}function b$($,O,J){let G=$,Z=O,z=J,K=Z?.attributes??{},Y={};for(let[W,Q]of Object.entries(K)){let U=Q?.validation?.rule;if(!U||typeof U.validate!=="function")continue;let M=Object.prototype.hasOwnProperty.call(G,W);if(!M&&z==="updating")continue;let C=E$(U,M?G[W]:void 0),_=U.validate(C);if(!_?.valid&&Array.isArray(_?.errors)&&_.errors.length>0)Y[W]=_.errors.map((y)=>Q?.validation?.message?.[y?.code]??y?.message??"invalid")}return Object.keys(Y).length===0?{valid:!0}:{valid:!1,errors:Y}}function q$($){if($.endsWith("y")&&!/[aeiou]y$/i.test($))return`${$.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test($))return`${$}es`;return`${$}s`}async function c$($,O,J,G){if(!$.length)return $;let Z=J.split(",").map((Q)=>Q.trim()).filter(Boolean);if(!Z.length)return $;let z=Array.isArray(O.belongsTo)?O.belongsTo:[],K=Array.isArray(O.hasMany)?O.hasMany:[],Y=Array.isArray(O.hasOne)?O.hasOne:[],W=new Map;for(let Q of z)W.set(F(Q),{kind:"belongsTo",modelName:Q});for(let Q of Y)W.set(F(Q),{kind:"hasOne",modelName:Q});for(let Q of K)W.set(q$(F(Q)),{kind:"hasMany",modelName:Q});for(let Q of Z){let U=W.get(Q);if(!U)continue;let M=G[U.modelName];if(!M)continue;let C=M.table||q$(F(U.modelName)),_=m$(M),y=(H)=>s($$(H,M),_);if(U.kind==="belongsTo"||U.kind==="hasOne"){let H=`${F(U.modelName)}_id`,q=[...new Set($.map((x)=>x[H]).filter((x)=>x!=null))];if(!q.length){for(let x of $)x[Q]=null;continue}let f=await P.selectFrom(C).whereIn("id",q).get(),g=new Map;for(let x of f??[])g.set(String(x.id),y(x));for(let x of $)x[Q]=g.get(String(x[H]))??null}else{let H=String(O.name??""),q=`${F(H)}_id`,f=[...new Set($.map((L)=>L.id).filter((L)=>L!=null))];if(!f.length){for(let L of $)L[Q]=[];continue}let g=await P.selectFrom(C).whereIn(q,f).get(),x=new Map;for(let L of g??[]){let X=String(L[q]),T=x.get(X)??[];T.push(y(L)),x.set(X,T)}for(let L of $)L[Q]=x.get(String(L.id))??[]}}return $}async function w$($,O){let J=O?.set;if(!J||typeof J!=="object")return $;let G={...$};for(let[Z,z]of Object.entries(J)){if(typeof z!=="function"||!(Z in G))continue;try{G[Z]=await z(G)}catch{}}return G}function v$($,O){return x$($,O?.casts,"set")}function $$($,O){return x$($,O?.casts,"get")}function B($,O=200){return new Response(JSON.stringify($),{status:O,headers:{"Content-Type":"application/json"}})}async function j$($){if(Number($.headers?.get?.("content-length")??0)>z$)throw new m(413,`Request body exceeds ${z$}-byte limit`);if($.jsonBody&&typeof $.jsonBody==="object")return $.jsonBody;if($.formBody&&typeof $.formBody==="object")return $.formBody;try{let J=await $.clone().text();if(J.length>z$)throw new m(413,`Request body exceeds ${z$}-byte limit`);if(!J)return{};let G=JSON.parse(J);return G&&typeof G==="object"&&!Array.isArray(G)?G:{}}catch(J){if(J instanceof m)throw J;throw new m(400,`Invalid JSON body: ${J.message}`)}}function L$($){if($==null)return null;if(typeof $==="number")return Number.isFinite($)&&$>0?$:null;if(typeof $==="string"){let O=$.trim();if(!O)return null;if(/^\d+$/.test(O)){let J=Number(O);return Number.isFinite(J)&&J>0?J:null}return O}return null}function i$($){let O=$.bearerToken;if(typeof O==="function"){let G=O.call($);if(G)return G}let J=$.headers?.get?.("authorization")||$.headers?.get?.("Authorization")||"";if(typeof J==="string"&&J.startsWith("Bearer "))return J.substring(7);return null}async function l($){let O=$._authenticatedUser;if(O)return O;let J=i$($);if(!J)return null;try{let{Auth:G}=await import("@stacksjs/auth"),Z=await G.getUserFromToken(J);if(Z)$._authenticatedUser=Z;return Z||null}catch{return null}}function a($,O){if($==null||O==null)return!1;if(Array.isArray(O))return O.some((J)=>String(J)===String($));return String($)===String(O)}function AO($){let O=$?.attributes||{},J=(G)=>Object.prototype.hasOwnProperty.call(O,G);return J("teamId")||J("team_id")?"team_id":null}function NO($){let O=i$($),J=$.headers?.get?.("cookie")||"";return{bearerToken:()=>O,cookies:{get:(G)=>{for(let Z of J.split(";")){let z=Z.indexOf("=");if(z===-1)continue;if(Z.slice(0,z).trim()===G)return decodeURIComponent(Z.slice(z+1).trim())}return null}}}}function n$($){if($?.ownership)return $.ownership;let O=AO($);if(!O)return null;return{field:O,resolve:async(J,G)=>{let{resolveAuthenticatedTeamId:Z}=await import("@stacksjs/auth");return Z(NO(G))}}}async function e($,O,J){let G=n$($);if(!G||!G.field||typeof G.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let Z=typeof G.bypass==="function"?!!G.bypass(O,J):!1,z=null;try{z=await G.resolve(O,J)}catch{z=null}return{enforced:!0,value:z,field:String(G.field),bypass:Z}}async function h$($,O,J,G){let Z=$?.authedFill?.[O];if(!Z)return{};if(typeof Z==="function")try{let z=await Z(J,G);return z&&typeof z==="object"?z:{}}catch{return{}}if(typeof Z==="object"){let z={};for(let[K,Y]of Object.entries(Z))try{z[K]=typeof Y==="function"?await Y(J,G):Y}catch{}return z}return{}}var SO,B$,P,z$=1048576,HO;var t$=K$(async()=>{C$();P$();SO=p$("config/qb.ts");try{let $=(await import(SO)).default;g$($??y$)}catch{S$.debug("[orm] No config/qb.ts override found \u2014 deriving config from DB_CONNECTION");let $=n.DB_CONNECTION||"sqlite";g$({...y$,dialect:$,database:$==="sqlite"?{database:n.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:n.DB_DATABASE||"stacks",host:n.DB_HOST||"127.0.0.1",port:n.DB_PORT||($==="postgres"?5432:3306),username:n.DB_USERNAME||($==="postgres"?"postgres":"root"),password:n.DB_PASSWORD||""}})}B$=await f$({defaultsRoot:BO("framework/defaults/app/Models"),userRoot:p$("app/Models"),onImportError:($,O)=>S$.warn(`[orm] Could not load model ${$}: ${O.message}`)}),P=jO();for(let[$,O]of Object.entries(B$)){let J=O.traits?.useApi;if(!J)continue;let G=typeof J==="object"?J:{},Z=G.uri||O.table||$.toLowerCase()+"s",z=G.routes||["index","show","store","update","destroy"],K=O.table||Z,Y=_$(O),W=m$(O),Q=`/api/${Z}`,U=I$(O.attributes,W),{read:M,write:C,declared:_}=V$(J);if(["store","update","destroy"].some((x)=>z.includes(x))&&_&&C.length===0)S$.warn(`[orm] ${$}: registering UNAUTHENTICATED mutating routes at ${Q} (explicit \`middleware: []\` opt-out)`);let H=!!n$(O),q=H&&!M.includes("auth")?["auth",...M]:M,f=(x,L=q)=>{let X=x;for(let T of L)if(X&&typeof X.middleware==="function")X=X.middleware(T);return X};if(z.includes("index")&&!u("GET",Q))f(h.get(Q,async(x)=>{try{let L=new URL(x.url),{page:X,perPage:T,offset:S}=M$(L.searchParams),A=L.searchParams.get("sort"),j=P.selectFrom(K);j=F$(j,A,U);let b=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[k,R]of L.searchParams.entries()){if(b.has(k)||!R)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(k))continue;let i=U.get(k);if(i)j=j.where(i,"=",R)}let D=L.searchParams.get("search");if(D&&Y.length>0){let k=Y.slice(0,5);j=j.where((R)=>{for(let i of k)R=R.orWhere(F(i),"like",`%${D}%`);return R})}let E=L.searchParams.get("fields");if(E){let k=E.split(",").map((R)=>R.trim()).filter((R)=>/^[a-z_][a-z0-9_]*$/i.test(R)).map((R)=>F(R));if(k.length>0)j=j.select(k)}let I=!!O.traits?.useSoftDeletes,V=L.searchParams.get("withTrashed")==="true",p=L.searchParams.get("onlyTrashed")==="true";if(I&&!V)j=p?j.whereNotNull("deleted_at"):j.whereNull("deleted_at");let N=H?await e(O,await l(x),x):{enforced:!1,value:null,field:"",bypass:!1};if(N.enforced&&!N.bypass){if(N.value==null||Array.isArray(N.value)&&N.value.length===0){let k=T$(L,X,T,0,!1,void 0);return new Response(JSON.stringify({data:[],...k,meta:Z$(L,X,T,0,!1,void 0)}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}j=Array.isArray(N.value)?j.where(N.field,"in",N.value):j.where(N.field,"=",N.value)}let w=await j.limit(T+1).offset(S).get()||[],v=w.length>T,r=(v?w.slice(0,T):w).map((k)=>s($$(k,O),W)),N$=L.searchParams.get("include");if(N$)r=await c$(r,O,N$,B$);let a$=L.searchParams.get("with_count")==="true",t;if(a$)try{let k=P.selectFrom(K);if(N.enforced&&!N.bypass&&N.value!=null)k=Array.isArray(N.value)?k.where(N.field,"in",N.value):k.where(N.field,"=",N.value);let R=await k.count(),i=typeof R==="number"?R:Number(R?.count??R);if(Number.isFinite(i))t=i}catch{}let J$={"Content-Type":"application/json"};if(t!==void 0&&!Number.isNaN(t))J$["X-Total-Count"]=String(t);J$["Cache-Control"]=N.enforced&&!N.bypass?"private, no-store":"public, max-age=15, must-revalidate",J$.Vary="Authorization";let e$=T$(L,X,T,r.length,v,t);return new Response(JSON.stringify({data:r,...e$,meta:Z$(L,X,T,r.length,v,t)}),{status:200,headers:J$})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to fetch ${Z}`,detail:String(L)},500)}}));if(z.includes("show")&&!u("GET",`${Q}/{id}`))f(h.get(`${Q}/{id}`,async(x)=>{try{let L=L$(x.params?.id);if(L==null)return B({error:"Invalid ID parameter"},400);let X=await P.selectFrom(K).where({id:L}).executeTakeFirst();if(!X)return B({error:`${$} not found`},404);let T=new URL(x.url);if(O.traits?.useSoftDeletes&&X.deleted_at&&T.searchParams.get("withTrashed")!=="true")return B({error:`${$} not found`},404);let S=H?await e(O,await l(x),x):{enforced:!1,value:null,field:"",bypass:!1};if(S.enforced&&!S.bypass){if(S.value==null||!a(X[S.field],S.value))return B({error:`${$} not found`},404)}let A=s($$(X,O),W),j=T.searchParams.get("include");if(j){let[V]=await c$([A],O,j,B$);A=V}let b=A?.updated_at||A?.created_at,D=b?`W/"${A.id}-${String(b)}"`:void 0,E=x.headers?.get?.("if-none-match");if(D&&E&&E===D)return new Response(null,{status:304,headers:{ETag:D}});let I={"Content-Type":"application/json"};if(D)I.ETag=D;return I["Cache-Control"]=S.enforced&&!S.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:A}),{status:200,headers:I})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to fetch ${$}`,detail:String(L)},500)}}));if(z.includes("store")&&!u("POST",Q))f(h.post(Q,async(x)=>{try{let L=await j$(x),X=Y$(L,W),T=X$(X,Y),S=await l(x);if(S){let I=await h$(O,"creating",S,x);for(let[V,p]of Object.entries(I))if(p!==void 0&&p!==null&&T[V]===void 0)T[V]=p}if(Object.keys(T).length===0)return B({error:"No fillable fields provided"},422);let A=b$(T,O,"creating");if(!A.valid)return B({error:"Validation failed",errors:A.errors},422);if(O.traits?.useTimestamps!==!1){let I=new Date().toISOString();T.created_at=I,T.updated_at=I}let j=await w$(T,O),b=W$(v$(j,O)),D=await P.insertInto(K).values(b).execute(),E=b;try{let I=D?.lastInsertRowid??D?.insertId??D;if(I){let V=await P.selectFrom(K).where({id:I}).executeTakeFirst();if(V)E=V}}catch{}return B({data:s($$(E,O),W)},201)}catch(L){let{status:X,body:T}=Q$(L,$,"create");return B(T,X)}}),C);if(z.includes("update")){let x=async(L)=>{try{let X=L$(L.params?.id);if(X==null)return B({error:"Invalid ID parameter"},400);let T=await j$(L),S=Y$(T,W),A=X$(S,Y),j=await l(L);if(j){let N=await h$(O,"updating",j,L);for(let[w,v]of Object.entries(N))if(v!==void 0&&v!==null&&A[w]===void 0)A[w]=v}if(Object.keys(A).length===0)return B({error:"No fillable fields provided"},422);let b=b$(A,O,"updating");if(!b.valid)return B({error:"Validation failed",errors:b.errors},422);let D=await P.selectFrom(K).where({id:X}).executeTakeFirst();if(!D)return B({error:`${$} not found`},404);let E=await e(O,j,L);if(E.enforced&&!E.bypass){if(!j)return B({error:"Auth required"},401);let N=D[E.field];if(!a(N,E.value))return B({error:`Not your ${$}`},403);let w=Object.keys(A).find((v)=>F(v)===F(E.field));if(w!==void 0&&!a(A[w],E.value))return B({error:`Cannot reassign ${$} ownership`},403)}if(O.traits?.useTimestamps!==!1)A.updated_at=new Date().toISOString();let I=await w$(A,O),V=W$(v$(I,O));await P.updateTable(K).set(V).where({id:X}).execute();let p={...D,...V};try{let N=await P.selectFrom(K).where({id:X}).executeTakeFirst();if(N)p=N}catch{}return B({data:s($$(p,O),W)})}catch(X){let{status:T,body:S}=Q$(X,$,"update");return B(S,T)}};if(!u("PUT",`${Q}/{id}`))f(h.put(`${Q}/{id}`,x),C);if(!u("PATCH",`${Q}/{id}`))f(h.patch(`${Q}/{id}`,x),C)}let g=!!O.traits?.useSoftDeletes;if(z.includes("destroy")&&!u("DELETE",`${Q}/{id}`))f(h.delete(`${Q}/{id}`,async(x)=>{try{let L=L$(x.params?.id);if(L==null)return B({error:"Invalid ID parameter"},400);let X=await P.selectFrom(K).where({id:L}).executeTakeFirst();if(!X)return B({error:`${$} not found`},404);let T=await l(x),S=await e(O,T,x);if(S.enforced&&!S.bypass){if(!T)return B({error:"Auth required"},401);let A=X[S.field];if(!a(A,S.value))return B({error:`Not your ${$}`},403)}if(g){let A=new Date().toISOString();await P.updateTable(K).set({deleted_at:A,updated_at:A}).where({id:L}).execute()}else await P.deleteFrom(K).where({id:L}).execute();return new Response(null,{status:204})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to delete ${$}`,detail:String(L)},500)}}),C);if(z.includes("destroy")&&!u("POST",`${Q}/bulk-delete`))f(h.post(`${Q}/bulk-delete`,async(x)=>{try{let X=(await j$(x))?.ids;if(!Array.isArray(X)||X.length===0)return B({error:"An array of IDs is required"},422);if(X.length>100)return B({error:"Cannot delete more than 100 records at once"},422);let T=[],S=[];for(let D of X){let E=L$(D);if(E!=null)T.push(E);else S.push(D)}if(S.length>0)return B({error:"Invalid IDs in batch",invalid:S},422);let A=await l(x),j=await e(O,A,x);if(j.enforced&&!j.bypass){if(!A)return B({error:"Auth required"},401);if(j.value==null)return B({error:"Caller has no ownership identity"},403);let D=await P.selectFrom(K).select(["id",j.field]).execute(),E=new Set(D.filter((V)=>a(V[j.field],j.value)).map((V)=>String(V.id))),I=T.filter((V)=>!E.has(String(V)));if(I.length>0)return B({error:`Cannot delete ${$} you don't own`,ids:I},403)}let b=new Date().toISOString();for(let D of T)if(g)await P.updateTable(K).set({deleted_at:b,updated_at:b}).where({id:D}).execute();else await P.deleteFrom(K).where({id:D}).execute();return B({message:`Successfully deleted ${T.length} ${Z}`})}catch(L){if(L instanceof m){let X={error:L.message};if(L.details!==void 0)X.details=L.details;return B(X,L.status||400)}return B({error:`Failed to bulk delete ${Z}`,detail:String(L)},500)}}),C)}HO=h});class H${data;status;headers;isOk;constructor($,O,J,G){this.data=$;this.status=O;this.headers=J;this.isOk=G}ok(){return this.status===200}created(){return this.status===201}accepted(){return this.status===202}noContent(){return this.status===204}movedPermanently(){return this.status===301}found(){return this.status===302}badRequest(){return this.status===400}unauthorized(){return this.status===401}paymentRequired(){return this.status===402}forbidden(){return this.status===403}notFound(){return this.status===404}requestTimeout(){return this.status===408}conflict(){return this.status===409}unprocessableEntity(){return this.status===422}tooManyRequests(){return this.status===429}serverError(){return this.status===500}}class D${defaultHeaders={Accept:"application/json","Content-Type":"application/json"};queryParams;bodyData;isFormData=!1;customHeaders={};attachments=[];isMultipart=!1;digestAuth;withQueryParams($){return this.queryParams=$,this}withHeaders($){return this.customHeaders={...this.customHeaders,...$},this}accept($){return this.defaultHeaders.Accept=$,this}acceptJson(){return this.accept("application/json")}withToken($){return this.customHeaders.Authorization=`Bearer ${$}`,this}withBasicAuth($,O){let J=btoa(`${$}:${O}`);return this.customHeaders.Authorization=`Basic ${J}`,this}withDigestAuth($,O){return this.digestAuth={username:$,password:O},this}withBody($){return this.bodyData=$,this}asForm(){return this.isFormData=!0,this.defaultHeaders["Content-Type"]="application/x-www-form-urlencoded",this}attach($,O,J,G){let Z=typeof O==="string"?new Blob([O],{type:G?.["Content-Type"]||"text/plain"}):O;return this.attachments.push({name:$,content:Z,filename:J,headers:G}),this.isMultipart=!0,delete this.defaultHeaders["Content-Type"],this}getHeaders(){return{...this.defaultHeaders,...this.customHeaders}}addQueryParams($){if(!this.queryParams)return $;let O=new URLSearchParams;Object.entries(this.queryParams).forEach(([Z,z])=>{if(z!=null)O.append(Z,String(z))});let J=O.toString();if(!J)return $;let G=$.includes("?");return $+(G?"&":"?")+J}async formatBody($){let O=$||this.bodyData;if(this.isMultipart){let J=new FormData;if(O)Object.entries(O).forEach(([G,Z])=>{J.append(G,String(Z))});for(let G of this.attachments)if(G.headers){let Z=G.content instanceof Blob?new Blob([G.content],{type:G.headers["Content-Type"]}):G.content;J.append(G.name,Z,G.filename)}else J.append(G.name,G.content,G.filename);return J}if(this.isFormData&&O){let J=new URLSearchParams;return Object.entries(O).forEach(([G,Z])=>{if(Z!=null)J.append(G,String(Z))}),J.toString()}return O?JSON.stringify(O):void 0}resetState(){this.queryParams=void 0,this.bodyData=void 0,this.isFormData=!1,this.isMultipart=!1,this.customHeaders={},this.attachments=[],this.digestAuth=void 0,this.defaultHeaders["Content-Type"]="application/json"}async handleDigestAuth($,O,J,G){if($.status!==401||!this.digestAuth)return $;let Z=$.headers.get("WWW-Authenticate");if(!Z?.startsWith("Digest "))return $;let z=Z.substring(7).split(",").reduce((_,y)=>{let[H,q]=y.trim().split("=");if(H)_[H]=q?.replace(/["']/g,"")??"";return _},{}),K=await this.generateMD5(`${this.digestAuth.username}:${z.realm}:${this.digestAuth.password}`),Y=await this.generateMD5(`${J}:${O}`),W="00000001",Q=await this.generateMD5(Date.now().toString()).then((_)=>_.substring(0,8)),U=await this.generateMD5(`${K}:${z.nonce}:${W}:${Q}:${z.qop}:${Y}`),M={username:`"${this.digestAuth.username}"`,realm:`"${z.realm}"`,nonce:`"${z.nonce}"`,uri:`"${O}"`,algorithm:z.algorithm?`"${z.algorithm}"`:void 0,qop:`"${z.qop}"`,nc:W,cnonce:`"${Q}"`,response:`"${U}"`,opaque:z.opaque?`"${z.opaque}"`:void 0},C=Object.entries(M).filter(([_,y])=>y!==void 0).map(([_,y])=>`${_}=${y}`).join(", ");return this.customHeaders.Authorization=`Digest ${C}`,fetch(O,{method:J,headers:this.getHeaders(),body:G?this.formatBody(G):void 0})}async generateMD5($){let J=new TextEncoder().encode($),G=await crypto.subtle.digest("SHA-256",J);return Array.from(new Uint8Array(G)).map((z)=>z.toString(16).padStart(2,"0")).join("")}async request($,O,J){let G=this.addQueryParams($),Z=await this.formatBody(J),z=await fetch(G,{method:O,headers:this.getHeaders(),body:Z});if(this.digestAuth)z=await this.handleDigestAuth(z,G,O,J);let K=await z.json();return this.resetState(),new H$(K,z.status,z.headers,z.ok)}async get($){return this.request($,"GET")}async post($,O){return this.request($,"POST",O)}async put($,O){return this.request($,"PUT",O)}async patch($,O){return this.request($,"PATCH",O)}async delete($){return this.request($,"DELETE")}}var CO=new D$;import{path as o$}from"@stacksjs/path";function DO($){if(!$||typeof $!=="object")return{type:"string"};let O=$,J=O._type??"string",G={type:J==="array"?"array":J};if(typeof O._min==="number")G[J==="string"?"minLength":"minimum"]=O._min;if(typeof O._max==="number")G[J==="string"?"maxLength":"maximum"]=O._max;if(O._email)G.format="email";if(O._url)G.format="uri";if(O._uuid)G.format="uuid";if(Array.isArray(O._enum))G.enum=O._enum;return G}async function UO($){if(typeof $!=="string"||!$.includes("Actions"))return null;try{let{path:O}=await import("@stacksjs/path"),J=[O.appPath(`${$}.ts`),O.storagePath(`framework/defaults/app/${$}.ts`)];for(let G of J)try{if(!await Bun.file(G).exists())continue;let K=(await import(G)).default;if(K&&typeof K==="object"&&"validations"in K){let Y=K.validations;return Y&&typeof Y==="object"?Y:null}return null}catch{}}catch{}return null}async function iO($={}){let O=$.portable??!0,{listRegisteredRoutes:J}=await import("@stacksjs/router");try{let{loadRoutes:W}=await import("@stacksjs/router"),{default:Q}=await import(o$.appPath("Routes.ts"));await W(Q)}catch(W){let Q=W instanceof Error?W.message:String(W);if(O)throw Error(`[generateOpenApi] Refusing to emit a partial spec: failed to load routes/api.ts + framework routes: ${Q}`);console.warn(`[generateOpenApi] Failed to load routes/api.ts + framework routes: ${Q}`)}try{await t$().then(() => u$)}catch(W){let Q=W instanceof Error?W.message:String(W);if(O)throw Error(`[generateOpenApi] Refusing to emit a partial spec: failed to load useApi-generated ORM routes: ${Q}`);console.warn(`[generateOpenApi] Failed to load useApi-generated ORM routes: ${Q}`)}let G=(W)=>W.replace(/(^|\/):(\w+)(?=$|\/)/g,"$1{$2}"),Z=[...J()].map((W)=>({route:W,oasPath:G(W.path),method:W.method.toLowerCase()})).sort((W,Q)=>{if(W.oasPath!==Q.oasPath)return W.oasPath<Q.oasPath?-1:1;return W.method<Q.method?-1:W.method>Q.method?1:0});if(O&&Z.length===0)throw Error("[generateOpenApi] Refusing to emit an empty spec: no routes were registered. This usually means route loading failed silently rather than that the app has no API.");let z="Stacks API";if(!O)try{let{config:W}=await import("@stacksjs/config");if(W.app?.name)z=`${W.app.name} API`}catch{}let K={openapi:"3.0.0",info:{title:z,version:"1.0.0"},paths:{},components:{schemas:{}}},Y=new Set;for(let{route:W,oasPath:Q,method:U}of Z){if(!K.paths[Q])K.paths[Q]={};let M=[];for(let H of W.path.matchAll(/\{(\w+)\}/g))if(H[1])M.push(H[1]);for(let H of W.path.matchAll(/(?:^|\/):(\w+)(?=$|\/)/g))if(H[1])M.push(H[1]);let C=W.name??`${U}_${Q.replace(/[^a-z0-9]/gi,"_")}`,_=C;if(Y.has(_)){_=`${C}_${U}`;let H=2;while(Y.has(_))_=`${C}_${U}_${H++}`}Y.add(_);let y={summary:W.name??W.path,operationId:_,parameters:M.map((H)=>({name:H,in:"path",required:!0,schema:{type:"string"}})),responses:{200:{description:"Successful response",content:{"application/json":{schema:{type:"object"}}}},422:{description:"Validation failed"},500:{description:"Server error"}}};if(U!=="get"&&U!=="head"&&W.name){let q=`Actions/${W.name.split(".").map((g)=>g.charAt(0).toUpperCase()+g.slice(1)).join("")}Action`,f=await UO(q);if(f&&Object.keys(f).length>0){let g={type:"object",properties:{},required:[]},x=g.properties,L=g.required;for(let[X,T]of Object.entries(f)){let S=T?.rule;if(x[X]=DO(S),S?._required)L.push(X)}if(L.length===0)delete g.required;y.requestBody={required:L.length>0,content:{"application/json":{schema:g}}}}}K.paths[Q][U]=y}if($.write!==!1){let Q=Bun.file(o$.frameworkPath("api/openapi.json")).writer();Q.write(JSON.stringify(K,null,2)),await Q.end()}return K}var _O=["get","put","post","delete","options","head","patch","trace"];function EO($){return typeof $==="string"?JSON.stringify($):String($)}function d($){if(!$)return"unknown";if($.enum?.length)return $.enum.map(EO).join(" | ");if($.type==="string")return"string";if($.type==="number"||$.type==="integer")return"number";if($.type==="boolean")return"boolean";if($.type==="null")return"null";if($.type==="array")return`Array<${d($.items)}>`;if($.type==="object"||$.properties||$.additionalProperties){let O=new Set($.required||[]),J=Object.entries($.properties||{}).map(([G,Z])=>`${JSON.stringify(G)}${O.has(G)?"":"?"}: ${d(Z)}`);if($.additionalProperties){let G=$.additionalProperties===!0?"unknown":d($.additionalProperties);J.push(`[key: string]: ${G}`)}return J.length?`{ ${J.join("; ")} }`:"Record<string, unknown>"}return"unknown"}function IO($=[]){return` parameters: {
3
3
  ${["query","header","path","cookie"].map((J)=>{let G=$.filter((z)=>z.in===J);if(!G.length)return` ${J}?: never`;let Z=G.map((z)=>`${JSON.stringify(z.name)}${z.required?"":"?"}: ${d(z.schema)}`);return` ${J}${G.every((z)=>!z.required)?"?":""}: { ${Z.join("; ")} }`}).join(`
4
4
  `)}
5
- }`}function a$($){if(!$||!Object.keys($).length)return"never";return`{ ${Object.entries($).map(([O,J])=>`${JSON.stringify(O)}: ${d(J.schema)}`).join("; ")} }`}function kO($){let O=$.requestBody?`
6
- requestBody${$.requestBody.required?"":"?"}: { content: ${a$($.requestBody.content)} }`:`
7
- requestBody?: never`,J=Object.entries($.responses||{}).map(([G,Z])=>` ${JSON.stringify(G)}: { content: ${a$(Z.content)} }`);return`{
8
- ${CO($.parameters)}${O}
5
+ }`}function s$($){if(!$||!Object.keys($).length)return"never";return`{ ${Object.entries($).map(([O,J])=>`${JSON.stringify(O)}: ${d(J.schema)}`).join("; ")} }`}function FO($){let O=$.requestBody?`
6
+ requestBody${$.requestBody.required?"":"?"}: { content: ${s$($.requestBody.content)} }`:`
7
+ requestBody?: never`,J=Object.entries($.responses||{}).map(([G,Z])=>` ${JSON.stringify(G)}: { content: ${s$(Z.content)} }`);return`{
8
+ ${IO($.parameters)}${O}
9
9
  responses: {
10
10
  ${J.join(`
11
11
  `)}
12
12
  }
13
- }`}function aO($){let O=Object.entries($.paths||{}).map(([G,Z])=>{let z=VO.map((K)=>{let Y=Z[K];return Y?` ${K}: ${kO(Y)}`:` ${K}?: never`});return` ${JSON.stringify(G)}: {
13
+ }`}function uO($){let O=Object.entries($.paths||{}).map(([G,Z])=>{let z=_O.map((K)=>{let Y=Z[K];return Y?` ${K}: ${FO(Y)}`:` ${K}?: never`});return` ${JSON.stringify(G)}: {
14
14
  ${z.join(`
15
15
  `)}
16
16
  }`}),J=Object.entries($.components?.schemas||{}).map(([G,Z])=>` ${JSON.stringify(G)}: ${d(Z)}`);return`/**
@@ -29,4 +29,4 @@ ${J.join(`
29
29
  `)}
30
30
  }
31
31
  }
32
- `}class c{static instance=new c;isMissing(){return!0}}class J${data;constructor($){this.data=$}}class e${condition;value;defaultValue;constructor($,O,J=new c){this.condition=$;this.value=O;this.defaultValue=J}resolve(){return(typeof this.condition==="function"?this.condition():this.condition)?this.value:this.defaultValue}}class $O{resource;additional={};request;static wrap="data";static additionalMeta={};constructor($){this.resource=$}withRequest($){return this.request=$,this}withAdditional($){return this.additional={...this.additional,...$},this}resolve($){let O=this.toArray($||this.request);return this.filterAndResolve(O)}toResponse($){let O=this.resolve($),J=this.constructor.wrap;if(J)return{[J]:O,...this.additional};return{...O,...this.additional}}toJson($){return JSON.stringify(this.toResponse($))}toJSON(){return this.toResponse()}static collection($){return new N$($,this)}when($,O,J){if(typeof $==="function"?$():$)return typeof O==="function"?O():O;return J!==void 0?J:c.instance}whenNotNull($,O){if($===null||$===void 0)return c.instance;return O?O($):$}whenLoaded($,O,J){let G=this.resource;if(!(($ in G)&&G[$]!==void 0))return J!==void 0?J:c.instance;if(O!==void 0)return typeof O==="function"?O():O;return G[$]}whenCounted($,O){let J=this.resource,G=`${$}_count`;if(G in J)return J[G];return O!==void 0?O:c.instance}merge($){return new J$($)}mergeWhen($,O){if(!(typeof $==="function"?$():$))return c.instance;let G=typeof O==="function"?O():O;return new J$(G)}static MAX_RESOLVE_DEPTH=20;filterAndResolve($,O=0){if(O>=$O.MAX_RESOLVE_DEPTH)return $;let J={};for(let[G,Z]of Object.entries($)){if(Z instanceof c)continue;if(Z instanceof J$){Object.assign(J,this.filterAndResolve(Z.data,O+1));continue}if(Z instanceof e$){let z=Z.resolve();if(!(z instanceof c))J[G]=z;continue}if(Z!==null&&typeof Z==="object"&&!Array.isArray(Z)&&!(Z instanceof Date)){J[G]=this.filterAndResolve(Z,O+1);continue}if(Array.isArray(Z)){J[G]=Z.filter((z)=>!(z instanceof c)).map((z)=>{if(z instanceof J$)return z.data;if(z!==null&&typeof z==="object"&&!(z instanceof Date))return this.filterAndResolve(z,O+1);return z});continue}J[G]=Z}return J}static withoutWrapping(){this.wrap=null}static wrapWith($){this.wrap=$}}class N${resources;ResourceClass;additional={};request;static wrap="data";constructor($,O){this.resources=$,this.ResourceClass=O}withRequest($){return this.request=$,this}withAdditional($){return this.additional={...this.additional,...$},this}resolve($){let O=$||this.request;return this.resources.map((J)=>{let G=new this.ResourceClass(J);if(O)G.withRequest(O);return G.resolve(O)})}toResponse($){let O=this.resolve($),J=this.constructor.wrap;if(J)return{[J]:O,...this.additional};return{data:O,...this.additional}}toJson($){return JSON.stringify(this.toResponse($))}count(){return this.resources.length}isEmpty(){return this.resources.length===0}isNotEmpty(){return this.resources.length>0}}class OO extends N${meta;links;constructor($,O){super($.data,O);this.meta=$.meta,this.links=$.links}static fromPagination($,O,J){let{currentPage:G,perPage:Z,total:z,baseUrl:K=""}=J,Y=Math.ceil(z/Z),W=z>0?(G-1)*Z+1:null,Q=z>0?Math.min(G*Z,z):null;return new OO({data:$,meta:{current_page:G,from:W,last_page:Y,per_page:Z,to:Q,total:z},links:{first:`${K}?page=1`,last:`${K}?page=${Y}`,prev:G>1?`${K}?page=${G-1}`:null,next:G<Y?`${K}?page=${G+1}`:null}},O)}toResponse($){return{data:this.resolve($),meta:this.meta,links:this.links,...this.additional}}}function $J($,O){let J=O($);return{toResponse:()=>({data:J}),toJson:()=>JSON.stringify({data:J})}}function OJ($,O){let J=$.map(O);return{toResponse:()=>({data:J}),toJson:()=>JSON.stringify({data:J})}}export{d as schemaType,$J as resource,aO as renderOpenApiTypes,dO as generateOpenApi,fO as fetcher,OJ as collection,N$ as ResourceCollection,OO as PaginatedResourceCollection,c as MissingValue,J$ as MergeValue,$O as JsonResource,e$ as ConditionalValue};
32
+ `}class c{static instance=new c;isMissing(){return!0}}class O${data;constructor($){this.data=$}}class l${condition;value;defaultValue;constructor($,O,J=new c){this.condition=$;this.value=O;this.defaultValue=J}resolve(){return(typeof this.condition==="function"?this.condition():this.condition)?this.value:this.defaultValue}}class d${resource;additional={};request;static wrap="data";static additionalMeta={};constructor($){this.resource=$}withRequest($){return this.request=$,this}withAdditional($){return this.additional={...this.additional,...$},this}resolve($){let O=this.toArray($||this.request);return this.filterAndResolve(O)}toResponse($){let O=this.resolve($),J=this.constructor.wrap;if(J)return{[J]:O,...this.additional};return{...O,...this.additional}}toJson($){return JSON.stringify(this.toResponse($))}toJSON(){return this.toResponse()}static collection($){return new A$($,this)}when($,O,J){if(typeof $==="function"?$():$)return typeof O==="function"?O():O;return J!==void 0?J:c.instance}whenNotNull($,O){if($===null||$===void 0)return c.instance;return O?O($):$}whenLoaded($,O,J){let G=this.resource;if(!(($ in G)&&G[$]!==void 0))return J!==void 0?J:c.instance;if(O!==void 0)return typeof O==="function"?O():O;return G[$]}whenCounted($,O){let J=this.resource,G=`${$}_count`;if(G in J)return J[G];return O!==void 0?O:c.instance}merge($){return new O$($)}mergeWhen($,O){if(!(typeof $==="function"?$():$))return c.instance;let G=typeof O==="function"?O():O;return new O$(G)}static MAX_RESOLVE_DEPTH=20;filterAndResolve($,O=0){if(O>=d$.MAX_RESOLVE_DEPTH)return $;let J={};for(let[G,Z]of Object.entries($)){if(Z instanceof c)continue;if(Z instanceof O$){Object.assign(J,this.filterAndResolve(Z.data,O+1));continue}if(Z instanceof l$){let z=Z.resolve();if(!(z instanceof c))J[G]=z;continue}if(Z!==null&&typeof Z==="object"&&!Array.isArray(Z)&&!(Z instanceof Date)){J[G]=this.filterAndResolve(Z,O+1);continue}if(Array.isArray(Z)){J[G]=Z.filter((z)=>!(z instanceof c)).map((z)=>{if(z instanceof O$)return z.data;if(z!==null&&typeof z==="object"&&!(z instanceof Date))return this.filterAndResolve(z,O+1);return z});continue}J[G]=Z}return J}static withoutWrapping(){this.wrap=null}static wrapWith($){this.wrap=$}}class A${resources;ResourceClass;additional={};request;static wrap="data";constructor($,O){this.resources=$,this.ResourceClass=O}withRequest($){return this.request=$,this}withAdditional($){return this.additional={...this.additional,...$},this}resolve($){let O=$||this.request;return this.resources.map((J)=>{let G=new this.ResourceClass(J);if(O)G.withRequest(O);return G.resolve(O)})}toResponse($){let O=this.resolve($),J=this.constructor.wrap;if(J)return{[J]:O,...this.additional};return{data:O,...this.additional}}toJson($){return JSON.stringify(this.toResponse($))}count(){return this.resources.length}isEmpty(){return this.resources.length===0}isNotEmpty(){return this.resources.length>0}}class r$ extends A${meta;links;constructor($,O){super($.data,O);this.meta=$.meta,this.links=$.links}static fromPagination($,O,J){let{currentPage:G,perPage:Z,total:z,baseUrl:K=""}=J,Y=Math.ceil(z/Z),W=z>0?(G-1)*Z+1:null,Q=z>0?Math.min(G*Z,z):null;return new r$({data:$,meta:{current_page:G,from:W,last_page:Y,per_page:Z,to:Q,total:z},links:{first:`${K}?page=1`,last:`${K}?page=${Y}`,prev:G>1?`${K}?page=${G-1}`:null,next:G<Y?`${K}?page=${G+1}`:null}},O)}toResponse($){return{data:this.resolve($),meta:this.meta,links:this.links,...this.additional}}}function oO($,O){let J=O($);return{toResponse:()=>({data:J}),toJson:()=>JSON.stringify({data:J})}}function sO($,O){let J=$.map(O);return{toResponse:()=>({data:J}),toJson:()=>JSON.stringify({data:J})}}export{d as schemaType,oO as resource,uO as renderOpenApiTypes,iO as generateOpenApi,CO as fetcher,sO as collection,A$ as ResourceCollection,r$ as PaginatedResourceCollection,c as MissingValue,O$ as MergeValue,d$ as JsonResource,l$ as ConditionalValue};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/api",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.232",
5
+ "version": "0.70.234",
6
6
  "description": "The Stacks API utilities.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -31,13 +31,11 @@
31
31
  "exports": {
32
32
  ".": {
33
33
  "types": "./dist/index.d.ts",
34
- "development": "./src/index.ts",
35
34
  "bun": "./dist/index.js",
36
35
  "import": "./dist/index.js",
37
36
  "default": "./dist/index.js"
38
37
  },
39
38
  "./*": {
40
- "development": "./src/*",
41
39
  "bun": "./dist/*",
42
40
  "import": "./dist/*",
43
41
  "default": "./dist/*"
@@ -57,6 +55,6 @@
57
55
  },
58
56
  "devDependencies": {
59
57
  "better-dx": "^0.2.17",
60
- "@stacksjs/utils": "0.70.232"
58
+ "@stacksjs/utils": "0.70.234"
61
59
  }
62
60
  }