@motiontr/motiondb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,405 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JSONDatabase = void 0;
7
+ const node_events_1 = require("node:events");
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_util_1 = require("node:util");
11
+ const path_1 = require("./path");
12
+ const isPlainObject = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
13
+ /**
14
+ * Tek dosyalık, bellekte çalışan JSON veritabanı.
15
+ *
16
+ * Veri tek bir JSON dosyasında "kategoriler" halinde tutulur:
17
+ * `{ "guilds": {...}, "users": {...}, "cooldowns": {...} }`
18
+ *
19
+ * - Tüm değişiklikler bellekte yapılır (çok hızlı), dosyaya atomik yazılır.
20
+ * - Yazma işlemi tmp dosya + `rename` ile yapılır, bu sayede yarım kayıt riski yoktur.
21
+ */
22
+ class JSONDatabase extends node_events_1.EventEmitter {
23
+ constructor(options = {}) {
24
+ super();
25
+ this.store = {};
26
+ this.loaded = false;
27
+ this.dirty = false;
28
+ this.timer = null;
29
+ this.chain = Promise.resolve();
30
+ this.file = node_path_1.default.resolve(options.path ?? './db.json');
31
+ this.spaces = options.spaces ?? 2;
32
+ this.debounceMs = Math.max(0, options.debounce ?? 50);
33
+ this.autosave = options.autosave ?? true;
34
+ this.createIfMissing = options.createIfMissing ?? true;
35
+ this.corruptPolicy = options.onCorrupt ?? 'throw';
36
+ this.backupOnLoad = options.backupOnLoad ?? false;
37
+ this.backupDir = node_path_1.default.resolve(options.backupDir ?? node_path_1.default.join(node_path_1.default.dirname(this.file), 'backups'));
38
+ }
39
+ // ---------------------------------------------------------------- yükleme
40
+ /** Dosyayı okur. İlk çağrıda otomatik olarak yapılır. */
41
+ load(force = false) {
42
+ if (this.loaded && !force)
43
+ return this;
44
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(this.file), { recursive: true });
45
+ if (!node_fs_1.default.existsSync(this.file)) {
46
+ this.store = {};
47
+ this.loaded = true;
48
+ this.dirty = this.createIfMissing;
49
+ if (this.createIfMissing)
50
+ this.scheduleSave();
51
+ this.emit('load', this.file);
52
+ return this;
53
+ }
54
+ const raw = node_fs_1.default.readFileSync(this.file, 'utf8').replace(/^\uFEFF/, '');
55
+ let parsed;
56
+ try {
57
+ parsed = raw.trim().length === 0 ? {} : JSON.parse(raw);
58
+ }
59
+ catch (error) {
60
+ return this.handleCorrupt(error);
61
+ }
62
+ if (!isPlainObject(parsed)) {
63
+ return this.handleCorrupt(new Error('Kök değer bir JSON nesnesi olmalı.'));
64
+ }
65
+ this.store = parsed;
66
+ this.loaded = true;
67
+ this.dirty = false;
68
+ if (this.backupOnLoad)
69
+ this.backup('load');
70
+ this.emit('load', this.file);
71
+ return this;
72
+ }
73
+ /** Bellekteki değişiklikleri atıp dosyayı yeniden okur. */
74
+ reload() {
75
+ this.cancelTimer();
76
+ this.dirty = false;
77
+ return this.load(true);
78
+ }
79
+ handleCorrupt(error) {
80
+ this.loaded = true;
81
+ if (this.corruptPolicy === 'throw') {
82
+ throw new Error(`[motiondb] JSON okunamadı: ${this.file}\n` +
83
+ ` ${error.message}\n` +
84
+ ` Dosyayı düzeltin ya da \`onCorrupt: "reset"\` seçeneğini kullanın.`);
85
+ }
86
+ const backup = this.file.replace(/\.json$/i, '') + `.corrupt-${Date.now()}.json`;
87
+ try {
88
+ node_fs_1.default.copyFileSync(this.file, backup);
89
+ }
90
+ catch {
91
+ /* yedek alınamadıysa devam et */
92
+ }
93
+ this.store = {};
94
+ this.dirty = false;
95
+ this.writeSync();
96
+ this.emit('corrupt', backup);
97
+ this.emit('load', this.file);
98
+ return this;
99
+ }
100
+ // ----------------------------------------------------------------- yazma
101
+ /** Değişiklikleri diske yazar (atomik). Yazma sırası korunur. */
102
+ save() {
103
+ this.cancelTimer();
104
+ this.dirty = false;
105
+ const task = this.chain.then(() => this.write());
106
+ this.chain = task.then(() => undefined, () => undefined);
107
+ return task;
108
+ }
109
+ /** `save()` kısayolu. */
110
+ flush() {
111
+ return this.save();
112
+ }
113
+ /** Değişiklikleri hemen senkron olarak diske yazar (ör. kapanış öncesi). */
114
+ flushSync() {
115
+ this.load();
116
+ this.cancelTimer();
117
+ this.writeSync();
118
+ this.dirty = false;
119
+ return this;
120
+ }
121
+ async write() {
122
+ const json = JSON.stringify(this.store, null, this.spaces);
123
+ await node_fs_1.default.promises.mkdir(node_path_1.default.dirname(this.file), { recursive: true });
124
+ await atomicWrite(this.file, json);
125
+ this.emit('save', this.file);
126
+ }
127
+ writeSync() {
128
+ const json = JSON.stringify(this.store, null, this.spaces);
129
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(this.file), { recursive: true });
130
+ const tmp = `${this.file}.${process.pid}.tmp`;
131
+ try {
132
+ node_fs_1.default.writeFileSync(tmp, json, 'utf8');
133
+ node_fs_1.default.renameSync(tmp, this.file);
134
+ }
135
+ catch {
136
+ try {
137
+ if (node_fs_1.default.existsSync(tmp))
138
+ node_fs_1.default.unlinkSync(tmp);
139
+ }
140
+ catch {
141
+ /* temizlik hatası göz ardı edilir */
142
+ }
143
+ node_fs_1.default.writeFileSync(this.file, json, 'utf8');
144
+ }
145
+ this.emit('save', this.file);
146
+ }
147
+ markDirty(change) {
148
+ this.dirty = true;
149
+ this.emit('change', change);
150
+ this.scheduleSave();
151
+ }
152
+ /** Yazmayı planlar: `debounce` süresi içindeki tüm değişiklikler tek dosyaya yazılır. */
153
+ scheduleSave() {
154
+ if (!this.autosave || !this.dirty)
155
+ return;
156
+ if (this.debounceMs === 0) {
157
+ void this.save().catch((error) => this.handleError(error));
158
+ return;
159
+ }
160
+ this.cancelTimer();
161
+ this.timer = setTimeout(() => {
162
+ this.timer = null;
163
+ void this.save().catch((error) => this.handleError(error));
164
+ }, this.debounceMs);
165
+ // Süreci açık tutmasın
166
+ this.timer.unref?.();
167
+ }
168
+ cancelTimer() {
169
+ if (this.timer) {
170
+ clearTimeout(this.timer);
171
+ this.timer = null;
172
+ }
173
+ }
174
+ handleError(error) {
175
+ if (this.listenerCount('error') > 0)
176
+ this.emit('error', error);
177
+ else
178
+ console.error('[motiondb] Yazma hatası:', error);
179
+ }
180
+ // ------------------------------------------------------------------ CRUD
181
+ /** Bir değeri okur. Bulunamazsa `fallback` döner. */
182
+ get(key, fallback) {
183
+ this.load();
184
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
185
+ const value = (0, path_1.getAt)(this.store, segments);
186
+ return (value === undefined ? fallback : value);
187
+ }
188
+ /** Bir değeri yazar ve diske kaydeder. */
189
+ set(key, value) {
190
+ this.load();
191
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
192
+ (0, path_1.setAt)(this.store, segments, value);
193
+ this.markDirty({ type: 'set', path: segments, value });
194
+ return this;
195
+ }
196
+ /** Yol var mı? (undefined olmayan değer) */
197
+ has(key) {
198
+ this.load();
199
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
200
+ return (0, path_1.hasAt)(this.store, segments);
201
+ }
202
+ /** Bir anahtarı siler. Silindiyse `true` döner. */
203
+ delete(key) {
204
+ this.load();
205
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
206
+ const existed = (0, path_1.deleteAt)(this.store, segments);
207
+ if (existed)
208
+ this.markDirty({ type: 'delete', path: segments });
209
+ return existed;
210
+ }
211
+ /** Değer yoksa varsayılanı yazar ve onu döner (varsayılan nesneler için ideal). */
212
+ ensure(key, defaultValue) {
213
+ this.load();
214
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
215
+ const current = (0, path_1.getAt)(this.store, segments);
216
+ if (current !== undefined && current !== null)
217
+ return current;
218
+ (0, path_1.setAt)(this.store, segments, defaultValue);
219
+ this.markDirty({ type: 'set', path: segments, value: defaultValue });
220
+ return defaultValue;
221
+ }
222
+ /** Dizinin sonuna değer(ler) ekler. Dizi yoksa oluşturur. */
223
+ push(key, ...values) {
224
+ this.load();
225
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
226
+ const current = (0, path_1.getAt)(this.store, segments);
227
+ if (current === undefined) {
228
+ const created = [...values];
229
+ (0, path_1.setAt)(this.store, segments, created);
230
+ this.markDirty({ type: 'set', path: segments, value: created });
231
+ return created;
232
+ }
233
+ if (!Array.isArray(current)) {
234
+ throw new TypeError(`[motiondb] "${segments.join('.')}" bir dizi değil.`);
235
+ }
236
+ current.push(...values);
237
+ this.markDirty({ type: 'set', path: segments, value: current });
238
+ return current;
239
+ }
240
+ /** Diziden eşleşen değeri(leri) çıkarır. Fonksiyon verilirse predicate olarak kullanılır. */
241
+ pull(key, matcher) {
242
+ this.load();
243
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
244
+ const current = (0, path_1.getAt)(this.store, segments);
245
+ if (!Array.isArray(current)) {
246
+ throw new TypeError(`[motiondb] "${segments.join('.')}" bir dizi değil.`);
247
+ }
248
+ const predicate = typeof matcher === 'function'
249
+ ? matcher
250
+ : (value) => (0, node_util_1.isDeepStrictEqual)(value, matcher);
251
+ const next = current.filter((value) => !predicate(value));
252
+ (0, path_1.setAt)(this.store, segments, next);
253
+ this.markDirty({ type: 'set', path: segments, value: next });
254
+ return next;
255
+ }
256
+ /** Sayısal değeri artırır/sıfırlar. Yeni değeri döner. */
257
+ increment(key, amount = 1) {
258
+ this.load();
259
+ const segments = Array.isArray(key) ? key : (0, path_1.parsePath)(key);
260
+ const current = (0, path_1.getAt)(this.store, segments);
261
+ const base = typeof current === 'number' ? current : Number(current ?? 0);
262
+ const next = (Number.isFinite(base) ? base : 0) + amount;
263
+ (0, path_1.setAt)(this.store, segments, next);
264
+ this.markDirty({ type: 'set', path: segments, value: next });
265
+ return next;
266
+ }
267
+ /** Sayaç azaltma kısayolu. */
268
+ decrement(key, amount = 1) {
269
+ return this.increment(key, -amount);
270
+ }
271
+ // ------------------------------------------------------------- kategori
272
+ /** Kök nesnenin tamamını döner (canlı referans). */
273
+ all() {
274
+ this.load();
275
+ return this.store;
276
+ }
277
+ /** Kök nesnenin kopyasını döner. */
278
+ toJSON() {
279
+ this.load();
280
+ return clone(this.store);
281
+ }
282
+ /** Kök anahtarların listesi (kategoriler). */
283
+ keys() {
284
+ this.load();
285
+ return Object.keys(this.store);
286
+ }
287
+ /** Bir kategorinin (ör. `guilds`) tamamını döner. */
288
+ category(name, fallback) {
289
+ return this.get(name, fallback);
290
+ }
291
+ /** Tüm veriyi temizler (dosyayı boşaltır). */
292
+ clear() {
293
+ this.load();
294
+ this.store = {};
295
+ this.markDirty({ type: 'clear', path: [] });
296
+ return this;
297
+ }
298
+ /**
299
+ * Ham düzenleme: verinin tamamına erişip doğrudan değiştirin.
300
+ * `path` verilmezse tüm kök değişim olarak işaretlenir.
301
+ *
302
+ * ```ts
303
+ * db.edit((data) => {
304
+ * data.guilds ??= {};
305
+ * data.guilds[id].prefix = '!';
306
+ * });
307
+ * ```
308
+ */
309
+ edit(mutator, key) {
310
+ this.load();
311
+ const segments = key === undefined ? [] : Array.isArray(key) ? [...key] : (0, path_1.parsePath)(key);
312
+ let target = this.store;
313
+ if (segments.length > 0) {
314
+ const current = (0, path_1.getAt)(this.store, segments);
315
+ target = isPlainObject(current) ? current : {};
316
+ if (current !== target)
317
+ (0, path_1.setAt)(this.store, segments, target);
318
+ }
319
+ mutator(target);
320
+ this.markDirty({ type: 'edit', path: segments, value: target });
321
+ return this;
322
+ }
323
+ // ------------------------------------------------------------- yedekleme
324
+ /**
325
+ * Mevcut dosyanın kopyasını alır ve yedek yolunu döner.
326
+ * @param label Dosya adına eklenecek etiket (ör. `"before-migration"`).
327
+ */
328
+ backup(label = 'backup') {
329
+ this.load();
330
+ node_fs_1.default.mkdirSync(this.backupDir, { recursive: true });
331
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
332
+ const safe = label.replace(/[^\w.-]+/g, '_');
333
+ const target = node_path_1.default.join(this.backupDir, `${safe}-${stamp}.json`);
334
+ node_fs_1.default.writeFileSync(target, JSON.stringify(this.store, null, this.spaces), 'utf8');
335
+ return target;
336
+ }
337
+ /** Var olan tüm yedek dosyalarını (yeniden eskiye) listeler. */
338
+ listBackups() {
339
+ if (!node_fs_1.default.existsSync(this.backupDir))
340
+ return [];
341
+ return node_fs_1.default
342
+ .readdirSync(this.backupDir)
343
+ .filter((name) => name.endsWith('.json'))
344
+ .map((name) => node_path_1.default.join(this.backupDir, name))
345
+ .sort()
346
+ .reverse();
347
+ }
348
+ // ------------------------------------------------------------- yaşam döngüsü
349
+ /**
350
+ * `SIGINT` / `SIGTERM` / `exit` anlarında bekleyen değişiklikleri diske yazar.
351
+ * Botunuzda bir kez çağırın.
352
+ */
353
+ registerShutdownHooks() {
354
+ const handler = () => {
355
+ try {
356
+ this.flushSync();
357
+ }
358
+ catch (error) {
359
+ console.error('[motiondb] Kapanış yazması başarısız:', error);
360
+ }
361
+ };
362
+ process.once('SIGINT', handler);
363
+ process.once('SIGTERM', handler);
364
+ process.once('exit', handler);
365
+ return this;
366
+ }
367
+ on(event, listener) {
368
+ return super.on(event, listener);
369
+ }
370
+ emit(event, ...args) {
371
+ return super.emit(event, ...args);
372
+ }
373
+ }
374
+ exports.JSONDatabase = JSONDatabase;
375
+ // ------------------------------------------------------------------ helpers
376
+ function clone(value) {
377
+ if (typeof structuredClone === 'function')
378
+ return structuredClone(value);
379
+ return JSON.parse(JSON.stringify(value));
380
+ }
381
+ /** tmp dosyaya yazıp `rename` ile değiştirir; böylece kayıt asla yarım kalmaz. */
382
+ async function atomicWrite(file, contents) {
383
+ const tmp = `${file}.${process.pid}.tmp`;
384
+ try {
385
+ await node_fs_1.default.promises.writeFile(tmp, contents, 'utf8');
386
+ await node_fs_1.default.promises.rename(tmp, file);
387
+ }
388
+ catch (error) {
389
+ try {
390
+ if (node_fs_1.default.existsSync(tmp))
391
+ await node_fs_1.default.promises.unlink(tmp);
392
+ }
393
+ catch {
394
+ /* temizlik hatası göz ardı edilir */
395
+ }
396
+ // Windows'ta hedef dosya açıkken rename başarısız olabilir → doğrudan yaz
397
+ const code = error.code;
398
+ if (code === 'EPERM' || code === 'EACCES' || code === 'EEXIST' || code === 'EBUSY') {
399
+ await node_fs_1.default.promises.writeFile(file, contents, 'utf8');
400
+ return;
401
+ }
402
+ throw error;
403
+ }
404
+ }
405
+ //# sourceMappingURL=Database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Database.js","sourceRoot":"","sources":["../src/Database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { JSONDatabase, CorruptPolicy } from './Database';
2
+ /**
3
+ * motiondb'nin asenkron API'si: tablo tabanlı, dot-notation destekli,
4
+ * tek JSON dosyasına atomik yazan veri katmanı.
5
+ *
6
+ * - Anahtarlar nokta ile ayrılır: `set("myUser.balance", 700)`
7
+ * - Olmayan anahtar `null` döner.
8
+ * - `pull(..., once=true)` yalnızca ilk eşleşen elemanı siler.
9
+ * - `pull` nesneleri derin karşılaştırma ile eşleştirir.
10
+ * - `delete` her zaman sayı döner (1 = silindi, 0 = yoktu).
11
+ */
12
+ export interface MotionDBOptions {
13
+ /** JSON dosyası. Varsayılan: `./data.json` */
14
+ filePath?: string;
15
+ /** Tablo adı. Varsayılan: `json` */
16
+ table?: string;
17
+ /** `true` ise nokta literal anahtardır (dot notation kapalı). Varsayılan: `false` */
18
+ normalKeys?: boolean;
19
+ /** Yazmayı ertele ve diske hemen yazma. Varsayılan: `false` */
20
+ deferWrites?: boolean;
21
+ /** JSON girinti sayısı. Varsayılan: `2` */
22
+ spaces?: number;
23
+ /** JSON bozulursa. Varsayılan: `throw` */
24
+ onCorrupt?: CorruptPolicy;
25
+ }
26
+ export interface MotionRow<T> {
27
+ id: string;
28
+ value: T;
29
+ }
30
+ export declare class MotionDB<D = any> {
31
+ private static instance;
32
+ private readonly json;
33
+ private readonly options;
34
+ private readonly tableName;
35
+ private readonly deferWrites;
36
+ private normalKeys;
37
+ constructor(options?: MotionDBOptions);
38
+ /** Dosyanın mutlak yolu */
39
+ get file(): string;
40
+ /** Altta yatan motor (JSONDatabase) — low-level erişim için */
41
+ get engine(): JSONDatabase;
42
+ /** Dosyayı yükler, yoksa oluşturur (sync I/O yerine Promise döner). */
43
+ init(): Promise<void>;
44
+ /**
45
+ * Tablonun dosya içindeki yolu: kök anahtar = tablo adı.
46
+ * `{"json": {"myKey": ...}, "guilds": {...}}`
47
+ */
48
+ private get root();
49
+ /** Dot notation kuralı: `a.b.c` → ['a','b','c'] (`normalKeys` açıkken nokta literaldir) */
50
+ private segments;
51
+ private rowPath;
52
+ /** Tablo nesnesini döndürür, yoksa (veya yanlış tipteyse) `{}` olarak kurar. */
53
+ private rows;
54
+ private persist;
55
+ get<T = D>(key: string): Promise<T | null>;
56
+ set<T = D>(key: string, value: T): Promise<T>;
57
+ has(key: string): Promise<boolean>;
58
+ delete(key: string): Promise<number>;
59
+ /** Tablodaki tüm satırları siler, silinen satır sayısını döner. */
60
+ deleteAll(): Promise<number>;
61
+ /** Yoksa oluşturur, varsa mevcut değeri döner. */
62
+ ensure<T = D>(key: string, defaultValue: T): Promise<T>;
63
+ private addSubtract;
64
+ add(key: string, value: number): Promise<number>;
65
+ sub(key: string, value: number): Promise<number>;
66
+ /** `add` ile aynı (bonus) */
67
+ increment(key: string, value?: number): Promise<number>;
68
+ /** `sub` ile aynı (bonus) */
69
+ decrement(key: string, value?: number): Promise<number>;
70
+ private getArray;
71
+ push<T = D>(key: string, ...values: T[]): Promise<T[]>;
72
+ unshift<T = D>(key: string, value: T | T[]): Promise<T[]>;
73
+ pop<T = D>(key: string): Promise<T | undefined>;
74
+ shift<T = D>(key: string): Promise<T | undefined>;
75
+ pull<T = D>(key: string, value: T | T[] | ((data: T, index: string) => boolean), once?: boolean): Promise<T[]>;
76
+ all<T = D>(): Promise<MotionRow<T>[]>;
77
+ startsWith<T = D>(query: string, key?: string): Promise<MotionRow<T>[]>;
78
+ /** Anahtar sayısını döner (bonus) */
79
+ count(): Promise<number>;
80
+ table<T = D>(table: string): MotionDB<T>;
81
+ useNormalKeys(activate: boolean): void;
82
+ static createSingleton<T = any>(options?: MotionDBOptions): MotionDB<T>;
83
+ /** Bekleyen değişiklikleri diske yazar */
84
+ flush(): Promise<void>;
85
+ /** Bekleyen değişiklikleri senkron olarak diske yazar */
86
+ flushSync(): this;
87
+ /** Motor olaylarını dinle: 'save' | 'load' | 'change' | 'error' */
88
+ on(event: string, listener: (...args: any[]) => void): this;
89
+ }