@stacksjs/orm 0.74.29 → 0.74.31
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/batch-loader.d.ts +9 -17
- package/dist/define-model.d.ts +4 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10 -10
- package/dist/models/Content/Author.ts +1 -0
- package/dist/models/Content/Post.ts +5 -3
- package/dist/models/PersonalAccessToken.ts +154 -0
- package/dist/models/User.ts +1 -1
- package/dist/models/commerce/CartItem.ts +3 -3
- package/dist/models/commerce/Payment.ts +2 -2
- package/dist/models/commerce/WaitlistProduct.ts +2 -2
- package/dist/traits/activity-log.d.ts +70 -0
- package/dist/traits/actor.d.ts +37 -0
- package/package.json +24 -24
package/dist/batch-loader.d.ts
CHANGED
|
@@ -1,23 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* microtask are merged into a single `findMany([...])` call.
|
|
2
|
+
* Batch model lookups within the current request. Model objects and keys retain
|
|
3
|
+
* their identities, including the distinction between numeric and string IDs.
|
|
5
4
|
*
|
|
6
5
|
* @example
|
|
7
6
|
* ```ts
|
|
8
|
-
*
|
|
9
|
-
* import User from '~/app/Models/User'
|
|
10
|
-
*
|
|
11
|
-
* // Without batching: 100 SELECTs
|
|
12
|
-
* for (const id of orderUserIds) await User.find(id)
|
|
13
|
-
*
|
|
14
|
-
* // With batching: 1 SELECT (`WHERE id IN (1, 2, … 100)`)
|
|
15
|
-
* await Promise.all(orderUserIds.map(id => batchLoad(User, id)))
|
|
7
|
+
* const users = await Promise.all(orderUserIds.map(id => batchLoad(User, id)))
|
|
16
8
|
* ```
|
|
17
9
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
10
|
+
export declare function batchLoad<TKey = number | string, TValue = Record<string, unknown>>(model: BatchModel<TKey, TValue>, key: TKey): Promise<TValue | undefined>;
|
|
11
|
+
declare interface BatchModel<TKey, TValue> {
|
|
12
|
+
name?: string
|
|
13
|
+
findMany?: (ids: TKey[]) => Promise<TValue[]>
|
|
14
|
+
find?: (id: TKey) => Promise<TValue | undefined>
|
|
15
|
+
}
|
package/dist/define-model.d.ts
CHANGED
|
@@ -103,7 +103,10 @@ export declare interface StacksModelDefinition extends Omit<BQBModelDefinition,
|
|
|
103
103
|
readonly routes?: readonly string[]
|
|
104
104
|
readonly middleware?: ApiMiddleware
|
|
105
105
|
}
|
|
106
|
-
|
|
106
|
+
commentable?: boolean | object
|
|
107
|
+
broadcastOn?: (model: any) => string[]
|
|
108
|
+
broadcastWith?: (model: any) => Record<string, unknown>
|
|
109
|
+
}
|
|
107
110
|
indexes?: Array<{ name: string, columns: string[], unique?: boolean, where?: string }>
|
|
108
111
|
casts?: Record<string, CastType | CasterInterface>
|
|
109
112
|
attributes: Record<string, StacksModelAttribute>
|
package/dist/index.d.ts
CHANGED
|
@@ -108,6 +108,7 @@ export declare const Notification: ReturnType<typeof lazyModel<typeof import('./
|
|
|
108
108
|
export declare const NotificationDelivery: ReturnType<typeof lazyModel<typeof import('./models/NotificationDelivery').default>>;
|
|
109
109
|
export declare const Order: ReturnType<typeof lazyModel<typeof import('./models/commerce/Order').default>>;
|
|
110
110
|
export declare const OrderIdempotency: ReturnType<typeof lazyModel<typeof import('./models/commerce/OrderIdempotency').default>>;
|
|
111
|
+
export declare const PersonalAccessToken: ReturnType<typeof lazyModel<typeof import('./models/PersonalAccessToken').default>>;
|
|
111
112
|
export declare const OrderItem: ReturnType<typeof lazyModel<typeof import('./models/commerce/OrderItem').default>>;
|
|
112
113
|
export declare const Page: ReturnType<typeof lazyModel<typeof import('./models/Content/Page').default>>;
|
|
113
114
|
export declare const Payment: ReturnType<typeof lazyModel<typeof import('./models/commerce/Payment').default>>;
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var St=import.meta.require;import"@stacksjs/validation";import{log as ne}from"@stacksjs/cli";import{db as Ce}from"@stacksjs/database";async function Rt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=Ce.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 ne.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await Ce.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return ne.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw ne.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 z}from"@stacksjs/logging";var De="enc:",ve="aes-256-gcm",Ct=12,V=null;async function Me(){if(V)return V;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return V=xt("sha256").update(e).digest(),V}function j(e){return typeof e==="string"&&e.startsWith(De)}async function re(e){if(e==null)return e;if(j(e))return e;if(typeof e!=="string")return e;let n=await Me();if(!n)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ot(Ct),r=Pt(ve,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${De}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function oe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!j(e))return e;try{let n=await Me();if(!n)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return z.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(ve,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ae(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 B}from"@stacksjs/logging";var vt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Fe="model_audits",ce=null;function Mt(e){ce=e}async function ie(){if(ce!=null)return ce;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 H(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 N(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 se(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Fe).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(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function $e(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(Fe).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Ee(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Ee(o.new_values):o.new_values}))}catch(t){return B.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Ee(e){try{return JSON.parse(e)}catch{return e}}function Ie(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function je(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=$e(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=N(f),m=d?.[t];if(m!=null){let p=await ie();await se({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:H(d),user_id:p},o)}}catch(d){if(B.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"?N(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=N(p)??(typeof d==="function"?N(await d.call(a,l)):null),{old:w,next:b}=Et(m,g);if(b&&Object.keys(b).length>0){let h=await ie();await se({auditable_type:n,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(B.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"?N(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let w=await ie();await se({auditable_type:n,auditable_id:d,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(B.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:w}),o)throw w}return g})}};c("delete"),c("softDelete")}import{db as Ft,sql as $t,sqlDateTime as ue}from"@stacksjs/database";function A(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 q="commentable_upvotes",U="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 le(e){let n=Ft;return{async comments(t){return A(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(A(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:ue(),updated_at:ue()}).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){A(t,"upvoteComment"),A(r,"upvoteComment");let o=()=>n.selectFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(q).values({upvoteable_id:t,upvoteable_type:U,user_id:r,created_at:ue()}).execute()}catch(s){if(!It(s))throw s}return await o()},async removeCommentUpvote(t,r){A(t,"removeCommentUpvote"),A(r,"removeCommentUpvote"),await n.deleteFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).execute()},async commentUpvoteCount(t){A(t,"commentUpvoteCount");let r=await n.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",U).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return A(t,"hasUpvotedComment"),A(r,"hasUpvotedComment"),!!await n.selectFrom(q).where("upvoteable_id","=",t).where("upvoteable_type","=",U).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as jt,sql as Nt,sqlDateTime as Ne}from"@stacksjs/database";function de(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 fe(e){let n=jt;return{async tags(t){return de(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){de(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(de(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:Ne(),updated_at:Ne()}).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 G}from"@stacksjs/database";function pe(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:G(),updated_at:G()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:G(),updated_at:G()}).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 me(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 Ue(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(Ue(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Kt(e){let n={};for(let[t,r]of Object.entries(e))n[_(t)]=r;return n}function qa(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Le(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 Ke(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)=>_(a)===_(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(_(a)===_(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.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=_(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[_(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[_(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=_(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(_(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=_(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function Qe(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=Be(t);return e.find((o)=>o.method===n&&Be(String(o.path??""))===r)}function Be(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ye(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?ye(o.read):["auth"],write:"write"in o?ye(o.write):["auth"],declared:!0}}let r=ye(t);return{read:r,write:r,declared:!0}}var qe=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(qe),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):qe,Yt);return{page:t,perPage:o,offset:(t-1)*o}}function J(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?J(e,n-1):null,next_page_url:o?J(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=J(e,1),u.last_page_url=J(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=Le(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ge(o))}};let t=Ke(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function ge(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(ge(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(ge(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 Y=new WeakMap;function oi(e,n){return an(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=Y.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},Y.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=Y.get(e);if(!a)return;Y.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 be,runInTransactionScope as cn}from"@stacksjs/database";async function di(e,n){return await cn(async()=>await be.transaction(e,n))}async function fi(e){return await be.savepoint(e)}function pi(e,n){return be.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as yn,registerModel as gn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as ot}from"async_hooks";import{toCursorPaginator as bn,toPaginator as wn,toSimplePaginator as hn}from"@stacksjs/pagination";function he(e,n){let t=Te(),r=t?we(t,"per_page"):void 0,o=t?we(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 ke(e,n){let t=Te(),r=t?Ve(t,"cursor"):void 0,o=t?we(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=We(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function We(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 _e(e){let n=Te();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?D(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?D(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?D(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?D(t,{page:o+1}):null,e.first_page_url=D(t,{page:1}),e.last_page_url=D(t,{page:a})}else e.next_page_url=e.has_more_pages?D(t,{page:o+1}):null;return e}function D(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 E;function Te(){if(E===null)return;if(E===void 0)try{let n=St("@stacksjs/router");if(typeof n.getCurrentRequest==="function")E=n.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function we(e,n){let t=Ve(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function Ve(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 ze(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 L();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 L();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 L()).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 L()).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 L(),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 L(){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 He(){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 F}from"@stacksjs/logging";var X="deleted_at";function Ge(e,n="id"){return{async softDelete(t){let r=fn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[X]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[X]: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(X);return t?.where?.(X,"!=",null)??t}}}function Je(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)=>Se(l,n,!0)),a=r.some((l)=>Se(l,n,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Se(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return F.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Se(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"){F.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"){F.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"){F.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(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(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 at=new ot;function M(){return at.getStore()?.suppressed===!0}function v(e){return Promise.resolve(at.run({suppressed:!0},e))}var it=new ot;function kn(){return it.getStore()?.suppressed===!0}function _n(e){return Promise.resolve(it.run({suppressed:!0},e))}var Oe=Symbol.for("stacks.orm.modelDefinition");class st 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 Ye=new Set;function Tn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Ye.has(r))return;Ye.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 ct(e){return typeof e==="string"?Sn[e]:e}function Xe(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=ct(a);r[o]=s[t](r[o])}return r}var Z=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),Ze=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 S(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[Ze])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]=ct(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===Ze)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 v(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return v(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return v(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return v(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return v(()=>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 b={...d};if(d.id!=null)b.id=String(d.id);return b}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},w=i._relations;for(let b of p){let h=x(b),T=d[h]??d[b];if(T!==void 0){m[h]=T;continue}let P=g[b]??g[h];if(P){m[h]=Pn(w,P);continue}m[h]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!Z.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)=>S(m,n));return d&&typeof d==="object"?S(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=x(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"&&!Z.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=x(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"&&!Z.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=x(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"&&!Z.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},et=Symbol.for("stacks.queryBuilderProxy");function ut(e,n){if(!e||typeof e!=="object")return e;if(e[et])return e;return new Proxy(e,{get(t,r,o){if(r===et)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}=he(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=ke(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)=>S(m,n));let d=xn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>S(g,n)),p=d({...f,data:m});return _e(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>S(m,n))};return S(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return ut(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)=>S(f,n)):S(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)=>S(f,n)):S(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 ut(u,n)}}}class lt 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 Pe 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 Q(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=x(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=x(u);if(Cn.has(c))continue;if(s.has(c))throw new Pe(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new Pe(e.name,u,"not-fillable")}return n}async function Ae(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){k.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){k.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}Q(n,l);let f=await Ae(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 Ae(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 lt(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 Q(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){Q(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 Q(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 b=m.orderBy(f,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((b,h)=>{let T=b?.[f],P=h?.[f];if(T===P)return 0;return(T>P?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=pt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??x(`${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 h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(T)=>{let P=await xe(T,u);if(P.length>0)await m.addDocuments(c,P);p+=P.length}),p}catch{}let w=await f.call(e)||[],b=await xe(w,u);if(b.length>0)await m.addDocuments(c,b);return b.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 w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(c,Number(w))}}}}async function xe(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 dt(e){let n=x(e);return n===e?[e]:[e,n]}async function Re(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of dt(r)){if(!(o in t))continue;let a=t[o];if(!j(a))continue;t[o]=await oe(a)}}function $n(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Re(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Re(u,n);return i}if(i)await Re(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 dt(s))if(i in a)a[i]=await re(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){Q(n,r);let a=await Ae(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=Qe(s,n,i);if(!u.valid)throw new st(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(k.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]=Xe(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)?Xe(a,n,"set"):a;return await r.call(this,o,s)}}function ft(e){k.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=ae(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=Ie(l);je(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 v(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(...w){return v(()=>p.apply(i,w))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return gn(e.name,d),Object.defineProperty(d,Oe,{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(M())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(M())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=s(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let T of g){if(typeof T!=="string"||T.length===0)continue;await h(T,d,w)}}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(M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((w)=>w===!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(k.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(k.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(k.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 pt(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=pt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??x(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await xe([i],t);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=S(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(M())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){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await nt(r,u,e.name)}return}await nt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(M())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){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await rt(r,Number(u),e.name)}return}await rt(r,Number(u),e.name)}}}var tt=new Map;function mt(e,n){let t=tt.get(e)??0;if(tt.set(e,t+1),t===0)k.warn(`[orm/search] ${n}`);else if(t===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function nt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){mt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function rt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){mt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Kn(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=fe(t);if(r.categorizable)n._categorizable=pe(t);if(r.commentable)n._commentable=le(t);if(r.billable)n._billable=ze(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=me(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=He();return n}function Qn(e,n,t){let r=Ge(e,n.primaryKey||"id"),o=Je(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||M())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 K(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let b=await r.restore(m);if(b){if(o.cascade?.length)await K(a,o,m,"restore");await c(m)}return b}let{db:g}=await import("@stacksjs/database"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await c(m);return w};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?.[Oe];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 ft(Yn(Hn(e),n))}import ar from"process";import{log as ir}from"@stacksjs/logging";import{path as R}from"@stacksjs/path";import{fs as W}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 yt(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 ee(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function cr(e,n){let t=e.default;if(typeof t==="boolean")return ee(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 ee(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[`${O(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[`${O(a.model)}_id`]="number"}}return n}function pr(e,n){let[t,r]=[O(e),O(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"?ee(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 b=s;if(i=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)u=b.pivotTable,c=b.firstForeignKey,l=b.secondForeignKey;else{let h=s;u=h.table,c=h.foreignKey,l=h.relatedKey,f=h.pivot?.columns??{},d=Boolean(h.pivot?.timestamps)}}else continue;let m=u??pr(e,i),p=c??`${O(e)}_id`,g=l??`${O(i)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(f))w[b]=mr(h,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function gr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ee(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function br(e,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[O(o)]=dr(a,n);return t}function gt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
3
|
-
`),
|
|
2
|
+
var Ft=import.meta.require;import"@stacksjs/validation";import{log as te}from"@stacksjs/cli";import{db as Ce}from"@stacksjs/database";async function $t(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=Ce.deleteFrom(e);u=o(u);let l=await u.execute(),d=Array.isArray(l)?l:[l],f=Number(d[0]?.numDeletedRows??d.length??0);return te.info(`Pruned ${f} records from ${e}`),f}let a=new Date;a.setDate(a.getDate()-n);let i=await Ce.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return te.info(`Pruned ${c} records from ${e} older than ${n} days`),c}catch(a){throw te.error(`Failed to prune ${e}:`,a),a}}async function Ka(e,t={}){return $t(e,t)}function Wa(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as It,createDecipheriv as jt,createHash as Bt,randomBytes as Nt}from"crypto";import{log as z}from"@stacksjs/logging";var ve="enc:",De="aes-256-gcm",qt=12,V=null;async function Me(){if(V)return V;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return V=Bt("sha256").update(e).digest(),V}function j(e){return typeof e==="string"&&e.startsWith(ve)}async function ne(e){if(e==null)return e;if(j(e))return e;if(typeof e!=="string")return e;let t=await Me();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Nt(qt),r=It(De,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${ve}${n.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function re(e){if(e==null)return e;if(typeof e!=="string")return e;if(!j(e))return e;try{let t=await Me();if(!t)return z.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return z.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(n,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=jt(De,t,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(t){return z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function oe(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Lt}from"@stacksjs/database";import{log as N}from"@stacksjs/logging";var Ut=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Fe="model_audits",se=null;function Kt(e){se=e}async function ae(){if(se!=null)return se;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function H(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Ut.some((o)=>o.test(n)))continue;t[n]=r}return t}function B(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function Wt(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let a of o)if(e[a]!==t[a])n[a]=e[a],r[a]=t[a];return{old:n,next:r}}async function ie(e,t=!1){try{let{db:n}=await import("@stacksjs/database");await n.insertInto(Fe).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:Lt()}).executeTakeFirst()}catch(n){if(N.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function $e(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database");return(await n.selectFrom(Fe).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Ee(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Ee(o.new_values):o.new_values}))}catch(n){return N.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function Ee(e){try{return JSON.parse(e)}catch{return e}}function Ie(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function je(e,t,n="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=$e(t).audits;let i=async(l)=>{if(!o)return await l();let{db:d}=await import("@stacksjs/database");return await d.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let d=await s.apply(this,l);try{let f=B(d),m=f?.[n];if(m!=null){let p=await ae();await ie({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:H(f),user_id:p},o)}}catch(f){if(N.warn(`[orm] audit(create) failed for ${t}`,{error:f}),o)throw f}return d})};let c=e.update;if(typeof c==="function")e.update=async function(l,d){return await i(async()=>{let f=a.find,m=typeof f==="function"?B(await f.call(a,l)):null,p=await c.call(this,l,d);try{let g=B(p)??(typeof f==="function"?B(await f.call(a,l)):null),{old:w,next:b}=Wt(m,g);if(b&&Object.keys(b).length>0){let h=await ae();await ie({auditable_type:t,auditable_id:l,event:"updated",old_values:H(w),new_values:H(b),user_id:h},o)}}catch(g){if(N.warn(`[orm] audit(update) failed for ${t}#${String(l)}`,{error:g}),o)throw g}return p})};let u=(l)=>{let d=e[l];if(typeof d!=="function")return;e[l]=async function(f){return await i(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,f)):null,g=await d.call(this,f);try{if(g!==!1&&p){let w=await ae();await ie({auditable_type:t,auditable_id:f,event:"deleted",old_values:H(p),new_values:null,user_id:w},o)}}catch(w){if(N.warn(`[orm] audit(${l}) failed for ${t}#${String(f)}`,{error:w}),o)throw w}return g})}};u("delete"),u("softDelete")}import{db as Qt,sql as Vt,sqlDateTime as ue}from"@stacksjs/database";function P(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var q="commentable_upvotes",L="commentables";function zt(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}function ce(e){let t=Qt;return{async comments(n){return P(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(Vt`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r){if(P(n,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await t.insertInto("commentables").values({...r,commentables_id:n,commentables_type:e,status:"pending",created_at:ue(),updated_at:ue()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await t.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(n,r){P(n,"upvoteComment"),P(r,"upvoteComment");let o=()=>t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await t.insertInto(q).values({upvoteable_id:n,upvoteable_type:L,user_id:r,created_at:ue()}).execute()}catch(i){if(!zt(i))throw i}return await o()},async removeCommentUpvote(n,r){P(n,"removeCommentUpvote"),P(r,"removeCommentUpvote"),await t.deleteFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(n){P(n,"commentUpvoteCount");let r=await t.selectFrom(q).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return P(n,"hasUpvotedComment"),P(r,"hasUpvotedComment"),!!await t.selectFrom(q).where("upvoteable_id","=",n).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as Ht,sql as Gt,sqlDateTime as Be}from"@stacksjs/database";function le(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function de(e){let t=Ht;return{async tags(n){return le(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){le(n,"tagCount");let r=await t.selectFrom("taggables").select(Gt`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(le(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Be(),updated_at:Be()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Jt,sqlDateTime as G}from"@stacksjs/database";function fe(e){let t=Jt;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let a=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:G(),updated_at:G()}).execute(),i=await a();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:G(),updated_at:G()}).execute(),i},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as Yt,sqlDateTime as Xt}from"@stacksjs/database";function pe(e,t){let n=Yt,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await n.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await n.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=Xt();try{return await n.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(c){let u=c;if(!(u.code==="SQLITE_CONSTRAINT_UNIQUE"||u.code==="SQLITE_CONSTRAINT"||u.code==="23505"||u.errno===1062||/unique|duplicate/i.test(u.message??"")))throw c;let d=await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(d)return d;throw c}},async unlike(a,i){await n.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await n.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await n.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function Le(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function Zt(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Le(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function en(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function ii(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ue(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Ke(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function si(e){return e?.ownership===!1}function ui(e,t,n){let r=Object.keys(e).find((a)=>_(a)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(_(a)===_(t))delete o[a];return o[t]=n,{data:o}}function tn(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function nn(e,t){if(!e||t.length===0)return{};let n={};for(let r of t){if(r in e){n[r]=e[r];continue}let o=_(r);if(o!==r&&o in e)n[r]=e[o]}return n}function rn(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),a=Number(n[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return t;return i}function ci(e,t){if(!t.length)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}function li(e,t){if(!e||t.length===0)return e;let n={...e};for(let r of t)delete n[r],delete n[_(r)];return n}var on=["id","uuid","created_at","updated_at","deleted_at"];function di(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...on]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function fi(e,t,n){if(!t)return e;let r=String(t).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=n.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var an={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"?sn(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"?un(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function sn(e){try{return JSON.parse(e)}catch{return e}}function un(e){try{return JSON.parse(e)}catch{return[]}}function pi(e,t,n){if(!e||typeof e!=="object"||!t||Object.keys(t).length===0)return e;let r={...e};for(let[o,a]of Object.entries(t)){let i=typeof a==="string"?an[a]:a;if(!i||typeof i[n]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[n](r[o]);let s=_(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[n](r[s])}return r}function We(e,t,n){let r=t?.attributes??{},o={};for(let[a,i]of Object.entries(r)){let s=i?.validation?.rule;if(!s||typeof s.validate!=="function")continue;let c=Object.prototype.hasOwnProperty.call(e,a);if(!c&&n==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,d=rn(s,l),f=s.validate(d);if(!f?.valid&&Array.isArray(f?.errors)&&f.errors.length>0)o[a]=f.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function mi(e,t,n){let r=Ne(n);return e.find((o)=>o.method===t&&Ne(String(o.path??""))===r)}function Ne(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function me(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function yi(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?me(o.read):["auth"],write:"write"in o?me(o.write):["auth"],declared:!0}}let r=me(n);return{read:r,write:r,declared:!0}}var qe=15,cn=100;function gi(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(qe),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):qe,cn);return{page:n,perPage:o,offset:(n-1)*o}}function J(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function ln(e,t,n,r,o,a){let i=(t-1)*n,s=r===0,c={page:t,per_page:n,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:t>1?J(e,t-1):null,next_page_url:o?J(e,t+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/n));c.total=a,c.last_page=u,c.first_page_url=J(e,1),c.last_page_url=J(e,u)}return c}function bi(e,t,n,r,o,a){let{page:i,...s}=ln(e,t,n,r,o,a);return{current_page:i,...s}}function wi(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function hi(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function dn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ue(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(ye(o))}};let n=Ke(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function ye(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function fn(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function pn(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function mn(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(ye(n));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function yn(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(ye(n))}catch{return null}}}}function gn(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=dn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(n,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let c=o[e];if(!c)return[];return((Array.isArray(s)?await c.whereIn(i.field,s).get():await c.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as bn}from"@stacksjs/router";var Qe=new WeakMap;function Ve(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function wn(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return Ve(n??[]).get(t)}async function hn(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((a)=>e.find?.(a))),o=Ve(r??[]);for(let a of n.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Si(e,t){let n=bn();if(!n)return wn(e,t);let r=Qe.get(n);if(!r)r=new WeakMap,Qe.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(t);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let u=i,l=o;queueMicrotask(()=>{hn(e,l,u)})}let s=new Promise((u,l)=>{i.keys.push(t),i.resolvers.push({key:t,resolve:u,reject:l})});o.cache.set(t,s);let c=o.cache;return s.catch(()=>c.delete(t)),s.then()}import{db as Oi}from"@stacksjs/database";class kn{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("and","where",e,o,a)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,a=r===void 0?n:r;this.addCondition("or","where",e,o,a)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as ge,runInTransactionScope as _n}from"@stacksjs/database";async function Di(e,t){return await _n(async()=>await ge.transaction(e,t))}async function Mi(e){return await ge.savepoint(e)}function Ei(e,t){return ge.transactional(e,t)}export*from"@stacksjs/model-meta";import{createModel as In,registerModel as jn}from"@stacksjs/query-builder";import{log as k}from"@stacksjs/logging";import{snakeCase as x}from"@stacksjs/strings";import{AsyncLocalStorage as mt}from"async_hooks";import{toCursorPaginator as Bn,toPaginator as Nn,toSimplePaginator as qn}from"@stacksjs/pagination";function we(e,t){let n=_e(),r=n?be(n,"per_page"):void 0,o=n?be(n,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(t??o??1));return{perPage:a,page:i}}function he(e,t){let n=_e(),r=n?He(n,"cursor"):void 0,o=n?be(n,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=ze(t!==void 0?t:r??null);return{perPage:a,cursor:s}}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 t=JSON.parse(e);if(Array.isArray(t))return t}catch{}return e}function ke(e){let t=_e();if(!t)return e;let n=(()=>{try{return new URL(t.url)}catch{return null}})();if(!n)return e;let r=n.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(n,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(n,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(n,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(n,{page:o+1}):null,e.first_page_url=v(n,{page:1}),e.last_page_url=v(n,{page:a})}else e.next_page_url=e.has_more_pages?v(n,{page:o+1}):null;return e}function v(e,t){let n=new URL(e.toString());for(let[r,o]of Object.entries(t))n.searchParams.set(r,String(o));return`${n.pathname}${n.search}`}var E;function _e(){if(E===null)return;if(E===void 0)try{let t=Ft("@stacksjs/router");if(typeof t.getCurrentRequest==="function")E=t.getCurrentRequest;else{E=null;return}}catch{E=null;return}return E()}function be(e,t){let n=He(e,t);if(n===void 0)return;let r=Number(n);return Number.isFinite(r)?r:void 0}function He(e,t){let n=e.query?.[t];if(n===void 0)return;return Array.isArray(n)?n[0]:n}import{createRequire as Tn}from"module";import{db as Rn}from"@stacksjs/database";var Sn=Tn(import.meta.url);function Ge(e){let t=Rn;return{async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.create(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(n,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(n,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async cancelSubscription(n,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(n,r,o={}){let{manageCheckout:a,manageCustomer:i}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await i.createOrGetStripeUser(n,{})).id,line_items:r.map((d)=>({price:d.priceId,quantity:d.quantity||1}))},...s,...o};return await a.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)return null;let i=await U();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",a=n._attributes??n,i=a[o],s=await U();if(!i){let{stacksIdempotencyKey:c}=await import("@stacksjs/payments"),u=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:c("connect.account.create",u,a.id)});return i=l.id,await t.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await U()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await U()).accounts.retrieve(c),d=!!l.charges_enabled,f=!!l.payouts_enabled,m=r.modelTable||e;return await t.updateTable(m).set({[a]:d,[i]:f}).where("id","=",Number(s.id)).execute(),{chargesEnabled:d,payoutsEnabled:f}},async chargeWithSplit(n,r){let o=await U(),a=r.accountColumn||"stripe_account_id",i=n._attributes??n,s=r.connectAccountId||i[a],c={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(c.transfer_data={destination:s},r.platformFeeCents)c.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:u}=await import("@stacksjs/payments");return await o.paymentIntents.create(c,{idempotencyKey:u("payment_intent.create",i.id,r.amountCents)})}}}function U(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=Sn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new t(e,{apiVersion:"2026-06-24.dahlia"})}function Je(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:t}=await import("@stacksjs/auth"),n=t();await e.update({two_factor_secret:n})},async verifyTwoFactorCode(e,t){let n=e.get("two_factor_secret");if(typeof n!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??n),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:c}=await import("@stacksjs/error-handling");throw new c(429,"Too many verification attempts. Please try again later.")}if(!await r(t,n))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${t}`;if(await c.has(u))return await o.recordFailedAttempt(i),!1;await c.set(u,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{sqlDateTime as An}from"@stacksjs/database";import{log as F}from"@stacksjs/logging";var Y="deleted_at";function Ye(e,t="id"){return{async softDelete(n){let r=An(),o=e.where(t,n);if(typeof o?.update==="function")return await o.update({[Y]:r}),!0;return!1},async restore(n){let r=e.where(t,n);if(typeof r?.update==="function")return await r.update({[Y]:null}),!0;return!1},async forceDelete(n){let r=e.where(t,n);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let n=typeof e.query==="function"?e.query():e;if(typeof n?.whereNotNull==="function")return n.whereNotNull(Y);return n?.where?.(Y,"!=",null)??n}}}function Xe(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let t=e;if(Array.isArray(t.cascade)){let n=t.cascade.filter((r)=>typeof r==="string");return n.length?{cascade:n}:{}}return{}}return{}}function Pn(e,t){let n=e.hasMany??[],r=e.hasOne??[],o=n.some((l)=>Te(l,t,!0)),a=r.some((l)=>Te(l,t,!1));if(!o&&!a)return F.warn(`[orm] soft-delete cascade: '${t}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?n:r).find((l)=>Te(l,t,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return F.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${t}'`),null;return{className:s,model:u}}function Te(e,t,n){let r=e.toLowerCase();if(t===r)return!0;if(n&&t===`${r}s`)return!0;if(n&&r.endsWith("y")&&t===`${r.slice(0,-1)}ies`)return!0;return!1}async function xn(e,t,n,r,o){try{let a=n.where;if(typeof a!=="function"){F.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=n.softDelete;if(typeof i==="function"){let c=a.call(n,r,t),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=n.primaryKey||"id";for(let d of u){let f=d?.[l];if(f!=null)await i.call(n,f)}return}let s=a.call(n,r,t);if(typeof s?.delete==="function"){F.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(n.table??"?")}`),await s.delete();return}}else{let i=n.restore;if(typeof i!=="function"){F.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=n.withTrashed,u=(typeof s==="function"?s.call(n):n).where?.(r,t),l=typeof u?.get==="function"?await u.get():[],d=n.primaryKey||"id";for(let f of l){let m=f?.[d];if(m!=null)await i.call(n,m)}}}catch(a){if(F.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(t)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function K(e,t,n,r){let o=t.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=Pn(e,i);if(!s)continue;await xn(s.className,n,s.model,a,r)}}import{sqlDateTime as vn}from"@stacksjs/database";import{log as On}from"@stacksjs/logging";var Cn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ze=null;async function et(){if(Ze!=null)return Ze;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return n?.user?.id??n?._user?.id??null}catch{return null}}async function tt(){try{let t=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof t!=="function")return null;let n=t();return typeof n?.ip==="function"?n.ip()??null:null}catch{return null}}function nt(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(Cn.some((o)=>o.test(n)))continue;t[n]=r}return t}function rt(e,t,n){On.warn(`[orm] ${e} row write failed for ${t}: ${n?.message??String(n)}`)}var Dn="activities";function ot(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let t=e;return{logOnly:Array.isArray(t.logOnly)?t.logOnly:void 0,include:Array.isArray(t.include)?t.include:void 0,exclude:Array.isArray(t.exclude)?t.exclude:void 0}}function Mn(e,t,n=[]){let r=nt(e);if(!r)return null;let o=new Set(n),a=t.logOnly??t.include,i=new Set(t.exclude??[]),s={};for(let[c,u]of Object.entries(r)){if(o.has(c)||i.has(c))continue;if(a&&!a.includes(c))continue;s[c]=u}return s}function En(e,t,n){return n==null?`${e} was ${t}`:`${e} ${String(n)} was ${t}`}async function Fn(e){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Dn).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:vn()}).executeTakeFirst()}catch(t){rt("activity",`${e.subject_type}#${String(e.subject_id)}`,t)}}async function $n(e){let{attributes:t,event:n,modelName:r,options:o,primaryKey:a}=e,i=t?.[a]??null,s=await et();await Fn({type:`${r.toLowerCase()}.${n}`,description:En(r,n,i),subject_type:r,subject_id:i,properties:Mn(t,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await tt()})}function Re(e){if(!e||typeof e!=="object")return null;let t=e;if(t.attributes&&typeof t.attributes==="object")return{...t.attributes};if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function at(e,t,n,r,o=[]){if(t==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?Re(await a.find(d)):null,s=async(d,f)=>{await $n({modelName:t,event:d,attributes:f,primaryKey:n,options:r,hidden:o})},c=e.create;if(typeof c==="function")e.create=async function(...d){let f=await c.apply(this,d);return await s("created",Re(f)),f};let u=e.update;if(typeof u==="function")e.update=async function(d,f){let m=await u.call(this,d,f);return await s("updated",Re(m)??await i(d)),m};let l=e.delete;if(typeof l==="function")e.delete=async function(d){let f=await i(d),m=await l.call(this,d);return await s("deleted",f??{[n]:d}),m}}var yt=new mt;function M(){return yt.getStore()?.suppressed===!0}function D(e){return Promise.resolve(yt.run({suppressed:!0},e))}var gt=new mt;function Ln(){return gt.getStore()?.suppressed===!0}function Un(e){return Promise.resolve(gt.run({suppressed:!0},e))}var Oe=Symbol.for("stacks.orm.modelDefinition");class bt extends Error{status=422;errors;constructor(e,t){let n=Object.keys(t).join(", ");super(`${e} validation failed: ${n}`);this.name="ModelValidationError",this.errors=t}}var it=new Set;function Kn(e,t){let n=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${n}`;if(it.has(r))return;it.add(r);let o=t instanceof Error?t.message:String(t);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(n)}`)}var Wn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(t){return Kn(e,t),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function wt(e){return typeof e==="string"?Wn[e]:e}function st(e,t,n){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(t))if(o in r){let i=wt(a);r[o]=i[n](r[o])}return r}var X=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),ut=Symbol.for("stacks.modelInstanceProxy"),Qn={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 Vn(e,t){if(!e||!t)return null;let n=t.split("."),r=e;for(let o of n){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,t){if(!e||typeof e!=="object")return e;let n=e;if(n[ut])return e;let r=n._attributes;if(!r||typeof r!=="object")return e;if(t&&Object.keys(t).length>0){for(let[o,a]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=wt(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===ut)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes),g=p&&typeof p.then==="function"?await p:p;s._attributes[f]=g}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="save")return function(){let u=s._definition,l=u?.set;if(l&&Object.keys(l).length>0&&typeof s.isDirty==="function"){for(let[f,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(f))continue;let p=m(s._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${f}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);s._attributes[f]=p}let d=u.set;u.set={};try{return s.save()}finally{u.set=d}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,d]of Object.entries(u))i[l]=d;return i.saveAsync()};if(a==="saveQuietly")return function(){return D(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return D(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return D(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return D(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return D(()=>s.delete())};if(a==="toSearchableObject")return function(){let d=s._definition?.traits?.useSearch;if(!d)return null;let f=s._attributes;if(!f)return null;if(d===!0){let b={...f};if(f.id!=null)b.id=String(f.id);return b}let m={},p=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],g=d.denormalize??{},w=s._relations;for(let b of p){let h=x(b),T=f[h]??f[b];if(T!==void 0){m[h]=T;continue}let A=g[b]??g[h];if(A){m[h]=Vn(w,A);continue}m[h]=void 0}if(f.id!=null)m.id=String(f.id);return m};if(typeof a==="string"&&!X.has(a)){let u=s._attributes;if(u&&Object.prototype.hasOwnProperty.call(u,a))return u[a];let l=s._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let f=l[a];if(Array.isArray(f))return f.map((m)=>R(m,t));return f&&typeof f==="object"?R(f,t):f}let d=Qn[a];if(d){let p=s._definition?.__traitMethods?.[d.bag]?.[a];if(typeof p==="function")return d.mode==="model"?(...g)=>p(i,...g):(...g)=>p(s.id,...g)}if(u){let f=x(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f))return u[f]}}let c=Reflect.get(s,a,s);return typeof c==="function"?c.bind(s):c},set(o,a,i,s){let c=o;if(typeof a==="string"&&!X.has(a)){let{_attributes:u,set:l}=c;if(u&&Object.prototype.hasOwnProperty.call(u,a)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}if(u){let d=x(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d)){if(typeof l==="function")l.call(c,d,i);else u[d]=i;return!0}}if(u&&!(a in c)){if(typeof l==="function")l.call(c,a,i);else u[a]=i;return!0}}return Reflect.set(c,a,i,s)},has(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return!0;let c=i._relations;if(c&&Object.prototype.hasOwnProperty.call(c,a))return!0;if(s){let u=x(a);if(u!==a&&Object.prototype.hasOwnProperty.call(s,u))return!0}}return Reflect.has(i,a)},deleteProperty(o,a){let i=o;if(typeof a==="string"&&!X.has(a)){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return delete s[a],!0}return Reflect.deleteProperty(i,a)},ownKeys(o){let i=o._attributes;return i?Object.keys(i):[]},getOwnPropertyDescriptor(o,a){let i=o;if(typeof a==="string"){let s=i._attributes;if(s&&Object.prototype.hasOwnProperty.call(s,a))return{configurable:!0,enumerable:!0,value:s[a],writable:!0}}return Object.getOwnPropertyDescriptor(i,a)}})}var zn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Hn={paginate:Nn,simplePaginate:qn,cursorPaginate:Bn},ct=Symbol.for("stacks.queryBuilderProxy");function ht(e,t){if(!e||typeof e!=="object")return e;if(e[ct])return e;return new Proxy(e,{get(n,r,o){if(r===ct)return!0;let a=Reflect.get(n,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:d,page:f}=we(i[0],i[1]);s=[d,f]}else if(c==="cursorPaginate"){let{perPage:d,cursor:f}=he(i[0],i[1]);s=[d,f,i[2],i[3]]}let u=a.apply(n,s),l=(d)=>{if(zn.has(c)){if(Array.isArray(d))return d.map((m)=>R(m,t));let f=Hn[c];if(f&&d&&Array.isArray(d.data)){let m=d.data.map((g)=>R(g,t)),p=f({...d,data:m});return ke(p)}if(d&&Array.isArray(d.data))return{...d,data:d.data.map((m)=>R(m,t))};return R(d,t)}if(d&&typeof d==="object"&&typeof d.get==="function")return ht(d,t);return d};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Gn(e,t){let n=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of n){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s),u=(l)=>Array.isArray(l)?l.map((d)=>R(d,t)):R(l,t);if(c&&typeof c.then==="function")return c.then(u);return u(c)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let i=e[a];if(typeof i!=="function")continue;e[a]=function(...s){let c=i.apply(this,s);return ht(c,t)}}}class kt extends Error{model;id;constructor(e,t){super(t!=null?`[ORM] ${e} not found for id=${String(t)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=t}}class Ae extends Error{model;attribute;reason;constructor(e,t,n){let r=n==="guarded"?`'${t}' is marked guarded`:`'${t}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=t,this.reason=n}}var Jn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,t,n={}){if(n.force)return t;if(!t||typeof t!=="object"||Array.isArray(t))return t;let r=e.attributes;if(!r)return t;let o=new Set,a=new Set,i=new Set;for(let[c,u]of Object.entries(r)){let l=x(c);if(o.add(l),u?.fillable===!0)a.add(l);if(u?.guarded===!0)i.add(l)}let s=a.size>0?a:o;for(let c of Object.keys(t)){let u=x(c);if(Jn.has(u))continue;if(i.has(u))throw new Ae(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new Ae(e.name,c,"not-fillable")}return t}async function Pe(e,t){let n=e.set;if(!n||typeof n!=="object")return t;let r={...t};for(let[o,a]of Object.entries(n)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){k.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Yn(e,t){let n=t.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working where(): the underlying query builder did not expose one`);return l}function a(u){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} needs a working find(): the underlying query builder did not expose one`);return l}function i(u){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${t.name}.${u} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){k.debug(`[orm] ${t.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}W(t,l);let d=await Pe(t,l);await o("update").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==null)throw Error(`[ORM] ${t.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.forceUpdate requires a data object as the second argument`);let d=await Pe(t,l);await o("forceUpdate").call(e,n,u).update(d);let f=e.find;return typeof f==="function"?await f.call(e,u):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(u){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let d=await l.call(e);if(d&&typeof d.forceFill==="function"&&typeof d.save==="function")return d.forceFill(u),await d.save()??d}if(typeof r!=="function")throw Error(`[ORM] ${t.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${t.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,n,u).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(u){let l=await a("findOrFail").call(e,u);if(l==null)throw new kt(t.name,u);return l};if(typeof e.exists!=="function")e.exists=async function(u){if(u==null)return!1;let l=o("exists").call(e,n,u);if(typeof l.count==="function"){let f=await l.count();return Number(f)>0}let d=e.find;return typeof d==="function"?await d.call(e,u)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(u,l={}){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.firstOrCreate requires a where-attrs object`);let d=o("firstOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f)return f;let m={...u,...l};return W(t,m),await i("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(u,l){if(!u||typeof u!=="object"||Array.isArray(u))throw Error(`[ORM] ${t.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${t.name}.updateOrCreate requires a values object`);let d=o("updateOrCreate").call(e,u),f=typeof d.first==="function"?await d.first():await d;if(f){W(t,l);let p=f[n];await o("updateOrCreate").call(e,n,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...f,...l}}let m={...u,...l};return W(t,m),await i("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let u=e;if(typeof u.query==="function"){let f=u.query();if(typeof f?.count==="function"){let m=await f.count();return Number(m)||0}}let{all:l,get:d}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof d==="function")return(await d.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(u){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((f)=>f?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="string")throw Error(`[ORM] ${t.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${t.name}.whereIn requires an array of values`);if(l.length===0)return[];let d=e.where;if(typeof d!=="function")return[];let f=d.call(e,u,"in",l);if(f&&typeof f.get==="function")return await f.get();return await f};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(d="created_at"){let f=e,m=typeof f.query==="function"?f.query():f;if(typeof m?.orderBy==="function"){let b=m.orderBy(d,l);if(typeof b.first==="function")return await b.first();if(typeof b.get==="function")return(await b.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((b,h)=>{let T=b?.[d],A=h?.[d];if(T===A)return 0;return(T>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=St(t.traits?.useSearch,t);if(c){let u=c.index??t.table??x(`${t.name}s`);if(typeof e.search!=="function")e.search=function(l,d){return er(e,u,l,d,c.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let d=e.all;if(typeof d!=="function")throw Error(`[ORM] ${t.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:f}=await import("@stacksjs/search-engine"),m=f(),p=0,g=e.query;if(typeof g==="function")try{let h=g.call(e);if(h&&typeof h.chunk==="function")return await h.chunk(l,async(T)=>{let A=await xe(T,c);if(A.length>0)await m.addDocuments(u,A);p+=A.length}),p}catch{}let w=await d.call(e)||[],b=await xe(w,c);if(b.length>0)await m.addDocuments(u,b);return b.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=l();if(typeof d.deleteAllDocuments==="function"){await d.deleteAllDocuments(u);return}let f=e.all,m=typeof f==="function"?await f.call(e)||[]:[],p=l();for(let g of m){let w=g?.id??g?._attributes?.id;if(w!=null)await p.deleteDocument(u,Number(w))}}}}async function xe(e,t){if(e.length===0)return[];if(typeof t.shapeMany==="function"){let r=await t.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>Zn(r,t)))).filter(Boolean)}function _t(e){let t=new Set,n=e.attributes??{};for(let[r,o]of Object.entries(n))if(o?.hidden)t.add(r);return t}function Xn(e,t){if(!e||t.size===0)return e;let n={};for(let[r,o]of Object.entries(e))if(!t.has(r))n[r]=o;return n}async function Zn(e,t){if(typeof t.shape==="function")try{return await t.shape(e)}catch{return}let n=e?.toSearchableObject?.();if(n!==void 0)return n;return Xn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),t.hidden??new Set)}function er(e,t,n,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:n,...a,...r??{}},s={with(c){return i={...i,...c},s},where(c){return i={...i,filter:c},s},async get(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return(await c().search(t,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=await l().search(t,{...i,limit:c,offset:(u-1)*c});return{hits:f.hits??[],total:Number(f.estimatedTotalHits??f.nbHits??f.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(t,i)}};return s}function Tt(e){let t=x(e);return t===e?[e]:[e,t]}async function Se(e,t){if(!e||typeof e!=="object")return;let n=e._attributes??e;for(let r of t)for(let o of Tt(r)){if(!(o in n))continue;let a=n[o];if(!j(a))continue;n[o]=await re(a)}}function tr(e,t){if(t.length===0)return;let n=async(s)=>{if(Array.isArray(s)){for(let c of s)await Se(c,t);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Se(c,t);return s}if(s)await Se(s,t);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let s of o){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(...u){let l=await c.apply(this,u);return await n(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let d=await c.call(this,u,l);return await n(d)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let c=s;if(c.__stacksEncryptedReads)return s;for(let u of a){let l=c[u];if(typeof l!=="function")continue;c[u]=async function(...d){return await n(await l.apply(this,d))}}for(let u of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=c[u];if(typeof l!=="function")continue;c[u]=function(...d){return i(l.apply(this,d))}}return Object.defineProperty(c,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let c=e[s];if(typeof c!=="function")continue;e[s]=function(...u){return i(c.apply(this,u))}}}function nr(e,t){if(t.length===0)return;let n=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let i of t)for(let s of Tt(i))if(s in a)a[s]=await ne(a[s]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...i){if(i[0]=await n(i[0]),i[1])i[1]=await n(i[1]);return await a.apply(this,i)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(i,s){let c=await n(s);return await a.call(this,i,c)}}}function rr(e,t){let n=e.create;if(typeof n==="function")e.create=async function(r,...o){W(t,r);let a=await Pe(t,r);return await n.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function or(e,t){let n=String(t?.name??e.name??"Model"),r=(i,s)=>{if(Ln())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=We(i,t,s);if(!c.valid)throw new bt(n,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(i,...s){return r(i,"creating"),await o.call(this,i,...s)};let a=e.update;if(typeof a==="function")e.update=async function(i,s,...c){return r(s,"updating"),await a.call(this,i,s,...c)}}function ar(e,t){let n=["create","firstOrCreate","updateOrCreate"];for(let o of n){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(k.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=st(i[0],t,"set");return await a.apply(this,i)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let i=a&&typeof a==="object"&&!Array.isArray(a)?st(a,t,"set"):a;return await r.call(this,o,i)}}var lt=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith"]);function Rt(e){k.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!lt.has(g))k.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...lt].sort().join(", ")}.`);let t=ir(e),n=ur(e),r=sr(t,n),o=cr(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,c=In(i);if(Gn(c,e.casts),Yn(c,i),rr(c,i),e.casts&&Object.keys(e.casts).length>0)ar(c,e.casts);let u=oe(e);if(u.length>0)nr(c,u),tr(c,u);let l=e.traits?.useSoftDeletes;if(l)lr(c,i,l);let d=e.traits?.useAudit;if(d){let g=Ie(d);je(c,e.name,e.primaryKey||"id",g)}let f=ot(e.traits?.useActivityLog);if(f)at(c,e.name,e.primaryKey||"id",f,[..._t(e)]);or(c,i);let m=c;m.withoutValidation=function(g){return Un(g)},m.withoutEvents=function(g){return D(g)};for(let g of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=c[g];if(typeof w!=="function")continue;let b=`${g}Quietly`;if(typeof c[b]==="function")continue;c[b]=function(...h){return D(()=>w.apply(c,h))}}let p=Object.assign(c,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return jn(e.name,p),Object.defineProperty(p,Oe,{value:e,enumerable:!1,configurable:!0}),p}function ir(e){let t=e.traits?.observe;if(!t)return;let n=e.name.toLowerCase(),r=(f)=>{let m=f?.attributes;if(!m||typeof m!=="object")return f;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&f[p]!==void 0)g[p]=f[p];return g},o=async(f,m)=>{if(M())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(f,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(f,m)=>{if(!s)return;if(M())return;try{let p=a(m),g=Array.isArray(p)?p:[p],w=i(m),h=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof h!=="function")return;for(let T of g){if(typeof T!=="string"||T.length===0)continue;await h(T,f,w)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${f}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(f,m)=>{if(M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(f,m);if(Array.isArray(g)&&g.some((w)=>w===!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 '${f}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=t===!0?["create","update","delete"]:Array.isArray(t)?t:[],d={};if(l.includes("create"))d.beforeCreate=async(f)=>{if(k.debug(`[orm] Create ${n}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:creating`,f))throw Error(`[ORM] ${n}:creating event cancelled the operation`)},d.afterCreate=async(f)=>{let m=r(f);await o(`${n}:created`,m),await o(`${n}:saved`,m),await c(`${n}:created`,f)};if(l.includes("update"))d.beforeUpdate=async(f)=>{if(k.debug(`[orm] Update ${n}#${f?.id??"unknown"}`,f),!await u(`${n}:saving`,f))throw Error(`[ORM] ${n}:saving event cancelled the operation`);if(!await u(`${n}:updating`,f))throw Error(`[ORM] ${n}:updating event cancelled the operation`)},d.afterUpdate=async(f)=>{let m=r(f);await o(`${n}:updated`,m),await o(`${n}:saved`,m),await c(`${n}:updated`,f)};if(l.includes("delete"))d.beforeDelete=async(f)=>{if(k.debug(`[orm] Delete ${n}#${f?.id??"unknown"}`),!await u(`${n}:deleting`,f))throw Error(`[ORM] ${n}:deleting event cancelled the operation`)},d.afterDelete=async(f)=>{await o(`${n}:deleted`,r(f)),await c(`${n}:deleted`,f)};return d}function sr(...e){let t={},n=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))n.add(o)}for(let r of n){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;t[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(t).length?t:void 0}function St(e,t){if(!e)return null;let n=e===!0?{}:typeof e==="object"?{...e}:null;if(!n)return null;if(t)n.hidden=_t(t);return n}function ur(e){let t=St(e.traits?.useSearch,e);if(!t)return;let n=t,r=n.index??e.table??x(`${e.name}s`);async function o(s){if(typeof n.shapeMany==="function")try{let[l]=await xe([s],n);return l}catch(l){k.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof n.shape==="function")try{return await n.shape(s)}catch(l){k.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=R(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(M())return;let c=await o(s);if(!c)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await ft(r,c,e.name)}return}await ft(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(M())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(t.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){k.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await pt(r,Number(c),e.name)}return}await pt(r,Number(c),e.name)}}}var dt=new Map;function At(e,t){let n=dt.get(e)??0;if(dt.set(e,n+1),n===0)k.warn(`[orm/search] ${t}`);else if(n===9)k.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function ft(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,t)}catch(r){At(`index:${n}`,`Failed to index ${n}: ${r.message}`)}}async function pt(e,t,n){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,t)}catch(r){At(`remove:${n}`,`Failed to remove ${n}#${t}: ${r.message}`)}}function cr(e){let t={},{table:n,traits:r}=e;if(!r)return t;if(r.taggable)t._taggable=de(n);if(r.categorizable)t._categorizable=fe(n);if(r.commentable)t._commentable=ce(n);if(r.billable)t._billable=Ge(n);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;t._likeable=pe(n,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)t._twoFactor=Je();return t}function lr(e,t,n){let r=Ye(e,t.primaryKey||"id"),o=Xe(n),a=t,i=t.name.toLowerCase(),s=t.traits?.observe!=null&&t.traits?.observe!==!1,c=async(m)=>{if(!s||M())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${i}:restoring`,{id:m});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||M())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${i}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",d=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await K(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await K(a,o,m,"softDelete");return g})},f=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let b=await r.restore(m);if(b){if(o.cascade?.length)await K(a,o,m,"restore");await u(m)}return b}let{db:g}=await import("@stacksjs/database"),w=await g.transaction(async()=>{let b=await r.restore(m);if(b)await K(a,o,m,"restore");return b});if(w)await u(m);return w};e.softDelete=d,e.restore=f,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=d}function dr(e){if(e==null)return e;if(Array.isArray(e))return e.map((n)=>dr(n));if(typeof e!=="object")return e;let t=e;if(typeof t.toJSON==="function")return t.toJSON();if(t._attributes&&typeof t._attributes==="object")return t._attributes;return e}var fr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],pr=["traits","dashboard"];function mr(e){let t=e?.[Oe];if(t&&typeof t==="object")return t;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function yr(e,t){let n=Array.isArray(e)?e:[],r=Array.isArray(t)?t:[];if(!n.length&&!r.length)return;return[...new Set([...n,...r])]}function gr(e){if(!e)return 0;return Object.values(e).reduce((t,n)=>{let r=Number(n?.order);return Number.isFinite(r)&&r>t?r:t},0)}function br(e,t){let n={...e,...t},r=e.attributes??{},o=t.attributes??{};if(t.attributes){let a=gr(r),i=Object.fromEntries(Object.entries(o).map(([s,c])=>{let u=!(s in r),l=Number.isFinite(Number(c?.order));if(u&&!l)return[s,{...c,order:++a}];return[s,c]}));n.attributes={...r,...i}}for(let a of fr){let i=yr(e[a],t[a]);if(i)n[a]=i}for(let a of pr){let i=e[a],s=t[a];if(i&&s&&typeof i==="object"&&typeof s==="object")n[a]={...i,...s}}return n}function ps(e,t){return Rt(br(mr(e),t))}import Ar from"process";import{log as Pr}from"@stacksjs/logging";import{path as S}from"@stacksjs/path";import{fs as Q}from"@stacksjs/storage";import{Database as wr}from"bun:sqlite";import{existsSync as hr,readdirSync as kr,readFileSync as _r}from"fs";function Tr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Rr(e,t){let n=e.toUpperCase();if(n.includes("BOOL"))return t==="postgres"?"boolean":"number";if(n.includes("DATE")||n.includes("TIME"))return"string";if(n.includes("INT"))return"number";if(n.includes("CHAR")||n.includes("CLOB")||n.includes("TEXT"))return"string";if(n.includes("REAL")||n.includes("FLOA")||n.includes("DOUB")||n.includes("NUMERIC")||n.includes("DEC"))return"number";if(n.includes("BLOB"))return"Uint8Array";return"unknown"}function Sr(e,t){try{return e.exec(t),{ok:!0}}catch(n){if(/CREATE\s+TRIGGER/i.test(t))return{ok:!1,error:n.message};let r=0;for(let o of t.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:n.message}}}function Pt(e,t="sqlite"){let n=[];if(!hr(e))return{tables:[],errors:n};let r;try{r=kr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new wr(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=_r(c,"utf-8")}catch(d){n.push({file:c,error:d.message});continue}let l=Sr(o,u);if(!l.ok)n.push({file:c,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!Tr(s)),i=[];for(let s of a){let c=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(c.length===0)continue;let u={};for(let l of c){let d=Rr(l.type??"",t),f=l.notnull===0&&l.pk===0;u[l.name]=f&&d!=="unknown"?`${d} | null`:d}i.push({table:s,columns:u})}return{tables:i,errors:n}}finally{o.close()}}function xr(e){if(e)return e;let t=String(Ar.env.DB_CONNECTION??"").toLowerCase();return t==="postgres"||t==="mysql"?t:"sqlite"}function Z(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Or(e,t){let n=e.default;if(typeof n==="boolean")return Z(t);if(typeof n==="number")return"number";if(typeof n==="string")return"string";return"unknown"}function Cr(e){let t=e.validation;if(!t||typeof t!=="object")return null;let n=t.rule;return n&&typeof n==="object"?n:null}function vr(e){if(!e||String(e.name??"")!=="enum")return null;let n=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return n.length>0?n.join(" | "):null}function Dr(e,t){let n=Cr(e),r=vr(n);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(n?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return Z(t);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Or(e,t)}})();return e.nullable===!0?`${a} | null`:a}function Mr(e){let t={},n=e.belongsTo;if(!n)return t;let r=Array.isArray(n)?n:Object.values(n);for(let o of r){if(typeof o==="string"){t[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){t[a.foreignKey]="number";continue}if(typeof a.model==="string")t[`${O(a.model)}_id`]="number"}}return t}function Er(e,t){let[n,r]=[O(e),O(t)].sort();return`${n}_${r}`}function Fr(e,t){let n=e.default,r=typeof n==="string"?"string":typeof n==="number"?"number":typeof n==="boolean"?Z(t):n instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function $r(e,t,n){let r=t.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,d={},f=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let b=i;if(s=b.model,"pivotTable"in b||"firstForeignKey"in b||"secondForeignKey"in b)c=b.pivotTable,u=b.firstForeignKey,l=b.secondForeignKey;else{let h=i;c=h.table,u=h.foreignKey,l=h.relatedKey,d=h.pivot?.columns??{},f=Boolean(h.pivot?.timestamps)}}else continue;let m=c??Er(e,s),p=u??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[p]:"number",[g]:"number"};for(let[b,h]of Object.entries(d))w[b]=Fr(h,n);if(f)w.created_at="string",w.updated_at="string | null";o.push({table:m,columns:w})}return o}function Ir(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Z(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function jr(e,t){let n={id:"number"},r=e.traits??{};if(r.useUuid)n.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)n.created_at="string",n.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)n.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(n,Ir(t));return n}function Br(e,t){let n={},r=e.attributes??{};for(let[o,a]of Object.entries(r))n[O(o)]=Dr(a,t);return n}function xt(e,t,n=2){let r=" ".repeat(n),o=" ".repeat(n+1),a=Object.entries(t).map(([s,c])=>`${o}${s}: ${c}`).join(`
|
|
3
|
+
`),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
|
6
|
-
${r}}`}var
|
|
6
|
+
${r}}`}var Nr=`/* 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
|
+
`,qr=` }
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export {}
|
|
17
|
-
`,
|
|
18
|
-
`;function
|
|
19
|
-
`),m=`${
|
|
20
|
-
${
|
|
21
|
-
`);return`${
|
|
22
|
-
${wt(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 kt(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 te(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await kt(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 kt(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var C={},_t=()=>{},es=new Promise((e)=>{_t=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=C[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=C[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=C[e];return r==null?!1:(t in r)},apply(n,t,r){let o=C[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 te("User");if(n)C.User=n;if(e("queue")){let t=await te("Job");if(t)C.Job=t;let r=await te("FailedJob");if(r)C.FailedJob=r}for(let[t,r,o]of Dr){if(!e(o))continue;let a=await te(t,r);if(a)C[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{_t()}});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"),Tt={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},I=globalThis;for(let[e,n]of Object.entries(Tt))if(n&&I[e]===void 0)I[e]=n;var ts=Object.keys(Tt);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(I.safeAll===void 0)I.safeAll=wa;if(I.safeGet===void 0)I.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,Oe as MODEL_DEFINITION,mo as MagicLinkToken,Eo as MailPreference,Fo as Manufacturer,Pe as MassAssignmentException,yo as Menu,go as MenuItem,lt as ModelNotFoundError,st 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,ae as collectEncryptedAttributes,$e as createAuditMethods,pe as createCategorizableMethods,le as createCommentableMethods,me as createLikeableMethods,fe as createTaggableMethods,en as customerOwnership,ci as db,oe as decryptValue,ft as defineModel,re as encryptValue,_e as enrichPaginatorUrls,Ui as extendModel,Wt as filterFillable,Ra as getPrunableConfig,Qt as getWritableFields,Ss as isCursorPaginator,j as isEncrypted,Rs as isPaginator,Ps as isSimplePaginator,Ue as isUniqueViolation,Lt as mapWriteError,Sa as massPrunable,Yn as mergeModelDefinition,ts as modelGlobalNames,es as ormReady,on as parentOwnership,We as parseCursor,xe as projectDocumentsFromTrait,Rt as prunable,Rr as renderDatabaseTypeFile,ke as resolveCursorArgs,he 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,v as withoutEvents,_n as withoutValidation};
|
|
17
|
+
`,Lr="/* 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",Ur=`}
|
|
18
|
+
`;function Ot(e){return e==="framework"?Lr:Nr}function Ct(e){return e==="framework"?Ur:qr}async function vt(e,t,n=[]){let r=[];if(!Q.existsSync(e))return r;let o=Q.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=S.join(e,a.name);if(a.isDirectory()){if(t){let s=await vt(i,!0,n);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(S.isAbsolute(i)?import(i):import(S.resolve(i))),c=s.default||s;if(c?.name&&(c.attributes||c.table))r.push({filePath:i,model:c})}catch(s){n.push({file:i,error:s.message})}}return r}async function Kr(e={}){let t=xr(e.dialect),n=e.modelsDir??S.userModelsPath(),r=e.defaultsDir??S.frameworkPath("defaults/app/Models"),o=e.outFile??S.projectPath("database/types.d.ts"),a=[],i=[];for(let[p,g]of[[n,!1],[r,!0]])try{let w=await vt(p,g,a);i.push(...w)}catch(w){a.push({file:p,error:w.message})}let s=new Map;for(let p of i)s.set(p.model.name??S.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of i)if(p.filePath.startsWith(n))s.set(p.model.name??S.basename(p.filePath).replace(/\.ts$/,""),p);let c=[];for(let[p,{model:g}]of s){let w=g.table??`${O(p)}s`,b={...jr(g,t),...Br(g,t),...Mr(g)};c.push({table:w,model:p,columns:b})}let u=new Map;for(let[p,{model:g}]of s)for(let w of $r(p,g,t)){if(u.has(w.table))continue;u.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(c.push(...u.values()),e.migrationsDir!==!1){let p=e.migrationsDir??S.resolve(S.dirname(o),"migrations"),g=new Set(c.map((b)=>b.table)),w=Pt(p,t);for(let b of w.tables){if(g.has(b.table))continue;g.add(b.table),c.push({table:b.table,model:`(${b.table} migration)`,columns:b.columns})}a.push(...w.errors)}c.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",d=l==="framework"?1:2,f=c.map((p)=>xt(p.table,p.columns,d)).join(`
|
|
19
|
+
`),m=`${Ot(l)}${f}
|
|
20
|
+
${Ct(l)}`;if(!e.dryRun){let p=S.dirname(o);if(!Q.existsSync(p))Q.mkdirSync(p,{recursive:!0});Q.writeFileSync(o,m,"utf-8"),Pr.success(`[generate:db-types] wrote ${c.length} table(s) to ${o}`)}return{outFile:o,tables:c,errors:a,content:m}}function Wr(e,t="app"){let n=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>xt(r.table,r.columns,t==="framework"?1:2)).join(`
|
|
21
|
+
`);return`${Ot(t)}${n}
|
|
22
|
+
${Ct(t)}`}import{isCursorPaginator as Js,isPaginator as Ys,isSimplePaginator as Xs,toCursorPaginator as Zs,toPaginator as eu,toSimplePaginator as tu}from"@stacksjs/pagination";import{configureOrm as Qr}from"@stacksjs/query-builder";function Vr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Qr({database:e})}catch{}}Vr();async function Dt(e){for(let t=0;;t++){let n=await import(e);try{return n.default}catch(r){if(t<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ee(e,t=[""]){let{path:n}=await import("@stacksjs/path"),r=n.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Dt(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of t){let a=o?`${o}/`:"",i=n.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Dt(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var C={},Mt=()=>{},Ps=new Promise((e)=>{Mt=e});function y(e){return new Proxy(function(){},{get(t,n){if(n==="then")return;let r=C[e];if(r==null)return;let o=r[n];return typeof o==="function"?o.bind(r):o},set(t,n,r){let o=C[e];if(o==null)return!1;return o[n]=r,!0},has(t,n){let r=C[e];return r==null?!1:(n in r)},apply(t,n,r){let o=C[e];if(o==null||typeof o!=="function")return;return o.apply(n,r)}})}var zr=y("User"),Hr=y("Job"),Gr=y("FailedJob"),Jr=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),t=await ee("User");if(t)C.User=t;if(e("queue")){let n=await ee("Job");if(n)C.Job=n;let r=await ee("FailedJob");if(r)C.FailedJob=r}for(let[n,r,o]of Jr){if(!e(o))continue;let a=await ee(n,r);if(a)C[n]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Mt()}});var Yr=y("Activity"),Xr=y("AnalyticsEvent"),Zr=y("Automation"),eo=y("AutomationRun"),to=y("Auction"),no=y("CampaignVariant"),ro=y("CommunicationSuppression"),oo=y("ConsentEvent"),ao=y("SenderDomain"),io=y("UsageEvent"),so=y("AuctionItem"),uo=y("Author"),co=y("Bid"),lo=y("Board"),fo=y("BoardColumn"),po=y("Campaign"),mo=y("Card"),yo=y("CardComment"),go=y("Cart"),bo=y("CartItem"),wo=y("Category"),ho=y("Comment"),ko=y("Coupon"),_o=y("Customer"),To=y("DeliveryRoute"),Ro=y("DeliveryStop"),So=y("Deployment"),Ao=y("DigitalDelivery"),Po=y("Courier"),xo=y("CourierPing"),Oo=y("CampaignSend"),Co=y("EmailList"),vo=y("EmailListSubscriber"),Do=y("Form"),Mo=y("FormField"),Eo=y("FormSubmission"),Fo=y("MagicLinkToken"),$o=y("Menu"),Io=y("MenuItem"),jo=y("PageRevision"),Bo=y("Pledge"),No=y("Redirect"),qo=y("Site"),Lo=y("SiteDomain"),Uo=y("SmsOptOut"),Ko=y("EmailIdempotency"),Wo=y("EmailSuppression"),Qo=y("EmailWebhookEvent"),Vo=y("Error"),zo=y("GiftCard"),Ho=y("Label"),Go=y("LicenseKey"),Jo=y("Log"),Yo=y("LoyaltyPoint"),Xo=y("LoyaltyReward"),Zo=y("MailPreference"),ea=y("Manufacturer"),ta=y("Notification"),na=y("NotificationDelivery"),ra=y("Order"),oa=y("OrderIdempotency"),xs=y("PersonalAccessToken"),aa=y("OrderItem"),ia=y("Page"),sa=y("Payment"),ua=y("PaymentMethod"),ca=y("PaymentProduct"),la=y("PaymentTransaction"),da=y("Post"),fa=y("PrintDevice"),pa=y("Product"),ma=y("ProductUnit"),ya=y("ProductVariant"),ga=y("QueryLog"),ba=y("Receipt"),wa=y("Release"),ha=y("Request"),ka=y("Review"),_a=y("ShippingMethod"),Ta=y("ShippingRate"),Ra=y("ShippingZone"),Sa=y("SocialPost"),Aa=y("SocialAccount"),Pa=y("Subscriber"),xa=y("SubscriberEmail"),Oa=y("Subscription"),Ca=y("Tag"),va=y("TaxRate"),Da=y("Team"),Ma=y("TeamInvitation"),Ea=y("TeamMember"),Fa=y("Transaction"),$a=y("WaitlistProduct"),Ia=y("WaitlistRestaurant"),ja=y("Websocket"),Et={User:zr,Job:Hr,FailedJob:Gr,Activity:Yr,AnalyticsEvent:Xr,Automation:Zr,AutomationRun:eo,Auction:to,AuctionItem:so,Author:uo,Bid:co,Board:lo,BoardColumn:fo,Campaign:po,CampaignSend:Oo,CampaignVariant:no,Card:mo,CardComment:yo,Cart:go,CartItem:bo,Category:wo,Comment:ho,Coupon:ko,Customer:_o,CommunicationSuppression:ro,ConsentEvent:oo,DeliveryRoute:To,DeliveryStop:Ro,Deployment:So,DigitalDelivery:Ao,Courier:Po,CourierPing:xo,EmailList:Co,EmailListSubscriber:vo,EmailIdempotency:Ko,EmailSuppression:Wo,EmailWebhookEvent:Qo,ErrorModel:Vo,Form:Do,FormField:Mo,FormSubmission:Eo,GiftCard:zo,Label:Ho,LicenseKey:Go,Log:Jo,LoyaltyPoint:Yo,LoyaltyReward:Xo,MailPreference:Zo,Manufacturer:ea,Notification:ta,MagicLinkToken:Fo,Menu:$o,MenuItem:Io,NotificationDelivery:na,Order:ra,OrderIdempotency:oa,OrderItem:aa,Page:ia,PageRevision:jo,Payment:sa,PaymentMethod:ua,PaymentProduct:ca,PaymentTransaction:la,Pledge:Bo,Post:da,PrintDevice:fa,Product:pa,ProductUnit:ma,ProductVariant:ya,QueryLog:ga,Receipt:ba,Release:wa,Request:ha,Review:ka,ShippingMethod:_a,Redirect:No,SenderDomain:ao,ShippingRate:Ta,ShippingZone:Ra,Site:qo,SiteDomain:Lo,SmsOptOut:Uo,SocialAccount:Aa,SocialPost:Sa,Subscriber:Pa,SubscriberEmail:xa,Subscription:Oa,Tag:Ca,TaxRate:va,Team:Da,TeamInvitation:Ma,TeamMember:Ea,Transaction:Fa,UsageEvent:io,WaitlistProduct:$a,WaitlistRestaurant:Ia,Websocket:ja},I=globalThis;for(let[e,t]of Object.entries(Et))if(t&&I[e]===void 0)I[e]=t;var Os=Object.keys(Et);async function Ba(e){if(!e)return[];try{if(typeof e.all==="function"){let t=await e.all();return Array.isArray(t)?t:[]}if(typeof e.get==="function"){let t=await e.get();return Array.isArray(t)?t:[]}}catch{}return[]}function Na(e,t,n=""){if(!e)return n;try{if(typeof e.get==="function"){let o=e.get(t);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[t];return r!==void 0&&r!==null?r:n}if(I.safeAll===void 0)I.safeAll=Ba;if(I.safeGet===void 0)I.safeGet=Na;export{Yr as Activity,Xr as AnalyticsEvent,to as Auction,so as AuctionItem,uo as Author,Zr as Automation,eo as AutomationRun,co as Bid,lo as Board,fo as BoardColumn,po as Campaign,Oo as CampaignSend,no as CampaignVariant,mo as Card,yo as CardComment,go as Cart,bo as CartItem,wo as Category,ho as Comment,ro as CommunicationSuppression,oo as ConsentEvent,ko as Coupon,Po as Courier,xo as CourierPing,_o as Customer,To as DeliveryRoute,Ro as DeliveryStop,So as Deployment,Ao as DigitalDelivery,Ko as EmailIdempotency,Co as EmailList,vo as EmailListSubscriber,Wo as EmailSuppression,Qo as EmailWebhookEvent,Vo as ErrorModel,Gr as FailedJob,Do as Form,Mo as FormField,Eo as FormSubmission,zo as GiftCard,Hr as Job,Ho as Label,Go as LicenseKey,Jo as Log,Yo as LoyaltyPoint,Xo as LoyaltyReward,Oe as MODEL_DEFINITION,Fo as MagicLinkToken,Zo as MailPreference,ea as Manufacturer,Ae as MassAssignmentException,$o as Menu,Io as MenuItem,kt as ModelNotFoundError,bt as ModelValidationError,ta as Notification,na as NotificationDelivery,ra as Order,oa as OrderIdempotency,aa as OrderItem,ia as Page,jo as PageRevision,sa as Payment,ua as PaymentMethod,ca as PaymentProduct,la as PaymentTransaction,xs as PersonalAccessToken,Bo as Pledge,da as Post,fa as PrintDevice,pa as Product,ma as ProductUnit,ya as ProductVariant,ga as QueryLog,ba as Receipt,No as Redirect,wa as Release,ha as Request,ka as Review,ao as SenderDomain,_a as ShippingMethod,Ta as ShippingRate,Ra as ShippingZone,qo as Site,Lo as SiteDomain,Uo as SmsOptOut,Aa as SocialAccount,Sa as SocialPost,kn as SubqueryBuilder,Pa as Subscriber,xa as SubscriberEmail,Oa as Subscription,Ca as Tag,va as TaxRate,Da as Team,Ma as TeamInvitation,Ea as TeamMember,Fa as Transaction,io as UsageEvent,zr as User,$a as WaitlistProduct,Ia as WaitlistRestaurant,ja as Websocket,Si as batchLoad,Kr as buildDatabaseSchema,oe as collectEncryptedAttributes,$e as createAuditMethods,fe as createCategorizableMethods,ce as createCommentableMethods,pe as createLikeableMethods,de as createTaggableMethods,fn as customerOwnership,Oi as db,re as decryptValue,Rt as defineModel,ne as encryptValue,ke as enrichPaginatorUrls,ps as extendModel,nn as filterFillable,Wa as getPrunableConfig,tn as getWritableFields,Js as isCursorPaginator,j as isEncrypted,Ys as isPaginator,Xs as isSimplePaginator,Le as isUniqueViolation,Zt as mapWriteError,Ka as massPrunable,br as mergeModelDefinition,Os as modelGlobalNames,Ps as ormReady,gn as parentOwnership,ze as parseCursor,xe as projectDocumentsFromTrait,$t as prunable,Wr as renderDatabaseTypeFile,he as resolveCursorArgs,we as resolvePageArgs,Mi as savepoint,pn as selfOwnership,Kt as setAuditUser,mn as siteOwnership,yn as teamMembershipOwnership,dr as toAttrs,Zs as toCursorPaginator,eu as toPaginator,tu as toSimplePaginator,en as toSnakeCaseKeys,Di as transaction,Ei as transactional,D as withoutEvents,Un as withoutValidation};
|
|
@@ -15,10 +15,12 @@ export default defineModel({
|
|
|
15
15
|
useUuid: true,
|
|
16
16
|
useTimestamps: true,
|
|
17
17
|
useSearch: {
|
|
18
|
-
displayable: ['id', 'title', 'slug', '
|
|
18
|
+
displayable: ['id', 'title', 'slug', 'authorId', 'views', 'status', 'poster', 'focusKeyword', 'metaDescription', 'canonicalUrl'],
|
|
19
19
|
// `content`, not `body` - the column is `content`, and the old spelling
|
|
20
|
-
// silently indexed nothing. `comments` likewise was never a column
|
|
21
|
-
|
|
20
|
+
// silently indexed nothing. `comments` likewise was never a column, and
|
|
21
|
+
// nor was `author`: the column is `author_id`, which is worth showing and
|
|
22
|
+
// filtering on but is not free text to search.
|
|
23
|
+
searchable: ['title', 'slug', 'content', 'excerpt', 'focusKeyword', 'metaDescription'],
|
|
22
24
|
sortable: ['published_at', 'views'],
|
|
23
25
|
filterable: ['status'],
|
|
24
26
|
},
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { defineModel, selfOwnership } from '@stacksjs/orm'
|
|
2
|
+
import { schema } from '@stacksjs/validation'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A named API token belonging to a user - the Sanctum shape.
|
|
6
|
+
*
|
|
7
|
+
* Maps the table the auth layer already owns rather than introducing a second
|
|
8
|
+
* one. `@stacksjs/auth` issues these through `createToken(userId, name, scopes)`
|
|
9
|
+
* and checks them with `tokenCan` / `tokenCanAll` / `tokenAbilities`; what was
|
|
10
|
+
* missing was the model, so `User.hasMany('PersonalAccessToken')` named
|
|
11
|
+
* something real and a token list could be queried, related and exposed like
|
|
12
|
+
* any other row.
|
|
13
|
+
*
|
|
14
|
+
* `oauth_access_tokens` is created by `ensureAuthTables()` rather than by a
|
|
15
|
+
* migration, the same as `notifications` - which is why nothing here declares
|
|
16
|
+
* columns the auth layer does not already define.
|
|
17
|
+
*
|
|
18
|
+
* The token column holds a HASH, never the plaintext: `createToken` returns the
|
|
19
|
+
* plaintext once, to the caller, and it is not recoverable afterwards. It is
|
|
20
|
+
* `hidden` so it cannot leave through a serialised response, and `guarded` so
|
|
21
|
+
* no mass assignment can set it.
|
|
22
|
+
*/
|
|
23
|
+
export default defineModel({
|
|
24
|
+
name: 'PersonalAccessToken',
|
|
25
|
+
table: 'oauth_access_tokens',
|
|
26
|
+
primaryKey: 'id',
|
|
27
|
+
autoIncrement: true,
|
|
28
|
+
|
|
29
|
+
traits: {
|
|
30
|
+
useTimestamps: true,
|
|
31
|
+
// Deliberately no `useApi`.
|
|
32
|
+
//
|
|
33
|
+
// Minting and revoking both have semantics a generic CRUD route does not
|
|
34
|
+
// carry. `createToken` returns the plaintext exactly once, so a generic
|
|
35
|
+
// `store` would write a row nobody holds the token for; and revocation has
|
|
36
|
+
// to take the paired refresh token with it (stacksjs/stacks#2306), which a
|
|
37
|
+
// row delete does not. `@stacksjs/auth` owns both operations.
|
|
38
|
+
//
|
|
39
|
+
// It also keeps the write surface honest: row scoping compares ONE field,
|
|
40
|
+
// and this table's owner is a `tokenable_type` / `tokenable_id` pair - so a
|
|
41
|
+
// generated `destroy` scoped to `tokenable_id` alone would let a user
|
|
42
|
+
// destroy an author's token whenever the two ids happened to match.
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Rows belong to whoever the pair names. Declared even with no generated
|
|
47
|
+
* routes, so adding `useApi` later cannot ship an unscoped write by omission
|
|
48
|
+
* (stacksjs/stacks#2375) - though see the note above about the one field this
|
|
49
|
+
* can express.
|
|
50
|
+
*/
|
|
51
|
+
ownership: selfOwnership('tokenable_id'),
|
|
52
|
+
|
|
53
|
+
// No `belongsTo`: the owner is polymorphic. `tokenable_type` names the
|
|
54
|
+
// owner's table, so a users-only foreign key would be a claim the column no
|
|
55
|
+
// longer makes - and the FK preflight reported exactly that once the legacy
|
|
56
|
+
// `user_id` stopped being the owner.
|
|
57
|
+
attributes: {
|
|
58
|
+
/**
|
|
59
|
+
* The owner: the table it lives in, and its id there.
|
|
60
|
+
*
|
|
61
|
+
* Declared so the generated row type carries them. They are written by
|
|
62
|
+
* `@stacksjs/auth` when a token is minted and never by a caller, so both
|
|
63
|
+
* are guarded - an owner a request could set is an owner a request could
|
|
64
|
+
* change.
|
|
65
|
+
*/
|
|
66
|
+
tokenableType: {
|
|
67
|
+
order: 1,
|
|
68
|
+
guarded: true,
|
|
69
|
+
validation: {
|
|
70
|
+
rule: schema.string().max(255),
|
|
71
|
+
},
|
|
72
|
+
factory: () => 'users',
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
tokenableId: {
|
|
76
|
+
order: 2,
|
|
77
|
+
guarded: true,
|
|
78
|
+
validation: {
|
|
79
|
+
rule: schema.number(),
|
|
80
|
+
},
|
|
81
|
+
factory: () => 1,
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
name: {
|
|
85
|
+
order: 3,
|
|
86
|
+
fillable: true,
|
|
87
|
+
validation: {
|
|
88
|
+
rule: schema.string().max(255),
|
|
89
|
+
},
|
|
90
|
+
factory: faker => `${faker.hacker.noun()}-token`,
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
token: {
|
|
94
|
+
order: 4,
|
|
95
|
+
// The stored hash. Never serialised, never mass-assignable.
|
|
96
|
+
hidden: true,
|
|
97
|
+
guarded: true,
|
|
98
|
+
validation: {
|
|
99
|
+
rule: schema.string(),
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
scopes: {
|
|
104
|
+
order: 5,
|
|
105
|
+
type: 'text',
|
|
106
|
+
fillable: true,
|
|
107
|
+
validation: {
|
|
108
|
+
rule: schema.string(),
|
|
109
|
+
},
|
|
110
|
+
factory: () => JSON.stringify(['*']),
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
revoked: {
|
|
114
|
+
order: 6,
|
|
115
|
+
fillable: true,
|
|
116
|
+
default: false,
|
|
117
|
+
validation: {
|
|
118
|
+
rule: schema.boolean(),
|
|
119
|
+
},
|
|
120
|
+
factory: () => false,
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
expiresAt: {
|
|
124
|
+
order: 7,
|
|
125
|
+
fillable: true,
|
|
126
|
+
validation: {
|
|
127
|
+
rule: schema.string(),
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* What the browser called itself, and where it came from.
|
|
133
|
+
*
|
|
134
|
+
* So a person can recognise their own sessions on a list well enough to
|
|
135
|
+
* revoke one. Untrusted - a client chooses the string - which is why
|
|
136
|
+
* nothing authorises on either.
|
|
137
|
+
*/
|
|
138
|
+
userAgent: {
|
|
139
|
+
order: 8,
|
|
140
|
+
fillable: true,
|
|
141
|
+
validation: {
|
|
142
|
+
rule: schema.string().max(255),
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
|
|
146
|
+
ipAddress: {
|
|
147
|
+
order: 9,
|
|
148
|
+
fillable: true,
|
|
149
|
+
validation: {
|
|
150
|
+
rule: schema.string().max(45),
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
} as const)
|
package/dist/models/User.ts
CHANGED
|
@@ -16,10 +16,10 @@ export default defineModel({
|
|
|
16
16
|
useUuid: true,
|
|
17
17
|
useTimestamps: true,
|
|
18
18
|
useSearch: {
|
|
19
|
-
displayable: ['id', 'cartId', '
|
|
20
|
-
searchable: ['id', 'cartId', '
|
|
19
|
+
displayable: ['id', 'cartId', 'productName', 'productSku', 'quantity', 'unitPrice', 'totalPrice'],
|
|
20
|
+
searchable: ['id', 'cartId', 'productName', 'productSku'],
|
|
21
21
|
sortable: ['createdAt', 'updatedAt', 'quantity', 'unitPrice'],
|
|
22
|
-
filterable: ['cartId', '
|
|
22
|
+
filterable: ['cartId', 'productSku'],
|
|
23
23
|
},
|
|
24
24
|
|
|
25
25
|
useSeeder: {
|
|
@@ -16,10 +16,10 @@ export default defineModel({
|
|
|
16
16
|
useUuid: true,
|
|
17
17
|
useTimestamps: true,
|
|
18
18
|
useSearch: {
|
|
19
|
-
displayable: ['id', 'orderId', 'customerId', 'amount', 'method', 'status', '
|
|
19
|
+
displayable: ['id', 'orderId', 'customerId', 'amount', 'method', 'status', 'createdAt'],
|
|
20
20
|
searchable: ['orderId', 'customerId', 'referenceNumber'],
|
|
21
21
|
sortable: ['amount', 'createdAt'],
|
|
22
|
-
filterable: ['method', 'status', '
|
|
22
|
+
filterable: ['method', 'status', 'createdAt'],
|
|
23
23
|
},
|
|
24
24
|
|
|
25
25
|
useSeeder: {
|
|
@@ -16,9 +16,9 @@ export default defineModel({
|
|
|
16
16
|
useUuid: true,
|
|
17
17
|
useTimestamps: true,
|
|
18
18
|
useSearch: {
|
|
19
|
-
displayable: ['id', 'name', 'email', 'phone', '
|
|
19
|
+
displayable: ['id', 'name', 'email', 'phone', 'quantity', 'notificationPreference', 'source', 'notes', 'status'],
|
|
20
20
|
searchable: ['name', 'email', 'phone', 'source'],
|
|
21
|
-
sortable: ['name', '
|
|
21
|
+
sortable: ['name', 'quantity', 'createdAt', 'updatedAt', 'status'],
|
|
22
22
|
filterable: ['notificationPreference', 'source', 'status'],
|
|
23
23
|
},
|
|
24
24
|
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalise the trait declaration.
|
|
3
|
+
*
|
|
4
|
+
* Returns `null` when the trait is off, so the caller can skip building hooks
|
|
5
|
+
* at all rather than building ones that no-op per write.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveActivityLogOptions(declaration: unknown): ActivityLogOptions | null;
|
|
8
|
+
/**
|
|
9
|
+
* The attributes this row should carry.
|
|
10
|
+
*
|
|
11
|
+
* Hidden attributes are dropped before the selection is applied, not after, so
|
|
12
|
+
* naming one in `logOnly` cannot pull it back in.
|
|
13
|
+
*/
|
|
14
|
+
export declare function selectLoggedProperties(attributes: Record<string, unknown> | null | undefined, options: ActivityLogOptions, hidden?: readonly string[]): Record<string, unknown> | null;
|
|
15
|
+
/** `User 42 was created` - the line a feed shows when nothing else is set. */
|
|
16
|
+
export declare function describeActivity(modelName: string, event: ActivityEvent, id: number | string | null): string;
|
|
17
|
+
/**
|
|
18
|
+
* Write one activity row.
|
|
19
|
+
*
|
|
20
|
+
* Never throws. The row describes a write that already succeeded, and failing
|
|
21
|
+
* that write because its description could not be filed would be the wrong way
|
|
22
|
+
* round - `activities` is a feed, not a ledger the application depends on. A
|
|
23
|
+
* failure is reported once, by name, rather than swallowed.
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeActivityRow(payload: {
|
|
26
|
+
type: string
|
|
27
|
+
description: string
|
|
28
|
+
subject_type: string
|
|
29
|
+
subject_id: number | string | null
|
|
30
|
+
properties: Record<string, unknown> | null
|
|
31
|
+
causer: string | null
|
|
32
|
+
user_id: number | string | null
|
|
33
|
+
ip_address: string | null
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Record one lifecycle moment.
|
|
37
|
+
*
|
|
38
|
+
* Exported so the hook builder stays a thin wrapper and this stays testable
|
|
39
|
+
* without a model definition.
|
|
40
|
+
*/
|
|
41
|
+
export declare function recordActivity(context: {
|
|
42
|
+
modelName: string
|
|
43
|
+
event: ActivityEvent
|
|
44
|
+
attributes: Record<string, unknown> | null | undefined
|
|
45
|
+
primaryKey: string
|
|
46
|
+
options: ActivityLogOptions
|
|
47
|
+
hidden?: readonly string[]
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Wire the feed into a model's static surface.
|
|
51
|
+
*
|
|
52
|
+
* Wrapping `create` / `update` / `delete` rather than using the lifecycle
|
|
53
|
+
* hooks, for the reason `applyAudit` does the same: bun-query-builder's
|
|
54
|
+
* `afterUpdate` and `afterDelete` do not fire for the STATIC
|
|
55
|
+
* `Model.update(id, …)` and `Model.delete(id)` paths, which is how most
|
|
56
|
+
* application code writes. Verified before this was written - hooks alone
|
|
57
|
+
* logged the create and silently missed both of the others.
|
|
58
|
+
*
|
|
59
|
+
* `update` and `delete` read the row first, because the feed's whole value is
|
|
60
|
+
* saying what the record was: after an update the model returns the new state,
|
|
61
|
+
* and after a delete there is nothing left to read.
|
|
62
|
+
*/
|
|
63
|
+
export declare function applyActivityLog(baseModel: Record<string, unknown>, modelName: string, primaryKey: string, options: ActivityLogOptions, hidden?: readonly string[]): void;
|
|
64
|
+
export declare interface ActivityLogOptions {
|
|
65
|
+
logOnly?: string[]
|
|
66
|
+
include?: string[]
|
|
67
|
+
exclude?: string[]
|
|
68
|
+
}
|
|
69
|
+
/** The lifecycle moments an activity row is written for. */
|
|
70
|
+
export type ActivityEvent = 'created' | 'updated' | 'deleted';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Override the user id attached to subsequent trail rows. Pass `null` to clear
|
|
3
|
+
* it and fall back to the request-derived id.
|
|
4
|
+
*/
|
|
5
|
+
export declare function setTrailActor(id: number | string | null): void;
|
|
6
|
+
/** The override, for callers that need to know whether one is set. */
|
|
7
|
+
export declare function currentTrailActor(): number | string | null;
|
|
8
|
+
/**
|
|
9
|
+
* The user id to attribute a write to. In order:
|
|
10
|
+
*
|
|
11
|
+
* 1. the explicit override, for queue and CLI runs
|
|
12
|
+
* 2. the current HTTP request's authenticated user
|
|
13
|
+
* 3. `null` - a system write, which both tables allow
|
|
14
|
+
*
|
|
15
|
+
* Failures are swallowed on purpose. The router is lazily imported because it
|
|
16
|
+
* is not loaded in every runtime that consumes the ORM (CLI build steps,
|
|
17
|
+
* tests), and it imports the ORM in the runtimes where it IS loaded - so a
|
|
18
|
+
* static import here would be a cycle. Not knowing who acted is never a reason
|
|
19
|
+
* to fail the write being described.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveTrailActorId(): Promise<number | string | null>;
|
|
22
|
+
/**
|
|
23
|
+
* The requesting IP, when there is a request to ask.
|
|
24
|
+
*
|
|
25
|
+
* Same lazy-import reasoning as the actor above, and the same tolerance: an
|
|
26
|
+
* activity row with no address is still worth having.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveTrailIp(): Promise<string | null>;
|
|
29
|
+
/**
|
|
30
|
+
* A copy of `attributes` with every sensitive field dropped.
|
|
31
|
+
*
|
|
32
|
+
* Never mutates the input: the caller is also using the original to write the
|
|
33
|
+
* row the trail describes.
|
|
34
|
+
*/
|
|
35
|
+
export declare function redactSensitive(attributes: Record<string, unknown> | null | undefined): Record<string, unknown> | null;
|
|
36
|
+
/** Report a trail write that failed, without letting it fail the write it describes. */
|
|
37
|
+
export declare function reportTrailFailure(trail: string, subject: string, error: unknown): void;
|
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.31",
|
|
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.31",
|
|
67
|
+
"@stacksjs/cli": "0.74.31",
|
|
68
|
+
"@stacksjs/config": "0.74.31",
|
|
69
|
+
"@stacksjs/database": "0.74.31",
|
|
70
|
+
"@stacksjs/env": "0.74.31",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.31",
|
|
72
|
+
"@stacksjs/events": "0.74.31",
|
|
73
|
+
"@stacksjs/logging": "0.74.31",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.31",
|
|
75
|
+
"@stacksjs/pagination": "0.74.31",
|
|
76
|
+
"@stacksjs/path": "0.74.31",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.31",
|
|
78
|
+
"@stacksjs/realtime": "0.74.31",
|
|
79
|
+
"@stacksjs/router": "0.74.31",
|
|
80
|
+
"@stacksjs/storage": "0.74.31",
|
|
81
|
+
"@stacksjs/strings": "0.74.31",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.74.
|
|
84
|
-
"bun-query-builder": "^0.2.
|
|
83
|
+
"@stacksjs/validation": "0.74.31",
|
|
84
|
+
"bun-query-builder": "^0.2.69"
|
|
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.31",
|
|
88
|
+
"@stacksjs/payments": "0.74.31",
|
|
89
|
+
"@stacksjs/queue": "0.74.31",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.31",
|
|
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.31",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "22.3.2"
|
|
114
114
|
}
|