@stacksjs/orm 0.75.91 → 0.75.93
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.js +9 -9
- package/dist/models/CardAttachment.ts +13 -6
- package/package.json +23 -23
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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,r){for(let o of Zr(e))try{let a=Ut(o),i=await import(`${o}?t=${Date.now()}`),s=i.default??i,u=s.name??Yr(o,a);t.models[u]={...s,name:u},t.origins[u]=n}catch(a){r?.(o,a)}}async function eo(e){let n={models:{},origins:{}};return await Gt(e.defaultsRoot,"default",n,e.onImportError),await Gt(e.userRoot,"app",n,e.onImportError),n}async function Kt(e){return(await eo(e)).models}function Uu(e,n){let t,r="default";if(n!==void 0&&n!==null)t=n.split(","),r="env";else if(typeof e==="string")t=[e],r="config";else if(Array.isArray(e)&&e.every((a)=>typeof a==="string"))t=e,r="config";if(t===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=t.map((a)=>a.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((a)=>a!=="own")),source:r}}function Ku(e,n){let t={},r=new Set;for(let[o,a]of Object.entries(e.models)){if(!a?.traits?.useApi)continue;let i=o.toLowerCase(),s=n.names.has(i);if(s)r.add(i);if(n.all||s||n.own&&e.origins[o]==="app")t[o]=a}return{models:t,unmatched:[...n.names].filter((o)=>!r.has(o)).sort()}}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 Us(e,n={}){return zn(e,n)}function Ks(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 Me(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 ve(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 M(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 M(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(M(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){M(t,"upvoteComment"),M(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){M(t,"removeCommentUpvote"),M(r,"removeCommentUpvote"),await n.deleteFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).execute()},async commentUpvoteCount(t){M(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 M(t,"hasUpvotedComment"),M(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 v(){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 v()).customer(t)},async charge(t,r,o,a={}){return(await v()).charge(t,r,o,a)},async createPayment(t,r,o={}){return(await v()).createPayment(t,r,o)},async checkout(t,r){return(await v()).checkout(t,r)},async paymentMethods(t){return(await v()).paymentMethods(t)},async removePaymentMethod(t,r){return(await v()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await v()).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 v()).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 v()).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 lu(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 du(e){return e?.ownership===!1}function fu(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 pu(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 mu(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 gu(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 yu(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}},Mt=new WeakMap;function Pr(e,n){let t=Mt.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 Mt.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 wu(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 vt=new WeakMap;function Mr(e){let n=vt.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 vt.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=Mr(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 vr(e,n){return`${e}\x00${Or(n)}`}function bu(e){let n=new Map;for(let t of e){let r=vr(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 hu(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 ku(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 Tu(e,n,t,r,o,a){let{page:i,...s}=Er(e,n,t,r,o,a);return{current_page:i,...s}}function Ru(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Su(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 Mu(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 Eu}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 $u(e){return await Ge.savepoint(e)}function Iu(e,n){return Ge.transactional(e,n)}import{randomUUID as to}from"crypto";import{db as C,getDatabaseDialect as no,parseSqlDateTime as ro,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 zn=import.meta.require;import{readdirSync as Yr}from"fs";import{basename as Xr,extname as Ut,join as Zr}from"path";function eo(e){let n=[],t=(r)=>{let o;try{o=Yr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Zr(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,r){for(let o of eo(e))try{let a=Ut(o),i=await import(`${o}?t=${Date.now()}`),s=i.default??i,u=s.name??Xr(o,a);t.models[u]={...s,name:u},t.origins[u]=n}catch(a){r?.(o,a)}}async function to(e){let n={models:{},origins:{}};return await Gt(e.defaultsRoot,"default",n,e.onImportError),await Gt(e.userRoot,"app",n,e.onImportError),n}async function Kt(e){return(await to(e)).models}function Uu(e,n){let t,r="default";if(n!==void 0&&n!==null)t=n.split(","),r="env";else if(typeof e==="string")t=[e],r="config";else if(Array.isArray(e)&&e.every((a)=>typeof a==="string"))t=e,r="config";if(t===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=t.map((a)=>a.trim().toLowerCase()).filter(Boolean);if(o.length===0||o.includes("none"))return{all:!1,own:!1,names:new Set,source:r};if(o.includes("all"))return{all:!0,own:!1,names:new Set,source:r};return{all:!1,own:o.includes("own"),names:new Set(o.filter((a)=>a!=="own")),source:r}}function Ku(e,n){let t={},r=new Set;for(let[o,a]of Object.entries(e.models)){if(!a?.traits?.useApi)continue;let i=o.toLowerCase(),s=n.names.has(i);if(s)r.add(i);if(n.all||s||n.own&&e.origins[o]==="app")t[o]=a}return{models:t,unmatched:[...n.names].filter((o)=>!r.has(o)).sort()}}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 Hn(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 Us(e,n={}){return Hn(e,n)}function Ks(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Jn,createDecipheriv as Yn,createHash as Xn,randomBytes as Zn}from"crypto";import{log as ie}from"@stacksjs/logging";var yt="enc:",wt="aes-256-gcm",er=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=Xn("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=Zn(er),r=Jn(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 Me(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=Yn(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 ve(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 tr}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var nr=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],kt="model_audits",Oe=null;function rr(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(nr.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 or(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:tr()}).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}=or(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 ar,sql as ir,sqlDateTime as De}from"@stacksjs/database/runtime";function M(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 sr(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=ar;return{async comments(t){return M(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(ir`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(M(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){M(t,"upvoteComment"),M(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(!sr(i))throw i}return await o()},async removeCommentUpvote(t,r){M(t,"removeCommentUpvote"),M(r,"removeCommentUpvote"),await n.deleteFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).execute()},async commentUpvoteCount(t){M(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 M(t,"hasUpvotedComment"),M(r,"hasUpvotedComment"),!!await n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ur,sql as cr,sqlDateTime as At}from"@stacksjs/database/runtime";function Fe(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function je(e){let n=ur;return{async tags(t){return Fe(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){Fe(t,"tagCount");let r=await n.selectFrom("taggables").select(cr`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(Fe(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at: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 lr,sqlDateTime as ce}from"@stacksjs/database/runtime";function $e(e){let n=lr;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 dr,sqlDateTime as fr}from"@stacksjs/database/runtime";function Ie(e,n){let t=dr,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=fr();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 pr}from"module";import{db as mr}from"@stacksjs/database/runtime";var gr=pr(import.meta.url);class Be extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}async function v(){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=mr;return{async paymentCustomer(t){return(await v()).customer(t)},async charge(t,r,o,a={}){return(await v()).charge(t,r,o,a)},async createPayment(t,r,o={}){return(await v()).createPayment(t,r,o)},async checkout(t,r){return(await v()).checkout(t,r)},async paymentMethods(t){return(await v()).paymentMethods(t)},async removePaymentMethod(t,r){return(await v()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await v()).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 v()).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 v()).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 yr={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(yr));function wr(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=gr("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 br}from"@stacksjs/error-handling";function hr(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(br(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 kr(e){let n={};for(let[t,r]of Object.entries(e))n[x(t)]=r;return n}function lu(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 du(e){return e?.ownership===!1}function fu(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 Tr(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 Rr(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??=_r(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function Sr(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 _r(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 pu(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 mu(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 Ar=["id","uuid","created_at","updated_at","deleted_at"];function gu(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),...Ar]){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 yu(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 Pr={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"?Cr(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"?Mr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Mt=new WeakMap;function xr(e,n){let t=Mt.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"?Pr[a]:a;r.push({attr:o,snake:x(o),definition:a,caster:i})}return Mt.set(e,r),r}function Cr(e){try{return JSON.parse(e)}catch{return e}}function Mr(e){try{return JSON.parse(e)}catch{return[]}}function wu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=xr(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 vt=new WeakMap;function vr(e){let n=vt.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 vt.set(e,t),t}function Ft(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 jt(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=Sr(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 Or(e,n){return`${e}\x00${Dr(n)}`}function bu(e){let n=new Map;for(let t of e){let r=Or(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function Dr(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 hu(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,Er=100;function ku(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,Er);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 Fr(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 Tu(e,n,t,r,o,a){let{page:i,...s}=Fr(e,n,t,r,o,a);return{current_page:i,...s}}function Ru(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Su(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 $r(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 Ir(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 Br(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Nr(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 Lr(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 qr(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=$r(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 Gr}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 Ur(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return It(t??[]).get(n)}async function Kr(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 Mu(e,n){let t=Gr();if(!t)return Ur(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(()=>{Kr(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 Eu}from"@stacksjs/database/runtime";class Wr{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 $u(e){return await Ge.savepoint(e)}function Iu(e,n){return Ge.transactional(e,n)}import{randomUUID as no}from"crypto";import{db as C,getDatabaseDialect as ro,parseSqlDateTime as oo,sqlDateTime as Ht}from"@stacksjs/database/runtime";import{plural as Vr,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 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(no()),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 oo=/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(oo.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function ao(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function io(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 so(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}=ao(e),a=io(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 uo(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=uo(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 co(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 lo(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])=>!lo(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:to(),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 fo(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)=>co(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 po(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 mo(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 po([...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 go(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 go(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 yo(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=ro(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 wo(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 bo(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:wo(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
|
|
4
|
+
`)}`);this.name="GdprDeclarationError",this.problems=e}}function Qr(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(Vr(e))}function zr(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 Hr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Jr(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 Qr(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=zr(u),d=f.find((T)=>T.model===D),p=Object.entries(c).map(([T,P])=>({attribute:T,shape:P,options:Hr(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=Jr(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(ro()),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 ao=/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(ao.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function io(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function so(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 uo(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}=io(e),a=so(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 co(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=co(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 lo(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 fo(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])=>!fo(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:no(),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 po(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)=>lo(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 mo(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 go(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 mo([...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 yo(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 yo(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 wo(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=oo(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 bo(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 ho(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:bo(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 ko(e,n="markdown"){if(n==="json")return`${JSON.stringify(e,null,2)}
|
|
6
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 Do,registerModel as Eo}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 jo,toPaginator as Fo,toSimplePaginator as $o}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 ko,sqlDateTime as To}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=To(),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 ko(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 Ro(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 So(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=Ro(e,i);if(!s)continue;await So(s.className,t,s.model,a,r)}}import{sqlDateTime as Po}from"@stacksjs/database/runtime";import{log as _o}from"@stacksjs/logging";var Ao=[/^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(Ao.some((o)=>o.test(t)))continue;n[t]=r}return n}function ln(e,n,t){_o.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var xo="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 Co(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 Mo(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(xo).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:Po()}).executeTakeFirst()}catch(n){ln("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Oo(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:Mo(r,t,i),subject_type:r,subject_id:i,properties:Co(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 Oo({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 Io(){return Cn.getStore()?.suppressed===!0}function Bo(e){return Promise.resolve(Cn.run({suppressed:!0},e))}var ft=Symbol.for("stacks.orm.modelDefinition");class Mn 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,No=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<No)mn[e]=t,gn++;return t}function Lo(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 qo={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 Lo(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 Go(e){return typeof e==="string"?qo[e]:e}var yn=new WeakMap;function vn(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:Go(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 vn(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,Uo={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 Ko(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 vn(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]=Ko(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=Uo[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}),Wo={paginate:Fo,simplePaginate:$o,cursorPaginate:jo},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=Wo[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 Vo(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 Qo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Tn=new WeakMap;function zo(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}=zo(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=ee(i);if(Qo.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 Ho(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 Xo(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)=>Yo(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 Jo(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 Yo(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 Jo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Xo(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 Me(a)}}function Zo(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 ea(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 ta(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 na(e,n){if(!jt(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(Io())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=Ft(s,n,u);if(!c.valid)throw new Mn(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 ra(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=oa(e),t=ia(e),r=aa(n,t),o=sa(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=Do(i);if(Vo(u,e.casts),Ho(u,i),ta(u,i),e.casts&&Object.keys(e.casts).length>0)ra(u,e.casts);let c=ve(e);if(c.length>0)ea(u,c),Zo(u,c);let l=e.traits?.useSoftDeletes;if(l)ua(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)]);na(u,i);let p=u;p.withoutValidation=function(g){return Bo(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 Eo(e.name,m),Object.defineProperty(m,ft,{value:e,enumerable:!1,configurable:!0}),m}function oa(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 aa(...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 ia(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 sa(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 ua(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 ca(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ca(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 la=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],da=["traits","dashboard"];function fa(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 pa(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 ma(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 ga(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=ma(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 la){let i=pa(e[a],n[a]);if(i)t[a]=i}for(let a of da){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Fc(e,n){return $n(ga(fa(e),n))}import Sa from"process";import{log as _a}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as ne}from"@stacksjs/storage";import{Database as ya}from"bun:sqlite";import{existsSync as wa,readdirSync as ba,readFileSync as ha}from"fs";function ka(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Ta(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 Ra(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(!wa(e))return{tables:[],errors:t};let r;try{r=ba(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new ya(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ha(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Ra(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)=>!ka(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=Ta(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 Aa(e){if(e)return e;let n=String(Sa.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 Pa(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 xa(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Ca(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 Ma(e,n){let t=xa(e),r=Ca(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 Pa(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 Oa(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Da(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 Ea(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??Oa(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]=Da(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function ja(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 Fa(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,ja(n));return t}function $a(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[E(o)]=Ma(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(`
|
|
7
|
+
`)}export*from"@stacksjs/model-meta";import{createModel as Eo,registerModel as Fo}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 jo,toPaginator as $o,toSimplePaginator as Io}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?j(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?j(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?j(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?j(t,{page:o+1}):null,e.first_page_url=j(t,{page:1}),e.last_page_url=j(t,{page:a})}else e.next_page_url=e.has_more_pages?j(t,{page:o+1}):null;return e}function j(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=zn("@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 To,sqlDateTime as Ro}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=Ro(),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 To(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 So(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 _o(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=So(e,i);if(!s)continue;await _o(s.className,t,s.model,a,r)}}import{sqlDateTime as xo}from"@stacksjs/database/runtime";import{log as Ao}from"@stacksjs/logging";var Po=[/^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(Po.some((o)=>o.test(t)))continue;n[t]=r}return n}function ln(e,n,t){Ao.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Co="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 Mo(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 vo(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function Oo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Co).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:xo()}).executeTakeFirst()}catch(n){ln("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Do(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await sn();await Oo({type:`${r.toLowerCase()}.${t}`,description:vo(r,t,i),subject_type:r,subject_id:i,properties:Mo(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 Do({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 Bo(){return Cn.getStore()?.suppressed===!0}function No(e){return Promise.resolve(Cn.run({suppressed:!0},e))}var ft=Symbol.for("stacks.orm.modelDefinition");class Mn 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,Lo=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<Lo)mn[e]=t,gn++;return t}function qo(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 Go={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 qo(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 Uo(e){return typeof e==="string"?Go[e]:e}var yn=new WeakMap;function vn(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:Uo(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 vn(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,Ko={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 Wo(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 vn(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]=Wo(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=Ko[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}),Vo={paginate:$o,simplePaginate:Io,cursorPaginate:jo},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=Vo[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 Qo(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 zo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Tn=new WeakMap;function Ho(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}=Ho(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=ee(i);if(zo.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 Jo(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 Zo(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)=>Xo(r,n)))).filter(Boolean)}function Fn(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 Yo(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 Xo(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 Yo(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Zo(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 jn(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 jn(r)){if(!(o in t))continue;let a=t[o];if(!V(a))continue;t[o]=await Me(a)}}function ea(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 ta(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 jn(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 na(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 ra(e,n){if(!Ft(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if(Bo())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=jt(s,n,u);if(!c.valid)throw new Mn(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 oa(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=aa(e),t=sa(e),r=ia(n,t),o=ua(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=Eo(i);if(Qo(u,e.casts),Jo(u,i),na(u,i),e.casts&&Object.keys(e.casts).length>0)oa(u,e.casts);let c=ve(e);if(c.length>0)ta(u,c),ea(u,c);let l=e.traits?.useSoftDeletes;if(l)ca(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,[...Fn(e)]);ra(u,i);let p=u;p.withoutValidation=function(g){return No(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 Fo(e.name,m),Object.defineProperty(m,ft,{value:e,enumerable:!1,configurable:!0}),m}function aa(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 ia(...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=Fn(n);return t}function sa(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 ua(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=je(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 ca(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 la(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>la(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 da=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],fa=["traits","dashboard"];function pa(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 ma(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 ga(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 ya(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=ga(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 da){let i=ma(e[a],n[a]);if(i)t[a]=i}for(let a of fa){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function jc(e,n){return $n(ya(pa(e),n))}import Ln from"process";import{log as _a}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as ne}from"@stacksjs/storage";import{Database as wa}from"bun:sqlite";import{existsSync as ba,readdirSync as ha,readFileSync as ka}from"fs";function Ta(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function Ra(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 Sa(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(!ba(e))return{tables:[],errors:t};let r;try{r=ha(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new wa(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ka(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Sa(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)=>!Ta(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=Ra(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 Aa(e){if(e)return e;if(Ln.env.STACKS_CANONICAL_FEATURES==="1")return"sqlite";let n=String(Ln.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 Pa(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 xa(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function Ca(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 Ma(e,n){let t=xa(e),r=Ca(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 Pa(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 Oa(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Da(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 Ea(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??Oa(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]=Da(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Fa(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,Fa(n));return t}function $a(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[E(o)]=Ma(a,n);return t}function qn(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}
|
|
@@ -20,8 +20,8 @@ declare module '@stacksjs/database' {
|
|
|
20
20
|
|
|
21
21
|
export {}
|
|
22
22
|
`,Na="/* 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",La=`}
|
|
23
|
-
`;function
|
|
24
|
-
`),p=`${
|
|
25
|
-
${
|
|
26
|
-
`);return`${
|
|
27
|
-
${Gn(n)}`}import{isCursorPaginator as Pl,isPaginator as xl,isSimplePaginator as Cl,toCursorPaginator as Ml,toPaginator as vl,toSimplePaginator as Ol}from"@stacksjs/pagination";import{configureOrm as Ua}from"@stacksjs/query-builder";function Ka(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ua({database:e})}catch{}}Ka();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=()=>{},zc=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 Wa=y("User"),Va=y("Job"),Qa=y("FailedJob"),za=[["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"],["CardAttachment",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["FeedbackToken",[""],"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 za){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 Ha=y("Activity"),Ja=y("AnalyticsEvent"),Ya=y("Automation"),Xa=y("AutomationRun"),Za=y("Auction"),ei=y("CampaignVariant"),ti=y("CommunicationSuppression"),ni=y("ConsentEvent"),ri=y("SenderDomain"),oi=y("UsageEvent"),ai=y("AuctionItem"),ii=y("Author"),si=y("Bid"),ui=y("Board"),ci=y("BoardColumn"),li=y("Campaign"),di=y("Card"),Hc=y("CardAttachment"),fi=y("CardComment"),pi=y("Cart"),mi=y("CartItem"),gi=y("Category"),yi=y("Comment"),wi=y("Coupon"),bi=y("Customer"),hi=y("DeliveryRoute"),ki=y("DeliveryStop"),Ti=y("Deployment"),Jc=y("FeedbackToken"),Ri=y("DigitalDelivery"),Si=y("Courier"),_i=y("CourierPing"),Ai=y("CampaignSend"),Pi=y("EmailList"),xi=y("EmailListSubscriber"),Ci=y("Form"),Mi=y("FormField"),vi=y("FormSubmission"),Oi=y("MagicLinkToken"),Di=y("Menu"),Ei=y("MenuItem"),ji=y("PageRevision"),Fi=y("Pledge"),$i=y("Redirect"),Ii=y("Site"),Bi=y("SiteDomain"),Ni=y("SmsOptOut"),Li=y("GdprRequest"),Yc=y("StorageItem"),Xc=y("StorageItemTask"),qi=y("EmailIdempotency"),Gi=y("EmailSuppression"),Ui=y("EmailWebhookEvent"),Ki=y("Error"),Wi=y("GiftCard"),Vi=y("Label"),Qi=y("LicenseKey"),zi=y("Log"),Hi=y("LoyaltyPoint"),Ji=y("LoyaltyReward"),Yi=y("MailPreference"),Xi=y("Manufacturer"),Zi=y("Notification"),es=y("NotificationDelivery"),ts=y("Order"),ns=y("OrderIdempotency"),Zc=y("PersonalAccessToken"),rs=y("OrderItem"),os=y("Page"),as=y("Payment"),is=y("PaymentWebhookEvent"),ss=y("PaymentMethod"),us=y("PaymentProduct"),cs=y("PaymentTransaction"),ls=y("Post"),ds=y("Categorizable"),fs=y("PrintDevice"),ps=y("Product"),ms=y("ProductUnit"),gs=y("ProductVariant"),ys=y("QueryLog"),ws=y("Receipt"),el=y("Referral"),tl=y("ReferralCode"),bs=y("Release"),hs=y("Request"),ks=y("Review"),Ts=y("ShippingMethod"),Rs=y("ShippingRate"),Ss=y("ShippingZone"),_s=y("SocialPost"),As=y("SocialAccount"),Ps=y("Subscriber"),xs=y("SubscriberEmail"),Cs=y("Subscription"),Ms=y("Tag"),vs=y("TaxRate"),Os=y("Team"),Ds=y("TeamInvitation"),Es=y("TeamMember"),js=y("Transaction"),Fs=y("WaitlistProduct"),$s=y("WaitlistRestaurant"),Is=y("Websocket"),Vn={User:Wa,Job:Va,FailedJob:Qa,Activity:Ha,AnalyticsEvent:Ja,Automation:Ya,AutomationRun:Xa,Auction:Za,AuctionItem:ai,Author:ii,Bid:si,Board:ui,BoardColumn:ci,Campaign:li,CampaignSend:Ai,CampaignVariant:ei,Card:di,CardComment:fi,Cart:pi,CartItem:mi,Categorizable:ds,Category:gi,Comment:yi,Coupon:wi,Customer:bi,CommunicationSuppression:ti,ConsentEvent:ni,DeliveryRoute:hi,DeliveryStop:ki,Deployment:Ti,DigitalDelivery:Ri,Courier:Si,CourierPing:_i,EmailList:Pi,EmailListSubscriber:xi,EmailIdempotency:qi,EmailSuppression:Gi,EmailWebhookEvent:Ui,ErrorModel:Ki,Form:Ci,FormField:Mi,FormSubmission:vi,GdprRequest:Li,GiftCard:Wi,Label:Vi,LicenseKey:Qi,Log:zi,LoyaltyPoint:Hi,LoyaltyReward:Ji,MailPreference:Yi,Manufacturer:Xi,Notification:Zi,MagicLinkToken:Oi,Menu:Di,MenuItem:Ei,NotificationDelivery:es,Order:ts,OrderIdempotency:ns,OrderItem:rs,Page:os,PageRevision:ji,Payment:as,PaymentMethod:ss,PaymentProduct:us,PaymentTransaction:cs,PaymentWebhookEvent:is,Pledge:Fi,Post:ls,PrintDevice:fs,Product:ps,ProductUnit:ms,ProductVariant:gs,QueryLog:ys,Receipt:ws,Release:bs,Request:hs,Review:ks,ShippingMethod:Ts,Redirect:$i,SenderDomain:ri,ShippingRate:Rs,ShippingZone:Ss,Site:Ii,SiteDomain:Bi,SmsOptOut:Ni,SocialAccount:As,SocialPost:_s,Subscriber:Ps,SubscriberEmail:xs,Subscription:Cs,Tag:Ms,TaxRate:vs,Team:Os,TeamInvitation:Ds,TeamMember:Es,Transaction:js,UsageEvent:oi,WaitlistProduct:Fs,WaitlistRestaurant:$s,Websocket:Is},K=globalThis;for(let[e,n]of Object.entries(Vn))if(n&&K[e]===void 0)K[e]=n;var nl=Object.keys(Vn);async function Bs(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 Ns(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=Bs;if(K.safeGet===void 0)K.safeGet=Ns;export{Ha as Activity,Ja as AnalyticsEvent,Za as Auction,ai as AuctionItem,ii as Author,Ya as Automation,Xa as AutomationRun,le as BILLABLE_INSTANCE_METHODS,si as Bid,ui as Board,ci as BoardColumn,li as Campaign,Ai as CampaignSend,ei as CampaignVariant,di as Card,Hc as CardAttachment,fi as CardComment,pi as Cart,mi as CartItem,ds as Categorizable,gi as Category,yi as Comment,ti as CommunicationSuppression,ni as ConsentEvent,wi as Coupon,Si as Courier,_i as CourierPing,bi as Customer,hi as DeliveryRoute,ki as DeliveryStop,Ti as Deployment,Ri as DigitalDelivery,qi as EmailIdempotency,Pi as EmailList,xi as EmailListSubscriber,Gi as EmailSuppression,Ui as EmailWebhookEvent,Ki as ErrorModel,Qa as FailedJob,Jc as FeedbackToken,Ci as Form,Mi as FormField,vi as FormSubmission,me as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,Ke as GdprDeclarationError,Li as GdprRequest,ge as GdprSubjectNotFoundError,Wi as GiftCard,Va as Job,Vi as Label,Qi as LicenseKey,zi as Log,Hi as LoyaltyPoint,Ji as LoyaltyReward,ft as MODEL_DEFINITION,Oi as MagicLinkToken,Yi as MailPreference,Xi as Manufacturer,lt as MassAssignmentException,Di as Menu,Ei as MenuItem,En as ModelNotFoundError,Mn as ModelValidationError,Zi as Notification,es as NotificationDelivery,ts as Order,ns as OrderIdempotency,rs as OrderItem,os as Page,ji as PageRevision,as as Payment,ss as PaymentMethod,us as PaymentProduct,cs as PaymentTransaction,is as PaymentWebhookEvent,Zc as PersonalAccessToken,Fi as Pledge,ls as Post,fs as PrintDevice,ps as Product,ms as ProductUnit,gs as ProductVariant,ys as QueryLog,ws as Receipt,$i as Redirect,el as Referral,tl as ReferralCode,bs as Release,hs as Request,ks as Review,ri as SenderDomain,Ts as ShippingMethod,Rs as ShippingRate,Ss as ShippingZone,Ii as Site,Bi as SiteDomain,Ni as SmsOptOut,As as SocialAccount,_s as SocialPost,Yc as StorageItem,Xc as StorageItemTask,Kr as SubqueryBuilder,Ps as Subscriber,xs as SubscriberEmail,Cs as Subscription,Be as SubscriptionNotOwnedError,Ms as Tag,vs as TaxRate,Os as Team,Ds as TeamInvitation,Es as TeamMember,js as Transaction,oi as UsageEvent,Wa as User,Fs as WaitlistProduct,$s as WaitlistRestaurant,Is as Websocket,pe as assertGdprPlan,Mu as batchLoad,qa as buildDatabaseSchema,bo as buildProcessingRegister,ve as collectEncryptedAttributes,Tt as createAuditMethods,$e as createCategorizableMethods,Ee as createCommentableMethods,Ie as createLikeableMethods,Fe as createTaggableMethods,$r as customerOwnership,Eu as db,Me as decryptValue,$n as defineModel,Ce as encryptValue,ot as enrichPaginatorUrls,mo as eraseSubject,fo as exportSubjectData,Fc as extendModel,Tr as filterFillable,we as gdprTableExists,qt as gdprTableName,Ks as getPrunableConfig,kr as getWritableFields,yr as isBillable,Pl as isCursorPaginator,V as isEncrypted,xl as isPaginator,Cl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,br as mapWriteError,Us as massPrunable,ga as mergeModelDefinition,nl as modelGlobalNames,zc as ormReady,Lr as parentOwnership,en as parseCursor,dt as projectDocumentsFromTrait,zn as prunable,yo as pruneRetainedData,Ga as renderDatabaseTypeFile,ho as renderProcessingRegister,rt as resolveCursorArgs,fe as resolveGdprPlan,so as resolveGdprSubject,nt as resolvePageArgs,$u as savepoint,Ir as selfOwnership,nr as setAuditUser,Br as siteOwnership,Nr as teamMembershipOwnership,ca as toAttrs,Ml as toCursorPaginator,vl as toPaginator,Ol as toSimplePaginator,hr as toSnakeCaseKeys,Ue as transaction,Iu as transactional,I as withoutEvents,Bo as withoutValidation};
|
|
23
|
+
`;function Gn(e){return e==="framework"?Na:Ia}function Un(e){return e==="framework"?La:Ba}async function Kn(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 Kn(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 qa(e={}){let n=Aa(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 Kn(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),...$a(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 Ea(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)=>qn(m.table,m.columns,f)).join(`
|
|
24
|
+
`),p=`${Gn(l)}${d}
|
|
25
|
+
${Un(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!ne.existsSync(m))ne.mkdirSync(m,{recursive:!0});ne.writeFileSync(o,p,"utf-8"),_a.success(`[generate:db-types] wrote ${u.length} table(s) to ${o}`)}return{outFile:o,tables:u,errors:a,content:p}}function Ga(e,n="app"){let t=[...e].sort((r,o)=>r.table.localeCompare(o.table)).map((r)=>qn(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
26
|
+
`);return`${Gn(n)}${t}
|
|
27
|
+
${Un(n)}`}import{isCursorPaginator as Pl,isPaginator as xl,isSimplePaginator as Cl,toCursorPaginator as Ml,toPaginator as vl,toSimplePaginator as Ol}from"@stacksjs/pagination";import{configureOrm as Ua}from"@stacksjs/query-builder";function Ka(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ua({database:e})}catch{}}Ka();async function Wn(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 Wn(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 Wn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var F={},Vn=()=>{},zc=new Promise((e)=>{Vn=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=F[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=F[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=F[e];return r==null?!1:(t in r)},apply(n,t,r){let o=F[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Wa=y("User"),Va=y("Job"),Qa=y("FailedJob"),za=[["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"],["CardAttachment",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["FeedbackToken",[""],"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)F.User=n;if(e("queue")){let t=await Ae("Job");if(t)F.Job=t;let r=await Ae("FailedJob");if(r)F.FailedJob=r}for(let[t,r,o]of za){if(!e(o))continue;let a=await Ae(t,r);if(a)F[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Vn()}});var Ha=y("Activity"),Ja=y("AnalyticsEvent"),Ya=y("Automation"),Xa=y("AutomationRun"),Za=y("Auction"),ei=y("CampaignVariant"),ti=y("CommunicationSuppression"),ni=y("ConsentEvent"),ri=y("SenderDomain"),oi=y("UsageEvent"),ai=y("AuctionItem"),ii=y("Author"),si=y("Bid"),ui=y("Board"),ci=y("BoardColumn"),li=y("Campaign"),di=y("Card"),Hc=y("CardAttachment"),fi=y("CardComment"),pi=y("Cart"),mi=y("CartItem"),gi=y("Category"),yi=y("Comment"),wi=y("Coupon"),bi=y("Customer"),hi=y("DeliveryRoute"),ki=y("DeliveryStop"),Ti=y("Deployment"),Jc=y("FeedbackToken"),Ri=y("DigitalDelivery"),Si=y("Courier"),_i=y("CourierPing"),Ai=y("CampaignSend"),Pi=y("EmailList"),xi=y("EmailListSubscriber"),Ci=y("Form"),Mi=y("FormField"),vi=y("FormSubmission"),Oi=y("MagicLinkToken"),Di=y("Menu"),Ei=y("MenuItem"),Fi=y("PageRevision"),ji=y("Pledge"),$i=y("Redirect"),Ii=y("Site"),Bi=y("SiteDomain"),Ni=y("SmsOptOut"),Li=y("GdprRequest"),Yc=y("StorageItem"),Xc=y("StorageItemTask"),qi=y("EmailIdempotency"),Gi=y("EmailSuppression"),Ui=y("EmailWebhookEvent"),Ki=y("Error"),Wi=y("GiftCard"),Vi=y("Label"),Qi=y("LicenseKey"),zi=y("Log"),Hi=y("LoyaltyPoint"),Ji=y("LoyaltyReward"),Yi=y("MailPreference"),Xi=y("Manufacturer"),Zi=y("Notification"),es=y("NotificationDelivery"),ts=y("Order"),ns=y("OrderIdempotency"),Zc=y("PersonalAccessToken"),rs=y("OrderItem"),os=y("Page"),as=y("Payment"),is=y("PaymentWebhookEvent"),ss=y("PaymentMethod"),us=y("PaymentProduct"),cs=y("PaymentTransaction"),ls=y("Post"),ds=y("Categorizable"),fs=y("PrintDevice"),ps=y("Product"),ms=y("ProductUnit"),gs=y("ProductVariant"),ys=y("QueryLog"),ws=y("Receipt"),el=y("Referral"),tl=y("ReferralCode"),bs=y("Release"),hs=y("Request"),ks=y("Review"),Ts=y("ShippingMethod"),Rs=y("ShippingRate"),Ss=y("ShippingZone"),_s=y("SocialPost"),As=y("SocialAccount"),Ps=y("Subscriber"),xs=y("SubscriberEmail"),Cs=y("Subscription"),Ms=y("Tag"),vs=y("TaxRate"),Os=y("Team"),Ds=y("TeamInvitation"),Es=y("TeamMember"),Fs=y("Transaction"),js=y("WaitlistProduct"),$s=y("WaitlistRestaurant"),Is=y("Websocket"),Qn={User:Wa,Job:Va,FailedJob:Qa,Activity:Ha,AnalyticsEvent:Ja,Automation:Ya,AutomationRun:Xa,Auction:Za,AuctionItem:ai,Author:ii,Bid:si,Board:ui,BoardColumn:ci,Campaign:li,CampaignSend:Ai,CampaignVariant:ei,Card:di,CardComment:fi,Cart:pi,CartItem:mi,Categorizable:ds,Category:gi,Comment:yi,Coupon:wi,Customer:bi,CommunicationSuppression:ti,ConsentEvent:ni,DeliveryRoute:hi,DeliveryStop:ki,Deployment:Ti,DigitalDelivery:Ri,Courier:Si,CourierPing:_i,EmailList:Pi,EmailListSubscriber:xi,EmailIdempotency:qi,EmailSuppression:Gi,EmailWebhookEvent:Ui,ErrorModel:Ki,Form:Ci,FormField:Mi,FormSubmission:vi,GdprRequest:Li,GiftCard:Wi,Label:Vi,LicenseKey:Qi,Log:zi,LoyaltyPoint:Hi,LoyaltyReward:Ji,MailPreference:Yi,Manufacturer:Xi,Notification:Zi,MagicLinkToken:Oi,Menu:Di,MenuItem:Ei,NotificationDelivery:es,Order:ts,OrderIdempotency:ns,OrderItem:rs,Page:os,PageRevision:Fi,Payment:as,PaymentMethod:ss,PaymentProduct:us,PaymentTransaction:cs,PaymentWebhookEvent:is,Pledge:ji,Post:ls,PrintDevice:fs,Product:ps,ProductUnit:ms,ProductVariant:gs,QueryLog:ys,Receipt:ws,Release:bs,Request:hs,Review:ks,ShippingMethod:Ts,Redirect:$i,SenderDomain:ri,ShippingRate:Rs,ShippingZone:Ss,Site:Ii,SiteDomain:Bi,SmsOptOut:Ni,SocialAccount:As,SocialPost:_s,Subscriber:Ps,SubscriberEmail:xs,Subscription:Cs,Tag:Ms,TaxRate:vs,Team:Os,TeamInvitation:Ds,TeamMember:Es,Transaction:Fs,UsageEvent:oi,WaitlistProduct:js,WaitlistRestaurant:$s,Websocket:Is},K=globalThis;for(let[e,n]of Object.entries(Qn))if(n&&K[e]===void 0)K[e]=n;var nl=Object.keys(Qn);async function Bs(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 Ns(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=Bs;if(K.safeGet===void 0)K.safeGet=Ns;export{Ha as Activity,Ja as AnalyticsEvent,Za as Auction,ai as AuctionItem,ii as Author,Ya as Automation,Xa as AutomationRun,le as BILLABLE_INSTANCE_METHODS,si as Bid,ui as Board,ci as BoardColumn,li as Campaign,Ai as CampaignSend,ei as CampaignVariant,di as Card,Hc as CardAttachment,fi as CardComment,pi as Cart,mi as CartItem,ds as Categorizable,gi as Category,yi as Comment,ti as CommunicationSuppression,ni as ConsentEvent,wi as Coupon,Si as Courier,_i as CourierPing,bi as Customer,hi as DeliveryRoute,ki as DeliveryStop,Ti as Deployment,Ri as DigitalDelivery,qi as EmailIdempotency,Pi as EmailList,xi as EmailListSubscriber,Gi as EmailSuppression,Ui as EmailWebhookEvent,Ki as ErrorModel,Qa as FailedJob,Jc as FeedbackToken,Ci as Form,Mi as FormField,vi as FormSubmission,me as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,Ke as GdprDeclarationError,Li as GdprRequest,ge as GdprSubjectNotFoundError,Wi as GiftCard,Va as Job,Vi as Label,Qi as LicenseKey,zi as Log,Hi as LoyaltyPoint,Ji as LoyaltyReward,ft as MODEL_DEFINITION,Oi as MagicLinkToken,Yi as MailPreference,Xi as Manufacturer,lt as MassAssignmentException,Di as Menu,Ei as MenuItem,En as ModelNotFoundError,Mn as ModelValidationError,Zi as Notification,es as NotificationDelivery,ts as Order,ns as OrderIdempotency,rs as OrderItem,os as Page,Fi as PageRevision,as as Payment,ss as PaymentMethod,us as PaymentProduct,cs as PaymentTransaction,is as PaymentWebhookEvent,Zc as PersonalAccessToken,ji as Pledge,ls as Post,fs as PrintDevice,ps as Product,ms as ProductUnit,gs as ProductVariant,ys as QueryLog,ws as Receipt,$i as Redirect,el as Referral,tl as ReferralCode,bs as Release,hs as Request,ks as Review,ri as SenderDomain,Ts as ShippingMethod,Rs as ShippingRate,Ss as ShippingZone,Ii as Site,Bi as SiteDomain,Ni as SmsOptOut,As as SocialAccount,_s as SocialPost,Yc as StorageItem,Xc as StorageItemTask,Wr as SubqueryBuilder,Ps as Subscriber,xs as SubscriberEmail,Cs as Subscription,Be as SubscriptionNotOwnedError,Ms as Tag,vs as TaxRate,Os as Team,Ds as TeamInvitation,Es as TeamMember,Fs as Transaction,oi as UsageEvent,Wa as User,js as WaitlistProduct,$s as WaitlistRestaurant,Is as Websocket,pe as assertGdprPlan,Mu as batchLoad,qa as buildDatabaseSchema,ho as buildProcessingRegister,ve as collectEncryptedAttributes,Tt as createAuditMethods,$e as createCategorizableMethods,Ee as createCommentableMethods,Ie as createLikeableMethods,je as createTaggableMethods,Ir as customerOwnership,Eu as db,Me as decryptValue,$n as defineModel,Ce as encryptValue,ot as enrichPaginatorUrls,go as eraseSubject,po as exportSubjectData,jc as extendModel,Rr as filterFillable,we as gdprTableExists,qt as gdprTableName,Ks as getPrunableConfig,Tr as getWritableFields,wr as isBillable,Pl as isCursorPaginator,V as isEncrypted,xl as isPaginator,Cl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,hr as mapWriteError,Us as massPrunable,ya as mergeModelDefinition,nl as modelGlobalNames,zc as ormReady,qr as parentOwnership,en as parseCursor,dt as projectDocumentsFromTrait,Hn as prunable,wo as pruneRetainedData,Ga as renderDatabaseTypeFile,ko as renderProcessingRegister,rt as resolveCursorArgs,fe as resolveGdprPlan,uo as resolveGdprSubject,nt as resolvePageArgs,$u as savepoint,Br as selfOwnership,rr as setAuditUser,Nr as siteOwnership,Lr as teamMembershipOwnership,la as toAttrs,Ml as toCursorPaginator,vl as toPaginator,Ol as toSimplePaginator,kr as toSnakeCaseKeys,Ue as transaction,Iu as transactional,I as withoutEvents,No as withoutValidation};
|
|
@@ -25,13 +25,20 @@ import { schema } from '@stacksjs/validation/runtime'
|
|
|
25
25
|
* stranger's upload landing under `public/` would be world-readable at a
|
|
26
26
|
* path the dashboard also prints.
|
|
27
27
|
*
|
|
28
|
-
* ##
|
|
28
|
+
* ## Removing a screenshot removes the file
|
|
29
29
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
30
|
+
* A screenshot is likely to contain personal data - it is a picture of
|
|
31
|
+
* somebody's screen - so deleting one has to delete the bytes, not only this
|
|
32
|
+
* row. The card, column and board destroy actions do both, file first, through
|
|
33
|
+
* `removeCardAttachments` (stacksjs/stacks#2881). They cannot lean on the
|
|
34
|
+
* cascade declared below, which SQLite does not enforce, and a row deleted
|
|
35
|
+
* without its file leaves bytes on the disk that nothing can find again.
|
|
36
|
+
*
|
|
37
|
+
* `buddy gdpr:erase` does not reach these rows, and the `gdpr` trait here is
|
|
38
|
+
* the processing-register entry rather than an erasure path. The submitter of
|
|
39
|
+
* a feedback card is not an account: the card is filed with no user, so no
|
|
40
|
+
* data subject's erasure can match it. An external reviewer's request is met
|
|
41
|
+
* by deleting the card they filed, which removes the screenshot with it.
|
|
35
42
|
*
|
|
36
43
|
* No `useApi`. These rows are written by the feedback intake action and read
|
|
37
44
|
* by the dashboard's own board actions; a REST surface over them would
|
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.
|
|
5
|
+
"version": "0.75.93",
|
|
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.
|
|
67
|
-
"@stacksjs/cli": "0.75.
|
|
68
|
-
"@stacksjs/config": "0.75.
|
|
69
|
-
"@stacksjs/database": "0.75.
|
|
70
|
-
"@stacksjs/env": "0.75.
|
|
71
|
-
"@stacksjs/error-handling": "0.75.
|
|
72
|
-
"@stacksjs/events": "0.75.
|
|
73
|
-
"@stacksjs/logging": "0.75.
|
|
74
|
-
"@stacksjs/model-meta": "0.75.
|
|
75
|
-
"@stacksjs/pagination": "0.75.
|
|
76
|
-
"@stacksjs/path": "0.75.
|
|
77
|
-
"@stacksjs/query-builder": "0.75.
|
|
78
|
-
"@stacksjs/realtime": "0.75.
|
|
79
|
-
"@stacksjs/router": "0.75.
|
|
80
|
-
"@stacksjs/storage": "0.75.
|
|
81
|
-
"@stacksjs/strings": "0.75.
|
|
66
|
+
"@stacksjs/cache": "0.75.93",
|
|
67
|
+
"@stacksjs/cli": "0.75.93",
|
|
68
|
+
"@stacksjs/config": "0.75.93",
|
|
69
|
+
"@stacksjs/database": "0.75.93",
|
|
70
|
+
"@stacksjs/env": "0.75.93",
|
|
71
|
+
"@stacksjs/error-handling": "0.75.93",
|
|
72
|
+
"@stacksjs/events": "0.75.93",
|
|
73
|
+
"@stacksjs/logging": "0.75.93",
|
|
74
|
+
"@stacksjs/model-meta": "0.75.93",
|
|
75
|
+
"@stacksjs/pagination": "0.75.93",
|
|
76
|
+
"@stacksjs/path": "0.75.93",
|
|
77
|
+
"@stacksjs/query-builder": "0.75.93",
|
|
78
|
+
"@stacksjs/realtime": "0.75.93",
|
|
79
|
+
"@stacksjs/router": "0.75.93",
|
|
80
|
+
"@stacksjs/storage": "0.75.93",
|
|
81
|
+
"@stacksjs/strings": "0.75.93",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.75.
|
|
83
|
+
"@stacksjs/validation": "0.75.93",
|
|
84
84
|
"bun-query-builder": "^0.3.5"
|
|
85
85
|
},
|
|
86
86
|
"peerDependencies": {
|
|
87
|
-
"@stacksjs/auth": "0.75.
|
|
88
|
-
"@stacksjs/payments": "0.75.
|
|
89
|
-
"@stacksjs/queue": "0.75.
|
|
90
|
-
"@stacksjs/search-engine": "0.75.
|
|
87
|
+
"@stacksjs/auth": "0.75.93",
|
|
88
|
+
"@stacksjs/payments": "0.75.93",
|
|
89
|
+
"@stacksjs/queue": "0.75.93",
|
|
90
|
+
"@stacksjs/search-engine": "0.75.93",
|
|
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.
|
|
111
|
+
"@stacksjs/types": "0.75.93",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "23.0.0"
|
|
114
114
|
}
|