@stacksjs/orm 0.74.3 → 0.74.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +10 -10
- package/dist/models/EmailIdempotency.ts +4 -1
- package/dist/models/EmailSuppression.ts +4 -1
- package/dist/models/EmailWebhookEvent.ts +4 -1
- package/dist/models/Request.ts +4 -1
- package/dist/paginator.d.ts +12 -95
- package/dist/traits/billable.d.ts +1 -0
- package/package.json +36 -22
- package/dist/utils.d.ts +0 -23
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export type { AuditHelpers } from './traits/audit';
|
|
|
5
5
|
export type { SoftDeleteOptions, SoftDeleteHelpers } from './traits/soft-deletes';
|
|
6
6
|
export type * from './api-routes';
|
|
7
7
|
export type { GenerateSchemaOptions, GenerateSchemaResult } from './generate-database-schema';
|
|
8
|
-
export type { CursorPaginator, Paginator, SimplePaginator } from '
|
|
8
|
+
export type { CursorPaginator, Paginator, SimplePaginator } from '@stacksjs/pagination';
|
|
9
9
|
export type { ResolvedPageArgs } from './paginator-request';
|
|
10
10
|
// Re-export type utilities from bun-query-builder so consumers can infer
|
|
11
11
|
// model types directly from defineModel() definitions
|
|
@@ -289,7 +289,7 @@ export * from './subquery';
|
|
|
289
289
|
export * from './transaction';
|
|
290
290
|
export * from './model-types';
|
|
291
291
|
export * from './types';
|
|
292
|
-
export * from '
|
|
292
|
+
export * from '@stacksjs/model-meta';
|
|
293
293
|
export * from './define-model';
|
|
294
294
|
export * from './extend-model';
|
|
295
295
|
// Codegen for `database/types.d.ts` — augments
|
|
@@ -304,7 +304,7 @@ export {
|
|
|
304
304
|
toCursorPaginator,
|
|
305
305
|
toPaginator,
|
|
306
306
|
toSimplePaginator,
|
|
307
|
-
} from '
|
|
307
|
+
} from '@stacksjs/pagination';
|
|
308
308
|
// Request-aware pagination helpers (stacksjs/stacks#1906 P2 + #1907 P3).
|
|
309
309
|
export {
|
|
310
310
|
enrichPaginatorUrls,
|
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var b=import.meta.require;import"@stacksjs/validation";import{log as le}from"@stacksjs/cli";import{db as Qe}from"@stacksjs/database";async function Wt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=Qe.deleteFrom(e);u=o(u);let l=await u.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return le.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let i=await Qe.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=Array.isArray(i)?i:[i],c=Number(s[0]?.numDeletedRows??s.length??0);return le.info(`Pruned ${c} records from ${e} older than ${t} days`),c}catch(a){throw le.error(`Failed to prune ${e}:`,a),a}}async function Ha(e,n={}){return Wt(e,n)}function za(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Vt,createDecipheriv as Ht,createHash as zt,randomBytes as Gt}from"crypto";import{log as Z}from"@stacksjs/logging";var We="enc:",Ve="aes-256-gcm",Jt=12,X=null;async function He(){if(X)return X;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 X=zt("sha256").update(e).digest(),X}function U(e){return typeof e==="string"&&e.startsWith(We)}async function de(e){if(e==null)return e;if(U(e))return e;if(typeof e!=="string")return e;let n=await He();if(!n)return Z.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Gt(Jt),r=Vt(Ve,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${We}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function fe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!U(e))return e;try{let n=await He();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"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),c=Ht(Ve,n,a);return c.setAuthTag(i),Buffer.concat([c.update(s),c.final()]).toString("utf8")}catch(n){return Z.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function pe(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 Yt}from"@stacksjs/database";import{log as Q}from"@stacksjs/logging";var Xt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],Ge="model_audits",ye=null;function Zt(e){ye=e}async function me(){if(ye!=null)return ye;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 ee(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Xt.some((o)=>o.test(t)))continue;n[t]=r}return n}function L(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function en(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 ge(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto(Ge).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:Yt()}).executeTakeFirst()}catch(t){if(Q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Je(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom(Ge).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ze(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ze(o.new_values):o.new_values}))}catch(t){return Q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ze(e){try{return JSON.parse(e)}catch{return e}}function Ye(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Xe(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Je(n).audits;let i=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},s=e.create;if(typeof s==="function")e.create=async function(...l){return await i(async()=>{let f=await s.apply(this,l);try{let d=L(f),m=d?.[t];if(m!=null){let p=await me();await ge({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:ee(d),user_id:p},o)}}catch(d){if(Q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let c=e.update;if(typeof c==="function")e.update=async function(l,f){return await i(async()=>{let d=a.find,m=typeof d==="function"?L(await d.call(a,l)):null,p=await c.call(this,l,f);try{let y=L(p)??(typeof d==="function"?L(await d.call(a,l)):null),{old:h,next:w}=en(m,y);if(w&&Object.keys(w).length>0){let T=await me();await ge({auditable_type:n,auditable_id:l,event:"updated",old_values:ee(h),new_values:ee(w),user_id:T},o)}}catch(y){if(Q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:y}),o)throw y}return p})};let u=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await i(async()=>{let m=a.find,p=typeof m==="function"?L(await m.call(a,d)):null,y=await f.call(this,d);try{if(y!==!1&&p){let h=await me();await ge({auditable_type:n,auditable_id:d,event:"deleted",old_values:ee(p),new_values:null,user_id:h},o)}}catch(h){if(Q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return y})}};u("delete"),u("softDelete")}import{db as tn,sql as nn,sqlDateTime as be}from"@stacksjs/database";function C(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 W="commentable_upvotes",V="commentables";function rn(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 we(e){let n=tn;return{async comments(t){return C(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(nn`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(C(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:be(),updated_at:be()}).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){C(t,"upvoteComment"),C(r,"upvoteComment");let o=()=>n.selectFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(W).values({upvoteable_id:t,upvoteable_type:V,user_id:r,created_at:be()}).execute()}catch(i){if(!rn(i))throw i}return await o()},async removeCommentUpvote(t,r){C(t,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await n.deleteFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).execute()},async commentUpvoteCount(t){C(t,"commentUpvoteCount");let r=await n.selectFrom(W).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",V).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return C(t,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await n.selectFrom(W).where("upvoteable_id","=",t).where("upvoteable_type","=",V).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as on,sql as an,sqlDateTime as Ze}from"@stacksjs/database";function he(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 Te(e){let n=on;return{async tags(t){return he(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){he(t,"tagCount");let r=await n.selectFrom("taggables").select(an`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(he(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:Ze(),updated_at:Ze()}).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 sn,sqlDateTime as te}from"@stacksjs/database";function ke(e){let n=sn;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(),i=await a();if(!i)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:te(),updated_at:te()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:te(),updated_at:te()}).execute(),i},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 un,sqlDateTime as cn}from"@stacksjs/database";function _e(e,n){let t=un,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 i=await t.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=cn();try{return await t.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 f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw c}},async unlike(a,i){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}function nt(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 ln(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(nt(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function R(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function dn(e){let n={};for(let[t,r]of Object.entries(e))n[R(t)]=r;return n}function li(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function rt(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 ot(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 di(e){return e?.ownership===!1}function fi(e,n,t){let r=Object.keys(e).find((a)=>R(a)===R(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(R(a)===R(n))delete o[a];return o[n]=t,{data:o}}function fn(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=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 pn(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(r);if(o!==r&&o in e)t[r]=e[o]}return t}function mn(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]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return n;return i}function pi(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}function mi(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[R(r)];return t}var gn=["id","uuid","created_at","updated_at","deleted_at"];function gi(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...gn]){let o=R(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(r));return t}function yi(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 i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let c=t.get(s);if(!c)continue;o=o.orderBy(c,i?"desc":"asc")}return o}var yn={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"?bn(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"?wn(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function bn(e){try{return JSON.parse(e)}catch{return e}}function wn(e){try{return JSON.parse(e)}catch{return[]}}function bi(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 i=typeof a==="string"?yn[a]:a;if(!i||typeof i[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=i[t](r[o]);let s=R(o);if(s!==o&&Object.prototype.hasOwnProperty.call(r,s))r[s]=i[t](r[s])}return r}function at(e,n,t){let r=n?.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&&t==="updating")continue;let u=i!==null&&typeof i==="object"&&Object.prototype.hasOwnProperty.call(i,"default"),l=c?e[a]:u?i.default:void 0,f=mn(s,l),d=s.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>i?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function wi(e,n,t){let r=et(t);return e.find((o)=>o.method===n&&et(String(o.path??""))===r)}function et(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Re(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function hi(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?Re(o.read):["auth"],write:"write"in o?Re(o.write):["auth"],declared:!0}}let r=Re(t);return{read:r,write:r,declared:!0}}var tt=15,hn=100;function Ti(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(tt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):tt,hn);return{page:t,perPage:o,offset:(t-1)*o}}function ne(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Tn(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,c={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?ne(e,n-1):null,next_page_url:o?ne(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let u=Math.max(1,Math.ceil(a/t));c.total=a,c.last_page=u,c.first_page_url=ne(e,1),c.last_page_url=ne(e,u)}return c}function ki(e,n,t,r,o,a){let{page:i,...s}=Tn(e,n,t,r,o,a);return{current_page:i,...s}}function _i(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ri(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 kn(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=rt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(Se(o))}};let t=ot(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Se(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 i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function _n(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 Rn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Sn(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(Se(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Pn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Se(t))}catch{return null}}}}function xn(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=kn(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(t,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{cacheRequestQuery as An}from"@stacksjs/router";var re=new WeakMap;function Mi(e,n){return An(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=re.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},re.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=re.get(e);if(!a)return;re.delete(e);let i=Array.from(new Set(a.keys));try{let s=typeof e.findMany==="function"?await e.findMany(i):await Promise.all(i.map((u)=>e.find?.(u))),c=new Map;for(let u of s??[]){let l=u?.id;if(l!==void 0)c.set(l,u)}for(let u of a.resolvers)u.resolve(c.get(u.key))}catch(s){for(let c of a.resolvers)c.reject(s)}})}))}import{db as Di}from"@stacksjs/database";class Mn{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 Pe,runInTransactionScope as Cn}from"@stacksjs/database";async function $i(e,n){return await Cn(async()=>await Pe.transaction(e,n))}async function Ni(e){return await Pe.savepoint(e)}function ji(e,n){return Pe.transactional(e,n)}import{path as O}from"@stacksjs/path";import{fs as B,globSync as Ce}from"@stacksjs/storage";import{plural as lt,singular as it,snakeCase as k}from"@stacksjs/strings";import{isString as oe}from"@stacksjs/validation";function dt(e){let n=e.belongsToMany;if(!n)return[];if(Array.isArray(n))return n.map((t)=>({relationName:typeof t==="string"?k(t):k(String(t.model)),relation:t}));return Object.entries(n).map(([t,r])=>{if(typeof r==="string")return{relationName:t,relation:r};return{relationName:t,relation:{model:r.model,pivotTable:r.table,firstForeignKey:r.foreignKey,secondForeignKey:r.relatedKey}}})}async function Li(e){if(typeof e==="string")e=(await import(e)).default;return e.table??k(lt(e?.name||""))}function H(e,n){if(e.name)return e.name;return O.basename(n).replace(/\.ts$/,"")}function A(e,n){if(e.table)return e.table;return k(lt(H(e,n)))}function On(e,n){let t=[e,n];return t.sort(),t.join("_")}function Qi(e,n){return n in e}async function vn(e,n){let t=[];if(e.hasOne)for(let r of e.hasOne)t.push(await xe(r,e,n,"hasOne"));if(e.hasMany)for(let r of e.hasMany)t.push(await xe(r,e,n,"hasMany"));if(e.belongsTo)for(let r of e.belongsTo)t.push(await xe(r,e,n,"belongsTo"));if(e.hasOneThrough)for(let r of e.hasOneThrough)t.push(await ut(r,e,n,"hasOneThrough"));if(e.hasManyThrough)for(let r of e.hasManyThrough)t.push(await ut(r,e,n,"hasManyThrough"));if(e.belongsToMany)for(let{relationName:r,relation:o}of dt(e))t.push(await En(o,e,n,"belongsToMany",r));if(e.morphOne)t.push(await ct(e.morphOne,e,n,"morphOne"));if(e.morphMany){let r=Array.isArray(e.morphMany)?e.morphMany:[e.morphMany];for(let o of r)t.push(await ct(o,e,n,"morphMany"))}if(e.morphTo){let r=e.morphTo,o=Array.isArray(r)?r:typeof r==="object"&&r!==null?[r]:[];for(let a of o)t.push(Dn(a,e,n))}if(e.morphToMany){let r=Array.isArray(e.morphToMany)?e.morphToMany:[e.morphToMany];for(let o of r)t.push(st(o,e,n,"morphToMany"))}if(e.morphedByMany){let r=Array.isArray(e.morphedByMany)?e.morphedByMany:[e.morphedByMany];for(let o of r)t.push(st(o,e,n,"morphedByMany"))}return t}function Dn(e,n,t){let r=e&&typeof e==="object"&&e.name?String(e.name):`${k(t)}able`,o=e?.type||`${r}_type`;return{relationship:"morphTo",model:"",table:"",relationTable:"",foreignKey:e?.id||`${r}_id`,modelKey:o,relationName:r,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:""}}function st(e,n,t,r){let o=typeof e==="object"&&e!==null,a=o?String(e.model||""):String(e),i=o&&e.morphName?String(e.morphName):`${k(t)}able`,s=o&&e.pivotTable?String(e.pivotTable):i,c=o&&e.id||`${i}_id`,u=o&&e.type||`${i}_type`;return{relationship:r,model:a,table:"",relationTable:"",foreignKey:c,modelKey:u,relationName:i,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:c,pivotKey:u,pivotTable:s}}async function ae(e,n){let t=Me(`${n}.ts`),r=Me(`${e}.ts`),o=Ae(`${e}.ts`),a=Ae(`${n}.ts`);if(!t&&!a)throw Error(`Model not found: ${n}`);if(!r&&!o)throw Error(`Model not found: ${e}`);let i;try{if(B.existsSync(t))i=(await import(t)).default;else i=(await import(a)).default}catch(c){throw Error(`Failed to load model: ${n}. Error: ${c?.message||"Unknown error"}`)}let s=B.existsSync(r)?r:o;return{modelRelation:i,modelPath:s,modelRelationPath:B.existsSync(t)?t:a}}async function ut(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e;else o=e.model,a=e.relationName||"",i=e.through,s=e.throughForeignKey||"";let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=A(c,l),d=A(n,u),m=k(H(c,l)),p=k(t);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:`${p}_id`,modelKey:`${m}_id`,relationName:a,relationModel:t,throughModel:i,throughForeignKey:s,pivotForeign:`${p}_id`,pivotKey:`${m}_id`,pivotTable:d}}async function En(e,n,t,r,o){let a="",i="",s="",c=k(t);if(oe(e))a=e;else a=e.model,i=e.pivotTable||"",s=e.firstForeignKey||`${c}_id`;let{modelRelation:u,modelPath:l,modelRelationPath:f}=await ae(t,a),d=A(u,f),m=A(n,l),p=k(H(u,f));return{relationship:r,model:a,table:d,relationTable:m,foreignKey:typeof e==="string"?`${c}_id`:e.firstForeignKey||`${c}_id`,modelKey:typeof e==="string"?`${p}_id`:e.secondForeignKey||`${p}_id`,relationName:o,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:s,pivotKey:`${p}_id`,pivotTable:i}}async function ct(e,n,t,r){let o="",a="",i="",s="";if(oe(e))o=e,a=`${k(t)}able`;else o=e.model,a=e.morphName||`${k(t)}able`,i=e.type||`${a}_type`,s=e.id||`${a}_id`;let{modelRelation:c,modelPath:u,modelRelationPath:l}=await ae(t,o),f=A(c,l),d=A(n,u);return{relationship:r,model:o,table:f,relationTable:d,foreignKey:s||`${a}_id`,modelKey:i||`${a}_type`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:"",pivotKey:"",pivotTable:d}}async function xe(e,n,t,r){let o="",a="";if(oe(e))o=e;else o=e.model,a=e.relationName||"";let{modelRelation:i,modelPath:s,modelRelationPath:c}=await ae(t,o),u=A(i,c),l=A(n,s),f=k(H(i,c)),d=k(t),m=typeof e==="string"?"":e.foreignKey||"",p={relationship:r,model:o,table:u,relationTable:l,foreignKey:m||`${d}_id`,modelKey:`${f}_id`,relationName:a,relationModel:t,throughModel:"",throughForeignKey:"",pivotForeign:`${d}_id`,pivotKey:`${f}_id`,pivotTable:l};if(r==="belongsTo"){if(p.foreignKey="",m)p.modelKey=m}return p}function Wi(e){let n=/belongs/,t=/has/,r=/Through/,o=/morph/;if(r.test(e))return"throughType";if(n.test(e))return"belongsType";if(t.test(e))return"hasType";if(o.test(e))return"morphType";return""}function Vi(e){let n=/One/;if(/Many/.test(e))return"many";if(n.test(e))return"one";return""}async function Hi(e,n){let t=[];if("belongsToMany"in e){for(let{relation:r}of dt(e)){let o,a;if(typeof r==="string")a=r;else a=r.model;let i=Me(`${a}.ts`),s=Ae(`${a}.ts`);if(B.existsSync(i))o=(await import(i)).default;else o=(await import(s)).default;let c=A(o,i),u=A(e,n),l=typeof r==="object"&&"firstForeignKey"in r?r.firstForeignKey:`${it(u)}_${e.primaryKey}`,f=typeof r==="object"&&"secondForeignKey"in r?r.secondForeignKey:`${it(c)}_${e.primaryKey}`;t.push({table:(typeof r==="object"&&"pivotTable"in r?r.pivotTable:void 0)??On(u,c),firstForeignKey:l,secondForeignKey:f})}return t}return[]}async function zi(e){let n=Ce([O.userModelsPath("*.ts"),O.storagePath("framework/defaults/app/Models/**/*.ts")],{absolute:!0}),t=[];for(let r=0;r<n.length;r++){let o=n[r],a=await import(o);if(e===a.default.name)continue;let i=H(a,o),s=await vn(a.default,i);if(!s.length)continue;let c=s.find((u)=>u.model===e);if(c)t.push(c)}return t}function Gi(e){if(e===void 0)return[];return Object.keys(e).filter((n)=>e[n]?.hidden===!0)}function Ji(e){let n=e.attributes;if(n===void 0)return[];return Object.keys(n).filter((t)=>n[t]?.guarded===!0).map((t)=>k(t))}function Yi(e,n){let t=e.attributes,r=[];if(t===void 0)return[];let o=typeof e.traits?.billable==="object"||typeof e.traits?.billable==="boolean",a=typeof e.traits?.useAuth==="object"?e.traits?.useAuth.usePasskey:!1,i=e.traits?.useUuid||!1;if(o)r.push("stripe_id");if(i)r.push("uuid");if(a)r.push(...["two_factor_secret","public_key"]);let s=n.map((c)=>c.foreignKey).filter((c)=>c);return[...Object.keys(t).filter((c)=>{if(t===void 0)return!1;return t[c]?.fillable===!0}).map((c)=>k(c)),...r,...s]}async function Xi(e,n){let t=e.attributes;if(!t)t={};let r=Object.keys(t),o=[],a=Bun.file(n),i="";try{if(await a.exists())i=await a.text()}catch{i=""}let s=/rule:.*$/gm,c;c=s.exec(i);while(c!==null)o.push(c[0]),c=s.exec(i);return r.map((l,f)=>{let d=t[l],m=null,p=!1,y=!1,h=!1,w=!1;if(d)m=d||null,p=d.unique||!1,y=d.hidden||!1,h=d.fillable||!1;let T=o[f]??"";return w=(d.validation?.rule).isRequired??!1,{field:l,default:m,unique:p,hidden:y,fillable:h,required:w,fieldArray:Fn(T)}})}function Fn(e){let n=e.split("rule: schema.");if(n.length!==2)return null;if(!n[1])n[1]="";let t=n[1].replace(/,/g,"");if(!t)return null;let r=t.split("."),o=/\(([^)]+)\)/;return r.map((a)=>{let i=o.exec(a),s=i?i[1]:null;return{entity:a.replace(o,"").replace(/\(|\)/g,""),charValue:s}})[0]||null}function Zi(e){let n=e.fieldArray?.entity;switch(n){case"enum":return"string | string[]";case"date":return"Date | string";case"timestamp":return"Date | string";case"datetime":return"Date | string";case"float":return"number";case"double":return"number";case"decimal":return"number";case"integer":return"number";case"bigint":return"number";default:return n}}function Ae(e){let n=O.join(O.storagePath("framework/defaults/app/Models"),"/"),t=O.join(n,e);if(B.existsSync(t))return t;return Ce(`${n}**/${e}`,{absolute:!0})[0]??""}function Me(e){let n=O.join(O.userModelsPath("/"),"/"),t=O.join(n,e);if(B.existsSync(t))return t;return Ce(`${n}**/${e}`,{absolute:!0})[0]??""}function es(e){let n=typeof e==="number"?new Date(e):typeof e==="string"?new Date(e):e;if(Number.isNaN(n.getTime()))throw Error(`Invalid date value: ${String(e)}`);return n.toISOString().replace("T"," ").split(".")[0]??""}function ts(e){return e.toISOString().split("T")[0]??""}function ns(e){return e.getTime()}import{createModel as Un,registerModel as Ln}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as v}from"@stacksjs/strings";import{AsyncLocalStorage as xt}from"async_hooks";function $n(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.total==="number"&&typeof n.last_page==="number"}function Nn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&typeof n.current_page==="number"&&typeof n.per_page==="number"&&typeof n.has_more_pages==="boolean"&&!("total"in n)}function jn(e){if(e===null||typeof e!=="object")return!1;let n=e;return Array.isArray(n.data)&&(typeof n.next_cursor==="string"||n.next_cursor===null)}function Oe(e){let{data:n}=e,{perPage:t,page:r,total:o,lastPage:a}=e.meta,i=n.length===0,s=i?null:(r-1)*t+1,c=i?null:s+n.length-1;return{data:n,current_page:r,per_page:t,total:o,last_page:a,from:s,to:c,has_more_pages:r<a}}function ve(e){return{data:e.data,current_page:e.meta.page,per_page:e.meta.perPage,has_more_pages:e.meta.hasMore}}function De(e){return{data:e.data,per_page:e.meta.perPage,next_cursor:ft(e.meta.nextCursor),prev_cursor:ft(e.meta.prevCursor),has_more_pages:e.meta.nextCursor!==null&&e.meta.nextCursor!==void 0}}function ft(e){if(e===null||e===void 0)return null;if(typeof e==="string")return e;return JSON.stringify(e)}function Fe(e,n){let t=je(),r=t?Ee(t,"per_page"):void 0,o=t?Ee(t,"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(n??o??1));return{perPage:a,page:i}}function $e(e,n){let t=je(),r=t?mt(t,"cursor"):void 0,o=t?Ee(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=pt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function pt(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 Ne(e){let n=je();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?F(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?F(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?F(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?F(t,{page:o+1}):null,e.first_page_url=F(t,{page:1}),e.last_page_url=F(t,{page:a})}else e.next_page_url=e.has_more_pages?F(t,{page:o+1}):null;return e}function F(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var I;function je(){if(I===null)return;if(I===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")I=n.getCurrentRequest;else{I=null;return}}catch{I=null;return}return I()}function Ee(e,n){let t=mt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function mt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{db as Bn}from"@stacksjs/database";function gt(e){let n=Bn;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:i}=await import("@stacksjs/payments"),s=await i.create(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),u=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:u}},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: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(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...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 i=await z();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await z();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 n.updateTable(u).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",i=(t._attributes??t)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,c=s[o];if(!c)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(c),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await z(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,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)})}}}async function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");return new(await import("stripe")).default(e,{apiVersion:"2026-06-24.dahlia"})}function yt(){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),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(n,t))return await o.recordFailedAttempt(i),!1;try{let{cache:c}=await import("@stacksjs/cache"),u=`2fa:used:${a}:${n}`;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 In}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var ie="deleted_at";function bt(e,n="id"){return{async softDelete(t){let r=In(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ie]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[ie]: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(ie);return t?.where?.(ie,"!=",null)??t}}}function wt(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 qn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Be(l,n,!0)),a=r.some((l)=>Be(l,n,!1));if(!o&&!a)return q.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>Be(l,n,o))??null;if(!s)return null;let u=globalThis[s];if(!u)return q.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:u}}function Be(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 Kn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){q.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="function"){let c=a.call(t,r,n),u=typeof c?.get==="function"?await c.get():Array.isArray(c)?c:[],l=t.primaryKey||"id";for(let f of u){let d=f?.[l];if(d!=null)await i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){q.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await s.delete();return}}else{let i=t.restore;if(typeof i!=="function"){q.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,u=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof u?.get==="function"?await u.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await i.call(t,m)}}}catch(a){if(q.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function G(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=qn(e,i);if(!s)continue;await Kn(s.className,t,s.model,a,r)}}var At=new xt;function j(){return At.getStore()?.suppressed===!0}function N(e){return Promise.resolve(At.run({suppressed:!0},e))}var Mt=new xt;function Qn(){return Mt.getStore()?.suppressed===!0}function Wn(e){return Promise.resolve(Mt.run({suppressed:!0},e))}var Le=Symbol.for("stacks.orm.modelDefinition");class Ct extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var ht=new Set;function Vn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(ht.has(r))return;ht.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 Hn={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 Vn(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 Ot(e){return typeof e==="string"?Hn[e]:e}function Tt(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 i=Ot(a);r[o]=i[t](r[o])}return r}var se=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),kt=Symbol.for("stacks.modelInstanceProxy"),zn={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 Gn(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 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 P(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[kt])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]=Ot(a).get(r[o])}return new Proxy(e,{get(o,a,i){let s=o;if(a===kt)return!0;if(a==="saveAsync")return async function(){let u=s._definition,l=u?.set;if(l&&typeof s.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._attributes),y=p&&typeof p.then==="function"?await p:p;s._attributes[d]=y}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}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[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!s.isDirty(d))continue;let p=m(s._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.`);s._attributes[d]=p}let f=u.set;u.set={};try{return s.save()}finally{u.set=f}}return s.save()};if(a==="updateAsync")return async function(u){if(u&&typeof u==="object"&&!Array.isArray(u))for(let[l,f]of Object.entries(u))i[l]=f;return i.saveAsync()};if(a==="saveQuietly")return function(){return N(()=>s.save())};if(a==="saveAsyncQuietly")return function(){return N(()=>i.saveAsync())};if(a==="updateQuietly")return function(u){return N(()=>s.update(u))};if(a==="updateAsyncQuietly")return function(u){return N(()=>i.updateAsync(u))};if(a==="deleteQuietly")return function(){return N(()=>s.delete())};if(a==="toSearchableObject")return function(){let f=s._definition?.traits?.useSearch;if(!f)return null;let d=s._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],y=f.denormalize??{},h=s._relations;for(let w of p){let T=v(w),S=d[T]??d[w];if(S!==void 0){m[T]=S;continue}let M=y[w]??y[T];if(M){m[T]=Gn(h,M);continue}m[T]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!se.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 d=l[a];if(Array.isArray(d))return d.map((m)=>P(m,n));return d&&typeof d==="object"?P(d,n):d}let f=zn[a];if(f){let p=s._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...y)=>p(i,...y):(...y)=>p(s.id,...y)}if(u){let d=v(a);if(d!==a&&Object.prototype.hasOwnProperty.call(u,d))return u[d]}}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"&&!se.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 f=v(a);if(f!==a&&Object.prototype.hasOwnProperty.call(u,f)){if(typeof l==="function")l.call(c,f,i);else u[f]=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"&&!se.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=v(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"&&!se.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 Jn=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),Yn={paginate:Oe,simplePaginate:ve,cursorPaginate:De},_t=Symbol.for("stacks.queryBuilderProxy");function vt(e,n){if(!e||typeof e!=="object")return e;if(e[_t])return e;return new Proxy(e,{get(t,r,o){if(r===_t)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...i){let s=i,c=String(r);if(c==="paginate"||c==="simplePaginate"){let{perPage:f,page:d}=Fe(i[0],i[1]);s=[f,d]}else if(c==="cursorPaginate"){let{perPage:f,cursor:d}=$e(i[0],i[1]);s=[f,d,i[2],i[3]]}let u=a.apply(t,s),l=(f)=>{if(Jn.has(c)){if(Array.isArray(f))return f.map((m)=>P(m,n));let d=Yn[c];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((y)=>P(y,n)),p=d({...f,data:m});return Ne(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>P(m,n))};return P(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return vt(f,n);return f};if(u&&typeof u.then==="function")return u.then(l);return l(u)}}})}function Xn(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){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((f)=>P(f,n)):P(l,n);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((f)=>P(f,n)):P(l,n);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 vt(c,n)}}}class Dt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class qe 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 Zn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function J(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,i=new Set;for(let[c,u]of Object.entries(r)){let l=v(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(n)){let u=v(c);if(Zn.has(u))continue;if(i.has(u))throw new qe(e.name,c,"guarded");if(u.endsWith("_id"))continue;if(!s.has(u))throw new qe(e.name,c,"not-fillable")}return n}async function Ke(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(i){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function er(e,n){let t=n.primaryKey||"id",r=e.create;function o(u){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.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] ${n.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] ${n.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] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,u):null}J(n,l);let f=await Ke(n,l);await o("update").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.call(e,u):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(u,l){if(u==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 Ke(n,l);await o("forceUpdate").call(e,t,u).update(f);let d=e.find;return typeof d==="function"?await d.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] ${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(u),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,u)};if(typeof e.delete!=="function")e.delete=async function(u){if(u==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,u))return!1;return await o("delete").call(e,t,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 Dt(n.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,t,u);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,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] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,u),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...u,...l};return J(n,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] ${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,u),d=typeof f.first==="function"?await f.first():await f;if(d){J(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let y=e.find;return typeof y==="function"?await y.call(e,p):{...d,...l}}let m={...u,...l};return J(n,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 d=u.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(u){if(!u||typeof u!=="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?.[u])};if(typeof e.whereIn!=="function")e.whereIn=async function(u,l){if(!u||typeof u!=="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,u,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[u,l]of s)if(typeof e[u]!=="function")e[u]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,T)=>{let S=w?.[f],M=T?.[f];if(S===M)return 0;return(S>M?1:-1)*(l==="desc"?-1:1)})[0]??null};let c=$t(n.traits?.useSearch,n);if(c){let u=c.index??n.table??v(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return or(e,u,l,f,c.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,y=e.query;if(typeof y==="function")try{let T=y.call(e);if(T&&typeof T.chunk==="function")return await T.chunk(l,async(S)=>{let M=await Ue(S,c);if(M.length>0)await m.addDocuments(u,M);p+=M.length}),p}catch{}let h=await f.call(e)||[],w=await Ue(h,c);if(w.length>0)await m.addDocuments(u,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(u);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let y of m){let h=y?.id??y?._attributes?.id;if(h!=null)await p.deleteDocument(u,Number(h))}}}}async function Ue(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)=>rr(r,n)))).filter(Boolean)}function tr(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 nr(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 rr(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 nr(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function or(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...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(n,i))?.hits??[]},async paginate(c,u=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,limit:c,offset:(u-1)*c});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:u,perPage:c}},async raw(){let{useSearchEngine:c}=await import("@stacksjs/search-engine");return await c().search(n,i)}};return s}function Et(e){let n=v(e);return n===e?[e]:[e,n]}async function Ie(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Et(r)){if(!(o in t))continue;let a=t[o];if(!U(a))continue;t[o]=await fe(a)}}function ar(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let c of s)await Ie(c,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let c of s.data)await Ie(c,n);return s}if(s)await Ie(s,n);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 t(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 t(l)}}for(let s of["update","forceUpdate"]){let c=e[s];if(typeof c!=="function")continue;e[s]=async function(u,l){let f=await c.call(this,u,l);return await t(f)}}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(...f){return await t(await l.apply(this,f))}}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(...f){return i(l.apply(this,f))}}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 ir(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 i of n)for(let s of Et(i))if(s in a)a[s]=await de(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 t(i[0]),i[1])i[1]=await t(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 t(s);return await a.call(this,i,c)}}}function sr(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){J(n,r);let a=await Ke(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 ur(e,n){let t=String(n?.name??e.name??"Model"),r=(i,s)=>{if(Qn())return;if(!i||typeof i!=="object"||Array.isArray(i))return;let c=at(i,n,s);if(!c.valid)throw new Ct(t,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 cr(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...i){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,i[0]),i[0]&&typeof i[0]==="object"&&!Array.isArray(i[0]))i[0]=Tt(i[0],n,"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)?Tt(a,n,"set"):a;return await r.call(this,o,i)}}function Ft(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=lr(e),t=fr(e),r=dr(n,t),o=pr(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,s=Un(a);if(Xn(s,e.casts),er(s,a),sr(s,a),e.casts&&Object.keys(e.casts).length>0)cr(s,e.casts);let c=pe(e);if(c.length>0)ir(s,c),ar(s,c);let u=e.traits?.useSoftDeletes;if(u)mr(s,a,u);let l=e.traits?.useAudit;if(l){let m=Ye(l);Xe(s,e.name,e.primaryKey||"id",m)}ur(s,a);let f=s;f.withoutValidation=function(m){return Wn(m)},f.withoutEvents=function(m){return N(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=s[m];if(typeof p!=="function")continue;let y=`${m}Quietly`;if(typeof s[y]==="function")continue;s[y]=function(...h){return N(()=>p.apply(s,h))}}let d=Object.assign(s,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Ln(e.name,d),Object.defineProperty(d,Le,{value:e,enumerable:!1,configurable:!0}),d}function lr(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",y={...m};if(y[p]===void 0&&d[p]!==void 0)y[p]=d[p];return y},o=async(d,m)=>{if(j())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,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",c=async(d,m)=>{if(!s)return;if(j())return;try{let p=a(m),y=Array.isArray(p)?p:[p],h=i(m),T=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof T!=="function")return;for(let S of y){if(typeof S!=="string"||S.length===0)continue;await T(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},u=async(d,m)=>{if(j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(d,m);if(Array.isArray(y)&&y.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${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 c(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await u(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await u(`${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 c(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await u(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await c(`${t}:deleted`,d)};return f}function dr(...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 i of o)await i(...a)}}return Object.keys(n).length?n:void 0}function $t(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=tr(n);return t}function fr(e){let n=$t(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??v(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await Ue([s],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let u=P(s).toSearchableObject?.();if(u!==void 0)return u;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(j())return;let c=await o(s);if(!c)return;if(n.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:c})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${u.message}`),await St(r,c,e.name)}return}await St(r,c,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(j())return;let c=s?.id??s?._attributes?.id;if(c==null)return;if(n.queueable){try{let{Jobs:u}=await import("@stacksjs/queue");await u.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(c)})}catch(u){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${c}; falling back to inline: ${u.message}`),await Pt(r,Number(c),e.name)}return}await Pt(r,Number(c),e.name)}}}var Rt=new Map;function Nt(e,n){let t=Rt.get(e)??0;if(Rt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function St(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Nt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function Pt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Nt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function pr(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=Te(t);if(r.categorizable)n._categorizable=ke(t);if(r.commentable)n._commentable=we(t);if(r.billable)n._billable=gt(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=_e(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=yt();return n}function mr(e,n,t){let r=bt(e,n.primaryKey||"id"),o=wt(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,c=async(m)=>{if(!s||j())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),y=await p(`${i}:restoring`,{id:m});if(Array.isArray(y)&&y.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,p)}return!0},u=async(m)=>{if(!s||j())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",f=async(m)=>{if(!o.cascade?.length||!l){let y=await r.softDelete(m);if(y&&o.cascade?.length)await G(a,o,m,"softDelete");return y}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let y=await r.softDelete(m);if(y)await G(a,o,m,"softDelete");return y})},d=async(m)=>{if(!await c(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await G(a,o,m,"restore");await u(m)}return w}let{db:y}=await import("@stacksjs/database"),h=await y.transaction(async()=>{let w=await r.restore(m);if(w)await G(a,o,m,"restore");return w});if(h)await u(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function gr(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>gr(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 yr=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],br=["traits","dashboard"];function wr(e){let n=e?.[Le];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 hr(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 Tr(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 kr(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Tr(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]}));t.attributes={...r,...i}}for(let a of yr){let i=hr(e[a],n[a]);if(i)t[a]=i}for(let a of br){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Os(e,n){return Ft(kr(wr(e),n))}import Cr from"process";import{log as Or}from"@stacksjs/logging";import{path as x}from"@stacksjs/path";import{fs as Y}from"@stacksjs/storage";import{Database as _r}from"bun:sqlite";import{existsSync as Rr,readdirSync as Sr,readFileSync as Pr}from"fs";function xr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Ar(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 Mr(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 jt(e,n="sqlite"){let t=[];if(!Rr(e))return{tables:[],errors:t};let r;try{r=Sr(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new _r(":memory:");try{for(let s of r){let c=`${e}/${s}`,u;try{u=Pr(c,"utf-8")}catch(f){t.push({file:c,error:f.message});continue}let l=Mr(o,u);if(!l.ok)t.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)=>!xr(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 f=Ar(l.type??"",n),d=l.notnull===0&&l.pk===0;u[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:u})}return{tables:i,errors:t}}finally{o.close()}}function vr(e){if(e)return e;let n=String(Cr.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function ue(e){return e==="postgres"?"boolean":"number"}function D(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Dr(e,n){let t=e.default;if(typeof t==="boolean")return ue(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Er(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Fr(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 $r(e,n){let t=Er(e),r=Fr(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 ue(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 Dr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function Nr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${D(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${D(a.model)}_id`]="number"}}return n}function jr(e,n){let[t,r]=[D(e),D(n)].sort();return`${t}_${r}`}function Br(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?ue(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ir(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,c,u,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let w=i;if(s=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)c=w.pivotTable,u=w.firstForeignKey,l=w.secondForeignKey;else{let T=i;c=T.table,u=T.foreignKey,l=T.relatedKey,f=T.pivot?.columns??{},d=Boolean(T.pivot?.timestamps)}}else continue;let m=c??jr(e,s),p=u??`${D(e)}_id`,y=l??`${D(s)}_id`,h={id:"number",[p]:"number",[y]:"number"};for(let[w,T]of Object.entries(f))h[w]=Br(T,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function qr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${ue(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Kr(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,qr(n));return t}function Ur(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[D(o)]=$r(a,n);return t}function Bt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,c])=>`${o}${s}: ${c}`).join(`
|
|
3
|
-
`),
|
|
2
|
+
var b=import.meta.require;import"@stacksjs/validation";import{log as re}from"@stacksjs/cli";import{db as De}from"@stacksjs/database";async function Rt(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let c=De.deleteFrom(e);c=o(c);let l=await c.execute(),f=Array.isArray(l)?l:[l],d=Number(f[0]?.numDeletedRows??f.length??0);return re.info(`Pruned ${d} records from ${e}`),d}let a=new Date;a.setDate(a.getDate()-t);let s=await De.deleteFrom(e).where(r,"<",a.toISOString()).execute(),i=Array.isArray(s)?s:[s],u=Number(i[0]?.numDeletedRows??i.length??0);return re.info(`Pruned ${u} records from ${e} older than ${t} days`),u}catch(a){throw re.error(`Failed to prune ${e}:`,a),a}}async function Sa(e,n={}){return Rt(e,n)}function Ra(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Pt,createDecipheriv as At,createHash as xt,randomBytes as Ot}from"crypto";import{log as H}from"@stacksjs/logging";var ve="enc:",Me="aes-256-gcm",Ct=12,z=null;async function Ee(){if(z)return z;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return z=xt("sha256").update(e).digest(),z}function N(e){return typeof e==="string"&&e.startsWith(ve)}async function oe(e){if(e==null)return e;if(N(e))return e;if(typeof e!=="string")return e;let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Ot(Ct),r=Pt(Me,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${ve}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ae(e){if(e==null)return e;if(typeof e!=="string")return e;if(!N(e))return e;try{let n=await Ee();if(!n)return H.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return H.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),s=Buffer.from(r,"base64"),i=Buffer.from(o,"base64"),u=At(Me,n,a);return u.setAuthTag(s),Buffer.concat([u.update(i),u.final()]).toString("utf8")}catch(n){return H.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function ie(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as Dt}from"@stacksjs/database";import{log as q}from"@stacksjs/logging";var vt=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],$e="model_audits",ue=null;function Mt(e){ue=e}async function se(){if(ue!=null)return ue;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function G(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(vt.some((o)=>o.test(t)))continue;n[t]=r}return n}function B(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function Et(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ce(e,n=!1){try{let{db:t}=await import("@stacksjs/database");await t.insertInto($e).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Dt()}).executeTakeFirst()}catch(t){if(q.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Ie(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database");return(await t.selectFrom($e).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?Fe(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?Fe(o.new_values):o.new_values}))}catch(t){return q.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function Fe(e){try{return JSON.parse(e)}catch{return e}}function je(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Ne(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Ie(n).audits;let s=async(l)=>{if(!o)return await l();let{db:f}=await import("@stacksjs/database");return await f.transaction(async()=>l())},i=e.create;if(typeof i==="function")e.create=async function(...l){return await s(async()=>{let f=await i.apply(this,l);try{let d=B(f),m=d?.[t];if(m!=null){let p=await se();await ce({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:G(d),user_id:p},o)}}catch(d){if(q.warn(`[orm] audit(create) failed for ${n}`,{error:d}),o)throw d}return f})};let u=e.update;if(typeof u==="function")e.update=async function(l,f){return await s(async()=>{let d=a.find,m=typeof d==="function"?B(await d.call(a,l)):null,p=await u.call(this,l,f);try{let g=B(p)??(typeof d==="function"?B(await d.call(a,l)):null),{old:h,next:w}=Et(m,g);if(w&&Object.keys(w).length>0){let k=await se();await ce({auditable_type:n,auditable_id:l,event:"updated",old_values:G(h),new_values:G(w),user_id:k},o)}}catch(g){if(q.warn(`[orm] audit(update) failed for ${n}#${String(l)}`,{error:g}),o)throw g}return p})};let c=(l)=>{let f=e[l];if(typeof f!=="function")return;e[l]=async function(d){return await s(async()=>{let m=a.find,p=typeof m==="function"?B(await m.call(a,d)):null,g=await f.call(this,d);try{if(g!==!1&&p){let h=await se();await ce({auditable_type:n,auditable_id:d,event:"deleted",old_values:G(p),new_values:null,user_id:h},o)}}catch(h){if(q.warn(`[orm] audit(${l}) failed for ${n}#${String(d)}`,{error:h}),o)throw h}return g})}};c("delete"),c("softDelete")}import{db as Ft,sql as $t,sqlDateTime as le}from"@stacksjs/database";function x(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var U="commentable_upvotes",L="commentables";function It(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}function de(e){let n=Ft;return{async comments(t){return x(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().execute()},async commentCount(t){let r=await n.selectFrom("commentables").select($t`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r){if(x(t,"addComment"),!r||typeof r.title!=="string"||r.title.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.title");if(typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");let o=await n.insertInto("commentables").values({...r,commentables_id:t,commentables_type:e,status:"pending",created_at:le(),updated_at:le()}).returningAll().executeTakeFirst();if(o&&typeof o==="object"&&"id"in o)return o;let a=o?.lastInsertRowid;if(a==null)return o;return await n.selectFrom("commentables").where("id","=",Number(a)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().execute()},async upvoteComment(t,r){x(t,"upvoteComment"),x(r,"upvoteComment");let o=()=>n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(U).values({upvoteable_id:t,upvoteable_type:L,user_id:r,created_at:le()}).execute()}catch(s){if(!It(s))throw s}return await o()},async removeCommentUpvote(t,r){x(t,"removeCommentUpvote"),x(r,"removeCommentUpvote"),await n.deleteFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).execute()},async commentUpvoteCount(t){x(t,"commentUpvoteCount");let r=await n.selectFrom(U).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",L).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return x(t,"hasUpvotedComment"),x(r,"hasUpvotedComment"),!!await n.selectFrom(U).where("upvoteable_id","=",t).where("upvoteable_type","=",L).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as jt,sql as Nt,sqlDateTime as Be}from"@stacksjs/database";function fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function pe(e){let n=jt;return{async tags(t){return fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){fe(t,"tagCount");let r=await n.selectFrom("taggables").select(Nt`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:Be(),updated_at:Be()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as Bt,sqlDateTime as J}from"@stacksjs/database";function me(e){let n=Bt;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),s=await a();if(!s)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:J(),updated_at:J()}).execute(),s=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:s?.id,created_at:J(),updated_at:J()}).execute(),s},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as qt,sqlDateTime as Ut}from"@stacksjs/database";function ye(e,n){let t=qt,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let s=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(s?.count)||0},async like(a,s){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof s!=="number"||!Number.isFinite(s)||s<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(s)})`);let i=Ut();try{return await t.insertInto(r).values({[o]:a,user_id:s,created_at:i,updated_at:i}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,s){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",s).execute()},async isLiked(a,s){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",s).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((i)=>Number(i[o])).filter(Boolean)}}}function Le(e){let n=e;return n?.code==="SQLITE_CONSTRAINT_UNIQUE"||n?.code==="SQLITE_CONSTRAINT"||n?.code==="23505"||n?.errno===1062||/unique|duplicate/i.test(n?.message??"")}function Lt(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(Le(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function T(e){return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase()}function Kt(e){let n={};for(let[t,r]of Object.entries(e))n[T(t)]=r;return n}function qa(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Ke(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Qe(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function Ua(e){return e?.ownership===!1}function La(e,n,t){let r=Object.keys(e).find((a)=>T(a)===T(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(T(a)===T(n))delete o[a];return o[n]=t,{data:o}}function Qt(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=T(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function Wt(e,n){if(!e||n.length===0)return{};let t={};for(let r of n){if(r in e){t[r]=e[r];continue}let o=T(r);if(o!==r&&o in e)t[r]=e[o]}return t}function Vt(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),s=new Date(Date.UTC(r,o-1,a));if(s.getUTCFullYear()!==r||s.getUTCMonth()!==o-1||s.getUTCDate()!==a)return n;return s}function Ka(e,n){if(!n.length)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}function Qa(e,n){if(!e||n.length===0)return e;let t={...e};for(let r of n)delete t[r],delete t[T(r)];return t}var zt=["id","uuid","created_at","updated_at","deleted_at"];function Wa(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...zt]){let o=T(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(T(r));return t}function Va(e,n,t){if(!n)return e;let r=String(n).split(",").map((a)=>a.trim()).filter(Boolean),o=e;for(let a of r){let s=a.startsWith("-"),i=s?a.slice(1):a;if(!/^\w+$/.test(i))continue;let u=t.get(i);if(!u)continue;o=o.orderBy(u,s?"desc":"asc")}return o}var Ht={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Gt(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Jt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}};function Gt(e){try{return JSON.parse(e)}catch{return e}}function Jt(e){try{return JSON.parse(e)}catch{return[]}}function za(e,n,t){if(!e||typeof e!=="object"||!n||Object.keys(n).length===0)return e;let r={...e};for(let[o,a]of Object.entries(n)){let s=typeof a==="string"?Ht[a]:a;if(!s||typeof s[t]!=="function")continue;if(Object.prototype.hasOwnProperty.call(r,o))r[o]=s[t](r[o]);let i=T(o);if(i!==o&&Object.prototype.hasOwnProperty.call(r,i))r[i]=s[t](r[i])}return r}function We(e,n,t){let r=n?.attributes??{},o={};for(let[a,s]of Object.entries(r)){let i=s?.validation?.rule;if(!i||typeof i.validate!=="function")continue;let u=Object.prototype.hasOwnProperty.call(e,a);if(!u&&t==="updating")continue;let c=s!==null&&typeof s==="object"&&Object.prototype.hasOwnProperty.call(s,"default"),l=u?e[a]:c?s.default:void 0,f=Vt(i,l),d=i.validate(f);if(!d?.valid&&Array.isArray(d?.errors)&&d.errors.length>0)o[a]=d.errors.map((m)=>s?.validation?.message?.[m?.code]??m?.message??"invalid")}return Object.keys(o).length===0?{valid:!0}:{valid:!1,errors:o}}function Ha(e,n,t){let r=qe(t);return e.find((o)=>o.method===n&&qe(String(o.path??""))===r)}function qe(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function ge(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function Ga(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?ge(o.read):["auth"],write:"write"in o?ge(o.write):["auth"],declared:!0}}let r=ge(t);return{read:r,write:r,declared:!0}}var Ue=15,Yt=100;function Ja(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(Ue),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ue,Yt);return{page:t,perPage:o,offset:(t-1)*o}}function Y(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Xt(e,n,t,r,o,a){let s=(n-1)*t,i=r===0,u={page:n,per_page:t,from:i?null:s+1,to:i?null:s+r,has_more_pages:o,prev_page_url:n>1?Y(e,n-1):null,next_page_url:o?Y(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=Y(e,1),u.last_page_url=Y(e,c)}return u}function Ya(e,n,t,r,o,a){let{page:s,...i}=Xt(e,n,t,r,o,a);return{current_page:s,...i}}function Xa(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Za(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Zt(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Ke(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(be(o))}};let t=Qe(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function be(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let s=a.indexOf("=");if(s===-1)continue;if(a.slice(0,s).trim()===o)return decodeURIComponent(a.slice(s+1).trim())}return null}}}}function en(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function tn(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function nn(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(be(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((i)=>i.id).filter((i)=>i!=null)}catch{return[]}}}}function rn(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(be(t))}catch{return null}}}}function on(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,s=Zt(a);if(!s?.field||typeof s.resolve!=="function")return[];let i=await s.resolve(t,r);if(i==null||Array.isArray(i)&&i.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(i)?await u.whereIn(s.field,i).get():await u.where(s.field,i).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{cacheRequestQuery as an}from"@stacksjs/router";var X=new WeakMap;function oi(e,n){return an(`batchLoad:${e.name??"model"}:${String(n)}`,async()=>new Promise((t,r)=>{let o=X.get(e);if(!o)o={keys:[],resolvers:[],scheduled:!1},X.set(e,o);if(o.keys.push(n),o.resolvers.push({key:n,resolve:t,reject:r}),o.scheduled)return;o.scheduled=!0,Promise.resolve().then(async()=>{let a=X.get(e);if(!a)return;X.delete(e);let s=Array.from(new Set(a.keys));try{let i=typeof e.findMany==="function"?await e.findMany(s):await Promise.all(s.map((c)=>e.find?.(c))),u=new Map;for(let c of i??[]){let l=c?.id;if(l!==void 0)u.set(l,c)}for(let c of a.resolvers)c.resolve(u.get(c.key))}catch(i){for(let u of a.resolvers)u.reject(i)}})}))}import{db as ci}from"@stacksjs/database";class sn{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as we,runInTransactionScope as cn}from"@stacksjs/database";async function di(e,n){return await cn(async()=>await we.transaction(e,n))}async function fi(e){return await we.savepoint(e)}function pi(e,n){return we.transactional(e,n)}export*from"@stacksjs/model-meta";import{createModel as yn,registerModel as gn}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging";import{snakeCase as O}from"@stacksjs/strings";import{AsyncLocalStorage as at}from"async_hooks";import{toCursorPaginator as bn,toPaginator as wn,toSimplePaginator as hn}from"@stacksjs/pagination";function ke(e,n){let t=Se(),r=t?he(t,"per_page"):void 0,o=t?he(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),s=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:s}}function _e(e,n){let t=Se(),r=t?ze(t,"cursor"):void 0,o=t?he(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),i=Ve(n!==void 0?n:r??null);return{perPage:a,cursor:i}}function Ve(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function Te(e){let n=Se();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?v(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?v(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?v(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?v(t,{page:o+1}):null,e.first_page_url=v(t,{page:1}),e.last_page_url=v(t,{page:a})}else e.next_page_url=e.has_more_pages?v(t,{page:o+1}):null;return e}function v(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var F;function Se(){if(F===null)return;if(F===void 0)try{let n=b("@stacksjs/router");if(typeof n.getCurrentRequest==="function")F=n.getCurrentRequest;else{F=null;return}}catch{F=null;return}return F()}function he(e,n){let t=ze(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function ze(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}import{createRequire as un}from"module";import{db as ln}from"@stacksjs/database";var dn=un(import.meta.url);function He(e){let n=ln;return{async createStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(t,r)},async paymentMethods(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(t,r)},async newSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.create(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:s}=await import("@stacksjs/payments"),i=await s.update(t,r,o,a),c=i.latest_invoice?.payment_intent;return{subscription:i,paymentIntent:c}},async cancelSubscription(t,r,o={}){let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(t){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let a=await r.retrieve(t,o.provider_id||"");return{subscription:o,providerSubscription:a}}return},async checkout(t,r,o={}){let{manageCheckout:a,manageCustomer:s}=await import("@stacksjs/payments"),i={};if(o.enableTax)i.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)i.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await s.createOrGetStripeUser(t,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...i,...o};return await a.create(t,l)},async createSetupIntent(t,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(t,r)},async subscriptionHistory(t){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let s=await K();try{return await s.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,s=a[o],i=await K();if(!s){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await i.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,a.id)});return s=l.id,await n.updateTable(c).set({[o]:s}).where("id","=",Number(a.id)).execute(),l}return await i.accounts.retrieve(s)},async connectOnboardLink(t,r){let o=r.accountColumn||"stripe_account_id",s=(t._attributes??t)[o];if(!s)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await K()).accountLinks.create({account:s,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:s}},async syncConnectStatus(t,r={}){let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",s=r.payoutsColumn||"payouts_enabled",i=t._attributes??t,u=i[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await K()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,m=r.modelTable||e;return await n.updateTable(m).set({[a]:f,[s]:d}).where("id","=",Number(i.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){let o=await K(),a=r.accountColumn||"stripe_account_id",s=t._attributes??t,i=r.connectAccountId||s[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(i){if(u.transfer_data={destination:i},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",s.id,r.amountCents)})}}}function K(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=dn("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:"2026-06-24.dahlia"})}function Ge(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),s=`2fa:${a}`;if(await o.isRateLimited(s)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(s),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(s),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(s),!0}}}import{sqlDateTime as fn}from"@stacksjs/database";import{log as I}from"@stacksjs/logging";var Z="deleted_at";function Je(e,n="id"){return{async softDelete(t){let r=fn(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[Z]:r}),!0;return!1},async restore(t){let r=e.where(n,t);if(typeof r?.update==="function")return await r.update({[Z]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t);if(typeof r?.delete==="function")return await r.delete(),!0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(Z);return t?.where?.(Z,"!=",null)??t}}}function Ye(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function pn(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>Re(l,n,!0)),a=r.some((l)=>Re(l,n,!1));if(!o&&!a)return I.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let i=(o?t:r).find((l)=>Re(l,n,o))??null;if(!i)return null;let c=globalThis[i];if(!c)return I.warn(`[orm] soft-delete cascade: model '${i}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:i,model:c}}function Re(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function mn(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){I.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let s=t.softDelete;if(typeof s==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await s.call(t,d)}return}let i=a.call(t,r,n);if(typeof i?.delete==="function"){I.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await i.delete();return}}else{let s=t.restore;if(typeof s!=="function"){I.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let i=t.withTrashed,c=(typeof i==="function"?i.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let m=d?.[f];if(m!=null)await s.call(t,m)}}}catch(a){if(I.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Q(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let s of o){let i=pn(e,s);if(!i)continue;await mn(i.className,t,i.model,a,r)}}var it=new at;function E(){return it.getStore()?.suppressed===!0}function M(e){return Promise.resolve(it.run({suppressed:!0},e))}var st=new at;function kn(){return st.getStore()?.suppressed===!0}function _n(e){return Promise.resolve(st.run({suppressed:!0},e))}var Ce=Symbol.for("stacks.orm.modelDefinition");class ct extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var Xe=new Set;function Tn(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(Xe.has(r))return;Xe.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var Sn={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return Tn(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function ut(e){return typeof e==="string"?Sn[e]:e}function Ze(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let[o,a]of Object.entries(n))if(o in r){let s=ut(a);r[o]=s[t](r[o])}return r}var ee=new Set(["_attributes","_original","_definition","_hasSaved","_relations"]),et=Symbol.for("stacks.modelInstanceProxy"),Rn={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},createStripeUser:{bag:"_billable",mode:"model"},updateStripeUser:{bag:"_billable",mode:"model"},deleteStripeUser:{bag:"_billable",mode:"model"},createOrGetStripeUser:{bag:"_billable",mode:"model"},retrieveStripeUser:{bag:"_billable",mode:"model"},defaultPaymentMethod:{bag:"_billable",mode:"model"},setDefaultPaymentMethod:{bag:"_billable",mode:"model"},addPaymentMethod:{bag:"_billable",mode:"model"},paymentMethods:{bag:"_billable",mode:"model"},newSubscription:{bag:"_billable",mode:"model"},updateSubscription:{bag:"_billable",mode:"model"},cancelSubscription:{bag:"_billable",mode:"model"},activeSubscription:{bag:"_billable",mode:"model"},checkout:{bag:"_billable",mode:"model"},createSetupIntent:{bag:"_billable",mode:"model"},subscriptionHistory:{bag:"_billable",mode:"model"},transactionHistory:{bag:"_billable",mode:"model"},connectAccount:{bag:"_billable",mode:"model"},createConnectAccount:{bag:"_billable",mode:"model"},connectOnboardLink:{bag:"_billable",mode:"model"},syncConnectStatus:{bag:"_billable",mode:"model"},chargeWithSplit:{bag:"_billable",mode:"model"},generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Pn(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let s=a._attributes;if(o in s){r=s[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function R(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[et])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n&&Object.keys(n).length>0){for(let[o,a]of Object.entries(n))if(Object.prototype.hasOwnProperty.call(r,o))r[o]=ut(a).get(r[o])}return new Proxy(e,{get(o,a,s){let i=o;if(a===et)return!0;if(a==="saveAsync")return async function(){let c=i._definition,l=c?.set;if(l&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes),g=p&&typeof p.then==="function"?await p:p;i._attributes[d]=g}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="save")return function(){let c=i._definition,l=c?.set;if(l&&Object.keys(l).length>0&&typeof i.isDirty==="function"){for(let[d,m]of Object.entries(l)){if(typeof m!=="function")continue;if(!i.isDirty(d))continue;let p=m(i._attributes);if(p&&typeof p.then==="function")throw Error(`Setter for "${d}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);i._attributes[d]=p}let f=c.set;c.set={};try{return i.save()}finally{c.set=f}}return i.save()};if(a==="updateAsync")return async function(c){if(c&&typeof c==="object"&&!Array.isArray(c))for(let[l,f]of Object.entries(c))s[l]=f;return s.saveAsync()};if(a==="saveQuietly")return function(){return M(()=>i.save())};if(a==="saveAsyncQuietly")return function(){return M(()=>s.saveAsync())};if(a==="updateQuietly")return function(c){return M(()=>i.update(c))};if(a==="updateAsyncQuietly")return function(c){return M(()=>s.updateAsync(c))};if(a==="deleteQuietly")return function(){return M(()=>i.delete())};if(a==="toSearchableObject")return function(){let f=i._definition?.traits?.useSearch;if(!f)return null;let d=i._attributes;if(!d)return null;if(f===!0){let w={...d};if(d.id!=null)w.id=String(d.id);return w}let m={},p=f.displayable?.length?f.displayable:[...f.searchable??[],...f.filterable??[],...f.sortable??[],"id"],g=f.denormalize??{},h=i._relations;for(let w of p){let k=O(w),S=d[k]??d[w];if(S!==void 0){m[k]=S;continue}let A=g[w]??g[k];if(A){m[k]=Pn(h,A);continue}m[k]=void 0}if(d.id!=null)m.id=String(d.id);return m};if(typeof a==="string"&&!ee.has(a)){let c=i._attributes;if(c&&Object.prototype.hasOwnProperty.call(c,a))return c[a];let l=i._relations;if(l&&Object.prototype.hasOwnProperty.call(l,a)){let d=l[a];if(Array.isArray(d))return d.map((m)=>R(m,n));return d&&typeof d==="object"?R(d,n):d}let f=Rn[a];if(f){let p=i._definition?.__traitMethods?.[f.bag]?.[a];if(typeof p==="function")return f.mode==="model"?(...g)=>p(s,...g):(...g)=>p(i.id,...g)}if(c){let d=O(a);if(d!==a&&Object.prototype.hasOwnProperty.call(c,d))return c[d]}}let u=Reflect.get(i,a,i);return typeof u==="function"?u.bind(i):u},set(o,a,s,i){let u=o;if(typeof a==="string"&&!ee.has(a)){let{_attributes:c,set:l}=u;if(c&&Object.prototype.hasOwnProperty.call(c,a)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}if(c){let f=O(a);if(f!==a&&Object.prototype.hasOwnProperty.call(c,f)){if(typeof l==="function")l.call(u,f,s);else c[f]=s;return!0}}if(c&&!(a in u)){if(typeof l==="function")l.call(u,a,s);else c[a]=s;return!0}}return Reflect.set(u,a,s,i)},has(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return!0;let u=s._relations;if(u&&Object.prototype.hasOwnProperty.call(u,a))return!0;if(i){let c=O(a);if(c!==a&&Object.prototype.hasOwnProperty.call(i,c))return!0}}return Reflect.has(s,a)},deleteProperty(o,a){let s=o;if(typeof a==="string"&&!ee.has(a)){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return delete i[a],!0}return Reflect.deleteProperty(s,a)},ownKeys(o){let s=o._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(o,a){let s=o;if(typeof a==="string"){let i=s._attributes;if(i&&Object.prototype.hasOwnProperty.call(i,a))return{configurable:!0,enumerable:!0,value:i[a],writable:!0}}return Object.getOwnPropertyDescriptor(s,a)}})}var An=new Set(["get","first","last","firstOrFail","find","findOrFail","all","paginate","simplePaginate","cursorPaginate"]),xn={paginate:wn,simplePaginate:hn,cursorPaginate:bn},tt=Symbol.for("stacks.queryBuilderProxy");function lt(e,n){if(!e||typeof e!=="object")return e;if(e[tt])return e;return new Proxy(e,{get(t,r,o){if(r===tt)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;return function(...s){let i=s,u=String(r);if(u==="paginate"||u==="simplePaginate"){let{perPage:f,page:d}=ke(s[0],s[1]);i=[f,d]}else if(u==="cursorPaginate"){let{perPage:f,cursor:d}=_e(s[0],s[1]);i=[f,d,s[2],s[3]]}let c=a.apply(t,i),l=(f)=>{if(An.has(u)){if(Array.isArray(f))return f.map((m)=>R(m,n));let d=xn[u];if(d&&f&&Array.isArray(f.data)){let m=f.data.map((g)=>R(g,n)),p=d({...f,data:m});return Te(p)}if(f&&Array.isArray(f.data))return{...f,data:f.data.map((m)=>R(m,n))};return R(f,n)}if(f&&typeof f==="object"&&typeof f.get==="function")return lt(f,n);return f};if(c&&typeof c.then==="function")return c.then(l);return l(c)}}})}function On(e,n){let t=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let a of t){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let r=["create","firstOrCreate","updateOrCreate","make"];for(let a of r){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i),c=(l)=>Array.isArray(l)?l.map((f)=>R(f,n)):R(l,n);if(u&&typeof u.then==="function")return u.then(c);return c(u)}}let o=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let a of o){let s=e[a];if(typeof s!=="function")continue;e[a]=function(...i){let u=s.apply(this,i);return lt(u,n)}}}class dt extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class Ae extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Cn=new Set(["id","created_at","updated_at","deleted_at","uuid"]);function W(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let o=new Set,a=new Set,s=new Set;for(let[u,c]of Object.entries(r)){let l=O(u);if(o.add(l),c?.fillable===!0)a.add(l);if(c?.guarded===!0)s.add(l)}let i=a.size>0?a:o;for(let u of Object.keys(n)){let c=O(u);if(Cn.has(c))continue;if(s.has(c))throw new Ae(e.name,u,"guarded");if(c.endsWith("_id"))continue;if(!i.has(c))throw new Ae(e.name,u,"not-fillable")}return n}async function xe(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(s){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,s)}}return r}function Dn(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function s(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(typeof e.update!=="function")e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let m=e.find;return typeof m==="function"?await m.call(e,c):null}W(n,l);let f=await xe(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await xe(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function")return f.forceFill(c),await f.save()??f}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(typeof e.delete!=="function")e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0};if(typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new dt(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let m={...c,...l};return W(n,m),await s("firstOrCreate").call(e,m)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){W(n,l);let p=d[t];await o("updateOrCreate").call(e,t,p).update(l);let g=e.find;return typeof g==="function"?await g.call(e,p):{...d,...l}}let m={...c,...l};return W(n,m),await s("updateOrCreate").call(e,m)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let m=await d.count();return Number(m)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let i=[["latest","desc"],["oldest","asc"]];for(let[c,l]of i)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,m=typeof d.query==="function"?d.query():d;if(typeof m?.orderBy==="function"){let w=m.orderBy(f,l);if(typeof w.first==="function")return await w.first();if(typeof w.get==="function")return(await w.get())?.[0]??null}let p=e.all;if(typeof p!=="function")return null;return[...await p.call(e)||[]].sort((w,k)=>{let S=w?.[f],A=k?.[f];if(S===A)return 0;return(S>A?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=mt(n.traits?.useSearch,n);if(u){let c=u.index??n.table??O(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Fn(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),m=d(),p=0,g=e.query;if(typeof g==="function")try{let k=g.call(e);if(k&&typeof k.chunk==="function")return await k.chunk(l,async(S)=>{let A=await Oe(S,u);if(A.length>0)await m.addDocuments(c,A);p+=A.length}),p}catch{}let h=await f.call(e)||[],w=await Oe(h,u);if(w.length>0)await m.addDocuments(c,w);return w.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),f=l();if(typeof f.deleteAllDocuments==="function"){await f.deleteAllDocuments(c);return}let d=e.all,m=typeof d==="function"?await d.call(e)||[]:[],p=l();for(let g of m){let h=g?.id??g?._attributes?.id;if(h!=null)await p.deleteDocument(c,Number(h))}}}}async function Oe(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>En(r,n)))).filter(Boolean)}function vn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Mn(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function En(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Mn(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Fn(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},s={q:t,...a,...r??{}},i={with(u){return s={...s,...u},i},where(u){return s={...s,filter:u},i},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,s))?.hits??[]},async paginate(u,c=1){let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...s,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,s)}};return i}function ft(e){let n=O(e);return n===e?[e]:[e,n]}async function Pe(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of ft(r)){if(!(o in t))continue;let a=t[o];if(!N(a))continue;t[o]=await ae(a)}}function $n(e,n){if(n.length===0)return;let t=async(i)=>{if(Array.isArray(i)){for(let u of i)await Pe(u,n);return i}if(i&&typeof i==="object"&&Array.isArray(i.data)){for(let u of i.data)await Pe(u,n);return i}if(i)await Pe(i,n);return i},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","firstOrCreate","updateOrCreate","make"];for(let i of o){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let i of["update","forceUpdate"]){let u=e[i];if(typeof u!=="function")continue;e[i]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],s=(i)=>{if(!i||typeof i!=="object")return i;let u=i;if(u.__stacksEncryptedReads)return i;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return s(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),i};for(let i of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[i];if(typeof u!=="function")continue;e[i]=function(...c){return s(u.apply(this,c))}}}function In(e,n){if(n.length===0)return;let t=async(o)=>{if(!o||typeof o!=="object"||Array.isArray(o))return o;let a={...o};for(let s of n)for(let i of ft(s))if(i in a)a[i]=await oe(a[i]);return a},r=["create","firstOrCreate","updateOrCreate","forceCreate"];for(let o of r){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await a.apply(this,s)}}for(let o of["update","forceUpdate"]){let a=e[o];if(typeof a!=="function")continue;e[o]=async function(s,i){let u=await t(i);return await a.call(this,s,u)}}}function jn(e,n){let t=e.create;if(typeof t==="function")e.create=async function(r,...o){W(n,r);let a=await xe(n,r);return await t.call(this,a,...o)};for(let r of["firstOrCreate","updateOrCreate"]){let o=e[r];if(typeof o!=="function")continue}}function Nn(e,n){let t=String(n?.name??e.name??"Model"),r=(s,i)=>{if(kn())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let u=We(s,n,i);if(!u.valid)throw new ct(t,u.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...i){return r(s,"creating"),await o.call(this,s,...i)};let a=e.update;if(typeof a==="function")e.update=async function(s,i,...u){return r(i,"updating"),await a.call(this,s,i,...u)}}function Bn(e,n){let t=["create","firstOrCreate","updateOrCreate"];for(let o of t){let a=e[o];if(typeof a==="function")e[o]=async function(...s){if(_.debug(`[orm] ${o.charAt(0).toUpperCase()+o.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=Ze(s[0],n,"set");return await a.apply(this,s)}}let r=e.update;if(typeof r==="function")e.update=async function(o,a){let s=a&&typeof a==="object"&&!Array.isArray(a)?Ze(a,n,"set"):a;return await r.call(this,o,s)}}function pt(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);let n=qn(e),t=Ln(e),r=Un(n,t),o=Kn(e);e.__traitMethods=o;let a=r?{...e,hooks:{...e.hooks,...r}}:e,i=yn(a);if(On(i,e.casts),Dn(i,a),jn(i,a),e.casts&&Object.keys(e.casts).length>0)Bn(i,e.casts);let u=ie(e);if(u.length>0)In(i,u),$n(i,u);let c=e.traits?.useSoftDeletes;if(c)Qn(i,a,c);let l=e.traits?.useAudit;if(l){let m=je(l);Ne(i,e.name,e.primaryKey||"id",m)}Nn(i,a);let f=i;f.withoutValidation=function(m){return _n(m)},f.withoutEvents=function(m){return M(m)};for(let m of["create","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let p=i[m];if(typeof p!=="function")continue;let g=`${m}Quietly`;if(typeof i[g]==="function")continue;i[g]=function(...h){return M(()=>p.apply(i,h))}}let d=Object.assign(i,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return gn(e.name,d),Object.defineProperty(d,Ce,{value:e,enumerable:!1,configurable:!0}),d}function qn(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let m=d?.attributes;if(!m||typeof m!=="object")return d;let p=e.primaryKey||"id",g={...m};if(g[p]===void 0&&d[p]!==void 0)g[p]=d[p];return g},o=async(d,m)=>{if(E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(d,m)}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}},a=e.traits?.broadcastOn,s=e.traits?.broadcastWith,i=typeof a==="function"&&typeof s==="function",u=async(d,m)=>{if(!i)return;if(E())return;try{let p=a(m),g=Array.isArray(p)?p:[p],h=s(m),k=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof k!=="function")return;for(let S of g){if(typeof S!=="string"||S.length===0)continue;await k(S,d,h)}}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,p),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw p}},c=async(d,m)=>{if(E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(d,m);if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p&&typeof p==="object"&&"code"in p&&p.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,p),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw p}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let m=r(d);await o(`${t}:created`,m),await o(`${t}:saved`,m),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let m=r(d);await o(`${t}:updated`,m),await o(`${t}:saved`,m),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function Un(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let s of o)await s(...a)}}return Object.keys(n).length?n:void 0}function mt(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=vn(n);return t}function Ln(e){let n=mt(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??O(`${e.name}s`);async function o(i){if(typeof t.shapeMany==="function")try{let[l]=await Oe([i],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(i)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=R(i).toSearchableObject?.();if(c!==void 0)return c;return i?._attributes??(typeof i?.toJSON==="function"?i.toJSON():null)}let a=async(i)=>{if(E())return;let u=await o(i);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await rt(r,u,e.name)}return}await rt(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(i)=>{if(E())return;let u=i?.id??i?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await ot(r,Number(u),e.name)}return}await ot(r,Number(u),e.name)}}}var nt=new Map;function yt(e,n){let t=nt.get(e)??0;if(nt.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function rt(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){yt(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function ot(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){yt(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function Kn(e){let n={},t=e.table,r=e.traits;if(!r)return n;if(r.taggable)n._taggable=pe(t);if(r.categorizable)n._categorizable=me(t);if(r.commentable)n._commentable=de(t);if(r.billable)n._billable=He(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=ye(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=Ge();return n}function Qn(e,n,t){let r=Je(e,n.primaryKey||"id"),o=Ye(t),a=n,s=n.name.toLowerCase(),i=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(m)=>{if(!i||E())return!0;try{let{dispatchAsync:p}=await import("@stacksjs/events"),g=await p(`${s}:restoring`,{id:m});if(Array.isArray(g)&&g.some((h)=>h===!1))return!1}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${s}:restoring' handler error:`,p)}return!0},c=async(m)=>{if(!i||E())return;try{let{dispatch:p}=await import("@stacksjs/events");await p(`${s}:restored`,{id:m})}catch(p){if(p?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${s}:restored' handler error:`,p)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(m)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(m);if(g&&o.cascade?.length)await Q(a,o,m,"softDelete");return g}let{db:p}=await import("@stacksjs/database");return await p.transaction(async()=>{let g=await r.softDelete(m);if(g)await Q(a,o,m,"softDelete");return g})},d=async(m)=>{if(!await u(m))return!1;if(!o.cascade?.length||!l){let w=await r.restore(m);if(w){if(o.cascade?.length)await Q(a,o,m,"restore");await c(m)}return w}let{db:g}=await import("@stacksjs/database"),h=await g.transaction(async()=>{let w=await r.restore(m);if(w)await Q(a,o,m,"restore");return w});if(h)await c(m);return h};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function Wn(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>Wn(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var Vn=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],zn=["traits","dashboard"];function Hn(e){let n=e?.[Ce];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function Gn(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function Jn(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function Yn(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=Jn(r),s=Object.fromEntries(Object.entries(o).map(([i,u])=>{let c=!(i in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[i,{...u,order:++a}];return[i,u]}));t.attributes={...r,...s}}for(let a of Vn){let s=Gn(e[a],n[a]);if(s)t[a]=s}for(let a of zn){let s=e[a],i=n[a];if(s&&i&&typeof s==="object"&&typeof i==="object")t[a]={...s,...i}}return t}function Ui(e,n){return pt(Yn(Hn(e),n))}import ar from"process";import{log as ir}from"@stacksjs/logging";import{path as P}from"@stacksjs/path";import{fs as V}from"@stacksjs/storage";import{Database as Xn}from"bun:sqlite";import{existsSync as Zn,readdirSync as er,readFileSync as tr}from"fs";function nr(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function rr(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function or(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch{}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function gt(e,n="sqlite"){let t=[];if(!Zn(e))return{tables:[],errors:t};let r;try{r=er(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new Xn(":memory:");try{for(let i of r){let u=`${e}/${i}`,c;try{c=tr(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=or(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((i)=>i.name).filter((i)=>!nr(i)),s=[];for(let i of a){let u=o.query(`PRAGMA table_info("${i.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=rr(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}s.push({table:i,columns:c})}return{tables:s,errors:t}}finally{o.close()}}function sr(e){if(e)return e;let n=String(ar.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function te(e){return e==="postgres"?"boolean":"number"}function C(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function cr(e,n){let t=e.default;if(typeof t==="boolean")return te(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function ur(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function lr(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function dr(e,n){let t=ur(e),r=lr(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return te(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return cr(e,n)}})();return e.nullable===!0?`${a} | null`:a}function fr(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${C(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${C(a.model)}_id`]="number"}}return n}function pr(e,n){let[t,r]=[C(e),C(n)].sort();return`${t}_${r}`}function mr(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?te(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function yr(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let s of a){let i,u,c,l,f={},d=!0;if(typeof s==="string")i=s;else if(s&&typeof s==="object"&&"model"in s){let w=s;if(i=w.model,"pivotTable"in w||"firstForeignKey"in w||"secondForeignKey"in w)u=w.pivotTable,c=w.firstForeignKey,l=w.secondForeignKey;else{let k=s;u=k.table,c=k.foreignKey,l=k.relatedKey,f=k.pivot?.columns??{},d=Boolean(k.pivot?.timestamps)}}else continue;let m=u??pr(e,i),p=c??`${C(e)}_id`,g=l??`${C(i)}_id`,h={id:"number",[p]:"number",[g]:"number"};for(let[w,k]of Object.entries(f))h[w]=mr(k,t);if(d)h.created_at="string",h.updated_at="string | null";o.push({table:m,columns:h})}return o}function gr(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${te(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function br(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,gr(n));return t}function wr(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[C(o)]=dr(a,n);return t}function bt(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([i,u])=>`${o}${i}: ${u}`).join(`
|
|
3
|
+
`),s=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${s}: {
|
|
4
4
|
${o}// columns
|
|
5
5
|
${a}
|
|
6
|
-
${r}}`}var
|
|
6
|
+
${r}}`}var hr=`/* eslint-disable */
|
|
7
7
|
// AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
|
|
8
8
|
// Regenerate after adding/removing a model or changing its attributes.
|
|
9
9
|
// See stacksjs/stacks#1923.
|
|
10
10
|
|
|
11
11
|
declare module '@stacksjs/database' {
|
|
12
12
|
interface DatabaseSchema {
|
|
13
|
-
`,
|
|
13
|
+
`,kr=` }
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
export {}
|
|
17
|
-
`,
|
|
18
|
-
`;function
|
|
19
|
-
`),m=`${
|
|
20
|
-
${
|
|
21
|
-
`);return`${
|
|
22
|
-
${qt(n)}`}import{configureOrm as Gr}from"@stacksjs/query-builder";function Jr(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Gr({database:e})}catch{}}Jr();async function Ut(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 ce(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Ut(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}/`:"",i=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Ut(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var E={},Lt=()=>{},Ls=new Promise((e)=>{Lt=e});function g(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=E[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=E[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=E[e];return r==null?!1:(t in r)},apply(n,t,r){let o=E[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Yr=g("User"),Xr=g("Job"),Zr=g("FailedJob"),eo=[["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 ce("User");if(n)E.User=n;if(e("queue")){let t=await ce("Job");if(t)E.Job=t;let r=await ce("FailedJob");if(r)E.FailedJob=r}for(let[t,r,o]of eo){if(!e(o))continue;let a=await ce(t,r);if(a)E[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Lt()}});var to=g("Activity"),no=g("AnalyticsEvent"),ro=g("Automation"),oo=g("AutomationRun"),ao=g("Auction"),io=g("CampaignVariant"),so=g("CommunicationSuppression"),uo=g("ConsentEvent"),co=g("SenderDomain"),lo=g("UsageEvent"),fo=g("AuctionItem"),po=g("Author"),mo=g("Bid"),go=g("Board"),yo=g("BoardColumn"),bo=g("Campaign"),wo=g("Card"),ho=g("CardComment"),To=g("Cart"),ko=g("CartItem"),_o=g("Category"),Ro=g("Comment"),So=g("Coupon"),Po=g("Customer"),xo=g("DeliveryRoute"),Ao=g("DeliveryStop"),Mo=g("Deployment"),Co=g("DigitalDelivery"),Oo=g("Courier"),vo=g("CourierPing"),Do=g("CampaignSend"),Eo=g("EmailList"),Fo=g("EmailListSubscriber"),$o=g("Form"),No=g("FormField"),jo=g("FormSubmission"),Bo=g("MagicLinkToken"),Io=g("Menu"),qo=g("MenuItem"),Ko=g("PageRevision"),Uo=g("Pledge"),Lo=g("Redirect"),Qo=g("Site"),Wo=g("SiteDomain"),Vo=g("SmsOptOut"),Ho=g("EmailIdempotency"),zo=g("EmailSuppression"),Go=g("EmailWebhookEvent"),Jo=g("Error"),Yo=g("GiftCard"),Xo=g("Label"),Zo=g("LicenseKey"),ea=g("Log"),ta=g("LoyaltyPoint"),na=g("LoyaltyReward"),ra=g("MailPreference"),oa=g("Manufacturer"),aa=g("Notification"),ia=g("NotificationDelivery"),sa=g("Order"),ua=g("OrderIdempotency"),ca=g("OrderItem"),la=g("Page"),da=g("Payment"),fa=g("PaymentMethod"),pa=g("PaymentProduct"),ma=g("PaymentTransaction"),ga=g("Post"),ya=g("PrintDevice"),ba=g("Product"),wa=g("ProductUnit"),ha=g("ProductVariant"),Ta=g("QueryLog"),ka=g("Receipt"),_a=g("Release"),Ra=g("Request"),Sa=g("Review"),Pa=g("ShippingMethod"),xa=g("ShippingRate"),Aa=g("ShippingZone"),Ma=g("SocialPost"),Ca=g("SocialAccount"),Oa=g("Subscriber"),va=g("SubscriberEmail"),Da=g("Subscription"),Ea=g("Tag"),Fa=g("TaxRate"),$a=g("Team"),Na=g("TeamInvitation"),ja=g("TeamMember"),Ba=g("Transaction"),Ia=g("WaitlistProduct"),qa=g("WaitlistRestaurant"),Ka=g("Websocket"),Qt={User:Yr,Job:Xr,FailedJob:Zr,Activity:to,AnalyticsEvent:no,Automation:ro,AutomationRun:oo,Auction:ao,AuctionItem:fo,Author:po,Bid:mo,Board:go,BoardColumn:yo,Campaign:bo,CampaignSend:Do,CampaignVariant:io,Card:wo,CardComment:ho,Cart:To,CartItem:ko,Category:_o,Comment:Ro,Coupon:So,Customer:Po,CommunicationSuppression:so,ConsentEvent:uo,DeliveryRoute:xo,DeliveryStop:Ao,Deployment:Mo,DigitalDelivery:Co,Courier:Oo,CourierPing:vo,EmailList:Eo,EmailListSubscriber:Fo,EmailIdempotency:Ho,EmailSuppression:zo,EmailWebhookEvent:Go,ErrorModel:Jo,Form:$o,FormField:No,FormSubmission:jo,GiftCard:Yo,Label:Xo,LicenseKey:Zo,Log:ea,LoyaltyPoint:ta,LoyaltyReward:na,MailPreference:ra,Manufacturer:oa,Notification:aa,MagicLinkToken:Bo,Menu:Io,MenuItem:qo,NotificationDelivery:ia,Order:sa,OrderIdempotency:ua,OrderItem:ca,Page:la,PageRevision:Ko,Payment:da,PaymentMethod:fa,PaymentProduct:pa,PaymentTransaction:ma,Pledge:Uo,Post:ga,PrintDevice:ya,Product:ba,ProductUnit:wa,ProductVariant:ha,QueryLog:Ta,Receipt:ka,Release:_a,Request:Ra,Review:Sa,ShippingMethod:Pa,Redirect:Lo,SenderDomain:co,ShippingRate:xa,ShippingZone:Aa,Site:Qo,SiteDomain:Wo,SmsOptOut:Vo,SocialAccount:Ca,SocialPost:Ma,Subscriber:Oa,SubscriberEmail:va,Subscription:Da,Tag:Ea,TaxRate:Fa,Team:$a,TeamInvitation:Na,TeamMember:ja,Transaction:Ba,UsageEvent:lo,WaitlistProduct:Ia,WaitlistRestaurant:qa,Websocket:Ka},K=globalThis;for(let[e,n]of Object.entries(Qt))if(n&&K[e]===void 0)K[e]=n;var Qs=Object.keys(Qt);async function Ua(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 La(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(K.safeAll===void 0)K.safeAll=Ua;if(K.safeGet===void 0)K.safeGet=La;export{to as Activity,no as AnalyticsEvent,ao as Auction,fo as AuctionItem,po as Author,ro as Automation,oo as AutomationRun,mo as Bid,go as Board,yo as BoardColumn,bo as Campaign,Do as CampaignSend,io as CampaignVariant,wo as Card,ho as CardComment,To as Cart,ko as CartItem,_o as Category,Ro as Comment,so as CommunicationSuppression,uo as ConsentEvent,So as Coupon,Oo as Courier,vo as CourierPing,Po as Customer,xo as DeliveryRoute,Ao as DeliveryStop,Mo as Deployment,Co as DigitalDelivery,Ho as EmailIdempotency,Eo as EmailList,Fo as EmailListSubscriber,zo as EmailSuppression,Go as EmailWebhookEvent,Jo as ErrorModel,Zr as FailedJob,$o as Form,No as FormField,jo as FormSubmission,Yo as GiftCard,Xr as Job,Xo as Label,Zo as LicenseKey,ea as Log,ta as LoyaltyPoint,na as LoyaltyReward,Le as MODEL_DEFINITION,Bo as MagicLinkToken,ra as MailPreference,oa as Manufacturer,qe as MassAssignmentException,Io as Menu,qo as MenuItem,Dt as ModelNotFoundError,Ct as ModelValidationError,aa as Notification,ia as NotificationDelivery,sa as Order,ua as OrderIdempotency,ca as OrderItem,la as Page,Ko as PageRevision,da as Payment,fa as PaymentMethod,pa as PaymentProduct,ma as PaymentTransaction,Uo as Pledge,ga as Post,ya as PrintDevice,ba as Product,wa as ProductUnit,ha as ProductVariant,Ta as QueryLog,ka as Receipt,Lo as Redirect,_a as Release,Ra as Request,Sa as Review,co as SenderDomain,Pa as ShippingMethod,xa as ShippingRate,Aa as ShippingZone,Qo as Site,Wo as SiteDomain,Vo as SmsOptOut,Ca as SocialAccount,Ma as SocialPost,Mn as SubqueryBuilder,Oa as Subscriber,va as SubscriberEmail,Da as Subscription,Ea as Tag,Fa as TaxRate,$a as Team,Na as TeamInvitation,ja as TeamMember,Ba as Transaction,lo as UsageEvent,Yr as User,Ia as WaitlistProduct,qa as WaitlistRestaurant,Ka as Websocket,Mi as batchLoad,Hr as buildDatabaseSchema,pe as collectEncryptedAttributes,Je as createAuditMethods,ke as createCategorizableMethods,we as createCommentableMethods,_e as createLikeableMethods,Te as createTaggableMethods,_n as customerOwnership,Di as db,fe as decryptValue,Ft as defineModel,de as encryptValue,Ne as enrichPaginatorUrls,Os as extendModel,ts as extractDate,Xi as extractFields,zi as fetchOtherModelRelations,pn as filterFillable,Ae as findCoreModel,Me as findUserModel,es as formatDate,Yi as getFillableAttributes,Ji as getGuardedAttributes,Gi as getHiddenAttributes,H as getModelName,On as getPivotTableName,Hi as getPivotTables,za as getPrunableConfig,Vi as getRelationCount,Wi as getRelationType,vn as getRelations,A as getTableName,fn as getWritableFields,Qi as hasRelations,jn as isCursorPaginator,U as isEncrypted,$n as isPaginator,Nn as isSimplePaginator,nt as isUniqueViolation,Zi as mapEntity,ln as mapWriteError,Ha as massPrunable,kr as mergeModelDefinition,Qs as modelGlobalNames,Li as modelTableName,Ls as ormReady,xn as parentOwnership,pt as parseCursor,Ue as projectDocumentsFromTrait,Wt as prunable,zr as renderDatabaseTypeFile,$e as resolveCursorArgs,Fe as resolvePageArgs,Ni as savepoint,Rn as selfOwnership,Zt as setAuditUser,Sn as siteOwnership,Pn as teamMembershipOwnership,gr as toAttrs,De as toCursorPaginator,Oe as toPaginator,ve as toSimplePaginator,dn as toSnakeCaseKeys,ns as toTimestamp,$i as transaction,ji as transactional,N as withoutEvents,Wn as withoutValidation};
|
|
17
|
+
`,_r="/* eslint-disable */\n// AUTO-GENERATED by `buddy generate:db-types --framework` \u2014 do not edit.\n//\n// The shapes of the tables the framework itself ships, so framework code gets\n// real rows from `db.selectFrom(...)` without asserting them. An application's\n// own tables (and its overrides of these) live in `DatabaseSchema`, which takes\n// precedence - see `RowOf` in `./utils`.\n\nexport interface FrameworkSchema {\n",Tr=`}
|
|
18
|
+
`;function wt(e){return e==="framework"?_r:hr}function ht(e){return e==="framework"?Tr:kr}async function kt(e,n,t=[]){let r=[];if(!V.existsSync(e))return r;let o=V.readdirSync(e,{withFileTypes:!0});for(let a of o){let s=P.join(e,a.name);if(a.isDirectory()){if(n){let i=await kt(s,!0,t);r.push(...i)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let i=await(P.isAbsolute(s)?import(s):import(P.resolve(s))),u=i.default||i;if(u?.name&&(u.attributes||u.table))r.push({filePath:s,model:u})}catch(i){t.push({file:s,error:i.message})}}return r}async function Sr(e={}){let n=sr(e.dialect),t=e.modelsDir??P.userModelsPath(),r=e.defaultsDir??P.frameworkPath("defaults/app/Models"),o=e.outFile??P.projectPath("database/types.d.ts"),a=[],s=[];for(let[p,g]of[[t,!1],[r,!0]])try{let h=await kt(p,g,a);s.push(...h)}catch(h){a.push({file:p,error:h.message})}let i=new Map;for(let p of s)i.set(p.model.name??P.basename(p.filePath).replace(/\.ts$/,""),p);for(let p of s)if(p.filePath.startsWith(t))i.set(p.model.name??P.basename(p.filePath).replace(/\.ts$/,""),p);let u=[];for(let[p,{model:g}]of i){let h=g.table??`${C(p)}s`,w={...br(g,n),...wr(g,n),...fr(g)};u.push({table:h,model:p,columns:w})}let c=new Map;for(let[p,{model:g}]of i)for(let h of yr(p,g,n)){if(c.has(h.table))continue;c.set(h.table,{table:h.table,model:`(${h.table} pivot)`,columns:h.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let p=e.migrationsDir??P.resolve(P.dirname(o),"migrations"),g=new Set(u.map((w)=>w.table)),h=gt(p,n);for(let w of h.tables){if(g.has(w.table))continue;g.add(w.table),u.push({table:w.table,model:`(${w.table} migration)`,columns:w.columns})}a.push(...h.errors)}u.sort((p,g)=>p.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((p)=>bt(p.table,p.columns,f)).join(`
|
|
19
|
+
`),m=`${wt(l)}${d}
|
|
20
|
+
${ht(l)}`;if(!e.dryRun){let p=P.dirname(o);if(!V.existsSync(p))V.mkdirSync(p,{recursive:!0});V.writeFileSync(o,m,"utf-8"),ir.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:m}}function Rr(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>bt(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
21
|
+
`);return`${wt(n)}${t}
|
|
22
|
+
${ht(n)}`}import{isCursorPaginator as Ss,isPaginator as Rs,isSimplePaginator as Ps,toCursorPaginator as As,toPaginator as xs,toSimplePaginator as Os}from"@stacksjs/pagination";import{configureOrm as Pr}from"@stacksjs/query-builder";function Ar(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Pr({database:e})}catch{}}Ar();async function _t(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function ne(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await _t(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",s=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(s).exists())return await _t(s)}catch(i){console.error(`[orm] Failed to import framework default model ${e} from ${s} - trying next subdir. Reason:`,i)}}return null}var D={},Tt=()=>{},es=new Promise((e)=>{Tt=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=D[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=D[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=D[e];return r==null?!1:(t in r)},apply(n,t,r){let o=D[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var xr=y("User"),Or=y("Job"),Cr=y("FailedJob"),Dr=[["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await ne("User");if(n)D.User=n;if(e("queue")){let t=await ne("Job");if(t)D.Job=t;let r=await ne("FailedJob");if(r)D.FailedJob=r}for(let[t,r,o]of Dr){if(!e(o))continue;let a=await ne(t,r);if(a)D[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Tt()}});var vr=y("Activity"),Mr=y("AnalyticsEvent"),Er=y("Automation"),Fr=y("AutomationRun"),$r=y("Auction"),Ir=y("CampaignVariant"),jr=y("CommunicationSuppression"),Nr=y("ConsentEvent"),Br=y("SenderDomain"),qr=y("UsageEvent"),Ur=y("AuctionItem"),Lr=y("Author"),Kr=y("Bid"),Qr=y("Board"),Wr=y("BoardColumn"),Vr=y("Campaign"),zr=y("Card"),Hr=y("CardComment"),Gr=y("Cart"),Jr=y("CartItem"),Yr=y("Category"),Xr=y("Comment"),Zr=y("Coupon"),eo=y("Customer"),to=y("DeliveryRoute"),no=y("DeliveryStop"),ro=y("Deployment"),oo=y("DigitalDelivery"),ao=y("Courier"),io=y("CourierPing"),so=y("CampaignSend"),co=y("EmailList"),uo=y("EmailListSubscriber"),lo=y("Form"),fo=y("FormField"),po=y("FormSubmission"),mo=y("MagicLinkToken"),yo=y("Menu"),go=y("MenuItem"),bo=y("PageRevision"),wo=y("Pledge"),ho=y("Redirect"),ko=y("Site"),_o=y("SiteDomain"),To=y("SmsOptOut"),So=y("EmailIdempotency"),Ro=y("EmailSuppression"),Po=y("EmailWebhookEvent"),Ao=y("Error"),xo=y("GiftCard"),Oo=y("Label"),Co=y("LicenseKey"),Do=y("Log"),vo=y("LoyaltyPoint"),Mo=y("LoyaltyReward"),Eo=y("MailPreference"),Fo=y("Manufacturer"),$o=y("Notification"),Io=y("NotificationDelivery"),jo=y("Order"),No=y("OrderIdempotency"),Bo=y("OrderItem"),qo=y("Page"),Uo=y("Payment"),Lo=y("PaymentMethod"),Ko=y("PaymentProduct"),Qo=y("PaymentTransaction"),Wo=y("Post"),Vo=y("PrintDevice"),zo=y("Product"),Ho=y("ProductUnit"),Go=y("ProductVariant"),Jo=y("QueryLog"),Yo=y("Receipt"),Xo=y("Release"),Zo=y("Request"),ea=y("Review"),ta=y("ShippingMethod"),na=y("ShippingRate"),ra=y("ShippingZone"),oa=y("SocialPost"),aa=y("SocialAccount"),ia=y("Subscriber"),sa=y("SubscriberEmail"),ca=y("Subscription"),ua=y("Tag"),la=y("TaxRate"),da=y("Team"),fa=y("TeamInvitation"),pa=y("TeamMember"),ma=y("Transaction"),ya=y("WaitlistProduct"),ga=y("WaitlistRestaurant"),ba=y("Websocket"),St={User:xr,Job:Or,FailedJob:Cr,Activity:vr,AnalyticsEvent:Mr,Automation:Er,AutomationRun:Fr,Auction:$r,AuctionItem:Ur,Author:Lr,Bid:Kr,Board:Qr,BoardColumn:Wr,Campaign:Vr,CampaignSend:so,CampaignVariant:Ir,Card:zr,CardComment:Hr,Cart:Gr,CartItem:Jr,Category:Yr,Comment:Xr,Coupon:Zr,Customer:eo,CommunicationSuppression:jr,ConsentEvent:Nr,DeliveryRoute:to,DeliveryStop:no,Deployment:ro,DigitalDelivery:oo,Courier:ao,CourierPing:io,EmailList:co,EmailListSubscriber:uo,EmailIdempotency:So,EmailSuppression:Ro,EmailWebhookEvent:Po,ErrorModel:Ao,Form:lo,FormField:fo,FormSubmission:po,GiftCard:xo,Label:Oo,LicenseKey:Co,Log:Do,LoyaltyPoint:vo,LoyaltyReward:Mo,MailPreference:Eo,Manufacturer:Fo,Notification:$o,MagicLinkToken:mo,Menu:yo,MenuItem:go,NotificationDelivery:Io,Order:jo,OrderIdempotency:No,OrderItem:Bo,Page:qo,PageRevision:bo,Payment:Uo,PaymentMethod:Lo,PaymentProduct:Ko,PaymentTransaction:Qo,Pledge:wo,Post:Wo,PrintDevice:Vo,Product:zo,ProductUnit:Ho,ProductVariant:Go,QueryLog:Jo,Receipt:Yo,Release:Xo,Request:Zo,Review:ea,ShippingMethod:ta,Redirect:ho,SenderDomain:Br,ShippingRate:na,ShippingZone:ra,Site:ko,SiteDomain:_o,SmsOptOut:To,SocialAccount:aa,SocialPost:oa,Subscriber:ia,SubscriberEmail:sa,Subscription:ca,Tag:ua,TaxRate:la,Team:da,TeamInvitation:fa,TeamMember:pa,Transaction:ma,UsageEvent:qr,WaitlistProduct:ya,WaitlistRestaurant:ga,Websocket:ba},j=globalThis;for(let[e,n]of Object.entries(St))if(n&&j[e]===void 0)j[e]=n;var ts=Object.keys(St);async function wa(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function ha(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(j.safeAll===void 0)j.safeAll=wa;if(j.safeGet===void 0)j.safeGet=ha;export{vr as Activity,Mr as AnalyticsEvent,$r as Auction,Ur as AuctionItem,Lr as Author,Er as Automation,Fr as AutomationRun,Kr as Bid,Qr as Board,Wr as BoardColumn,Vr as Campaign,so as CampaignSend,Ir as CampaignVariant,zr as Card,Hr as CardComment,Gr as Cart,Jr as CartItem,Yr as Category,Xr as Comment,jr as CommunicationSuppression,Nr as ConsentEvent,Zr as Coupon,ao as Courier,io as CourierPing,eo as Customer,to as DeliveryRoute,no as DeliveryStop,ro as Deployment,oo as DigitalDelivery,So as EmailIdempotency,co as EmailList,uo as EmailListSubscriber,Ro as EmailSuppression,Po as EmailWebhookEvent,Ao as ErrorModel,Cr as FailedJob,lo as Form,fo as FormField,po as FormSubmission,xo as GiftCard,Or as Job,Oo as Label,Co as LicenseKey,Do as Log,vo as LoyaltyPoint,Mo as LoyaltyReward,Ce as MODEL_DEFINITION,mo as MagicLinkToken,Eo as MailPreference,Fo as Manufacturer,Ae as MassAssignmentException,yo as Menu,go as MenuItem,dt as ModelNotFoundError,ct as ModelValidationError,$o as Notification,Io as NotificationDelivery,jo as Order,No as OrderIdempotency,Bo as OrderItem,qo as Page,bo as PageRevision,Uo as Payment,Lo as PaymentMethod,Ko as PaymentProduct,Qo as PaymentTransaction,wo as Pledge,Wo as Post,Vo as PrintDevice,zo as Product,Ho as ProductUnit,Go as ProductVariant,Jo as QueryLog,Yo as Receipt,ho as Redirect,Xo as Release,Zo as Request,ea as Review,Br as SenderDomain,ta as ShippingMethod,na as ShippingRate,ra as ShippingZone,ko as Site,_o as SiteDomain,To as SmsOptOut,aa as SocialAccount,oa as SocialPost,sn as SubqueryBuilder,ia as Subscriber,sa as SubscriberEmail,ca as Subscription,ua as Tag,la as TaxRate,da as Team,fa as TeamInvitation,pa as TeamMember,ma as Transaction,qr as UsageEvent,xr as User,ya as WaitlistProduct,ga as WaitlistRestaurant,ba as Websocket,oi as batchLoad,Sr as buildDatabaseSchema,ie as collectEncryptedAttributes,Ie as createAuditMethods,me as createCategorizableMethods,de as createCommentableMethods,ye as createLikeableMethods,pe as createTaggableMethods,en as customerOwnership,ci as db,ae as decryptValue,pt as defineModel,oe as encryptValue,Te as enrichPaginatorUrls,Ui as extendModel,Wt as filterFillable,Ra as getPrunableConfig,Qt as getWritableFields,Ss as isCursorPaginator,N as isEncrypted,Rs as isPaginator,Ps as isSimplePaginator,Le as isUniqueViolation,Lt as mapWriteError,Sa as massPrunable,Yn as mergeModelDefinition,ts as modelGlobalNames,es as ormReady,on as parentOwnership,Ve as parseCursor,Oe as projectDocumentsFromTrait,Rt as prunable,Rr as renderDatabaseTypeFile,_e as resolveCursorArgs,ke as resolvePageArgs,fi as savepoint,tn as selfOwnership,Mt as setAuditUser,nn as siteOwnership,rn as teamMembershipOwnership,Wn as toAttrs,As as toCursorPaginator,xs as toPaginator,Os as toSimplePaginator,Kt as toSnakeCaseKeys,di as transaction,pi as transactional,M as withoutEvents,_n as withoutValidation};
|
|
@@ -17,7 +17,10 @@ export default defineModel({
|
|
|
17
17
|
useApi: {
|
|
18
18
|
uri: 'email-idempotency',
|
|
19
19
|
routes: ['index', 'show', 'destroy'],
|
|
20
|
-
|
|
20
|
+
// Reads stay as they were; writes need an admin.
|
|
21
|
+
// idempotency keys are what stop a retry from sending twice,
|
|
22
|
+
// so `auth` alone let any signed-in caller do it (stacksjs/stacks#2412).
|
|
23
|
+
middleware: { read: ['auth'], write: ['auth', 'role:admin'] },
|
|
21
24
|
},
|
|
22
25
|
},
|
|
23
26
|
|
|
@@ -25,7 +25,10 @@ export default defineModel({
|
|
|
25
25
|
useApi: {
|
|
26
26
|
uri: 'email-suppressions',
|
|
27
27
|
routes: ['index', 'show', 'destroy'],
|
|
28
|
-
|
|
28
|
+
// Reads stay as they were; writes need an admin.
|
|
29
|
+
// a suppression entry is a compliance record - deleting one re-enables mail to someone who bounced or opted out,
|
|
30
|
+
// so `auth` alone let any signed-in caller do it (stacksjs/stacks#2412).
|
|
31
|
+
middleware: { read: ['auth'], write: ['auth', 'role:admin'] },
|
|
29
32
|
},
|
|
30
33
|
},
|
|
31
34
|
|
|
@@ -25,7 +25,10 @@ export default defineModel({
|
|
|
25
25
|
useApi: {
|
|
26
26
|
uri: 'email-webhook-events',
|
|
27
27
|
routes: ['index', 'show', 'destroy'],
|
|
28
|
-
|
|
28
|
+
// Reads stay as they were; writes need an admin.
|
|
29
|
+
// provider webhook events are the audit trail for what the provider told us,
|
|
30
|
+
// so `auth` alone let any signed-in caller do it (stacksjs/stacks#2412).
|
|
31
|
+
middleware: { read: ['auth'], write: ['auth', 'role:admin'] },
|
|
29
32
|
},
|
|
30
33
|
},
|
|
31
34
|
|
package/dist/models/Request.ts
CHANGED
|
@@ -36,7 +36,10 @@ export default defineModel({
|
|
|
36
36
|
useApi: {
|
|
37
37
|
uri: 'requests',
|
|
38
38
|
routes: ['index', 'store', 'show', 'update', 'destroy'],
|
|
39
|
-
|
|
39
|
+
// Reads stay as they were; writes need an admin.
|
|
40
|
+
// request logs are an audit trail, and carry whatever the request carried,
|
|
41
|
+
// so `auth` alone let any signed-in caller do it (stacksjs/stacks#2412).
|
|
42
|
+
middleware: { read: ['auth'], write: ['auth', 'role:admin'] },
|
|
40
43
|
},
|
|
41
44
|
},
|
|
42
45
|
|
package/dist/paginator.d.ts
CHANGED
|
@@ -1,99 +1,16 @@
|
|
|
1
|
-
/** Duck-typed shape check — used by the response serializer (P4) to
|
|
2
|
-
* detect a paginator-shaped return value from an action. */
|
|
3
|
-
export declare function isPaginator<T = unknown>(value: unknown): value is Paginator<T>;
|
|
4
|
-
/** Duck-typed shape check for the simple paginator. */
|
|
5
|
-
export declare function isSimplePaginator<T = unknown>(value: unknown): value is SimplePaginator<T>;
|
|
6
|
-
/** Duck-typed shape check for the cursor paginator. */
|
|
7
|
-
export declare function isCursorPaginator<T = unknown>(value: unknown): value is CursorPaginator<T>;
|
|
8
1
|
/**
|
|
9
|
-
*
|
|
10
|
-
* { perPage, page, total, lastPage } }`) into the canonical Stacks
|
|
11
|
-
* shape. P1 of the migration — the URL fields stay undefined until
|
|
12
|
-
* P2 wires the request-context resolver.
|
|
13
|
-
*/
|
|
14
|
-
export declare function toPaginator<T>(result: { data: T[], meta: { perPage: number, page: number, total: number, lastPage: number } }): Paginator<T>;
|
|
15
|
-
/** Convert bqb's `simplePaginate()` output to the canonical
|
|
16
|
-
* {@link SimplePaginator} shape. */
|
|
17
|
-
export declare function toSimplePaginator<T>(result: { data: T[], meta: { perPage: number, page: number, hasMore: boolean } }): SimplePaginator<T>;
|
|
18
|
-
/** Convert bqb's `cursorPaginate()` output to the canonical
|
|
19
|
-
* {@link CursorPaginator} shape. Cursors are serialized to strings
|
|
20
|
-
* via JSON — composite cursors (arrays) survive the round-trip. */
|
|
21
|
-
export declare function toCursorPaginator<T>(result: { data: T[], meta: { perPage: number, nextCursor: unknown, prevCursor: unknown } }): CursorPaginator<T>;
|
|
22
|
-
/**
|
|
23
|
-
* Canonical paginator types + adapters (stacksjs/stacks#1905, P1 from #1910).
|
|
24
|
-
*
|
|
25
|
-
* Four pagination shapes used to ship across the framework — bqb's SQL
|
|
26
|
-
* client `{ data, meta }`, bqb's sync ORM `{ data, total, page, ... }`,
|
|
27
|
-
* the search-engine's `{ hits, total, page, perPage }`, and a fifth
|
|
28
|
-
* declared-but-not-implemented Stacks shape (`{ data, paging, next_cursor }`)
|
|
29
|
-
* that the runtime never actually produced. This module unifies them
|
|
30
|
-
* to the Laravel-flavored, snake_case shapes below.
|
|
2
|
+
* The pagination contract, which now lives in its own package.
|
|
31
3
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* - `from` / `to` are 1-indexed offsets of the first/last row on the
|
|
40
|
-
* current page; `null` when the page is empty
|
|
41
|
-
* - `has_more_pages` is the cheap boolean apps actually want — saves
|
|
42
|
-
* `current_page < last_page` checks everywhere
|
|
43
|
-
*/
|
|
44
|
-
/**
|
|
45
|
-
* Full paginator — knows the total row count so it can compute
|
|
46
|
-
* `last_page`, supports "jump to page N" UI patterns. Costs an extra
|
|
47
|
-
* `COUNT(*)` query; use {@link SimplePaginator} or {@link CursorPaginator}
|
|
48
|
-
* for very large tables.
|
|
49
|
-
*/
|
|
50
|
-
export declare interface Paginator<T> {
|
|
51
|
-
data: T[]
|
|
52
|
-
current_page: number
|
|
53
|
-
per_page: number
|
|
54
|
-
total: number
|
|
55
|
-
last_page: number
|
|
56
|
-
from: number | null
|
|
57
|
-
to: number | null
|
|
58
|
-
has_more_pages: boolean
|
|
59
|
-
prev_page_url?: string | null
|
|
60
|
-
next_page_url?: string | null
|
|
61
|
-
first_page_url?: string
|
|
62
|
-
last_page_url?: string
|
|
63
|
-
path?: string
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Simple paginator — drops the `COUNT(*)` query. Faster on large tables
|
|
67
|
-
* but can't render "jump to page 5" UIs since `last_page` / `total` are
|
|
68
|
-
* unknown. Suitable for infinite-scroll feeds.
|
|
69
|
-
*/
|
|
70
|
-
export declare interface SimplePaginator<T> {
|
|
71
|
-
data: T[]
|
|
72
|
-
current_page: number
|
|
73
|
-
per_page: number
|
|
74
|
-
has_more_pages: boolean
|
|
75
|
-
prev_page_url?: string | null
|
|
76
|
-
next_page_url?: string | null
|
|
77
|
-
path?: string
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Cursor (keyset) paginator — uses `WHERE id > :cursor` ordering rather
|
|
81
|
-
* than `LIMIT/OFFSET`, so query cost stays constant regardless of how
|
|
82
|
-
* deep the user has paged. The trade-off is no random-access ("jump to
|
|
83
|
-
* page N"); only prev/next.
|
|
4
|
+
* It moved because `@stacksjs/router` needs it too: the ORM builds a page of
|
|
5
|
+
* rows, the router recognises one in a handler's return value and serializes
|
|
6
|
+
* it. While the shape lived here, the router had to depend on the ORM to
|
|
7
|
+
* recognise it - and the ORM depends on the router to register the routes its
|
|
8
|
+
* models generate. Two packages depending on each other is a cycle no publish
|
|
9
|
+
* order can satisfy, and it is half the reason the framework's release order
|
|
10
|
+
* could not be made correct.
|
|
84
11
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* composite keys, etc.).
|
|
12
|
+
* Re-exported rather than moved outright so that `@stacksjs/orm` keeps
|
|
13
|
+
* exporting `Paginator`, `toPaginator` and the rest: an application importing
|
|
14
|
+
* them from here does not have to care that they are defined elsewhere now.
|
|
89
15
|
*/
|
|
90
|
-
export
|
|
91
|
-
data: T[]
|
|
92
|
-
per_page: number
|
|
93
|
-
next_cursor: string | null
|
|
94
|
-
prev_cursor: string | null
|
|
95
|
-
has_more_pages: boolean
|
|
96
|
-
prev_page_url?: string | null
|
|
97
|
-
next_page_url?: string | null
|
|
98
|
-
path?: string
|
|
99
|
-
}
|
|
16
|
+
export * from '@stacksjs/pagination';
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/orm",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.5",
|
|
6
6
|
"description": "The Stacks ORM integration",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -63,38 +63,52 @@
|
|
|
63
63
|
"prepublishOnly": "bun run build"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@stacksjs/
|
|
67
|
-
"@stacksjs/
|
|
68
|
-
"@stacksjs/
|
|
69
|
-
"@stacksjs/
|
|
70
|
-
"@stacksjs/
|
|
71
|
-
"@stacksjs/
|
|
72
|
-
"@stacksjs/
|
|
73
|
-
"@stacksjs/
|
|
74
|
-
"@stacksjs/
|
|
75
|
-
"@stacksjs/
|
|
76
|
-
"@stacksjs/
|
|
77
|
-
"@stacksjs/query-builder": "0.74.
|
|
78
|
-
"@stacksjs/
|
|
79
|
-
"@stacksjs/
|
|
80
|
-
"@stacksjs/
|
|
81
|
-
"@stacksjs/
|
|
82
|
-
"@stacksjs/storage": "0.74.3",
|
|
83
|
-
"@stacksjs/strings": "0.74.3",
|
|
66
|
+
"@stacksjs/cache": "0.74.5",
|
|
67
|
+
"@stacksjs/cli": "0.74.5",
|
|
68
|
+
"@stacksjs/config": "0.74.5",
|
|
69
|
+
"@stacksjs/database": "0.74.5",
|
|
70
|
+
"@stacksjs/env": "0.74.5",
|
|
71
|
+
"@stacksjs/error-handling": "0.74.5",
|
|
72
|
+
"@stacksjs/events": "0.74.5",
|
|
73
|
+
"@stacksjs/logging": "0.74.5",
|
|
74
|
+
"@stacksjs/model-meta": "0.74.5",
|
|
75
|
+
"@stacksjs/pagination": "0.74.5",
|
|
76
|
+
"@stacksjs/path": "0.74.5",
|
|
77
|
+
"@stacksjs/query-builder": "0.74.5",
|
|
78
|
+
"@stacksjs/realtime": "0.74.5",
|
|
79
|
+
"@stacksjs/router": "0.74.5",
|
|
80
|
+
"@stacksjs/storage": "0.74.5",
|
|
81
|
+
"@stacksjs/strings": "0.74.5",
|
|
84
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
85
|
-
"@stacksjs/validation": "0.74.
|
|
86
|
-
"bun-query-builder": "^0.2.
|
|
83
|
+
"@stacksjs/validation": "0.74.5",
|
|
84
|
+
"bun-query-builder": "^0.2.62"
|
|
87
85
|
},
|
|
88
86
|
"peerDependencies": {
|
|
87
|
+
"@stacksjs/auth": "0.74.5",
|
|
88
|
+
"@stacksjs/payments": "0.74.5",
|
|
89
|
+
"@stacksjs/queue": "0.74.5",
|
|
90
|
+
"@stacksjs/search-engine": "0.74.5",
|
|
89
91
|
"stripe": "22.3.2"
|
|
90
92
|
},
|
|
91
93
|
"peerDependenciesMeta": {
|
|
94
|
+
"@stacksjs/auth": {
|
|
95
|
+
"optional": true
|
|
96
|
+
},
|
|
97
|
+
"@stacksjs/payments": {
|
|
98
|
+
"optional": true
|
|
99
|
+
},
|
|
100
|
+
"@stacksjs/queue": {
|
|
101
|
+
"optional": true
|
|
102
|
+
},
|
|
103
|
+
"@stacksjs/search-engine": {
|
|
104
|
+
"optional": true
|
|
105
|
+
},
|
|
92
106
|
"stripe": {
|
|
93
107
|
"optional": true
|
|
94
108
|
}
|
|
95
109
|
},
|
|
96
110
|
"devDependencies": {
|
|
97
|
-
"@stacksjs/types": "0.74.
|
|
111
|
+
"@stacksjs/types": "0.74.5",
|
|
98
112
|
"better-dx": "^0.2.24",
|
|
99
113
|
"stripe": "22.3.2"
|
|
100
114
|
}
|
package/dist/utils.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { AttributesElements, BaseBelongsToMany, Model, ModelElement, ModelNames, RelationConfig, TableNames } from '@stacksjs/types';
|
|
2
|
-
export declare function modelTableName(model: Model | ModelPath): Promise<string>;
|
|
3
|
-
export declare function getModelName(model: Model, modelPath: string): string;
|
|
4
|
-
export declare function getTableName(model: Model, modelPath: string): TableNames;
|
|
5
|
-
export declare function getPivotTableName(formattedModelName: string, modelRelationTable: string): string;
|
|
6
|
-
export declare function hasRelations(obj: object, key: string): boolean;
|
|
7
|
-
export declare function getRelations(model: Model, modelName: string): Promise<RelationConfig[]>;
|
|
8
|
-
export declare function getRelationType(relation: string): string;
|
|
9
|
-
export declare function getRelationCount(relation: string): string;
|
|
10
|
-
export declare function getPivotTables(model: Model, modelPath: string): Promise<{ table: string, firstForeignKey?: string, secondForeignKey?: string }[]>;
|
|
11
|
-
export declare function fetchOtherModelRelations(modelName?: string): Promise<RelationConfig[]>;
|
|
12
|
-
export declare function getHiddenAttributes(attributes: AttributesElements | undefined): string[];
|
|
13
|
-
export declare function getGuardedAttributes(model: Model): string[];
|
|
14
|
-
export declare function getFillableAttributes(model: Model, otherModelRelations: RelationConfig[]): string[];
|
|
15
|
-
export declare function extractFields(model: Model, modelFile: string): Promise<ModelElement[]>;
|
|
16
|
-
export declare function mapEntity(attribute: ModelElement): string | undefined;
|
|
17
|
-
export declare function findCoreModel(modelName: string): string;
|
|
18
|
-
export declare function findUserModel(modelName: string): string;
|
|
19
|
-
export declare function formatDate(date: Date | number | string): string;
|
|
20
|
-
export declare function extractDate(date: Date): string;
|
|
21
|
-
export declare function toTimestamp(date: Date): number;
|
|
22
|
-
declare type ModelPath = string;
|
|
23
|
-
declare type LegacyBelongsToMany = ModelNames | BaseBelongsToMany<ModelNames>;
|