@kyro-cms/core 0.5.4 → 0.5.5

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 (151) hide show
  1. package/dist/WebhookService-118ZTFis.d.ts +112 -0
  2. package/dist/WebhookService-AefJfqX0.d.cts +112 -0
  3. package/dist/adapter-BSvBudTG.d.cts +65 -0
  4. package/dist/adapter-CXGB2Elb.d.ts +65 -0
  5. package/dist/api-handler.cjs +26 -8
  6. package/dist/api-handler.cjs.map +1 -1
  7. package/dist/api-handler.d.cts +9 -0
  8. package/dist/api-handler.d.ts +9 -0
  9. package/dist/api-handler.js +25 -7
  10. package/dist/api-handler.js.map +1 -1
  11. package/dist/base-DvvNqnM-.d.cts +73 -0
  12. package/dist/base-eVegJ_Pr.d.ts +73 -0
  13. package/dist/bootstrap-4MH44YKG.js +6 -0
  14. package/dist/{bootstrap-PBMMLBQC.js.map → bootstrap-4MH44YKG.js.map} +1 -1
  15. package/dist/bootstrap-EE6BJZWL.cjs +31 -0
  16. package/dist/{bootstrap-QN77EVI3.cjs.map → bootstrap-EE6BJZWL.cjs.map} +1 -1
  17. package/dist/chunk-3YELQL7Z.cjs +4 -0
  18. package/dist/chunk-3YELQL7Z.cjs.map +1 -0
  19. package/dist/{chunk-AGAIUDAV.cjs → chunk-55BNRTLW.cjs} +7 -7
  20. package/dist/chunk-55BNRTLW.cjs.map +1 -0
  21. package/dist/{chunk-XJ2VYR47.cjs → chunk-5HA5OMFH.cjs} +10 -7
  22. package/dist/chunk-5HA5OMFH.cjs.map +1 -0
  23. package/dist/{chunk-C4JJEE42.js → chunk-6WXQRYTW.js} +262 -43
  24. package/dist/chunk-6WXQRYTW.js.map +1 -0
  25. package/dist/{chunk-SO25EHOE.js → chunk-AM4JKIPP.js} +180 -77
  26. package/dist/chunk-AM4JKIPP.js.map +1 -0
  27. package/dist/{chunk-VSTRLXMQ.cjs → chunk-CKVOU6MX.cjs} +4 -2
  28. package/dist/chunk-CKVOU6MX.cjs.map +1 -0
  29. package/dist/chunk-GTGRLD4Y.js +3 -0
  30. package/dist/chunk-GTGRLD4Y.js.map +1 -0
  31. package/dist/chunk-MTIRYI7F.cjs +4 -0
  32. package/dist/chunk-MTIRYI7F.cjs.map +1 -0
  33. package/dist/{chunk-342BJNBI.js → chunk-QKVA2SOG.js} +300 -6
  34. package/dist/chunk-QKVA2SOG.js.map +1 -0
  35. package/dist/chunk-QU2RFFH4.js +3 -0
  36. package/dist/chunk-QU2RFFH4.js.map +1 -0
  37. package/dist/{chunk-ATVNYGRQ.js → chunk-QYZKIPSD.js} +7 -18
  38. package/dist/chunk-QYZKIPSD.js.map +1 -0
  39. package/dist/{chunk-SYRDCLH7.cjs → chunk-R2YHJN6W.cjs} +184 -81
  40. package/dist/chunk-R2YHJN6W.cjs.map +1 -0
  41. package/dist/{chunk-IX3ABYKZ.cjs → chunk-RALQO47U.cjs} +170 -2
  42. package/dist/chunk-RALQO47U.cjs.map +1 -0
  43. package/dist/{chunk-EVEJC22G.cjs → chunk-RDRJVCL5.cjs} +37 -5
  44. package/dist/chunk-RDRJVCL5.cjs.map +1 -0
  45. package/dist/{chunk-6COM32WF.js → chunk-RP7VZUEL.js} +5 -3
  46. package/dist/chunk-RP7VZUEL.js.map +1 -0
  47. package/dist/{chunk-XR5EJS3C.js → chunk-S3FG2NY7.js} +7 -4
  48. package/dist/chunk-S3FG2NY7.js.map +1 -0
  49. package/dist/{chunk-WH4Y5MT6.js → chunk-TP5YQFIX.js} +36 -4
  50. package/dist/chunk-TP5YQFIX.js.map +1 -0
  51. package/dist/{chunk-DBUYB32X.js → chunk-TVVYZ2TH.js} +171 -3
  52. package/dist/chunk-TVVYZ2TH.js.map +1 -0
  53. package/dist/{chunk-GBH6DN5C.cjs → chunk-WBCIEYHC.cjs} +8 -18
  54. package/dist/chunk-WBCIEYHC.cjs.map +1 -0
  55. package/dist/{chunk-3ZZPZYCM.cjs → chunk-WVPOPOEQ.cjs} +269 -41
  56. package/dist/chunk-WVPOPOEQ.cjs.map +1 -0
  57. package/dist/{chunk-W3KPQX7V.cjs → chunk-XAEBVZTI.cjs} +304 -4
  58. package/dist/chunk-XAEBVZTI.cjs.map +1 -0
  59. package/dist/{chunk-Q4DNT7FO.js → chunk-XU7AFF6V.js} +6 -6
  60. package/dist/chunk-XU7AFF6V.js.map +1 -0
  61. package/dist/cli/index.cjs +6 -4
  62. package/dist/cli/index.cjs.map +1 -1
  63. package/dist/cli/index.d.cts +1 -0
  64. package/dist/cli/index.d.ts +1 -0
  65. package/dist/cli/index.js +6 -4
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/client.d.cts +12 -0
  68. package/dist/client.d.ts +12 -0
  69. package/dist/drizzle/index.cjs +18 -18
  70. package/dist/drizzle/index.d.cts +152 -0
  71. package/dist/drizzle/index.d.ts +152 -0
  72. package/dist/drizzle/index.js +3 -3
  73. package/dist/fields/index.d.cts +27 -0
  74. package/dist/fields/index.d.ts +27 -0
  75. package/dist/graphql/index.d.cts +22 -0
  76. package/dist/graphql/index.d.ts +22 -0
  77. package/dist/index-Bz9JqRGI.d.cts +86 -0
  78. package/dist/index-Bz9JqRGI.d.ts +86 -0
  79. package/dist/index-CLp-DRKA.d.ts +64 -0
  80. package/dist/index-DfO7G4kN.d.cts +64 -0
  81. package/dist/index.cjs +118 -86
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.cts +1368 -0
  84. package/dist/index.d.ts +1368 -0
  85. package/dist/index.js +48 -14
  86. package/dist/index.js.map +1 -1
  87. package/dist/integration.cjs +2 -2
  88. package/dist/integration.d.cts +27 -0
  89. package/dist/integration.d.ts +27 -0
  90. package/dist/integration.js +1 -1
  91. package/dist/media-GPPTZ43E.js +4 -0
  92. package/dist/{media-HOT3O7RW.js.map → media-GPPTZ43E.js.map} +1 -1
  93. package/dist/media-XNTUFJZR.cjs +17 -0
  94. package/dist/{media-WKP5AOX2.cjs.map → media-XNTUFJZR.cjs.map} +1 -1
  95. package/dist/mongodb/index.cjs +12 -3
  96. package/dist/mongodb/index.d.cts +59 -0
  97. package/dist/mongodb/index.d.ts +59 -0
  98. package/dist/mongodb/index.js +2 -1
  99. package/dist/postgres-auth-adapter-6742WDCF.cjs +14 -0
  100. package/dist/{postgres-auth-adapter-Z463NYJZ.cjs.map → postgres-auth-adapter-6742WDCF.cjs.map} +1 -1
  101. package/dist/postgres-auth-adapter-B65BULNS.js +5 -0
  102. package/dist/{postgres-auth-adapter-7F3ECO7I.js.map → postgres-auth-adapter-B65BULNS.js.map} +1 -1
  103. package/dist/rest/index.cjs +9 -5
  104. package/dist/rest/index.d.cts +57 -0
  105. package/dist/rest/index.d.ts +57 -0
  106. package/dist/rest/index.js +7 -3
  107. package/dist/{schema-TIYTCIKX.cjs → schema-37SE2F4B.cjs} +5 -5
  108. package/dist/{schema-TIYTCIKX.cjs.map → schema-37SE2F4B.cjs.map} +1 -1
  109. package/dist/{schema-6Q4W6AE6.js → schema-5PHL5IVB.js} +3 -3
  110. package/dist/{schema-6Q4W6AE6.js.map → schema-5PHL5IVB.js.map} +1 -1
  111. package/dist/templates/index.d.cts +59 -0
  112. package/dist/templates/index.d.ts +59 -0
  113. package/dist/trpc/index.d.cts +136 -0
  114. package/dist/trpc/index.d.ts +136 -0
  115. package/dist/types-Bs1up4yP.d.ts +461 -0
  116. package/dist/types-DqN4ckOC.d.cts +130 -0
  117. package/dist/types-DqN4ckOC.d.ts +130 -0
  118. package/dist/types-J3R9nVsZ.d.cts +461 -0
  119. package/dist/types-VtjUxIMp.d.cts +246 -0
  120. package/dist/types-VtjUxIMp.d.ts +246 -0
  121. package/dist/ws/index.d.cts +88 -0
  122. package/dist/ws/index.d.ts +88 -0
  123. package/package.json +3 -2
  124. package/dist/bootstrap-PBMMLBQC.js +0 -6
  125. package/dist/bootstrap-QN77EVI3.cjs +0 -31
  126. package/dist/chunk-342BJNBI.js.map +0 -1
  127. package/dist/chunk-3ZZPZYCM.cjs.map +0 -1
  128. package/dist/chunk-6COM32WF.js.map +0 -1
  129. package/dist/chunk-7SXPHG3M.cjs +0 -67
  130. package/dist/chunk-7SXPHG3M.cjs.map +0 -1
  131. package/dist/chunk-AGAIUDAV.cjs.map +0 -1
  132. package/dist/chunk-ATVNYGRQ.js.map +0 -1
  133. package/dist/chunk-C4JJEE42.js.map +0 -1
  134. package/dist/chunk-DBUYB32X.js.map +0 -1
  135. package/dist/chunk-EVEJC22G.cjs.map +0 -1
  136. package/dist/chunk-GBH6DN5C.cjs.map +0 -1
  137. package/dist/chunk-IX3ABYKZ.cjs.map +0 -1
  138. package/dist/chunk-L4E76X2K.js +0 -57
  139. package/dist/chunk-L4E76X2K.js.map +0 -1
  140. package/dist/chunk-Q4DNT7FO.js.map +0 -1
  141. package/dist/chunk-SO25EHOE.js.map +0 -1
  142. package/dist/chunk-SYRDCLH7.cjs.map +0 -1
  143. package/dist/chunk-VSTRLXMQ.cjs.map +0 -1
  144. package/dist/chunk-W3KPQX7V.cjs.map +0 -1
  145. package/dist/chunk-WH4Y5MT6.js.map +0 -1
  146. package/dist/chunk-XJ2VYR47.cjs.map +0 -1
  147. package/dist/chunk-XR5EJS3C.js.map +0 -1
  148. package/dist/media-HOT3O7RW.js +0 -4
  149. package/dist/media-WKP5AOX2.cjs +0 -17
  150. package/dist/postgres-auth-adapter-7F3ECO7I.js +0 -5
  151. package/dist/postgres-auth-adapter-Z463NYJZ.cjs +0 -14
