@kyro-cms/core 0.1.0

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 (88) hide show
  1. package/README.md +241 -0
  2. package/dist/base-CQkFzqQl.d.ts +62 -0
  3. package/dist/base-DlhVlwnN.d.cts +62 -0
  4. package/dist/chunk-3Q3FS5J4.cjs +273 -0
  5. package/dist/chunk-3Q3FS5J4.cjs.map +1 -0
  6. package/dist/chunk-3TPQ2BU6.js +423 -0
  7. package/dist/chunk-3TPQ2BU6.js.map +1 -0
  8. package/dist/chunk-3VZCX4DF.cjs +384 -0
  9. package/dist/chunk-3VZCX4DF.cjs.map +1 -0
  10. package/dist/chunk-BXMWDUED.js +115 -0
  11. package/dist/chunk-BXMWDUED.js.map +1 -0
  12. package/dist/chunk-DIC236EW.js +290 -0
  13. package/dist/chunk-DIC236EW.js.map +1 -0
  14. package/dist/chunk-DKSMFC3L.js +268 -0
  15. package/dist/chunk-DKSMFC3L.js.map +1 -0
  16. package/dist/chunk-DVD5P72E.cjs +428 -0
  17. package/dist/chunk-DVD5P72E.cjs.map +1 -0
  18. package/dist/chunk-HT6VE4NW.cjs +293 -0
  19. package/dist/chunk-HT6VE4NW.cjs.map +1 -0
  20. package/dist/chunk-K7QF2QCM.cjs +311 -0
  21. package/dist/chunk-K7QF2QCM.cjs.map +1 -0
  22. package/dist/chunk-OG3KX56O.js +308 -0
  23. package/dist/chunk-OG3KX56O.js.map +1 -0
  24. package/dist/chunk-R3XIBBAW.cjs +34 -0
  25. package/dist/chunk-R3XIBBAW.cjs.map +1 -0
  26. package/dist/chunk-RLTG4YZM.cjs +117 -0
  27. package/dist/chunk-RLTG4YZM.cjs.map +1 -0
  28. package/dist/chunk-SDMNUYVU.js +30 -0
  29. package/dist/chunk-SDMNUYVU.js.map +1 -0
  30. package/dist/chunk-UEG7KMKC.cjs +228 -0
  31. package/dist/chunk-UEG7KMKC.cjs.map +1 -0
  32. package/dist/chunk-UEYC46RL.js +374 -0
  33. package/dist/chunk-UEYC46RL.js.map +1 -0
  34. package/dist/chunk-YPAFJ7EV.js +225 -0
  35. package/dist/chunk-YPAFJ7EV.js.map +1 -0
  36. package/dist/cli/index.cjs +306 -0
  37. package/dist/cli/index.cjs.map +1 -0
  38. package/dist/cli/index.d.cts +1 -0
  39. package/dist/cli/index.d.ts +1 -0
  40. package/dist/cli/index.js +303 -0
  41. package/dist/cli/index.js.map +1 -0
  42. package/dist/drizzle/index.cjs +25 -0
  43. package/dist/drizzle/index.cjs.map +1 -0
  44. package/dist/drizzle/index.d.cts +49 -0
  45. package/dist/drizzle/index.d.ts +49 -0
  46. package/dist/drizzle/index.js +4 -0
  47. package/dist/drizzle/index.js.map +1 -0
  48. package/dist/graphql/index.cjs +16 -0
  49. package/dist/graphql/index.cjs.map +1 -0
  50. package/dist/graphql/index.d.cts +20 -0
  51. package/dist/graphql/index.d.ts +20 -0
  52. package/dist/graphql/index.js +3 -0
  53. package/dist/graphql/index.js.map +1 -0
  54. package/dist/index-4fJKLFK2.d.ts +63 -0
  55. package/dist/index-DI0DRPNv.d.cts +63 -0
  56. package/dist/index.cjs +2506 -0
  57. package/dist/index.cjs.map +1 -0
  58. package/dist/index.d.cts +525 -0
  59. package/dist/index.d.ts +525 -0
  60. package/dist/index.js +2334 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mongodb/index.cjs +17 -0
  63. package/dist/mongodb/index.cjs.map +1 -0
  64. package/dist/mongodb/index.d.cts +49 -0
  65. package/dist/mongodb/index.d.ts +49 -0
  66. package/dist/mongodb/index.js +4 -0
  67. package/dist/mongodb/index.js.map +1 -0
  68. package/dist/rest/index.cjs +17 -0
  69. package/dist/rest/index.cjs.map +1 -0
  70. package/dist/rest/index.d.cts +28 -0
  71. package/dist/rest/index.d.ts +28 -0
  72. package/dist/rest/index.js +4 -0
  73. package/dist/rest/index.js.map +1 -0
  74. package/dist/trpc/index.cjs +45 -0
  75. package/dist/trpc/index.cjs.map +1 -0
  76. package/dist/trpc/index.d.cts +130 -0
  77. package/dist/trpc/index.d.ts +130 -0
  78. package/dist/trpc/index.js +4 -0
  79. package/dist/trpc/index.js.map +1 -0
  80. package/dist/types-BGM5MV_K.d.cts +589 -0
  81. package/dist/types-BGM5MV_K.d.ts +589 -0
  82. package/dist/ws/index.cjs +24 -0
  83. package/dist/ws/index.cjs.map +1 -0
  84. package/dist/ws/index.d.cts +88 -0
  85. package/dist/ws/index.d.ts +88 -0
  86. package/dist/ws/index.js +3 -0
  87. package/dist/ws/index.js.map +1 -0
  88. package/package.json +120 -0
