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
package/dist/client.js ADDED
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Bloko = void 0;
4
+ const mongodb_1 = require("mongodb");
5
+ const mongo_js_1 = require("./db/mongo.js");
6
+ const s3_js_1 = require("./storage/s3.js");
7
+ const manager_js_1 = require("./cascade/manager.js");
8
+ // Entity imports
9
+ const collections_js_1 = require("./entities/collections.js");
10
+ const languages_js_1 = require("./entities/languages.js");
11
+ const node_types_js_1 = require("./entities/node-types.js");
12
+ const templates_js_1 = require("./entities/templates.js");
13
+ const blocks_js_1 = require("./entities/blocks.js");
14
+ const nodes_js_1 = require("./entities/nodes.js");
15
+ const contents_js_1 = require("./entities/contents.js");
16
+ const images_js_1 = require("./entities/images.js");
17
+ const image_variants_js_1 = require("./entities/image-variants.js");
18
+ const node_relation_types_js_1 = require("./entities/node-relation-types.js");
19
+ const node_relations_js_1 = require("./entities/node-relations.js");
20
+ class Bloko {
21
+ mongo;
22
+ s3;
23
+ cascade;
24
+ db;
25
+ _connected = false;
26
+ // Entity instances
27
+ collections;
28
+ languages;
29
+ nodeTypes;
30
+ templates;
31
+ blocks;
32
+ nodes;
33
+ contents;
34
+ images;
35
+ imageVariants;
36
+ nodeRelationTypes;
37
+ nodeRelations;
38
+ constructor(config) {
39
+ this.mongo = new mongo_js_1.MongoConnection(config);
40
+ this.s3 = new s3_js_1.S3Storage(config.s3);
41
+ }
42
+ async connect() {
43
+ if (this._connected) {
44
+ return;
45
+ }
46
+ // Connect to MongoDB and ensure indexes
47
+ this.db = await this.mongo.connect();
48
+ // Ensure S3 bucket exists
49
+ await this.s3.ensureBucket();
50
+ this.cascade = new manager_js_1.CascadeManager(this.db, this.s3);
51
+ this.initializeEntities();
52
+ this._connected = true;
53
+ }
54
+ async disconnect() {
55
+ await this.mongo.disconnect();
56
+ this._connected = false;
57
+ }
58
+ get connected() {
59
+ return this._connected;
60
+ }
61
+ getEntityContext() {
62
+ return {
63
+ getCollection: (name) => {
64
+ return this.db.collection(name);
65
+ },
66
+ };
67
+ }
68
+ initializeEntities() {
69
+ const ctx = this.getEntityContext();
70
+ // Initialize Collections
71
+ this.collections = new collections_js_1.Collections(ctx, (collectionId) => this.cascade.cascadeCollectionDelete(collectionId));
72
+ // Initialize Languages
73
+ this.languages = new languages_js_1.Languages(ctx, (langId) => this.cascade.cascadeLanguageDelete(langId), (oldLangId, newLangId) => this.cascade.cascadeLanguageRename(oldLangId, newLangId));
74
+ // Initialize NodeTypes
75
+ this.nodeTypes = new node_types_js_1.NodeTypes(ctx, (nodeTypeId) => this.cascade.cascadeNodeTypeDelete(nodeTypeId));
76
+ // Initialize Templates
77
+ this.templates = new templates_js_1.Templates(ctx, (templateId) => this.cascade.cascadeTemplateDelete(templateId), async (id) => !!(await this.collections.findById(id)));
78
+ // Initialize Blocks
79
+ this.blocks = new blocks_js_1.Blocks(ctx, (blockId) => this.cascade.cascadeBlockDelete(blockId), (blockId) => this.cascade.cascadeBlockContentTypeChange(blockId), async (id) => !!(await this.templates.findById(id)));
80
+ // Initialize Images
81
+ this.images = new images_js_1.Images(ctx, this.s3, (imageId) => this.cascade.cascadeImageDelete(imageId), async (id) => !!(await this.collections.findById(id)));
82
+ // Initialize ImageVariants
83
+ this.imageVariants = new image_variants_js_1.ImageVariants(ctx, this.s3, async (id) => !!(await this.images.findById(id)));
84
+ // Initialize Nodes
85
+ this.nodes = new nodes_js_1.Nodes(ctx, (nodeId) => this.cascade.cascadeNodeDelete(nodeId), {
86
+ collectionExists: async (id) => !!(await this.collections.findById(id)),
87
+ templateExists: async (id) => !!(await this.templates.findById(id)),
88
+ templateInCollection: async (templateId, collectionId) => {
89
+ const template = await this.templates.findById(templateId);
90
+ return template?._collection.toString() === collectionId.toString();
91
+ },
92
+ nodeTypeExists: async (id) => !!(await this.nodeTypes.findById(id)),
93
+ imageExists: async (id) => !!(await this.images.findById(id)),
94
+ imageInCollection: async (imageId, collectionId) => {
95
+ const image = await this.images.findById(imageId);
96
+ return image?._collection.toString() === collectionId.toString();
97
+ },
98
+ });
99
+ // Initialize Contents
100
+ this.contents = new contents_js_1.Contents(ctx, {
101
+ getNode: (id) => this.nodes.findById(id),
102
+ getBlock: (id) => this.blocks.findById(id),
103
+ imageExists: async (id) => !!(await this.images.findById(id)),
104
+ imageInCollection: async (imageId, collectionId) => {
105
+ const image = await this.images.findById(imageId);
106
+ return image?._collection.toString() === collectionId.toString();
107
+ },
108
+ });
109
+ // Initialize NodeRelationTypes
110
+ this.nodeRelationTypes = new node_relation_types_js_1.NodeRelationTypes(ctx, (nodeRelationTypeId) => this.cascade.cascadeNodeRelationTypeDelete(nodeRelationTypeId), async (id) => !!(await this.collections.findById(id)));
111
+ // Initialize NodeRelations
112
+ this.nodeRelations = new node_relations_js_1.NodeRelations(ctx, {
113
+ getNode: (id) => this.nodes.findById(id),
114
+ getNodeRelationType: (id) => this.nodeRelationTypes.findById(id),
115
+ });
116
+ }
117
+ /**
118
+ * Get the raw MongoDB database instance
119
+ */
120
+ getDb() {
121
+ if (!this._connected) {
122
+ throw new Error('Not connected. Call connect() first.');
123
+ }
124
+ return this.db;
125
+ }
126
+ /**
127
+ * Get the S3 storage instance
128
+ */
129
+ getS3() {
130
+ return this.s3;
131
+ }
132
+ /**
133
+ * Helper to convert string to ObjectId
134
+ */
135
+ static toObjectId(id) {
136
+ return new mongodb_1.ObjectId(id);
137
+ }
138
+ /**
139
+ * Check if a string is a valid ObjectId
140
+ */
141
+ static isValidObjectId(id) {
142
+ return mongodb_1.ObjectId.isValid(id);
143
+ }
144
+ }
145
+ exports.Bloko = Bloko;
146
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { MongoClientOptions } from 'mongodb';
2
+ export interface S3Config {
3
+ bucket: string;
4
+ region: string;
5
+ accessKeyId?: string;
6
+ secretAccessKey?: string;
7
+ endpoint?: string;
8
+ }
9
+ export interface BlokoConfig {
10
+ mongoUri: string;
11
+ mongoOptions?: MongoClientOptions;
12
+ dbName: string;
13
+ s3: S3Config;
14
+ }
15
+ export declare const COLLECTION_NAMES: {
16
+ readonly collections: "collections";
17
+ readonly languages: "languages";
18
+ readonly nodes: "nodes";
19
+ readonly nodeTypes: "node_types";
20
+ readonly templates: "templates";
21
+ readonly blocks: "blocks";
22
+ readonly contents: "contents";
23
+ readonly images: "images";
24
+ readonly imageVariants: "image_variants";
25
+ readonly nodeRelationTypes: "node_relation_types";
26
+ readonly nodeRelations: "node_relations";
27
+ };
28
+ export type CollectionName = (typeof COLLECTION_NAMES)[keyof typeof COLLECTION_NAMES];
29
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC;CACd;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAYnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COLLECTION_NAMES = void 0;
4
+ exports.COLLECTION_NAMES = {
5
+ collections: 'collections',
6
+ languages: 'languages',
7
+ nodes: 'nodes',
8
+ nodeTypes: 'node_types',
9
+ templates: 'templates',
10
+ blocks: 'blocks',
11
+ contents: 'contents',
12
+ images: 'images',
13
+ imageVariants: 'image_variants',
14
+ nodeRelationTypes: 'node_relation_types',
15
+ nodeRelations: 'node_relations',
16
+ };
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAiBa,QAAA,gBAAgB,GAAG;IAC9B,WAAW,EAAE,aAAa;IAC1B,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,qBAAqB;IACxC,aAAa,EAAE,gBAAgB;CACvB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Db, Collection, Document } from 'mongodb';
2
+ import type { BlokoConfig } from '../config.js';
3
+ import { CollectionName } from '../config.js';
4
+ export declare class MongoConnection {
5
+ private config;
6
+ private client;
7
+ private db;
8
+ constructor(config: BlokoConfig);
9
+ connect(): Promise<Db>;
10
+ disconnect(): Promise<void>;
11
+ getDb(): Db;
12
+ getCollection<T extends Document = Document>(name: CollectionName): Collection<T>;
13
+ private ensureIndexes;
14
+ }
15
+ //# sourceMappingURL=mongo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.d.ts","sourceRoot":"","sources":["../../src/db/mongo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAoB,cAAc,EAAE,MAAM,cAAc,CAAC;AAEhE,qBAAa,eAAe;IAId,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,EAAE,CAAmB;gBAET,MAAM,EAAE,WAAW;IAEjC,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;IActB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,KAAK,IAAI,EAAE;IAOX,aAAa,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAAE,IAAI,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC;YAInE,aAAa;CA2E5B"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoConnection = void 0;
4
+ const mongodb_1 = require("mongodb");
5
+ const config_js_1 = require("../config.js");
6
+ class MongoConnection {
7
+ config;
8
+ client = null;
9
+ db = null;
10
+ constructor(config) {
11
+ this.config = config;
12
+ }
13
+ async connect() {
14
+ if (this.db) {
15
+ return this.db;
16
+ }
17
+ this.client = new mongodb_1.MongoClient(this.config.mongoUri, this.config.mongoOptions);
18
+ await this.client.connect();
19
+ this.db = this.client.db(this.config.dbName);
20
+ await this.ensureIndexes();
21
+ return this.db;
22
+ }
23
+ async disconnect() {
24
+ if (this.client) {
25
+ await this.client.close();
26
+ this.client = null;
27
+ this.db = null;
28
+ }
29
+ }
30
+ getDb() {
31
+ if (!this.db) {
32
+ throw new Error('Database not connected. Call connect() first.');
33
+ }
34
+ return this.db;
35
+ }
36
+ getCollection(name) {
37
+ return this.getDb().collection(name);
38
+ }
39
+ async ensureIndexes() {
40
+ const db = this.getDb();
41
+ // Collections indexes
42
+ await db.collection(config_js_1.COLLECTION_NAMES.collections).createIndex({ code: 1 }, { unique: true });
43
+ // Languages - no extra indexes needed, _id is the language code and is already unique
44
+ // Nodes indexes
45
+ await db.collection(config_js_1.COLLECTION_NAMES.nodes).createIndexes([
46
+ { key: { _collection: 1, code: 1 }, unique: true },
47
+ { key: { _collection: 1 } },
48
+ { key: { _parent: 1 } },
49
+ { key: { _template: 1 } },
50
+ { key: { _node_type: 1 } },
51
+ { key: { 'slug.en': 1, _parent: 1 }, sparse: true },
52
+ { key: { 'slug.ro': 1, _parent: 1 }, sparse: true },
53
+ ]);
54
+ // Node Types indexes
55
+ await db.collection(config_js_1.COLLECTION_NAMES.nodeTypes).createIndex({ code: 1 }, { unique: true });
56
+ // Templates indexes
57
+ await db.collection(config_js_1.COLLECTION_NAMES.templates).createIndexes([
58
+ { key: { _collection: 1, code: 1 }, unique: true },
59
+ { key: { _collection: 1 } },
60
+ ]);
61
+ // Blocks indexes
62
+ await db.collection(config_js_1.COLLECTION_NAMES.blocks).createIndexes([
63
+ { key: { _template: 1, code: 1 }, unique: true },
64
+ { key: { _template: 1 } },
65
+ { key: { _parent: 1 } },
66
+ ]);
67
+ // Contents indexes
68
+ await db.collection(config_js_1.COLLECTION_NAMES.contents).createIndexes([
69
+ { key: { _node: 1, _block: 1 }, unique: true },
70
+ { key: { _node: 1 } },
71
+ { key: { _block: 1 } },
72
+ ]);
73
+ // Images indexes
74
+ await db.collection(config_js_1.COLLECTION_NAMES.images).createIndexes([
75
+ { key: { _collection: 1 } },
76
+ { key: { s3_key: 1 }, unique: true },
77
+ ]);
78
+ // Image Variants indexes
79
+ await db.collection(config_js_1.COLLECTION_NAMES.imageVariants).createIndexes([
80
+ { key: { _image: 1, width: 1, height: 1, format: 1 }, unique: true },
81
+ { key: { _image: 1 } },
82
+ { key: { s3_key: 1 }, unique: true },
83
+ ]);
84
+ // Node Relation Types indexes
85
+ await db.collection(config_js_1.COLLECTION_NAMES.nodeRelationTypes).createIndexes([
86
+ { key: { _collection: 1, code: 1 }, unique: true },
87
+ { key: { _collection: 1 } },
88
+ ]);
89
+ // Node Relations indexes
90
+ await db.collection(config_js_1.COLLECTION_NAMES.nodeRelations).createIndexes([
91
+ { key: { _from: 1, _to: 1, _node_relation_type: 1 }, unique: true },
92
+ { key: { _from: 1 } },
93
+ { key: { _to: 1 } },
94
+ { key: { _node_relation_type: 1 } },
95
+ ]);
96
+ }
97
+ }
98
+ exports.MongoConnection = MongoConnection;
99
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/db/mongo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { Collection, Filter, ObjectId, WithId, Document, UpdateFilter } from 'mongodb';
2
+ import type { ZodSchema } from 'zod';
3
+ export interface EntityContext {
4
+ getCollection: <T extends Document>(name: string) => Collection<T>;
5
+ }
6
+ export declare abstract class BaseEntity<TDoc extends Document, TCreate, TUpdate> {
7
+ protected ctx: EntityContext;
8
+ protected abstract collectionName: string;
9
+ protected abstract createSchema: ZodSchema<TCreate>;
10
+ protected abstract updateSchema: ZodSchema<TUpdate>;
11
+ constructor(ctx: EntityContext);
12
+ protected get collection(): Collection<TDoc>;
13
+ protected validateCreate(data: unknown): TCreate;
14
+ protected validateUpdate(data: unknown): TUpdate;
15
+ findById(id: ObjectId): Promise<WithId<TDoc> | null>;
16
+ findByIdOrThrow(id: ObjectId): Promise<WithId<TDoc>>;
17
+ findMany(filter?: Filter<TDoc>): Promise<WithId<TDoc>[]>;
18
+ findOne(filter: Filter<TDoc>): Promise<WithId<TDoc> | null>;
19
+ count(filter?: Filter<TDoc>): Promise<number>;
20
+ exists(filter: Filter<TDoc>): Promise<boolean>;
21
+ protected updateOne(id: ObjectId, update: UpdateFilter<TDoc>): Promise<WithId<TDoc>>;
22
+ protected deleteOne(id: ObjectId): Promise<boolean>;
23
+ protected deleteMany(filter: Filter<TDoc>): Promise<number>;
24
+ }
25
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/entities/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGrC,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC;CACpE;AAED,8BAAsB,UAAU,CAAC,IAAI,SAAS,QAAQ,EAAE,OAAO,EAAE,OAAO;IAK1D,SAAS,CAAC,GAAG,EAAE,aAAa;IAJxC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;gBAE9B,GAAG,EAAE,aAAa;IAExC,SAAS,KAAK,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,CAE3C;IAED,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAUhD,SAAS,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAU1C,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAIpD,eAAe,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAQpD,QAAQ,CAAC,MAAM,GAAE,MAAM,CAAC,IAAI,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAI5D,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAI3D,KAAK,CAAC,MAAM,GAAE,MAAM,CAAC,IAAI,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIjD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;cAKpC,SAAS,CACvB,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,GACzB,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;cAcR,SAAS,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;cAKzC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAIlE"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseEntity = void 0;
4
+ const types_js_1 = require("../types.js");
5
+ class BaseEntity {
6
+ ctx;
7
+ constructor(ctx) {
8
+ this.ctx = ctx;
9
+ }
10
+ get collection() {
11
+ return this.ctx.getCollection(this.collectionName);
12
+ }
13
+ validateCreate(data) {
14
+ const result = this.createSchema.safeParse(data);
15
+ if (!result.success) {
16
+ throw new types_js_1.ValidationError('Validation failed', {
17
+ errors: result.error.errors,
18
+ });
19
+ }
20
+ return result.data;
21
+ }
22
+ validateUpdate(data) {
23
+ const result = this.updateSchema.safeParse(data);
24
+ if (!result.success) {
25
+ throw new types_js_1.ValidationError('Validation failed', {
26
+ errors: result.error.errors,
27
+ });
28
+ }
29
+ return result.data;
30
+ }
31
+ async findById(id) {
32
+ return this.collection.findOne({ _id: id });
33
+ }
34
+ async findByIdOrThrow(id) {
35
+ const doc = await this.findById(id);
36
+ if (!doc) {
37
+ throw new types_js_1.NotFoundError(this.collectionName, id.toString());
38
+ }
39
+ return doc;
40
+ }
41
+ async findMany(filter = {}) {
42
+ return this.collection.find(filter).toArray();
43
+ }
44
+ async findOne(filter) {
45
+ return this.collection.findOne(filter);
46
+ }
47
+ async count(filter = {}) {
48
+ return this.collection.countDocuments(filter);
49
+ }
50
+ async exists(filter) {
51
+ const count = await this.collection.countDocuments(filter, { limit: 1 });
52
+ return count > 0;
53
+ }
54
+ async updateOne(id, update) {
55
+ const result = await this.collection.findOneAndUpdate({ _id: id }, update, { returnDocument: 'after' });
56
+ if (!result) {
57
+ throw new types_js_1.NotFoundError(this.collectionName, id.toString());
58
+ }
59
+ return result;
60
+ }
61
+ async deleteOne(id) {
62
+ const result = await this.collection.deleteOne({ _id: id });
63
+ return result.deletedCount > 0;
64
+ }
65
+ async deleteMany(filter) {
66
+ const result = await this.collection.deleteMany(filter);
67
+ return result.deletedCount;
68
+ }
69
+ }
70
+ exports.BaseEntity = BaseEntity;
71
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/entities/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { ObjectId } from 'mongodb';
2
+ import { BaseEntity, type EntityContext } from './base.js';
3
+ import type { BlockDoc } from '../types.js';
4
+ import { type BlockInput } from '../validation/schemas.js';
5
+ export declare class Blocks extends BaseEntity<BlockDoc, BlockInput, Partial<Omit<BlockInput, '_template'>>> {
6
+ private cascadeDelete;
7
+ private cascadeContentTypeChange;
8
+ private templateExists;
9
+ protected collectionName: "blocks";
10
+ protected createSchema: import("zod").ZodObject<{
11
+ code: import("zod").ZodString;
12
+ _template: import("zod").ZodEffects<import("zod").ZodString, string, string>;
13
+ _parent: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>>;
14
+ title: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNullable<import("zod").ZodString>>>>;
15
+ content_type: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEnum<["number", "text", "text_list", "titled_text_list", "image", "images"]>>>;
16
+ sort: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>;
17
+ notes: import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodString>>;
18
+ }, "strip", import("zod").ZodTypeAny, {
19
+ code: string;
20
+ _template: string;
21
+ sort?: number | null | undefined;
22
+ _parent?: string | null | undefined;
23
+ title?: Record<string, string | null> | null | undefined;
24
+ notes?: string | null | undefined;
25
+ content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
26
+ }, {
27
+ code: string;
28
+ _template: string;
29
+ sort?: number | null | undefined;
30
+ _parent?: string | null | undefined;
31
+ title?: Record<string, string | null> | null | undefined;
32
+ notes?: string | null | undefined;
33
+ content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
34
+ }>;
35
+ protected updateSchema: import("zod").ZodObject<Omit<{
36
+ code: import("zod").ZodOptional<import("zod").ZodString>;
37
+ _template: import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>;
38
+ _parent: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEffects<import("zod").ZodString, string, string>>>>;
39
+ title: import("zod").ZodOptional<import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodNullable<import("zod").ZodString>>>>>;
40
+ content_type: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodEnum<["number", "text", "text_list", "titled_text_list", "image", "images"]>>>>;
41
+ sort: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodNumber>>>;
42
+ notes: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodOptional<import("zod").ZodString>>>;
43
+ }, "_template">, "strip", import("zod").ZodTypeAny, {
44
+ code?: string | undefined;
45
+ sort?: number | null | undefined;
46
+ _parent?: string | null | undefined;
47
+ title?: Record<string, string | null> | null | undefined;
48
+ notes?: string | null | undefined;
49
+ content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
50
+ }, {
51
+ code?: string | undefined;
52
+ sort?: number | null | undefined;
53
+ _parent?: string | null | undefined;
54
+ title?: Record<string, string | null> | null | undefined;
55
+ notes?: string | null | undefined;
56
+ content_type?: "number" | "images" | "text" | "text_list" | "titled_text_list" | "image" | null | undefined;
57
+ }>;
58
+ constructor(ctx: EntityContext, cascadeDelete: (blockId: ObjectId) => Promise<void>, cascadeContentTypeChange: (blockId: ObjectId) => Promise<void>, templateExists: (id: ObjectId) => Promise<boolean>);
59
+ private checkCircularReference;
60
+ create(data: BlockInput): Promise<BlockDoc & {
61
+ _id: ObjectId;
62
+ }>;
63
+ update(id: ObjectId, data: Partial<Omit<BlockInput, '_template'>>): Promise<BlockDoc & {
64
+ _id: ObjectId;
65
+ }>;
66
+ delete(id: ObjectId): Promise<boolean>;
67
+ findByCode(templateId: ObjectId, code: string): Promise<(BlockDoc & {
68
+ _id: ObjectId;
69
+ }) | null>;
70
+ findByTemplate(templateId: ObjectId): Promise<(BlockDoc & {
71
+ _id: ObjectId;
72
+ })[]>;
73
+ findChildren(parentId: ObjectId): Promise<(BlockDoc & {
74
+ _id: ObjectId;
75
+ })[]>;
76
+ findRootBlocks(templateId: ObjectId): Promise<(BlockDoc & {
77
+ _id: ObjectId;
78
+ })[]>;
79
+ }
80
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/entities/blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,0BAA0B,CAAC;AAIlC,qBAAa,MAAO,SAAQ,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAOhG,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,wBAAwB;IAChC,OAAO,CAAC,cAAc;IARxB,SAAS,CAAC,cAAc,WAA2B;IACnD,SAAS,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;OAAqB;IAC3C,SAAS,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;OAAqB;gBAGzC,GAAG,EAAE,aAAa,EACV,aAAa,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,EACnD,wBAAwB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,EAC9D,cAAc,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC;YAK9C,sBAAsB;IAwB9B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC;IA6C/D,MAAM,CACV,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,GAC3C,OAAO,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC;IAyDlC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAOtC,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAI9F,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;IAI/E,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;IAI3E,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,GAAG,EAAE,QAAQ,CAAA;KAAE,CAAC,EAAE,CAAC;CAGtF"}