@@ -1,9 +1,11 @@
1
- import { PasswordPolicy, ConfigService, SQLiteAuthAdapter, EmailTransport } from './chunk-WH4Y5MT6.js';
1
+ import { PasswordPolicy, ConfigService, EmailTransport, SQLiteAuthAdapter } from './chunk-TP5YQFIX.js';
2
2
  import { createAuditContext } from './chunk-P2YW545G.js';
3
3
  import { WEBHOOK_EVENTS, extractApiKeyFromRequest, validateApiKey, createApiKeyContext, API_KEY_COLLECTION, generateApiKey, generateApiKeyPrefix, hasApiKeyPermission } from './chunk-QXIQWPAP.js';
4
4
  import { buildGraphQLSchema } from './chunk-REK7AYOC.js';
5
5
  import { evaluateAccess } from './chunk-SDMNUYVU.js';
6
- import { genId } from './chunk-L4E76X2K.js';
6
+ import { genId, DrizzleAdapter } from './chunk-6WXQRYTW.js';
7
+ import { PostgresAuthAdapter } from './chunk-TVVYZ2TH.js';
8
+ import { MongoDBAdapter, MongoDBAuthAdapter } from './chunk-QKVA2SOG.js';
7
9
  import { __esm, __export, __toCommonJS, __require } from './chunk-Z6ZWNWWR.js';
