@kyro-cms/core 0.13.6 → 0.13.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/api-handler-graphql.cjs +1 -1
  2. package/dist/api-handler-graphql.js +1 -1
  3. package/dist/api-handler-trpc.cjs +1 -1
  4. package/dist/api-handler-trpc.js +1 -1
  5. package/dist/api-handler.cjs +1 -1
  6. package/dist/api-handler.js +1 -1
  7. package/dist/{chunk-A4XM33WO.js → chunk-3RIGRHON.js} +1 -1
  8. package/dist/{chunk-TG5YQ4PB.cjs → chunk-MCK2QRAU.cjs} +2 -2
  9. package/dist/{chunk-HACW42ZZ.cjs → chunk-O2SA56P2.cjs} +2 -2
  10. package/dist/chunk-O6I26T6A.js +3 -0
  11. package/dist/{chunk-VQWOCGJ2.cjs → chunk-PPGZHOYR.cjs} +1 -1
  12. package/dist/{chunk-N25DOGLQ.js → chunk-SYE3OS5T.js} +1 -1
  13. package/dist/{chunk-YLP3EKTQ.js → chunk-TVWHTVLI.js} +1 -1
  14. package/dist/chunk-UE7DTBD7.cjs +1 -0
  15. package/dist/chunk-XL64URKD.cjs +2 -0
  16. package/dist/chunk-YNBJGPIU.js +2 -0
  17. package/dist/cli/index.cjs +17 -17
  18. package/dist/cli/index.js +13 -13
  19. package/dist/index-B_39z2jP.d.cts +217 -0
  20. package/dist/index-xqpVL2Zq.d.ts +217 -0
  21. package/dist/index.cjs +13 -13
  22. package/dist/index.d.cts +2 -31
  23. package/dist/index.d.ts +2 -31
  24. package/dist/index.js +14 -14
  25. package/dist/{mongo-auth-adapter-33M5ENM7.cjs → mongo-auth-adapter-22MV3TI3.cjs} +1 -1
  26. package/dist/{mongo-auth-adapter-4ITULS2P.js → mongo-auth-adapter-66PWVRZW.js} +1 -1
  27. package/dist/mongodb/index.cjs +1 -1
  28. package/dist/mongodb/index.d.cts +3 -130
  29. package/dist/mongodb/index.d.ts +3 -130
  30. package/dist/mongodb/index.js +1 -1
  31. package/dist/rest/index.cjs +1 -1
  32. package/dist/rest/index.js +1 -1
  33. package/package.json +1 -1
  34. package/dist/chunk-CIWLQXB2.js +0 -2
  35. package/dist/chunk-GDLMPZKD.cjs +0 -2
  36. package/dist/chunk-NBBAMC2X.cjs +0 -1
  37. package/dist/chunk-VWXHW74B.js +0 -3
