@stacksjs/orm 0.75.64 → 0.75.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/models/Activity.ts +1 -1
- package/dist/models/AnalyticsEvent.ts +1 -1
- package/dist/models/Automation.ts +1 -1
- package/dist/models/AutomationRun.ts +1 -1
- package/dist/models/Board.ts +1 -1
- package/dist/models/BoardColumn.ts +1 -1
- package/dist/models/Campaign.ts +1 -1
- package/dist/models/CampaignSend.ts +1 -1
- package/dist/models/CampaignVariant.ts +1 -1
- package/dist/models/Card.ts +1 -1
- package/dist/models/CardComment.ts +1 -1
- package/dist/models/Comment.ts +1 -1
- package/dist/models/CommunicationSuppression.ts +1 -1
- package/dist/models/ConsentEvent.ts +1 -1
- package/dist/models/Content/Author.ts +1 -1
- package/dist/models/Content/Categorizable.ts +1 -1
- package/dist/models/Content/Menu.ts +1 -1
- package/dist/models/Content/MenuItem.ts +1 -1
- package/dist/models/Content/Page.ts +1 -1
- package/dist/models/Content/PageRevision.ts +1 -1
- package/dist/models/Content/Post.ts +1 -1
- package/dist/models/Content/Redirect.ts +1 -1
- package/dist/models/Deployment.ts +1 -1
- package/dist/models/EmailIdempotency.ts +1 -1
- package/dist/models/EmailList.ts +1 -1
- package/dist/models/EmailListSubscriber.ts +1 -1
- package/dist/models/EmailSuppression.ts +1 -1
- package/dist/models/EmailWebhookEvent.ts +1 -1
- package/dist/models/Error.ts +1 -1
- package/dist/models/FailedJob.ts +1 -1
- package/dist/models/Forms/Form.ts +1 -1
- package/dist/models/Forms/FormField.ts +1 -1
- package/dist/models/Forms/FormSubmission.ts +1 -1
- package/dist/models/GdprRequest.ts +1 -1
- package/dist/models/Job.ts +1 -1
- package/dist/models/Label.ts +1 -1
- package/dist/models/Log.ts +1 -1
- package/dist/models/MagicLinkToken.ts +1 -1
- package/dist/models/MailPreference.ts +1 -1
- package/dist/models/Notification.ts +1 -1
- package/dist/models/NotificationDelivery.ts +1 -1
- package/dist/models/PaymentMethod.ts +1 -1
- package/dist/models/PaymentProduct.ts +1 -1
- package/dist/models/PaymentTransaction.ts +1 -1
- package/dist/models/PersonalAccessToken.ts +1 -1
- package/dist/models/QueryLog.ts +1 -1
- package/dist/models/Referral.ts +1 -1
- package/dist/models/ReferralCode.ts +1 -1
- package/dist/models/Release.ts +1 -1
- package/dist/models/Request.ts +1 -1
- package/dist/models/SenderDomain.ts +1 -1
- package/dist/models/Site.ts +1 -1
- package/dist/models/SiteDomain.ts +1 -1
- package/dist/models/SmsOptOut.ts +1 -1
- package/dist/models/SocialAccount.ts +1 -1
- package/dist/models/SocialPost.ts +1 -1
- package/dist/models/StorageItem.ts +1 -1
- package/dist/models/StorageItemTask.ts +1 -1
- package/dist/models/Subscriber.ts +1 -1
- package/dist/models/SubscriberEmail.ts +1 -1
- package/dist/models/Subscription.ts +1 -1
- package/dist/models/Tag.ts +1 -1
- package/dist/models/Team.ts +1 -1
- package/dist/models/TeamInvitation.ts +1 -1
- package/dist/models/TeamMember.ts +1 -1
- package/dist/models/UsageEvent.ts +1 -1
- package/dist/models/User.ts +1 -1
- package/dist/models/commerce/Auction.ts +1 -1
- package/dist/models/commerce/AuctionItem.ts +1 -1
- package/dist/models/commerce/Bid.ts +1 -1
- package/dist/models/commerce/Cart.ts +1 -1
- package/dist/models/commerce/CartItem.ts +1 -1
- package/dist/models/commerce/Category.ts +1 -1
- package/dist/models/commerce/Coupon.ts +1 -1
- package/dist/models/commerce/Courier.ts +1 -1
- package/dist/models/commerce/CourierPing.ts +1 -1
- package/dist/models/commerce/Customer.ts +1 -1
- package/dist/models/commerce/DeliveryRoute.ts +1 -1
- package/dist/models/commerce/DeliveryStop.ts +1 -1
- package/dist/models/commerce/DigitalDelivery.ts +1 -1
- package/dist/models/commerce/GiftCard.ts +1 -1
- package/dist/models/commerce/LicenseKey.ts +1 -1
- package/dist/models/commerce/LoyaltyPoint.ts +1 -1
- package/dist/models/commerce/LoyaltyReward.ts +1 -1
- package/dist/models/commerce/Manufacturer.ts +1 -1
- package/dist/models/commerce/Order.ts +1 -1
- package/dist/models/commerce/OrderIdempotency.ts +1 -1
- package/dist/models/commerce/OrderItem.ts +1 -1
- package/dist/models/commerce/Payment.ts +1 -1
- package/dist/models/commerce/Pledge.ts +1 -1
- package/dist/models/commerce/PrintDevice.ts +1 -1
- package/dist/models/commerce/Product.ts +1 -1
- package/dist/models/commerce/ProductUnit.ts +1 -1
- package/dist/models/commerce/ProductVariant.ts +1 -1
- package/dist/models/commerce/Receipt.ts +1 -1
- package/dist/models/commerce/Review.ts +1 -1
- package/dist/models/commerce/ShippingMethod.ts +1 -1
- package/dist/models/commerce/ShippingRate.ts +1 -1
- package/dist/models/commerce/ShippingZone.ts +1 -1
- package/dist/models/commerce/TaxRate.ts +1 -1
- package/dist/models/commerce/Transaction.ts +1 -1
- package/dist/models/commerce/WaitlistProduct.ts +1 -1
- package/dist/models/commerce/WaitlistRestaurant.ts +1 -1
- package/dist/models/realtime/Websocket.ts +1 -1
- package/package.json +23 -23
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var dt=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Vn=import.meta.require;import{readdirSync as Qr}from"fs";import{basename as zr,extname as Gt,join as Hr}from"path";function Jr(e){let t=[],n=(r)=>{let o;try{o=Qr(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Hr(r,i.name);if(i.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Gt(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function qt(e,t,n){for(let r of Jr(e))try{let o=Gt(r),i=await import(`${r}?t=${Date.now()}`),a=i.default??i,s=a.name??zr(r,o);t[s]={...a,name:s}}catch(o){n?.(r,o)}}async function Ut(e){let t={};return await qt(e.defaultsRoot,t,e.onImportError),await qt(e.userRoot,t,e.onImportError),t}var Kt=()=>{};import{path as Wt}from"@stacksjs/path";async function Ue(){return Ut({defaultsRoot:Wt.frameworkPath("defaults/app/Models"),userRoot:Wt.userModelsPath()})}var Ke=dt(()=>{Kt()});import"@stacksjs/validation";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Qn(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let i=new Date;i.setDate(i.getDate()-n);let a=await ft.deleteFrom(e).where(r,"<",i.toISOString()).execute(),s=pt(a);return Ae.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(i){throw Ae.error(`Failed to prune ${e}:`,i),i}}async function Bs(e,t={}){return Qn(e,t)}function Ns(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as zn,createDecipheriv as Hn,createHash as Jn,randomBytes as Yn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Xn=12,re=null;async function yt(){if(re)return re;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return re=Jn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Yn(Xn),r=zn(gt,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),i=r.getAuthTag();return`${mt}${n.toString("base64")}:${i.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return oe.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let i=Buffer.from(n,"base64"),a=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Hn(gt,t,i);return u.setAuthTag(a),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(t){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function Ce(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Zn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var er=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function tr(e){ve=e}async function ie(){if(ve!=null)return ve;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function W(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(er.some((o)=>o.test(n)))continue;t[n]=r}return t}function I(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function nr(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of o)if(e[i]!==t[i])n[i]=e[i],r[i]=t[i];return{old:n,next:r}}async function ae(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(bt).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Zn()}).executeTakeFirst()}catch(n){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function ht(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(n){return B.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,t,n="id",r={}){let o=r.transactional===!0,i=e;if(typeof e.audits!=="function")e.audits=ht(t).audits;let a=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 a(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[n];if(m!=null){let g=await ie();await ae({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${t}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await a(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ie():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[n];if(w==null)continue;await ae({auditable_type:t,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${t}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await a(async()=>{let p=i.find,m=typeof p==="function"?I(await p.call(i,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(i,f)):null),{old:h,next:b}=nr(m,w);if(b&&Object.keys(b).length>0){let k=await ie();await ae({auditable_type:t,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${t}#${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 a(async()=>{let m=i.find,g=typeof m==="function"?I(await m.call(i,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ie();await ae({auditable_type:t,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${t}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as rr,sql as or,sqlDateTime as Me}from"@stacksjs/database/runtime";function C(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",Q="commentables";function ir(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}var Rt=["pending","approved"];function Oe(e){let t=rr;return{async comments(n){return C(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(or`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r,o={}){if(C(n,"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 i=o.status??"pending";if(!Rt.includes(i))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(i)})`);let a={title:r.title?.trim()??"",body:r.body,commentables_id:n,commentables_type:e,status:i,approved_at:i==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)a[c]=r[c];let s=await t.insertInto("commentables").values(a).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await t.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(n,r){C(n,"upvoteComment"),C(r,"upvoteComment");let o=()=>t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst(),i=await o();if(i)return i;try{await t.insertInto(V).values({upvoteable_id:n,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(a){if(!ir(a))throw a}return await o()},async removeCommentUpvote(n,r){C(n,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await t.deleteFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(n){C(n,"commentUpvoteCount");let r=await t.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return C(n,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as sr,sqlDateTime as _t}from"@stacksjs/database/runtime";function De(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let t=ar;return{async tags(n){return De(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){De(n,"tagCount");let r=await t.selectFrom("taggables").select(sr`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(De(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:_t(),updated_at:_t()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as ur,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let t=ur;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((i)=>i.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let i=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),a=await i();if(!a)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:se(),updated_at:se()}).execute(),a=await i();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:a?.id,created_at:se(),updated_at:se()}).execute(),a},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as cr,sqlDateTime as lr}from"@stacksjs/database/runtime";function Fe(e,t){let n=cr,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(i){return await n.selectFrom(r).where(o,"=",i).selectAll().execute()},async likeCount(i){let a=await n.selectFrom(r).select("count(*) as count").where(o,"=",i).executeTakeFirst();return Number(a?.count)||0},async like(i,a){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(i)})`);if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(a)})`);let s=lr();try{return await n.insertInto(r).values({[o]:i,user_id:a,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 n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(i,a){await n.deleteFrom(r).where(o,"=",i).where("user_id","=",a).execute()},async isLiked(i,a){return!!await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst()},async likedBy(i){return(await n.selectFrom(r).select([o]).where("user_id","=",i).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as dr}from"module";import{db as fr}from"@stacksjs/database/runtime";var pr=dr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function St(e){let t=fr;return{async syncStripeCustomerDetails(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(n,r)},async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return typeof r==="string"?await o.setUserDefaultPayment(n,r):await o.setDefaultPaymentMethod(n,r)},async deletePaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.create(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.update(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(n,r,o={}){if(!await t.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",n.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let i=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:i}}return},async checkout(n,r,o={}){let{manageCheckout:i,manageCustomer:a}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await a.createOrGetStripeUser(n,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await i.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async createPayment(n,r,o={}){let{manageCharge:i}=await import("@stacksjs/payments");return await i.createPayment(n,r,o)},async storeTransaction(n,r,o){let{manageTransaction:i}=await import("@stacksjs/payments");return await i.store(n,r,o)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)return null;let a=await z();try{return await a.accounts.retrieve(i)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=n._attributes??n,a=i[o],s=await z();if(!a){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??i.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,i.id)});return a=l.id,await t.updateTable(c).set({[o]:a}).where("id","=",Number(i.id)).execute(),l}return await s.accounts.retrieve(a)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:a,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:a}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",i=r.chargesColumn||"charges_enabled",a=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await t.updateTable(p).set({[i]:f,[a]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(n,r){let o=await z(),i=r.accountColumn||"stripe_account_id",a=n._attributes??n,s=r.connectAccountId||a[i],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",a.id,r.amountCents)})}}}var mr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(mr));function gr(e){return ue.every((t)=>typeof Reflect.get(e,t)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=pr("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 t(e,{apiVersion:t.API_VERSION})}function Mt(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function yr(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(Mt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function P(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 i=r>0?e.charCodeAt(r-1):0,a=r+1<e.length?e.charCodeAt(r+1):0,s=i>=97&&i<=122||i>=48&&i<=57,u=i>=65&&i<=90&&a>=97&&a<=122;if(r>0&&(s||u))n+="_";n+=String.fromCharCode(o+32)}return n}function wr(e){let t={};for(let[n,r]of Object.entries(e))t[P(n)]=r;return t}function ou(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ot(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 Dt(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 iu(e){return e?.ownership===!1}function au(e,t,n){let r=Object.keys(e).find((i)=>P(i)===P(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((i)=>String(i)===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 i of Object.keys(o))if(P(i)===P(t))delete o[i];return o[t]=n,{data:o}}function br(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=P(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((i)=>`${i[0]?.toUpperCase()}${i.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function hr(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??=Tr(t);let i=r.get(o);if(i!==o&&i in e)n[o]=e[i]}return n}function kr(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]),i=Number(n[3]),a=new Date(Date.UTC(r,o-1,i));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==o-1||a.getUTCDate()!==i)return t;return a}var At=new WeakMap,Pt=new WeakMap;function Be(e){let t=At.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:P(r)}));return At.set(e,n),n}function Tr(e){let t=Be(e),n=Pt.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:i})=>[o,i]));return Pt.set(t,r),r}function su(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}function uu(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}var Rr=["id","uuid","created_at","updated_at","deleted_at"];function cu(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(P(r));return n}function lu(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let i=o.trim();if(!i)continue;let a=i.startsWith("-"),s=a?i.slice(1):i;if(!/^\w+$/.test(s))continue;let u=n.get(s);if(!u)continue;r=r.orderBy(u,a?"desc":"asc")}return r}var _r={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Ar(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function Sr(e,t){let n=xt.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let i=e[o],a=typeof i==="string"?_r[i]:i;r.push({attr:o,snake:P(o),definition:i,caster:a})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function du(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=Sr(t,r);if(o.length===0)return e;let i={...e};for(let{attr:a,caster:s,snake:u}of o){if(!s)continue;let c=s[n];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(i,a))i[a]=c.call(s,i[a]);if(u!==a&&Object.prototype.hasOwnProperty.call(i,u))i[u]=c.call(s,i[u])}return i}var Ct=new WeakMap;function xr(e){let t=Ct.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let i=o?.validation?.rule;if(!i||typeof i.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:i})}return Ct.set(e,n),n}function Et(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 jt(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let i={},a=!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&&n==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)a=!0,i[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return a?{valid:!1,errors:i}:{valid:!0}}function Cr(e,t){return`${e}\x00${vr(t)}`}function fu(e){let t=new Map;for(let n of e){let r=Cr(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function pu(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?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(n);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function mu(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(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:n,perPage:o,offset:(n-1)*o}}function ce(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function Or(e,t,n,r,o,i){let a=(t-1)*n,s=r===0,u={page:t,per_page:n,from:s?null:a+1,to:s?null:a+r,has_more_pages:o,prev_page_url:t>1?ce(e,t-1):null,next_page_url:o?ce(e,t+1):null};if(i!==void 0&&!Number.isNaN(i)){let c=Math.max(1,Math.ceil(i/n));u.total=i,u.last_page=c,u.first_page_url=ce(e,1),u.last_page_url=ce(e,c)}return u}function gu(e,t,n,r,o,i){let{page:a,...s}=Or(e,t,n,r,o,i);return{current_page:a,...s}}function yu(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function wu(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.`}function Dr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ot(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(Ne(o))}};let n=Dt(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Ne(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 i of r.split(";")){let a=i.indexOf("=");if(a===-1)continue;if(i.slice(0,a).trim()===o)return decodeURIComponent(i.slice(a+1).trim())}return null}}}}function Er(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 jr(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Fr(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")]),i=await r(Ne(n));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function $r(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(n))}catch{return null}}}}function Ir(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,a=Dr(i);if(!a?.field||typeof a.resolve!=="function")return[];let s=await a.resolve(n,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(a.field,s).get():await u.where(a.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Br}from"@stacksjs/router";var Ft=new WeakMap;function $t(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function Nr(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return $t(n??[]).get(t)}async function Lr(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((i)=>e.find?.(i))),o=$t(r??[]);for(let i of n.resolvers)i.resolve(o.get(i.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ru(e,t){let n=Br();if(!n)return Nr(e,t);let r=Ft.get(n);if(!r)r=new WeakMap,Ft.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let i=o.cache.get(t);if(i)return i.then();let a=o.pending;if(!a){a={keys:[],resolvers:[]},o.pending=a;let c=a,l=o;queueMicrotask(()=>{Lr(e,l,c)})}let s=new Promise((c,l)=>{a.keys.push(t),a.resolvers.push({key:t,resolve:c,reject:l})});o.cache.set(t,s);let u=o.cache;return s.catch(()=>u.delete(t)),s.then()}import{db as Pu}from"@stacksjs/database/runtime";class qr{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("and","where",e,o,i)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("or","where",e,o,i)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,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,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Le}from"@stacksjs/database/runtime";async function qe(e,t){return await Le.transaction(e,t)}async function vu(e){return await Le.savepoint(e)}function Mu(e,t){return Le.transactional(e,t)}import{randomUUID as Yr}from"crypto";import{db as x,getDatabaseDialect as Xr,parseSqlDateTime as Zr,sqlDateTime as zt}from"@stacksjs/database/runtime";import{plural as Gr,snakeCase as H}from"@stacksjs/strings";var It=new Set(["anonymize","delete","keep"]),Bt=new Set(["anonymize","delete"]),Nt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
|
|
2
|
+
var dt=(e,t,n)=>()=>{if(e)try{t=e(e=0)}catch(r){n=[r]}if(n)throw n[0];return t};var Vn=import.meta.require;import{readdirSync as Qr}from"fs";import{basename as zr,extname as Gt,join as Hr}from"path";function Jr(e){let t=[],n=(r)=>{let o;try{o=Qr(r,{withFileTypes:!0})}catch{return}for(let i of o){let a=Hr(r,i.name);if(i.isDirectory()){n(a);continue}if(![".ts",".js"].includes(Gt(i.name)))continue;if(i.name.startsWith(".")||i.name.startsWith("index"))continue;t.push(a)}};return n(e),t.sort()}async function qt(e,t,n){for(let r of Jr(e))try{let o=Gt(r),i=await import(`${r}?t=${Date.now()}`),a=i.default??i,s=a.name??zr(r,o);t[s]={...a,name:s}}catch(o){n?.(r,o)}}async function Ut(e){let t={};return await qt(e.defaultsRoot,t,e.onImportError),await qt(e.userRoot,t,e.onImportError),t}var Kt=()=>{};import{path as Wt}from"@stacksjs/path";async function Ue(){return Ut({defaultsRoot:Wt.frameworkPath("defaults/app/Models"),userRoot:Wt.userModelsPath()})}var Ke=dt(()=>{Kt()});import"@stacksjs/validation/runtime";import{log as Ae}from"@stacksjs/cli";import{db as ft,mutationCount as pt}from"@stacksjs/database/runtime";async function Qn(e,t={}){let{olderThanDays:n=30,column:r="created_at",query:o}=t;try{if(o){let u=ft.deleteFrom(e);u=o(u);let c=pt(await u.execute());return Ae.info(`Pruned ${c} records from ${e}`),c}let i=new Date;i.setDate(i.getDate()-n);let a=await ft.deleteFrom(e).where(r,"<",i.toISOString()).execute(),s=pt(a);return Ae.info(`Pruned ${s} records from ${e} older than ${n} days`),s}catch(i){throw Ae.error(`Failed to prune ${e}:`,i),i}}async function Bs(e,t={}){return Qn(e,t)}function Ns(e){if(!e?.prunable)return null;if(typeof e.prunable==="boolean")return{olderThanDays:30,column:"created_at"};return e.prunable}import{createCipheriv as zn,createDecipheriv as Hn,createHash as Jn,randomBytes as Yn}from"crypto";import{log as oe}from"@stacksjs/logging";var mt="enc:",gt="aes-256-gcm",Xn=12,re=null;async function yt(){if(re)return re;let e=process.env.APP_KEY;if(!e)try{e=(await import("@stacksjs/config").catch(()=>null))?.config?.app?.key}catch{}if(!e)return null;return re=Jn("sha256").update(e).digest(),re}function K(e){return typeof e==="string"&&e.startsWith(mt)}async function Pe(e){if(e==null)return e;if(K(e))return e;if(typeof e!=="string")return e;let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - storing value in plaintext"),e;let n=Yn(Xn),r=zn(gt,t,n),o=Buffer.concat([r.update(e,"utf8"),r.final()]),i=r.getAuthTag();return`${mt}${n.toString("base64")}:${i.toString("base64")}:${o.toString("base64")}`}async function xe(e){if(e==null)return e;if(typeof e!=="string")return e;if(!K(e))return e;try{let t=await yt();if(!t)return oe.warn("[orm] encrypted attribute: APP_KEY not set - cannot decrypt"),null;let[,n,r,o]=e.split(":");if(!n||!r||!o)return oe.warn("[orm] encrypted attribute: malformed envelope, returning null"),null;let i=Buffer.from(n,"base64"),a=Buffer.from(r,"base64"),s=Buffer.from(o,"base64"),u=Hn(gt,t,i);return u.setAuthTag(a),Buffer.concat([u.update(s),u.final()]).toString("utf8")}catch(t){return oe.warn("[orm] encrypted attribute: decrypt failed (key rotation? corrupted ciphertext?)",{error:t}),null}}function Ce(e){let t=e.attributes;if(!t||typeof t!=="object")return[];let n=[];for(let[r,o]of Object.entries(t))if(o&&typeof o==="object"&&o.encrypted===!0)n.push(r);return n}import{sqlDateTime as Zn}from"@stacksjs/database/runtime";import{log as B}from"@stacksjs/logging";var er=[/^password$/i,/^password_hash$/i,/^api_key$/i,/_token$/i,/_secret$/i,/^remember_token$/i],bt="model_audits",ve=null;function tr(e){ve=e}async function ie(){if(ve!=null)return ve;try{let e=await import("@stacksjs/router").catch(()=>null);if(!e)return null;let t=e.getCurrentRequest;if(typeof t!=="function")return null;let n=t();if(!n)return null;return(n.user??n._user)?.id??null}catch{return null}}function W(e){if(!e||typeof e!=="object")return null;let t={};for(let[n,r]of Object.entries(e)){if(er.some((o)=>o.test(n)))continue;t[n]=r}return t}function I(e){if(!e||typeof e!=="object")return null;let t=e;if(t._attributes&&typeof t._attributes==="object")return{...t._attributes};return{...e}}function nr(e,t){if(!e||!t)return{old:e,next:t};let n={},r={},o=new Set([...Object.keys(e),...Object.keys(t)]);for(let i of o)if(e[i]!==t[i])n[i]=e[i],r[i]=t[i];return{old:n,next:r}}async function ae(e,t=!1){try{let{db:n}=await import("@stacksjs/database/runtime");await n.insertInto(bt).values({auditable_type:e.auditable_type,auditable_id:e.auditable_id,event:e.event,old_values:e.old_values?JSON.stringify(e.old_values):null,new_values:e.new_values?JSON.stringify(e.new_values):null,user_id:e.user_id,created_at:Zn()}).executeTakeFirst()}catch(n){if(B.warn(`[orm] audit row write failed for ${e.auditable_type}#${String(e.auditable_id)} (${e.event})`,{error:n}),t)throw n}}function ht(e){return{async audits(t){try{let{db:n}=await import("@stacksjs/database/runtime");return(await n.selectFrom(bt).selectAll().where("auditable_type","=",e).where("auditable_id","=",t).orderBy("created_at","desc").execute()??[]).map((o)=>({...o,old_values:typeof o.old_values==="string"?wt(o.old_values):o.old_values,new_values:typeof o.new_values==="string"?wt(o.new_values):o.new_values}))}catch(n){return B.warn(`[orm] audits() lookup failed for ${e}#${String(t)}`,{error:n}),[]}}}}function wt(e){try{return JSON.parse(e)}catch{return e}}function kt(e){if(e&&typeof e==="object"&&"transactional"in e)return{transactional:e.transactional===!0};return{transactional:!1}}function Tt(e,t,n="id",r={}){let o=r.transactional===!0,i=e;if(typeof e.audits!=="function")e.audits=ht(t).audits;let a=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 a(async()=>{let d=await s.apply(this,f);try{let p=I(d),m=p?.[n];if(m!=null){let g=await ie();await ae({auditable_type:t,auditable_id:m,event:"created",old_values:null,new_values:W(p),user_id:g},o)}}catch(p){if(B.warn(`[orm] audit(create) failed for ${t}`,{error:p}),o)throw p}return d})};let u=e.createMany;if(typeof u==="function")e.createMany=async function(...f){return await a(async()=>{let d=await u.apply(this,f);try{let p=Array.isArray(d)&&d.length?await ie():null;for(let m of Array.isArray(d)?d:[]){let g=I(m),w=g?.[n];if(w==null)continue;await ae({auditable_type:t,auditable_id:w,event:"created",old_values:null,new_values:W(g),user_id:p},o)}}catch(p){if(B.warn(`[orm] audit(createMany) failed for ${t}`,{error:p}),o)throw p}return d})};let c=e.update;if(typeof c==="function")e.update=async function(f,d){return await a(async()=>{let p=i.find,m=typeof p==="function"?I(await p.call(i,f)):null,g=await c.call(this,f,d);try{let w=I(g)??(typeof p==="function"?I(await p.call(i,f)):null),{old:h,next:b}=nr(m,w);if(b&&Object.keys(b).length>0){let k=await ie();await ae({auditable_type:t,auditable_id:f,event:"updated",old_values:W(h),new_values:W(b),user_id:k},o)}}catch(w){if(B.warn(`[orm] audit(update) failed for ${t}#${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 a(async()=>{let m=i.find,g=typeof m==="function"?I(await m.call(i,p)):null,w=await d.call(this,p);try{if(w!==!1&&g){let h=await ie();await ae({auditable_type:t,auditable_id:p,event:"deleted",old_values:W(g),new_values:null,user_id:h},o)}}catch(h){if(B.warn(`[orm] audit(${f}) failed for ${t}#${String(p)}`,{error:h}),o)throw h}return w})}};l("delete"),l("softDelete")}import{db as rr,sql as or,sqlDateTime as Me}from"@stacksjs/database/runtime";function C(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/commentable] ${t} requires a positive numeric id (received ${String(e)})`)}var V="commentable_upvotes",Q="commentables";function ir(e){let t=e;return t.code==="SQLITE_CONSTRAINT_UNIQUE"||t.code==="SQLITE_CONSTRAINT"||t.code==="23505"||t.errno===1062||/unique|duplicate/i.test(t.message??"")}var Rt=["pending","approved"];function Oe(e){let t=rr;return{async comments(n){return C(n,"comments"),await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).selectAll().orderBy("id","asc").execute()},async commentCount(n){let r=await t.selectFrom("commentables").select(or`count(*) as count`).where("commentables_id","=",n).where("commentables_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addComment(n,r,o={}){if(C(n,"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 i=o.status??"pending";if(!Rt.includes(i))throw Error(`[orm/commentable] addComment status must be one of ${Rt.join(", ")} (received ${String(i)})`);let a={title:r.title?.trim()??"",body:r.body,commentables_id:n,commentables_type:e,status:i,approved_at:i==="approved"?Date.now():null,created_at:Me(),updated_at:Me()};for(let c of["author_name","author_email","user_id"])if(r[c]!=null)a[c]=r[c];let s=await t.insertInto("commentables").values(a).returningAll().executeTakeFirst();if(s&&typeof s==="object"&&"id"in s)return s;let u=s?.lastInsertRowid;if(u==null)return s;return await t.selectFrom("commentables").where("id","=",Number(u)).selectAll().executeTakeFirst()},async approvedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","approved").selectAll().orderBy("id","asc").execute()},async pendingComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","pending").selectAll().orderBy("id","asc").execute()},async rejectedComments(n){return await t.selectFrom("commentables").where("commentables_id","=",n).where("commentables_type","=",e).where("status","=","rejected").selectAll().orderBy("id","asc").execute()},async upvoteComment(n,r){C(n,"upvoteComment"),C(r,"upvoteComment");let o=()=>t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst(),i=await o();if(i)return i;try{await t.insertInto(V).values({upvoteable_id:n,upvoteable_type:Q,user_id:r,created_at:Me()}).execute()}catch(a){if(!ir(a))throw a}return await o()},async removeCommentUpvote(n,r){C(n,"removeCommentUpvote"),C(r,"removeCommentUpvote"),await t.deleteFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).execute()},async commentUpvoteCount(n){C(n,"commentUpvoteCount");let r=await t.selectFrom(V).select("count(*) as count").where("upvoteable_id","=",n).where("upvoteable_type","=",Q).executeTakeFirst();return Number(r?.count)||0},async hasUpvotedComment(n,r){return C(n,"hasUpvotedComment"),C(r,"hasUpvotedComment"),!!await t.selectFrom(V).where("upvoteable_id","=",n).where("upvoteable_type","=",Q).where("user_id","=",r).selectAll().executeTakeFirst()}}}import{db as ar,sql as sr,sqlDateTime as _t}from"@stacksjs/database/runtime";function De(e,t){if(typeof e!=="number"||!Number.isFinite(e)||e<=0)throw Error(`[orm/taggable] ${t} requires a positive numeric id (received ${String(e)})`)}function Ee(e){let t=ar;return{async tags(n){return De(n,"tags"),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).selectAll().execute()},async tagCount(n){De(n,"tagCount");let r=await t.selectFrom("taggables").select(sr`count(*) as count`).where("taggable_id","=",n).where("taggable_type","=",e).executeTakeFirst();return Number(r?.count)||0},async addTag(n,r){if(De(n,"addTag"),!r||typeof r.name!=="string"||r.name.trim().length===0)throw Error("[orm/taggable] addTag requires a non-empty tag.name");return await t.insertInto("taggables").values({...r,taggable_id:n,taggable_type:e,slug:r.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),is_active:!0,created_at:_t(),updated_at:_t()}).execute(),await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("name","=",r.name).selectAll().executeTakeFirst()},async activeTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!0).selectAll().execute()},async inactiveTags(n){return await t.selectFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("is_active","=",!1).selectAll().execute()},async removeTag(n,r){await t.deleteFrom("taggables").where("taggable_id","=",n).where("taggable_type","=",e).where("id","=",r).execute()}}}import{db as ur,sqlDateTime as se}from"@stacksjs/database/runtime";function je(e){let t=ur;async function n(r){return(await t.selectFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).selectAll().execute()).map((i)=>i.category_id)}return{async categories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).selectAll().execute()},async categoryCount(r){return(await n(r)).length},async addCategory(r,o){let i=()=>t.selectFrom("categorizables").where("name","=",o.name).where("categorizable_type","=",e).selectAll().executeTakeFirst(),a=await i();if(!a)await t.insertInto("categorizables").values({name:o.name,description:o.description,slug:o.name.toLowerCase().replace(/[^a-z0-9]+/g,"-"),categorizable_type:e,is_active:!0,created_at:se(),updated_at:se()}).execute(),a=await i();return await t.insertInto("categorizable_models").values({categorizable_id:r,categorizable_type:e,category_id:a?.id,created_at:se(),updated_at:se()}).execute(),a},async activeCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!0).selectAll().execute()},async inactiveCategories(r){let o=await n(r);if(o.length===0)return[];return await t.selectFrom("categorizables").where("id","in",o).where("is_active","=",!1).selectAll().execute()},async removeCategory(r,o){await t.deleteFrom("categorizable_models").where("categorizable_id","=",r).where("categorizable_type","=",e).where("category_id","=",o).execute()}}}import{db as cr,sqlDateTime as lr}from"@stacksjs/database/runtime";function Fe(e,t){let n=cr,r=t?.table||`${e}_likes`,o=t?.foreignKey||`${e.replace(/s$/,"")}_id`;return{async likes(i){return await n.selectFrom(r).where(o,"=",i).selectAll().execute()},async likeCount(i){let a=await n.selectFrom(r).select("count(*) as count").where(o,"=",i).executeTakeFirst();return Number(a?.count)||0},async like(i,a){if(typeof i!=="number"||!Number.isFinite(i)||i<=0)throw Error(`[orm/likeable] like requires a positive numeric id (received ${String(i)})`);if(typeof a!=="number"||!Number.isFinite(a)||a<=0)throw Error(`[orm/likeable] like requires a positive numeric userId (received ${String(a)})`);let s=lr();try{return await n.insertInto(r).values({[o]:i,user_id:a,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 n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst();if(f)return f;throw u}},async unlike(i,a){await n.deleteFrom(r).where(o,"=",i).where("user_id","=",a).execute()},async isLiked(i,a){return!!await n.selectFrom(r).where(o,"=",i).where("user_id","=",a).selectAll().executeTakeFirst()},async likedBy(i){return(await n.selectFrom(r).select([o]).where("user_id","=",i).execute()).map((s)=>Number(s[o])).filter(Boolean)}}}import{createRequire as dr}from"module";import{db as fr}from"@stacksjs/database/runtime";var pr=dr(import.meta.url);class $e extends Error{constructor(e){super(`No subscription ${e} belongs to this user`);this.name="SubscriptionNotOwnedError"}}function St(e){let t=fr;return{async syncStripeCustomerDetails(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.syncStripeCustomerDetails(n,r)},async createStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createStripeCustomer(n,r)},async updateStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.updateStripeCustomer(n,r)},async deleteStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.deleteStripeUser(n)},async createOrGetStripeUser(n,r){let{manageCustomer:o}=await import("@stacksjs/payments");return await o.createOrGetStripeUser(n,r)},async retrieveStripeUser(n){let{manageCustomer:r}=await import("@stacksjs/payments");return await r.retrieveStripeUser(n)},async defaultPaymentMethod(n){let{managePaymentMethod:r}=await import("@stacksjs/payments");return await r.retrieveDefaultPaymentMethod(n)},async setDefaultPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return typeof r==="string"?await o.setUserDefaultPayment(n,r):await o.setDefaultPaymentMethod(n,r)},async deletePaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.deletePaymentMethod(n,r)},async addPaymentMethod(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.addPaymentMethod(n,r)},async paymentMethods(n,r){let{managePaymentMethod:o}=await import("@stacksjs/payments");return await o.listPaymentMethods(n,r)},async newSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.create(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async updateSubscription(n,r,o,i={}){let{manageSubscription:a}=await import("@stacksjs/payments"),s=await a.update(n,r,o,i),c=s.latest_invoice?.payment_intent;return{subscription:s,paymentIntent:c}},async cancelSubscription(n,r,o={}){if(!await t.selectFrom("subscriptions").where("provider_id","=",r).where("user_id","=",n.id).select(["id"]).executeTakeFirst())throw new $e(r);let{manageSubscription:a}=await import("@stacksjs/payments");return{subscription:await a.cancel(r,o)}},async activeSubscription(n){let{manageSubscription:r}=await import("@stacksjs/payments"),o=await t.selectFrom("subscriptions").where("user_id","=",n.id).where("provider_status","=","active").selectAll().executeTakeFirst();if(o){let i=await r.retrieve(n,o.provider_id||"");return{subscription:o,providerSubscription:i}}return},async checkout(n,r,o={}){let{manageCheckout:i,manageCustomer:a}=await import("@stacksjs/payments"),s={};if(o.enableTax)s.automatic_tax={enabled:!0},delete o.enableTax;if(o.allowPromotions)s.allow_promotion_codes=!0,delete o.allowPromotions;let l={...{mode:"payment",customer:(await a.createOrGetStripeUser(n,{})).id,line_items:r.map((f)=>({price:f.priceId,quantity:f.quantity||1}))},...s,...o};return await i.create(n,l)},async createSetupIntent(n,r={}){let{manageSetupIntent:o}=await import("@stacksjs/payments");return await o.create(n,r)},async createPayment(n,r,o={}){let{manageCharge:i}=await import("@stacksjs/payments");return await i.createPayment(n,r,o)},async storeTransaction(n,r,o){let{manageTransaction:i}=await import("@stacksjs/payments");return await i.store(n,r,o)},async subscriptionHistory(n){let{manageInvoice:r}=await import("@stacksjs/payments");return await r.list(n)},async transactionHistory(n){let{manageTransaction:r}=await import("@stacksjs/payments");return await r.list(n)},async connectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=(n._attributes??n)[o];if(!i)return null;let a=await z();try{return await a.accounts.retrieve(i)}catch{return null}},async createConnectAccount(n,r={}){let o=r.accountColumn||"stripe_account_id",i=n._attributes??n,a=i[o],s=await z();if(!a){let{stacksIdempotencyKey:u}=await import("@stacksjs/payments"),c=r.modelTable||e,l=await s.accounts.create({type:r.type??"express",email:r.email??i.email,country:r.country??"US",capabilities:r.capabilities??{card_payments:{requested:!0},transfers:{requested:!0}}},{idempotencyKey:u("connect.account.create",c,i.id)});return a=l.id,await t.updateTable(c).set({[o]:a}).where("id","=",Number(i.id)).execute(),l}return await s.accounts.retrieve(a)},async connectOnboardLink(n,r){let o=r.accountColumn||"stripe_account_id",a=(n._attributes??n)[o];if(!a)throw Error("connectOnboardLink: model has no Stripe Connect account; call createConnectAccount first");return{url:(await(await z()).accountLinks.create({account:a,refresh_url:r.refreshUrl,return_url:r.returnUrl,type:r.type??"account_onboarding"})).url,accountId:a}},async syncConnectStatus(n,r={}){let o=r.accountColumn||"stripe_account_id",i=r.chargesColumn||"charges_enabled",a=r.payoutsColumn||"payouts_enabled",s=n._attributes??n,u=s[o];if(!u)return{chargesEnabled:!1,payoutsEnabled:!1};let l=await(await z()).accounts.retrieve(u),f=!!l.charges_enabled,d=!!l.payouts_enabled,p=r.modelTable||e;return await t.updateTable(p).set({[i]:f,[a]:d}).where("id","=",Number(s.id)).execute(),{chargesEnabled:f,payoutsEnabled:d}},async chargeWithSplit(n,r){let o=await z(),i=r.accountColumn||"stripe_account_id",a=n._attributes??n,s=r.connectAccountId||a[i],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",a.id,r.amountCents)})}}}var mr={syncStripeCustomerDetails:!0,createStripeUser:!0,updateStripeUser:!0,deleteStripeUser:!0,createOrGetStripeUser:!0,retrieveStripeUser:!0,defaultPaymentMethod:!0,setDefaultPaymentMethod:!0,deletePaymentMethod:!0,addPaymentMethod:!0,paymentMethods:!0,newSubscription:!0,updateSubscription:!0,cancelSubscription:!0,activeSubscription:!0,checkout:!0,createSetupIntent:!0,createPayment:!0,storeTransaction:!0,subscriptionHistory:!0,transactionHistory:!0,connectAccount:!0,createConnectAccount:!0,connectOnboardLink:!0,syncConnectStatus:!0,chargeWithSplit:!0},ue=Object.freeze(Object.keys(mr));function gr(e){return ue.every((t)=>typeof Reflect.get(e,t)==="function")}function z(){let e=globalThis.process?.env?.STRIPE_SECRET_KEY;if(!e)throw Error("Stripe Connect: STRIPE_SECRET_KEY not configured");let t;try{t=pr("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 t(e,{apiVersion:t.API_VERSION})}function Mt(e){let t=e;return t?.code==="SQLITE_CONSTRAINT_UNIQUE"||t?.code==="SQLITE_CONSTRAINT"||t?.code==="23505"||t?.errno===1062||/unique|duplicate/i.test(t?.message??"")}function yr(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(Mt(e))return{status:409,body:{error:`${t} already exists`}};return{status:500,body:{error:`Failed to ${n} ${t}`,detail:String(e)}}}function P(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 i=r>0?e.charCodeAt(r-1):0,a=r+1<e.length?e.charCodeAt(r+1):0,s=i>=97&&i<=122||i>=48&&i<=57,u=i>=65&&i<=90&&a>=97&&a<=122;if(r>0&&(s||u))n+="_";n+=String.fromCharCode(o+32)}return n}function wr(e){let t={};for(let[n,r]of Object.entries(e))t[P(n)]=r;return t}function ou(e,t){let n=String(t||"").replace(/^\/+|\/+$/g,""),r=String(e).replace(/^\/+/,"");return`/api/${n?`${n}/`:""}${r}`}function Ot(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 Dt(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 iu(e){return e?.ownership===!1}function au(e,t,n){let r=Object.keys(e).find((i)=>P(i)===P(t));if(Array.isArray(n)){if(r===void 0)return{data:e,error:"Ownership value is required"};if(!n.some((i)=>String(i)===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 i of Object.keys(o))if(P(i)===P(t))delete o[i];return o[t]=n,{data:o}}function br(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=P(n.trim()).split("_").filter(Boolean);if(r.length===0)continue;let o=`${r[0]}${r.slice(1).map((i)=>`${i[0]?.toUpperCase()}${i.slice(1)}`).join("")}Id`;t.push(o)}return[...new Set(t)]}function hr(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??=Tr(t);let i=r.get(o);if(i!==o&&i in e)n[o]=e[i]}return n}function kr(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]),i=Number(n[3]),a=new Date(Date.UTC(r,o-1,i));if(a.getUTCFullYear()!==r||a.getUTCMonth()!==o-1||a.getUTCDate()!==i)return t;return a}var At=new WeakMap,Pt=new WeakMap;function Be(e){let t=At.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:P(r)}));return At.set(e,n),n}function Tr(e){let t=Be(e),n=Pt.get(t);if(n)return n;let r=new Map(t.map(({field:o,snake:i})=>[o,i]));return Pt.set(t,r),r}function su(e,t){if(!t.length)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}function uu(e,t){if(!e||t.length===0)return e;let n={...e};for(let{field:r,snake:o}of Be(t))if(delete n[r],o!==r)delete n[o];return n}var Rr=["id","uuid","created_at","updated_at","deleted_at"];function cu(e,t){let n=new Map;for(let r of[...Object.keys(e??{}),...Rr]){let o=P(r);if(!/^\w+$/.test(o))continue;n.set(r,o),n.set(o,o)}for(let r of t)n.delete(r),n.delete(P(r));return n}function lu(e,t,n){if(!t)return e;let r=e;for(let o of String(t).split(",")){let i=o.trim();if(!i)continue;let a=i.startsWith("-"),s=a?i.slice(1):i;if(!/^\w+$/.test(s))continue;let u=n.get(s);if(!u)continue;r=r.orderBy(u,a?"desc":"asc")}return r}var _r={string:{get:(e)=>e!=null?String(e):null,set:(e)=>e!=null?String(e):null},number:{get:(e)=>e!=null?Number(e):null,set:(e)=>e!=null?Number(e):null},integer:{get:(e)=>e!=null?Math.trunc(Number(e)):null,set:(e)=>e!=null?Math.trunc(Number(e)):null},float:{get:(e)=>e!=null?Number.parseFloat(String(e)):null,set:(e)=>e!=null?Number.parseFloat(String(e)):null},boolean:{get:(e)=>e===1||e==="1"||e===!0||e==="true",set:(e)=>e===!0||e===1||e==="1"||e==="true"?1:0},json:{get:(e)=>e==null?null:typeof e==="string"?Ar(e):e,set:(e)=>e==null?null:typeof e==="string"?e:JSON.stringify(e)},datetime:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString():e},date:{get:(e)=>e?new Date(e):null,set:(e)=>e instanceof Date?e.toISOString().split("T")[0]:e},array:{get:(e)=>e==null?[]:Array.isArray(e)?e:typeof e==="string"?Pr(e):[],set:(e)=>e==null?null:Array.isArray(e)?JSON.stringify(e):e}},xt=new WeakMap;function Sr(e,t){let n=xt.get(e);if(n&&n.length===t.length){let o=!0;for(let i=0;i<t.length;i++){let a=t[i];if(n[i]?.attr!==a||n[i]?.definition!==e[a]){o=!1;break}}if(o)return n}let r=[];for(let o of t){let i=e[o],a=typeof i==="string"?_r[i]:i;r.push({attr:o,snake:P(o),definition:i,caster:a})}return xt.set(e,r),r}function Ar(e){try{return JSON.parse(e)}catch{return e}}function Pr(e){try{return JSON.parse(e)}catch{return[]}}function du(e,t,n){if(!e||typeof e!=="object"||!t)return e;let r=Object.keys(t);if(r.length===0)return e;let o=Sr(t,r);if(o.length===0)return e;let i={...e};for(let{attr:a,caster:s,snake:u}of o){if(!s)continue;let c=s[n];if(typeof c!=="function")continue;if(Object.prototype.hasOwnProperty.call(i,a))i[a]=c.call(s,i[a]);if(u!==a&&Object.prototype.hasOwnProperty.call(i,u))i[u]=c.call(s,i[u])}return i}var Ct=new WeakMap;function xr(e){let t=Ct.get(e);if(t)return t;let n=[];for(let[r,o]of Object.entries(e)){let i=o?.validation?.rule;if(!i||typeof i.validate!=="function")continue;n.push({definition:o,field:r,hasDefault:o!==null&&typeof o==="object"&&Object.prototype.hasOwnProperty.call(o,"default"),rule:i})}return Ct.set(e,n),n}function Et(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 jt(e,t,n){let r=t?.attributes;if(!r||typeof r!=="object")return{valid:!0};let o=xr(r);if(o.length===0)return{valid:!0};let i={},a=!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&&n==="updating")continue;let p=d?e[c]:l?u.default:void 0,m=kr(f,p),g=f.validate(m);if(!g?.valid&&Array.isArray(g?.errors)&&g.errors.length>0)a=!0,i[c]=g.errors.map((w)=>u.validation?.message?.[w?.code]??w?.message??"invalid")}return a?{valid:!1,errors:i}:{valid:!0}}function Cr(e,t){return`${e}\x00${vr(t)}`}function fu(e){let t=new Map;for(let n of e){let r=Cr(String(n.method??""),String(n.path??""));if(!t.has(r))t.set(r,n)}return t}function vr(e){return e.replace(/\{[^}]*\}/g,"{}").replace(/:[^/]+/g,"{}")}function Ie(e){if(Array.isArray(e))return e.filter((t)=>typeof t==="string"&&t.length>0);return typeof e==="string"&&e?[e]:[]}function pu(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?Ie(o.read):["auth"],write:"write"in o?Ie(o.write):["auth"],declared:!0}}let r=Ie(n);return{read:r,write:r,declared:!0}}var vt=15,Mr=100;function mu(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(vt),10),o=Math.min(Number.isFinite(r)?Math.max(1,r):vt,Mr);return{page:n,perPage:o,offset:(n-1)*o}}function ce(e,t){let n=new URL(e.toString());return n.searchParams.set("page",String(t)),`${n.pathname}${n.search}`}function Or(e,t,n,r,o,i){let a=(t-1)*n,s=r===0,u={page:t,per_page:n,from:s?null:a+1,to:s?null:a+r,has_more_pages:o,prev_page_url:t>1?ce(e,t-1):null,next_page_url:o?ce(e,t+1):null};if(i!==void 0&&!Number.isNaN(i)){let c=Math.max(1,Math.ceil(i/n));u.total=i,u.last_page=c,u.first_page_url=ce(e,1),u.last_page_url=ce(e,c)}return u}function gu(e,t,n,r,o,i){let{page:a,...s}=Or(e,t,n,r,o,i);return{current_page:a,...s}}function yu(e,t){return(t??e??"").toString().trim().toLowerCase()==="warn"?"warn":"deny"}function wu(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.`}function Dr(e){if(e?.ownership===!1)return null;if(e?.ownership)return e.ownership;let t=Ot(e);if(t)return{field:t,resolve:async(r,o)=>{let{resolveAuthenticatedTeamId:i}=await import("@stacksjs/auth");return i(Ne(o))}};let n=Dt(e);if(n)return{field:n,resolve:async(r)=>r?.id??null};return null}function Ne(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 i of r.split(";")){let a=i.indexOf("=");if(a===-1)continue;if(i.slice(0,a).trim()===o)return decodeURIComponent(i.slice(a+1).trim())}return null}}}}function Er(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 jr(e="id"){return{field:e,resolve:async(t)=>t?.id??null}}function Fr(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")]),i=await r(Ne(n));if(i==null)return[];return(await o.where("team_id",i).get()??[]).map((s)=>s.id).filter((s)=>s!=null)}catch{return[]}}}}function $r(e="id"){return{field:e,resolve:async(t,n)=>{try{let{resolveAuthenticatedTeamId:r}=await import("@stacksjs/auth");return await r(Ne(n))}catch{return null}}}}function Ir(e,t){return{field:t,resolve:async(n,r)=>{try{let o=await import("@stacksjs/orm"),i=o.models?.[e]??o[e]?.definition??null,a=Dr(i);if(!a?.field||typeof a.resolve!=="function")return[];let s=await a.resolve(n,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(a.field,s).get():await u.where(a.field,s).get())??[]).map((l)=>l.id).filter((l)=>l!=null)}catch{return[]}}}}import{getCurrentRequest as Br}from"@stacksjs/router";var Ft=new WeakMap;function $t(e){let t=new Map;for(let n of e){let r=n?.id;if(r!==void 0)t.set(r,n)}return t}async function Nr(e,t){if(typeof e.find==="function")return e.find(t);let n=await e.findMany?.([t]);return $t(n??[]).get(t)}async function Lr(e,t,n){t.pending=void 0;try{let r=typeof e.findMany==="function"?await e.findMany(n.keys):await Promise.all(n.keys.map((i)=>e.find?.(i))),o=$t(r??[]);for(let i of n.resolvers)i.resolve(o.get(i.key))}catch(r){for(let o of n.resolvers)o.reject(r)}}function Ru(e,t){let n=Br();if(!n)return Nr(e,t);let r=Ft.get(n);if(!r)r=new WeakMap,Ft.set(n,r);let o=r.get(e);if(!o)o={cache:new Map},r.set(e,o);let i=o.cache.get(t);if(i)return i.then();let a=o.pending;if(!a){a={keys:[],resolvers:[]},o.pending=a;let c=a,l=o;queueMicrotask(()=>{Lr(e,l,c)})}let s=new Promise((c,l)=>{a.keys.push(t),a.resolvers.push({key:t,resolve:c,reject:l})});o.cache.set(t,s);let u=o.cache;return s.catch(()=>u.delete(t)),s.then()}import{db as Pu}from"@stacksjs/database/runtime";class qr{conditions=[];where(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("and","where",e,o,i)}orWhere(e,...t){let[n,r]=t,o=r===void 0?"=":n,i=r===void 0?n:r;this.addCondition("or","where",e,o,i)}whereIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t})}whereNotIn(e,t){this.conditions.push({type:"and",method:"whereIn",column:e,values:t,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,t){this.conditions.push({type:"and",method:"whereBetween",column:e,range:t})}whereExists(e){this.conditions.push({type:"and",method:"whereExists",column:"",callback:e})}addCondition(e,t,n,r,o){this.conditions.push({type:e,method:t,column:n,operator:r,value:o})}getConditions(){return this.conditions}}import{db as Le}from"@stacksjs/database/runtime";async function qe(e,t){return await Le.transaction(e,t)}async function vu(e){return await Le.savepoint(e)}function Mu(e,t){return Le.transactional(e,t)}import{randomUUID as Yr}from"crypto";import{db as x,getDatabaseDialect as Xr,parseSqlDateTime as Zr,sqlDateTime as zt}from"@stacksjs/database/runtime";import{plural as Gr,snakeCase as H}from"@stacksjs/strings";var It=new Set(["anonymize","delete","keep"]),Bt=new Set(["anonymize","delete"]),Nt=new Set(["consent","contract","legal_obligation","vital_interests","public_task","legitimate_interests"]),M="User";class Ge extends Error{problems;constructor(e){super(`GDPR declarations cannot be honoured:
|
|
3
3
|
${e.map((t)=>` - ${t.model}: ${t.message}`).join(`
|
|
4
4
|
`)}`);this.name="GdprDeclarationError",this.problems=e}}function Ur(e){return(Array.isArray(e)?e.map((n)=>[n.name??"",n]):Object.entries(e)).map(([n,r])=>({name:String(r?.name??n),definition:r})).filter((n)=>n.name&&n.definition&&typeof n.definition==="object").sort((n,r)=>n.name.localeCompare(r.name))}function Lt(e,t){return t.table??H(Gr(e))}function Kr(e){let t=e.belongsTo,n=Array.isArray(t)?t:t&&typeof t==="object"?Object.values(t):[],r=[];for(let o of n){if(typeof o==="string"){r.push({model:o,foreignKey:`${H(o)}_id`});continue}if(o&&typeof o==="object"&&typeof o.model==="string"){let i=o;r.push({model:i.model,foreignKey:i.foreignKey??`${H(i.model)}_id`})}}return r}function Wr(e){if(e===!0)return{};if(e&&typeof e==="object")return e;return null}function Vr(e,t){if(t.anonymize!==void 0)return{perRow:!1,value:t.anonymize};if(!(e.required===!0&&e.nullable!==!0))return{perRow:!1,value:null};let r=e.validation?.rule?.name??e.type??"string";if(r==="string"||r==="text")return e.unique?{perRow:!0,value:null}:{perRow:!1,value:"[erased]"};if(e.unique)return{problem:`is a NOT NULL unique ${r} column; declare personal: { anonymize: <value> } or make it nullable`};if(r==="number"||r==="integer"||r==="float"||r==="decimal")return{perRow:!1,value:0};if(r==="boolean")return{perRow:!1,value:!1};if(r==="json")return{perRow:!1,value:"{}"};return{problem:`is a NOT NULL ${r} column with no safe placeholder; declare personal: { anonymize: <value> }`}}function le(e){let t=new Map,n=new Map,r=[],o=[],i=(s,u)=>{o.push({model:s,message:u})};for(let{name:s,definition:u}of Ur(e)){let c=u.attributes??{},l=u.traits?.gdpr,f=Kr(u),d=f.find((T)=>T.model===M),p=Object.entries(c).map(([T,A])=>({attribute:T,shape:A,options:Wr(A?.personal)})).filter((T)=>T.options!==null);if(!l&&p.length===0){if(d&&s!==M)r.push(s);continue}if(l!==void 0&&(l===null||typeof l!=="object")){i(s,"`traits.gdpr` must be an object");continue}let m=Lt(s,u),g=u.primaryKey??"id",w=null,h,b=l?.subject;if(b===void 0){if(s===M)w={kind:"column",columns:[g],where:{}};else if(d)w={kind:"column",columns:[d.foreignKey],where:{}}}else if(typeof b==="string")w={kind:"column",columns:[b],where:{}};else if(Array.isArray(b))w={kind:"column",columns:[...b].map(String),where:{}};else if(b&&typeof b==="object"&&"column"in b)w={kind:"column",columns:Array.isArray(b.column)?[...b.column].map(String):[String(b.column)],where:{...b.where??{}}};else if(b&&typeof b==="object"&&"via"in b){let T=f.find((A)=>A.model===b.via);if(!T)i(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 i(s,"subject must be a column name, a list of columns, { column, where }, { via } or { email }");if(w?.kind==="column"&&w.columns.length===0)i(s,"subject names no column");let k=l?.erasure??"anonymize";if(!It.has(k))i(s,`erasure must be one of ${[...It].join(", ")}, got '${String(k)}'`);let R=null;if(l?.retention!==void 0){let T=l.retention,A=T?.action??"delete";if(!T||typeof T!=="object"||!Number.isInteger(T.days)||T.days<=0)i(s,"retention.days must be a positive whole number of days");else if(!Bt.has(A))i(s,`retention.action must be one of ${[...Bt].join(", ")}, got '${String(A)}'`);else R={days:T.days,column:T.column??"created_at",action:A}}if(l?.basis!==void 0&&!Nt.has(l.basis))i(s,`basis must be one of ${[...Nt].join(", ")}, got '${String(l.basis)}'`);let te=k==="anonymize"&&w!==null||R?.action==="anonymize",U=[];for(let{attribute:T,shape:A,options:Se}of p){let ne=Vr(A,Se);if("problem"in ne){if(te)i(s,`personal attribute '${T}' ${ne.problem}`);U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:!1,anonymizeTo:null});continue}U.push({attribute:T,column:H(T),export:Se.export!==!1,perRow:ne.perRow,anonymizeTo:ne.value})}if(w!==null&&k==="anonymize"&&U.length===0)i(s,"declares a subject but no personal attributes, so 'anonymize' would change nothing; mark the personal attributes, or declare erasure 'keep' or 'delete'");if(R?.action==="anonymize"&&U.length===0)i(s,"retention anonymizes, but no attribute is marked personal");if(t.set(s,{model:s,table:m,primaryKey:g,subject:w,personal:U,erasure:k,retention:R,purpose:l?.purpose??null,basis:l?.basis??null,depth:0,exportColumns:[...new Set([g,"uuid","created_at","updated_at"])]}),h)n.set(s,h)}let a=(s,u)=>{let c=n.get(s);if(!c)return 0;if(u.has(s))return null;if(!t.get(c)?.subject)return null;u.add(s);let f=a(c,u);return f===null?null:f+1};for(let s of t.values()){let u=n.get(s.model);if(!u)continue;if(!t.get(u)?.subject){i(s.model,`subject { via: '${u}' } points at a model that declares no subject of its own`);continue}let l=a(s.model,new Set);if(l===null)i(s.model,`subject { via: '${u}' } is part of a cycle`);else s.depth=l}return{models:[...t.values()],unclassified:r.sort(),problems:o}}function de(e){if(e.problems.length)throw new Ge(e.problems);return e}var fe="gdpr_requests",We=500;class pe extends Error{constructor(e){super(`No user matches '${String(e)}'.`);this.name="GdprSubjectNotFoundError"}}async function me(e){if(e)return de(le(e));await Promise.resolve().then(() => Ke());return de(le(await Ue()))}async function Ht(e=x){let t=String(Xr()),n=t==="sqlite"?"SELECT name FROM sqlite_master WHERE type = 'table'":t==="mysql"?"SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()":t==="postgres"?"SELECT table_name AS name FROM information_schema.tables WHERE table_schema = current_schema()":null;if(!n)return null;let r=await e.unsafe(n).execute();return new Set(r.map((o)=>String(o.name??o.NAME??"").toLowerCase()).filter(Boolean))}var eo=/no such table|does not exist|doesn't exist|unknown table|undefined table|ER_NO_SUCH_TABLE/i;async function ge(e,t=x){let n=await Ht(t);if(n)return n.has(e.toLowerCase());try{return await t.selectFrom(e).selectAll().limit(1).execute(),!0}catch(r){if(eo.test(r instanceof Error?r.message:String(r)))return!1;throw r}}function to(e){let t=e.models.find((n)=>n.model===M);return{table:t?.table??"users",primaryKey:t?.primaryKey??"id"}}function no(e){if(typeof e==="number")return{kind:"id",value:e};let t=String(e).trim();if(/^\d+$/.test(t))return{kind:"id",value:Number(t)};if(t.includes("@"))return{kind:"email",value:t};return{kind:"uuid",value:t}}async function ro(e,t={},n=x){let r=await me(t.models);return Qe(r,e,n)}async function Qe(e,t,n){let{table:r,primaryKey:o}=to(e),i=no(t),a;if(i.kind==="id")a=(await n.selectFrom(r).selectAll().where(o,"=",i.value).limit(1).execute())[0];else if(i.kind==="email"){for(let s of new Set([i.value,i.value.toLowerCase()]))if(a=(await n.selectFrom(r).selectAll().where("email","=",s).limit(1).execute())[0],a)break}else a=(await n.selectFrom(r).selectAll().where("uuid","=",i.value).limit(1).execute())[0];if(!a)return null;return{id:a[o],email:typeof a.email==="string"?a.email:null}}function ze(e,t=We){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function oo(e,t){let n=new Map;for(let r of e)n.set(String(r[t]),r);return[...n.values()].sort((r,o)=>String(r[t]).localeCompare(String(o[t]),void 0,{numeric:!0}))}async function He(e,t,n,r,o){let i=o.get(n.model);if(i)return i;let a=n.subject,s=[];if(a?.kind==="column")for(let u of a.columns){let c=e.selectFrom(n.table).selectAll().where(u,"=",r.id);for(let[l,f]of Object.entries(a.where))c=c.where(l,"=",f);s.push(...await c.execute())}else if(a?.kind==="email"){if(r.email)for(let u of new Set([r.email,r.email.toLowerCase()]))s.push(...await e.selectFrom(n.table).selectAll().where(a.column,"=",u).execute())}else if(a?.kind==="via"){let u=t.get(a.model),l=(await He(e,t,u,r,o)).map((f)=>f[u.primaryKey]).filter((f)=>f!==null&&f!==void 0);for(let f of ze(l))s.push(...await e.selectFrom(n.table).selectAll().where(a.foreignKey,"in",f).execute())}return s=oo(s,n.primaryKey),o.set(n.model,s),s}function Vt(e){if(typeof e==="bigint")return Number.isSafeInteger(Number(e))?Number(e):e.toString();if(e instanceof Date)return e.toISOString();return e}function io(e,t){let n={};for(let r of e.exportColumns)if(r in t)n[r]=Vt(t[r]);for(let r of e.personal)if(r.export&&r.column in t)n[r.column]=Vt(t[r.column]);return n}function Ve(e,t){let n={};for(let r of e.personal)n[r.column]=r.perRow?`erased-${String(t[e.primaryKey])}`:r.anonymizeTo;return n}function ao(e,t){if(e===t)return!0;if(e===null||e===void 0||t===null||t===void 0)return(e===null||e===void 0)&&(t===null||t===void 0);if(typeof t==="boolean")return Number(e)===Number(t);return String(e)===String(t)}function Jt(e,t){let n=Ve(e,t);return Object.entries(n).some(([r,o])=>!ao(t[r],o))}async function Yt(e,t,n){if(!n.length)return;if(t.personal.some((o)=>o.perRow)){for(let o of n)await e.updateTable(t.table).set(Ve(t,o)).where(t.primaryKey,"=",o[t.primaryKey]).execute();return}let r=Ve(t,n[0]);for(let o of ze(n.map((i)=>i[t.primaryKey])))await e.updateTable(t.table).set(r).where(t.primaryKey,"in",o).execute()}async function Xt(e,t,n){for(let r of ze(n.map((o)=>o[t.primaryKey])))await e.deleteFrom(t.table).where(t.primaryKey,"in",r).execute()}async function Je(e,t,n,r,o){let i=zt(new Date);await e.insertInto(fe).values({uuid:Yr(),type:t,subject_id:n!==null&&Number.isSafeInteger(Number(n))?Number(n):null,actor:r,status:"completed",summary:JSON.stringify(n!==null&&!Number.isSafeInteger(Number(n))?{subject:String(n),...o}:o),occurred_at:i,created_at:i}).execute()}async function Ye(){if(!await ge(fe))throw Error(`The '${fe}' table does not exist, so this request cannot be recorded. Run \`buddy migrate\` first.`)}async function Xe(e){let t=[],n=[],r=await Ht(),o=new Map;for(let i of e){if(!o.has(i.table))o.set(i.table,r?r.has(i.table.toLowerCase()):await ge(i.table));if(o.get(i.table))t.push(i);else n.push(i.table)}return{present:t,skipped:[...new Set(n)].sort()}}async function so(e,t={}){let n=await me(t.models),r=await Qe(n,e,x);if(!r)throw new pe(e);await Ye();let o=n.models.filter((l)=>l.subject),{present:i}=await Xe(o),a=new Map(i.map((l)=>[l.model,l]));for(let l of i)if(l.subject?.kind==="via"&&!a.has(l.subject.model))a.delete(l.model);let s=new Map,u={},c={};for(let l of[...a.values()].sort((f,d)=>f.model.localeCompare(d.model))){let f=await He(x,a,l,r,s);if(!f.length)continue;u[l.model]=f.map((d)=>io(l,d)),c[l.model]={purpose:l.purpose,basis:l.basis,retentionDays:l.retention?.days??null}}return await Je(x,"access",r.id,t.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 uo(e){return[...e].sort((t,n)=>{let r=t.model===M?1:0,o=n.model===M?1:0;if(r!==o)return r-o;if(t.depth!==n.depth)return n.depth-t.depth;return t.model.localeCompare(n.model)})}async function co(e,t={}){let n=t.dryRun===!0,r=await me(t.models),o=await Qe(r,e,x);if(!o)throw new pe(e);if(!n)await Ye();let i=r.models.filter((d)=>d.subject),{present:a,skipped:s}=await Xe(i),u=new Map(a.map((d)=>[d.model,d]));for(let d of a)if(d.subject?.kind==="via"&&!u.has(d.subject.model))u.delete(d.model);let c=async(d)=>{let p=new Map;for(let g of u.values())await He(d,u,g,o,p);let m=[];for(let g of uo([...u.values()])){let w=p.get(g.model)??[];if(g.erasure==="delete"){if(!n)await Xt(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)=>Jt(g,b));if(!n)await Yt(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(!n)await Je(d,"erasure",o.id,t.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=n?await c(x):await qe(c),f=!1;if(!n&&t.revokeCredentials!==!1)f=await lo(o.id);return{subject:{id:o.id},dryRun:n,changes:l.sort((d,p)=>d.model.localeCompare(p.model)),skipped:s,credentialsRevoked:f}}async function lo(e){let t;try{t=await import("@stacksjs/auth")}catch{return!1}let n=Number(e);if(!Number.isSafeInteger(n))return!1;if(t.revokeAllTokens&&await ge("oauth_access_tokens"))await t.revokeAllTokens(n);if(t.sessionDestroyAll)await t.sessionDestroyAll(n);return!0}var Qt=86400000;async function fo(e={}){let t=e.dryRun===!0,n=e.now??new Date,o=(await me(e.models)).models.filter((c)=>c.retention);if(!o.length)return{dryRun:t,cutoffs:{},changes:[],skipped:[]};if(!t)await Ye();let{present:i,skipped:a}=await Xe(o),s=[],u={};for(let c of i){let l=c.retention,f=new Date(n.getTime()-l.days*Qt),d=zt(new Date(f.getTime()+Qt));u[c.model]=f.toISOString();let p=[],m;for(;;){let h=x.selectFrom(c.table).selectAll().where(l.column,"<",d);if(m!==void 0)h=h.where(c.primaryKey,">",m);let b=await h.orderBy(c.primaryKey,"asc").limit(We).execute();if(!b.length)break;for(let k of b){let R=Zr(k[l.column]);if(R&&R.getTime()<f.getTime())p.push(k)}if(m=b[b.length-1][c.primaryKey],b.length<We)break}let g=l.action==="delete"?p:p.filter((w)=>Jt(c,w));if(!t&&g.length)await qe(async(w)=>{if(l.action==="delete")await Xt(w,c,g);else await Yt(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(!t&&s.some((c)=>c.changed>0))await Je(x,"retention",null,e.actor??"scheduler",{changes:s.map(({model:c,action:l,matched:f,changed:d})=>({model:c,action:l,matched:f,changed:d})),cutoffs:u});return{dryRun:t,cutoffs:u,changes:s.sort((c,l)=>c.model.localeCompare(l.model)),skipped:a}}Ke();function po(e){let t=e.subject;if(!t)return"none (not reachable by access or erasure)";if(t.kind==="via")return`via ${t.model} (\`${t.foreignKey}\`)`;if(t.kind==="email")return`email address in \`${t.column}\``;let n=t.columns.map((o)=>`\`${o}\``).join(" or "),r=Object.entries(t.where).map(([o,i])=>`${o} = ${String(i)}`).join(", ");return r?`${n} where ${r}`:n}function mo(e){return{entries:e.models.map((n)=>({model:n.model,table:n.table,subject:po(n),personal:n.personal.map((r)=>r.column),notExported:n.personal.filter((r)=>!r.export).map((r)=>r.column),erasure:n.subject?n.erasure:null,retention:n.retention?`${n.retention.action} after ${n.retention.days} days (\`${n.retention.column}\`)`:null,basis:n.basis,purpose:n.purpose})).sort((n,r)=>n.model.localeCompare(r.model)),unclassified:[...e.unclassified].sort()}}function J(e){return(e??"-").replaceAll("|","\\|").replaceAll(`
|
|
5
5
|
`," ")}function go(e,t="markdown"){if(t==="json")return`${JSON.stringify(e,null,2)}
|
package/dist/models/Activity.ts
CHANGED
package/dist/models/Board.ts
CHANGED
package/dist/models/Campaign.ts
CHANGED
package/dist/models/Card.ts
CHANGED
package/dist/models/Comment.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineModel } from '@stacksjs/orm'
|
|
2
|
-
import { schema } from '@stacksjs/validation'
|
|
2
|
+
import { schema } from '@stacksjs/validation/runtime'
|
|
3
3
|
|
|
4
4
|
// The CMS catalogue already exists in categorizables. Commerce's Category
|
|
5
5
|
// model owns a different table and its IDs cannot be used by this pivot.
|
package/dist/models/EmailList.ts
CHANGED
package/dist/models/Error.ts
CHANGED
package/dist/models/FailedJob.ts
CHANGED
package/dist/models/Job.ts
CHANGED
package/dist/models/Label.ts
CHANGED
package/dist/models/Log.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineModel } from '@stacksjs/orm'
|
|
2
2
|
import { collect } from '@stacksjs/collections'
|
|
3
3
|
|
|
4
|
-
import { schema } from '@stacksjs/validation'
|
|
4
|
+
import { schema } from '@stacksjs/validation/runtime'
|
|
5
5
|
|
|
6
6
|
export default defineModel({
|
|
7
7
|
name: 'PaymentMethod', // defaults to the sanitized file name
|