8
10
  import crypto, { randomBytes, createHash } from 'crypto';
9
11
  import { createStorage } from 'unstorage';
@@ -1008,6 +1010,7 @@ var AuthRoutes = class {
1008
1010
  201
1009
1011
  );
1010
1012
  } catch (error) {
1013
+ console.error("[AuthRoutes.register] Registration error:", error);
1011
1014
  return this.errorResponse("Registration failed", 500);
1012
1015
  }
1013
1016
  }
@@ -2659,6 +2662,7 @@ async function processImage(buffer) {
2659
2662
  }
2660
2663
 
2661
2664
  // src/storage/MediaService.ts
2665
+ var _mediaTablesEnsured = false;
2662
2666
  var MediaService = class _MediaService {
2663
2667
  db;
2664
2668
  storage;
@@ -2684,46 +2688,84 @@ var MediaService = class _MediaService {
2684
2688
  storage2 = await resolveProvider(configService);
2685
2689
  }
2686
2690
  const service = new _MediaService(db, storage2, options);
2687
- service.ensureTables();
2691
+ await service.ensureTables();
2688
2692
  return service;
2689
2693
  }
2690
- ensureTables() {
2691
- if (this.dialect !== "sqlite") return;
2692
- this.db.exec(`
2693
- CREATE TABLE IF NOT EXISTS media (
2694
- id TEXT PRIMARY KEY,
2695
- filename TEXT NOT NULL UNIQUE,
2696
- title TEXT,
2697
- original_name TEXT NOT NULL,
2698
- mime_type TEXT NOT NULL,
2699
- file_size INTEGER NOT NULL,
2700
- width INTEGER,
2701
- height INTEGER,
2702
- url TEXT NOT NULL UNIQUE,
2703
- thumbnail_url TEXT,
2704
- folder TEXT,
2705
- provider TEXT NOT NULL,
2706
- alt TEXT,
2707
- caption TEXT,
2708
- metadata TEXT,
2709
- created_at TEXT NOT NULL,
2710
- updated_at TEXT NOT NULL
2711
- );
2712
- CREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);
2713
- CREATE INDEX IF NOT EXISTS idx_media_provider ON media(provider);
2714
- CREATE INDEX IF NOT EXISTS idx_media_filename ON media(filename);
2715
- CREATE INDEX IF NOT EXISTS idx_media_folders_path ON media_folders(path);
2716
- `);
2717
- this.db.exec(`
2718
- CREATE TABLE IF NOT EXISTS media_folders (
2719
- id TEXT PRIMARY KEY,
2720
- name TEXT NOT NULL,
2721
- path TEXT NOT NULL,
2722
- parent_path TEXT,
2723
- created_at TEXT
2724
- );
2725
- CREATE INDEX IF NOT EXISTS idx_media_folders_path ON media_folders(path);
2726
- `);
2694
+ async ensureTables() {
2695
+ if (this.dialect === "sqlite") {
2696
+ this.db.exec(`
2697
+ CREATE TABLE IF NOT EXISTS media (
2698
+ id TEXT PRIMARY KEY,
2699
+ filename TEXT NOT NULL UNIQUE,
2700
+ title TEXT,
2701
+ original_name TEXT NOT NULL,
2702
+ mime_type TEXT NOT NULL,
2703
+ file_size INTEGER NOT NULL,
2704
+ width INTEGER,
2705
+ height INTEGER,
2706
+ url TEXT NOT NULL UNIQUE,
2707
+ thumbnail_url TEXT,
2708
+ folder TEXT,
2709
+ provider TEXT NOT NULL,
2710
+ alt TEXT,
2711
+ caption TEXT,
2712
+ metadata TEXT,
2713
+ created_at TEXT NOT NULL,
2714
+ updated_at TEXT NOT NULL
2715
+ );
2716
+ CREATE INDEX IF NOT EXISTS idx_media_folder ON media(folder);
2717
+ CREATE INDEX IF NOT EXISTS idx_media_provider ON media(provider);
2718
+ CREATE INDEX IF NOT EXISTS idx_media_filename ON media(filename);
2719
+ `);
2720
+ this.db.exec(`
2721
+ CREATE TABLE IF NOT EXISTS media_folders (
2722
+ id TEXT PRIMARY KEY,
2723
+ name TEXT NOT NULL,
2724
+ path TEXT NOT NULL,
2725
+ parent_path TEXT,
2726
+ created_at TEXT
2727
+ );
2728
+ CREATE INDEX IF NOT EXISTS idx_media_folders_path ON media_folders(path);
2729
+ `);
2730
+ } else if (this.dialect === "postgres") {
2731
+ if (_mediaTablesEnsured) return;
2732
+ const { sql } = await import('drizzle-orm');
2733
+ await this.db.execute(sql`
2734
+ CREATE TABLE IF NOT EXISTS "media" (
2735
+ "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
2736
+ "filename" VARCHAR(255) NOT NULL UNIQUE,
2737
+ "title" VARCHAR(255),
2738
+ "original_name" VARCHAR(255) NOT NULL,
2739
+ "mime_type" VARCHAR(100),
2740
+ "file_size" INTEGER,
2741
+ "width" INTEGER,
2742
+ "height" INTEGER,
2743
+ "url" TEXT NOT NULL UNIQUE,
2744
+ "thumbnail_url" TEXT,
2745
+ "folder" VARCHAR(255),
2746
+ "provider" VARCHAR(50) NOT NULL,
2747
+ "alt" TEXT,
2748
+ "caption" TEXT,
2749
+ "metadata" JSONB,
2750
+ "created_at" TIMESTAMP NOT NULL DEFAULT NOW(),
2751
+ "updated_at" TIMESTAMP NOT NULL DEFAULT NOW()
2752
+ )
2753
+ `);
2754
+ await this.db.execute(sql`CREATE INDEX IF NOT EXISTS "idx_media_folder" ON "media" ("folder")`);
2755
+ await this.db.execute(sql`CREATE INDEX IF NOT EXISTS "idx_media_provider" ON "media" ("provider")`);
2756
+ await this.db.execute(sql`CREATE INDEX IF NOT EXISTS "idx_media_filename" ON "media" ("filename")`);
2757
+ await this.db.execute(sql`
2758
+ CREATE TABLE IF NOT EXISTS "media_folders" (
2759
+ "id" UUID PRIMARY KEY DEFAULT gen_random_uuid(),
2760
+ "name" VARCHAR(255) NOT NULL,
2761
+ "path" TEXT NOT NULL,
2762
+ "parent_path" TEXT,
2763
+ "created_at" TIMESTAMP NOT NULL DEFAULT NOW()
2764
+ )
2765
+ `);
2766
+ await this.db.execute(sql`CREATE INDEX IF NOT EXISTS "idx_media_folders_path" ON "media_folders" ("path")`);
2767
+ _mediaTablesEnsured = true;
2768
+ }
2727
2769
  }
2728
2770
  now() {
2729
2771
  return (/* @__PURE__ */ new Date()).toISOString();
@@ -2844,13 +2886,15 @@ var MediaService = class _MediaService {
2844
2886
  ]
2845
2887
  );
2846
2888
  } else {
2847
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2889
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
2890
+ const mime = storageResult.mimeType;
2891
+ const mediaType = mime.startsWith("image/") ? "image" : mime.startsWith("video/") ? "video" : mime.startsWith("audio/") ? "audio" : mime.startsWith("application/pdf") ? "document" : ["application/zip", "application/x-zip", "application/x-tar", "application/gzip", "application/x-7z"].includes(mime) ? "archive" : "other";
2848
2892
  await this.db.insert(mediaSchema).values({
2849
2893
  id,
2850
2894
  filename: storageResult.filename,
2851
2895
  title: file.name.replace(/\.[^/.]+$/, ""),
2852
2896
  originalName: file.name,
2853
- mimeType: storageResult.mimeType,
2897
+ mimeType: mime,
2854
2898
  fileSize: storageResult.size,
2855
2899
  width,
2856
2900
  height,
@@ -2858,6 +2902,10 @@ var MediaService = class _MediaService {
2858
2902
  thumbnailUrl,
2859
2903
  folder: folder || "",
2860
2904
  provider: this.storage.name,
2905
+ type: mediaType,
2906
+ status: "active",
2907
+ alt: null,
2908
+ caption: null,
2861
2909
  createdAt: /* @__PURE__ */ new Date(),
2862
2910
  updatedAt: /* @__PURE__ */ new Date()
2863
2911
  }).returning();
@@ -2900,8 +2948,9 @@ var MediaService = class _MediaService {
2900
2948
  id
2901
2949
  ]);
2902
2950
  } else {
2903
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2904
- const [row] = await this.db.select().from(mediaSchema).where(mediaSchema.id.equals(id));
2951
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
2952
+ const { eq } = await import('drizzle-orm');
2953
+ const [row] = await this.db.select().from(mediaSchema).where(eq(mediaSchema.id, id));
2905
2954
  if (row) item = this.rowToMedia(row);
2906
2955
  }
