klauz-db 0.5.2 → 1.0.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.
package/dist/index.mjs ADDED
@@ -0,0 +1,354 @@
1
+ // src/collection.ts
2
+ import { join } from "path";
3
+
4
+ // src/errors/error-message.ts
5
+ import { ZodError } from "zod";
6
+
7
+ // src/errors/klauz-error.ts
8
+ var KlauzError = class extends Error {
9
+ constructor(message, code = "KLAUZ_ERROR", options) {
10
+ super(message, options);
11
+ this.code = code;
12
+ this.name = "KlauzError";
13
+ }
14
+ code;
15
+ };
16
+ var KlauzValidationError = class extends KlauzError {
17
+ constructor(message, options) {
18
+ super(message, "KLAUZ_VALIDATION_ERROR", options);
19
+ this.name = "KlauzValidationError";
20
+ }
21
+ };
22
+ var KlauzStorageError = class extends KlauzError {
23
+ constructor(message, options) {
24
+ super(message, "KLAUZ_STORAGE_ERROR", options);
25
+ this.name = "KlauzStorageError";
26
+ }
27
+ };
28
+ var KlauzNotFoundError = class extends KlauzError {
29
+ constructor(message, options) {
30
+ super(message, "KLAUZ_NOT_FOUND", options);
31
+ this.name = "KlauzNotFoundError";
32
+ }
33
+ };
34
+
35
+ // src/errors/error-message.ts
36
+ function errorMessage(err) {
37
+ if (err instanceof ZodError) {
38
+ const error = err.errors.at(-1);
39
+ return {
40
+ error: error?.message ?? "Invalid params",
41
+ code: "KLAUZ_VALIDATION_ERROR"
42
+ };
43
+ }
44
+ if (err instanceof KlauzError || err instanceof KlauzValidationError) {
45
+ return {
46
+ error: err.message,
47
+ code: err.code
48
+ };
49
+ }
50
+ if (err instanceof Error) {
51
+ return {
52
+ error: err.message,
53
+ code: "KLAUZ_ERROR"
54
+ };
55
+ }
56
+ return {
57
+ error: "Unknown error",
58
+ code: "KLAUZ_ERROR"
59
+ };
60
+ }
61
+
62
+ // src/schemas/collection-schemas.ts
63
+ import z from "zod";
64
+ var collectionNamePattern = /^[a-zA-Z0-9_-]+$/;
65
+ function parseSchema(schema, data) {
66
+ const result = schema.safeParse(data);
67
+ if (!result.success) {
68
+ const error = result.error.errors.at(-1);
69
+ throw new KlauzValidationError(error?.message ?? "Invalid params", {
70
+ cause: result.error
71
+ });
72
+ }
73
+ return result.data;
74
+ }
75
+ var klauzPropsSchema = z.object({
76
+ path: z.string().trim().min(1)
77
+ }).strict();
78
+ var collectionNameSchema = z.string().trim().min(1).regex(collectionNamePattern, "Collection name must contain only letters, numbers, hyphens and underscores");
79
+ var collectionDataSchema = z.record(
80
+ z.string(),
81
+ z.unknown(),
82
+ { message: `Content must be a object. Use 'addMany' method, to insert a new array` }
83
+ );
84
+ var collectionDataArraySchema = z.array(collectionDataSchema);
85
+ var findAllOptionsSchema = z.object({
86
+ hideInfo: z.array(z.string().min(1)).optional()
87
+ }).strict().optional();
88
+ var findOptionsSchema = z.object({
89
+ where: z.function(),
90
+ hideInfo: z.array(z.string().min(1)).optional()
91
+ }).strict();
92
+ var updateOptionsSchema = z.object({
93
+ where: z.function(),
94
+ values: collectionDataSchema
95
+ }).strict();
96
+ var deleteOptionsSchema = z.object({
97
+ where: z.function()
98
+ }).strict();
99
+
100
+ // src/storage/json-storage.ts
101
+ import { access, mkdir, readFile, unlink, writeFile } from "fs/promises";
102
+ import { dirname } from "path";
103
+ var JsonStorage = class {
104
+ constructor(filePath) {
105
+ this.filePath = filePath;
106
+ }
107
+ filePath;
108
+ async exists() {
109
+ try {
110
+ await access(this.filePath);
111
+ return true;
112
+ } catch {
113
+ return false;
114
+ }
115
+ }
116
+ async read() {
117
+ const content = await readFile(this.filePath, {
118
+ encoding: "utf-8"
119
+ });
120
+ return JSON.parse(content);
121
+ }
122
+ async write(data) {
123
+ await mkdir(dirname(this.filePath), {
124
+ recursive: true
125
+ });
126
+ await writeFile(this.filePath, JSON.stringify(data, null, 2));
127
+ }
128
+ async delete() {
129
+ await unlink(this.filePath);
130
+ }
131
+ };
132
+
133
+ // src/collection.ts
134
+ var Collection = class {
135
+ constructor(props) {
136
+ this.props = props;
137
+ const fileExtension = ".json";
138
+ const { path, name } = props;
139
+ this.#name = name;
140
+ this.#path = join(path, `.${name}${fileExtension}`);
141
+ this.#storage = new JsonStorage(this.#path);
142
+ }
143
+ props;
144
+ #name;
145
+ #path;
146
+ #storage;
147
+ #content = {};
148
+ async init() {
149
+ await this.#load();
150
+ return this;
151
+ }
152
+ async #load() {
153
+ if (!await this.#storage.exists()) {
154
+ const content = {
155
+ collection_name: this.#name,
156
+ created_at: (/* @__PURE__ */ new Date()).toISOString(),
157
+ updated_at: (/* @__PURE__ */ new Date()).toISOString(),
158
+ data: []
159
+ };
160
+ this.#content = content;
161
+ await this.#save(this.#content);
162
+ return;
163
+ }
164
+ try {
165
+ const content = await this.#storage.read();
166
+ this.#content = this.#normalizeContent(content);
167
+ } catch (err) {
168
+ throw new KlauzStorageError("Invalid collection JSON file", { cause: err });
169
+ }
170
+ }
171
+ #normalizeContent(content) {
172
+ const updatedAt = content.updated_at ?? content.last_interaction ?? content.created_at;
173
+ return {
174
+ collection_name: content.collection_name,
175
+ created_at: content.created_at,
176
+ updated_at: updatedAt,
177
+ data: content.data
178
+ };
179
+ }
180
+ async #save(content) {
181
+ await this.#storage.write(content);
182
+ }
183
+ async #setCollectionDataValue(data) {
184
+ this.#content.updated_at = (/* @__PURE__ */ new Date()).toISOString();
185
+ this.#content.data.push(data);
186
+ await this.#save(this.#content);
187
+ }
188
+ async #setCollectionData(data) {
189
+ this.#content.updated_at = (/* @__PURE__ */ new Date()).toISOString();
190
+ this.#content.data = data;
191
+ await this.#save(this.#content);
192
+ }
193
+ async #getCollectionData() {
194
+ await this.#load();
195
+ return this.#content.data;
196
+ }
197
+ #getLastNumericId(data = this.#content.data) {
198
+ const lastObject = data.findLast((obj) => typeof obj._zid === "number");
199
+ return lastObject?._zid ?? 0;
200
+ }
201
+ #removeInternalFields(data) {
202
+ const safeData = { ...data };
203
+ Reflect.deleteProperty(safeData, "_zid");
204
+ return safeData;
205
+ }
206
+ #cloneData(data) {
207
+ return data.map((obj) => ({ ...obj }));
208
+ }
209
+ #hideInfo(data, hideInfo) {
210
+ const output = this.#cloneData(data);
211
+ if (!hideInfo || hideInfo.length === 0) return output;
212
+ for (const obj of output) {
213
+ for (const info of hideInfo) {
214
+ Reflect.deleteProperty(obj, info);
215
+ }
216
+ }
217
+ return output;
218
+ }
219
+ get information() {
220
+ return this.#getInformation();
221
+ }
222
+ async #getInformation() {
223
+ await this.#load();
224
+ return {
225
+ collection_name: this.#content.collection_name,
226
+ created_at: this.#content.created_at,
227
+ updated_at: this.#content.updated_at
228
+ };
229
+ }
230
+ async add(data) {
231
+ try {
232
+ if (arguments.length > 1) throw Error("Invalid params");
233
+ await this.#load();
234
+ const obj = this.#removeInternalFields(parseSchema(collectionDataSchema, data));
235
+ const lastId = this.#getLastNumericId();
236
+ Reflect.set(obj, "_zid", lastId + 1);
237
+ await this.#setCollectionDataValue(obj);
238
+ return { ...obj };
239
+ } catch (err) {
240
+ return errorMessage(err);
241
+ }
242
+ }
243
+ async addMany(data) {
244
+ try {
245
+ if (arguments.length > 1) throw Error("Invalid params");
246
+ await this.#load();
247
+ const objs = parseSchema(collectionDataArraySchema, data).map((obj) => this.#removeInternalFields(obj));
248
+ let lastId = this.#getLastNumericId();
249
+ for (const obj of objs) {
250
+ Reflect.set(obj, "_zid", ++lastId);
251
+ }
252
+ await this.#setCollectionData([
253
+ ...this.#content.data,
254
+ ...objs
255
+ ]);
256
+ return this.#cloneData(objs);
257
+ } catch (err) {
258
+ return errorMessage(err);
259
+ }
260
+ }
261
+ async findAll(options) {
262
+ try {
263
+ if (arguments.length > 1) throw Error("Invalid params");
264
+ const collectionData = await this.#getCollectionData();
265
+ const zOpts = parseSchema(findAllOptionsSchema, options);
266
+ return this.#hideInfo(collectionData, zOpts?.hideInfo);
267
+ } catch (err) {
268
+ return errorMessage(err);
269
+ }
270
+ }
271
+ async find(options) {
272
+ try {
273
+ if (arguments.length > 1) throw Error("Invalid params");
274
+ const { where, ...opts } = parseSchema(findOptionsSchema, options);
275
+ const collectionData = await this.#getCollectionData();
276
+ const output = collectionData.filter((obj) => where.call(void 0, obj));
277
+ return this.#hideInfo(output, opts.hideInfo);
278
+ } catch (err) {
279
+ return errorMessage(err);
280
+ }
281
+ }
282
+ async update(options) {
283
+ try {
284
+ if (arguments.length > 1) throw Error("Invalid params");
285
+ const { where, values } = parseSchema(updateOptionsSchema, options);
286
+ const safeValues = this.#removeInternalFields(values ?? {});
287
+ const collectionData = await this.#getCollectionData();
288
+ const output = [];
289
+ for (const obj of collectionData) {
290
+ if (where.call(void 0, obj)) {
291
+ Object.assign(obj, {
292
+ ...obj,
293
+ ...safeValues,
294
+ _zid: obj._zid
295
+ });
296
+ output.push({ ...obj });
297
+ }
298
+ }
299
+ if (output.length === 0) throw Error("Data not found");
300
+ await this.#setCollectionData(collectionData);
301
+ return output;
302
+ } catch (err) {
303
+ return errorMessage(err);
304
+ }
305
+ }
306
+ async delete(options) {
307
+ try {
308
+ if (arguments.length > 1) throw Error("Invalid params");
309
+ const { where } = parseSchema(deleteOptionsSchema, options);
310
+ const collectionData = await this.#getCollectionData();
311
+ const dataPostDelete = collectionData.filter((obj) => !where(obj));
312
+ if (collectionData.length === dataPostDelete.length) return;
313
+ await this.#setCollectionData(dataPostDelete);
314
+ } catch (err) {
315
+ return errorMessage(err);
316
+ }
317
+ }
318
+ async reset() {
319
+ try {
320
+ await this.#load();
321
+ await this.#setCollectionData([]);
322
+ } catch (err) {
323
+ return errorMessage(err);
324
+ }
325
+ }
326
+ async drop() {
327
+ await this.#storage.delete();
328
+ }
329
+ };
330
+
331
+ // src/klauz-db.ts
332
+ var KlauzDB = class {
333
+ path = "";
334
+ constructor(props) {
335
+ const { path } = parseSchema(klauzPropsSchema, props);
336
+ this.path = path;
337
+ }
338
+ async createCollection(collectionName) {
339
+ const name = parseSchema(collectionNameSchema, collectionName);
340
+ const collection = new Collection({
341
+ name,
342
+ path: this.path
343
+ });
344
+ return collection.init();
345
+ }
346
+ };
347
+ export {
348
+ KlauzDB,
349
+ KlauzError,
350
+ KlauzNotFoundError,
351
+ KlauzStorageError,
352
+ KlauzValidationError
353
+ };
354
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/collection.ts","../src/errors/error-message.ts","../src/errors/klauz-error.ts","../src/schemas/collection-schemas.ts","../src/storage/json-storage.ts","../src/klauz-db.ts"],"sourcesContent":["import { join } from \"node:path\";\r\nimport { errorMessage } from \"./errors/error-message\";\r\nimport { KlauzStorageError } from \"./errors/klauz-error\";\r\nimport {\r\n collectionDataArraySchema,\r\n collectionDataSchema,\r\n deleteOptionsSchema,\r\n findAllOptionsSchema,\r\n findOptionsSchema,\r\n parseSchema,\r\n updateOptionsSchema\r\n} from \"./schemas/collection-schemas\";\r\nimport { JsonStorage } from \"./storage/json-storage\";\r\nimport {\r\n CollectionContent,\n CollectionData,\n CollectionDataWithZID,\n CollectionProps,\n DeleteOptions,\n FindOptions,\n FindOptionsWithoutWhere,\n KzObject,\n LegacyCollectionContent,\n Output,\n UpdateOptions,\n ZID\n} from \"./types\";\r\n\r\nexport class Collection {\r\n readonly #name: string\r\n readonly #path: string\r\n readonly #storage: JsonStorage\r\n #content = {} as CollectionContent\r\n\r\n constructor(private readonly props: CollectionProps) {\r\n const fileExtension = '.json'\r\n const { path, name } = props\r\n this.#name = name\r\n this.#path = join(path, `.${name}${fileExtension}`)\r\n this.#storage = new JsonStorage(this.#path)\r\n }\r\n\r\n async init(): Promise<this> {\r\n await this.#load()\r\n return this\r\n }\r\n\r\n async #load(): Promise<void> {\r\n if (!await this.#storage.exists()) {\r\n const content: CollectionContent = {\r\n collection_name: this.#name,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n data: []\n }\n this.#content = content\r\n await this.#save(this.#content)\r\n return\r\n }\n\n try {\n const content = await this.#storage.read<LegacyCollectionContent>()\n this.#content = this.#normalizeContent(content)\n } catch (err) {\n throw new KlauzStorageError('Invalid collection JSON file', { cause: err })\n }\n }\n\n #normalizeContent(content: LegacyCollectionContent): CollectionContent {\n const updatedAt = content.updated_at ?? content.last_interaction ?? content.created_at\n\n return {\n collection_name: content.collection_name,\n created_at: content.created_at,\n updated_at: updatedAt,\n data: content.data\n }\n }\n\r\n async #save(content: CollectionContent): Promise<void> {\r\n await this.#storage.write(content)\r\n }\r\n\r\n async #setCollectionDataValue(data: CollectionDataWithZID): Promise<void> {\n this.#content.updated_at = new Date().toISOString()\n this.#content.data.push(data)\n await this.#save(this.#content)\n }\n\n async #setCollectionData(data: CollectionDataWithZID[]): Promise<void> {\n this.#content.updated_at = new Date().toISOString()\n this.#content.data = data\n await this.#save(this.#content)\n }\r\n\r\n async #getCollectionData(): Promise<CollectionDataWithZID[]> {\r\n await this.#load()\r\n return this.#content.data\r\n }\r\n\r\n #getLastNumericId(data = this.#content.data): ZID {\r\n const lastObject = data.findLast((obj: CollectionDataWithZID) => typeof obj._zid === 'number')\r\n return lastObject?._zid ?? 0\r\n }\r\n\r\n #removeInternalFields(data: CollectionData): CollectionData {\r\n const safeData = { ...data }\r\n Reflect.deleteProperty(safeData, '_zid')\r\n return safeData\r\n }\r\n\r\n #cloneData(data: CollectionDataWithZID[]): CollectionDataWithZID[] {\r\n return data.map((obj) => ({ ...obj }))\r\n }\r\n\r\n #hideInfo(data: CollectionDataWithZID[], hideInfo?: string[]): CollectionDataWithZID[] {\r\n const output = this.#cloneData(data)\r\n\r\n if (!hideInfo || hideInfo.length === 0) return output\r\n\r\n for (const obj of output) {\r\n for (const info of hideInfo) {\r\n Reflect.deleteProperty(obj, info)\r\n }\r\n }\r\n\r\n return output\r\n }\r\n\r\n get information(): Promise<Omit<CollectionContent, 'data'>> {\r\n return this.#getInformation()\r\n }\r\n\r\n async #getInformation(): Promise<Omit<CollectionContent, 'data'>> {\r\n await this.#load()\r\n return {\r\n collection_name: this.#content.collection_name,\n created_at: this.#content.created_at,\n updated_at: this.#content.updated_at,\n }\n }\n\r\n async add(data: CollectionData): Promise<Output<CollectionDataWithZID>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n await this.#load()\r\n const obj = this.#removeInternalFields(parseSchema(collectionDataSchema, data)) as CollectionDataWithZID\r\n const lastId = this.#getLastNumericId()\r\n Reflect.set(obj, '_zid', lastId + 1)\r\n await this.#setCollectionDataValue(obj)\r\n return { ...obj }\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async addMany(data: CollectionData[]): Promise<Output<CollectionDataWithZID[]>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n await this.#load()\r\n const objs = parseSchema(collectionDataArraySchema, data).map((obj) => this.#removeInternalFields(obj)) as CollectionDataWithZID[]\r\n let lastId = this.#getLastNumericId()\r\n\r\n for (const obj of objs) {\r\n Reflect.set(obj, '_zid', ++lastId)\r\n }\r\n\r\n await this.#setCollectionData([\r\n ...this.#content.data,\r\n ...objs\r\n ])\r\n\r\n return this.#cloneData(objs)\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async findAll(options?: FindOptionsWithoutWhere): Promise<Output<CollectionDataWithZID[]>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n const collectionData = await this.#getCollectionData()\r\n const zOpts = parseSchema(findAllOptionsSchema, options) as FindOptionsWithoutWhere\r\n return this.#hideInfo(collectionData, zOpts?.hideInfo)\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async find<T>(options: FindOptions<KzObject<T>>): Promise<Output<CollectionDataWithZID[]>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n const { where, ...opts } = parseSchema(findOptionsSchema, options) as FindOptions<T>\r\n const collectionData = await this.#getCollectionData() as any\r\n const output = collectionData.filter((obj: KzObject<T>) => where.call(undefined, obj)) as CollectionDataWithZID[]\r\n return this.#hideInfo(output, opts.hideInfo)\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async update<T>(options: UpdateOptions<KzObject<T>>): Promise<Output<CollectionDataWithZID[]>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n const { where, values } = parseSchema(updateOptionsSchema, options) as UpdateOptions<T>\r\n const safeValues = this.#removeInternalFields(values ?? {})\r\n const collectionData = await this.#getCollectionData() as any\r\n const output = [] as CollectionDataWithZID[]\r\n for (const obj of collectionData) {\r\n if (where.call(undefined, obj)) {\r\n Object.assign(obj, {\r\n ...obj,\r\n ...safeValues,\r\n _zid: obj._zid\r\n })\r\n output.push({ ...obj })\r\n }\r\n }\r\n if (output.length === 0) throw Error('Data not found')\r\n await this.#setCollectionData(collectionData)\r\n return output\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async delete<T>(options: DeleteOptions<KzObject<T>>): Promise<Output<void>> {\r\n try {\r\n if (arguments.length > 1) throw Error('Invalid params')\r\n const { where } = parseSchema(deleteOptionsSchema, options) as DeleteOptions<T>\r\n const collectionData = await this.#getCollectionData() as any\r\n const dataPostDelete = collectionData.filter((obj: KzObject<T>) => !where(obj)) as CollectionDataWithZID[]\r\n if (collectionData.length === dataPostDelete.length) return\r\n await this.#setCollectionData(dataPostDelete)\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async reset(): Promise<Output<void>> {\r\n try {\r\n await this.#load()\r\n await this.#setCollectionData([])\r\n } catch (err) {\r\n return errorMessage(err)\r\n }\r\n }\r\n\r\n async drop(): Promise<void> {\r\n await this.#storage.delete()\r\n }\r\n}\r\n","import { ZodError } from \"zod\"\nimport { KlauzError, KlauzValidationError } from \"./klauz-error\"\n\nexport function errorMessage(err: unknown) {\n if (err instanceof ZodError) {\n const error = err.errors.at(-1)\n return {\n error: error?.message ?? 'Invalid params',\n code: 'KLAUZ_VALIDATION_ERROR'\n }\n }\n\n if (err instanceof KlauzError || err instanceof KlauzValidationError) {\n return {\n error: err.message,\n code: err.code\n }\n }\n\n if (err instanceof Error) {\n return {\n error: err.message,\n code: 'KLAUZ_ERROR'\n }\n }\n\n return {\n error: 'Unknown error',\n code: 'KLAUZ_ERROR'\n }\n}\n","export type KlauzErrorCode =\n | 'KLAUZ_ERROR'\n | 'KLAUZ_VALIDATION_ERROR'\n | 'KLAUZ_STORAGE_ERROR'\n | 'KLAUZ_NOT_FOUND'\n\nexport class KlauzError extends Error {\n constructor(\n message: string,\n public readonly code: KlauzErrorCode = 'KLAUZ_ERROR',\n options?: ErrorOptions\n ) {\n super(message, options)\n this.name = 'KlauzError'\n }\n}\n\nexport class KlauzValidationError extends KlauzError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, 'KLAUZ_VALIDATION_ERROR', options)\n this.name = 'KlauzValidationError'\n }\n}\n\nexport class KlauzStorageError extends KlauzError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, 'KLAUZ_STORAGE_ERROR', options)\n this.name = 'KlauzStorageError'\n }\n}\n\nexport class KlauzNotFoundError extends KlauzError {\n constructor(message: string, options?: ErrorOptions) {\n super(message, 'KLAUZ_NOT_FOUND', options)\n this.name = 'KlauzNotFoundError'\n }\n}\n","import z from 'zod'\nimport { KlauzValidationError } from '../errors/klauz-error'\n\nconst collectionNamePattern = /^[a-zA-Z0-9_-]+$/\n\nexport function parseSchema<TSchema extends z.ZodTypeAny>(schema: TSchema, data: unknown): z.infer<TSchema> {\n const result = schema.safeParse(data)\n\n if (!result.success) {\n const error = result.error.errors.at(-1)\n throw new KlauzValidationError(error?.message ?? 'Invalid params', {\n cause: result.error\n })\n }\n\n return result.data\n}\n\nexport const klauzPropsSchema = z.object({\n path: z.string().trim().min(1)\n}).strict()\n\nexport const collectionNameSchema = z\n .string()\n .trim()\n .min(1)\n .regex(collectionNamePattern, 'Collection name must contain only letters, numbers, hyphens and underscores')\n\nexport const collectionDataSchema = z.record(\n z.string(),\n z.unknown(),\n { message: `Content must be a object. Use 'addMany' method, to insert a new array` }\n)\n\nexport const collectionDataArraySchema = z.array(collectionDataSchema)\n\nexport const findAllOptionsSchema = z.object({\n hideInfo: z.array(z.string().min(1)).optional()\n}).strict().optional()\n\nexport const findOptionsSchema = z.object({\n where: z.function(),\n hideInfo: z.array(z.string().min(1)).optional()\n}).strict()\n\nexport const updateOptionsSchema = z.object({\n where: z.function(),\n values: collectionDataSchema\n}).strict()\n\nexport const deleteOptionsSchema = z.object({\n where: z.function()\n}).strict()\n","import { access, mkdir, readFile, unlink, writeFile } from 'node:fs/promises'\nimport { dirname } from 'node:path'\n\nexport class JsonStorage {\n constructor(private readonly filePath: string) {}\n\n async exists(): Promise<boolean> {\n try {\n await access(this.filePath)\n return true\n } catch {\n return false\n }\n }\n\n async read<T>(): Promise<T> {\n const content = await readFile(this.filePath, {\n encoding: 'utf-8'\n })\n\n return JSON.parse(content) as T\n }\n\n async write<T>(data: T): Promise<void> {\n await mkdir(dirname(this.filePath), {\n recursive: true\n })\n\n await writeFile(this.filePath, JSON.stringify(data, null, 2))\n }\n\n async delete(): Promise<void> {\n await unlink(this.filePath)\n }\n}\n","import { Collection } from \"./collection\";\nimport { collectionNameSchema, klauzPropsSchema, parseSchema } from \"./schemas/collection-schemas\";\nimport { KlauzProps } from \"./types\";\n\nexport class KlauzDB {\n public path: string = ''\n \n constructor(props: KlauzProps) {\n const { path } = parseSchema(klauzPropsSchema, props)\n this.path = path\n }\n\n async createCollection(collectionName: string): Promise<Collection> {\n const name = parseSchema(collectionNameSchema, collectionName)\n const collection = new Collection({\n name,\n path: this.path\n })\n return collection.init()\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,15 +1,25 @@
1
1
  {
2
2
  "name": "klauz-db",
3
- "version": "0.5.2",
4
- "description": "Um banco de dados simples, para aplicações com um grau menor de complexidade",
5
- "main": "lib/index.js",
6
- "types": "lib/index.d.ts",
3
+ "version": "1.0.5",
4
+ "description": "Um banco de dados simples, para aplicacoes com um grau menor de complexidade",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
7
15
  "scripts": {
8
- "dev": "tsx watch --env-file .env src/client",
9
- "build": "tsc",
10
- "test-errors": "tsx --env-file .env tests/test-errors.ts",
11
- "test": "jest && npm run test-errors",
12
- "prepublish": "npm run test && npm run build"
16
+ "dev": "tsx watch --env-file .env src/index.ts",
17
+ "build": "tsup",
18
+ "typecheck": "tsc --noEmit",
19
+ "lint": "eslint src",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build"
13
23
  },
14
24
  "repository": {
15
25
  "type": "git",
@@ -21,27 +31,18 @@
21
31
  "url": "https://github.com/vnikolaus/KlauzDB/issues"
22
32
  },
23
33
  "homepage": "https://github.com/vnikolaus/KlauzDB#readme",
24
- "jest": {
25
- "preset": "ts-jest",
26
- "testEnvironment": "node",
27
- "setupFiles": [
28
- "dotenv/config"
29
- ],
30
- "coveragePathIgnorePatterns": [
31
- "/node_modules/",
32
- "lib"
33
- ]
34
- },
35
34
  "files": [
36
- "lib/**/*"
35
+ "dist/**/*"
37
36
  ],
38
37
  "devDependencies": {
39
- "@types/jest": "29.5.12",
40
- "@types/node": "20.14.11",
41
- "jest": "29.7.0",
42
- "ts-jest": "29.2.3",
38
+ "@types/node": "^20.14.11",
39
+ "@typescript-eslint/eslint-plugin": "^8.59.4",
40
+ "@typescript-eslint/parser": "^8.59.4",
41
+ "eslint": "^10.4.0",
42
+ "tsup": "^8.5.1",
43
43
  "tsx": "4.16.2",
44
- "typescript": "5.5.3"
44
+ "typescript": "5.5.3",
45
+ "vitest": "^4.1.7"
45
46
  },
46
47
  "dependencies": {
47
48
  "dotenv": "^16.4.5",
@@ -1,15 +0,0 @@
1
- import { CollectionContent, CollectionData, CollectionDataWithZID, CollectionProps, DeleteOptions, FindOptions, FindOptionsWithoutWhere, KzObject, Output, UpdateOptions } from "./Types";
2
- export declare class Collection {
3
- #private;
4
- private readonly props;
5
- constructor(props: CollectionProps);
6
- get information(): Omit<CollectionContent, 'data'>;
7
- add(data: CollectionData): Output<CollectionDataWithZID>;
8
- addMany(data: CollectionData[]): Output<CollectionDataWithZID[]>;
9
- findAll(options?: FindOptionsWithoutWhere): Output<CollectionDataWithZID[]>;
10
- find<T>(options: FindOptions<KzObject<T>>): Output<CollectionDataWithZID[]>;
11
- update<T>(options: UpdateOptions<KzObject<T>>): Output<CollectionDataWithZID[]>;
12
- delete<T>(options: DeleteOptions<KzObject<T>>): Output<void>;
13
- reset(): Output<void>;
14
- drop(): void;
15
- }