package/dist/cli/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import'../chunk-RLW6AQF2.js';import {Command}from'commander';import h,{readFileSync,existsSync,mkdirSync,writeFileSync}from'fs';import A,{dirname,join,resolve}from'path';import {fileURLToPath}from'url';import {glob}from'glob';import {execSync}from'child_process';import he from'prompts';import te from'crypto';import i from'chalk';import T from'ora';if (typeof window === "undefined") { const { createRequire } = await import(/* @vite-ignore */ 'module'); createRequire(import.meta.url); }
3
- function N(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(n=>`'${n.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(n=>`${R(n)} | string`).join(" | ");return e.hasMany?`(${t})[]`:`(${t})`}let o=e.relationTo||"unknown";return o==="*"?e.hasMany?"any[]":"any":e.hasMany?`(${R(o)} | string)[]`:`${R(o)} | string`;case "upload":return e.hasMany?"(Media | string)[]":"Media | string";case "array":return e.fields&&e.fields.length>0?`Array<{
3
+ function N(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(n=>`'${n.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(n=>`${P(n)} | string`).join(" | ");return e.hasMany?`(${t})[]`:`(${t})`}let o=e.relationTo||"unknown";return o==="*"?e.hasMany?"any[]":"any":e.hasMany?`(${P(o)} | string)[]`:`${P(o)} | string`;case "upload":return e.hasMany?"(Media | string)[]":"Media | string";case "array":return e.fields&&e.fields.length>0?`Array<{
4
4
  ${e.fields.filter(n=>n.name).map(n=>{let s=N(n);return ` ${n.name}${n.required?"":"?"}: ${s};`}).join(`
5
5
  `)}
6
6
  }>`:"Record<string, any>[]";case "group":return e.fields&&e.fields.length>0?`{
7
7
  ${e.fields.filter(n=>n.name).map(n=>{let s=N(n);return ` ${n.name}${n.required?"":"?"}: ${s};`}).join(`
8
8
  `)}
9
- }`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function R(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(o,t)=>t.toUpperCase())}function F(e){return e.replace(/-([a-z])/g,(o,t)=>t.toUpperCase())}function me(e){let o=R(e.slug),t=e.fields.filter(n=>n.name).map(n=>{let s=N(n);return ` ${n.name}${n.required?"":"?"}: ${s};`});return t.unshift(" id: string;"),t.push(" createdAt: string;"),t.push(" updatedAt: string;"),`export interface ${o} {
9
+ }`:"Record<string, any>";case "blocks":return "Block[]";default:return "any"}}function P(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-([a-z])/g,(o,t)=>t.toUpperCase())}function F(e){return e.replace(/-([a-z])/g,(o,t)=>t.toUpperCase())}function ue(e){let o=P(e.slug),t=e.fields.filter(n=>n.name).map(n=>{let s=N(n);return ` ${n.name}${n.required?"":"?"}: ${s};`});return t.unshift(" id: string;"),t.push(" createdAt: string;"),t.push(" updatedAt: string;"),`export interface ${o} {
10
10
  ${t.join(`
11
11
  `)}
12
- }`}function V(e){let o=e.map(r=>me(r)),t=`// ============================================================================
12
+ }`}function V(e){let o=e.map(r=>ue(r)),t=`// ============================================================================
13
13
  // Auto-generated by kyro generate
14
14
  // ============================================================================
15
15
 
@@ -97,7 +97,7 @@ export interface KyroDeleteResult<T> {
97
97
  // ============================================================================
98
98
 
99
99
  export interface KyroCollections {
100
- ${e.map(r=>` ${F(r.slug)}: ${R(r.slug)};`).join(`
100
+ ${e.map(r=>` ${F(r.slug)}: ${P(r.slug)};`).join(`
101
101
  `)}
102
102
  }
103
103
 
@@ -146,7 +146,7 @@ export interface Block {
146
146
  [key: string]: any;
147
147
  }
148
148
 
149
- `;for(let t of e){let n=R(t.slug),s=t.fields.filter(r=>r.name).map(r=>{let l=N(r);return ` ${r.name}${r.required?"":"?"}: ${l};`});s.unshift(" id: string;"),s.push(" createdAt: string;"),s.push(" updatedAt: string;"),o+=`export interface ${n} {
149
+ `;for(let t of e){let n=P(t.slug),s=t.fields.filter(r=>r.name).map(r=>{let l=N(r);return ` ${r.name}${r.required?"":"?"}: ${l};`});s.unshift(" id: string;"),s.push(" createdAt: string;"),s.push(" updatedAt: string;"),o+=`export interface ${n} {
150
150
  ${s.join(`
151
151
  `)}
152
152
  }
@@ -190,7 +190,7 @@ export function createKyroClient(opts: KyroClientOptions) {
190
190
  }
191
191
 
192
192
  return {
193
- ${e.map(t=>{let n=R(t.slug);return ` ${F(t.slug)}: {
193
+ ${e.map(t=>{let n=P(t.slug);return ` ${F(t.slug)}: {
194
194
  find: (args?: { where?: Record<string, any>; sort?: string; limit?: number; page?: number; draft?: boolean }) =>
195
195
  request<{ docs: ${n}[]; totalDocs: number; page: number; totalPages: number; hasNextPage: boolean; hasPrevPage: boolean }>(\`/${t.slug}\${args ? "?" + qs(args) : ""}\`),
196
196
  findByID: (id: string, args?: { draft?: boolean }) =>
@@ -209,7 +209,7 @@ ${e.map(t=>{let n=R(t.slug);return ` ${F(t.slug)}: {
209
209
  `)}
210
210
  };
211
211
  }
212
- `,o}function Z(){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 o=>{if(o.url){o.url||(console.error("\u274C --url is required when using --api"),process.exit(1)),o.apiKey||(console.error("\u274C --api-key is required when using --api"),process.exit(1));let s=resolve(o.output);try{let r=await ge(o.url,o.apiKey),l=fe(r),d=join(s,"..");existsSync(d)||mkdirSync(d,{recursive:!0}),writeFileSync(s,l);}catch(r){console.error("\u274C Error:",r.message),process.exit(1);}return}let t=resolve(o.config),n=resolve(o.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 r=[];for(let p of s)try{let u=await import(p),C=Object.values(u).filter(y=>y&&y.slug&&y.fields);r.push(...C);}catch{console.warn(`\u26A0\uFE0F Could not parse: ${p}`);}r.length===0&&(console.error("\u274C No valid collection configs found"),process.exit(1));let l=V(r),d=join(n,"..");if(existsSync(d)||mkdirSync(d,{recursive:!0}),writeFileSync(n,l),o.watch){let{watch:p}=await import('fs');p(t,{recursive:!0},async(u,C)=>{let y=[];for(let _ of s)try{let v=await import(_+`?t=${Date.now()}`),w=Object.values(v).filter(f=>f&&f.slug&&f.fields);y.push(...w);}catch{}let x=V(y);writeFileSync(n,x);});}}catch(s){console.error("\u274C Error:",s.message),process.exit(1);}})}function be(e=3){return te.randomBytes(e).toString("hex")}function we(){return te.randomBytes(12).toString("base64").replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}var X=`
212
+ `,o}function Z(){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 o=>{if(o.url){o.url||(console.error("\u274C --url is required when using --api"),process.exit(1)),o.apiKey||(console.error("\u274C --api-key is required when using --api"),process.exit(1));let s=resolve(o.output);try{let r=await ge(o.url,o.apiKey),l=fe(r),d=join(s,"..");existsSync(d)||mkdirSync(d,{recursive:!0}),writeFileSync(s,l);}catch(r){console.error("\u274C Error:",r.message),process.exit(1);}return}let t=resolve(o.config),n=resolve(o.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 r=[];for(let p of s)try{let m=await import(p),C=Object.values(m).filter(y=>y&&y.slug&&y.fields);r.push(...C);}catch{console.warn(`\u26A0\uFE0F Could not parse: ${p}`);}r.length===0&&(console.error("\u274C No valid collection configs found"),process.exit(1));let l=V(r),d=join(n,"..");if(existsSync(d)||mkdirSync(d,{recursive:!0}),writeFileSync(n,l),o.watch){let{watch:p}=await import('fs');p(t,{recursive:!0},async(m,C)=>{let y=[];for(let _ of s)try{let v=await import(_+`?t=${Date.now()}`),w=Object.values(v).filter(f=>f&&f.slug&&f.fields);y.push(...w);}catch{}let x=V(y);writeFileSync(n,x);});}}catch(s){console.error("\u274C Error:",s.message),process.exit(1);}})}function be(e=3){return te.randomBytes(e).toString("hex")}function we(){return te.randomBytes(12).toString("base64").replace(/[^a-zA-Z0-9]/g,"").slice(0,16)}var X=`
213
213
  [alias]
214
214
  "better-sqlite3" = "./cf-noop.js"
215
215
  "./redis-adapter.js" = "./cf-noop.js"
@@ -227,11 +227,11 @@ ${e.map(t=>{let n=R(t.slug);return ` ${F(t.slug)}: {
227
227
  export default {};
228
228
  `;function $e(e,o){let t=e.indexOf(o);if(t===-1)return "";let n=e.slice(t+o.length),s=n.search(/\n\s*(\[\[|\[)/);return n.slice(0,s===-1?void 0:s)}function B(e,o){let t=e.match(new RegExp(`^\\s*${o}\\s*=\\s*"([^"]*)"`,"m"));return t?t[1]:""}function U(e,o,t){let n=e,s=n.indexOf(o);for(;s!==-1;){let r=$e(n,o);if(B(r,"binding")===t)return r;n=n.slice(s+o.length+r.length),s=n.indexOf(o);}return ""}function Se(e){let o=h.readFileSync(e,"utf8"),t={name:"",database:"",d1Id:"",hyperId:"",r2Bucket:""},n=o.match(/^name\s*=\s*"([^"]*)"/m);n&&(t.name=n[1]);let s=U(o,"[[d1_databases]]","DB");s&&(t.database="d1",t.d1Id=B(s,"database_id"));let r=U(o,"[[hyperdrive]]","HYPERDRIVE");r&&(t.database="postgres",t.hyperId=B(r,"id"));let l=U(o,"[[r2_buckets]]","STORAGE_BUCKET");return l&&(t.r2Bucket=B(l,"bucket_name")),t}function ne(){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").option("-q, --quiet","Run without prompts or spinners").option("-j, --json","Emit a final JSON line with deploy results (for programmatic consumers)").action(async o=>{console.log(`
229
229
  ${i.cyan.bold("\u2726 Kyro CMS")} ${i.dim("\u2014 Cloudflare Deployment")}
230
- `);let t=be(),n=we(),{database:s,databaseUrl:r,name:l,r2Bucket:d,email:p,password:u,nonInteractive:C,quiet:y,json:x}=o;y&&(C=true);let _=`kyro-postgres-hd-${t}`,v=A.join(process.cwd(),"wrangler.toml"),w=h.existsSync(v)?Se(v):null,f=!!(w&&w.name);if(r&&!s&&(s="postgres"),f)console.log(`
230
+ `);let t=be(),n=we(),{database:s,databaseUrl:r,name:l,r2Bucket:d,email:p,password:m,nonInteractive:C,quiet:y,json:x}=o;y&&(C=true);let _=`kyro-postgres-hd-${t}`,v=A.join(process.cwd(),"wrangler.toml"),w=h.existsSync(v)?Se(v):null,f=!!(w&&w.name);if(r&&!s&&(s="postgres"),f)console.log(`
231
231
  ${i.cyan("\u267B")} Existing wrangler.toml found \u2014 redeploying "${w.name}"
232
- `);else if(!C&&process.stdout.isTTY){let a=[];s||a.push({type:"select",name:"database",message:"Select database infrastructure:",choices:[{title:"Cloudflare D1 (Native Serverless SQLite, auto-provisioned)",value:"d1"},{title:"PostgreSQL (External DB via Cloudflare Hyperdrive)",value:"postgres"}],initial:0}),s==="postgres"&&!r&&a.push({type:"text",name:"databaseUrl",message:"PostgreSQL Connection URL:"}),l||a.push({type:"text",name:"name",message:"Cloudflare Project Name:",initial:`kyro-app-${t}`}),d||a.push({type:"text",name:"r2Bucket",message:"Cloudflare R2 Bucket Name:",initial:`kyro-media-${t}`}),p||a.push({type:"text",name:"email",message:"Initial Super Admin Email:",initial:"admin@kyro-cms.com"}),u||a.push({type:"text",name:"password",message:"Initial Super Admin Password (leave blank to auto-generate):"});let c=await he(a);c.database&&(s=c.database),c.databaseUrl&&(r=c.databaseUrl),c.name&&(l=c.name),c.r2Bucket&&(d=c.r2Bucket),c.email&&(p=c.email),c.password&&(u=c.password);}let se=!!p,re=!!u;l=l||(f?w.name:`kyro-app-${t}`),d=d||(f?w.r2Bucket:"")||`kyro-media-${t}`,p=p||"admin@kyro-cms.com",u=u||n,s=s||(f?w.database:"d1")||"d1",console.log(i.bgGray.black.bold(`
232
+ `);else if(!C&&process.stdout.isTTY){let a=[];s||a.push({type:"select",name:"database",message:"Select database infrastructure:",choices:[{title:"Cloudflare D1 (Native Serverless SQLite, auto-provisioned)",value:"d1"},{title:"PostgreSQL (External DB via Cloudflare Hyperdrive)",value:"postgres"}],initial:0}),s==="postgres"&&!r&&a.push({type:"text",name:"databaseUrl",message:"PostgreSQL Connection URL:"}),l||a.push({type:"text",name:"name",message:"Cloudflare Project Name:",initial:`kyro-app-${t}`}),d||a.push({type:"text",name:"r2Bucket",message:"Cloudflare R2 Bucket Name:",initial:`kyro-media-${t}`}),p||a.push({type:"text",name:"email",message:"Initial Super Admin Email:",initial:"admin@kyro-cms.com"}),m||a.push({type:"text",name:"password",message:"Initial Super Admin Password (leave blank to auto-generate):"});let c=await he(a);c.database&&(s=c.database),c.databaseUrl&&(r=c.databaseUrl),c.name&&(l=c.name),c.r2Bucket&&(d=c.r2Bucket),c.email&&(p=c.email),c.password&&(m=c.password);}let se=!!p,re=!!m;l=l||(f?w.name:`kyro-app-${t}`),d=d||(f?w.r2Bucket:"")||`kyro-media-${t}`,p=p||"admin@kyro-cms.com",m=m||n,s=s||(f?w.database:"d1")||"d1",console.log(i.bgGray.black.bold(`
233
233
  Deployment Plan `)),console.log(` ${i.dim("\u251C\u2500")} Hosting : ${i.cyan("Cloudflare Workers with Assets")}`),console.log(` ${i.dim("\u251C\u2500")} Database : ${i.cyan(s==="d1"?"Cloudflare D1 (Native)":"PostgreSQL (Hyperdrive)")}`),console.log(` ${i.dim("\u251C\u2500")} Project : ${i.cyan(l)}`),console.log(` ${i.dim("\u251C\u2500")} R2 Bucket : ${i.cyan(d)}`),console.log(` ${i.dim("\u2514\u2500")} Admin : ${i.cyan(p)}
234
- `);let ie=h.existsSync(A.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",$="npx wrangler";try{execSync(`${$} whoami`,{stdio:"ignore"}),console.log(` ${i.green("\u2714")} Cloudflare Wrangler authenticated`);}catch{console.log(` ${i.red("\u2716")} Cloudflare Wrangler authentication required.`),console.log(` Run ${i.bold(`${$} login`)} or set the ${i.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let D="",O="",k=y?{isSilent:true}:{};if(f)D=w.d1Id,O=w.hyperId;else if(s==="postgres"){r||(console.log(` ${i.red("\u2716")} PostgreSQL mode requires a database URL.`),process.exit(1));let a=T({text:"Checking existing Hyperdrive resources...",...k}).start();try{let c=execSync(`${$} hyperdrive list --json`,{stdio:"pipe"}).toString(),m=JSON.parse(c.slice(c.indexOf("["))).find(K=>K.name===_);m&&(O=m.id||m.uuid),a.succeed("Hyperdrive check complete");}catch{a.fail("Failed to list Hyperdrive resources");}if(!O){let c=T({text:"Creating Hyperdrive...",...k}).start();try{let g=execSync(`${$} hyperdrive create "${_}" --connection-string="${r}" --json`,{stdio:"pipe"}).toString(),m=JSON.parse(g.slice(g.indexOf("{")));O=m.id||m.uuid,c.succeed("Hyperdrive created");}catch{c.fail("Failed to create Hyperdrive");}}console.log(` ${i.green("\u2714")} Hyperdrive resource ready (${_})`);}else {let a=`${l}-d1`,c=T({text:"Creating D1 database...",...k}).start();try{let m=execSync(`${$} d1 create "${a}"`,{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);m&&(D=m[1]),c.succeed("D1 database created");}catch{try{let m=execSync(`${$} d1 list --json`,{stdio:"pipe"}).toString(),P=JSON.parse(m).find(I=>I.name===a);P&&(D=P.id||P.uuid),c.succeed("Existing D1 database found");}catch{c.fail("Failed to create/find D1 database");}}D||(console.log(` ${i.red("\u2716")} Failed to create/find D1 database '${a}'. (D1 database limit may be reached).`),process.exit(1));}if(f){let a=h.readFileSync(v,"utf8"),c=false;a.includes('main = "admin/dist/server/index.mjs"')||(/^main\s*=.*$/m.test(a)?(a=a.replace(/^main\s*=.*$/m,'main = "admin/dist/server/index.mjs"'),c=true):(a=`main = "admin/dist/server/index.mjs"
234
+ `);let ie=h.existsSync(A.join(process.cwd(),"pnpm-lock.yaml"))?"pnpm":"npm",$="npx wrangler";try{execSync(`${$} whoami`,{stdio:"ignore"}),console.log(` ${i.green("\u2714")} Cloudflare Wrangler authenticated`);}catch{console.log(` ${i.red("\u2716")} Cloudflare Wrangler authentication required.`),console.log(` Run ${i.bold(`${$} login`)} or set the ${i.bold("CLOUDFLARE_API_TOKEN")} env var.`),process.exit(1);}let D="",O="",k=y?{isSilent:true}:{};if(f)D=w.d1Id,O=w.hyperId;else if(s==="postgres"){r||(console.log(` ${i.red("\u2716")} PostgreSQL mode requires a database URL.`),process.exit(1));let a=T({text:"Checking existing Hyperdrive resources...",...k}).start();try{let c=execSync(`${$} hyperdrive list --json`,{stdio:"pipe"}).toString(),u=JSON.parse(c.slice(c.indexOf("["))).find(K=>K.name===_);u&&(O=u.id||u.uuid),a.succeed("Hyperdrive check complete");}catch{a.fail("Failed to list Hyperdrive resources");}if(!O){let c=T({text:"Creating Hyperdrive...",...k}).start();try{let g=execSync(`${$} hyperdrive create "${_}" --connection-string="${r}" --json`,{stdio:"pipe"}).toString(),u=JSON.parse(g.slice(g.indexOf("{")));O=u.id||u.uuid,c.succeed("Hyperdrive created");}catch{c.fail("Failed to create Hyperdrive");}}console.log(` ${i.green("\u2714")} Hyperdrive resource ready (${_})`);}else {let a=`${l}-d1`,c=T({text:"Creating D1 database...",...k}).start();try{let u=execSync(`${$} d1 create "${a}"`,{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);u&&(D=u[1]),c.succeed("D1 database created");}catch{try{let u=execSync(`${$} d1 list --json`,{stdio:"pipe"}).toString(),R=JSON.parse(u).find(I=>I.name===a);R&&(D=R.id||R.uuid),c.succeed("Existing D1 database found");}catch{c.fail("Failed to create/find D1 database");}}D||(console.log(` ${i.red("\u2716")} Failed to create/find D1 database '${a}'. (D1 database limit may be reached).`),process.exit(1));}if(f){let a=h.readFileSync(v,"utf8"),c=false;a.includes('main = "admin/dist/server/index.mjs"')||(/^main\s*=.*$/m.test(a)?(a=a.replace(/^main\s*=.*$/m,'main = "admin/dist/server/index.mjs"'),c=true):(a=`main = "admin/dist/server/index.mjs"
235
235
  `+a,c=true)),a.includes("[alias]")||(a+=X,c=true),c&&h.writeFileSync(v,a,"utf8"),h.existsSync(A.join(process.cwd(),"cf-noop.js"))||h.writeFileSync(A.join(process.cwd(),"cf-noop.js"),ee,"utf8");}else {let a=T({text:"Creating R2 bucket...",...k}).start();try{execSync(`${$} r2 bucket create "${d}"`,{stdio:"ignore"}),a.succeed("R2 bucket created");}catch{a.fail("Failed to create R2 bucket");}try{execSync(`echo "y" | ${$} r2 bucket dev-url enable "${d}"`,{stdio:"ignore"});}catch{}let c=T({text:"Generating wrangler.toml...",...k}).start(),g=`name = "${l}"
236
236
  compatibility_date = "2026-07-31"
237
237
  compatibility_flags = ["nodejs_compat"]
@@ -256,10 +256,10 @@ bucket_name = "${d}"
256
256
  `+a,"utf8"),z.succeed("Build complete");}catch(a){let c=a?.stdout?.toString?.()||W||"";z.fail("Build failed"),c&&process.stdout.write(c),console.log(`
257
257
  ${i.red("\u2716")} Build failed. Inspect output above.`),process.exit(1);}let H=T({text:"Deploying to Cloudflare Workers...",...k}).start();h.existsSync(A.join(process.cwd(),".wrangler"))&&h.rmSync(A.join(process.cwd(),".wrangler"),{recursive:true,force:true});let E="";try{let a=execSync(`${$} deploy`,{stdio:"pipe",maxBuffer:67108864}).toString();process.stdout.write(a);let c=a.match(/https:\/\/[a-zA-Z0-9._-]+\.workers\.dev/);c&&(E=c[0]),H.succeed("Deployment successful"),console.log(`
258
258
  ${i.green.bold("\u{1F389} Deployment Successful!")}
259
- `);let g=!f||se||re,m=!1;if(g){let P=T({text:"Storing admin credentials as worker secrets...",...k}).start(),I=!0,G=(ae,ce)=>{try{execSync(`${$} secret put ${ae}`,{input:ce,stdio:["pipe","ignore","pipe"]});}catch{I=!1;}};G("KYRO_ADMIN_EMAIL",p),G("KYRO_ADMIN_PASSWORD",u),I?(m=!0,P.succeed("Admin credentials stored as worker secrets")):P.warn("Could not store admin credentials \u2014 set KYRO_ADMIN_EMAIL / KYRO_ADMIN_PASSWORD manually");}let K=!f||m?u:null;f&&console.log(m?` ${i.dim("Redeployed")} ${i.cyan(l)} \u2014 admin credentials updated.`:` ${i.dim("Redeployed")} ${i.cyan(l)} \u2014 existing resources and admin credentials are unchanged.`),K&&(console.log(` ${i.bold("Super Admin Credentials")}`),console.log(` ${i.dim("\u251C\u2500")} ${i.bold("Email :")} ${i.cyan(p)}`),console.log(` ${i.dim("\u2514\u2500")} ${i.bold("Password:")} ${i.yellow.bold(u)}`)),E&&console.log(` ${i.dim("\u2514\u2500")} ${i.bold("Live URL:")} ${i.cyan(E)}`),f||console.log(`
259
+ `);let g=!f||se||re,u=!1;if(g){let R=T({text:"Storing admin credentials as worker secrets...",...k}).start(),I=!0,G=(ae,ce)=>{try{execSync(`${$} secret put ${ae}`,{input:ce,stdio:["pipe","ignore","pipe"]});}catch{I=!1;}};G("KYRO_ADMIN_EMAIL",p),G("KYRO_ADMIN_PASSWORD",m),I?(u=!0,R.succeed("Admin credentials stored as worker secrets")):R.warn("Could not store admin credentials \u2014 set KYRO_ADMIN_EMAIL / KYRO_ADMIN_PASSWORD manually");}let K=!f||u?m:null;f&&console.log(u?` ${i.dim("Redeployed")} ${i.cyan(l)} \u2014 admin credentials updated.`:` ${i.dim("Redeployed")} ${i.cyan(l)} \u2014 existing resources and admin credentials are unchanged.`),K&&(console.log(` ${i.bold("Super Admin Credentials")}`),console.log(` ${i.dim("\u251C\u2500")} ${i.bold("Email :")} ${i.cyan(p)}`),console.log(` ${i.dim("\u2514\u2500")} ${i.bold("Password:")} ${i.yellow.bold(m)}`)),E&&console.log(` ${i.dim("\u2514\u2500")} ${i.bold("Live URL:")} ${i.cyan(E)}`),f||console.log(`
260
260
  ${i.dim("\u26A0\uFE0F Save these credentials. Password won't be shown again.")}
261
- `),x&&process.stdout.write(JSON.stringify({ok:!0,liveUrl:E,adminEmail:p,adminPassword:K,redeploy:f,credentialsUpdated:m})+`
261
+ `),x&&process.stdout.write(JSON.stringify({ok:!0,liveUrl:E,adminEmail:p,adminPassword:K,redeploy:f,credentialsUpdated:u})+`
262
262
  `);}catch(a){let c=a?.stdout?.toString?.()||"",g=a?.stderr?.toString?.()||"";H.fail("Deployment failed"),c&&process.stdout.write(c),g&&process.stdout.write(g),console.log(`
263
263
  ${i.red.bold("\u2716 Deployment Failed!")}`),console.log(` ${i.dim("See the Wrangler error above.")}
264
264
  `),x&&process.stdout.write(JSON.stringify({ok:false,error:"Deployment failed"})+`
265
- `),process.exit(1);}}),e}var Ae=fileURLToPath(import.meta.url),Te=dirname(Ae),oe="0.1.0";try{oe=JSON.parse(readFileSync(join(Te,"../../package.json"),"utf-8")).version;}catch{}var S=new Command;S.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(oe);S.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:o}=await import('child_process'),t=o(`astro dev --port ${e.port} --host ${e.host}`,{env:{...process.env,NODE_NO_WARNINGS:"1"}});t.stdout?.on("data",n=>process.stdout.write(n)),t.stderr?.on("data",n=>process.stderr.write(n)),process.on("SIGINT",()=>{t.kill("SIGINT"),process.exit(0);}),process.on("SIGTERM",()=>{t.kill("SIGTERM"),process.exit(0);});});S.command("start").description("Start Kyro CMS in production mode").option("-p, --port <port>","Port to run on",process.env.PORT||"4321").option("-h, --host <host>","Host to bind to",process.env.HOST||"0.0.0.0").action(async e=>{let{spawn:o}=await import('child_process'),{existsSync:t}=await import('fs'),n=join(process.cwd(),"admin"),r=[join(n,"dist","server","index.mjs"),join(n,"dist","server","entry.mjs"),join(process.cwd(),"dist","server","index.mjs"),join(process.cwd(),"dist","server","entry.mjs")].find(d=>t(d));console.log(`\u{1F680} Starting Kyro CMS on ${e.host}:${e.port}`);let l;r?(console.log(`\u2713 Serving via standalone entrypoint: ${r}`),l=o("node",[r],{env:{...process.env,HOST:e.host,PORT:e.port,NODE_ENV:"production"},stdio:"inherit"})):(console.warn(`\u26A0\uFE0F Standalone entrypoint not found, falling back to astro preview in ${n}`),l=o("node",["./node_modules/.bin/astro","preview","--port",e.port,"--host",e.host],{cwd:t(n)?n:process.cwd(),env:{...process.env,NODE_ENV:"production"},stdio:"inherit"})),l.on("exit",d=>process.exit(d??0)),process.on("SIGTERM",()=>l.kill("SIGTERM")),process.on("SIGINT",()=>l.kill("SIGINT"));});S.addCommand(Z());S.addCommand(ne());var M=S.command("db").description("Database management commands");M.command("generate").description("Generate migrations from schema").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit generate",(o,t,n)=>{o&&(console.error("\u274C Generation failed:",o.message),process.exit(1));});});M.command("migrate").description("Run database migrations").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit migrate",(o,t,n)=>{o&&(console.error("\u274C Migration failed:",o.message),process.exit(1));});});M.command("push").description("Push schema to database (development)").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit push",(o,t,n)=>{o&&(console.error("\u274C Push failed:",o.message),process.exit(1));});});M.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",(o,t,n)=>{o&&(console.error("\u274C Seeding failed:",o.message),process.exit(1));});});M.command("studio").description("Open Drizzle Studio").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit studio",(o,t,n)=>{o&&(console.error("\u274C Studio failed:",o.message),process.exit(1));});});var Re=S.command("auth").description("Authentication management commands");Re.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:o}=await import('../bootstrap-TTMLNQM3.js'),t=process.env.DATABASE_URL||"",n=t.toLowerCase().startsWith("postgres://")||t.toLowerCase().startsWith("postgresql://"),s=t.toLowerCase().startsWith("mongodb://")||t.toLowerCase().startsWith("mongodb+srv://"),r=!t||t.includes(".db")||t.includes("sqlite")||t.includes("file:"),l;if(n){let{PostgresAuthAdapter:p}=await import('../postgres-auth-adapter-7BCPXNBO.js'),{drizzle:u}=await import('drizzle-orm/postgres-js'),{default:C}=await import('postgres'),y=C(t,{max:1,onnotice:()=>{}}),x=u(y);l=new p({db:x});}else if(s){let{MongoDBAuthAdapter:p}=await import('../mongo-auth-adapter-4ITULS2P.js'),u=await import('mongodb'),C=u.MongoClient??u.default?.MongoClient,y=new C(t);await y.connect();let x=y.db();l=new p({db:x});}else {let{SQLiteAuthAdapter:p}=await import('../sqlite-adapter-TT6ZASDG.js'),u=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";l=new p({path:u});}l.connect&&await l.connect();let d=await o({authAdapter:l,adminEmail:e.email,adminPassword:e.password,adminRole:e.role});l.disconnect&&await l.disconnect(),d.success||(console.error("\u274C Failed to create admin:",d.error),process.exit(1));}catch(o){console.error("\u274C Bootstrap failed:",o),process.exit(1);}});S.command("health").description("Check system health").action(async()=>{let e=process.env.DATABASE_URL||"",o=e.toLowerCase().startsWith("postgres://")||e.toLowerCase().startsWith("postgresql://"),t=e.toLowerCase().startsWith("mongodb://")||e.toLowerCase().startsWith("mongodb+srv://"),n=!e||e.includes(".db")||e.includes("sqlite")||e.includes("file:");if(o)try{let{default:s}=await import('postgres'),r=s(e,{max:1,onnotice:()=>{}});await r.unsafe("SELECT 1"),await r.end();}catch{}else if(t)try{let s=await import('mongodb'),r=s.MongoClient??s.default?.MongoClient,l=new r(e);await l.connect(),await l.db().admin().ping(),await l.close();}catch{}else if(n)try{let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",{existsSync:r}=await import('fs');r(s);}catch{}});S.parse();process.argv.slice(2).length||S.outputHelp();
265
+ `),process.exit(1);}}),e}var Ae=fileURLToPath(import.meta.url),Te=dirname(Ae),oe="0.1.0";try{oe=JSON.parse(readFileSync(join(Te,"../../package.json"),"utf-8")).version;}catch{}var S=new Command;S.name("kyro").description("Kyro CMS - Astro-native headless CMS").version(oe);S.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:o}=await import('child_process'),t=o(`astro dev --port ${e.port} --host ${e.host}`,{env:{...process.env,NODE_NO_WARNINGS:"1"}});t.stdout?.on("data",n=>process.stdout.write(n)),t.stderr?.on("data",n=>process.stderr.write(n)),process.on("SIGINT",()=>{t.kill("SIGINT"),process.exit(0);}),process.on("SIGTERM",()=>{t.kill("SIGTERM"),process.exit(0);});});S.command("start").description("Start Kyro CMS in production mode").option("-p, --port <port>","Port to run on",process.env.PORT||"4321").option("-h, --host <host>","Host to bind to",process.env.HOST||"0.0.0.0").action(async e=>{let{spawn:o}=await import('child_process'),{existsSync:t}=await import('fs'),n=join(process.cwd(),"admin"),r=[join(n,"dist","server","index.mjs"),join(n,"dist","server","entry.mjs"),join(process.cwd(),"dist","server","index.mjs"),join(process.cwd(),"dist","server","entry.mjs")].find(d=>t(d));console.log(`\u{1F680} Starting Kyro CMS on ${e.host}:${e.port}`);let l;r?(console.log(`\u2713 Serving via standalone entrypoint: ${r}`),l=o("node",[r],{env:{...process.env,HOST:e.host,PORT:e.port,NODE_ENV:"production"},stdio:"inherit"})):(console.warn(`\u26A0\uFE0F Standalone entrypoint not found, falling back to astro preview in ${n}`),l=o("node",["./node_modules/.bin/astro","preview","--port",e.port,"--host",e.host],{cwd:t(n)?n:process.cwd(),env:{...process.env,NODE_ENV:"production"},stdio:"inherit"})),l.on("exit",d=>process.exit(d??0)),process.on("SIGTERM",()=>l.kill("SIGTERM")),process.on("SIGINT",()=>l.kill("SIGINT"));});S.addCommand(Z());S.addCommand(ne());var M=S.command("db").description("Database management commands");M.command("generate").description("Generate migrations from schema").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit generate",(o,t,n)=>{o&&(console.error("\u274C Generation failed:",o.message),process.exit(1));});});M.command("migrate").description("Run database migrations").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit migrate",(o,t,n)=>{o&&(console.error("\u274C Migration failed:",o.message),process.exit(1));});});M.command("push").description("Push schema to database (development)").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit push",(o,t,n)=>{o&&(console.error("\u274C Push failed:",o.message),process.exit(1));});});M.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",(o,t,n)=>{o&&(console.error("\u274C Seeding failed:",o.message),process.exit(1));});});M.command("studio").description("Open Drizzle Studio").action(async()=>{let{exec:e}=await import('child_process');e("npx drizzle-kit studio",(o,t,n)=>{o&&(console.error("\u274C Studio failed:",o.message),process.exit(1));});});var Pe=S.command("auth").description("Authentication management commands");Pe.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:o}=await import('../bootstrap-TTMLNQM3.js'),t=process.env.DATABASE_URL||"",n=t.toLowerCase().startsWith("postgres://")||t.toLowerCase().startsWith("postgresql://"),s=t.toLowerCase().startsWith("mongodb://")||t.toLowerCase().startsWith("mongodb+srv://"),r=!t||t.includes(".db")||t.includes("sqlite")||t.includes("file:"),l;if(n){let{PostgresAuthAdapter:p}=await import('../postgres-auth-adapter-7BCPXNBO.js'),{drizzle:m}=await import('drizzle-orm/postgres-js'),{default:C}=await import('postgres'),y=C(t,{max:1,onnotice:()=>{}}),x=m(y);l=new p({db:x});}else if(s){let{MongoDBAuthAdapter:p}=await import('../mongo-auth-adapter-66PWVRZW.js'),m=await import('mongodb'),C=m.MongoClient??m.default?.MongoClient,y=new C(t,{maxPoolSize:1,minPoolSize:0,serverSelectionTimeoutMS:5e3});await y.connect();let x=y.db();l=new p({db:x,client:y});}else {let{SQLiteAuthAdapter:p}=await import('../sqlite-adapter-TT6ZASDG.js'),m=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db";l=new p({path:m});}l.connect&&await l.connect();let d=await o({authAdapter:l,adminEmail:e.email,adminPassword:e.password,adminRole:e.role});l.disconnect&&await l.disconnect(),d.success||(console.error("\u274C Failed to create admin:",d.error),process.exit(1));}catch(o){console.error("\u274C Bootstrap failed:",o),process.exit(1);}});S.command("health").description("Check system health").action(async()=>{let e=process.env.DATABASE_URL||"",o=e.toLowerCase().startsWith("postgres://")||e.toLowerCase().startsWith("postgresql://"),t=e.toLowerCase().startsWith("mongodb://")||e.toLowerCase().startsWith("mongodb+srv://"),n=!e||e.includes(".db")||e.includes("sqlite")||e.includes("file:");if(o)try{let{default:s}=await import('postgres'),r=s(e,{max:1,onnotice:()=>{}});await r.unsafe("SELECT 1"),await r.end();}catch{}else if(t){let s;try{let r=await import('mongodb'),l=r.MongoClient??r.default?.MongoClient;s=new l(e,{maxPoolSize:1,minPoolSize:0,serverSelectionTimeoutMS:5e3}),await s.connect(),await s.db().admin().ping();}catch{}finally{if(s)try{await s.close();}catch{}}}else if(n)try{let s=process.env.KYRO_AUTH_DB_PATH||"./data/auth.db",{existsSync:r}=await import('fs');r(s);}catch{}});S.parse();process.argv.slice(2).length||S.outputHelp();
@@ -0,0 +1,217 @@
1
+ import { b as AbstractBaseAdapter, c as AuthAdapter, U as UserRole, d as AuthUser, S as Session, a as AuditLogFilter, A as AuditLog } from './base-DIpT2Vuz.cjs';
2
+ import { F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, U as UpdateArgs, D as DeleteArgs, e as FindOneArgs, f as FindVersionsArgs, V as VersionRecord, g as CreateVersionArgs } from './types-CdwfDpyW.cjs';
3
+
4
+ type DatabaseType = 'postgres' | 'sqlite' | 'mongodb';
5
+ interface DatabaseConnectionOptions {
6
+ type: DatabaseType;
7
+ host?: string;
8
+ port?: number;
9
+ database?: string;
10
+ user?: string;
11
+ password?: string;
12
+ url?: string;
13
+ ssl?: boolean | Record<string, any>;
14
+ maxConnections?: number;
15
+ connectionTimeout?: number;
16
+ }
17
+ interface DrizzleAdapterOptions {
18
+ type?: 'postgres' | 'sqlite';
19
+ client?: any;
20
+ schema?: any;
21
+ connectionString?: string;
22
+ connectionOptions?: DatabaseConnectionOptions;
23
+ }
24
+ interface MongoDBAdapterOptions {
25
+ type?: 'mongodb';
26
+ client?: any;
27
+ database?: string;
28
+ connectionString?: string;
29
+ connectionOptions?: DatabaseConnectionOptions;
30
+ /**
31
+ * Maximum number of connections in the connection pool.
32
+ * Defaults to 10 (or process.env.MONGODB_MAX_POOL_SIZE).
33
+ * Note: Default MongoDB driver setting is 100, which can easily overwhelm
34
+ * MongoDB Atlas free/shared tiers (e.g. M0 limit is 500 connections cluster-wide).
35
+ */
36
+ maxPoolSize?: number;
37
+ /**
38
+ * Minimum number of connections in the connection pool.
39
+ * Defaults to 1 (or process.env.MONGODB_MIN_POOL_SIZE).
40
+ */
41
+ minPoolSize?: number;
42
+ /**
43
+ * Maximum number of milliseconds that a connection can remain idle in the pool before being removed.
44
+ * Defaults to 30000 (30 seconds).
45
+ */
46
+ maxIdleTimeMS?: number;
47
+ /**
48
+ * How long the MongoDB driver will attempt to select a server before timing out.
49
+ * Defaults to 5000 (5 seconds).
50
+ */
51
+ serverSelectionTimeoutMS?: number;
52
+ /**
53
+ * How long a connection attempt can take before timing out.
54
+ * Defaults to 10000 (10 seconds).
55
+ */
56
+ connectTimeoutMS?: number;
57
+ /**
58
+ * How long a send or receive on a socket can take before timing out.
59
+ */
60
+ socketTimeoutMS?: number;
61
+ /**
62
+ * Additional raw MongoClientOptions passed directly to MongoClient.
63
+ */
64
+ clientOptions?: Record<string, any>;
65
+ /**
66
+ * Whether to disable global client caching across HMR / module reloads in development.
67
+ * Defaults to false (caching enabled).
68
+ */
69
+ disableGlobalClientCache?: boolean;
70
+ }
71
+ type AdapterOptions = DrizzleAdapterOptions | MongoDBAdapterOptions;
72
+
73
+ declare class MongoDBAdapter extends AbstractBaseAdapter {
74
+ dialect: "mongodb";
75
+ client: any;
76
+ db: any;
77
+ private database;
78
+ private connectionString?;
79
+ private options;
80
+ constructor(options: MongoDBAdapterOptions);
81
+ /**
82
+ * Resolves the default connection pool options for MongoDB to prevent
83
+ * connection pool exhaustion in serverless / Astro / Next.js environments.
84
+ */
85
+ private getPoolOptions;
86
+ connect(): Promise<void>;
87
+ disconnect(options?: {
88
+ force?: boolean;
89
+ }): Promise<void>;
90
+ /**
91
+ * Helper to retrieve or initialize a singleton MongoDB Db instance.
92
+ */
93
+ static getDb(options?: MongoDBAdapterOptions | string): Promise<any>;
94
+ /**
95
+ * Helper to retrieve or initialize a singleton MongoClient instance.
96
+ */
97
+ static getClient(options?: MongoDBAdapterOptions | string): Promise<any>;
98
+ private getMongoCollection;
99
+ find<T>(args: FindArgs): Promise<FindResult<T>>;
100
+ private buildIdFilter;
101
+ findByID<T>(args: FindByIDArgs): Promise<T | null>;
102
+ create<T>(args: CreateArgs): Promise<T>;
103
+ update<T>(args: UpdateArgs): Promise<T>;
104
+ delete<T>(args: DeleteArgs): Promise<T>;
105
+ count(args: {
106
+ collection: string;
107
+ where?: Record<string, any>;
108
+ tenantId?: string;
109
+ }): Promise<number>;
110
+ findOne(args: FindOneArgs): Promise<any>;
111
+ findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>>;
112
+ findVersionByID(args: {
113
+ collection: string;
114
+ versionId: string;
115
+ tenantId?: string;
116
+ }): Promise<VersionRecord | null>;
117
+ createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
118
+ updateLatestVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
119
+ deleteVersions(args: {
120
+ collection: string;
121
+ documentId: string;
122
+ keepLatest?: number;
123
+ tenantId?: string;
124
+ }): Promise<void>;
125
+ migrate?(): Promise<void>;
126
+ private getCollectionConfig;
127
+ private buildFilter;
128
+ private buildProjection;
129
+ private processResult;
130
+ private generateId;
131
+ }
132
+ declare function createMongoDBAdapter(options: MongoDBAdapterOptions): MongoDBAdapter;
133
+ /**
134
+ * Global helper to access or initialize a pooled MongoDB Db singleton instance.
135
+ */
136
+ declare function getMongoDb(options?: MongoDBAdapterOptions | string): Promise<any>;
137
+ /**
138
+ * Global helper to access or initialize a pooled MongoClient singleton instance.
139
+ */
140
+ declare function getMongoClient(options?: MongoDBAdapterOptions | string): Promise<any>;
141
+
142
+ interface MongoDBAuthAdapterOptions {
143
+ db?: any | (() => any);
144
+ adapter?: any;
145
+ client?: any;
146
+ collectionPrefix?: string;
147
+ sessionTTL?: number;
148
+ refreshTokenTTL?: number;
149
+ }
150
+ declare class MongoDBAuthAdapter implements AuthAdapter {
151
+ private db;
152
+ private adapter;
153
+ private client;
154
+ private prefix;
155
+ private sessionTTL;
156
+ private refreshTokenTTL;
157
+ private indexesEnsured;
158
+ constructor(options: MongoDBAuthAdapterOptions);
159
+ private getDatabase;
160
+ private col;
161
+ connect(): Promise<void>;
162
+ disconnect(): Promise<void>;
163
+ private ensureIndexes;
164
+ createUser(data: {
165
+ email: string;
166
+ password: string;
167
+ name?: string;
168
+ role?: UserRole;
169
+ avatar?: string;
170
+ tenantId?: string;
171
+ }): Promise<AuthUser>;
172
+ findUserByEmail(email: string): Promise<AuthUser | null>;
173
+ findUserById(id: string): Promise<AuthUser | null>;
174
+ updateUser(id: string, data: Partial<AuthUser>): Promise<AuthUser | null>;
175
+ deleteUser(id: string): Promise<boolean>;
176
+ verifyPassword(email: string, password: string): Promise<AuthUser | null>;
177
+ hashPassword(password: string): Promise<string>;
178
+ createSession(userId: string, data?: {
179
+ ipAddress?: string;
180
+ userAgent?: string;
181
+ }): Promise<Session>;
182
+ findSessionByToken(token: string): Promise<Session | null>;
183
+ findSessionByRefreshToken(refreshToken: string): Promise<Session | null>;
184
+ deleteSession(sessionId: string): Promise<boolean>;
185
+ deleteUserSessions(userId: string): Promise<number>;
186
+ hasAnyUsers(): Promise<boolean>;
187
+ addPasswordToHistory(userId: string, passwordHash: string): Promise<void>;
188
+ getPasswordHistory(userId: string, count?: number): Promise<string[]>;
189
+ isPasswordInHistory(password: string, userId: string, historyCount?: number): Promise<boolean>;
190
+ findAuditLogs(filter: AuditLogFilter): Promise<{
191
+ logs: AuditLog[];
192
+ total: number;
193
+ }>;
194
+ createAuditLog(data: Omit<AuditLog, "id" | "timestamp">): Promise<AuditLog>;
195
+ private docToAuthUser;
196
+ private docToSession;
197
+ createEmailVerificationToken(userId: string): Promise<{
198
+ token: string;
199
+ expiresAt: Date;
200
+ }>;
201
+ verifyEmailToken(token: string): Promise<{
202
+ success: boolean;
203
+ userId?: string;
204
+ error?: string;
205
+ }>;
206
+ createPasswordResetToken(email: string): Promise<{
207
+ token: string;
208
+ expiresAt: Date;
209
+ error?: string;
210
+ }>;
211
+ resetPasswordWithToken(token: string, newPassword: string): Promise<{
212
+ success: boolean;
213
+ error?: string;
214
+ }>;
215
+ }
216
+
217
+ export { type AdapterOptions as A, type DatabaseConnectionOptions as D, MongoDBAdapter as M, type DatabaseType as a, type DrizzleAdapterOptions as b, type MongoDBAdapterOptions as c, MongoDBAuthAdapter as d, createMongoDBAdapter as e, getMongoDb as f, getMongoClient as g };
@@ -0,0 +1,217 @@
1
+ import { b as AbstractBaseAdapter, c as AuthAdapter, U as UserRole, d as AuthUser, S as Session, a as AuditLogFilter, A as AuditLog } from './base-C2DOe8wD.js';
2
+ import { F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, U as UpdateArgs, D as DeleteArgs, e as FindOneArgs, f as FindVersionsArgs, V as VersionRecord, g as CreateVersionArgs } from './types-CKWnrUAh.js';
3
+
4
+ type DatabaseType = 'postgres' | 'sqlite' | 'mongodb';
5
+ interface DatabaseConnectionOptions {
6
+ type: DatabaseType;
7
+ host?: string;
8
+ port?: number;
9
+ database?: string;
10
+ user?: string;
11
+ password?: string;
12
+ url?: string;
13
+ ssl?: boolean | Record<string, any>;
14
+ maxConnections?: number;
15
+ connectionTimeout?: number;
16
+ }
17
+ interface DrizzleAdapterOptions {
18
+ type?: 'postgres' | 'sqlite';
19
+ client?: any;
20
+ schema?: any;
21
+ connectionString?: string;
22
+ connectionOptions?: DatabaseConnectionOptions;
23
+ }
24
+ interface MongoDBAdapterOptions {
25
+ type?: 'mongodb';
26
+ client?: any;
27
+ database?: string;
28
+ connectionString?: string;
29
+ connectionOptions?: DatabaseConnectionOptions;
30
+ /**
31
+ * Maximum number of connections in the connection pool.
32
+ * Defaults to 10 (or process.env.MONGODB_MAX_POOL_SIZE).
33
+ * Note: Default MongoDB driver setting is 100, which can easily overwhelm
34
+ * MongoDB Atlas free/shared tiers (e.g. M0 limit is 500 connections cluster-wide).
35
+ */
36
+ maxPoolSize?: number;
37
+ /**
38
+ * Minimum number of connections in the connection pool.
39
+ * Defaults to 1 (or process.env.MONGODB_MIN_POOL_SIZE).
40
+ */
41
+ minPoolSize?: number;
42
+ /**
43
+ * Maximum number of milliseconds that a connection can remain idle in the pool before being removed.
44
+ * Defaults to 30000 (30 seconds).
45
+ */
46
+ maxIdleTimeMS?: number;
47
+ /**
48
+ * How long the MongoDB driver will attempt to select a server before timing out.
49
+ * Defaults to 5000 (5 seconds).
50
+ */
51
+ serverSelectionTimeoutMS?: number;
52
+ /**
53
+ * How long a connection attempt can take before timing out.
54
+ * Defaults to 10000 (10 seconds).
55
+ */
56
+ connectTimeoutMS?: number;
57
+ /**
58
+ * How long a send or receive on a socket can take before timing out.
59
+ */
60
+ socketTimeoutMS?: number;
61
+ /**
62
+ * Additional raw MongoClientOptions passed directly to MongoClient.
63
+ */
64
+ clientOptions?: Record<string, any>;
65
+ /**
66
+ * Whether to disable global client caching across HMR / module reloads in development.
67
+ * Defaults to false (caching enabled).
68
+ */
69
+ disableGlobalClientCache?: boolean;
70
+ }
71
+ type AdapterOptions = DrizzleAdapterOptions | MongoDBAdapterOptions;
72
+
73
+ declare class MongoDBAdapter extends AbstractBaseAdapter {
74
+ dialect: "mongodb";
75
+ client: any;
76
+ db: any;
77
+ private database;
78
+ private connectionString?;
79
+ private options;
80
+ constructor(options: MongoDBAdapterOptions);
81
+ /**
82
+ * Resolves the default connection pool options for MongoDB to prevent
83
+ * connection pool exhaustion in serverless / Astro / Next.js environments.
84
+ */
85
+ private getPoolOptions;
86
+ connect(): Promise<void>;
87
+ disconnect(options?: {
88
+ force?: boolean;
89
+ }): Promise<void>;
90
+ /**
91
+ * Helper to retrieve or initialize a singleton MongoDB Db instance.
92
+ */
93
+ static getDb(options?: MongoDBAdapterOptions | string): Promise<any>;
94
+ /**
95
+ * Helper to retrieve or initialize a singleton MongoClient instance.
96
+ */
97
+ static getClient(options?: MongoDBAdapterOptions | string): Promise<any>;
98
+ private getMongoCollection;
99
+ find<T>(args: FindArgs): Promise<FindResult<T>>;
100
+ private buildIdFilter;
101
+ findByID<T>(args: FindByIDArgs): Promise<T | null>;
102
+ create<T>(args: CreateArgs): Promise<T>;
103
+ update<T>(args: UpdateArgs): Promise<T>;
104
+ delete<T>(args: DeleteArgs): Promise<T>;
105
+ count(args: {
106
+ collection: string;
107
+ where?: Record<string, any>;
108
+ tenantId?: string;
109
+ }): Promise<number>;
110
+ findOne(args: FindOneArgs): Promise<any>;
111
+ findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>>;
112
+ findVersionByID(args: {
113
+ collection: string;
114
+ versionId: string;
115
+ tenantId?: string;
116
+ }): Promise<VersionRecord | null>;
117
+ createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
118
+ updateLatestVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
119
+ deleteVersions(args: {
120
+ collection: string;
121
+ documentId: string;
122
+ keepLatest?: number;
123
+ tenantId?: string;
124
+ }): Promise<void>;
125
+ migrate?(): Promise<void>;
126
+ private getCollectionConfig;
127
+ private buildFilter;
128
+ private buildProjection;
129
+ private processResult;
130
+ private generateId;
131
+ }
132
+ declare function createMongoDBAdapter(options: MongoDBAdapterOptions): MongoDBAdapter;
133
+ /**
134
+ * Global helper to access or initialize a pooled MongoDB Db singleton instance.
135
+ */
136
+ declare function getMongoDb(options?: MongoDBAdapterOptions | string): Promise<any>;
137
+ /**
138
+ * Global helper to access or initialize a pooled MongoClient singleton instance.
139
+ */
140
+ declare function getMongoClient(options?: MongoDBAdapterOptions | string): Promise<any>;
141
+
142
+ interface MongoDBAuthAdapterOptions {
143
+ db?: any | (() => any);
144
+ adapter?: any;
145
+ client?: any;
146
+ collectionPrefix?: string;
147
+ sessionTTL?: number;
148
+ refreshTokenTTL?: number;
149
+ }
150
+ declare class MongoDBAuthAdapter implements AuthAdapter {
151
+ private db;
152
+ private adapter;
153
+ private client;
154
+ private prefix;
155
+ private sessionTTL;
156
+ private refreshTokenTTL;
157
+ private indexesEnsured;
158
+ constructor(options: MongoDBAuthAdapterOptions);
159
+ private getDatabase;
160
+ private col;
161
+ connect(): Promise<void>;
162
+ disconnect(): Promise<void>;
163
+ private ensureIndexes;
164
+ createUser(data: {
165
+ email: string;
166
+ password: string;
167
+ name?: string;
168
+ role?: UserRole;
169
+ avatar?: string;
170
+ tenantId?: string;
171
+ }): Promise<AuthUser>;
172
+ findUserByEmail(email: string): Promise<AuthUser | null>;
173
+ findUserById(id: string): Promise<AuthUser | null>;
174
+ updateUser(id: string, data: Partial<AuthUser>): Promise<AuthUser | null>;
175
+ deleteUser(id: string): Promise<boolean>;
176
+ verifyPassword(email: string, password: string): Promise<AuthUser | null>;
177
+ hashPassword(password: string): Promise<string>;
178
+ createSession(userId: string, data?: {
179
+ ipAddress?: string;
180
+ userAgent?: string;
181
+ }): Promise<Session>;
182
+ findSessionByToken(token: string): Promise<Session | null>;
183
+ findSessionByRefreshToken(refreshToken: string): Promise<Session | null>;
184
+ deleteSession(sessionId: string): Promise<boolean>;
185
+ deleteUserSessions(userId: string): Promise<number>;
186
+ hasAnyUsers(): Promise<boolean>;
187
+ addPasswordToHistory(userId: string, passwordHash: string): Promise<void>;
188
+ getPasswordHistory(userId: string, count?: number): Promise<string[]>;
189
+ isPasswordInHistory(password: string, userId: string, historyCount?: number): Promise<boolean>;
190
+ findAuditLogs(filter: AuditLogFilter): Promise<{
191
+ logs: AuditLog[];
192
+ total: number;
193
+ }>;
194
+ createAuditLog(data: Omit<AuditLog, "id" | "timestamp">): Promise<AuditLog>;
195
+ private docToAuthUser;
196
+ private docToSession;
197
+ createEmailVerificationToken(userId: string): Promise<{
198
+ token: string;
199
+ expiresAt: Date;
200
+ }>;
201
+ verifyEmailToken(token: string): Promise<{
202
+ success: boolean;
203
+ userId?: string;
204
+ error?: string;
205
+ }>;
206
+ createPasswordResetToken(email: string): Promise<{
207
+ token: string;
208
+ expiresAt: Date;
209
+ error?: string;
210
+ }>;
211
+ resetPasswordWithToken(token: string, newPassword: string): Promise<{
212
+ success: boolean;
213
+ error?: string;
214
+ }>;
215
+ }
216
+
217
+ export { type AdapterOptions as A, type DatabaseConnectionOptions as D, MongoDBAdapter as M, type DatabaseType as a, type DrizzleAdapterOptions as b, type MongoDBAdapterOptions as c, MongoDBAuthAdapter as d, createMongoDBAdapter as e, getMongoDb as f, getMongoClient as g };