2907
2956
  if (!item) return;
@@ -2915,8 +2964,9 @@ var MediaService = class _MediaService {
2915
2964
  if (this.dialect === "sqlite") {
2916
2965
  await this.sqliteRun(`DELETE FROM ${this.mediaTable} WHERE id = ?`, [id]);
2917
2966
  } else {
2918
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2919
- await this.db.delete(mediaSchema).where(mediaSchema.id.equals(id));
2967
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
2968
+ const { eq } = await import('drizzle-orm');
2969
+ await this.db.delete(mediaSchema).where(eq(mediaSchema.id, id));
2920
2970
  }
2921
2971
  }
2922
2972
  async deleteFile(url) {
@@ -2929,8 +2979,9 @@ var MediaService = class _MediaService {
2929
2979
  id
2930
2980
  ]);
2931
2981
  } else {
2932
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2933
- const [row] = await this.db.select().from(mediaSchema).where(mediaSchema.id.equals(id));
2982
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
2983
+ const { eq } = await import('drizzle-orm');
2984
+ const [row] = await this.db.select().from(mediaSchema).where(eq(mediaSchema.id, id));
2934
2985
  if (row) item = this.rowToMedia(row);
2935
2986
  }
2936
2987
  if (!item) return null;
@@ -2963,8 +3014,9 @@ var MediaService = class _MediaService {
2963
3014
  [...vals, this.now(), id]
2964
3015
  );
