@stacksjs/orm 0.74.4 → 0.74.5
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 +2 -2
- package/dist/index.js +9 -9
- package/package.json +23 -23
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type { AuditHelpers } from './traits/audit';
|
|
|
5
5
|
export type { SoftDeleteOptions, SoftDeleteHelpers } from './traits/soft-deletes';
|
|
6
6
|
export type * from './api-routes';
|
|
7
7
|
export type { GenerateSchemaOptions, GenerateSchemaResult } from './generate-database-schema';
|
|
8
|
-
export type { CursorPaginator, Paginator, SimplePaginator } from '
|
|
8
|
+
export type { CursorPaginator, Paginator, SimplePaginator } from '@stacksjs/pagination';
|
|
9
9
|
export type { ResolvedPageArgs } from './paginator-request';
|
|
10
10
|
// Re-export type utilities from bun-query-builder so consumers can infer
|
|
11
11
|
// model types directly from defineModel() definitions
|
|
@@ -304,7 +304,7 @@ export {
|
|
|
304
304
|
toCursorPaginator,
|
|
305
305
|
toPaginator,
|
|
306
306
|
toSimplePaginator,
|
|
307
|
-
} from '
|
|
307
|
+
} from '@stacksjs/pagination';
|
|
308
308
|
// Request-aware pagination helpers (stacksjs/stacks#1906 P2 + #1907 P3).
|
|
309
309
|
export {
|
|
310
310
|
enrichPaginatorUrls,
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var b=import.meta.require;import"@stacksjs/validation";import{log as oe}from"@stacksjs/cli";import{db as ve}from"@stacksjs/database";async function Pt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=ve.deleteFrom(e);c=o(c);let l=await c.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return oe.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await ve.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return oe.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw oe.error(`Failed to prune ${e}:`,a),a}}async function _a(e,n={}){return Pt(e,n)}function Ta(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as At,createDecipheriv as xt,createHash as Ot,randomBytes as Ct}from"crypto";import{log as G}from"@stacksjs/logging";var Me="enc:",Ee="aes-256-gcm",Dt=12,H=null;async function Fe(){if(H)return H;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 H=Ot("sha256").update(e).digest(),H}function B(e){return typeof e==="string"&&e.startsWith(Me)}async function ae(e){if(e==null)return e;if(B(e))return e;if(typeof e!=="string")return e;let n=await Fe();if(!n)return G.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ct(Dt),r=At(Ee,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${Me}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ie(e){if(e==null)return e;if(typeof e!=="string")return e;if(!B(e))return e;try{let n=await Fe();if(!n)return G.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return G.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),s=Buffer.from(r,"base64"),i=Buffer.from(o,"base64"),u=xt(Ee,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return G.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function se(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as vt}from"@stacksjs/database";import{log as U}from"@stacksjs/logging";var Mt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ie="model_audits",le=null;function Et(e){le=e}async function ce(){if(le!=null)return le;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function J(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Mt.some((o)=>o.test(t)))continue;n[t]=r}return n}function q(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Ft(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ue(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Ie).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:vt()}).executeTakeFirst()}catch(t){if(U.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function je(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(Ie).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?$e(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?$e(o.new_values):o.new_values}))}catch(t){return U.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function $e(e){try{return JSON.parse(e)}catch{return e}}function Ne(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Be(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=je(n).audits;let s=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},i=e.create;if(typeof i==="function")e.create=async function(...l){return await s(async()=>{let f=await i.apply(this,l);try{let d=q(f),m=d?.[t];if(m!=null){let p=await ce();await ue({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:J(d),user_id:p},o)}}catch(d){if(U.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await s(async()=>{let d=a.find,m=typeof d==="function"?q(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=q(p)??(typeof d==="function"?q(await d.call(a,l)):null),{old:h,next:w}=Ft(m,g);if(w&&Object.keys(w).length>0){let k=await ce();await ue({auditable_type:n,auditable_id:l,event:"updated",old_values:J(h),new_values:J(w),user_id:k},o)}}catch(g){if(U.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:g}),o)throw g}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await s(async()=>{let m=a.find,p=typeof m==="function"?q(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let h=await ce();await ue({auditable_type:n,auditable_id:d,event:"deleted",old_values:J(p),new_values:null,user_id:h},o)}}catch(h){if(U.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return g})}};c("delete"),c("softDelete")}import{db as $t,sql as It,sqlDateTime as de}from"@stacksjs/database";function O(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var L="commentable_upvotes",K="commentables";function jt(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function fe(e){let n=$t;return{async comments(t){return O(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(It`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(O(t,"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 n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:de(),updated_at:de()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){O(t,"upvoteComment"),O(r,"upvoteComment");let o=()=>n.selectFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",K).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(L).values({upvoteable_id:t,upvoteable_type:K,user_id:r,created_at:de()}).execute()}catch(s){if(!jt(s))throw s}return await o()},async removeCommentUpvote(t,r){O(t,"removeCommentUpvote"),O(r,"removeCommentUpvote"),await n.deleteFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",K).where("user_id","=",r).execute()},async commentUpvoteCount(t){O(t,"commentUpvoteCount");let r=await n.selectFrom(L).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",K).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return O(t,"hasUpvotedComment"),O(r,"hasUpvotedComment"),!!await n.selectFrom(L).where("upvoteable_id","=",t).where("upvoteable_type","=",K).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Nt,sql as Bt,sqlDateTime as qe}from"@stacksjs/database";function pe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function me(e){let n=Nt;return{async tags(t){return pe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){pe(t,"tagCount");let r=await n.selectFrom("taggables").select(Bt`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(pe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:qe(),updated_at:qe()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as qt,sqlDateTime as Y}from"@stacksjs/database";function ye(e){let n=qt;async function t(r){return(await n.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 t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),s=await a();if(!s)await n.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:Y(),updated_at:Y()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:Y(),updated_at:Y()}).execute(),s},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Ut,sqlDateTime as Lt}from"@stacksjs/database";function ge(e,n){let t=Ut,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let s=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(s?.count)||0},async like(a,s){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof s!=="number"||!Number.isFinite(s)||s<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(s)})`);let i=Lt();try{return await t.insertInto(r).values({[o]:a,user_id:s,created_at:i,updated_at:i}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,s){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",s).execute()},async isLiked(a,s){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((i)=>Number(i[o])).filter(Boolean)}}}function Ke(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function Kt(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Ke(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function T(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Qt(e){let n={};for(let[t,r]of Object.entries(e))n[T(t)]=r;return n}function Na(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Qe(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function We(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Ba(e){return e?.ownership===!1}function qa(e,n,t){let r=Object.keys(e).find((a)=>T(a)===T(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(T(a)===T(n))delete o[a];return o[n]=t,{data:o}}function Wt(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=T(t.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`;n.push(o)}return[...new Set(n)]}function Vt(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=T(r);if(o!==r&&o in e)t[r]=e[o]}return t}function zt(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),s=new Date(Date.UTC(r,o-1,a));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==a)return n;return s}function Ua(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}function La(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}var Ht=["id","uuid","created_at","updated_at","deleted_at"];function Ka(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Ht]){let o=T(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(T(r));return t}function Qa(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let s=a.startsWith("-"),i=s?a.slice(1):a;if(!/^\w+$/.test(i))continue;let u=t.get(i);if(!u)continue;o=o.orderBy(u,s?"desc":"asc")}return o}var Gt={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"?Jt(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"?Yt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function Jt(e){try{return JSON.parse(e)}catch{return e}}function Yt(e){try{return JSON.parse(e)}catch{return[]}}function Wa(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let s=typeof a==="string"?Gt[a]:a;if(!s||typeof s[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=s[t](r[o]);let i=T(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function Ve(e,n,t){let r=n?.attributes??{},o={};for(let[a,s]of Object.entries(r)){let i=s?.validation?.rule;if(!i||typeof i.validate!=="function")continue;let u=Object.prototype.hasOwnProperty.call(e,a);if(!u&&t==="updating")continue;let c=s!==null&&typeof s==="object"&&Object.prototype.hasOwnProperty.call(s,"default"),l=u?e[a]:c?s.default:void 0,f=zt(i,l),d=i.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>s?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function Va(e,n,t){let r=Ue(t);return e.find((o)=>o.method===n&&Ue(String(o.path??""))===r)}function Ue(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function be(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function za(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?be(o.read):["auth"],write:"write"in o?be(o.write):["auth"],declared:!0}}let r=be(t);return{read:r,write:r,declared:!0}}var Le=15,Xt=100;function Ha(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(Le),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Le,Xt);return{page:t,perPage:o,offset:(t-1)*o}}function X(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Zt(e,n,t,r,o,a){let s=(n-1)*t,i=r===0,u={page:n,per_page:t,from:i?null:s+1,to:i?null:s+r,has_more_pages:o,prev_page_url:n>1?X(e,n-1):null,next_page_url:o?X(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=X(e,1),u.last_page_url=X(e,c)}return u}function Ga(e,n,t,r,o,a){let{page:s,...i}=Zt(e,n,t,r,o,a);return{current_page:s,...i}}function Ja(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ya(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. 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 `+`${t}. 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 en(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Qe(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(we(o))}};let t=We(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function we(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let s=a.indexOf("=");if(s===-1)continue;if(a.slice(0,s).trim()===o)return decodeURIComponent(a.slice(s+1).trim())}return null}}}}function tn(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function nn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function rn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(we(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((i)=>i.id).filter((i)=>i!=null)}catch{return[]}}}}function on(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(we(t))}catch{return null}}}}function an(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,s=en(a);if(!s?.field||typeof s.resolve!=="function")return[];let i=await s.resolve(t,r);if(i==null||Array.isArray(i)&&i.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(i)?await u.whereIn(s.field,i).get():await u.where(s.field,i).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{cacheRequestQuery as sn}from"@stacksjs/router";var Z=new WeakMap;function ni(e,n){return sn(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=Z.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},Z.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=Z.get(e);if(!a)return;Z.delete(e);let s=Array.from(new Set(a.keys));try{let i=typeof e.findMany==="function"?await e.findMany(s):await Promise.all(s.map((c)=>e.find?.(c))),u=new Map;for(let c of i??[]){let l=c?.id;if(l!==void 0)u.set(l,c)}for(let c of a.resolvers)c.resolve(u.get(c.key))}catch(i){for(let u of a.resolvers)u.reject(i)}})}))}import{db as ii}from"@stacksjs/database";class cn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,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,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as he,runInTransactionScope as un}from"@stacksjs/database";async function ui(e,n){return await un(async()=>await he.transaction(e,n))}async function li(e){return await he.savepoint(e)}function di(e,n){return he.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as gn,registerModel as bn}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as C}from"@stacksjs/strings";import{AsyncLocalStorage as it}from"async_hooks";function _e(e,n){let t=Re(),r=t?ke(t,"per_page"):void 0,o=t?ke(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),s=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:s}}function Te(e,n){let t=Re(),r=t?He(t,"cursor"):void 0,o=t?ke(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=ze(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function ze(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function Se(e){let n=Re();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?M(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?M(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?M(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?M(t,{page:o+1}):null,e.first_page_url=M(t,{page:1}),e.last_page_url=M(t,{page:a})}else e.next_page_url=e.has_more_pages?M(t,{page:o+1}):null;return e}function M(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var I;function Re(){if(I===null)return;if(I===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")I=n.getCurrentRequest;else{I=null;return}}catch{I=null;return}return I()}function ke(e,n){let t=He(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function He(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as ln}from"module";import{db as dn}from"@stacksjs/database";var fn=ln(import.meta.url);function Ge(e){let n=dn;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.create(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.update(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:s}=await import("@stacksjs/payments"),i={};if(o.enableTax)i.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)i.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await s.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...i,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let s=await Q();try{return await s.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,s=a[o],i=await Q();if(!s){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await i.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:u("connect.account.create",c,a.id)});return s=l.id,await n.updateTable(c).set({[o]:s}).where("id","=",Number(a.id)).execute(),l}return await i.accounts.retrieve(s)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",s=(t._attributes??t)[o];if(!s)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await Q()).accountLinks.create({account:s,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:s}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",s=r.payoutsColumn||"payouts_enabled",i=t._attributes??t,u=i[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await Q()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[s]:d}).where("id","=",Number(i.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await Q(),a=r.accountColumn||"stripe_account_id",s=t._attributes??t,i=r.connectAccountId||s[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(i){if(u.transfer_data={destination:i},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",s.id,r.amountCents)})}}}function Q(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=fn("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 n(e,{apiVersion:"2026-06-24.dahlia"})}function Je(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),s=`2fa:${a}`;if(await o.isRateLimited(s)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(s),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(s),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(s),!0}}}import{sqlDateTime as pn}from"@stacksjs/database";import{log as j}from"@stacksjs/logging";var ee="deleted_at";function Ye(e,n="id"){return{async softDelete(t){let r=pn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ee]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[ee]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(ee);return t?.where?.(ee,"!=",null)??t}}}function Xe(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function mn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Pe(l,n,!0)),a=r.some((l)=>Pe(l,n,!1));if(!o&&!a)return j.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Pe(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return j.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Pe(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function yn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){j.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let s=t.softDelete;if(typeof s==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await s.call(t,d)}return}let i=a.call(t,r,n);if(typeof i?.delete==="function"){j.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await i.delete();return}}else{let s=t.restore;if(typeof s!=="function"){j.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let i=t.withTrashed,c=(typeof i==="function"?i.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await s.call(t,m)}}}catch(a){if(j.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function W(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let s of o){let i=mn(e,s);if(!i)continue;await yn(i.className,t,i.model,a,r)}}var st=new it;function F(){return st.getStore()?.suppressed===!0}function E(e){return Promise.resolve(st.run({suppressed:!0},e))}var ct=new it;function wn(){return ct.getStore()?.suppressed===!0}function hn(e){return Promise.resolve(ct.run({suppressed:!0},e))}var De=Symbol.for("stacks.orm.modelDefinition");class ut extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var Ze=new Set;function kn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Ze.has(r))return;Ze.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var _n={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(n){return kn(e,n),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 lt(e){return typeof e==="string"?_n[e]:e}function et(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let s=lt(a);r[o]=s[t](r[o])}return r}var te=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),tt=Symbol.for("stacks.modelInstanceProxy"),Tn={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 Sn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let s=a._attributes;if(o in s){r=s[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[tt])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=lt(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===tt)return!0;if(a==="saveAsync")return async function(){let c=i._definition,l=c?.set;if(l&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes),g=p&&typeof p.then==="function"?await p:p;i._attributes[d]=g}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="save")return function(){let c=i._definition,l=c?.set;if(l&&Object.keys(l).length>0&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);i._attributes[d]=p}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="updateAsync")return async function(c){if(c&&typeof c==="object"&&!Array.isArray(c))for(let[l,f]of Object.entries(c))s[l]=f;return s.saveAsync()};if(a==="saveQuietly")return function(){return E(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return E(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return E(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return E(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return E(()=>i.delete())};if(a==="toSearchableObject")return function(){let f=i._definition?.traits?.useSearch;if(!f)return null;let d=i._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},h=i._relations;for(let w of p){let k=C(w),S=d[k]??d[w];if(S!==void 0){m[k]=S;continue}let x=g[w]??g[k];if(x){m[k]=Sn(h,x);continue}m[k]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!te.has(a)){let c=i._attributes;if(c&&Object.prototype.hasOwnProperty.call(c,a))return c[a];let l=i._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let d=l[a];if(Array.isArray(d))return d.map((m)=>R(m,n));return d&&typeof d==="object"?R(d,n):d}let f=Tn[a];if(f){let p=i._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...g)=>p(s,...g):(...g)=>p(i.id,...g)}if(c){let d=C(a);if(d!==a&&Object.prototype.hasOwnProperty.call(c,d))return c[d]}}let u=Reflect.get(i,a,i);return typeof u==="function"?u.bind(i):u},set(o,a,s,i){let u=o;if(typeof a==="string"&&!te.has(a)){let{_attributes:c,set:l}=u;if(c&&Object.prototype.hasOwnProperty.call(c,a)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}if(c){let f=C(a);if(f!==a&&Object.prototype.hasOwnProperty.call(c,f)){if(typeof l==="function")l.call(u,f,s);else c[f]=s;return!0}}if(c&&!(a in u)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}}return Reflect.set(u,a,s,i)},has(o,a){let s=o;if(typeof a==="string"&&!te.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!0;let u=s._relations;if(u&&Object.prototype.hasOwnProperty.call(u,a))return!0;if(i){let c=C(a);if(c!==a&&Object.prototype.hasOwnProperty.call(i,c))return!0}}return Reflect.has(s,a)},deleteProperty(o,a){let s=o;if(typeof a==="string"&&!te.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return delete i[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(o){let s=o._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(o,a){let s=o;if(typeof a==="string"){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return{configurable:!0,enumerable:!0,value:i[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}})}var Rn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Pn={paginate:P.toPaginator,simplePaginate:P.toSimplePaginator,cursorPaginate:P.toCursorPaginator},nt=Symbol.for("stacks.queryBuilderProxy");function dt(e,n){if(!e||typeof e!=="object")return e;if(e[nt])return e;return new Proxy(e,{get(t,r,o){if(r===nt)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...s){let i=s,u=String(r);if(u==="paginate"||u==="simplePaginate"){let{perPage:f,page:d}=_e(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=Te(s[0],s[1]);i=[f,d,s[2],s[3]]}let c=a.apply(t,i),l=(f)=>{if(Rn.has(u)){if(Array.isArray(f))return f.map((m)=>R(m,n));let d=Pn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>R(g,n)),p=d({...f,data:m});return Se(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>R(m,n))};return R(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return dt(f,n);return f};if(c&&typeof c.then==="function")return c.then(l);return l(c)}}})}function An(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}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 s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i);return dt(u,n)}}}class ft extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class xe extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' 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=n,this.reason=t}}var xn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function V(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,s=new Set;for(let[u,c]of Object.entries(r)){let l=C(u);if(o.add(l),c?.fillable===!0)a.add(l);if(c?.guarded===!0)s.add(l)}let i=a.size>0?a:o;for(let u of Object.keys(n)){let c=C(u);if(xn.has(c))continue;if(s.has(c))throw new xe(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new xe(e.name,u,"not-fillable")}return n}async function Oe(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(s){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,s)}}return r}function On(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function s(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,c):null}V(n,l);let f=await Oe(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await Oe(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(typeof e.delete!=="function")e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new ft(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return V(n,m),await s("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){V(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...d,...l}}let m={...c,...l};return V(n,m),await s("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let i=[["latest","desc"],["oldest","asc"]];for(let[c,l]of i)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,k)=>{let S=w?.[f],x=k?.[f];if(S===x)return 0;return(S>x?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=yt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??C(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Mn(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,g=e.query;if(typeof g==="function")try{let k=g.call(e);if(k&&typeof k.chunk==="function")return await k.chunk(l,async(S)=>{let x=await Ce(S,u);if(x.length>0)await m.addDocuments(c,x);p+=x.length}),p}catch{}let h=await f.call(e)||[],w=await Ce(h,u);if(w.length>0)await m.addDocuments(c,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let g of m){let h=g?.id??g?._attributes?.id;if(h!=null)await p.deleteDocument(c,Number(h))}}}}async function Ce(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.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)=>vn(r,n)))).filter(Boolean)}function Cn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Dn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function vn(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Dn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Mn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},s={q:t,...a,...r??{}},i={with(u){return s={...s,...u},i},where(u){return s={...s,filter:u},i},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,s))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...s,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,s)}};return i}function pt(e){let n=C(e);return n===e?[e]:[e,n]}async function Ae(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of pt(r)){if(!(o in t))continue;let a=t[o];if(!B(a))continue;t[o]=await ie(a)}}function En(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Ae(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Ae(u,n);return i}if(i)await Ae(i,n);return i},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let i of o){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let i of["update","forceUpdate"]){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],s=(i)=>{if(!i||typeof i!=="object")return i;let u=i;if(u.__stacksEncryptedReads)return i;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return s(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),i};for(let i of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[i];if(typeof u!=="function")continue;e[i]=function(...c){return s(u.apply(this,c))}}}function Fn(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let s of n)for(let i of pt(s))if(i in a)a[i]=await ae(a[i]);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(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await a.apply(this,s)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(s,i){let u=await t(i);return await a.call(this,s,u)}}}function $n(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){V(n,r);let a=await Oe(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function In(e,n){let t=String(n?.name??e.name??"Model"),r=(s,i)=>{if(wn())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let u=Ve(s,n,i);if(!u.valid)throw new ut(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...i){return r(s,"creating"),await o.call(this,s,...i)};let a=e.update;if(typeof a==="function")e.update=async function(s,i,...u){return r(i,"updating"),await a.call(this,s,i,...u)}}function jn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...s){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=et(s[0],n,"set");return await a.apply(this,s)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?et(a,n,"set"):a;return await r.call(this,o,s)}}function mt(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=Nn(e),t=qn(e),r=Bn(n,t),o=Un(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,i=gn(a);if(An(i,e.casts),On(i,a),$n(i,a),e.casts&&Object.keys(e.casts).length>0)jn(i,e.casts);let u=se(e);if(u.length>0)Fn(i,u),En(i,u);let c=e.traits?.useSoftDeletes;if(c)Ln(i,a,c);let l=e.traits?.useAudit;if(l){let m=Ne(l);Be(i,e.name,e.primaryKey||"id",m)}In(i,a);let f=i;f.withoutValidation=function(m){return hn(m)},f.withoutEvents=function(m){return E(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=i[m];if(typeof p!=="function")continue;let g=`${m}Quietly`;if(typeof i[g]==="function")continue;i[g]=function(...h){return E(()=>p.apply(i,h))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return bn(e.name,d),Object.defineProperty(d,De,{value:e,enumerable:!1,configurable:!0}),d}function Nn(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&d[p]!==void 0)g[p]=d[p];return g},o=async(d,m)=>{if(F())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,s=e.traits?.broadcastWith,i=typeof a==="function"&&typeof s==="function",u=async(d,m)=>{if(!i)return;if(F())return;try{let p=a(m),g=Array.isArray(p)?p:[p],h=s(m),k=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof k!=="function")return;for(let S of g){if(typeof S!=="string"||S.length===0)continue;await k(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(F())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function Bn(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let s of o)await s(...a)}}return Object.keys(n).length?n:void 0}function yt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Cn(n);return t}function qn(e){let n=yt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??C(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await Ce([i],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=R(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(F())return;let u=await o(i);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await ot(r,u,e.name)}return}await ot(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(F())return;let u=i?.id??i?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await at(r,Number(u),e.name)}return}await at(r,Number(u),e.name)}}}var rt=new Map;function gt(e,n){let t=rt.get(e)??0;if(rt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function ot(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){gt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function at(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){gt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Un(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=me(t);if(r.categorizable)n._categorizable=ye(t);if(r.commentable)n._commentable=fe(t);if(r.billable)n._billable=Ge(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ge(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=Je();return n}function Ln(e,n,t){let r=Ye(e,n.primaryKey||"id"),o=Xe(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||F())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||F())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${s}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${s}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await W(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await W(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await W(a,o,m,"restore");await c(m)}return w}let{db:g}=await import("@stacksjs/database"),h=await g.transaction(async()=>{let w=await r.restore(m);if(w)await W(a,o,m,"restore");return w});if(h)await c(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Kn(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Kn(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var Qn=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],Wn=["traits","dashboard"];function Vn(e){let n=e?.[De];if(n&&typeof n==="object")return n;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 zn(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Hn(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function Gn(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Hn(r),s=Object.fromEntries(Object.entries(o).map(([i,u])=>{let c=!(i in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[i,{...u,order:++a}];return[i,u]}));t.attributes={...r,...s}}for(let a of Qn){let s=zn(e[a],n[a]);if(s)t[a]=s}for(let a of Wn){let s=e[a],i=n[a];if(s&&i&&typeof s==="object"&&typeof i==="object")t[a]={...s,...i}}return t}function Bi(e,n){return mt(Gn(Vn(e),n))}import rr from"process";import{log as or}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as z}from"@stacksjs/storage";import{Database as Jn}from"bun:sqlite";import{existsSync as Yn,readdirSync as Xn,readFileSync as Zn}from"fs";function er(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function tr(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function nr(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function bt(e,n="sqlite"){let t=[];if(!Yn(e))return{tables:[],errors:t};let r;try{r=Xn(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Jn(":memory:");try{for(let i of r){let u=`${e}/${i}`,c;try{c=Zn(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=nr(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((i)=>i.name).filter((i)=>!er(i)),s=[];for(let i of a){let u=o.query(`PRAGMA table_info("${i.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=tr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}s.push({table:i,columns:c})}return{tables:s,errors:t}}finally{o.close()}}function ar(e){if(e)return e;let n=String(rr.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function ne(e){return e==="postgres"?"boolean":"number"}function D(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function ir(e,n){let t=e.default;if(typeof t==="boolean")return ne(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function sr(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function cr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(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 t.length>0?t.join(" | "):null}function ur(e,n){let t=sr(e),r=cr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.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 ne(n);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 ir(e,n)}})();return e.nullable===!0?`${a} | null`:a}function lr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${D(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${D(a.model)}_id`]="number"}}return n}function dr(e,n){let[t,r]=[D(e),D(n)].sort();return`${t}_${r}`}function fr(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?ne(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function pr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let s of a){let i,u,c,l,f={},d=!0;if(typeof s==="string")i=s;else if(s&&typeof s==="object"&&"model"in s){let w=s;if(i=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)u=w.pivotTable,c=w.firstForeignKey,l=w.secondForeignKey;else{let k=s;u=k.table,c=k.foreignKey,l=k.relatedKey,f=k.pivot?.columns??{},d=Boolean(k.pivot?.timestamps)}}else continue;let m=u??dr(e,i),p=c??`${D(e)}_id`,g=l??`${D(i)}_id`,h={id:"number",[p]:"number",[g]:"number"};for(let[w,k]of Object.entries(f))h[w]=fr(k,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function mr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ne(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function yr(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,mr(n));return t}function gr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[D(o)]=ur(a,n);return t}function wt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
2
|
+
var b=import.meta.require;import"@stacksjs/validation";import{log as re}from"@stacksjs/cli";import{db as De}from"@stacksjs/database";async function Rt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=De.deleteFrom(e);c=o(c);let l=await c.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return re.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await De.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return re.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw re.error(`Failed to prune ${e}:`,a),a}}async function Sa(e,n={}){return Rt(e,n)}function Ra(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Pt,createDecipheriv as At,createHash as xt,randomBytes as Ot}from"crypto";import{log as H}from"@stacksjs/logging";var ve="enc:",Me="aes-256-gcm",Ct=12,z=null;async function Ee(){if(z)return z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return z=xt("sha256").update(e).digest(),z}function N(e){return typeof e==="string"&&e.startsWith(ve)}async function oe(e){if(e==null)return e;if(N(e))return e;if(typeof e!=="string")return e;let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ot(Ct),r=Pt(Me,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${ve}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ae(e){if(e==null)return e;if(typeof e!=="string")return e;if(!N(e))return e;try{let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return H.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),s=Buffer.from(r,"base64"),i=Buffer.from(o,"base64"),u=At(Me,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return H.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ie(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as Dt}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var vt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],$e="model_audits",ue=null;function Mt(e){ue=e}async function se(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function G(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(vt.some((o)=>o.test(t)))continue;n[t]=r}return n}function B(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Et(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ce(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.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:Dt()}).executeTakeFirst()}catch(t){if(q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Ie(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom($e).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).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(t){return q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}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 Ne(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ie(n).audits;let s=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},i=e.create;if(typeof i==="function")e.create=async function(...l){return await s(async()=>{let f=await i.apply(this,l);try{let d=B(f),m=d?.[t];if(m!=null){let p=await se();await ce({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:G(d),user_id:p},o)}}catch(d){if(q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await s(async()=>{let d=a.find,m=typeof d==="function"?B(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=B(p)??(typeof d==="function"?B(await d.call(a,l)):null),{old:h,next:w}=Et(m,g);if(w&&Object.keys(w).length>0){let k=await se();await ce({auditable_type:n,auditable_id:l,event:"updated",old_values:G(h),new_values:G(w),user_id:k},o)}}catch(g){if(q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:g}),o)throw g}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await s(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let h=await se();await ce({auditable_type:n,auditable_id:d,event:"deleted",old_values:G(p),new_values:null,user_id:h},o)}}catch(h){if(q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return g})}};c("delete"),c("softDelete")}import{db as Ft,sql as $t,sqlDateTime as le}from"@stacksjs/database";function x(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var U="commentable_upvotes",L="commentables";function It(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function de(e){let n=Ft;return{async comments(t){return x(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select($t`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(x(t,"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 n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:le(),updated_at:le()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){x(t,"upvoteComment"),x(r,"upvoteComment");let o=()=>n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(U).values({upvoteable_id:t,upvoteable_type:L,user_id:r,created_at:le()}).execute()}catch(s){if(!It(s))throw s}return await o()},async removeCommentUpvote(t,r){x(t,"removeCommentUpvote"),x(r,"removeCommentUpvote"),await n.deleteFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(t){x(t,"commentUpvoteCount");let r=await n.selectFrom(U).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return x(t,"hasUpvotedComment"),x(r,"hasUpvotedComment"),!!await n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as jt,sql as Nt,sqlDateTime as Be}from"@stacksjs/database";function fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function pe(e){let n=jt;return{async tags(t){return fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){fe(t,"tagCount");let r=await n.selectFrom("taggables").select(Nt`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Be(),updated_at:Be()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Bt,sqlDateTime as J}from"@stacksjs/database";function me(e){let n=Bt;async function t(r){return(await n.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 t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),s=await a();if(!s)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:J(),updated_at:J()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:J(),updated_at:J()}).execute(),s},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as qt,sqlDateTime as Ut}from"@stacksjs/database";function ye(e,n){let t=qt,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let s=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(s?.count)||0},async like(a,s){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof s!=="number"||!Number.isFinite(s)||s<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(s)})`);let i=Ut();try{return await t.insertInto(r).values({[o]:a,user_id:s,created_at:i,updated_at:i}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,s){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",s).execute()},async isLiked(a,s){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((i)=>Number(i[o])).filter(Boolean)}}}function Le(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function Lt(e,n,t){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(Le(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function T(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Kt(e){let n={};for(let[t,r]of Object.entries(e))n[T(t)]=r;return n}function qa(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Ke(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Qe(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Ua(e){return e?.ownership===!1}function La(e,n,t){let r=Object.keys(e).find((a)=>T(a)===T(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(T(a)===T(n))delete o[a];return o[n]=t,{data:o}}function Qt(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=T(t.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`;n.push(o)}return[...new Set(n)]}function Wt(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=T(r);if(o!==r&&o in e)t[r]=e[o]}return t}function Vt(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),s=new Date(Date.UTC(r,o-1,a));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==a)return n;return s}function Ka(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}function Qa(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}var zt=["id","uuid","created_at","updated_at","deleted_at"];function Wa(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...zt]){let o=T(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(T(r));return t}function Va(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let s=a.startsWith("-"),i=s?a.slice(1):a;if(!/^\w+$/.test(i))continue;let u=t.get(i);if(!u)continue;o=o.orderBy(u,s?"desc":"asc")}return o}var Ht={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"?Gt(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"?Jt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function Gt(e){try{return JSON.parse(e)}catch{return e}}function Jt(e){try{return JSON.parse(e)}catch{return[]}}function za(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let s=typeof a==="string"?Ht[a]:a;if(!s||typeof s[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=s[t](r[o]);let i=T(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function We(e,n,t){let r=n?.attributes??{},o={};for(let[a,s]of Object.entries(r)){let i=s?.validation?.rule;if(!i||typeof i.validate!=="function")continue;let u=Object.prototype.hasOwnProperty.call(e,a);if(!u&&t==="updating")continue;let c=s!==null&&typeof s==="object"&&Object.prototype.hasOwnProperty.call(s,"default"),l=u?e[a]:c?s.default:void 0,f=Vt(i,l),d=i.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>s?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function Ha(e,n,t){let r=qe(t);return e.find((o)=>o.method===n&&qe(String(o.path??""))===r)}function qe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ge(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Ga(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?ge(o.read):["auth"],write:"write"in o?ge(o.write):["auth"],declared:!0}}let r=ge(t);return{read:r,write:r,declared:!0}}var Ue=15,Yt=100;function Ja(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,Yt);return{page:t,perPage:o,offset:(t-1)*o}}function Y(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Xt(e,n,t,r,o,a){let s=(n-1)*t,i=r===0,u={page:n,per_page:t,from:i?null:s+1,to:i?null:s+r,has_more_pages:o,prev_page_url:n>1?Y(e,n-1):null,next_page_url:o?Y(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=Y(e,1),u.last_page_url=Y(e,c)}return u}function Ya(e,n,t,r,o,a){let{page:s,...i}=Xt(e,n,t,r,o,a);return{current_page:s,...i}}function Xa(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Za(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. 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 `+`${t}. 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 Zt(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Ke(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(be(o))}};let t=Qe(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function be(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let s=a.indexOf("=");if(s===-1)continue;if(a.slice(0,s).trim()===o)return decodeURIComponent(a.slice(s+1).trim())}return null}}}}function en(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function tn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function nn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(be(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((i)=>i.id).filter((i)=>i!=null)}catch{return[]}}}}function rn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(t))}catch{return null}}}}function on(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,s=Zt(a);if(!s?.field||typeof s.resolve!=="function")return[];let i=await s.resolve(t,r);if(i==null||Array.isArray(i)&&i.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(i)?await u.whereIn(s.field,i).get():await u.where(s.field,i).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{cacheRequestQuery as an}from"@stacksjs/router";var X=new WeakMap;function oi(e,n){return an(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=X.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},X.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=X.get(e);if(!a)return;X.delete(e);let s=Array.from(new Set(a.keys));try{let i=typeof e.findMany==="function"?await e.findMany(s):await Promise.all(s.map((c)=>e.find?.(c))),u=new Map;for(let c of i??[]){let l=c?.id;if(l!==void 0)u.set(l,c)}for(let c of a.resolvers)c.resolve(u.get(c.key))}catch(i){for(let u of a.resolvers)u.reject(i)}})}))}import{db as ci}from"@stacksjs/database";class sn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,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,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as we,runInTransactionScope as cn}from"@stacksjs/database";async function di(e,n){return await cn(async()=>await we.transaction(e,n))}async function fi(e){return await we.savepoint(e)}function pi(e,n){return we.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as yn,registerModel as gn}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as O}from"@stacksjs/strings";import{AsyncLocalStorage as at}from"async_hooks";import{toCursorPaginator as bn,toPaginator as wn,toSimplePaginator as hn}from"@stacksjs/pagination";function ke(e,n){let t=Se(),r=t?he(t,"per_page"):void 0,o=t?he(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),s=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:s}}function _e(e,n){let t=Se(),r=t?ze(t,"cursor"):void 0,o=t?he(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=Ve(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function Ve(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function Te(e){let n=Se();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(t,{page:o+1}):null,e.first_page_url=v(t,{page:1}),e.last_page_url=v(t,{page:a})}else e.next_page_url=e.has_more_pages?v(t,{page:o+1}):null;return e}function v(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var F;function Se(){if(F===null)return;if(F===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")F=n.getCurrentRequest;else{F=null;return}}catch{F=null;return}return F()}function he(e,n){let t=ze(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function ze(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as un}from"module";import{db as ln}from"@stacksjs/database";var dn=un(import.meta.url);function He(e){let n=ln;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.create(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.update(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:s}=await import("@stacksjs/payments"),i={};if(o.enableTax)i.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)i.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await s.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...i,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let s=await K();try{return await s.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,s=a[o],i=await K();if(!s){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await i.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:u("connect.account.create",c,a.id)});return s=l.id,await n.updateTable(c).set({[o]:s}).where("id","=",Number(a.id)).execute(),l}return await i.accounts.retrieve(s)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",s=(t._attributes??t)[o];if(!s)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await K()).accountLinks.create({account:s,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:s}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",s=r.payoutsColumn||"payouts_enabled",i=t._attributes??t,u=i[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await K()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[s]:d}).where("id","=",Number(i.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await K(),a=r.accountColumn||"stripe_account_id",s=t._attributes??t,i=r.connectAccountId||s[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(i){if(u.transfer_data={destination:i},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",s.id,r.amountCents)})}}}function K(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=dn("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 n(e,{apiVersion:"2026-06-24.dahlia"})}function Ge(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),s=`2fa:${a}`;if(await o.isRateLimited(s)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(s),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(s),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(s),!0}}}import{sqlDateTime as fn}from"@stacksjs/database";import{log as I}from"@stacksjs/logging";var Z="deleted_at";function Je(e,n="id"){return{async softDelete(t){let r=fn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[Z]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[Z]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(Z);return t?.where?.(Z,"!=",null)??t}}}function Ye(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function pn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Re(l,n,!0)),a=r.some((l)=>Re(l,n,!1));if(!o&&!a)return I.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Re(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return I.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Re(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function mn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){I.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let s=t.softDelete;if(typeof s==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await s.call(t,d)}return}let i=a.call(t,r,n);if(typeof i?.delete==="function"){I.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await i.delete();return}}else{let s=t.restore;if(typeof s!=="function"){I.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let i=t.withTrashed,c=(typeof i==="function"?i.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await s.call(t,m)}}}catch(a){if(I.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Q(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let s of o){let i=pn(e,s);if(!i)continue;await mn(i.className,t,i.model,a,r)}}var it=new at;function E(){return it.getStore()?.suppressed===!0}function M(e){return Promise.resolve(it.run({suppressed:!0},e))}var st=new at;function kn(){return st.getStore()?.suppressed===!0}function _n(e){return Promise.resolve(st.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ct extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var Xe=new Set;function Tn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Xe.has(r))return;Xe.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}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)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Tn(e,n),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 ut(e){return typeof e==="string"?Sn[e]:e}function Ze(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let s=ut(a);r[o]=s[t](r[o])}return r}var ee=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),et=Symbol.for("stacks.modelInstanceProxy"),Rn={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 Pn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let s=a._attributes;if(o in s){r=s[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[et])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=ut(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===et)return!0;if(a==="saveAsync")return async function(){let c=i._definition,l=c?.set;if(l&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes),g=p&&typeof p.then==="function"?await p:p;i._attributes[d]=g}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="save")return function(){let c=i._definition,l=c?.set;if(l&&Object.keys(l).length>0&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);i._attributes[d]=p}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="updateAsync")return async function(c){if(c&&typeof c==="object"&&!Array.isArray(c))for(let[l,f]of Object.entries(c))s[l]=f;return s.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return M(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return M(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return M(()=>i.delete())};if(a==="toSearchableObject")return function(){let f=i._definition?.traits?.useSearch;if(!f)return null;let d=i._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},h=i._relations;for(let w of p){let k=O(w),S=d[k]??d[w];if(S!==void 0){m[k]=S;continue}let A=g[w]??g[k];if(A){m[k]=Pn(h,A);continue}m[k]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!ee.has(a)){let c=i._attributes;if(c&&Object.prototype.hasOwnProperty.call(c,a))return c[a];let l=i._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let d=l[a];if(Array.isArray(d))return d.map((m)=>R(m,n));return d&&typeof d==="object"?R(d,n):d}let f=Rn[a];if(f){let p=i._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...g)=>p(s,...g):(...g)=>p(i.id,...g)}if(c){let d=O(a);if(d!==a&&Object.prototype.hasOwnProperty.call(c,d))return c[d]}}let u=Reflect.get(i,a,i);return typeof u==="function"?u.bind(i):u},set(o,a,s,i){let u=o;if(typeof a==="string"&&!ee.has(a)){let{_attributes:c,set:l}=u;if(c&&Object.prototype.hasOwnProperty.call(c,a)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}if(c){let f=O(a);if(f!==a&&Object.prototype.hasOwnProperty.call(c,f)){if(typeof l==="function")l.call(u,f,s);else c[f]=s;return!0}}if(c&&!(a in u)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}}return Reflect.set(u,a,s,i)},has(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!0;let u=s._relations;if(u&&Object.prototype.hasOwnProperty.call(u,a))return!0;if(i){let c=O(a);if(c!==a&&Object.prototype.hasOwnProperty.call(i,c))return!0}}return Reflect.has(s,a)},deleteProperty(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return delete i[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(o){let s=o._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(o,a){let s=o;if(typeof a==="string"){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return{configurable:!0,enumerable:!0,value:i[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}})}var An=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),xn={paginate:wn,simplePaginate:hn,cursorPaginate:bn},tt=Symbol.for("stacks.queryBuilderProxy");function lt(e,n){if(!e||typeof e!=="object")return e;if(e[tt])return e;return new Proxy(e,{get(t,r,o){if(r===tt)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...s){let i=s,u=String(r);if(u==="paginate"||u==="simplePaginate"){let{perPage:f,page:d}=ke(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=_e(s[0],s[1]);i=[f,d,s[2],s[3]]}let c=a.apply(t,i),l=(f)=>{if(An.has(u)){if(Array.isArray(f))return f.map((m)=>R(m,n));let d=xn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>R(g,n)),p=d({...f,data:m});return Te(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>R(m,n))};return R(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return lt(f,n);return f};if(c&&typeof c.then==="function")return c.then(l);return l(c)}}})}function On(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}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 s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i);return lt(u,n)}}}class dt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Ae extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' 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=n,this.reason=t}}var Cn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,s=new Set;for(let[u,c]of Object.entries(r)){let l=O(u);if(o.add(l),c?.fillable===!0)a.add(l);if(c?.guarded===!0)s.add(l)}let i=a.size>0?a:o;for(let u of Object.keys(n)){let c=O(u);if(Cn.has(c))continue;if(s.has(c))throw new Ae(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new Ae(e.name,u,"not-fillable")}return n}async function xe(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(s){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,s)}}return r}function Dn(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function s(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,c):null}W(n,l);let f=await xe(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await xe(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(typeof e.delete!=="function")e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new dt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return W(n,m),await s("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){W(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...d,...l}}let m={...c,...l};return W(n,m),await s("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let i=[["latest","desc"],["oldest","asc"]];for(let[c,l]of i)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,k)=>{let S=w?.[f],A=k?.[f];if(S===A)return 0;return(S>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=mt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??O(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Fn(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,g=e.query;if(typeof g==="function")try{let k=g.call(e);if(k&&typeof k.chunk==="function")return await k.chunk(l,async(S)=>{let A=await Oe(S,u);if(A.length>0)await m.addDocuments(c,A);p+=A.length}),p}catch{}let h=await f.call(e)||[],w=await Oe(h,u);if(w.length>0)await m.addDocuments(c,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let g of m){let h=g?.id??g?._attributes?.id;if(h!=null)await p.deleteDocument(c,Number(h))}}}}async function Oe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.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)=>En(r,n)))).filter(Boolean)}function vn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Mn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function En(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Mn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Fn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},s={q:t,...a,...r??{}},i={with(u){return s={...s,...u},i},where(u){return s={...s,filter:u},i},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,s))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...s,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,s)}};return i}function ft(e){let n=O(e);return n===e?[e]:[e,n]}async function Pe(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of ft(r)){if(!(o in t))continue;let a=t[o];if(!N(a))continue;t[o]=await ae(a)}}function $n(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Pe(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Pe(u,n);return i}if(i)await Pe(i,n);return i},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let i of o){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let i of["update","forceUpdate"]){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],s=(i)=>{if(!i||typeof i!=="object")return i;let u=i;if(u.__stacksEncryptedReads)return i;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return s(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),i};for(let i of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[i];if(typeof u!=="function")continue;e[i]=function(...c){return s(u.apply(this,c))}}}function In(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let s of n)for(let i of ft(s))if(i in a)a[i]=await oe(a[i]);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(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await a.apply(this,s)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(s,i){let u=await t(i);return await a.call(this,s,u)}}}function jn(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){W(n,r);let a=await xe(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Nn(e,n){let t=String(n?.name??e.name??"Model"),r=(s,i)=>{if(kn())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let u=We(s,n,i);if(!u.valid)throw new ct(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...i){return r(s,"creating"),await o.call(this,s,...i)};let a=e.update;if(typeof a==="function")e.update=async function(s,i,...u){return r(i,"updating"),await a.call(this,s,i,...u)}}function Bn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...s){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=Ze(s[0],n,"set");return await a.apply(this,s)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?Ze(a,n,"set"):a;return await r.call(this,o,s)}}function pt(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=qn(e),t=Ln(e),r=Un(n,t),o=Kn(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,i=yn(a);if(On(i,e.casts),Dn(i,a),jn(i,a),e.casts&&Object.keys(e.casts).length>0)Bn(i,e.casts);let u=ie(e);if(u.length>0)In(i,u),$n(i,u);let c=e.traits?.useSoftDeletes;if(c)Qn(i,a,c);let l=e.traits?.useAudit;if(l){let m=je(l);Ne(i,e.name,e.primaryKey||"id",m)}Nn(i,a);let f=i;f.withoutValidation=function(m){return _n(m)},f.withoutEvents=function(m){return M(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=i[m];if(typeof p!=="function")continue;let g=`${m}Quietly`;if(typeof i[g]==="function")continue;i[g]=function(...h){return M(()=>p.apply(i,h))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return gn(e.name,d),Object.defineProperty(d,Ce,{value:e,enumerable:!1,configurable:!0}),d}function qn(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&d[p]!==void 0)g[p]=d[p];return g},o=async(d,m)=>{if(E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,s=e.traits?.broadcastWith,i=typeof a==="function"&&typeof s==="function",u=async(d,m)=>{if(!i)return;if(E())return;try{let p=a(m),g=Array.isArray(p)?p:[p],h=s(m),k=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof k!=="function")return;for(let S of g){if(typeof S!=="string"||S.length===0)continue;await k(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function Un(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let s of o)await s(...a)}}return Object.keys(n).length?n:void 0}function mt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=vn(n);return t}function Ln(e){let n=mt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??O(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await Oe([i],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=R(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(E())return;let u=await o(i);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await rt(r,u,e.name)}return}await rt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(E())return;let u=i?.id??i?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await ot(r,Number(u),e.name)}return}await ot(r,Number(u),e.name)}}}var nt=new Map;function yt(e,n){let t=nt.get(e)??0;if(nt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function rt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){yt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function ot(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){yt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Kn(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=pe(t);if(r.categorizable)n._categorizable=me(t);if(r.commentable)n._commentable=de(t);if(r.billable)n._billable=He(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ye(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=Ge();return n}function Qn(e,n,t){let r=Je(e,n.primaryKey||"id"),o=Ye(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${s}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${s}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await Q(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 Q(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await Q(a,o,m,"restore");await c(m)}return w}let{db:g}=await import("@stacksjs/database"),h=await g.transaction(async()=>{let w=await r.restore(m);if(w)await Q(a,o,m,"restore");return w});if(h)await c(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Wn(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Wn(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var Vn=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],zn=["traits","dashboard"];function Hn(e){let n=e?.[Ce];if(n&&typeof n==="object")return n;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 Gn(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Jn(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function Yn(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Jn(r),s=Object.fromEntries(Object.entries(o).map(([i,u])=>{let c=!(i in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[i,{...u,order:++a}];return[i,u]}));t.attributes={...r,...s}}for(let a of Vn){let s=Gn(e[a],n[a]);if(s)t[a]=s}for(let a of zn){let s=e[a],i=n[a];if(s&&i&&typeof s==="object"&&typeof i==="object")t[a]={...s,...i}}return t}function Ui(e,n){return pt(Yn(Hn(e),n))}import ar from"process";import{log as ir}from"@stacksjs/logging";import{path as P}from"@stacksjs/path";import{fs as V}from"@stacksjs/storage";import{Database as Xn}from"bun:sqlite";import{existsSync as Zn,readdirSync as er,readFileSync as tr}from"fs";function nr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function rr(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function or(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function gt(e,n="sqlite"){let t=[];if(!Zn(e))return{tables:[],errors:t};let r;try{r=er(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Xn(":memory:");try{for(let i of r){let u=`${e}/${i}`,c;try{c=tr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=or(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((i)=>i.name).filter((i)=>!nr(i)),s=[];for(let i of a){let u=o.query(`PRAGMA table_info("${i.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=rr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}s.push({table:i,columns:c})}return{tables:s,errors:t}}finally{o.close()}}function sr(e){if(e)return e;let n=String(ar.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function te(e){return e==="postgres"?"boolean":"number"}function C(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function cr(e,n){let t=e.default;if(typeof t==="boolean")return te(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function ur(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function lr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(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 t.length>0?t.join(" | "):null}function dr(e,n){let t=ur(e),r=lr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return te(n);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,n)}})();return e.nullable===!0?`${a} | null`:a}function fr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${C(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${C(a.model)}_id`]="number"}}return n}function pr(e,n){let[t,r]=[C(e),C(n)].sort();return`${t}_${r}`}function mr(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?te(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function yr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let s of a){let i,u,c,l,f={},d=!0;if(typeof s==="string")i=s;else if(s&&typeof s==="object"&&"model"in s){let w=s;if(i=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)u=w.pivotTable,c=w.firstForeignKey,l=w.secondForeignKey;else{let k=s;u=k.table,c=k.foreignKey,l=k.relatedKey,f=k.pivot?.columns??{},d=Boolean(k.pivot?.timestamps)}}else continue;let m=u??pr(e,i),p=c??`${C(e)}_id`,g=l??`${C(i)}_id`,h={id:"number",[p]:"number",[g]:"number"};for(let[w,k]of Object.entries(f))h[w]=mr(k,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function gr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${te(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function br(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,gr(n));return t}function wr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[C(o)]=dr(a,n);return t}function bt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
3
3
|
`),s=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${s}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
|
6
|
-
${r}}`}var
|
|
6
|
+
${r}}`}var hr=`/* eslint-disable */
|
|
7
7
|
// AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
|
|
8
8
|
// Regenerate after adding/removing a model or changing its attributes.
|
|
9
9
|
// See stacksjs/stacks#1923.
|
|
10
10
|
|
|
11
11
|
declare module '@stacksjs/database' {
|
|
12
12
|
interface DatabaseSchema {
|
|
13
|
-
`,
|
|
13
|
+
`,kr=` }
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export {}
|
|
17
|
-
`,
|
|
18
|
-
`;function
|
|
19
|
-
`),m=`${
|
|
20
|
-
${
|
|
21
|
-
`);return`${
|
|
22
|
-
${kt(n)}`}import{configureOrm as Sr}from"@stacksjs/query-builder";function Rr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Sr({database:e})}catch{}}Rr();async function Tt(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function re(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Tt(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 n){let a=o?`${o}/`:"",s=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(s).exists())return await Tt(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var v={},St=()=>{},Xi=new Promise((e)=>{St=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=v[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=v[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=v[e];return r==null?!1:(t in r)},apply(n,t,r){let o=v[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Pr=y("User"),Ar=y("Job"),xr=y("FailedJob"),Or=[["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"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"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"),n=await re("User");if(n)v.User=n;if(e("queue")){let t=await re("Job");if(t)v.Job=t;let r=await re("FailedJob");if(r)v.FailedJob=r}for(let[t,r,o]of Or){if(!e(o))continue;let a=await re(t,r);if(a)v[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{St()}});var Cr=y("Activity"),Dr=y("AnalyticsEvent"),vr=y("Automation"),Mr=y("AutomationRun"),Er=y("Auction"),Fr=y("CampaignVariant"),$r=y("CommunicationSuppression"),Ir=y("ConsentEvent"),jr=y("SenderDomain"),Nr=y("UsageEvent"),Br=y("AuctionItem"),qr=y("Author"),Ur=y("Bid"),Lr=y("Board"),Kr=y("BoardColumn"),Qr=y("Campaign"),Wr=y("Card"),Vr=y("CardComment"),zr=y("Cart"),Hr=y("CartItem"),Gr=y("Category"),Jr=y("Comment"),Yr=y("Coupon"),Xr=y("Customer"),Zr=y("DeliveryRoute"),eo=y("DeliveryStop"),to=y("Deployment"),no=y("DigitalDelivery"),ro=y("Courier"),oo=y("CourierPing"),ao=y("CampaignSend"),io=y("EmailList"),so=y("EmailListSubscriber"),co=y("Form"),uo=y("FormField"),lo=y("FormSubmission"),fo=y("MagicLinkToken"),po=y("Menu"),mo=y("MenuItem"),yo=y("PageRevision"),go=y("Pledge"),bo=y("Redirect"),wo=y("Site"),ho=y("SiteDomain"),ko=y("SmsOptOut"),_o=y("EmailIdempotency"),To=y("EmailSuppression"),So=y("EmailWebhookEvent"),Ro=y("Error"),Po=y("GiftCard"),Ao=y("Label"),xo=y("LicenseKey"),Oo=y("Log"),Co=y("LoyaltyPoint"),Do=y("LoyaltyReward"),vo=y("MailPreference"),Mo=y("Manufacturer"),Eo=y("Notification"),Fo=y("NotificationDelivery"),$o=y("Order"),Io=y("OrderIdempotency"),jo=y("OrderItem"),No=y("Page"),Bo=y("Payment"),qo=y("PaymentMethod"),Uo=y("PaymentProduct"),Lo=y("PaymentTransaction"),Ko=y("Post"),Qo=y("PrintDevice"),Wo=y("Product"),Vo=y("ProductUnit"),zo=y("ProductVariant"),Ho=y("QueryLog"),Go=y("Receipt"),Jo=y("Release"),Yo=y("Request"),Xo=y("Review"),Zo=y("ShippingMethod"),ea=y("ShippingRate"),ta=y("ShippingZone"),na=y("SocialPost"),ra=y("SocialAccount"),oa=y("Subscriber"),aa=y("SubscriberEmail"),ia=y("Subscription"),sa=y("Tag"),ca=y("TaxRate"),ua=y("Team"),la=y("TeamInvitation"),da=y("TeamMember"),fa=y("Transaction"),pa=y("WaitlistProduct"),ma=y("WaitlistRestaurant"),ya=y("Websocket"),Rt={User:Pr,Job:Ar,FailedJob:xr,Activity:Cr,AnalyticsEvent:Dr,Automation:vr,AutomationRun:Mr,Auction:Er,AuctionItem:Br,Author:qr,Bid:Ur,Board:Lr,BoardColumn:Kr,Campaign:Qr,CampaignSend:ao,CampaignVariant:Fr,Card:Wr,CardComment:Vr,Cart:zr,CartItem:Hr,Category:Gr,Comment:Jr,Coupon:Yr,Customer:Xr,CommunicationSuppression:$r,ConsentEvent:Ir,DeliveryRoute:Zr,DeliveryStop:eo,Deployment:to,DigitalDelivery:no,Courier:ro,CourierPing:oo,EmailList:io,EmailListSubscriber:so,EmailIdempotency:_o,EmailSuppression:To,EmailWebhookEvent:So,ErrorModel:Ro,Form:co,FormField:uo,FormSubmission:lo,GiftCard:Po,Label:Ao,LicenseKey:xo,Log:Oo,LoyaltyPoint:Co,LoyaltyReward:Do,MailPreference:vo,Manufacturer:Mo,Notification:Eo,MagicLinkToken:fo,Menu:po,MenuItem:mo,NotificationDelivery:Fo,Order:$o,OrderIdempotency:Io,OrderItem:jo,Page:No,PageRevision:yo,Payment:Bo,PaymentMethod:qo,PaymentProduct:Uo,PaymentTransaction:Lo,Pledge:go,Post:Ko,PrintDevice:Qo,Product:Wo,ProductUnit:Vo,ProductVariant:zo,QueryLog:Ho,Receipt:Go,Release:Jo,Request:Yo,Review:Xo,ShippingMethod:Zo,Redirect:bo,SenderDomain:jr,ShippingRate:ea,ShippingZone:ta,Site:wo,SiteDomain:ho,SmsOptOut:ko,SocialAccount:ra,SocialPost:na,Subscriber:oa,SubscriberEmail:aa,Subscription:ia,Tag:sa,TaxRate:ca,Team:ua,TeamInvitation:la,TeamMember:da,Transaction:fa,UsageEvent:Nr,WaitlistProduct:pa,WaitlistRestaurant:ma,Websocket:ya},N=globalThis;for(let[e,n]of Object.entries(Rt))if(n&&N[e]===void 0)N[e]=n;var Zi=Object.keys(Rt);async function ga(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function ba(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(N.safeAll===void 0)N.safeAll=ga;if(N.safeGet===void 0)N.safeGet=ba;var export_isCursorPaginator=P.isCursorPaginator;var export_isPaginator=P.isPaginator;var export_isSimplePaginator=P.isSimplePaginator;var export_toCursorPaginator=P.toCursorPaginator;var export_toPaginator=P.toPaginator;var export_toSimplePaginator=P.toSimplePaginator;export{Cr as Activity,Dr as AnalyticsEvent,Er as Auction,Br as AuctionItem,qr as Author,vr as Automation,Mr as AutomationRun,Ur as Bid,Lr as Board,Kr as BoardColumn,Qr as Campaign,ao as CampaignSend,Fr as CampaignVariant,Wr as Card,Vr as CardComment,zr as Cart,Hr as CartItem,Gr as Category,Jr as Comment,$r as CommunicationSuppression,Ir as ConsentEvent,Yr as Coupon,ro as Courier,oo as CourierPing,Xr as Customer,Zr as DeliveryRoute,eo as DeliveryStop,to as Deployment,no as DigitalDelivery,_o as EmailIdempotency,io as EmailList,so as EmailListSubscriber,To as EmailSuppression,So as EmailWebhookEvent,Ro as ErrorModel,xr as FailedJob,co as Form,uo as FormField,lo as FormSubmission,Po as GiftCard,Ar as Job,Ao as Label,xo as LicenseKey,Oo as Log,Co as LoyaltyPoint,Do as LoyaltyReward,De as MODEL_DEFINITION,fo as MagicLinkToken,vo as MailPreference,Mo as Manufacturer,xe as MassAssignmentException,po as Menu,mo as MenuItem,ft as ModelNotFoundError,ut as ModelValidationError,Eo as Notification,Fo as NotificationDelivery,$o as Order,Io as OrderIdempotency,jo as OrderItem,No as Page,yo as PageRevision,Bo as Payment,qo as PaymentMethod,Uo as PaymentProduct,Lo as PaymentTransaction,go as Pledge,Ko as Post,Qo as PrintDevice,Wo as Product,Vo as ProductUnit,zo as ProductVariant,Ho as QueryLog,Go as Receipt,bo as Redirect,Jo as Release,Yo as Request,Xo as Review,jr as SenderDomain,Zo as ShippingMethod,ea as ShippingRate,ta as ShippingZone,wo as Site,ho as SiteDomain,ko as SmsOptOut,ra as SocialAccount,na as SocialPost,cn as SubqueryBuilder,oa as Subscriber,aa as SubscriberEmail,ia as Subscription,sa as Tag,ca as TaxRate,ua as Team,la as TeamInvitation,da as TeamMember,fa as Transaction,Nr as UsageEvent,Pr as User,pa as WaitlistProduct,ma as WaitlistRestaurant,ya as Websocket,ni as batchLoad,_r as buildDatabaseSchema,se as collectEncryptedAttributes,je as createAuditMethods,ye as createCategorizableMethods,fe as createCommentableMethods,ge as createLikeableMethods,me as createTaggableMethods,tn as customerOwnership,ii as db,ie as decryptValue,mt as defineModel,ae as encryptValue,Se as enrichPaginatorUrls,Bi as extendModel,Vt as filterFillable,Ta as getPrunableConfig,Wt as getWritableFields,export_isCursorPaginator as isCursorPaginator,B as isEncrypted,export_isPaginator as isPaginator,export_isSimplePaginator as isSimplePaginator,Ke as isUniqueViolation,Kt as mapWriteError,_a as massPrunable,Gn as mergeModelDefinition,Zi as modelGlobalNames,Xi as ormReady,an as parentOwnership,ze as parseCursor,Ce as projectDocumentsFromTrait,Pt as prunable,Tr as renderDatabaseTypeFile,Te as resolveCursorArgs,_e as resolvePageArgs,li as savepoint,nn as selfOwnership,Et as setAuditUser,rn as siteOwnership,on as teamMembershipOwnership,Kn as toAttrs,export_toCursorPaginator as toCursorPaginator,export_toPaginator as toPaginator,export_toSimplePaginator as toSimplePaginator,Qt as toSnakeCaseKeys,ui as transaction,di as transactional,E as withoutEvents,hn as withoutValidation};
|
|
17
|
+
`,_r="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Tr=`}
|
|
18
|
+
`;function wt(e){return e==="framework"?_r:hr}function ht(e){return e==="framework"?Tr:kr}async function kt(e,n,t=[]){let r=[];if(!V.existsSync(e))return r;let o=V.readdirSync(e,{withFileTypes:!0});for(let a of o){let s=P.join(e,a.name);if(a.isDirectory()){if(n){let i=await kt(s,!0,t);r.push(...i)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let i=await(P.isAbsolute(s)?import(s):import(P.resolve(s))),u=i.default||i;if(u?.name&&(u.attributes||u.table))r.push({filePath:s,model:u})}catch(i){t.push({file:s,error:i.message})}}return r}async function Sr(e={}){let n=sr(e.dialect),t=e.modelsDir??P.userModelsPath(),r=e.defaultsDir??P.frameworkPath("defaults/app/Models"),o=e.outFile??P.projectPath("database/types.d.ts"),a=[],s=[];for(let[p,g]of[[t,!1],[r,!0]])try{let h=await kt(p,g,a);s.push(...h)}catch(h){a.push({file:p,error:h.message})}let i=new Map;for(let p of s)i.set(p.model.name??P.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of s)if(p.filePath.startsWith(t))i.set(p.model.name??P.basename(p.filePath).replace(/\.ts$/,""),p);let u=[];for(let[p,{model:g}]of i){let h=g.table??`${C(p)}s`,w={...br(g,n),...wr(g,n),...fr(g)};u.push({table:h,model:p,columns:w})}let c=new Map;for(let[p,{model:g}]of i)for(let h of yr(p,g,n)){if(c.has(h.table))continue;c.set(h.table,{table:h.table,model:`(${h.table} pivot)`,columns:h.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let p=e.migrationsDir??P.resolve(P.dirname(o),"migrations"),g=new Set(u.map((w)=>w.table)),h=gt(p,n);for(let w of h.tables){if(g.has(w.table))continue;g.add(w.table),u.push({table:w.table,model:`(${w.table} migration)`,columns:w.columns})}a.push(...h.errors)}u.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((p)=>bt(p.table,p.columns,f)).join(`
|
|
19
|
+
`),m=`${wt(l)}${d}
|
|
20
|
+
${ht(l)}`;if(!e.dryRun){let p=P.dirname(o);if(!V.existsSync(p))V.mkdirSync(p,{recursive:!0});V.writeFileSync(o,m,"utf-8"),ir.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:m}}function Rr(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>bt(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
21
|
+
`);return`${wt(n)}${t}
|
|
22
|
+
${ht(n)}`}import{isCursorPaginator as Ss,isPaginator as Rs,isSimplePaginator as Ps,toCursorPaginator as As,toPaginator as xs,toSimplePaginator as Os}from"@stacksjs/pagination";import{configureOrm as Pr}from"@stacksjs/query-builder";function Ar(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Pr({database:e})}catch{}}Ar();async function _t(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ne(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await _t(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 n){let a=o?`${o}/`:"",s=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(s).exists())return await _t(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var D={},Tt=()=>{},es=new Promise((e)=>{Tt=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=D[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=D[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=D[e];return r==null?!1:(t in r)},apply(n,t,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var xr=y("User"),Or=y("Job"),Cr=y("FailedJob"),Dr=[["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"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"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"),n=await ne("User");if(n)D.User=n;if(e("queue")){let t=await ne("Job");if(t)D.Job=t;let r=await ne("FailedJob");if(r)D.FailedJob=r}for(let[t,r,o]of Dr){if(!e(o))continue;let a=await ne(t,r);if(a)D[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Tt()}});var vr=y("Activity"),Mr=y("AnalyticsEvent"),Er=y("Automation"),Fr=y("AutomationRun"),$r=y("Auction"),Ir=y("CampaignVariant"),jr=y("CommunicationSuppression"),Nr=y("ConsentEvent"),Br=y("SenderDomain"),qr=y("UsageEvent"),Ur=y("AuctionItem"),Lr=y("Author"),Kr=y("Bid"),Qr=y("Board"),Wr=y("BoardColumn"),Vr=y("Campaign"),zr=y("Card"),Hr=y("CardComment"),Gr=y("Cart"),Jr=y("CartItem"),Yr=y("Category"),Xr=y("Comment"),Zr=y("Coupon"),eo=y("Customer"),to=y("DeliveryRoute"),no=y("DeliveryStop"),ro=y("Deployment"),oo=y("DigitalDelivery"),ao=y("Courier"),io=y("CourierPing"),so=y("CampaignSend"),co=y("EmailList"),uo=y("EmailListSubscriber"),lo=y("Form"),fo=y("FormField"),po=y("FormSubmission"),mo=y("MagicLinkToken"),yo=y("Menu"),go=y("MenuItem"),bo=y("PageRevision"),wo=y("Pledge"),ho=y("Redirect"),ko=y("Site"),_o=y("SiteDomain"),To=y("SmsOptOut"),So=y("EmailIdempotency"),Ro=y("EmailSuppression"),Po=y("EmailWebhookEvent"),Ao=y("Error"),xo=y("GiftCard"),Oo=y("Label"),Co=y("LicenseKey"),Do=y("Log"),vo=y("LoyaltyPoint"),Mo=y("LoyaltyReward"),Eo=y("MailPreference"),Fo=y("Manufacturer"),$o=y("Notification"),Io=y("NotificationDelivery"),jo=y("Order"),No=y("OrderIdempotency"),Bo=y("OrderItem"),qo=y("Page"),Uo=y("Payment"),Lo=y("PaymentMethod"),Ko=y("PaymentProduct"),Qo=y("PaymentTransaction"),Wo=y("Post"),Vo=y("PrintDevice"),zo=y("Product"),Ho=y("ProductUnit"),Go=y("ProductVariant"),Jo=y("QueryLog"),Yo=y("Receipt"),Xo=y("Release"),Zo=y("Request"),ea=y("Review"),ta=y("ShippingMethod"),na=y("ShippingRate"),ra=y("ShippingZone"),oa=y("SocialPost"),aa=y("SocialAccount"),ia=y("Subscriber"),sa=y("SubscriberEmail"),ca=y("Subscription"),ua=y("Tag"),la=y("TaxRate"),da=y("Team"),fa=y("TeamInvitation"),pa=y("TeamMember"),ma=y("Transaction"),ya=y("WaitlistProduct"),ga=y("WaitlistRestaurant"),ba=y("Websocket"),St={User:xr,Job:Or,FailedJob:Cr,Activity:vr,AnalyticsEvent:Mr,Automation:Er,AutomationRun:Fr,Auction:$r,AuctionItem:Ur,Author:Lr,Bid:Kr,Board:Qr,BoardColumn:Wr,Campaign:Vr,CampaignSend:so,CampaignVariant:Ir,Card:zr,CardComment:Hr,Cart:Gr,CartItem:Jr,Category:Yr,Comment:Xr,Coupon:Zr,Customer:eo,CommunicationSuppression:jr,ConsentEvent:Nr,DeliveryRoute:to,DeliveryStop:no,Deployment:ro,DigitalDelivery:oo,Courier:ao,CourierPing:io,EmailList:co,EmailListSubscriber:uo,EmailIdempotency:So,EmailSuppression:Ro,EmailWebhookEvent:Po,ErrorModel:Ao,Form:lo,FormField:fo,FormSubmission:po,GiftCard:xo,Label:Oo,LicenseKey:Co,Log:Do,LoyaltyPoint:vo,LoyaltyReward:Mo,MailPreference:Eo,Manufacturer:Fo,Notification:$o,MagicLinkToken:mo,Menu:yo,MenuItem:go,NotificationDelivery:Io,Order:jo,OrderIdempotency:No,OrderItem:Bo,Page:qo,PageRevision:bo,Payment:Uo,PaymentMethod:Lo,PaymentProduct:Ko,PaymentTransaction:Qo,Pledge:wo,Post:Wo,PrintDevice:Vo,Product:zo,ProductUnit:Ho,ProductVariant:Go,QueryLog:Jo,Receipt:Yo,Release:Xo,Request:Zo,Review:ea,ShippingMethod:ta,Redirect:ho,SenderDomain:Br,ShippingRate:na,ShippingZone:ra,Site:ko,SiteDomain:_o,SmsOptOut:To,SocialAccount:aa,SocialPost:oa,Subscriber:ia,SubscriberEmail:sa,Subscription:ca,Tag:ua,TaxRate:la,Team:da,TeamInvitation:fa,TeamMember:pa,Transaction:ma,UsageEvent:qr,WaitlistProduct:ya,WaitlistRestaurant:ga,Websocket:ba},j=globalThis;for(let[e,n]of Object.entries(St))if(n&&j[e]===void 0)j[e]=n;var ts=Object.keys(St);async function wa(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function ha(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(j.safeAll===void 0)j.safeAll=wa;if(j.safeGet===void 0)j.safeGet=ha;export{vr as Activity,Mr as AnalyticsEvent,$r as Auction,Ur as AuctionItem,Lr as Author,Er as Automation,Fr as AutomationRun,Kr as Bid,Qr as Board,Wr as BoardColumn,Vr as Campaign,so as CampaignSend,Ir as CampaignVariant,zr as Card,Hr as CardComment,Gr as Cart,Jr as CartItem,Yr as Category,Xr as Comment,jr as CommunicationSuppression,Nr as ConsentEvent,Zr as Coupon,ao as Courier,io as CourierPing,eo as Customer,to as DeliveryRoute,no as DeliveryStop,ro as Deployment,oo as DigitalDelivery,So as EmailIdempotency,co as EmailList,uo as EmailListSubscriber,Ro as EmailSuppression,Po as EmailWebhookEvent,Ao as ErrorModel,Cr as FailedJob,lo as Form,fo as FormField,po as FormSubmission,xo as GiftCard,Or as Job,Oo as Label,Co as LicenseKey,Do as Log,vo as LoyaltyPoint,Mo as LoyaltyReward,Ce as MODEL_DEFINITION,mo as MagicLinkToken,Eo as MailPreference,Fo as Manufacturer,Ae as MassAssignmentException,yo as Menu,go as MenuItem,dt as ModelNotFoundError,ct as ModelValidationError,$o as Notification,Io as NotificationDelivery,jo as Order,No as OrderIdempotency,Bo as OrderItem,qo as Page,bo as PageRevision,Uo as Payment,Lo as PaymentMethod,Ko as PaymentProduct,Qo as PaymentTransaction,wo as Pledge,Wo as Post,Vo as PrintDevice,zo as Product,Ho as ProductUnit,Go as ProductVariant,Jo as QueryLog,Yo as Receipt,ho as Redirect,Xo as Release,Zo as Request,ea as Review,Br as SenderDomain,ta as ShippingMethod,na as ShippingRate,ra as ShippingZone,ko as Site,_o as SiteDomain,To as SmsOptOut,aa as SocialAccount,oa as SocialPost,sn as SubqueryBuilder,ia as Subscriber,sa as SubscriberEmail,ca as Subscription,ua as Tag,la as TaxRate,da as Team,fa as TeamInvitation,pa as TeamMember,ma as Transaction,qr as UsageEvent,xr as User,ya as WaitlistProduct,ga as WaitlistRestaurant,ba as Websocket,oi as batchLoad,Sr as buildDatabaseSchema,ie as collectEncryptedAttributes,Ie as createAuditMethods,me as createCategorizableMethods,de as createCommentableMethods,ye as createLikeableMethods,pe as createTaggableMethods,en as customerOwnership,ci as db,ae as decryptValue,pt as defineModel,oe as encryptValue,Te as enrichPaginatorUrls,Ui as extendModel,Wt as filterFillable,Ra as getPrunableConfig,Qt as getWritableFields,Ss as isCursorPaginator,N as isEncrypted,Rs as isPaginator,Ps as isSimplePaginator,Le as isUniqueViolation,Lt as mapWriteError,Sa as massPrunable,Yn as mergeModelDefinition,ts as modelGlobalNames,es as ormReady,on as parentOwnership,Ve as parseCursor,Oe as projectDocumentsFromTrait,Rt as prunable,Rr as renderDatabaseTypeFile,_e as resolveCursorArgs,ke as resolvePageArgs,fi as savepoint,tn as selfOwnership,Mt as setAuditUser,nn as siteOwnership,rn as teamMembershipOwnership,Wn as toAttrs,As as toCursorPaginator,xs as toPaginator,Os as toSimplePaginator,Kt as toSnakeCaseKeys,di as transaction,pi as transactional,M as withoutEvents,_n as withoutValidation};
|
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.
|
|
5
|
+
"version": "0.74.5",
|
|
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.
|
|
67
|
-
"@stacksjs/cli": "0.74.
|
|
68
|
-
"@stacksjs/config": "0.74.
|
|
69
|
-
"@stacksjs/database": "0.74.
|
|
70
|
-
"@stacksjs/env": "0.74.
|
|
71
|
-
"@stacksjs/error-handling": "0.74.
|
|
72
|
-
"@stacksjs/events": "0.74.
|
|
73
|
-
"@stacksjs/logging": "0.74.
|
|
74
|
-
"@stacksjs/model-meta": "0.74.
|
|
75
|
-
"@stacksjs/pagination": "0.74.
|
|
76
|
-
"@stacksjs/path": "0.74.
|
|
77
|
-
"@stacksjs/query-builder": "0.74.
|
|
78
|
-
"@stacksjs/realtime": "0.74.
|
|
79
|
-
"@stacksjs/router": "0.74.
|
|
80
|
-
"@stacksjs/storage": "0.74.
|
|
81
|
-
"@stacksjs/strings": "0.74.
|
|
66
|
+
"@stacksjs/cache": "0.74.5",
|
|
67
|
+
"@stacksjs/cli": "0.74.5",
|
|
68
|
+
"@stacksjs/config": "0.74.5",
|
|
69
|
+
"@stacksjs/database": "0.74.5",
|
|
70
|
+
"@stacksjs/env": "0.74.5",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.5",
|
|
72
|
+
"@stacksjs/events": "0.74.5",
|
|
73
|
+
"@stacksjs/logging": "0.74.5",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.5",
|
|
75
|
+
"@stacksjs/pagination": "0.74.5",
|
|
76
|
+
"@stacksjs/path": "0.74.5",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.5",
|
|
78
|
+
"@stacksjs/realtime": "0.74.5",
|
|
79
|
+
"@stacksjs/router": "0.74.5",
|
|
80
|
+
"@stacksjs/storage": "0.74.5",
|
|
81
|
+
"@stacksjs/strings": "0.74.5",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.74.
|
|
83
|
+
"@stacksjs/validation": "0.74.5",
|
|
84
84
|
"bun-query-builder": "^0.2.62"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@stacksjs/auth": "0.74.
|
|
88
|
-
"@stacksjs/payments": "0.74.
|
|
89
|
-
"@stacksjs/queue": "0.74.
|
|
90
|
-
"@stacksjs/search-engine": "0.74.
|
|
87
|
+
"@stacksjs/auth": "0.74.5",
|
|
88
|
+
"@stacksjs/payments": "0.74.5",
|
|
89
|
+
"@stacksjs/queue": "0.74.5",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.5",
|
|
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.
|
|
111
|
+
"@stacksjs/types": "0.74.5",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "22.3.2"
|
|
114
114
|
}
|