@@ -0,0 +1,293 @@
1
+ 'use strict';
2
+
3
+ var chunkRLTG4YZM_cjs = require('./chunk-RLTG4YZM.cjs');
4
+
5
+ // src/database/mongodb/adapter.ts
6
+ var MongoDBAdapter = class extends chunkRLTG4YZM_cjs.AbstractBaseAdapter {
7
+ client;
8
+ db;
9
+ database;
10
+ constructor(options) {
11
+ super();
12
+ this.client = options.client;
13
+ this.database = options.database;
14
+ }
15
+ async connect() {
16
+ this.db = this.client.db(this.database);
17
+ this.connected = true;
18
+ console.log(`[MongoDBAdapter] Connected to database: ${this.database}`);
19
+ }
20
+ async disconnect() {
21
+ if (this.client) {
22
+ await this.client.close();
23
+ this.connected = false;
24
+ console.log(`[MongoDBAdapter] Disconnected`);
25
+ }
26
+ }
27
+ getMongoCollection(slug) {
28
+ if (!this.db) {
29
+ throw new Error("MongoDB not connected");
30
+ }
31
+ return this.db.collection(slug);
32
+ }
33
+ async find(args) {
34
+ const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;
35
+ const config = this.getCollectionConfig(slug);
36
+ const col = this.getMongoCollection(slug);
37
+ const filter = this.buildFilter(where, tenantID);
38
+ const sortOption = this.parseSort(sort);
39
+ const sortObj = {
40
+ [sortOption.field]: sortOption.direction === "asc" ? 1 : -1
41
+ };
42
+ const skip = (page - 1) * limit;
43
+ const [docs, totalDocs] = await Promise.all([
44
+ col.find(filter).sort(sortObj).skip(skip).limit(limit).project(this.buildProjection(select)).toArray(),
45
+ col.countDocuments(filter)
46
+ ]);
47
+ const processedDocs = docs.map((doc) => this.processResult(doc, config));
48
+ return {
49
+ docs: processedDocs,
50
+ ...this.calculatePagination(page, limit, totalDocs)
51
+ };
52
+ }
53
+ async findByID(args) {
54
+ const { collection: slug, id, tenantID } = args;
55
+ const config = this.getCollectionConfig(slug);
56
+ const col = this.getMongoCollection(slug);
57
+ const filter = { _id: id };
58
+ if (tenantID) {
59
+ filter.tenantId = tenantID;
60
+ }
61
+ const doc = await col.findOne(filter);
62
+ if (!doc) return null;
63
+ return this.processResult(doc, config);
64
+ }
65
+ async create(args) {
66
+ const { collection: slug, data, tenantID } = args;
67
+ const config = this.getCollectionConfig(slug);
68
+ const col = this.getMongoCollection(slug);
69
+ const doc = {
70
+ ...this.prepareData(data, config),
71
+ _id: this.generateId()
72
+ };
73
+ if (tenantID) {
74
+ doc.tenantId = tenantID;
75
+ }
76
+ await col.insertOne(doc);
77
+ return this.processResult(doc, config);
78
+ }
79
+ async update(args) {
80
+ const { collection: slug, id, data, tenantID } = args;
81
+ const config = this.getCollectionConfig(slug);
82
+ const col = this.getMongoCollection(slug);
83
+ const filter = { _id: id };
84
+ if (tenantID) {
85
+ filter.tenantId = tenantID;
86
+ }
87
+ const updateData = this.prepareData(data, config);
88
+ const result = await col.findOneAndUpdate(
89
+ filter,
90
+ { $set: updateData },
91
+ { returnDocument: "after" }
92
+ );
93
+ if (!result) {
94
+ throw new Error(`Document not found: ${slug}/${id}`);
95
+ }
96
+ return this.processResult(result, config);
97
+ }
98
+ async delete(args) {
99
+ const { collection: slug, id, tenantID } = args;
100
+ const config = this.getCollectionConfig(slug);
101
+ const col = this.getMongoCollection(slug);
102
+ const filter = { _id: id };
103
+ if (tenantID) {
104
+ filter.tenantId = tenantID;
105
+ }
106
+ const doc = await col.findOneAndDelete(filter);
107
+ if (!doc) {
108
+ throw new Error(`Document not found: ${slug}/${id}`);
109
+ }
110
+ return this.processResult(doc, config);
111
+ }
112
+ async count(args) {
113
+ const { collection: slug, where = {}, tenantID } = args;
114
+ const col = this.getMongoCollection(slug);
115
+ const filter = this.buildFilter(where, tenantID);
116
+ return col.countDocuments(filter);
117
+ }
118
+ async findOne(args) {
119
+ const { collection: slug, where = {}, tenantID } = args;
120
+ const config = this.getCollectionConfig(slug);
121
+ const col = this.getMongoCollection(slug);
122
+ const filter = this.buildFilter(where, tenantID);
123
+ const doc = await col.findOne(filter);
124
+ if (!doc) return null;
125
+ return this.processResult(doc, config);
126
+ }
127
+ async findVersions(args) {
128
+ const { collection: slug, where = {}, sort, limit = 10, page = 1 } = args;
129
+ const versionCollection = this.getMongoCollection(`${slug}_versions`);
130
+ const filter = this.buildFilter(where);
131
+ const skip = (page - 1) * limit;
132
+ const sortOption = this.parseSort(sort);
133
+ const sortObj = {
134
+ [sortOption.field]: sortOption.direction === "asc" ? 1 : -1
135
+ };
136
+ const [docs, totalDocs] = await Promise.all([
137
+ versionCollection.find(filter).sort(sortObj).skip(skip).limit(limit).toArray(),
138
+ versionCollection.countDocuments(filter)
139
+ ]);
140
+ return {
141
+ docs: docs.map((doc) => this.processResult(doc, {})),
142
+ ...this.calculatePagination(page, limit, totalDocs)
143
+ };
144
+ }
145
+ async findVersionByID(args) {
146
+ const { collection: slug, id } = args;
147
+ const versionCollection = this.getMongoCollection(`${slug}_versions`);
148
+ return versionCollection.findOne({ _id: id });
149
+ }
150
+ async createVersion(args) {
151
+ const { collection: slug, data } = args;
152
+ const versionCollection = this.getMongoCollection(`${slug}_versions`);
153
+ const doc = {
154
+ ...data,
155
+ _id: this.generateId(),
156
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
157
+ };
158
+ await versionCollection.insertOne(doc);
159
+ return doc;
160
+ }
161
+ async deleteVersions(args) {
162
+ const { collection: slug, where } = args;
163
+ const versionCollection = this.getMongoCollection(`${slug}_versions`);
164
+ await versionCollection.deleteMany(where);
165
+ }
166
+ async migrate() {
167
+ for (const config of this.collections.values()) {
168
+ const col = this.getMongoCollection(config.slug);
169
+ await col.createIndex({ _id: 1 });
170
+ if (config.tenantScoped) {
171
+ await col.createIndex({ tenantId: 1 });
172
+ }
173
+ if (config.timestamps) {
174
+ await col.createIndex({ createdAt: -1 });
175
+ }
176
+ for (const field of config.fields) {
177
+ if (field.unique && field.name) {
178
+ await col.createIndex({ [field.name]: 1 }, { unique: true });
179
+ }
180
+ if (field.indexed && field.name) {
181
+ await col.createIndex({ [field.name]: 1 });
182
+ }
183
+ }
184
+ }
185
+ console.log(`[MongoDBAdapter] Migration completed`);
186
+ }
187
+ // ========================================================================
188
+ // Helper Methods
189
+ // ========================================================================
190
+ getCollectionConfig(slug) {
191
+ const config = this.collections.get(slug);
192
+ if (!config) {
193
+ throw new Error(`Collection "${slug}" not found`);
194
+ }
195
+ return config;
196
+ }
197
+ buildFilter(where = {}, tenantID) {
198
+ const filter = {};
199
+ if (tenantID) {
200
+ filter.tenantId = tenantID;
201
+ }
202
+ for (const [key, value] of Object.entries(where)) {
203
+ if (key === "AND" && Array.isArray(value)) {
204
+ const andConditions = value.map((v) => this.buildFilter(v));
205
+ Object.assign(filter, ...andConditions);
206
+ } else if (key === "OR" && Array.isArray(value)) {
207
+ filter.$or = value.map((v) => this.buildFilter(v));
208
+ } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
209
+ const mongoOperators = {};
210
+ if (value.equals !== void 0) {
211
+ filter[key === "id" ? "_id" : key] = value.equals;
212
+ continue;
213
+ }
214
+ if (value.not_equals !== void 0) {
215
+ mongoOperators.$ne = value.not_equals;
216
+ }
217
+ if (value.in !== void 0) {
218
+ mongoOperators.$in = value.in;
219
+ }
220
+ if (value.not_in !== void 0) {
221
+ mongoOperators.$nin = value.not_in;
222
+ }
223
+ if (value.greater_than !== void 0) {
224
+ mongoOperators.$gt = value.greater_than;
225
+ }
226
+ if (value.greater_than_equal !== void 0) {
227
+ mongoOperators.$gte = value.greater_than_equal;
228
+ }
229
+ if (value.less_than !== void 0) {
230
+ mongoOperators.$lt = value.less_than;
231
+ }
232
+ if (value.less_than_equal !== void 0) {
233
+ mongoOperators.$lte = value.less_than_equal;
234
+ }
235
+ if (value.like !== void 0) {
236
+ mongoOperators.$regex = new RegExp(value.like.replace(/%/g, ".*"), "i");
237
+ }
238
+ if (value.not_like !== void 0) {
239
+ mongoOperators.$not = new RegExp(value.not_like.replace(/%/g, ".*"), "i");
240
+ }
241
+ if (value.contains !== void 0) {
242
+ mongoOperators.$regex = new RegExp(`.*${value.contains}.*`, "i");
243
+ }
244
+ if (value.exists !== void 0) {
245
+ mongoOperators.$exists = value.exists;
246
+ }
247
+ if (Object.keys(mongoOperators).length > 0) {
248
+ filter[key === "id" ? "_id" : key] = mongoOperators;
249
+ }
250
+ } else {
251
+ filter[key === "id" ? "_id" : key] = value;
252
+ }
253
+ }
254
+ return filter;
255
+ }
256
+ buildProjection(select) {
257
+ if (!select || select.length === 0) return void 0;
258
+ const projection = { _id: 1 };
259
+ for (const field of select) {
260
+ projection[field] = 1;
261
+ }
262
+ return projection;
263
+ }
264
+ processResult(data, config) {
265
+ if (!data) return null;
266
+ const result = { ...data };
267
+ if (data._id) {
268
+ result.id = data._id;
269
+ delete result._id;
270
+ }
271
+ delete result.__v;
272
+ if (result.createdAt) {
273
+ result.createdAt = new Date(result.createdAt).toISOString();
274
+ }
275
+ if (result.updatedAt) {
276
+ result.updatedAt = new Date(result.updatedAt).toISOString();
277
+ }
278
+ return result;
279
+ }
280
+ generateId() {
281
+ const timestamp = Math.floor(Date.now() / 1e3).toString(16).padStart(8, "0");
282
+ const random = Math.random().toString(16).slice(2).padStart(16, "0");
283
+ return timestamp + random;
284
+ }
285
+ };
286
+ function createMongoDBAdapter(options) {
287
+ return new MongoDBAdapter(options);
288
+ }
289
+
290
+ exports.MongoDBAdapter = MongoDBAdapter;
291
+ exports.createMongoDBAdapter = createMongoDBAdapter;
292
+ //# sourceMappingURL=chunk-HT6VE4NW.cjs.map
293
+ //# sourceMappingURL=chunk-HT6VE4NW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/database/mongodb/adapter.ts"],"names":["AbstractBaseAdapter"],"mappings":"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","file":"chunk-HT6VE4NW.cjs","sourcesContent":["import { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n} from '../../registry/types.js';\n\n// ============================================================================\n// MongoDB Adapter\n// ============================================================================\n\nexport class MongoDBAdapter extends AbstractBaseAdapter {\n private client: any;\n private db: any;\n private database: string;\n \n constructor(options: {\n client: any;\n database: string;\n }) {\n super();\n this.client = options.client;\n this.database = options.database;\n }\n\n async connect(): Promise<void> {\n this.db = this.client.db(this.database);\n this.connected = true;\n console.log(`[MongoDBAdapter] Connected to database: ${this.database}`);\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.connected = false;\n console.log(`[MongoDBAdapter] Disconnected`);\n }\n }\n\n private getMongoCollection(slug: string): any {\n if (!this.db) {\n throw new Error('MongoDB not connected');\n }\n return this.db.collection(slug);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n // Build filter\n const filter = this.buildFilter(where, tenantID);\n \n // Build sort\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n // Execute query\n const skip = (page - 1) * limit;\n \n const [docs, totalDocs] = await Promise.all([\n col\n .find(filter)\n .sort(sortObj)\n .skip(skip)\n .limit(limit)\n .project(this.buildProjection(select))\n .toArray(),\n col.countDocuments(filter),\n ]);\n\n // Process results\n const processedDocs = docs.map((doc: any) => this.processResult(doc, config));\n\n return {\n docs: processedDocs as T[],\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n return this.processResult(doc, config) as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const doc: any = {\n ...this.prepareData(data, config),\n _id: this.generateId(),\n };\n\n if (tenantID) {\n doc.tenantId = tenantID;\n }\n\n await col.insertOne(doc);\n\n return this.processResult(doc, config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const updateData = this.prepareData(data, config);\n\n const result = await col.findOneAndUpdate(\n filter,\n { $set: updateData },\n { returnDocument: 'after' }\n );\n\n if (!result) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result, config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const doc = await col.findOneAndDelete(filter);\n if (!doc) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(doc, config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n return col.countDocuments(filter);\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string }): Promise<any> {\n const { collection: slug, where = {}, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n return this.processResult(doc, config);\n }\n\n async findVersions(args: FindArgs): Promise<FindResult<any>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1 } = args;\n \n // Versions stored in a separate collection\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter = this.buildFilter(where);\n\n const skip = (page - 1) * limit;\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n const [docs, totalDocs] = await Promise.all([\n versionCollection.find(filter).sort(sortObj).skip(skip).limit(limit).toArray(),\n versionCollection.countDocuments(filter),\n ]);\n\n return {\n docs: docs.map((doc: any) => this.processResult(doc, {} as CollectionConfig)),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: FindByIDArgs): Promise<any> {\n const { collection: slug, id } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n return versionCollection.findOne({ _id: id });\n }\n\n async createVersion(args: CreateArgs): Promise<any> {\n const { collection: slug, data } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n\n const doc = {\n ...data,\n _id: this.generateId(),\n createdAt: new Date().toISOString(),\n };\n\n await versionCollection.insertOne(doc);\n return doc;\n }\n\n async deleteVersions(args: { collection: string; where: Record<string, any> }): Promise<void> {\n const { collection: slug, where } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n await versionCollection.deleteMany(where);\n }\n\n async migrate?(): Promise<void> {\n // Create indexes for all collections\n for (const config of this.collections.values()) {\n const col = this.getMongoCollection(config.slug);\n\n // Create default indexes\n await col.createIndex({ _id: 1 });\n \n if (config.tenantScoped) {\n await col.createIndex({ tenantId: 1 });\n }\n\n if (config.timestamps) {\n await col.createIndex({ createdAt: -1 });\n }\n\n // Create unique indexes\n for (const field of config.fields) {\n if (field.unique && field.name) {\n await col.createIndex({ [field.name]: 1 }, { unique: true });\n }\n if (field.indexed && field.name) {\n await col.createIndex({ [field.name]: 1 });\n }\n }\n }\n \n console.log(`[MongoDBAdapter] Migration completed`);\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getCollectionConfig(slug: string): CollectionConfig {\n const config = this.collections.get(slug);\n if (!config) {\n throw new Error(`Collection \"${slug}\" not found`);\n }\n return config;\n }\n\n private buildFilter(where: Record<string, any> = {}, tenantID?: string): Record<string, any> {\n const filter: Record<string, any> = {};\n\n // Apply tenant filter\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n // Convert operators to MongoDB format\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n const andConditions = value.map((v: any) => this.buildFilter(v));\n Object.assign(filter, ...andConditions);\n } else if (key === 'OR' && Array.isArray(value)) {\n filter.$or = value.map((v: any) => this.buildFilter(v));\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Operator-based conditions\n const mongoOperators: Record<string, any> = {};\n \n if (value.equals !== undefined) {\n filter[key === 'id' ? '_id' : key] = value.equals;\n continue;\n }\n if (value.not_equals !== undefined) {\n mongoOperators.$ne = value.not_equals;\n }\n if (value.in !== undefined) {\n mongoOperators.$in = value.in;\n }\n if (value.not_in !== undefined) {\n mongoOperators.$nin = value.not_in;\n }\n if (value.greater_than !== undefined) {\n mongoOperators.$gt = value.greater_than;\n }\n if (value.greater_than_equal !== undefined) {\n mongoOperators.$gte = value.greater_than_equal;\n }\n if (value.less_than !== undefined) {\n mongoOperators.$lt = value.less_than;\n }\n if (value.less_than_equal !== undefined) {\n mongoOperators.$lte = value.less_than_equal;\n }\n if (value.like !== undefined) {\n mongoOperators.$regex = new RegExp(value.like.replace(/%/g, '.*'), 'i');\n }\n if (value.not_like !== undefined) {\n mongoOperators.$not = new RegExp(value.not_like.replace(/%/g, '.*'), 'i');\n }\n if (value.contains !== undefined) {\n mongoOperators.$regex = new RegExp(`.*${value.contains}.*`, 'i');\n }\n if (value.exists !== undefined) {\n mongoOperators.$exists = value.exists;\n }\n\n if (Object.keys(mongoOperators).length > 0) {\n filter[key === 'id' ? '_id' : key] = mongoOperators;\n }\n } else {\n // Direct equality\n filter[key === 'id' ? '_id' : key] = value;\n }\n }\n\n return filter;\n }\n\n private buildProjection(select?: string[]): Record<string, 1> | undefined {\n if (!select || select.length === 0) return undefined;\n \n const projection: Record<string, 1> = { _id: 1 };\n for (const field of select) {\n projection[field] = 1;\n }\n return projection;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert _id to id\n if (data._id) {\n result.id = data._id;\n delete result._id;\n }\n\n // Remove MongoDB internals\n delete result.__v;\n\n // Convert dates to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n\n private generateId(): string {\n // Generate a MongoDB-like ObjectId\n const timestamp = Math.floor(Date.now() / 1000).toString(16).padStart(8, '0');\n const random = Math.random().toString(16).slice(2).padStart(16, '0');\n return timestamp + random;\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createMongoDBAdapter(options: {\n client: any;\n database: string;\n}): MongoDBAdapter {\n return new MongoDBAdapter(options);\n}\n"]}
@@ -0,0 +1,311 @@
1
+ 'use strict';
2
+
3
+ var graphql = require('graphql');
4
+
5
+ // src/api/graphql/schema.ts
6
+ function fieldToGraphQLType(field, registry) {
7
+ switch (field.type) {
8
+ case "text":
9
+ case "email":
10
+ case "password":
11
+ case "textarea":
12
+ case "color":
13
+ case "code":
14
+ case "markdown":
15
+ case "date":
16
+ case "select":
17
+ case "radio":
18
+ case "upload":
19
+ return graphql.GraphQLString;
20
+ case "number":
21
+ return field.integer ? graphql.GraphQLInt : graphql.GraphQLFloat;
22
+ case "checkbox":
23
+ return graphql.GraphQLBoolean;
24
+ case "json":
25
+ case "richtext":
26
+ return graphql.GraphQLString;
27
+ // JSON as string
28
+ case "relationship":
29
+ if (typeof field.relationTo === "string") {
30
+ const relatedCollection = registry.getCollection(field.relationTo);
31
+ if (relatedCollection) {
32
+ return new graphql.GraphQLObjectType({
33
+ name: `${field.relationTo}_ref`,
34
+ fields: () => ({
35
+ id: { type: graphql.GraphQLString },
36
+ ...buildFieldsFromCollection(relatedCollection, registry)
37
+ })
38
+ });
39
+ }
40
+ }
41
+ return graphql.GraphQLString;
42
+ case "array":
43
+ return new graphql.GraphQLList(graphql.GraphQLString);
44
+ // Simplified
45
+ case "group":
46
+ return graphql.GraphQLString;
47
+ // Simplified - JSON string
48
+ case "blocks":
49
+ return new graphql.GraphQLList(graphql.GraphQLString);
50
+ // Simplified
51
+ case "row":
52
+ case "collapsible":
53
+ case "tabs":
54
+ return graphql.GraphQLString;
55
+ default:
56
+ return graphql.GraphQLString;
57
+ }
58
+ }
59
+ function buildFieldsFromCollection(config, registry) {
60
+ const fields = {};
61
+ for (const field of config.fields) {
62
+ if (field.name && field.admin?.hidden !== true) {
63
+ fields[field.name] = {
64
+ type: field.required ? new graphql.GraphQLNonNull(fieldToGraphQLType(field, registry)) : fieldToGraphQLType(field, registry),
65
+ description: field.admin?.description || field.label
66
+ };
67
+ }
68
+ }
69
+ return fields;
70
+ }
71
+ function buildGraphQLSchema(options) {
72
+ const { registry, db, user, req, tenantID } = options;
73
+ const collections = registry.getCollections();
74
+ const globals = registry.getGlobals();
75
+ const collectionTypes = {};
76
+ const collectionInputTypes = {};
77
+ for (const collection of collections) {
78
+ collectionTypes[collection.slug] = new graphql.GraphQLObjectType({
79
+ name: `${collection.slug.replace(/-/g, "_")}_type`,
80
+ fields: () => ({
81
+ id: { type: graphql.GraphQLString },
82
+ ...buildFieldsFromCollection(collection, registry),
83
+ ...collection.timestamps ? {
84
+ createdAt: { type: graphql.GraphQLString },
85
+ updatedAt: { type: graphql.GraphQLString }
86
+ } : {},
87
+ ...collection.tenantScoped ? {
88
+ tenantID: { type: graphql.GraphQLString }
89
+ } : {}
90
+ })
91
+ });
92
+ const inputFields = {};
93
+ for (const field of collection.fields) {
94
+ if (field.name && field.name !== "id") {
95
+ inputFields[field.name] = {
96
+ type: fieldToGraphQLType(field, registry)
97
+ };
98
+ }
99
+ }
100
+ collectionInputTypes[collection.slug] = new graphql.GraphQLInputObjectType({
101
+ name: `${collection.slug.replace(/-/g, "_")}_input`,
102
+ fields: () => inputFields
103
+ });
104
+ }
105
+ const globalTypes = {};
106
+ for (const global of globals) {
107
+ globalTypes[global.slug] = new graphql.GraphQLObjectType({
108
+ name: `${global.slug.replace(/-/g, "_")}_global_type`,
109
+ fields: () => ({
110
+ id: { type: graphql.GraphQLString },
111
+ ...buildFieldsFromCollection(
112
+ { slug: global.slug, fields: global.fields },
113
+ registry
114
+ )
115
+ })
116
+ });
117
+ }
118
+ const queryFields = {};
119
+ for (const collection of collections) {
120
+ const type = collectionTypes[collection.slug];
121
+ if (!type) continue;
122
+ queryFields[`${collection.slug}Find`] = {
123
+ type: new graphql.GraphQLObjectType({
124
+ name: `${collection.slug.replace(/-/g, "_")}_find_result`,
125
+ fields: {
126
+ docs: { type: new graphql.GraphQLList(type) },
127
+ totalDocs: { type: graphql.GraphQLInt },
128
+ page: { type: graphql.GraphQLInt },
129
+ totalPages: { type: graphql.GraphQLInt },
130
+ hasNextPage: { type: graphql.GraphQLBoolean },
131
+ hasPrevPage: { type: graphql.GraphQLBoolean }
132
+ }
133
+ }),
134
+ args: {
135
+ where: { type: graphql.GraphQLString },
136
+ sort: { type: graphql.GraphQLString },
137
+ limit: { type: graphql.GraphQLInt },
138
+ page: { type: graphql.GraphQLInt }
139
+ },
140
+ resolve: async (_, args) => {
141
+ let where = {};
142
+ if (args.where) {
143
+ try {
144
+ where = JSON.parse(args.where);
145
+ } catch {
146
+ }
147
+ }
148
+ return db.find({
149
+ collection: collection.slug,
150
+ where,
151
+ sort: args.sort,
152
+ limit: args.limit || 10,
153
+ page: args.page || 1,
154
+ tenantID
155
+ });
156
+ }
157
+ };
158
+ queryFields[`${collection.slug}FindByID`] = {
159
+ type,
160
+ args: {
161
+ id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) }
162
+ },
163
+ resolve: async (_, args) => {
164
+ const doc = await db.findByID({
165
+ collection: collection.slug,
166
+ id: args.id,
167
+ tenantID
168
+ });
169
+ return doc;
170
+ }
171
+ };
172
+ queryFields[`${collection.slug}Count`] = {
173
+ type: new graphql.GraphQLObjectType({
174
+ name: `${collection.slug.replace(/-/g, "_")}_count`,
175
+ fields: {
176
+ totalDocs: { type: graphql.GraphQLInt }
177
+ }
178
+ }),
179
+ args: {
180
+ where: { type: graphql.GraphQLString }
181
+ },
182
+ resolve: async (_, args) => {
183
+ let where = {};
184
+ if (args.where) {
185
+ try {
186
+ where = JSON.parse(args.where);
187
+ } catch {
188
+ }
189
+ }
190
+ const count = await db.count({
191
+ collection: collection.slug,
192
+ where,
193
+ tenantID
194
+ });
195
+ return { totalDocs: count };
196
+ }
197
+ };
198
+ }
199
+ for (const global of globals) {
200
+ const type = globalTypes[global.slug];
201
+ if (!type) continue;
202
+ queryFields[`${global.slug}Get`] = {
203
+ type,
204
+ resolve: async () => {
205
+ return db.findOne({
206
+ collection: `_globals_${global.slug}`,
207
+ where: {},
208
+ tenantID
209
+ });
210
+ }
211
+ };
212
+ }
213
+ const Query = new graphql.GraphQLObjectType({
214
+ name: "Query",
215
+ fields: queryFields
216
+ });
217
+ const mutationFields = {};
218
+ for (const collection of collections) {
219
+ const type = collectionTypes[collection.slug];
220
+ const inputType = collectionInputTypes[collection.slug];
221
+ if (!type || !inputType) continue;
222
+ mutationFields[`${collection.slug}Create`] = {
223
+ type: new graphql.GraphQLObjectType({
224
+ name: `${collection.slug.replace(/-/g, "_")}_create_result`,
225
+ fields: {
226
+ doc: { type },
227
+ message: { type: graphql.GraphQLString }
228
+ }
229
+ }),
230
+ args: {
231
+ data: { type: new graphql.GraphQLNonNull(inputType) }
232
+ },
233
+ resolve: async (_, args) => {
234
+ const schema = registry.getCreateZodSchema(collection.slug);
235
+ const validated = schema.parse(args.data);
236
+ const doc = await db.create({
237
+ collection: collection.slug,
238
+ data: validated,
239
+ tenantID
240
+ });
241
+ return { doc, message: "Created successfully" };
242
+ }
243
+ };
244
+ mutationFields[`${collection.slug}Update`] = {
245
+ type: new graphql.GraphQLObjectType({
246
+ name: `${collection.slug.replace(/-/g, "_")}_update_result`,
247
+ fields: {
248
+ doc: { type },
249
+ message: { type: graphql.GraphQLString }
250
+ }
251
+ }),
252
+ args: {
253
+ id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) },
254
+ data: { type: new graphql.GraphQLNonNull(inputType) }
255
+ },
256
+ resolve: async (_, args) => {
257
+ const schema = registry.getUpdateZodSchema(collection.slug);
258
+ const validated = schema.parse(args.data);
259
+ const doc = await db.update({
260
+ collection: collection.slug,
261
+ id: args.id,
262
+ data: validated,
263
+ tenantID
264
+ });
265
+ return { doc, message: "Updated successfully" };
266
+ }
267
+ };
268
+ mutationFields[`${collection.slug}Delete`] = {
269
+ type: new graphql.GraphQLObjectType({
270
+ name: `${collection.slug.replace(/-/g, "_")}_delete_result`,
271
+ fields: {
272
+ doc: { type },
273
+ message: { type: graphql.GraphQLString }
274
+ }
275
+ }),
276
+ args: {
277
+ id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) }
278
+ },
279
+ resolve: async (_, args) => {
280
+ const doc = await db.delete({
281
+ collection: collection.slug,
282
+ id: args.id,
283
+ tenantID
284
+ });
285
+ return { doc, message: "Deleted successfully" };
286
+ }
287
+ };
288
+ }
289
+ const Mutation = new graphql.GraphQLObjectType({
290
+ name: "Mutation",
291
+ fields: mutationFields
292
+ });
293
+ return new graphql.GraphQLSchema({
294
+ query: Query,
295
+ mutation: Mutation
296
+ });
297
+ }
298
+ function createGraphQLSchema(registry, db, options) {
299
+ return buildGraphQLSchema({
300
+ registry,
301
+ db,
302
+ user: options?.user,
303
+ req: options?.req,
304
+ tenantID: options?.tenantID
305
+ });
306
+ }
307
+
308
+ exports.buildGraphQLSchema = buildGraphQLSchema;
309
+ exports.createGraphQLSchema = createGraphQLSchema;
310
+ //# sourceMappingURL=chunk-K7QF2QCM.cjs.map
311
+ //# sourceMappingURL=chunk-K7QF2QCM.cjs.map