@stacksjs/orm 0.74.34 → 0.74.35

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/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var $t=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as ve}from"@stacksjs/database";async function It(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=ve.deleteFrom(e);u=o(u);let l=await u.execute(),d=Array.isArray(l)?l:[l],f=Number(d[0]?.numDeletedRows??d.length??0);return ne.info(`Pruned ${f} records from ${e}`),f}let a=new Date;a.setDate(a.getDate()-n);let i=await ve.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return ne.info(`Pruned ${c} records from ${e} older than ${n} days`),c}catch(a){throw ne.error(`Failed to prune ${e}:`,a),a}}async function Wa(e,t={}){return It(e,t)}function Qa(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as jt,createDecipheriv as Bt,createHash as Nt,randomBytes as qt}from"crypto";import{log as z}from"@stacksjs/logging";var Me="enc:",De="aes-256-gcm",Lt=12,V=null;async function Ee(){if(V)return V;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return V=Nt("sha256").update(e).digest(),V}function j(e){return typeof e==="string"&&e.startsWith(Me)}async function re(e){if(e==null)return e;if(j(e))return e;if(typeof e!=="string")return e;let t=await Ee();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=qt(Lt),r=jt(De,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${Me}${n.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function oe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!j(e))return e;try{let t=await Ee();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Bt(De,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function ae(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Ut}from"@stacksjs/database";import{log as N}from"@stacksjs/logging";var Kt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],$e="model_audits",ue=null;function Wt(e){ue=e}async function ie(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Kt.some((o)=>o.test(n)))continue;t[n]=r}return t}function B(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Qt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function se(e,t=!1){try{let{db:n}=await import("@stacksjs/database");await n.insertInto($e).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Ut()}).executeTakeFirst()}catch(n){if(N.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function Ie(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database");return(await n.selectFrom($e).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Fe(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Fe(o.new_values):o.new_values}))}catch(n){return N.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function Fe(e){try{return JSON.parse(e)}catch{return e}}function je(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Be(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ie(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=B(d),m=f?.[n];if(m!=null){let p=await ie();await se({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:H(f),user_id:p},o)}}catch(f){if(N.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?B(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=B(p)??(typeof f==="function"?B(await f.call(a,l)):null),{old:w,next:b}=Qt(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:t,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(N.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:t,auditable_id:f,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(N.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})}};u("delete"),u("softDelete")}import{db as Vt,sql as zt,sqlDateTime as ce}from"@stacksjs/database";function P(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",L="commentables";function Ht(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}function le(e){let t=Vt;return{async comments(n){return P(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(zt`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(P(n,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:ce(),updated_at:ce()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){P(n,"upvoteComment"),P(r,"upvoteComment");let o=()=>t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(q).values({upvoteable_id:n,upvoteable_type:L,user_id:r,created_at:ce()}).execute()}catch(i){if(!Ht(i))throw i}return await o()},async removeCommentUpvote(n,r){P(n,"removeCommentUpvote"),P(r,"removeCommentUpvote"),await t.deleteFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(n){P(n,"commentUpvoteCount");let r=await t.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return P(n,"hasUpvotedComment"),P(r,"hasUpvotedComment"),!!await t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Gt,sql as Jt,sqlDateTime as Ne}from"@stacksjs/database";function de(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function fe(e){let t=Gt;return{async tags(n){return de(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){de(n,"tagCount");let r=await t.selectFrom("taggables").select(Jt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(de(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Ne(),updated_at:Ne()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Yt,sqlDateTime as G}from"@stacksjs/database";function pe(e){let t=Yt;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:G(),updated_at:G()}).execute(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:G(),updated_at:G()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Xt,sqlDateTime as Zt}from"@stacksjs/database";function me(e,t){let n=Xt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=Zt();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Ue(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function en(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ue(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function tn(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function si(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ke(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function We(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function ui(e){return e?.ownership===!1}function ci(e,t,n){let r=Object.keys(e).find((a)=>_(a)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(_(a)===_(t))delete o[a];return o[t]=n,{data:o}}function nn(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function rn(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let o=_(r);if(o!==r&&o in e)n[r]=e[o]}return n}function on(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function li(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function di(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var an=["id","uuid","created_at","updated_at","deleted_at"];function fi(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...an]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function pi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?un(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?cn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function un(e){try{return JSON.parse(e)}catch{return e}}function cn(e){try{return JSON.parse(e)}catch{return[]}}function mi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?sn[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=_(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function Qe(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=on(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function yi(e,t,n){let r=qe(n);return e.find((o)=>o.method===t&&qe(String(o.path??""))===r)}function qe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function gi(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(n);return{read:r,write:r,declared:!0}}var Le=15,ln=100;function bi(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Le),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Le,ln);return{page:n,perPage:o,offset:(n-1)*o}}function J(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function dn(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?J(e,t-1):null,next_page_url:o?J(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=J(e,1),c.last_page_url=J(e,u)}return c}function wi(e,t,n,r,o,a){let{page:i,...s}=dn(e,t,n,r,o,a);return{current_page:i,...s}}function hi(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function ki(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function fn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ke(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let n=We(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ge(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function pn(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function mn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function yn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ge(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function gn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ge(n))}catch{return null}}}}function bn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=fn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as wn}from"@stacksjs/router";var Ve=new WeakMap;function ze(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function hn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return ze(n??[]).get(t)}async function kn(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=ze(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ai(e,t){let n=wn();if(!n)return hn(e,t);let r=Ve.get(n);if(!r)r=new WeakMap,Ve.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{kn(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Ci}from"@stacksjs/database";class _n{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as be,runInTransactionScope as Tn}from"@stacksjs/database";async function Di(e,t){return await Tn(async()=>await be.transaction(e,t))}async function Ei(e){return await be.savepoint(e)}function Fi(e,t){return be.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as jn,registerModel as Bn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as yt}from"async_hooks";import{toCursorPaginator as Nn,toPaginator as qn,toSimplePaginator as Ln}from"@stacksjs/pagination";function he(e,t){let n=Te(),r=n?we(n,"per_page"):void 0,o=n?we(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function ke(e,t){let n=Te(),r=n?Ge(n,"cursor"):void 0,o=n?we(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=He(t!==void 0?t:r??null);return{perPage:a,cursor:s}}function He(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function _e(e){let t=Te();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(n,{page:o+1}):null,e.first_page_url=v(n,{page:1}),e.last_page_url=v(n,{page:a})}else e.next_page_url=e.has_more_pages?v(n,{page:o+1}):null;return e}function v(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var E;function Te(){if(E===null)return;if(E===void 0)try{let t=$t("@stacksjs/router");if(typeof t.getCurrentRequest==="function")E=t.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,t){let n=Ge(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function Ge(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Rn}from"module";import{db as Sn}from"@stacksjs/database";var An=Rn(import.meta.url);function Je(e){let t=Sn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await U();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await U();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await U()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await U()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await U(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function U(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=An("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:"2026-06-24.dahlia"})}function Ye(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{sqlDateTime as Pn}from"@stacksjs/database";import{log as F}from"@stacksjs/logging";var Y="deleted_at";function Xe(e,t="id"){return{async softDelete(n){let r=Pn(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[Y]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[Y]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(Y);return n?.where?.(Y,"!=",null)??n}}}function Ze(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function xn(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Re(l,t,!0)),a=r.some((l)=>Re(l,t,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Re(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return F.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Re(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function On(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=xn(e,i);if(!s)continue;await On(s.className,n,s.model,a,r)}}import{sqlDateTime as Mn}from"@stacksjs/database";import{log as Cn}from"@stacksjs/logging";var vn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],et=null;async function tt(){if(et!=null)return et;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function nt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function rt(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(vn.some((o)=>o.test(n)))continue;t[n]=r}return t}function ot(e,t,n){Cn.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var Dn="activities";function at(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function En(e,t,n=[]){let r=rt(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function Fn(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function $n(e){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Dn).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Mn()}).executeTakeFirst()}catch(t){ot("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function In(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await tt();await $n({type:`${r.toLowerCase()}.${n}`,description:Fn(r,n,i),subject_type:r,subject_id:i,properties:En(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await nt()})}function Se(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function it(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Se(await a.find(d)):null,s=async(d,f)=>{await In({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Se(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Se(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var Z,gt=new yt;function D(){return gt.getStore()?.suppressed===!0}function M(e){return Promise.resolve(gt.run({suppressed:!0},e))}var bt=new yt;function Un(){return bt.getStore()?.suppressed===!0}function Kn(e){return Promise.resolve(bt.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class wt extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var st=new Set;function Wn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(st.has(r))return;st.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Qn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return Wn(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function ht(e){return typeof e==="string"?Qn[e]:e}function ut(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=ht(a);r[o]=i[n](r[o])}return r}var X=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),ct=Symbol.for("stacks.modelInstanceProxy"),Vn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function zn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[ct])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=ht(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===ct)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return M(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return M(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return M(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let b={...f};if(f.id!=null)b.id=String(f.id);return b}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},w=s._relations;for(let b of p){let h=x(b),T=f[h]??f[b];if(T!==void 0){m[h]=T;continue}let A=g[b]??g[h];if(A){m[h]=zn(w,A);continue}m[h]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!X.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>R(m,t));return f&&typeof f==="object"?R(f,t):f}let d=Vn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!X.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=x(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var Hn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Gn={paginate:qn,simplePaginate:Ln,cursorPaginate:Nn},lt=Symbol.for("stacks.queryBuilderProxy");function kt(e,t){if(!e||typeof e!=="object")return e;if(e[lt])return e;return new Proxy(e,{get(n,r,o){if(r===lt)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=he(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=ke(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(Hn.has(c)){if(Array.isArray(d))return d.map((m)=>R(m,t));let f=Gn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>R(g,t)),p=f({...d,data:m});return _e(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>R(m,t))};return R(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return kt(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Jn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return kt(c,t)}}}class _t extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class Pe extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Yn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=x(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=x(c);if(Yn.has(u))continue;if(i.has(u))throw new Pe(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Pe(e.name,c,"not-fillable")}return t}async function xe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Xn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}W(t,l);let d=await xe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await xe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new _t(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return W(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){W(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return W(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let b=m.orderBy(d,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((b,h)=>{let T=b?.[d],A=h?.[d];if(T===A)return 0;return(T>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=At(t.traits?.useSearch,t);if(c){let u=c.index??t.table??x(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return tr(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),p=0,g=e.query;if(typeof g==="function")try{let h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(T)=>{let A=await Oe(T,c);if(A.length>0)await m.addDocuments(u,A);p+=A.length}),p}catch{}let w=await d.call(e)||[],b=await Oe(w,c);if(b.length>0)await m.addDocuments(u,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function Oe(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>er(r,t)))).filter(Boolean)}function Tt(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function Zn(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function er(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return Zn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function tr(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function Rt(e){let t=x(e);return t===e?[e]:[e,t]}async function Ae(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of Rt(r)){if(!(o in n))continue;let a=n[o];if(!j(a))continue;n[o]=await oe(a)}}function nr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Ae(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Ae(c,t);return s}if(s)await Ae(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function rr(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of Rt(i))if(s in a)a[s]=await re(a[s]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function or(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){W(t,r);let a=await xe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ar(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Un())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=Qe(i,t,s);if(!c.valid)throw new wt(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function ir(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ut(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ut(a,t,"set"):a;return await r.call(this,o,i)}}var dt=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function St(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!dt.has(g))k.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...dt].sort().join(", ")}.`);let t=sr(e),n=cr(e),r=ur(t,n),o=lr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=jn(i);if(Jn(c,e.casts),Xn(c,i),or(c,i),e.casts&&Object.keys(e.casts).length>0)ir(c,e.casts);let u=ae(e);if(u.length>0)rr(c,u),nr(c,u);let l=e.traits?.useSoftDeletes;if(l)dr(c,i,l);let d=e.traits?.useAudit;if(d){let g=je(d);Be(c,e.name,e.primaryKey||"id",g)}let f=at(e.traits?.useActivityLog);if(f)it(c,e.name,e.primaryKey||"id",f,[...Tt(e)]);ar(c,i);let m=c;m.withoutValidation=function(g){return Kn(g)},m.withoutEvents=function(g){return M(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=c[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof c[b]==="function")continue;c[b]=function(...h){return M(()=>w.apply(c,h))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Bn(e.name,p),Object.defineProperty(p,Ce,{value:e,enumerable:!1,configurable:!0}),p}function sr(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(D())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=i(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let T of g){if(typeof T!=="string"||T.length===0)continue;await h(T,f,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(D())return!0;let p;try{p=Z??=await import("@stacksjs/events");let{dispatchAndCollect:g}=p,w=await g(f,m);if(w.some((h)=>h.ok&&h.value===!1))return!1;let b=w.find((h)=>!h.ok);if(b&&!b.ok)throw b.error}catch(g){if(!p&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${f}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(k.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(k.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(k.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function ur(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function At(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=Tt(t);return n}function cr(e){let t=At(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??x(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await Oe([s],n);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=R(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(D())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await pt(r,c,e.name)}return}await pt(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(D())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await mt(r,Number(c),e.name)}return}await mt(r,Number(c),e.name)}}}var ft=new Map;function Pt(e,t){let n=ft.get(e)??0;if(ft.set(e,n+1),n===0)k.warn(`[orm/search] ${t}`);else if(n===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function pt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){Pt(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function mt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){Pt(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function lr(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=fe(n);if(r.categorizable)t._categorizable=pe(n);if(r.commentable)t._commentable=le(n);if(r.billable)t._billable=Je(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=me(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Ye();return t}function dr(e,t,n){let r=Xe(e,t.primaryKey||"id"),o=Ze(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||D())return!0;try{let{dispatchAsync:p}=Z??=await import("@stacksjs/events"),g=await p(`${i}:restoring`,{id:m});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||D())return;try{let{dispatch:p}=Z??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await K(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},f=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let b=await r.restore(m);if(b){if(o.cascade?.length)await K(a,o,m,"restore");await u(m)}return b}let{db:g}=await import("@stacksjs/database"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await u(m);return w};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function fr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>fr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var pr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],mr=["traits","dashboard"];function yr(e){let t=e?.[Ce];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function gr(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function br(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function wr(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=br(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of pr){let i=gr(e[a],t[a]);if(i)n[a]=i}for(let a of mr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function ms(e,t){return St(wr(yr(e),t))}import Pr from"process";import{log as xr}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as hr}from"bun:sqlite";import{existsSync as kr,readdirSync as _r,readFileSync as Tr}from"fs";function Rr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Sr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Ar(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function xt(e,t="sqlite"){let n=[];if(!kr(e))return{tables:[],errors:n};let r;try{r=_r(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new hr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Tr(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Ar(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Rr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Sr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function Or(e){if(e)return e;let t=String(Pr.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function ee(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Cr(e,t){let n=e.default;if(typeof n==="boolean")return ee(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function vr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Mr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Dr(e,t){let n=vr(e),r=Mr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return ee(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Cr(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Er(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${O(a.model)}_id`]="number"}}return t}function Fr(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function $r(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?ee(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ir(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)c=b.pivotTable,u=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;c=h.table,u=h.foreignKey,l=h.relatedKey,d=h.pivot?.columns??{},f=Boolean(h.pivot?.timestamps)}}else continue;let m=c??Fr(e,s),p=u??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(d))w[b]=$r(h,n);if(f)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function jr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ee(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Br(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,jr(t));return n}function Nr(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[O(o)]=Dr(a,t);return n}function Ot(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
2
+ var b=import.meta.require;import"@stacksjs/validation";import{log as re}from"@stacksjs/cli";import{db as Me}from"@stacksjs/database";async function It(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=Me.deleteFrom(e);u=o(u);let l=await u.execute(),d=Array.isArray(l)?l:[l],f=Number(d[0]?.numDeletedRows??d.length??0);return re.info(`Pruned ${f} records from ${e}`),f}let a=new Date;a.setDate(a.getDate()-n);let i=await Me.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return re.info(`Pruned ${c} records from ${e} older than ${n} days`),c}catch(a){throw re.error(`Failed to prune ${e}:`,a),a}}async function Wa(e,t={}){return It(e,t)}function Qa(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as jt,createDecipheriv as Bt,createHash as Nt,randomBytes as qt}from"crypto";import{log as H}from"@stacksjs/logging";var De="enc:",Ee="aes-256-gcm",Lt=12,z=null;async function Fe(){if(z)return z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return z=Nt("sha256").update(e).digest(),z}function B(e){return typeof e==="string"&&e.startsWith(De)}async function oe(e){if(e==null)return e;if(B(e))return e;if(typeof e!=="string")return e;let t=await Fe();if(!t)return H.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=qt(Lt),r=jt(Ee,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${n.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ae(e){if(e==null)return e;if(typeof e!=="string")return e;if(!B(e))return e;try{let t=await Fe();if(!t)return H.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return H.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Bt(Ee,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return H.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function ie(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Ut}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var Kt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ie="model_audits",ce=null;function Wt(e){ce=e}async function se(){if(ce!=null)return ce;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function G(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Kt.some((o)=>o.test(n)))continue;t[n]=r}return t}function N(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Qt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function ue(e,t=!1){try{let{db:n}=await import("@stacksjs/database");await n.insertInto(Ie).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Ut()}).executeTakeFirst()}catch(n){if(q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function je(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database");return(await n.selectFrom(Ie).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?$e(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?$e(o.new_values):o.new_values}))}catch(n){return q.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function $e(e){try{return JSON.parse(e)}catch{return e}}function Be(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=je(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=N(d),m=f?.[n];if(m!=null){let p=await se();await ue({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:G(f),user_id:p},o)}}catch(f){if(q.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?N(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=N(p)??(typeof f==="function"?N(await f.call(a,l)):null),{old:h,next:w}=Qt(m,g);if(w&&Object.keys(w).length>0){let k=await se();await ue({auditable_type:t,auditable_id:l,event:"updated",old_values:G(h),new_values:G(w),user_id:k},o)}}catch(g){if(q.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?N(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let h=await se();await ue({auditable_type:t,auditable_id:f,event:"deleted",old_values:G(p),new_values:null,user_id:h},o)}}catch(h){if(q.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:h}),o)throw h}return g})}};u("delete"),u("softDelete")}import{db as Vt,sql as zt,sqlDateTime as le}from"@stacksjs/database";function x(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var L="commentable_upvotes",U="commentables";function Ht(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}function de(e){let t=Vt;return{async comments(n){return x(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(zt`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(x(n,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:le(),updated_at:le()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){x(n,"upvoteComment"),x(r,"upvoteComment");let o=()=>t.selectFrom(L).where("upvoteable_id","=",n).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(L).values({upvoteable_id:n,upvoteable_type:U,user_id:r,created_at:le()}).execute()}catch(i){if(!Ht(i))throw i}return await o()},async removeCommentUpvote(n,r){x(n,"removeCommentUpvote"),x(r,"removeCommentUpvote"),await t.deleteFrom(L).where("upvoteable_id","=",n).where("upvoteable_type","=",U).where("user_id","=",r).execute()},async commentUpvoteCount(n){x(n,"commentUpvoteCount");let r=await t.selectFrom(L).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",U).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return x(n,"hasUpvotedComment"),x(r,"hasUpvotedComment"),!!await t.selectFrom(L).where("upvoteable_id","=",n).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Gt,sql as Jt,sqlDateTime as qe}from"@stacksjs/database";function fe(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function pe(e){let t=Gt;return{async tags(n){return fe(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){fe(n,"tagCount");let r=await t.selectFrom("taggables").select(Jt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(fe(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:qe(),updated_at:qe()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Yt,sqlDateTime as J}from"@stacksjs/database";function me(e){let t=Yt;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:J(),updated_at:J()}).execute(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:J(),updated_at:J()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Xt,sqlDateTime as Zt}from"@stacksjs/database";function ye(e,t){let n=Xt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=Zt();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Ke(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function en(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ke(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function T(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function tn(e){let t={};for(let[n,r]of Object.entries(e))t[T(n)]=r;return t}function si(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function We(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Qe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function ui(e){return e?.ownership===!1}function ci(e,t,n){let r=Object.keys(e).find((a)=>T(a)===T(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(T(a)===T(t))delete o[a];return o[t]=n,{data:o}}function nn(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=T(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function rn(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let o=T(r);if(o!==r&&o in e)n[r]=e[o]}return n}function on(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function li(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[T(r)];return n}function di(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[T(r)];return n}var an=["id","uuid","created_at","updated_at","deleted_at"];function fi(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...an]){let o=T(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(T(r));return n}function pi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?un(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?cn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function un(e){try{return JSON.parse(e)}catch{return e}}function cn(e){try{return JSON.parse(e)}catch{return[]}}function mi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?sn[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=T(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function Ve(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=on(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function yi(e,t,n){let r=Le(n);return e.find((o)=>o.method===t&&Le(String(o.path??""))===r)}function Le(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ge(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function gi(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?ge(o.read):["auth"],write:"write"in o?ge(o.write):["auth"],declared:!0}}let r=ge(n);return{read:r,write:r,declared:!0}}var Ue=15,ln=100;function bi(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,ln);return{page:n,perPage:o,offset:(n-1)*o}}function Y(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function dn(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?Y(e,t-1):null,next_page_url:o?Y(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=Y(e,1),c.last_page_url=Y(e,u)}return c}function wi(e,t,n,r,o,a){let{page:i,...s}=dn(e,t,n,r,o,a);return{current_page:i,...s}}function hi(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function ki(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function fn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=We(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(be(o))}};let n=Qe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function be(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function pn(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function mn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function yn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(be(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function gn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(n))}catch{return null}}}}function bn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=fn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as wn}from"@stacksjs/router";var ze=new WeakMap;function He(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function hn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return He(n??[]).get(t)}async function kn(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=He(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ai(e,t){let n=wn();if(!n)return hn(e,t);let r=ze.get(n);if(!r)r=new WeakMap,ze.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{kn(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Ci}from"@stacksjs/database";class _n{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as we,runInTransactionScope as Tn}from"@stacksjs/database";async function Di(e,t){return await Tn(async()=>await we.transaction(e,t))}async function Ei(e){return await we.savepoint(e)}function Fi(e,t){return we.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as jn,registerModel as Bn}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as O}from"@stacksjs/strings";import{AsyncLocalStorage as gt}from"async_hooks";import{toCursorPaginator as Nn,toPaginator as qn,toSimplePaginator as Ln}from"@stacksjs/pagination";function ke(e,t){let n=Re(),r=n?he(n,"per_page"):void 0,o=n?he(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function _e(e,t){let n=Re(),r=n?Je(n,"cursor"):void 0,o=n?he(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Ge(t!==void 0?t:r??null);return{perPage:a,cursor:s}}function Ge(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function Te(e){let t=Re();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?M(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?M(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?M(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?M(n,{page:o+1}):null,e.first_page_url=M(n,{page:1}),e.last_page_url=M(n,{page:a})}else e.next_page_url=e.has_more_pages?M(n,{page:o+1}):null;return e}function M(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var F;function Re(){if(F===null)return;if(F===void 0)try{let t=b("@stacksjs/router");if(typeof t.getCurrentRequest==="function")F=t.getCurrentRequest;else{F=null;return}}catch{F=null;return}return F()}function he(e,t){let n=Je(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function Je(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Rn}from"module";import{db as Sn}from"@stacksjs/database";var An=Rn(import.meta.url);function Ye(e){let t=Sn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await K();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await K();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await K()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await K()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await K(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function K(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=An("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:"2026-06-24.dahlia"})}function Xe(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{sqlDateTime as Pn}from"@stacksjs/database";import{log as I}from"@stacksjs/logging";var X="deleted_at";function Ze(e,t="id"){return{async softDelete(n){let r=Pn(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[X]:r}),!0;return!1},async restore(n){let r=e.where(t,n).withTrashed();if(typeof r?.update==="function")return await r.update({[X]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(X);return n?.where?.(X,"!=",null)??n}}}function et(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function xn(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Se(l,t,!0)),a=r.some((l)=>Se(l,t,!1));if(!o&&!a)return I.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Se(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return I.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Se(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function On(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){I.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){I.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){I.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(I.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function W(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=xn(e,i);if(!s)continue;await On(s.className,n,s.model,a,r)}}import{sqlDateTime as Mn}from"@stacksjs/database";import{log as Cn}from"@stacksjs/logging";var vn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],tt=null;async function nt(){if(tt!=null)return tt;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function rt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function ot(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(vn.some((o)=>o.test(n)))continue;t[n]=r}return t}function at(e,t,n){Cn.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var Dn="activities";function it(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function En(e,t,n=[]){let r=ot(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function Fn(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function $n(e){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Dn).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Mn()}).executeTakeFirst()}catch(t){at("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function In(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await nt();await $n({type:`${r.toLowerCase()}.${n}`,description:Fn(r,n,i),subject_type:r,subject_id:i,properties:En(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await rt()})}function Ae(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function st(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Ae(await a.find(d)):null,s=async(d,f)=>{await In({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Ae(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Ae(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var ee,bt=new gt;function E(){return bt.getStore()?.suppressed===!0}function D(e){return Promise.resolve(bt.run({suppressed:!0},e))}var wt=new gt;function Un(){return wt.getStore()?.suppressed===!0}function Kn(e){return Promise.resolve(wt.run({suppressed:!0},e))}var ve=Symbol.for("stacks.orm.modelDefinition");class ht extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var ut=new Set;function Wn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(ut.has(r))return;ut.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Qn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return Wn(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function kt(e){return typeof e==="string"?Qn[e]:e}function ct(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=kt(a);r[o]=i[n](r[o])}return r}var Z=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),lt=Symbol.for("stacks.modelInstanceProxy"),Vn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function zn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function S(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[lt])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=kt(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===lt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return D(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return D(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return D(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return D(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return D(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let w={...f};if(f.id!=null)w.id=String(f.id);return w}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},h=s._relations;for(let w of p){let k=O(w),R=f[k]??f[w];if(R!==void 0){m[k]=R;continue}let P=g[w]??g[k];if(P){m[k]=zn(h,P);continue}m[k]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!Z.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>S(m,t));return f&&typeof f==="object"?S(f,t):f}let d=Vn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=O(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!Z.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=O(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!Z.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=O(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!Z.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var Hn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Gn={paginate:qn,simplePaginate:Ln,cursorPaginate:Nn},dt=Symbol.for("stacks.queryBuilderProxy");function _t(e,t){if(!e||typeof e!=="object")return e;if(e[dt])return e;return new Proxy(e,{get(n,r,o){if(r===dt)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=ke(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=_e(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(Hn.has(c)){if(Array.isArray(d))return d.map((m)=>S(m,t));let f=Gn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>S(g,t)),p=f({...d,data:m});return Te(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>S(m,t))};return S(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return _t(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Jn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>S(d,t)):S(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>S(d,t)):S(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return _t(c,t)}}}class Tt extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class xe extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Yn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function Q(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=O(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=O(c);if(Yn.has(u))continue;if(i.has(u))throw new xe(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new xe(e.name,c,"not-fillable")}return t}async function Oe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Xn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}Q(t,l);let d=await Oe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await Oe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new Tt(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return Q(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){Q(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return Q(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let w=m.orderBy(d,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,k)=>{let R=w?.[d],P=k?.[d];if(R===P)return 0;return(R>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=Pt(t.traits?.useSearch,t);if(c){let u=c.index??t.table??O(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return tr(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),p=0,g=e.query;if(typeof g==="function")try{let k=g.call(e);if(k&&typeof k.chunk==="function")return await k.chunk(l,async(R)=>{let P=await Ce(R,c);if(P.length>0)await m.addDocuments(u,P);p+=P.length}),p}catch{}let h=await d.call(e)||[],w=await Ce(h,c);if(w.length>0)await m.addDocuments(u,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let h=g?.id??g?._attributes?.id;if(h!=null)await p.deleteDocument(u,Number(h))}}}}async function Ce(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>er(r,t)))).filter(Boolean)}function Rt(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function Zn(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function er(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return Zn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function tr(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function St(e){let t=O(e);return t===e?[e]:[e,t]}async function Pe(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of St(r)){if(!(o in n))continue;let a=n[o];if(!B(a))continue;n[o]=await ae(a)}}function nr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Pe(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Pe(c,t);return s}if(s)await Pe(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function rr(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of St(i))if(s in a)a[s]=await oe(a[s]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function or(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){Q(t,r);let a=await Oe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function ar(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Un())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=Ve(i,t,s);if(!c.valid)throw new ht(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function ir(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=ct(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?ct(a,t,"set"):a;return await r.call(this,o,i)}}var ft=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function At(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!ft.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...ft].sort().join(", ")}.`);let t=sr(e),n=cr(e),r=ur(t,n),o=lr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=jn(i);if(Jn(c,e.casts),Xn(c,i),or(c,i),e.casts&&Object.keys(e.casts).length>0)ir(c,e.casts);let u=ie(e);if(u.length>0)rr(c,u),nr(c,u);let l=e.traits?.useSoftDeletes;if(l)dr(c,i,l);let d=e.traits?.useAudit;if(d){let g=Be(d);Ne(c,e.name,e.primaryKey||"id",g)}let f=it(e.traits?.useActivityLog);if(f)st(c,e.name,e.primaryKey||"id",f,[...Rt(e)]);ar(c,i);let m=c;m.withoutValidation=function(g){return Kn(g)},m.withoutEvents=function(g){return D(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let h=c[g];if(typeof h!=="function")continue;let w=`${g}Quietly`;if(typeof c[w]==="function")continue;c[w]=function(...k){return D(()=>h.apply(c,k))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Bn(e.name,p),Object.defineProperty(p,ve,{value:e,enumerable:!1,configurable:!0}),p}function sr(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(E())return;try{let{dispatch:p}=ee??=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(E())return;try{let p=a(m),g=Array.isArray(p)?p:[p],h=i(m),k=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof k!=="function")return;for(let R of g){if(typeof R!=="string"||R.length===0)continue;await k(R,f,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(E())return!0;let p;try{p=ee??=await import("@stacksjs/events");let{dispatchAndCollect:g}=p,h=await g(f,m);if(h.some((k)=>k.ok&&k.value===!1))return!1;let w=h.find((k)=>!k.ok);if(w&&!w.ok)throw w.error}catch(g){if(!p&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${f}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(_.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(_.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(_.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function ur(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function Pt(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=Rt(t);return n}function cr(e){let t=Pt(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??O(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await Ce([s],n);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=S(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(E())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await mt(r,c,e.name)}return}await mt(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(E())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await yt(r,Number(c),e.name)}return}await yt(r,Number(c),e.name)}}}var pt=new Map;function xt(e,t){let n=pt.get(e)??0;if(pt.set(e,n+1),n===0)_.warn(`[orm/search] ${t}`);else if(n===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function mt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){xt(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function yt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){xt(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function lr(e){let t={},n=e.table,r=e.traits;if(!r)return t;if(r.taggable)t._taggable=pe(n);if(r.categorizable)t._categorizable=me(n);if(r.commentable)t._commentable=de(n);if(r.billable)t._billable=Ye(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=ye(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Xe();return t}function dr(e,t,n){let r=Ze(e,t.primaryKey||"id"),o=et(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||E())return!0;try{let{dispatchAsync:p}=ee??=await import("@stacksjs/events"),g=await p(`${i}:restoring`,{id:m});if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||E())return;try{let{dispatch:p}=ee??=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await W(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await W(a,o,m,"softDelete");return g})},f=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await W(a,o,m,"restore");await u(m)}return w}let{db:g}=await import("@stacksjs/database"),h=await g.transaction(async()=>{let w=await r.restore(m);if(w)await W(a,o,m,"restore");return w});if(h)await u(m);return h};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function fr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>fr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var pr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],mr=["traits","dashboard"];function yr(e){let t=e?.[ve];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function gr(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function br(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function wr(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=br(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of pr){let i=gr(e[a],t[a]);if(i)n[a]=i}for(let a of mr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function ms(e,t){return At(wr(yr(e),t))}import Pr from"process";import{log as xr}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as V}from"@stacksjs/storage";import{Database as hr}from"bun:sqlite";import{existsSync as kr,readdirSync as _r,readFileSync as Tr}from"fs";function Rr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Sr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Ar(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Ot(e,t="sqlite"){let n=[];if(!kr(e))return{tables:[],errors:n};let r;try{r=_r(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new hr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Tr(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Ar(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Rr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Sr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function Or(e){if(e)return e;let t=String(Pr.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function te(e){return e==="postgres"?"boolean":"number"}function C(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Cr(e,t){let n=e.default;if(typeof n==="boolean")return te(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function vr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function Mr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Dr(e,t){let n=vr(e),r=Mr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return te(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Cr(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Er(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${C(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${C(a.model)}_id`]="number"}}return t}function Fr(e,t){let[n,r]=[C(e),C(t)].sort();return`${n}_${r}`}function $r(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?te(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ir(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let w=i;if(s=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)c=w.pivotTable,u=w.firstForeignKey,l=w.secondForeignKey;else{let k=i;c=k.table,u=k.foreignKey,l=k.relatedKey,d=k.pivot?.columns??{},f=Boolean(k.pivot?.timestamps)}}else continue;let m=c??Fr(e,s),p=u??`${C(e)}_id`,g=l??`${C(s)}_id`,h={id:"number",[p]:"number",[g]:"number"};for(let[w,k]of Object.entries(d))h[w]=$r(k,n);if(f)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function jr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${te(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Br(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,jr(t));return n}function Nr(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[C(o)]=Dr(a,t);return n}function Ct(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
3
3
  `),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
4
4
  ${o}// columns
5
5
  ${a}
@@ -15,8 +15,8 @@ declare module '@stacksjs/database' {
15
15
 
16
16
  export {}
17
17
  `,Ur="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Kr=`}
18
- `;function Ct(e){return e==="framework"?Ur:qr}function vt(e){return e==="framework"?Kr:Lr}async function Mt(e,t,n=[]){let r=[];if(!Q.existsSync(e))return r;let o=Q.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=S.join(e,a.name);if(a.isDirectory()){if(t){let s=await Mt(i,!0,n);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(S.isAbsolute(i)?import(i):import(S.resolve(i))),c=s.default||s;if(c?.name&&(c.attributes||c.table))r.push({filePath:i,model:c})}catch(s){n.push({file:i,error:s.message})}}return r}async function Wr(e={}){let t=Or(e.dialect),n=e.modelsDir??S.userModelsPath(),r=e.defaultsDir??S.frameworkPath("defaults/app/Models"),o=e.outFile??S.projectPath("database/types.d.ts"),a=[],i=[];for(let[p,g]of[[n,!1],[r,!0]])try{let w=await Mt(p,g,a);i.push(...w)}catch(w){a.push({file:p,error:w.message})}let s=new Map;for(let p of i)s.set(p.model.name??S.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(n))s.set(p.model.name??S.basename(p.filePath).replace(/\.ts$/,""),p);let c=[];for(let[p,{model:g}]of s){let w=g.table??`${O(p)}s`,b={...Br(g,t),...Nr(g,t),...Er(g)};c.push({table:w,model:p,columns:b})}let u=new Map;for(let[p,{model:g}]of s)for(let w of Ir(p,g,t)){if(u.has(w.table))continue;u.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(c.push(...u.values()),e.migrationsDir!==!1){let p=e.migrationsDir??S.resolve(S.dirname(o),"migrations"),g=new Set(c.map((b)=>b.table)),w=xt(p,t);for(let b of w.tables){if(g.has(b.table))continue;g.add(b.table),c.push({table:b.table,model:`(${b.table} migration)`,columns:b.columns})}a.push(...w.errors)}c.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",d=l==="framework"?1:2,f=c.map((p)=>Ot(p.table,p.columns,d)).join(`
19
- `),m=`${Ct(l)}${f}
20
- ${vt(l)}`;if(!e.dryRun){let p=S.dirname(o);if(!Q.existsSync(p))Q.mkdirSync(p,{recursive:!0});Q.writeFileSync(o,m,"utf-8"),xr.success(`[generate:db-types] wrote ${c.length} table(s) to ${o}`)}return{outFile:o,tables:c,errors:a,content:m}}function Qr(e,t="app"){let n=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Ot(r.table,r.columns,t==="framework"?1:2)).join(`
21
- `);return`${Ct(t)}${n}
22
- ${vt(t)}`}import{isCursorPaginator as tu,isPaginator as nu,isSimplePaginator as ru,toCursorPaginator as ou,toPaginator as au,toSimplePaginator as iu}from"@stacksjs/pagination";import{configureOrm as Vr}from"@stacksjs/query-builder";function zr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Vr({database:e})}catch{}}zr();async function Dt(e){for(let t=0;;t++){let n=await import(e);try{return n.default}catch(r){if(t<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function te(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Dt(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of t){let a=o?`${o}/`:"",i=n.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Dt(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var C={},Et=()=>{},xs=new Promise((e)=>{Et=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=C[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=C[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=C[e];return r==null?!1:(n in r)},apply(t,n,r){let o=C[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var Hr=y("User"),Gr=y("Job"),Jr=y("FailedJob"),Yr=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),t=await te("User");if(t)C.User=t;if(e("queue")){let n=await te("Job");if(n)C.Job=n;let r=await te("FailedJob");if(r)C.FailedJob=r}for(let[n,r,o]of Yr){if(!e(o))continue;let a=await te(n,r);if(a)C[n]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Et()}});var Xr=y("Activity"),Zr=y("AnalyticsEvent"),eo=y("Automation"),to=y("AutomationRun"),no=y("Auction"),ro=y("CampaignVariant"),oo=y("CommunicationSuppression"),ao=y("ConsentEvent"),io=y("SenderDomain"),so=y("UsageEvent"),uo=y("AuctionItem"),co=y("Author"),lo=y("Bid"),fo=y("Board"),po=y("BoardColumn"),mo=y("Campaign"),yo=y("Card"),go=y("CardComment"),bo=y("Cart"),wo=y("CartItem"),ho=y("Category"),ko=y("Comment"),_o=y("Coupon"),To=y("Customer"),Ro=y("DeliveryRoute"),So=y("DeliveryStop"),Ao=y("Deployment"),Po=y("DigitalDelivery"),xo=y("Courier"),Oo=y("CourierPing"),Co=y("CampaignSend"),vo=y("EmailList"),Mo=y("EmailListSubscriber"),Do=y("Form"),Eo=y("FormField"),Fo=y("FormSubmission"),$o=y("MagicLinkToken"),Io=y("Menu"),jo=y("MenuItem"),Bo=y("PageRevision"),No=y("Pledge"),qo=y("Redirect"),Lo=y("Site"),Uo=y("SiteDomain"),Ko=y("SmsOptOut"),Os=y("StorageItem"),Cs=y("StorageItemTask"),Wo=y("EmailIdempotency"),Qo=y("EmailSuppression"),Vo=y("EmailWebhookEvent"),zo=y("Error"),Ho=y("GiftCard"),Go=y("Label"),Jo=y("LicenseKey"),Yo=y("Log"),Xo=y("LoyaltyPoint"),Zo=y("LoyaltyReward"),ea=y("MailPreference"),ta=y("Manufacturer"),na=y("Notification"),ra=y("NotificationDelivery"),oa=y("Order"),aa=y("OrderIdempotency"),vs=y("PersonalAccessToken"),ia=y("OrderItem"),sa=y("Page"),ua=y("Payment"),ca=y("PaymentMethod"),la=y("PaymentProduct"),da=y("PaymentTransaction"),fa=y("Post"),pa=y("PrintDevice"),ma=y("Product"),ya=y("ProductUnit"),ga=y("ProductVariant"),ba=y("QueryLog"),wa=y("Receipt"),Ms=y("Referral"),Ds=y("ReferralCode"),ha=y("Release"),ka=y("Request"),_a=y("Review"),Ta=y("ShippingMethod"),Ra=y("ShippingRate"),Sa=y("ShippingZone"),Aa=y("SocialPost"),Pa=y("SocialAccount"),xa=y("Subscriber"),Oa=y("SubscriberEmail"),Ca=y("Subscription"),va=y("Tag"),Ma=y("TaxRate"),Da=y("Team"),Ea=y("TeamInvitation"),Fa=y("TeamMember"),$a=y("Transaction"),Ia=y("WaitlistProduct"),ja=y("WaitlistRestaurant"),Ba=y("Websocket"),Ft={User:Hr,Job:Gr,FailedJob:Jr,Activity:Xr,AnalyticsEvent:Zr,Automation:eo,AutomationRun:to,Auction:no,AuctionItem:uo,Author:co,Bid:lo,Board:fo,BoardColumn:po,Campaign:mo,CampaignSend:Co,CampaignVariant:ro,Card:yo,CardComment:go,Cart:bo,CartItem:wo,Category:ho,Comment:ko,Coupon:_o,Customer:To,CommunicationSuppression:oo,ConsentEvent:ao,DeliveryRoute:Ro,DeliveryStop:So,Deployment:Ao,DigitalDelivery:Po,Courier:xo,CourierPing:Oo,EmailList:vo,EmailListSubscriber:Mo,EmailIdempotency:Wo,EmailSuppression:Qo,EmailWebhookEvent:Vo,ErrorModel:zo,Form:Do,FormField:Eo,FormSubmission:Fo,GiftCard:Ho,Label:Go,LicenseKey:Jo,Log:Yo,LoyaltyPoint:Xo,LoyaltyReward:Zo,MailPreference:ea,Manufacturer:ta,Notification:na,MagicLinkToken:$o,Menu:Io,MenuItem:jo,NotificationDelivery:ra,Order:oa,OrderIdempotency:aa,OrderItem:ia,Page:sa,PageRevision:Bo,Payment:ua,PaymentMethod:ca,PaymentProduct:la,PaymentTransaction:da,Pledge:No,Post:fa,PrintDevice:pa,Product:ma,ProductUnit:ya,ProductVariant:ga,QueryLog:ba,Receipt:wa,Release:ha,Request:ka,Review:_a,ShippingMethod:Ta,Redirect:qo,SenderDomain:io,ShippingRate:Ra,ShippingZone:Sa,Site:Lo,SiteDomain:Uo,SmsOptOut:Ko,SocialAccount:Pa,SocialPost:Aa,Subscriber:xa,SubscriberEmail:Oa,Subscription:Ca,Tag:va,TaxRate:Ma,Team:Da,TeamInvitation:Ea,TeamMember:Fa,Transaction:$a,UsageEvent:so,WaitlistProduct:Ia,WaitlistRestaurant:ja,Websocket:Ba},I=globalThis;for(let[e,t]of Object.entries(Ft))if(t&&I[e]===void 0)I[e]=t;var Es=Object.keys(Ft);async function Na(e){if(!e)return[];try{if(typeof e.all==="function"){let t=await e.all();return Array.isArray(t)?t:[]}if(typeof e.get==="function"){let t=await e.get();return Array.isArray(t)?t:[]}}catch{}return[]}function qa(e,t,n=""){if(!e)return n;try{if(typeof e.get==="function"){let o=e.get(t);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[t];return r!==void 0&&r!==null?r:n}if(I.safeAll===void 0)I.safeAll=Na;if(I.safeGet===void 0)I.safeGet=qa;export{Xr as Activity,Zr as AnalyticsEvent,no as Auction,uo as AuctionItem,co as Author,eo as Automation,to as AutomationRun,lo as Bid,fo as Board,po as BoardColumn,mo as Campaign,Co as CampaignSend,ro as CampaignVariant,yo as Card,go as CardComment,bo as Cart,wo as CartItem,ho as Category,ko as Comment,oo as CommunicationSuppression,ao as ConsentEvent,_o as Coupon,xo as Courier,Oo as CourierPing,To as Customer,Ro as DeliveryRoute,So as DeliveryStop,Ao as Deployment,Po as DigitalDelivery,Wo as EmailIdempotency,vo as EmailList,Mo as EmailListSubscriber,Qo as EmailSuppression,Vo as EmailWebhookEvent,zo as ErrorModel,Jr as FailedJob,Do as Form,Eo as FormField,Fo as FormSubmission,Ho as GiftCard,Gr as Job,Go as Label,Jo as LicenseKey,Yo as Log,Xo as LoyaltyPoint,Zo as LoyaltyReward,Ce as MODEL_DEFINITION,$o as MagicLinkToken,ea as MailPreference,ta as Manufacturer,Pe as MassAssignmentException,Io as Menu,jo as MenuItem,_t as ModelNotFoundError,wt as ModelValidationError,na as Notification,ra as NotificationDelivery,oa as Order,aa as OrderIdempotency,ia as OrderItem,sa as Page,Bo as PageRevision,ua as Payment,ca as PaymentMethod,la as PaymentProduct,da as PaymentTransaction,vs as PersonalAccessToken,No as Pledge,fa as Post,pa as PrintDevice,ma as Product,ya as ProductUnit,ga as ProductVariant,ba as QueryLog,wa as Receipt,qo as Redirect,Ms as Referral,Ds as ReferralCode,ha as Release,ka as Request,_a as Review,io as SenderDomain,Ta as ShippingMethod,Ra as ShippingRate,Sa as ShippingZone,Lo as Site,Uo as SiteDomain,Ko as SmsOptOut,Pa as SocialAccount,Aa as SocialPost,Os as StorageItem,Cs as StorageItemTask,_n as SubqueryBuilder,xa as Subscriber,Oa as SubscriberEmail,Ca as Subscription,va as Tag,Ma as TaxRate,Da as Team,Ea as TeamInvitation,Fa as TeamMember,$a as Transaction,so as UsageEvent,Hr as User,Ia as WaitlistProduct,ja as WaitlistRestaurant,Ba as Websocket,Ai as batchLoad,Wr as buildDatabaseSchema,ae as collectEncryptedAttributes,Ie as createAuditMethods,pe as createCategorizableMethods,le as createCommentableMethods,me as createLikeableMethods,fe as createTaggableMethods,pn as customerOwnership,Ci as db,oe as decryptValue,St as defineModel,re as encryptValue,_e as enrichPaginatorUrls,ms as extendModel,rn as filterFillable,Qa as getPrunableConfig,nn as getWritableFields,tu as isCursorPaginator,j as isEncrypted,nu as isPaginator,ru as isSimplePaginator,Ue as isUniqueViolation,en as mapWriteError,Wa as massPrunable,wr as mergeModelDefinition,Es as modelGlobalNames,xs as ormReady,bn as parentOwnership,He as parseCursor,Oe as projectDocumentsFromTrait,It as prunable,Qr as renderDatabaseTypeFile,ke as resolveCursorArgs,he as resolvePageArgs,Ei as savepoint,mn as selfOwnership,Wt as setAuditUser,yn as siteOwnership,gn as teamMembershipOwnership,fr as toAttrs,ou as toCursorPaginator,au as toPaginator,iu as toSimplePaginator,tn as toSnakeCaseKeys,Di as transaction,Fi as transactional,M as withoutEvents,Kn as withoutValidation};
18
+ `;function vt(e){return e==="framework"?Ur:qr}function Mt(e){return e==="framework"?Kr:Lr}async function Dt(e,t,n=[]){let r=[];if(!V.existsSync(e))return r;let o=V.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=A.join(e,a.name);if(a.isDirectory()){if(t){let s=await Dt(i,!0,n);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(A.isAbsolute(i)?import(i):import(A.resolve(i))),c=s.default||s;if(c?.name&&(c.attributes||c.table))r.push({filePath:i,model:c})}catch(s){n.push({file:i,error:s.message})}}return r}async function Wr(e={}){let t=Or(e.dialect),n=e.modelsDir??A.userModelsPath(),r=e.defaultsDir??A.frameworkPath("defaults/app/Models"),o=e.outFile??A.projectPath("database/types.d.ts"),a=[],i=[];for(let[p,g]of[[n,!1],[r,!0]])try{let h=await Dt(p,g,a);i.push(...h)}catch(h){a.push({file:p,error:h.message})}let s=new Map;for(let p of i)s.set(p.model.name??A.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(n))s.set(p.model.name??A.basename(p.filePath).replace(/\.ts$/,""),p);let c=[];for(let[p,{model:g}]of s){let h=g.table??`${C(p)}s`,w={...Br(g,t),...Nr(g,t),...Er(g)};c.push({table:h,model:p,columns:w})}let u=new Map;for(let[p,{model:g}]of s)for(let h of Ir(p,g,t)){if(u.has(h.table))continue;u.set(h.table,{table:h.table,model:`(${h.table} pivot)`,columns:h.columns})}if(c.push(...u.values()),e.migrationsDir!==!1){let p=e.migrationsDir??A.resolve(A.dirname(o),"migrations"),g=new Set(c.map((w)=>w.table)),h=Ot(p,t);for(let w of h.tables){if(g.has(w.table))continue;g.add(w.table),c.push({table:w.table,model:`(${w.table} migration)`,columns:w.columns})}a.push(...h.errors)}c.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",d=l==="framework"?1:2,f=c.map((p)=>Ct(p.table,p.columns,d)).join(`
19
+ `),m=`${vt(l)}${f}
20
+ ${Mt(l)}`;if(!e.dryRun){let p=A.dirname(o);if(!V.existsSync(p))V.mkdirSync(p,{recursive:!0});V.writeFileSync(o,m,"utf-8"),xr.success(`[generate:db-types] wrote ${c.length} table(s) to ${o}`)}return{outFile:o,tables:c,errors:a,content:m}}function Qr(e,t="app"){let n=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Ct(r.table,r.columns,t==="framework"?1:2)).join(`
21
+ `);return`${vt(t)}${n}
22
+ ${Mt(t)}`}import{isCursorPaginator as tu,isPaginator as nu,isSimplePaginator as ru,toCursorPaginator as ou,toPaginator as au,toSimplePaginator as iu}from"@stacksjs/pagination";import{configureOrm as Vr}from"@stacksjs/query-builder";function zr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Vr({database:e})}catch{}}zr();async function Et(e){for(let t=0;;t++){let n=await import(e);try{return n.default}catch(r){if(t<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ne(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Et(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of t){let a=o?`${o}/`:"",i=n.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Et(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var v={},Ft=()=>{},xs=new Promise((e)=>{Ft=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=v[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=v[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=v[e];return r==null?!1:(n in r)},apply(t,n,r){let o=v[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var Hr=y("User"),Gr=y("Job"),Jr=y("FailedJob"),Yr=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),t=await ne("User");if(t)v.User=t;if(e("queue")){let n=await ne("Job");if(n)v.Job=n;let r=await ne("FailedJob");if(r)v.FailedJob=r}for(let[n,r,o]of Yr){if(!e(o))continue;let a=await ne(n,r);if(a)v[n]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Ft()}});var Xr=y("Activity"),Zr=y("AnalyticsEvent"),eo=y("Automation"),to=y("AutomationRun"),no=y("Auction"),ro=y("CampaignVariant"),oo=y("CommunicationSuppression"),ao=y("ConsentEvent"),io=y("SenderDomain"),so=y("UsageEvent"),uo=y("AuctionItem"),co=y("Author"),lo=y("Bid"),fo=y("Board"),po=y("BoardColumn"),mo=y("Campaign"),yo=y("Card"),go=y("CardComment"),bo=y("Cart"),wo=y("CartItem"),ho=y("Category"),ko=y("Comment"),_o=y("Coupon"),To=y("Customer"),Ro=y("DeliveryRoute"),So=y("DeliveryStop"),Ao=y("Deployment"),Po=y("DigitalDelivery"),xo=y("Courier"),Oo=y("CourierPing"),Co=y("CampaignSend"),vo=y("EmailList"),Mo=y("EmailListSubscriber"),Do=y("Form"),Eo=y("FormField"),Fo=y("FormSubmission"),$o=y("MagicLinkToken"),Io=y("Menu"),jo=y("MenuItem"),Bo=y("PageRevision"),No=y("Pledge"),qo=y("Redirect"),Lo=y("Site"),Uo=y("SiteDomain"),Ko=y("SmsOptOut"),Os=y("StorageItem"),Cs=y("StorageItemTask"),Wo=y("EmailIdempotency"),Qo=y("EmailSuppression"),Vo=y("EmailWebhookEvent"),zo=y("Error"),Ho=y("GiftCard"),Go=y("Label"),Jo=y("LicenseKey"),Yo=y("Log"),Xo=y("LoyaltyPoint"),Zo=y("LoyaltyReward"),ea=y("MailPreference"),ta=y("Manufacturer"),na=y("Notification"),ra=y("NotificationDelivery"),oa=y("Order"),aa=y("OrderIdempotency"),vs=y("PersonalAccessToken"),ia=y("OrderItem"),sa=y("Page"),ua=y("Payment"),ca=y("PaymentMethod"),la=y("PaymentProduct"),da=y("PaymentTransaction"),fa=y("Post"),pa=y("PrintDevice"),ma=y("Product"),ya=y("ProductUnit"),ga=y("ProductVariant"),ba=y("QueryLog"),wa=y("Receipt"),Ms=y("Referral"),Ds=y("ReferralCode"),ha=y("Release"),ka=y("Request"),_a=y("Review"),Ta=y("ShippingMethod"),Ra=y("ShippingRate"),Sa=y("ShippingZone"),Aa=y("SocialPost"),Pa=y("SocialAccount"),xa=y("Subscriber"),Oa=y("SubscriberEmail"),Ca=y("Subscription"),va=y("Tag"),Ma=y("TaxRate"),Da=y("Team"),Ea=y("TeamInvitation"),Fa=y("TeamMember"),$a=y("Transaction"),Ia=y("WaitlistProduct"),ja=y("WaitlistRestaurant"),Ba=y("Websocket"),$t={User:Hr,Job:Gr,FailedJob:Jr,Activity:Xr,AnalyticsEvent:Zr,Automation:eo,AutomationRun:to,Auction:no,AuctionItem:uo,Author:co,Bid:lo,Board:fo,BoardColumn:po,Campaign:mo,CampaignSend:Co,CampaignVariant:ro,Card:yo,CardComment:go,Cart:bo,CartItem:wo,Category:ho,Comment:ko,Coupon:_o,Customer:To,CommunicationSuppression:oo,ConsentEvent:ao,DeliveryRoute:Ro,DeliveryStop:So,Deployment:Ao,DigitalDelivery:Po,Courier:xo,CourierPing:Oo,EmailList:vo,EmailListSubscriber:Mo,EmailIdempotency:Wo,EmailSuppression:Qo,EmailWebhookEvent:Vo,ErrorModel:zo,Form:Do,FormField:Eo,FormSubmission:Fo,GiftCard:Ho,Label:Go,LicenseKey:Jo,Log:Yo,LoyaltyPoint:Xo,LoyaltyReward:Zo,MailPreference:ea,Manufacturer:ta,Notification:na,MagicLinkToken:$o,Menu:Io,MenuItem:jo,NotificationDelivery:ra,Order:oa,OrderIdempotency:aa,OrderItem:ia,Page:sa,PageRevision:Bo,Payment:ua,PaymentMethod:ca,PaymentProduct:la,PaymentTransaction:da,Pledge:No,Post:fa,PrintDevice:pa,Product:ma,ProductUnit:ya,ProductVariant:ga,QueryLog:ba,Receipt:wa,Release:ha,Request:ka,Review:_a,ShippingMethod:Ta,Redirect:qo,SenderDomain:io,ShippingRate:Ra,ShippingZone:Sa,Site:Lo,SiteDomain:Uo,SmsOptOut:Ko,SocialAccount:Pa,SocialPost:Aa,Subscriber:xa,SubscriberEmail:Oa,Subscription:Ca,Tag:va,TaxRate:Ma,Team:Da,TeamInvitation:Ea,TeamMember:Fa,Transaction:$a,UsageEvent:so,WaitlistProduct:Ia,WaitlistRestaurant:ja,Websocket:Ba},j=globalThis;for(let[e,t]of Object.entries($t))if(t&&j[e]===void 0)j[e]=t;var Es=Object.keys($t);async function Na(e){if(!e)return[];try{if(typeof e.all==="function"){let t=await e.all();return Array.isArray(t)?t:[]}if(typeof e.get==="function"){let t=await e.get();return Array.isArray(t)?t:[]}}catch{}return[]}function qa(e,t,n=""){if(!e)return n;try{if(typeof e.get==="function"){let o=e.get(t);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[t];return r!==void 0&&r!==null?r:n}if(j.safeAll===void 0)j.safeAll=Na;if(j.safeGet===void 0)j.safeGet=qa;export{Xr as Activity,Zr as AnalyticsEvent,no as Auction,uo as AuctionItem,co as Author,eo as Automation,to as AutomationRun,lo as Bid,fo as Board,po as BoardColumn,mo as Campaign,Co as CampaignSend,ro as CampaignVariant,yo as Card,go as CardComment,bo as Cart,wo as CartItem,ho as Category,ko as Comment,oo as CommunicationSuppression,ao as ConsentEvent,_o as Coupon,xo as Courier,Oo as CourierPing,To as Customer,Ro as DeliveryRoute,So as DeliveryStop,Ao as Deployment,Po as DigitalDelivery,Wo as EmailIdempotency,vo as EmailList,Mo as EmailListSubscriber,Qo as EmailSuppression,Vo as EmailWebhookEvent,zo as ErrorModel,Jr as FailedJob,Do as Form,Eo as FormField,Fo as FormSubmission,Ho as GiftCard,Gr as Job,Go as Label,Jo as LicenseKey,Yo as Log,Xo as LoyaltyPoint,Zo as LoyaltyReward,ve as MODEL_DEFINITION,$o as MagicLinkToken,ea as MailPreference,ta as Manufacturer,xe as MassAssignmentException,Io as Menu,jo as MenuItem,Tt as ModelNotFoundError,ht as ModelValidationError,na as Notification,ra as NotificationDelivery,oa as Order,aa as OrderIdempotency,ia as OrderItem,sa as Page,Bo as PageRevision,ua as Payment,ca as PaymentMethod,la as PaymentProduct,da as PaymentTransaction,vs as PersonalAccessToken,No as Pledge,fa as Post,pa as PrintDevice,ma as Product,ya as ProductUnit,ga as ProductVariant,ba as QueryLog,wa as Receipt,qo as Redirect,Ms as Referral,Ds as ReferralCode,ha as Release,ka as Request,_a as Review,io as SenderDomain,Ta as ShippingMethod,Ra as ShippingRate,Sa as ShippingZone,Lo as Site,Uo as SiteDomain,Ko as SmsOptOut,Pa as SocialAccount,Aa as SocialPost,Os as StorageItem,Cs as StorageItemTask,_n as SubqueryBuilder,xa as Subscriber,Oa as SubscriberEmail,Ca as Subscription,va as Tag,Ma as TaxRate,Da as Team,Ea as TeamInvitation,Fa as TeamMember,$a as Transaction,so as UsageEvent,Hr as User,Ia as WaitlistProduct,ja as WaitlistRestaurant,Ba as Websocket,Ai as batchLoad,Wr as buildDatabaseSchema,ie as collectEncryptedAttributes,je as createAuditMethods,me as createCategorizableMethods,de as createCommentableMethods,ye as createLikeableMethods,pe as createTaggableMethods,pn as customerOwnership,Ci as db,ae as decryptValue,At as defineModel,oe as encryptValue,Te as enrichPaginatorUrls,ms as extendModel,rn as filterFillable,Qa as getPrunableConfig,nn as getWritableFields,tu as isCursorPaginator,B as isEncrypted,nu as isPaginator,ru as isSimplePaginator,Ke as isUniqueViolation,en as mapWriteError,Wa as massPrunable,wr as mergeModelDefinition,Es as modelGlobalNames,xs as ormReady,bn as parentOwnership,Ge as parseCursor,Ce as projectDocumentsFromTrait,It as prunable,Qr as renderDatabaseTypeFile,_e as resolveCursorArgs,ke as resolvePageArgs,Ei as savepoint,mn as selfOwnership,Wt as setAuditUser,yn as siteOwnership,gn as teamMembershipOwnership,fr as toAttrs,ou as toCursorPaginator,au as toPaginator,iu as toSimplePaginator,tn as toSnakeCaseKeys,Di as transaction,Fi as transactional,D as withoutEvents,Kn as withoutValidation};
package/dist/routes.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import ct from"process";import{route as F}from"@stacksjs/router";import{env as H}from"@stacksjs/env";import{projectPath as _e,storagePath as dt}from"@stacksjs/path";import{createQueryBuilder as ft,defaultConfig as Be,setConfig as Qe}from"@stacksjs/query-builder";import{HttpError as B}from"@stacksjs/error-handling";import{log as q}from"@stacksjs/logging";function Ye(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function ce(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let s={error:e.message};if(r.details!==void 0)s.details=r.details;return{status:r.status,body:s}}if(Ye(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function de(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Oe(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Te(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Ae(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function Pe(e){return e?.ownership===!1}function De(e,t,n){let r=Object.keys(e).find((o)=>_(o)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((o)=>String(o)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let s={...e};for(let o of Object.keys(s))if(_(o)===_(t))delete s[o];return s[t]=n,{data:s}}function $e(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let s=`${r[0]}${r.slice(1).map((o)=>`${o[0]?.toUpperCase()}${o.slice(1)}`).join("")}Id`;t.push(s)}return[...new Set(t)]}function fe(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let s=_(r);if(s!==r&&s in e)n[r]=e[s]}return n}function Ze(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),s=Number(n[2]),o=Number(n[3]),i=new Date(Date.UTC(r,s-1,o));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==s-1||i.getUTCDate()!==o)return t;return i}function ge(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function K(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var et=["id","uuid","created_at","updated_at","deleted_at"];function Ie(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...et]){let s=_(r);if(!/^\w+$/.test(s))continue;n.set(r,s),n.set(s,s)}for(let r of t)n.delete(r),n.delete(_(r));return n}function Ne(e,t,n){if(!t)return e;let r=String(t).split(",").map((o)=>o.trim()).filter(Boolean),s=e;for(let o of r){let i=o.startsWith("-"),l=i?o.slice(1):o;if(!/^\w+$/.test(l))continue;let w=n.get(l);if(!w)continue;s=s.orderBy(w,i?"desc":"asc")}return s}var tt={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?nt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?rt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function nt(e){try{return JSON.parse(e)}catch{return e}}function rt(e){try{return JSON.parse(e)}catch{return[]}}function pe(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[s,o]of Object.entries(t)){let i=typeof o==="string"?tt[o]:o;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s]);let l=_(s);if(l!==s&&Object.prototype.hasOwnProperty.call(r,l))r[l]=i[n](r[l])}return r}function ye(e,t,n){let r=t?.attributes??{},s={};for(let[o,i]of Object.entries(r)){let l=i?.validation?.rule;if(!l||typeof l.validate!=="function")continue;let w=Object.prototype.hasOwnProperty.call(e,o);if(!w&&n==="updating")continue;let c=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),P=w?e[o]:c?i.default:void 0,v=Ze(l,P),D=l.validate(v);if(!D?.valid&&Array.isArray(D?.errors)&&D.errors.length>0)s[o]=D.errors.map((Q)=>i?.validation?.message?.[Q?.code]??Q?.message??"invalid")}return Object.keys(s).length===0?{valid:!0}:{valid:!1,errors:s}}function ve(e,t,n){let r=Se(n);return e.find((s)=>s.method===t&&Se(String(s.path??""))===r)}function Se(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function le(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ce(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return{read:"read"in s?le(s.read):["auth"],write:"write"in s?le(s.write):["auth"],declared:!0}}let r=le(n);return{read:r,write:r,declared:!0}}var xe=15,st=100;function Ee(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(xe),10),s=Math.min(Number.isFinite(r)?Math.max(1,r):xe,st);return{page:n,perPage:s,offset:(n-1)*s}}function oe(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function ot(e,t,n,r,s,o){let i=(t-1)*n,l=r===0,w={page:t,per_page:n,from:l?null:i+1,to:l?null:i+r,has_more_pages:s,prev_page_url:t>1?oe(e,t-1):null,next_page_url:s?oe(e,t+1):null};if(o!==void 0&&!Number.isNaN(o)){let c=Math.max(1,Math.ceil(o/n));w.total=o,w.last_page=c,w.first_page_url=oe(e,1),w.last_page_url=oe(e,c)}return w}function me(e,t,n,r,s,o){let{page:i,...l}=ot(e,t,n,r,s,o);return{current_page:i,...l}}function we(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function je(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as it}from"fs";import{basename as at,extname as Fe,join as ut}from"path";function lt(e){let t=[],n=(r)=>{let s;try{s=it(r,{withFileTypes:!0})}catch{return}for(let o of s){let i=ut(r,o.name);if(o.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Fe(o.name)))continue;if(o.name.startsWith(".")||o.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function Me(e,t,n){for(let r of lt(e))try{let s=Fe(r),o=await import(`${r}?t=${Date.now()}`),i=o.default??o,l=i.name??at(r,s);t[l]={...i,name:l}}catch(s){n?.(r,s)}}async function Ue(e){let t={};return await Me(e.defaultsRoot,t,e.onImportError),await Me(e.userRoot,t,e.onImportError),t}function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Te(e);if(t)return{field:t,resolve:async(r,s)=>{let{resolveAuthenticatedTeamId:o}=await import("@stacksjs/auth");return o(he(s))}};let n=Ae(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function he(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(s)=>{for(let o of r.split(";")){let i=o.indexOf("=");if(i===-1)continue;if(o.slice(0,i).trim()===s)return decodeURIComponent(o.slice(i+1).trim())}return null}}}}function kt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function St(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function xt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:s}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),o=await r(he(n));if(o==null)return[];return(await s.where("team_id",o).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function Ot(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(he(n))}catch{return null}}}}function Tt(e,t){return{field:t,resolve:async(n,r)=>{try{let s=await import("@stacksjs/orm"),o=s.models?.[e]??s[e]?.definition??null,i=ie(o);if(!i?.field||typeof i.resolve!=="function")return[];let l=await i.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let w=s[e];if(!w)return[];return((Array.isArray(l)?await w.whereIn(i.field,l).get():await w.where(i.field,l).get())??[]).map((P)=>P.id).filter((P)=>P!=null)}catch{return[]}}}}var gt=_e("config/qb.ts");try{let e=(await import(gt)).default;Qe(e??Be)}catch{q.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=H.DB_CONNECTION||"sqlite";Qe({...Be,dialect:e,database:e==="sqlite"?{database:H.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:H.DB_DATABASE||"stacks",host:H.DB_HOST||"127.0.0.1",port:H.DB_PORT||(e==="postgres"?5432:3306),username:H.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:H.DB_PASSWORD||""}})}var be=await Ue({defaultsRoot:dt("framework/defaults/app/Models"),userRoot:_e("app/Models"),onImportError:(e,t)=>q.warn(`[orm] Could not load model ${e}: ${t.message}`)}),pt=ft(),A=pt;function J(e,t){let n=ve(F.routes,e,t);if(!n)return!1;let r=String(n.path??"");return q.info(`[orm] Skipping generated ${e} ${t} - already defined${r&&r!==t?` as ${r}`:""}.`),!0}function qe(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function We(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function Le(e,t,n,r){if(!e.length)return e;let s=n.split(",").map((c)=>c.trim()).filter(Boolean);if(!s.length)return e;let o=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],w=new Map;for(let c of o)w.set(_(c),{kind:"belongsTo",modelName:c});for(let c of l)w.set(_(c),{kind:"hasOne",modelName:c});for(let c of i)w.set(We(_(c)),{kind:"hasMany",modelName:c});for(let c of s){let P=w.get(c);if(!P)continue;let v=r[P.modelName];if(!v)continue;let D=v.table||We(_(P.modelName)),Q=qe(v),V=(W)=>K(ne(W,v),Q);if(P.kind==="belongsTo"||P.kind==="hasOne"){let W=`${_(P.modelName)}_id`,C=[...new Set(e.map((S)=>S[W]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[c]=null;continue}let G=await A.selectFrom(D).whereIn("id",C).get(),L=new Map;for(let S of G??[])L.set(String(S.id),V(S));for(let S of e)S[c]=L.get(String(S[W]))??null}else{let W=String(t.name??""),C=`${_(W)}_id`,G=[...new Set(e.map((T)=>T.id).filter((T)=>T!=null))];if(!G.length){for(let T of e)T[c]=[];continue}let L=await A.selectFrom(D).whereIn(C,G).get(),S=new Map;for(let T of L??[]){let E=String(T[C]),Z=S.get(E)??[];Z.push(V(T)),S.set(E,Z)}for(let T of e)T[c]=S.get(String(T.id))??[]}}return e}async function ze(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[s,o]of Object.entries(n)){if(typeof o!=="function"||!(s in r))continue;try{r[s]=await o(r)}catch{}}return r}function He(e,t){return pe(e,t?.casts,"set")}function ne(e,t){return pe(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function Re(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new B(413,`Request body exceeds ${ae}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ae)throw new B(413,`Request body exceeds ${ae}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof B)throw n;throw new B(400,`Invalid JSON body: ${n.message}`)}}function ue(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function yt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=yt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),s=await r.getUserFromToken(n);if(s)e._authenticatedUser=s;return s||null}catch{return null}}function te(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Y(e,t,n){let r=ie(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let s=typeof r.bypass==="function"?!!r.bypass(t,n):!1,o=null;try{o=await r.resolve(t,n)}catch{o=null}return{enforced:!0,value:o,field:String(r.field),bypass:s}}async function Je(e,t,n,r){let s=e?.authedFill?.[t];if(!s)return{};if(typeof s==="function")try{let o=await s(n,r);return o&&typeof o==="object"?o:{}}catch{return{}}if(typeof s==="object"){let o={};for(let[i,l]of Object.entries(s))try{o[i]=typeof l==="function"?await l(n,r):l}catch{}return o}return{}}var Ve=await(async()=>{let e=ct.env.STACKS_API_ROW_SCOPING;try{let t=(await import(_e("config/security.ts"))).default;return we(t?.api?.rowScoping,e)}catch{return we(void 0,e)}})(),Ge=[];for(let[e,t]of Object.entries(be)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},s=r.uri||t.table||e.toLowerCase()+"s",o=r.routes||["index","show","store","update","destroy"],i=t.table||s,l=$e(t),w=qe(t),c=Oe(s,r.prefix),P=Ie(t.attributes,w),{read:v,write:D,declared:Q}=Ce(n),V=["store","update","destroy"].some((p)=>o.includes(p));if(V&&Q&&D.length===0)q.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${c} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((p)=>o.includes(p))&&Q&&v.length===0)q.debug(`[orm] ${e}: registering public read routes at ${c} (declared \`middleware.read: []\`)`);let C=!!ie(t),G=C&&!v.includes("auth")?["auth",...v]:v,L=Pe(t),S=V&&!C&&!L;if(S)Ge.push(e);if(V&&L)q.debug(`[orm] ${e}: registering unscoped mutating routes at ${c} (declared \`ownership: false\`)`);let T=S&&Ve==="deny",E=(p,a=G)=>{let u=p;for(let f of a)if(u&&typeof u.middleware==="function")u=u.middleware(f);return u};if(o.includes("index")&&!J("GET",c))E(F.get(c,async(p)=>{try{let a=new URL(p.url),{page:u,perPage:f,offset:h}=Ee(a.searchParams),m=a.searchParams.get("sort"),g=A.selectFrom(i);g=Ne(g,m,P);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of a.searchParams.entries()){if(N.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let z=P.get(x);if(z)g=g.where(z,"=",O)}let R=a.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);g=g.where((O)=>{for(let z of x)O=O.orWhere(_(z),"like",`%${R}%`);return O})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((O)=>O.trim()).filter((O)=>/^[a-z_][a-z0-9_]*$/i.test(O)).map((O)=>_(O));if(x.length>0)g=g.select(x)}let I=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",j=a.searchParams.get("onlyTrashed")==="true";if(I&&!b)g=j?g.whereNotNull("deleted_at"):g.whereNull("deleted_at");let y=C?await Y(t,await X(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(y.enforced&&!y.bypass){if(y.value==null||Array.isArray(y.value)&&y.value.length===0){let x=me(a,u,f,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}g=Array.isArray(y.value)?g.where(y.field,"in",y.value):g.where(y.field,"=",y.value)}let M=await g.limit(f+1).offset(h).get()||[],U=M.length>f,re=(U?M.slice(0,f):M).map((x)=>K(ne(x,t),w)),ke=a.searchParams.get("include");if(ke)re=await Le(re,t,ke,be);let Ke=a.searchParams.get("with_count")==="true",ee;if(Ke)try{let x=A.selectFrom(i);if(y.enforced&&!y.bypass&&y.value!=null)x=Array.isArray(y.value)?x.where(y.field,"in",y.value):x.where(y.field,"=",y.value);let O=await x.count(),z=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(z))ee=z}catch{}let se={"Content-Type":"application/json"};if(ee!==void 0&&!Number.isNaN(ee))se["X-Total-Count"]=String(ee);se["Cache-Control"]=y.enforced&&!y.bypass?"private, no-store":"public, max-age=15, must-revalidate",se.Vary="Authorization";let Xe=me(a,u,f,re.length,U,ee);return new Response(JSON.stringify({data:re,...Xe}),{status:200,headers:se})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${s}`,detail:String(a)},500)}}));if(o.includes("show")&&!J("GET",`${c}/{id}`))E(F.get(`${c}/{id}`,async(p)=>{try{let a=ue(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=new URL(p.url);if(t.traits?.useSoftDeletes&&u.deleted_at&&f.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=C?await Y(t,await X(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!te(u[h.field],h.value))return d({error:`${e} not found`},404)}let m=K(ne(u,t),w),g=f.searchParams.get("include");if(g){let[b]=await Le([m],t,g,be);m=b}let N=m?.updated_at||m?.created_at,R=N?`W/"${m.id}-${String(N)}"`:void 0,k=p.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let I={"Content-Type":"application/json"};if(R)I.ETag=R;return I["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:m}),{status:200,headers:I})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!T&&o.includes("store")&&!J("POST",c))E(F.post(c,async(p)=>{try{let a=await Re(p),u=ge(a,w),f=fe(u,l),h=await X(p);if(h){let b=await Je(t,"creating",h,p);for(let[j,y]of Object.entries(b))if(y!==void 0&&y!==null&&f[j]===void 0)f[j]=y}let m=await Y(t,h,p);if(m.enforced&&!m.bypass){if(!h)return d({error:"Auth required"},401);let b=De(f,m.field,m.value);if(b.error)return d({error:b.error},403);f=b.data}if(Object.keys(f).length===0)return d({error:"No fillable fields provided"},422);let g=ye(f,t,"creating");if(!g.valid)return d({success:!1,message:"Validation failed",errors:g.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();f.created_at=b,f.updated_at=b}let N=await ze(f,t),R=de(He(N,t)),k=await A.insertInto(i).values(R).execute(),I=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(j)I=j}}catch{}return d({data:K(ne(I,t),w)},201)}catch(a){let{status:u,body:f}=ce(a,e,"create");return d(f,u)}}),D);if(!T&&o.includes("update")){let p=async(a)=>{try{let u=ue(a.params?.id);if(u==null)return d({error:"Invalid ID parameter"},400);let f=await Re(a),h=ge(f,w),m=fe(h,l),g=await X(a);if(g){let y=await Je(t,"updating",g,a);for(let[M,U]of Object.entries(y))if(U!==void 0&&U!==null&&m[M]===void 0)m[M]=U}if(Object.keys(m).length===0)return d({error:"No fillable fields provided"},422);let N=ye(m,t,"updating");if(!N.valid)return d({success:!1,message:"Validation failed",errors:N.errors},422);let R=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Y(t,g,a);if(k.enforced&&!k.bypass){if(!g)return d({error:"Auth required"},401);let y=R[k.field];if(!te(y,k.value))return d({error:`Not your ${e}`},403);let M=Object.keys(m).find((U)=>_(U)===_(k.field));if(M!==void 0&&!te(m[M],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)m.updated_at=new Date().toISOString();let I=await ze(m,t),b=de(He(I,t));await A.updateTable(i).set(b).where({id:u}).execute();let j={...R,...b};try{let y=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(y)j=y}catch{}return d({data:K(ne(j,t),w)})}catch(u){let{status:f,body:h}=ce(u,e,"update");return d(h,f)}};if(!J("PUT",`${c}/{id}`))E(F.put(`${c}/{id}`,p),D);if(!J("PATCH",`${c}/{id}`))E(F.patch(`${c}/{id}`,p),D)}let Z=!!t.traits?.useSoftDeletes;if(!T&&o.includes("destroy")&&!J("DELETE",`${c}/{id}`))E(F.delete(`${c}/{id}`,async(p)=>{try{let a=ue(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=await X(p),h=await Y(t,f,p);if(h.enforced&&!h.bypass){if(!f)return d({error:"Auth required"},401);let m=u[h.field];if(!te(m,h.value))return d({error:`Not your ${e}`},403)}if(Z){let m=new Date().toISOString();await A.updateTable(i).set({deleted_at:m,updated_at:m}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to delete ${e}`,detail:String(a)},500)}}),D);if(!T&&o.includes("destroy")&&!J("POST",`${c}/bulk-delete`))E(F.post(`${c}/bulk-delete`,async(p)=>{try{let u=(await Re(p))?.ids;if(!Array.isArray(u)||u.length===0)return d({error:"An array of IDs is required"},422);if(u.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let f=[],h=[];for(let R of u){let k=ue(R);if(k!=null)f.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let m=await X(p),g=await Y(t,m,p);if(g.enforced&&!g.bypass){if(!m)return d({error:"Auth required"},401);if(g.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(i).select(["id",g.field]).execute(),k=new Set(R.filter((b)=>te(b[g.field],g.value)).map((b)=>String(b.id))),I=f.filter((b)=>!k.has(String(b)));if(I.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:I},403)}let N=new Date().toISOString();for(let R of f)if(Z)await A.updateTable(i).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await A.deleteFrom(i).where({id:R}).execute();return d({message:`Successfully deleted ${f.length} ${s}`})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to bulk delete ${s}`,detail:String(a)},500)}}),D)}{let e=je(Ge,Ve);if(e)q.warn(e)}var Ut=F;export{Ut as default};
2
+ var H=import.meta.require;import dt from"process";import{route as F}from"@stacksjs/router";import{env as J}from"@stacksjs/env";import{projectPath as ke,storagePath as ft}from"@stacksjs/path";import{createQueryBuilder as gt,defaultConfig as Qe,setConfig as We}from"@stacksjs/query-builder";import{HttpError as B}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging";function Ze(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function de(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let s={error:e.message};if(r.details!==void 0)s.details=r.details;return{status:r.status,body:s}}if(Ze(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function fe(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Te(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ae(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Pe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function De(e){return e?.ownership===!1}function $e(e,t,n){let r=Object.keys(e).find((o)=>_(o)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((o)=>String(o)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let s={...e};for(let o of Object.keys(s))if(_(o)===_(t))delete s[o];return s[t]=n,{data:s}}function Ie(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let s=`${r[0]}${r.slice(1).map((o)=>`${o[0]?.toUpperCase()}${o.slice(1)}`).join("")}Id`;t.push(s)}return[...new Set(t)]}function ge(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let s=_(r);if(s!==r&&s in e)n[r]=e[s]}return n}function et(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),s=Number(n[2]),o=Number(n[3]),i=new Date(Date.UTC(r,s-1,o));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==s-1||i.getUTCDate()!==o)return t;return i}function pe(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function X(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var tt=["id","uuid","created_at","updated_at","deleted_at"];function Ne(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...tt]){let s=_(r);if(!/^\w+$/.test(s))continue;n.set(r,s),n.set(s,s)}for(let r of t)n.delete(r),n.delete(_(r));return n}function ve(e,t,n){if(!t)return e;let r=String(t).split(",").map((o)=>o.trim()).filter(Boolean),s=e;for(let o of r){let i=o.startsWith("-"),l=i?o.slice(1):o;if(!/^\w+$/.test(l))continue;let w=n.get(l);if(!w)continue;s=s.orderBy(w,i?"desc":"asc")}return s}var nt={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?rt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?st(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function rt(e){try{return JSON.parse(e)}catch{return e}}function st(e){try{return JSON.parse(e)}catch{return[]}}function ye(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[s,o]of Object.entries(t)){let i=typeof o==="string"?nt[o]:o;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s]);let l=_(s);if(l!==s&&Object.prototype.hasOwnProperty.call(r,l))r[l]=i[n](r[l])}return r}function me(e,t,n){let r=t?.attributes??{},s={};for(let[o,i]of Object.entries(r)){let l=i?.validation?.rule;if(!l||typeof l.validate!=="function")continue;let w=Object.prototype.hasOwnProperty.call(e,o);if(!w&&n==="updating")continue;let c=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),P=w?e[o]:c?i.default:void 0,v=et(l,P),D=l.validate(v);if(!D?.valid&&Array.isArray(D?.errors)&&D.errors.length>0)s[o]=D.errors.map((Q)=>i?.validation?.message?.[Q?.code]??Q?.message??"invalid")}return Object.keys(s).length===0?{valid:!0}:{valid:!1,errors:s}}function Ce(e,t,n){let r=xe(n);return e.find((s)=>s.method===t&&xe(String(s.path??""))===r)}function xe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ce(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ee(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let s=n;return{read:"read"in s?ce(s.read):["auth"],write:"write"in s?ce(s.write):["auth"],declared:!0}}let r=ce(n);return{read:r,write:r,declared:!0}}var Oe=15,ot=100;function je(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Oe),10),s=Math.min(Number.isFinite(r)?Math.max(1,r):Oe,ot);return{page:n,perPage:s,offset:(n-1)*s}}function ie(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function it(e,t,n,r,s,o){let i=(t-1)*n,l=r===0,w={page:t,per_page:n,from:l?null:i+1,to:l?null:i+r,has_more_pages:s,prev_page_url:t>1?ie(e,t-1):null,next_page_url:s?ie(e,t+1):null};if(o!==void 0&&!Number.isNaN(o)){let c=Math.max(1,Math.ceil(o/n));w.total=o,w.last_page=c,w.first_page_url=ie(e,1),w.last_page_url=ie(e,c)}return w}function we(e,t,n,r,s,o){let{page:i,...l}=it(e,t,n,r,s,o);return{current_page:i,...l}}function he(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Me(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}import{readdirSync as at}from"fs";import{basename as ut,extname as Ue,join as lt}from"path";function ct(e){let t=[],n=(r)=>{let s;try{s=at(r,{withFileTypes:!0})}catch{return}for(let o of s){let i=lt(r,o.name);if(o.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Ue(o.name)))continue;if(o.name.startsWith(".")||o.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function Fe(e,t,n){for(let r of ct(e))try{let s=Ue(r),o=await import(`${r}?t=${Date.now()}`),i=o.default??o,l=i.name??ut(r,s);t[l]={...i,name:l}}catch(s){n?.(r,s)}}async function Be(e){let t={};return await Fe(e.defaultsRoot,t,e.onImportError),await Fe(e.userRoot,t,e.onImportError),t}function ae(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ae(e);if(t)return{field:t,resolve:async(r,s)=>{let{resolveAuthenticatedTeamId:o}=await import("@stacksjs/auth");return o(be(s))}};let n=Pe(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function be(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(s)=>{for(let o of r.split(";")){let i=o.indexOf("=");if(i===-1)continue;if(o.slice(0,i).trim()===s)return decodeURIComponent(o.slice(i+1).trim())}return null}}}}function xt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function Ot(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Tt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:s}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),o=await r(be(n));if(o==null)return[];return(await s.where("team_id",o).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function At(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(n))}catch{return null}}}}function Pt(e,t){return{field:t,resolve:async(n,r)=>{try{let s=await import("@stacksjs/orm"),o=s.models?.[e]??s[e]?.definition??null,i=ae(o);if(!i?.field||typeof i.resolve!=="function")return[];let l=await i.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let w=s[e];if(!w)return[];return((Array.isArray(l)?await w.whereIn(i.field,l).get():await w.where(i.field,l).get())??[]).map((P)=>P.id).filter((P)=>P!=null)}catch{return[]}}}}var pt=ke("config/qb.ts");try{let e=(await import(pt)).default;We(e??Qe)}catch{V.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=J.DB_CONNECTION||"sqlite";We({...Qe,dialect:e,database:e==="sqlite"?{database:J.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:J.DB_DATABASE||"stacks",host:J.DB_HOST||"127.0.0.1",port:J.DB_PORT||(e==="postgres"?5432:3306),username:J.DB_USERNAME||(e==="postgres"?"postgres":"root"),password:J.DB_PASSWORD||""}})}var Re=await Be({defaultsRoot:ft("framework/defaults/app/Models"),userRoot:ke("app/Models"),onImportError:(e,t)=>V.warn(`[orm] Could not load model ${e}: ${t.message}`)}),yt=gt(),A=yt;function q(e,t){let n=Ce(F.routes,e,t);if(!n)return!1;let r=String(n.path??"");return V.info(`[orm] Skipping generated ${e} ${t} - already defined${r&&r!==t?` as ${r}`:""}.`),!0}function Ve(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Le(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function ze(e,t,n,r){if(!e.length)return e;let s=n.split(",").map((c)=>c.trim()).filter(Boolean);if(!s.length)return e;let o=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],w=new Map;for(let c of o)w.set(_(c),{kind:"belongsTo",modelName:c});for(let c of l)w.set(_(c),{kind:"hasOne",modelName:c});for(let c of i)w.set(Le(_(c)),{kind:"hasMany",modelName:c});for(let c of s){let P=w.get(c);if(!P)continue;let v=r[P.modelName];if(!v)continue;let D=v.table||Le(_(P.modelName)),Q=Ve(v),G=(W)=>X(re(W,v),Q);if(P.kind==="belongsTo"||P.kind==="hasOne"){let W=`${_(P.modelName)}_id`,C=[...new Set(e.map((S)=>S[W]).filter((S)=>S!=null))];if(!C.length){for(let S of e)S[c]=null;continue}let K=await A.selectFrom(D).whereIn("id",C).get(),L=new Map;for(let S of K??[])L.set(String(S.id),G(S));for(let S of e)S[c]=L.get(String(S[W]))??null}else{let W=String(t.name??""),C=`${_(W)}_id`,K=[...new Set(e.map((T)=>T.id).filter((T)=>T!=null))];if(!K.length){for(let T of e)T[c]=[];continue}let L=await A.selectFrom(D).whereIn(C,K).get(),S=new Map;for(let T of L??[]){let E=String(T[C]),ee=S.get(E)??[];ee.push(G(T)),S.set(E,ee)}for(let T of e)T[c]=S.get(String(T.id))??[]}}return e}async function He(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[s,o]of Object.entries(n)){if(typeof o!=="function"||!(s in r))continue;try{r[s]=await o(r)}catch{}}return r}function Je(e,t){return ye(e,t?.casts,"set")}function re(e,t){return ye(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ue=1048576;async function _e(e){if(Number(e.headers?.get?.("content-length")??0)>ue)throw new B(413,`Request body exceeds ${ue}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ue)throw new B(413,`Request body exceeds ${ue}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof B)throw n;throw new B(400,`Invalid JSON body: ${n.message}`)}}function le(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function mt(e){let t=e.bearerToken;if(typeof t==="function"){let r=t.call(e);if(r)return r}let n=e.headers?.get?.("authorization")||e.headers?.get?.("Authorization")||"";if(typeof n==="string"&&n.startsWith("Bearer "))return n.substring(7);return null}async function Y(e){let t=e._authenticatedUser;if(t)return t;let n=mt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),s=await r.getUserFromToken(n);if(s)e._authenticatedUser=s;return s||null}catch{return null}}function ne(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Z(e,t,n){let r=ae(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let s=typeof r.bypass==="function"?!!r.bypass(t,n):!1,o=null;try{o=await r.resolve(t,n)}catch{o=null}return{enforced:!0,value:o,field:String(r.field),bypass:s}}async function qe(e,t,n,r){let s=e?.authedFill?.[t];if(!s)return{};if(typeof s==="function")try{let o=await s(n,r);return o&&typeof o==="object"?o:{}}catch{return{}}if(typeof s==="object"){let o={};for(let[i,l]of Object.entries(s))try{o[i]=typeof l==="function"?await l(n,r):l}catch{}return o}return{}}var Ge=await(async()=>{let e=dt.env.STACKS_API_ROW_SCOPING;try{let t=(await import(ke("config/security.ts"))).default;return he(t?.api?.rowScoping,e)}catch{return he(void 0,e)}})(),Ke=[];for(let[e,t]of Object.entries(Re)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},s=r.uri||t.table||e.toLowerCase()+"s",o=r.routes||["index","show","store","update","destroy"],i=t.table||s,l=Ie(t),w=Ve(t),c=Te(s,r.prefix),P=Ne(t.attributes,w),{read:v,write:D,declared:Q}=Ee(n),G=["store","update","destroy"].some((p)=>o.includes(p));if(G&&Q&&D.length===0)V.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${c} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((p)=>o.includes(p))&&Q&&v.length===0)V.debug(`[orm] ${e}: registering public read routes at ${c} (declared \`middleware.read: []\`)`);let C=!!ae(t),K=C&&!v.includes("auth")?["auth",...v]:v,L=De(t),S=G&&!C&&!L;if(S)Ke.push(e);if(G&&L)V.debug(`[orm] ${e}: registering unscoped mutating routes at ${c} (declared \`ownership: false\`)`);let T=S&&Ge==="deny",E=(p,a=K)=>{let u=p;for(let f of a)if(u&&typeof u.middleware==="function")u=u.middleware(f);return u};if(o.includes("index")&&!q("GET",c))E(F.get(c,async(p)=>{try{let a=new URL(p.url),{page:u,perPage:f,offset:h}=je(a.searchParams),m=a.searchParams.get("sort"),g=A.selectFrom(i);g=ve(g,m,P);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,O]of a.searchParams.entries()){if(N.has(x)||!O)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let z=P.get(x);if(z)g=g.where(z,"=",O)}let R=a.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);g=g.where((O)=>{for(let z of x)O=O.orWhere(_(z),"like",`%${R}%`);return O})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((O)=>O.trim()).filter((O)=>/^[a-z_][a-z0-9_]*$/i.test(O)).map((O)=>_(O));if(x.length>0)g=g.select(x)}let I=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",j=a.searchParams.get("onlyTrashed")==="true";if(I&&!b)g=j?g.whereNotNull("deleted_at"):g.whereNull("deleted_at");let y=C?await Z(t,await Y(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(y.enforced&&!y.bypass){if(y.value==null||Array.isArray(y.value)&&y.value.length===0){let x=we(a,u,f,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}g=Array.isArray(y.value)?g.where(y.field,"in",y.value):g.where(y.field,"=",y.value)}let M=await g.limit(f+1).offset(h).get()||[],U=M.length>f,se=(U?M.slice(0,f):M).map((x)=>X(re(x,t),w)),Se=a.searchParams.get("include");if(Se)se=await ze(se,t,Se,Re);let Xe=a.searchParams.get("with_count")==="true",te;if(Xe)try{let x=A.selectFrom(i);if(y.enforced&&!y.bypass&&y.value!=null)x=Array.isArray(y.value)?x.where(y.field,"in",y.value):x.where(y.field,"=",y.value);let O=await x.count(),z=typeof O==="number"?O:Number(O?.count??O);if(Number.isFinite(z))te=z}catch{}let oe={"Content-Type":"application/json"};if(te!==void 0&&!Number.isNaN(te))oe["X-Total-Count"]=String(te);oe["Cache-Control"]=y.enforced&&!y.bypass?"private, no-store":"public, max-age=15, must-revalidate",oe.Vary="Authorization";let Ye=we(a,u,f,se.length,U,te);return new Response(JSON.stringify({data:se,...Ye}),{status:200,headers:oe})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${s}`,detail:String(a)},500)}}));if(o.includes("show")&&!q("GET",`${c}/{id}`))E(F.get(`${c}/{id}`,async(p)=>{try{let a=le(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=new URL(p.url);if(t.traits?.useSoftDeletes&&u.deleted_at&&f.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=C?await Z(t,await Y(p),p):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!ne(u[h.field],h.value))return d({error:`${e} not found`},404)}let m=X(re(u,t),w),g=f.searchParams.get("include");if(g){let[b]=await ze([m],t,g,Re);m=b}let N=m?.updated_at||m?.created_at,R=N?`W/"${m.id}-${String(N)}"`:void 0,k=p.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let I={"Content-Type":"application/json"};if(R)I.ETag=R;return I["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",I.Vary="Authorization",new Response(JSON.stringify({data:m}),{status:200,headers:I})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!T&&o.includes("store")&&!q("POST",c))E(F.post(c,async(p)=>{try{let a=await _e(p),u=pe(a,w),f=ge(u,l),h=await Y(p);if(h){let b=await qe(t,"creating",h,p);for(let[j,y]of Object.entries(b))if(y!==void 0&&y!==null&&f[j]===void 0)f[j]=y}let m=await Z(t,h,p);if(m.enforced&&!m.bypass){if(!h)return d({error:"Auth required"},401);let b=$e(f,m.field,m.value);if(b.error)return d({error:b.error},403);f=b.data}if(Object.keys(f).length===0)return d({error:"No fillable fields provided"},422);let g=me(f,t,"creating");if(!g.valid)return d({success:!1,message:"Validation failed",errors:g.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();f.created_at=b,f.updated_at=b}let N=await He(f,t),R=fe(Je(N,t)),k=await A.insertInto(i).values(R).execute(),I=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let j=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(j)I=j}}catch{}return d({data:X(re(I,t),w)},201)}catch(a){let{status:u,body:f}=de(a,e,"create");return d(f,u)}}),D);if(!T&&o.includes("update")){let p=async(a)=>{try{let u=le(a.params?.id);if(u==null)return d({error:"Invalid ID parameter"},400);let f=await _e(a),h=pe(f,w),m=ge(h,l),g=await Y(a);if(g){let y=await qe(t,"updating",g,a);for(let[M,U]of Object.entries(y))if(U!==void 0&&U!==null&&m[M]===void 0)m[M]=U}if(Object.keys(m).length===0)return d({error:"No fillable fields provided"},422);let N=me(m,t,"updating");if(!N.valid)return d({success:!1,message:"Validation failed",errors:N.errors},422);let R=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Z(t,g,a);if(k.enforced&&!k.bypass){if(!g)return d({error:"Auth required"},401);let y=R[k.field];if(!ne(y,k.value))return d({error:`Not your ${e}`},403);let M=Object.keys(m).find((U)=>_(U)===_(k.field));if(M!==void 0&&!ne(m[M],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)m.updated_at=new Date().toISOString();let I=await He(m,t),b=fe(Je(I,t));await A.updateTable(i).set(b).where({id:u}).execute();let j={...R,...b};try{let y=await A.selectFrom(i).where({id:u}).executeTakeFirst();if(y)j=y}catch{}return d({data:X(re(j,t),w)})}catch(u){let{status:f,body:h}=de(u,e,"update");return d(h,f)}};if(!q("PUT",`${c}/{id}`))E(F.put(`${c}/{id}`,p),D);if(!q("PATCH",`${c}/{id}`))E(F.patch(`${c}/{id}`,p),D)}let ee=!!t.traits?.useSoftDeletes;if(!T&&o.includes("destroy")&&!q("DELETE",`${c}/{id}`))E(F.delete(`${c}/{id}`,async(p)=>{try{let a=le(p.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let u=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!u)return d({error:`${e} not found`},404);let f=await Y(p),h=await Z(t,f,p);if(h.enforced&&!h.bypass){if(!f)return d({error:"Auth required"},401);let m=u[h.field];if(!ne(m,h.value))return d({error:`Not your ${e}`},403)}if(ee){let m=new Date().toISOString();await A.updateTable(i).set({deleted_at:m,updated_at:m}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to delete ${e}`,detail:String(a)},500)}}),D);if(!T&&o.includes("destroy")&&!q("POST",`${c}/bulk-delete`))E(F.post(`${c}/bulk-delete`,async(p)=>{try{let u=(await _e(p))?.ids;if(!Array.isArray(u)||u.length===0)return d({error:"An array of IDs is required"},422);if(u.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let f=[],h=[];for(let R of u){let k=le(R);if(k!=null)f.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let m=await Y(p),g=await Z(t,m,p);if(g.enforced&&!g.bypass){if(!m)return d({error:"Auth required"},401);if(g.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(i).select(["id",g.field]).execute(),k=new Set(R.filter((b)=>ne(b[g.field],g.value)).map((b)=>String(b.id))),I=f.filter((b)=>!k.has(String(b)));if(I.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:I},403)}let N=new Date().toISOString();for(let R of f)if(ee)await A.updateTable(i).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await A.deleteFrom(i).where({id:R}).execute();return d({message:`Successfully deleted ${f.length} ${s}`})}catch(a){if(a instanceof B){let u={error:a.message};if(a.details!==void 0)u.details=a.details;return d(u,a.status||400)}return d({error:`Failed to bulk delete ${s}`,detail:String(a)},500)}}),D)}{let e=Me(Ke,Ge);if(e)V.warn(e)}var Qt=F;export{Qt as default};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/orm",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.74.34",
5
+ "version": "0.74.35",
6
6
  "description": "The Stacks ORM integration",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -63,31 +63,31 @@
63
63
  "prepublishOnly": "bun run build"
64
64
  },
65
65
  "dependencies": {
66
- "@stacksjs/cache": "0.74.34",
67
- "@stacksjs/cli": "0.74.34",
68
- "@stacksjs/config": "0.74.34",
69
- "@stacksjs/database": "0.74.34",
70
- "@stacksjs/env": "0.74.34",
71
- "@stacksjs/error-handling": "0.74.34",
72
- "@stacksjs/events": "0.74.34",
73
- "@stacksjs/logging": "0.74.34",
74
- "@stacksjs/model-meta": "0.74.34",
75
- "@stacksjs/pagination": "0.74.34",
76
- "@stacksjs/path": "0.74.34",
77
- "@stacksjs/query-builder": "0.74.34",
78
- "@stacksjs/realtime": "0.74.34",
79
- "@stacksjs/router": "0.74.34",
80
- "@stacksjs/storage": "0.74.34",
81
- "@stacksjs/strings": "0.74.34",
66
+ "@stacksjs/cache": "0.74.35",
67
+ "@stacksjs/cli": "0.74.35",
68
+ "@stacksjs/config": "0.74.35",
69
+ "@stacksjs/database": "0.74.35",
70
+ "@stacksjs/env": "0.74.35",
71
+ "@stacksjs/error-handling": "0.74.35",
72
+ "@stacksjs/events": "0.74.35",
73
+ "@stacksjs/logging": "0.74.35",
74
+ "@stacksjs/model-meta": "0.74.35",
75
+ "@stacksjs/pagination": "0.74.35",
76
+ "@stacksjs/path": "0.74.35",
77
+ "@stacksjs/query-builder": "0.74.35",
78
+ "@stacksjs/realtime": "0.74.35",
79
+ "@stacksjs/router": "0.74.35",
80
+ "@stacksjs/storage": "0.74.35",
81
+ "@stacksjs/strings": "0.74.35",
82
82
  "@stacksjs/ts-validation": "^0.5.6",
83
- "@stacksjs/validation": "0.74.34",
83
+ "@stacksjs/validation": "0.74.35",
84
84
  "bun-query-builder": "^0.2.69"
85
85
  },
86
86
  "peerDependencies": {
87
- "@stacksjs/auth": "0.74.34",
88
- "@stacksjs/payments": "0.74.34",
89
- "@stacksjs/queue": "0.74.34",
90
- "@stacksjs/search-engine": "0.74.34",
87
+ "@stacksjs/auth": "0.74.35",
88
+ "@stacksjs/payments": "0.74.35",
89
+ "@stacksjs/queue": "0.74.35",
90
+ "@stacksjs/search-engine": "0.74.35",
91
91
  "stripe": "22.3.2"
92
92
  },
93
93
  "peerDependenciesMeta": {
@@ -108,7 +108,7 @@
108
108
  }
109
109
  },
110
110
  "devDependencies": {
111
- "@stacksjs/types": "0.74.34",
111
+ "@stacksjs/types": "0.74.35",
112
112
  "better-dx": "^0.2.24",
113
113
  "stripe": "22.3.2"
114
114
  }