2965
3016
  } else {
2966
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2967
- await this.db.update(mediaSchema).set({ ...updateData, updatedAt: this.now() }).where(mediaSchema.id.equals(id));
3017
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
3018
+ const { eq } = await import('drizzle-orm');
3019
+ await this.db.update(mediaSchema).set({ ...updateData, updatedAt: this.now() }).where(eq(mediaSchema.id, id));
2968
3020
  }
2969
3021
  return {
2970
3022
  ...item,
@@ -2981,8 +3033,9 @@ var MediaService = class _MediaService {
2981
3033
  );
2982
3034
  return row2 ? this.rowToMedia(row2) : null;
2983
3035
  }
2984
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
2985
- const [row] = await this.db.select().from(mediaSchema).where(mediaSchema.id.equals(id));
3036
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
3037
+ const { eq } = await import('drizzle-orm');
3038
+ const [row] = await this.db.select().from(mediaSchema).where(eq(mediaSchema.id, id));
2986
3039
  return row ? this.rowToMedia(row) : null;
2987
3040
  }
2988
3041
  async find(params = {}) {
@@ -3028,8 +3081,8 @@ var MediaService = class _MediaService {
3028
3081
  totalPages: Math.ceil(totalDocs2 / limit)
3029
3082
  };
3030
3083
  }
3031
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
3032
- const { like, or, and, asc, desc, eq, sql } = await import('drizzle-orm/pg-core');
3084
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
3085
+ const { like, or, and, asc, desc, eq, sql } = await import('drizzle-orm');
3033
3086
  const conditions = [];
