@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
@@ -0,0 +1,246 @@
1
+ interface FieldAdmin {
2
+ description?: string;
3
+ placeholder?: string;
4
+ readOnly?: boolean;
5
+ hidden?: boolean;
6
+ width?: string;
7
+ position?: "sidebar" | "main";
8
+ autoGenerate?: string;
9
+ action?: string;
10
+ method?: string;
11
+ inline?: boolean;
12
+ condition?: (data: Record<string, any>, siblingData: Record<string, any>) => boolean;
13
+ }
14
+ interface BaseField {
15
+ name: string;
16
+ label?: string;
17
+ required?: boolean;
18
+ unique?: boolean;
19
+ indexed?: boolean;
20
+ defaultValue?: any;
21
+ admin?: FieldAdmin;
22
+ validate?: (value: any, options: ValidateOptions) => string | true | Promise<string | true>;
23
+ hooks?: {
24
+ beforeValidate?: Hook[];
25
+ beforeChange?: Hook[];
26
+ afterChange?: Hook[];
27
+ afterRead?: Hook[];
28
+ };
29
+ }
30
+ interface ValidateOptions {
31
+ data?: Record<string, any>;
32
+ siblingData?: Record<string, any>;
33
+ user?: any;
34
+ operation?: string;
35
+ required?: boolean;
36
+ }
37
+ type Hook = (args: any) => Promise<any> | any;
38
+ type TextFieldVariant = "text" | "email" | "password" | "url" | "id";
39
+ interface TextField extends BaseField {
40
+ type: "text";
41
+ variant?: TextFieldVariant;
42
+ minLength?: number;
43
+ maxLength?: number;
44
+ pattern?: string;
45
+ hasMany?: boolean;
46
+ localized?: boolean;
47
+ }
48
+ interface NumberField extends BaseField {
49
+ type: "number";
50
+ min?: number;
51
+ max?: number;
52
+ step?: number;
53
+ integer?: boolean;
54
+ hasMany?: boolean;
55
+ }
56
+ interface CheckboxField extends BaseField {
57
+ type: "checkbox";
58
+ }
59
+ interface DateField extends BaseField {
60
+ type: "date";
61
+ minDate?: string;
62
+ maxDate?: string;
63
+ time?: boolean;
64
+ }
65
+ interface EmailField extends BaseField {
66
+ type: "email";
67
+ }
68
+ interface PasswordField extends BaseField {
69
+ type: "password";
70
+ }
71
+ interface TextareaField extends BaseField {
72
+ type: "textarea";
73
+ minLength?: number;
74
+ maxLength?: number;
75
+ rows?: number;
76
+ localized?: boolean;
77
+ }
78
+ interface SelectField extends BaseField {
79
+ type: "select";
80
+ options: Array<{
81
+ label: string;
82
+ value: string;
83
+ }>;
84
+ hasMany?: boolean;
85
+ defaultValue?: string | string[];
86
+ }
87
+ interface RadioField extends BaseField {
88
+ type: "radio";
89
+ options: Array<{
90
+ label: string;
91
+ value: string;
92
+ }>;
93
+ defaultValue?: string;
94
+ }
95
+ interface ColorField extends BaseField {
96
+ type: "color";
97
+ format?: "hex" | "rgb" | "hsl";
98
+ defaultValue?: string;
99
+ }
100
+ interface ImageField extends BaseField {
101
+ type: "image";
102
+ minCount?: number;
103
+ maxCount?: number;
104
+ allowedTypes?: string[];
105
+ maxSize?: number;
106
+ }
107
+ interface RichTextBlock {
108
+ type: string;
109
+ data: Record<string, any>;
110
+ children?: RichTextBlock[];
111
+ }
112
+ interface RichTextField extends BaseField {
113
+ type: "richtext";
114
+ editor?: "lexical" | "slate" | "blocks";
115
+ hasBlocks?: boolean;
116
+ defaultValue?: RichTextBlock[];
117
+ localized?: boolean;
118
+ }
119
+ interface JSONField extends BaseField {
120
+ type: "json";
121
+ defaultValue?: Record<string, any>;
122
+ }
123
+ interface CodeField extends BaseField {
124
+ type: "code";
125
+ language?: string;
126
+ defaultValue?: string;
127
+ }
128
+ interface UploadField extends BaseField {
129
+ type: "upload";
130
+ relationTo: string;
131
+ hasMany?: boolean;
132
+ maxDepth?: number;
133
+ defaultValue?: string;
134
+ }
135
+ interface MarkdownField extends BaseField {
136
+ type: "markdown";
137
+ localized?: boolean;
138
+ defaultValue?: string;
139
+ }
140
+ interface RelationshipField extends BaseField {
141
+ type: "relationship";
142
+ relationTo: string | string[];
143
+ hasMany?: boolean;
144
+ maxDepth?: number;
145
+ filterOptions?: (args: {
146
+ data: any;
147
+ user: any;
148
+ }) => Record<string, any>;
149
+ defaultValue?: string | string[];
150
+ }
151
+ interface ArrayField extends BaseField {
152
+ type: "array";
153
+ fields: Field[];
154
+ minRows?: number;
155
+ maxRows?: number;
156
+ labels?: {
157
+ singular?: string;
158
+ plural?: string;
159
+ };
160
+ defaultValue?: Record<string, any>[];
161
+ }
162
+ interface ListField extends BaseField {
163
+ type: "list";
164
+ defaultValue?: string[];
165
+ }
166
+ interface GroupField extends BaseField {
167
+ type: "group";
168
+ fields: Field[];
169
+ defaultValue?: Record<string, any>;
170
+ }
171
+ interface BlockImage {
172
+ url: string;
173
+ alt?: string;
174
+ }
175
+ interface BlockAdmin {
176
+ group?: string;
177
+ images?: {
178
+ icon?: BlockImage | string;
179
+ thumbnail?: BlockImage | string;
180
+ };
181
+ }
182
+ interface Block {
183
+ slug: string;
184
+ label: string;
185
+ fields: Field[];
186
+ imageURL?: string;
187
+ admin?: BlockAdmin;
188
+ }
189
+ interface BlocksField extends BaseField {
190
+ type: "blocks";
191
+ blocks?: Block[];
192
+ minRows?: number;
193
+ maxRows?: number;
194
+ defaultValue?: Array<{
195
+ blockType: string;
196
+ [key: string]: any;
197
+ }>;
198
+ }
199
+ interface RowField extends Omit<BaseField, "name"> {
200
+ type: "row";
201
+ fields: Field[];
202
+ name?: string;
203
+ }
204
+ interface CollapsibleField extends Omit<BaseField, "name"> {
205
+ type: "collapsible";
206
+ fields: Field[];
207
+ label: string;
208
+ name?: string;
209
+ }
210
+ interface TabsField extends Omit<BaseField, "name"> {
211
+ type: "tabs";
212
+ tabs: Array<{
213
+ label: string;
214
+ fields: Field[];
215
+ name?: string;
216
+ }>;
217
+ name?: string;
218
+ }
219
+ interface ButtonField extends BaseField {
220
+ type: "button";
221
+ label: string;
222
+ action?: string;
223
+ method?: string;
224
+ inline?: boolean;
225
+ }
226
+ type Field = TextField | NumberField | CheckboxField | DateField | EmailField | PasswordField | TextareaField | SelectField | RadioField | ColorField | ImageField | RichTextField | JSONField | CodeField | UploadField | MarkdownField | RelationshipField | ArrayField | ListField | GroupField | BlocksField | RowField | CollapsibleField | TabsField | ButtonField;
227
+ type FieldType = Field["type"];
228
+ declare function isTextField(field: Field): field is TextField;
229
+ declare function isNumberField(field: Field): field is NumberField;
230
+ declare function isRelationshipField(field: Field): field is RelationshipField;
231
+ declare function isArrayField(field: Field): field is ArrayField;
232
+ declare function isGroupField(field: Field): field is GroupField;
233
+ declare function isBlocksField(field: Field): field is BlocksField;
234
+ declare function isUploadField(field: Field): field is UploadField;
235
+ declare function isImageField(field: Field): field is ImageField;
236
+ declare function isRichTextField(field: Field): field is RichTextField;
237
+ declare function isSelectField(field: Field): field is SelectField;
238
+ declare function isLayoutField(field: Field): field is RowField | CollapsibleField | TabsField;
239
+ declare const PRIMITIVE_FIELD_TYPES: readonly ["text", "number", "checkbox", "date", "email", "password", "textarea", "select", "radio", "color"];
240
+ declare const COMPLEX_FIELD_TYPES: readonly ["richtext", "json", "code", "upload", "image", "markdown"];
241
+ declare const RELATIONAL_FIELD_TYPES: readonly ["relationship", "array", "group", "blocks"];
242
+ declare const LAYOUT_FIELD_TYPES: readonly ["row", "collapsible", "tabs"];
243
+ declare const ALL_FIELD_TYPES: readonly ["text", "number", "checkbox", "date", "email", "password", "textarea", "select", "radio", "color", "richtext", "json", "code", "upload", "image", "markdown", "relationship", "array", "group", "blocks", "row", "collapsible", "tabs"];
244
+ declare function createRelationshipFieldConfig(name: string, relationTo: string | string[], options?: Partial<Omit<RelationshipField, "type" | "name" | "relationTo">>): RelationshipField;
245
+
246
+ export { type ArrayField as A, type BaseField as B, type CheckboxField as C, type DateField as D, type EmailField as E, type Field as F, type GroupField as G, isRichTextField as H, type ImageField as I, type JSONField as J, isSelectField as K, LAYOUT_FIELD_TYPES as L, type MarkdownField as M, type NumberField as N, isTextField as O, type PasswordField as P, isUploadField as Q, type RadioField as R, type SelectField as S, type TabsField as T, type UploadField as U, type ValidateOptions as V, type ButtonField as W, type Hook as X, type ListField as Y, type TextFieldVariant as Z, createRelationshipFieldConfig as _, type Block as a, type BlockAdmin as b, type BlockImage as c, type BlocksField as d, type CodeField as e, type CollapsibleField as f, type ColorField as g, type FieldAdmin as h, type FieldType as i, type RelationshipField as j, type RichTextBlock as k, type RichTextField as l, type RowField as m, type TextField as n, type TextareaField as o, ALL_FIELD_TYPES as p, COMPLEX_FIELD_TYPES as q, PRIMITIVE_FIELD_TYPES as r, RELATIONAL_FIELD_TYPES as s, isArrayField as t, isBlocksField as u, isGroupField as v, isImageField as w, isLayoutField as x, isNumberField as y, isRelationshipField as z };
@@ -0,0 +1,88 @@
1
+ import { WebSocket, WebSocketServer } from 'ws';
2
+
3
+ type EventHandler = (data: any) => void | Promise<void>;
4
+ declare class PubSub {
5
+ private channels;
6
+ private maxListeners;
7
+ constructor(maxListeners?: number);
8
+ subscribe(channel: string, handler: EventHandler): () => void;
9
+ publish(channel: string, data: any): void;
10
+ hasSubscribers(channel: string): boolean;
11
+ getSubscriberCount(channel: string): number;
12
+ getChannels(): string[];
13
+ clear(): void;
14
+ }
15
+ interface KyroEvent {
16
+ type: 'create' | 'update' | 'delete';
17
+ collection: string;
18
+ doc?: any;
19
+ originalDoc?: any;
20
+ id?: string;
21
+ tenantID?: string;
22
+ timestamp: string;
23
+ user?: any;
24
+ }
25
+ declare class KyroPubSub extends PubSub {
26
+ private registry;
27
+ constructor(registry: any, maxListeners?: number);
28
+ publishCollectionEvent(collection: string, event: KyroEvent): void;
29
+ subscribeToCollection(collection: string, handler: EventHandler): () => void;
30
+ subscribeToCollectionEvent(collection: string, eventType: 'create' | 'update' | 'delete', handler: EventHandler): () => void;
31
+ subscribeToTenant(tenantID: string, handler: EventHandler): () => void;
32
+ subscribeToTenantCollection(tenantID: string, collection: string, handler: EventHandler): () => void;
33
+ subscribeToAllCollections(handler: EventHandler): () => void;
34
+ createAfterChangeHook(collection: string): (args: any) => Promise<void>;
35
+ createAfterDeleteHook(collection: string): (args: any) => Promise<void>;
36
+ autoRegisterHooks(): void;
37
+ }
38
+
39
+ interface WSServerOptions {
40
+ port?: number;
41
+ pubsub: KyroPubSub;
42
+ maxConnections?: number;
43
+ pingInterval?: number;
44
+ requireAuth?: boolean;
45
+ verifyToken?: (token: string) => Promise<any>;
46
+ }
47
+ interface WSSubscription {
48
+ channel: string;
49
+ unsubscribe: () => void;
50
+ }
51
+ interface WSClient {
52
+ id: string;
53
+ ws: WebSocket;
54
+ subscriptions: Map<string, WSSubscription>;
55
+ authenticated: boolean;
56
+ user?: any;
57
+ tenantID?: string;
58
+ connectedAt: Date;
59
+ lastActivity: Date;
60
+ }
61
+ declare class KyroWSServer {
62
+ private wss;
63
+ private clients;
64
+ private pubsub;
65
+ private options;
66
+ private pingTimer?;
67
+ constructor(options: WSServerOptions);
68
+ private setupServer;
69
+ private handleMessage;
70
+ private handleAuthenticate;
71
+ private handleSubscribe;
72
+ private handleUnsubscribe;
73
+ private handleUnsubscribeAll;
74
+ private handleList;
75
+ private handleDisconnect;
76
+ private sendToClient;
77
+ private generateClientId;
78
+ private startPingInterval;
79
+ broadcast(channel: string, data: any): void;
80
+ getConnectedClients(): WSClient[];
81
+ getClientCount(): number;
82
+ getSubscriptionCount(): number;
83
+ close(): Promise<void>;
84
+ getServer(): WebSocketServer;
85
+ }
86
+ declare function createWSServer(options: WSServerOptions): KyroWSServer;
87
+
88
+ export { type EventHandler, type KyroEvent, KyroPubSub, KyroWSServer, PubSub, type WSClient, type WSServerOptions, createWSServer };
@@ -0,0 +1,88 @@
1
+ import { WebSocket, WebSocketServer } from 'ws';
2
+
3
+ type EventHandler = (data: any) => void | Promise<void>;
4
+ declare class PubSub {
5
+ private channels;
6
+ private maxListeners;
7
+ constructor(maxListeners?: number);
8
+ subscribe(channel: string, handler: EventHandler): () => void;
9
+ publish(channel: string, data: any): void;
10
+ hasSubscribers(channel: string): boolean;
11
+ getSubscriberCount(channel: string): number;
12
+ getChannels(): string[];
13
+ clear(): void;
14
+ }
15
+ interface KyroEvent {
16
+ type: 'create' | 'update' | 'delete';
17
+ collection: string;
18
+ doc?: any;
19
+ originalDoc?: any;
20
+ id?: string;
21
+ tenantID?: string;
22
+ timestamp: string;
23
+ user?: any;
24
+ }
25
+ declare class KyroPubSub extends PubSub {
26
+ private registry;
27
+ constructor(registry: any, maxListeners?: number);
28
+ publishCollectionEvent(collection: string, event: KyroEvent): void;
29
+ subscribeToCollection(collection: string, handler: EventHandler): () => void;
30
+ subscribeToCollectionEvent(collection: string, eventType: 'create' | 'update' | 'delete', handler: EventHandler): () => void;
31
+ subscribeToTenant(tenantID: string, handler: EventHandler): () => void;
32
+ subscribeToTenantCollection(tenantID: string, collection: string, handler: EventHandler): () => void;
33
+ subscribeToAllCollections(handler: EventHandler): () => void;
34
+ createAfterChangeHook(collection: string): (args: any) => Promise<void>;
35
+ createAfterDeleteHook(collection: string): (args: any) => Promise<void>;
36
+ autoRegisterHooks(): void;
37
+ }
38
+
39
+ interface WSServerOptions {
40
+ port?: number;
41
+ pubsub: KyroPubSub;
42
+ maxConnections?: number;
43
+ pingInterval?: number;
44
+ requireAuth?: boolean;
45
+ verifyToken?: (token: string) => Promise<any>;
46
+ }
47
+ interface WSSubscription {
48
+ channel: string;
49
+ unsubscribe: () => void;
50
+ }
51
+ interface WSClient {
52
+ id: string;
53
+ ws: WebSocket;
54
+ subscriptions: Map<string, WSSubscription>;
55
+ authenticated: boolean;
56
+ user?: any;
57
+ tenantID?: string;
58
+ connectedAt: Date;
59
+ lastActivity: Date;
60
+ }
61
+ declare class KyroWSServer {
62
+ private wss;
63
+ private clients;
64
+ private pubsub;
65
+ private options;
66
+ private pingTimer?;
67
+ constructor(options: WSServerOptions);
68
+ private setupServer;
69
+ private handleMessage;
70
+ private handleAuthenticate;
71
+ private handleSubscribe;
72
+ private handleUnsubscribe;
73
+ private handleUnsubscribeAll;
74
+ private handleList;
75
+ private handleDisconnect;
76
+ private sendToClient;
77
+ private generateClientId;
78
+ private startPingInterval;
79
+ broadcast(channel: string, data: any): void;
80
+ getConnectedClients(): WSClient[];
81
+ getClientCount(): number;
82
+ getSubscriptionCount(): number;
83
+ close(): Promise<void>;
84
+ getServer(): WebSocketServer;
85
+ }
86
+ declare function createWSServer(options: WSServerOptions): KyroWSServer;
87
+
88
+ export { type EventHandler, type KyroEvent, KyroPubSub, KyroWSServer, PubSub, type WSClient, type WSServerOptions, createWSServer };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kyro-cms/core",
3
- "version": "0.5.4",
3
+ "version": "0.5.5",
4
4
  "description": "Astro-native headless CMS with multi-database adapters, multi-protocol APIs, and multi-vendor support",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -54,7 +54,8 @@
