@kyro-cms/core 0.12.35 → 0.12.36
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/api-handler-graphql.cjs +1 -1
- package/dist/api-handler-graphql.js +1 -1
- package/dist/api-handler-trpc.cjs +1 -1
- package/dist/api-handler-trpc.js +1 -1
- package/dist/api-handler.cjs +1 -1
- package/dist/api-handler.js +1 -1
- package/dist/bootstrap-BGO2NFKB.cjs +1 -0
- package/dist/{bootstrap-6G6HI26Z.js → bootstrap-VVIT6YBP.js} +1 -1
- package/dist/chunk-7MBZYLME.js +1 -0
- package/dist/{chunk-TMKROUQA.cjs → chunk-KKIBNWRL.cjs} +1 -1
- package/dist/{chunk-7R5IPQ5F.js → chunk-LCXPMPBU.js} +1 -1
- package/dist/chunk-QBJT7XLN.cjs +1 -0
- package/dist/cli/index.cjs +38 -44
- package/dist/cli/index.js +38 -44
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +4 -3
- package/dist/bootstrap-ETJ6QNGR.cjs +0 -1
- package/dist/chunk-4XZABBHF.cjs +0 -1
- package/dist/chunk-6MSPBK3W.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkKKIBNWRL_cjs=require('./chunk-KKIBNWRL.cjs');require('./chunk-4KFXG5ZB.cjs'),require('./chunk-QBJT7XLN.cjs'),require('./chunk-65G73T7Z.cjs'),require('./chunk-KD7LUCFY.cjs'),require('./chunk-ZUVP4UK7.cjs'),require('./chunk-HS2KNFAB.cjs'),require('./chunk-2YRM7CZZ.cjs'),require('./chunk-5K4YG5DA.cjs'),require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-GO34AOBZ.cjs'),require('./chunk-HOP4D5XZ.cjs'),require('./chunk-HVXO3OFB.cjs'),require('./chunk-ILEZ3NYX.cjs'),require('./chunk-NY47CFVP.cjs'),require('./chunk-G3J2EU5D.cjs'),require('./chunk-4ORJMSJU.cjs'),require('./chunk-FUWPXR6W.cjs'),require('./chunk-GYQMNXXW.cjs'),require('./chunk-MIOMMB23.cjs'),require('./chunk-3Q2WUG63.cjs'),require('./chunk-QCA3AP3M.cjs'),require('./chunk-FHJJKFAU.cjs'),require('./chunk-D5P2IPGX.cjs'),require('./chunk-G7SSHELM.cjs'),require('./chunk-Q3Q7BJVQ.cjs'),require('./chunk-AHSFSERC.cjs');function n(e){return new Response(e.body,e)}var p={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};function r(){return new Response(JSON.stringify({error:"GraphQL is disabled"}),{status:503,headers:{"Content-Type":"application/json"}})}async function o(){try{return (await chunkKKIBNWRL_cjs.a.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.graphqlEnabled??p.graphqlEnabled}catch{return true}}var l=async e=>{if(await chunkKKIBNWRL_cjs.b(),!await o())return r();let t=await chunkKKIBNWRL_cjs.a.getGraphQL().fetch(e.request,e.locals);return n(t)},u=async e=>{if(await chunkKKIBNWRL_cjs.b(),!await o())return r();let t=await chunkKKIBNWRL_cjs.a.getGraphQL().fetch(e.request,e.locals);return n(t)};exports.GET=u;exports.POST=l;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b,a}from'./chunk-
|
|
1
|
+
import {b,a}from'./chunk-LCXPMPBU.js';import'./chunk-DZMIMB5W.js';import'./chunk-7MBZYLME.js';import'./chunk-NZ35PV5R.js';import'./chunk-5SEHX7ON.js';import'./chunk-LHW4R367.js';import'./chunk-PP7W5UKL.js';import'./chunk-4DJYAD4L.js';import'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IETGL7WJ.js';import'./chunk-IKOXCJYO.js';import'./chunk-NRLIGDYF.js';import'./chunk-FVZ5RFLO.js';import'./chunk-HLSB2MCK.js';import'./chunk-GKYEJ2UF.js';import'./chunk-PP5S2UBV.js';import'./chunk-5KSRMBEO.js';import'./chunk-RHCWCG3O.js';import'./chunk-OG7CNQGU.js';import'./chunk-VGQ4VUG6.js';import'./chunk-6ROHVUXF.js';import'./chunk-5KOQYQEE.js';import'./chunk-6SPPR5JZ.js';import'./chunk-4RMFCTWH.js';import'./chunk-KDNYHLD2.js';import'./chunk-5J6HXUF6.js';function n(e){return new Response(e.body,e)}var p={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};function r(){return new Response(JSON.stringify({error:"GraphQL is disabled"}),{status:503,headers:{"Content-Type":"application/json"}})}async function o(){try{return (await a.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.graphqlEnabled??p.graphqlEnabled}catch{return true}}var l=async e=>{if(await b(),!await o())return r();let t=await a.getGraphQL().fetch(e.request,e.locals);return n(t)},u=async e=>{if(await b(),!await o())return r();let t=await a.getGraphQL().fetch(e.request,e.locals);return n(t)};export{u as GET,l as POST};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkKKIBNWRL_cjs=require('./chunk-KKIBNWRL.cjs');require('./chunk-4KFXG5ZB.cjs'),require('./chunk-QBJT7XLN.cjs'),require('./chunk-65G73T7Z.cjs'),require('./chunk-KD7LUCFY.cjs'),require('./chunk-ZUVP4UK7.cjs'),require('./chunk-HS2KNFAB.cjs'),require('./chunk-2YRM7CZZ.cjs'),require('./chunk-5K4YG5DA.cjs'),require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-GO34AOBZ.cjs'),require('./chunk-HOP4D5XZ.cjs'),require('./chunk-HVXO3OFB.cjs'),require('./chunk-ILEZ3NYX.cjs'),require('./chunk-NY47CFVP.cjs'),require('./chunk-G3J2EU5D.cjs'),require('./chunk-4ORJMSJU.cjs'),require('./chunk-FUWPXR6W.cjs'),require('./chunk-GYQMNXXW.cjs'),require('./chunk-MIOMMB23.cjs'),require('./chunk-3Q2WUG63.cjs'),require('./chunk-QCA3AP3M.cjs'),require('./chunk-FHJJKFAU.cjs'),require('./chunk-D5P2IPGX.cjs'),require('./chunk-G7SSHELM.cjs'),require('./chunk-Q3Q7BJVQ.cjs'),require('./chunk-AHSFSERC.cjs');function n(){return new Response(JSON.stringify({error:"tRPC is disabled"}),{status:503,headers:{"Content-Type":"application/json"}})}var r={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};async function s(){try{return (await chunkKKIBNWRL_cjs.a.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.trpcEnabled??r.trpcEnabled}catch{return true}}var i=async e=>(await chunkKKIBNWRL_cjs.b(),await s()?chunkKKIBNWRL_cjs.a.getTRPC().fetch(e.request,e.locals):n());exports.ALL=i;
|
package/dist/api-handler-trpc.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {b,a}from'./chunk-
|
|
1
|
+
import {b,a}from'./chunk-LCXPMPBU.js';import'./chunk-DZMIMB5W.js';import'./chunk-7MBZYLME.js';import'./chunk-NZ35PV5R.js';import'./chunk-5SEHX7ON.js';import'./chunk-LHW4R367.js';import'./chunk-PP7W5UKL.js';import'./chunk-4DJYAD4L.js';import'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IETGL7WJ.js';import'./chunk-IKOXCJYO.js';import'./chunk-NRLIGDYF.js';import'./chunk-FVZ5RFLO.js';import'./chunk-HLSB2MCK.js';import'./chunk-GKYEJ2UF.js';import'./chunk-PP5S2UBV.js';import'./chunk-5KSRMBEO.js';import'./chunk-RHCWCG3O.js';import'./chunk-OG7CNQGU.js';import'./chunk-VGQ4VUG6.js';import'./chunk-6ROHVUXF.js';import'./chunk-5KOQYQEE.js';import'./chunk-6SPPR5JZ.js';import'./chunk-4RMFCTWH.js';import'./chunk-KDNYHLD2.js';import'./chunk-5J6HXUF6.js';function n(){return new Response(JSON.stringify({error:"tRPC is disabled"}),{status:503,headers:{"Content-Type":"application/json"}})}var r={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};async function s(){try{return (await a.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.trpcEnabled??r.trpcEnabled}catch{return true}}var i=async e=>(await b(),await s()?a.getTRPC().fetch(e.request,e.locals):n());export{i as ALL};
|
package/dist/api-handler.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkKKIBNWRL_cjs=require('./chunk-KKIBNWRL.cjs');require('./chunk-4KFXG5ZB.cjs'),require('./chunk-QBJT7XLN.cjs'),require('./chunk-65G73T7Z.cjs'),require('./chunk-KD7LUCFY.cjs'),require('./chunk-ZUVP4UK7.cjs'),require('./chunk-HS2KNFAB.cjs'),require('./chunk-2YRM7CZZ.cjs'),require('./chunk-5K4YG5DA.cjs'),require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-GO34AOBZ.cjs'),require('./chunk-HOP4D5XZ.cjs'),require('./chunk-HVXO3OFB.cjs'),require('./chunk-ILEZ3NYX.cjs'),require('./chunk-NY47CFVP.cjs'),require('./chunk-G3J2EU5D.cjs'),require('./chunk-4ORJMSJU.cjs'),require('./chunk-FUWPXR6W.cjs'),require('./chunk-GYQMNXXW.cjs'),require('./chunk-MIOMMB23.cjs'),require('./chunk-3Q2WUG63.cjs'),require('./chunk-QCA3AP3M.cjs'),require('./chunk-FHJJKFAU.cjs'),require('./chunk-D5P2IPGX.cjs'),require('./chunk-G7SSHELM.cjs'),require('./chunk-Q3Q7BJVQ.cjs'),require('./chunk-AHSFSERC.cjs');Object.defineProperty(exports,"ALL",{enumerable:true,get:function(){return chunkKKIBNWRL_cjs.c}});Object.defineProperty(exports,"kyroInstance",{enumerable:true,get:function(){return chunkKKIBNWRL_cjs.a}});Object.defineProperty(exports,"warmKyroInstance",{enumerable:true,get:function(){return chunkKKIBNWRL_cjs.b}});
|
package/dist/api-handler.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{c as ALL,a as kyroInstance,b as warmKyroInstance}from'./chunk-
|
|
1
|
+
export{c as ALL,a as kyroInstance,b as warmKyroInstance}from'./chunk-LCXPMPBU.js';import'./chunk-DZMIMB5W.js';import'./chunk-7MBZYLME.js';import'./chunk-NZ35PV5R.js';import'./chunk-5SEHX7ON.js';import'./chunk-LHW4R367.js';import'./chunk-PP7W5UKL.js';import'./chunk-4DJYAD4L.js';import'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IETGL7WJ.js';import'./chunk-IKOXCJYO.js';import'./chunk-NRLIGDYF.js';import'./chunk-FVZ5RFLO.js';import'./chunk-HLSB2MCK.js';import'./chunk-GKYEJ2UF.js';import'./chunk-PP5S2UBV.js';import'./chunk-5KSRMBEO.js';import'./chunk-RHCWCG3O.js';import'./chunk-OG7CNQGU.js';import'./chunk-VGQ4VUG6.js';import'./chunk-6ROHVUXF.js';import'./chunk-5KOQYQEE.js';import'./chunk-6SPPR5JZ.js';import'./chunk-4RMFCTWH.js';import'./chunk-KDNYHLD2.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var chunkQBJT7XLN_cjs=require('./chunk-QBJT7XLN.cjs');require('./chunk-5K4YG5DA.cjs'),require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-HOP4D5XZ.cjs'),require('./chunk-AHSFSERC.cjs');Object.defineProperty(exports,"autoBootstrap",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.d}});Object.defineProperty(exports,"bootstrapAdmin",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.a}});Object.defineProperty(exports,"bootstrapWithRetry",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.e}});Object.defineProperty(exports,"checkBootstrapRequired",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.b}});Object.defineProperty(exports,"getBootstrapFromEnv",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.c}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{d as autoBootstrap,a as bootstrapAdmin,e as bootstrapWithRetry,b as checkBootstrapRequired,c as getBootstrapFromEnv}from'./chunk-
|
|
1
|
+
export{d as autoBootstrap,a as bootstrapAdmin,e as bootstrapWithRetry,b as checkBootstrapRequired,c as getBootstrapFromEnv}from'./chunk-7MBZYLME.js';import'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IKOXCJYO.js';import'./chunk-5J6HXUF6.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import {l,k}from'./chunk-6J27P5D6.js';import {a}from'./chunk-IKOXCJYO.js';async function f(r){let{adminEmail:e,adminPassword:t,adminRole:o="super_admin",tenantId:i,emailConfig:a$1,sendWelcomeEmail:c=false}=r,s=r.authAdapter||new a({path:r.authDbPath||"./data/auth.db"});try{await s.connect?.();}catch{return {success:false,error:"Failed to connect to auth storage"}}let l$1=new l().validate(t);if(!l$1.valid)return await s.disconnect?.(),{success:false,error:`Invalid password: ${l$1.errors.join(", ")}`};if(await s.findUserByEmail(e))return await s.disconnect?.(),{success:false,error:"Admin user already exists"};try{let n=await s.createUser({name:"Super Admin",email:e,password:t,role:o||"admin",tenantId:i});if(await s.updateUser?.(n.id,{emailVerified:!0}),c&&a$1){let u=new k(a$1),A=u.getTemplates().welcome(e.split("@")[0]);await u.send({to:e,...A});}return await s.disconnect?.(),{success:!0,user:n}}catch(n){return await s.disconnect?.(),{success:false,error:n instanceof Error?n.message:"Failed to create admin user"}}}async function y(r,e){return !await r.findUserByEmail(e)}function w(){let r=process.env.KYRO_ADMIN_EMAIL,e=process.env.KYRO_ADMIN_PASSWORD;return !r||!e?null:{authDbPath:process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",adminEmail:r,adminPassword:e,adminRole:process.env.KYRO_ADMIN_ROLE||"super_admin",tenantId:process.env.KYRO_ADMIN_TENANT_ID,emailConfig:process.env.SMTP_HOST?{provider:"smtp",smtp:{host:process.env.SMTP_HOST,port:parseInt(process.env.SMTP_PORT||"587",10),secure:process.env.SMTP_SECURE==="true",auth:{user:process.env.SMTP_USER||"",pass:process.env.SMTP_PASS||""}},from:process.env.SMTP_FROM||"noreply@example.com",fromName:process.env.SMTP_FROM_NAME}:void 0,sendWelcomeEmail:process.env.KYRO_ADMIN_SEND_WELCOME==="true"}}async function T(r){let e=w();if(!e)return null;r&&(e.authAdapter=r);try{if(await e.authAdapter?.connect?.(),await e.authAdapter?.findUserByEmail(e.adminEmail))return await e.authAdapter?.disconnect?.(),{success:!1,error:"Admin user already exists"}}catch{}let t=await f(e);return t.success||console.error(`Bootstrap failed: ${t.error}`),t}async function v(r,e=3,t=2e3){let o="";for(let i=0;i<e;i++){let a=await f(r);if(a.success||(o=a.error||"Unknown error",o.includes("already exists")))return a;i<e-1&&await new Promise(c=>setTimeout(c,t));}return {success:false,error:`Failed after ${e} retries: ${o}`}}export{f as a,y as b,w as c,T as d,v as e};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var chunk4KFXG5ZB_cjs=require('./chunk-4KFXG5ZB.cjs'),
|
|
1
|
+
'use strict';var chunk4KFXG5ZB_cjs=require('./chunk-4KFXG5ZB.cjs'),chunkQBJT7XLN_cjs=require('./chunk-QBJT7XLN.cjs'),chunk2YRM7CZZ_cjs=require('./chunk-2YRM7CZZ.cjs'),chunkHOP4D5XZ_cjs=require('./chunk-HOP4D5XZ.cjs'),chunkFUWPXR6W_cjs=require('./chunk-FUWPXR6W.cjs'),chunkGYQMNXXW_cjs=require('./chunk-GYQMNXXW.cjs'),chunk3Q2WUG63_cjs=require('./chunk-3Q2WUG63.cjs'),chunkQCA3AP3M_cjs=require('./chunk-QCA3AP3M.cjs'),A=require('kyro:config');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var A__default=/*#__PURE__*/_interopDefault(A);exports.a=null;var n=null;async function b(){if(!exports.a){if(globalThis.__KYRO_INSTANCE__)try{await globalThis.__KYRO_INSTANCE__.shutdown();}catch{}try{let t=A__default.default.default||A__default.default;exports.a=chunk4KFXG5ZB_cjs.z(t),await exports.a.init(),await exports.a.loadSettings();let e=exports.a.db,a;if(e instanceof chunkFUWPXR6W_cjs.c)e.dialect==="postgres"?a=new chunkGYQMNXXW_cjs.a({db:e.client}):e.dialect==="sqlite"&&(a=new chunk2YRM7CZZ_cjs.r({db:e.client}));else if(e instanceof chunk4KFXG5ZB_cjs.A){let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";a=new chunkHOP4D5XZ_cjs.a({path:s});}else e instanceof chunk3Q2WUG63_cjs.a&&(a=new chunkQCA3AP3M_cjs.a({db:e.db}));a?.connect&&await a.connect(),(await chunkQBJT7XLN_cjs.d(a))?.success,typeof exports.a.startWebSocket=="function"&&exports.a.startWebSocket().catch(s=>{console.error("[Kyro] WebSocket auto-start failed:",s);}),globalThis.__KYRO_INSTANCE__=exports.a;}catch(t){throw exports.a=null,n=null,console.error("[Kyro API] Init failed, will retry:",t),t}}}async function D(){n||(n=b()),await n;}var w={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};async function g(t){try{return (await exports.a.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.[t]??w[t]??!0}catch{return true}}var q=async t=>{let e=null;try{e=t.locals?.cfContext?.env||process.env;}catch{e=process.env;}if(e?.DB&&(globalThis.DB=e.DB),e?.STORAGE_BUCKET&&(globalThis.STORAGE_BUCKET=e.STORAGE_BUCKET),!exports.a){n||(n=b());try{await Promise.race([n,new Promise((c,o)=>setTimeout(()=>o(new Error("Initialization timeout")),3e4))]);}catch{return new Response(JSON.stringify({error:"Service Unavailable",message:"Kyro CMS is still starting up. Please try again in a moment."}),{status:503,headers:{"Content-Type":"application/json","Retry-After":"5"}})}}let i=new URL(t.request.url).pathname,s=__KYRO_API_PATH__;if(i===`${s}/graphql`&&typeof exports.a.getGraphQL=="function"){if(!await g("graphqlEnabled"))return new Response(JSON.stringify({error:"GraphQL is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let o=await exports.a.getGraphQL().fetch(t.request,t.locals);return new Response(o.body,o)}if(i.startsWith(`${s}/trpc/`)&&typeof exports.a.getTRPC=="function"){if(!await g("trpcEnabled"))return new Response(JSON.stringify({error:"tRPC is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let o=await exports.a.getTRPC().fetch(t.request,t.locals);return new Response(o.body,o)}return exports.a.getREST().fetch(t.request,t.locals)};exports.b=D;exports.c=q;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import {z,A as A$1}from'./chunk-DZMIMB5W.js';import {d}from'./chunk-
|
|
1
|
+
import {z,A as A$1}from'./chunk-DZMIMB5W.js';import {d}from'./chunk-7MBZYLME.js';import {r as r$1}from'./chunk-4DJYAD4L.js';import {a as a$1}from'./chunk-IKOXCJYO.js';import {c}from'./chunk-5KSRMBEO.js';import {a}from'./chunk-RHCWCG3O.js';import {a as a$2}from'./chunk-VGQ4VUG6.js';import {a as a$3}from'./chunk-6ROHVUXF.js';import A from'kyro:config';var r=null,n=null;async function b(){if(!r){if(globalThis.__KYRO_INSTANCE__)try{await globalThis.__KYRO_INSTANCE__.shutdown();}catch{}try{let t=A.default||A;r=z(t),await r.init(),await r.loadSettings();let e=r.db,a$4;if(e instanceof c)e.dialect==="postgres"?a$4=new a({db:e.client}):e.dialect==="sqlite"&&(a$4=new r$1({db:e.client}));else if(e instanceof A$1){let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";a$4=new a$1({path:s});}else e instanceof a$2&&(a$4=new a$3({db:e.db}));a$4?.connect&&await a$4.connect(),(await d(a$4))?.success,typeof r.startWebSocket=="function"&&r.startWebSocket().catch(s=>{console.error("[Kyro] WebSocket auto-start failed:",s);}),globalThis.__KYRO_INSTANCE__=r;}catch(t){throw r=null,n=null,console.error("[Kyro API] Init failed, will retry:",t),t}}}async function D(){n||(n=b()),await n;}var w={graphqlEnabled:false,trpcEnabled:false,wsEnabled:false,requireAuth:false};async function g(t){try{return (await r.db.findOne({collection:"_globals_access-settings",where:{},draft:!0}))?.apiAccess?.[t]??w[t]??!0}catch{return true}}var q=async t=>{let e=null;try{e=t.locals?.cfContext?.env||process.env;}catch{e=process.env;}if(e?.DB&&(globalThis.DB=e.DB),e?.STORAGE_BUCKET&&(globalThis.STORAGE_BUCKET=e.STORAGE_BUCKET),!r){n||(n=b());try{await Promise.race([n,new Promise((c,o)=>setTimeout(()=>o(new Error("Initialization timeout")),3e4))]);}catch{return new Response(JSON.stringify({error:"Service Unavailable",message:"Kyro CMS is still starting up. Please try again in a moment."}),{status:503,headers:{"Content-Type":"application/json","Retry-After":"5"}})}}let i=new URL(t.request.url).pathname,s=__KYRO_API_PATH__;if(i===`${s}/graphql`&&typeof r.getGraphQL=="function"){if(!await g("graphqlEnabled"))return new Response(JSON.stringify({error:"GraphQL is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let o=await r.getGraphQL().fetch(t.request,t.locals);return new Response(o.body,o)}if(i.startsWith(`${s}/trpc/`)&&typeof r.getTRPC=="function"){if(!await g("trpcEnabled"))return new Response(JSON.stringify({error:"tRPC is disabled"}),{status:503,headers:{"Content-Type":"application/json"}});let o=await r.getTRPC().fetch(t.request,t.locals);return new Response(o.body,o)}return r.getREST().fetch(t.request,t.locals)};export{r as a,D as b,q as c};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var chunk5K4YG5DA_cjs=require('./chunk-5K4YG5DA.cjs'),chunkHOP4D5XZ_cjs=require('./chunk-HOP4D5XZ.cjs');async function f(r){let{adminEmail:e,adminPassword:t,adminRole:o="super_admin",tenantId:i,emailConfig:a,sendWelcomeEmail:c=false}=r,s=r.authAdapter||new chunkHOP4D5XZ_cjs.a({path:r.authDbPath||"./data/auth.db"});try{await s.connect?.();}catch{return {success:false,error:"Failed to connect to auth storage"}}let l=new chunk5K4YG5DA_cjs.l().validate(t);if(!l.valid)return await s.disconnect?.(),{success:false,error:`Invalid password: ${l.errors.join(", ")}`};if(await s.findUserByEmail(e))return await s.disconnect?.(),{success:false,error:"Admin user already exists"};try{let n=await s.createUser({name:"Super Admin",email:e,password:t,role:o||"admin",tenantId:i});if(await s.updateUser?.(n.id,{emailVerified:!0}),c&&a){let u=new chunk5K4YG5DA_cjs.k(a),A=u.getTemplates().welcome(e.split("@")[0]);await u.send({to:e,...A});}return await s.disconnect?.(),{success:!0,user:n}}catch(n){return await s.disconnect?.(),{success:false,error:n instanceof Error?n.message:"Failed to create admin user"}}}async function y(r,e){return !await r.findUserByEmail(e)}function w(){let r=process.env.KYRO_ADMIN_EMAIL,e=process.env.KYRO_ADMIN_PASSWORD;return !r||!e?null:{authDbPath:process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",adminEmail:r,adminPassword:e,adminRole:process.env.KYRO_ADMIN_ROLE||"super_admin",tenantId:process.env.KYRO_ADMIN_TENANT_ID,emailConfig:process.env.SMTP_HOST?{provider:"smtp",smtp:{host:process.env.SMTP_HOST,port:parseInt(process.env.SMTP_PORT||"587",10),secure:process.env.SMTP_SECURE==="true",auth:{user:process.env.SMTP_USER||"",pass:process.env.SMTP_PASS||""}},from:process.env.SMTP_FROM||"noreply@example.com",fromName:process.env.SMTP_FROM_NAME}:void 0,sendWelcomeEmail:process.env.KYRO_ADMIN_SEND_WELCOME==="true"}}async function T(r){let e=w();if(!e)return null;r&&(e.authAdapter=r);try{if(await e.authAdapter?.connect?.(),await e.authAdapter?.findUserByEmail(e.adminEmail))return await e.authAdapter?.disconnect?.(),{success:!1,error:"Admin user already exists"}}catch{}let t=await f(e);return t.success||console.error(`Bootstrap failed: ${t.error}`),t}async function v(r,e=3,t=2e3){let o="";for(let i=0;i<e;i++){let a=await f(r);if(a.success||(o=a.error||"Unknown error",o.includes("already exists")))return a;i<e-1&&await new Promise(c=>setTimeout(c,t));}return {success:false,error:`Failed after ${e} retries: ${o}`}}exports.a=f;exports.b=y;exports.c=w;exports.d=T;exports.e=v;
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';require('../chunk-AHSFSERC.cjs');var commander=require('commander'),
|
|
3
|
-
${e.fields.filter(
|
|
2
|
+
'use strict';require('../chunk-AHSFSERC.cjs');var commander=require('commander'),R=require('fs'),k=require('path'),url=require('url'),glob=require('glob'),child_process=require('child_process'),J=require('prompts'),q=require('crypto'),n=require('chalk');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var R__default=/*#__PURE__*/_interopDefault(R);var k__default=/*#__PURE__*/_interopDefault(k);var J__default=/*#__PURE__*/_interopDefault(J);var q__default=/*#__PURE__*/_interopDefault(q);var n__default=/*#__PURE__*/_interopDefault(n);function x(e){switch(e.type){case "text":case "email":case "password":case "textarea":case "color":case "code":case "markdown":case "date":case "richtext":case "json":return e.hasMany?"string[]":"string";case "number":return e.hasMany?"number[]":"number";case "checkbox":return "boolean";case "select":case "radio":if(e.options){let t=e.options.map(o=>`'${o.value}'`).join(" | ");return e.hasMany?`(${t})[]`:t}return e.hasMany?"string[]":"string";case "relationship":if(Array.isArray(e.relationTo)){if(e.relationTo.includes("*"))return e.hasMany?"any[]":"any";let t=e.relationTo.map(o=>`${C(o)} | string`).join(" | ");return e.hasMany?`(${t})[]`:`(${t})`}let r=e.relationTo||"unknown";return r==="*"?e.hasMany?"any[]":"any":e.hasMany?`(${C(r)} | string)[]`:`${C(r)} | string`;case "upload":return e.hasMany?"(Media | string)[]":"Media | string";case "array":return e.fields&&e.fields.length>0?`Array<{
|
|
3
|
+
${e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`}).join(`
|
|
4
4
|
`)}
|
|
5
5
|
}>`:"Record<string, any>[]";case "group":return e.fields&&e.fields.length>0?`{
|
|
6
|
-
${e.fields.filter(
|
|
6
|
+
${e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`}).join(`
|
|
7
7
|
`)}
|
|
8
|
-
}`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function C(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function N(e){return e.replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function
|
|
8
|
+
}`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function C(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function N(e){return e.replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function H(e){let r=C(e.slug),t=e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`});return t.unshift(" id: string;"),t.push(" createdAt: string;"),t.push(" updatedAt: string;"),`export interface ${r} {
|
|
9
9
|
${t.join(`
|
|
10
10
|
`)}
|
|
11
|
-
}`}function
|
|
11
|
+
}`}function O(e){let r=e.map(a=>H(a)),t=`// ============================================================================
|
|
12
12
|
// Auto-generated by kyro generate
|
|
13
13
|
// ============================================================================
|
|
14
14
|
|
|
@@ -31,7 +31,7 @@ export interface Block {
|
|
|
31
31
|
[key: string]: any;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
`,
|
|
34
|
+
`,o=r.join(`
|
|
35
35
|
|
|
36
36
|
`),s=`
|
|
37
37
|
|
|
@@ -122,7 +122,7 @@ export function createClient(config: { url: string; token?: string }): KyroClien
|
|
|
122
122
|
// Client implementation would be here
|
|
123
123
|
throw new Error('Not implemented');
|
|
124
124
|
}
|
|
125
|
-
`;return t+
|
|
125
|
+
`;return t+o+s}async function Y(e,r){let t=`${e.replace(/\/+$/,"")}/api/__schema`,o=await fetch(t,{headers:{Authorization:`ApiKey ${r}`}});if(!o.ok){let s=await o.text();throw new Error(`Schema fetch failed (${o.status}): ${s}`)}return o.json()}function G(e){let r=`// ============================================================================
|
|
126
126
|
// Auto-generated by kyro generate --api
|
|
127
127
|
// ============================================================================
|
|
128
128
|
|
|
@@ -145,7 +145,7 @@ export interface Block {
|
|
|
145
145
|
[key: string]: any;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
`;for(let t of e){let
|
|
148
|
+
`;for(let t of e){let o=C(t.slug),s=t.fields.filter(a=>a.name).map(a=>{let c=x(a);return ` ${a.name}${a.required?"":"?"}: ${c};`});s.unshift(" id: string;"),s.push(" createdAt: string;"),s.push(" updatedAt: string;"),r+=`export interface ${o} {
|
|
149
149
|
${s.join(`
|
|
150
150
|
`)}
|
|
151
151
|
}
|
|
@@ -189,38 +189,32 @@ export function createKyroClient(opts: KyroClientOptions) {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
return {
|
|
192
|
-
${e.map(t=>{let
|
|
192
|
+
${e.map(t=>{let o=C(t.slug);return ` ${N(t.slug)}: {
|
|
193
193
|
find: (args?: { where?: Record<string, any>; sort?: string; limit?: number; page?: number; draft?: boolean }) =>
|
|
194
|
-
request<{ docs: ${
|
|
194
|
+
request<{ docs: ${o}[]; totalDocs: number; page: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean }>(\`/${t.slug}\${args ? "?" + qs(args) : ""}\`),
|
|
195
195
|
findByID: (id: string, args?: { draft?: boolean }) =>
|
|
196
|
-
request<${
|
|
196
|
+
request<${o}>(\`/${t.slug}/\${id}\${args ? "?" + qs(args) : ""}\`),
|
|
197
197
|
findBySlug: (slug: string, args?: { draft?: boolean }) =>
|
|
198
|
-
request<{ docs: ${
|
|
199
|
-
create: (data: Partial<${
|
|
200
|
-
request<{ doc: ${
|
|
201
|
-
update: (id: string, data: Partial<${
|
|
202
|
-
request<{ doc: ${
|
|
198
|
+
request<{ docs: ${o}[] }>(\`/${t.slug}?where=\${encodeURIComponent(JSON.stringify({ slug: { equals: slug } }))}\`),
|
|
199
|
+
create: (data: Partial<${o}>) =>
|
|
200
|
+
request<{ doc: ${o}; message?: string }>(\`/${t.slug}\`, { method: "POST", body: JSON.stringify(data) }),
|
|
201
|
+
update: (id: string, data: Partial<${o}>, args?: { baseUpdatedAt?: string }) =>
|
|
202
|
+
request<{ doc: ${o}; message?: string }>(\`/${t.slug}/\${id}\`, { method: "PATCH", body: JSON.stringify({ ...data, ...args }) }),
|
|
203
203
|
delete: (id: string) =>
|
|
204
|
-
request<{ doc: ${
|
|
204
|
+
request<{ doc: ${o}; message: string }>(\`/${t.slug}/\${id}\`, { method: "DELETE" }),
|
|
205
205
|
count: (args?: { where?: Record<string, any> }) =>
|
|
206
206
|
request<{ totalDocs: number }>(\`/${t.slug}/count\${args ? "?" + qs(args) : ""}\`),
|
|
207
207
|
},`}).join(`
|
|
208
208
|
`)}
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
|
-
`,r}function
|
|
212
|
-
`));let t=
|
|
213
|
-
|
|
214
|
-
\
|
|
215
|
-
\
|
|
216
|
-
\
|
|
217
|
-
\
|
|
218
|
-
\u250C\u2500 `)+o__default.default.bold("Initial Super Admin Password")),console.log(o__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),p=(await i.question(o__default.default.magenta(" \u203A ")+o__default.default.dim("(default: auto-generate secure password): "))).trim()||n),i.close();}c=c||`kyro-app-${t}`,d=d||`kyro-media-${t}`,l=l||"admin@kyro-cms.com",p=p||n,s=s||"d1",console.log(o__default.default.cyan(`
|
|
219
|
-
\u2699\uFE0F Configuration Summary:`)),console.log(` \u2022 Target Hosting: ${o__default.default.bold("Cloudflare Workers with Assets")}`),console.log(` \u2022 Database Mode : ${o__default.default.bold(s)}`),console.log(` \u2022 Project Name : ${o__default.default.bold(c)}`),console.log(` \u2022 R2 Bucket Name: ${o__default.default.bold(d)}`),console.log(` \u2022 Admin Email : ${o__default.default.bold(l)}`);let S=x__default.default.existsSync(___default.default.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",y=`${S} dlx wrangler`;console.log(`
|
|
220
|
-
\u{1F50D} Checking Cloudflare Wrangler authentication...`);try{child_process.execSync(`${y} whoami`,{stdio:"ignore"}),console.log(o__default.default.green("\u2705 Cloudflare Wrangler Authenticated."));}catch{console.log(o__default.default.red("\u274C Cloudflare Wrangler authentication required.")),console.log(` Run ${o__default.default.bold(`${y} login`)} or set the ${o__default.default.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let w="",h="";if(s==="postgres"){a||(console.log(o__default.default.red("\u274C postgres mode requires a database URL.")),process.exit(1)),console.log(`
|
|
221
|
-
\u26A1 Provisioning Cloudflare Hyperdrive (${m})...`);try{let i=child_process.execSync(`${y} hyperdrive list --json`,{stdio:"pipe"}).toString(),b=JSON.parse(i.slice(i.indexOf("["))).find(D=>D.name===m);b&&(h=b.id||b.uuid);}catch{}if(!h)try{let i=child_process.execSync(`${y} hyperdrive create "${m}" --connection-string="${a}" --json`,{stdio:"pipe"}).toString(),u=JSON.parse(i.slice(i.indexOf("{")));h=u.id||u.uuid;}catch{}console.log(o__default.default.green(`\u2705 Hyperdrive Provisioned (ID: ${h||"auto"})`));}else {let i=`${c}-d1`;console.log(`
|
|
222
|
-
\u{1F5C2}\uFE0F Selecting or creating D1 database (${i})...`);try{let b=child_process.execSync(`${y} d1 create "${i}"`,{stdio:"pipe"}).toString().match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);b&&(w=b[1]);}catch{try{let b=child_process.execSync(`${y} d1 list --json`,{stdio:"pipe"}).toString(),k=JSON.parse(b).find(z=>z.name===i);k&&(w=k.id||k.uuid);}catch{}}console.log(o__default.default.green(`\u2705 Using D1 database: ${i} (ID: ${w})`));}console.log(`
|
|
223
|
-
\u{1F5C4}\uFE0F Provisioning R2 Bucket '${d}'...`);try{child_process.execSync(`${y} r2 bucket create "${d}"`,{stdio:"ignore"});}catch{console.log(`\u2139\uFE0F Bucket '${d}' already exists.`);}try{child_process.execSync(`echo "y" | ${y} r2 bucket dev-url enable "${d}"`,{stdio:"ignore"});}catch{}console.log(`
|
|
211
|
+
`,r}function K(){return new commander.Command("generate").description("Generate TypeScript types from collection configs").option("-c, --config <path>","Path to config file or directory","./src/kyro").option("-o, --output <path>","Output file path","./src/types/kyro.d.ts").option("-w, --watch","Watch for changes and regenerate").option("--url <url>","URL of a running Kyro CMS instance (enables remote mode)").option("--api-key <key>","API key for authentication (required with --url)").action(async r=>{if(r.url){r.url||(console.error("\u274C --url is required when using --api"),process.exit(1)),r.apiKey||(console.error("\u274C --api-key is required when using --api"),process.exit(1));let s=k.resolve(r.output);try{let a=await Y(r.url,r.apiKey),c=G(a),p=k.join(s,"..");R.existsSync(p)||R.mkdirSync(p,{recursive:!0}),R.writeFileSync(s,c);}catch(a){console.error("\u274C Error:",a.message),process.exit(1);}return}let t=k.resolve(r.config),o=k.resolve(r.output);try{let s=await glob.glob(`${t}/**/*.{ts,js}`);s.length===0&&(console.error("\u274C No config files found at:",t),process.exit(1));let a=[];for(let d of s)try{let m=await import(d),f=Object.values(m).filter(u=>u&&u.slug&&u.fields);a.push(...f);}catch{console.warn(`\u26A0\uFE0F Could not parse: ${d}`);}a.length===0&&(console.error("\u274C No valid collection configs found"),process.exit(1));let c=O(a),p=k.join(o,"..");if(R.existsSync(p)||R.mkdirSync(p,{recursive:!0}),R.writeFileSync(o,c),r.watch){let{watch:d}=await import('fs');d(t,{recursive:!0},async(m,f)=>{let u=[];for(let S of s)try{let y=await import(S+`?t=${Date.now()}`),w=Object.values(y).filter(h=>h&&h.slug&&h.fields);u.push(...w);}catch{}let A=O(u);R.writeFileSync(o,A);});}}catch(s){console.error("\u274C Error:",s.message),process.exit(1);}})}function V(e=3){return q__default.default.randomBytes(e).toString("hex")}function Z(){return q__default.default.randomBytes(12).toString("base64").replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}function F(){let e=new commander.Command("deploy").description("Deploy Kyro CMS");return e.command("cloudflare").description("Deploy to Cloudflare Workers with Assets").option("-d, --database <type>","Database type (d1|postgres)").option("-u, --database-url <url>","PostgreSQL connection string").option("-n, --name <name>","Cloudflare project name").option("-b, --r2-bucket <name>","R2 storage bucket name").option("-e, --email <email>","Initial Super Admin email").option("-p, --password <password>","Initial Super Admin password").option("-y, --non-interactive","Skip all prompts and use defaults").action(async r=>{console.log(n__default.default.cyan("==============================================================================")),console.log(n__default.default.bold("\u{1F680} Kyro CMS Cloudflare Deployment (Workers)")),console.log(n__default.default.cyan(`==============================================================================
|
|
212
|
+
`));let t=V(),o=Z(),{database:s,databaseUrl:a,name:c,r2Bucket:p,email:d,password:m,nonInteractive:f}=r,u=`kyro-postgres-hd-${t}`;if(a&&!s&&(s="postgres"),!f&&process.stdout.isTTY){console.log(n__default.default.yellow.bold("\u{1F4CB} Setup Configuration")),console.log(n__default.default.dim("Answer the prompts below to configure your deployment.\\n"));let i=[];s||i.push({type:"select",name:"database",message:n__default.default.cyan("\u250C\u2500 ")+n__default.default.bold("Select Database Infrastructure")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A "),choices:[{title:"Native Cloudflare D1 (serverless SQLite, auto-provisioned)",value:"d1"},{title:"PostgreSQL (via Cloudflare Hyperdrive)",value:"postgres"}],initial:0}),s==="postgres"&&!a&&i.push({type:"text",name:"databaseUrl",message:n__default.default.cyan("\\n\u250C\u2500 ")+n__default.default.bold("PostgreSQL Connection URL")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A ")}),c||i.push({type:"text",name:"name",message:n__default.default.cyan("\\n\u250C\u2500 ")+n__default.default.bold("Cloudflare Project Name")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A ")+n__default.default.dim(`(default: kyro-app-${t})`),initial:`kyro-app-${t}`}),p||i.push({type:"text",name:"r2Bucket",message:n__default.default.cyan("\\n\u250C\u2500 ")+n__default.default.bold("Cloudflare R2 Bucket Name")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A ")+n__default.default.dim(`(default: kyro-media-${t})`),initial:`kyro-media-${t}`}),d||i.push({type:"text",name:"email",message:n__default.default.cyan("\\n\u250C\u2500 ")+n__default.default.bold("Initial Super Admin Email")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A ")+n__default.default.dim("(default: admin@kyro-cms.com)"),initial:"admin@kyro-cms.com"}),m||i.push({type:"text",name:"password",message:n__default.default.cyan("\\n\u250C\u2500 ")+n__default.default.bold("Initial Super Admin Password")+"\\n"+n__default.default.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n__default.default.magenta(" \u203A ")+n__default.default.dim("(default: auto-generate secure password)")});let l=await J__default.default(i);l.database&&(s=l.database),l.databaseUrl&&(a=l.databaseUrl),l.name&&(c=l.name),l.r2Bucket&&(p=l.r2Bucket),l.email&&(d=l.email),l.password&&(m=l.password);}c=c||`kyro-app-${t}`,p=p||`kyro-media-${t}`,d=d||"admin@kyro-cms.com",m=m||o,s=s||"d1",console.log(n__default.default.cyan(`
|
|
213
|
+
\u2699\uFE0F Configuration Summary:`)),console.log(` \u2022 Target Hosting: ${n__default.default.bold("Cloudflare Workers with Assets")}`),console.log(` \u2022 Database Mode : ${n__default.default.bold(s)}`),console.log(` \u2022 Project Name : ${n__default.default.bold(c)}`),console.log(` \u2022 R2 Bucket Name: ${n__default.default.bold(p)}`),console.log(` \u2022 Admin Email : ${n__default.default.bold(d)}`);let S=R__default.default.existsSync(k__default.default.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",y=`${S} dlx wrangler`;console.log(`
|
|
214
|
+
\u{1F50D} Checking Cloudflare Wrangler authentication...`);try{child_process.execSync(`${y} whoami`,{stdio:"ignore"}),console.log(n__default.default.green("\u2705 Cloudflare Wrangler Authenticated."));}catch{console.log(n__default.default.red("\u274C Cloudflare Wrangler authentication required.")),console.log(` Run ${n__default.default.bold(`${y} login`)} or set the ${n__default.default.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let w="",h="";if(s==="postgres"){a||(console.log(n__default.default.red("\u274C postgres mode requires a database URL.")),process.exit(1)),console.log(`
|
|
215
|
+
\u26A1 Provisioning Cloudflare Hyperdrive (${u})...`);try{let i=child_process.execSync(`${y} hyperdrive list --json`,{stdio:"pipe"}).toString(),b=JSON.parse(i.slice(i.indexOf("["))).find(D=>D.name===u);b&&(h=b.id||b.uuid);}catch{}if(!h)try{let i=child_process.execSync(`${y} hyperdrive create "${u}" --connection-string="${a}" --json`,{stdio:"pipe"}).toString(),l=JSON.parse(i.slice(i.indexOf("{")));h=l.id||l.uuid;}catch{}console.log(n__default.default.green(`\u2705 Hyperdrive Provisioned (ID: ${h||"auto"})`));}else {let i=`${c}-d1`;console.log(`
|
|
216
|
+
\u{1F5C2}\uFE0F Selecting or creating D1 database (${i})...`);try{let b=child_process.execSync(`${y} d1 create "${i}"`,{stdio:"pipe"}).toString().match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);b&&(w=b[1]);}catch{try{let b=child_process.execSync(`${y} d1 list --json`,{stdio:"pipe"}).toString(),_=JSON.parse(b).find(W=>W.name===i);_&&(w=_.id||_.uuid);}catch{}}console.log(n__default.default.green(`\u2705 Using D1 database: ${i} (ID: ${w})`));}console.log(`
|
|
217
|
+
\u{1F5C4}\uFE0F Provisioning R2 Bucket '${p}'...`);try{child_process.execSync(`${y} r2 bucket create "${p}"`,{stdio:"ignore"});}catch{console.log(`\u2139\uFE0F Bucket '${p}' already exists.`);}try{child_process.execSync(`echo "y" | ${y} r2 bucket dev-url enable "${p}"`,{stdio:"ignore"});}catch{}console.log(`
|
|
224
218
|
\u2699\uFE0F Generating wrangler.toml...`);let E=`name = "${c}"
|
|
225
219
|
compatibility_date = "2026-01-01"
|
|
226
220
|
compatibility_flags = ["nodejs_compat"]
|
|
@@ -236,9 +230,9 @@ database_id = "${w}"
|
|
|
236
230
|
`,E+=`
|
|
237
231
|
[[r2_buckets]]
|
|
238
232
|
binding = "STORAGE_BUCKET"
|
|
239
|
-
bucket_name = "${
|
|
240
|
-
`,
|
|
241
|
-
\u{1F5C3}\uFE0F Running schema migrations & seeding super admin...`);let
|
|
233
|
+
bucket_name = "${p}"
|
|
234
|
+
`,R__default.default.writeFileSync(k__default.default.join(process.cwd(),"wrangler.toml"),E,"utf8"),console.log(`
|
|
235
|
+
\u{1F5C3}\uFE0F Running schema migrations & seeding super admin...`);let B=`import bcrypt from 'bcryptjs'; console.log(bcrypt.hashSync('${m}', 10));`,I="";try{I=child_process.execSync(`node -e "${B}"`,{stdio:"pipe"}).toString().trim();}catch{}if(s==="postgres"){try{child_process.execSync(`DATABASE_URL="${a}" npx drizzle-kit push --force`,{stdio:"ignore"});}catch{}let i=`
|
|
242
236
|
import postgres from 'postgres';
|
|
243
237
|
import bcrypt from 'bcryptjs';
|
|
244
238
|
const sql = postgres(process.env.DATABASE_URL || '${a}');
|
|
@@ -246,10 +240,10 @@ bucket_name = "${d}"
|
|
|
246
240
|
try {
|
|
247
241
|
await sql\`CREATE TABLE IF NOT EXISTS users (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) NOT NULL, password_hash VARCHAR(255), role VARCHAR(50) DEFAULT 'customer', email_verified BOOLEAN DEFAULT true, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW())\`;
|
|
248
242
|
await sql\`CREATE UNIQUE INDEX IF NOT EXISTS users_email_idx ON users (email)\`;
|
|
249
|
-
const existing = await sql\`SELECT id FROM users WHERE email = '${
|
|
243
|
+
const existing = await sql\`SELECT id FROM users WHERE email = '${d}'\`;
|
|
250
244
|
if (existing.length === 0) {
|
|
251
|
-
const hash = bcrypt.hashSync('${
|
|
252
|
-
await sql\`INSERT INTO users (email, password_hash, role, email_verified) VALUES ('${
|
|
245
|
+
const hash = bcrypt.hashSync('${m}', 10);
|
|
246
|
+
await sql\`INSERT INTO users (email, password_hash, role, email_verified) VALUES ('${d}', \\\${hash}, 'super_admin', true)\`;
|
|
253
247
|
console.log(' \u2705 PostgreSQL Super Admin Configured');
|
|
254
248
|
}
|
|
255
249
|
} catch (e) {
|
|
@@ -283,13 +277,13 @@ bucket_name = "${d}"
|
|
|
283
277
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
284
278
|
);
|
|
285
279
|
INSERT OR IGNORE INTO users (id, email, password_hash, role, email_verified)
|
|
286
|
-
VALUES ('admin-super-1', '${
|
|
287
|
-
`;try{child_process.execSync(`${y} d1 execute "${c}-d1" --remote --command="${i.replace(/\n/g," ")}"`,{stdio:"ignore"}),console.log(
|
|
288
|
-
\u{1F6E0}\uFE0F Building for Cloudflare...`);try{child_process.execSync(`${S} run build`,{stdio:"inherit"});}catch{console.log(
|
|
280
|
+
VALUES ('admin-super-1', '${d}', '${I}', 'super_admin', 1);
|
|
281
|
+
`;try{child_process.execSync(`${y} d1 execute "${c}-d1" --remote --command="${i.replace(/\n/g," ")}"`,{stdio:"ignore"}),console.log(n__default.default.green(" \u2705 D1 Schema Migrated & Super Admin Configured."));}catch{}}console.log(`
|
|
282
|
+
\u{1F6E0}\uFE0F Building for Cloudflare...`);try{child_process.execSync(`${S} run build`,{stdio:"inherit"});}catch{console.log(n__default.default.red(`
|
|
289
283
|
\u274C Build Failed. Check the output above.`)),process.exit(1);}console.log(`
|
|
290
|
-
\u2601\uFE0F Deploying to Cloudflare Workers...`),
|
|
291
|
-
==============================================================================`)),console.log(
|
|
292
|
-
Super Admin Credentials:`),console.log(` \u2022 Email : ${
|
|
284
|
+
\u2601\uFE0F Deploying to Cloudflare Workers...`),R__default.default.existsSync(k__default.default.join(process.cwd(),".wrangler"))&&R__default.default.rmSync(k__default.default.join(process.cwd(),".wrangler"),{recursive:true,force:true});try{child_process.execSync(`${y} deploy`,{stdio:"inherit"}),console.log(n__default.default.cyan(`
|
|
285
|
+
==============================================================================`)),console.log(n__default.default.green.bold("\u{1F389} Kyro CMS Deployment Successful!")),console.log(n__default.default.cyan("==============================================================================")),console.log(`
|
|
286
|
+
Super Admin Credentials:`),console.log(` \u2022 Email : ${n__default.default.bold(d)}`),console.log(` \u2022 Password: ${n__default.default.bold(m)}`),console.log(`
|
|
293
287
|
Save these credentials! This is the only time the password is displayed.
|
|
294
|
-
`);}catch{console.log(
|
|
295
|
-
==============================================================================`)),console.log(
|
|
288
|
+
`);}catch{console.log(n__default.default.cyan(`
|
|
289
|
+
==============================================================================`)),console.log(n__default.default.red.bold("\u274C Kyro CMS Cloudflare Deployment Failed!")),console.log(n__default.default.cyan("==============================================================================")),console.log("Inspect the Wrangler output above for error details."),process.exit(1);}}),e}var se=url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))),ae=k.dirname(se),j="0.1.0";try{j=JSON.parse(R.readFileSync(k.join(ae,"../../package.json"),"utf-8")).version;}catch{}var T=new commander.Command;T.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(j);T.command("dev").description("Start Kyro CMS development server").option("-p, --port <port>","Port to run on","4321").option("-h, --host <host>","Host to bind to","localhost").action(async e=>{let{exec:r}=await import('child_process'),t=r(`astro dev --port ${e.port} --host ${e.host}`,{env:{...process.env,NODE_NO_WARNINGS:"1"}});t.stdout?.on("data",o=>process.stdout.write(o)),t.stderr?.on("data",o=>process.stderr.write(o)),process.on("SIGINT",()=>{t.kill("SIGINT"),process.exit(0);}),process.on("SIGTERM",()=>{t.kill("SIGTERM"),process.exit(0);});});T.addCommand(K());T.addCommand(F());var $=T.command("db").description("Database management commands");$.command("generate").description("Generate migrations from schema").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit generate",(r,t,o)=>{r&&(console.error("\u274C Generation failed:",r.message),process.exit(1));});});$.command("migrate").description("Run database migrations").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit migrate",(r,t,o)=>{r&&(console.error("\u274C Migration failed:",r.message),process.exit(1));});});$.command("push").description("Push schema to database (development)").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit push",(r,t,o)=>{r&&(console.error("\u274C Push failed:",r.message),process.exit(1));});});$.command("seed").description("Seed database with initial data").action(async()=>{let{exec:e}=await import('child_process');e("npx tsx src/database/drizzle/seed.ts",(r,t,o)=>{r&&(console.error("\u274C Seeding failed:",r.message),process.exit(1));});});$.command("studio").description("Open Drizzle Studio").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit studio",(r,t,o)=>{r&&(console.error("\u274C Studio failed:",r.message),process.exit(1));});});var ie=T.command("auth").description("Authentication management commands");ie.command("bootstrap").description("Create initial admin user").option("-e, --email <email>","Admin email",process.env.KYRO_ADMIN_EMAIL).option("-p, --password <password>","Admin password",process.env.KYRO_ADMIN_PASSWORD).option("-r, --role <role>","Admin role",process.env.KYRO_ADMIN_ROLE||"admin").action(async e=>{(!e.email||!e.password)&&(console.error("\u274C Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options."),process.exit(1));try{let{bootstrapAdmin:r}=await import('../bootstrap-BGO2NFKB.cjs'),t=process.env.DATABASE_URL||"",o=t.toLowerCase().startsWith("postgres://")||t.toLowerCase().startsWith("postgresql://"),s=t.toLowerCase().startsWith("mongodb://")||t.toLowerCase().startsWith("mongodb+srv://"),a=!t||t.includes(".db")||t.includes("sqlite")||t.includes("file:"),c;if(o){let{PostgresAuthAdapter:d}=await import('../postgres-auth-adapter-JKDYYULH.cjs'),{drizzle:m}=await import('drizzle-orm/postgres-js'),{default:f}=await import('postgres'),u=f(t,{max:1,onnotice:()=>{}}),A=m(u);c=new d({db:A});}else if(s){let{MongoDBAuthAdapter:d}=await import('../mongo-auth-adapter-JVE5M3S4.cjs'),m=await import('mongodb'),f=new m.MongoClient(t);await f.connect();let u=f.db();c=new d({db:u});}else {let{SQLiteAuthAdapter:d}=await import('../sqlite-adapter-PLD57WOH.cjs'),m=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";c=new d({path:m});}c.connect&&await c.connect();let p=await r({authAdapter:c,adminEmail:e.email,adminPassword:e.password,adminRole:e.role});c.disconnect&&await c.disconnect(),p.success||(console.error("\u274C Failed to create admin:",p.error),process.exit(1));}catch(r){console.error("\u274C Bootstrap failed:",r),process.exit(1);}});T.command("health").description("Check system health").action(async()=>{let e=process.env.DATABASE_URL||"",r=e.toLowerCase().startsWith("postgres://")||e.toLowerCase().startsWith("postgresql://"),t=e.toLowerCase().startsWith("mongodb://")||e.toLowerCase().startsWith("mongodb+srv://"),o=!e||e.includes(".db")||e.includes("sqlite")||e.includes("file:");if(r)try{let{default:s}=await import('postgres'),a=s(e,{max:1,onnotice:()=>{}});await a.unsafe("SELECT 1"),await a.end();}catch{}else if(t)try{let s=await import('mongodb'),a=new s.MongoClient(e);await a.connect(),await a.db().admin().ping(),await a.close();}catch{}else if(o)try{let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",{existsSync:a}=await import('fs');a(s);}catch{}});T.parse();process.argv.slice(2).length||T.outputHelp();
|
package/dist/cli/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import'../chunk-5J6HXUF6.js';import {Command}from'commander';import
|
|
3
|
-
${e.fields.filter(
|
|
2
|
+
import'../chunk-5J6HXUF6.js';import {Command}from'commander';import R,{readFileSync,existsSync,mkdirSync,writeFileSync}from'fs';import k,{dirname,join,resolve}from'path';import {fileURLToPath}from'url';import {glob}from'glob';import {execSync}from'child_process';import J from'prompts';import q from'crypto';import n from'chalk';function x(e){switch(e.type){case "text":case "email":case "password":case "textarea":case "color":case "code":case "markdown":case "date":case "richtext":case "json":return e.hasMany?"string[]":"string";case "number":return e.hasMany?"number[]":"number";case "checkbox":return "boolean";case "select":case "radio":if(e.options){let t=e.options.map(o=>`'${o.value}'`).join(" | ");return e.hasMany?`(${t})[]`:t}return e.hasMany?"string[]":"string";case "relationship":if(Array.isArray(e.relationTo)){if(e.relationTo.includes("*"))return e.hasMany?"any[]":"any";let t=e.relationTo.map(o=>`${C(o)} | string`).join(" | ");return e.hasMany?`(${t})[]`:`(${t})`}let r=e.relationTo||"unknown";return r==="*"?e.hasMany?"any[]":"any":e.hasMany?`(${C(r)} | string)[]`:`${C(r)} | string`;case "upload":return e.hasMany?"(Media | string)[]":"Media | string";case "array":return e.fields&&e.fields.length>0?`Array<{
|
|
3
|
+
${e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`}).join(`
|
|
4
4
|
`)}
|
|
5
5
|
}>`:"Record<string, any>[]";case "group":return e.fields&&e.fields.length>0?`{
|
|
6
|
-
${e.fields.filter(
|
|
6
|
+
${e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`}).join(`
|
|
7
7
|
`)}
|
|
8
|
-
}`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function C(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function N(e){return e.replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function
|
|
8
|
+
}`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function C(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function N(e){return e.replace(/-([a-z])/g,(r,t)=>t.toUpperCase())}function H(e){let r=C(e.slug),t=e.fields.filter(o=>o.name).map(o=>{let s=x(o);return ` ${o.name}${o.required?"":"?"}: ${s};`});return t.unshift(" id: string;"),t.push(" createdAt: string;"),t.push(" updatedAt: string;"),`export interface ${r} {
|
|
9
9
|
${t.join(`
|
|
10
10
|
`)}
|
|
11
|
-
}`}function
|
|
11
|
+
}`}function O(e){let r=e.map(a=>H(a)),t=`// ============================================================================
|
|
12
12
|
// Auto-generated by kyro generate
|
|
13
13
|
// ============================================================================
|
|
14
14
|
|
|
@@ -31,7 +31,7 @@ export interface Block {
|
|
|
31
31
|
[key: string]: any;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
`,
|
|
34
|
+
`,o=r.join(`
|
|
35
35
|
|
|
36
36
|
`),s=`
|
|
37
37
|
|
|
@@ -122,7 +122,7 @@ export function createClient(config: { url: string; token?: string }): KyroClien
|
|
|
122
122
|
// Client implementation would be here
|
|
123
123
|
throw new Error('Not implemented');
|
|
124
124
|
}
|
|
125
|
-
`;return t+
|
|
125
|
+
`;return t+o+s}async function Y(e,r){let t=`${e.replace(/\/+$/,"")}/api/__schema`,o=await fetch(t,{headers:{Authorization:`ApiKey ${r}`}});if(!o.ok){let s=await o.text();throw new Error(`Schema fetch failed (${o.status}): ${s}`)}return o.json()}function G(e){let r=`// ============================================================================
|
|
126
126
|
// Auto-generated by kyro generate --api
|
|
127
127
|
// ============================================================================
|
|
128
128
|
|
|
@@ -145,7 +145,7 @@ export interface Block {
|
|
|
145
145
|
[key: string]: any;
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
`;for(let t of e){let
|
|
148
|
+
`;for(let t of e){let o=C(t.slug),s=t.fields.filter(a=>a.name).map(a=>{let c=x(a);return ` ${a.name}${a.required?"":"?"}: ${c};`});s.unshift(" id: string;"),s.push(" createdAt: string;"),s.push(" updatedAt: string;"),r+=`export interface ${o} {
|
|
149
149
|
${s.join(`
|
|
150
150
|
`)}
|
|
151
151
|
}
|
|
@@ -189,38 +189,32 @@ export function createKyroClient(opts: KyroClientOptions) {
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
return {
|
|
192
|
-
${e.map(t=>{let
|
|
192
|
+
${e.map(t=>{let o=C(t.slug);return ` ${N(t.slug)}: {
|
|
193
193
|
find: (args?: { where?: Record<string, any>; sort?: string; limit?: number; page?: number; draft?: boolean }) =>
|
|
194
|
-
request<{ docs: ${
|
|
194
|
+
request<{ docs: ${o}[]; totalDocs: number; page: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean }>(\`/${t.slug}\${args ? "?" + qs(args) : ""}\`),
|
|
195
195
|
findByID: (id: string, args?: { draft?: boolean }) =>
|
|
196
|
-
request<${
|
|
196
|
+
request<${o}>(\`/${t.slug}/\${id}\${args ? "?" + qs(args) : ""}\`),
|
|
197
197
|
findBySlug: (slug: string, args?: { draft?: boolean }) =>
|
|
198
|
-
request<{ docs: ${
|
|
199
|
-
create: (data: Partial<${
|
|
200
|
-
request<{ doc: ${
|
|
201
|
-
update: (id: string, data: Partial<${
|
|
202
|
-
request<{ doc: ${
|
|
198
|
+
request<{ docs: ${o}[] }>(\`/${t.slug}?where=\${encodeURIComponent(JSON.stringify({ slug: { equals: slug } }))}\`),
|
|
199
|
+
create: (data: Partial<${o}>) =>
|
|
200
|
+
request<{ doc: ${o}; message?: string }>(\`/${t.slug}\`, { method: "POST", body: JSON.stringify(data) }),
|
|
201
|
+
update: (id: string, data: Partial<${o}>, args?: { baseUpdatedAt?: string }) =>
|
|
202
|
+
request<{ doc: ${o}; message?: string }>(\`/${t.slug}/\${id}\`, { method: "PATCH", body: JSON.stringify({ ...data, ...args }) }),
|
|
203
203
|
delete: (id: string) =>
|
|
204
|
-
request<{ doc: ${
|
|
204
|
+
request<{ doc: ${o}; message: string }>(\`/${t.slug}/\${id}\`, { method: "DELETE" }),
|
|
205
205
|
count: (args?: { where?: Record<string, any> }) =>
|
|
206
206
|
request<{ totalDocs: number }>(\`/${t.slug}/count\${args ? "?" + qs(args) : ""}\`),
|
|
207
207
|
},`}).join(`
|
|
208
208
|
`)}
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
|
-
`,r}function
|
|
212
|
-
`));let t=
|
|
213
|
-
|
|
214
|
-
\
|
|
215
|
-
\
|
|
216
|
-
\
|
|
217
|
-
\
|
|
218
|
-
\u250C\u2500 `)+o.bold("Initial Super Admin Password")),console.log(o.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),p=(await i.question(o.magenta(" \u203A ")+o.dim("(default: auto-generate secure password): "))).trim()||n),i.close();}c=c||`kyro-app-${t}`,d=d||`kyro-media-${t}`,l=l||"admin@kyro-cms.com",p=p||n,s=s||"d1",console.log(o.cyan(`
|
|
219
|
-
\u2699\uFE0F Configuration Summary:`)),console.log(` \u2022 Target Hosting: ${o.bold("Cloudflare Workers with Assets")}`),console.log(` \u2022 Database Mode : ${o.bold(s)}`),console.log(` \u2022 Project Name : ${o.bold(c)}`),console.log(` \u2022 R2 Bucket Name: ${o.bold(d)}`),console.log(` \u2022 Admin Email : ${o.bold(l)}`);let S=x.existsSync(_.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",y=`${S} dlx wrangler`;console.log(`
|
|
220
|
-
\u{1F50D} Checking Cloudflare Wrangler authentication...`);try{execSync(`${y} whoami`,{stdio:"ignore"}),console.log(o.green("\u2705 Cloudflare Wrangler Authenticated."));}catch{console.log(o.red("\u274C Cloudflare Wrangler authentication required.")),console.log(` Run ${o.bold(`${y} login`)} or set the ${o.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let w="",h="";if(s==="postgres"){a||(console.log(o.red("\u274C postgres mode requires a database URL.")),process.exit(1)),console.log(`
|
|
221
|
-
\u26A1 Provisioning Cloudflare Hyperdrive (${m})...`);try{let i=execSync(`${y} hyperdrive list --json`,{stdio:"pipe"}).toString(),b=JSON.parse(i.slice(i.indexOf("["))).find(D=>D.name===m);b&&(h=b.id||b.uuid);}catch{}if(!h)try{let i=execSync(`${y} hyperdrive create "${m}" --connection-string="${a}" --json`,{stdio:"pipe"}).toString(),u=JSON.parse(i.slice(i.indexOf("{")));h=u.id||u.uuid;}catch{}console.log(o.green(`\u2705 Hyperdrive Provisioned (ID: ${h||"auto"})`));}else {let i=`${c}-d1`;console.log(`
|
|
222
|
-
\u{1F5C2}\uFE0F Selecting or creating D1 database (${i})...`);try{let b=execSync(`${y} d1 create "${i}"`,{stdio:"pipe"}).toString().match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);b&&(w=b[1]);}catch{try{let b=execSync(`${y} d1 list --json`,{stdio:"pipe"}).toString(),k=JSON.parse(b).find(z=>z.name===i);k&&(w=k.id||k.uuid);}catch{}}console.log(o.green(`\u2705 Using D1 database: ${i} (ID: ${w})`));}console.log(`
|
|
223
|
-
\u{1F5C4}\uFE0F Provisioning R2 Bucket '${d}'...`);try{execSync(`${y} r2 bucket create "${d}"`,{stdio:"ignore"});}catch{console.log(`\u2139\uFE0F Bucket '${d}' already exists.`);}try{execSync(`echo "y" | ${y} r2 bucket dev-url enable "${d}"`,{stdio:"ignore"});}catch{}console.log(`
|
|
211
|
+
`,r}function K(){return new Command("generate").description("Generate TypeScript types from collection configs").option("-c, --config <path>","Path to config file or directory","./src/kyro").option("-o, --output <path>","Output file path","./src/types/kyro.d.ts").option("-w, --watch","Watch for changes and regenerate").option("--url <url>","URL of a running Kyro CMS instance (enables remote mode)").option("--api-key <key>","API key for authentication (required with --url)").action(async r=>{if(r.url){r.url||(console.error("\u274C --url is required when using --api"),process.exit(1)),r.apiKey||(console.error("\u274C --api-key is required when using --api"),process.exit(1));let s=resolve(r.output);try{let a=await Y(r.url,r.apiKey),c=G(a),p=join(s,"..");existsSync(p)||mkdirSync(p,{recursive:!0}),writeFileSync(s,c);}catch(a){console.error("\u274C Error:",a.message),process.exit(1);}return}let t=resolve(r.config),o=resolve(r.output);try{let s=await glob(`${t}/**/*.{ts,js}`);s.length===0&&(console.error("\u274C No config files found at:",t),process.exit(1));let a=[];for(let d of s)try{let m=await import(d),f=Object.values(m).filter(u=>u&&u.slug&&u.fields);a.push(...f);}catch{console.warn(`\u26A0\uFE0F Could not parse: ${d}`);}a.length===0&&(console.error("\u274C No valid collection configs found"),process.exit(1));let c=O(a),p=join(o,"..");if(existsSync(p)||mkdirSync(p,{recursive:!0}),writeFileSync(o,c),r.watch){let{watch:d}=await import('fs');d(t,{recursive:!0},async(m,f)=>{let u=[];for(let S of s)try{let y=await import(S+`?t=${Date.now()}`),w=Object.values(y).filter(h=>h&&h.slug&&h.fields);u.push(...w);}catch{}let A=O(u);writeFileSync(o,A);});}}catch(s){console.error("\u274C Error:",s.message),process.exit(1);}})}function V(e=3){return q.randomBytes(e).toString("hex")}function Z(){return q.randomBytes(12).toString("base64").replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}function F(){let e=new Command("deploy").description("Deploy Kyro CMS");return e.command("cloudflare").description("Deploy to Cloudflare Workers with Assets").option("-d, --database <type>","Database type (d1|postgres)").option("-u, --database-url <url>","PostgreSQL connection string").option("-n, --name <name>","Cloudflare project name").option("-b, --r2-bucket <name>","R2 storage bucket name").option("-e, --email <email>","Initial Super Admin email").option("-p, --password <password>","Initial Super Admin password").option("-y, --non-interactive","Skip all prompts and use defaults").action(async r=>{console.log(n.cyan("==============================================================================")),console.log(n.bold("\u{1F680} Kyro CMS Cloudflare Deployment (Workers)")),console.log(n.cyan(`==============================================================================
|
|
212
|
+
`));let t=V(),o=Z(),{database:s,databaseUrl:a,name:c,r2Bucket:p,email:d,password:m,nonInteractive:f}=r,u=`kyro-postgres-hd-${t}`;if(a&&!s&&(s="postgres"),!f&&process.stdout.isTTY){console.log(n.yellow.bold("\u{1F4CB} Setup Configuration")),console.log(n.dim("Answer the prompts below to configure your deployment.\\n"));let i=[];s||i.push({type:"select",name:"database",message:n.cyan("\u250C\u2500 ")+n.bold("Select Database Infrastructure")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A "),choices:[{title:"Native Cloudflare D1 (serverless SQLite, auto-provisioned)",value:"d1"},{title:"PostgreSQL (via Cloudflare Hyperdrive)",value:"postgres"}],initial:0}),s==="postgres"&&!a&&i.push({type:"text",name:"databaseUrl",message:n.cyan("\\n\u250C\u2500 ")+n.bold("PostgreSQL Connection URL")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A ")}),c||i.push({type:"text",name:"name",message:n.cyan("\\n\u250C\u2500 ")+n.bold("Cloudflare Project Name")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A ")+n.dim(`(default: kyro-app-${t})`),initial:`kyro-app-${t}`}),p||i.push({type:"text",name:"r2Bucket",message:n.cyan("\\n\u250C\u2500 ")+n.bold("Cloudflare R2 Bucket Name")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A ")+n.dim(`(default: kyro-media-${t})`),initial:`kyro-media-${t}`}),d||i.push({type:"text",name:"email",message:n.cyan("\\n\u250C\u2500 ")+n.bold("Initial Super Admin Email")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A ")+n.dim("(default: admin@kyro-cms.com)"),initial:"admin@kyro-cms.com"}),m||i.push({type:"text",name:"password",message:n.cyan("\\n\u250C\u2500 ")+n.bold("Initial Super Admin Password")+"\\n"+n.cyan("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")+"\\n"+n.magenta(" \u203A ")+n.dim("(default: auto-generate secure password)")});let l=await J(i);l.database&&(s=l.database),l.databaseUrl&&(a=l.databaseUrl),l.name&&(c=l.name),l.r2Bucket&&(p=l.r2Bucket),l.email&&(d=l.email),l.password&&(m=l.password);}c=c||`kyro-app-${t}`,p=p||`kyro-media-${t}`,d=d||"admin@kyro-cms.com",m=m||o,s=s||"d1",console.log(n.cyan(`
|
|
213
|
+
\u2699\uFE0F Configuration Summary:`)),console.log(` \u2022 Target Hosting: ${n.bold("Cloudflare Workers with Assets")}`),console.log(` \u2022 Database Mode : ${n.bold(s)}`),console.log(` \u2022 Project Name : ${n.bold(c)}`),console.log(` \u2022 R2 Bucket Name: ${n.bold(p)}`),console.log(` \u2022 Admin Email : ${n.bold(d)}`);let S=R.existsSync(k.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",y=`${S} dlx wrangler`;console.log(`
|
|
214
|
+
\u{1F50D} Checking Cloudflare Wrangler authentication...`);try{execSync(`${y} whoami`,{stdio:"ignore"}),console.log(n.green("\u2705 Cloudflare Wrangler Authenticated."));}catch{console.log(n.red("\u274C Cloudflare Wrangler authentication required.")),console.log(` Run ${n.bold(`${y} login`)} or set the ${n.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let w="",h="";if(s==="postgres"){a||(console.log(n.red("\u274C postgres mode requires a database URL.")),process.exit(1)),console.log(`
|
|
215
|
+
\u26A1 Provisioning Cloudflare Hyperdrive (${u})...`);try{let i=execSync(`${y} hyperdrive list --json`,{stdio:"pipe"}).toString(),b=JSON.parse(i.slice(i.indexOf("["))).find(D=>D.name===u);b&&(h=b.id||b.uuid);}catch{}if(!h)try{let i=execSync(`${y} hyperdrive create "${u}" --connection-string="${a}" --json`,{stdio:"pipe"}).toString(),l=JSON.parse(i.slice(i.indexOf("{")));h=l.id||l.uuid;}catch{}console.log(n.green(`\u2705 Hyperdrive Provisioned (ID: ${h||"auto"})`));}else {let i=`${c}-d1`;console.log(`
|
|
216
|
+
\u{1F5C2}\uFE0F Selecting or creating D1 database (${i})...`);try{let b=execSync(`${y} d1 create "${i}"`,{stdio:"pipe"}).toString().match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);b&&(w=b[1]);}catch{try{let b=execSync(`${y} d1 list --json`,{stdio:"pipe"}).toString(),_=JSON.parse(b).find(W=>W.name===i);_&&(w=_.id||_.uuid);}catch{}}console.log(n.green(`\u2705 Using D1 database: ${i} (ID: ${w})`));}console.log(`
|
|
217
|
+
\u{1F5C4}\uFE0F Provisioning R2 Bucket '${p}'...`);try{execSync(`${y} r2 bucket create "${p}"`,{stdio:"ignore"});}catch{console.log(`\u2139\uFE0F Bucket '${p}' already exists.`);}try{execSync(`echo "y" | ${y} r2 bucket dev-url enable "${p}"`,{stdio:"ignore"});}catch{}console.log(`
|
|
224
218
|
\u2699\uFE0F Generating wrangler.toml...`);let E=`name = "${c}"
|
|
225
219
|
compatibility_date = "2026-01-01"
|
|
226
220
|
compatibility_flags = ["nodejs_compat"]
|
|
@@ -236,9 +230,9 @@ database_id = "${w}"
|
|
|
236
230
|
`,E+=`
|
|
237
231
|
[[r2_buckets]]
|
|
238
232
|
binding = "STORAGE_BUCKET"
|
|
239
|
-
bucket_name = "${
|
|
240
|
-
`,
|
|
241
|
-
\u{1F5C3}\uFE0F Running schema migrations & seeding super admin...`);let
|
|
233
|
+
bucket_name = "${p}"
|
|
234
|
+
`,R.writeFileSync(k.join(process.cwd(),"wrangler.toml"),E,"utf8"),console.log(`
|
|
235
|
+
\u{1F5C3}\uFE0F Running schema migrations & seeding super admin...`);let B=`import bcrypt from 'bcryptjs'; console.log(bcrypt.hashSync('${m}', 10));`,I="";try{I=execSync(`node -e "${B}"`,{stdio:"pipe"}).toString().trim();}catch{}if(s==="postgres"){try{execSync(`DATABASE_URL="${a}" npx drizzle-kit push --force`,{stdio:"ignore"});}catch{}let i=`
|
|
242
236
|
import postgres from 'postgres';
|
|
243
237
|
import bcrypt from 'bcryptjs';
|
|
244
238
|
const sql = postgres(process.env.DATABASE_URL || '${a}');
|
|
@@ -246,10 +240,10 @@ bucket_name = "${d}"
|
|
|
246
240
|
try {
|
|
247
241
|
await sql\`CREATE TABLE IF NOT EXISTS users (id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) NOT NULL, password_hash VARCHAR(255), role VARCHAR(50) DEFAULT 'customer', email_verified BOOLEAN DEFAULT true, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW())\`;
|
|
248
242
|
await sql\`CREATE UNIQUE INDEX IF NOT EXISTS users_email_idx ON users (email)\`;
|
|
249
|
-
const existing = await sql\`SELECT id FROM users WHERE email = '${
|
|
243
|
+
const existing = await sql\`SELECT id FROM users WHERE email = '${d}'\`;
|
|
250
244
|
if (existing.length === 0) {
|
|
251
|
-
const hash = bcrypt.hashSync('${
|
|
252
|
-
await sql\`INSERT INTO users (email, password_hash, role, email_verified) VALUES ('${
|
|
245
|
+
const hash = bcrypt.hashSync('${m}', 10);
|
|
246
|
+
await sql\`INSERT INTO users (email, password_hash, role, email_verified) VALUES ('${d}', \\\${hash}, 'super_admin', true)\`;
|
|
253
247
|
console.log(' \u2705 PostgreSQL Super Admin Configured');
|
|
254
248
|
}
|
|
255
249
|
} catch (e) {
|
|
@@ -283,13 +277,13 @@ bucket_name = "${d}"
|
|
|
283
277
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
284
278
|
);
|
|
285
279
|
INSERT OR IGNORE INTO users (id, email, password_hash, role, email_verified)
|
|
286
|
-
VALUES ('admin-super-1', '${
|
|
287
|
-
`;try{execSync(`${y} d1 execute "${c}-d1" --remote --command="${i.replace(/\n/g," ")}"`,{stdio:"ignore"}),console.log(
|
|
288
|
-
\u{1F6E0}\uFE0F Building for Cloudflare...`);try{execSync(`${S} run build`,{stdio:"inherit"});}catch{console.log(
|
|
280
|
+
VALUES ('admin-super-1', '${d}', '${I}', 'super_admin', 1);
|
|
281
|
+
`;try{execSync(`${y} d1 execute "${c}-d1" --remote --command="${i.replace(/\n/g," ")}"`,{stdio:"ignore"}),console.log(n.green(" \u2705 D1 Schema Migrated & Super Admin Configured."));}catch{}}console.log(`
|
|
282
|
+
\u{1F6E0}\uFE0F Building for Cloudflare...`);try{execSync(`${S} run build`,{stdio:"inherit"});}catch{console.log(n.red(`
|
|
289
283
|
\u274C Build Failed. Check the output above.`)),process.exit(1);}console.log(`
|
|
290
|
-
\u2601\uFE0F Deploying to Cloudflare Workers...`),
|
|
291
|
-
==============================================================================`)),console.log(
|
|
292
|
-
Super Admin Credentials:`),console.log(` \u2022 Email : ${
|
|
284
|
+
\u2601\uFE0F Deploying to Cloudflare Workers...`),R.existsSync(k.join(process.cwd(),".wrangler"))&&R.rmSync(k.join(process.cwd(),".wrangler"),{recursive:true,force:true});try{execSync(`${y} deploy`,{stdio:"inherit"}),console.log(n.cyan(`
|
|
285
|
+
==============================================================================`)),console.log(n.green.bold("\u{1F389} Kyro CMS Deployment Successful!")),console.log(n.cyan("==============================================================================")),console.log(`
|
|
286
|
+
Super Admin Credentials:`),console.log(` \u2022 Email : ${n.bold(d)}`),console.log(` \u2022 Password: ${n.bold(m)}`),console.log(`
|
|
293
287
|
Save these credentials! This is the only time the password is displayed.
|
|
294
|
-
`);}catch{console.log(
|
|
295
|
-
==============================================================================`)),console.log(
|
|
288
|
+
`);}catch{console.log(n.cyan(`
|
|
289
|
+
==============================================================================`)),console.log(n.red.bold("\u274C Kyro CMS Cloudflare Deployment Failed!")),console.log(n.cyan("==============================================================================")),console.log("Inspect the Wrangler output above for error details."),process.exit(1);}}),e}var se=fileURLToPath(import.meta.url),ae=dirname(se),j="0.1.0";try{j=JSON.parse(readFileSync(join(ae,"../../package.json"),"utf-8")).version;}catch{}var T=new Command;T.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(j);T.command("dev").description("Start Kyro CMS development server").option("-p, --port <port>","Port to run on","4321").option("-h, --host <host>","Host to bind to","localhost").action(async e=>{let{exec:r}=await import('child_process'),t=r(`astro dev --port ${e.port} --host ${e.host}`,{env:{...process.env,NODE_NO_WARNINGS:"1"}});t.stdout?.on("data",o=>process.stdout.write(o)),t.stderr?.on("data",o=>process.stderr.write(o)),process.on("SIGINT",()=>{t.kill("SIGINT"),process.exit(0);}),process.on("SIGTERM",()=>{t.kill("SIGTERM"),process.exit(0);});});T.addCommand(K());T.addCommand(F());var $=T.command("db").description("Database management commands");$.command("generate").description("Generate migrations from schema").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit generate",(r,t,o)=>{r&&(console.error("\u274C Generation failed:",r.message),process.exit(1));});});$.command("migrate").description("Run database migrations").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit migrate",(r,t,o)=>{r&&(console.error("\u274C Migration failed:",r.message),process.exit(1));});});$.command("push").description("Push schema to database (development)").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit push",(r,t,o)=>{r&&(console.error("\u274C Push failed:",r.message),process.exit(1));});});$.command("seed").description("Seed database with initial data").action(async()=>{let{exec:e}=await import('child_process');e("npx tsx src/database/drizzle/seed.ts",(r,t,o)=>{r&&(console.error("\u274C Seeding failed:",r.message),process.exit(1));});});$.command("studio").description("Open Drizzle Studio").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit studio",(r,t,o)=>{r&&(console.error("\u274C Studio failed:",r.message),process.exit(1));});});var ie=T.command("auth").description("Authentication management commands");ie.command("bootstrap").description("Create initial admin user").option("-e, --email <email>","Admin email",process.env.KYRO_ADMIN_EMAIL).option("-p, --password <password>","Admin password",process.env.KYRO_ADMIN_PASSWORD).option("-r, --role <role>","Admin role",process.env.KYRO_ADMIN_ROLE||"admin").action(async e=>{(!e.email||!e.password)&&(console.error("\u274C Email and password are required. Set KYRO_ADMIN_EMAIL and KYRO_ADMIN_PASSWORD env vars or use -e and -p options."),process.exit(1));try{let{bootstrapAdmin:r}=await import('../bootstrap-VVIT6YBP.js'),t=process.env.DATABASE_URL||"",o=t.toLowerCase().startsWith("postgres://")||t.toLowerCase().startsWith("postgresql://"),s=t.toLowerCase().startsWith("mongodb://")||t.toLowerCase().startsWith("mongodb+srv://"),a=!t||t.includes(".db")||t.includes("sqlite")||t.includes("file:"),c;if(o){let{PostgresAuthAdapter:d}=await import('../postgres-auth-adapter-33QOIRXT.js'),{drizzle:m}=await import('drizzle-orm/postgres-js'),{default:f}=await import('postgres'),u=f(t,{max:1,onnotice:()=>{}}),A=m(u);c=new d({db:A});}else if(s){let{MongoDBAuthAdapter:d}=await import('../mongo-auth-adapter-5TJO5J5U.js'),m=await import('mongodb'),f=new m.MongoClient(t);await f.connect();let u=f.db();c=new d({db:u});}else {let{SQLiteAuthAdapter:d}=await import('../sqlite-adapter-EXYRYZEV.js'),m=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";c=new d({path:m});}c.connect&&await c.connect();let p=await r({authAdapter:c,adminEmail:e.email,adminPassword:e.password,adminRole:e.role});c.disconnect&&await c.disconnect(),p.success||(console.error("\u274C Failed to create admin:",p.error),process.exit(1));}catch(r){console.error("\u274C Bootstrap failed:",r),process.exit(1);}});T.command("health").description("Check system health").action(async()=>{let e=process.env.DATABASE_URL||"",r=e.toLowerCase().startsWith("postgres://")||e.toLowerCase().startsWith("postgresql://"),t=e.toLowerCase().startsWith("mongodb://")||e.toLowerCase().startsWith("mongodb+srv://"),o=!e||e.includes(".db")||e.includes("sqlite")||e.includes("file:");if(r)try{let{default:s}=await import('postgres'),a=s(e,{max:1,onnotice:()=>{}});await a.unsafe("SELECT 1"),await a.end();}catch{}else if(t)try{let s=await import('mongodb'),a=new s.MongoClient(e);await a.connect(),await a.db().admin().ping(),await a.close();}catch{}else if(o)try{let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",{existsSync:a}=await import('fs');a(s);}catch{}});T.parse();process.argv.slice(2).length||T.outputHelp();
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';var chunk3RSMK4DA_cjs=require('./chunk-3RSMK4DA.cjs'),chunkRXZ3IUWM_cjs=require('./chunk-RXZ3IUWM.cjs'),chunkWNVWRRWE_cjs=require('./chunk-WNVWRRWE.cjs'),chunk4KFXG5ZB_cjs=require('./chunk-4KFXG5ZB.cjs'),chunk4XZABBHF_cjs=require('./chunk-4XZABBHF.cjs');require('./chunk-65G73T7Z.cjs');var chunk2BTRHVT3_cjs=require('./chunk-2BTRHVT3.cjs'),chunkSK2Q4PRV_cjs=require('./chunk-SK2Q4PRV.cjs');require('./chunk-KD7LUCFY.cjs');var chunkZUVP4UK7_cjs=require('./chunk-ZUVP4UK7.cjs'),chunkHS2KNFAB_cjs=require('./chunk-HS2KNFAB.cjs'),chunk2YRM7CZZ_cjs=require('./chunk-2YRM7CZZ.cjs'),chunk5K4YG5DA_cjs=require('./chunk-5K4YG5DA.cjs');require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-GO34AOBZ.cjs');var chunkHOP4D5XZ_cjs=require('./chunk-HOP4D5XZ.cjs');require('./chunk-HVXO3OFB.cjs');var chunkILEZ3NYX_cjs=require('./chunk-ILEZ3NYX.cjs'),chunkNY47CFVP_cjs=require('./chunk-NY47CFVP.cjs'),chunkG3J2EU5D_cjs=require('./chunk-G3J2EU5D.cjs');require('./chunk-4ORJMSJU.cjs');var chunkFUWPXR6W_cjs=require('./chunk-FUWPXR6W.cjs'),chunkGYQMNXXW_cjs=require('./chunk-GYQMNXXW.cjs');require('./chunk-MIOMMB23.cjs');var chunk3Q2WUG63_cjs=require('./chunk-3Q2WUG63.cjs'),chunkQCA3AP3M_cjs=require('./chunk-QCA3AP3M.cjs'),chunkFHJJKFAU_cjs=require('./chunk-FHJJKFAU.cjs'),chunkD5P2IPGX_cjs=require('./chunk-D5P2IPGX.cjs');require('./chunk-G7SSHELM.cjs'),require('./chunk-Q3Q7BJVQ.cjs'),require('./chunk-AHSFSERC.cjs');var W=require('crypto'),fs=require('fs'),Me=require('path'),zod=require('zod'),unstorage=require('unstorage'),Jr=require('unstorage/drivers/indexedb'),eo=require('unstorage/drivers/fs');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var W__default=/*#__PURE__*/_interopDefault(W);var Me__default=/*#__PURE__*/_interopDefault(Me);var Jr__default=/*#__PURE__*/_interopDefault(Jr);var eo__default=/*#__PURE__*/_interopDefault(eo);async function Re(s,e){let t=e.data;for(let r of s){let o=await r({...e,data:t});o!==void 0&&(t=o);}return t}async function Cr(s,e){return Re(s,e)}var R=class extends chunkFHJJKFAU_cjs.a{connectionString;constructor(e){super(),this.connectionString=e.connectionString;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.connectionString)throw new Error("NeonAdapter: Connection string is required.");try{let r=await fetch(`${this.connectionString}/sql`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e,params:t})});return r.ok?(await r.json()).rows||[]:[]}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function ve(s){return new R(s)}var v=class extends chunkFHJJKFAU_cjs.a{url;authToken;constructor(e){super(),this.url=e.url.replace(/^libsql:\/\//,"https://"),this.authToken=e.authToken;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.url)throw new Error("TursoAdapter: Database URL is required.");try{let r={"Content-Type":"application/json"};this.authToken&&(r.Authorization=`Bearer ${this.authToken}`);let o=await fetch(`${this.url}/v2/pipeline`,{method:"POST",headers:r,body:JSON.stringify({requests:[{type:"execute",stmt:{sql:e,args:t.map(c=>({type:"text",value:String(c)}))}},{type:"close"}]})});if(!o.ok)return [];let i=(await o.json())?.results?.[0]?.response?.result;if(!i||!i.rows)return [];let a=i.cols.map(c=>c.name);return i.rows.map(c=>{let l={};return a.forEach((d,u)=>{l[d]=c[u]?.value??null;}),l})}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function De(s){return new v(s)}var Rr={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3},x=class{redis;prefix;config;constructor(e,t={},r="kyro:lockout:"){this.redis=e,this.prefix=r,this.config={...Rr,...t};}lockKey(e){return `${this.prefix}${e}`}historyKey(e){return `${this.prefix}${e}:history`}async checkLockout(e){let t=this.lockKey(e),r=await this.redis.hgetall(t);if(!r||Object.keys(r).length===0)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let o=parseInt(r.attempts,10),n=r.lockedUntil?new Date(parseInt(r.lockedUntil,10)):void 0;return n&&n>new Date?{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:o}:n&&n<=new Date?(await this.unlockAccount(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0}):{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=this.lockKey(e),r=this.historyKey(e),o=Date.now(),n=await this.redis.hincrby(t,"attempts",1);if(await this.redis.hset(t,"lastAttempt",o.toString()),await this.redis.lpush(r,o.toString()),await this.redis.ltrim(r,0,99),n>=this.config.maxAttempts){let i=new Date(o+this.config.lockDuration);return await this.redis.hset(t,{lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),await this.redis.expire(t,Math.ceil(this.config.lockDuration/1e3)+3600),{locked:true,attemptsRemaining:0,lockedUntil:i,totalAttempts:n}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-n),totalAttempts:n}}async lockAccount(e,t){let r=this.lockKey(e),o=Date.now(),n=t||this.config.lockDuration,i=new Date(o+n),a=this.redis.pipeline();a.hset(r,{attempts:this.config.maxAttempts.toString(),lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),a.expire(r,Math.ceil(n/1e3)+3600),await a.exec();}async unlockAccount(e){let t=this.lockKey(e);await this.redis.del(t);}async resetAttempts(e){let t=this.lockKey(e);(await this.redis.hgetall(t)).lockedAt?await this.redis.hset(t,{attempts:"0",lockedAt:"",lockedUntil:""}):await this.redis.del(t);}async getLockoutHistory(e,t=10){let r=this.historyKey(e);return (await this.redis.lrange(r,0,t-1)).map(n=>new Date(parseInt(n,10)))}async getLockoutStats(e){let t=this.historyKey(e),r=await this.redis.lrange(t,0,-1),o=r.filter((i,a)=>(a+1)%this.config.maxAttempts===0).length,n=await this.redis.hget(this.lockKey(e),"lockedAt");return {totalFailedAttempts:r.length,lockoutCount:o,lastLockout:n?new Date(parseInt(n,10)):null,averageAttemptsBeforeLockout:o>0?this.config.maxAttempts:0}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};var vr={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}},P=class{redis;prefix;limits;userLimits;constructor(e,t,r,o="kyro:ratelimit:"){this.redis=e,this.prefix=o,this.limits={...vr,...t},this.userLimits=r||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${this.prefix}${e}:${t}`}async check(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window,a=this.redis.pipeline();a.zremrangebyscore(o,0,i),a.zcard(o),a.zadd(o,n,`${n}:${Math.random()}`),a.expire(o,Math.ceil(r.window/1e3)+1);let l=(await a.exec())?.[1]?.[1]||0;if(l>=r.max){let d=await this.redis.zrange(o,0,0,"WITHSCORES"),u=d.length>1?parseInt(d[1],10)+r.window:n+r.window;return {allowed:false,remaining:0,resetAt:u,retryAfter:Math.ceil((u-n)/1e3)}}return {allowed:true,remaining:r.max-l-1,resetAt:n+r.window}}async checkUser(e,t,r){let o=this.userLimits[e]||this.userLimits["user:api"],n=this.getKey(`user:${e}:${t}`,r),i=Date.now(),a=i-o.window,c=this.redis.pipeline();c.zremrangebyscore(n,0,a),c.zcard(n),c.zadd(n,i,`${i}:${Math.random()}`),c.expire(n,Math.ceil(o.window/1e3)+1);let d=(await c.exec())?.[1]?.[1]||0;if(d>=o.max){let u=await this.redis.zrange(n,0,0,"WITHSCORES"),p=u.length>1?parseInt(u[1],10)+o.window:i+o.window;return {allowed:false,remaining:0,resetAt:p,retryAfter:Math.ceil((p-i)/1e3)}}return {allowed:true,remaining:o.max-d-1,resetAt:i+o.window}}async reset(e,t){let r=this.getKey(e,t);await this.redis.del(r);}async resetUser(e,t,r){let o=this.getKey(`user:${e}:${t}`,r);await this.redis.del(o);}async getStatus(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window;await this.redis.zremrangebyscore(o,0,i);let a=await this.redis.zcard(o);return {count:a,limit:r.max,remaining:Math.max(0,r.max-a),resetAt:n+r.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}};var T=class{users=new Map;sessions=new Map;refreshTokens=new Map;emailToUserId=new Map;passwordHistory=new Map;emailVerificationTokens=new Map;passwordResetTokens=new Map;auditLogs=[];externalDb=false;constructor(){}async connect(){}async disconnect(){this.users.clear(),this.sessions.clear(),this.refreshTokens.clear(),this.emailToUserId.clear(),this.passwordHistory.clear();}async createUser(e){let t=W.randomBytes(16).toString("hex"),r=new Date().toISOString(),o=await this.hashPassword(e.password),n={id:t,email:e.email.toLowerCase(),passwordHash:o,role:e.role||"customer",tenantId:e.tenantId,createdAt:r,updatedAt:r};return this.users.set(t,n),this.emailToUserId.set(e.email.toLowerCase(),t),this.passwordHistory.set(t,[]),n}async findUserByEmail(e){let t=this.emailToUserId.get(e.toLowerCase());return t?this.findUserById(t):null}async findUserById(e){return this.users.get(e)||null}async updateUser(e,t){let r=await this.findUserById(e);if(!r)return null;let o={...r,...t,id:e,updatedAt:new Date().toISOString()};return t.email&&t.email!==r.email&&(this.emailToUserId.delete(r.email.toLowerCase()),this.emailToUserId.set(t.email.toLowerCase(),e)),this.users.set(e,o),o}async deleteUser(e){let t=await this.findUserById(e);return t?(this.users.delete(e),this.emailToUserId.delete(t.email.toLowerCase()),this.refreshTokens.forEach((r,o)=>{this.sessions.get(r)?.userId===e&&(this.refreshTokens.delete(o),this.sessions.delete(r));}),this.passwordHistory.delete(e),this.sessions.forEach((r,o)=>{r.userId===e&&this.sessions.delete(o);}),true):false}async hashPassword(e){return (await import('bcryptjs')).default.hash(e,12)}async verifyPassword(e,t){let r=await this.findUserByEmail(e);return !r||!r.passwordHash?null:await(await import('bcryptjs')).default.compare(t,r.passwordHash)?r:null}async createSession(e,t={}){let r=W.randomBytes(32).toString("hex"),o=W.randomBytes(32).toString("base64url"),n=W.randomBytes(32).toString("base64url"),i=new Date,a={id:r,userId:e,token:o,refreshToken:n,expiresAt:new Date(i.getTime()+86400*1e3).toISOString(),createdAt:i.toISOString(),ipAddress:t.ipAddress,userAgent:t.userAgent};return this.sessions.set(r,a),this.refreshTokens.set(n,r),a}async findSessionByToken(e){return this.sessions.get(e)||null}async findSessionByRefreshToken(e){let t=this.refreshTokens.get(e);return t&&this.sessions.get(t)||null}async deleteSession(e){let t=this.sessions.get(e);return t?(t.refreshToken&&this.refreshTokens.delete(t.refreshToken),this.sessions.delete(e),true):false}async deleteUserSessions(e){let t=0;return this.sessions.forEach((r,o)=>{r.userId===e&&(r.refreshToken&&this.refreshTokens.delete(r.refreshToken),this.sessions.delete(o),t++);}),t}async addPasswordToHistory(e,t){let r=this.passwordHistory.get(e)||[];r.push(t),r.length>5&&r.splice(0,r.length-5),this.passwordHistory.set(e,r);}async getPasswordHistory(e,t=5){return this.passwordHistory.get(e)||[]}async isPasswordInHistory(e,t,r=5){let o=await this.getPasswordHistory(t,r),n=(await import('bcryptjs')).default;for(let i of o)if(await n.compare(e,i))return true;return false}async createEmailVerificationToken(e){let t=W.randomBytes(32).toString("hex"),r=new Date(Date.now()+1440*60*1e3);return this.emailVerificationTokens.set(t,{userId:e,expiresAt:r}),{token:t,expiresAt:r}}async verifyEmailToken(e){let t=this.emailVerificationTokens.get(e);return !t||t.expiresAt<new Date?(this.emailVerificationTokens.delete(e),{success:false,error:"Invalid or expired token"}):(this.emailVerificationTokens.delete(e),{success:true,userId:t.userId})}async createPasswordResetToken(e){let t=await this.findUserByEmail(e);if(!t)return {token:"",expiresAt:new Date,error:"User not found"};let r=W.randomBytes(32).toString("hex"),o=new Date(Date.now()+3600*1e3);return this.passwordResetTokens.set(r,{userId:t.id,expiresAt:o}),{token:r,expiresAt:o}}async resetPasswordWithToken(e,t){let r=this.passwordResetTokens.get(e);if(!r||r.expiresAt<new Date)return this.passwordResetTokens.delete(e),{success:false,error:"Invalid or expired token"};let o=await this.hashPassword(t);return await this.updateUser(r.userId,{passwordHash:o}),this.passwordResetTokens.delete(e),{success:true}}async hasAnyUsers(){return this.users.size>0}async findAuditLogs(e){let{limit:t=50,offset:r=0}=e,o=this.auditLogs.slice().reverse();return e.userId&&(o=o.filter(n=>n.userId===e.userId)),e.action&&(Array.isArray(e.action)?o=o.filter(n=>e.action.includes(String(n.action))):o=o.filter(n=>n.action===e.action)),e.resource&&(o=o.filter(n=>n.resource===e.resource)),e.success!==void 0&&(o=o.filter(n=>n.success===e.success)),{logs:o.slice(r,r+t),total:o.length}}async createAuditLog(e){let t=W.randomBytes(16).toString("hex"),o={...e,id:t,timestamp:new Date};return this.auditLogs.push(o),o}};var k=class{storage=new Map;history=new Map;config;constructor(e={}){this.config={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3,...e};}async checkLockout(e){let t=Date.now(),r=this.storage.get(e);if(r&&r.lockedUntil!==null&&r.lockedUntil<=t)return await this.resetAttempts(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};if(!r)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let{attempts:o,lockedUntil:n}=r;return n!==null&&n>t?{locked:true,attemptsRemaining:0,lockedUntil:new Date(n),totalAttempts:o}:{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=Date.now(),r=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};r.attempts+=1,r.lastAttempt=t;let o=this.history.get(e)||[];if(o.push(t),o.length>100&&o.splice(0,o.length-100),this.history.set(e,o),this.storage.set(e,r),r.attempts>=this.config.maxAttempts){let n=new Date(t+this.config.lockDuration);return r.lockedAt=t,r.lockedUntil=n.getTime(),this.storage.set(e,r),{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:r.attempts}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-r.attempts),totalAttempts:r.attempts}}async lockAccount(e,t){let r=Date.now(),o=t||this.config.lockDuration,n=new Date(r+o),i=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};i.attempts=this.config.maxAttempts,i.lockedAt=r,i.lockedUntil=n.getTime(),this.storage.set(e,i);}async unlockAccount(e){await this.resetAttempts(e);}async resetAttempts(e){let t=this.storage.get(e);t&&(t.attempts=0,t.lockedAt=null,t.lockedUntil=null,this.storage.set(e,t)),this.history.delete(e);}async getLockoutHistory(e,t=10){return (this.history.get(e)||[]).slice(-t).reverse().map(o=>new Date(o))}async getLockoutStats(e){let r=(this.history.get(e)||[]).length,o=Math.floor(r/this.config.maxAttempts),n=null,i=this.storage.get(e);i&&i.lockedAt!==null&&(n=new Date(i.lockedAt));let a=o>0?this.config.maxAttempts:0;return {totalFailedAttempts:r,lockoutCount:o,lastLockout:n,averageAttemptsBeforeLockout:a}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};function h(s,e=""){return process.env[s]||e}function A(s,e=false){let t=process.env[s];return t?t.toLowerCase()==="true":e}function g(s,e=0){let t=process.env[s];return t?parseInt(t,10):e}function Ie(){let s=process.env.KYRO_AUTH_DATABASE?.toLowerCase();if(s&&["sqlite","postgres","mongodb","memory"].includes(s))return s;try{let e=Me.join(process.cwd(),"kyro.config.ts"),t=fs.readFileSync(e,"utf8");if(t.includes("createLocalAdapter"))return "sqlite";if(t.includes("createDrizzleAdapter"))return t.includes("postgres")||t.includes("postgresql"),"postgres";if(t.includes("createMongoDBAdapter"))return "mongodb"}catch{}return "memory"}async function Lr(s){let e=process.cwd(),t=e.endsWith("admin")?Me.join(e,".."):e,r=Me.resolve(t,"data","auth.db");switch(s){case "sqlite":return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)});case "postgres":{let o=h("DATABASE_URL","");if(o){let n,i;try{n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}catch{chunkD5P2IPGX_cjs.a(["postgres","drizzle-orm"]),n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}let a=i.default(o,{onnotice:()=>{}}),c=n(a);return new chunkGYQMNXXW_cjs.a({db:c})}return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)})}case "mongodb":{let o=h("MONGODB_URI","");if(o){let n;try{n=(await import('mongodb')).MongoClient;}catch{chunkD5P2IPGX_cjs.a(["mongodb"]),n=(await import('mongodb')).MongoClient;}let i=new n(o);await i.connect();let c=new URL(o).pathname.replace(/^\//,"")||"kyro_cms",l=i.db(c);return new chunkQCA3AP3M_cjs.a({db:l})}return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)})}default:return new T}}async function $(s,e){let t=A("KYRO_DISTRIBUTED",false),r;if(t){let{RedisAuthAdapter:u}=await import('./redis-adapter-OUKQGYCH.cjs'),p=h("REDIS_URL","redis://localhost:6379"),y=A("REDIS_TLS",false),m=new u({url:p,tls:y});await m.connect?.(),r=m;}else {let u=s||Ie();r=await Lr(u),r.connect&&await r.connect();}let o=e?await chunk5K4YG5DA_cjs.k.fromConfig(e).catch(()=>null)||chunk5K4YG5DA_cjs.k.fromEnv()||void 0:chunk5K4YG5DA_cjs.k.fromEnv()||void 0,n=new chunk5K4YG5DA_cjs.l({minLength:g("PASSWORD_MIN_LENGTH",12),requireUppercase:A("PASSWORD_REQUIRE_UPPERCASE",true),requireLowercase:A("PASSWORD_REQUIRE_LOWERCASE",true),requireNumbers:A("PASSWORD_REQUIRE_NUMBERS",true),requireSpecialChars:A("PASSWORD_REQUIRE_SPECIAL",true),preventReuse:g("PASSWORD_PREVENT_REUSE",5),maxLength:g("PASSWORD_MAX_LENGTH",128)}),i,a,c;if(t){let p=r.redis;i=new x(p,{maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new P(p,{"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=new chunk2YRM7CZZ_cjs.n(p,g("AUDIT_LOG_RETENTION_DAYS",30));}else i=new k({maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new chunk2YRM7CZZ_cjs.m({"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=A("AUDIT_LOG_ENABLED",true)?new chunk2YRM7CZZ_cjs.p(g("AUDIT_LOG_RETENTION_DAYS",30)):void 0;let l=new chunk2YRM7CZZ_cjs.q({redis:r,email:o,jwtSecret:h("APP_SECRET","change-me"),jwtExpiresIn:h("JWT_EXPIRES_IN","24h"),jwtIssuer:h("JWT_ISSUER","kyro-cms"),jwtAudience:h("JWT_AUDIENCE","kyro-cms-client"),passwordPolicy:n,lockout:i,rateLimiter:a,auditLogger:c,baseUrl:h("EMAIL_BASE_URL","http://localhost:4321"),emailVerificationRequired:A("EMAIL_VERIFICATION_REQUIRED",true)}),d=t?"distributed":s||Ie();return {authAdapter:r,databaseType:d,email:o,passwordPolicy:n,lockout:i,rateLimiter:a,auditLogger:c,routes:l}}var Ee=$().catch(s=>(console.warn("[AuthConfig] Failed to initialize auth config:",s.message),null));var Er=12,Or="24h",Ur="7d",U=class{adapter;config;constructor(e,t){this.adapter=e,this.config={secret:t.secret,expiresIn:t.expiresIn??Or,refreshExpiresIn:t.refreshExpiresIn??Ur,issuer:t.issuer??"kyro-cms",audience:t.audience??[],saltRounds:t.saltRounds??Er};}async register(e){try{if(await this.adapter.findUserByEmail(e.email))return {success:!1,error:"Email already registered"};let r=await this.adapter.createUser({email:e.email,password:e.password,role:e.role??"customer",tenantId:e.tenantId});return this.createSessionForUser(r)}catch(t){return {success:false,error:String(t)}}}async login(e){try{let t=await this.adapter.verifyPassword(e.email,e.password);return t?this.createSessionForUser(t):{success:!1,error:"Invalid credentials"}}catch(t){return {success:false,error:String(t)}}}async logout(e){await this.adapter.deleteSession(e);}async refreshToken(e){try{let t=await this.adapter.findSessionByToken(e);if(!t||new Date(t.expiresAt)<new Date)return {success:!1,error:"Invalid or expired refresh token"};let r=await this.adapter.findUserById(t.userId);return r?(await this.adapter.deleteSession(e),this.createSessionForUser(r)):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async verifyToken(e){try{let{default:t}=await import('jsonwebtoken');return t.verify(e,this.config.secret,{issuer:this.config.issuer,audience:this.config.audience.length>0?this.config.audience[0]:void 0})}catch{return null}}async getUserFromToken(e){let t=await this.verifyToken(e);return t?this.adapter.findUserById(t.sub):null}async changePassword(e,t,r){try{let o=await this.adapter.findUserById(e);return o?await this.adapter.verifyPassword(o.email,t)?(await this.adapter.updateUser(e,{password:r}),await this.adapter.deleteUserSessions(e),{success:!0,user:o}):{success:!1,error:"Current password is incorrect"}:{success:!1,error:"User not found"}}catch(o){return {success:false,error:String(o)}}}async resetPassword(e,t){try{let r=await this.adapter.findUserByEmail(e);return r?(await this.adapter.updateUser(r.id,{password:t}),await this.adapter.deleteUserSessions(r.id),{success:!0,user:r}):{success:!1,error:"User not found"}}catch(r){return {success:false,error:String(r)}}}async sendEmailVerification(e){try{let{token:t,expiresAt:r}=await this.adapter.createEmailVerificationToken(e);return {success:!0}}catch(t){return {success:false,error:String(t)}}}async verifyEmail(e){try{return await this.adapter.verifyEmailToken(e)}catch(t){return {success:false,error:String(t)}}}async requestPasswordReset(e){try{let t=await this.adapter.createPasswordResetToken(e);return t.error?{success:!1,error:t.error}:{success:!0}}catch(t){return {success:false,error:String(t)}}}async resetPasswordWithToken(e,t){try{return await this.adapter.resetPasswordWithToken(e,t)}catch(r){return {success:false,error:String(r)}}}async deleteAccount(e){try{return await this.adapter.findUserById(e)?(await this.adapter.deleteUserSessions(e),await this.adapter.deleteUser(e),{success:!0}):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async createSessionForUser(e){let t=await this.generateToken(e),r=await this.adapter.createSession(e.id);return {success:true,user:e,session:r,token:t}}async generateToken(e){let{default:t}=await import('jsonwebtoken'),r={sub:e.id,email:e.email,role:e.role,tenantId:e.tenantId},o={expiresIn:this.parseExpiresIn(this.config.expiresIn)/1e3,issuer:this.config.issuer};return this.config.audience.length>0&&(o.audience=this.config.audience[0]),t.sign(r,this.config.secret,o)}async hashPassword(e){let{default:t}=await import('bcryptjs');return t.hash(e,this.config.saltRounds)}parseExpiresIn(e){if(typeof e=="number")return e;let t=e.match(/^(\d+)([smhd])$/);if(!t)return 864e5;let r=parseInt(t[1],10);switch(t[2]){case "s":return r*1e3;case "m":return r*6e4;case "h":return r*36e5;case "d":return r*864e5;default:return 864e5}}};function Vr(s,e){return new U(s,e)}function V(){return {enabled:true,draftsEnabled:true,publishEnabled:true,scheduleEnabled:false,versioningEnabled:true,maxVersionsPerDocument:50,autoPublish:false,requirePublishPermission:true}}var _=class{adapter;config;constructor(e,t){this.adapter=e,this.config={...V(),...t};}async createVersion(e){let r=((await this.adapter.getLatestVersion(e.collection,e.documentId))?.version??0)+1,o={...e,version:r},n=await this.adapter.createVersion(o);return this.config.maxVersionsPerDocument>0&&await this.pruneOldVersions(e.collection,e.documentId),n}async publishVersion(e){let t=await this.adapter.getVersion(e.collection,e.versionId);if(!t)throw new Error("Version not found");if(t.status==="published")throw new Error("Version is already published");await this.adapter.publishVersion(e);}async unpublishDocument(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:1e3});for(let o of r)if(o.status==="published"){await this.createVersion({collection:e,documentId:t,data:o.data,status:"draft",createdBy:"system",changeDescription:"Unpublished document"});break}}async revertToVersion(e,t,r,o){if(!await this.adapter.getVersion(e,r))throw new Error("Version not found");return await this.adapter.revertToVersion({collection:e,documentId:t,versionId:r,userId:o})}async getVersionHistory(e,t,r=20,o=0){return this.adapter.getVersions({collection:e,documentId:t,limit:r,offset:o})}async compareTwoVersions(e,t,r,o){return this.adapter.compareVersions({collection:e,documentId:t,versionA:r,versionB:o})}async getLatestDraft(e,t){return this.adapter.getLatestVersion(e,t)}async getPublishedVersion(e,t){return this.adapter.getPublishedVersion(e,t)}async getVersion(e,t){return this.adapter.getVersion(e,t)}async schedulePublish(e,t,r,o){if(!this.config.scheduleEnabled)throw new Error("Scheduled publishing is not enabled");if(!await this.adapter.getVersion(e,r))throw new Error("Version not found")}async deleteVersionHistory(e,t){await this.adapter.deleteVersions(e,t);}async pruneOldVersions(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:this.config.maxVersionsPerDocument+100});if(r.length<=this.config.maxVersionsPerDocument)return;r.slice(0,this.config.maxVersionsPerDocument);let n=r.slice(this.config.maxVersionsPerDocument);for(let i of n)if(i.status!=="published"){await this.adapter.deleteVersions(e,t);break}}};function _r(s,e){return new _(s,e)}function Mr(s){return s==="published"}function Hr(s){return s==="draft"}function Fr(s){return s==="archived"}function Nr(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Br(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Oe(s){return {collections:Nr(s.collections),globals:Br(s.globals),adapter:s.adapter,plugins:s.plugins,auth:s.auth,cors:s.cors,admin:s.admin,upload:s.upload,graphQL:s.graphQL,typescript:s.typescript,localization:s.localization,rateLimit:s.rateLimit,debug:s.debug}}var Kr=Oe;function $r(s){let{siteSettings:e,seoSettings:t,title:r,description:o,image:n,url:i}=s;if(!e)return "";let a=e.siteName||"",c=r||t?.defaultTitle||a,l=t?.titleTemplate,d=t?.separator||" | ",u=t?.siteNameInTitle!==false,p=l?l.replace(/\{\{title\}\}/g,c).replace(/\{\{siteName\}\}/g,u?a:"").replace(/\{\{separator\}\}/g,d).replace(/\s+/g," ").trim():c,y=o||t?.defaultDescription||e.siteDescription||"",m=n||e.siteOgImage?.url||"",D=i||e.siteUrl||"",f=`
|
|
1
|
+
'use strict';var chunk3RSMK4DA_cjs=require('./chunk-3RSMK4DA.cjs'),chunkRXZ3IUWM_cjs=require('./chunk-RXZ3IUWM.cjs'),chunkWNVWRRWE_cjs=require('./chunk-WNVWRRWE.cjs'),chunk4KFXG5ZB_cjs=require('./chunk-4KFXG5ZB.cjs'),chunkQBJT7XLN_cjs=require('./chunk-QBJT7XLN.cjs');require('./chunk-65G73T7Z.cjs');var chunk2BTRHVT3_cjs=require('./chunk-2BTRHVT3.cjs'),chunkSK2Q4PRV_cjs=require('./chunk-SK2Q4PRV.cjs');require('./chunk-KD7LUCFY.cjs');var chunkZUVP4UK7_cjs=require('./chunk-ZUVP4UK7.cjs'),chunkHS2KNFAB_cjs=require('./chunk-HS2KNFAB.cjs'),chunk2YRM7CZZ_cjs=require('./chunk-2YRM7CZZ.cjs'),chunk5K4YG5DA_cjs=require('./chunk-5K4YG5DA.cjs');require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-GO34AOBZ.cjs');var chunkHOP4D5XZ_cjs=require('./chunk-HOP4D5XZ.cjs');require('./chunk-HVXO3OFB.cjs');var chunkILEZ3NYX_cjs=require('./chunk-ILEZ3NYX.cjs'),chunkNY47CFVP_cjs=require('./chunk-NY47CFVP.cjs'),chunkG3J2EU5D_cjs=require('./chunk-G3J2EU5D.cjs');require('./chunk-4ORJMSJU.cjs');var chunkFUWPXR6W_cjs=require('./chunk-FUWPXR6W.cjs'),chunkGYQMNXXW_cjs=require('./chunk-GYQMNXXW.cjs');require('./chunk-MIOMMB23.cjs');var chunk3Q2WUG63_cjs=require('./chunk-3Q2WUG63.cjs'),chunkQCA3AP3M_cjs=require('./chunk-QCA3AP3M.cjs'),chunkFHJJKFAU_cjs=require('./chunk-FHJJKFAU.cjs'),chunkD5P2IPGX_cjs=require('./chunk-D5P2IPGX.cjs');require('./chunk-G7SSHELM.cjs'),require('./chunk-Q3Q7BJVQ.cjs'),require('./chunk-AHSFSERC.cjs');var W=require('crypto'),fs=require('fs'),Me=require('path'),zod=require('zod'),unstorage=require('unstorage'),Jr=require('unstorage/drivers/indexedb'),eo=require('unstorage/drivers/fs');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var W__default=/*#__PURE__*/_interopDefault(W);var Me__default=/*#__PURE__*/_interopDefault(Me);var Jr__default=/*#__PURE__*/_interopDefault(Jr);var eo__default=/*#__PURE__*/_interopDefault(eo);async function Re(s,e){let t=e.data;for(let r of s){let o=await r({...e,data:t});o!==void 0&&(t=o);}return t}async function Cr(s,e){return Re(s,e)}var R=class extends chunkFHJJKFAU_cjs.a{connectionString;constructor(e){super(),this.connectionString=e.connectionString;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.connectionString)throw new Error("NeonAdapter: Connection string is required.");try{let r=await fetch(`${this.connectionString}/sql`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e,params:t})});return r.ok?(await r.json()).rows||[]:[]}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function ve(s){return new R(s)}var v=class extends chunkFHJJKFAU_cjs.a{url;authToken;constructor(e){super(),this.url=e.url.replace(/^libsql:\/\//,"https://"),this.authToken=e.authToken;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.url)throw new Error("TursoAdapter: Database URL is required.");try{let r={"Content-Type":"application/json"};this.authToken&&(r.Authorization=`Bearer ${this.authToken}`);let o=await fetch(`${this.url}/v2/pipeline`,{method:"POST",headers:r,body:JSON.stringify({requests:[{type:"execute",stmt:{sql:e,args:t.map(c=>({type:"text",value:String(c)}))}},{type:"close"}]})});if(!o.ok)return [];let i=(await o.json())?.results?.[0]?.response?.result;if(!i||!i.rows)return [];let a=i.cols.map(c=>c.name);return i.rows.map(c=>{let l={};return a.forEach((d,u)=>{l[d]=c[u]?.value??null;}),l})}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function De(s){return new v(s)}var Rr={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3},x=class{redis;prefix;config;constructor(e,t={},r="kyro:lockout:"){this.redis=e,this.prefix=r,this.config={...Rr,...t};}lockKey(e){return `${this.prefix}${e}`}historyKey(e){return `${this.prefix}${e}:history`}async checkLockout(e){let t=this.lockKey(e),r=await this.redis.hgetall(t);if(!r||Object.keys(r).length===0)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let o=parseInt(r.attempts,10),n=r.lockedUntil?new Date(parseInt(r.lockedUntil,10)):void 0;return n&&n>new Date?{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:o}:n&&n<=new Date?(await this.unlockAccount(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0}):{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=this.lockKey(e),r=this.historyKey(e),o=Date.now(),n=await this.redis.hincrby(t,"attempts",1);if(await this.redis.hset(t,"lastAttempt",o.toString()),await this.redis.lpush(r,o.toString()),await this.redis.ltrim(r,0,99),n>=this.config.maxAttempts){let i=new Date(o+this.config.lockDuration);return await this.redis.hset(t,{lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),await this.redis.expire(t,Math.ceil(this.config.lockDuration/1e3)+3600),{locked:true,attemptsRemaining:0,lockedUntil:i,totalAttempts:n}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-n),totalAttempts:n}}async lockAccount(e,t){let r=this.lockKey(e),o=Date.now(),n=t||this.config.lockDuration,i=new Date(o+n),a=this.redis.pipeline();a.hset(r,{attempts:this.config.maxAttempts.toString(),lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),a.expire(r,Math.ceil(n/1e3)+3600),await a.exec();}async unlockAccount(e){let t=this.lockKey(e);await this.redis.del(t);}async resetAttempts(e){let t=this.lockKey(e);(await this.redis.hgetall(t)).lockedAt?await this.redis.hset(t,{attempts:"0",lockedAt:"",lockedUntil:""}):await this.redis.del(t);}async getLockoutHistory(e,t=10){let r=this.historyKey(e);return (await this.redis.lrange(r,0,t-1)).map(n=>new Date(parseInt(n,10)))}async getLockoutStats(e){let t=this.historyKey(e),r=await this.redis.lrange(t,0,-1),o=r.filter((i,a)=>(a+1)%this.config.maxAttempts===0).length,n=await this.redis.hget(this.lockKey(e),"lockedAt");return {totalFailedAttempts:r.length,lockoutCount:o,lastLockout:n?new Date(parseInt(n,10)):null,averageAttemptsBeforeLockout:o>0?this.config.maxAttempts:0}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};var vr={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}},P=class{redis;prefix;limits;userLimits;constructor(e,t,r,o="kyro:ratelimit:"){this.redis=e,this.prefix=o,this.limits={...vr,...t},this.userLimits=r||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${this.prefix}${e}:${t}`}async check(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window,a=this.redis.pipeline();a.zremrangebyscore(o,0,i),a.zcard(o),a.zadd(o,n,`${n}:${Math.random()}`),a.expire(o,Math.ceil(r.window/1e3)+1);let l=(await a.exec())?.[1]?.[1]||0;if(l>=r.max){let d=await this.redis.zrange(o,0,0,"WITHSCORES"),u=d.length>1?parseInt(d[1],10)+r.window:n+r.window;return {allowed:false,remaining:0,resetAt:u,retryAfter:Math.ceil((u-n)/1e3)}}return {allowed:true,remaining:r.max-l-1,resetAt:n+r.window}}async checkUser(e,t,r){let o=this.userLimits[e]||this.userLimits["user:api"],n=this.getKey(`user:${e}:${t}`,r),i=Date.now(),a=i-o.window,c=this.redis.pipeline();c.zremrangebyscore(n,0,a),c.zcard(n),c.zadd(n,i,`${i}:${Math.random()}`),c.expire(n,Math.ceil(o.window/1e3)+1);let d=(await c.exec())?.[1]?.[1]||0;if(d>=o.max){let u=await this.redis.zrange(n,0,0,"WITHSCORES"),p=u.length>1?parseInt(u[1],10)+o.window:i+o.window;return {allowed:false,remaining:0,resetAt:p,retryAfter:Math.ceil((p-i)/1e3)}}return {allowed:true,remaining:o.max-d-1,resetAt:i+o.window}}async reset(e,t){let r=this.getKey(e,t);await this.redis.del(r);}async resetUser(e,t,r){let o=this.getKey(`user:${e}:${t}`,r);await this.redis.del(o);}async getStatus(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window;await this.redis.zremrangebyscore(o,0,i);let a=await this.redis.zcard(o);return {count:a,limit:r.max,remaining:Math.max(0,r.max-a),resetAt:n+r.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}};var T=class{users=new Map;sessions=new Map;refreshTokens=new Map;emailToUserId=new Map;passwordHistory=new Map;emailVerificationTokens=new Map;passwordResetTokens=new Map;auditLogs=[];externalDb=false;constructor(){}async connect(){}async disconnect(){this.users.clear(),this.sessions.clear(),this.refreshTokens.clear(),this.emailToUserId.clear(),this.passwordHistory.clear();}async createUser(e){let t=W.randomBytes(16).toString("hex"),r=new Date().toISOString(),o=await this.hashPassword(e.password),n={id:t,email:e.email.toLowerCase(),passwordHash:o,role:e.role||"customer",tenantId:e.tenantId,createdAt:r,updatedAt:r};return this.users.set(t,n),this.emailToUserId.set(e.email.toLowerCase(),t),this.passwordHistory.set(t,[]),n}async findUserByEmail(e){let t=this.emailToUserId.get(e.toLowerCase());return t?this.findUserById(t):null}async findUserById(e){return this.users.get(e)||null}async updateUser(e,t){let r=await this.findUserById(e);if(!r)return null;let o={...r,...t,id:e,updatedAt:new Date().toISOString()};return t.email&&t.email!==r.email&&(this.emailToUserId.delete(r.email.toLowerCase()),this.emailToUserId.set(t.email.toLowerCase(),e)),this.users.set(e,o),o}async deleteUser(e){let t=await this.findUserById(e);return t?(this.users.delete(e),this.emailToUserId.delete(t.email.toLowerCase()),this.refreshTokens.forEach((r,o)=>{this.sessions.get(r)?.userId===e&&(this.refreshTokens.delete(o),this.sessions.delete(r));}),this.passwordHistory.delete(e),this.sessions.forEach((r,o)=>{r.userId===e&&this.sessions.delete(o);}),true):false}async hashPassword(e){return (await import('bcryptjs')).default.hash(e,12)}async verifyPassword(e,t){let r=await this.findUserByEmail(e);return !r||!r.passwordHash?null:await(await import('bcryptjs')).default.compare(t,r.passwordHash)?r:null}async createSession(e,t={}){let r=W.randomBytes(32).toString("hex"),o=W.randomBytes(32).toString("base64url"),n=W.randomBytes(32).toString("base64url"),i=new Date,a={id:r,userId:e,token:o,refreshToken:n,expiresAt:new Date(i.getTime()+86400*1e3).toISOString(),createdAt:i.toISOString(),ipAddress:t.ipAddress,userAgent:t.userAgent};return this.sessions.set(r,a),this.refreshTokens.set(n,r),a}async findSessionByToken(e){return this.sessions.get(e)||null}async findSessionByRefreshToken(e){let t=this.refreshTokens.get(e);return t&&this.sessions.get(t)||null}async deleteSession(e){let t=this.sessions.get(e);return t?(t.refreshToken&&this.refreshTokens.delete(t.refreshToken),this.sessions.delete(e),true):false}async deleteUserSessions(e){let t=0;return this.sessions.forEach((r,o)=>{r.userId===e&&(r.refreshToken&&this.refreshTokens.delete(r.refreshToken),this.sessions.delete(o),t++);}),t}async addPasswordToHistory(e,t){let r=this.passwordHistory.get(e)||[];r.push(t),r.length>5&&r.splice(0,r.length-5),this.passwordHistory.set(e,r);}async getPasswordHistory(e,t=5){return this.passwordHistory.get(e)||[]}async isPasswordInHistory(e,t,r=5){let o=await this.getPasswordHistory(t,r),n=(await import('bcryptjs')).default;for(let i of o)if(await n.compare(e,i))return true;return false}async createEmailVerificationToken(e){let t=W.randomBytes(32).toString("hex"),r=new Date(Date.now()+1440*60*1e3);return this.emailVerificationTokens.set(t,{userId:e,expiresAt:r}),{token:t,expiresAt:r}}async verifyEmailToken(e){let t=this.emailVerificationTokens.get(e);return !t||t.expiresAt<new Date?(this.emailVerificationTokens.delete(e),{success:false,error:"Invalid or expired token"}):(this.emailVerificationTokens.delete(e),{success:true,userId:t.userId})}async createPasswordResetToken(e){let t=await this.findUserByEmail(e);if(!t)return {token:"",expiresAt:new Date,error:"User not found"};let r=W.randomBytes(32).toString("hex"),o=new Date(Date.now()+3600*1e3);return this.passwordResetTokens.set(r,{userId:t.id,expiresAt:o}),{token:r,expiresAt:o}}async resetPasswordWithToken(e,t){let r=this.passwordResetTokens.get(e);if(!r||r.expiresAt<new Date)return this.passwordResetTokens.delete(e),{success:false,error:"Invalid or expired token"};let o=await this.hashPassword(t);return await this.updateUser(r.userId,{passwordHash:o}),this.passwordResetTokens.delete(e),{success:true}}async hasAnyUsers(){return this.users.size>0}async findAuditLogs(e){let{limit:t=50,offset:r=0}=e,o=this.auditLogs.slice().reverse();return e.userId&&(o=o.filter(n=>n.userId===e.userId)),e.action&&(Array.isArray(e.action)?o=o.filter(n=>e.action.includes(String(n.action))):o=o.filter(n=>n.action===e.action)),e.resource&&(o=o.filter(n=>n.resource===e.resource)),e.success!==void 0&&(o=o.filter(n=>n.success===e.success)),{logs:o.slice(r,r+t),total:o.length}}async createAuditLog(e){let t=W.randomBytes(16).toString("hex"),o={...e,id:t,timestamp:new Date};return this.auditLogs.push(o),o}};var k=class{storage=new Map;history=new Map;config;constructor(e={}){this.config={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3,...e};}async checkLockout(e){let t=Date.now(),r=this.storage.get(e);if(r&&r.lockedUntil!==null&&r.lockedUntil<=t)return await this.resetAttempts(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};if(!r)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let{attempts:o,lockedUntil:n}=r;return n!==null&&n>t?{locked:true,attemptsRemaining:0,lockedUntil:new Date(n),totalAttempts:o}:{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=Date.now(),r=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};r.attempts+=1,r.lastAttempt=t;let o=this.history.get(e)||[];if(o.push(t),o.length>100&&o.splice(0,o.length-100),this.history.set(e,o),this.storage.set(e,r),r.attempts>=this.config.maxAttempts){let n=new Date(t+this.config.lockDuration);return r.lockedAt=t,r.lockedUntil=n.getTime(),this.storage.set(e,r),{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:r.attempts}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-r.attempts),totalAttempts:r.attempts}}async lockAccount(e,t){let r=Date.now(),o=t||this.config.lockDuration,n=new Date(r+o),i=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};i.attempts=this.config.maxAttempts,i.lockedAt=r,i.lockedUntil=n.getTime(),this.storage.set(e,i);}async unlockAccount(e){await this.resetAttempts(e);}async resetAttempts(e){let t=this.storage.get(e);t&&(t.attempts=0,t.lockedAt=null,t.lockedUntil=null,this.storage.set(e,t)),this.history.delete(e);}async getLockoutHistory(e,t=10){return (this.history.get(e)||[]).slice(-t).reverse().map(o=>new Date(o))}async getLockoutStats(e){let r=(this.history.get(e)||[]).length,o=Math.floor(r/this.config.maxAttempts),n=null,i=this.storage.get(e);i&&i.lockedAt!==null&&(n=new Date(i.lockedAt));let a=o>0?this.config.maxAttempts:0;return {totalFailedAttempts:r,lockoutCount:o,lastLockout:n,averageAttemptsBeforeLockout:a}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};function h(s,e=""){return process.env[s]||e}function A(s,e=false){let t=process.env[s];return t?t.toLowerCase()==="true":e}function g(s,e=0){let t=process.env[s];return t?parseInt(t,10):e}function Ie(){let s=process.env.KYRO_AUTH_DATABASE?.toLowerCase();if(s&&["sqlite","postgres","mongodb","memory"].includes(s))return s;try{let e=Me.join(process.cwd(),"kyro.config.ts"),t=fs.readFileSync(e,"utf8");if(t.includes("createLocalAdapter"))return "sqlite";if(t.includes("createDrizzleAdapter"))return t.includes("postgres")||t.includes("postgresql"),"postgres";if(t.includes("createMongoDBAdapter"))return "mongodb"}catch{}return "memory"}async function Lr(s){let e=process.cwd(),t=e.endsWith("admin")?Me.join(e,".."):e,r=Me.resolve(t,"data","auth.db");switch(s){case "sqlite":return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)});case "postgres":{let o=h("DATABASE_URL","");if(o){let n,i;try{n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}catch{chunkD5P2IPGX_cjs.a(["postgres","drizzle-orm"]),n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}let a=i.default(o,{onnotice:()=>{}}),c=n(a);return new chunkGYQMNXXW_cjs.a({db:c})}return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)})}case "mongodb":{let o=h("MONGODB_URI","");if(o){let n;try{n=(await import('mongodb')).MongoClient;}catch{chunkD5P2IPGX_cjs.a(["mongodb"]),n=(await import('mongodb')).MongoClient;}let i=new n(o);await i.connect();let c=new URL(o).pathname.replace(/^\//,"")||"kyro_cms",l=i.db(c);return new chunkQCA3AP3M_cjs.a({db:l})}return new chunkHOP4D5XZ_cjs.a({path:h("KYRO_AUTH_DB_PATH",r)})}default:return new T}}async function $(s,e){let t=A("KYRO_DISTRIBUTED",false),r;if(t){let{RedisAuthAdapter:u}=await import('./redis-adapter-OUKQGYCH.cjs'),p=h("REDIS_URL","redis://localhost:6379"),y=A("REDIS_TLS",false),m=new u({url:p,tls:y});await m.connect?.(),r=m;}else {let u=s||Ie();r=await Lr(u),r.connect&&await r.connect();}let o=e?await chunk5K4YG5DA_cjs.k.fromConfig(e).catch(()=>null)||chunk5K4YG5DA_cjs.k.fromEnv()||void 0:chunk5K4YG5DA_cjs.k.fromEnv()||void 0,n=new chunk5K4YG5DA_cjs.l({minLength:g("PASSWORD_MIN_LENGTH",12),requireUppercase:A("PASSWORD_REQUIRE_UPPERCASE",true),requireLowercase:A("PASSWORD_REQUIRE_LOWERCASE",true),requireNumbers:A("PASSWORD_REQUIRE_NUMBERS",true),requireSpecialChars:A("PASSWORD_REQUIRE_SPECIAL",true),preventReuse:g("PASSWORD_PREVENT_REUSE",5),maxLength:g("PASSWORD_MAX_LENGTH",128)}),i,a,c;if(t){let p=r.redis;i=new x(p,{maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new P(p,{"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=new chunk2YRM7CZZ_cjs.n(p,g("AUDIT_LOG_RETENTION_DAYS",30));}else i=new k({maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new chunk2YRM7CZZ_cjs.m({"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=A("AUDIT_LOG_ENABLED",true)?new chunk2YRM7CZZ_cjs.p(g("AUDIT_LOG_RETENTION_DAYS",30)):void 0;let l=new chunk2YRM7CZZ_cjs.q({redis:r,email:o,jwtSecret:h("APP_SECRET","change-me"),jwtExpiresIn:h("JWT_EXPIRES_IN","24h"),jwtIssuer:h("JWT_ISSUER","kyro-cms"),jwtAudience:h("JWT_AUDIENCE","kyro-cms-client"),passwordPolicy:n,lockout:i,rateLimiter:a,auditLogger:c,baseUrl:h("EMAIL_BASE_URL","http://localhost:4321"),emailVerificationRequired:A("EMAIL_VERIFICATION_REQUIRED",true)}),d=t?"distributed":s||Ie();return {authAdapter:r,databaseType:d,email:o,passwordPolicy:n,lockout:i,rateLimiter:a,auditLogger:c,routes:l}}var Ee=$().catch(s=>(console.warn("[AuthConfig] Failed to initialize auth config:",s.message),null));var Er=12,Or="24h",Ur="7d",U=class{adapter;config;constructor(e,t){this.adapter=e,this.config={secret:t.secret,expiresIn:t.expiresIn??Or,refreshExpiresIn:t.refreshExpiresIn??Ur,issuer:t.issuer??"kyro-cms",audience:t.audience??[],saltRounds:t.saltRounds??Er};}async register(e){try{if(await this.adapter.findUserByEmail(e.email))return {success:!1,error:"Email already registered"};let r=await this.adapter.createUser({email:e.email,password:e.password,role:e.role??"customer",tenantId:e.tenantId});return this.createSessionForUser(r)}catch(t){return {success:false,error:String(t)}}}async login(e){try{let t=await this.adapter.verifyPassword(e.email,e.password);return t?this.createSessionForUser(t):{success:!1,error:"Invalid credentials"}}catch(t){return {success:false,error:String(t)}}}async logout(e){await this.adapter.deleteSession(e);}async refreshToken(e){try{let t=await this.adapter.findSessionByToken(e);if(!t||new Date(t.expiresAt)<new Date)return {success:!1,error:"Invalid or expired refresh token"};let r=await this.adapter.findUserById(t.userId);return r?(await this.adapter.deleteSession(e),this.createSessionForUser(r)):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async verifyToken(e){try{let{default:t}=await import('jsonwebtoken');return t.verify(e,this.config.secret,{issuer:this.config.issuer,audience:this.config.audience.length>0?this.config.audience[0]:void 0})}catch{return null}}async getUserFromToken(e){let t=await this.verifyToken(e);return t?this.adapter.findUserById(t.sub):null}async changePassword(e,t,r){try{let o=await this.adapter.findUserById(e);return o?await this.adapter.verifyPassword(o.email,t)?(await this.adapter.updateUser(e,{password:r}),await this.adapter.deleteUserSessions(e),{success:!0,user:o}):{success:!1,error:"Current password is incorrect"}:{success:!1,error:"User not found"}}catch(o){return {success:false,error:String(o)}}}async resetPassword(e,t){try{let r=await this.adapter.findUserByEmail(e);return r?(await this.adapter.updateUser(r.id,{password:t}),await this.adapter.deleteUserSessions(r.id),{success:!0,user:r}):{success:!1,error:"User not found"}}catch(r){return {success:false,error:String(r)}}}async sendEmailVerification(e){try{let{token:t,expiresAt:r}=await this.adapter.createEmailVerificationToken(e);return {success:!0}}catch(t){return {success:false,error:String(t)}}}async verifyEmail(e){try{return await this.adapter.verifyEmailToken(e)}catch(t){return {success:false,error:String(t)}}}async requestPasswordReset(e){try{let t=await this.adapter.createPasswordResetToken(e);return t.error?{success:!1,error:t.error}:{success:!0}}catch(t){return {success:false,error:String(t)}}}async resetPasswordWithToken(e,t){try{return await this.adapter.resetPasswordWithToken(e,t)}catch(r){return {success:false,error:String(r)}}}async deleteAccount(e){try{return await this.adapter.findUserById(e)?(await this.adapter.deleteUserSessions(e),await this.adapter.deleteUser(e),{success:!0}):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async createSessionForUser(e){let t=await this.generateToken(e),r=await this.adapter.createSession(e.id);return {success:true,user:e,session:r,token:t}}async generateToken(e){let{default:t}=await import('jsonwebtoken'),r={sub:e.id,email:e.email,role:e.role,tenantId:e.tenantId},o={expiresIn:this.parseExpiresIn(this.config.expiresIn)/1e3,issuer:this.config.issuer};return this.config.audience.length>0&&(o.audience=this.config.audience[0]),t.sign(r,this.config.secret,o)}async hashPassword(e){let{default:t}=await import('bcryptjs');return t.hash(e,this.config.saltRounds)}parseExpiresIn(e){if(typeof e=="number")return e;let t=e.match(/^(\d+)([smhd])$/);if(!t)return 864e5;let r=parseInt(t[1],10);switch(t[2]){case "s":return r*1e3;case "m":return r*6e4;case "h":return r*36e5;case "d":return r*864e5;default:return 864e5}}};function Vr(s,e){return new U(s,e)}function V(){return {enabled:true,draftsEnabled:true,publishEnabled:true,scheduleEnabled:false,versioningEnabled:true,maxVersionsPerDocument:50,autoPublish:false,requirePublishPermission:true}}var _=class{adapter;config;constructor(e,t){this.adapter=e,this.config={...V(),...t};}async createVersion(e){let r=((await this.adapter.getLatestVersion(e.collection,e.documentId))?.version??0)+1,o={...e,version:r},n=await this.adapter.createVersion(o);return this.config.maxVersionsPerDocument>0&&await this.pruneOldVersions(e.collection,e.documentId),n}async publishVersion(e){let t=await this.adapter.getVersion(e.collection,e.versionId);if(!t)throw new Error("Version not found");if(t.status==="published")throw new Error("Version is already published");await this.adapter.publishVersion(e);}async unpublishDocument(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:1e3});for(let o of r)if(o.status==="published"){await this.createVersion({collection:e,documentId:t,data:o.data,status:"draft",createdBy:"system",changeDescription:"Unpublished document"});break}}async revertToVersion(e,t,r,o){if(!await this.adapter.getVersion(e,r))throw new Error("Version not found");return await this.adapter.revertToVersion({collection:e,documentId:t,versionId:r,userId:o})}async getVersionHistory(e,t,r=20,o=0){return this.adapter.getVersions({collection:e,documentId:t,limit:r,offset:o})}async compareTwoVersions(e,t,r,o){return this.adapter.compareVersions({collection:e,documentId:t,versionA:r,versionB:o})}async getLatestDraft(e,t){return this.adapter.getLatestVersion(e,t)}async getPublishedVersion(e,t){return this.adapter.getPublishedVersion(e,t)}async getVersion(e,t){return this.adapter.getVersion(e,t)}async schedulePublish(e,t,r,o){if(!this.config.scheduleEnabled)throw new Error("Scheduled publishing is not enabled");if(!await this.adapter.getVersion(e,r))throw new Error("Version not found")}async deleteVersionHistory(e,t){await this.adapter.deleteVersions(e,t);}async pruneOldVersions(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:this.config.maxVersionsPerDocument+100});if(r.length<=this.config.maxVersionsPerDocument)return;r.slice(0,this.config.maxVersionsPerDocument);let n=r.slice(this.config.maxVersionsPerDocument);for(let i of n)if(i.status!=="published"){await this.adapter.deleteVersions(e,t);break}}};function _r(s,e){return new _(s,e)}function Mr(s){return s==="published"}function Hr(s){return s==="draft"}function Fr(s){return s==="archived"}function Nr(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Br(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Oe(s){return {collections:Nr(s.collections),globals:Br(s.globals),adapter:s.adapter,plugins:s.plugins,auth:s.auth,cors:s.cors,admin:s.admin,upload:s.upload,graphQL:s.graphQL,typescript:s.typescript,localization:s.localization,rateLimit:s.rateLimit,debug:s.debug}}var Kr=Oe;function $r(s){let{siteSettings:e,seoSettings:t,title:r,description:o,image:n,url:i}=s;if(!e)return "";let a=e.siteName||"",c=r||t?.defaultTitle||a,l=t?.titleTemplate,d=t?.separator||" | ",u=t?.siteNameInTitle!==false,p=l?l.replace(/\{\{title\}\}/g,c).replace(/\{\{siteName\}\}/g,u?a:"").replace(/\{\{separator\}\}/g,d).replace(/\s+/g," ").trim():c,y=o||t?.defaultDescription||e.siteDescription||"",m=n||e.siteOgImage?.url||"",D=i||e.siteUrl||"",f=`
|
|
2
2
|
<title>${p}</title>
|
|
3
3
|
<meta name="description" content="${y}">
|
|
4
4
|
`;e.siteFavicon?.url&&(f+=`
|
|
@@ -47,4 +47,4 @@ declare module 'kyro:collections' {
|
|
|
47
47
|
`;}return t+=` }
|
|
48
48
|
}
|
|
49
49
|
`,t}function co(s={}){return {APP_SECRET:{context:"server",access:"secret",type:"string",optional:false},DATABASE_URL:{context:"server",access:"secret",type:"string",optional:!s.requireDatabase},PUBLIC_KYRO_URL:{context:"client",access:"public",type:"string",optional:true,default:"http://localhost:4321"}}}function lo(s={}){return {name:"kyro-dev-toolbar-integration",hooks:{"astro:config:setup":({addDevToolbarApp:e})=>{s.enabled!==false&&typeof e=="function"&&e({id:"kyro-cms",name:"Kyro CMS",icon:'<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/></svg>',entrypoint:"@kyro-cms/core/dev-toolbar-app"});}}}}
|
|
50
|
-
Object.defineProperty(exports,"RedisAuthAdapter",{enumerable:true,get:function(){return chunk3RSMK4DA_cjs.a}});Object.defineProperty(exports,"allGlobalSettings",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.k}});Object.defineProperty(exports,"blogCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.q}});Object.defineProperty(exports,"coreGlobalSettings",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.l}});Object.defineProperty(exports,"createTemplateConfig",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.V}});Object.defineProperty(exports,"ecommerceCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.r}});Object.defineProperty(exports,"ecommerceGlobals",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.s}});Object.defineProperty(exports,"kitchenSinkCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.t}});Object.defineProperty(exports,"mediaCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.v}});Object.defineProperty(exports,"minimalCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.a}});Object.defineProperty(exports,"templateCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.U}});Object.defineProperty(exports,"kyro",{enumerable:true,get:function(){return chunkWNVWRRWE_cjs.a}});Object.defineProperty(exports,"AnalyticsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.s}});Object.defineProperty(exports,"CommentsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.t}});Object.defineProperty(exports,"ConfigValidationError",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.a}});Object.defineProperty(exports,"Kyro",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.y}});Object.defineProperty(exports,"KyroPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.p}});Object.defineProperty(exports,"LocalAdapter",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.A}});Object.defineProperty(exports,"PluginManager",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.q}});Object.defineProperty(exports,"Registry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.l}});Object.defineProperty(exports,"ReviewsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.u}});Object.defineProperty(exports,"SEOPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.r}});Object.defineProperty(exports,"WishlistPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.v}});Object.defineProperty(exports,"applyCollectionOverrides",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.x}});Object.defineProperty(exports,"collectionToCreateZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.h}});Object.defineProperty(exports,"collectionToUpdateZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.i}});Object.defineProperty(exports,"collectionToWhereZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.j}});Object.defineProperty(exports,"collectionToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.g}});Object.defineProperty(exports,"createKyro",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.z}});Object.defineProperty(exports,"createLocalAdapter",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.B}});Object.defineProperty(exports,"createRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.o}});Object.defineProperty(exports,"fieldToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.f}});Object.defineProperty(exports,"getRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.m}});Object.defineProperty(exports,"globalToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.k}});Object.defineProperty(exports,"presetPlugins",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.w}});Object.defineProperty(exports,"resetRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.n}});Object.defineProperty(exports,"validateCollection",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.b}});Object.defineProperty(exports,"validateConfig",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.e}});Object.defineProperty(exports,"validateFields",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.d}});Object.defineProperty(exports,"validateGlobal",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.c}});Object.defineProperty(exports,"autoBootstrap",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.d}});Object.defineProperty(exports,"bootstrapAdmin",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.a}});Object.defineProperty(exports,"bootstrapWithRetry",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.e}});Object.defineProperty(exports,"getBootstrapFromEnv",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.c}});Object.defineProperty(exports,"CSSGenerator",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.a}});Object.defineProperty(exports,"createAdminStyling",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.g}});Object.defineProperty(exports,"defaultDarkTheme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.d}});Object.defineProperty(exports,"defaultFieldStyling",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.h}});Object.defineProperty(exports,"defaultLightTheme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.c}});Object.defineProperty(exports,"ecommerce2026Theme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.e}});Object.defineProperty(exports,"generateCSSVariables",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.f}});Object.defineProperty(exports,"generateTailwindConfig",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.b}});Object.defineProperty(exports,"ALL_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.q}});Object.defineProperty(exports,"COMPLEX_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.n}});Object.defineProperty(exports,"LAYOUT_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.p}});Object.defineProperty(exports,"PRIMITIVE_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.m}});Object.defineProperty(exports,"RELATIONAL_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.o}});Object.defineProperty(exports,"isArrayField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.d}});Object.defineProperty(exports,"isBlocksField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.f}});Object.defineProperty(exports,"isGroupField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.e}});Object.defineProperty(exports,"isImageField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.h}});Object.defineProperty(exports,"isLayoutField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.k}});Object.defineProperty(exports,"isNumberField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.b}});Object.defineProperty(exports,"isRelationshipField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.c}});Object.defineProperty(exports,"isRichTextField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.i}});Object.defineProperty(exports,"isSelectField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.j}});Object.defineProperty(exports,"isTextField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.a}});Object.defineProperty(exports,"isUploadField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.g}});Object.defineProperty(exports,"normalizeRichTextValue",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.t}});Object.defineProperty(exports,"renderRichText",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.u}});Object.defineProperty(exports,"richTextStyles",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.s}});Object.defineProperty(exports,"createContext",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.a}});Object.defineProperty(exports,"createCountProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.g}});Object.defineProperty(exports,"createCreateProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.d}});Object.defineProperty(exports,"createDeleteProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.f}});Object.defineProperty(exports,"createDynamicRouter",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.h}});Object.defineProperty(exports,"createFindByIDProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.c}});Object.defineProperty(exports,"createFindProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.b}});Object.defineProperty(exports,"createKyroServer",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.i}});Object.defineProperty(exports,"createUpdateProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.e}});Object.defineProperty(exports,"buildGraphQLSchema",{enumerable:true,get:function(){return chunkHS2KNFAB_cjs.c}});Object.defineProperty(exports,"createGraphQLSchema",{enumerable:true,get:function(){return chunkHS2KNFAB_cjs.d}});Object.defineProperty(exports,"AuditLogger",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.n}});Object.defineProperty(exports,"InMemoryAuditLogger",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.p}});Object.defineProperty(exports,"InMemoryRateLimiter",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.m}});Object.defineProperty(exports,"MediaService",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.t}});Object.defineProperty(exports,"createAuditContext",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.o}});Object.defineProperty(exports,"createHonoApp",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.u}});Object.defineProperty(exports,"createLocalStorage",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.e}});Object.defineProperty(exports,"createRESTAPI",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.v}});Object.defineProperty(exports,"getAppSecret",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.i}});Object.defineProperty(exports,"getEncryptionKey",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.j}});Object.defineProperty(exports,"getSessionConfig",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.k}});Object.defineProperty(exports,"isEdgeRuntime",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.s}});Object.defineProperty(exports,"loadSecrets",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.h}});Object.defineProperty(exports,"resolveProvider",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.d}});Object.defineProperty(exports,"setDbAdapter",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.g}});Object.defineProperty(exports,"ConfigService",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.j}});Object.defineProperty(exports,"EmailTransport",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.k}});Object.defineProperty(exports,"PasswordPolicy",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.l}});Object.defineProperty(exports,"getEmailTemplates",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.i}});Object.defineProperty(exports,"renderAccountLocked",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.g}});Object.defineProperty(exports,"renderBaseLayout",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.a}});Object.defineProperty(exports,"renderMagicLink",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.f}});Object.defineProperty(exports,"renderPasswordChanged",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.e}});Object.defineProperty(exports,"renderResetPassword",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.c}});Object.defineProperty(exports,"renderUserInvite",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.h}});Object.defineProperty(exports,"renderVerifyEmail",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.b}});Object.defineProperty(exports,"renderWelcome",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.d}});Object.defineProperty(exports,"SQLiteAuthAdapter",{enumerable:true,get:function(){return chunkHOP4D5XZ_cjs.a}});Object.defineProperty(exports,"ALL_WEBHOOK_EVENTS",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.e}});Object.defineProperty(exports,"WEBHOOK_COLLECTION",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.f}});Object.defineProperty(exports,"WEBHOOK_DELIVERY_COLLECTION",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.g}});Object.defineProperty(exports,"WEBHOOK_EVENTS",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.d}});Object.defineProperty(exports,"WebhookService",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.n}});Object.defineProperty(exports,"buildDeliveryRecord",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.l}});Object.defineProperty(exports,"createTestPayload",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.m}});Object.defineProperty(exports,"createWebhookService",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.o}});Object.defineProperty(exports,"deliverWebhook",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.j}});Object.defineProperty(exports,"deliverWithRetry",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.k}});Object.defineProperty(exports,"generateWebhookSecret",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.i}});Object.defineProperty(exports,"signPayload",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.h}});Object.defineProperty(exports,"evaluateAccess",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.a}});Object.defineProperty(exports,"getWhereClause",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.c}});Object.defineProperty(exports,"mergeWhereClauses",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.b}});Object.defineProperty(exports,"KyroPubSub",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.b}});Object.defineProperty(exports,"KyroWSServer",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.c}});Object.defineProperty(exports,"PubSub",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.a}});Object.defineProperty(exports,"createWSServer",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.d}});Object.defineProperty(exports,"DrizzleAdapter",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.c}});Object.defineProperty(exports,"collectionToDrizzleSchema",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.b}});Object.defineProperty(exports,"createDatabase",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.f}});Object.defineProperty(exports,"createDrizzleAdapter",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.d}});Object.defineProperty(exports,"fieldToDrizzleType",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.a}});Object.defineProperty(exports,"runMigrations",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.g}});Object.defineProperty(exports,"seedDefaultRoles",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.h}});Object.defineProperty(exports,"PostgresAuthAdapter",{enumerable:true,get:function(){return chunkGYQMNXXW_cjs.a}});Object.defineProperty(exports,"MongoDBAdapter",{enumerable:true,get:function(){return chunk3Q2WUG63_cjs.a}});Object.defineProperty(exports,"createMongoDBAdapter",{enumerable:true,get:function(){return chunk3Q2WUG63_cjs.b}});Object.defineProperty(exports,"MongoDBAuthAdapter",{enumerable:true,get:function(){return chunkQCA3AP3M_cjs.a}});Object.defineProperty(exports,"AbstractBaseAdapter",{enumerable:true,get:function(){return chunkFHJJKFAU_cjs.a}});Object.defineProperty(exports,"z",{enumerable:true,get:function(){return zod.z}});exports.AccountLockout=x;exports.Auth=U;exports.InMemoryAccountLockout=k;exports.InMemoryAuthAdapter=T;exports.NeonAdapter=R;exports.RateLimiter=P;exports.TursoAdapter=v;exports.VersionManager=_;exports.authConfig=Ee;exports.createAuth=Vr;exports.createAuthConfig=$;exports.createAuthStorage=He;exports.createNeonAdapter=ve;exports.createStorage=G;exports.createTursoAdapter=De;exports.createVersionManager=_r;exports.defineConfig=Oe;exports.defineKyroConfig=Kr;exports.generateAnalyticsTags=zr;exports.generateKyroAstroTypes=ao;exports.generateSeoTags=$r;exports.getDefaultDraftPublishConfig=V;exports.getPaymentConfig=Qr;exports.getPaymentConfigFromSettings=_e;exports.getSocialLinks=qr;exports.getSocialLinksFromSettings=Ue;exports.getStoreConfig=Gr;exports.getStoreConfigFromSettings=Ve;exports.isArchived=Fr;exports.isDraft=Hr;exports.isPublished=Mr;exports.kyroAction=no;exports.kyroAuthMiddleware=io;exports.kyroDevToolbarIntegration=lo;exports.kyroEnvSchema=co;exports.kyroLoader=oo;exports.runFieldHooks=Cr;exports.runHooks=Re;
|
|
50
|
+
Object.defineProperty(exports,"RedisAuthAdapter",{enumerable:true,get:function(){return chunk3RSMK4DA_cjs.a}});Object.defineProperty(exports,"allGlobalSettings",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.k}});Object.defineProperty(exports,"blogCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.q}});Object.defineProperty(exports,"coreGlobalSettings",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.l}});Object.defineProperty(exports,"createTemplateConfig",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.V}});Object.defineProperty(exports,"ecommerceCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.r}});Object.defineProperty(exports,"ecommerceGlobals",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.s}});Object.defineProperty(exports,"kitchenSinkCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.t}});Object.defineProperty(exports,"mediaCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.v}});Object.defineProperty(exports,"minimalCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.a}});Object.defineProperty(exports,"templateCollections",{enumerable:true,get:function(){return chunkRXZ3IUWM_cjs.U}});Object.defineProperty(exports,"kyro",{enumerable:true,get:function(){return chunkWNVWRRWE_cjs.a}});Object.defineProperty(exports,"AnalyticsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.s}});Object.defineProperty(exports,"CommentsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.t}});Object.defineProperty(exports,"ConfigValidationError",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.a}});Object.defineProperty(exports,"Kyro",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.y}});Object.defineProperty(exports,"KyroPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.p}});Object.defineProperty(exports,"LocalAdapter",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.A}});Object.defineProperty(exports,"PluginManager",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.q}});Object.defineProperty(exports,"Registry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.l}});Object.defineProperty(exports,"ReviewsPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.u}});Object.defineProperty(exports,"SEOPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.r}});Object.defineProperty(exports,"WishlistPlugin",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.v}});Object.defineProperty(exports,"applyCollectionOverrides",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.x}});Object.defineProperty(exports,"collectionToCreateZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.h}});Object.defineProperty(exports,"collectionToUpdateZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.i}});Object.defineProperty(exports,"collectionToWhereZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.j}});Object.defineProperty(exports,"collectionToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.g}});Object.defineProperty(exports,"createKyro",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.z}});Object.defineProperty(exports,"createLocalAdapter",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.B}});Object.defineProperty(exports,"createRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.o}});Object.defineProperty(exports,"fieldToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.f}});Object.defineProperty(exports,"getRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.m}});Object.defineProperty(exports,"globalToZod",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.k}});Object.defineProperty(exports,"presetPlugins",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.w}});Object.defineProperty(exports,"resetRegistry",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.n}});Object.defineProperty(exports,"validateCollection",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.b}});Object.defineProperty(exports,"validateConfig",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.e}});Object.defineProperty(exports,"validateFields",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.d}});Object.defineProperty(exports,"validateGlobal",{enumerable:true,get:function(){return chunk4KFXG5ZB_cjs.c}});Object.defineProperty(exports,"autoBootstrap",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.d}});Object.defineProperty(exports,"bootstrapAdmin",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.a}});Object.defineProperty(exports,"bootstrapWithRetry",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.e}});Object.defineProperty(exports,"getBootstrapFromEnv",{enumerable:true,get:function(){return chunkQBJT7XLN_cjs.c}});Object.defineProperty(exports,"CSSGenerator",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.a}});Object.defineProperty(exports,"createAdminStyling",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.g}});Object.defineProperty(exports,"defaultDarkTheme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.d}});Object.defineProperty(exports,"defaultFieldStyling",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.h}});Object.defineProperty(exports,"defaultLightTheme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.c}});Object.defineProperty(exports,"ecommerce2026Theme",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.e}});Object.defineProperty(exports,"generateCSSVariables",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.f}});Object.defineProperty(exports,"generateTailwindConfig",{enumerable:true,get:function(){return chunk2BTRHVT3_cjs.b}});Object.defineProperty(exports,"ALL_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.q}});Object.defineProperty(exports,"COMPLEX_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.n}});Object.defineProperty(exports,"LAYOUT_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.p}});Object.defineProperty(exports,"PRIMITIVE_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.m}});Object.defineProperty(exports,"RELATIONAL_FIELD_TYPES",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.o}});Object.defineProperty(exports,"isArrayField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.d}});Object.defineProperty(exports,"isBlocksField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.f}});Object.defineProperty(exports,"isGroupField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.e}});Object.defineProperty(exports,"isImageField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.h}});Object.defineProperty(exports,"isLayoutField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.k}});Object.defineProperty(exports,"isNumberField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.b}});Object.defineProperty(exports,"isRelationshipField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.c}});Object.defineProperty(exports,"isRichTextField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.i}});Object.defineProperty(exports,"isSelectField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.j}});Object.defineProperty(exports,"isTextField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.a}});Object.defineProperty(exports,"isUploadField",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.g}});Object.defineProperty(exports,"normalizeRichTextValue",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.t}});Object.defineProperty(exports,"renderRichText",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.u}});Object.defineProperty(exports,"richTextStyles",{enumerable:true,get:function(){return chunkSK2Q4PRV_cjs.s}});Object.defineProperty(exports,"createContext",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.a}});Object.defineProperty(exports,"createCountProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.g}});Object.defineProperty(exports,"createCreateProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.d}});Object.defineProperty(exports,"createDeleteProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.f}});Object.defineProperty(exports,"createDynamicRouter",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.h}});Object.defineProperty(exports,"createFindByIDProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.c}});Object.defineProperty(exports,"createFindProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.b}});Object.defineProperty(exports,"createKyroServer",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.i}});Object.defineProperty(exports,"createUpdateProcedure",{enumerable:true,get:function(){return chunkZUVP4UK7_cjs.e}});Object.defineProperty(exports,"buildGraphQLSchema",{enumerable:true,get:function(){return chunkHS2KNFAB_cjs.c}});Object.defineProperty(exports,"createGraphQLSchema",{enumerable:true,get:function(){return chunkHS2KNFAB_cjs.d}});Object.defineProperty(exports,"AuditLogger",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.n}});Object.defineProperty(exports,"InMemoryAuditLogger",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.p}});Object.defineProperty(exports,"InMemoryRateLimiter",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.m}});Object.defineProperty(exports,"MediaService",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.t}});Object.defineProperty(exports,"createAuditContext",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.o}});Object.defineProperty(exports,"createHonoApp",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.u}});Object.defineProperty(exports,"createLocalStorage",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.e}});Object.defineProperty(exports,"createRESTAPI",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.v}});Object.defineProperty(exports,"getAppSecret",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.i}});Object.defineProperty(exports,"getEncryptionKey",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.j}});Object.defineProperty(exports,"getSessionConfig",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.k}});Object.defineProperty(exports,"isEdgeRuntime",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.s}});Object.defineProperty(exports,"loadSecrets",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.h}});Object.defineProperty(exports,"resolveProvider",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.d}});Object.defineProperty(exports,"setDbAdapter",{enumerable:true,get:function(){return chunk2YRM7CZZ_cjs.g}});Object.defineProperty(exports,"ConfigService",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.j}});Object.defineProperty(exports,"EmailTransport",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.k}});Object.defineProperty(exports,"PasswordPolicy",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.l}});Object.defineProperty(exports,"getEmailTemplates",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.i}});Object.defineProperty(exports,"renderAccountLocked",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.g}});Object.defineProperty(exports,"renderBaseLayout",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.a}});Object.defineProperty(exports,"renderMagicLink",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.f}});Object.defineProperty(exports,"renderPasswordChanged",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.e}});Object.defineProperty(exports,"renderResetPassword",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.c}});Object.defineProperty(exports,"renderUserInvite",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.h}});Object.defineProperty(exports,"renderVerifyEmail",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.b}});Object.defineProperty(exports,"renderWelcome",{enumerable:true,get:function(){return chunk5K4YG5DA_cjs.d}});Object.defineProperty(exports,"SQLiteAuthAdapter",{enumerable:true,get:function(){return chunkHOP4D5XZ_cjs.a}});Object.defineProperty(exports,"ALL_WEBHOOK_EVENTS",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.e}});Object.defineProperty(exports,"WEBHOOK_COLLECTION",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.f}});Object.defineProperty(exports,"WEBHOOK_DELIVERY_COLLECTION",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.g}});Object.defineProperty(exports,"WEBHOOK_EVENTS",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.d}});Object.defineProperty(exports,"WebhookService",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.n}});Object.defineProperty(exports,"buildDeliveryRecord",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.l}});Object.defineProperty(exports,"createTestPayload",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.m}});Object.defineProperty(exports,"createWebhookService",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.o}});Object.defineProperty(exports,"deliverWebhook",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.j}});Object.defineProperty(exports,"deliverWithRetry",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.k}});Object.defineProperty(exports,"generateWebhookSecret",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.i}});Object.defineProperty(exports,"signPayload",{enumerable:true,get:function(){return chunkILEZ3NYX_cjs.h}});Object.defineProperty(exports,"evaluateAccess",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.a}});Object.defineProperty(exports,"getWhereClause",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.c}});Object.defineProperty(exports,"mergeWhereClauses",{enumerable:true,get:function(){return chunkNY47CFVP_cjs.b}});Object.defineProperty(exports,"KyroPubSub",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.b}});Object.defineProperty(exports,"KyroWSServer",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.c}});Object.defineProperty(exports,"PubSub",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.a}});Object.defineProperty(exports,"createWSServer",{enumerable:true,get:function(){return chunkG3J2EU5D_cjs.d}});Object.defineProperty(exports,"DrizzleAdapter",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.c}});Object.defineProperty(exports,"collectionToDrizzleSchema",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.b}});Object.defineProperty(exports,"createDatabase",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.f}});Object.defineProperty(exports,"createDrizzleAdapter",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.d}});Object.defineProperty(exports,"fieldToDrizzleType",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.a}});Object.defineProperty(exports,"runMigrations",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.g}});Object.defineProperty(exports,"seedDefaultRoles",{enumerable:true,get:function(){return chunkFUWPXR6W_cjs.h}});Object.defineProperty(exports,"PostgresAuthAdapter",{enumerable:true,get:function(){return chunkGYQMNXXW_cjs.a}});Object.defineProperty(exports,"MongoDBAdapter",{enumerable:true,get:function(){return chunk3Q2WUG63_cjs.a}});Object.defineProperty(exports,"createMongoDBAdapter",{enumerable:true,get:function(){return chunk3Q2WUG63_cjs.b}});Object.defineProperty(exports,"MongoDBAuthAdapter",{enumerable:true,get:function(){return chunkQCA3AP3M_cjs.a}});Object.defineProperty(exports,"AbstractBaseAdapter",{enumerable:true,get:function(){return chunkFHJJKFAU_cjs.a}});Object.defineProperty(exports,"z",{enumerable:true,get:function(){return zod.z}});exports.AccountLockout=x;exports.Auth=U;exports.InMemoryAccountLockout=k;exports.InMemoryAuthAdapter=T;exports.NeonAdapter=R;exports.RateLimiter=P;exports.TursoAdapter=v;exports.VersionManager=_;exports.authConfig=Ee;exports.createAuth=Vr;exports.createAuthConfig=$;exports.createAuthStorage=He;exports.createNeonAdapter=ve;exports.createStorage=G;exports.createTursoAdapter=De;exports.createVersionManager=_r;exports.defineConfig=Oe;exports.defineKyroConfig=Kr;exports.generateAnalyticsTags=zr;exports.generateKyroAstroTypes=ao;exports.generateSeoTags=$r;exports.getDefaultDraftPublishConfig=V;exports.getPaymentConfig=Qr;exports.getPaymentConfigFromSettings=_e;exports.getSocialLinks=qr;exports.getSocialLinksFromSettings=Ue;exports.getStoreConfig=Gr;exports.getStoreConfigFromSettings=Ve;exports.isArchived=Fr;exports.isDraft=Hr;exports.isPublished=Mr;exports.kyroAction=no;exports.kyroAuthMiddleware=io;exports.kyroDevToolbarIntegration=lo;exports.kyroEnvSchema=co;exports.kyroLoader=oo;exports.runFieldHooks=Cr;exports.runHooks=Re;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export{a as RedisAuthAdapter}from'./chunk-QOCHBPMK.js';export{k as allGlobalSettings,q as blogCollections,l as coreGlobalSettings,V as createTemplateConfig,r as ecommerceCollections,s as ecommerceGlobals,t as kitchenSinkCollections,v as mediaCollections,a as minimalCollections,U as templateCollections}from'./chunk-SZNM3F5V.js';export{a as kyro}from'./chunk-FVRNWRSG.js';export{s as AnalyticsPlugin,t as CommentsPlugin,a as ConfigValidationError,y as Kyro,p as KyroPlugin,A as LocalAdapter,q as PluginManager,l as Registry,u as ReviewsPlugin,r as SEOPlugin,v as WishlistPlugin,x as applyCollectionOverrides,h as collectionToCreateZod,i as collectionToUpdateZod,j as collectionToWhereZod,g as collectionToZod,z as createKyro,B as createLocalAdapter,o as createRegistry,f as fieldToZod,m as getRegistry,k as globalToZod,w as presetPlugins,n as resetRegistry,b as validateCollection,e as validateConfig,d as validateFields,c as validateGlobal}from'./chunk-DZMIMB5W.js';export{d as autoBootstrap,a as bootstrapAdmin,e as bootstrapWithRetry,c as getBootstrapFromEnv}from'./chunk-6MSPBK3W.js';import'./chunk-NZ35PV5R.js';export{a as CSSGenerator,g as createAdminStyling,d as defaultDarkTheme,h as defaultFieldStyling,c as defaultLightTheme,e as ecommerce2026Theme,f as generateCSSVariables,b as generateTailwindConfig}from'./chunk-UHFDH3PG.js';export{q as ALL_FIELD_TYPES,n as COMPLEX_FIELD_TYPES,p as LAYOUT_FIELD_TYPES,m as PRIMITIVE_FIELD_TYPES,o as RELATIONAL_FIELD_TYPES,d as isArrayField,f as isBlocksField,e as isGroupField,h as isImageField,k as isLayoutField,b as isNumberField,c as isRelationshipField,i as isRichTextField,j as isSelectField,a as isTextField,g as isUploadField,t as normalizeRichTextValue,u as renderRichText,s as richTextStyles}from'./chunk-INB4LNA6.js';import'./chunk-5SEHX7ON.js';export{a as createContext,g as createCountProcedure,d as createCreateProcedure,f as createDeleteProcedure,h as createDynamicRouter,c as createFindByIDProcedure,b as createFindProcedure,i as createKyroServer,e as createUpdateProcedure}from'./chunk-LHW4R367.js';export{c as buildGraphQLSchema,d as createGraphQLSchema}from'./chunk-PP7W5UKL.js';import {l,n,m,p,q as q$1}from'./chunk-4DJYAD4L.js';export{n as AuditLogger,p as InMemoryAuditLogger,m as InMemoryRateLimiter,t as MediaService,o as createAuditContext,u as createHonoApp,e as createLocalStorage,v as createRESTAPI,i as getAppSecret,j as getEncryptionKey,k as getSessionConfig,s as isEdgeRuntime,h as loadSecrets,d as resolveProvider,g as setDbAdapter}from'./chunk-4DJYAD4L.js';import {k as k$1,l as l$1}from'./chunk-6J27P5D6.js';export{j as ConfigService,k as EmailTransport,l as PasswordPolicy,i as getEmailTemplates,g as renderAccountLocked,a as renderBaseLayout,f as renderMagicLink,e as renderPasswordChanged,c as renderResetPassword,h as renderUserInvite,b as renderVerifyEmail,d as renderWelcome}from'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IETGL7WJ.js';import {a as a$2}from'./chunk-IKOXCJYO.js';export{a as SQLiteAuthAdapter}from'./chunk-IKOXCJYO.js';import'./chunk-NRLIGDYF.js';export{e as ALL_WEBHOOK_EVENTS,f as WEBHOOK_COLLECTION,g as WEBHOOK_DELIVERY_COLLECTION,d as WEBHOOK_EVENTS,n as WebhookService,l as buildDeliveryRecord,m as createTestPayload,o as createWebhookService,j as deliverWebhook,k as deliverWithRetry,i as generateWebhookSecret,h as signPayload}from'./chunk-FVZ5RFLO.js';export{a as evaluateAccess,c as getWhereClause,b as mergeWhereClauses}from'./chunk-HLSB2MCK.js';export{b as KyroPubSub,c as KyroWSServer,a as PubSub,d as createWSServer}from'./chunk-GKYEJ2UF.js';import'./chunk-PP5S2UBV.js';export{c as DrizzleAdapter,b as collectionToDrizzleSchema,f as createDatabase,d as createDrizzleAdapter,a as fieldToDrizzleType,g as runMigrations,h as seedDefaultRoles}from'./chunk-5KSRMBEO.js';import {a as a$3}from'./chunk-RHCWCG3O.js';export{a as PostgresAuthAdapter}from'./chunk-RHCWCG3O.js';import'./chunk-OG7CNQGU.js';export{a as MongoDBAdapter,b as createMongoDBAdapter}from'./chunk-VGQ4VUG6.js';import {a as a$1}from'./chunk-6ROHVUXF.js';export{a as MongoDBAuthAdapter}from'./chunk-6ROHVUXF.js';import {a as a$4}from'./chunk-5KOQYQEE.js';export{a as AbstractBaseAdapter}from'./chunk-5KOQYQEE.js';import {a}from'./chunk-6SPPR5JZ.js';import'./chunk-4RMFCTWH.js';import'./chunk-KDNYHLD2.js';import'./chunk-5J6HXUF6.js';import W,{randomBytes}from'crypto';import {readFileSync}from'fs';import Me,{join,resolve}from'path';import {z as z$1}from'zod';export{z}from'zod';import {createStorage}from'unstorage';import Jr from'unstorage/drivers/indexedb';import eo from'unstorage/drivers/fs';async function Re(s,e){let t=e.data;for(let r of s){let o=await r({...e,data:t});o!==void 0&&(t=o);}return t}async function Cr(s,e){return Re(s,e)}var R=class extends a$4{connectionString;constructor(e){super(),this.connectionString=e.connectionString;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.connectionString)throw new Error("NeonAdapter: Connection string is required.");try{let r=await fetch(`${this.connectionString}/sql`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e,params:t})});return r.ok?(await r.json()).rows||[]:[]}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function ve(s){return new R(s)}var v=class extends a$4{url;authToken;constructor(e){super(),this.url=e.url.replace(/^libsql:\/\//,"https://"),this.authToken=e.authToken;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.url)throw new Error("TursoAdapter: Database URL is required.");try{let r={"Content-Type":"application/json"};this.authToken&&(r.Authorization=`Bearer ${this.authToken}`);let o=await fetch(`${this.url}/v2/pipeline`,{method:"POST",headers:r,body:JSON.stringify({requests:[{type:"execute",stmt:{sql:e,args:t.map(c=>({type:"text",value:String(c)}))}},{type:"close"}]})});if(!o.ok)return [];let i=(await o.json())?.results?.[0]?.response?.result;if(!i||!i.rows)return [];let a=i.cols.map(c=>c.name);return i.rows.map(c=>{let l={};return a.forEach((d,u)=>{l[d]=c[u]?.value??null;}),l})}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function De(s){return new v(s)}var Rr={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3},x=class{redis;prefix;config;constructor(e,t={},r="kyro:lockout:"){this.redis=e,this.prefix=r,this.config={...Rr,...t};}lockKey(e){return `${this.prefix}${e}`}historyKey(e){return `${this.prefix}${e}:history`}async checkLockout(e){let t=this.lockKey(e),r=await this.redis.hgetall(t);if(!r||Object.keys(r).length===0)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let o=parseInt(r.attempts,10),n=r.lockedUntil?new Date(parseInt(r.lockedUntil,10)):void 0;return n&&n>new Date?{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:o}:n&&n<=new Date?(await this.unlockAccount(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0}):{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=this.lockKey(e),r=this.historyKey(e),o=Date.now(),n=await this.redis.hincrby(t,"attempts",1);if(await this.redis.hset(t,"lastAttempt",o.toString()),await this.redis.lpush(r,o.toString()),await this.redis.ltrim(r,0,99),n>=this.config.maxAttempts){let i=new Date(o+this.config.lockDuration);return await this.redis.hset(t,{lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),await this.redis.expire(t,Math.ceil(this.config.lockDuration/1e3)+3600),{locked:true,attemptsRemaining:0,lockedUntil:i,totalAttempts:n}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-n),totalAttempts:n}}async lockAccount(e,t){let r=this.lockKey(e),o=Date.now(),n=t||this.config.lockDuration,i=new Date(o+n),a=this.redis.pipeline();a.hset(r,{attempts:this.config.maxAttempts.toString(),lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),a.expire(r,Math.ceil(n/1e3)+3600),await a.exec();}async unlockAccount(e){let t=this.lockKey(e);await this.redis.del(t);}async resetAttempts(e){let t=this.lockKey(e);(await this.redis.hgetall(t)).lockedAt?await this.redis.hset(t,{attempts:"0",lockedAt:"",lockedUntil:""}):await this.redis.del(t);}async getLockoutHistory(e,t=10){let r=this.historyKey(e);return (await this.redis.lrange(r,0,t-1)).map(n=>new Date(parseInt(n,10)))}async getLockoutStats(e){let t=this.historyKey(e),r=await this.redis.lrange(t,0,-1),o=r.filter((i,a)=>(a+1)%this.config.maxAttempts===0).length,n=await this.redis.hget(this.lockKey(e),"lockedAt");return {totalFailedAttempts:r.length,lockoutCount:o,lastLockout:n?new Date(parseInt(n,10)):null,averageAttemptsBeforeLockout:o>0?this.config.maxAttempts:0}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};var vr={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}},P=class{redis;prefix;limits;userLimits;constructor(e,t,r,o="kyro:ratelimit:"){this.redis=e,this.prefix=o,this.limits={...vr,...t},this.userLimits=r||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${this.prefix}${e}:${t}`}async check(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window,a=this.redis.pipeline();a.zremrangebyscore(o,0,i),a.zcard(o),a.zadd(o,n,`${n}:${Math.random()}`),a.expire(o,Math.ceil(r.window/1e3)+1);let l=(await a.exec())?.[1]?.[1]||0;if(l>=r.max){let d=await this.redis.zrange(o,0,0,"WITHSCORES"),u=d.length>1?parseInt(d[1],10)+r.window:n+r.window;return {allowed:false,remaining:0,resetAt:u,retryAfter:Math.ceil((u-n)/1e3)}}return {allowed:true,remaining:r.max-l-1,resetAt:n+r.window}}async checkUser(e,t,r){let o=this.userLimits[e]||this.userLimits["user:api"],n=this.getKey(`user:${e}:${t}`,r),i=Date.now(),a=i-o.window,c=this.redis.pipeline();c.zremrangebyscore(n,0,a),c.zcard(n),c.zadd(n,i,`${i}:${Math.random()}`),c.expire(n,Math.ceil(o.window/1e3)+1);let d=(await c.exec())?.[1]?.[1]||0;if(d>=o.max){let u=await this.redis.zrange(n,0,0,"WITHSCORES"),p=u.length>1?parseInt(u[1],10)+o.window:i+o.window;return {allowed:false,remaining:0,resetAt:p,retryAfter:Math.ceil((p-i)/1e3)}}return {allowed:true,remaining:o.max-d-1,resetAt:i+o.window}}async reset(e,t){let r=this.getKey(e,t);await this.redis.del(r);}async resetUser(e,t,r){let o=this.getKey(`user:${e}:${t}`,r);await this.redis.del(o);}async getStatus(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window;await this.redis.zremrangebyscore(o,0,i);let a=await this.redis.zcard(o);return {count:a,limit:r.max,remaining:Math.max(0,r.max-a),resetAt:n+r.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}};var T=class{users=new Map;sessions=new Map;refreshTokens=new Map;emailToUserId=new Map;passwordHistory=new Map;emailVerificationTokens=new Map;passwordResetTokens=new Map;auditLogs=[];externalDb=false;constructor(){}async connect(){}async disconnect(){this.users.clear(),this.sessions.clear(),this.refreshTokens.clear(),this.emailToUserId.clear(),this.passwordHistory.clear();}async createUser(e){let t=randomBytes(16).toString("hex"),r=new Date().toISOString(),o=await this.hashPassword(e.password),n={id:t,email:e.email.toLowerCase(),passwordHash:o,role:e.role||"customer",tenantId:e.tenantId,createdAt:r,updatedAt:r};return this.users.set(t,n),this.emailToUserId.set(e.email.toLowerCase(),t),this.passwordHistory.set(t,[]),n}async findUserByEmail(e){let t=this.emailToUserId.get(e.toLowerCase());return t?this.findUserById(t):null}async findUserById(e){return this.users.get(e)||null}async updateUser(e,t){let r=await this.findUserById(e);if(!r)return null;let o={...r,...t,id:e,updatedAt:new Date().toISOString()};return t.email&&t.email!==r.email&&(this.emailToUserId.delete(r.email.toLowerCase()),this.emailToUserId.set(t.email.toLowerCase(),e)),this.users.set(e,o),o}async deleteUser(e){let t=await this.findUserById(e);return t?(this.users.delete(e),this.emailToUserId.delete(t.email.toLowerCase()),this.refreshTokens.forEach((r,o)=>{this.sessions.get(r)?.userId===e&&(this.refreshTokens.delete(o),this.sessions.delete(r));}),this.passwordHistory.delete(e),this.sessions.forEach((r,o)=>{r.userId===e&&this.sessions.delete(o);}),true):false}async hashPassword(e){return (await import('bcryptjs')).default.hash(e,12)}async verifyPassword(e,t){let r=await this.findUserByEmail(e);return !r||!r.passwordHash?null:await(await import('bcryptjs')).default.compare(t,r.passwordHash)?r:null}async createSession(e,t={}){let r=randomBytes(32).toString("hex"),o=randomBytes(32).toString("base64url"),n=randomBytes(32).toString("base64url"),i=new Date,a={id:r,userId:e,token:o,refreshToken:n,expiresAt:new Date(i.getTime()+86400*1e3).toISOString(),createdAt:i.toISOString(),ipAddress:t.ipAddress,userAgent:t.userAgent};return this.sessions.set(r,a),this.refreshTokens.set(n,r),a}async findSessionByToken(e){return this.sessions.get(e)||null}async findSessionByRefreshToken(e){let t=this.refreshTokens.get(e);return t&&this.sessions.get(t)||null}async deleteSession(e){let t=this.sessions.get(e);return t?(t.refreshToken&&this.refreshTokens.delete(t.refreshToken),this.sessions.delete(e),true):false}async deleteUserSessions(e){let t=0;return this.sessions.forEach((r,o)=>{r.userId===e&&(r.refreshToken&&this.refreshTokens.delete(r.refreshToken),this.sessions.delete(o),t++);}),t}async addPasswordToHistory(e,t){let r=this.passwordHistory.get(e)||[];r.push(t),r.length>5&&r.splice(0,r.length-5),this.passwordHistory.set(e,r);}async getPasswordHistory(e,t=5){return this.passwordHistory.get(e)||[]}async isPasswordInHistory(e,t,r=5){let o=await this.getPasswordHistory(t,r),n=(await import('bcryptjs')).default;for(let i of o)if(await n.compare(e,i))return true;return false}async createEmailVerificationToken(e){let t=randomBytes(32).toString("hex"),r=new Date(Date.now()+1440*60*1e3);return this.emailVerificationTokens.set(t,{userId:e,expiresAt:r}),{token:t,expiresAt:r}}async verifyEmailToken(e){let t=this.emailVerificationTokens.get(e);return !t||t.expiresAt<new Date?(this.emailVerificationTokens.delete(e),{success:false,error:"Invalid or expired token"}):(this.emailVerificationTokens.delete(e),{success:true,userId:t.userId})}async createPasswordResetToken(e){let t=await this.findUserByEmail(e);if(!t)return {token:"",expiresAt:new Date,error:"User not found"};let r=randomBytes(32).toString("hex"),o=new Date(Date.now()+3600*1e3);return this.passwordResetTokens.set(r,{userId:t.id,expiresAt:o}),{token:r,expiresAt:o}}async resetPasswordWithToken(e,t){let r=this.passwordResetTokens.get(e);if(!r||r.expiresAt<new Date)return this.passwordResetTokens.delete(e),{success:false,error:"Invalid or expired token"};let o=await this.hashPassword(t);return await this.updateUser(r.userId,{passwordHash:o}),this.passwordResetTokens.delete(e),{success:true}}async hasAnyUsers(){return this.users.size>0}async findAuditLogs(e){let{limit:t=50,offset:r=0}=e,o=this.auditLogs.slice().reverse();return e.userId&&(o=o.filter(n=>n.userId===e.userId)),e.action&&(Array.isArray(e.action)?o=o.filter(n=>e.action.includes(String(n.action))):o=o.filter(n=>n.action===e.action)),e.resource&&(o=o.filter(n=>n.resource===e.resource)),e.success!==void 0&&(o=o.filter(n=>n.success===e.success)),{logs:o.slice(r,r+t),total:o.length}}async createAuditLog(e){let t=randomBytes(16).toString("hex"),o={...e,id:t,timestamp:new Date};return this.auditLogs.push(o),o}};var k=class{storage=new Map;history=new Map;config;constructor(e={}){this.config={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3,...e};}async checkLockout(e){let t=Date.now(),r=this.storage.get(e);if(r&&r.lockedUntil!==null&&r.lockedUntil<=t)return await this.resetAttempts(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};if(!r)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let{attempts:o,lockedUntil:n}=r;return n!==null&&n>t?{locked:true,attemptsRemaining:0,lockedUntil:new Date(n),totalAttempts:o}:{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=Date.now(),r=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};r.attempts+=1,r.lastAttempt=t;let o=this.history.get(e)||[];if(o.push(t),o.length>100&&o.splice(0,o.length-100),this.history.set(e,o),this.storage.set(e,r),r.attempts>=this.config.maxAttempts){let n=new Date(t+this.config.lockDuration);return r.lockedAt=t,r.lockedUntil=n.getTime(),this.storage.set(e,r),{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:r.attempts}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-r.attempts),totalAttempts:r.attempts}}async lockAccount(e,t){let r=Date.now(),o=t||this.config.lockDuration,n=new Date(r+o),i=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};i.attempts=this.config.maxAttempts,i.lockedAt=r,i.lockedUntil=n.getTime(),this.storage.set(e,i);}async unlockAccount(e){await this.resetAttempts(e);}async resetAttempts(e){let t=this.storage.get(e);t&&(t.attempts=0,t.lockedAt=null,t.lockedUntil=null,this.storage.set(e,t)),this.history.delete(e);}async getLockoutHistory(e,t=10){return (this.history.get(e)||[]).slice(-t).reverse().map(o=>new Date(o))}async getLockoutStats(e){let r=(this.history.get(e)||[]).length,o=Math.floor(r/this.config.maxAttempts),n=null,i=this.storage.get(e);i&&i.lockedAt!==null&&(n=new Date(i.lockedAt));let a=o>0?this.config.maxAttempts:0;return {totalFailedAttempts:r,lockoutCount:o,lastLockout:n,averageAttemptsBeforeLockout:a}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};function h(s,e=""){return process.env[s]||e}function A(s,e=false){let t=process.env[s];return t?t.toLowerCase()==="true":e}function g(s,e=0){let t=process.env[s];return t?parseInt(t,10):e}function Ie(){let s=process.env.KYRO_AUTH_DATABASE?.toLowerCase();if(s&&["sqlite","postgres","mongodb","memory"].includes(s))return s;try{let e=join(process.cwd(),"kyro.config.ts"),t=readFileSync(e,"utf8");if(t.includes("createLocalAdapter"))return "sqlite";if(t.includes("createDrizzleAdapter"))return t.includes("postgres")||t.includes("postgresql"),"postgres";if(t.includes("createMongoDBAdapter"))return "mongodb"}catch{}return "memory"}async function Lr(s){let e=process.cwd(),t=e.endsWith("admin")?join(e,".."):e,r=resolve(t,"data","auth.db");switch(s){case "sqlite":return new a$2({path:h("KYRO_AUTH_DB_PATH",r)});case "postgres":{let o=h("DATABASE_URL","");if(o){let n,i;try{n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}catch{a(["postgres","drizzle-orm"]),n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}let a$1=i.default(o,{onnotice:()=>{}}),c=n(a$1);return new a$3({db:c})}return new a$2({path:h("KYRO_AUTH_DB_PATH",r)})}case "mongodb":{let o=h("MONGODB_URI","");if(o){let n;try{n=(await import('mongodb')).MongoClient;}catch{a(["mongodb"]),n=(await import('mongodb')).MongoClient;}let i=new n(o);await i.connect();let c=new URL(o).pathname.replace(/^\//,"")||"kyro_cms",l=i.db(c);return new a$1({db:l})}return new a$2({path:h("KYRO_AUTH_DB_PATH",r)})}default:return new T}}async function $(s,e){let t=A("KYRO_DISTRIBUTED",false),r;if(t){let{RedisAuthAdapter:u}=await import('./redis-adapter-NN3H4GRX.js'),p=h("REDIS_URL","redis://localhost:6379"),y=A("REDIS_TLS",false),m=new u({url:p,tls:y});await m.connect?.(),r=m;}else {let u=s||Ie();r=await Lr(u),r.connect&&await r.connect();}let o=e?await k$1.fromConfig(e).catch(()=>null)||k$1.fromEnv()||void 0:k$1.fromEnv()||void 0,n$1=new l$1({minLength:g("PASSWORD_MIN_LENGTH",12),requireUppercase:A("PASSWORD_REQUIRE_UPPERCASE",true),requireLowercase:A("PASSWORD_REQUIRE_LOWERCASE",true),requireNumbers:A("PASSWORD_REQUIRE_NUMBERS",true),requireSpecialChars:A("PASSWORD_REQUIRE_SPECIAL",true),preventReuse:g("PASSWORD_PREVENT_REUSE",5),maxLength:g("PASSWORD_MAX_LENGTH",128)}),i,a,c;if(t){let p=r.redis;i=new x(p,{maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new P(p,{"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=new n(p,g("AUDIT_LOG_RETENTION_DAYS",30));}else i=new k({maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new m({"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=A("AUDIT_LOG_ENABLED",true)?new p(g("AUDIT_LOG_RETENTION_DAYS",30)):void 0;let l=new q$1({redis:r,email:o,jwtSecret:h("APP_SECRET","change-me"),jwtExpiresIn:h("JWT_EXPIRES_IN","24h"),jwtIssuer:h("JWT_ISSUER","kyro-cms"),jwtAudience:h("JWT_AUDIENCE","kyro-cms-client"),passwordPolicy:n$1,lockout:i,rateLimiter:a,auditLogger:c,baseUrl:h("EMAIL_BASE_URL","http://localhost:4321"),emailVerificationRequired:A("EMAIL_VERIFICATION_REQUIRED",true)}),d=t?"distributed":s||Ie();return {authAdapter:r,databaseType:d,email:o,passwordPolicy:n$1,lockout:i,rateLimiter:a,auditLogger:c,routes:l}}var Ee=$().catch(s=>(console.warn("[AuthConfig] Failed to initialize auth config:",s.message),null));var Er=12,Or="24h",Ur="7d",U=class{adapter;config;constructor(e,t){this.adapter=e,this.config={secret:t.secret,expiresIn:t.expiresIn??Or,refreshExpiresIn:t.refreshExpiresIn??Ur,issuer:t.issuer??"kyro-cms",audience:t.audience??[],saltRounds:t.saltRounds??Er};}async register(e){try{if(await this.adapter.findUserByEmail(e.email))return {success:!1,error:"Email already registered"};let r=await this.adapter.createUser({email:e.email,password:e.password,role:e.role??"customer",tenantId:e.tenantId});return this.createSessionForUser(r)}catch(t){return {success:false,error:String(t)}}}async login(e){try{let t=await this.adapter.verifyPassword(e.email,e.password);return t?this.createSessionForUser(t):{success:!1,error:"Invalid credentials"}}catch(t){return {success:false,error:String(t)}}}async logout(e){await this.adapter.deleteSession(e);}async refreshToken(e){try{let t=await this.adapter.findSessionByToken(e);if(!t||new Date(t.expiresAt)<new Date)return {success:!1,error:"Invalid or expired refresh token"};let r=await this.adapter.findUserById(t.userId);return r?(await this.adapter.deleteSession(e),this.createSessionForUser(r)):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async verifyToken(e){try{let{default:t}=await import('jsonwebtoken');return t.verify(e,this.config.secret,{issuer:this.config.issuer,audience:this.config.audience.length>0?this.config.audience[0]:void 0})}catch{return null}}async getUserFromToken(e){let t=await this.verifyToken(e);return t?this.adapter.findUserById(t.sub):null}async changePassword(e,t,r){try{let o=await this.adapter.findUserById(e);return o?await this.adapter.verifyPassword(o.email,t)?(await this.adapter.updateUser(e,{password:r}),await this.adapter.deleteUserSessions(e),{success:!0,user:o}):{success:!1,error:"Current password is incorrect"}:{success:!1,error:"User not found"}}catch(o){return {success:false,error:String(o)}}}async resetPassword(e,t){try{let r=await this.adapter.findUserByEmail(e);return r?(await this.adapter.updateUser(r.id,{password:t}),await this.adapter.deleteUserSessions(r.id),{success:!0,user:r}):{success:!1,error:"User not found"}}catch(r){return {success:false,error:String(r)}}}async sendEmailVerification(e){try{let{token:t,expiresAt:r}=await this.adapter.createEmailVerificationToken(e);return {success:!0}}catch(t){return {success:false,error:String(t)}}}async verifyEmail(e){try{return await this.adapter.verifyEmailToken(e)}catch(t){return {success:false,error:String(t)}}}async requestPasswordReset(e){try{let t=await this.adapter.createPasswordResetToken(e);return t.error?{success:!1,error:t.error}:{success:!0}}catch(t){return {success:false,error:String(t)}}}async resetPasswordWithToken(e,t){try{return await this.adapter.resetPasswordWithToken(e,t)}catch(r){return {success:false,error:String(r)}}}async deleteAccount(e){try{return await this.adapter.findUserById(e)?(await this.adapter.deleteUserSessions(e),await this.adapter.deleteUser(e),{success:!0}):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async createSessionForUser(e){let t=await this.generateToken(e),r=await this.adapter.createSession(e.id);return {success:true,user:e,session:r,token:t}}async generateToken(e){let{default:t}=await import('jsonwebtoken'),r={sub:e.id,email:e.email,role:e.role,tenantId:e.tenantId},o={expiresIn:this.parseExpiresIn(this.config.expiresIn)/1e3,issuer:this.config.issuer};return this.config.audience.length>0&&(o.audience=this.config.audience[0]),t.sign(r,this.config.secret,o)}async hashPassword(e){let{default:t}=await import('bcryptjs');return t.hash(e,this.config.saltRounds)}parseExpiresIn(e){if(typeof e=="number")return e;let t=e.match(/^(\d+)([smhd])$/);if(!t)return 864e5;let r=parseInt(t[1],10);switch(t[2]){case "s":return r*1e3;case "m":return r*6e4;case "h":return r*36e5;case "d":return r*864e5;default:return 864e5}}};function Vr(s,e){return new U(s,e)}function V(){return {enabled:true,draftsEnabled:true,publishEnabled:true,scheduleEnabled:false,versioningEnabled:true,maxVersionsPerDocument:50,autoPublish:false,requirePublishPermission:true}}var _=class{adapter;config;constructor(e,t){this.adapter=e,this.config={...V(),...t};}async createVersion(e){let r=((await this.adapter.getLatestVersion(e.collection,e.documentId))?.version??0)+1,o={...e,version:r},n=await this.adapter.createVersion(o);return this.config.maxVersionsPerDocument>0&&await this.pruneOldVersions(e.collection,e.documentId),n}async publishVersion(e){let t=await this.adapter.getVersion(e.collection,e.versionId);if(!t)throw new Error("Version not found");if(t.status==="published")throw new Error("Version is already published");await this.adapter.publishVersion(e);}async unpublishDocument(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:1e3});for(let o of r)if(o.status==="published"){await this.createVersion({collection:e,documentId:t,data:o.data,status:"draft",createdBy:"system",changeDescription:"Unpublished document"});break}}async revertToVersion(e,t,r,o){if(!await this.adapter.getVersion(e,r))throw new Error("Version not found");return await this.adapter.revertToVersion({collection:e,documentId:t,versionId:r,userId:o})}async getVersionHistory(e,t,r=20,o=0){return this.adapter.getVersions({collection:e,documentId:t,limit:r,offset:o})}async compareTwoVersions(e,t,r,o){return this.adapter.compareVersions({collection:e,documentId:t,versionA:r,versionB:o})}async getLatestDraft(e,t){return this.adapter.getLatestVersion(e,t)}async getPublishedVersion(e,t){return this.adapter.getPublishedVersion(e,t)}async getVersion(e,t){return this.adapter.getVersion(e,t)}async schedulePublish(e,t,r,o){if(!this.config.scheduleEnabled)throw new Error("Scheduled publishing is not enabled");if(!await this.adapter.getVersion(e,r))throw new Error("Version not found")}async deleteVersionHistory(e,t){await this.adapter.deleteVersions(e,t);}async pruneOldVersions(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:this.config.maxVersionsPerDocument+100});if(r.length<=this.config.maxVersionsPerDocument)return;r.slice(0,this.config.maxVersionsPerDocument);let n=r.slice(this.config.maxVersionsPerDocument);for(let i of n)if(i.status!=="published"){await this.adapter.deleteVersions(e,t);break}}};function _r(s,e){return new _(s,e)}function Mr(s){return s==="published"}function Hr(s){return s==="draft"}function Fr(s){return s==="archived"}function Nr(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Br(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Oe(s){return {collections:Nr(s.collections),globals:Br(s.globals),adapter:s.adapter,plugins:s.plugins,auth:s.auth,cors:s.cors,admin:s.admin,upload:s.upload,graphQL:s.graphQL,typescript:s.typescript,localization:s.localization,rateLimit:s.rateLimit,debug:s.debug}}var Kr=Oe;function $r(s){let{siteSettings:e,seoSettings:t,title:r,description:o,image:n,url:i}=s;if(!e)return "";let a=e.siteName||"",c=r||t?.defaultTitle||a,l=t?.titleTemplate,d=t?.separator||" | ",u=t?.siteNameInTitle!==false,p=l?l.replace(/\{\{title\}\}/g,c).replace(/\{\{siteName\}\}/g,u?a:"").replace(/\{\{separator\}\}/g,d).replace(/\s+/g," ").trim():c,y=o||t?.defaultDescription||e.siteDescription||"",m=n||e.siteOgImage?.url||"",D=i||e.siteUrl||"",f=`
|
|
1
|
+
export{a as RedisAuthAdapter}from'./chunk-QOCHBPMK.js';export{k as allGlobalSettings,q as blogCollections,l as coreGlobalSettings,V as createTemplateConfig,r as ecommerceCollections,s as ecommerceGlobals,t as kitchenSinkCollections,v as mediaCollections,a as minimalCollections,U as templateCollections}from'./chunk-SZNM3F5V.js';export{a as kyro}from'./chunk-FVRNWRSG.js';export{s as AnalyticsPlugin,t as CommentsPlugin,a as ConfigValidationError,y as Kyro,p as KyroPlugin,A as LocalAdapter,q as PluginManager,l as Registry,u as ReviewsPlugin,r as SEOPlugin,v as WishlistPlugin,x as applyCollectionOverrides,h as collectionToCreateZod,i as collectionToUpdateZod,j as collectionToWhereZod,g as collectionToZod,z as createKyro,B as createLocalAdapter,o as createRegistry,f as fieldToZod,m as getRegistry,k as globalToZod,w as presetPlugins,n as resetRegistry,b as validateCollection,e as validateConfig,d as validateFields,c as validateGlobal}from'./chunk-DZMIMB5W.js';export{d as autoBootstrap,a as bootstrapAdmin,e as bootstrapWithRetry,c as getBootstrapFromEnv}from'./chunk-7MBZYLME.js';import'./chunk-NZ35PV5R.js';export{a as CSSGenerator,g as createAdminStyling,d as defaultDarkTheme,h as defaultFieldStyling,c as defaultLightTheme,e as ecommerce2026Theme,f as generateCSSVariables,b as generateTailwindConfig}from'./chunk-UHFDH3PG.js';export{q as ALL_FIELD_TYPES,n as COMPLEX_FIELD_TYPES,p as LAYOUT_FIELD_TYPES,m as PRIMITIVE_FIELD_TYPES,o as RELATIONAL_FIELD_TYPES,d as isArrayField,f as isBlocksField,e as isGroupField,h as isImageField,k as isLayoutField,b as isNumberField,c as isRelationshipField,i as isRichTextField,j as isSelectField,a as isTextField,g as isUploadField,t as normalizeRichTextValue,u as renderRichText,s as richTextStyles}from'./chunk-INB4LNA6.js';import'./chunk-5SEHX7ON.js';export{a as createContext,g as createCountProcedure,d as createCreateProcedure,f as createDeleteProcedure,h as createDynamicRouter,c as createFindByIDProcedure,b as createFindProcedure,i as createKyroServer,e as createUpdateProcedure}from'./chunk-LHW4R367.js';export{c as buildGraphQLSchema,d as createGraphQLSchema}from'./chunk-PP7W5UKL.js';import {l,n,m,p,q as q$1}from'./chunk-4DJYAD4L.js';export{n as AuditLogger,p as InMemoryAuditLogger,m as InMemoryRateLimiter,t as MediaService,o as createAuditContext,u as createHonoApp,e as createLocalStorage,v as createRESTAPI,i as getAppSecret,j as getEncryptionKey,k as getSessionConfig,s as isEdgeRuntime,h as loadSecrets,d as resolveProvider,g as setDbAdapter}from'./chunk-4DJYAD4L.js';import {k as k$1,l as l$1}from'./chunk-6J27P5D6.js';export{j as ConfigService,k as EmailTransport,l as PasswordPolicy,i as getEmailTemplates,g as renderAccountLocked,a as renderBaseLayout,f as renderMagicLink,e as renderPasswordChanged,c as renderResetPassword,h as renderUserInvite,b as renderVerifyEmail,d as renderWelcome}from'./chunk-6J27P5D6.js';import'./chunk-K6WUOU6P.js';import'./chunk-IETGL7WJ.js';import {a as a$2}from'./chunk-IKOXCJYO.js';export{a as SQLiteAuthAdapter}from'./chunk-IKOXCJYO.js';import'./chunk-NRLIGDYF.js';export{e as ALL_WEBHOOK_EVENTS,f as WEBHOOK_COLLECTION,g as WEBHOOK_DELIVERY_COLLECTION,d as WEBHOOK_EVENTS,n as WebhookService,l as buildDeliveryRecord,m as createTestPayload,o as createWebhookService,j as deliverWebhook,k as deliverWithRetry,i as generateWebhookSecret,h as signPayload}from'./chunk-FVZ5RFLO.js';export{a as evaluateAccess,c as getWhereClause,b as mergeWhereClauses}from'./chunk-HLSB2MCK.js';export{b as KyroPubSub,c as KyroWSServer,a as PubSub,d as createWSServer}from'./chunk-GKYEJ2UF.js';import'./chunk-PP5S2UBV.js';export{c as DrizzleAdapter,b as collectionToDrizzleSchema,f as createDatabase,d as createDrizzleAdapter,a as fieldToDrizzleType,g as runMigrations,h as seedDefaultRoles}from'./chunk-5KSRMBEO.js';import {a as a$3}from'./chunk-RHCWCG3O.js';export{a as PostgresAuthAdapter}from'./chunk-RHCWCG3O.js';import'./chunk-OG7CNQGU.js';export{a as MongoDBAdapter,b as createMongoDBAdapter}from'./chunk-VGQ4VUG6.js';import {a as a$1}from'./chunk-6ROHVUXF.js';export{a as MongoDBAuthAdapter}from'./chunk-6ROHVUXF.js';import {a as a$4}from'./chunk-5KOQYQEE.js';export{a as AbstractBaseAdapter}from'./chunk-5KOQYQEE.js';import {a}from'./chunk-6SPPR5JZ.js';import'./chunk-4RMFCTWH.js';import'./chunk-KDNYHLD2.js';import'./chunk-5J6HXUF6.js';import W,{randomBytes}from'crypto';import {readFileSync}from'fs';import Me,{join,resolve}from'path';import {z as z$1}from'zod';export{z}from'zod';import {createStorage}from'unstorage';import Jr from'unstorage/drivers/indexedb';import eo from'unstorage/drivers/fs';async function Re(s,e){let t=e.data;for(let r of s){let o=await r({...e,data:t});o!==void 0&&(t=o);}return t}async function Cr(s,e){return Re(s,e)}var R=class extends a$4{connectionString;constructor(e){super(),this.connectionString=e.connectionString;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.connectionString)throw new Error("NeonAdapter: Connection string is required.");try{let r=await fetch(`${this.connectionString}/sql`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({query:e,params:t})});return r.ok?(await r.json()).rows||[]:[]}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function ve(s){return new R(s)}var v=class extends a$4{url;authToken;constructor(e){super(),this.url=e.url.replace(/^libsql:\/\//,"https://"),this.authToken=e.authToken;}async connect(){this.connected=true;}async disconnect(){this.connected=false;}async query(e,t=[]){if(!this.url)throw new Error("TursoAdapter: Database URL is required.");try{let r={"Content-Type":"application/json"};this.authToken&&(r.Authorization=`Bearer ${this.authToken}`);let o=await fetch(`${this.url}/v2/pipeline`,{method:"POST",headers:r,body:JSON.stringify({requests:[{type:"execute",stmt:{sql:e,args:t.map(c=>({type:"text",value:String(c)}))}},{type:"close"}]})});if(!o.ok)return [];let i=(await o.json())?.results?.[0]?.response?.result;if(!i||!i.rows)return [];let a=i.cols.map(c=>c.name);return i.rows.map(c=>{let l={};return a.forEach((d,u)=>{l[d]=c[u]?.value??null;}),l})}catch{return []}}async find(e){return {docs:[],totalDocs:0,limit:e.limit||10,totalPages:1,page:e.page||1,hasNextPage:false,hasPrevPage:false}}async findByID(e){return null}async create(e){return e.data}async update(e){return e.data}async delete(e){return {success:true,id:e.id}}async count(e){return 0}async findOne(e){return null}async findVersions(e){return {docs:[],totalDocs:0,limit:10,totalPages:1,page:1,hasNextPage:false,hasPrevPage:false}}async findVersionByID(e){return null}async createVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async updateLatestVersion(e){return {id:"v1",parentId:e.documentId,version:e.version||1,snapshot:e.snapshot||{},createdAt:new Date().toISOString()}}async deleteVersions(e){}};function De(s){return new v(s)}var Rr={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3},x=class{redis;prefix;config;constructor(e,t={},r="kyro:lockout:"){this.redis=e,this.prefix=r,this.config={...Rr,...t};}lockKey(e){return `${this.prefix}${e}`}historyKey(e){return `${this.prefix}${e}:history`}async checkLockout(e){let t=this.lockKey(e),r=await this.redis.hgetall(t);if(!r||Object.keys(r).length===0)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let o=parseInt(r.attempts,10),n=r.lockedUntil?new Date(parseInt(r.lockedUntil,10)):void 0;return n&&n>new Date?{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:o}:n&&n<=new Date?(await this.unlockAccount(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0}):{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=this.lockKey(e),r=this.historyKey(e),o=Date.now(),n=await this.redis.hincrby(t,"attempts",1);if(await this.redis.hset(t,"lastAttempt",o.toString()),await this.redis.lpush(r,o.toString()),await this.redis.ltrim(r,0,99),n>=this.config.maxAttempts){let i=new Date(o+this.config.lockDuration);return await this.redis.hset(t,{lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),await this.redis.expire(t,Math.ceil(this.config.lockDuration/1e3)+3600),{locked:true,attemptsRemaining:0,lockedUntil:i,totalAttempts:n}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-n),totalAttempts:n}}async lockAccount(e,t){let r=this.lockKey(e),o=Date.now(),n=t||this.config.lockDuration,i=new Date(o+n),a=this.redis.pipeline();a.hset(r,{attempts:this.config.maxAttempts.toString(),lockedAt:o.toString(),lockedUntil:i.getTime().toString()}),a.expire(r,Math.ceil(n/1e3)+3600),await a.exec();}async unlockAccount(e){let t=this.lockKey(e);await this.redis.del(t);}async resetAttempts(e){let t=this.lockKey(e);(await this.redis.hgetall(t)).lockedAt?await this.redis.hset(t,{attempts:"0",lockedAt:"",lockedUntil:""}):await this.redis.del(t);}async getLockoutHistory(e,t=10){let r=this.historyKey(e);return (await this.redis.lrange(r,0,t-1)).map(n=>new Date(parseInt(n,10)))}async getLockoutStats(e){let t=this.historyKey(e),r=await this.redis.lrange(t,0,-1),o=r.filter((i,a)=>(a+1)%this.config.maxAttempts===0).length,n=await this.redis.hget(this.lockKey(e),"lockedAt");return {totalFailedAttempts:r.length,lockoutCount:o,lastLockout:n?new Date(parseInt(n,10)):null,averageAttemptsBeforeLockout:o>0?this.config.maxAttempts:0}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};var vr={"auth:login":{window:9e5,max:5},"auth:register":{window:36e5,max:3},"auth:forgot":{window:36e5,max:3},"auth:reset":{window:36e5,max:5},"auth:verify":{window:36e5,max:5},"api:general":{window:6e4,max:100},"api:authenticated":{window:6e4,max:200}},P=class{redis;prefix;limits;userLimits;constructor(e,t,r,o="kyro:ratelimit:"){this.redis=e,this.prefix=o,this.limits={...vr,...t},this.userLimits=r||{"user:api":{window:6e4,max:500},"user:write":{window:36e5,max:100}};}getKey(e,t){return `${this.prefix}${e}:${t}`}async check(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window,a=this.redis.pipeline();a.zremrangebyscore(o,0,i),a.zcard(o),a.zadd(o,n,`${n}:${Math.random()}`),a.expire(o,Math.ceil(r.window/1e3)+1);let l=(await a.exec())?.[1]?.[1]||0;if(l>=r.max){let d=await this.redis.zrange(o,0,0,"WITHSCORES"),u=d.length>1?parseInt(d[1],10)+r.window:n+r.window;return {allowed:false,remaining:0,resetAt:u,retryAfter:Math.ceil((u-n)/1e3)}}return {allowed:true,remaining:r.max-l-1,resetAt:n+r.window}}async checkUser(e,t,r){let o=this.userLimits[e]||this.userLimits["user:api"],n=this.getKey(`user:${e}:${t}`,r),i=Date.now(),a=i-o.window,c=this.redis.pipeline();c.zremrangebyscore(n,0,a),c.zcard(n),c.zadd(n,i,`${i}:${Math.random()}`),c.expire(n,Math.ceil(o.window/1e3)+1);let d=(await c.exec())?.[1]?.[1]||0;if(d>=o.max){let u=await this.redis.zrange(n,0,0,"WITHSCORES"),p=u.length>1?parseInt(u[1],10)+o.window:i+o.window;return {allowed:false,remaining:0,resetAt:p,retryAfter:Math.ceil((p-i)/1e3)}}return {allowed:true,remaining:o.max-d-1,resetAt:i+o.window}}async reset(e,t){let r=this.getKey(e,t);await this.redis.del(r);}async resetUser(e,t,r){let o=this.getKey(`user:${e}:${t}`,r);await this.redis.del(o);}async getStatus(e,t){let r=this.limits[e]||this.limits["api:general"],o=this.getKey(e,t),n=Date.now(),i=n-r.window;await this.redis.zremrangebyscore(o,0,i);let a=await this.redis.zcard(o);return {count:a,limit:r.max,remaining:Math.max(0,r.max-a),resetAt:n+r.window}}setLimit(e,t){this.limits[e]=t;}setUserLimit(e,t){this.userLimits[e]=t;}};var T=class{users=new Map;sessions=new Map;refreshTokens=new Map;emailToUserId=new Map;passwordHistory=new Map;emailVerificationTokens=new Map;passwordResetTokens=new Map;auditLogs=[];externalDb=false;constructor(){}async connect(){}async disconnect(){this.users.clear(),this.sessions.clear(),this.refreshTokens.clear(),this.emailToUserId.clear(),this.passwordHistory.clear();}async createUser(e){let t=randomBytes(16).toString("hex"),r=new Date().toISOString(),o=await this.hashPassword(e.password),n={id:t,email:e.email.toLowerCase(),passwordHash:o,role:e.role||"customer",tenantId:e.tenantId,createdAt:r,updatedAt:r};return this.users.set(t,n),this.emailToUserId.set(e.email.toLowerCase(),t),this.passwordHistory.set(t,[]),n}async findUserByEmail(e){let t=this.emailToUserId.get(e.toLowerCase());return t?this.findUserById(t):null}async findUserById(e){return this.users.get(e)||null}async updateUser(e,t){let r=await this.findUserById(e);if(!r)return null;let o={...r,...t,id:e,updatedAt:new Date().toISOString()};return t.email&&t.email!==r.email&&(this.emailToUserId.delete(r.email.toLowerCase()),this.emailToUserId.set(t.email.toLowerCase(),e)),this.users.set(e,o),o}async deleteUser(e){let t=await this.findUserById(e);return t?(this.users.delete(e),this.emailToUserId.delete(t.email.toLowerCase()),this.refreshTokens.forEach((r,o)=>{this.sessions.get(r)?.userId===e&&(this.refreshTokens.delete(o),this.sessions.delete(r));}),this.passwordHistory.delete(e),this.sessions.forEach((r,o)=>{r.userId===e&&this.sessions.delete(o);}),true):false}async hashPassword(e){return (await import('bcryptjs')).default.hash(e,12)}async verifyPassword(e,t){let r=await this.findUserByEmail(e);return !r||!r.passwordHash?null:await(await import('bcryptjs')).default.compare(t,r.passwordHash)?r:null}async createSession(e,t={}){let r=randomBytes(32).toString("hex"),o=randomBytes(32).toString("base64url"),n=randomBytes(32).toString("base64url"),i=new Date,a={id:r,userId:e,token:o,refreshToken:n,expiresAt:new Date(i.getTime()+86400*1e3).toISOString(),createdAt:i.toISOString(),ipAddress:t.ipAddress,userAgent:t.userAgent};return this.sessions.set(r,a),this.refreshTokens.set(n,r),a}async findSessionByToken(e){return this.sessions.get(e)||null}async findSessionByRefreshToken(e){let t=this.refreshTokens.get(e);return t&&this.sessions.get(t)||null}async deleteSession(e){let t=this.sessions.get(e);return t?(t.refreshToken&&this.refreshTokens.delete(t.refreshToken),this.sessions.delete(e),true):false}async deleteUserSessions(e){let t=0;return this.sessions.forEach((r,o)=>{r.userId===e&&(r.refreshToken&&this.refreshTokens.delete(r.refreshToken),this.sessions.delete(o),t++);}),t}async addPasswordToHistory(e,t){let r=this.passwordHistory.get(e)||[];r.push(t),r.length>5&&r.splice(0,r.length-5),this.passwordHistory.set(e,r);}async getPasswordHistory(e,t=5){return this.passwordHistory.get(e)||[]}async isPasswordInHistory(e,t,r=5){let o=await this.getPasswordHistory(t,r),n=(await import('bcryptjs')).default;for(let i of o)if(await n.compare(e,i))return true;return false}async createEmailVerificationToken(e){let t=randomBytes(32).toString("hex"),r=new Date(Date.now()+1440*60*1e3);return this.emailVerificationTokens.set(t,{userId:e,expiresAt:r}),{token:t,expiresAt:r}}async verifyEmailToken(e){let t=this.emailVerificationTokens.get(e);return !t||t.expiresAt<new Date?(this.emailVerificationTokens.delete(e),{success:false,error:"Invalid or expired token"}):(this.emailVerificationTokens.delete(e),{success:true,userId:t.userId})}async createPasswordResetToken(e){let t=await this.findUserByEmail(e);if(!t)return {token:"",expiresAt:new Date,error:"User not found"};let r=randomBytes(32).toString("hex"),o=new Date(Date.now()+3600*1e3);return this.passwordResetTokens.set(r,{userId:t.id,expiresAt:o}),{token:r,expiresAt:o}}async resetPasswordWithToken(e,t){let r=this.passwordResetTokens.get(e);if(!r||r.expiresAt<new Date)return this.passwordResetTokens.delete(e),{success:false,error:"Invalid or expired token"};let o=await this.hashPassword(t);return await this.updateUser(r.userId,{passwordHash:o}),this.passwordResetTokens.delete(e),{success:true}}async hasAnyUsers(){return this.users.size>0}async findAuditLogs(e){let{limit:t=50,offset:r=0}=e,o=this.auditLogs.slice().reverse();return e.userId&&(o=o.filter(n=>n.userId===e.userId)),e.action&&(Array.isArray(e.action)?o=o.filter(n=>e.action.includes(String(n.action))):o=o.filter(n=>n.action===e.action)),e.resource&&(o=o.filter(n=>n.resource===e.resource)),e.success!==void 0&&(o=o.filter(n=>n.success===e.success)),{logs:o.slice(r,r+t),total:o.length}}async createAuditLog(e){let t=randomBytes(16).toString("hex"),o={...e,id:t,timestamp:new Date};return this.auditLogs.push(o),o}};var k=class{storage=new Map;history=new Map;config;constructor(e={}){this.config={maxAttempts:5,lockDuration:9e5,notifyUser:true,notifyAdmin:true,adminNotifyAfter:3,...e};}async checkLockout(e){let t=Date.now(),r=this.storage.get(e);if(r&&r.lockedUntil!==null&&r.lockedUntil<=t)return await this.resetAttempts(e),{locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};if(!r)return {locked:false,attemptsRemaining:this.config.maxAttempts,totalAttempts:0};let{attempts:o,lockedUntil:n}=r;return n!==null&&n>t?{locked:true,attemptsRemaining:0,lockedUntil:new Date(n),totalAttempts:o}:{locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-o),totalAttempts:o}}async recordFailedAttempt(e){let t=Date.now(),r=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};r.attempts+=1,r.lastAttempt=t;let o=this.history.get(e)||[];if(o.push(t),o.length>100&&o.splice(0,o.length-100),this.history.set(e,o),this.storage.set(e,r),r.attempts>=this.config.maxAttempts){let n=new Date(t+this.config.lockDuration);return r.lockedAt=t,r.lockedUntil=n.getTime(),this.storage.set(e,r),{locked:true,attemptsRemaining:0,lockedUntil:n,totalAttempts:r.attempts}}return {locked:false,attemptsRemaining:Math.max(0,this.config.maxAttempts-r.attempts),totalAttempts:r.attempts}}async lockAccount(e,t){let r=Date.now(),o=t||this.config.lockDuration,n=new Date(r+o),i=this.storage.get(e)||{attempts:0,lastAttempt:null,lockedAt:null,lockedUntil:null};i.attempts=this.config.maxAttempts,i.lockedAt=r,i.lockedUntil=n.getTime(),this.storage.set(e,i);}async unlockAccount(e){await this.resetAttempts(e);}async resetAttempts(e){let t=this.storage.get(e);t&&(t.attempts=0,t.lockedAt=null,t.lockedUntil=null,this.storage.set(e,t)),this.history.delete(e);}async getLockoutHistory(e,t=10){return (this.history.get(e)||[]).slice(-t).reverse().map(o=>new Date(o))}async getLockoutStats(e){let r=(this.history.get(e)||[]).length,o=Math.floor(r/this.config.maxAttempts),n=null,i=this.storage.get(e);i&&i.lockedAt!==null&&(n=new Date(i.lockedAt));let a=o>0?this.config.maxAttempts:0;return {totalFailedAttempts:r,lockoutCount:o,lastLockout:n,averageAttemptsBeforeLockout:a}}shouldNotifyAdmin(e){return this.config.notifyAdmin&&e>=this.config.adminNotifyAfter}getConfig(){return {...this.config}}setConfig(e){this.config={...this.config,...e};}};function h(s,e=""){return process.env[s]||e}function A(s,e=false){let t=process.env[s];return t?t.toLowerCase()==="true":e}function g(s,e=0){let t=process.env[s];return t?parseInt(t,10):e}function Ie(){let s=process.env.KYRO_AUTH_DATABASE?.toLowerCase();if(s&&["sqlite","postgres","mongodb","memory"].includes(s))return s;try{let e=join(process.cwd(),"kyro.config.ts"),t=readFileSync(e,"utf8");if(t.includes("createLocalAdapter"))return "sqlite";if(t.includes("createDrizzleAdapter"))return t.includes("postgres")||t.includes("postgresql"),"postgres";if(t.includes("createMongoDBAdapter"))return "mongodb"}catch{}return "memory"}async function Lr(s){let e=process.cwd(),t=e.endsWith("admin")?join(e,".."):e,r=resolve(t,"data","auth.db");switch(s){case "sqlite":return new a$2({path:h("KYRO_AUTH_DB_PATH",r)});case "postgres":{let o=h("DATABASE_URL","");if(o){let n,i;try{n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}catch{a(["postgres","drizzle-orm"]),n=(await import('drizzle-orm/postgres-js')).drizzle,i=await import('postgres');}let a$1=i.default(o,{onnotice:()=>{}}),c=n(a$1);return new a$3({db:c})}return new a$2({path:h("KYRO_AUTH_DB_PATH",r)})}case "mongodb":{let o=h("MONGODB_URI","");if(o){let n;try{n=(await import('mongodb')).MongoClient;}catch{a(["mongodb"]),n=(await import('mongodb')).MongoClient;}let i=new n(o);await i.connect();let c=new URL(o).pathname.replace(/^\//,"")||"kyro_cms",l=i.db(c);return new a$1({db:l})}return new a$2({path:h("KYRO_AUTH_DB_PATH",r)})}default:return new T}}async function $(s,e){let t=A("KYRO_DISTRIBUTED",false),r;if(t){let{RedisAuthAdapter:u}=await import('./redis-adapter-NN3H4GRX.js'),p=h("REDIS_URL","redis://localhost:6379"),y=A("REDIS_TLS",false),m=new u({url:p,tls:y});await m.connect?.(),r=m;}else {let u=s||Ie();r=await Lr(u),r.connect&&await r.connect();}let o=e?await k$1.fromConfig(e).catch(()=>null)||k$1.fromEnv()||void 0:k$1.fromEnv()||void 0,n$1=new l$1({minLength:g("PASSWORD_MIN_LENGTH",12),requireUppercase:A("PASSWORD_REQUIRE_UPPERCASE",true),requireLowercase:A("PASSWORD_REQUIRE_LOWERCASE",true),requireNumbers:A("PASSWORD_REQUIRE_NUMBERS",true),requireSpecialChars:A("PASSWORD_REQUIRE_SPECIAL",true),preventReuse:g("PASSWORD_PREVENT_REUSE",5),maxLength:g("PASSWORD_MAX_LENGTH",128)}),i,a,c;if(t){let p=r.redis;i=new x(p,{maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new P(p,{"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=new n(p,g("AUDIT_LOG_RETENTION_DAYS",30));}else i=new k({maxAttempts:g("LOCKOUT_MAX_ATTEMPTS",5),lockDuration:g("LOCKOUT_DURATION_MINUTES",15)*60*1e3}),a=new m({"auth:login":{window:g("RATE_LIMIT_AUTH_WINDOW_MS",9e5),max:g("RATE_LIMIT_AUTH_MAX_REQUESTS",10)},"api:general":{window:g("RATE_LIMIT_WINDOW_MS",6e4),max:g("RATE_LIMIT_MAX_REQUESTS",100)}}),c=A("AUDIT_LOG_ENABLED",true)?new p(g("AUDIT_LOG_RETENTION_DAYS",30)):void 0;let l=new q$1({redis:r,email:o,jwtSecret:h("APP_SECRET","change-me"),jwtExpiresIn:h("JWT_EXPIRES_IN","24h"),jwtIssuer:h("JWT_ISSUER","kyro-cms"),jwtAudience:h("JWT_AUDIENCE","kyro-cms-client"),passwordPolicy:n$1,lockout:i,rateLimiter:a,auditLogger:c,baseUrl:h("EMAIL_BASE_URL","http://localhost:4321"),emailVerificationRequired:A("EMAIL_VERIFICATION_REQUIRED",true)}),d=t?"distributed":s||Ie();return {authAdapter:r,databaseType:d,email:o,passwordPolicy:n$1,lockout:i,rateLimiter:a,auditLogger:c,routes:l}}var Ee=$().catch(s=>(console.warn("[AuthConfig] Failed to initialize auth config:",s.message),null));var Er=12,Or="24h",Ur="7d",U=class{adapter;config;constructor(e,t){this.adapter=e,this.config={secret:t.secret,expiresIn:t.expiresIn??Or,refreshExpiresIn:t.refreshExpiresIn??Ur,issuer:t.issuer??"kyro-cms",audience:t.audience??[],saltRounds:t.saltRounds??Er};}async register(e){try{if(await this.adapter.findUserByEmail(e.email))return {success:!1,error:"Email already registered"};let r=await this.adapter.createUser({email:e.email,password:e.password,role:e.role??"customer",tenantId:e.tenantId});return this.createSessionForUser(r)}catch(t){return {success:false,error:String(t)}}}async login(e){try{let t=await this.adapter.verifyPassword(e.email,e.password);return t?this.createSessionForUser(t):{success:!1,error:"Invalid credentials"}}catch(t){return {success:false,error:String(t)}}}async logout(e){await this.adapter.deleteSession(e);}async refreshToken(e){try{let t=await this.adapter.findSessionByToken(e);if(!t||new Date(t.expiresAt)<new Date)return {success:!1,error:"Invalid or expired refresh token"};let r=await this.adapter.findUserById(t.userId);return r?(await this.adapter.deleteSession(e),this.createSessionForUser(r)):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async verifyToken(e){try{let{default:t}=await import('jsonwebtoken');return t.verify(e,this.config.secret,{issuer:this.config.issuer,audience:this.config.audience.length>0?this.config.audience[0]:void 0})}catch{return null}}async getUserFromToken(e){let t=await this.verifyToken(e);return t?this.adapter.findUserById(t.sub):null}async changePassword(e,t,r){try{let o=await this.adapter.findUserById(e);return o?await this.adapter.verifyPassword(o.email,t)?(await this.adapter.updateUser(e,{password:r}),await this.adapter.deleteUserSessions(e),{success:!0,user:o}):{success:!1,error:"Current password is incorrect"}:{success:!1,error:"User not found"}}catch(o){return {success:false,error:String(o)}}}async resetPassword(e,t){try{let r=await this.adapter.findUserByEmail(e);return r?(await this.adapter.updateUser(r.id,{password:t}),await this.adapter.deleteUserSessions(r.id),{success:!0,user:r}):{success:!1,error:"User not found"}}catch(r){return {success:false,error:String(r)}}}async sendEmailVerification(e){try{let{token:t,expiresAt:r}=await this.adapter.createEmailVerificationToken(e);return {success:!0}}catch(t){return {success:false,error:String(t)}}}async verifyEmail(e){try{return await this.adapter.verifyEmailToken(e)}catch(t){return {success:false,error:String(t)}}}async requestPasswordReset(e){try{let t=await this.adapter.createPasswordResetToken(e);return t.error?{success:!1,error:t.error}:{success:!0}}catch(t){return {success:false,error:String(t)}}}async resetPasswordWithToken(e,t){try{return await this.adapter.resetPasswordWithToken(e,t)}catch(r){return {success:false,error:String(r)}}}async deleteAccount(e){try{return await this.adapter.findUserById(e)?(await this.adapter.deleteUserSessions(e),await this.adapter.deleteUser(e),{success:!0}):{success:!1,error:"User not found"}}catch(t){return {success:false,error:String(t)}}}async createSessionForUser(e){let t=await this.generateToken(e),r=await this.adapter.createSession(e.id);return {success:true,user:e,session:r,token:t}}async generateToken(e){let{default:t}=await import('jsonwebtoken'),r={sub:e.id,email:e.email,role:e.role,tenantId:e.tenantId},o={expiresIn:this.parseExpiresIn(this.config.expiresIn)/1e3,issuer:this.config.issuer};return this.config.audience.length>0&&(o.audience=this.config.audience[0]),t.sign(r,this.config.secret,o)}async hashPassword(e){let{default:t}=await import('bcryptjs');return t.hash(e,this.config.saltRounds)}parseExpiresIn(e){if(typeof e=="number")return e;let t=e.match(/^(\d+)([smhd])$/);if(!t)return 864e5;let r=parseInt(t[1],10);switch(t[2]){case "s":return r*1e3;case "m":return r*6e4;case "h":return r*36e5;case "d":return r*864e5;default:return 864e5}}};function Vr(s,e){return new U(s,e)}function V(){return {enabled:true,draftsEnabled:true,publishEnabled:true,scheduleEnabled:false,versioningEnabled:true,maxVersionsPerDocument:50,autoPublish:false,requirePublishPermission:true}}var _=class{adapter;config;constructor(e,t){this.adapter=e,this.config={...V(),...t};}async createVersion(e){let r=((await this.adapter.getLatestVersion(e.collection,e.documentId))?.version??0)+1,o={...e,version:r},n=await this.adapter.createVersion(o);return this.config.maxVersionsPerDocument>0&&await this.pruneOldVersions(e.collection,e.documentId),n}async publishVersion(e){let t=await this.adapter.getVersion(e.collection,e.versionId);if(!t)throw new Error("Version not found");if(t.status==="published")throw new Error("Version is already published");await this.adapter.publishVersion(e);}async unpublishDocument(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:1e3});for(let o of r)if(o.status==="published"){await this.createVersion({collection:e,documentId:t,data:o.data,status:"draft",createdBy:"system",changeDescription:"Unpublished document"});break}}async revertToVersion(e,t,r,o){if(!await this.adapter.getVersion(e,r))throw new Error("Version not found");return await this.adapter.revertToVersion({collection:e,documentId:t,versionId:r,userId:o})}async getVersionHistory(e,t,r=20,o=0){return this.adapter.getVersions({collection:e,documentId:t,limit:r,offset:o})}async compareTwoVersions(e,t,r,o){return this.adapter.compareVersions({collection:e,documentId:t,versionA:r,versionB:o})}async getLatestDraft(e,t){return this.adapter.getLatestVersion(e,t)}async getPublishedVersion(e,t){return this.adapter.getPublishedVersion(e,t)}async getVersion(e,t){return this.adapter.getVersion(e,t)}async schedulePublish(e,t,r,o){if(!this.config.scheduleEnabled)throw new Error("Scheduled publishing is not enabled");if(!await this.adapter.getVersion(e,r))throw new Error("Version not found")}async deleteVersionHistory(e,t){await this.adapter.deleteVersions(e,t);}async pruneOldVersions(e,t){let r=await this.adapter.getVersions({collection:e,documentId:t,limit:this.config.maxVersionsPerDocument+100});if(r.length<=this.config.maxVersionsPerDocument)return;r.slice(0,this.config.maxVersionsPerDocument);let n=r.slice(this.config.maxVersionsPerDocument);for(let i of n)if(i.status!=="published"){await this.adapter.deleteVersions(e,t);break}}};function _r(s,e){return new _(s,e)}function Mr(s){return s==="published"}function Hr(s){return s==="draft"}function Fr(s){return s==="archived"}function Nr(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Br(s){return s?Array.isArray(s)?s:Object.values(s):[]}function Oe(s){return {collections:Nr(s.collections),globals:Br(s.globals),adapter:s.adapter,plugins:s.plugins,auth:s.auth,cors:s.cors,admin:s.admin,upload:s.upload,graphQL:s.graphQL,typescript:s.typescript,localization:s.localization,rateLimit:s.rateLimit,debug:s.debug}}var Kr=Oe;function $r(s){let{siteSettings:e,seoSettings:t,title:r,description:o,image:n,url:i}=s;if(!e)return "";let a=e.siteName||"",c=r||t?.defaultTitle||a,l=t?.titleTemplate,d=t?.separator||" | ",u=t?.siteNameInTitle!==false,p=l?l.replace(/\{\{title\}\}/g,c).replace(/\{\{siteName\}\}/g,u?a:"").replace(/\{\{separator\}\}/g,d).replace(/\s+/g," ").trim():c,y=o||t?.defaultDescription||e.siteDescription||"",m=n||e.siteOgImage?.url||"",D=i||e.siteUrl||"",f=`
|
|
2
2
|
<title>${p}</title>
|
|
3
3
|
<meta name="description" content="${y}">
|
|
4
4
|
`;e.siteFavicon?.url&&(f+=`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kyro-cms/core",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.36",
|
|
4
4
|
"description": "Astro-native headless CMS with multi-database adapters, multi-protocol APIs, and multi-vendor support",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -185,14 +185,16 @@
|
|
|
185
185
|
"nodemailer": "^8.0.4",
|
|
186
186
|
"ora": "^8.2.0",
|
|
187
187
|
"postgres": "^3.4.8",
|
|
188
|
+
"prompts": "^2.4.2",
|
|
188
189
|
"sharp": "^0.34.5",
|
|
189
190
|
"unstorage": "^1.17.5",
|
|
190
191
|
"ws": "^8.18.0",
|
|
191
192
|
"zod": "^3.24.0",
|
|
192
193
|
"zod-to-json-schema": "^3.25.2",
|
|
193
|
-
"@kyro-cms/ai": "0.12.
|
|
194
|
+
"@kyro-cms/ai": "0.12.36"
|
|
194
195
|
},
|
|
195
196
|
"devDependencies": {
|
|
197
|
+
"@tailwindcss/vite": "^4.0.0",
|
|
196
198
|
"@types/better-sqlite3": "^7.6.13",
|
|
197
199
|
"@types/jsonwebtoken": "^9.0.9",
|
|
198
200
|
"@types/node": "^22.13.0",
|
|
@@ -206,7 +208,6 @@
|
|
|
206
208
|
"prettier": "^3.5.0",
|
|
207
209
|
"react": "^19.2.7",
|
|
208
210
|
"tailwindcss": "^4.0.0",
|
|
209
|
-
"@tailwindcss/vite": "^4.0.0",
|
|
210
211
|
"tsup": "^8.5.1",
|
|
211
212
|
"typescript": "^5.7.3",
|
|
212
213
|
"typescript-eslint": "^8.59.1",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';var chunk4XZABBHF_cjs=require('./chunk-4XZABBHF.cjs');require('./chunk-5K4YG5DA.cjs'),require('./chunk-WIZ6C5QZ.cjs'),require('./chunk-HOP4D5XZ.cjs'),require('./chunk-AHSFSERC.cjs');Object.defineProperty(exports,"autoBootstrap",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.d}});Object.defineProperty(exports,"bootstrapAdmin",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.a}});Object.defineProperty(exports,"bootstrapWithRetry",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.e}});Object.defineProperty(exports,"checkBootstrapRequired",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.b}});Object.defineProperty(exports,"getBootstrapFromEnv",{enumerable:true,get:function(){return chunk4XZABBHF_cjs.c}});
|
package/dist/chunk-4XZABBHF.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';var chunk5K4YG5DA_cjs=require('./chunk-5K4YG5DA.cjs'),chunkHOP4D5XZ_cjs=require('./chunk-HOP4D5XZ.cjs');async function f(t){let{adminEmail:e,adminPassword:r,adminRole:o="super_admin",tenantId:i,emailConfig:a,sendWelcomeEmail:c=false}=t,s=t.authAdapter||new chunkHOP4D5XZ_cjs.a({path:t.authDbPath||"./data/auth.db"});try{await s.connect?.();}catch{return {success:false,error:"Failed to connect to auth storage"}}let l=new chunk5K4YG5DA_cjs.l().validate(r);if(!l.valid)return await s.disconnect?.(),{success:false,error:`Invalid password: ${l.errors.join(", ")}`};if(await s.findUserByEmail(e))return await s.disconnect?.(),{success:false,error:"Admin user already exists"};try{let n=await s.createUser({email:e,password:r,role:o||"admin",tenantId:i});if(await s.updateUser?.(n.id,{emailVerified:!0}),c&&a){let u=new chunk5K4YG5DA_cjs.k(a),w=u.getTemplates().welcome(e.split("@")[0]);await u.send({to:e,...w});}return await s.disconnect?.(),{success:!0,user:n}}catch(n){return await s.disconnect?.(),{success:false,error:n instanceof Error?n.message:"Failed to create admin user"}}}async function y(t,e){return !await t.findUserByEmail(e)}function A(){let t=process.env.KYRO_ADMIN_EMAIL,e=process.env.KYRO_ADMIN_PASSWORD;return !t||!e?null:{authDbPath:process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",adminEmail:t,adminPassword:e,adminRole:process.env.KYRO_ADMIN_ROLE||"super_admin",tenantId:process.env.KYRO_ADMIN_TENANT_ID,emailConfig:process.env.SMTP_HOST?{provider:"smtp",smtp:{host:process.env.SMTP_HOST,port:parseInt(process.env.SMTP_PORT||"587",10),secure:process.env.SMTP_SECURE==="true",auth:{user:process.env.SMTP_USER||"",pass:process.env.SMTP_PASS||""}},from:process.env.SMTP_FROM||"noreply@example.com",fromName:process.env.SMTP_FROM_NAME}:void 0,sendWelcomeEmail:process.env.KYRO_ADMIN_SEND_WELCOME==="true"}}async function T(t){let e=A();if(!e)return null;t&&(e.authAdapter=t);try{if(await e.authAdapter?.connect?.(),await e.authAdapter?.findUserByEmail(e.adminEmail))return await e.authAdapter?.disconnect?.(),{success:!1,error:"Admin user already exists"}}catch{}let r=await f(e);return r.success||console.error(`Bootstrap failed: ${r.error}`),r}async function v(t,e=3,r=2e3){let o="";for(let i=0;i<e;i++){let a=await f(t);if(a.success||(o=a.error||"Unknown error",o.includes("already exists")))return a;i<e-1&&await new Promise(c=>setTimeout(c,r));}return {success:false,error:`Failed after ${e} retries: ${o}`}}exports.a=f;exports.b=y;exports.c=A;exports.d=T;exports.e=v;
|
package/dist/chunk-6MSPBK3W.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import {l,k}from'./chunk-6J27P5D6.js';import {a}from'./chunk-IKOXCJYO.js';async function f(t){let{adminEmail:e,adminPassword:r,adminRole:o="super_admin",tenantId:i,emailConfig:a$1,sendWelcomeEmail:c=false}=t,s=t.authAdapter||new a({path:t.authDbPath||"./data/auth.db"});try{await s.connect?.();}catch{return {success:false,error:"Failed to connect to auth storage"}}let l$1=new l().validate(r);if(!l$1.valid)return await s.disconnect?.(),{success:false,error:`Invalid password: ${l$1.errors.join(", ")}`};if(await s.findUserByEmail(e))return await s.disconnect?.(),{success:false,error:"Admin user already exists"};try{let n=await s.createUser({email:e,password:r,role:o||"admin",tenantId:i});if(await s.updateUser?.(n.id,{emailVerified:!0}),c&&a$1){let u=new k(a$1),w=u.getTemplates().welcome(e.split("@")[0]);await u.send({to:e,...w});}return await s.disconnect?.(),{success:!0,user:n}}catch(n){return await s.disconnect?.(),{success:false,error:n instanceof Error?n.message:"Failed to create admin user"}}}async function y(t,e){return !await t.findUserByEmail(e)}function A(){let t=process.env.KYRO_ADMIN_EMAIL,e=process.env.KYRO_ADMIN_PASSWORD;return !t||!e?null:{authDbPath:process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",adminEmail:t,adminPassword:e,adminRole:process.env.KYRO_ADMIN_ROLE||"super_admin",tenantId:process.env.KYRO_ADMIN_TENANT_ID,emailConfig:process.env.SMTP_HOST?{provider:"smtp",smtp:{host:process.env.SMTP_HOST,port:parseInt(process.env.SMTP_PORT||"587",10),secure:process.env.SMTP_SECURE==="true",auth:{user:process.env.SMTP_USER||"",pass:process.env.SMTP_PASS||""}},from:process.env.SMTP_FROM||"noreply@example.com",fromName:process.env.SMTP_FROM_NAME}:void 0,sendWelcomeEmail:process.env.KYRO_ADMIN_SEND_WELCOME==="true"}}async function T(t){let e=A();if(!e)return null;t&&(e.authAdapter=t);try{if(await e.authAdapter?.connect?.(),await e.authAdapter?.findUserByEmail(e.adminEmail))return await e.authAdapter?.disconnect?.(),{success:!1,error:"Admin user already exists"}}catch{}let r=await f(e);return r.success||console.error(`Bootstrap failed: ${r.error}`),r}async function v(t,e=3,r=2e3){let o="";for(let i=0;i<e;i++){let a=await f(t);if(a.success||(o=a.error||"Unknown error",o.includes("already exists")))return a;i<e-1&&await new Promise(c=>setTimeout(c,r));}return {success:false,error:`Failed after ${e} retries: ${o}`}}export{f as a,y as b,A as c,T as d,v as e};
|