bloko 0.0.1

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 (97) hide show
  1. package/dist/cascade/manager.d.ts +21 -0
  2. package/dist/cascade/manager.d.ts.map +1 -0
  3. package/dist/cascade/manager.js +282 -0
  4. package/dist/cascade/manager.js.map +1 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +145 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/client.d.ts +55 -0
  10. package/dist/client.d.ts.map +1 -0
  11. package/dist/client.js +146 -0
  12. package/dist/client.js.map +1 -0
  13. package/dist/config.d.ts +29 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +17 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/db/mongo.d.ts +15 -0
  18. package/dist/db/mongo.d.ts.map +1 -0
  19. package/dist/db/mongo.js +99 -0
  20. package/dist/db/mongo.js.map +1 -0
  21. package/dist/entities/base.d.ts +25 -0
  22. package/dist/entities/base.d.ts.map +1 -0
  23. package/dist/entities/base.js +71 -0
  24. package/dist/entities/base.js.map +1 -0
  25. package/dist/entities/blocks.d.ts +80 -0
  26. package/dist/entities/blocks.d.ts.map +1 -0
  27. package/dist/entities/blocks.js +152 -0
  28. package/dist/entities/blocks.js.map +1 -0
  29. package/dist/entities/collections.d.ts +40 -0
  30. package/dist/entities/collections.d.ts.map +1 -0
  31. package/dist/entities/collections.js +55 -0
  32. package/dist/entities/collections.js.map +1 -0
  33. package/dist/entities/contents.d.ts +60 -0
  34. package/dist/entities/contents.d.ts.map +1 -0
  35. package/dist/entities/contents.js +169 -0
  36. package/dist/entities/contents.js.map +1 -0
  37. package/dist/entities/image-variants.d.ts +95 -0
  38. package/dist/entities/image-variants.d.ts.map +1 -0
  39. package/dist/entities/image-variants.js +146 -0
  40. package/dist/entities/image-variants.js.map +1 -0
  41. package/dist/entities/images.d.ts +99 -0
  42. package/dist/entities/images.d.ts.map +1 -0
  43. package/dist/entities/images.js +128 -0
  44. package/dist/entities/images.js.map +1 -0
  45. package/dist/entities/languages.d.ts +25 -0
  46. package/dist/entities/languages.d.ts.map +1 -0
  47. package/dist/entities/languages.js +123 -0
  48. package/dist/entities/languages.js.map +1 -0
  49. package/dist/entities/node-relation-types.d.ts +60 -0
  50. package/dist/entities/node-relation-types.d.ts.map +1 -0
  51. package/dist/entities/node-relation-types.js +85 -0
  52. package/dist/entities/node-relation-types.js.map +1 -0
  53. package/dist/entities/node-relations.d.ts +61 -0
  54. package/dist/entities/node-relations.d.ts.map +1 -0
  55. package/dist/entities/node-relations.js +95 -0
  56. package/dist/entities/node-relations.js.map +1 -0
  57. package/dist/entities/node-types.d.ts +52 -0
  58. package/dist/entities/node-types.d.ts.map +1 -0
  59. package/dist/entities/node-types.js +67 -0
  60. package/dist/entities/node-types.js.map +1 -0
  61. package/dist/entities/nodes.d.ts +159 -0
  62. package/dist/entities/nodes.d.ts.map +1 -0
  63. package/dist/entities/nodes.js +265 -0
  64. package/dist/entities/nodes.js.map +1 -0
  65. package/dist/entities/templates.d.ts +60 -0
  66. package/dist/entities/templates.d.ts.map +1 -0
  67. package/dist/entities/templates.js +84 -0
  68. package/dist/entities/templates.js.map +1 -0
  69. package/dist/index.d.ts +16 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +76 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/storage/s3.d.ts +23 -0
  74. package/dist/storage/s3.d.ts.map +1 -0
  75. package/dist/storage/s3.js +98 -0
  76. package/dist/storage/s3.js.map +1 -0
  77. package/dist/types.d.ts +113 -0
  78. package/dist/types.d.ts.map +1 -0
  79. package/dist/types.js +51 -0
  80. package/dist/types.js.map +1 -0
  81. package/dist/utils/image.d.ts +46 -0
  82. package/dist/utils/image.d.ts.map +1 -0
  83. package/dist/utils/image.js +117 -0
  84. package/dist/utils/image.js.map +1 -0
  85. package/dist/utils/multilang.d.ts +50 -0
  86. package/dist/utils/multilang.d.ts.map +1 -0
  87. package/dist/utils/multilang.js +124 -0
  88. package/dist/utils/multilang.js.map +1 -0
  89. package/dist/utils/slug.d.ts +25 -0
  90. package/dist/utils/slug.d.ts.map +1 -0
  91. package/dist/utils/slug.js +80 -0
  92. package/dist/utils/slug.js.map +1 -0
  93. package/dist/validation/schemas.d.ts +728 -0
  94. package/dist/validation/schemas.d.ts.map +1 -0
  95. package/dist/validation/schemas.js +164 -0
  96. package/dist/validation/schemas.js.map +1 -0
  97. package/package.json +48 -0
