@stacksjs/orm 0.75.82 → 0.75.84

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.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +23 -23
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
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:
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{assertStripeDriver:n}=await import("@stacksjs/payments");n(e)}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
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
5
  `," ")}function bo(e,n="markdown"){if(n==="json")return`${JSON.stringify(e,null,2)}
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.82",
5
+ "version": "0.75.84",
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.82",
67
- "@stacksjs/cli": "0.75.82",
68
- "@stacksjs/config": "0.75.82",
69
- "@stacksjs/database": "0.75.82",
70
- "@stacksjs/env": "0.75.82",
71
- "@stacksjs/error-handling": "0.75.82",
72
- "@stacksjs/events": "0.75.82",
73
- "@stacksjs/logging": "0.75.82",
74
- "@stacksjs/model-meta": "0.75.82",
75
- "@stacksjs/pagination": "0.75.82",
76
- "@stacksjs/path": "0.75.82",
77
- "@stacksjs/query-builder": "0.75.82",
78
- "@stacksjs/realtime": "0.75.82",
79
- "@stacksjs/router": "0.75.82",
80
- "@stacksjs/storage": "0.75.82",
81
- "@stacksjs/strings": "0.75.82",
66
+ "@stacksjs/cache": "0.75.84",
67
+ "@stacksjs/cli": "0.75.84",
68
+ "@stacksjs/config": "0.75.84",
69
+ "@stacksjs/database": "0.75.84",
70
+ "@stacksjs/env": "0.75.84",
71
+ "@stacksjs/error-handling": "0.75.84",
72
+ "@stacksjs/events": "0.75.84",
73
+ "@stacksjs/logging": "0.75.84",
74
+ "@stacksjs/model-meta": "0.75.84",
75
+ "@stacksjs/pagination": "0.75.84",
76
+ "@stacksjs/path": "0.75.84",
77
+ "@stacksjs/query-builder": "0.75.84",
78
+ "@stacksjs/realtime": "0.75.84",
79
+ "@stacksjs/router": "0.75.84",
80
+ "@stacksjs/storage": "0.75.84",
81
+ "@stacksjs/strings": "0.75.84",
82
82
  "@stacksjs/ts-validation": "^0.5.6",
83
- "@stacksjs/validation": "0.75.82",
83
+ "@stacksjs/validation": "0.75.84",
84
84
  "bun-query-builder": "^0.3.5"
85
85
  },
86
86
  "peerDependencies": {
87
- "@stacksjs/auth": "0.75.82",
88
- "@stacksjs/payments": "0.75.82",
89
- "@stacksjs/queue": "0.75.82",
90
- "@stacksjs/search-engine": "0.75.82",
87
+ "@stacksjs/auth": "0.75.84",
88
+ "@stacksjs/payments": "0.75.84",
89
+ "@stacksjs/queue": "0.75.84",
90
+ "@stacksjs/search-engine": "0.75.84",
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.82",
111
+ "@stacksjs/types": "0.75.84",
112
112
  "better-dx": "^0.2.24",
113
113
  "stripe": "23.0.0"
114
114
  }