lmcs-db 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.
package/README.md ADDED
@@ -0,0 +1,106 @@
1
+ # lmcs-db
2
+
3
+ **Lightweight Modular Collection Storage (LMCS)** — um micro SGBD baseado em arquivos locais, com suporte a coleções tipadas, filtros avançados e criptografia opcional.
4
+
5
+ ![npm](https://img.shields.io/npm/v/lmcs-db)
6
+ ![license](https://img.shields.io/npm/l/lmcs-db)
7
+
8
+ ---
9
+
10
+ ## ✨ Recursos
11
+
12
+ - 📦 Armazenamento em JSON ou binário
13
+ - 🔐 Suporte a criptografia AES opcional
14
+ - 🔍 Consultas com filtros e ordenação
15
+ - 💾 Persistência simples baseada em arquivos
16
+ - 🧩 Coleções tipadas com suporte a `_id`
17
+ - 🔄 Operações CRUD com sintaxe assíncrona
18
+
19
+ ---
20
+
21
+ ## 📦 Instalação
22
+
23
+ ```bash
24
+ npm install lmcs-db
25
+ # ou
26
+ yarn add lmcs-db
27
+ 🚀 Exemplo de uso
28
+ ts
29
+ Copiar
30
+ Editar
31
+ import DatabaseFactory from 'lmcs-db';
32
+
33
+ interface User {
34
+ _id: string;
35
+ name: string;
36
+ email: string;
37
+ age: number;
38
+ active: boolean;
39
+ }
40
+
41
+ async function main() {
42
+ const db = await DatabaseFactory.create({
43
+ storageType: 'json',
44
+ databaseName: 'secure-db',
45
+ encryptionKey: 'my-secret-key-123'
46
+ });
47
+
48
+ const users = db.collection<User>('users');
49
+
50
+ await users.insert({
51
+ name: 'Alice',
52
+ email: 'alice@example.com',
53
+ age: 30,
54
+ active: true
55
+ });
56
+
57
+ const activeUsers = await users.findAll({
58
+ filter: { active: true }
59
+ });
60
+
61
+ console.log(activeUsers);
62
+ }
63
+
64
+ main();
65
+ ```
66
+
67
+
68
+ ## 📘 API
69
+ DatabaseFactory.create(options)
70
+ Cria uma instância do banco de dados.
71
+
72
+ Parâmetros:
73
+ Nome Tipo Descrição
74
+ storageType "json" ou "binary" Define o formato de armazenamento
75
+ databaseName string Nome do arquivo base do banco
76
+ encryptionKey string (opcional) Chave usada para criptografia AES
77
+
78
+ db.collection<T>(name)
79
+ Obtém uma coleção tipada com suporte a:
80
+
81
+ ### insert
82
+
83
+ ### findAll
84
+
85
+ ### update
86
+
87
+ ### delete
88
+
89
+ entre outros métodos utilitários
90
+
91
+ 📂 Estrutura esperada
92
+ Os dados são armazenados em um único arquivo .json ou .bin, conforme o tipo de armazenamento escolhido.
93
+ A persistência é automática após alterações, garantindo integridade dos dados em disco.
94
+
95
+ 🔒 Criptografia
96
+ O sistema utiliza o algoritmo AES-256-CBC com vetor de inicialização (IV) dinâmico.
97
+ Se um banco for carregado com uma chave incorreta, ele será reiniciado como vazio, com um aviso exibido no console.
98
+
99
+ ✅ Testes
100
+ Para executar os testes de demonstração:
101
+
102
+ 📄 Licença
103
+ MIT
104
+
105
+ ✍️ Autor
106
+ Desenvolvido por Leandro da Silva.
@@ -0,0 +1,6 @@
1
+ import { DatabaseConfig } from "./interfaces";
2
+ import LmcsDB from "./LmcsDB";
3
+ declare class DatabaseFactory {
4
+ static create(config: DatabaseConfig): Promise<LmcsDB>;
5
+ }
6
+ export default DatabaseFactory;
@@ -0,0 +1,15 @@
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
+ const LmcsDB_1 = __importDefault(require("./LmcsDB"));
7
+ class DatabaseFactory {
8
+ static async create(config) {
9
+ const db = new LmcsDB_1.default(config);
10
+ await db.initialize();
11
+ return db;
12
+ }
13
+ }
14
+ exports.default = DatabaseFactory;
15
+ //# sourceMappingURL=DatabaseFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatabaseFactory.js","sourceRoot":"","sources":["../src/DatabaseFactory.ts"],"names":[],"mappings":";;;;;AACA,sDAA8B;AAE9B,MAAM,eAAe;IACnB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAsB;QACxC,MAAM,EAAE,GAAG,IAAI,gBAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,EAAE,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,kBAAe,eAAe,CAAC"}
@@ -0,0 +1,9 @@
1
+ declare class EncryptionService {
2
+ private algorithm;
3
+ private key;
4
+ private iv;
5
+ constructor(encryptionKey: string);
6
+ encrypt(data: string): string;
7
+ decrypt(encryptedData: string): string;
8
+ }
9
+ export default EncryptionService;
@@ -0,0 +1,28 @@
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
+ const crypto_1 = __importDefault(require("crypto"));
7
+ class EncryptionService {
8
+ constructor(encryptionKey) {
9
+ this.algorithm = 'aes-256-cbc';
10
+ // Derive a 32-byte key using SHA-256
11
+ this.key = crypto_1.default.createHash('sha256').update(encryptionKey).digest();
12
+ // Generate a random 16-byte IV
13
+ this.iv = crypto_1.default.randomBytes(16);
14
+ }
15
+ encrypt(data) {
16
+ const cipher = crypto_1.default.createCipheriv(this.algorithm, this.key, this.iv);
17
+ const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);
18
+ return `${this.iv.toString('hex')}:${encrypted.toString('hex')}`;
19
+ }
20
+ decrypt(encryptedData) {
21
+ const [iv, data] = encryptedData.split(':');
22
+ const decipher = crypto_1.default.createDecipheriv(this.algorithm, this.key, Buffer.from(iv, 'hex'));
23
+ const decrypted = Buffer.concat([decipher.update(Buffer.from(data, 'hex')), decipher.final()]);
24
+ return decrypted.toString();
25
+ }
26
+ }
27
+ exports.default = EncryptionService;
28
+ //# sourceMappingURL=EncryptionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncryptionService.js","sourceRoot":"","sources":["../src/EncryptionService.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAE5B,MAAM,iBAAiB;IAKrB,YAAY,aAAqB;QAJzB,cAAS,GAAG,aAAa,CAAC;QAKhC,qCAAqC;QACrC,IAAI,CAAC,GAAG,GAAG,gBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,CAAC;QACtE,+BAA+B;QAC/B,IAAI,CAAC,EAAE,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,MAAM,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,OAAO,CAAC,aAAqB;QAC3B,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,gBAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/F,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC9B,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { DatabaseConfig, DatabaseDocument, FindOptions } from './interfaces';
2
+ declare class LmcsDB {
3
+ private storage;
4
+ private schema;
5
+ private encryptionService?;
6
+ private config;
7
+ constructor(config: DatabaseConfig);
8
+ initialize(): Promise<void>;
9
+ save(): Promise<void>;
10
+ collection<T extends DatabaseDocument>(name: string): {
11
+ insert: (document: Omit<T, "_id">) => Promise<T>;
12
+ find: (id: string) => Promise<T | null>;
13
+ findAll: (options?: FindOptions<T>) => Promise<T[]>;
14
+ update: (id: string, update: Partial<T>) => Promise<T | null>;
15
+ delete: (id: string) => Promise<boolean>;
16
+ };
17
+ }
18
+ export default LmcsDB;
package/dist/LmcsDB.js ADDED
@@ -0,0 +1,161 @@
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
+ const uuid_1 = require("uuid");
7
+ const EncryptionService_1 = __importDefault(require("./EncryptionService"));
8
+ const InMemoryStorage_1 = __importDefault(require("./storage/InMemoryStorage"));
9
+ const JsonStorage_1 = __importDefault(require("./storage/JsonStorage"));
10
+ const BinaryStorage_1 = __importDefault(require("./storage/BinaryStorage"));
11
+ class LmcsDB {
12
+ constructor(config) {
13
+ this.schema = { collections: {} };
14
+ this.config = config;
15
+ // Configurar armazenamento
16
+ switch (config.storageType) {
17
+ case 'memory':
18
+ this.storage = new InMemoryStorage_1.default();
19
+ break;
20
+ case 'json':
21
+ this.storage = new JsonStorage_1.default(config.databaseName || 'default');
22
+ break;
23
+ case 'binary':
24
+ this.storage = new BinaryStorage_1.default(config.databaseName || 'default');
25
+ break;
26
+ default:
27
+ throw new Error('Invalid storage type');
28
+ }
29
+ // Configurar criptografia se a chave for fornecida
30
+ if (config.encryptionKey) {
31
+ this.encryptionService = new EncryptionService_1.default(config.encryptionKey);
32
+ }
33
+ }
34
+ async initialize() {
35
+ let rawData = await this.storage.load();
36
+ // Decriptografar dados se necessário
37
+ if (this.encryptionService && rawData && rawData.trim() !== '') {
38
+ try {
39
+ rawData = this.encryptionService.decrypt(rawData);
40
+ }
41
+ catch (error) {
42
+ console.error('Decryption failed. Starting with empty database.', error);
43
+ rawData = '{}';
44
+ }
45
+ }
46
+ // Parse dos dados
47
+ try {
48
+ this.schema = JSON.parse(rawData || '{}');
49
+ }
50
+ catch (error) {
51
+ console.error('Failed to parse database. Starting with empty database.', error);
52
+ this.schema = { collections: {} };
53
+ }
54
+ }
55
+ async save() {
56
+ let rawData = JSON.stringify(this.schema);
57
+ // Criptografar dados se necessário
58
+ if (this.encryptionService) {
59
+ rawData = this.encryptionService.encrypt(rawData);
60
+ }
61
+ // Salvar dados
62
+ await this.storage.save(rawData);
63
+ }
64
+ collection(name) {
65
+ return {
66
+ insert: async (document) => {
67
+ if (!this.schema.collections) {
68
+ this.schema.collections = {};
69
+ }
70
+ if (!this.schema.collections[name]) {
71
+ this.schema.collections[name] = { name, documents: {} };
72
+ }
73
+ const id = (0, uuid_1.v4)();
74
+ const newDoc = { _id: id, ...document };
75
+ this.schema.collections[name].documents[id] = newDoc;
76
+ await this.save();
77
+ return newDoc;
78
+ },
79
+ find: async (id) => {
80
+ const collection = this.schema.collections[name];
81
+ if (!collection)
82
+ return null;
83
+ return collection.documents[id] || null;
84
+ },
85
+ findAll: async (options) => {
86
+ const collection = this.schema.collections[name];
87
+ if (!collection)
88
+ return [];
89
+ let documents = Object.values(collection.documents);
90
+ // Aplicar filtro
91
+ if (options?.filter) {
92
+ documents = documents.filter(doc => {
93
+ return Object.entries(options.filter).every(([key, value]) => {
94
+ // Suporte a operadores básicos
95
+ if (typeof value === 'object') {
96
+ const operators = value;
97
+ if (operators.$eq !== undefined && doc[key] !== operators.$eq)
98
+ return false;
99
+ if (operators.$ne !== undefined && doc[key] === operators.$ne)
100
+ return false;
101
+ if (operators.$gt !== undefined && doc[key] <= operators.$gt)
102
+ return false;
103
+ if (operators.$lt !== undefined && doc[key] >= operators.$lt)
104
+ return false;
105
+ if (operators.$in !== undefined && !operators.$in.includes(doc[key]))
106
+ return false;
107
+ return true;
108
+ }
109
+ return doc[key] === value;
110
+ });
111
+ });
112
+ }
113
+ // Aplicar ordenação
114
+ if (options?.sort) {
115
+ const [sortKey, sortDirection] = Object.entries(options.sort)[0];
116
+ documents.sort((a, b) => {
117
+ const aValue = a[sortKey];
118
+ const bValue = b[sortKey];
119
+ if (aValue < bValue)
120
+ return sortDirection === 1 ? -1 : 1;
121
+ if (aValue > bValue)
122
+ return sortDirection === 1 ? 1 : -1;
123
+ return 0;
124
+ });
125
+ }
126
+ // Aplicar limite
127
+ if (options?.limit) {
128
+ documents = documents.slice(0, options.limit);
129
+ }
130
+ return documents;
131
+ },
132
+ update: async (id, update) => {
133
+ const collection = this.schema.collections[name];
134
+ if (!collection || !collection.documents[id])
135
+ return null;
136
+ const updatedDoc = {
137
+ ...collection.documents[id],
138
+ ...update,
139
+ _id: id // Garantir que o ID não seja alterado
140
+ };
141
+ collection.documents[id] = updatedDoc;
142
+ await this.save();
143
+ return updatedDoc;
144
+ },
145
+ delete: async (id) => {
146
+ const collection = this.schema.collections[name];
147
+ if (!collection || !collection.documents[id])
148
+ return false;
149
+ delete collection.documents[id];
150
+ // Se a coleção ficar vazia, remova-a
151
+ if (Object.keys(collection.documents).length === 0) {
152
+ delete this.schema.collections[name];
153
+ }
154
+ await this.save();
155
+ return true;
156
+ }
157
+ };
158
+ }
159
+ }
160
+ exports.default = LmcsDB;
161
+ //# sourceMappingURL=LmcsDB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LmcsDB.js","sourceRoot":"","sources":["../src/LmcsDB.ts"],"names":[],"mappings":"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"}
File without changes
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ type DocumentID = string;
2
+ type CollectionName = string;
3
+ interface IDatabaseStorage {
4
+ save(data: string): Promise<void>;
5
+ load(): Promise<string>;
6
+ }
7
+ interface DatabaseDocument {
8
+ _id: DocumentID;
9
+ [key: string]: any;
10
+ }
11
+ interface Collection {
12
+ name: CollectionName;
13
+ documents: Record<DocumentID, DatabaseDocument>;
14
+ }
15
+ interface DatabaseSchema {
16
+ collections: Record<CollectionName, Collection>;
17
+ }
18
+ interface FindOptions<T> {
19
+ filter?: {
20
+ [key in keyof T]?: T[key] | {
21
+ $eq?: T[key];
22
+ $ne?: T[key];
23
+ $gt?: T[key];
24
+ $lt?: T[key];
25
+ $in?: T[key][];
26
+ };
27
+ };
28
+ limit?: number;
29
+ sort?: {
30
+ [K in keyof T]?: 1 | -1;
31
+ };
32
+ }
33
+ interface DatabaseConfig {
34
+ encryptionKey?: string;
35
+ storageType: 'memory' | 'json' | 'binary';
36
+ databaseName?: string;
37
+ }
38
+ declare enum DatabaseStorageType {
39
+ Memory = "memory",
40
+ Json = "json",
41
+ Binary = "binary"
42
+ }
43
+ export { DocumentID, CollectionName, DatabaseDocument, Collection, DatabaseSchema, FindOptions, DatabaseConfig, IDatabaseStorage, DatabaseStorageType };
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseStorageType = void 0;
4
+ var DatabaseStorageType;
5
+ (function (DatabaseStorageType) {
6
+ DatabaseStorageType["Memory"] = "memory";
7
+ DatabaseStorageType["Json"] = "json";
8
+ DatabaseStorageType["Binary"] = "binary";
9
+ })(DatabaseStorageType || (exports.DatabaseStorageType = DatabaseStorageType = {}));
10
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AA2CA,IAAK,mBAIJ;AAJD,WAAK,mBAAmB;IACtB,wCAAiB,CAAA;IACjB,oCAAa,CAAA;IACb,wCAAiB,CAAA;AACnB,CAAC,EAJI,mBAAmB,mCAAnB,mBAAmB,QAIvB"}
@@ -0,0 +1,8 @@
1
+ import { IDatabaseStorage } from '../interfaces';
2
+ declare class BinaryStorage implements IDatabaseStorage {
3
+ private filePath;
4
+ constructor(databaseName: string);
5
+ save(data: string): Promise<void>;
6
+ load(): Promise<string>;
7
+ }
8
+ export default BinaryStorage;
@@ -0,0 +1,30 @@
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
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ class BinaryStorage {
9
+ constructor(databaseName) {
10
+ this.filePath = path_1.default.resolve(process.cwd(), `${databaseName}.db`);
11
+ }
12
+ async save(data) {
13
+ const buffer = Buffer.from(data, 'utf-8');
14
+ await fs_1.default.promises.writeFile(this.filePath, buffer);
15
+ }
16
+ async load() {
17
+ try {
18
+ const buffer = await fs_1.default.promises.readFile(this.filePath);
19
+ return buffer.toString('utf-8');
20
+ }
21
+ catch (error) {
22
+ if (error.code === 'ENOENT') {
23
+ return '{}';
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ }
29
+ exports.default = BinaryStorage;
30
+ //# sourceMappingURL=BinaryStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryStorage.js","sourceRoot":"","sources":["../../src/storage/BinaryStorage.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,gDAAwB;AAGxB,MAAM,aAAa;IAGjB,YAAY,YAAoB;QAC9B,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzD,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { IDatabaseStorage } from "../interfaces";
2
+ declare class InMemoryStorage implements IDatabaseStorage {
3
+ private data;
4
+ save(data: string): Promise<void>;
5
+ load(): Promise<string>;
6
+ }
7
+ export default InMemoryStorage;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class InMemoryStorage {
4
+ constructor() {
5
+ this.data = '';
6
+ }
7
+ async save(data) {
8
+ this.data = data;
9
+ }
10
+ async load() {
11
+ return this.data;
12
+ }
13
+ }
14
+ exports.default = InMemoryStorage;
15
+ //# sourceMappingURL=InMemoryStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryStorage.js","sourceRoot":"","sources":["../../src/storage/InMemoryStorage.ts"],"names":[],"mappings":";;AAEA,MAAM,eAAe;IAArB;QACU,SAAI,GAAW,EAAE,CAAC;IAS5B,CAAC;IAPC,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF;AAED,kBAAe,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { IDatabaseStorage } from '../interfaces';
2
+ declare class JsonStorage implements IDatabaseStorage {
3
+ private filePath;
4
+ constructor(databaseName: string);
5
+ save(data: string): Promise<void>;
6
+ load(): Promise<string>;
7
+ }
8
+ export default JsonStorage;
@@ -0,0 +1,28 @@
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
+ const path_1 = __importDefault(require("path"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ class JsonStorage {
9
+ constructor(databaseName) {
10
+ this.filePath = path_1.default.resolve(process.cwd(), `${databaseName}.db`);
11
+ }
12
+ async save(data) {
13
+ await fs_1.default.promises.writeFile(this.filePath, data, 'utf-8');
14
+ }
15
+ async load() {
16
+ try {
17
+ return await fs_1.default.promises.readFile(this.filePath, 'utf-8');
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT') {
21
+ return '{}';
22
+ }
23
+ throw error;
24
+ }
25
+ }
26
+ }
27
+ exports.default = JsonStorage;
28
+ //# sourceMappingURL=JsonStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonStorage.js","sourceRoot":"","sources":["../../src/storage/JsonStorage.ts"],"names":[],"mappings":";;;;;AAAA,gDAAwB;AACxB,4CAAoB;AAGpB,MAAM,WAAW;IAGf,YAAY,YAAoB;QAC9B,IAAI,CAAC,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,OAAO,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,kBAAe,WAAW,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "lmcs-db",
3
+ "version": "1.0.0",
4
+ "description": "LmcsDb is a database with multiple storage engines and criptography",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build",
10
+ "test": "ts-node test/demo.ts"
11
+ },
12
+ "keywords": [
13
+ "database",
14
+ "mongodb",
15
+ "storage",
16
+ "in-memory",
17
+ "json",
18
+ "binary",
19
+ "criptography",
20
+ "encryption"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/leandroasilva/lmcs-db.git"
25
+ },
26
+ "author": "Leandro Aparecido da Silva<halk_lenson@hotmail.com>",
27
+ "license": "MIT",
28
+ "files": [
29
+ "dist",
30
+ "README.md"
31
+ ],
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "dependencies": {
36
+ "uuid": "^11.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^18.0.0",
40
+ "ts-node": "^10.0.0",
41
+ "typescript": "^5.0.0"
42
+ }
43
+ }