@@ -0,0 +1,21 @@
1
+ import type { Db, ObjectId } from 'mongodb';
2
+ import type { S3Storage } from '../storage/s3.js';
3
+ export declare class CascadeManager {
4
+ private db;
5
+ private s3;
6
+ constructor(db: Db, s3: S3Storage);
7
+ cascadeCollectionDelete(collectionId: ObjectId): Promise<void>;
8
+ cascadeLanguageDelete(langId: string): Promise<void>;
9
+ cascadeLanguageRename(oldLangId: string, newLangId: string): Promise<void>;
10
+ private updateMultiLangFieldsOnLanguageChange;
11
+ private updateCollectionMultiLangFields;
12
+ private updateContentsMultiLangFields;
13
+ cascadeNodeTypeDelete(nodeTypeId: ObjectId): Promise<void>;
14
+ cascadeTemplateDelete(templateId: ObjectId): Promise<void>;
15
+ cascadeBlockDelete(blockId: ObjectId): Promise<void>;
16
+ cascadeBlockContentTypeChange(blockId: ObjectId): Promise<void>;
17
+ cascadeNodeDelete(nodeId: ObjectId): Promise<void>;
18
+ cascadeImageDelete(imageId: ObjectId): Promise<void>;
19
+ cascadeNodeRelationTypeDelete(nodeRelationTypeId: ObjectId): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cascade/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAoB5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,qBAAa,cAAc;IAEvB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,EAAE;gBADF,EAAE,EAAE,EAAE,EACN,EAAE,EAAE,SAAS;IAOjB,uBAAuB,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA0D9D,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlE,qCAAqC;YA+DrC,+BAA+B;YAiC/B,6BAA6B;IA+DrC,qBAAqB,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1D,qBAAqB,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1D,kBAAkB,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpD,6BAA6B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/D,iBAAiB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlD,kBAAkB,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DpD,6BAA6B,CAAC,kBAAkB,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAMjF"}
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CascadeManager = void 0;
4
+ const config_js_1 = require("../config.js");
5
+ const multilang_js_1 = require("../utils/multilang.js");
6
+ class CascadeManager {
7
+ db;
8
+ s3;
9
+ constructor(db, s3) {
10
+ this.db = db;
11
+ this.s3 = s3;
12
+ }
13
+ // ============================================
14
+ // Collection Cascade
15
+ // ============================================
16
+ async cascadeCollectionDelete(collectionId) {
17
+ // Delete all nodes in collection (which cascades to contents)
18
+ const nodes = await this.db
19
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
20
+ .find({ _collection: collectionId })
21
+ .toArray();
22
+ for (const node of nodes) {
23
+ await this.cascadeNodeDelete(node._id);
24
+ }
25
+ // Delete the nodes themselves
26
+ await this.db.collection(config_js_1.COLLECTION_NAMES.nodes).deleteMany({ _collection: collectionId });
27
+ // Delete all templates (which cascades to blocks)
28
+ const templates = await this.db
29
+ .collection(config_js_1.COLLECTION_NAMES.templates)
30
+ .find({ _collection: collectionId })
31
+ .toArray();
32
+ for (const template of templates) {
33
+ await this.cascadeTemplateDelete(template._id);
34
+ }
35
+ // Delete the templates themselves
36
+ await this.db.collection(config_js_1.COLLECTION_NAMES.templates).deleteMany({ _collection: collectionId });
37
+ // Delete all images (which cascades to variants)
38
+ const images = await this.db
39
+ .collection(config_js_1.COLLECTION_NAMES.images)
40
+ .find({ _collection: collectionId })
41
+ .toArray();
42
+ for (const image of images) {
43
+ await this.cascadeImageDelete(image._id);
44
+ }
45
+ // Delete the images themselves
46
+ await this.db.collection(config_js_1.COLLECTION_NAMES.images).deleteMany({ _collection: collectionId });
47
+ // Delete all node relation types (which cascades to relations)
48
+ const relationTypes = await this.db
49
+ .collection(config_js_1.COLLECTION_NAMES.nodeRelationTypes)
50
+ .find({ _collection: collectionId })
51
+ .toArray();
52
+ for (const relationType of relationTypes) {
53
+ await this.cascadeNodeRelationTypeDelete(relationType._id);
54
+ }
55
+ // Delete the node relation types themselves
56
+ await this.db.collection(config_js_1.COLLECTION_NAMES.nodeRelationTypes).deleteMany({ _collection: collectionId });
57
+ }
58
+ // ============================================
59
+ // Language Cascade
60
+ // ============================================
61
+ async cascadeLanguageDelete(langId) {
62
+ // Update all multi-language fields across all entities
63
+ await this.updateMultiLangFieldsOnLanguageChange(langId, 'delete');
64
+ }
65
+ async cascadeLanguageRename(oldLangId, newLangId) {
66
+ // Rename language key in all multi-language fields
67
+ await this.updateMultiLangFieldsOnLanguageChange(oldLangId, 'rename', newLangId);
68
+ }
69
+ async updateMultiLangFieldsOnLanguageChange(langId, operation, newLangId) {
70
+ // Nodes: title, subtitle, slug
71
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.nodes, ['title', 'subtitle', 'slug'], langId, operation, newLangId);
72
+ // Node Types: title
73
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.nodeTypes, ['title'], langId, operation, newLangId);
74
+ // Templates: title
75
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.templates, ['title'], langId, operation, newLangId);
76
+ // Blocks: title
77
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.blocks, ['title'], langId, operation, newLangId);
78
+ // Node Relation Types: title, reverse_title
79
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.nodeRelationTypes, ['title', 'reverse_title'], langId, operation, newLangId);
80
+ // Images: caption, credit
81
+ await this.updateCollectionMultiLangFields(config_js_1.COLLECTION_NAMES.images, ['caption', 'credit'], langId, operation, newLangId);
82
+ // Contents: value (for text, text_list, titled_text_list types)
83
+ await this.updateContentsMultiLangFields(langId, operation, newLangId);
84
+ }
85
+ async updateCollectionMultiLangFields(collectionName, fields, langId, operation, newLangId) {
86
+ const collection = this.db.collection(collectionName);
87
+ // Find documents that contain the language key
88
+ const orConditions = fields.map((field) => ({ [`${field}.${langId}`]: { $exists: true } }));
89
+ const docs = await collection.find({ $or: orConditions }).toArray();
90
+ for (const doc of docs) {
91
+ const updates = {};
92
+ for (const field of fields) {
93
+ const value = doc[field];
94
+ if (value && langId in value) {
95
+ if (operation === 'delete') {
96
+ updates[field] = (0, multilang_js_1.removeLanguageKey)(value, langId);
97
+ }
98
+ else if (operation === 'rename' && newLangId) {
99
+ updates[field] = (0, multilang_js_1.renameLanguageKey)(value, langId, newLangId);
100
+ }
101
+ }
102
+ }
103
+ if (Object.keys(updates).length > 0) {
104
+ await collection.updateOne({ _id: doc._id }, { $set: updates });
105
+ }
106
+ }
107
+ }
108
+ async updateContentsMultiLangFields(langId, operation, newLangId) {
109
+ const contents = this.db.collection(config_js_1.COLLECTION_NAMES.contents);
110
+ const blocks = this.db.collection(config_js_1.COLLECTION_NAMES.blocks);
111
+ // Get all blocks with text-based content types
112
+ const textBlocks = await blocks
113
+ .find({ content_type: { $in: ['text', 'text_list', 'titled_text_list'] } })
114
+ .toArray();
115
+ const blockIds = textBlocks.map((b) => b._id);
116
+ // Find contents for these blocks
117
+ const contentDocs = await contents.find({ _block: { $in: blockIds } }).toArray();
118
+ for (const content of contentDocs) {
119
+ const block = textBlocks.find((b) => b._id.toString() === content._block.toString());
120
+ if (!block)
121
+ continue;
122
+ let newValue = content.value;
123
+ if (block.content_type === 'text') {
124
+ const value = content.value;
125
+ if (value && langId in value) {
126
+ if (operation === 'delete') {
127
+ newValue = (0, multilang_js_1.removeLanguageKey)(value, langId);
128
+ }
129
+ else if (newLangId) {
130
+ newValue = (0, multilang_js_1.renameLanguageKey)(value, langId, newLangId);
131
+ }
132
+ }
133
+ }
134
+ else if (block.content_type === 'text_list') {
135
+ const value = content.value;
136
+ if (value) {
137
+ if (operation === 'delete') {
138
+ newValue = (0, multilang_js_1.removeLanguageFromTextList)(value, langId);
139
+ }
140
+ else if (newLangId) {
141
+ newValue = (0, multilang_js_1.renameLanguageInTextList)(value, langId, newLangId);
142
+ }
143
+ }
144
+ }
145
+ else if (block.content_type === 'titled_text_list') {
146
+ const value = content.value;
147
+ if (value) {
148
+ if (operation === 'delete') {
149
+ newValue = (0, multilang_js_1.removeLanguageFromTitledTextList)(value, langId);
150
+ }
151
+ else if (newLangId) {
152
+ newValue = (0, multilang_js_1.renameLanguageInTitledTextList)(value, langId, newLangId);
153
+ }
154
+ }
155
+ }
156
+ if (newValue !== content.value) {
157
+ await contents.updateOne({ _id: content._id }, { $set: { value: newValue } });
158
+ }
159
+ }
160
+ }
161
+ // ============================================
162
+ // Node Type Cascade
163
+ // ============================================
164
+ async cascadeNodeTypeDelete(nodeTypeId) {
165
+ // Delete all nodes using this node type
166
+ const nodes = await this.db
167
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
168
+ .find({ _node_type: nodeTypeId })
169
+ .toArray();
170
+ for (const node of nodes) {
171
+ await this.cascadeNodeDelete(node._id);
172
+ }
173
+ await this.db.collection(config_js_1.COLLECTION_NAMES.nodes).deleteMany({ _node_type: nodeTypeId });
174
+ }
175
+ // ============================================
176
+ // Template Cascade
177
+ // ============================================
178
+ async cascadeTemplateDelete(templateId) {
179
+ // Delete all blocks in template
180
+ const blocks = await this.db
181
+ .collection(config_js_1.COLLECTION_NAMES.blocks)
182
+ .find({ _template: templateId })
183
+ .toArray();
184
+ for (const block of blocks) {
185
+ await this.cascadeBlockDelete(block._id);
186
+ }
187
+ await this.db.collection(config_js_1.COLLECTION_NAMES.blocks).deleteMany({ _template: templateId });
188
+ // Set _template to null for all nodes using this template
189
+ await this.db
190
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
191
+ .updateMany({ _template: templateId }, { $set: { _template: null } });
192
+ }
193
+ // ============================================
194
+ // Block Cascade
195
+ // ============================================
196
+ async cascadeBlockDelete(blockId) {
197
+ // Delete all child blocks recursively
198
+ const children = await this.db
199
+ .collection(config_js_1.COLLECTION_NAMES.blocks)
200
+ .find({ _parent: blockId })
201
+ .toArray();
202
+ for (const child of children) {
203
+ await this.cascadeBlockDelete(child._id);
204
+ }
205
+ await this.db.collection(config_js_1.COLLECTION_NAMES.blocks).deleteMany({ _parent: blockId });
206
+ // Delete all contents for this block
207
+ await this.db.collection(config_js_1.COLLECTION_NAMES.contents).deleteMany({ _block: blockId });
208
+ }
209
+ async cascadeBlockContentTypeChange(blockId) {
210
+ // Delete all contents for this block
211
+ await this.db.collection(config_js_1.COLLECTION_NAMES.contents).deleteMany({ _block: blockId });
212
+ }
213
+ // ============================================
214
+ // Node Cascade
215
+ // ============================================
216
+ async cascadeNodeDelete(nodeId) {
217
+ // Delete all child nodes recursively
218
+ const children = await this.db
219
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
220
+ .find({ _parent: nodeId })
221
+ .toArray();
222
+ for (const child of children) {
223
+ await this.cascadeNodeDelete(child._id);
224
+ }
225
+ await this.db.collection(config_js_1.COLLECTION_NAMES.nodes).deleteMany({ _parent: nodeId });
226
+ // Delete all contents for this node
227
+ await this.db.collection(config_js_1.COLLECTION_NAMES.contents).deleteMany({ _node: nodeId });
228
+ // Delete all node relations involving this node
229
+ await this.db.collection(config_js_1.COLLECTION_NAMES.nodeRelations).deleteMany({
230
+ $or: [{ _from: nodeId }, { _to: nodeId }],
231
+ });
232
+ }
233
+ // ============================================
234
+ // Image Cascade
235
+ // ============================================
236
+ async cascadeImageDelete(imageId) {
237
+ // Delete all variants
238
+ const variants = await this.db
239
+ .collection(config_js_1.COLLECTION_NAMES.imageVariants)
240
+ .find({ _image: imageId })
241
+ .toArray();
242
+ // Delete variant files from S3
243
+ if (variants.length > 0) {
244
+ await this.s3.deleteMany(variants.map((v) => v.s3_key));
245
+ }
246
+ await this.db.collection(config_js_1.COLLECTION_NAMES.imageVariants).deleteMany({ _image: imageId });
247
+ // Set _cover_image to null for nodes using this image
248
+ await this.db
249
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
250
+ .updateMany({ _cover_image: imageId }, { $set: { _cover_image: null } });
251
+ // Remove from _images arrays in nodes
252
+ await this.db
253
+ .collection(config_js_1.COLLECTION_NAMES.nodes)
254
+ .updateMany({ '_images._image': imageId }, { $pull: { _images: { _image: imageId } } });
255
+ // Handle content with image type - set to null
256
+ // First get blocks with image content type
257
+ const imageBlocks = await this.db
258
+ .collection(config_js_1.COLLECTION_NAMES.blocks)
259
+ .find({ content_type: 'image' })
260
+ .toArray();
261
+ const imageBlockIds = imageBlocks.map((b) => b._id);
262
+ await this.db.collection(config_js_1.COLLECTION_NAMES.contents).updateMany({ _block: { $in: imageBlockIds }, value: imageId }, { $set: { value: null } });
263
+ // Handle content with images type - remove from array
264
+ const imagesBlocks = await this.db
265
+ .collection(config_js_1.COLLECTION_NAMES.blocks)
266
+ .find({ content_type: 'images' })
267
+ .toArray();
268
+ const imagesBlockIds = imagesBlocks.map((b) => b._id);
269
+ await this.db.collection(config_js_1.COLLECTION_NAMES.contents).updateMany({ _block: { $in: imagesBlockIds }, 'value._image': imageId }, { $pull: { value: { _image: imageId } } });
270
+ }
271
+ // ============================================
272
+ // Node Relation Type Cascade
273
+ // ============================================
274
+ async cascadeNodeRelationTypeDelete(nodeRelationTypeId) {
275
+ // Delete all node relations using this type
276
+ await this.db
277
+ .collection(config_js_1.COLLECTION_NAMES.nodeRelations)
278
+ .deleteMany({ _node_relation_type: nodeRelationTypeId });
279
+ }
280
+ }
281
+ exports.CascadeManager = CascadeManager;
282
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cascade/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const index_js_1 = require("../index.js");
5
+ const args = process.argv.slice(2);
6
+ const command = args[0];
7
+ function printHelp() {
8
+ console.log(`
9
+ bloko - Multi-language CMS with MongoDB and S3
10
+
11
+ Usage:
12
+ bloko <command> [options]
13
+
14
+ Commands:
15
+ init Initialize database (create indexes and S3 bucket)
16
+ validate Validate database integrity
17
+ export Export data to JSON
18
+ import Import data from JSON
19
+ admin Start the admin interface
20
+ version Show version
21
+
22
+ Options:
23
+ --mongo-uri MongoDB connection string (or BLOKO_MONGO_URI env)
24
+ --db-name Database name (or BLOKO_DB_NAME env)
25
+ --s3-bucket S3 bucket name (or BLOKO_S3_BUCKET env)
26
+ --s3-region S3 region (or BLOKO_S3_REGION env)
27
+ --s3-endpoint S3 endpoint (or BLOKO_S3_ENDPOINT env)
28
+
29
+ Examples:
30
+ bloko init --mongo-uri mongodb://localhost:27017 --db-name my_cms
31
+ bloko export --collection blog > backup.json
32
+ bloko import < backup.json
33
+ `);
34
+ }
35
+ function getConfig() {
36
+ const mongoUri = getArg('--mongo-uri') || process.env.BLOKO_MONGO_URI;
37
+ const dbName = getArg('--db-name') || process.env.BLOKO_DB_NAME;
38
+ const s3Bucket = getArg('--s3-bucket') || process.env.BLOKO_S3_BUCKET;
39
+ const s3Region = getArg('--s3-region') || process.env.BLOKO_S3_REGION || 'us-east-1';
40
+ const s3Endpoint = getArg('--s3-endpoint') || process.env.BLOKO_S3_ENDPOINT;
41
+ const s3AccessKey = process.env.BLOKO_S3_ACCESS_KEY || process.env.AWS_ACCESS_KEY_ID;
42
+ const s3SecretKey = process.env.BLOKO_S3_SECRET_KEY || process.env.AWS_SECRET_ACCESS_KEY;
43
+ if (!mongoUri || !dbName || !s3Bucket) {
44
+ console.error('Error: Missing required configuration.');
45
+ console.error('Provide --mongo-uri, --db-name, --s3-bucket or set environment variables.');
46
+ process.exit(1);
47
+ }
48
+ if (!s3AccessKey || !s3SecretKey) {
49
+ console.error('Error: Missing S3 credentials.');
50
+ console.error('Set BLOKO_S3_ACCESS_KEY/BLOKO_S3_SECRET_KEY or AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY.');
51
+ process.exit(1);
52
+ }
53
+ return {
54
+ mongoUri,
55
+ dbName,
56
+ s3: {
57
+ bucket: s3Bucket,
58
+ region: s3Region,
59
+ endpoint: s3Endpoint,
60
+ accessKeyId: s3AccessKey,
61
+ secretAccessKey: s3SecretKey,
62
+ },
63
+ };
64
+ }
65
+ function getArg(name) {
66
+ const index = args.indexOf(name);
67
+ if (index !== -1 && args[index + 1]) {
68
+ return args[index + 1];
69
+ }
70
+ return undefined;
71
+ }
72
+ async function init() {
73
+ const config = getConfig();
74
+ const bloko = new index_js_1.Bloko(config);
75
+ console.log('Connecting to MongoDB...');
76
+ await bloko.connect();
77
+ console.log('Database initialized successfully.');
78
+ console.log('- Indexes created');
79
+ console.log('- S3 bucket ensured');
80
+ await bloko.disconnect();
81
+ }
82
+ async function validate() {
83
+ const config = getConfig();
84
+ const bloko = new index_js_1.Bloko(config);
85
+ console.log('Connecting...');
86
+ await bloko.connect();
87
+ console.log('Validating database integrity...');
88
+ // TODO: Add validation logic
89
+ console.log('Validation complete.');
90
+ await bloko.disconnect();
91
+ }
92
+ async function admin() {
93
+ const port = getArg('--port') || process.env.BLOKO_ADMIN_PORT || '3000';
94
+ console.log(`Starting admin interface on http://localhost:${port}`);
95
+ console.log('Admin interface not yet implemented');
96
+ // TODO: Start built SvelteKit admin server
97
+ // The admin will be built and bundled with the package
98
+ // It will use the same config (mongo, s3) to connect to the database
99
+ }
100
+ function version() {
101
+ // Read from package.json at runtime
102
+ console.log('bloko v0.0.1');
103
+ }
104
+ async function main() {
105
+ try {
106
+ switch (command) {
107
+ case 'init':
108
+ await init();
109
+ break;
110
+ case 'validate':
111
+ await validate();
112
+ break;
113
+ case 'export':
114
+ console.log('Export not yet implemented');
115
+ break;
116
+ case 'import':
117
+ console.log('Import not yet implemented');
118
+ break;
119
+ case 'admin':
120
+ await admin();
121
+ break;
122
+ case 'version':
123
+ case '-v':
124
+ case '--version':
125
+ version();
126
+ break;
127
+ case 'help':
128
+ case '-h':
129
+ case '--help':
130
+ case undefined:
131
+ printHelp();
132
+ break;
133
+ default:
134
+ console.error(`Unknown command: ${command}`);
135
+ printHelp();
136
+ process.exit(1);
137
+ }
138
+ }
139
+ catch (error) {
140
+ console.error('Error:', error instanceof Error ? error.message : error);
141
+ process.exit(1);
142
+ }
143
+ }
144
+ main();
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { ObjectId, type Db } from 'mongodb';
2
+ import type { BlokoConfig } from './config.js';
3
+ import { S3Storage } from './storage/s3.js';
4
+ import { Collections } from './entities/collections.js';
5
+ import { Languages } from './entities/languages.js';
6
+ import { NodeTypes } from './entities/node-types.js';
7
+ import { Templates } from './entities/templates.js';
8
+ import { Blocks } from './entities/blocks.js';
9
+ import { Nodes } from './entities/nodes.js';
10
+ import { Contents } from './entities/contents.js';
11
+ import { Images } from './entities/images.js';
12
+ import { ImageVariants } from './entities/image-variants.js';
13
+ import { NodeRelationTypes } from './entities/node-relation-types.js';
14
+ import { NodeRelations } from './entities/node-relations.js';
15
+ export declare class Bloko {
16
+ private mongo;
17
+ private s3;
18
+ private cascade;
19
+ private db;
20
+ private _connected;
21
+ collections: Collections;
22
+ languages: Languages;
23
+ nodeTypes: NodeTypes;
24
+ templates: Templates;
25
+ blocks: Blocks;
26
+ nodes: Nodes;
27
+ contents: Contents;
28
+ images: Images;
29
+ imageVariants: ImageVariants;
30
+ nodeRelationTypes: NodeRelationTypes;
31
+ nodeRelations: NodeRelations;
32
+ constructor(config: BlokoConfig);
33
+ connect(): Promise<void>;
34
+ disconnect(): Promise<void>;
35
+ get connected(): boolean;
36
+ private getEntityContext;
37
+ private initializeEntities;
38
+ /**
39
+ * Get the raw MongoDB database instance
40
+ */
41
+ getDb(): Db;
42
+ /**
43
+ * Get the S3 storage instance
44
+ */
45
+ getS3(): S3Storage;
46
+ /**
47
+ * Helper to convert string to ObjectId
48
+ */
49
+ static toObjectId(id: string): ObjectId;
50
+ /**
51
+ * Check if a string is a valid ObjectId
52
+ */
53
+ static isValidObjectId(id: string): boolean;
54
+ }
55
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAkC,MAAM,SAAS,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,EAAE,CAAM;IAChB,OAAO,CAAC,UAAU,CAAS;IAGpB,WAAW,EAAG,WAAW,CAAC;IAC1B,SAAS,EAAG,SAAS,CAAC;IACtB,SAAS,EAAG,SAAS,CAAC;IACtB,SAAS,EAAG,SAAS,CAAC;IACtB,MAAM,EAAG,MAAM,CAAC;IAChB,KAAK,EAAG,KAAK,CAAC;IACd,QAAQ,EAAG,QAAQ,CAAC;IACpB,MAAM,EAAG,MAAM,CAAC;IAChB,aAAa,EAAG,aAAa,CAAC;IAC9B,iBAAiB,EAAG,iBAAiB,CAAC;IACtC,aAAa,EAAG,aAAa,CAAC;gBAEzB,MAAM,EAAE,WAAW;IAKzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,kBAAkB;IAiG1B;;OAEG;IACH,KAAK,IAAI,EAAE;IAOX;;OAEG;IACH,KAAK,IAAI,SAAS;IAIlB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ;IAIvC;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAG5C"}