@stacksjs/orm 0.75.76 → 0.75.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -117,6 +117,7 @@ export declare const PersonalAccessToken: ReturnType<typeof lazyModel<typeof imp
117
117
  export declare const OrderItem: ReturnType<typeof lazyModel<typeof import('./models/commerce/OrderItem').default>>;
118
118
  export declare const Page: ReturnType<typeof lazyModel<typeof import('./models/Content/Page').default>>;
119
119
  export declare const Payment: ReturnType<typeof lazyModel<typeof import('./models/commerce/Payment').default>>;
120
+ export declare const PaymentWebhookEvent: ReturnType<typeof lazyModel<typeof import('./models/commerce/PaymentWebhookEvent').default>>;
120
121
  export declare const PaymentMethod: ReturnType<typeof lazyModel<typeof import('./models/PaymentMethod').default>>;
121
122
  export declare const PaymentProduct: ReturnType<typeof lazyModel<typeof import('./models/PaymentProduct').default>>;
122
123
  export declare const PaymentTransaction: ReturnType<typeof lazyModel<typeof import('./models/PaymentTransaction').default>>;
package/dist/index.js CHANGED
@@ -1,27 +1,27 @@
1
1
  // @bun
2
- var dt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var Wn=import.meta.require;import{readdirSync as zr}from"fs";import{basename as Hr,extname as qt,join as Jr}from"path";function Yr(e){let n=[],t=(r)=>{let o;try{o=zr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Jr(r,a.name);if(a.isDirectory()){t(i);continue}if(![".ts",".js"].includes(qt(a.name)))continue;if(a.name.startsWith(".")||a.name.startsWith("index"))continue;n.push(i)}};return t(e),n.sort()}async function Lt(e,n,t){for(let r of Yr(e))try{let o=qt(r),a=await import(`${r}?t=${Date.now()}`),i=a.default??a,s=i.name??Hr(r,o);n[s]={...i,name:s}}catch(o){t?.(r,o)}}async function Gt(e){let n={};return await Lt(e.defaultsRoot,n,e.onImportError),await Lt(e.userRoot,n,e.onImportError),n}var Ut=()=>{};import{path as Kt}from"@stacksjs/path";async function Ue(){return Gt({defaultsRoot:Kt.frameworkPath("defaults/app/Models"),userRoot:Kt.userModelsPath()})}var Ke=dt(()=>{Ut()});import"@stacksjs/validation/runtime";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Vn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await ft.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=pt(i);return Ae.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw Ae.error(`Failed to prune ${e}:`,a),a}}async function Ns(e,n={}){return Vn(e,n)}function Ls(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Qn,createDecipheriv as zn,createHash as Hn,randomBytes as Jn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Yn=12,re=null;async function yt(){if(re)return re;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 re=Hn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let n=await yt();if(!n)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Jn(Yn),r=Qn(gt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${mt}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let n=await yt();if(!n)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return oe.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"),u=zn(gt,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function Ce(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 Xn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var Zn=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function er(e){ve=e}async function ae(){if(ve!=null)return ve;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 W(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Zn.some((o)=>o.test(t)))continue;n[t]=r}return n}function I(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function tr(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 ie(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(bt).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:Xn()}).executeTakeFirst()}catch(t){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function ht(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(t){return B.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=ht(n).audits;let i=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await i(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[t];if(m!=null){let g=await ae();await ie({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${n}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await i(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ae():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[t];if(w==null)continue;await ie({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${n}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await i(async()=>{let p=a.find,m=typeof p==="function"?I(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(a,f)):null),{old:h,next:b}=tr(m,w);if(b&&Object.keys(b).length>0){let k=await ae();await ie({auditable_type:n,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${n}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await i(async()=>{let m=a.find,g=typeof m==="function"?I(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ae();await ie({auditable_type:n,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as nr,sql as rr,sqlDateTime as Me}from"@stacksjs/database/runtime";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 V="commentable_upvotes",Q="commentables";function or(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??"")}var Rt=["pending","approved"];function Oe(e){let n=nr;return{async comments(t){return C(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(rr`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(C(t,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let a=o.status??"pending";if(!Rt.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(a)})`);let i={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:a,approved_at:a==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)i[c]=r[c];let s=await n.insertInto("commentables").values(i).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await n.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(t,r){C(t,"upvoteComment"),C(r,"upvoteComment");let o=()=>n.selectFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(V).values({upvoteable_id:t,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(i){if(!or(i))throw i}return await o()},async removeCommentUpvote(t,r){C(t,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await n.deleteFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(t){C(t,"commentUpvoteCount");let r=await n.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return C(t,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await n.selectFrom(V).where("upvoteable_id","=",t).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as ir,sqlDateTime as St}from"@stacksjs/database/runtime";function De(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let n=ar;return{async tags(t){return De(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){De(t,"tagCount");let r=await n.selectFrom("taggables").select(ir`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(De(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:St(),updated_at:St()}).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 sr,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let n=sr;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:se(),updated_at:se()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:se(),updated_at:se()}).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 ur,sqlDateTime as cr}from"@stacksjs/database/runtime";function Fe(e,n){let t=ur,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=cr();try{return await t.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).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","=",i).selectAll().executeTakeFirst();if(f)return f;throw u}},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)}}}import{createRequire as lr}from"module";import{db as dr}from"@stacksjs/database/runtime";var fr=lr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function _t(e){let n=dr;return{async syncStripeCustomerDetails(t,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},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 typeof r==="string"?await o.setUserDefaultPayment(t,r):await o.setDefaultPaymentMethod(t,r)},async deletePaymentMethod(t,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(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),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(t,r,o,a={}){let{manageSubscription:i}=await import("@stacksjs/payments"),s=await i.update(t,r,o,a),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:i}=await import("@stacksjs/payments");return{subscription:await i.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 createPayment(t,r,o={}){let{manageCharge:a}=await import("@stacksjs/payments");return await a.createPayment(t,r,o)},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},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:u}=await import("@stacksjs/payments"),c=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:u("connect.account.create",c,a.id)});return i=l.id,await n.updateTable(c).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,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).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],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},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",i.id,r.amountCents)})}}}var pr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(pr));function mr(e){return ue.every((n)=>typeof Reflect.get(e,n)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=fr("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:n.API_VERSION})}import{isUniqueViolation as Dr}from"@stacksjs/error-handling";import{isUniqueViolation as gr}from"@stacksjs/error-handling";function yr(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(gr(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function P(e){let n=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)n=!0}if(!n)return e;let t="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){t+=e[r];continue}let a=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,s=a>=97&&a<=122||a>=48&&a<=57,u=a>=65&&a<=90&&i>=97&&i<=122;if(r>0&&(s||u))t+="_";t+=String.fromCharCode(o+32)}return t}function wr(e){let n={};for(let[t,r]of Object.entries(e))n[P(t)]=r;return n}function iu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Mt(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 su(e){return e?.ownership===!1}function uu(e,n,t){let r=Object.keys(e).find((a)=>P(a)===P(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(P(a)===P(n))delete o[a];return o[n]=t,{data:o}}function br(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=P(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 hr(e,n){if(!e||n.length===0)return{};let t={},r;for(let o of n){if(o in e){t[o]=e[o];continue}r??=Tr(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function kr(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}var At=new WeakMap,Pt=new WeakMap;function Be(e){let n=At.get(e);if(n&&n.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(n[o]?.field!==e[o]){r=!1;break}if(r)return n}let t=e.map((r)=>({field:r,snake:P(r)}));return At.set(e,t),t}function Tr(e){let n=Be(e),t=Pt.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Pt.set(n,r),r}function cu(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of Be(n))if(delete t[r],o!==r)delete t[o];return t}function lu(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of Be(n))if(delete t[r],o!==r)delete t[o];return t}var Rr=["id","uuid","created_at","updated_at","deleted_at"];function du(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(P(r));return t}function fu(e,n,t){if(!n)return e;let r=e;for(let o of String(n).split(",")){let a=o.trim();if(!a)continue;let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let u=t.get(s);if(!u)continue;r=r.orderBy(u,i?"desc":"asc")}return r}var Sr={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"?Ar(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"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function _r(e,n){let t=xt.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=[];for(let o of n){let a=e[o],i=typeof a==="string"?Sr[a]:a;r.push({attr:o,snake:P(o),definition:a,caster:i})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function pu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=_r(n,r);if(o.length===0)return e;let a={...e};for(let{attr:i,caster:s,snake:u}of o){if(!s)continue;let c=s[t];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(a,i))a[i]=c.call(s,a[i]);if(u!==i&&Object.prototype.hasOwnProperty.call(a,u))a[u]=c.call(s,a[u])}return a}var Ct=new WeakMap;function xr(e){let n=Ct.get(e);if(n)return n;let t=[];for(let[r,o]of Object.entries(e)){let a=o?.validation?.rule;if(!a||typeof a.validate!=="function")continue;t.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:a})}return Ct.set(e,t),t}function Dt(e){let n=e?.attributes;if(!n||typeof n!=="object")return!1;for(let t of Object.values(n)){let r=t?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function Et(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let a={},i=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)i=!0,a[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function Cr(e,n){return`${e}\x00${vr(n)}`}function mu(e){let n=new Map;for(let t of e){let r=Cr(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function gu(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?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(t);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function yu(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(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:t,perPage:o,offset:(t-1)*o}}function ce(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Or(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,u={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?ce(e,n-1):null,next_page_url:o?ce(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=ce(e,1),u.last_page_url=ce(e,c)}return u}function wu(e,n,t,r,o,a){let{page:i,...s}=Or(e,n,t,r,o,a);return{current_page:i,...s}}function bu(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function hu(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 Er(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Mt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(Ne(o))}};let t=Ot(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function Ne(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 jr(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 Fr(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function $r(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(Ne(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Ir(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(t))}catch{return null}}}}function Br(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=Er(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 u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(i.field,s).get():await u.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Nr}from"@stacksjs/router";var jt=new WeakMap;function Ft(e){let n=new Map;for(let t of e){let r=t?.id;if(r!==void 0)n.set(r,t)}return n}async function Lr(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return Ft(t??[]).get(n)}async function qr(e,n,t){n.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(t.keys):await Promise.all(t.keys.map((a)=>e.find?.(a))),o=Ft(r??[]);for(let a of t.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of t.resolvers)o.reject(r)}}function Au(e,n){let t=Nr();if(!t)return Lr(e,n);let r=jt.get(t);if(!r)r=new WeakMap,jt.set(t,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(n);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let c=i,l=o;queueMicrotask(()=>{qr(e,l,c)})}let s=new Promise((c,l)=>{i.keys.push(n),i.resolvers.push({key:n,resolve:c,reject:l})});o.cache.set(n,s);let u=o.cache;return s.catch(()=>u.delete(n)),s.then()}import{db as vu}from"@stacksjs/database/runtime";class Gr{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 Le}from"@stacksjs/database/runtime";async function qe(e,n){return await Le.transaction(e,n)}async function Du(e){return await Le.savepoint(e)}function Eu(e,n){return Le.transactional(e,n)}import{randomUUID as Xr}from"crypto";import{db as x,getDatabaseDialect as Zr,parseSqlDateTime as eo,sqlDateTime as Qt}from"@stacksjs/database/runtime";import{plural as Ur,snakeCase as H}from"@stacksjs/strings";var $t=new Set(["anonymize","delete","keep"]),It=new Set(["anonymize","delete"]),Bt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
2
+ var pt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var Qn=import.meta.require;import{readdirSync as Jr}from"fs";import{basename as Yr,extname as Ut,join as Xr}from"path";function Zr(e){let n=[],t=(r)=>{let o;try{o=Jr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Xr(r,a.name);if(a.isDirectory()){t(i);continue}if(![".ts",".js"].includes(Ut(a.name)))continue;if(a.name.startsWith(".")||a.name.startsWith("index"))continue;n.push(i)}};return t(e),n.sort()}async function Gt(e,n,t){for(let r of Zr(e))try{let o=Ut(r),a=await import(`${r}?t=${Date.now()}`),i=a.default??a,s=i.name??Yr(r,o);n[s]={...i,name:s}}catch(o){t?.(r,o)}}async function Kt(e){let n={};return await Gt(e.defaultsRoot,n,e.onImportError),await Gt(e.userRoot,n,e.onImportError),n}var Wt=()=>{};import{path as Vt}from"@stacksjs/path";async function We(){return Kt({defaultsRoot:Vt.frameworkPath("defaults/app/Models"),userRoot:Vt.userModelsPath()})}var Ve=pt(()=>{Wt()});import"@stacksjs/validation/runtime";import{log as xe}from"@stacksjs/cli";import{db as mt,mutationCount as gt}from"@stacksjs/database/runtime";async function zn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=mt.deleteFrom(e);u=o(u);let c=gt(await u.execute());return xe.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await mt.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=gt(i);return xe.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw xe.error(`Failed to prune ${e}:`,a),a}}async function Gs(e,n={}){return zn(e,n)}function Us(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Hn,createDecipheriv as Jn,createHash as Yn,randomBytes as Xn}from"crypto";import{log as ie}from"@stacksjs/logging";var yt="enc:",wt="aes-256-gcm",Zn=12,ae=null;async function bt(){if(ae)return ae;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 ae=Yn("sha256").update(e).digest(),ae}function V(e){return typeof e==="string"&&e.startsWith(yt)}async function Ce(e){if(e==null)return e;if(V(e))return e;if(typeof e!=="string")return e;let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Xn(Zn),r=Hn(wt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${yt}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ve(e){if(e==null)return e;if(typeof e!=="string")return e;if(!V(e))return e;try{let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return ie.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"),u=Jn(wt,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return ie.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function Me(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 er}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var tr=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],kt="model_audits",Oe=null;function nr(e){Oe=e}async function se(){if(Oe!=null)return Oe;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 Q(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(tr.some((o)=>o.test(t)))continue;n[t]=r}return n}function N(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function rr(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ue(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(kt).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:er()}).executeTakeFirst()}catch(t){if(L.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Tt(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(kt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ht(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ht(o.new_values):o.new_values}))}catch(t){return L.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ht(e){try{return JSON.parse(e)}catch{return e}}function Rt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function St(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Tt(n).audits;let i=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await i(async()=>{let d=await s.apply(this,f);try{let p=N(d),m=p?.[t];if(m!=null){let g=await se();await ue({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:Q(p),user_id:g},o)}}catch(p){if(L.warn(`[orm] audit(create) failed for ${n}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await i(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await se():null;for(let m of Array.isArray(d)?d:[]){let g=N(m),w=g?.[t];if(w==null)continue;await ue({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:Q(g),user_id:p},o)}}catch(p){if(L.warn(`[orm] audit(createMany) failed for ${n}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await i(async()=>{let p=a.find,m=typeof p==="function"?N(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=N(g)??(typeof p==="function"?N(await p.call(a,f)):null),{old:h,next:b}=rr(m,w);if(b&&Object.keys(b).length>0){let k=await se();await ue({auditable_type:n,auditable_id:f,event:"updated",old_values:Q(h),new_values:Q(b),user_id:k},o)}}catch(w){if(L.warn(`[orm] audit(update) failed for ${n}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await i(async()=>{let m=a.find,g=typeof m==="function"?N(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await se();await ue({auditable_type:n,auditable_id:p,event:"deleted",old_values:Q(g),new_values:null,user_id:h},o)}}catch(h){if(L.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as or,sql as ar,sqlDateTime as De}from"@stacksjs/database/runtime";function v(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 z="commentable_upvotes",H="commentables";function ir(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??"")}var _t=["pending","approved"];function Ee(e){let n=or;return{async comments(t){return v(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(ar`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(v(t,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let a=o.status??"pending";if(!_t.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${_t.join(", ")} (received ${String(a)})`);let i={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:a,approved_at:a==="approved"?Date.now():null,created_at:De(),updated_at:De()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)i[c]=r[c];let s=await n.insertInto("commentables").values(i).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await n.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(t,r){v(t,"upvoteComment"),v(r,"upvoteComment");let o=()=>n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(z).values({upvoteable_id:t,upvoteable_type:H,user_id:r,created_at:De()}).execute()}catch(i){if(!ir(i))throw i}return await o()},async removeCommentUpvote(t,r){v(t,"removeCommentUpvote"),v(r,"removeCommentUpvote"),await n.deleteFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).execute()},async commentUpvoteCount(t){v(t,"commentUpvoteCount");let r=await n.selectFrom(z).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",H).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return v(t,"hasUpvotedComment"),v(r,"hasUpvotedComment"),!!await n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as sr,sql as ur,sqlDateTime as At}from"@stacksjs/database/runtime";function je(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Fe(e){let n=sr;return{async tags(t){return je(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){je(t,"tagCount");let r=await n.selectFrom("taggables").select(ur`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(je(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:At(),updated_at:At()}).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 cr,sqlDateTime as ce}from"@stacksjs/database/runtime";function $e(e){let n=cr;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:ce(),updated_at:ce()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:ce(),updated_at:ce()}).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 lr,sqlDateTime as dr}from"@stacksjs/database/runtime";function Ie(e,n){let t=lr,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=dr();try{return await t.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).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","=",i).selectAll().executeTakeFirst();if(f)return f;throw u}},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)}}}import{createRequire as fr}from"module";import{db as pr}from"@stacksjs/database/runtime";var mr=fr(import.meta.url);class Be extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}async function M(){let{paymentDriver:e}=await import("@stacksjs/payments");return e()}async function S(e){let{config:n}=await import("@stacksjs/config"),t=n.payment?.driver??"stripe";if(t!=="stripe"){let{PaymentUnsupportedError:r}=await import("@stacksjs/payments");throw new r(t,e,"it is a Stripe-only method")}}function Pt(e){let n=pr;return{async paymentCustomer(t){return(await M()).customer(t)},async charge(t,r,o,a={}){return(await M()).charge(t,r,o,a)},async createPayment(t,r,o={}){return(await M()).createPayment(t,r,o)},async checkout(t,r){return(await M()).checkout(t,r)},async paymentMethods(t){return(await M()).paymentMethods(t)},async removePaymentMethod(t,r){return(await M()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await M()).subscribe(t,o,{type:r})},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new Be(r);return(await M()).cancelSubscription(r,o)},async activeSubscription(t){let r=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(!r)return;let o=(await(await M()).subscriptions(t)).find((a)=>a.id===r.provider_id);return o?{subscription:r,providerSubscription:o}:void 0},async syncStripeCustomerDetails(t,r){await S("syncStripeCustomerDetails");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},async createStripeUser(t,r){await S("createStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){await S("updateStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){await S("deleteStripeUser");let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){await S("createOrGetStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){await S("retrieveStripeUser");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){await S("setDefaultPaymentMethod");let{managePaymentMethod:o}=await import("@stacksjs/payments");if(typeof r==="string")await o.setUserDefaultPayment(t,r);else await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){await S("addPaymentMethod");let{managePaymentMethod:o,toStoredPaymentMethod:a}=await import("@stacksjs/payments");return a(await o.addPaymentMethod(t,r))},async updateSubscription(t,r,o){await S("updateSubscription");let{manageSubscription:a,summarizeSubscription:i}=await import("@stacksjs/payments");return i(await a.update(t,r,o,{}))},async createSetupIntent(t,r={}){await S("createSetupIntent");let{manageSetupIntent:o}=await import("@stacksjs/payments"),a=await o.create(t,r);if(!a.client_secret)throw Error("Stripe returned a SetupIntent without a client secret.");return{id:a.id,clientConfirmation:{provider:"stripe",clientSecret:a.client_secret}}},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},async subscriptionHistory(t){await S("subscriptionHistory");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={}){await S("Stripe Connect (connectAccount)");let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await J();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){await S("Stripe Connect (createConnectAccount)");let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await J();if(!i){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=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:u("connect.account.create",c,a.id)});return i=l.id,await n.updateTable(c).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(t,r){await S("Stripe Connect (connectOnboardLink)");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 J()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){await S("Stripe Connect (syncConnectStatus)");let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await J()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){await S("Stripe Connect (chargeWithSplit)");let o=await J(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,s=r.connectAccountId||i[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},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",i.id,r.amountCents)})}}}var gr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,removePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,paymentCustomer:!0,charge:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},le=Object.freeze(Object.keys(gr));function yr(e){return le.every((n)=>typeof Reflect.get(e,n)==="function")}function J(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=mr("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:n.API_VERSION})}import{isUniqueViolation as jr}from"@stacksjs/error-handling";import{isUniqueViolation as wr}from"@stacksjs/error-handling";function br(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(wr(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function x(e){let n=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)n=!0}if(!n)return e;let t="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){t+=e[r];continue}let a=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,s=a>=97&&a<=122||a>=48&&a<=57,u=a>=65&&a<=90&&i>=97&&i<=122;if(r>0&&(s||u))t+="_";t+=String.fromCharCode(o+32)}return t}function hr(e){let n={};for(let[t,r]of Object.entries(e))n[x(t)]=r;return n}function cu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Dt(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 Et(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 lu(e){return e?.ownership===!1}function du(e,n,t){let r=Object.keys(e).find((a)=>x(a)===x(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(x(a)===x(n))delete o[a];return o[n]=t,{data:o}}function kr(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=x(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 Tr(e,n){if(!e||n.length===0)return{};let t={},r;for(let o of n){if(o in e){t[o]=e[o];continue}r??=Sr(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function Rr(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}var xt=new WeakMap,Ct=new WeakMap;function Le(e){let n=xt.get(e);if(n&&n.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(n[o]?.field!==e[o]){r=!1;break}if(r)return n}let t=e.map((r)=>({field:r,snake:x(r)}));return xt.set(e,t),t}function Sr(e){let n=Le(e),t=Ct.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Ct.set(n,r),r}function fu(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}function pu(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}var _r=["id","uuid","created_at","updated_at","deleted_at"];function mu(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),..._r]){let o=x(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(x(r));return t}function gu(e,n,t){if(!n)return e;let r=e;for(let o of String(n).split(",")){let a=o.trim();if(!a)continue;let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let u=t.get(s);if(!u)continue;r=r.orderBy(u,i?"desc":"asc")}return r}var Ar={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"?xr(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"?Cr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},vt=new WeakMap;function Pr(e,n){let t=vt.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=[];for(let o of n){let a=e[o],i=typeof a==="string"?Ar[a]:a;r.push({attr:o,snake:x(o),definition:a,caster:i})}return vt.set(e,r),r}function xr(e){try{return JSON.parse(e)}catch{return e}}function Cr(e){try{return JSON.parse(e)}catch{return[]}}function yu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=Pr(n,r);if(o.length===0)return e;let a={...e};for(let{attr:i,caster:s,snake:u}of o){if(!s)continue;let c=s[t];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(a,i))a[i]=c.call(s,a[i]);if(u!==i&&Object.prototype.hasOwnProperty.call(a,u))a[u]=c.call(s,a[u])}return a}var Mt=new WeakMap;function vr(e){let n=Mt.get(e);if(n)return n;let t=[];for(let[r,o]of Object.entries(e)){let a=o?.validation?.rule;if(!a||typeof a.validate!=="function")continue;t.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:a})}return Mt.set(e,t),t}function jt(e){let n=e?.attributes;if(!n||typeof n!=="object")return!1;for(let t of Object.values(n)){let r=t?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function Ft(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=vr(r);if(o.length===0)return{valid:!0};let a={},i=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=Rr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)i=!0,a[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function Mr(e,n){return`${e}\x00${Or(n)}`}function wu(e){let n=new Map;for(let t of e){let r=Mr(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function Or(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ne(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function bu(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?Ne(o.read):["auth"],write:"write"in o?Ne(o.write):["auth"],declared:!0}}let r=Ne(t);return{read:r,write:r,declared:!0}}var Ot=15,Dr=100;function hu(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(Ot),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ot,Dr);return{page:t,perPage:o,offset:(t-1)*o}}function de(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Er(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,u={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?de(e,n-1):null,next_page_url:o?de(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=de(e,1),u.last_page_url=de(e,c)}return u}function ku(e,n,t,r,o,a){let{page:i,...s}=Er(e,n,t,r,o,a);return{current_page:i,...s}}function Tu(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ru(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 Fr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Dt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(qe(o))}};let t=Et(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function qe(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 $r(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 Ir(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Br(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(qe(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Nr(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(qe(t))}catch{return null}}}}function Lr(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=Fr(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 u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(i.field,s).get():await u.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as qr}from"@stacksjs/router";var $t=new WeakMap;function It(e){let n=new Map;for(let t of e){let r=t?.id;if(r!==void 0)n.set(r,t)}return n}async function Gr(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return It(t??[]).get(n)}async function Ur(e,n,t){n.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(t.keys):await Promise.all(t.keys.map((a)=>e.find?.(a))),o=It(r??[]);for(let a of t.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of t.resolvers)o.reject(r)}}function Cu(e,n){let t=qr();if(!t)return Gr(e,n);let r=$t.get(t);if(!r)r=new WeakMap,$t.set(t,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(n);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let c=i,l=o;queueMicrotask(()=>{Ur(e,l,c)})}let s=new Promise((c,l)=>{i.keys.push(n),i.resolvers.push({key:n,resolve:c,reject:l})});o.cache.set(n,s);let u=o.cache;return s.catch(()=>u.delete(n)),s.then()}import{db as Du}from"@stacksjs/database/runtime";class Kr{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 Ge}from"@stacksjs/database/runtime";async function Ue(e,n){return await Ge.transaction(e,n)}async function Fu(e){return await Ge.savepoint(e)}function $u(e,n){return Ge.transactional(e,n)}import{randomUUID as eo}from"crypto";import{db as C,getDatabaseDialect as to,parseSqlDateTime as no,sqlDateTime as Ht}from"@stacksjs/database/runtime";import{plural as Wr,snakeCase as Y}from"@stacksjs/strings";var Bt=new Set(["anonymize","delete","keep"]),Nt=new Set(["anonymize","delete"]),Lt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),D="User";class Ke extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
3
3
  ${e.map((n)=>` - ${n.model}: ${n.message}`).join(`
4
- `)}`);this.name="GdprDeclarationError",this.problems=e}}function Kr(e){return(Array.isArray(e)?e.map((t)=>[t.name??"",t]):Object.entries(e)).map(([t,r])=>({name:String(r?.name??t),definition:r})).filter((t)=>t.name&&t.definition&&typeof t.definition==="object").sort((t,r)=>t.name.localeCompare(r.name))}function Nt(e,n){return n.table??H(Ur(e))}function Wr(e){let n=e.belongsTo,t=Array.isArray(n)?n:n&&typeof n==="object"?Object.values(n):[],r=[];for(let o of t){if(typeof o==="string"){r.push({model:o,foreignKey:`${H(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let a=o;r.push({model:a.model,foreignKey:a.foreignKey??`${H(a.model)}_id`})}}return r}function Vr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Qr(e,n){if(n.anonymize!==void 0)return{perRow:!1,value:n.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function le(e){let n=new Map,t=new Map,r=[],o=[],a=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Kr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Wr(u),d=f.find((T)=>T.model===M),p=Object.entries(c).map(([T,A])=>({attribute:T,shape:A,options:Vr(A?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==M)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){a(s,"`traits.gdpr` must be an object");continue}let m=Nt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===M)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((A)=>A.model===b.via);if(!T)a(s,`subject { via: '${b.via}' } names a model this one does not declare in belongsTo`);else h=T.model,w={kind:"via",model:T.model,foreignKey:T.foreignKey}}else if(b&&typeof b==="object"&&"email"in b)w={kind:"email",column:String(b.email)};else a(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)a(s,"subject names no column");let k=l?.erasure??"anonymize";if(!$t.has(k))a(s,`erasure must be one of ${[...$t].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,A=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)a(s,"retention.days must be a positive whole number of days");else if(!It.has(A))a(s,`retention.action must be one of ${[...It].join(", ")}, got '${String(A)}'`);else R={days:T.days,column:T.column??"created_at",action:A}}if(l?.basis!==void 0&&!Bt.has(l.basis))a(s,`basis must be one of ${[...Bt].join(", ")}, got '${String(l.basis)}'`);let te=k==="anonymize"&&w!==null||R?.action==="anonymize",U=[];for(let{attribute:T,shape:A,options:_e}of p){let ne=Qr(A,_e);if("problem"in ne){if(te)a(s,`personal attribute '${T}' ${ne.problem}`);U.push({attribute:T,column:H(T),export:_e.export!==!1,perRow:!1,anonymizeTo:null});continue}U.push({attribute:T,column:H(T),export:_e.export!==!1,perRow:ne.perRow,anonymizeTo:ne.value})}if(w!==null&&k==="anonymize"&&U.length===0)a(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&U.length===0)a(s,"retention anonymizes, but no attribute is marked personal");if(n.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:U,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)t.set(s,h)}let i=(s,u)=>{let c=t.get(s);if(!c)return 0;if(u.has(s))return null;if(!n.get(c)?.subject)return null;u.add(s);let f=i(c,u);return f===null?null:f+1};for(let s of n.values()){let u=t.get(s.model);if(!u)continue;if(!n.get(u)?.subject){a(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=i(s.model,new Set);if(l===null)a(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...n.values()],unclassified:r.sort(),problems:o}}function de(e){if(e.problems.length)throw new Ge(e.problems);return e}var fe="gdpr_requests",We=500;class pe extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function me(e){if(e)return de(le(e));await Promise.resolve().then(() => Ke());return de(le(await Ue()))}async function zt(e=x){let n=String(Zr()),t=n==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":n==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":n==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!t)return null;let r=await e.unsafe(t).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var to=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function ge(e,n=x){let t=await zt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(to.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function no(e){let n=e.models.find((t)=>t.model===M);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function ro(e){if(typeof e==="number")return{kind:"id",value:e};let n=String(e).trim();if(/^\d+$/.test(n))return{kind:"id",value:Number(n)};if(n.includes("@"))return{kind:"email",value:n};return{kind:"uuid",value:n}}async function oo(e,n={},t=x){let r=await me(n.models);return Qe(r,e,t)}async function Qe(e,n,t){let{table:r,primaryKey:o}=no(e),a=ro(n),i;if(a.kind==="id")i=(await t.selectFrom(r).selectAll().where(o,"=",a.value).limit(1).execute())[0];else if(a.kind==="email"){for(let s of new Set([a.value,a.value.toLowerCase()]))if(i=(await t.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],i)break}else i=(await t.selectFrom(r).selectAll().where("uuid","=",a.value).limit(1).execute())[0];if(!i)return null;return{id:i[o],email:typeof i.email==="string"?i.email:null}}function ze(e,n=We){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function ao(e,n){let t=new Map;for(let r of e)t.set(String(r[n]),r);return[...t.values()].sort((r,o)=>String(r[n]).localeCompare(String(o[n]),void 0,{numeric:!0}))}async function He(e,n,t,r,o){let a=o.get(t.model);if(a)return a;let i=t.subject,s=[];if(i?.kind==="column")for(let u of i.columns){let c=e.selectFrom(t.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(i.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(i?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(t.table).selectAll().where(i.column,"=",u).execute())}else if(i?.kind==="via"){let u=n.get(i.model),l=(await He(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of ze(l))s.push(...await e.selectFrom(t.table).selectAll().where(i.foreignKey,"in",f).execute())}return s=ao(s,t.primaryKey),o.set(t.model,s),s}function Wt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function io(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Wt(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Wt(n[r.column]);return t}function Ve(e,n){let t={};for(let r of e.personal)t[r.column]=r.perRow?`erased-${String(n[e.primaryKey])}`:r.anonymizeTo;return t}function so(e,n){if(e===n)return!0;if(e===null||e===void 0||n===null||n===void 0)return(e===null||e===void 0)&&(n===null||n===void 0);if(typeof n==="boolean")return Number(e)===Number(n);return String(e)===String(n)}function Ht(e,n){let t=Ve(e,n);return Object.entries(t).some(([r,o])=>!so(n[r],o))}async function Jt(e,n,t){if(!t.length)return;if(n.personal.some((o)=>o.perRow)){for(let o of t)await e.updateTable(n.table).set(Ve(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=Ve(n,t[0]);for(let o of ze(t.map((a)=>a[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function Yt(e,n,t){for(let r of ze(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Je(e,n,t,r,o){let a=Qt(new Date);await e.insertInto(fe).values({uuid:Xr(),type:n,subject_id:t!==null&&Number.isSafeInteger(Number(t))?Number(t):null,actor:r,status:"completed",summary:JSON.stringify(t!==null&&!Number.isSafeInteger(Number(t))?{subject:String(t),...o}:o),occurred_at:a,created_at:a}).execute()}async function Ye(){if(!await ge(fe))throw Error(`The '${fe}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function Xe(e){let n=[],t=[],r=await zt(),o=new Map;for(let a of e){if(!o.has(a.table))o.set(a.table,r?r.has(a.table.toLowerCase()):await ge(a.table));if(o.get(a.table))n.push(a);else t.push(a.table)}return{present:n,skipped:[...new Set(t)].sort()}}async function uo(e,n={}){let t=await me(n.models),r=await Qe(t,e,x);if(!r)throw new pe(e);await Ye();let o=t.models.filter((l)=>l.subject),{present:a}=await Xe(o),i=new Map(a.map((l)=>[l.model,l]));for(let l of a)if(l.subject?.kind==="via"&&!i.has(l.subject.model))i.delete(l.model);let s=new Map,u={},c={};for(let l of[...i.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await He(x,i,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>io(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Je(x,"access",r.id,n.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function co(e){return[...e].sort((n,t)=>{let r=n.model===M?1:0,o=t.model===M?1:0;if(r!==o)return r-o;if(n.depth!==t.depth)return t.depth-n.depth;return n.model.localeCompare(t.model)})}async function lo(e,n={}){let t=n.dryRun===!0,r=await me(n.models),o=await Qe(r,e,x);if(!o)throw new pe(e);if(!t)await Ye();let a=r.models.filter((d)=>d.subject),{present:i,skipped:s}=await Xe(a),u=new Map(i.map((d)=>[d.model,d]));for(let d of i)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await He(d,u,g,o,p);let m=[];for(let g of co([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await Yt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Ht(g,b));if(!t)await Jt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!t)await Je(d,"erasure",o.id,n.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=t?await c(x):await qe(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await fo(o.id);return{subject:{id:o.id},dryRun:t,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function fo(e){let n;try{n=await import("@stacksjs/auth")}catch{return!1}let t=Number(e);if(!Number.isSafeInteger(t))return!1;if(n.revokeAllTokens&&await ge("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var Vt=86400000;async function po(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await me(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await Ye();let{present:a,skipped:i}=await Xe(o),s=[],u={};for(let c of a){let l=c.retention,f=new Date(t.getTime()-l.days*Vt),d=Qt(new Date(f.getTime()+Vt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=x.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(We).execute();if(!b.length)break;for(let k of b){let R=eo(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<We)break}let g=l.action==="delete"?p:p.filter((w)=>Ht(c,w));if(!n&&g.length)await qe(async(w)=>{if(l.action==="delete")await Yt(w,c,g);else await Jt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!n&&s.some((c)=>c.changed>0))await Je(x,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:n,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:i}}Ke();function mo(e){let n=e.subject;if(!n)return"none (not reachable by access or erasure)";if(n.kind==="via")return`via ${n.model} (\`${n.foreignKey}\`)`;if(n.kind==="email")return`email address in \`${n.column}\``;let t=n.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(n.where).map(([o,a])=>`${o} = ${String(a)}`).join(", ");return r?`${t} where ${r}`:t}function go(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:mo(t),personal:t.personal.map((r)=>r.column),notExported:t.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:t.subject?t.erasure:null,retention:t.retention?`${t.retention.action} after ${t.retention.days} days (\`${t.retention.column}\`)`:null,basis:t.basis,purpose:t.purpose})).sort((t,r)=>t.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function J(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
5
- `," ")}function yo(e,n="markdown"){if(n==="json")return`${JSON.stringify(e,null,2)}
6
- `;let t=["# Processing register","","<!-- Generated by `buddy gdpr:register` from the model declarations. Do not edit by hand. -->","","Every model that declares personal data or a `gdpr` trait, what erasure does to its rows, and how long they are kept. Change the model, then regenerate this file.","","| Model | Table | Subject | Personal data | Erasure | Retention | Basis | Purpose |","| --- | --- | --- | --- | --- | --- | --- | --- |"];for(let r of e.entries){let o=r.personal.length?r.personal.map((a)=>r.notExported.includes(a)?`\`${a}\` (not exported)`:`\`${a}\``).join(", "):"-";t.push(`| ${[r.model,`\`${r.table}\``,J(r.subject),o,J(r.erasure),J(r.retention),J(r.basis),J(r.purpose)].join(" | ")} |`)}if(t.push(""),t.push("## Unclassified"),t.push(""),e.unclassified.length){t.push("These models belong to a user but declare neither personal attributes nor a `gdpr` trait, so access and erasure do not reach them. Classify each one, even if only as `erasure: 'keep'`."),t.push("");for(let r of e.unclassified)t.push(`- ${r}`)}else t.push("None. Every model that belongs to a user is classified.");return t.push(""),t.join(`
7
- `)}export*from"@stacksjs/model-meta";import{createModel as vo,registerModel as Mo}from"@stacksjs/query-builder";import{log as S}from"@stacksjs/logging/runtime";import{snakeCase as Z}from"@stacksjs/strings";import{AsyncLocalStorage as _n}from"async_hooks";import{toCursorPaginator as Oo,toPaginator as Do,toSimplePaginator as Eo}from"@stacksjs/pagination";function et(e,n){let t=rt(),r=t?Ze(t,"per_page"):void 0,o=t?Ze(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 tt(e,n){let t=rt(),r=t?Zt(t,"cursor"):void 0,o=t?Ze(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=Xt(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function Xt(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 nt(e){let n=rt();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?E(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?E(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?E(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?E(t,{page:o+1}):null,e.first_page_url=E(t,{page:1}),e.last_page_url=E(t,{page:a})}else e.next_page_url=e.has_more_pages?E(t,{page:o+1}):null;return e}function E(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 N;function rt(){if(N===null)return;if(N===void 0)try{let n=Wn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")N=n.getCurrentRequest;else{N=null;return}}catch{N=null;return}return N()}function Ze(e,n){let t=Zt(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function Zt(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function en(){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: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(i),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(i),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as wo,sqlDateTime as bo}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var ye="deleted_at";function tn(e,n="id"){return{async softDelete(t){let r=bo(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[ye]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[ye]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return wo(await o.forceDelete())>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(ye);return t?.where?.(ye,"!=",null)??t}}}function nn(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 ho(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>ot(l,n,!0)),a=r.some((l)=>ot(l,n,!1));if(!o&&!a)return L.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>ot(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return L.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function ot(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 ko(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){L.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="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 i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){L.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"){L.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,c=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await i.call(t,p)}}}catch(a){if(L.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Y(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=ho(e,i);if(!s)continue;await ko(s.className,t,s.model,a,r)}}import{sqlDateTime as So}from"@stacksjs/database/runtime";import{log as To}from"@stacksjs/logging";var Ro=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],rn=null;async function on(){if(rn!=null)return rn;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();return t?.user?.id??t?._user?.id??null}catch{return null}}async function an(){try{let n=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof n!=="function")return null;let t=n();return typeof t?.ip==="function"?t.ip()??null:null}catch{return null}}function sn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(Ro.some((o)=>o.test(t)))continue;n[t]=r}return n}function un(e,n,t){To.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var _o="activities";function cn(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let n=e;return{logOnly:Array.isArray(n.logOnly)?n.logOnly:void 0,include:Array.isArray(n.include)?n.include:void 0,exclude:Array.isArray(n.exclude)?n.exclude:void 0}}function Ao(e,n,t=[]){let r=sn(e);if(!r)return null;let o=new Set(t),a=n.logOnly??n.include,i=new Set(n.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||i.has(u))continue;if(a&&!a.includes(u))continue;s[u]=c}return s}function Po(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function xo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(_o).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:So()}).executeTakeFirst()}catch(n){un("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Co(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await on();await xo({type:`${r.toLowerCase()}.${t}`,description:Po(r,t,i),subject_type:r,subject_id:i,properties:Ao(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await an()})}function we(e){if(!e||typeof e!=="object")return null;let n=e;if(n.attributes&&typeof n.attributes==="object")return{...n.attributes};if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function ln(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?we(await a.find(d)):null,s=async(d,p)=>{await Co({modelName:n,event:d,attributes:p,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",we(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",we(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",we(m)??await i(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await i(d),m=await f.call(this,d);return await s("deleted",p??{[t]:d}),m}}var ke,An=new _n;function F(){return An.getStore()?.suppressed===!0}function j(e){return Promise.resolve(An.run({suppressed:!0},e))}var Pn=new _n;function jo(){return Pn.getStore()?.suppressed===!0}function Fo(e){return Promise.resolve(Pn.run({suppressed:!0},e))}var lt=Symbol.for("stacks.orm.modelDefinition");class xn 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 dn=new Set,$o=4096,fn=Object.create(null),pn=0;function X(e){let n=fn[e];if(n!==void 0)return n;let t=Z(e);if(pn<$o)fn[e]=t,pn++;return t}function Io(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(dn.has(r))return;dn.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 Bo={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 Io(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 No(e){return typeof e==="string"?Bo[e]:e}var mn=new WeakMap;function Cn(e){let n=Object.keys(e),t=mn.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=n.map((o)=>{let a=e[o];return{attr:o,definition:a,caster:No(a)}});return mn.set(e,r),r}function at(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Cn(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function be(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var st=Symbol.for("stacks.modelInstanceProxy"),gn,yn=new WeakMap,Lo={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"},...Object.fromEntries(ue.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function qo(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 he(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function v(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[st])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Cn(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?yn.get(n):gn;if(!o)if(o={get(a,i,s){let u=a;if(i===st)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return he(u.save(),a,s)}finally{l.set=d}}return he(u.save(),a,s)};if(i==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return he(u.save(),a,s)}finally{l.set=d}}return he(u.save(),a,s)};if(i==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(i==="saveQuietly")return function(){return j(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return j(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return j(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return j(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return j(()=>u.delete())};if(i==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=Z(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let te=w[b]??w[k];if(te){m[k]=qo(h,te);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!be(i)){let l=u._attributes;if(l&&Object.hasOwn(l,i))return l[i];let f=u._relations;if(f&&Object.hasOwn(f,i)){let p=f[i];if(Array.isArray(p))return p.map((m)=>v(m,n));return p&&typeof p==="object"?v(p,n):p}let d=Lo[i];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=X(i);if(p!==i&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,i,u);return typeof c==="function"?c.bind(u):c},set(a,i,s,u){let c=a;if(typeof i==="string"&&!be(i)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,i)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}if(l){let d=X(i);if(d!==i&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(i in c)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}}return Reflect.set(c,i,s,u)},has(a,i){let s=a;if(typeof i==="string"&&!be(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return!0;let c=s._relations;if(c&&Object.hasOwn(c,i))return!0;if(u){let l=X(i);if(l!==i&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,i)},deleteProperty(a,i){let s=a;if(typeof i==="string"&&!be(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return delete u[i],!0}return Reflect.deleteProperty(s,i)},ownKeys(a){let s=a._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(a,i){let s=a;if(typeof i==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,i))return{configurable:!0,enumerable:!0,value:u[i],writable:!0}}return Object.getOwnPropertyDescriptor(s,i)}},n)yn.set(n,o);else gn=o;return new Proxy(e,o)}var vn=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),Go={paginate:Do,simplePaginate:Eo,cursorPaginate:Oo},wn=Symbol.for("stacks.queryBuilderProxy");function bn(e,n,t){if(vn[n]){if(Array.isArray(e))return e.map((o)=>v(o,t));let r=Go[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>v(i,t)),a=r({...e,data:o});return nt(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>v(o,t))};return v(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return Mn(e,t);return e}function Mn(e,n){if(!e||typeof e!=="object")return e;if(e[wn])return e;return new Proxy(e,{get(t,r,o){if(r===wn)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;let i=String(r);return function(...s){let u=s;if(i==="paginate"||i==="simplePaginate"){let{perPage:l,page:f}=et(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=tt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!vn[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>bn(l,i,n));return bn(c,i,n)}}})}function Uo(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>v(s,n)):v(i,n),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let i of o){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let a=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let i of a){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);return Mn(c,n)}}}class On 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 ut 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 Ko=new Set(["id","created_at","updated_at","deleted_at","uuid"]),hn=new WeakMap;function Wo(e){let n=hn.get(e);if(n)return n;let t=new Set,r=new Set,o=new Set;for(let[i,s]of Object.entries(e)){let u=X(i);if(t.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let a={allowed:r.size>0?r:t,guarded:o};return hn.set(e,a),a}function q(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let{allowed:o,guarded:a}=Wo(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=X(i);if(Ko.has(s))continue;if(a.has(s))throw new ut(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new ut(e.name,i,"not-fillable")}return n}async function Te(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){S.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function Vo(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 i(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(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){S.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}q(n,l);let f=await Te(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},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 Te(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"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[st]?f:d??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(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},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new On(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 p={...c,...l};return q(n,p),await i("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){q(n,l);let m=d[t];await o("updateOrCreate").call(e,t,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return q(n,p),await i("updateOrCreate").call(e,p)};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 p=await d.count();return Number(p)||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 s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=Fn(n.traits?.useSearch,n);if(u){let c=u.index??n.table??Z(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Ho(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"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await ct(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await ct(w,u);if(h.length>0)await p.addDocuments(c,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{searchEngineReady:l}=await import("@stacksjs/search-engine");await(await l()).deleteAllDocuments(c)}}}async function ct(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)=>zo(r,n)))).filter(Boolean)}function Dn(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 Qo(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 zo(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 Qo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Ho(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...a,...r??{}},s={with(u){return i={...i,...u},s},where(u){return i={...i,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,i))?.hits??[]},async paginate(u,c=1){if(!Number.isInteger(u)||u<1)throw TypeError(`[orm/search] paginate() needs a positive integer page size, got ${u}`);if(!Number.isInteger(c)||c<1)throw TypeError(`[orm/search] paginate() pages are 1-based, got ${c}`);let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,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,i)}};return s}function En(e){let n=Z(e);return n===e?[e]:[e,n]}async function it(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of En(r)){if(!(o in t))continue;let a=t[o];if(!K(a))continue;t[o]=await xe(a)}}function Jo(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await it(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await it(u,n);return s}if(s)await it(s,n);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=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"],i=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;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 i(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return i(u.apply(this,c))}}}function Yo(e,n){if(n.length===0)return;let t=async(a)=>{if(!a||typeof a!=="object"||Array.isArray(a))return a;let i={...a};for(let s of n)for(let u of En(s))if(u in i)i[u]=await Pe(i[u]);return i},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?await Promise.all(a.map(t)):a;return await o.call(this,s,...i)};for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await i.apply(this,s)}}for(let a of["update","forceUpdate"]){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(s,u){let c=await t(u);return await i.call(this,s,c)}}}function Xo(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){q(n,o);let i=await Te(n,o);return await t.call(this,i,...a)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...a){let i=[];for(let s of o)q(n,s),i.push(await Te(n,s));return await r.call(this,i,...a)};for(let o of["firstOrCreate","updateOrCreate"]){let a=e[o];if(typeof a!=="function")continue}}function Zo(e,n){if(!Dt(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(jo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=Et(s,n,u);if(!c.valid)throw new xn(t,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let a=e.createMany;if(typeof a==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await a.call(this,s,...u)};let i=e.update;if(typeof i==="function")e.update=async function(s,u,...c){return r(u,"updating"),await i.call(this,s,u,...c)}}function ea(e,n){let t=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?a.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?at(u,n,"set"):u):a;return await r.call(this,s,...i)};for(let a of t){let i=e[a];if(typeof i==="function")e[a]=async function(...s){if(S.debug(`[orm] ${a.charAt(0).toUpperCase()+a.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=at(s[0],n,"set");return await i.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(a,i){let s=i&&typeof i==="object"&&!Array.isArray(i)?at(i,n,"set"):i;return await o.call(this,a,s)}}var kn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function jn(e){S.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!kn.has(g))S.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...kn].sort().join(", ")}.`);let n=ta(e),t=ra(e),r=na(n,t),o=oa(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=vo(i);if(Uo(u,e.casts),Vo(u,i),Xo(u,i),e.casts&&Object.keys(e.casts).length>0)ea(u,e.casts);let c=Ce(e);if(c.length>0)Yo(u,c),Jo(u,c);let l=e.traits?.useSoftDeletes;if(l)aa(u,i,l);let f=e.traits?.useAudit;if(f){let g=kt(f);Tt(u,e.name,e.primaryKey||"id",g)}let d=cn(e.traits?.useActivityLog);if(d)ln(u,e.name,e.primaryKey||"id",d,[...Dn(e)]);Zo(u,i);let p=u;p.withoutValidation=function(g){return Fo(g)},p.withoutEvents=function(g){return j(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return j(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Mo(e.name,m),Object.defineProperty(m,lt,{value:e,enumerable:!1,configurable:!0}),m}function ta(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,p)=>{if(!s)return;if(F())return;try{let m=a(p),g=Array.isArray(m)?m:[m],w=i(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(F())return!0;let m;try{m=ke??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(S.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 p=r(d);await o(`${t}:created`,p),await o(`${t}:saved`,p),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(S.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 p=r(d);await o(`${t}:updated`,p),await o(`${t}:saved`,p),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(S.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 na(...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 Fn(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=Dn(n);return t}function ra(e){let n=Fn(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??Z(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await ct([s],t);return l}catch(l){S.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){S.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=v(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(F())return;let u=await o(s);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){S.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await Rn(r,u,e.name)}return}await Rn(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(F())return;let u=s?.id??s?._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){S.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await Sn(r,Number(u),e.name)}return}await Sn(r,Number(u),e.name)}}}var Tn=new Map;function $n(e,n){let t=Tn.get(e)??0;if(Tn.set(e,t+1),t===0)S.warn(`[orm/search] ${n}`);else if(t===9)S.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function Rn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){$n(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function Sn(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){$n(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function oa(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=Ee(t);if(r.categorizable)n._categorizable=je(t);if(r.commentable)n._commentable=Oe(t);if(r.billable)n._billable=_t(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Fe(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=en();return n}function aa(e,n,t){let r=tn(e,n.primaryKey||"id"),o=nn(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||F())return!0;try{let{dispatchAsync:m}=ke??=await import("@stacksjs/events"),g=await m(`${i}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||F())return;try{let{dispatch:m}=ke??=await import("@stacksjs/events");await m(`${i}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Y(a,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Y(a,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Y(a,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Y(a,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ia(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ia(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 sa=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],ua=["traits","dashboard"];function ca(e){let n=e?.[lt];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 la(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 da(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 fa(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=da(r),i=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++a}];return[s,u]}));t.attributes={...r,...i}}for(let a of sa){let i=la(e[a],n[a]);if(i)t[a]=i}for(let a of ua){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function vc(e,n){return jn(fa(ca(e),n))}import ka from"process";import{log as Ta}from"@stacksjs/logging";import{path as _}from"@stacksjs/path";import{fs as ee}from"@stacksjs/storage";import{Database as pa}from"bun:sqlite";import{existsSync as ma,readdirSync as ga,readFileSync as ya}from"fs";function wa(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function ba(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 ha(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(a){if(/duplicate column name/i.test(a.message))r++}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function In(e,n="sqlite"){let t=[];if(!ma(e))return{tables:[],errors:t};let r;try{r=ga(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new pa(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ya(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=ha(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((s)=>s.name).filter((s)=>!wa(s)),i=[];for(let s of a){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=ba(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:c})}return{tables:i,errors:t}}finally{o.close()}}function Ra(e){if(e)return e;let n=String(ka.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function Re(e){return e==="postgres"?"boolean":"number"}function O(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Sa(e,n){let t=e.default;if(typeof t==="boolean")return Re(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function _a(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Aa(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 Pa(e,n){let t=_a(e),r=Aa(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 Re(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 Sa(e,n)}})();return e.nullable===!0?`${a} | null`:a}function xa(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${O(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${O(a.model)}_id`]="number"}}return n}function Ca(e,n){let[t,r]=[O(e),O(n)].sort();return`${t}_${r}`}function va(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?Re(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Ma(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,u,c,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let h=i;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=i;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??Ca(e,s),m=c??`${O(e)}_id`,g=l??`${O(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=va(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Oa(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${Re(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function Da(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,Oa(n));return t}function Ea(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[O(o)]=Pa(a,n);return t}function Bn(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
4
+ `)}`);this.name="GdprDeclarationError",this.problems=e}}function Vr(e){return(Array.isArray(e)?e.map((t)=>[t.name??"",t]):Object.entries(e)).map(([t,r])=>({name:String(r?.name??t),definition:r})).filter((t)=>t.name&&t.definition&&typeof t.definition==="object").sort((t,r)=>t.name.localeCompare(r.name))}function qt(e,n){return n.table??Y(Wr(e))}function Qr(e){let n=e.belongsTo,t=Array.isArray(n)?n:n&&typeof n==="object"?Object.values(n):[],r=[];for(let o of t){if(typeof o==="string"){r.push({model:o,foreignKey:`${Y(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let a=o;r.push({model:a.model,foreignKey:a.foreignKey??`${Y(a.model)}_id`})}}return r}function zr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Hr(e,n){if(n.anonymize!==void 0)return{perRow:!1,value:n.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function fe(e){let n=new Map,t=new Map,r=[],o=[],a=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Vr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Qr(u),d=f.find((T)=>T.model===D),p=Object.entries(c).map(([T,P])=>({attribute:T,shape:P,options:zr(P?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==D)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){a(s,"`traits.gdpr` must be an object");continue}let m=qt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===D)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((P)=>P.model===b.via);if(!T)a(s,`subject { via: '${b.via}' } names a model this one does not declare in belongsTo`);else h=T.model,w={kind:"via",model:T.model,foreignKey:T.foreignKey}}else if(b&&typeof b==="object"&&"email"in b)w={kind:"email",column:String(b.email)};else a(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)a(s,"subject names no column");let k=l?.erasure??"anonymize";if(!Bt.has(k))a(s,`erasure must be one of ${[...Bt].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,P=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)a(s,"retention.days must be a positive whole number of days");else if(!Nt.has(P))a(s,`retention.action must be one of ${[...Nt].join(", ")}, got '${String(P)}'`);else R={days:T.days,column:T.column??"created_at",action:P}}if(l?.basis!==void 0&&!Lt.has(l.basis))a(s,`basis must be one of ${[...Lt].join(", ")}, got '${String(l.basis)}'`);let re=k==="anonymize"&&w!==null||R?.action==="anonymize",W=[];for(let{attribute:T,shape:P,options:Pe}of p){let oe=Hr(P,Pe);if("problem"in oe){if(re)a(s,`personal attribute '${T}' ${oe.problem}`);W.push({attribute:T,column:Y(T),export:Pe.export!==!1,perRow:!1,anonymizeTo:null});continue}W.push({attribute:T,column:Y(T),export:Pe.export!==!1,perRow:oe.perRow,anonymizeTo:oe.value})}if(w!==null&&k==="anonymize"&&W.length===0)a(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&W.length===0)a(s,"retention anonymizes, but no attribute is marked personal");if(n.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:W,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)t.set(s,h)}let i=(s,u)=>{let c=t.get(s);if(!c)return 0;if(u.has(s))return null;if(!n.get(c)?.subject)return null;u.add(s);let f=i(c,u);return f===null?null:f+1};for(let s of n.values()){let u=t.get(s.model);if(!u)continue;if(!n.get(u)?.subject){a(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=i(s.model,new Set);if(l===null)a(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...n.values()],unclassified:r.sort(),problems:o}}function pe(e){if(e.problems.length)throw new Ke(e.problems);return e}var me="gdpr_requests",Qe=500;class ge extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function ye(e){if(e)return pe(fe(e));await Promise.resolve().then(() => Ve());return pe(fe(await We()))}async function Jt(e=C){let n=String(to()),t=n==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":n==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":n==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!t)return null;let r=await e.unsafe(t).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var ro=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function we(e,n=C){let t=await Jt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(ro.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function oo(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function ao(e){if(typeof e==="number")return{kind:"id",value:e};let n=String(e).trim();if(/^\d+$/.test(n))return{kind:"id",value:Number(n)};if(n.includes("@"))return{kind:"email",value:n};return{kind:"uuid",value:n}}async function io(e,n={},t=C){let r=await ye(n.models);return He(r,e,t)}async function He(e,n,t){let{table:r,primaryKey:o}=oo(e),a=ao(n),i;if(a.kind==="id")i=(await t.selectFrom(r).selectAll().where(o,"=",a.value).limit(1).execute())[0];else if(a.kind==="email"){for(let s of new Set([a.value,a.value.toLowerCase()]))if(i=(await t.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],i)break}else i=(await t.selectFrom(r).selectAll().where("uuid","=",a.value).limit(1).execute())[0];if(!i)return null;return{id:i[o],email:typeof i.email==="string"?i.email:null}}function Je(e,n=Qe){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function so(e,n){let t=new Map;for(let r of e)t.set(String(r[n]),r);return[...t.values()].sort((r,o)=>String(r[n]).localeCompare(String(o[n]),void 0,{numeric:!0}))}async function Ye(e,n,t,r,o){let a=o.get(t.model);if(a)return a;let i=t.subject,s=[];if(i?.kind==="column")for(let u of i.columns){let c=e.selectFrom(t.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(i.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(i?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(t.table).selectAll().where(i.column,"=",u).execute())}else if(i?.kind==="via"){let u=n.get(i.model),l=(await Ye(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of Je(l))s.push(...await e.selectFrom(t.table).selectAll().where(i.foreignKey,"in",f).execute())}return s=so(s,t.primaryKey),o.set(t.model,s),s}function Qt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function uo(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Qt(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Qt(n[r.column]);return t}function ze(e,n){let t={};for(let r of e.personal)t[r.column]=r.perRow?`erased-${String(n[e.primaryKey])}`:r.anonymizeTo;return t}function co(e,n){if(e===n)return!0;if(e===null||e===void 0||n===null||n===void 0)return(e===null||e===void 0)&&(n===null||n===void 0);if(typeof n==="boolean")return Number(e)===Number(n);return String(e)===String(n)}function Yt(e,n){let t=ze(e,n);return Object.entries(t).some(([r,o])=>!co(n[r],o))}async function Xt(e,n,t){if(!t.length)return;if(n.personal.some((o)=>o.perRow)){for(let o of t)await e.updateTable(n.table).set(ze(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=ze(n,t[0]);for(let o of Je(t.map((a)=>a[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function Zt(e,n,t){for(let r of Je(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Xe(e,n,t,r,o){let a=Ht(new Date);await e.insertInto(me).values({uuid:eo(),type:n,subject_id:t!==null&&Number.isSafeInteger(Number(t))?Number(t):null,actor:r,status:"completed",summary:JSON.stringify(t!==null&&!Number.isSafeInteger(Number(t))?{subject:String(t),...o}:o),occurred_at:a,created_at:a}).execute()}async function Ze(){if(!await we(me))throw Error(`The '${me}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function et(e){let n=[],t=[],r=await Jt(),o=new Map;for(let a of e){if(!o.has(a.table))o.set(a.table,r?r.has(a.table.toLowerCase()):await we(a.table));if(o.get(a.table))n.push(a);else t.push(a.table)}return{present:n,skipped:[...new Set(t)].sort()}}async function lo(e,n={}){let t=await ye(n.models),r=await He(t,e,C);if(!r)throw new ge(e);await Ze();let o=t.models.filter((l)=>l.subject),{present:a}=await et(o),i=new Map(a.map((l)=>[l.model,l]));for(let l of a)if(l.subject?.kind==="via"&&!i.has(l.subject.model))i.delete(l.model);let s=new Map,u={},c={};for(let l of[...i.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await Ye(C,i,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>uo(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Xe(C,"access",r.id,n.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function fo(e){return[...e].sort((n,t)=>{let r=n.model===D?1:0,o=t.model===D?1:0;if(r!==o)return r-o;if(n.depth!==t.depth)return t.depth-n.depth;return n.model.localeCompare(t.model)})}async function po(e,n={}){let t=n.dryRun===!0,r=await ye(n.models),o=await He(r,e,C);if(!o)throw new ge(e);if(!t)await Ze();let a=r.models.filter((d)=>d.subject),{present:i,skipped:s}=await et(a),u=new Map(i.map((d)=>[d.model,d]));for(let d of i)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await Ye(d,u,g,o,p);let m=[];for(let g of fo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await Zt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Yt(g,b));if(!t)await Xt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!t)await Xe(d,"erasure",o.id,n.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=t?await c(C):await Ue(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await mo(o.id);return{subject:{id:o.id},dryRun:t,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function mo(e){let n;try{n=await import("@stacksjs/auth")}catch{return!1}let t=Number(e);if(!Number.isSafeInteger(t))return!1;if(n.revokeAllTokens&&await we("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var zt=86400000;async function go(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await ye(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await Ze();let{present:a,skipped:i}=await et(o),s=[],u={};for(let c of a){let l=c.retention,f=new Date(t.getTime()-l.days*zt),d=Ht(new Date(f.getTime()+zt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=C.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(Qe).execute();if(!b.length)break;for(let k of b){let R=no(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<Qe)break}let g=l.action==="delete"?p:p.filter((w)=>Yt(c,w));if(!n&&g.length)await Ue(async(w)=>{if(l.action==="delete")await Zt(w,c,g);else await Xt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!n&&s.some((c)=>c.changed>0))await Xe(C,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:n,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:i}}Ve();function yo(e){let n=e.subject;if(!n)return"none (not reachable by access or erasure)";if(n.kind==="via")return`via ${n.model} (\`${n.foreignKey}\`)`;if(n.kind==="email")return`email address in \`${n.column}\``;let t=n.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(n.where).map(([o,a])=>`${o} = ${String(a)}`).join(", ");return r?`${t} where ${r}`:t}function wo(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:yo(t),personal:t.personal.map((r)=>r.column),notExported:t.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:t.subject?t.erasure:null,retention:t.retention?`${t.retention.action} after ${t.retention.days} days (\`${t.retention.column}\`)`:null,basis:t.basis,purpose:t.purpose})).sort((t,r)=>t.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function X(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
5
+ `," ")}function bo(e,n="markdown"){if(n==="json")return`${JSON.stringify(e,null,2)}
6
+ `;let t=["# Processing register","","<!-- Generated by `buddy gdpr:register` from the model declarations. Do not edit by hand. -->","","Every model that declares personal data or a `gdpr` trait, what erasure does to its rows, and how long they are kept. Change the model, then regenerate this file.","","| Model | Table | Subject | Personal data | Erasure | Retention | Basis | Purpose |","| --- | --- | --- | --- | --- | --- | --- | --- |"];for(let r of e.entries){let o=r.personal.length?r.personal.map((a)=>r.notExported.includes(a)?`\`${a}\` (not exported)`:`\`${a}\``).join(", "):"-";t.push(`| ${[r.model,`\`${r.table}\``,X(r.subject),o,X(r.erasure),X(r.retention),X(r.basis),X(r.purpose)].join(" | ")} |`)}if(t.push(""),t.push("## Unclassified"),t.push(""),e.unclassified.length){t.push("These models belong to a user but declare neither personal attributes nor a `gdpr` trait, so access and erasure do not reach them. Classify each one, even if only as `erasure: 'keep'`."),t.push("");for(let r of e.unclassified)t.push(`- ${r}`)}else t.push("None. Every model that belongs to a user is classified.");return t.push(""),t.join(`
7
+ `)}export*from"@stacksjs/model-meta";import{createModel as Oo,registerModel as Do}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as te}from"@stacksjs/strings";import{AsyncLocalStorage as Pn}from"async_hooks";import{toCursorPaginator as Eo,toPaginator as jo,toSimplePaginator as Fo}from"@stacksjs/pagination";function nt(e,n){let t=at(),r=t?tt(t,"per_page"):void 0,o=t?tt(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 rt(e,n){let t=at(),r=t?tn(t,"cursor"):void 0,o=t?tt(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=en(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function en(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 ot(e){let n=at();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 q;function at(){if(q===null)return;if(q===void 0)try{let n=Qn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")q=n.getCurrentRequest;else{q=null;return}}catch{q=null;return}return q()}function tt(e,n){let t=tn(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function tn(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function nn(){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: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(i),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(i),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as ho,sqlDateTime as ko}from"@stacksjs/database/runtime";import{log as G}from"@stacksjs/logging";var be="deleted_at";function rn(e,n="id"){return{async softDelete(t){let r=ko(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[be]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[be]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return ho(await o.forceDelete())>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(be);return t?.where?.(be,"!=",null)??t}}}function on(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 To(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>it(l,n,!0)),a=r.some((l)=>it(l,n,!1));if(!o&&!a)return G.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>it(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return G.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function it(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 Ro(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){G.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="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 i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){G.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"){G.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,c=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await i.call(t,p)}}}catch(a){if(G.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Z(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=To(e,i);if(!s)continue;await Ro(s.className,t,s.model,a,r)}}import{sqlDateTime as Ao}from"@stacksjs/database/runtime";import{log as So}from"@stacksjs/logging";var _o=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],an=null;async function sn(){if(an!=null)return an;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();return t?.user?.id??t?._user?.id??null}catch{return null}}async function un(){try{let n=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof n!=="function")return null;let t=n();return typeof t?.ip==="function"?t.ip()??null:null}catch{return null}}function cn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(_o.some((o)=>o.test(t)))continue;n[t]=r}return n}function ln(e,n,t){So.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Po="activities";function dn(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let n=e;return{logOnly:Array.isArray(n.logOnly)?n.logOnly:void 0,include:Array.isArray(n.include)?n.include:void 0,exclude:Array.isArray(n.exclude)?n.exclude:void 0}}function xo(e,n,t=[]){let r=cn(e);if(!r)return null;let o=new Set(t),a=n.logOnly??n.include,i=new Set(n.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||i.has(u))continue;if(a&&!a.includes(u))continue;s[u]=c}return s}function Co(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function vo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Po).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Ao()}).executeTakeFirst()}catch(n){ln("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Mo(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await sn();await vo({type:`${r.toLowerCase()}.${t}`,description:Co(r,t,i),subject_type:r,subject_id:i,properties:xo(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await un()})}function he(e){if(!e||typeof e!=="object")return null;let n=e;if(n.attributes&&typeof n.attributes==="object")return{...n.attributes};if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function fn(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?he(await a.find(d)):null,s=async(d,p)=>{await Mo({modelName:n,event:d,attributes:p,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",he(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",he(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",he(m)??await i(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await i(d),m=await f.call(this,d);return await s("deleted",p??{[t]:d}),m}}var Re,xn=new Pn;function B(){return xn.getStore()?.suppressed===!0}function I(e){return Promise.resolve(xn.run({suppressed:!0},e))}var Cn=new Pn;function $o(){return Cn.getStore()?.suppressed===!0}function Io(e){return Promise.resolve(Cn.run({suppressed:!0},e))}var ft=Symbol.for("stacks.orm.modelDefinition");class vn 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 pn=new Set,Bo=4096,mn=Object.create(null),gn=0;function ee(e){let n=mn[e];if(n!==void 0)return n;let t=te(e);if(gn<Bo)mn[e]=t,gn++;return t}function No(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(pn.has(r))return;pn.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 Lo={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 No(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 qo(e){return typeof e==="string"?Lo[e]:e}var yn=new WeakMap;function Mn(e){let n=Object.keys(e),t=yn.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=n.map((o)=>{let a=e[o];return{attr:o,definition:a,caster:qo(a)}});return yn.set(e,r),r}function st(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Mn(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function ke(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var ct=Symbol.for("stacks.modelInstanceProxy"),wn,bn=new WeakMap,Go={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"},...Object.fromEntries(le.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Uo(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 Te(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function O(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[ct])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Mn(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?bn.get(n):wn;if(!o)if(o={get(a,i,s){let u=a;if(i===ct)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return Te(u.save(),a,s)}finally{l.set=d}}return Te(u.save(),a,s)};if(i==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return Te(u.save(),a,s)}finally{l.set=d}}return Te(u.save(),a,s)};if(i==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(i==="saveQuietly")return function(){return I(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return I(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return I(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return I(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return I(()=>u.delete())};if(i==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=te(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let re=w[b]??w[k];if(re){m[k]=Uo(h,re);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!ke(i)){let l=u._attributes;if(l&&Object.hasOwn(l,i))return l[i];let f=u._relations;if(f&&Object.hasOwn(f,i)){let p=f[i];if(Array.isArray(p))return p.map((m)=>O(m,n));return p&&typeof p==="object"?O(p,n):p}let d=Go[i];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=ee(i);if(p!==i&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,i,u);return typeof c==="function"?c.bind(u):c},set(a,i,s,u){let c=a;if(typeof i==="string"&&!ke(i)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,i)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}if(l){let d=ee(i);if(d!==i&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(i in c)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}}return Reflect.set(c,i,s,u)},has(a,i){let s=a;if(typeof i==="string"&&!ke(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return!0;let c=s._relations;if(c&&Object.hasOwn(c,i))return!0;if(u){let l=ee(i);if(l!==i&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,i)},deleteProperty(a,i){let s=a;if(typeof i==="string"&&!ke(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return delete u[i],!0}return Reflect.deleteProperty(s,i)},ownKeys(a){let s=a._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(a,i){let s=a;if(typeof i==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,i))return{configurable:!0,enumerable:!0,value:u[i],writable:!0}}return Object.getOwnPropertyDescriptor(s,i)}},n)bn.set(n,o);else wn=o;return new Proxy(e,o)}var On=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),Ko={paginate:jo,simplePaginate:Fo,cursorPaginate:Eo},hn=Symbol.for("stacks.queryBuilderProxy");function kn(e,n,t){if(On[n]){if(Array.isArray(e))return e.map((o)=>O(o,t));let r=Ko[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>O(i,t)),a=r({...e,data:o});return ot(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>O(o,t))};return O(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return Dn(e,t);return e}function Dn(e,n){if(!e||typeof e!=="object")return e;if(e[hn])return e;return new Proxy(e,{get(t,r,o){if(r===hn)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;let i=String(r);return function(...s){let u=s;if(i==="paginate"||i==="simplePaginate"){let{perPage:l,page:f}=nt(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=rt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!On[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>kn(l,i,n));return kn(c,i,n)}}})}function Wo(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>O(s,n)):O(i,n),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let i of o){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let a=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let i of a){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);return Dn(c,n)}}}class En 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 lt 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 Vo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Tn=new WeakMap;function Qo(e){let n=Tn.get(e);if(n)return n;let t=new Set,r=new Set,o=new Set;for(let[i,s]of Object.entries(e)){let u=ee(i);if(t.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let a={allowed:r.size>0?r:t,guarded:o};return Tn.set(e,a),a}function U(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{allowed:o,guarded:a}=Qo(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=ee(i);if(Vo.has(s))continue;if(a.has(s))throw new lt(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new lt(e.name,i,"not-fillable")}return n}async function Se(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 zo(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 i(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(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 p=e.find;return typeof p==="function"?await p.call(e,c):null}U(n,l);let f=await Se(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},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 Se(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"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[ct]?f:d??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(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},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new En(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 p={...c,...l};return U(n,p),await i("firstOrCreate").call(e,p)};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){U(n,l);let m=d[t];await o("updateOrCreate").call(e,t,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return U(n,p),await i("updateOrCreate").call(e,p)};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 p=await d.count();return Number(p)||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 s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=In(n.traits?.useSearch,n);if(u){let c=u.index??n.table??te(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Yo(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"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await dt(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await dt(w,u);if(h.length>0)await p.addDocuments(c,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{searchEngineReady:l}=await import("@stacksjs/search-engine");await(await l()).deleteAllDocuments(c)}}}async function dt(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)=>Jo(r,n)))).filter(Boolean)}function jn(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 Ho(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 Jo(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 Ho(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Yo(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...a,...r??{}},s={with(u){return i={...i,...u},s},where(u){return i={...i,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,i))?.hits??[]},async paginate(u,c=1){if(!Number.isInteger(u)||u<1)throw TypeError(`[orm/search] paginate() needs a positive integer page size, got ${u}`);if(!Number.isInteger(c)||c<1)throw TypeError(`[orm/search] paginate() pages are 1-based, got ${c}`);let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,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,i)}};return s}function Fn(e){let n=te(e);return n===e?[e]:[e,n]}async function ut(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Fn(r)){if(!(o in t))continue;let a=t[o];if(!V(a))continue;t[o]=await ve(a)}}function Xo(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await ut(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await ut(u,n);return s}if(s)await ut(s,n);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=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"],i=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;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 i(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return i(u.apply(this,c))}}}function Zo(e,n){if(n.length===0)return;let t=async(a)=>{if(!a||typeof a!=="object"||Array.isArray(a))return a;let i={...a};for(let s of n)for(let u of Fn(s))if(u in i)i[u]=await Ce(i[u]);return i},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?await Promise.all(a.map(t)):a;return await o.call(this,s,...i)};for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await i.apply(this,s)}}for(let a of["update","forceUpdate"]){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(s,u){let c=await t(u);return await i.call(this,s,c)}}}function ea(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){U(n,o);let i=await Se(n,o);return await t.call(this,i,...a)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...a){let i=[];for(let s of o)U(n,s),i.push(await Se(n,s));return await r.call(this,i,...a)};for(let o of["firstOrCreate","updateOrCreate"]){let a=e[o];if(typeof a!=="function")continue}}function ta(e,n){if(!jt(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if($o())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=Ft(s,n,u);if(!c.valid)throw new vn(t,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let a=e.createMany;if(typeof a==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await a.call(this,s,...u)};let i=e.update;if(typeof i==="function")e.update=async function(s,u,...c){return r(u,"updating"),await i.call(this,s,u,...c)}}function na(e,n){let t=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?a.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?st(u,n,"set"):u):a;return await r.call(this,s,...i)};for(let a of t){let i=e[a];if(typeof i==="function")e[a]=async function(...s){if(_.debug(`[orm] ${a.charAt(0).toUpperCase()+a.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=st(s[0],n,"set");return await i.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(a,i){let s=i&&typeof i==="object"&&!Array.isArray(i)?st(i,n,"set"):i;return await o.call(this,a,s)}}var Rn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function $n(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Rn.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Rn].sort().join(", ")}.`);let n=ra(e),t=aa(e),r=oa(n,t),o=ia(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=Oo(i);if(Wo(u,e.casts),zo(u,i),ea(u,i),e.casts&&Object.keys(e.casts).length>0)na(u,e.casts);let c=Me(e);if(c.length>0)Zo(u,c),Xo(u,c);let l=e.traits?.useSoftDeletes;if(l)sa(u,i,l);let f=e.traits?.useAudit;if(f){let g=Rt(f);St(u,e.name,e.primaryKey||"id",g)}let d=dn(e.traits?.useActivityLog);if(d)fn(u,e.name,e.primaryKey||"id",d,[...jn(e)]);ta(u,i);let p=u;p.withoutValidation=function(g){return Io(g)},p.withoutEvents=function(g){return I(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return I(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Do(e.name,m),Object.defineProperty(m,ft,{value:e,enumerable:!1,configurable:!0}),m}function ra(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(B())return;try{let{dispatch:m}=Re??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,p)=>{if(!s)return;if(B())return;try{let m=a(p),g=Array.isArray(m)?m:[m],w=i(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(B())return!0;let m;try{m=Re??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}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 p=r(d);await o(`${t}:created`,p),await o(`${t}:saved`,p),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 p=r(d);await o(`${t}:updated`,p),await o(`${t}:saved`,p),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 oa(...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 In(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=jn(n);return t}function aa(e){let n=In(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??te(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await dt([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 c=O(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(B())return;let u=await o(s);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 _n(r,u,e.name)}return}await _n(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(B())return;let u=s?.id??s?._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 An(r,Number(u),e.name)}return}await An(r,Number(u),e.name)}}}var Sn=new Map;function Bn(e,n){let t=Sn.get(e)??0;if(Sn.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 _n(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Bn(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function An(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Bn(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function ia(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=Fe(t);if(r.categorizable)n._categorizable=$e(t);if(r.commentable)n._commentable=Ee(t);if(r.billable)n._billable=Pt(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Ie(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=nn();return n}function sa(e,n,t){let r=rn(e,n.primaryKey||"id"),o=on(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||B())return!0;try{let{dispatchAsync:m}=Re??=await import("@stacksjs/events"),g=await m(`${i}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||B())return;try{let{dispatch:m}=Re??=await import("@stacksjs/events");await m(`${i}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Z(a,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Z(a,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Z(a,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Z(a,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ua(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ua(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 ca=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],la=["traits","dashboard"];function da(e){let n=e?.[ft];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 fa(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 pa(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 ma(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=pa(r),i=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++a}];return[s,u]}));t.attributes={...r,...i}}for(let a of ca){let i=fa(e[a],n[a]);if(i)t[a]=i}for(let a of la){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Dc(e,n){return $n(ma(da(e),n))}import Ra from"process";import{log as Sa}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as ne}from"@stacksjs/storage";import{Database as ga}from"bun:sqlite";import{existsSync as ya,readdirSync as wa,readFileSync as ba}from"fs";function ha(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function ka(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 Ta(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(a){if(/duplicate column name/i.test(a.message))r++}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function Nn(e,n="sqlite"){let t=[];if(!ya(e))return{tables:[],errors:t};let r;try{r=wa(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new ga(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ba(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Ta(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((s)=>s.name).filter((s)=>!ha(s)),i=[];for(let s of a){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=ka(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:c})}return{tables:i,errors:t}}finally{o.close()}}function _a(e){if(e)return e;let n=String(Ra.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function _e(e){return e==="postgres"?"boolean":"number"}function E(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Aa(e,n){let t=e.default;if(typeof t==="boolean")return _e(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Pa(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function xa(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 Ca(e,n){let t=Pa(e),r=xa(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 _e(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 Aa(e,n)}})();return e.nullable===!0?`${a} | null`:a}function va(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[`${E(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[`${E(a.model)}_id`]="number"}}return n}function Ma(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Oa(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?_e(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Da(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,u,c,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let h=i;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=i;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??Ma(e,s),m=c??`${E(e)}_id`,g=l??`${E(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Oa(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Ea(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${_e(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function ja(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,Ea(n));return t}function Fa(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[E(o)]=Ca(a,n);return t}function Ln(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
8
8
  `),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
9
9
  ${o}// columns
10
10
  ${a}
11
- ${r}}`}var ja=`/* eslint-disable */
11
+ ${r}}`}var $a=`/* eslint-disable */
12
12
  // AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
13
13
  // Regenerate after adding/removing a model or changing its attributes.
14
14
  // See stacksjs/stacks#1923.
15
15
 
16
16
  declare module '@stacksjs/database' {
17
17
  interface DatabaseSchema {
18
- `,Fa=` }
18
+ `,Ia=` }
19
19
  }
20
20
 
21
21
  export {}
22
- `,$a="/* 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",Ia=`}
23
- `;function Nn(e){return e==="framework"?$a:ja}function Ln(e){return e==="framework"?Ia:Fa}async function qn(e,n,t=[]){let r=[];if(!ee.existsSync(e))return r;let o=ee.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=_.join(e,a.name);if(a.isDirectory()){if(n){let s=await qn(i,!0,t);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(_.isAbsolute(i)?import(i):import(_.resolve(i))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:i,model:u})}catch(s){t.push({file:i,error:s.message})}}return r}async function Ba(e={}){let n=Ra(e.dialect),t=e.modelsDir??_.userModelsPath(),r=e.defaultsDir??_.frameworkPath("defaults/app/Models"),o=e.outFile??_.projectPath("database/types.d.ts"),a=[],i=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await qn(m,g,a);i.push(...w)}catch(w){a.push({file:m,error:w.message})}let s=new Map;for(let m of i)s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??_.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${O(m)}s`,h={...Da(g,n),...Ea(g,n),...xa(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of Ma(m,g,n)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let m=e.migrationsDir??_.resolve(_.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=In(m,n);for(let h of w.tables){if(g.has(h.table))continue;g.add(h.table),u.push({table:h.table,model:`(${h.table} migration)`,columns:h.columns})}a.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Bn(m.table,m.columns,f)).join(`
24
- `),p=`${Nn(l)}${d}
25
- ${Ln(l)}`;if(!e.dryRun){let m=_.dirname(o);if(!ee.existsSync(m))ee.mkdirSync(m,{recursive:!0});ee.writeFileSync(o,p,"utf-8"),Ta.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function Na(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Bn(r.table,r.columns,n==="framework"?1:2)).join(`
26
- `);return`${Nn(n)}${t}
27
- ${Ln(n)}`}import{isCursorPaginator as bl,isPaginator as hl,isSimplePaginator as kl,toCursorPaginator as Tl,toPaginator as Rl,toSimplePaginator as Sl}from"@stacksjs/pagination";import{configureOrm as La}from"@stacksjs/query-builder";function qa(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")La({database:e})}catch{}}qa();async function Gn(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 Se(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Gn(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 Gn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var D={},Un=()=>{},Gc=new Promise((e)=>{Un=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 Ga=y("User"),Ua=y("Job"),Ka=y("FailedJob"),Wa=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["GdprRequest",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Se("User");if(n)D.User=n;if(e("queue")){let t=await Se("Job");if(t)D.Job=t;let r=await Se("FailedJob");if(r)D.FailedJob=r}for(let[t,r,o]of Wa){if(!e(o))continue;let a=await Se(t,r);if(a)D[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Un()}});var Va=y("Activity"),Qa=y("AnalyticsEvent"),za=y("Automation"),Ha=y("AutomationRun"),Ja=y("Auction"),Ya=y("CampaignVariant"),Xa=y("CommunicationSuppression"),Za=y("ConsentEvent"),ei=y("SenderDomain"),ti=y("UsageEvent"),ni=y("AuctionItem"),ri=y("Author"),oi=y("Bid"),ai=y("Board"),ii=y("BoardColumn"),si=y("Campaign"),ui=y("Card"),ci=y("CardComment"),li=y("Cart"),di=y("CartItem"),fi=y("Category"),pi=y("Comment"),mi=y("Coupon"),gi=y("Customer"),yi=y("DeliveryRoute"),wi=y("DeliveryStop"),bi=y("Deployment"),hi=y("DigitalDelivery"),ki=y("Courier"),Ti=y("CourierPing"),Ri=y("CampaignSend"),Si=y("EmailList"),_i=y("EmailListSubscriber"),Ai=y("Form"),Pi=y("FormField"),xi=y("FormSubmission"),Ci=y("MagicLinkToken"),vi=y("Menu"),Mi=y("MenuItem"),Oi=y("PageRevision"),Di=y("Pledge"),Ei=y("Redirect"),ji=y("Site"),Fi=y("SiteDomain"),$i=y("SmsOptOut"),Ii=y("GdprRequest"),Uc=y("StorageItem"),Kc=y("StorageItemTask"),Bi=y("EmailIdempotency"),Ni=y("EmailSuppression"),Li=y("EmailWebhookEvent"),qi=y("Error"),Gi=y("GiftCard"),Ui=y("Label"),Ki=y("LicenseKey"),Wi=y("Log"),Vi=y("LoyaltyPoint"),Qi=y("LoyaltyReward"),zi=y("MailPreference"),Hi=y("Manufacturer"),Ji=y("Notification"),Yi=y("NotificationDelivery"),Xi=y("Order"),Zi=y("OrderIdempotency"),Wc=y("PersonalAccessToken"),es=y("OrderItem"),ts=y("Page"),ns=y("Payment"),rs=y("PaymentMethod"),os=y("PaymentProduct"),as=y("PaymentTransaction"),is=y("Post"),ss=y("Categorizable"),us=y("PrintDevice"),cs=y("Product"),ls=y("ProductUnit"),ds=y("ProductVariant"),fs=y("QueryLog"),ps=y("Receipt"),Vc=y("Referral"),Qc=y("ReferralCode"),ms=y("Release"),gs=y("Request"),ys=y("Review"),ws=y("ShippingMethod"),bs=y("ShippingRate"),hs=y("ShippingZone"),ks=y("SocialPost"),Ts=y("SocialAccount"),Rs=y("Subscriber"),Ss=y("SubscriberEmail"),_s=y("Subscription"),As=y("Tag"),Ps=y("TaxRate"),xs=y("Team"),Cs=y("TeamInvitation"),vs=y("TeamMember"),Ms=y("Transaction"),Os=y("WaitlistProduct"),Ds=y("WaitlistRestaurant"),Es=y("Websocket"),Kn={User:Ga,Job:Ua,FailedJob:Ka,Activity:Va,AnalyticsEvent:Qa,Automation:za,AutomationRun:Ha,Auction:Ja,AuctionItem:ni,Author:ri,Bid:oi,Board:ai,BoardColumn:ii,Campaign:si,CampaignSend:Ri,CampaignVariant:Ya,Card:ui,CardComment:ci,Cart:li,CartItem:di,Categorizable:ss,Category:fi,Comment:pi,Coupon:mi,Customer:gi,CommunicationSuppression:Xa,ConsentEvent:Za,DeliveryRoute:yi,DeliveryStop:wi,Deployment:bi,DigitalDelivery:hi,Courier:ki,CourierPing:Ti,EmailList:Si,EmailListSubscriber:_i,EmailIdempotency:Bi,EmailSuppression:Ni,EmailWebhookEvent:Li,ErrorModel:qi,Form:Ai,FormField:Pi,FormSubmission:xi,GdprRequest:Ii,GiftCard:Gi,Label:Ui,LicenseKey:Ki,Log:Wi,LoyaltyPoint:Vi,LoyaltyReward:Qi,MailPreference:zi,Manufacturer:Hi,Notification:Ji,MagicLinkToken:Ci,Menu:vi,MenuItem:Mi,NotificationDelivery:Yi,Order:Xi,OrderIdempotency:Zi,OrderItem:es,Page:ts,PageRevision:Oi,Payment:ns,PaymentMethod:rs,PaymentProduct:os,PaymentTransaction:as,Pledge:Di,Post:is,PrintDevice:us,Product:cs,ProductUnit:ls,ProductVariant:ds,QueryLog:fs,Receipt:ps,Release:ms,Request:gs,Review:ys,ShippingMethod:ws,Redirect:Ei,SenderDomain:ei,ShippingRate:bs,ShippingZone:hs,Site:ji,SiteDomain:Fi,SmsOptOut:$i,SocialAccount:Ts,SocialPost:ks,Subscriber:Rs,SubscriberEmail:Ss,Subscription:_s,Tag:As,TaxRate:Ps,Team:xs,TeamInvitation:Cs,TeamMember:vs,Transaction:Ms,UsageEvent:ti,WaitlistProduct:Os,WaitlistRestaurant:Ds,Websocket:Es},G=globalThis;for(let[e,n]of Object.entries(Kn))if(n&&G[e]===void 0)G[e]=n;var zc=Object.keys(Kn);async function js(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 Fs(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(G.safeAll===void 0)G.safeAll=js;if(G.safeGet===void 0)G.safeGet=Fs;export{Va as Activity,Qa as AnalyticsEvent,Ja as Auction,ni as AuctionItem,ri as Author,za as Automation,Ha as AutomationRun,ue as BILLABLE_INSTANCE_METHODS,oi as Bid,ai as Board,ii as BoardColumn,si as Campaign,Ri as CampaignSend,Ya as CampaignVariant,ui as Card,ci as CardComment,li as Cart,di as CartItem,ss as Categorizable,fi as Category,pi as Comment,Xa as CommunicationSuppression,Za as ConsentEvent,mi as Coupon,ki as Courier,Ti as CourierPing,gi as Customer,yi as DeliveryRoute,wi as DeliveryStop,bi as Deployment,hi as DigitalDelivery,Bi as EmailIdempotency,Si as EmailList,_i as EmailListSubscriber,Ni as EmailSuppression,Li as EmailWebhookEvent,qi as ErrorModel,Ka as FailedJob,Ai as Form,Pi as FormField,xi as FormSubmission,fe as GDPR_AUDIT_TABLE,M as GDPR_SUBJECT_MODEL,Ge as GdprDeclarationError,Ii as GdprRequest,pe as GdprSubjectNotFoundError,Gi as GiftCard,Ua as Job,Ui as Label,Ki as LicenseKey,Wi as Log,Vi as LoyaltyPoint,Qi as LoyaltyReward,lt as MODEL_DEFINITION,Ci as MagicLinkToken,zi as MailPreference,Hi as Manufacturer,ut as MassAssignmentException,vi as Menu,Mi as MenuItem,On as ModelNotFoundError,xn as ModelValidationError,Ji as Notification,Yi as NotificationDelivery,Xi as Order,Zi as OrderIdempotency,es as OrderItem,ts as Page,Oi as PageRevision,ns as Payment,rs as PaymentMethod,os as PaymentProduct,as as PaymentTransaction,Wc as PersonalAccessToken,Di as Pledge,is as Post,us as PrintDevice,cs as Product,ls as ProductUnit,ds as ProductVariant,fs as QueryLog,ps as Receipt,Ei as Redirect,Vc as Referral,Qc as ReferralCode,ms as Release,gs as Request,ys as Review,ei as SenderDomain,ws as ShippingMethod,bs as ShippingRate,hs as ShippingZone,ji as Site,Fi as SiteDomain,$i as SmsOptOut,Ts as SocialAccount,ks as SocialPost,Uc as StorageItem,Kc as StorageItemTask,Gr as SubqueryBuilder,Rs as Subscriber,Ss as SubscriberEmail,_s as Subscription,$e as SubscriptionNotOwnedError,As as Tag,Ps as TaxRate,xs as Team,Cs as TeamInvitation,vs as TeamMember,Ms as Transaction,ti as UsageEvent,Ga as User,Os as WaitlistProduct,Ds as WaitlistRestaurant,Es as Websocket,de as assertGdprPlan,Au as batchLoad,Ba as buildDatabaseSchema,go as buildProcessingRegister,Ce as collectEncryptedAttributes,ht as createAuditMethods,je as createCategorizableMethods,Oe as createCommentableMethods,Fe as createLikeableMethods,Ee as createTaggableMethods,jr as customerOwnership,vu as db,xe as decryptValue,jn as defineModel,Pe as encryptValue,nt as enrichPaginatorUrls,lo as eraseSubject,uo as exportSubjectData,vc as extendModel,hr as filterFillable,ge as gdprTableExists,Nt as gdprTableName,Ls as getPrunableConfig,br as getWritableFields,mr as isBillable,bl as isCursorPaginator,K as isEncrypted,hl as isPaginator,kl as isSimplePaginator,Dr as isUniqueViolation,Ue as loadGdprModels,yr as mapWriteError,Ns as massPrunable,fa as mergeModelDefinition,zc as modelGlobalNames,Gc as ormReady,Br as parentOwnership,Xt as parseCursor,ct as projectDocumentsFromTrait,Vn as prunable,po as pruneRetainedData,Na as renderDatabaseTypeFile,yo as renderProcessingRegister,tt as resolveCursorArgs,le as resolveGdprPlan,oo as resolveGdprSubject,et as resolvePageArgs,Du as savepoint,Fr as selfOwnership,er as setAuditUser,$r as siteOwnership,Ir as teamMembershipOwnership,ia as toAttrs,Tl as toCursorPaginator,Rl as toPaginator,Sl as toSimplePaginator,wr as toSnakeCaseKeys,qe as transaction,Eu as transactional,j as withoutEvents,Fo as withoutValidation};
22
+ `,Ba="/* 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",Na=`}
23
+ `;function qn(e){return e==="framework"?Ba:$a}function Gn(e){return e==="framework"?Na:Ia}async function Un(e,n,t=[]){let r=[];if(!ne.existsSync(e))return r;let o=ne.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=A.join(e,a.name);if(a.isDirectory()){if(n){let s=await Un(i,!0,t);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(A.isAbsolute(i)?import(i):import(A.resolve(i))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:i,model:u})}catch(s){t.push({file:i,error:s.message})}}return r}async function La(e={}){let n=_a(e.dialect),t=e.modelsDir??A.userModelsPath(),r=e.defaultsDir??A.frameworkPath("defaults/app/Models"),o=e.outFile??A.projectPath("database/types.d.ts"),a=[],i=[];for(let[m,g]of[[t,!1],[r,!0]])try{let w=await Un(m,g,a);i.push(...w)}catch(w){a.push({file:m,error:w.message})}let s=new Map;for(let m of i)s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${E(m)}s`,h={...ja(g,n),...Fa(g,n),...va(g)};u.push({table:w,model:m,columns:h})}let c=new Map;for(let[m,{model:g}]of s)for(let w of Da(m,g,n)){if(c.has(w.table))continue;c.set(w.table,{table:w.table,model:`(${w.table} pivot)`,columns:w.columns})}if(u.push(...c.values()),e.migrationsDir!==!1){let m=e.migrationsDir??A.resolve(A.dirname(o),"migrations"),g=new Set(u.map((h)=>h.table)),w=Nn(m,n);for(let h of w.tables){if(g.has(h.table))continue;g.add(h.table),u.push({table:h.table,model:`(${h.table} migration)`,columns:h.columns})}a.push(...w.errors)}u.sort((m,g)=>m.table.localeCompare(g.table));let l=e.target??"app",f=l==="framework"?1:2,d=u.map((m)=>Ln(m.table,m.columns,f)).join(`
24
+ `),p=`${qn(l)}${d}
25
+ ${Gn(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!ne.existsSync(m))ne.mkdirSync(m,{recursive:!0});ne.writeFileSync(o,p,"utf-8"),Sa.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function qa(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>Ln(r.table,r.columns,n==="framework"?1:2)).join(`
26
+ `);return`${qn(n)}${t}
27
+ ${Gn(n)}`}import{isCursorPaginator as Tl,isPaginator as Rl,isSimplePaginator as Sl,toCursorPaginator as _l,toPaginator as Al,toSimplePaginator as Pl}from"@stacksjs/pagination";import{configureOrm as Ga}from"@stacksjs/query-builder";function Ua(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ga({database:e})}catch{}}Ua();async function Kn(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 Ae(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Kn(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 Kn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var j={},Wn=()=>{},Wc=new Promise((e)=>{Wn=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=j[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=j[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=j[e];return r==null?!1:(t in r)},apply(n,t,r){let o=j[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Ka=y("User"),Wa=y("Job"),Va=y("FailedJob"),Qa=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["GdprRequest",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["PaymentWebhookEvent",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Ae("User");if(n)j.User=n;if(e("queue")){let t=await Ae("Job");if(t)j.Job=t;let r=await Ae("FailedJob");if(r)j.FailedJob=r}for(let[t,r,o]of Qa){if(!e(o))continue;let a=await Ae(t,r);if(a)j[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Wn()}});var za=y("Activity"),Ha=y("AnalyticsEvent"),Ja=y("Automation"),Ya=y("AutomationRun"),Xa=y("Auction"),Za=y("CampaignVariant"),ei=y("CommunicationSuppression"),ti=y("ConsentEvent"),ni=y("SenderDomain"),ri=y("UsageEvent"),oi=y("AuctionItem"),ai=y("Author"),ii=y("Bid"),si=y("Board"),ui=y("BoardColumn"),ci=y("Campaign"),li=y("Card"),di=y("CardComment"),fi=y("Cart"),pi=y("CartItem"),mi=y("Category"),gi=y("Comment"),yi=y("Coupon"),wi=y("Customer"),bi=y("DeliveryRoute"),hi=y("DeliveryStop"),ki=y("Deployment"),Ti=y("DigitalDelivery"),Ri=y("Courier"),Si=y("CourierPing"),_i=y("CampaignSend"),Ai=y("EmailList"),Pi=y("EmailListSubscriber"),xi=y("Form"),Ci=y("FormField"),vi=y("FormSubmission"),Mi=y("MagicLinkToken"),Oi=y("Menu"),Di=y("MenuItem"),Ei=y("PageRevision"),ji=y("Pledge"),Fi=y("Redirect"),$i=y("Site"),Ii=y("SiteDomain"),Bi=y("SmsOptOut"),Ni=y("GdprRequest"),Vc=y("StorageItem"),Qc=y("StorageItemTask"),Li=y("EmailIdempotency"),qi=y("EmailSuppression"),Gi=y("EmailWebhookEvent"),Ui=y("Error"),Ki=y("GiftCard"),Wi=y("Label"),Vi=y("LicenseKey"),Qi=y("Log"),zi=y("LoyaltyPoint"),Hi=y("LoyaltyReward"),Ji=y("MailPreference"),Yi=y("Manufacturer"),Xi=y("Notification"),Zi=y("NotificationDelivery"),es=y("Order"),ts=y("OrderIdempotency"),zc=y("PersonalAccessToken"),ns=y("OrderItem"),rs=y("Page"),os=y("Payment"),as=y("PaymentWebhookEvent"),is=y("PaymentMethod"),ss=y("PaymentProduct"),us=y("PaymentTransaction"),cs=y("Post"),ls=y("Categorizable"),ds=y("PrintDevice"),fs=y("Product"),ps=y("ProductUnit"),ms=y("ProductVariant"),gs=y("QueryLog"),ys=y("Receipt"),Hc=y("Referral"),Jc=y("ReferralCode"),ws=y("Release"),bs=y("Request"),hs=y("Review"),ks=y("ShippingMethod"),Ts=y("ShippingRate"),Rs=y("ShippingZone"),Ss=y("SocialPost"),_s=y("SocialAccount"),As=y("Subscriber"),Ps=y("SubscriberEmail"),xs=y("Subscription"),Cs=y("Tag"),vs=y("TaxRate"),Ms=y("Team"),Os=y("TeamInvitation"),Ds=y("TeamMember"),Es=y("Transaction"),js=y("WaitlistProduct"),Fs=y("WaitlistRestaurant"),$s=y("Websocket"),Vn={User:Ka,Job:Wa,FailedJob:Va,Activity:za,AnalyticsEvent:Ha,Automation:Ja,AutomationRun:Ya,Auction:Xa,AuctionItem:oi,Author:ai,Bid:ii,Board:si,BoardColumn:ui,Campaign:ci,CampaignSend:_i,CampaignVariant:Za,Card:li,CardComment:di,Cart:fi,CartItem:pi,Categorizable:ls,Category:mi,Comment:gi,Coupon:yi,Customer:wi,CommunicationSuppression:ei,ConsentEvent:ti,DeliveryRoute:bi,DeliveryStop:hi,Deployment:ki,DigitalDelivery:Ti,Courier:Ri,CourierPing:Si,EmailList:Ai,EmailListSubscriber:Pi,EmailIdempotency:Li,EmailSuppression:qi,EmailWebhookEvent:Gi,ErrorModel:Ui,Form:xi,FormField:Ci,FormSubmission:vi,GdprRequest:Ni,GiftCard:Ki,Label:Wi,LicenseKey:Vi,Log:Qi,LoyaltyPoint:zi,LoyaltyReward:Hi,MailPreference:Ji,Manufacturer:Yi,Notification:Xi,MagicLinkToken:Mi,Menu:Oi,MenuItem:Di,NotificationDelivery:Zi,Order:es,OrderIdempotency:ts,OrderItem:ns,Page:rs,PageRevision:Ei,Payment:os,PaymentMethod:is,PaymentProduct:ss,PaymentTransaction:us,PaymentWebhookEvent:as,Pledge:ji,Post:cs,PrintDevice:ds,Product:fs,ProductUnit:ps,ProductVariant:ms,QueryLog:gs,Receipt:ys,Release:ws,Request:bs,Review:hs,ShippingMethod:ks,Redirect:Fi,SenderDomain:ni,ShippingRate:Ts,ShippingZone:Rs,Site:$i,SiteDomain:Ii,SmsOptOut:Bi,SocialAccount:_s,SocialPost:Ss,Subscriber:As,SubscriberEmail:Ps,Subscription:xs,Tag:Cs,TaxRate:vs,Team:Ms,TeamInvitation:Os,TeamMember:Ds,Transaction:Es,UsageEvent:ri,WaitlistProduct:js,WaitlistRestaurant:Fs,Websocket:$s},K=globalThis;for(let[e,n]of Object.entries(Vn))if(n&&K[e]===void 0)K[e]=n;var Yc=Object.keys(Vn);async function Is(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 Bs(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=Is;if(K.safeGet===void 0)K.safeGet=Bs;export{za as Activity,Ha as AnalyticsEvent,Xa as Auction,oi as AuctionItem,ai as Author,Ja as Automation,Ya as AutomationRun,le as BILLABLE_INSTANCE_METHODS,ii as Bid,si as Board,ui as BoardColumn,ci as Campaign,_i as CampaignSend,Za as CampaignVariant,li as Card,di as CardComment,fi as Cart,pi as CartItem,ls as Categorizable,mi as Category,gi as Comment,ei as CommunicationSuppression,ti as ConsentEvent,yi as Coupon,Ri as Courier,Si as CourierPing,wi as Customer,bi as DeliveryRoute,hi as DeliveryStop,ki as Deployment,Ti as DigitalDelivery,Li as EmailIdempotency,Ai as EmailList,Pi as EmailListSubscriber,qi as EmailSuppression,Gi as EmailWebhookEvent,Ui as ErrorModel,Va as FailedJob,xi as Form,Ci as FormField,vi as FormSubmission,me as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,Ke as GdprDeclarationError,Ni as GdprRequest,ge as GdprSubjectNotFoundError,Ki as GiftCard,Wa as Job,Wi as Label,Vi as LicenseKey,Qi as Log,zi as LoyaltyPoint,Hi as LoyaltyReward,ft as MODEL_DEFINITION,Mi as MagicLinkToken,Ji as MailPreference,Yi as Manufacturer,lt as MassAssignmentException,Oi as Menu,Di as MenuItem,En as ModelNotFoundError,vn as ModelValidationError,Xi as Notification,Zi as NotificationDelivery,es as Order,ts as OrderIdempotency,ns as OrderItem,rs as Page,Ei as PageRevision,os as Payment,is as PaymentMethod,ss as PaymentProduct,us as PaymentTransaction,as as PaymentWebhookEvent,zc as PersonalAccessToken,ji as Pledge,cs as Post,ds as PrintDevice,fs as Product,ps as ProductUnit,ms as ProductVariant,gs as QueryLog,ys as Receipt,Fi as Redirect,Hc as Referral,Jc as ReferralCode,ws as Release,bs as Request,hs as Review,ni as SenderDomain,ks as ShippingMethod,Ts as ShippingRate,Rs as ShippingZone,$i as Site,Ii as SiteDomain,Bi as SmsOptOut,_s as SocialAccount,Ss as SocialPost,Vc as StorageItem,Qc as StorageItemTask,Kr as SubqueryBuilder,As as Subscriber,Ps as SubscriberEmail,xs as Subscription,Be as SubscriptionNotOwnedError,Cs as Tag,vs as TaxRate,Ms as Team,Os as TeamInvitation,Ds as TeamMember,Es as Transaction,ri as UsageEvent,Ka as User,js as WaitlistProduct,Fs as WaitlistRestaurant,$s as Websocket,pe as assertGdprPlan,Cu as batchLoad,La as buildDatabaseSchema,wo as buildProcessingRegister,Me as collectEncryptedAttributes,Tt as createAuditMethods,$e as createCategorizableMethods,Ee as createCommentableMethods,Ie as createLikeableMethods,Fe as createTaggableMethods,$r as customerOwnership,Du as db,ve as decryptValue,$n as defineModel,Ce as encryptValue,ot as enrichPaginatorUrls,po as eraseSubject,lo as exportSubjectData,Dc as extendModel,Tr as filterFillable,we as gdprTableExists,qt as gdprTableName,Us as getPrunableConfig,kr as getWritableFields,yr as isBillable,Tl as isCursorPaginator,V as isEncrypted,Rl as isPaginator,Sl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,br as mapWriteError,Gs as massPrunable,ma as mergeModelDefinition,Yc as modelGlobalNames,Wc as ormReady,Lr as parentOwnership,en as parseCursor,dt as projectDocumentsFromTrait,zn as prunable,go as pruneRetainedData,qa as renderDatabaseTypeFile,bo as renderProcessingRegister,rt as resolveCursorArgs,fe as resolveGdprPlan,io as resolveGdprSubject,nt as resolvePageArgs,Fu as savepoint,Ir as selfOwnership,nr as setAuditUser,Br as siteOwnership,Nr as teamMembershipOwnership,ua as toAttrs,_l as toCursorPaginator,Al as toPaginator,Pl as toSimplePaginator,hr as toSnakeCaseKeys,Ue as transaction,$u as transactional,I as withoutEvents,Io as withoutValidation};
@@ -184,6 +184,16 @@ export default defineModel({
184
184
  },
185
185
  factory: faker => faker.helpers.maybe(() => faker.lorem.sentence(), { probability: 0.3 }),
186
186
  },
187
+
188
+ // Why the provider declined it, in the provider's words. Written by the
189
+ // payment webhook (`handleCommercePaymentEvent`) for ops triage.
190
+ failureReason: {
191
+ order: 16,
192
+ fillable: true,
193
+ validation: {
194
+ rule: schema.string().max(1000),
195
+ },
196
+ },
187
197
  },
188
198
 
189
199
  dashboard: {
@@ -0,0 +1,56 @@
1
+ import { defineModel } from '@stacksjs/orm'
2
+ import { schema } from '@stacksjs/validation/runtime'
3
+
4
+ /**
5
+ * A payment webhook delivery already applied. Providers retry until they are
6
+ * answered, so commerce records each event here in the same transaction as the
7
+ * order update it makes, and a retry finds its row and does nothing.
8
+ */
9
+ export default defineModel({
10
+ name: 'PaymentWebhookEvent',
11
+ table: 'payment_webhook_events',
12
+ primaryKey: 'id',
13
+ autoIncrement: true,
14
+
15
+ indexes: [
16
+ {
17
+ name: 'payment_webhook_events_provider_event_unique',
18
+ columns: ['provider', 'event_id'],
19
+ unique: true,
20
+ },
21
+ ],
22
+
23
+ // Written by the system on a provider's behalf, never for a caller.
24
+ ownership: false,
25
+
26
+ traits: {
27
+ useTimestamps: true,
28
+ },
29
+
30
+ attributes: {
31
+ /** The payment driver that verified it: `stripe`, `adyen`, or one you registered. */
32
+ provider: {
33
+ required: true,
34
+ fillable: true,
35
+ validation: {
36
+ rule: schema.string().required().max(64),
37
+ },
38
+ },
39
+ eventId: {
40
+ required: true,
41
+ fillable: true,
42
+ validation: {
43
+ rule: schema.string().required().max(512),
44
+ },
45
+ },
46
+ processedAt: {
47
+ required: true,
48
+ fillable: true,
49
+ validation: {
50
+ rule: schema.timestamp().required(),
51
+ },
52
+ },
53
+ },
54
+
55
+ dashboard: { enabled: false },
56
+ } as const)
@@ -1,3 +1,4 @@
1
+ import type { SubscriptionSummary } from '@stacksjs/payments';
1
2
  import type Stripe from 'stripe';
2
3
  export declare function createBillableMethods(_tableName: string): void;
3
4
  /**
@@ -33,19 +34,9 @@ export declare interface StoredSubscriptionRow {
33
34
  provider_type?: string
34
35
  last_used_at?: string
35
36
  }
36
- /**
37
- * Return shape for `newSubscription` / `updateSubscription` — pairs
38
- * the Stripe-side subscription with the most-recent payment intent so
39
- * callers can immediately handle 3DS / SCA flows without a second
40
- * round-trip to Stripe.
41
- */
42
- export declare interface NewSubscriptionResult {
43
- subscription: Stripe.Response<Stripe.Subscription>
44
- paymentIntent?: Stripe.PaymentIntent
45
- }
46
37
  export declare interface ActiveSubscriptionResult {
47
38
  subscription: StoredSubscriptionRow
48
- providerSubscription: Stripe.Response<Stripe.Subscription>
39
+ providerSubscription: SubscriptionSummary
49
40
  }
50
41
  declare type StripeConstructor = typeof Stripe;
51
42
  declare type BillableMethodBag = ReturnType<typeof createBillableMethods>;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/orm",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.76",
5
+ "version": "0.75.78",
6
6
  "description": "The Stacks ORM integration",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -63,31 +63,31 @@
63
63
  "prepublishOnly": "bun run build"
64
64
  },
65
65
  "dependencies": {
66
- "@stacksjs/cache": "0.75.76",
67
- "@stacksjs/cli": "0.75.76",
68
- "@stacksjs/config": "0.75.76",
69
- "@stacksjs/database": "0.75.76",
70
- "@stacksjs/env": "0.75.76",
71
- "@stacksjs/error-handling": "0.75.76",
72
- "@stacksjs/events": "0.75.76",
73
- "@stacksjs/logging": "0.75.76",
74
- "@stacksjs/model-meta": "0.75.76",
75
- "@stacksjs/pagination": "0.75.76",
76
- "@stacksjs/path": "0.75.76",
77
- "@stacksjs/query-builder": "0.75.76",
78
- "@stacksjs/realtime": "0.75.76",
79
- "@stacksjs/router": "0.75.76",
80
- "@stacksjs/storage": "0.75.76",
81
- "@stacksjs/strings": "0.75.76",
66
+ "@stacksjs/cache": "0.75.78",
67
+ "@stacksjs/cli": "0.75.78",
68
+ "@stacksjs/config": "0.75.78",
69
+ "@stacksjs/database": "0.75.78",
70
+ "@stacksjs/env": "0.75.78",
71
+ "@stacksjs/error-handling": "0.75.78",
72
+ "@stacksjs/events": "0.75.78",
73
+ "@stacksjs/logging": "0.75.78",
74
+ "@stacksjs/model-meta": "0.75.78",
75
+ "@stacksjs/pagination": "0.75.78",
76
+ "@stacksjs/path": "0.75.78",
77
+ "@stacksjs/query-builder": "0.75.78",
78
+ "@stacksjs/realtime": "0.75.78",
79
+ "@stacksjs/router": "0.75.78",
80
+ "@stacksjs/storage": "0.75.78",
81
+ "@stacksjs/strings": "0.75.78",
82
82
  "@stacksjs/ts-validation": "^0.5.6",
83
- "@stacksjs/validation": "0.75.76",
83
+ "@stacksjs/validation": "0.75.78",
84
84
  "bun-query-builder": "^0.3.5"
85
85
  },
86
86
  "peerDependencies": {
87
- "@stacksjs/auth": "0.75.76",
88
- "@stacksjs/payments": "0.75.76",
89
- "@stacksjs/queue": "0.75.76",
90
- "@stacksjs/search-engine": "0.75.76",
87
+ "@stacksjs/auth": "0.75.78",
88
+ "@stacksjs/payments": "0.75.78",
89
+ "@stacksjs/queue": "0.75.78",
90
+ "@stacksjs/search-engine": "0.75.78",
91
91
  "stripe": "23.0.0"
92
92
  },
93
93
  "peerDependenciesMeta": {
@@ -108,7 +108,7 @@
108
108
  }
109
109
  },
110
110
  "devDependencies": {
111
- "@stacksjs/types": "0.75.76",
111
+ "@stacksjs/types": "0.75.78",
112
112
  "better-dx": "^0.2.24",
113
113
  "stripe": "23.0.0"
114
114
  }