54
54
  },
55
55
  "./templates": {
56
56
  "types": "./dist/templates/index.d.ts",
57
- "import": "./dist/templates/index.js"
57
+ "import": "./dist/templates/index.js",
58
+ "require": "./dist/templates/index.cjs"
58
59
  },
59
60
  "./fields": {
60
61
  "types": "./dist/fields/index.d.ts",
@@ -1,6 +0,0 @@
1
- export { autoBootstrap, bootstrapAdmin, bootstrapWithRetry, checkBootstrapRequired, getBootstrapFromEnv } from './chunk-XR5EJS3C.js';
2
- import './chunk-WH4Y5MT6.js';
3
- import './chunk-YT7HXXVN.js';
4
- import './chunk-Z6ZWNWWR.js';
5
- //# sourceMappingURL=bootstrap-PBMMLBQC.js.map
6
- //# sourceMappingURL=bootstrap-PBMMLBQC.js.map
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- var chunkXJ2VYR47_cjs = require('./chunk-XJ2VYR47.cjs');
4
- require('./chunk-EVEJC22G.cjs');
5
- require('./chunk-4PWRCMTQ.cjs');
6
- require('./chunk-G7VZBCD6.cjs');
7
-
8
-
9
-
10
- Object.defineProperty(exports, "autoBootstrap", {
11
- enumerable: true,
12
- get: function () { return chunkXJ2VYR47_cjs.autoBootstrap; }
13
- });
14
- Object.defineProperty(exports, "bootstrapAdmin", {
15
- enumerable: true,
16
- get: function () { return chunkXJ2VYR47_cjs.bootstrapAdmin; }
17
- });
18
- Object.defineProperty(exports, "bootstrapWithRetry", {
19
- enumerable: true,
20
- get: function () { return chunkXJ2VYR47_cjs.bootstrapWithRetry; }
21
- });
22
- Object.defineProperty(exports, "checkBootstrapRequired", {
23
- enumerable: true,
24
- get: function () { return chunkXJ2VYR47_cjs.checkBootstrapRequired; }
25
- });
26
- Object.defineProperty(exports, "getBootstrapFromEnv", {
27
- enumerable: true,
28
- get: function () { return chunkXJ2VYR47_cjs.getBootstrapFromEnv; }
29
- });
30
- //# sourceMappingURL=bootstrap-QN77EVI3.cjs.map
31
- //# sourceMappingURL=bootstrap-QN77EVI3.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/mongodb/adapter.ts"],"names":[],"mappings":"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","file":"chunk-342BJNBI.js","sourcesContent":["import { randomBytes } from 'crypto';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\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 private readonly draftsCollectionName = 'kyro_drafts';\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, draft } = 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 // Default filter for non-draft requests: only show published\n if (!draft) {\n filter._status = 'published';\n }\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 let processedDocs = docs.map((doc: any) => this.processResult(doc, config));\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n processedDocs = await Promise.all(processedDocs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\n }\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, draft } = 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 if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc 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; draft?: boolean }): Promise<any> {\n const { collection: slug, where = {}, tenantID, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n\n if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc;\n }\n\n async findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>> {\n const { collection: slug, documentId, sort, limit = 10, page = 1, tenantID } = args;\n \n // Versions stored in a separate collection\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\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) as VersionRecord),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null> {\n const { collection: slug, versionId, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { _id: versionId };\n if (tenantID) filter.tenant_id = tenantID;\n \n const doc = await versionCollection.findOne(filter);\n return doc ? this.processResult(doc, {} as CollectionConfig) as VersionRecord : null;\n }\n\n async createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>> {\n const { collection: slug, documentId, data, status, createdBy, changeDescription, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n\n const versionDoc: any = {\n _id: this.generateId(),\n document_id: documentId,\n collection_slug: slug,\n tenant_id: tenantID,\n data,\n status,\n created_by: createdBy,\n change_description: changeDescription,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await versionCollection.insertOne(versionDoc);\n \n // Pruning logic\n const config = this.getCollectionConfig(slug);\n if (config.versions?.maxPerDoc) {\n await this.deleteVersions({\n collection: slug,\n documentId: documentId,\n keepLatest: config.versions.maxPerDoc,\n tenantID: tenantID,\n });\n }\n\n return this.processResult(versionDoc, {} as CollectionConfig) as VersionRecord<T>;\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n const { collection: slug, documentId, keepLatest, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n \n if (keepLatest) {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n\n const toKeep = await versionCollection\n .find(filter)\n .sort({ createdAt: -1 })\n .limit(keepLatest)\n .project({ _id: 1 })\n .toArray();\n\n const keepIds = toKeep.map((doc: any) => doc._id);\n if (keepIds.length > 0) {\n await versionCollection.deleteMany({\n document_id: documentId,\n _id: { $nin: keepIds },\n ...(tenantID ? { tenant_id: tenantID } : {}),\n });\n }\n } else {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n await versionCollection.deleteMany(filter);\n }\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n const draft = await this.getMongoCollection(this.draftsCollectionName).findOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\n\n return draft ? this.docToDraft<T>(draft) : null;\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const _id = this.getDraftId(args.collection, args.documentId, args.tenantID);\n const existing = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n\n await this.getMongoCollection(this.draftsCollectionName).updateOne(\n { _id },\n {\n $set: {\n collectionSlug: args.collection,\n documentId: args.documentId,\n tenantId: args.tenantID,\n data: args.data,\n baseUpdatedAt: args.baseUpdatedAt ?? null,\n draftUpdatedAt,\n updatedAt: now,\n },\n $setOnInsert: {\n createdAt: existing?.createdAt || now,\n },\n },\n { upsert: true },\n );\n\n const saved = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n if (!saved) {\n throw new Error('Failed to persist draft snapshot');\n }\n return this.docToDraft<T>(saved);\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n await this.getMongoCollection(this.draftsCollectionName).deleteOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\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 await this.getMongoCollection(this.draftsCollectionName).createIndex({ updatedAt: -1 });\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 getDraftId(collection: string, documentId: string, tenantID?: string): string {\n return `${collection}::${documentId}::${tenantID || 'global'}`;\n }\n\n private docToDraft<T>(doc: any): DraftSnapshot<T> {\n return {\n id: String(doc._id),\n collection: doc.collectionSlug,\n documentId: doc.documentId,\n tenantID: doc.tenantId ?? undefined,\n data: doc.data || {},\n baseUpdatedAt: doc.baseUpdatedAt ?? null,\n draftUpdatedAt: doc.draftUpdatedAt,\n createdAt: doc.createdAt,\n updatedAt: doc.updatedAt,\n };\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 const timestamp = Date.now().toString(16).padStart(12, '0');\n const random = randomBytes(6).toString('hex');\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"]}