3034
3087
  if (search) {
3035
3088
  conditions.push(
@@ -3053,7 +3106,17 @@ var MediaService = class _MediaService {
3053
3106
  );
3054
3107
  }
3055
3108
  const whereClause = conditions.length > 0 ? and(...conditions) : void 0;
3056
- const order = sortDir === "asc" ? asc(mediaSchema[sortCol]) : desc(mediaSchema[sortCol]);
3109
+ const sortKey = {
3110
+ created_at: "createdAt",
3111
+ updated_at: "updatedAt",
3112
+ title: "title",
3113
+ filename: "filename",
3114
+ file_size: "fileSize",
3115
+ mime_type: "mimeType",
3116
+ original_name: "originalName"
3117
+ };
3118
+ const col = mediaSchema[sortKey[sortCol] || "createdAt"];
3119
+ const order = sortDir === "asc" ? asc(col) : desc(col);
3057
3120
  const docs = await this.db.select().from(mediaSchema).where(whereClause).orderBy(order).limit(limit).offset(offset);
3058
3121
  const [{ count }] = await this.db.select({ count: sql`count(*)` }).from(mediaSchema).where(whereClause);
3059
3122
  const totalDocs = Number(count);
@@ -3097,8 +3160,9 @@ var MediaService = class _MediaService {
3097
3160
  );
3098
3161
  return row ? this.rowToMedia(row) : null;
3099
3162
  }
3100
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
3101
- const [updated] = await this.db.update(mediaSchema).set({ ...data, updatedAt: /* @__PURE__ */ new Date() }).where(mediaSchema.id.equals(id)).returning();
3163
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
3164
+ const { eq } = await import('drizzle-orm');
3165
+ const [updated] = await this.db.update(mediaSchema).set({ ...data, updatedAt: /* @__PURE__ */ new Date() }).where(eq(mediaSchema.id, id)).returning();
3102
3166
  return updated ? this.rowToMedia(updated) : null;
3103
3167
  }
3104
3168
  async updateMany(ids, data) {
@@ -3118,9 +3182,10 @@ var MediaService = class _MediaService {
3118
3182
  );
3119
3183
  }
3120
3184
  } else {
3121
- const { media: mediaSchema } = await import('./media-HOT3O7RW.js');
3185
+ const { media: mediaSchema } = await import('./media-GPPTZ43E.js');
3186
+ const { eq } = await import('drizzle-orm');
3122
3187
  for (const id of ids) {
3123
- await this.db.update(mediaSchema).set({ ...data, updatedAt: /* @__PURE__ */ new Date() }).where(mediaSchema.id.equals(id));
3188
+ await this.db.update(mediaSchema).set({ ...data, updatedAt: /* @__PURE__ */ new Date() }).where(eq(mediaSchema.id, id));
3124
3189
  }
3125
3190
  }
3126
3191
  }
@@ -3132,8 +3197,8 @@ var MediaService = class _MediaService {
3132
3197
  );
3133
3198
  return rows.map((r) => r.path).filter((f) => f && f !== "").sort();
3134
3199
  }
3135
- const { media: mediaSchema, mediaFolders: folderSchema } = await import('./media-HOT3O7RW.js');
3136
- const { eq, sql } = await import('drizzle-orm/pg-core');
3200
+ const { media: mediaSchema, mediaFolders: folderSchema } = await import('./media-GPPTZ43E.js');
3201
+ const { eq, sql } = await import('drizzle-orm');
3137
3202
  const fromMedia = await this.db.select({ folder: mediaSchema.folder }).from(mediaSchema).groupBy(mediaSchema.folder);
3138
3203
  const fromFolders = await this.db.select({ path: folderSchema.path }).from(folderSchema);
