@stacksjs/orm 0.75.86 → 0.75.88
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 +10 -10
- package/dist/model-registry.d.ts +67 -0
- package/dist/model-registry.js +1 -1
- package/dist/routes.js +1 -1
- package/package.json +23 -23
package/dist/index.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var pt=(e,n,t)=>()=>{if(e)try{n=e(e=0)}catch(r){t=[r]}if(t)throw t[0];return n};var Qn=import.meta.require;import{readdirSync as Jr}from"fs";import{basename as Yr,extname as Ut,join as Xr}from"path";function Zr(e){let n=[],t=(r)=>{let o;try{o=Jr(r,{withFileTypes:!0})}catch{return}for(let a of o){let i=Xr(r,a.name);if(a.isDirectory()){t(i);continue}if(![".ts",".js"].includes(Ut(a.name)))continue;if(a.name.startsWith(".")||a.name.startsWith("index"))continue;n.push(i)}};return t(e),n.sort()}async function Gt(e,n,t){for(let r of Zr(e))try{let o=Ut(r),a=await import(`${r}?t=${Date.now()}`),i=a.default??a,s=i.name??Yr(r,o);n[s]={...i,name:s}}catch(o){t?.(r,o)}}async function Kt(e){let n={};return await Gt(e.defaultsRoot,n,e.onImportError),await Gt(e.userRoot,n,e.onImportError),n}var Wt=()=>{};import{path as Vt}from"@stacksjs/path";async function We(){return Kt({defaultsRoot:Vt.frameworkPath("defaults/app/Models"),userRoot:Vt.userModelsPath()})}var Ve=pt(()=>{Wt()});import"@stacksjs/validation/runtime";import{log as xe}from"@stacksjs/cli";import{db as mt,mutationCount as gt}from"@stacksjs/database/runtime";async function zn(e,n={}){let{olderThanDays:t=30,column:r="created_at",query:o}=n;try{if(o){let u=mt.deleteFrom(e);u=o(u);let c=gt(await u.execute());return xe.info(`Pruned ${c} records from ${e}`),c}let a=new Date;a.setDate(a.getDate()-t);let i=await mt.deleteFrom(e).where(r,"<",a.toISOString()).execute(),s=gt(i);return xe.info(`Pruned ${s} records from ${e} older than ${t} days`),s}catch(a){throw xe.error(`Failed to prune ${e}:`,a),a}}async function Gs(e,n={}){return zn(e,n)}function Us(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as Hn,createDecipheriv as Jn,createHash as Yn,randomBytes as Xn}from"crypto";import{log as ie}from"@stacksjs/logging";var yt="enc:",wt="aes-256-gcm",Zn=12,ae=null;async function bt(){if(ae)return ae;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return ae=Yn("sha256").update(e).digest(),ae}function V(e){return typeof e==="string"&&e.startsWith(yt)}async function Ce(e){if(e==null)return e;if(V(e))return e;if(typeof e!=="string")return e;let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let t=Xn(Zn),r=Hn(wt,n,t),o=Buffer.concat([r.update(e,"utf8"),r.final()]),a=r.getAuthTag();return`${yt}${t.toString("base64")}:${a.toString("base64")}:${o.toString("base64")}`}async function ve(e){if(e==null)return e;if(typeof e!=="string")return e;if(!V(e))return e;try{let n=await bt();if(!n)return ie.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,t,r,o]=e.split(":");if(!t||!r||!o)return ie.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let a=Buffer.from(t,"base64"),i=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Jn(wt,n,a);return u.setAuthTag(i),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(n){return ie.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:n}),null}}function Me(e){let n=e.attributes;if(!n||typeof n!=="object")return[];let t=[];for(let[r,o]of Object.entries(n))if(o&&typeof o==="object"&&o.encrypted===!0)t.push(r);return t}import{sqlDateTime as er}from"@stacksjs/database/runtime";import{log as L}from"@stacksjs/logging";var tr=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],kt="model_audits",Oe=null;function nr(e){Oe=e}async function se(){if(Oe!=null)return Oe;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();if(!t)return null;return(t.user??t._user)?.id??null}catch{return null}}function Q(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(tr.some((o)=>o.test(t)))continue;n[t]=r}return n}function N(e){if(!e||typeof e!=="object")return null;let n=e;if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function rr(e,n){if(!e||!n)return{old:e,next:n};let t={},r={},o=new Set([...Object.keys(e),...Object.keys(n)]);for(let a of o)if(e[a]!==n[a])t[a]=e[a],r[a]=n[a];return{old:t,next:r}}async function ue(e,n=!1){try{let{db:t}=await import("@stacksjs/database/runtime");await t.insertInto(kt).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:er()}).executeTakeFirst()}catch(t){if(L.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:t}),n)throw t}}function Tt(e){return{async audits(n){try{let{db:t}=await import("@stacksjs/database/runtime");return(await t.selectFrom(kt).selectAll().where("auditable_type","=",e).where("auditable_id","=",n).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?ht(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?ht(o.new_values):o.new_values}))}catch(t){return L.warn(`[orm] audits() lookup failed for ${e}#${String(n)}`,{error:t}),[]}}}}function ht(e){try{return JSON.parse(e)}catch{return e}}function Rt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function St(e,n,t="id",r={}){let o=r.transactional===!0,a=e;if(typeof e.audits!=="function")e.audits=Tt(n).audits;let i=async(f)=>{if(!o)return await f();let{db:d}=await import("@stacksjs/database/runtime");return await d.transaction(async()=>f())},s=e.create;if(typeof s==="function")e.create=async function(...f){return await i(async()=>{let d=await s.apply(this,f);try{let p=N(d),m=p?.[t];if(m!=null){let g=await se();await ue({auditable_type:n,auditable_id:m,event:"created",old_values:null,new_values:Q(p),user_id:g},o)}}catch(p){if(L.warn(`[orm] audit(create) failed for ${n}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await i(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await se():null;for(let m of Array.isArray(d)?d:[]){let g=N(m),w=g?.[t];if(w==null)continue;await ue({auditable_type:n,auditable_id:w,event:"created",old_values:null,new_values:Q(g),user_id:p},o)}}catch(p){if(L.warn(`[orm] audit(createMany) failed for ${n}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await i(async()=>{let p=a.find,m=typeof p==="function"?N(await p.call(a,f)):null,g=await c.call(this,f,d);try{let w=N(g)??(typeof p==="function"?N(await p.call(a,f)):null),{old:h,next:b}=rr(m,w);if(b&&Object.keys(b).length>0){let k=await se();await ue({auditable_type:n,auditable_id:f,event:"updated",old_values:Q(h),new_values:Q(b),user_id:k},o)}}catch(w){if(L.warn(`[orm] audit(update) failed for ${n}#${String(f)}`,{error:w}),o)throw w}return g})};let l=(f)=>{let d=e[f];if(typeof d!=="function")return;e[f]=async function(p){return await i(async()=>{let m=a.find,g=typeof m==="function"?N(await m.call(a,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await se();await ue({auditable_type:n,auditable_id:p,event:"deleted",old_values:Q(g),new_values:null,user_id:h},o)}}catch(h){if(L.warn(`[orm] audit(${f}) failed for ${n}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as or,sql as ar,sqlDateTime as De}from"@stacksjs/database/runtime";function v(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${n} requires a positive numeric id (received ${String(e)})`)}var z="commentable_upvotes",H="commentables";function ir(e){let n=e;return n.code==="SQLITE_CONSTRAINT_UNIQUE"||n.code==="SQLITE_CONSTRAINT"||n.code==="23505"||n.errno===1062||/unique|duplicate/i.test(n.message??"")}var _t=["pending","approved"];function Ee(e){let n=or;return{async comments(t){return v(t,"comments"),await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(t){let r=await n.selectFrom("commentables").select(ar`count(*) as count`).where("commentables_id","=",t).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(t,r,o={}){if(v(t,"addComment"),!r||typeof r.body!=="string"||r.body.trim().length===0)throw Error("[orm/commentable] addComment requires a non-empty comment.body");if(r.title!=null&&typeof r.title!=="string")throw Error("[orm/commentable] addComment requires comment.title to be a string when given");let a=o.status??"pending";if(!_t.includes(a))throw Error(`[orm/commentable] addComment status must be one of ${_t.join(", ")} (received ${String(a)})`);let i={title:r.title?.trim()??"",body:r.body,commentables_id:t,commentables_type:e,status:a,approved_at:a==="approved"?Date.now():null,created_at:De(),updated_at:De()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)i[c]=r[c];let s=await n.insertInto("commentables").values(i).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await n.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(t){return await n.selectFrom("commentables").where("commentables_id","=",t).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(t,r){v(t,"upvoteComment"),v(r,"upvoteComment");let o=()=>n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst(),a=await o();if(a)return a;try{await n.insertInto(z).values({upvoteable_id:t,upvoteable_type:H,user_id:r,created_at:De()}).execute()}catch(i){if(!ir(i))throw i}return await o()},async removeCommentUpvote(t,r){v(t,"removeCommentUpvote"),v(r,"removeCommentUpvote"),await n.deleteFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).execute()},async commentUpvoteCount(t){v(t,"commentUpvoteCount");let r=await n.selectFrom(z).select("count(*) as count").where("upvoteable_id","=",t).where("upvoteable_type","=",H).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(t,r){return v(t,"hasUpvotedComment"),v(r,"hasUpvotedComment"),!!await n.selectFrom(z).where("upvoteable_id","=",t).where("upvoteable_type","=",H).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as sr,sql as ur,sqlDateTime as At}from"@stacksjs/database/runtime";function je(e,n){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${n} requires a positive numeric id (received ${String(e)})`)}function Fe(e){let n=sr;return{async tags(t){return je(t,"tags"),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).selectAll().execute()},async tagCount(t){je(t,"tagCount");let r=await n.selectFrom("taggables").select(ur`count(*) as count`).where("taggable_id","=",t).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(t,r){if(je(t,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await n.insertInto("taggables").values({...r,taggable_id:t,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:At(),updated_at:At()}).execute(),await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(t){return await n.selectFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(t,r){await n.deleteFrom("taggables").where("taggable_id","=",t).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as cr,sqlDateTime as ce}from"@stacksjs/database/runtime";function $e(e){let n=cr;async function t(r){return(await n.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((a)=>a.category_id)}return{async categories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await t(r)).length},async addCategory(r,o){let a=()=>n.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),i=await a();if(!i)await n.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:ce(),updated_at:ce()}).execute(),i=await a();return await n.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:i?.id,created_at:ce(),updated_at:ce()}).execute(),i},async activeCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await t(r);if(o.length===0)return[];return await n.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await n.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as lr,sqlDateTime as dr}from"@stacksjs/database/runtime";function Ie(e,n){let t=lr,r=n?.table||`${e}_likes`,o=n?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(a){return await t.selectFrom(r).where(o,"=",a).selectAll().execute()},async likeCount(a){let i=await t.selectFrom(r).select("count(*) as count").where(o,"=",a).executeTakeFirst();return Number(i?.count)||0},async like(a,i){if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(a)})`);if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(i)})`);let s=dr();try{return await t.insertInto(r).values({[o]:a,user_id:i,created_at:s,updated_at:s}).returningAll().executeTakeFirst()}catch(u){let c=u;if(!(c.code==="SQLITE_CONSTRAINT_UNIQUE"||c.code==="SQLITE_CONSTRAINT"||c.code==="23505"||c.errno===1062||/unique|duplicate/i.test(c.message??"")))throw u;let f=await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(a,i){await t.deleteFrom(r).where(o,"=",a).where("user_id","=",i).execute()},async isLiked(a,i){return!!await t.selectFrom(r).where(o,"=",a).where("user_id","=",i).selectAll().executeTakeFirst()},async likedBy(a){return(await t.selectFrom(r).select([o]).where("user_id","=",a).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as fr}from"module";import{db as pr}from"@stacksjs/database/runtime";var mr=fr(import.meta.url);class Be extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}async function M(){let{paymentDriver:e}=await import("@stacksjs/payments");return e()}async function S(e){let{assertStripeDriver:n}=await import("@stacksjs/payments");n(e)}function Pt(e){let n=pr;return{async paymentCustomer(t){return(await M()).customer(t)},async charge(t,r,o,a={}){return(await M()).charge(t,r,o,a)},async createPayment(t,r,o={}){return(await M()).createPayment(t,r,o)},async checkout(t,r){return(await M()).checkout(t,r)},async paymentMethods(t){return(await M()).paymentMethods(t)},async removePaymentMethod(t,r){return(await M()).removePaymentMethod(t,r)},async newSubscription(t,r,o){return(await M()).subscribe(t,o,{type:r})},async cancelSubscription(t,r,o={}){if(!await n.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",t.id).select(["id"]).executeTakeFirst())throw new Be(r);return(await M()).cancelSubscription(r,o)},async activeSubscription(t){let r=await n.selectFrom("subscriptions").where("user_id","=",t.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(!r)return;let o=(await(await M()).subscriptions(t)).find((a)=>a.id===r.provider_id);return o?{subscription:r,providerSubscription:o}:void 0},async syncStripeCustomerDetails(t,r){await S("syncStripeCustomerDetails");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(t,r)},async createStripeUser(t,r){await S("createStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(t,r)},async updateStripeUser(t,r){await S("updateStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(t,r)},async deleteStripeUser(t){await S("deleteStripeUser");let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(t)},async createOrGetStripeUser(t,r){await S("createOrGetStripeUser");let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(t,r)},async retrieveStripeUser(t){await S("retrieveStripeUser");let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(t)},async defaultPaymentMethod(t){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(t)},async setDefaultPaymentMethod(t,r){await S("setDefaultPaymentMethod");let{managePaymentMethod:o}=await import("@stacksjs/payments");if(typeof r==="string")await o.setUserDefaultPayment(t,r);else await o.setDefaultPaymentMethod(t,r)},async addPaymentMethod(t,r){await S("addPaymentMethod");let{managePaymentMethod:o,toStoredPaymentMethod:a}=await import("@stacksjs/payments");return a(await o.addPaymentMethod(t,r))},async updateSubscription(t,r,o){await S("updateSubscription");let{manageSubscription:a,summarizeSubscription:i}=await import("@stacksjs/payments");return i(await a.update(t,r,o,{}))},async createSetupIntent(t,r={}){await S("createSetupIntent");let{manageSetupIntent:o}=await import("@stacksjs/payments"),a=await o.create(t,r);if(!a.client_secret)throw Error("Stripe returned a SetupIntent without a client secret.");return{id:a.id,clientConfirmation:{provider:"stripe",clientSecret:a.client_secret}}},async storeTransaction(t,r,o){let{manageTransaction:a}=await import("@stacksjs/payments");return await a.store(t,r,o)},async subscriptionHistory(t){await S("subscriptionHistory");let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(t)},async transactionHistory(t){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(t)},async connectAccount(t,r={}){await S("Stripe Connect (connectAccount)");let o=r.accountColumn||"stripe_account_id",a=(t._attributes??t)[o];if(!a)return null;let i=await J();try{return await i.accounts.retrieve(a)}catch{return null}},async createConnectAccount(t,r={}){await S("Stripe Connect (createConnectAccount)");let o=r.accountColumn||"stripe_account_id",a=t._attributes??t,i=a[o],s=await J();if(!i){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??a.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,a.id)});return i=l.id,await n.updateTable(c).set({[o]:i}).where("id","=",Number(a.id)).execute(),l}return await s.accounts.retrieve(i)},async connectOnboardLink(t,r){await S("Stripe Connect (connectOnboardLink)");let o=r.accountColumn||"stripe_account_id",i=(t._attributes??t)[o];if(!i)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await J()).accountLinks.create({account:i,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:i}},async syncConnectStatus(t,r={}){await S("Stripe Connect (syncConnectStatus)");let o=r.accountColumn||"stripe_account_id",a=r.chargesColumn||"charges_enabled",i=r.payoutsColumn||"payouts_enabled",s=t._attributes??t,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await J()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await n.updateTable(p).set({[a]:f,[i]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(t,r){await S("Stripe Connect (chargeWithSplit)");let o=await J(),a=r.accountColumn||"stripe_account_id",i=t._attributes??t,s=r.connectAccountId||i[a],u={amount:r.amountCents,currency:r.currency||"usd",automatic_payment_methods:{enabled:!0},metadata:r.metadata};if(s){if(u.transfer_data={destination:s},r.platformFeeCents)u.application_fee_amount=r.platformFeeCents}let{freshIdempotencyKey:c}=await import("@stacksjs/payments");return await o.paymentIntents.create(u,{idempotencyKey:c("payment_intent.create",i.id,r.amountCents)})}}}var gr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,removePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,paymentCustomer:!0,charge:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},le=Object.freeze(Object.keys(gr));function yr(e){return le.every((n)=>typeof Reflect.get(e,n)==="function")}function J(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let n;try{n=mr("stripe")}catch{throw Error("Stripe Connect is being used but the `stripe` package is not installed. It is an opt-in dependency - run `bun add stripe` to enable Stripe Connect.")}return new n(e,{apiVersion:n.API_VERSION})}import{isUniqueViolation as jr}from"@stacksjs/error-handling";import{isUniqueViolation as wr}from"@stacksjs/error-handling";function br(e,n,t){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(wr(e))return{status:409,body:{error:`${n} already exists`}};return{status:500,body:{error:`Failed to ${t} ${n}`,detail:String(e)}}}function x(e){let n=!1;for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o>127)return e.replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/([A-Z])([A-Z][a-z])/g,"$1_$2").toLowerCase();if(o>=65&&o<=90)n=!0}if(!n)return e;let t="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){t+=e[r];continue}let a=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,s=a>=97&&a<=122||a>=48&&a<=57,u=a>=65&&a<=90&&i>=97&&i<=122;if(r>0&&(s||u))t+="_";t+=String.fromCharCode(o+32)}return t}function hr(e){let n={};for(let[t,r]of Object.entries(e))n[x(t)]=r;return n}function cu(e,n){let t=String(n||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${t?`${t}/`:""}${r}`}function Dt(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"teamId")||Object.prototype.hasOwnProperty.call(n,"team_id"))return"team_id";return e.belongsTo?.some((t)=>t==="Team")?"team_id":null}function Et(e){if(!e)return null;let n=e.attributes??{};if(Object.prototype.hasOwnProperty.call(n,"userId")||Object.prototype.hasOwnProperty.call(n,"user_id"))return"user_id";return e.belongsTo?.some((t)=>t==="User")?"user_id":null}function lu(e){return e?.ownership===!1}function du(e,n,t){let r=Object.keys(e).find((a)=>x(a)===x(n));if(Array.isArray(t)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!t.some((a)=>String(a)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[n]:e[r]}}}if(t===null||t===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let a of Object.keys(o))if(x(a)===x(n))delete o[a];return o[n]=t,{data:o}}function kr(e){if(!e)return[];let n=Object.entries(e.attributes??{}).filter(([,t])=>t?.fillable===!0).map(([t])=>t);for(let t of e.belongsTo??[]){if(typeof t!=="string"||!t.trim())continue;let r=x(t.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((a)=>`${a[0]?.toUpperCase()}${a.slice(1)}`).join("")}Id`;n.push(o)}return[...new Set(n)]}function Tr(e,n){if(!e||n.length===0)return{};let t={},r;for(let o of n){if(o in e){t[o]=e[o];continue}r??=Sr(n);let a=r.get(o);if(a!==o&&a in e)t[o]=e[a]}return t}function Rr(e,n){if(e?.name!=="date"||n instanceof Date||typeof n!=="string")return n;let t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(n);if(!t)return n;let r=Number(t[1]),o=Number(t[2]),a=Number(t[3]),i=new Date(Date.UTC(r,o-1,a));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==a)return n;return i}var xt=new WeakMap,Ct=new WeakMap;function Le(e){let n=xt.get(e);if(n&&n.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(n[o]?.field!==e[o]){r=!1;break}if(r)return n}let t=e.map((r)=>({field:r,snake:x(r)}));return xt.set(e,t),t}function Sr(e){let n=Le(e),t=Ct.get(n);if(t)return t;let r=new Map(n.map(({field:o,snake:a})=>[o,a]));return Ct.set(n,r),r}function fu(e,n){if(!n.length)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}function pu(e,n){if(!e||n.length===0)return e;let t={...e};for(let{field:r,snake:o}of Le(n))if(delete t[r],o!==r)delete t[o];return t}var _r=["id","uuid","created_at","updated_at","deleted_at"];function mu(e,n){let t=new Map;for(let r of[...Object.keys(e??{}),..._r]){let o=x(r);if(!/^\w+$/.test(o))continue;t.set(r,o),t.set(o,o)}for(let r of n)t.delete(r),t.delete(x(r));return t}function gu(e,n,t){if(!n)return e;let r=e;for(let o of String(n).split(",")){let a=o.trim();if(!a)continue;let i=a.startsWith("-"),s=i?a.slice(1):a;if(!/^\w+$/.test(s))continue;let u=t.get(s);if(!u)continue;r=r.orderBy(u,i?"desc":"asc")}return r}var Ar={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?xr(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Cr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},vt=new WeakMap;function Pr(e,n){let t=vt.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=[];for(let o of n){let a=e[o],i=typeof a==="string"?Ar[a]:a;r.push({attr:o,snake:x(o),definition:a,caster:i})}return vt.set(e,r),r}function xr(e){try{return JSON.parse(e)}catch{return e}}function Cr(e){try{return JSON.parse(e)}catch{return[]}}function yu(e,n,t){if(!e||typeof e!=="object"||!n)return e;let r=Object.keys(n);if(r.length===0)return e;let o=Pr(n,r);if(o.length===0)return e;let a={...e};for(let{attr:i,caster:s,snake:u}of o){if(!s)continue;let c=s[t];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(a,i))a[i]=c.call(s,a[i]);if(u!==i&&Object.prototype.hasOwnProperty.call(a,u))a[u]=c.call(s,a[u])}return a}var Mt=new WeakMap;function vr(e){let n=Mt.get(e);if(n)return n;let t=[];for(let[r,o]of Object.entries(e)){let a=o?.validation?.rule;if(!a||typeof a.validate!=="function")continue;t.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:a})}return Mt.set(e,t),t}function jt(e){let n=e?.attributes;if(!n||typeof n!=="object")return!1;for(let t of Object.values(n)){let r=t?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function Ft(e,n,t){let r=n?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=vr(r);if(o.length===0)return{valid:!0};let a={},i=!1;for(let s of o){let{definition:u,field:c,hasDefault:l,rule:f}=s,d=Object.prototype.hasOwnProperty.call(e,c);if(!d&&t==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=Rr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)i=!0,a[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return i?{valid:!1,errors:a}:{valid:!0}}function Mr(e,n){return`${e}\x00${Or(n)}`}function wu(e){let n=new Map;for(let t of e){let r=Mr(String(t.method??""),String(t.path??""));if(!n.has(r))n.set(r,t)}return n}function Or(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ne(e){if(Array.isArray(e))return e.filter((n)=>typeof n==="string"&&n.length>0);return typeof e==="string"&&e?[e]:[]}function bu(e){let n=typeof e==="object"&&e!==null&&"middleware"in e,t=e?.middleware;if(!n)return{read:["auth"],write:["auth"],declared:!1};if(t&&typeof t==="object"&&!Array.isArray(t)){let o=t;return{read:"read"in o?Ne(o.read):["auth"],write:"write"in o?Ne(o.write):["auth"],declared:!0}}let r=Ne(t);return{read:r,write:r,declared:!0}}var Ot=15,Dr=100;function hu(e){let n=Number.parseInt(e.get("page")||String(1),10),t=Number.isFinite(n)?Math.max(1,n):1,r=Number.parseInt(e.get("per_page")||String(Ot),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Ot,Dr);return{page:t,perPage:o,offset:(t-1)*o}}function de(e,n){let t=new URL(e.toString());return t.searchParams.set("page",String(n)),`${t.pathname}${t.search}`}function Er(e,n,t,r,o,a){let i=(n-1)*t,s=r===0,u={page:n,per_page:t,from:s?null:i+1,to:s?null:i+r,has_more_pages:o,prev_page_url:n>1?de(e,n-1):null,next_page_url:o?de(e,n+1):null};if(a!==void 0&&!Number.isNaN(a)){let c=Math.max(1,Math.ceil(a/t));u.total=a,u.last_page=c,u.first_page_url=de(e,1),u.last_page_url=de(e,c)}return u}function ku(e,n,t,r,o,a){let{page:i,...s}=Er(e,n,t,r,o,a);return{current_page:i,...s}}function Tu(e,n){return(n??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Ru(e,n){if(e.length===0)return null;let t=[...e].sort().join(", ");if(n==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${t}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${t}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}function Fr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let n=Dt(e);if(n)return{field:n,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:a}=await import("@stacksjs/auth");return a(qe(o))}};let t=Et(e);if(t)return{field:t,resolve:async(r)=>r?.id??null};return null}function qe(e){let n=e?.headers?.get?.("authorization"),t=n&&/^Bearer\s+/i.test(n)?n.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>t,cookies:{get:(o)=>{for(let a of r.split(";")){let i=a.indexOf("=");if(i===-1)continue;if(a.slice(0,i).trim()===o)return decodeURIComponent(a.slice(i+1).trim())}return null}}}}function $r(e="customer_id"){return{field:e,resolve:async(n)=>{let t=n?.id;if(t==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",t).first())?.id??null}catch{return null}}}}function Ir(e="id"){return{field:e,resolve:async(n)=>n?.id??null}}function Br(e="site_id"){return{field:e,resolve:async(n,t)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),a=await r(qe(t));if(a==null)return[];return(await o.where("team_id",a).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function Nr(e="id"){return{field:e,resolve:async(n,t)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(qe(t))}catch{return null}}}}function Lr(e,n){return{field:n,resolve:async(t,r)=>{try{let o=await import("@stacksjs/orm"),a=o.models?.[e]??o[e]?.definition??null,i=Fr(a);if(!i?.field||typeof i.resolve!=="function")return[];let s=await i.resolve(t,r);if(s==null||Array.isArray(s)&&s.length===0)return[];let u=o[e];if(!u)return[];return((Array.isArray(s)?await u.whereIn(i.field,s).get():await u.where(i.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as qr}from"@stacksjs/router";var $t=new WeakMap;function It(e){let n=new Map;for(let t of e){let r=t?.id;if(r!==void 0)n.set(r,t)}return n}async function Gr(e,n){if(typeof e.find==="function")return e.find(n);let t=await e.findMany?.([n]);return It(t??[]).get(n)}async function Ur(e,n,t){n.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(t.keys):await Promise.all(t.keys.map((a)=>e.find?.(a))),o=It(r??[]);for(let a of t.resolvers)a.resolve(o.get(a.key))}catch(r){for(let o of t.resolvers)o.reject(r)}}function Cu(e,n){let t=qr();if(!t)return Gr(e,n);let r=$t.get(t);if(!r)r=new WeakMap,$t.set(t,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let a=o.cache.get(n);if(a)return a.then();let i=o.pending;if(!i){i={keys:[],resolvers:[]},o.pending=i;let c=i,l=o;queueMicrotask(()=>{Ur(e,l,c)})}let s=new Promise((c,l)=>{i.keys.push(n),i.resolvers.push({key:n,resolve:c,reject:l})});o.cache.set(n,s);let u=o.cache;return s.catch(()=>u.delete(n)),s.then()}import{db as Du}from"@stacksjs/database/runtime";class Kr{conditions=[];where(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("and","where",e,o,a)}orWhere(e,...n){let[t,r]=n,o=r===void 0?"=":t,a=r===void 0?t:r;this.addCondition("or","where",e,o,a)}whereIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n})}whereNotIn(e,n){this.conditions.push({type:"and",method:"whereIn",column:e,values:n,operator:"not in"})}whereNull(e){this.conditions.push({type:"and",method:"whereNull",column:e})}whereNotNull(e){this.conditions.push({type:"and",method:"whereNotNull",column:e})}whereBetween(e,n){this.conditions.push({type:"and",method:"whereBetween",column:e,range:n})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,n,t,r,o){this.conditions.push({type:e,method:n,column:t,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Ge}from"@stacksjs/database/runtime";async function Ue(e,n){return await Ge.transaction(e,n)}async function Fu(e){return await Ge.savepoint(e)}function $u(e,n){return Ge.transactional(e,n)}import{randomUUID as eo}from"crypto";import{db as C,getDatabaseDialect as to,parseSqlDateTime as no,sqlDateTime as Ht}from"@stacksjs/database/runtime";import{plural as Wr,snakeCase as Y}from"@stacksjs/strings";var Bt=new Set(["anonymize","delete","keep"]),Nt=new Set(["anonymize","delete"]),Lt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),D="User";class Ke extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
|
|
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:
|
|
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(to()),t=n==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":n==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":n==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!t)return null;let r=await e.unsafe(t).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var ro=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function we(e,n=C){let t=await Jt(n);if(t)return t.has(e.toLowerCase());try{return await n.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(ro.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function oo(e){let n=e.models.find((t)=>t.model===D);return{table:n?.table??"users",primaryKey:n?.primaryKey??"id"}}function ao(e){if(typeof e==="number")return{kind:"id",value:e};let n=String(e).trim();if(/^\d+$/.test(n))return{kind:"id",value:Number(n)};if(n.includes("@"))return{kind:"email",value:n};return{kind:"uuid",value:n}}async function io(e,n={},t=C){let r=await ye(n.models);return He(r,e,t)}async function He(e,n,t){let{table:r,primaryKey:o}=oo(e),a=ao(n),i;if(a.kind==="id")i=(await t.selectFrom(r).selectAll().where(o,"=",a.value).limit(1).execute())[0];else if(a.kind==="email"){for(let s of new Set([a.value,a.value.toLowerCase()]))if(i=(await t.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],i)break}else i=(await t.selectFrom(r).selectAll().where("uuid","=",a.value).limit(1).execute())[0];if(!i)return null;return{id:i[o],email:typeof i.email==="string"?i.email:null}}function Je(e,n=Qe){let t=[];for(let r=0;r<e.length;r+=n)t.push(e.slice(r,r+n));return t}function so(e,n){let t=new Map;for(let r of e)t.set(String(r[n]),r);return[...t.values()].sort((r,o)=>String(r[n]).localeCompare(String(o[n]),void 0,{numeric:!0}))}async function Ye(e,n,t,r,o){let a=o.get(t.model);if(a)return a;let i=t.subject,s=[];if(i?.kind==="column")for(let u of i.columns){let c=e.selectFrom(t.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(i.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(i?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(t.table).selectAll().where(i.column,"=",u).execute())}else if(i?.kind==="via"){let u=n.get(i.model),l=(await Ye(e,n,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of Je(l))s.push(...await e.selectFrom(t.table).selectAll().where(i.foreignKey,"in",f).execute())}return s=so(s,t.primaryKey),o.set(t.model,s),s}function Qt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function uo(e,n){let t={};for(let r of e.exportColumns)if(r in n)t[r]=Qt(n[r]);for(let r of e.personal)if(r.export&&r.column in n)t[r.column]=Qt(n[r.column]);return t}function ze(e,n){let t={};for(let r of e.personal)t[r.column]=r.perRow?`erased-${String(n[e.primaryKey])}`:r.anonymizeTo;return t}function co(e,n){if(e===n)return!0;if(e===null||e===void 0||n===null||n===void 0)return(e===null||e===void 0)&&(n===null||n===void 0);if(typeof n==="boolean")return Number(e)===Number(n);return String(e)===String(n)}function Yt(e,n){let t=ze(e,n);return Object.entries(t).some(([r,o])=>!co(n[r],o))}async function Xt(e,n,t){if(!t.length)return;if(n.personal.some((o)=>o.perRow)){for(let o of t)await e.updateTable(n.table).set(ze(n,o)).where(n.primaryKey,"=",o[n.primaryKey]).execute();return}let r=ze(n,t[0]);for(let o of Je(t.map((a)=>a[n.primaryKey])))await e.updateTable(n.table).set(r).where(n.primaryKey,"in",o).execute()}async function Zt(e,n,t){for(let r of Je(t.map((o)=>o[n.primaryKey])))await e.deleteFrom(n.table).where(n.primaryKey,"in",r).execute()}async function Xe(e,n,t,r,o){let a=Ht(new Date);await e.insertInto(me).values({uuid:eo(),type:n,subject_id:t!==null&&Number.isSafeInteger(Number(t))?Number(t):null,actor:r,status:"completed",summary:JSON.stringify(t!==null&&!Number.isSafeInteger(Number(t))?{subject:String(t),...o}:o),occurred_at:a,created_at:a}).execute()}async function Ze(){if(!await we(me))throw Error(`The '${me}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function et(e){let n=[],t=[],r=await Jt(),o=new Map;for(let a of e){if(!o.has(a.table))o.set(a.table,r?r.has(a.table.toLowerCase()):await we(a.table));if(o.get(a.table))n.push(a);else t.push(a.table)}return{present:n,skipped:[...new Set(t)].sort()}}async function lo(e,n={}){let t=await ye(n.models),r=await He(t,e,C);if(!r)throw new ge(e);await Ze();let o=t.models.filter((l)=>l.subject),{present:a}=await et(o),i=new Map(a.map((l)=>[l.model,l]));for(let l of a)if(l.subject?.kind==="via"&&!i.has(l.subject.model))i.delete(l.model);let s=new Map,u={},c={};for(let l of[...i.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await Ye(C,i,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>uo(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Xe(C,"access",r.id,n.actor??"system",{models:Object.fromEntries(Object.entries(u).map(([l,f])=>[l,f.length]))}),{subject:{id:r.id},generatedAt:new Date().toISOString(),data:u,processing:c}}function fo(e){return[...e].sort((n,t)=>{let r=n.model===D?1:0,o=t.model===D?1:0;if(r!==o)return r-o;if(n.depth!==t.depth)return t.depth-n.depth;return n.model.localeCompare(t.model)})}async function po(e,n={}){let t=n.dryRun===!0,r=await ye(n.models),o=await He(r,e,C);if(!o)throw new ge(e);if(!t)await Ze();let a=r.models.filter((d)=>d.subject),{present:i,skipped:s}=await et(a),u=new Map(i.map((d)=>[d.model,d]));for(let d of i)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await Ye(d,u,g,o,p);let m=[];for(let g of fo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!t)await Zt(d,g,w);m.push({model:g.model,table:g.table,action:"delete",matched:w.length,changed:w.length,fields:[]})}else if(g.erasure==="anonymize"){let h=w.filter((b)=>Yt(g,b));if(!t)await Xt(d,g,h);m.push({model:g.model,table:g.table,action:"anonymize",matched:w.length,changed:h.length,fields:g.personal.map((b)=>b.column)})}else m.push({model:g.model,table:g.table,action:"keep",matched:w.length,changed:0,fields:[]})}if(!t)await Xe(d,"erasure",o.id,n.actor??"system",{changes:m.map(({model:g,action:w,matched:h,changed:b})=>({model:g,action:w,matched:h,changed:b})),skipped:s});return m},l=t?await c(C):await Ue(c),f=!1;if(!t&&n.revokeCredentials!==!1)f=await mo(o.id);return{subject:{id:o.id},dryRun:t,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function mo(e){let n;try{n=await import("@stacksjs/auth")}catch{return!1}let t=Number(e);if(!Number.isSafeInteger(t))return!1;if(n.revokeAllTokens&&await we("oauth_access_tokens"))await n.revokeAllTokens(t);if(n.sessionDestroyAll)await n.sessionDestroyAll(t);return!0}var zt=86400000;async function go(e={}){let n=e.dryRun===!0,t=e.now??new Date,o=(await ye(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:n,cutoffs:{},changes:[],skipped:[]};if(!n)await Ze();let{present:a,skipped:i}=await et(o),s=[],u={};for(let c of a){let l=c.retention,f=new Date(t.getTime()-l.days*zt),d=Ht(new Date(f.getTime()+zt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=C.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(Qe).execute();if(!b.length)break;for(let k of b){let R=no(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<Qe)break}let g=l.action==="delete"?p:p.filter((w)=>Yt(c,w));if(!n&&g.length)await Ue(async(w)=>{if(l.action==="delete")await Zt(w,c,g);else await Xt(w,c,g)});s.push({model:c.model,table:c.table,action:l.action,matched:p.length,changed:g.length,fields:l.action==="anonymize"?c.personal.map((w)=>w.column):[]})}if(!n&&s.some((c)=>c.changed>0))await Xe(C,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:n,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:i}}Ve();function yo(e){let n=e.subject;if(!n)return"none (not reachable by access or erasure)";if(n.kind==="via")return`via ${n.model} (\`${n.foreignKey}\`)`;if(n.kind==="email")return`email address in \`${n.column}\``;let t=n.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(n.where).map(([o,a])=>`${o} = ${String(a)}`).join(", ");return r?`${t} where ${r}`:t}function wo(e){return{entries:e.models.map((t)=>({model:t.model,table:t.table,subject:yo(t),personal:t.personal.map((r)=>r.column),notExported:t.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:t.subject?t.erasure:null,retention:t.retention?`${t.retention.action} after ${t.retention.days} days (\`${t.retention.column}\`)`:null,basis:t.basis,purpose:t.purpose})).sort((t,r)=>t.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function X(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
|
|
5
|
-
`," ")}function
|
|
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 ho(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 Oo,registerModel as Do}from"@stacksjs/query-builder";import{log as _}from"@stacksjs/logging/runtime";import{snakeCase as te}from"@stacksjs/strings";import{AsyncLocalStorage as Pn}from"async_hooks";import{toCursorPaginator as Eo,toPaginator as jo,toSimplePaginator as Fo}from"@stacksjs/pagination";function nt(e,n){let t=at(),r=t?tt(t,"per_page"):void 0,o=t?tt(t,"page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,r??15)),i=Math.max(1,Math.floor(n??o??1));return{perPage:a,page:i}}function rt(e,n){let t=at(),r=t?tn(t,"cursor"):void 0,o=t?tt(t,"per_page"):void 0,a=e!==void 0?Math.max(1,Math.floor(e)):Math.min(100,Math.max(1,o??15)),s=en(n!==void 0?n:r??null);return{perPage:a,cursor:s}}function en(e){if(e===null||e===void 0)return null;if(Array.isArray(e))return e;if(typeof e==="string"&&e.startsWith("["))try{let n=JSON.parse(e);if(Array.isArray(n))return n}catch{}return e}function ot(e){let n=at();if(!n)return e;let t=(()=>{try{return new URL(n.url)}catch{return null}})();if(!t)return e;let r=t.pathname;if(e.path=r,"next_cursor"in e)return e.next_page_url=e.next_cursor!==null?F(t,{cursor:e.next_cursor}):null,e.prev_page_url=e.prev_cursor!==null?F(t,{cursor:e.prev_cursor}):null,e;let o=e.current_page;if(e.prev_page_url=o>1?F(t,{page:o-1}):null,"total"in e){let a=e.last_page;e.next_page_url=o<a?F(t,{page:o+1}):null,e.first_page_url=F(t,{page:1}),e.last_page_url=F(t,{page:a})}else e.next_page_url=e.has_more_pages?F(t,{page:o+1}):null;return e}function F(e,n){let t=new URL(e.toString());for(let[r,o]of Object.entries(n))t.searchParams.set(r,String(o));return`${t.pathname}${t.search}`}var q;function at(){if(q===null)return;if(q===void 0)try{let n=Qn("@stacksjs/router");if(typeof n.getCurrentRequest==="function")q=n.getCurrentRequest;else{q=null;return}}catch{q=null;return}return q()}function tt(e,n){let t=tn(e,n);if(t===void 0)return;let r=Number(t);return Number.isFinite(r)?r:void 0}function tn(e,n){let t=e.query?.[n];if(t===void 0)return;return Array.isArray(t)?t[0]:t}function nn(){return{async generateTwoFactorForModel(e){let{generateTwoFactorSecret:n}=await import("@stacksjs/auth"),t=n();await e.update({two_factor_secret:t})},async verifyTwoFactorCode(e,n){let t=e.get("two_factor_secret");if(typeof t!=="string")return!1;let{verifyTwoFactorCode:r,RateLimiter:o}=await import("@stacksjs/auth"),a=String(e.id??e.get?.("id")??e.get?.("email")??t),i=`2fa:${a}`;if(await o.isRateLimited(i)){let{HttpError:u}=await import("@stacksjs/error-handling");throw new u(429,"Too many verification attempts. Please try again later.")}if(!await r(n,t))return await o.recordFailedAttempt(i),!1;try{let{cache:u}=await import("@stacksjs/cache"),c=`2fa:used:${a}:${n}`;if(await u.has(c))return await o.recordFailedAttempt(i),!1;await u.set(c,"1",90)}catch{}return await o.resetAttempts(i),!0}}}import{mutationCount as ho,sqlDateTime as ko}from"@stacksjs/database/runtime";import{log as G}from"@stacksjs/logging";var be="deleted_at";function rn(e,n="id"){return{async softDelete(t){let r=ko(),o=e.where(n,t);if(typeof o?.update==="function")return await o.update({[be]:r}),!0;return!1},async restore(t){let r=e.where(n,t).withTrashed();if(typeof r?.update==="function")return await r.update({[be]:null}),!0;return!1},async forceDelete(t){let r=e.where(n,t),o=typeof r?.withTrashed==="function"?r.withTrashed():r;if(typeof o?.forceDelete==="function")return ho(await o.forceDelete())>0;return!1},withTrashed(){return typeof e.query==="function"?e.query():e},onlyTrashed(){let t=typeof e.query==="function"?e.query():e;if(typeof t?.whereNotNull==="function")return t.whereNotNull(be);return t?.where?.(be,"!=",null)??t}}}function on(e){if(e===!0||e==null)return{};if(typeof e==="object"&&!Array.isArray(e)){let n=e;if(Array.isArray(n.cascade)){let t=n.cascade.filter((r)=>typeof r==="string");return t.length?{cascade:t}:{}}return{}}return{}}function To(e,n){let t=e.hasMany??[],r=e.hasOne??[],o=t.some((l)=>it(l,n,!0)),a=r.some((l)=>it(l,n,!1));if(!o&&!a)return G.warn(`[orm] soft-delete cascade: '${n}' is not a declared hasMany/hasOne relation - skipping`),null;let s=(o?t:r).find((l)=>it(l,n,o))??null;if(!s)return null;let c=globalThis[s];if(!c)return G.warn(`[orm] soft-delete cascade: model '${s}' is not yet on globalThis - skipping cascade for '${n}'`),null;return{className:s,model:c}}function it(e,n,t){let r=e.toLowerCase();if(n===r)return!0;if(t&&n===`${r}s`)return!0;if(t&&r.endsWith("y")&&n===`${r.slice(0,-1)}ies`)return!0;return!1}async function Ro(e,n,t,r,o){try{let a=t.where;if(typeof a!=="function"){G.warn(`[orm] cascade ${o}: child model has no .where()`);return}if(o==="softDelete"){let i=t.softDelete;if(typeof i==="function"){let u=a.call(t,r,n),c=typeof u?.get==="function"?await u.get():Array.isArray(u)?u:[],l=t.primaryKey||"id";for(let f of c){let d=f?.[l];if(d!=null)await i.call(t,d)}return}let s=a.call(t,r,n);if(typeof s?.delete==="function"){G.debug(`[orm] cascade soft-delete: child has no softDeletes trait, hard-deleting from ${String(t.table??"?")}`),await s.delete();return}}else{let i=t.restore;if(typeof i!=="function"){G.debug("[orm] cascade restore: child has no restore() - nothing to do");return}let s=t.withTrashed,c=(typeof s==="function"?s.call(t):t).where?.(r,n),l=typeof c?.get==="function"?await c.get():[],f=t.primaryKey||"id";for(let d of l){let p=d?.[f];if(p!=null)await i.call(t,p)}}}catch(a){if(G.warn(`[orm] soft-delete cascade ${o} on ${e}#${String(n)} failed`,{error:a}),process.env.STACKS_ORM_CASCADE_SWALLOW!=="true")throw a}}async function Z(e,n,t,r){let o=n.cascade;if(!o||o.length===0)return;let a=`${e.name.toLowerCase()}_id`;for(let i of o){let s=To(e,i);if(!s)continue;await Ro(s.className,t,s.model,a,r)}}import{sqlDateTime as Ao}from"@stacksjs/database/runtime";import{log as So}from"@stacksjs/logging";var _o=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],an=null;async function sn(){if(an!=null)return an;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let n=e.getCurrentRequest;if(typeof n!=="function")return null;let t=n();return t?.user?.id??t?._user?.id??null}catch{return null}}async function un(){try{let n=(await import("@stacksjs/router").catch(()=>null))?.getCurrentRequest;if(typeof n!=="function")return null;let t=n();return typeof t?.ip==="function"?t.ip()??null:null}catch{return null}}function cn(e){if(!e||typeof e!=="object")return null;let n={};for(let[t,r]of Object.entries(e)){if(_o.some((o)=>o.test(t)))continue;n[t]=r}return n}function ln(e,n,t){So.warn(`[orm] ${e} row write failed for ${n}: ${t?.message??String(t)}`)}var Po="activities";function dn(e){if(!e)return null;if(e===!0)return{};if(typeof e!=="object")return null;let n=e;return{logOnly:Array.isArray(n.logOnly)?n.logOnly:void 0,include:Array.isArray(n.include)?n.include:void 0,exclude:Array.isArray(n.exclude)?n.exclude:void 0}}function xo(e,n,t=[]){let r=cn(e);if(!r)return null;let o=new Set(t),a=n.logOnly??n.include,i=new Set(n.exclude??[]),s={};for(let[u,c]of Object.entries(r)){if(o.has(u)||i.has(u))continue;if(a&&!a.includes(u))continue;s[u]=c}return s}function Co(e,n,t){return t==null?`${e} was ${n}`:`${e} ${String(t)} was ${n}`}async function vo(e){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(Po).values({type:e.type,description:e.description,subject_type:e.subject_type,subject_id:e.subject_id,causer:e.causer,properties:e.properties?JSON.stringify(e.properties):null,ip_address:e.ip_address,user_id:e.user_id,created_at:Ao()}).executeTakeFirst()}catch(n){ln("activity",`${e.subject_type}#${String(e.subject_id)}`,n)}}async function Mo(e){let{attributes:n,event:t,modelName:r,options:o,primaryKey:a}=e,i=n?.[a]??null,s=await sn();await vo({type:`${r.toLowerCase()}.${t}`,description:Co(r,t,i),subject_type:r,subject_id:i,properties:xo(n,o,e.hidden),causer:s==null?null:`User:${String(s)}`,user_id:s,ip_address:await un()})}function he(e){if(!e||typeof e!=="object")return null;let n=e;if(n.attributes&&typeof n.attributes==="object")return{...n.attributes};if(n._attributes&&typeof n._attributes==="object")return{...n._attributes};return{...e}}function fn(e,n,t,r,o=[]){if(n==="Activity")return;let a=e,i=async(d)=>typeof a.find==="function"?he(await a.find(d)):null,s=async(d,p)=>{await Mo({modelName:n,event:d,attributes:p,primaryKey:t,options:r,hidden:o})},u=e.create;if(typeof u==="function")e.create=async function(...d){let p=await u.apply(this,d);return await s("created",he(p)),p};let c=e.createMany;if(typeof c==="function")e.createMany=async function(...d){let p=await c.apply(this,d);for(let m of Array.isArray(p)?p:[])await s("created",he(m));return p};let l=e.update;if(typeof l==="function")e.update=async function(d,p){let m=await l.call(this,d,p);return await s("updated",he(m)??await i(d)),m};let f=e.delete;if(typeof f==="function")e.delete=async function(d){let p=await i(d),m=await f.call(this,d);return await s("deleted",p??{[t]:d}),m}}var Re,xn=new Pn;function B(){return xn.getStore()?.suppressed===!0}function I(e){return Promise.resolve(xn.run({suppressed:!0},e))}var Cn=new Pn;function $o(){return Cn.getStore()?.suppressed===!0}function Io(e){return Promise.resolve(Cn.run({suppressed:!0},e))}var ft=Symbol.for("stacks.orm.modelDefinition");class vn extends Error{status=422;errors;constructor(e,n){let t=Object.keys(n).join(", ");super(`${e} validation failed: ${t}`);this.name="ModelValidationError",this.errors=n}}var pn=new Set,Bo=4096,mn=Object.create(null),gn=0;function ee(e){let n=mn[e];if(n!==void 0)return n;let t=te(e);if(gn<Bo)mn[e]=t,gn++;return t}function No(e,n){let t=typeof e==="string"?e.slice(0,80):String(e),r=`${typeof e}:${t}`;if(pn.has(r))return;pn.add(r);let o=n instanceof Error?n.message:String(n);console.error(`[orm] JSON cast failed to parse value (returning null): ${o} - value preview: ${JSON.stringify(t)}`)}var Lo={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>{if(e==null)return null;if(typeof e==="string")try{return JSON.parse(e)}catch(n){return No(e,n),null}return e},set:(e)=>{if(e==null)return null;return typeof e==="string"?e:JSON.stringify(e)}},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>{if(e==null)return[];if(Array.isArray(e))return e;if(typeof e==="string")try{return JSON.parse(e)}catch{return[]}return[]},set:(e)=>{if(e==null)return null;return Array.isArray(e)?JSON.stringify(e):e}}};function qo(e){return typeof e==="string"?Lo[e]:e}var yn=new WeakMap;function Mn(e){let n=Object.keys(e),t=yn.get(e);if(t&&t.length===n.length){let o=!0;for(let a=0;a<n.length;a++){let i=n[a];if(t[a]?.attr!==i||t[a]?.definition!==e[i]){o=!1;break}}if(o)return t}let r=n.map((o)=>{let a=e[o];return{attr:o,definition:a,caster:qo(a)}});return yn.set(e,r),r}function st(e,n,t){if(!e||typeof e!=="object")return e;let r={...e};for(let{attr:o,caster:a}of Mn(n))if(o in r)r[o]=a[t].call(a,r[o]);return r}function ke(e){return e==="_attributes"||e==="_original"||e==="_definition"||e==="_hasSaved"||e==="_relations"}var ct=Symbol.for("stacks.modelInstanceProxy"),wn,bn=new WeakMap,Go={tags:{bag:"_taggable",mode:"id"},tagCount:{bag:"_taggable",mode:"id"},addTag:{bag:"_taggable",mode:"id"},activeTags:{bag:"_taggable",mode:"id"},inactiveTags:{bag:"_taggable",mode:"id"},removeTag:{bag:"_taggable",mode:"id"},categories:{bag:"_categorizable",mode:"id"},categoryCount:{bag:"_categorizable",mode:"id"},addCategory:{bag:"_categorizable",mode:"id"},activeCategories:{bag:"_categorizable",mode:"id"},inactiveCategories:{bag:"_categorizable",mode:"id"},removeCategory:{bag:"_categorizable",mode:"id"},comments:{bag:"_commentable",mode:"id"},commentCount:{bag:"_commentable",mode:"id"},addComment:{bag:"_commentable",mode:"id"},approvedComments:{bag:"_commentable",mode:"id"},pendingComments:{bag:"_commentable",mode:"id"},rejectedComments:{bag:"_commentable",mode:"id"},likes:{bag:"_likeable",mode:"id"},likeCount:{bag:"_likeable",mode:"id"},like:{bag:"_likeable",mode:"id"},unlike:{bag:"_likeable",mode:"id"},isLiked:{bag:"_likeable",mode:"id"},...Object.fromEntries(le.map((e)=>[e,{bag:"_billable",mode:"model"}])),generateTwoFactorForModel:{bag:"_twoFactor",mode:"model"},verifyTwoFactorCode:{bag:"_twoFactor",mode:"model"}};function Uo(e,n){if(!e||!n)return null;let t=n.split("."),r=e;for(let o of t){if(r==null||typeof r!=="object")return null;let a=r;if("_attributes"in a&&a._attributes&&typeof a._attributes==="object"){let i=a._attributes;if(o in i){r=i[o];continue}}if(o in a){r=a[o];continue}return null}return r??null}function Te(e,n,t){if(e&&typeof e.then==="function")return e.then((r)=>r===n?t:r);return e===n?t:e}function O(e,n){if(!e||typeof e!=="object")return e;let t=e;if(t[ct])return e;let r=t._attributes;if(!r||typeof r!=="object")return e;if(n){for(let{attr:a,caster:i}of Mn(n))if(Object.hasOwn(r,a))r[a]=i.get.call(i,r[a])}let o=n?bn.get(n):wn;if(!o)if(o={get(a,i,s){let u=a;if(i===ct)return!0;if(i==="saveAsync")return async function(){let l=u._definition,f=l?.set;if(f&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes),w=g&&typeof g.then==="function"?await g:g;u._attributes[p]=w}let d=l.set;l.set={};try{return Te(u.save(),a,s)}finally{l.set=d}}return Te(u.save(),a,s)};if(i==="save")return function(){let l=u._definition,f=l?.set;if(f&&Object.keys(f).length>0&&typeof u.isDirty==="function"){for(let[p,m]of Object.entries(f)){if(typeof m!=="function")continue;if(!u.isDirty(p))continue;let g=m(u._attributes);if(g&&typeof g.then==="function")throw Error(`Setter for "${p}" returned a Promise - use \`saveAsync()\` instead of \`save()\` when a model has async setters.`);u._attributes[p]=g}let d=l.set;l.set={};try{return Te(u.save(),a,s)}finally{l.set=d}}return Te(u.save(),a,s)};if(i==="updateAsync")return async function(l){if(l&&typeof l==="object"&&!Array.isArray(l))for(let[f,d]of Object.entries(l))s[f]=d;return s.saveAsync()};if(i==="saveQuietly")return function(){return I(()=>u.save())};if(i==="saveAsyncQuietly")return function(){return I(()=>s.saveAsync())};if(i==="updateQuietly")return function(l){return I(()=>u.update(l))};if(i==="updateAsyncQuietly")return function(l){return I(()=>s.updateAsync(l))};if(i==="deleteQuietly")return function(){return I(()=>u.delete())};if(i==="toSearchableObject")return function(){let d=u._definition?.traits?.useSearch;if(!d)return null;let p=u._attributes;if(!p)return null;if(d===!0){let b={...p};if(p.id!=null)b.id=String(p.id);return b}let m={},g=d.displayable?.length?d.displayable:[...d.searchable??[],...d.filterable??[],...d.sortable??[],"id"],w=d.denormalize??{},h=u._relations;for(let b of g){let k=te(b),R=p[k]??p[b];if(R!==void 0){m[k]=R;continue}let re=w[b]??w[k];if(re){m[k]=Uo(h,re);continue}m[k]=void 0}if(p.id!=null)m.id=String(p.id);return m};if(typeof i==="string"&&!ke(i)){let l=u._attributes;if(l&&Object.hasOwn(l,i))return l[i];let f=u._relations;if(f&&Object.hasOwn(f,i)){let p=f[i];if(Array.isArray(p))return p.map((m)=>O(m,n));return p&&typeof p==="object"?O(p,n):p}let d=Go[i];if(d){let g=u._definition?.__traitMethods?.[d.bag]?.[i];if(typeof g==="function")return d.mode==="model"?(...w)=>g(s,...w):(...w)=>g(u.id,...w)}if(l){let p=ee(i);if(p!==i&&Object.hasOwn(l,p))return l[p]}}let c=Reflect.get(u,i,u);return typeof c==="function"?c.bind(u):c},set(a,i,s,u){let c=a;if(typeof i==="string"&&!ke(i)){let{_attributes:l,set:f}=c;if(l&&Object.hasOwn(l,i)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}if(l){let d=ee(i);if(d!==i&&Object.hasOwn(l,d)){if(typeof f==="function")f.call(c,d,s);else l[d]=s;return!0}}if(l&&!(i in c)){if(typeof f==="function")f.call(c,i,s);else l[i]=s;return!0}}return Reflect.set(c,i,s,u)},has(a,i){let s=a;if(typeof i==="string"&&!ke(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return!0;let c=s._relations;if(c&&Object.hasOwn(c,i))return!0;if(u){let l=ee(i);if(l!==i&&Object.hasOwn(u,l))return!0}}return Reflect.has(s,i)},deleteProperty(a,i){let s=a;if(typeof i==="string"&&!ke(i)){let u=s._attributes;if(u&&Object.hasOwn(u,i))return delete u[i],!0}return Reflect.deleteProperty(s,i)},ownKeys(a){let s=a._attributes;return s?Object.keys(s):[]},getOwnPropertyDescriptor(a,i){let s=a;if(typeof i==="string"){let u=s._attributes;if(u&&Object.hasOwn(u,i))return{configurable:!0,enumerable:!0,value:u[i],writable:!0}}return Object.getOwnPropertyDescriptor(s,i)}},n)bn.set(n,o);else wn=o;return new Proxy(e,o)}var On=Object.assign(Object.create(null),{get:!0,first:!0,last:!0,firstOrFail:!0,find:!0,findOrFail:!0,all:!0,paginate:!0,simplePaginate:!0,cursorPaginate:!0}),Ko={paginate:jo,simplePaginate:Fo,cursorPaginate:Eo},hn=Symbol.for("stacks.queryBuilderProxy");function kn(e,n,t){if(On[n]){if(Array.isArray(e))return e.map((o)=>O(o,t));let r=Ko[n];if(r&&e&&Array.isArray(e.data)){let o=e.data.map((i)=>O(i,t)),a=r({...e,data:o});return ot(a)}if(e&&Array.isArray(e.data))return{...e,data:e.data.map((o)=>O(o,t))};return O(e,t)}if(e&&typeof e==="object"&&typeof e.get==="function")return Dn(e,t);return e}function Dn(e,n){if(!e||typeof e!=="object")return e;if(e[hn])return e;return new Proxy(e,{get(t,r,o){if(r===hn)return!0;let a=Reflect.get(t,r,o);if(typeof a!=="function")return a;let i=String(r);return function(...s){let u=s;if(i==="paginate"||i==="simplePaginate"){let{perPage:l,page:f}=nt(s[0],s[1]);u=[l,f]}else if(i==="cursorPaginate"){let{perPage:l,cursor:f}=rt(s[0],s[1]);u=[l,f,s[2],s[3]]}let c=a.apply(t,u);if(!On[i]&&c===t)return o;if(c&&typeof c.then==="function")return c.then((l)=>kn(l,i,n));return kn(c,i,n)}}})}function Wo(e,n){let t=(i)=>Array.isArray(i)?i.map((s)=>O(s,n)):O(i,n),r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let i of r){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let i of o){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);if(c&&typeof c.then==="function")return c.then(t);return t(c)}}let a=["query","where","orWhere","whereIn","whereNotIn","whereNull","whereNotNull","whereLike","whereBetween","whereNotBetween","orderBy","orderByDesc","select","with","limit","take","skip","latest","oldest"];for(let i of a){let s=e[i];if(typeof s!=="function")continue;e[i]=function(...u){let c=s.apply(this,u);return Dn(c,n)}}}class En extends Error{model;id;constructor(e,n){super(n!=null?`[ORM] ${e} not found for id=${String(n)}`:`[ORM] No matching ${e} row`);this.name="ModelNotFoundError",this.model=e,this.id=n}}class lt extends Error{model;attribute;reason;constructor(e,n,t){let r=t==="guarded"?`'${n}' is marked guarded`:`'${n}' is not in the fillable allowlist`;super(`[ORM] Mass assignment to ${e} forbidden: ${r}. Use ${e}.forceCreate(...) / .forceUpdate(...) to bypass.`);this.name="MassAssignmentException",this.model=e,this.attribute=n,this.reason=t}}var Vo=new Set(["id","created_at","updated_at","deleted_at","uuid"]),Tn=new WeakMap;function Qo(e){let n=Tn.get(e);if(n)return n;let t=new Set,r=new Set,o=new Set;for(let[i,s]of Object.entries(e)){let u=ee(i);if(t.add(u),s?.fillable===!0)r.add(u);if(s?.guarded===!0)o.add(u)}let a={allowed:r.size>0?r:t,guarded:o};return Tn.set(e,a),a}function U(e,n,t={}){if(t.force)return n;if(!n||typeof n!=="object"||Array.isArray(n))return n;let r=e.attributes;if(!r)return n;let{allowed:o,guarded:a}=Qo(r);for(let i in n){if(!Object.hasOwn(n,i))continue;let s=ee(i);if(Vo.has(s))continue;if(a.has(s))throw new lt(e.name,i,"guarded");if(s.endsWith("_id"))continue;if(!o.has(s))throw new lt(e.name,i,"not-fillable")}return n}async function Se(e,n){let t=e.set;if(!t||typeof t!=="object")return n;let r={...n};for(let[o,a]of Object.entries(t)){if(typeof a!=="function"||!(o in r))continue;try{r[o]=await a(r)}catch(i){_.error(`[orm] ${e.name}.set.${o} threw - skipping setter`,i)}}return r}function zo(e,n){let t=n.primaryKey||"id",r=e.create;function o(c){let l=e.where;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working where(): the underlying query builder did not expose one`);return l}function a(c){let l=e.find;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} needs a working find(): the underlying query builder did not expose one`);return l}function i(c){let l=e.create;if(typeof l!=="function")throw Error(`[ORM] ${n.name}.${c} cannot create: the underlying query builder did not expose create()`);return l}if(e.update=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.update requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.update requires a data object as the second argument`);if(Object.keys(l).length===0){_.debug(`[orm] ${n.name}.update called with empty data - short-circuiting and returning current row`);let p=e.find;return typeof p==="function"?await p.call(e,c):null}U(n,l);let f=await Se(n,l);await o("update").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null},typeof e.forceUpdate!=="function")e.forceUpdate=async function(c,l){if(c==null)throw Error(`[ORM] ${n.name}.forceUpdate requires an id as the first argument`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.forceUpdate requires a data object as the second argument`);let f=await Se(n,l);await o("forceUpdate").call(e,t,c).update(f);let d=e.find;return typeof d==="function"?await d.call(e,c):null};if(typeof e.forceCreate!=="function")e.forceCreate=async function(c){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.forceCreate requires a data object`);let l=e.make;if(typeof l==="function"){let f=await l.call(e);if(f&&typeof f.forceFill==="function"&&typeof f.save==="function"){f.forceFill(c);let d=await f.save();return d&&typeof d==="object"&&d!==f&&!d[ct]?f:d??f}}if(typeof r!=="function")throw Error(`[ORM] ${n.name}.forceCreate cannot create: the underlying query builder did not expose create()`);return await r.call(e,c)};if(e.delete=async function(c){if(c==null)throw Error(`[ORM] ${n.name}.delete requires an id as the first argument`);if(!await a("delete").call(e,c))return!1;return await o("delete").call(e,t,c).delete(),!0},typeof e.findOrFail!=="function")e.findOrFail=async function(c){let l=await a("findOrFail").call(e,c);if(l==null)throw new En(n.name,c);return l};if(typeof e.exists!=="function")e.exists=async function(c){if(c==null)return!1;let l=o("exists").call(e,t,c);if(typeof l.count==="function"){let d=await l.count();return Number(d)>0}let f=e.find;return typeof f==="function"?await f.call(e,c)!=null:!1};if(typeof e.firstOrCreate!=="function")e.firstOrCreate=async function(c,l={}){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.firstOrCreate requires a where-attrs object`);let f=o("firstOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d)return d;let p={...c,...l};return U(n,p),await i("firstOrCreate").call(e,p)};if(typeof e.updateOrCreate!=="function")e.updateOrCreate=async function(c,l){if(!c||typeof c!=="object"||Array.isArray(c))throw Error(`[ORM] ${n.name}.updateOrCreate requires a where-attrs object`);if(!l||typeof l!=="object"||Array.isArray(l))throw Error(`[ORM] ${n.name}.updateOrCreate requires a values object`);let f=o("updateOrCreate").call(e,c),d=typeof f.first==="function"?await f.first():await f;if(d){U(n,l);let m=d[t];await o("updateOrCreate").call(e,t,m).update(l);let g=e.find;return typeof g==="function"?await g.call(e,m):{...d,...l}}let p={...c,...l};return U(n,p),await i("updateOrCreate").call(e,p)};if(typeof e.count!=="function")e.count=async function(){let c=e;if(typeof c.query==="function"){let d=c.query();if(typeof d?.count==="function"){let p=await d.count();return Number(p)||0}}let{all:l,get:f}=e;if(typeof l==="function")return(await l.call(e)||[]).length;if(typeof f==="function")return(await f.call(e)||[]).length;return 0};if(typeof e.pluck!=="function")e.pluck=async function(c){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.pluck requires a column name`);let l=e.all;return((typeof l==="function"?await l.call(e):[])||[]).map((d)=>d?.[c])};if(typeof e.whereIn!=="function")e.whereIn=async function(c,l){if(!c||typeof c!=="string")throw Error(`[ORM] ${n.name}.whereIn requires a column name`);if(!Array.isArray(l))throw Error(`[ORM] ${n.name}.whereIn requires an array of values`);if(l.length===0)return[];let f=e.where;if(typeof f!=="function")return[];let d=f.call(e,c,"in",l);if(d&&typeof d.get==="function")return await d.get();return await d};let s=[["latest","desc"],["oldest","asc"]];for(let[c,l]of s)if(typeof e[c]!=="function")e[c]=async function(f="created_at"){let d=e,p=typeof d.query==="function"?d.query():d;if(typeof p?.orderBy==="function"){let h=p.orderBy(f,l);if(typeof h.first==="function")return await h.first();if(typeof h.get==="function")return(await h.get())?.[0]??null}let m=e.all;if(typeof m!=="function")return null;return[...await m.call(e)||[]].sort((h,b)=>{let k=h?.[f],R=b?.[f];if(k===R)return 0;return(k>R?1:-1)*(l==="desc"?-1:1)})[0]??null};let u=In(n.traits?.useSearch,n);if(u){let c=u.index??n.table??te(`${n.name}s`);if(typeof e.search!=="function")e.search=function(l,f){return Yo(e,c,l,f,u.searchable)};if(typeof e.makeAllSearchable!=="function")e.makeAllSearchable=async function(l=500){let f=e.all;if(typeof f!=="function")throw Error(`[ORM] ${n.name}.makeAllSearchable cannot run: the underlying query builder did not expose all()`);let{useSearchEngine:d}=await import("@stacksjs/search-engine"),p=d(),m=0,g=e.query;if(typeof g==="function")try{let b=g.call(e);if(b&&typeof b.chunk==="function")return await b.chunk(l,async(k)=>{let R=await dt(k,u);if(R.length>0)await p.addDocuments(c,R);m+=R.length}),m}catch{}let w=await f.call(e)||[],h=await dt(w,u);if(h.length>0)await p.addDocuments(c,h);return h.length};if(typeof e.removeAllFromSearch!=="function")e.removeAllFromSearch=async function(){let{searchEngineReady:l}=await import("@stacksjs/search-engine");await(await l()).deleteAllDocuments(c)}}}async function dt(e,n){if(e.length===0)return[];if(typeof n.shapeMany==="function"){let r=await n.shapeMany(e);if(!Array.isArray(r)||r.length!==e.length)throw TypeError(`[orm/search] shapeMany returned ${Array.isArray(r)?r.length:typeof r} documents for ${e.length} rows. It must return one document per row, in order, or documents are indexed under the wrong ids.`);return r.filter(Boolean)}return(await Promise.all(e.map((r)=>Jo(r,n)))).filter(Boolean)}function jn(e){let n=new Set,t=e.attributes??{};for(let[r,o]of Object.entries(t))if(o?.hidden)n.add(r);return n}function Ho(e,n){if(!e||n.size===0)return e;let t={};for(let[r,o]of Object.entries(e))if(!n.has(r))t[r]=o;return t}async function Jo(e,n){if(typeof n.shape==="function")try{return await n.shape(e)}catch{return}let t=e?.toSearchableObject?.();if(t!==void 0)return t;return Ho(e?._attributes??(typeof e?.toJSON==="function"?e.toJSON():null),n.hidden??new Set)}function Yo(e,n,t,r,o){let a=o&&o.length>0?{query_by:[...o].join(",")}:{},i={q:t,...a,...r??{}},s={with(u){return i={...i,...u},s},where(u){return i={...i,filter:u},s},async get(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return(await u().search(n,i))?.hits??[]},async paginate(u,c=1){if(!Number.isInteger(u)||u<1)throw TypeError(`[orm/search] paginate() needs a positive integer page size, got ${u}`);if(!Number.isInteger(c)||c<1)throw TypeError(`[orm/search] paginate() pages are 1-based, got ${c}`);let{useSearchEngine:l}=await import("@stacksjs/search-engine"),d=await l().search(n,{...i,limit:u,offset:(c-1)*u});return{hits:d.hits??[],total:Number(d.estimatedTotalHits??d.nbHits??d.total??0),page:c,perPage:u}},async raw(){let{useSearchEngine:u}=await import("@stacksjs/search-engine");return await u().search(n,i)}};return s}function Fn(e){let n=te(e);return n===e?[e]:[e,n]}async function ut(e,n){if(!e||typeof e!=="object")return;let t=e._attributes??e;for(let r of n)for(let o of Fn(r)){if(!(o in t))continue;let a=t[o];if(!V(a))continue;t[o]=await ve(a)}}function Xo(e,n){if(n.length===0)return;let t=async(s)=>{if(Array.isArray(s)){for(let u of s)await ut(u,n);return s}if(s&&typeof s==="object"&&Array.isArray(s.data)){for(let u of s.data)await ut(u,n);return s}if(s)await ut(s,n);return s},r=["find","first","last","all","firstOrFail","findOrFail","findMany"];for(let s of r){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}let o=["create","createMany","firstOrCreate","updateOrCreate","make"];for(let s of o){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(...c){let l=await u.apply(this,c);return await t(l)}}for(let s of["update","forceUpdate"]){let u=e[s];if(typeof u!=="function")continue;e[s]=async function(c,l){let f=await u.call(this,c,l);return await t(f)}}let a=["first","firstOrFail","get","all","find","findOrFail","last","paginate","simplePaginate"],i=(s)=>{if(!s||typeof s!=="object")return s;let u=s;if(u.__stacksEncryptedReads)return s;for(let c of a){let l=u[c];if(typeof l!=="function")continue;u[c]=async function(...f){return await t(await l.apply(this,f))}}for(let c of["where","whereIn","whereNull","whereNotNull","orWhere","orderBy","orderByDesc","limit","offset","with"]){let l=u[c];if(typeof l!=="function")continue;u[c]=function(...f){return i(l.apply(this,f))}}return Object.defineProperty(u,"__stacksEncryptedReads",{value:!0,enumerable:!1}),s};for(let s of["where","whereIn","whereNull","whereNotNull","orderBy","orderByDesc","limit","query"]){let u=e[s];if(typeof u!=="function")continue;e[s]=function(...c){return i(u.apply(this,c))}}}function Zo(e,n){if(n.length===0)return;let t=async(a)=>{if(!a||typeof a!=="object"||Array.isArray(a))return a;let i={...a};for(let s of n)for(let u of Fn(s))if(u in i)i[u]=await Ce(i[u]);return i},r=["create","firstOrCreate","updateOrCreate","forceCreate"],o=e.createMany;if(typeof o==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?await Promise.all(a.map(t)):a;return await o.call(this,s,...i)};for(let a of r){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(...s){if(s[0]=await t(s[0]),s[1])s[1]=await t(s[1]);return await i.apply(this,s)}}for(let a of["update","forceUpdate"]){let i=e[a];if(typeof i!=="function")continue;e[a]=async function(s,u){let c=await t(u);return await i.call(this,s,c)}}}function ea(e,n){let t=e.create;if(typeof t==="function")e.create=async function(o,...a){U(n,o);let i=await Se(n,o);return await t.call(this,i,...a)};let r=e.createMany;if(typeof r==="function")e.createMany=async function(o,...a){let i=[];for(let s of o)U(n,s),i.push(await Se(n,s));return await r.call(this,i,...a)};for(let o of["firstOrCreate","updateOrCreate"]){let a=e[o];if(typeof a!=="function")continue}}function ta(e,n){if(!jt(n))return;let t=String(n?.name??e.name??"Model"),r=(s,u)=>{if($o())return;if(!s||typeof s!=="object"||Array.isArray(s))return;let c=Ft(s,n,u);if(!c.valid)throw new vn(t,c.errors)},o=e.create;if(typeof o==="function")e.create=async function(s,...u){return r(s,"creating"),await o.call(this,s,...u)};let a=e.createMany;if(typeof a==="function")e.createMany=async function(s,...u){if(Array.isArray(s))for(let c of s)r(c,"creating");return await a.call(this,s,...u)};let i=e.update;if(typeof i==="function")e.update=async function(s,u,...c){return r(u,"updating"),await i.call(this,s,u,...c)}}function na(e,n){let t=["create","firstOrCreate","updateOrCreate"],r=e.createMany;if(typeof r==="function")e.createMany=async function(a,...i){let s=Array.isArray(a)?a.map((u)=>u&&typeof u==="object"&&!Array.isArray(u)?st(u,n,"set"):u):a;return await r.call(this,s,...i)};for(let a of t){let i=e[a];if(typeof i==="function")e[a]=async function(...s){if(_.debug(`[orm] ${a.charAt(0).toUpperCase()+a.slice(1)} ${String(e.name||"unknown")}`,s[0]),s[0]&&typeof s[0]==="object"&&!Array.isArray(s[0]))s[0]=st(s[0],n,"set");return await i.apply(this,s)}}let o=e.update;if(typeof o==="function")e.update=async function(a,i){let s=i&&typeof i==="object"&&!Array.isArray(i)?st(i,n,"set"):i;return await o.call(this,a,s)}}var Rn=new Set(["useUuid","useTimestamps","timestampable","useSoftDeletes","softDeletable","useApi","useAuth","authenticatable","useSearch","searchable","useSeeder","seedable","useSocials","billable","observe","useAudit","useActivityLog","prunable","sharding","likeable","taggable","categorizable","commentable","commentables","broadcastOn","broadcastWith","gdpr"]);function $n(e){_.debug(`[orm] Defining model: ${e.name} (table: ${e.table})`);for(let g of Object.keys(e.traits??{}))if(!Rn.has(g))_.warn(`[orm] Model '${e.name}' declares an unknown trait '${g}'. It does nothing. Known traits: ${[...Rn].sort().join(", ")}.`);let n=ra(e),t=aa(e),r=oa(n,t),o=ia(e);e.__traitMethods=o;let a=e.traits;if((a?.useAuth||a?.authenticatable)&&e.name!=="PersonalAccessToken"){let g=e.morphMany;if(!g||!("tokenable"in g))e.morphMany={...g??{},tokenable:"PersonalAccessToken"}}let i=r?{...e,hooks:{...e.hooks,...r}}:e,u=Oo(i);if(Wo(u,e.casts),zo(u,i),ea(u,i),e.casts&&Object.keys(e.casts).length>0)na(u,e.casts);let c=Me(e);if(c.length>0)Zo(u,c),Xo(u,c);let l=e.traits?.useSoftDeletes;if(l)sa(u,i,l);let f=e.traits?.useAudit;if(f){let g=Rt(f);St(u,e.name,e.primaryKey||"id",g)}let d=dn(e.traits?.useActivityLog);if(d)fn(u,e.name,e.primaryKey||"id",d,[...jn(e)]);ta(u,i);let p=u;p.withoutValidation=function(g){return Io(g)},p.withoutEvents=function(g){return I(g)};for(let g of["create","createMany","update","firstOrCreate","updateOrCreate","forceCreate","forceUpdate","delete","forceDelete","softDelete","restore"]){let w=u[g];if(typeof w!=="function")continue;let h=`${g}Quietly`;if(typeof u[h]==="function")continue;u[h]=function(...b){return I(()=>w.apply(u,b))}}let m=Object.assign(u,o,{...e,getDefinition:()=>e,_isStacksModel:!0});return Do(e.name,m),Object.defineProperty(m,ft,{value:e,enumerable:!1,configurable:!0}),m}function ra(e){let n=e.traits?.observe;if(!n)return;let t=e.name.toLowerCase(),r=(d)=>{let p=d?.attributes;if(!p||typeof p!=="object")return d;let m=e.primaryKey||"id",g={...p};if(g[m]===void 0&&d[m]!==void 0)g[m]=d[m];return g},o=async(d,p)=>{if(B())return;try{let{dispatch:m}=Re??=await import("@stacksjs/events");await m(d,p)}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Event '${d}' handler error:`,m),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw m}},a=e.traits?.broadcastOn,i=e.traits?.broadcastWith,s=typeof a==="function"&&typeof i==="function",u=async(d,p)=>{if(!s)return;if(B())return;try{let m=a(p),g=Array.isArray(m)?m:[m],w=i(p),b=(await import("@stacksjs/realtime").catch(()=>null))?.broadcast;if(typeof b!=="function")return;for(let k of g){if(typeof k!=="string"||k.length===0)continue;await b(k,d,w)}}catch(m){if(m&&typeof m==="object"&&"code"in m&&m.code==="MODULE_NOT_FOUND")return;if(console.error(`[ORM] Broadcast '${d}' handler error:`,m),process.env.STACKS_ORM_BROADCAST_ERRORS==="throw")throw m}},c=async(d,p)=>{if(B())return!0;let m;try{m=Re??=await import("@stacksjs/events");let{dispatchAndCollect:g}=m,w=await g(d,p);if(w.some((b)=>b.ok&&b.value===!1))return!1;let h=w.find((b)=>!b.ok);if(h&&!h.ok)throw h.error}catch(g){if(!m&&g&&typeof g==="object"&&"code"in g&&g.code==="MODULE_NOT_FOUND")return!0;if(console.error(`[ORM] Before-event '${d}' handler error:`,g),process.env.STACKS_ORM_EVENT_ERRORS!=="swallow")throw g}return!0},l=n===!0?["create","update","delete"]:Array.isArray(n)?n:[],f={};if(l.includes("create"))f.beforeCreate=async(d)=>{if(_.debug(`[orm] Create ${t}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:creating`,d))throw Error(`[ORM] ${t}:creating event cancelled the operation`)},f.afterCreate=async(d)=>{let p=r(d);await o(`${t}:created`,p),await o(`${t}:saved`,p),await u(`${t}:created`,d)};if(l.includes("update"))f.beforeUpdate=async(d)=>{if(_.debug(`[orm] Update ${t}#${d?.id??"unknown"}`,d),!await c(`${t}:saving`,d))throw Error(`[ORM] ${t}:saving event cancelled the operation`);if(!await c(`${t}:updating`,d))throw Error(`[ORM] ${t}:updating event cancelled the operation`)},f.afterUpdate=async(d)=>{let p=r(d);await o(`${t}:updated`,p),await o(`${t}:saved`,p),await u(`${t}:updated`,d)};if(l.includes("delete"))f.beforeDelete=async(d)=>{if(_.debug(`[orm] Delete ${t}#${d?.id??"unknown"}`),!await c(`${t}:deleting`,d))throw Error(`[ORM] ${t}:deleting event cancelled the operation`)},f.afterDelete=async(d)=>{await o(`${t}:deleted`,r(d)),await u(`${t}:deleted`,d)};return f}function oa(...e){let n={},t=new Set;for(let r of e){if(!r)continue;for(let o of Object.keys(r))t.add(o)}for(let r of t){let o=e.map((a)=>a?.[r]).filter((a)=>typeof a==="function");if(!o.length)continue;n[r]=async(...a)=>{for(let i of o)await i(...a)}}return Object.keys(n).length?n:void 0}function In(e,n){if(!e)return null;let t=e===!0?{}:typeof e==="object"?{...e}:null;if(!t)return null;if(n)t.hidden=jn(n);return t}function aa(e){let n=In(e.traits?.useSearch,e);if(!n)return;let t=n,r=t.index??e.table??te(`${e.name}s`);async function o(s){if(typeof t.shapeMany==="function")try{let[l]=await dt([s],t);return l}catch(l){_.warn(`[orm/search] shapeMany() threw for ${e.name}: ${l.message}`);return}if(typeof t.shape==="function")try{return await t.shape(s)}catch(l){_.warn(`[orm/search] shape() threw for ${e.name}: ${l.message}`);return}let c=O(s).toSearchableObject?.();if(c!==void 0)return c;return s?._attributes??(typeof s?.toJSON==="function"?s.toJSON():null)}let a=async(s)=>{if(B())return;let u=await o(s);if(!u)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"upsert",doc:u})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}; falling back to inline: ${c.message}`),await _n(r,u,e.name)}return}await _n(r,u,e.name)};return{afterCreate:a,afterUpdate:a,afterDelete:async(s)=>{if(B())return;let u=s?.id??s?._attributes?.id;if(u==null)return;if(n.queueable){try{let{Jobs:c}=await import("@stacksjs/queue");await c.dispatch("SyncSearchIndexJob",{index:r,op:"delete",id:Number(u)})}catch(c){_.warn(`[orm/search] queue dispatch failed for ${e.name}#${u}; falling back to inline: ${c.message}`),await An(r,Number(u),e.name)}return}await An(r,Number(u),e.name)}}}var Sn=new Map;function Bn(e,n){let t=Sn.get(e)??0;if(Sn.set(e,t+1),t===0)_.warn(`[orm/search] ${n}`);else if(t===9)_.warn(`[orm/search] ${e} is still failing; further identical warnings suppressed for this process.`)}async function _n(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().addDocument(e,n)}catch(r){Bn(`index:${t}`,`Failed to index ${t}: ${r.message}`)}}async function An(e,n,t){try{let{useSearchEngine:r}=await import("@stacksjs/search-engine");await r().deleteDocument(e,n)}catch(r){Bn(`remove:${t}`,`Failed to remove ${t}#${n}: ${r.message}`)}}function ia(e){let n={},{table:t,traits:r}=e;if(!r)return n;if(r.taggable)n._taggable=Fe(t);if(r.categorizable)n._categorizable=$e(t);if(r.commentable)n._commentable=Ee(t);if(r.billable)n._billable=Pt(t);if(r.likeable){let a=typeof r.likeable==="object"?r.likeable:void 0;n._likeable=Ie(t,a)}let o=r.useAuth||r.authenticatable;if(typeof o==="object"&&o&&"useTwoFactor"in o&&o.useTwoFactor)n._twoFactor=nn();return n}function sa(e,n,t){let r=rn(e,n.primaryKey||"id"),o=on(t),a=n,i=n.name.toLowerCase(),s=n.traits?.observe!=null&&n.traits?.observe!==!1,u=async(p)=>{if(!s||B())return!0;try{let{dispatchAsync:m}=Re??=await import("@stacksjs/events"),g=await m(`${i}:restoring`,{id:p});if(Array.isArray(g)&&g.some((w)=>w===!1))return!1}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Before-event '${i}:restoring' handler error:`,m)}return!0},c=async(p)=>{if(!s||B())return;try{let{dispatch:m}=Re??=await import("@stacksjs/events");await m(`${i}:restored`,{id:p})}catch(m){if(m?.code!=="MODULE_NOT_FOUND")console.error(`[ORM] Event '${i}:restored' handler error:`,m)}},l=process.env.STACKS_ORM_CASCADE_SWALLOW!=="true",f=async(p)=>{if(!o.cascade?.length||!l){let g=await r.softDelete(p);if(g&&o.cascade?.length)await Z(a,o,p,"softDelete");return g}let{db:m}=await import("@stacksjs/database/runtime");return await m.transaction(async()=>{let g=await r.softDelete(p);if(g)await Z(a,o,p,"softDelete");return g})},d=async(p)=>{if(!await u(p))return!1;if(!o.cascade?.length||!l){let h=await r.restore(p);if(h){if(o.cascade?.length)await Z(a,o,p,"restore");await c(p)}return h}let{db:g}=await import("@stacksjs/database/runtime"),w=await g.transaction(async()=>{let h=await r.restore(p);if(h)await Z(a,o,p,"restore");return h});if(w)await c(p);return w};e.softDelete=f,e.restore=d,e.forceDelete=r.forceDelete,e.withTrashed=r.withTrashed,e.onlyTrashed=r.onlyTrashed,e.delete=f}function ua(e){if(e==null)return e;if(Array.isArray(e))return e.map((t)=>ua(t));if(typeof e!=="object")return e;let n=e;if(typeof n.toJSON==="function")return n.toJSON();if(n._attributes&&typeof n._attributes==="object")return n._attributes;return e}var ca=["belongsTo","hasOne","hasMany","belongsToMany","morphMany","morphOne"],la=["traits","dashboard"];function da(e){let n=e?.[ft];if(n&&typeof n==="object")return n;if(e&&typeof e==="object"&&"name"in e&&"attributes"in e)return e;throw TypeError("extendModel() expects a model created by defineModel(), or a model definition. Import the framework model itself rather than its table name.")}function fa(e,n){let t=Array.isArray(e)?e:[],r=Array.isArray(n)?n:[];if(!t.length&&!r.length)return;return[...new Set([...t,...r])]}function pa(e){if(!e)return 0;return Object.values(e).reduce((n,t)=>{let r=Number(t?.order);return Number.isFinite(r)&&r>n?r:n},0)}function ma(e,n){let t={...e,...n},r=e.attributes??{},o=n.attributes??{};if(n.attributes){let a=pa(r),i=Object.fromEntries(Object.entries(o).map(([s,u])=>{let c=!(s in r),l=Number.isFinite(Number(u?.order));if(c&&!l)return[s,{...u,order:++a}];return[s,u]}));t.attributes={...r,...i}}for(let a of ca){let i=fa(e[a],n[a]);if(i)t[a]=i}for(let a of la){let i=e[a],s=n[a];if(i&&s&&typeof i==="object"&&typeof s==="object")t[a]={...i,...s}}return t}function Dc(e,n){return $n(ma(da(e),n))}import Ra from"process";import{log as Sa}from"@stacksjs/logging";import{path as A}from"@stacksjs/path";import{fs as ne}from"@stacksjs/storage";import{Database as ga}from"bun:sqlite";import{existsSync as ya,readdirSync as wa,readFileSync as ba}from"fs";function ha(e){return e.startsWith("sqlite_")||e.startsWith("_qb_tmp_")}function ka(e,n){let t=e.toUpperCase();if(t.includes("BOOL"))return n==="postgres"?"boolean":"number";if(t.includes("DATE")||t.includes("TIME"))return"string";if(t.includes("INT"))return"number";if(t.includes("CHAR")||t.includes("CLOB")||t.includes("TEXT"))return"string";if(t.includes("REAL")||t.includes("FLOA")||t.includes("DOUB")||t.includes("NUMERIC")||t.includes("DEC"))return"number";if(t.includes("BLOB"))return"Uint8Array";return"unknown"}function Ta(e,n){try{return e.exec(n),{ok:!0}}catch(t){if(/CREATE\s+TRIGGER/i.test(n))return{ok:!1,error:t.message};let r=0;for(let o of n.split(/;\s*$/m)){if(!o.trim())continue;try{e.exec(o),r++}catch(a){if(/duplicate column name/i.test(a.message))r++}}return r>0?{ok:!0}:{ok:!1,error:t.message}}}function Nn(e,n="sqlite"){let t=[];if(!ya(e))return{tables:[],errors:t};let r;try{r=wa(e).filter((a)=>a.endsWith(".sql")).sort()}catch(a){return{tables:[],errors:[{file:e,error:a.message}]}}let o=new ga(":memory:");try{for(let s of r){let u=`${e}/${s}`,c;try{c=ba(u,"utf-8")}catch(f){t.push({file:u,error:f.message});continue}let l=Ta(o,c);if(!l.ok)t.push({file:u,error:l.error??"could not be applied"})}let a=o.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name").all().map((s)=>s.name).filter((s)=>!ha(s)),i=[];for(let s of a){let u=o.query(`PRAGMA table_info("${s.replace(/"/g,'""')}")`).all();if(u.length===0)continue;let c={};for(let l of u){let f=ka(l.type??"",n),d=l.notnull===0&&l.pk===0;c[l.name]=d&&f!=="unknown"?`${f} | null`:f}i.push({table:s,columns:c})}return{tables:i,errors:t}}finally{o.close()}}function _a(e){if(e)return e;let n=String(Ra.env.DB_CONNECTION??"").toLowerCase();return n==="postgres"||n==="mysql"?n:"sqlite"}function _e(e){return e==="postgres"?"boolean":"number"}function E(e){return e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").toLowerCase()}function Aa(e,n){let t=e.default;if(typeof t==="boolean")return _e(n);if(typeof t==="number")return"number";if(typeof t==="string")return"string";return"unknown"}function Pa(e){let n=e.validation;if(!n||typeof n!=="object")return null;let t=n.rule;return t&&typeof t==="object"?t:null}function xa(e){if(!e||String(e.name??"")!=="enum")return null;let t=(Array.isArray(e.allowedValues)?e.allowedValues:[]).filter((r)=>typeof r==="string"||typeof r==="number").map((r)=>typeof r==="number"?String(r):JSON.stringify(r));return t.length>0?t.join(" | "):null}function Ca(e,n){let t=Pa(e),r=xa(t);if(r!==null)return e.nullable===!0?`${r} | null`:r;let o=typeof e.type==="string"?e.type.toLowerCase():String(t?.name??"").toLowerCase(),a=(()=>{switch(o){case"string":case"text":case"longtext":case"mediumtext":case"tinytext":case"char":case"varchar":case"enum":case"uuid":case"date":case"datetime":case"timestamp":case"timestamptz":case"password":case"time":case"year":return"string";case"number":case"integer":case"int":case"tinyint":case"smallint":case"mediumint":case"float":case"double":case"decimal":case"numeric":return"number";case"bigint":return"number | bigint";case"boolean":case"bool":return _e(n);case"json":case"jsonb":return"unknown";case"binary":case"blob":case"bytea":return"Uint8Array";case"unix":return"number";case"array":return"unknown[]";case"object":return"Record<string, unknown>";default:return Aa(e,n)}})();return e.nullable===!0?`${a} | null`:a}function va(e){let n={},t=e.belongsTo;if(!t)return n;let r=Array.isArray(t)?t:Object.values(t);for(let o of r){if(typeof o==="string"){n[`${E(o)}_id`]="number";continue}if(o&&typeof o==="object"){let a=o;if(typeof a.foreignKey==="string"){n[a.foreignKey]="number";continue}if(typeof a.model==="string")n[`${E(a.model)}_id`]="number"}}return n}function Ma(e,n){let[t,r]=[E(e),E(n)].sort();return`${t}_${r}`}function Oa(e,n){let t=e.default,r=typeof t==="string"?"string":typeof t==="number"?"number":typeof t==="boolean"?_e(n):t instanceof Date?"string":"unknown";return e.nullable?`${r} | null`:r}function Da(e,n,t){let r=n.belongsToMany;if(!r)return[];let o=[],a=Array.isArray(r)?r:Object.values(r);for(let i of a){let s,u,c,l,f={},d=!0;if(typeof i==="string")s=i;else if(i&&typeof i==="object"&&"model"in i){let h=i;if(s=h.model,"pivotTable"in h||"firstForeignKey"in h||"secondForeignKey"in h)u=h.pivotTable,c=h.firstForeignKey,l=h.secondForeignKey;else{let b=i;u=b.table,c=b.foreignKey,l=b.relatedKey,f=b.pivot?.columns??{},d=Boolean(b.pivot?.timestamps)}}else continue;let p=u??Ma(e,s),m=c??`${E(e)}_id`,g=l??`${E(s)}_id`,w={id:"number",[m]:"number",[g]:"number"};for(let[h,b]of Object.entries(f))w[h]=Oa(b,t);if(d)w.created_at="string",w.updated_at="string | null";o.push({table:p,columns:w})}return o}function Ea(e){return{email_verified_at:"string | null",password_changed_at:"string | null",two_factor_secret:"string | null",two_factor_enabled:`${_e(e)} | null`,two_factor_last_used_step:"number | null",stripe_id:"string | null"}}function ja(e,n){let t={id:"number"},r=e.traits??{};if(r.useUuid)t.uuid="string";if((r.useTimestamps??r.timestampable)!==!1)t.created_at="string",t.updated_at="string | null";if(r.useSoftDeletes??r.softDeletable)t.deleted_at="string | null";if((e.table??"")==="users"||e.name==="User")Object.assign(t,Ea(n));return t}function Fa(e,n){let t={},r=e.attributes??{};for(let[o,a]of Object.entries(r))t[E(o)]=Ca(a,n);return t}function Ln(e,n,t=2){let r=" ".repeat(t),o=" ".repeat(t+1),a=Object.entries(n).map(([s,u])=>`${o}${s}: ${u}`).join(`
|
|
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(`
|
|
8
8
|
`),i=/^[A-Z_a-z]\w*$/.test(e)?e:`'${e}'`;return`${r}${i}: {
|
|
9
9
|
${o}// columns
|
|
10
10
|
${a}
|
|
11
|
-
${r}}`}var
|
|
11
|
+
${r}}`}var Ia=`/* eslint-disable */
|
|
12
12
|
// AUTO-GENERATED by \`buddy generate:db-types\` \u2014 do not edit.
|
|
13
13
|
// Regenerate after adding/removing a model or changing its attributes.
|
|
14
14
|
// See stacksjs/stacks#1923.
|
|
15
15
|
|
|
16
16
|
declare module '@stacksjs/database' {
|
|
17
17
|
interface DatabaseSchema {
|
|
18
|
-
`,
|
|
18
|
+
`,Ba=` }
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export {}
|
|
22
|
-
`,
|
|
23
|
-
`;function qn(e){return e==="framework"?
|
|
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 qn(e){return e==="framework"?Na:Ia}function Gn(e){return e==="framework"?La:Ba}async function Un(e,n,t=[]){let r=[];if(!ne.existsSync(e))return r;let o=ne.readdirSync(e,{withFileTypes:!0});for(let a of o){let i=A.join(e,a.name);if(a.isDirectory()){if(n){let s=await Un(i,!0,t);r.push(...s)}continue}if(!a.name.endsWith(".ts"))continue;if(a.name.startsWith("_")||a.name.startsWith("index"))continue;try{let s=await(A.isAbsolute(i)?import(i):import(A.resolve(i))),u=s.default||s;if(u?.name&&(u.attributes||u.table))r.push({filePath:i,model:u})}catch(s){t.push({file:i,error:s.message})}}return r}async function 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 Un(m,g,a);i.push(...w)}catch(w){a.push({file:m,error:w.message})}let s=new Map;for(let m of i)s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);for(let m of i)if(m.filePath.startsWith(t))s.set(m.model.name??A.basename(m.filePath).replace(/\.ts$/,""),m);let u=[];for(let[m,{model:g}]of s){let w=g.table??`${E(m)}s`,h={...Fa(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)=>Ln(m.table,m.columns,f)).join(`
|
|
24
24
|
`),p=`${qn(l)}${d}
|
|
25
|
-
${Gn(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!ne.existsSync(m))ne.mkdirSync(m,{recursive:!0});ne.writeFileSync(o,p,"utf-8"),
|
|
25
|
+
${Gn(l)}`;if(!e.dryRun){let m=A.dirname(o);if(!ne.existsSync(m))ne.mkdirSync(m,{recursive:!0});ne.writeFileSync(o,p,"utf-8"),_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)=>Ln(r.table,r.columns,n==="framework"?1:2)).join(`
|
|
26
26
|
`);return`${qn(n)}${t}
|
|
27
|
-
${Gn(n)}`}import{isCursorPaginator as Tl,isPaginator as Rl,isSimplePaginator as Sl,toCursorPaginator as _l,toPaginator as Al,toSimplePaginator as Pl}from"@stacksjs/pagination";import{configureOrm as Ga}from"@stacksjs/query-builder";function Ua(){try{let e=process.env.DB_DATABASE_PATH||"database/stacks.sqlite";if((process.env.DB_CONNECTION||"sqlite")==="sqlite")Ga({database:e})}catch{}}Ua();async function Kn(e){for(let n=0;;n++){let t=await import(e);try{return t.default}catch(r){if(n<5&&r instanceof ReferenceError&&/before initialization/.test(r.message)){await new Promise((o)=>setTimeout(o,0));continue}throw r}}}async function Ae(e,n=[""]){let{path:t}=await import("@stacksjs/path"),r=t.userModelsPath(`${e}.ts`);try{if(await Bun.file(r).exists())return await Kn(r)}catch(o){console.error(`[orm] Failed to import userland model ${e} from ${r} - falling back to framework default. Reason:`,o)}for(let o of n){let a=o?`${o}/`:"",i=t.frameworkPath(`defaults/app/Models/${a}${e}.ts`);try{if(await Bun.file(i).exists())return await Kn(i)}catch(s){console.error(`[orm] Failed to import framework default model ${e} from ${i} - trying next subdir. Reason:`,s)}}return null}var j={},Wn=()=>{},Wc=new Promise((e)=>{Wn=e});function y(e){return new Proxy(function(){},{get(n,t){if(t==="then")return;let r=j[e];if(r==null)return;let o=r[t];return typeof o==="function"?o.bind(r):o},set(n,t,r){let o=j[e];if(o==null)return!1;return o[t]=r,!0},has(n,t){let r=j[e];return r==null?!1:(t in r)},apply(n,t,r){let o=j[e];if(o==null||typeof o!=="function")return;return o.apply(t,r)}})}var Ka=y("User"),Wa=y("Job"),Va=y("FailedJob"),Qa=[["Referral",[""],"auth"],["ReferralCode",[""],"auth"],["Team",[""],"auth"],["TeamInvitation",[""],"auth"],["TeamMember",[""],"auth"],["SocialAccount",[""],"auth"],["Subscriber",[""],"auth"],["SubscriberEmail",[""],"auth"],["Subscription",[""],"auth"],["Categorizable",["Content"],"cms"],["Post",["Content"],"cms"],["Page",["Content"],"cms"],["PageRevision",["Content"],"cms"],["Redirect",["Content"],"cms"],["Menu",["Content"],"cms"],["MenuItem",["Content"],"cms"],["Author",["Content"],"cms"],["Comment",[""],"cms"],["Tag",[""],"cms"],["Site",[""],"auth"],["SiteDomain",[""],"auth"],["MagicLinkToken",[""],"auth"],["SmsOptOut",[""],"auth"],["GdprRequest",[""],"auth"],["Form",["Forms"],"forms"],["FormField",["Forms"],"forms"],["FormSubmission",["Forms"],"forms"],["Activity",[""],"dashboard"],["Board",[""],"dashboard"],["BoardColumn",[""],"dashboard"],["Card",[""],"dashboard"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["PaymentWebhookEvent",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Ae("User");if(n)j.User=n;if(e("queue")){let t=await Ae("Job");if(t)j.Job=t;let r=await Ae("FailedJob");if(r)j.FailedJob=r}for(let[t,r,o]of Qa){if(!e(o))continue;let a=await Ae(t,r);if(a)j[t]=a}}catch(e){console.error("[orm] deferred model load failed:",e)}finally{Wn()}});var za=y("Activity"),Ha=y("AnalyticsEvent"),Ja=y("Automation"),Ya=y("AutomationRun"),Xa=y("Auction"),Za=y("CampaignVariant"),ei=y("CommunicationSuppression"),ti=y("ConsentEvent"),ni=y("SenderDomain"),ri=y("UsageEvent"),oi=y("AuctionItem"),ai=y("Author"),ii=y("Bid"),si=y("Board"),ui=y("BoardColumn"),ci=y("Campaign"),li=y("Card"),di=y("CardComment"),fi=y("Cart"),pi=y("CartItem"),mi=y("Category"),gi=y("Comment"),yi=y("Coupon"),wi=y("Customer"),bi=y("DeliveryRoute"),hi=y("DeliveryStop"),ki=y("Deployment"),Ti=y("DigitalDelivery"),Ri=y("Courier"),Si=y("CourierPing"),_i=y("CampaignSend"),Ai=y("EmailList"),Pi=y("EmailListSubscriber"),xi=y("Form"),Ci=y("FormField"),vi=y("FormSubmission"),Mi=y("MagicLinkToken"),Oi=y("Menu"),Di=y("MenuItem"),Ei=y("PageRevision"),ji=y("Pledge"),Fi=y("Redirect"),$i=y("Site"),Ii=y("SiteDomain"),Bi=y("SmsOptOut"),Ni=y("GdprRequest"),Vc=y("StorageItem"),Qc=y("StorageItemTask"),Li=y("EmailIdempotency"),qi=y("EmailSuppression"),Gi=y("EmailWebhookEvent"),Ui=y("Error"),Ki=y("GiftCard"),Wi=y("Label"),Vi=y("LicenseKey"),Qi=y("Log"),zi=y("LoyaltyPoint"),Hi=y("LoyaltyReward"),Ji=y("MailPreference"),Yi=y("Manufacturer"),Xi=y("Notification"),Zi=y("NotificationDelivery"),es=y("Order"),ts=y("OrderIdempotency"),zc=y("PersonalAccessToken"),ns=y("OrderItem"),rs=y("Page"),os=y("Payment"),as=y("PaymentWebhookEvent"),is=y("PaymentMethod"),ss=y("PaymentProduct"),us=y("PaymentTransaction"),cs=y("Post"),ls=y("Categorizable"),ds=y("PrintDevice"),fs=y("Product"),ps=y("ProductUnit"),ms=y("ProductVariant"),gs=y("QueryLog"),ys=y("Receipt"),Hc=y("Referral"),Jc=y("ReferralCode"),ws=y("Release"),bs=y("Request"),hs=y("Review"),ks=y("ShippingMethod"),Ts=y("ShippingRate"),Rs=y("ShippingZone"),Ss=y("SocialPost"),_s=y("SocialAccount"),As=y("Subscriber"),Ps=y("SubscriberEmail"),xs=y("Subscription"),Cs=y("Tag"),vs=y("TaxRate"),Ms=y("Team"),Os=y("TeamInvitation"),Ds=y("TeamMember"),Es=y("Transaction"),js=y("WaitlistProduct"),Fs=y("WaitlistRestaurant"),$s=y("Websocket"),Vn={User:Ka,Job:Wa,FailedJob:Va,Activity:za,AnalyticsEvent:Ha,Automation:Ja,AutomationRun:Ya,Auction:Xa,AuctionItem:oi,Author:ai,Bid:ii,Board:si,BoardColumn:ui,Campaign:ci,CampaignSend:_i,CampaignVariant:Za,Card:li,CardComment:di,Cart:fi,CartItem:pi,Categorizable:ls,Category:mi,Comment:gi,Coupon:yi,Customer:wi,CommunicationSuppression:ei,ConsentEvent:ti,DeliveryRoute:bi,DeliveryStop:hi,Deployment:ki,DigitalDelivery:Ti,Courier:Ri,CourierPing:Si,EmailList:Ai,EmailListSubscriber:Pi,EmailIdempotency:Li,EmailSuppression:qi,EmailWebhookEvent:Gi,ErrorModel:Ui,Form:xi,FormField:Ci,FormSubmission:vi,GdprRequest:Ni,GiftCard:Ki,Label:Wi,LicenseKey:Vi,Log:Qi,LoyaltyPoint:zi,LoyaltyReward:Hi,MailPreference:Ji,Manufacturer:Yi,Notification:Xi,MagicLinkToken:Mi,Menu:Oi,MenuItem:Di,NotificationDelivery:Zi,Order:es,OrderIdempotency:ts,OrderItem:ns,Page:rs,PageRevision:Ei,Payment:os,PaymentMethod:is,PaymentProduct:ss,PaymentTransaction:us,PaymentWebhookEvent:as,Pledge:ji,Post:cs,PrintDevice:ds,Product:fs,ProductUnit:ps,ProductVariant:ms,QueryLog:gs,Receipt:ys,Release:ws,Request:bs,Review:hs,ShippingMethod:ks,Redirect:Fi,SenderDomain:ni,ShippingRate:Ts,ShippingZone:Rs,Site:$i,SiteDomain:Ii,SmsOptOut:Bi,SocialAccount:_s,SocialPost:Ss,Subscriber:As,SubscriberEmail:Ps,Subscription:xs,Tag:Cs,TaxRate:vs,Team:Ms,TeamInvitation:Os,TeamMember:Ds,Transaction:Es,UsageEvent:ri,WaitlistProduct:js,WaitlistRestaurant:Fs,Websocket:$s},K=globalThis;for(let[e,n]of Object.entries(Vn))if(n&&K[e]===void 0)K[e]=n;var Yc=Object.keys(Vn);async function Is(e){if(!e)return[];try{if(typeof e.all==="function"){let n=await e.all();return Array.isArray(n)?n:[]}if(typeof e.get==="function"){let n=await e.get();return Array.isArray(n)?n:[]}}catch{}return[]}function Bs(e,n,t=""){if(!e)return t;try{if(typeof e.get==="function"){let o=e.get(n);if(o!==void 0&&o!==null)return o}}catch{}let r=e?.[n];return r!==void 0&&r!==null?r:t}if(K.safeAll===void 0)K.safeAll=Is;if(K.safeGet===void 0)K.safeGet=Bs;export{za as Activity,Ha as AnalyticsEvent,Xa as Auction,oi as AuctionItem,ai as Author,Ja as Automation,Ya as AutomationRun,le as BILLABLE_INSTANCE_METHODS,ii as Bid,si as Board,ui as BoardColumn,ci as Campaign,_i as CampaignSend,Za as CampaignVariant,li as Card,di as CardComment,fi as Cart,pi as CartItem,ls as Categorizable,mi as Category,gi as Comment,ei as CommunicationSuppression,ti as ConsentEvent,yi as Coupon,Ri as Courier,Si as CourierPing,wi as Customer,bi as DeliveryRoute,hi as DeliveryStop,ki as Deployment,Ti as DigitalDelivery,Li as EmailIdempotency,Ai as EmailList,Pi as EmailListSubscriber,qi as EmailSuppression,Gi as EmailWebhookEvent,Ui as ErrorModel,Va as FailedJob,xi as Form,Ci as FormField,vi as FormSubmission,me as GDPR_AUDIT_TABLE,D as GDPR_SUBJECT_MODEL,Ke as GdprDeclarationError,Ni as GdprRequest,ge as GdprSubjectNotFoundError,Ki as GiftCard,Wa as Job,Wi as Label,Vi as LicenseKey,Qi as Log,zi as LoyaltyPoint,Hi as LoyaltyReward,ft as MODEL_DEFINITION,Mi as MagicLinkToken,Ji as MailPreference,Yi as Manufacturer,lt as MassAssignmentException,Oi as Menu,Di as MenuItem,En as ModelNotFoundError,vn as ModelValidationError,Xi as Notification,Zi as NotificationDelivery,es as Order,ts as OrderIdempotency,ns as OrderItem,rs as Page,Ei as PageRevision,os as Payment,is as PaymentMethod,ss as PaymentProduct,us as PaymentTransaction,as as PaymentWebhookEvent,zc as PersonalAccessToken,ji as Pledge,cs as Post,ds as PrintDevice,fs as Product,ps as ProductUnit,ms as ProductVariant,gs as QueryLog,ys as Receipt,Fi as Redirect,Hc as Referral,Jc as ReferralCode,ws as Release,bs as Request,hs as Review,ni as SenderDomain,ks as ShippingMethod,Ts as ShippingRate,Rs as ShippingZone,$i as Site,Ii as SiteDomain,Bi as SmsOptOut,_s as SocialAccount,Ss as SocialPost,Vc as StorageItem,Qc as StorageItemTask,Kr as SubqueryBuilder,As as Subscriber,Ps as SubscriberEmail,xs as Subscription,Be as SubscriptionNotOwnedError,Cs as Tag,vs as TaxRate,Ms as Team,Os as TeamInvitation,Ds as TeamMember,Es as Transaction,ri as UsageEvent,Ka as User,js as WaitlistProduct,Fs as WaitlistRestaurant,$s as Websocket,pe as assertGdprPlan,Cu as batchLoad,La as buildDatabaseSchema,wo as buildProcessingRegister,Me as collectEncryptedAttributes,Tt as createAuditMethods,$e as createCategorizableMethods,Ee as createCommentableMethods,Ie as createLikeableMethods,Fe as createTaggableMethods,$r as customerOwnership,Du as db,ve as decryptValue,$n as defineModel,Ce as encryptValue,ot as enrichPaginatorUrls,po as eraseSubject,lo as exportSubjectData,Dc as extendModel,Tr as filterFillable,we as gdprTableExists,qt as gdprTableName,Us as getPrunableConfig,kr as getWritableFields,yr as isBillable,Tl as isCursorPaginator,V as isEncrypted,Rl as isPaginator,Sl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,br as mapWriteError,Gs as massPrunable,ma as mergeModelDefinition,Yc as modelGlobalNames,Wc as ormReady,Lr as parentOwnership,en as parseCursor,dt as projectDocumentsFromTrait,zn as prunable,go as pruneRetainedData,qa as renderDatabaseTypeFile,bo as renderProcessingRegister,rt as resolveCursorArgs,fe as resolveGdprPlan,io as resolveGdprSubject,nt as resolvePageArgs,Fu as savepoint,Ir as selfOwnership,nr as setAuditUser,Br as siteOwnership,Nr as teamMembershipOwnership,ua as toAttrs,_l as toCursorPaginator,Al as toPaginator,Pl as toSimplePaginator,hr as toSnakeCaseKeys,Ue as transaction,$u as transactional,I as withoutEvents,Io as withoutValidation};
|
|
27
|
+
${Gn(n)}`}import{isCursorPaginator as _l,isPaginator as Al,isSimplePaginator as Pl,toCursorPaginator as xl,toPaginator as Cl,toSimplePaginator as Ml}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"],["CardComment",[""],"dashboard"],["Deployment",[""],"dashboard"],["Label",[""],"dashboard"],["Release",[""],"dashboard"],["Notification",[""],"dashboard"],["NotificationDelivery",[""],"dashboard"],["PersonalAccessToken",[""],"dashboard"],["MailPreference",[""],"dashboard"],["Log",[""],"dashboard"],["Request",[""],"dashboard"],["AnalyticsEvent",[""],"dashboard"],["QueryLog",[""],"dashboard"],["StorageItem",[""],"dashboard"],["StorageItemTask",[""],"dashboard"],["Error",[""],"monitoring"],["Websocket",["realtime"],"realtime"],["Campaign",[""],"marketing"],["CampaignSend",[""],"marketing"],["EmailList",[""],"marketing"],["EmailListSubscriber",[""],"marketing"],["EmailIdempotency",[""],"marketing"],["EmailSuppression",[""],"marketing"],["EmailWebhookEvent",[""],"marketing"],["SocialPost",[""],"marketing"],["Automation",[""],"marketing"],["AutomationRun",[""],"marketing"],["CampaignVariant",[""],"marketing"],["CommunicationSuppression",[""],"marketing"],["ConsentEvent",[""],"marketing"],["SenderDomain",[""],"marketing"],["UsageEvent",[""],"marketing"],["PaymentMethod",[""],"commerce"],["PaymentProduct",[""],"commerce"],["PaymentTransaction",[""],"commerce"],["Order",["commerce"],"commerce"],["OrderIdempotency",["commerce"],"commerce"],["OrderItem",["commerce"],"commerce"],["Cart",["commerce"],"commerce"],["CartItem",["commerce"],"commerce"],["Customer",["commerce"],"commerce"],["Product",["commerce"],"commerce"],["ProductVariant",["commerce"],"commerce"],["ProductUnit",["commerce"],"commerce"],["Manufacturer",["commerce"],"commerce"],["Category",["commerce"],"commerce"],["Coupon",["commerce"],"commerce"],["GiftCard",["commerce"],"commerce"],["LicenseKey",["commerce"],"commerce"],["Review",["commerce"],"commerce"],["Receipt",["commerce"],"commerce"],["PrintDevice",["commerce"],"commerce"],["ShippingMethod",["commerce"],"commerce"],["ShippingRate",["commerce"],"commerce"],["ShippingZone",["commerce"],"commerce"],["DeliveryRoute",["commerce"],"commerce"],["DeliveryStop",["commerce"],"commerce"],["DigitalDelivery",["commerce"],"commerce"],["Courier",["commerce"],"commerce"],["CourierPing",["commerce"],"commerce"],["TaxRate",["commerce"],"commerce"],["WaitlistProduct",["commerce"],"commerce"],["WaitlistRestaurant",["commerce"],"commerce"],["Auction",["commerce"],"commerce"],["AuctionItem",["commerce"],"commerce"],["Bid",["commerce"],"commerce"],["Pledge",["commerce"],"commerce"],["LoyaltyPoint",["commerce"],"commerce"],["LoyaltyReward",["commerce"],"commerce"],["Payment",["commerce"],"commerce"],["PaymentWebhookEvent",["commerce"],"commerce"],["Transaction",["commerce"],"commerce"]];queueMicrotask(async()=>{try{let{feature:e}=await import("@stacksjs/config"),n=await Ae("User");if(n)j.User=n;if(e("queue")){let t=await Ae("Job");if(t)j.Job=t;let r=await Ae("FailedJob");if(r)j.FailedJob=r}for(let[t,r,o]of 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"),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"),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"),Hc=y("StorageItem"),Jc=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"),Yc=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"),Xc=y("Referral"),Zc=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 el=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,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,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,Yc 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,Xc as Referral,Zc 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,Hc as StorageItem,Jc 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,_l as isCursorPaginator,V as isEncrypted,Al as isPaginator,Pl as isSimplePaginator,jr as isUniqueViolation,We as loadGdprModels,br as mapWriteError,Us as massPrunable,ga as mergeModelDefinition,el 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,xl as toCursorPaginator,Cl as toPaginator,Ml as toSimplePaginator,hr as toSnakeCaseKeys,Ue as transaction,Iu as transactional,I as withoutEvents,Bo as withoutValidation};
|
package/dist/model-registry.d.ts
CHANGED
|
@@ -1,7 +1,74 @@
|
|
|
1
|
+
import type { ModelApiSelection } from '@stacksjs/types';
|
|
2
|
+
/**
|
|
3
|
+
* Which models publish the REST API their `useApi` trait describes
|
|
4
|
+
* ({@link ModelApiSelection}).
|
|
5
|
+
*
|
|
6
|
+
* Every `useApi` model used to, the framework's ~80 defaults included, and an
|
|
7
|
+
* app had no way to say otherwise. A forge whose central object is a code
|
|
8
|
+
* review served the framework's product reviews at `/api/reviews`, and
|
|
9
|
+
* `/api/comments`, `/api/labels` and `/api/tags` beside it - over tables it
|
|
10
|
+
* never migrated, so they were discoverable, in the OpenAPI document, and
|
|
11
|
+
* failed at runtime rather than 404ing (stacksjs/stacks#2866).
|
|
12
|
+
*
|
|
13
|
+
* - `'all'` - every `useApi` model, app and framework. The default, so an app
|
|
14
|
+
* that says nothing keeps the surface it had.
|
|
15
|
+
* - `'own'` - only the app's own models (`app/Models`, overrides included).
|
|
16
|
+
* - `'none'` - no generated model APIs at all.
|
|
17
|
+
* - a list of model names - exactly those. `'own'` may appear in it to mean
|
|
18
|
+
* "mine, plus these defaults".
|
|
19
|
+
*
|
|
20
|
+
* A model listed here still needs its own `useApi` trait: this narrows the
|
|
21
|
+
* set, it never adds an API to a model that did not ask for one.
|
|
22
|
+
*/
|
|
23
|
+
export type { ModelApiSelection };
|
|
1
24
|
export declare function modelFiles(root: string): string[];
|
|
25
|
+
/** {@link loadModelRegistry}, plus which root each model was loaded from. */
|
|
26
|
+
export declare function loadModelRegistryWithOrigins(options: ModelRegistryOptions): Promise<LoadedModelRegistry>;
|
|
2
27
|
export declare function loadModelRegistry(options: ModelRegistryOptions): Promise<Record<string, any>>;
|
|
28
|
+
/**
|
|
29
|
+
* Read the selection from `security.api.models`, with `STACKS_MODEL_APIS`
|
|
30
|
+
* overriding it - the same config-then-env pairing as `api.rowScoping` and
|
|
31
|
+
* `STACKS_API_ROW_SCOPING`.
|
|
32
|
+
*
|
|
33
|
+
* The env var takes a comma-separated list in the spellings
|
|
34
|
+
* `STACKS_DEFAULT_ROUTES` uses: `none` (or empty) for nothing, `all` for
|
|
35
|
+
* everything, otherwise names. `none` beats `all`, which beats a list, so a
|
|
36
|
+
* value can never mean something wider than its most restrictive keyword.
|
|
37
|
+
*
|
|
38
|
+
* Anything that is not a string or an array of strings - a typo'd type in
|
|
39
|
+
* the config - is treated as unset, which is `all`: the setting narrows a
|
|
40
|
+
* surface, and an unreadable one should leave the surface as it was rather
|
|
41
|
+
* than silently take an app's API down.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveModelApiSelection(configured: unknown, envOverride?: string | null): ResolvedModelApiSelection;
|
|
44
|
+
/**
|
|
45
|
+
* The `useApi` models a selection publishes, and the names in it that match
|
|
46
|
+
* no `useApi` model.
|
|
47
|
+
*
|
|
48
|
+
* Names match case-insensitively against the model name (`Product`), so
|
|
49
|
+
* `STACKS_MODEL_APIS=product` works. An unmatched name is reported rather than
|
|
50
|
+
* fatal - a typo costs the one API, not the boot - and that includes naming a
|
|
51
|
+
* model that exists but has no `useApi` trait, since the selection cannot
|
|
52
|
+
* give it one.
|
|
53
|
+
*/
|
|
54
|
+
export declare function selectApiModels(registry: LoadedModelRegistry, selection: ResolvedModelApiSelection): { models: Record<string, any>, unmatched: string[] };
|
|
3
55
|
export declare interface ModelRegistryOptions {
|
|
4
56
|
userRoot: string
|
|
5
57
|
defaultsRoot: string
|
|
6
58
|
onImportError?: (file: string, error: unknown) => void
|
|
7
59
|
}
|
|
60
|
+
export declare interface LoadedModelRegistry {
|
|
61
|
+
models: Record<string, any>
|
|
62
|
+
origins: Record<string, ModelOrigin>
|
|
63
|
+
}
|
|
64
|
+
export declare interface ResolvedModelApiSelection {
|
|
65
|
+
all: boolean
|
|
66
|
+
own: boolean
|
|
67
|
+
names: Set<string>
|
|
68
|
+
source: 'env' | 'config' | 'default'
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Where a registered model came from. An app model that overrides a framework
|
|
72
|
+
* default by name is the app's: it replaced the default, so the app wrote it.
|
|
73
|
+
*/
|
|
74
|
+
export type ModelOrigin = 'app' | 'default';
|
package/dist/model-registry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var f=(e,o,n)=>()=>{if(e)try{o=e(e=0)}catch(i){n=[i]}if(n)throw n[0];return o};var R=import.meta.require;import{readdirSync as m}from"fs";import{basename as p,extname as c,join as u}from"path";function g(e){let o=[],n=(i)=>{let t;try{t=m(i,{withFileTypes:!0})}catch{return}for(let r of t){let s=u(i,r.name);if(r.isDirectory()){n(s);continue}if(![".ts",".js"].includes(c(r.name)))continue;if(r.name.startsWith(".")||r.name.startsWith("index"))continue;o.push(s)}};return n(e),o.sort()}async function d(e,o,n,i){for(let t of g(e))try{let r=c(t),s=await import(`${t}?t=${Date.now()}`),l=s.default??s,a=l.name??p(t,r);n.models[a]={...l,name:a},n.origins[a]=o}catch(r){i?.(t,r)}}async function y(e){let o={models:{},origins:{}};return await d(e.defaultsRoot,"default",o,e.onImportError),await d(e.userRoot,"app",o,e.onImportError),o}async function x(e){return(await y(e)).models}function A(e,o){let n,i="default";if(o!==void 0&&o!==null)n=o.split(","),i="env";else if(typeof e==="string")n=[e],i="config";else if(Array.isArray(e)&&e.every((r)=>typeof r==="string"))n=e,i="config";if(n===void 0)return{all:!0,own:!1,names:new Set,source:i};let t=n.map((r)=>r.trim().toLowerCase()).filter(Boolean);if(t.length===0||t.includes("none"))return{all:!1,own:!1,names:new Set,source:i};if(t.includes("all"))return{all:!0,own:!1,names:new Set,source:i};return{all:!1,own:t.includes("own"),names:new Set(t.filter((r)=>r!=="own")),source:i}}function v(e,o){let n={},i=new Set;for(let[t,r]of Object.entries(e.models)){if(!r?.traits?.useApi)continue;let s=t.toLowerCase(),l=o.names.has(s);if(l)i.add(s);if(o.all||l||o.own&&e.origins[t]==="app")n[t]=r}return{models:n,unmatched:[...o.names].filter((t)=>!i.has(t)).sort()}}var w=()=>{};w();export{x as loadModelRegistry,y as loadModelRegistryWithOrigins,g as modelFiles,A as resolveModelApiSelection,v as selectApiModels};
|
package/dist/routes.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var st=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Pt=import.meta.require;import{readdirSync as ht}from"fs";import{basename as bt,extname as Le,join as Rt}from"path";function kt(e){let t=[],n=(r)=>{let o;try{o=ht(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=Rt(r,s.name);if(s.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Le(s.name)))continue;if(s.name.startsWith(".")||s.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function Qe(e,t,n){for(let r of kt(e))try{let o=Le(r),s=await import(`${r}?t=${Date.now()}`),i=s.default??s,c=i.name??bt(r,o);t[c]={...i,name:c}}catch(o){n?.(r,o)}}async function Ve(e){let t={};return await Qe(e.defaultsRoot,t,e.onImportError),await Qe(e.userRoot,t,e.onImportError),t}var He=()=>{};import _t from"process";import{parseBearerToken as St,route as B}from"@stacksjs/router";import{env as F}from"@stacksjs/env";import{projectPath as Se,storagePath as xt}from"@stacksjs/path";import{createQueryBuilder as vt,defaultConfig as qe,setConfig as ze}from"@stacksjs/query-builder";import{HttpError as L}from"@stacksjs/error-handling";import{log as z}from"@stacksjs/logging/runtime";import{isUniqueViolation as jt}from"@stacksjs/error-handling";import{isUniqueViolation as it}from"@stacksjs/error-handling";function ce(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(it(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function _(e){let t=!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)t=!0}if(!t)return e;let n="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){n+=e[r];continue}let s=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,c=s>=97&&s<=122||s>=48&&s<=57,f=s>=65&&s<=90&&i>=97&&i<=122;if(r>0&&(c||f))n+="_";n+=String.fromCharCode(o+32)}return n}function de(e){let t={};for(let[n,r]of Object.entries(e))t[_(n)]=r;return t}function Pe(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ce(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function $e(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function Ie(e){return e?.ownership===!1}function Ne(e,t,n){let r=Object.keys(e).find((s)=>_(s)===_(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((s)=>String(s)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let s of Object.keys(o))if(_(s)===_(t))delete o[s];return o[t]=n,{data:o}}function Me(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=_(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((s)=>`${s[0]?.toUpperCase()}${s.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function fe(e,t){if(!e||t.length===0)return{};let n={},r;for(let o of t){if(o in e){n[o]=e[o];continue}r??=ut(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function at(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),s=Number(n[3]),i=new Date(Date.UTC(r,o-1,s));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==s)return t;return i}var ve=new WeakMap,Oe=new WeakMap;function ge(e){let t=ve.get(e);if(t&&t.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(t[o]?.field!==e[o]){r=!1;break}if(r)return t}let n=e.map((r)=>({field:r,snake:_(r)}));return ve.set(e,n),n}function ut(e){let t=ge(e),n=Oe.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:s})=>[o,s]));return Oe.set(t,r),r}function pe(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}function G(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}var lt=["id","uuid","created_at","updated_at","deleted_at"];function je(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...lt]){let o=_(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(_(r));return n}function Ee(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let s=o.trim();if(!s)continue;let i=s.startsWith("-"),c=i?s.slice(1):s;if(!/^\w+$/.test(c))continue;let f=n.get(c);if(!f)continue;r=r.orderBy(f,i?"desc":"asc")}return r}var ct={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"?ft(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"?gt(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Ae=new WeakMap;function dt(e,t){let n=Ae.get(e);if(n&&n.length===t.length){let o=!0;for(let s=0;s<t.length;s++){let i=t[s];if(n[s]?.attr!==i||n[s]?.definition!==e[i]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let s=e[o],i=typeof s==="string"?ct[s]:s;r.push({attr:o,snake:_(o),definition:s,caster:i})}return Ae.set(e,r),r}function ft(e){try{return JSON.parse(e)}catch{return e}}function gt(e){try{return JSON.parse(e)}catch{return[]}}function ye(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=dt(t,r);if(o.length===0)return e;let s={...e};for(let{attr:i,caster:c,snake:f}of o){if(!c)continue;let u=c[n];if(typeof u!=="function")continue;if(Object.prototype.hasOwnProperty.call(s,i))s[i]=u.call(c,s[i]);if(f!==i&&Object.prototype.hasOwnProperty.call(s,f))s[f]=u.call(c,s[f])}return s}var Te=new WeakMap;function pt(e){let t=Te.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let s=o?.validation?.rule;if(!s||typeof s.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:s})}return Te.set(e,n),n}function It(e){let t=e?.attributes;if(!t||typeof t!=="object")return!1;for(let n of Object.values(t)){let r=n?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function me(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=pt(r);if(o.length===0)return{valid:!0};let s={},i=!1;for(let c of o){let{definition:f,field:u,hasDefault:T,rule:C}=c,I=Object.prototype.hasOwnProperty.call(e,u);if(!I&&n==="updating")continue;let J=I?e[u]:T?f.default:void 0,W=at(C,J),N=C.validate(W);if(!N?.valid&&Array.isArray(N?.errors)&&N.errors.length>0)i=!0,s[u]=N.errors.map((P)=>f.validation?.message?.[P?.code]??P?.message??"invalid")}return i?{valid:!1,errors:s}:{valid:!0}}function we(e,t){return`${e}\x00${yt(t)}`}function Fe(e){let t=new Map;for(let n of e){let r=we(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function yt(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function le(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Ue(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?le(o.read):["auth"],write:"write"in o?le(o.write):["auth"],declared:!0}}let r=le(n);return{read:r,write:r,declared:!0}}var De=15,mt=100;function Be(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(De),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):De,mt);return{page:n,perPage:o,offset:(n-1)*o}}function se(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function wt(e,t,n,r,o,s){let i=(t-1)*n,c=r===0,f={page:t,per_page:n,from:c?null:i+1,to:c?null:i+r,has_more_pages:o,prev_page_url:t>1?se(e,t-1):null,next_page_url:o?se(e,t+1):null};if(s!==void 0&&!Number.isNaN(s)){let u=Math.max(1,Math.ceil(s/n));f.total=s,f.last_page=u,f.first_page_url=se(e,1),f.last_page_url=se(e,u)}return f}function he(e,t,n,r,o,s){let{page:i,...c}=wt(e,t,n,r,o,s);return{current_page:i,...c}}function be(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function We(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}He();function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ce(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:s}=await import("@stacksjs/auth");return s(Re(o))}};let n=$e(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Re(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let s of r.split(";")){let i=s.indexOf("=");if(i===-1)continue;if(s.slice(0,i).trim()===o)return decodeURIComponent(s.slice(i+1).trim())}return null}}}}function Wt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function Qt(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Lt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),s=await r(Re(n));if(s==null)return[];return(await o.where("team_id",s).get()??[]).map((c)=>c.id).filter((c)=>c!=null)}catch{return[]}}}}function Vt(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Re(n))}catch{return null}}}}function Ht(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),s=o.models?.[e]??o[e]?.definition??null,i=ie(s);if(!i?.field||typeof i.resolve!=="function")return[];let c=await i.resolve(n,r);if(c==null||Array.isArray(c)&&c.length===0)return[];let f=o[e];if(!f)return[];return((Array.isArray(c)?await f.whereIn(i.field,c).get():await f.where(i.field,c).get())??[]).map((T)=>T.id).filter((T)=>T!=null)}catch{return[]}}}}var Ot=Se("config/qb.ts");try{let e=(await import(Ot)).default;ze(e??qe)}catch{z.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=F.DB_CONNECTION||"sqlite",t=e==="turso"||e==="libsql",n=t?"sqlite":e;ze({...qe,dialect:n,database:t?{database:F.TURSO_DATABASE_URL||"",url:F.TURSO_DATABASE_URL||"",authToken:F.TURSO_AUTH_TOKEN||void 0}:n==="sqlite"?{database:F.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:F.DB_DATABASE||"stacks",host:F.DB_HOST||"127.0.0.1",port:F.DB_PORT||(n==="postgres"?5432:3306),username:F.DB_USERNAME||(n==="postgres"?"postgres":"root"),password:F.DB_PASSWORD||""}})}var ke=await Ve({defaultsRoot:xt("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>z.warn(`[orm] Could not load model ${e}: ${t.message}`)}),At=vt(),A=At,Je=Fe(B.routes);function q(e,t){let n=we(e,t),r=Je.get(n);if(!r)return Je.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return z.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function et(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Ke(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function Ge(e,t,n,r){if(!e.length)return e;let o=n.split(",").map((u)=>u.trim()).filter(Boolean);if(!o.length)return e;let s=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],c=Array.isArray(t.hasOne)?t.hasOne:[],f=new Map;for(let u of s)f.set(_(u),{kind:"belongsTo",modelName:u});for(let u of c)f.set(_(u),{kind:"hasOne",modelName:u});for(let u of i)f.set(Ke(_(u)),{kind:"hasMany",modelName:u});for(let u of o){let T=f.get(u);if(!T)continue;let C=r[T.modelName];if(!C)continue;let I=C.table||Ke(_(T.modelName)),J=et(C),W=(N)=>G(ne(N,C),J);if(T.kind==="belongsTo"||T.kind==="hasOne"){let N=`${_(T.modelName)}_id`,P=[...new Set(e.map((S)=>S[N]).filter((S)=>S!=null))];if(!P.length){for(let S of e)S[u]=null;continue}let K=await A.selectFrom(I).whereIn("id",P).get(),V=new Map;for(let S of K??[])V.set(String(S.id),W(S));for(let S of e)S[u]=V.get(String(S[N]))??null}else{let N=String(t.name??""),P=`${_(N)}_id`,K=[...new Set(e.map((O)=>O.id).filter((O)=>O!=null))];if(!K.length){for(let O of e)O[u]=[];continue}let V=await A.selectFrom(I).whereIn(P,K).get(),S=new Map;for(let O of V??[]){let j=String(O[P]),Z=S.get(j)??[];Z.push(W(O)),S.set(j,Z)}for(let O of e)O[u]=S.get(String(O.id))??[]}}return e}async function Xe(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[o,s]of Object.entries(n)){if(typeof s!=="function"||!(o in r))continue;try{r[o]=await s(r)}catch{}}return r}function Ye(e,t){return ye(e,t?.casts,"set")}function ne(e,t){return ye(e,t?.casts,"get")}function d(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function _e(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new L(413,`Request body exceeds ${ae}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ae)throw new L(413,`Request body exceeds ${ae}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof L)throw n;throw new L(400,`Invalid JSON body: ${n.message}`)}}function ue(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function Tt(e){let t=e.bearerToken;if(typeof t==="function"){let n=t.call(e);if(n)return n}return St(e.headers?.get?.("authorization")??null)}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=Tt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),o=await r.getUserFromToken(n);if(o)e._authenticatedUser=o;return o||null}catch{return null}}function te(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Y(e,t,n){let r=ie(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let o=typeof r.bypass==="function"?!!r.bypass(t,n):!1,s=null;try{s=await r.resolve(t,n)}catch{s=null}return{enforced:!0,value:s,field:String(r.field),bypass:o}}async function Ze(e,t,n,r){let o=e?.authedFill?.[t];if(!o)return{};if(typeof o==="function")try{let s=await o(n,r);return s&&typeof s==="object"?s:{}}catch{return{}}if(typeof o==="object"){let s={};for(let[i,c]of Object.entries(o))try{s[i]=typeof c==="function"?await c(n,r):c}catch{}return s}return{}}var tt=await(async()=>{let e=_t.env.STACKS_API_ROW_SCOPING;try{let t=(await import(Se("config/security.ts"))).default;return be(t?.api?.rowScoping,e)}catch{return be(void 0,e)}})(),nt=[];for(let[e,t]of Object.entries(ke)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},o=r.uri||t.table||e.toLowerCase()+"s",s=r.routes||["index","show","store","update","destroy"],i=t.table||o,c=Me(t),f=et(t),u=Pe(o,r.prefix),T=je(t.attributes,f),{read:C,write:I,declared:J}=Ue(n),W=["store","update","destroy"].some((y)=>s.includes(y));if(W&&J&&I.length===0)z.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${u} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((y)=>s.includes(y))&&J&&C.length===0)z.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let P=!!ie(t),K=P&&!C.includes("auth")?["auth",...C]:C,V=Ie(t),S=W&&!P&&!V;if(S)nt.push(e);if(W&&V)z.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let O=S&&tt==="deny",j=(y,a=K)=>{let l=y;for(let g of a)if(l&&typeof l.middleware==="function")l=l.middleware(g);return l};if(s.includes("index")&&!q("GET",u))j(B.get(u,async(y)=>{try{let a=new URL(y.url),{page:l,perPage:g,offset:h}=Be(a.searchParams),w=a.searchParams.get("sort"),p=A.selectFrom(i);p=Ee(p,w,T);let M=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,v]of a.searchParams.entries()){if(M.has(x)||!v)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let H=T.get(x);if(H)p=p.where(H,"=",v)}let R=a.searchParams.get("search");if(R&&c.length>0){let x=c.slice(0,5);p=p.where((v)=>{for(let H of x)v=v.orWhere(_(H),"like",`%${R}%`);return v})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((v)=>v.trim()).filter((v)=>/^[a-z_][a-z0-9_]*$/i.test(v)).map((v)=>_(v));if(x.length>0)p=p.select(x)}let D=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",E=a.searchParams.get("onlyTrashed")==="true";if(D&&!b)p=E?p.whereNotNull("deleted_at"):p.whereNull("deleted_at");let m=P?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(m.enforced&&!m.bypass){if(m.value==null||Array.isArray(m.value)&&m.value.length===0){let x=he(a,l,g,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}p=Array.isArray(m.value)?p.where(m.field,"in",m.value):p.where(m.field,"=",m.value)}let U=await p.limit(g+1).offset(h).get()||[],Q=U.length>g,re=(Q?U.slice(0,g):U).map((x)=>G(ne(x,t),f)),xe=a.searchParams.get("include");if(xe)re=await Ge(re,t,xe,ke);let rt=a.searchParams.get("with_count")==="true",ee;if(rt)try{let x=A.selectFrom(i);if(m.enforced&&!m.bypass&&m.value!=null)x=Array.isArray(m.value)?x.where(m.field,"in",m.value):x.where(m.field,"=",m.value);let v=await x.count(),H=typeof v==="number"?v:Number(v?.count??v);if(Number.isFinite(H))ee=H}catch{}let oe={"Content-Type":"application/json"};if(ee!==void 0&&!Number.isNaN(ee))oe["X-Total-Count"]=String(ee);oe["Cache-Control"]=m.enforced&&!m.bypass?"private, no-store":"public, max-age=15, must-revalidate",oe.Vary="Authorization";let ot=he(a,l,g,re.length,Q,ee);return new Response(JSON.stringify({data:re,...ot}),{status:200,headers:oe})}catch(a){if(a instanceof L){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to fetch ${o}`,detail:String(a)},500)}}));if(s.includes("show")&&!q("GET",`${u}/{id}`))j(B.get(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let l=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!l)return d({error:`${e} not found`},404);let g=new URL(y.url);if(t.traits?.useSoftDeletes&&l.deleted_at&&g.searchParams.get("withTrashed")!=="true")return d({error:`${e} not found`},404);let h=P?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!te(l[h.field],h.value))return d({error:`${e} not found`},404)}let w=G(ne(l,t),f),p=g.searchParams.get("include");if(p){let[b]=await Ge([w],t,p,ke);w=b}let M=w?.updated_at||w?.created_at,R=M?`W/"${w.id}-${String(M)}"`:void 0,k=y.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let D={"Content-Type":"application/json"};if(R)D.ETag=R;return D["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",D.Vary="Authorization",new Response(JSON.stringify({data:w}),{status:200,headers:D})}catch(a){if(a instanceof L){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!O&&s.includes("store")&&!q("POST",u))j(B.post(u,async(y)=>{try{let a=await _e(y),l=pe(a,f),g=fe(l,c),h=await X(y);if(h){let b=await Ze(t,"creating",h,y);for(let[E,m]of Object.entries(b))if(m!==void 0&&m!==null&&g[E]===void 0)g[E]=m}let w=await Y(t,h,y);if(w.enforced&&!w.bypass){if(!h)return d({error:"Auth required"},401);let b=Ne(g,w.field,w.value);if(b.error)return d({error:b.error},403);g=b.data}if(Object.keys(g).length===0)return d({error:"No fillable fields provided"},422);let p=me(g,t,"creating");if(!p.valid)return d({success:!1,message:"Validation failed",errors:p.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();g.created_at=b,g.updated_at=b}let M=await Xe(g,t),R=de(Ye(M,t)),k=await A.insertInto(i).values(R).execute(),D=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let E=await A.selectFrom(i).where({id:b}).executeTakeFirst();if(E)D=E}}catch{}return d({data:G(ne(D,t),f)},201)}catch(a){let{status:l,body:g}=ce(a,e,"create");return d(g,l)}}),I);if(!O&&s.includes("update")){let y=async(a)=>{try{let l=ue(a.params?.id);if(l==null)return d({error:"Invalid ID parameter"},400);let g=await _e(a),h=pe(g,f),w=fe(h,c),p=await X(a);if(p){let m=await Ze(t,"updating",p,a);for(let[U,Q]of Object.entries(m))if(Q!==void 0&&Q!==null&&w[U]===void 0)w[U]=Q}if(Object.keys(w).length===0)return d({error:"No fillable fields provided"},422);let M=me(w,t,"updating");if(!M.valid)return d({success:!1,message:"Validation failed",errors:M.errors},422);let R=await A.selectFrom(i).where({id:l}).executeTakeFirst();if(!R)return d({error:`${e} not found`},404);let k=await Y(t,p,a);if(k.enforced&&!k.bypass){if(!p)return d({error:"Auth required"},401);let m=R[k.field];if(!te(m,k.value))return d({error:`Not your ${e}`},403);let U=Object.keys(w).find((Q)=>_(Q)===_(k.field));if(U!==void 0&&!te(w[U],k.value))return d({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)w.updated_at=new Date().toISOString();let D=await Xe(w,t),b=de(Ye(D,t));await A.updateTable(i).set(b).where({id:l}).execute();let E={...R,...b};try{let m=await A.selectFrom(i).where({id:l}).executeTakeFirst();if(m)E=m}catch{}return d({data:G(ne(E,t),f)})}catch(l){let{status:g,body:h}=ce(l,e,"update");return d(h,g)}};if(!q("PUT",`${u}/{id}`))j(B.put(`${u}/{id}`,y),I);if(!q("PATCH",`${u}/{id}`))j(B.patch(`${u}/{id}`,y),I)}let Z=!!t.traits?.useSoftDeletes;if(!O&&s.includes("destroy")&&!q("DELETE",`${u}/{id}`))j(B.delete(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return d({error:"Invalid ID parameter"},400);let l=await A.selectFrom(i).where({id:a}).executeTakeFirst();if(!l)return d({error:`${e} not found`},404);let g=await X(y),h=await Y(t,g,y);if(h.enforced&&!h.bypass){if(!g)return d({error:"Auth required"},401);let w=l[h.field];if(!te(w,h.value))return d({error:`Not your ${e}`},403)}if(Z){let w=new Date().toISOString();await A.updateTable(i).set({deleted_at:w,updated_at:w}).where({id:a}).execute()}else await A.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof L){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to delete ${e}`,detail:String(a)},500)}}),I);if(!O&&s.includes("destroy")&&!q("POST",`${u}/bulk-delete`))j(B.post(`${u}/bulk-delete`,async(y)=>{try{let l=(await _e(y))?.ids;if(!Array.isArray(l)||l.length===0)return d({error:"An array of IDs is required"},422);if(l.length>100)return d({error:"Cannot delete more than 100 records at once"},422);let g=[],h=[];for(let R of l){let k=ue(R);if(k!=null)g.push(k);else h.push(R)}if(h.length>0)return d({error:"Invalid IDs in batch",invalid:h},422);let w=await X(y),p=await Y(t,w,y);if(p.enforced&&!p.bypass){if(!w)return d({error:"Auth required"},401);if(p.value==null)return d({error:"Caller has no ownership identity"},403);let R=await A.selectFrom(i).select(["id",p.field]).execute(),k=new Set(R.filter((b)=>te(b[p.field],p.value)).map((b)=>String(b.id))),D=g.filter((b)=>!k.has(String(b)));if(D.length>0)return d({error:`Cannot delete ${e} you don't own`,ids:D},403)}let M=new Date().toISOString();for(let R of g)if(Z)await A.updateTable(i).set({deleted_at:M,updated_at:M}).where({id:R}).execute();else await A.deleteFrom(i).where({id:R}).execute();return d({message:`Successfully deleted ${g.length} ${o}`})}catch(a){if(a instanceof L){let l={error:a.message};if(a.details!==void 0)l.details=a.details;return d(l,a.status||400)}return d({error:`Failed to bulk delete ${o}`,detail:String(a)},500)}}),I)}{let e=We(nt,tt);if(e)z.warn(e)}var on=B;export{on as default};
|
|
2
|
+
var ct=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Nt=import.meta.require;import{readdirSync as _t}from"fs";import{basename as xt,extname as Qe,join as At}from"path";function Ot(e){let t=[],n=(r)=>{let o;try{o=_t(r,{withFileTypes:!0})}catch{return}for(let s of o){let i=At(r,s.name);if(s.isDirectory()){n(i);continue}if(![".ts",".js"].includes(Qe(s.name)))continue;if(s.name.startsWith(".")||s.name.startsWith("index"))continue;t.push(i)}};return n(e),t.sort()}async function We(e,t,n,r){for(let o of Ot(e))try{let s=Qe(o),i=await import(`${o}?t=${Date.now()}`),l=i.default??i,d=l.name??xt(o,s);n.models[d]={...l,name:d},n.origins[d]=t}catch(s){r?.(o,s)}}async function be(e){let t={models:{},origins:{}};return await We(e.defaultsRoot,"default",t,e.onImportError),await We(e.userRoot,"app",t,e.onImportError),t}async function Vt(e){return(await be(e)).models}function Ve(e,t){let n,r="default";if(t!==void 0&&t!==null)n=t.split(","),r="env";else if(typeof e==="string")n=[e],r="config";else if(Array.isArray(e)&&e.every((s)=>typeof s==="string"))n=e,r="config";if(n===void 0)return{all:!0,own:!1,names:new Set,source:r};let o=n.map((s)=>s.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((s)=>s!=="own")),source:r}}function He(e,t){let n={},r=new Set;for(let[o,s]of Object.entries(e.models)){if(!s?.traits?.useApi)continue;let i=o.toLowerCase(),l=t.names.has(i);if(l)r.add(i);if(t.all||l||t.own&&e.origins[o]==="app")n[o]=s}return{models:n,unmatched:[...t.names].filter((o)=>!r.has(o)).sort()}}var qe=()=>{};import nt from"process";import{parseBearerToken as vt,route as B}from"@stacksjs/router";import{env as F}from"@stacksjs/env";import{projectPath as Se,storagePath as Tt}from"@stacksjs/path";import{createQueryBuilder as Dt,defaultConfig as ze,setConfig as Je}from"@stacksjs/query-builder";import{HttpError as Q}from"@stacksjs/error-handling";import{log as V}from"@stacksjs/logging/runtime";import{isUniqueViolation as Lt}from"@stacksjs/error-handling";import{isUniqueViolation as dt}from"@stacksjs/error-handling";function ce(e,t,n){let r=e;if(e instanceof Error&&typeof r.status==="number"&&Number.isInteger(r.status)&&r.status>=400&&r.status<600){let o={error:e.message};if(r.details!==void 0)o.details=r.details;return{status:r.status,body:o}}if(dt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function S(e){let t=!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)t=!0}if(!t)return e;let n="";for(let r=0;r<e.length;r++){let o=e.charCodeAt(r);if(o<65||o>90){n+=e[r];continue}let s=r>0?e.charCodeAt(r-1):0,i=r+1<e.length?e.charCodeAt(r+1):0,l=s>=97&&s<=122||s>=48&&s<=57,d=s>=65&&s<=90&&i>=97&&i<=122;if(r>0&&(l||d))n+="_";n+=String.fromCharCode(o+32)}return n}function de(e){let t={};for(let[n,r]of Object.entries(e))t[S(n)]=r;return t}function De(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Pe(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"teamId")||Object.prototype.hasOwnProperty.call(t,"team_id"))return"team_id";return e.belongsTo?.some((n)=>n==="Team")?"team_id":null}function Ce(e){if(!e)return null;let t=e.attributes??{};if(Object.prototype.hasOwnProperty.call(t,"userId")||Object.prototype.hasOwnProperty.call(t,"user_id"))return"user_id";return e.belongsTo?.some((n)=>n==="User")?"user_id":null}function Me(e){return e?.ownership===!1}function $e(e,t,n){let r=Object.keys(e).find((s)=>S(s)===S(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((s)=>String(s)===String(e[r])))return{data:e,error:"Ownership value is not available to this caller"};return{data:{...e,[t]:e[r]}}}if(n===null||n===void 0)return{data:e,error:"Caller has no ownership identity"};let o={...e};for(let s of Object.keys(o))if(S(s)===S(t))delete o[s];return o[t]=n,{data:o}}function Ie(e){if(!e)return[];let t=Object.entries(e.attributes??{}).filter(([,n])=>n?.fillable===!0).map(([n])=>n);for(let n of e.belongsTo??[]){if(typeof n!=="string"||!n.trim())continue;let r=S(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((s)=>`${s[0]?.toUpperCase()}${s.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function fe(e,t){if(!e||t.length===0)return{};let n={},r;for(let o of t){if(o in e){n[o]=e[o];continue}r??=gt(t);let s=r.get(o);if(s!==o&&s in e)n[o]=e[s]}return n}function ft(e,t){if(e?.name!=="date"||t instanceof Date||typeof t!=="string")return t;let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return t;let r=Number(n[1]),o=Number(n[2]),s=Number(n[3]),i=new Date(Date.UTC(r,o-1,s));if(i.getUTCFullYear()!==r||i.getUTCMonth()!==o-1||i.getUTCDate()!==s)return t;return i}var xe=new WeakMap,Ae=new WeakMap;function ge(e){let t=xe.get(e);if(t&&t.length===e.length){let r=!0;for(let o=0;o<e.length;o++)if(t[o]?.field!==e[o]){r=!1;break}if(r)return t}let n=e.map((r)=>({field:r,snake:S(r)}));return xe.set(e,n),n}function gt(e){let t=ge(e),n=Ae.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:s})=>[o,s]));return Ae.set(t,r),r}function pe(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}function G(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of ge(t))if(delete n[r],o!==r)delete n[o];return n}var pt=["id","uuid","created_at","updated_at","deleted_at"];function Ne(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...pt]){let o=S(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(S(r));return n}function je(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let s=o.trim();if(!s)continue;let i=s.startsWith("-"),l=i?s.slice(1):s;if(!/^\w+$/.test(l))continue;let d=n.get(l);if(!d)continue;r=r.orderBy(d,i?"desc":"asc")}return r}var yt={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"?wt(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"?ht(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},Oe=new WeakMap;function mt(e,t){let n=Oe.get(e);if(n&&n.length===t.length){let o=!0;for(let s=0;s<t.length;s++){let i=t[s];if(n[s]?.attr!==i||n[s]?.definition!==e[i]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let s=e[o],i=typeof s==="string"?yt[s]:s;r.push({attr:o,snake:S(o),definition:s,caster:i})}return Oe.set(e,r),r}function wt(e){try{return JSON.parse(e)}catch{return e}}function ht(e){try{return JSON.parse(e)}catch{return[]}}function ye(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=mt(t,r);if(o.length===0)return e;let s={...e};for(let{attr:i,caster:l,snake:d}of o){if(!l)continue;let u=l[n];if(typeof u!=="function")continue;if(Object.prototype.hasOwnProperty.call(s,i))s[i]=u.call(l,s[i]);if(d!==i&&Object.prototype.hasOwnProperty.call(s,d))s[d]=u.call(l,s[d])}return s}var ve=new WeakMap;function bt(e){let t=ve.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let s=o?.validation?.rule;if(!s||typeof s.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:s})}return ve.set(e,n),n}function Ft(e){let t=e?.attributes;if(!t||typeof t!=="object")return!1;for(let n of Object.values(t)){let r=n?.validation?.rule;if(r&&typeof r.validate==="function")return!0}return!1}function me(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=bt(r);if(o.length===0)return{valid:!0};let s={},i=!1;for(let l of o){let{definition:d,field:u,hasDefault:T,rule:C}=l,M=Object.prototype.hasOwnProperty.call(e,u);if(!M&&n==="updating")continue;let J=M?e[u]:T?d.default:void 0,L=ft(C,J),I=C.validate(L);if(!I?.valid&&Array.isArray(I?.errors)&&I.errors.length>0)i=!0,s[u]=I.errors.map((P)=>d.validation?.message?.[P?.code]??P?.message??"invalid")}return i?{valid:!1,errors:s}:{valid:!0}}function we(e,t){return`${e}\x00${Rt(t)}`}function Ee(e){let t=new Map;for(let n of e){let r=we(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function Rt(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function le(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function Fe(e){let t=typeof e==="object"&&e!==null&&"middleware"in e,n=e?.middleware;if(!t)return{read:["auth"],write:["auth"],declared:!1};if(n&&typeof n==="object"&&!Array.isArray(n)){let o=n;return{read:"read"in o?le(o.read):["auth"],write:"write"in o?le(o.write):["auth"],declared:!0}}let r=le(n);return{read:r,write:r,declared:!0}}var Te=15,kt=100;function Ue(e){let t=Number.parseInt(e.get("page")||String(1),10),n=Number.isFinite(t)?Math.max(1,t):1,r=Number.parseInt(e.get("per_page")||String(Te),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):Te,kt);return{page:n,perPage:o,offset:(n-1)*o}}function se(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function St(e,t,n,r,o,s){let i=(t-1)*n,l=r===0,d={page:t,per_page:n,from:l?null:i+1,to:l?null:i+r,has_more_pages:o,prev_page_url:t>1?se(e,t-1):null,next_page_url:o?se(e,t+1):null};if(s!==void 0&&!Number.isNaN(s)){let u=Math.max(1,Math.ceil(s/n));d.total=s,d.last_page=u,d.first_page_url=se(e,1),d.last_page_url=se(e,u)}return d}function he(e,t,n,r,o,s){let{page:i,...l}=St(e,t,n,r,o,s);return{current_page:i,...l}}function Be(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function Le(e,t){if(e.length===0)return null;let n=[...e].sort().join(", ");if(t==="deny")return`[orm] security.api.rowScoping is 'deny': NOT registering store/update/destroy for ${e.length} model(s) `+`with no row-level scoping \u2014 ${n}. Give a model an \`ownership\` config or a \`team_id\` column to restore its writes.`;return`[orm] ${e.length} model(s) publish mutating routes with no row-level scoping, so an authenticated caller can write any row \u2014 `+`${n}. Scope one with an \`ownership\` config or a \`team_id\` column; intended for public catalog tables. Set \`security.api.rowScoping: 'deny'\` (config/security.ts) to stop generating these routes instead.`}qe();function ie(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Pe(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:s}=await import("@stacksjs/auth");return s(Re(o))}};let n=Ce(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Re(e){let t=e?.headers?.get?.("authorization"),n=t&&/^Bearer\s+/i.test(t)?t.replace(/^Bearer\s+/i,"").trim():null,r=e?.headers?.get?.("cookie")||"";return{bearerToken:()=>n,cookies:{get:(o)=>{for(let s of r.split(";")){let i=s.indexOf("=");if(i===-1)continue;if(s.slice(0,i).trim()===o)return decodeURIComponent(s.slice(i+1).trim())}return null}}}}function zt(e="customer_id"){return{field:e,resolve:async(t)=>{let n=t?.id;if(n==null)return null;try{let{Customer:r}=await import("@stacksjs/orm");return(await r.where("user_id",n).first())?.id??null}catch{return null}}}}function Jt(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Kt(e="site_id"){return{field:e,resolve:async(t,n)=>{try{let[{resolveAuthenticatedTeamId:r},{Site:o}]=await Promise.all([import("@stacksjs/auth"),import("@stacksjs/orm")]),s=await r(Re(n));if(s==null)return[];return(await o.where("team_id",s).get()??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}function Gt(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Re(n))}catch{return null}}}}function Xt(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),s=o.models?.[e]??o[e]?.definition??null,i=ie(s);if(!i?.field||typeof i.resolve!=="function")return[];let l=await i.resolve(n,r);if(l==null||Array.isArray(l)&&l.length===0)return[];let d=o[e];if(!d)return[];return((Array.isArray(l)?await d.whereIn(i.field,l).get():await d.where(i.field,l).get())??[]).map((T)=>T.id).filter((T)=>T!=null)}catch{return[]}}}}var Pt=Se("config/qb.ts");try{let e=(await import(Pt)).default;Je(e??ze)}catch{V.debug("[orm] No config/qb.ts override found - deriving config from DB_CONNECTION");let e=F.DB_CONNECTION||"sqlite",t=e==="turso"||e==="libsql",n=t?"sqlite":e;Je({...ze,dialect:n,database:t?{database:F.TURSO_DATABASE_URL||"",url:F.TURSO_DATABASE_URL||"",authToken:F.TURSO_AUTH_TOKEN||void 0}:n==="sqlite"?{database:F.DB_DATABASE_PATH||"database/stacks.sqlite"}:{database:F.DB_DATABASE||"stacks",host:F.DB_HOST||"127.0.0.1",port:F.DB_PORT||(n==="postgres"?5432:3306),username:F.DB_USERNAME||(n==="postgres"?"postgres":"root"),password:F.DB_PASSWORD||""}})}var rt=await be({defaultsRoot:Tt("framework/defaults/app/Models"),userRoot:Se("app/Models"),onImportError:(e,t)=>V.warn(`[orm] Could not load model ${e}: ${t.message}`)}),Ke=rt.models,Ct=Dt(),v=Ct,Ge=Ee(B.routes);function z(e,t){let n=we(e,t),r=Ge.get(n);if(!r)return Ge.set(n,{method:e,path:t}),!1;let o=String(r.path??"");return V.debug(`[orm] Skipping generated ${e} ${t} - already defined${o&&o!==t?` as ${o}`:""}.`),!0}function ot(e){if(!e.attributes)return[];return Object.entries(e.attributes).filter(([t,n])=>n.hidden===!0).map(([t])=>t)}function Xe(e){if(e.endsWith("y")&&!/[aeiou]y$/i.test(e))return`${e.slice(0,-1)}ies`;if(/(?:s|x|z|ch|sh)$/i.test(e))return`${e}es`;return`${e}s`}async function Ye(e,t,n,r){if(!e.length)return e;let o=n.split(",").map((u)=>u.trim()).filter(Boolean);if(!o.length)return e;let s=Array.isArray(t.belongsTo)?t.belongsTo:[],i=Array.isArray(t.hasMany)?t.hasMany:[],l=Array.isArray(t.hasOne)?t.hasOne:[],d=new Map;for(let u of s)d.set(S(u),{kind:"belongsTo",modelName:u});for(let u of l)d.set(S(u),{kind:"hasOne",modelName:u});for(let u of i)d.set(Xe(S(u)),{kind:"hasMany",modelName:u});for(let u of o){let T=d.get(u);if(!T)continue;let C=r[T.modelName];if(!C)continue;let M=C.table||Xe(S(T.modelName)),J=ot(C),L=(I)=>G(ne(I,C),J);if(T.kind==="belongsTo"||T.kind==="hasOne"){let I=`${S(T.modelName)}_id`,P=[...new Set(e.map((_)=>_[I]).filter((_)=>_!=null))];if(!P.length){for(let _ of e)_[u]=null;continue}let K=await v.selectFrom(M).whereIn("id",P).get(),H=new Map;for(let _ of K??[])H.set(String(_.id),L(_));for(let _ of e)_[u]=H.get(String(_[I]))??null}else{let I=String(t.name??""),P=`${S(I)}_id`,K=[...new Set(e.map((O)=>O.id).filter((O)=>O!=null))];if(!K.length){for(let O of e)O[u]=[];continue}let H=await v.selectFrom(M).whereIn(P,K).get(),_=new Map;for(let O of H??[]){let j=String(O[P]),Z=_.get(j)??[];Z.push(L(O)),_.set(j,Z)}for(let O of e)O[u]=_.get(String(O.id))??[]}}return e}async function Ze(e,t){let n=t?.set;if(!n||typeof n!=="object")return e;let r={...e};for(let[o,s]of Object.entries(n)){if(typeof s!=="function"||!(o in r))continue;try{r[o]=await s(r)}catch{}}return r}function et(e,t){return ye(e,t?.casts,"set")}function ne(e,t){return ye(e,t?.casts,"get")}function f(e,t=200){return new Response(JSON.stringify(e),{status:t,headers:{"Content-Type":"application/json"}})}var ae=1048576;async function ke(e){if(Number(e.headers?.get?.("content-length")??0)>ae)throw new Q(413,`Request body exceeds ${ae}-byte limit`);if(e.jsonBody&&typeof e.jsonBody==="object")return e.jsonBody;if(e.formBody&&typeof e.formBody==="object")return e.formBody;try{let n=await e.clone().text();if(n.length>ae)throw new Q(413,`Request body exceeds ${ae}-byte limit`);if(!n)return{};let r=JSON.parse(n);return r&&typeof r==="object"&&!Array.isArray(r)?r:{}}catch(n){if(n instanceof Q)throw n;throw new Q(400,`Invalid JSON body: ${n.message}`)}}function ue(e){if(e==null)return null;if(typeof e==="number")return Number.isFinite(e)&&e>0?e:null;if(typeof e==="string"){let t=e.trim();if(!t)return null;if(/^\d+$/.test(t)){let n=Number(t);return Number.isFinite(n)&&n>0?n:null}return t}return null}function Mt(e){let t=e.bearerToken;if(typeof t==="function"){let n=t.call(e);if(n)return n}return vt(e.headers?.get?.("authorization")??null)}async function X(e){let t=e._authenticatedUser;if(t)return t;let n=Mt(e);if(!n)return null;try{let{Auth:r}=await import("@stacksjs/auth"),o=await r.getUserFromToken(n);if(o)e._authenticatedUser=o;return o||null}catch{return null}}function te(e,t){if(e==null||t==null)return!1;if(Array.isArray(t))return t.some((n)=>String(n)===String(e));return String(e)===String(t)}async function Y(e,t,n){let r=ie(e);if(!r||!r.field||typeof r.resolve!=="function")return{enforced:!1,value:null,field:"",bypass:!1};let o=typeof r.bypass==="function"?!!r.bypass(t,n):!1,s=null;try{s=await r.resolve(t,n)}catch{s=null}return{enforced:!0,value:s,field:String(r.field),bypass:o}}async function tt(e,t,n,r){let o=e?.authedFill?.[t];if(!o)return{};if(typeof o==="function")try{let s=await o(n,r);return s&&typeof s==="object"?s:{}}catch{return{}}if(typeof o==="object"){let s={};for(let[i,l]of Object.entries(o))try{s[i]=typeof l==="function"?await l(n,r):l}catch{}return s}return{}}var st=await(async()=>{try{return(await import(Se("config/security.ts"))).default?.api}catch{return}})(),it=Be(st?.rowScoping,nt.env.STACKS_API_ROW_SCOPING),$t=(()=>{let e=Ve(st?.models,nt.env.STACKS_MODEL_APIS),{models:t,unmatched:n}=He(rt,e);if(n.length>0){let r=e.source==="env"?"STACKS_MODEL_APIS":"security.api.models";V.warn(`[orm] ${r} names ${n.length===1?"a model":"models"} with no \`useApi\` trait, so no API was generated for ${n.join(", ")}.`)}return t})(),at=[];for(let[e,t]of Object.entries($t)){let n=t.traits?.useApi;if(!n)continue;let r=typeof n==="object"?n:{},o=r.uri||t.table||e.toLowerCase()+"s",s=r.routes||["index","show","store","update","destroy"],i=t.table||o,l=Ie(t),d=ot(t),u=De(o,r.prefix),T=Ne(t.attributes,d),{read:C,write:M,declared:J}=Fe(n),L=["store","update","destroy"].some((y)=>s.includes(y));if(L&&J&&M.length===0)V.warn(`[orm] ${e}: registering UNAUTHENTICATED mutating routes at ${u} (explicit \`middleware: []\` opt-out)`);if(["index","show"].some((y)=>s.includes(y))&&J&&C.length===0)V.debug(`[orm] ${e}: registering public read routes at ${u} (declared \`middleware.read: []\`)`);let P=!!ie(t),K=P&&!C.includes("auth")?["auth",...C]:C,H=Me(t),_=L&&!P&&!H;if(_)at.push(e);if(L&&H)V.debug(`[orm] ${e}: registering unscoped mutating routes at ${u} (declared \`ownership: false\`)`);let O=_&&it==="deny",j=(y,a=K)=>{let c=y;for(let g of a)if(c&&typeof c.middleware==="function")c=c.middleware(g);return c};if(s.includes("index")&&!z("GET",u))j(B.get(u,async(y)=>{try{let a=new URL(y.url),{page:c,perPage:g,offset:h}=Ue(a.searchParams),w=a.searchParams.get("sort"),p=v.selectFrom(i);p=je(p,w,T);let N=new Set(["page","per_page","sort","fields","search","include","limit","offset","with_count","withTrashed","onlyTrashed"]);for(let[x,A]of a.searchParams.entries()){if(N.has(x)||!A)continue;if(!/^[a-z_][a-z0-9_]*$/i.test(x))continue;let q=T.get(x);if(q)p=p.where(q,"=",A)}let R=a.searchParams.get("search");if(R&&l.length>0){let x=l.slice(0,5);p=p.where((A)=>{for(let q of x)A=A.orWhere(S(q),"like",`%${R}%`);return A})}let k=a.searchParams.get("fields");if(k){let x=k.split(",").map((A)=>A.trim()).filter((A)=>/^[a-z_][a-z0-9_]*$/i.test(A)).map((A)=>S(A));if(x.length>0)p=p.select(x)}let D=!!t.traits?.useSoftDeletes,b=a.searchParams.get("withTrashed")==="true",E=a.searchParams.get("onlyTrashed")==="true";if(D&&!b)p=E?p.whereNotNull("deleted_at"):p.whereNull("deleted_at");let m=P?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(m.enforced&&!m.bypass){if(m.value==null||Array.isArray(m.value)&&m.value.length===0){let x=he(a,c,g,0,!1,void 0);return new Response(JSON.stringify({data:[],...x}),{status:200,headers:{"Content-Type":"application/json","Cache-Control":"private, no-store",Vary:"Authorization"}})}p=Array.isArray(m.value)?p.where(m.field,"in",m.value):p.where(m.field,"=",m.value)}let U=await p.limit(g+1).offset(h).get()||[],W=U.length>g,re=(W?U.slice(0,g):U).map((x)=>G(ne(x,t),d)),_e=a.searchParams.get("include");if(_e)re=await Ye(re,t,_e,Ke);let ut=a.searchParams.get("with_count")==="true",ee;if(ut)try{let x=v.selectFrom(i);if(m.enforced&&!m.bypass&&m.value!=null)x=Array.isArray(m.value)?x.where(m.field,"in",m.value):x.where(m.field,"=",m.value);let A=await x.count(),q=typeof A==="number"?A:Number(A?.count??A);if(Number.isFinite(q))ee=q}catch{}let oe={"Content-Type":"application/json"};if(ee!==void 0&&!Number.isNaN(ee))oe["X-Total-Count"]=String(ee);oe["Cache-Control"]=m.enforced&&!m.bypass?"private, no-store":"public, max-age=15, must-revalidate",oe.Vary="Authorization";let lt=he(a,c,g,re.length,W,ee);return new Response(JSON.stringify({data:re,...lt}),{status:200,headers:oe})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to fetch ${o}`,detail:String(a)},500)}}));if(s.includes("show")&&!z("GET",`${u}/{id}`))j(B.get(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return f({error:"Invalid ID parameter"},400);let c=await v.selectFrom(i).where({id:a}).executeTakeFirst();if(!c)return f({error:`${e} not found`},404);let g=new URL(y.url);if(t.traits?.useSoftDeletes&&c.deleted_at&&g.searchParams.get("withTrashed")!=="true")return f({error:`${e} not found`},404);let h=P?await Y(t,await X(y),y):{enforced:!1,value:null,field:"",bypass:!1};if(h.enforced&&!h.bypass){if(h.value==null||!te(c[h.field],h.value))return f({error:`${e} not found`},404)}let w=G(ne(c,t),d),p=g.searchParams.get("include");if(p){let[b]=await Ye([w],t,p,Ke);w=b}let N=w?.updated_at||w?.created_at,R=N?`W/"${w.id}-${String(N)}"`:void 0,k=y.headers?.get?.("if-none-match");if(R&&k&&k===R)return new Response(null,{status:304,headers:{ETag:R}});let D={"Content-Type":"application/json"};if(R)D.ETag=R;return D["Cache-Control"]=h.enforced&&!h.bypass?"private, no-store":"public, max-age=30, must-revalidate",D.Vary="Authorization",new Response(JSON.stringify({data:w}),{status:200,headers:D})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to fetch ${e}`,detail:String(a)},500)}}));if(!O&&s.includes("store")&&!z("POST",u))j(B.post(u,async(y)=>{try{let a=await ke(y),c=pe(a,d),g=fe(c,l),h=await X(y);if(h){let b=await tt(t,"creating",h,y);for(let[E,m]of Object.entries(b))if(m!==void 0&&m!==null&&g[E]===void 0)g[E]=m}let w=await Y(t,h,y);if(w.enforced&&!w.bypass){if(!h)return f({error:"Auth required"},401);let b=$e(g,w.field,w.value);if(b.error)return f({error:b.error},403);g=b.data}if(Object.keys(g).length===0)return f({error:"No fillable fields provided"},422);let p=me(g,t,"creating");if(!p.valid)return f({success:!1,message:"Validation failed",errors:p.errors},422);if(t.traits?.useTimestamps!==!1){let b=new Date().toISOString();g.created_at=b,g.updated_at=b}let N=await Ze(g,t),R=de(et(N,t)),k=await v.insertInto(i).values(R).execute(),D=R;try{let b=k?.lastInsertRowid??k?.insertId??k;if(b){let E=await v.selectFrom(i).where({id:b}).executeTakeFirst();if(E)D=E}}catch{}return f({data:G(ne(D,t),d)},201)}catch(a){let{status:c,body:g}=ce(a,e,"create");return f(g,c)}}),M);if(!O&&s.includes("update")){let y=async(a)=>{try{let c=ue(a.params?.id);if(c==null)return f({error:"Invalid ID parameter"},400);let g=await ke(a),h=pe(g,d),w=fe(h,l),p=await X(a);if(p){let m=await tt(t,"updating",p,a);for(let[U,W]of Object.entries(m))if(W!==void 0&&W!==null&&w[U]===void 0)w[U]=W}if(Object.keys(w).length===0)return f({error:"No fillable fields provided"},422);let N=me(w,t,"updating");if(!N.valid)return f({success:!1,message:"Validation failed",errors:N.errors},422);let R=await v.selectFrom(i).where({id:c}).executeTakeFirst();if(!R)return f({error:`${e} not found`},404);let k=await Y(t,p,a);if(k.enforced&&!k.bypass){if(!p)return f({error:"Auth required"},401);let m=R[k.field];if(!te(m,k.value))return f({error:`Not your ${e}`},403);let U=Object.keys(w).find((W)=>S(W)===S(k.field));if(U!==void 0&&!te(w[U],k.value))return f({error:`Cannot reassign ${e} ownership`},403)}if(t.traits?.useTimestamps!==!1)w.updated_at=new Date().toISOString();let D=await Ze(w,t),b=de(et(D,t));await v.updateTable(i).set(b).where({id:c}).execute();let E={...R,...b};try{let m=await v.selectFrom(i).where({id:c}).executeTakeFirst();if(m)E=m}catch{}return f({data:G(ne(E,t),d)})}catch(c){let{status:g,body:h}=ce(c,e,"update");return f(h,g)}};if(!z("PUT",`${u}/{id}`))j(B.put(`${u}/{id}`,y),M);if(!z("PATCH",`${u}/{id}`))j(B.patch(`${u}/{id}`,y),M)}let Z=!!t.traits?.useSoftDeletes;if(!O&&s.includes("destroy")&&!z("DELETE",`${u}/{id}`))j(B.delete(`${u}/{id}`,async(y)=>{try{let a=ue(y.params?.id);if(a==null)return f({error:"Invalid ID parameter"},400);let c=await v.selectFrom(i).where({id:a}).executeTakeFirst();if(!c)return f({error:`${e} not found`},404);let g=await X(y),h=await Y(t,g,y);if(h.enforced&&!h.bypass){if(!g)return f({error:"Auth required"},401);let w=c[h.field];if(!te(w,h.value))return f({error:`Not your ${e}`},403)}if(Z){let w=new Date().toISOString();await v.updateTable(i).set({deleted_at:w,updated_at:w}).where({id:a}).execute()}else await v.deleteFrom(i).where({id:a}).execute();return new Response(null,{status:204})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to delete ${e}`,detail:String(a)},500)}}),M);if(!O&&s.includes("destroy")&&!z("POST",`${u}/bulk-delete`))j(B.post(`${u}/bulk-delete`,async(y)=>{try{let c=(await ke(y))?.ids;if(!Array.isArray(c)||c.length===0)return f({error:"An array of IDs is required"},422);if(c.length>100)return f({error:"Cannot delete more than 100 records at once"},422);let g=[],h=[];for(let R of c){let k=ue(R);if(k!=null)g.push(k);else h.push(R)}if(h.length>0)return f({error:"Invalid IDs in batch",invalid:h},422);let w=await X(y),p=await Y(t,w,y);if(p.enforced&&!p.bypass){if(!w)return f({error:"Auth required"},401);if(p.value==null)return f({error:"Caller has no ownership identity"},403);let R=await v.selectFrom(i).select(["id",p.field]).execute(),k=new Set(R.filter((b)=>te(b[p.field],p.value)).map((b)=>String(b.id))),D=g.filter((b)=>!k.has(String(b)));if(D.length>0)return f({error:`Cannot delete ${e} you don't own`,ids:D},403)}let N=new Date().toISOString();for(let R of g)if(Z)await v.updateTable(i).set({deleted_at:N,updated_at:N}).where({id:R}).execute();else await v.deleteFrom(i).where({id:R}).execute();return f({message:`Successfully deleted ${g.length} ${o}`})}catch(a){if(a instanceof Q){let c={error:a.message};if(a.details!==void 0)c.details=a.details;return f(c,a.status||400)}return f({error:`Failed to bulk delete ${o}`,detail:String(a)},500)}}),M)}{let e=Le(at,it);if(e)V.warn(e)}var dn=B;export{dn as default};
|
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.88",
|
|
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.88",
|
|
67
|
+
"@stacksjs/cli": "0.75.88",
|
|
68
|
+
"@stacksjs/config": "0.75.88",
|
|
69
|
+
"@stacksjs/database": "0.75.88",
|
|
70
|
+
"@stacksjs/env": "0.75.88",
|
|
71
|
+
"@stacksjs/error-handling": "0.75.88",
|
|
72
|
+
"@stacksjs/events": "0.75.88",
|
|
73
|
+
"@stacksjs/logging": "0.75.88",
|
|
74
|
+
"@stacksjs/model-meta": "0.75.88",
|
|
75
|
+
"@stacksjs/pagination": "0.75.88",
|
|
76
|
+
"@stacksjs/path": "0.75.88",
|
|
77
|
+
"@stacksjs/query-builder": "0.75.88",
|
|
78
|
+
"@stacksjs/realtime": "0.75.88",
|
|
79
|
+
"@stacksjs/router": "0.75.88",
|
|
80
|
+
"@stacksjs/storage": "0.75.88",
|
|
81
|
+
"@stacksjs/strings": "0.75.88",
|
|
82
82
|
"@stacksjs/ts-validation": "^0.5.6",
|
|
83
|
-
"@stacksjs/validation": "0.75.
|
|
83
|
+
"@stacksjs/validation": "0.75.88",
|
|
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.88",
|
|
88
|
+
"@stacksjs/payments": "0.75.88",
|
|
89
|
+
"@stacksjs/queue": "0.75.88",
|
|
90
|
+
"@stacksjs/search-engine": "0.75.88",
|
|
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.88",
|
|
112
112
|
"better-dx": "^0.2.24",
|
|
113
113
|
"stripe": "23.0.0"
|
|
114
114
|
}
|