@stacksjs/orm 0.74.43 → 0.74.46

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.d.ts CHANGED
@@ -118,6 +118,7 @@ export declare const PaymentMethod: ReturnType<typeof lazyModel<typeof import('.
118
118
  export declare const PaymentProduct: ReturnType<typeof lazyModel<typeof import('./models/PaymentProduct').default>>;
119
119
  export declare const PaymentTransaction: ReturnType<typeof lazyModel<typeof import('./models/PaymentTransaction').default>>;
120
120
  export declare const Post: ReturnType<typeof lazyModel<typeof import('./models/Content/Post').default>>;
121
+ export declare const Categorizable: ReturnType<typeof lazyModel<typeof import('./models/Content/Categorizable').default>>;
121
122
  export declare const PrintDevice: ReturnType<typeof lazyModel<typeof import('./models/commerce/PrintDevice').default>>;
122
123
  export declare const Product: ReturnType<typeof lazyModel<typeof import('./models/commerce/Product').default>>;
123
124
  export declare const ProductUnit: ReturnType<typeof lazyModel<typeof import('./models/commerce/ProductUnit').default>>;
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 $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 Qa(e,t={}){return It(e,t)}function Va(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 ui(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 ci(e){return e?.ownership===!1}function li(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 di(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function fi(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 pi(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 mi(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 yi(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 gi(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 bi(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 wi(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 hi(e,t,n,r,o,a){let{page:i,...s}=dn(e,t,n,r,o,a);return{current_page:i,...s}}function ki(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function _i(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 Pi(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 vi}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 Ei(e,t){return await Tn(async()=>await be.transaction(e,t))}async function Fi(e){return await be.savepoint(e)}function $i(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 ys(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(`
3
3
  `),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
4
4
  ${o}// columns
5
5
  ${a}
@@ -19,4 +19,4 @@ export {}
19
19
  `),m=`${Ct(l)}${f}
20
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
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};
22
+ ${vt(t)}`}import{isCursorPaginator as nu,isPaginator as ru,isSimplePaginator as ou,toCursorPaginator as au,toPaginator as iu,toSimplePaginator as su}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=()=>{},Os=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"],["Categorizable",["Content"],"cms"],["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"),Cs=y("StorageItem"),vs=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"),Ms=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("Categorizable"),ma=y("PrintDevice"),ya=y("Product"),ga=y("ProductUnit"),ba=y("ProductVariant"),wa=y("QueryLog"),ha=y("Receipt"),Ds=y("Referral"),Es=y("ReferralCode"),ka=y("Release"),_a=y("Request"),Ta=y("Review"),Ra=y("ShippingMethod"),Sa=y("ShippingRate"),Aa=y("ShippingZone"),Pa=y("SocialPost"),xa=y("SocialAccount"),Oa=y("Subscriber"),Ca=y("SubscriberEmail"),va=y("Subscription"),Ma=y("Tag"),Da=y("TaxRate"),Ea=y("Team"),Fa=y("TeamInvitation"),$a=y("TeamMember"),Ia=y("Transaction"),ja=y("WaitlistProduct"),Ba=y("WaitlistRestaurant"),Na=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,Categorizable:pa,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:ma,Product:ya,ProductUnit:ga,ProductVariant:ba,QueryLog:wa,Receipt:ha,Release:ka,Request:_a,Review:Ta,ShippingMethod:Ra,Redirect:qo,SenderDomain:io,ShippingRate:Sa,ShippingZone:Aa,Site:Lo,SiteDomain:Uo,SmsOptOut:Ko,SocialAccount:xa,SocialPost:Pa,Subscriber:Oa,SubscriberEmail:Ca,Subscription:va,Tag:Ma,TaxRate:Da,Team:Ea,TeamInvitation:Fa,TeamMember:$a,Transaction:Ia,UsageEvent:so,WaitlistProduct:ja,WaitlistRestaurant:Ba,Websocket:Na},I=globalThis;for(let[e,t]of Object.entries(Ft))if(t&&I[e]===void 0)I[e]=t;var Fs=Object.keys(Ft);async function qa(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 La(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=qa;if(I.safeGet===void 0)I.safeGet=La;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,pa as Categorizable,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,Ms as PersonalAccessToken,No as Pledge,fa as Post,ma as PrintDevice,ya as Product,ga as ProductUnit,ba as ProductVariant,wa as QueryLog,ha as Receipt,qo as Redirect,Ds as Referral,Es as ReferralCode,ka as Release,_a as Request,Ta as Review,io as SenderDomain,Ra as ShippingMethod,Sa as ShippingRate,Aa as ShippingZone,Lo as Site,Uo as SiteDomain,Ko as SmsOptOut,xa as SocialAccount,Pa as SocialPost,Cs as StorageItem,vs as StorageItemTask,_n as SubqueryBuilder,Oa as Subscriber,Ca as SubscriberEmail,va as Subscription,Ma as Tag,Da as TaxRate,Ea as Team,Fa as TeamInvitation,$a as TeamMember,Ia as Transaction,so as UsageEvent,Hr as User,ja as WaitlistProduct,Ba as WaitlistRestaurant,Na as Websocket,Pi 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,vi as db,oe as decryptValue,St as defineModel,re as encryptValue,_e as enrichPaginatorUrls,ys as extendModel,rn as filterFillable,Va as getPrunableConfig,nn as getWritableFields,nu as isCursorPaginator,j as isEncrypted,ru as isPaginator,ou as isSimplePaginator,Ue as isUniqueViolation,en as mapWriteError,Qa as massPrunable,wr as mergeModelDefinition,Fs as modelGlobalNames,Os as ormReady,bn as parentOwnership,He as parseCursor,Oe as projectDocumentsFromTrait,It as prunable,Qr as renderDatabaseTypeFile,ke as resolveCursorArgs,he as resolvePageArgs,Fi as savepoint,mn as selfOwnership,Wt as setAuditUser,yn as siteOwnership,gn as teamMembershipOwnership,fr as toAttrs,au as toCursorPaginator,iu as toPaginator,su as toSimplePaginator,tn as toSnakeCaseKeys,Ei as transaction,$i as transactional,M as withoutEvents,Kn as withoutValidation};
@@ -0,0 +1,55 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation'
3
+
4
+ // The CMS catalogue already exists in categorizables. Commerce's Category
5
+ // model owns a different table and its IDs cannot be used by this pivot.
6
+ export default defineModel({
7
+ name: 'Categorizable',
8
+ table: 'categorizables',
9
+ primaryKey: 'id',
10
+ autoIncrement: true,
11
+ ownership: false,
12
+ traits: { useTimestamps: true },
13
+ indexes: [
14
+ { name: 'categorizables_type_slug_unique', columns: ['categorizable_type', 'slug'], unique: true },
15
+ { name: 'categorizables_owner_slug_unique', columns: ['categorizable_type', 'categorizable_id', 'slug'], unique: true },
16
+ ],
17
+ attributes: {
18
+ name: {
19
+ required: true,
20
+ fillable: true,
21
+ validation: { rule: schema.string() },
22
+ },
23
+ slug: {
24
+ required: true,
25
+ fillable: true,
26
+ validation: { rule: schema.string() },
27
+ },
28
+ description: {
29
+ required: false,
30
+ nullable: true,
31
+ fillable: true,
32
+ validation: { rule: schema.string() },
33
+ },
34
+ isActive: {
35
+ required: true,
36
+ fillable: true,
37
+ default: true,
38
+ validation: { rule: schema.boolean() },
39
+ },
40
+ categorizableId: {
41
+ // Runtime trait-table setup adds this column to older catalogues.
42
+ // Zero denotes a catalogue entry with no individual owner.
43
+ type: 'integer',
44
+ required: true,
45
+ fillable: true,
46
+ default: 0,
47
+ validation: { rule: schema.number().integer().min(0) },
48
+ },
49
+ categorizableType: {
50
+ required: true,
51
+ fillable: true,
52
+ validation: { rule: schema.string() },
53
+ },
54
+ },
55
+ } as const)
@@ -44,7 +44,7 @@ export default defineModel({
44
44
  belongsTo: ['Author', 'Site'],
45
45
  belongsToMany: {
46
46
  categories: {
47
- model: 'Category',
47
+ model: 'Categorizable',
48
48
  table: 'categorizable_models',
49
49
  foreignKey: 'categorizable_id',
50
50
  relatedKey: 'category_id',
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.43",
5
+ "version": "0.74.46",
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.43",
67
- "@stacksjs/cli": "0.74.43",
68
- "@stacksjs/config": "0.74.43",
69
- "@stacksjs/database": "0.74.43",
70
- "@stacksjs/env": "0.74.43",
71
- "@stacksjs/error-handling": "0.74.43",
72
- "@stacksjs/events": "0.74.43",
73
- "@stacksjs/logging": "0.74.43",
74
- "@stacksjs/model-meta": "0.74.43",
75
- "@stacksjs/pagination": "0.74.43",
76
- "@stacksjs/path": "0.74.43",
77
- "@stacksjs/query-builder": "0.74.43",
78
- "@stacksjs/realtime": "0.74.43",
79
- "@stacksjs/router": "0.74.43",
80
- "@stacksjs/storage": "0.74.43",
81
- "@stacksjs/strings": "0.74.43",
66
+ "@stacksjs/cache": "0.74.46",
67
+ "@stacksjs/cli": "0.74.46",
68
+ "@stacksjs/config": "0.74.46",
69
+ "@stacksjs/database": "0.74.46",
70
+ "@stacksjs/env": "0.74.46",
71
+ "@stacksjs/error-handling": "0.74.46",
72
+ "@stacksjs/events": "0.74.46",
73
+ "@stacksjs/logging": "0.74.46",
74
+ "@stacksjs/model-meta": "0.74.46",
75
+ "@stacksjs/pagination": "0.74.46",
76
+ "@stacksjs/path": "0.74.46",
77
+ "@stacksjs/query-builder": "0.74.46",
78
+ "@stacksjs/realtime": "0.74.46",
79
+ "@stacksjs/router": "0.74.46",
80
+ "@stacksjs/storage": "0.74.46",
81
+ "@stacksjs/strings": "0.74.46",
82
82
  "@stacksjs/ts-validation": "^0.5.6",
83
- "@stacksjs/validation": "0.74.43",
83
+ "@stacksjs/validation": "0.74.46",
84
84
  "bun-query-builder": "^0.2.69"
85
85
  },
86
86
  "peerDependencies": {
87
- "@stacksjs/auth": "0.74.43",
88
- "@stacksjs/payments": "0.74.43",
89
- "@stacksjs/queue": "0.74.43",
90
- "@stacksjs/search-engine": "0.74.43",
87
+ "@stacksjs/auth": "0.74.46",
88
+ "@stacksjs/payments": "0.74.46",
89
+ "@stacksjs/queue": "0.74.46",
90
+ "@stacksjs/search-engine": "0.74.46",
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.43",
111
+ "@stacksjs/types": "0.74.46",
112
112
  "better-dx": "^0.2.24",
113
113
  "stripe": "22.3.2"
114
114
  }