@stacksjs/cms 0.70.256 → 0.70.257

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- var iM=Object.defineProperty;var sM=(M)=>M;function oM(M,f){this[M]=sM.bind(null,f)}var Q=(M,f)=>{for(var B in f)iM(M,B,{get:f[B],enumerable:!0,configurable:!0,set:oM.bind(f,B)})};var dM=import.meta.require;var F={};Q(F,{update:()=>s,store:()=>b,findOrCreate:()=>l,findByUuid:()=>D,findByUserId:()=>u,findByName:()=>m,findByEmail:()=>p,fetchById:()=>S,fetchAll:()=>w,destroy:()=>y});var c;async function C(){return c??=import("@stacksjs/database").then((M)=>M.db),c}async function y(M){let f=await C();try{let B=await f.deleteFrom("authors").where("id","=",M).returningAll().executeTakeFirst();if(!B)throw Error(`Author with ID ${M} not found`);return B}catch(B){if(B instanceof Error)throw TypeError(`Author with ID ${M} not found`);throw B}}async function S(M){return await(await C()).selectFrom("authors").where("id","=",M).selectAll().executeTakeFirst()}async function w(){return await(await C()).selectFrom("authors").selectAll().execute()}async function m(M){return await(await C()).selectFrom("authors").where("name","=",M).selectAll().executeTakeFirst()}async function p(M){return await(await C()).selectFrom("authors").where("email","=",M).selectAll().executeTakeFirst()}async function D(M){return await(await C()).selectFrom("authors").where("uuid","=",M).selectAll().executeTakeFirst()}async function u(M){return await(await C()).selectFrom("authors").where("user_id","=",M).selectAll().executeTakeFirst()}var{randomUUIDv7:g}=globalThis.Bun;function $(M){return!!M&&typeof M==="object"&&"id"in M}function E(M){if($(M)&&typeof M.id==="number")return M.id;let f=M?.lastInsertRowid;if(f===void 0||f===null)return;let B=Number(f);return Number.isSafeInteger(B)&&B>0?B:void 0}async function z(M,f,B){if($(B))return B;let x=E(B);if(x===void 0)return;return await M.selectFrom(f).where("id","=",x).selectAll().executeTakeFirst()}function U(M,f){let B=M?.[f]??M?.changes;if(typeof B==="number"||typeof B==="bigint")return Number(B);let x=B?.changes;return typeof x==="number"||typeof x==="bigint"?Number(x):0}import{HttpError as _}from"@stacksjs/error-handling";import{formatDate as V,isUniqueViolation as n}from"@stacksjs/orm";async function l(M){let f=await C();try{let B=await f.selectFrom("authors").where("email","=",M.email).orWhere("name","=",M.name).selectAll().executeTakeFirst();if(B)return B;let x=await f.selectFrom("users").where("email","=",M.email).selectAll().executeTakeFirst();if(!x){let Z=await f.insertInto("users").values({email:M.email,name:M.name,password:g(),uuid:g(),created_at:V(new Date),updated_at:V(new Date)}).returningAll().executeTakeFirst();if(x=await z(f,"users",Z),!x)throw Error("Failed to create user")}let P={user_id:x.id,name:M.name,email:M.email,created_at:V(new Date),updated_at:V(new Date)},J=await f.insertInto("authors").values(P).returningAll().executeTakeFirst(),X=await z(f,"authors",J);if(!X)throw Error("Failed to create author");return X}catch(B){if(B instanceof _)throw B;if(n(B))throw new _(409,"An author with this email already exists");if(B instanceof Error)throw TypeError(`Failed to find or create author: ${B.message}`);throw B}}async function b(M){let f=await C();try{let B=await f.selectFrom("authors").where("email","=",M.email).orWhere("name","=",M.name).selectAll().executeTakeFirst();if(B)return B;let x={user_id:M.user_id,name:M.name,email:M.email,created_at:V(new Date),updated_at:V(new Date)},P=await f.insertInto("authors").values(x).returningAll().executeTakeFirst(),J=await z(f,"authors",P);if(!J)throw Error("Failed to create author");return J}catch(B){if(B instanceof _)throw B;if(n(B))throw new _(409,"An author with this email already exists");if(B instanceof Error)throw TypeError(`Failed to find or create author: ${B.message}`);throw B}}import{HttpError as i}from"@stacksjs/error-handling";import{formatDate as rM,isUniqueViolation as eM}from"@stacksjs/orm";async function s(M,f){let B=await C();try{let x={...f,updated_at:rM(new Date)},P=await B.updateTable("authors").set(x).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;return await S(M)}catch(x){if(x instanceof i)throw x;if(eM(x))throw new i(409,"An author with this email already exists");if(x instanceof Error)throw TypeError(`Failed to update author: ${x.message}`);throw x}}var N={};Q(N,{update:()=>PM,storeCategorizableModel:()=>fM,store:()=>BM,fetchWithPosts:()=>e,fetchBySlug:()=>r,fetchByName:()=>d,fetchById:()=>L,fetchAll:()=>o,destroy:()=>t,bulkStore:()=>xM,bulkDestroy:()=>a});import{slugify as vB}from"ts-slug";async function L(M){return await(await C()).selectFrom("categorizables").where("id","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function o(){return await(await C()).selectFrom("categorizables").selectAll().execute()}async function d(M){return await(await C()).selectFrom("categorizables").where("name","=",M).where("is_active","=",!0).selectAll().execute()}async function r(M){return await(await C()).selectFrom("categorizables").where("slug","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function e(M){return await(await C()).selectFrom("categorizables").where("id","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function t(M){let f=await C();try{if(!await L(M))throw Error(`Category with ID ${M} not found`);return(await f.deleteFrom("categorizables").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete category: ${B.message}`);throw B}}async function a(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("categorizables").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete categories in bulk: ${B.message}`);throw B}}import{slugify as MM}from"ts-slug";async function BM(M){let f=await C();try{if(!M.name||M.name.trim()==="")throw Error("Category name is required");if(!M.categorizable_type||M.categorizable_type.trim()==="")throw Error("Category categorizable_type is required");let B={name:M.name,slug:MM(M.name),description:M.description,categorizable_type:M.categorizable_type,is_active:M.is_active??!0},x=await f.insertInto("categorizables").values(B).returningAll().executeTakeFirst(),P=await z(f,"categorizables",x);if(!P)throw Error("Failed to create category");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create category: ${B.message}`);throw B}}async function fM(M){let f=await C();try{let B={category_id:M.category_id,categorizable_type:M.categorizable_type},x=await f.insertInto("categorizable_models").values(B).returningAll().executeTakeFirst(),P=await z(f,"categorizable_models",x);if(!P)throw Error("Failed to create categorizable model relationship");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create categorizable model relationship: ${B.message}`);throw B}}async function xM(M){let f=await C();try{return await f.transaction(async(x)=>{let P=[];for(let J of M){let X={name:J.name,slug:MM(J.name),description:J.description,categorizable_type:J.categorizable_type,is_active:J.is_active??!0},Z=await x.insertInto("categorizables").values(X).returningAll().executeTakeFirst(),Y=await z(x,"categorizables",Z);if(!Y)throw Error(`Failed to create category: ${J.name}`);P.push(Y)}return P})}catch(B){if(B instanceof Error)throw TypeError(`Failed to create categories: ${B.message}`);throw B}}import{slugify as tM}from"ts-slug";async function PM(M){let f=await C();try{let B=M.id;if(!B)throw Error("Category ID is required for update");if(M.name!==void 0){if(M.name.trim()==="")throw Error("Category name cannot be empty");M.slug=tM(M.name)}let{id:x,...P}=M,J=await f.updateTable("categorizables").set(P).where("id","=",B).returningAll().executeTakeFirst();if($(J))return J;let X=await L(B);if(!X)throw Error("Failed to update category");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to update category: ${B.message}`);throw B}}var h={};Q(h,{update:()=>VM,store:()=>QM,fetchStatusDistributionDonut:()=>zM,fetchPostsWithMostComments:()=>q,fetchMonthlyCommentCounts:()=>GM,fetchCommentsByStatus:()=>YM,fetchCommentsByCommentables:()=>JM,fetchComments:()=>CM,fetchCommentCountByPeriod:()=>XM,fetchCommentCountBarGraph:()=>$M,fetchCommentById:()=>j,destroy:()=>AM,calculateApprovalRate:()=>ZM,bulkDestroy:()=>OM});import{formatDate as H}from"@stacksjs/orm";async function CM(M={}){let B=(await C()).selectFrom("commentables");if(M.status)B=B.where("status","=",M.status);if(M.commentables_id)B=B.where("commentables_id","=",M.commentables_id);if(M.commentables_type)B=B.where("commentables_type","=",M.commentables_type);if(M.limit)B=B.limit(M.limit);if(M.offset)B=B.offset(M.offset);return B.selectAll().execute()}async function j(M){return(await C()).selectFrom("commentables").where("id","=",M).selectAll().executeTakeFirst()}async function JM(M,f,B={}){let P=(await C()).selectFrom("commentables").where("commentables_id","=",M).where("commentables_type","=",f);if(B.status)P=P.where("status","=",B.status);if(B.limit)P=P.limit(B.limit);if(B.offset)P=P.offset(B.offset);return P.selectAll().execute()}async function XM(M){let f=await C();try{let B=await f.selectFrom("commentables").where("created_at",">=",new Date(Date.now()-M*24*60*60*1000).toISOString()).count();return Number(B)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch comment count: ${B.message}`);throw B}}async function YM(M,f={}){let B=await C();try{let x=B.selectFrom("commentables").where("status","=",M);if(f.limit)x=x.limit(f.limit);if(f.offset)x=x.offset(f.offset);return x.selectAll().execute()}catch(x){if(x instanceof Error)throw TypeError(`Failed to fetch comments by status: ${x.message}`);throw x}}async function ZM(){let M=await C();try{let[f,B]=await Promise.all([M.selectFrom("commentables").where("status","=","approved").count(),M.selectFrom("commentables").count()]),x=Number(f||0),P=Number(B||0),J=P>0?x/P*100:0;return{approved:x,total:P,rate:J}}catch(f){if(f instanceof Error)throw TypeError(`Failed to calculate approval rate: ${f.message}`);throw f}}async function q(M,f={}){let B=await C();try{let x=B.selectFrom("posts").leftJoin("commentables","posts.id","=","commentables.commentables_id").where("commentables.created_at",">=",H(M.startDate)).where("commentables.created_at","<=",H(M.endDate)).select(["posts.id","posts.title"]).groupBy("posts.id","posts.title").orderBy("posts.id","desc");if(f.limit)x=x.limit(f.limit);return(await x.execute()).map((J)=>({id:Number(J.id),title:String(J.title),comment_count:Number(J.comment_count||0)}))}catch(x){if(x instanceof Error)throw TypeError(`Failed to fetch posts with most comments: ${x.message}`);throw x}}async function $M(M,f={}){try{let B=await q(M,f);return{labels:B.map((x)=>x.title),values:B.map((x)=>x.comment_count)}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch bar graph data: ${B.message}`);throw B}}async function zM(M){let f=await C();try{let x=await f.selectFrom("commentables").where("created_at",">=",H(M.startDate)).where("created_at","<=",H(M.endDate)).select(["status"]).groupBy("status").execute(),P=x.reduce((Y,O)=>Y+Number(O.count||0),0),J=x.map((Y)=>String(Y.status)),X=x.map((Y)=>Number(Y.count||0)),Z=X.map((Y)=>P>0?Y/P*100:0);return{labels:J,values:X,percentages:Z}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch status distribution: ${B.message}`);throw B}}async function GM(M){let f=await C();try{let B=await f.selectFrom("commentables").where("created_at",">=",H(M.startDate)).where("created_at","<=",H(M.endDate)).select(["created_at"]).groupBy("created_at").orderBy("created_at","asc").execute(),x=new Map;B.forEach((X)=>{if(!X.created_at)return;let Z=new Date(X.created_at),Y=`${Z.getFullYear()}-${String(Z.getMonth()+1).padStart(2,"0")}`;x.set(Y,(x.get(Y)||0)+Number(X.count||0))});let P=[],J=[];return x.forEach((X,Z)=>{let[Y,O]=Z.split("-");P.push(new Date(Number(Y),Number(O)-1).toLocaleString("default",{month:"short",year:"numeric"})),J.push(X)}),{labels:P,values:J}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch monthly comment counts: ${B.message}`);throw B}}async function AM(M){let f=await C();try{if(!await j(M))throw Error(`Comment with ID ${M} not found`);return(await f.deleteFrom("commentables").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete comment: ${B.message}`);throw B}}async function OM(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("commentables").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete comments in bulk: ${B.message}`);throw B}}async function QM(M){let f=await C();try{if(!M.title||M.title.trim()==="")throw Error("Comment title is required");if(!M.body||M.body.trim()==="")throw Error("Comment body is required");if(!M.commentables_type||M.commentables_type.trim()==="")throw Error("Comment commentables_type is required");let B=["pending","approved","rejected"];if(M.status&&!B.includes(M.status))throw Error(`Invalid comment status: ${M.status}`);let x={title:M.title,body:M.body,status:M.status,commentables_id:M.commentables_id,commentables_type:M.commentables_type,user_id:M.user_id,is_active:M.is_active},P=await f.insertInto("commentables").values(x).returningAll().executeTakeFirst(),J=await z(f,"commentables",P);if(!J)throw Error("Failed to create comment");return J}catch(B){if(B instanceof Error)throw TypeError(`Failed to store comment: ${B.message}`);throw B}}import{formatDate as aM}from"@stacksjs/orm";async function VM(M,f){let B=await C();try{if(f.title!==void 0&&f.title.trim()==="")throw Error("Comment title cannot be empty");if(f.body!==void 0&&f.body.trim()==="")throw Error("Comment body cannot be empty");let x=["pending","approved","rejected"];if(f.status!==void 0&&!x.includes(f.status))throw Error(`Invalid comment status: ${f.status}`);let P={updated_at:aM(new Date)};if(f.title!==void 0)P.title=f.title;if(f.body!==void 0)P.body=f.body;if(f.status!==void 0)P.status=f.status;if(f.commentables_id!==void 0)P.commentables_id=f.commentables_id;if(f.commentables_type!==void 0)P.commentables_type=f.commentables_type;if(f.approved_at!==void 0)P.approved_at=f.approved_at;if(f.rejected_at!==void 0)P.rejected_at=f.rejected_at;return await B.updateTable("commentables").set(P).where("id","=",M).execute(),await B.selectFrom("commentables").where("id","=",M).selectAll().executeTakeFirst()}catch(x){if(x instanceof Error)throw TypeError(`Failed to update comment: ${x.message}`);throw x}}var T={};Q(T,{update:()=>UM,store:()=>EM,fetchPublishedAfter:()=>_M,fetchByMinViews:()=>kM,fetchByMinConversions:()=>SM,fetchById:()=>k,fetchByAuthor:()=>HM,fetchAll:()=>LM,destroy:()=>jM,bulkDestroy:()=>WM});async function k(M){return await(await C()).selectFrom("pages").where("id","=",M).selectAll().executeTakeFirst()}async function LM(){return await(await C()).selectFrom("pages").selectAll().execute()}async function HM(M){return await(await C()).selectFrom("pages").where("author_id","=",M).selectAll().execute()}async function kM(M){return await(await C()).selectFrom("pages").where("views",">=",M).selectAll().execute()}async function SM(M){return await(await C()).selectFrom("pages").where("conversions",">=",M).selectAll().execute()}async function _M(M){return await(await C()).selectFrom("pages").where("published_at",">",M).selectAll().execute()}async function jM(M){let f=await C();try{if(!await k(M))throw Error(`Page with ID ${M} not found`);return(await f.deleteFrom("pages").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete page: ${B.message}`);throw B}}async function WM(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("pages").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete pages in bulk: ${B.message}`);throw B}}import{formatDate as KM}from"@stacksjs/orm";async function EM(M){let f=await C();try{let B={author_id:M.author_id,title:M.title,template:M.template,views:M.views||0,conversions:M.conversions||0,created_at:KM(new Date),updated_at:KM(new Date)},x=await f.insertInto("pages").values(B).returningAll().executeTakeFirst(),P=await z(f,"pages",x);if(!P)throw Error("Failed to create page");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create page: ${B.message}`);throw B}}import{formatDate as MB}from"@stacksjs/orm";async function UM(M,f){let B=await C();try{let x={...f,updated_at:MB(new Date)},P=await B.updateTable("pages").set(x).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;let J=await k(M);if(!J)throw Error("Failed to update page");return J}catch(x){if(x instanceof Error)throw TypeError(`Failed to update page: ${x.message}`);throw x}}var v={};Q(v,{update:()=>pM,sync:()=>mM,store:()=>cM,fetchPublishedAfter:()=>vM,fetchByStatus:()=>NM,fetchByMinViews:()=>TM,fetchById:()=>A,fetchByCategory:()=>qM,fetchByAuthor:()=>hM,fetchAll:()=>FM,detach:()=>wM,destroy:()=>IM,bulkDestroy:()=>RM,attach:()=>yM});async function A(M){return await(await C()).selectFrom("posts").where("id","=",M).selectAll().executeTakeFirst()}async function FM(){return await(await C()).selectFrom("posts").selectAll().execute()}async function NM(M){return await(await C()).selectFrom("posts").where("status","=",M).selectAll().execute()}async function qM(M){return await(await C()).selectFrom("posts").where("category","=",M).selectAll().execute()}async function hM(M){return await(await C()).selectFrom("posts").where("author_id","=",M).selectAll().execute()}async function TM(M){return await(await C()).selectFrom("posts").where("views",">=",M).selectAll().execute()}async function vM(M){return await(await C()).selectFrom("posts").where("published_at",">",M).selectAll().execute()}async function IM(M){let f=await C();try{if(!await A(M))throw Error(`Post with ID ${M} not found`);let x=await f.deleteFrom("posts").where("id","=",M).executeTakeFirst();return U(x,"numDeletedRows")>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete post: ${B.message}`);throw B}}async function RM(M){let f=await C();if(!M.length)return 0;try{let x=(await f.selectFrom("posts").select(["id"]).where("id","in",M).execute()).map((J)=>J.id);if(!x.length)return 0;let P=0;for(let J of x){let X=await f.deleteFrom("posts").where("id","=",J).executeTakeFirst();P+=U(X,"numDeletedRows")}return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete posts in bulk: ${B.message}`);throw B}}var{randomUUIDv7:BB}=globalThis.Bun;import{formatDate as W}from"@stacksjs/orm";var fB="draft",xB="published";async function cM(M){let f=await C();try{if(!M.title||typeof M.title==="string"&&M.title.trim()==="")throw Error("Post title is required");let B=M.content||M.body,x=M,P=M.status||fB,J={author_id:x.author_id,uuid:BB(),title:M.title,poster:M.poster,content:B,excerpt:M.excerpt,is_featured:x.is_featured?Date.now():void 0,views:M.views||0,published_at:x.published_at??(P===xB?Date.now():void 0),status:P},X=await f.insertInto("posts").values(J).returningAll().executeTakeFirst();if($(X))return X;let Z=E(X),Y=Z===void 0?void 0:await A(Z);if(!Y)throw Error("Failed to create post");return Y}catch(B){if(B instanceof Error)throw TypeError(`Failed to create post: ${B.message}`);throw B}}async function yM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Z=B.map((Y)=>({[X]:Y,[P]:M,[J]:"posts",created_at:W(new Date),updated_at:W(new Date)}));for(let Y of Z)await x.insertInto(f).values(Y).execute()}catch(P){if(P instanceof Error)throw TypeError(`Failed to attach records: ${P.message}`);throw P}}async function wM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Z=x.deleteFrom(f).where(P,"=",M).where(J,"=","posts");if(B){for(let Y of B)await x.deleteFrom(f).where(P,"=",M).where(J,"=","posts").where(X,"=",Y).execute();return}await Z.execute()}catch(P){if(P instanceof Error)throw TypeError(`Failed to detach records: ${P.message}`);throw P}}async function mM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Y=(await x.selectFrom(f).select([X]).where(P,"=",M).where(J,"=","posts").execute()).map((G)=>G[X]),O=Y.filter((G)=>!B.includes(G)),R=B.filter((G)=>!Y.includes(G));if(O.length>0)for(let G of O)await x.deleteFrom(f).where(P,"=",M).where(J,"=","posts").where(X,"=",G).execute();if(R.length>0){let G=R.map((bM)=>({[X]:bM,[P]:M,[J]:"posts",created_at:W(new Date),updated_at:W(new Date)}));await x.insertInto(f).values(G).execute()}}catch(P){if(P instanceof Error)throw TypeError(`Failed to sync records: ${P.message}`);throw P}}async function pM(M,f){let B=await C();try{if(f.title!==void 0&&typeof f.title==="string"&&f.title.trim()==="")throw Error("Post title cannot be empty");let x=["published","draft","archived"];if(f.status!==void 0&&typeof f.status==="string"&&!x.includes(f.status))throw Error(`Invalid post status: ${f.status}`);if(f.views!==void 0&&typeof f.views==="number"&&f.views<0)throw Error("Views count cannot be negative");let P=await B.updateTable("posts").set(f).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;let J=await A(M);if(!J)throw Error(`Post with ID ${M} not found`);return J}catch(x){if(x instanceof Error)throw TypeError(`Failed to update post: ${x.message}`);throw x}}var I={};Q(I,{update:()=>lM,store:()=>gM,fetchTags:()=>nM,fetchTagById:()=>K,destroy:()=>DM,bulkDestroy:()=>uM});async function DM(M){let f=await C();if(!await f.selectFrom("taggables").where("id","=",M).selectAll().executeTakeFirst())throw Error(`Tag with ID ${M} not found`);await f.deleteFrom("taggables").where("id","=",M).executeTakeFirst()}async function uM(M){let f=await C();try{await f.deleteFrom("taggables").where("id","in",M).execute()}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete tags: ${B.message}`);throw B}}import{slugify as PB}from"ts-slug";async function gM(M){let f=await C();try{if(!M.name||M.name.trim()==="")throw Error("Tag name is required");if(!M.taggable_type||M.taggable_type.trim()==="")throw Error("Tag taggable_type is required");let B=PB(M.name);if(await f.selectFrom("taggables").selectAll().where("slug","=",B).executeTakeFirst())throw Error(`Tag with unique slug "${B}" already exists`);let P={name:M.name,slug:B,description:M.description,is_active:M.is_active??!0,taggable_type:M.taggable_type};if(M.taggable_id!==void 0)P.taggable_id=M.taggable_id;let J=await f.insertInto("taggables").values(P).returningAll().executeTakeFirst(),X=await z(f,"taggables",J);if(!X)throw Error("Failed to create tag");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to store tag: ${B.message}`);throw B}}async function K(M){let f=await C();try{let B=await f.selectFrom("taggables").where("id","=",M).selectAll().executeTakeFirst();if(!B)return;return B}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch tag: ${B.message}`);throw B}}async function nM(){let M=await C();try{return await M.selectFrom("taggables").where("is_active","=",!0).selectAll().execute()}catch(f){if(f instanceof Error)throw TypeError(`Failed to fetch tags: ${f.message}`);throw f}}import{uniqueSlug as CB}from"@stacksjs/slug";async function lM(M){let f=await C();try{let B=M.id;if(!B)throw Error("Tag ID is required for update");if(M.name!==void 0){if(M.name.trim()==="")throw Error("Tag name cannot be empty");let Z=await CB(M.name,{table:"taggables",column:"slug"});if(await f.selectFrom("taggables").selectAll().where("slug","=",Z).where("id","!=",B).executeTakeFirst())throw Error(`Tag with unique slug "${Z}" already exists`);M.slug=Z}let{id:x,...P}=M,J=await f.updateTable("taggables").set(P).where("id","=",B).returningAll().executeTakeFirst();if($(J))return J;let X=await K(B);if(!X)throw Error("Failed to update tag");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to update tag: ${B.message}`);throw B}}var JB={posts:v,postCategories:N,tags:I,comments:h,authors:F,pages:T},Qx=JB;export{I as tags,v as posts,T as pages,Qx as default,h as comments,JB as cms,N as categorizable,F as authors};
2
+ var iM=Object.defineProperty;var sM=(M)=>M;function oM(M,f){this[M]=sM.bind(null,f)}var Q=(M,f)=>{for(var B in f)iM(M,B,{get:f[B],enumerable:!0,configurable:!0,set:oM.bind(f,B)})};var dM=import.meta.require;var F={};Q(F,{update:()=>s,store:()=>b,findOrCreate:()=>l,findByUuid:()=>D,findByUserId:()=>u,findByName:()=>p,findByEmail:()=>m,fetchById:()=>_,fetchAll:()=>w,destroy:()=>y});var c;async function C(){return c??=import("@stacksjs/database").then((M)=>M.db),c}async function y(M){let f=await C();try{let B=await f.deleteFrom("authors").where("id","=",M).returningAll().executeTakeFirst();if(!B)throw Error(`Author with ID ${M} not found`);return B}catch(B){if(B instanceof Error)throw TypeError(`Author with ID ${M} not found`);throw B}}async function _(M){return await(await C()).selectFrom("authors").where("id","=",M).selectAll().executeTakeFirst()}async function w(){return await(await C()).selectFrom("authors").selectAll().execute()}async function p(M){return await(await C()).selectFrom("authors").where("name","=",M).selectAll().executeTakeFirst()}async function m(M){return await(await C()).selectFrom("authors").where("email","=",M).selectAll().executeTakeFirst()}async function D(M){return await(await C()).selectFrom("authors").where("uuid","=",M).selectAll().executeTakeFirst()}async function u(M){return await(await C()).selectFrom("authors").where("user_id","=",M).selectAll().executeTakeFirst()}var{randomUUIDv7:g}=globalThis.Bun;function $(M){return!!M&&typeof M==="object"&&"id"in M}function E(M){if($(M)&&typeof M.id==="number")return M.id;let f=M?.lastInsertRowid;if(f===void 0||f===null)return;let B=Number(f);return Number.isSafeInteger(B)&&B>0?B:void 0}async function z(M,f,B){if($(B))return B;let x=E(B);if(x===void 0)return;return await M.selectFrom(f).where("id","=",x).selectAll().executeTakeFirst()}function U(M,f){let B=M?.[f]??M?.changes;if(typeof B==="number"||typeof B==="bigint")return Number(B);let x=B?.changes;return typeof x==="number"||typeof x==="bigint"?Number(x):0}import{HttpError as W}from"@stacksjs/error-handling";import{formatDate as V,isUniqueViolation as n}from"@stacksjs/orm";async function l(M){let f=await C();try{let B=await f.selectFrom("authors").where("email","=",M.email).orWhere("name","=",M.name).selectAll().executeTakeFirst();if(B)return B;let x=await f.selectFrom("users").where("email","=",M.email).selectAll().executeTakeFirst();if(!x){let Z=await f.insertInto("users").values({email:M.email,name:M.name,password:g(),uuid:g(),created_at:V(new Date),updated_at:V(new Date)}).returningAll().executeTakeFirst();if(x=await z(f,"users",Z),!x)throw Error("Failed to create user")}let P={user_id:x.id,name:M.name,email:M.email,created_at:V(new Date),updated_at:V(new Date)},J=await f.insertInto("authors").values(P).returningAll().executeTakeFirst(),X=await z(f,"authors",J);if(!X)throw Error("Failed to create author");return X}catch(B){if(B instanceof W)throw B;if(n(B))throw new W(409,"An author with this email already exists");if(B instanceof Error)throw TypeError(`Failed to find or create author: ${B.message}`);throw B}}async function b(M){let f=await C();try{let B=await f.selectFrom("authors").where("email","=",M.email).orWhere("name","=",M.name).selectAll().executeTakeFirst();if(B)return B;let x={user_id:M.user_id,name:M.name,email:M.email,created_at:V(new Date),updated_at:V(new Date)},P=await f.insertInto("authors").values(x).returningAll().executeTakeFirst(),J=await z(f,"authors",P);if(!J)throw Error("Failed to create author");return J}catch(B){if(B instanceof W)throw B;if(n(B))throw new W(409,"An author with this email already exists");if(B instanceof Error)throw TypeError(`Failed to find or create author: ${B.message}`);throw B}}import{HttpError as i}from"@stacksjs/error-handling";import{formatDate as rM,isUniqueViolation as eM}from"@stacksjs/orm";async function s(M,f){let B=await C();try{let x={...f,updated_at:rM(new Date)},P=await B.updateTable("authors").set(x).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;return await _(M)}catch(x){if(x instanceof i)throw x;if(eM(x))throw new i(409,"An author with this email already exists");if(x instanceof Error)throw TypeError(`Failed to update author: ${x.message}`);throw x}}var N={};Q(N,{update:()=>PM,storeCategorizableModel:()=>fM,store:()=>BM,fetchWithPosts:()=>e,fetchBySlug:()=>r,fetchByName:()=>d,fetchById:()=>L,fetchAll:()=>o,destroy:()=>t,bulkStore:()=>xM,bulkDestroy:()=>a});import{slugify as TB}from"ts-slug";async function L(M){return await(await C()).selectFrom("categorizables").where("id","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function o(){return await(await C()).selectFrom("categorizables").selectAll().execute()}async function d(M){return await(await C()).selectFrom("categorizables").where("name","=",M).where("is_active","=",!0).selectAll().execute()}async function r(M){return await(await C()).selectFrom("categorizables").where("slug","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function e(M){return await(await C()).selectFrom("categorizables").where("id","=",M).where("is_active","=",!0).selectAll().executeTakeFirst()}async function t(M){let f=await C();try{if(!await L(M))throw Error(`Category with ID ${M} not found`);return(await f.deleteFrom("categorizables").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete category: ${B.message}`);throw B}}async function a(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("categorizables").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete categories in bulk: ${B.message}`);throw B}}import{slugify as MM}from"ts-slug";async function BM(M){let f=await C();try{if(!M.name||M.name.trim()==="")throw Error("Category name is required");if(!M.categorizable_type||M.categorizable_type.trim()==="")throw Error("Category categorizable_type is required");let B={name:M.name,slug:MM(M.name),description:M.description,categorizable_type:M.categorizable_type,is_active:M.is_active??!0},x=await f.insertInto("categorizables").values(B).returningAll().executeTakeFirst(),P=await z(f,"categorizables",x);if(!P)throw Error("Failed to create category");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create category: ${B.message}`);throw B}}async function fM(M){let f=await C();try{let B={category_id:M.category_id,categorizable_type:M.categorizable_type},x=await f.insertInto("categorizable_models").values(B).returningAll().executeTakeFirst(),P=await z(f,"categorizable_models",x);if(!P)throw Error("Failed to create categorizable model relationship");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create categorizable model relationship: ${B.message}`);throw B}}async function xM(M){let f=await C();try{return await f.transaction(async(x)=>{let P=[];for(let J of M){let X={name:J.name,slug:MM(J.name),description:J.description,categorizable_type:J.categorizable_type,is_active:J.is_active??!0},Z=await x.insertInto("categorizables").values(X).returningAll().executeTakeFirst(),Y=await z(x,"categorizables",Z);if(!Y)throw Error(`Failed to create category: ${J.name}`);P.push(Y)}return P})}catch(B){if(B instanceof Error)throw TypeError(`Failed to create categories: ${B.message}`);throw B}}import{slugify as tM}from"ts-slug";async function PM(M){let f=await C();try{let B=M.id;if(!B)throw Error("Category ID is required for update");if(M.name!==void 0){if(M.name.trim()==="")throw Error("Category name cannot be empty");M.slug=tM(M.name)}let{id:x,...P}=M,J=await f.updateTable("categorizables").set(P).where("id","=",B).returningAll().executeTakeFirst();if($(J))return J;let X=await L(B);if(!X)throw Error("Failed to update category");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to update category: ${B.message}`);throw B}}var q={};Q(q,{update:()=>VM,store:()=>QM,fetchStatusDistributionDonut:()=>zM,fetchPostsWithMostComments:()=>h,fetchMonthlyCommentCounts:()=>GM,fetchCommentsByStatus:()=>YM,fetchCommentsByCommentables:()=>JM,fetchComments:()=>CM,fetchCommentCountByPeriod:()=>XM,fetchCommentCountBarGraph:()=>$M,fetchCommentById:()=>k,destroy:()=>AM,calculateApprovalRate:()=>ZM,bulkDestroy:()=>OM});import{sqlDateTime as aM}from"@stacksjs/database";import{formatDate as H}from"@stacksjs/orm";async function CM(M={}){let B=(await C()).selectFrom("commentables");if(M.status)B=B.where("status","=",M.status);if(M.commentables_id)B=B.where("commentables_id","=",M.commentables_id);if(M.commentables_type)B=B.where("commentables_type","=",M.commentables_type);if(M.limit)B=B.limit(M.limit);if(M.offset)B=B.offset(M.offset);return B.selectAll().execute()}async function k(M){return(await C()).selectFrom("commentables").where("id","=",M).selectAll().executeTakeFirst()}async function JM(M,f,B={}){let P=(await C()).selectFrom("commentables").where("commentables_id","=",M).where("commentables_type","=",f);if(B.status)P=P.where("status","=",B.status);if(B.limit)P=P.limit(B.limit);if(B.offset)P=P.offset(B.offset);return P.selectAll().execute()}async function XM(M){let f=await C();try{let B=await f.selectFrom("commentables").where("created_at",">=",aM(new Date(Date.now()-M*24*60*60*1000))).count();return Number(B)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch comment count: ${B.message}`);throw B}}async function YM(M,f={}){let B=await C();try{let x=B.selectFrom("commentables").where("status","=",M);if(f.limit)x=x.limit(f.limit);if(f.offset)x=x.offset(f.offset);return x.selectAll().execute()}catch(x){if(x instanceof Error)throw TypeError(`Failed to fetch comments by status: ${x.message}`);throw x}}async function ZM(){let M=await C();try{let[f,B]=await Promise.all([M.selectFrom("commentables").where("status","=","approved").count(),M.selectFrom("commentables").count()]),x=Number(f||0),P=Number(B||0),J=P>0?x/P*100:0;return{approved:x,total:P,rate:J}}catch(f){if(f instanceof Error)throw TypeError(`Failed to calculate approval rate: ${f.message}`);throw f}}async function h(M,f={}){let B=await C();try{let x=B.selectFrom("posts").leftJoin("commentables","posts.id","=","commentables.commentables_id").where("commentables.created_at",">=",H(M.startDate)).where("commentables.created_at","<=",H(M.endDate)).select(["posts.id","posts.title"]).groupBy("posts.id","posts.title").orderBy("posts.id","desc");if(f.limit)x=x.limit(f.limit);return(await x.execute()).map((J)=>({id:Number(J.id),title:String(J.title),comment_count:Number(J.comment_count||0)}))}catch(x){if(x instanceof Error)throw TypeError(`Failed to fetch posts with most comments: ${x.message}`);throw x}}async function $M(M,f={}){try{let B=await h(M,f);return{labels:B.map((x)=>x.title),values:B.map((x)=>x.comment_count)}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch bar graph data: ${B.message}`);throw B}}async function zM(M){let f=await C();try{let x=await f.selectFrom("commentables").where("created_at",">=",H(M.startDate)).where("created_at","<=",H(M.endDate)).select(["status"]).groupBy("status").execute(),P=x.reduce((Y,O)=>Y+Number(O.count||0),0),J=x.map((Y)=>String(Y.status)),X=x.map((Y)=>Number(Y.count||0)),Z=X.map((Y)=>P>0?Y/P*100:0);return{labels:J,values:X,percentages:Z}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch status distribution: ${B.message}`);throw B}}async function GM(M){let f=await C();try{let B=await f.selectFrom("commentables").where("created_at",">=",H(M.startDate)).where("created_at","<=",H(M.endDate)).select(["created_at"]).groupBy("created_at").orderBy("created_at","asc").execute(),x=new Map;B.forEach((X)=>{if(!X.created_at)return;let Z=new Date(X.created_at),Y=`${Z.getFullYear()}-${String(Z.getMonth()+1).padStart(2,"0")}`;x.set(Y,(x.get(Y)||0)+Number(X.count||0))});let P=[],J=[];return x.forEach((X,Z)=>{let[Y,O]=Z.split("-");P.push(new Date(Number(Y),Number(O)-1).toLocaleString("default",{month:"short",year:"numeric"})),J.push(X)}),{labels:P,values:J}}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch monthly comment counts: ${B.message}`);throw B}}async function AM(M){let f=await C();try{if(!await k(M))throw Error(`Comment with ID ${M} not found`);return(await f.deleteFrom("commentables").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete comment: ${B.message}`);throw B}}async function OM(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("commentables").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete comments in bulk: ${B.message}`);throw B}}import{sqlDateTime as Cf}from"@stacksjs/database";async function QM(M){let f=await C();try{if(!M.title||M.title.trim()==="")throw Error("Comment title is required");if(!M.body||M.body.trim()==="")throw Error("Comment body is required");if(!M.commentables_type||M.commentables_type.trim()==="")throw Error("Comment commentables_type is required");let B=["pending","approved","rejected"];if(M.status&&!B.includes(M.status))throw Error(`Invalid comment status: ${M.status}`);let x={title:M.title,body:M.body,status:M.status,commentables_id:M.commentables_id,commentables_type:M.commentables_type,user_id:M.user_id,is_active:M.is_active},P=await f.insertInto("commentables").values(x).returningAll().executeTakeFirst(),J=await z(f,"commentables",P);if(!J)throw Error("Failed to create comment");return J}catch(B){if(B instanceof Error)throw TypeError(`Failed to store comment: ${B.message}`);throw B}}import{formatDate as MB}from"@stacksjs/orm";async function VM(M,f){let B=await C();try{if(f.title!==void 0&&f.title.trim()==="")throw Error("Comment title cannot be empty");if(f.body!==void 0&&f.body.trim()==="")throw Error("Comment body cannot be empty");let x=["pending","approved","rejected"];if(f.status!==void 0&&!x.includes(f.status))throw Error(`Invalid comment status: ${f.status}`);let P={updated_at:MB(new Date)};if(f.title!==void 0)P.title=f.title;if(f.body!==void 0)P.body=f.body;if(f.status!==void 0)P.status=f.status;if(f.commentables_id!==void 0)P.commentables_id=f.commentables_id;if(f.commentables_type!==void 0)P.commentables_type=f.commentables_type;if(f.approved_at!==void 0)P.approved_at=f.approved_at;if(f.rejected_at!==void 0)P.rejected_at=f.rejected_at;return await B.updateTable("commentables").set(P).where("id","=",M).execute(),await B.selectFrom("commentables").where("id","=",M).selectAll().executeTakeFirst()}catch(x){if(x instanceof Error)throw TypeError(`Failed to update comment: ${x.message}`);throw x}}var v={};Q(v,{update:()=>UM,store:()=>EM,fetchPublishedAfter:()=>WM,fetchByMinViews:()=>SM,fetchByMinConversions:()=>_M,fetchById:()=>S,fetchByAuthor:()=>HM,fetchAll:()=>LM,destroy:()=>kM,bulkDestroy:()=>jM});async function S(M){return await(await C()).selectFrom("pages").where("id","=",M).selectAll().executeTakeFirst()}async function LM(){return await(await C()).selectFrom("pages").selectAll().execute()}async function HM(M){return await(await C()).selectFrom("pages").where("author_id","=",M).selectAll().execute()}async function SM(M){return await(await C()).selectFrom("pages").where("views",">=",M).selectAll().execute()}async function _M(M){return await(await C()).selectFrom("pages").where("conversions",">=",M).selectAll().execute()}async function WM(M){return await(await C()).selectFrom("pages").where("published_at",">",M).selectAll().execute()}async function kM(M){let f=await C();try{if(!await S(M))throw Error(`Page with ID ${M} not found`);return(await f.deleteFrom("pages").where("id","=",M).executeTakeFirst()).numDeletedRows>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete page: ${B.message}`);throw B}}async function jM(M){let f=await C();if(!M.length)return 0;try{let B=await f.deleteFrom("pages").where("id","in",M).executeTakeFirst();return Number(B.numDeletedRows)||0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete pages in bulk: ${B.message}`);throw B}}import{formatDate as KM}from"@stacksjs/orm";async function EM(M){let f=await C();try{let B={author_id:M.author_id,title:M.title,template:M.template,views:M.views||0,conversions:M.conversions||0,created_at:KM(new Date),updated_at:KM(new Date)},x=await f.insertInto("pages").values(B).returningAll().executeTakeFirst(),P=await z(f,"pages",x);if(!P)throw Error("Failed to create page");return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to create page: ${B.message}`);throw B}}import{formatDate as BB}from"@stacksjs/orm";async function UM(M,f){let B=await C();try{let x={...f,updated_at:BB(new Date)},P=await B.updateTable("pages").set(x).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;let J=await S(M);if(!J)throw Error("Failed to update page");return J}catch(x){if(x instanceof Error)throw TypeError(`Failed to update page: ${x.message}`);throw x}}var I={};Q(I,{update:()=>mM,sync:()=>pM,store:()=>cM,fetchPublishedAfter:()=>IM,fetchByStatus:()=>NM,fetchByMinViews:()=>vM,fetchById:()=>A,fetchByCategory:()=>hM,fetchByAuthor:()=>qM,fetchAll:()=>FM,detach:()=>wM,destroy:()=>TM,bulkDestroy:()=>RM,attach:()=>yM});async function A(M){return await(await C()).selectFrom("posts").where("id","=",M).selectAll().executeTakeFirst()}async function FM(){return await(await C()).selectFrom("posts").selectAll().execute()}async function NM(M){return await(await C()).selectFrom("posts").where("status","=",M).selectAll().execute()}async function hM(M){return await(await C()).selectFrom("posts").where("category","=",M).selectAll().execute()}async function qM(M){return await(await C()).selectFrom("posts").where("author_id","=",M).selectAll().execute()}async function vM(M){return await(await C()).selectFrom("posts").where("views",">=",M).selectAll().execute()}async function IM(M){return await(await C()).selectFrom("posts").where("published_at",">",M).selectAll().execute()}async function TM(M){let f=await C();try{if(!await A(M))throw Error(`Post with ID ${M} not found`);let x=await f.deleteFrom("posts").where("id","=",M).executeTakeFirst();return U(x,"numDeletedRows")>0}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete post: ${B.message}`);throw B}}async function RM(M){let f=await C();if(!M.length)return 0;try{let x=(await f.selectFrom("posts").select(["id"]).where("id","in",M).execute()).map((J)=>J.id);if(!x.length)return 0;let P=0;for(let J of x){let X=await f.deleteFrom("posts").where("id","=",J).executeTakeFirst();P+=U(X,"numDeletedRows")}return P}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete posts in bulk: ${B.message}`);throw B}}var{randomUUIDv7:fB}=globalThis.Bun;import{formatDate as j}from"@stacksjs/orm";var xB="draft",PB="published";async function cM(M){let f=await C();try{if(!M.title||typeof M.title==="string"&&M.title.trim()==="")throw Error("Post title is required");let B=M.content||M.body,x=M,P=M.status||xB,J={author_id:x.author_id,uuid:fB(),title:M.title,poster:M.poster,content:B,excerpt:M.excerpt,is_featured:x.is_featured?Date.now():void 0,views:M.views||0,published_at:x.published_at??(P===PB?Date.now():void 0),status:P},X=await f.insertInto("posts").values(J).returningAll().executeTakeFirst();if($(X))return X;let Z=E(X),Y=Z===void 0?void 0:await A(Z);if(!Y)throw Error("Failed to create post");return Y}catch(B){if(B instanceof Error)throw TypeError(`Failed to create post: ${B.message}`);throw B}}async function yM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Z=B.map((Y)=>({[X]:Y,[P]:M,[J]:"posts",created_at:j(new Date),updated_at:j(new Date)}));for(let Y of Z)await x.insertInto(f).values(Y).execute()}catch(P){if(P instanceof Error)throw TypeError(`Failed to attach records: ${P.message}`);throw P}}async function wM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Z=x.deleteFrom(f).where(P,"=",M).where(J,"=","posts");if(B){for(let Y of B)await x.deleteFrom(f).where(P,"=",M).where(J,"=","posts").where(X,"=",Y).execute();return}await Z.execute()}catch(P){if(P instanceof Error)throw TypeError(`Failed to detach records: ${P.message}`);throw P}}async function pM(M,f,B){let x=await C();try{let P=f==="categorizable_models"?"categorizable_id":"taggable_id",J=f==="categorizable_models"?"categorizable_type":"taggable_type",X=f==="categorizable_models"?"category_id":"tag_id",Y=(await x.selectFrom(f).select([X]).where(P,"=",M).where(J,"=","posts").execute()).map((G)=>G[X]),O=Y.filter((G)=>!B.includes(G)),R=B.filter((G)=>!Y.includes(G));if(O.length>0)for(let G of O)await x.deleteFrom(f).where(P,"=",M).where(J,"=","posts").where(X,"=",G).execute();if(R.length>0){let G=R.map((bM)=>({[X]:bM,[P]:M,[J]:"posts",created_at:j(new Date),updated_at:j(new Date)}));await x.insertInto(f).values(G).execute()}}catch(P){if(P instanceof Error)throw TypeError(`Failed to sync records: ${P.message}`);throw P}}async function mM(M,f){let B=await C();try{if(f.title!==void 0&&typeof f.title==="string"&&f.title.trim()==="")throw Error("Post title cannot be empty");let x=["published","draft","archived"];if(f.status!==void 0&&typeof f.status==="string"&&!x.includes(f.status))throw Error(`Invalid post status: ${f.status}`);if(f.views!==void 0&&typeof f.views==="number"&&f.views<0)throw Error("Views count cannot be negative");let P=await B.updateTable("posts").set(f).where("id","=",M).returningAll().executeTakeFirst();if($(P))return P;let J=await A(M);if(!J)throw Error(`Post with ID ${M} not found`);return J}catch(x){if(x instanceof Error)throw TypeError(`Failed to update post: ${x.message}`);throw x}}var T={};Q(T,{update:()=>lM,store:()=>gM,fetchTags:()=>nM,fetchTagById:()=>K,destroy:()=>DM,bulkDestroy:()=>uM});async function DM(M){let f=await C();if(!await f.selectFrom("taggables").where("id","=",M).selectAll().executeTakeFirst())throw Error(`Tag with ID ${M} not found`);await f.deleteFrom("taggables").where("id","=",M).executeTakeFirst()}async function uM(M){let f=await C();try{await f.deleteFrom("taggables").where("id","in",M).execute()}catch(B){if(B instanceof Error)throw TypeError(`Failed to delete tags: ${B.message}`);throw B}}import{slugify as CB}from"ts-slug";async function gM(M){let f=await C();try{if(!M.name||M.name.trim()==="")throw Error("Tag name is required");if(!M.taggable_type||M.taggable_type.trim()==="")throw Error("Tag taggable_type is required");let B=CB(M.name);if(await f.selectFrom("taggables").selectAll().where("slug","=",B).executeTakeFirst())throw Error(`Tag with unique slug "${B}" already exists`);let P={name:M.name,slug:B,description:M.description,is_active:M.is_active??!0,taggable_type:M.taggable_type};if(M.taggable_id!==void 0)P.taggable_id=M.taggable_id;let J=await f.insertInto("taggables").values(P).returningAll().executeTakeFirst(),X=await z(f,"taggables",J);if(!X)throw Error("Failed to create tag");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to store tag: ${B.message}`);throw B}}async function K(M){let f=await C();try{let B=await f.selectFrom("taggables").where("id","=",M).selectAll().executeTakeFirst();if(!B)return;return B}catch(B){if(B instanceof Error)throw TypeError(`Failed to fetch tag: ${B.message}`);throw B}}async function nM(){let M=await C();try{return await M.selectFrom("taggables").where("is_active","=",!0).selectAll().execute()}catch(f){if(f instanceof Error)throw TypeError(`Failed to fetch tags: ${f.message}`);throw f}}import{uniqueSlug as JB}from"@stacksjs/slug";async function lM(M){let f=await C();try{let B=M.id;if(!B)throw Error("Tag ID is required for update");if(M.name!==void 0){if(M.name.trim()==="")throw Error("Tag name cannot be empty");let Z=await JB(M.name,{table:"taggables",column:"slug"});if(await f.selectFrom("taggables").selectAll().where("slug","=",Z).where("id","!=",B).executeTakeFirst())throw Error(`Tag with unique slug "${Z}" already exists`);M.slug=Z}let{id:x,...P}=M,J=await f.updateTable("taggables").set(P).where("id","=",B).returningAll().executeTakeFirst();if($(J))return J;let X=await K(B);if(!X)throw Error("Failed to update tag");return X}catch(B){if(B instanceof Error)throw TypeError(`Failed to update tag: ${B.message}`);throw B}}var XB={posts:I,postCategories:N,tags:T,comments:q,authors:F,pages:v},Sx=XB;export{T as tags,I as posts,v as pages,Sx as default,q as comments,XB as cms,N as categorizable,F as authors};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/cms",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.70.256",
5
+ "version": "0.70.257",
6
6
  "description": "Stacks cms utilities.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [