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 +106 -0
- package/dist/DatabaseFactory.d.ts +6 -0
- package/dist/DatabaseFactory.js +15 -0
- package/dist/DatabaseFactory.js.map +1 -0
- package/dist/EncryptionService.d.ts +9 -0
- package/dist/EncryptionService.js +28 -0
- package/dist/EncryptionService.js.map +1 -0
- package/dist/LmcsDB.d.ts +18 -0
- package/dist/LmcsDB.js +161 -0
- package/dist/LmcsDB.js.map +1 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +43 -0
- package/dist/interfaces.js +10 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/storage/BinaryStorage.d.ts +8 -0
- package/dist/storage/BinaryStorage.js +30 -0
- package/dist/storage/BinaryStorage.js.map +1 -0
- package/dist/storage/InMemoryStorage.d.ts +7 -0
- package/dist/storage/InMemoryStorage.js +15 -0
- package/dist/storage/InMemoryStorage.js.map +1 -0
- package/dist/storage/JsonStorage.d.ts +8 -0
- package/dist/storage/JsonStorage.js +28 -0
- package/dist/storage/JsonStorage.js.map +1 -0
- package/package.json +43 -0
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
|
+

|
|
6
|
+

|
|
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,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,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"}
|
package/dist/LmcsDB.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
File without changes
|
package/dist/index.js
ADDED
|
@@ -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,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,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
|
+
}
|