3139
3204
  const allPaths = /* @__PURE__ */ new Set([
@@ -3152,7 +3217,7 @@ var MediaService = class _MediaService {
3152
3217
  [fullPath, name, parentPath || null, now]
3153
3218
  );
3154
3219
  } else {
3155
- const { mediaFolders: folderSchema } = await import('./media-HOT3O7RW.js');
3220
+ const { mediaFolders: folderSchema } = await import('./media-GPPTZ43E.js');
3156
3221
  await this.db.insert(folderSchema).values({
3157
3222
  path: fullPath,
3158
3223
  name,
@@ -3173,8 +3238,8 @@ var MediaService = class _MediaService {
3173
3238
  [folder, `${folder}/%`]
3174
3239
  );
3175
3240
  } else {
3176
- const { mediaFolders: folderSchema } = await import('./media-HOT3O7RW.js');
3177
- const { like, or, eq } = await import('./media-HOT3O7RW.js');
3241
+ const { mediaFolders: folderSchema } = await import('./media-GPPTZ43E.js');
3242
+ const { like, or, eq } = await import('drizzle-orm');
3178
3243
  await this.db.delete(folderSchema).where(
3179
3244
  or(
3180
3245
  eq(folderSchema.path, folder),
@@ -3542,6 +3607,18 @@ async function resolveAuthContext(req, authMw, staticUser, staticTenantID) {
3542
3607
  authType: result.authType
3543
3608
  };
3544
3609
  }
3610
+ function createDefaultAuthAdapter(db, rootDir) {
3611
+ if (db instanceof DrizzleAdapter && db.dialect === "postgres") {
3612
+ return new PostgresAuthAdapter({ db: db.client });
3613
+ }
3614
+ if (db instanceof MongoDBAdapter) {
3615
+ return new MongoDBAuthAdapter({ db: db.db });
3616
+ }
3617
+ const defaultAuthDbPath = resolve(rootDir, "data", "kyro.db");
3618
+ return new SQLiteAuthAdapter({
3619
+ path: process.env.KYRO_AUTH_DB_PATH || defaultAuthDbPath
3620
+ });
3621
+ }
3545
3622
  function createHonoApp(options) {
3546
3623
  const {
3547
3624
  registry,
@@ -3568,10 +3645,7 @@ function createHonoApp(options) {
3568
3645
  apiAccess?.requireAuth;
3569
3646
  const cwd = process.cwd();
3570
3647
  const rootDir = cwd.endsWith("admin") ? resolve(cwd, "..") : cwd;
3571
- const defaultAuthDbPath = resolve(rootDir, "data", "kyro.db");
3572
- const sessionAuthAdapter = authAdapter || new SQLiteAuthAdapter({
3573
- path: process.env.KYRO_AUTH_DB_PATH || defaultAuthDbPath
3574
- });
3648
+ const sessionAuthAdapter = authAdapter || createDefaultAuthAdapter(db, rootDir);
3575
3649
  const authMw = authSecret ? createAuthMiddleware({
3576
3650
  db,
3577
3651
  userLookup: async (userId) => {
@@ -4071,7 +4145,9 @@ function createHonoApp(options) {
4071
4145
  }
4072
4146
  if (!mediaService) {
4073
4147
  try {
4074
- mediaService = await MediaService.init(db);
4148
+ const dialect = db instanceof DrizzleAdapter ? db.dialect : "sqlite";
4149
+ const mediaDb = dialect === "postgres" && db instanceof DrizzleAdapter ? db.client : db;
4150
+ mediaService = await MediaService.init(mediaDb, { dialect });
4075
4151
  } catch (error) {
4076
4152
  console.error("[getMedia] Init error:", error);
4077
4153
  mediaServiceInitError = error;
@@ -4082,6 +4158,8 @@ function createHonoApp(options) {
4082
4158
  };
4083
4159
  app.get("/api/media", async (c) => {
4084
4160
  try {
4161
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4162
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4085
4163
  const service = await getMedia();
4086
4164
  const page = parseInt(c.req.query("page") || "1");
4087
4165
  const limit = parseInt(c.req.query("limit") || "30");
@@ -4092,11 +4170,13 @@ function createHonoApp(options) {
4092
4170
  return c.json(result);
4093
4171
  } catch (error) {
4094
4172
  console.error("[Media] find error:", error);
4095
- return c.json({ error: error.message, stack: error.stack }, 500);
4173
+ return c.json({ error: error.message }, 500);
4096
4174
  }
4097
4175
  });
4098
4176
  app.post("/api/media/upload", async (c) => {
4099
4177
  try {
4178
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4179
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4100
4180
  const service = await getMedia();
4101
4181
  const contentType = c.req.header("content-type") || "";
4102
4182
  if (contentType.includes("multipart/form-data")) {
@@ -4118,6 +4198,8 @@ function createHonoApp(options) {
4118
4198
  });
4119
4199
  app.get("/api/media/folders", async (c) => {
4120
4200
  try {
4201
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4202
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4121
4203
  const service = await getMedia();
4122
4204
  const folders = await service.listFolders();
4123
4205
  return c.json(folders);
@@ -4128,6 +4210,8 @@ function createHonoApp(options) {
4128
4210
  });
4129
4211
  app.post("/api/media/folders", async (c) => {
4130
4212
  try {
4213
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4214
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4131
4215
  const service = await getMedia();
4132
4216
  const body = await c.req.json();
4133
4217
  const { name, parentPath } = body;
@@ -4146,6 +4230,8 @@ function createHonoApp(options) {
4146
4230
  });
4147
4231
  app.delete("/api/media/folders", async (c) => {
4148
4232
  try {
4233
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4234
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4149
4235
  const service = await getMedia();
4150
4236
  const path2 = c.req.query("path");
4151
4237
  if (!path2) {
@@ -4160,6 +4246,8 @@ function createHonoApp(options) {
4160
4246
  });
4161
4247
  app.delete("/api/media/:id", async (c) => {
4162
4248
  try {
4249
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4250
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4163
4251
  const service = await getMedia();
4164
4252
  const id = c.req.param("id");
4165
4253
  await service.delete(id);
@@ -4171,6 +4259,8 @@ function createHonoApp(options) {
4171
4259
  });
4172
4260
  app.get("/api/media/resize", async (c) => {
4173
4261
  try {
4262
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4263
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4174
4264
  const url = c.req.query("url");
4175
4265
  const w = parseInt(c.req.query("w") || "0");
4176
4266
  const h = parseInt(c.req.query("h") || "0");
@@ -4212,6 +4302,8 @@ function createHonoApp(options) {
4212
4302
  });
4213
4303
  app.get("/api/media/:id", async (c) => {
4214
4304
  try {
4305
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4306
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4215
4307
  const service = await getMedia();
4216
4308
  const id = c.req.param("id");
4217
4309
  const doc = await service.findById(id);
@@ -4224,6 +4316,8 @@ function createHonoApp(options) {
4224
4316
  });
4225
4317
  app.patch("/api/media/:id", async (c) => {
4226
4318
  try {
4319
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4320
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4227
4321
  const service = await getMedia();
4228
4322
  const id = c.req.param("id");
4229
4323
  const body = await c.req.json();
@@ -4239,6 +4333,8 @@ function createHonoApp(options) {
4239
4333
  });
4240
4334
  app.get("/api/media/test", async (c) => {
4241
4335
  try {
4336
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4337
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4242
4338
  const service = await getMedia();
4243
4339
  return c.json({
4244
4340
  status: service ? "initialized" : "failed",
@@ -4258,6 +4354,8 @@ function createHonoApp(options) {
4258
4354
  });
4259
4355
  app.get("/api/storage-status", async (c) => {
4260
4356
  try {
4357
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4358
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4261
4359
  let configured = false;
4262
4360
  let provider = "local";
4263
4361
  if (db) {
@@ -4300,7 +4398,9 @@ function createHonoApp(options) {
4300
4398
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
4301
4399
  });
4302
4400
  });
4303
- app.get("/api/collections", (c) => {
4401
+ app.get("/api/collections", async (c) => {
4402
+ const { user: ctxUser } = await resolveAuthContext(c.req.raw, authMw, user, tenantID);
4403
+ if (!ctxUser) return c.json({ error: "Authentication required" }, 401);
4304
4404
  const collections2 = registry.getCollections().map((col) => ({
4305
4405
  slug: col.slug,
4306
4406
  label: col.label || col.slug,
@@ -5521,6 +5621,10 @@ function createHonoApp(options) {
5521
5621
  } catch (zodErr) {
5522
5622
  return c.json({ error: "Validation failed", details: zodErr.errors }, 400);
5523
5623
  }
5624
+ const SYSTEM_FIELDS = /* @__PURE__ */ new Set(["id", "createdAt", "updatedAt", "_status", "_has_draft"]);
5625
+ const userData = Object.fromEntries(
5626
+ Object.entries(validated).filter(([k]) => !SYSTEM_FIELDS.has(k))
5627
+ );
5524
5628
  const collectionSlug = `_globals_${slug}`;
5525
5629
  const originalDoc = await db.findOne({
5526
5630
  collection: collectionSlug,
@@ -5535,8 +5639,7 @@ function createHonoApp(options) {
5535
5639
  await db.createVersion({
5536
5640
  collection: collectionSlug,
5537
5641
  documentId: slug,
5538
- // Global ID is the slug
5539
- data: validated,
5642
+ data: userData,
5540
5643
  status: "draft",
5541
5644
  createdBy: ctxUser?.id,
5542
5645
  changeDescription: "Manual save (Draft)",
@@ -5549,7 +5652,7 @@ function createHonoApp(options) {
5549
5652
  tenantID: ctxTenantID
5550
5653
  });
5551
5654
  } else {
5552
- const saveData = isDraftEnabled ? { ...validated, _status: "draft", _has_draft: false } : { ...validated, _status: "published", _has_draft: false };
5655
+ const saveData = isDraftEnabled ? { ...userData, _status: "draft", _has_draft: false } : { ...userData, _status: "published", _has_draft: false };
5553
5656
  if (originalDoc) {
5554
5657
  doc = await db.update({
5555
5658
  collection: collectionSlug,
@@ -5568,7 +5671,7 @@ function createHonoApp(options) {
5568
5671
  await db.createVersion({
5569
5672
  collection: collectionSlug,
5570
5673
  documentId: slug,
5571
- data: validated,
5674
+ data: userData,
5572
5675
  status: "draft",
5573
5676
  createdBy: ctxUser?.id,
5574
5677
  changeDescription: "Manual save",
@@ -5814,5 +5917,5 @@ function createRESTAPI(registry, db, options) {
5814
5917
  }
5815
5918
 
5816
5919
  export { AuditLogger, AuthRoutes, InMemoryAuditLogger, InMemoryRateLimiter, MediaService, createAuditContext2 as createAuditContext, createHonoApp, createLocalStorage, createRESTAPI, getAppSecret, getEncryptionKey, getSessionConfig, init_secret, loadSecrets, resolveProvider, setDbAdapter };
5817
- //# sourceMappingURL=chunk-SO25EHOE.js.map
5818
- //# sourceMappingURL=chunk-SO25EHOE.js.map
5920
+ //# sourceMappingURL=chunk-AM4JKIPP.js.map
5921
+ //# sourceMappingURL=chunk-AM4JKIPP.js.map