@reldens/storage 0.32.0 → 0.34.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 +113 -23
- package/bin/generate-prisma-schema.js +88 -0
- package/bin/reldens-storage.js +75 -0
- package/index.js +27 -6
- package/lib/base-data-server.js +5 -0
- package/lib/entities-generator.js +605 -0
- package/lib/entity-properties.js +26 -0
- package/lib/entity-templates/entities-config.template +13 -0
- package/lib/entity-templates/entities-translations.template +11 -0
- package/lib/entity-templates/entity.template +32 -0
- package/lib/entity-templates/mikro-orm-model.template +37 -0
- package/lib/entity-templates/objection-js-model.template +19 -0
- package/lib/entity-templates/prisma-model.template +32 -0
- package/lib/entity-templates/registered-models.template +19 -0
- package/lib/mikro-orm/mikro-orm-data-server.js +42 -5
- package/lib/mikro-orm/mikro-orm-driver.js +1 -1
- package/lib/mysql-tables-provider.js +87 -0
- package/lib/objection-js/objection-js-data-server.js +12 -1
- package/lib/prisma/prisma-data-server.js +114 -0
- package/lib/prisma/prisma-driver.js +523 -0
- package/lib/prisma/prisma-schema-generator.js +71 -0
- package/lib/type-mapper.js +86 -0
- package/package.json +14 -7
package/README.md
CHANGED
|
@@ -3,55 +3,145 @@
|
|
|
3
3
|
# Reldens - Storage
|
|
4
4
|
|
|
5
5
|
## About this package
|
|
6
|
-
This package
|
|
6
|
+
This package provides standardized database drivers for Reldens projects.
|
|
7
|
+
It ensures consistent data access methods across different database types and ORM implementations.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
## Features
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
### ORM Support
|
|
12
|
+
- **Objection JS** (via Knex) - For SQL databases (recommended)
|
|
13
|
+
- **Mikro-ORM** - For MongoDB/NoSQL support
|
|
14
|
+
- **Prisma** - Modern database toolkit
|
|
11
15
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
-
|
|
16
|
+
### Entity Management
|
|
17
|
+
- Standardized CRUD operations
|
|
18
|
+
- Automatic entity generation from database schemas
|
|
19
|
+
- Type mapping between database and JavaScript
|
|
20
|
+
- Foreign key relationship handling
|
|
21
|
+
- ENUM field support with formatted values
|
|
22
|
+
|
|
23
|
+
### CLI Tools
|
|
24
|
+
Generate entity files directly from your database structure:
|
|
25
|
+
```bash
|
|
26
|
+
npx reldens-storage generateEntities --user=dbuser --pass=dbpass --database=dbname --driver=objection-js
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Options:
|
|
30
|
+
- `--user` - Database username
|
|
31
|
+
- `--pass` - Database password
|
|
32
|
+
- `--host` - Database host (default: localhost)
|
|
33
|
+
- `--port` - Database port (default: 3306)
|
|
34
|
+
- `--database` - Database name
|
|
35
|
+
- `--driver` - ORM driver (objection-js|mikro-orm)
|
|
36
|
+
- `--client` - Database client (mysql|mysql2|mongodb)
|
|
37
|
+
- `--path` - Project path for output files
|
|
38
|
+
|
|
39
|
+
Generate Prisma schema for Prisma database:
|
|
40
|
+
```bash
|
|
41
|
+
npx reldens-storage-prisma --user=dbuser --pass=dbpass --database=dbname
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Options:
|
|
45
|
+
- `--user` - Database username
|
|
46
|
+
- `--pass` - Database password
|
|
47
|
+
- `--host` - Database host (default: localhost)
|
|
48
|
+
- `--port` - Database port (default: 3306)
|
|
49
|
+
- `--database` - Database name
|
|
50
|
+
- `--client` - Database client (mysql|mysql2|postgresql|mongodb)
|
|
51
|
+
- `--path` - Project path for output files
|
|
52
|
+
|
|
53
|
+
## Usage Examples
|
|
54
|
+
|
|
55
|
+
### SQL with Objection JS
|
|
15
56
|
```javascript
|
|
16
|
-
|
|
17
|
-
|
|
57
|
+
const { ObjectionJsDataServer } = require('@reldens/storage');
|
|
58
|
+
|
|
59
|
+
const server = new ObjectionJsDataServer({
|
|
60
|
+
client: 'mysql2',
|
|
18
61
|
config: {
|
|
19
62
|
user: 'reldens',
|
|
20
63
|
password: 'reldens',
|
|
21
64
|
database: 'reldens',
|
|
22
|
-
|
|
65
|
+
host: 'localhost',
|
|
66
|
+
port: 3306
|
|
23
67
|
}
|
|
24
68
|
});
|
|
69
|
+
|
|
70
|
+
await server.connect();
|
|
71
|
+
const entities = server.generateEntities();
|
|
25
72
|
```
|
|
26
|
-
|
|
73
|
+
|
|
74
|
+
### MongoDB with Mikro-ORM
|
|
27
75
|
```javascript
|
|
28
|
-
|
|
76
|
+
const { MikroOrmDataServer } = require('@reldens/storage');
|
|
77
|
+
|
|
78
|
+
const server = new MikroOrmDataServer({
|
|
29
79
|
client: 'mongodb',
|
|
30
80
|
config: {
|
|
31
81
|
user: 'reldens',
|
|
32
82
|
password: 'reldens',
|
|
33
|
-
database: '
|
|
34
|
-
|
|
83
|
+
database: 'reldens',
|
|
84
|
+
host: 'localhost',
|
|
85
|
+
port: 27017
|
|
35
86
|
},
|
|
36
|
-
connectStringOptions: 'authSource=reldens&readPreference=primary&
|
|
37
|
-
|
|
38
|
-
rawEntities: Object.values(rawRegisteredEntities)
|
|
87
|
+
connectStringOptions: 'authSource=reldens&readPreference=primary&ssl=false',
|
|
88
|
+
rawEntities: yourEntities
|
|
39
89
|
});
|
|
90
|
+
|
|
91
|
+
await server.connect();
|
|
92
|
+
const entities = server.generateEntities();
|
|
40
93
|
```
|
|
41
94
|
|
|
42
|
-
|
|
43
|
-
Through this package you can also create your own drivers (to support your own storage system) and later implement it on any Reldens project.
|
|
95
|
+
### Using Prisma
|
|
44
96
|
|
|
45
|
-
|
|
97
|
+
First, generate your Prisma schema:
|
|
98
|
+
```bash
|
|
99
|
+
npx reldens-storage-prisma --user=dbuser --pass=dbpass --database=dbname
|
|
100
|
+
```
|
|
46
101
|
|
|
47
|
-
|
|
102
|
+
Then, use the PrismaDataServer in your code:
|
|
103
|
+
```javascript
|
|
104
|
+
const { PrismaDataServer } = require('@reldens/storage');
|
|
105
|
+
|
|
106
|
+
const server = new PrismaDataServer({
|
|
107
|
+
client: 'mysql2',
|
|
108
|
+
config: {
|
|
109
|
+
user: 'reldens',
|
|
110
|
+
password: 'reldens',
|
|
111
|
+
database: 'reldens',
|
|
112
|
+
host: 'localhost',
|
|
113
|
+
port: 3306
|
|
114
|
+
},
|
|
115
|
+
rawEntities: yourEntities
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
await server.connect();
|
|
119
|
+
const entities = server.generateEntities();
|
|
48
120
|
```
|
|
49
|
-
|
|
121
|
+
|
|
122
|
+
Note: The PrismaDataServer requires the Prisma schema to be generated first. Make sure to run the `reldens-storage-prisma` command before using PrismaDataServer.
|
|
123
|
+
|
|
124
|
+
## Custom Drivers
|
|
125
|
+
|
|
126
|
+
You can create custom storage drivers by extending the base classes:
|
|
127
|
+
|
|
128
|
+
1. Extend `BaseDataServer` and `BaseDriver`
|
|
129
|
+
2. Implement all required methods
|
|
130
|
+
3. Pass your custom server instance to Reldens ServerManager:
|
|
131
|
+
|
|
132
|
+
```javascript
|
|
133
|
+
const { ServerManager } = require('@reldens/server');
|
|
134
|
+
const YourCustomDriver = require('./your-custom-driver');
|
|
135
|
+
|
|
136
|
+
const customDriver = new YourCustomDriver(options);
|
|
137
|
+
const appServer = new ServerManager(serverConfig, eventsManager, customDriver);
|
|
50
138
|
```
|
|
51
139
|
|
|
52
|
-
|
|
140
|
+
## Links
|
|
141
|
+
- [Reldens Website](https://www.reldens.com/)
|
|
142
|
+
- [GitHub Repository](https://github.com/damian-pastorini/reldens/tree/master)
|
|
53
143
|
|
|
54
|
-
|
|
144
|
+
---
|
|
55
145
|
|
|
56
146
|
### [Reldens](https://www.reldens.com/ "Reldens")
|
|
57
147
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* Reldens - Generate Prisma Schema CLI
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { PrismaSchemaGenerator } = require('../lib/prisma/prisma-schema-generator');
|
|
10
|
+
const { Logger } = require('@reldens/utils');
|
|
11
|
+
|
|
12
|
+
let args = process.argv.slice(2);
|
|
13
|
+
|
|
14
|
+
let connectionData = {
|
|
15
|
+
client: 'mysql2',
|
|
16
|
+
config: {
|
|
17
|
+
user: '',
|
|
18
|
+
password: '',
|
|
19
|
+
host: 'localhost',
|
|
20
|
+
database: '',
|
|
21
|
+
port: 3306
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
let projectPath = process.cwd();
|
|
26
|
+
for(let i = 0; i < args.length; i++){
|
|
27
|
+
let arg = args[i];
|
|
28
|
+
if(!arg.startsWith('--')){
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
let [key, value] = arg.substring(2).split('=');
|
|
32
|
+
if(!key || !value){
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if('pass' === key){
|
|
36
|
+
connectionData.config.password = value;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if('path' === key){
|
|
40
|
+
projectPath = value;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if('user' === key){
|
|
44
|
+
connectionData.config.user = value;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if('database' === key){
|
|
48
|
+
connectionData.config.database = value;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if('host' === key){
|
|
52
|
+
connectionData.config.host = value;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if('port' === key){
|
|
56
|
+
connectionData.config.port = value;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if('client' === key){
|
|
60
|
+
connectionData.client = value;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if(!connectionData.config.user || !connectionData.config.database){
|
|
65
|
+
Logger.error('Required parameters missing.');
|
|
66
|
+
Logger.error(
|
|
67
|
+
'Usage:',
|
|
68
|
+
'npx reldens-storage generatePrismaSchema --user=[db-username] --pass=[db-password] --host=[db-host] --database=[db-name] --client=[db-client] --path=[project-path]'
|
|
69
|
+
);
|
|
70
|
+
process.exit();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let generator = new PrismaSchemaGenerator({
|
|
74
|
+
...connectionData,
|
|
75
|
+
prismaSchemaPath: projectPath+'/prisma'
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
generator.generate().then((success) => {
|
|
79
|
+
if(!success){
|
|
80
|
+
Logger.error('Prisma schema generation failed.');
|
|
81
|
+
process.exit();
|
|
82
|
+
}
|
|
83
|
+
Logger.info('Prisma schema generation completed successfully!');
|
|
84
|
+
process.exit();
|
|
85
|
+
}).catch((error) => {
|
|
86
|
+
Logger.error('Error during Prisma schema generation: '+error.message);
|
|
87
|
+
process.exit();
|
|
88
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* Reldens - Storage CLI
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { EntitiesGenerator } = require('../lib/entities-generator');
|
|
10
|
+
const { Logger } = require('@reldens/utils');
|
|
11
|
+
|
|
12
|
+
let args = process.argv.slice(2);
|
|
13
|
+
let command = args[0];
|
|
14
|
+
|
|
15
|
+
if('generateEntities' !== command){
|
|
16
|
+
Logger.error('Unknown command. Available command "generateEntities".');
|
|
17
|
+
process.exit();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let connectionData = {
|
|
21
|
+
driver: 'objection-js',
|
|
22
|
+
client: 'mysql2',
|
|
23
|
+
user: '',
|
|
24
|
+
password: '',
|
|
25
|
+
host: 'localhost',
|
|
26
|
+
database: '',
|
|
27
|
+
port: 3306
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
let projectPath = process.cwd();
|
|
31
|
+
for(let i = 1; i < args.length; i++){
|
|
32
|
+
let arg = args[i];
|
|
33
|
+
if(!arg.startsWith('--')){
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
let [key, value] = arg.substring(2).split('=');
|
|
37
|
+
if(!key || !value){
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if('pass' === key){
|
|
41
|
+
connectionData.password = value;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if('path' === key){
|
|
45
|
+
projectPath = value;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
connectionData[key] = value;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if('mikro-orm' === connectionData.driver && !args.find(arg => arg.startsWith('--client='))){
|
|
52
|
+
connectionData.client = 'mysql';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if(!connectionData.user || !connectionData.database){
|
|
56
|
+
Logger.error('Required parameters missing.');
|
|
57
|
+
Logger.error(
|
|
58
|
+
'Usage:',
|
|
59
|
+
'npx reldens-storage generateEntities --user=[db-username] --pass=[db-password] --host=[db-host] --database=[db-name] --driver=[driver-map-key] --client=[db-client] --path=[project-path]'
|
|
60
|
+
);
|
|
61
|
+
process.exit();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let generator = new EntitiesGenerator({connectionData, projectPath});
|
|
65
|
+
generator.generate().then((success) => {
|
|
66
|
+
if(!success){
|
|
67
|
+
Logger.error('Entity generation failed.');
|
|
68
|
+
process.exit();
|
|
69
|
+
}
|
|
70
|
+
Logger.info('Entity generation completed successfully!');
|
|
71
|
+
process.exit();
|
|
72
|
+
}).catch((error) => {
|
|
73
|
+
Logger.error('Error during entity generation: '+error.message);
|
|
74
|
+
process.exit();
|
|
75
|
+
});
|
package/index.js
CHANGED
|
@@ -12,17 +12,38 @@ const { Model } = require('objection');
|
|
|
12
12
|
const { MikroOrmDriver } = require('./lib/mikro-orm/mikro-orm-driver');
|
|
13
13
|
const { MikroOrmDataServer } = require('./lib/mikro-orm/mikro-orm-data-server');
|
|
14
14
|
const MikroOrmCore = require('@mikro-orm/core');
|
|
15
|
+
const { EntitiesGenerator } = require('./lib/entities-generator');
|
|
16
|
+
const { EntityProperties } = require('./lib/entity-properties');
|
|
17
|
+
const { TypeMapper } = require('./lib/type-mapper');
|
|
18
|
+
const { MySQLTablesProvider } = require('./lib/mysql-tables-provider');
|
|
19
|
+
const { PrismaDriver } = require('./lib/prisma/prisma-driver');
|
|
20
|
+
const { PrismaDataServer } = require('./lib/prisma/prisma-data-server');
|
|
21
|
+
const { PrismaSchemaGenerator } = require('./lib/prisma/prisma-schema-generator');
|
|
15
22
|
|
|
16
23
|
module.exports = {
|
|
17
24
|
// base:
|
|
18
|
-
BaseDataServer
|
|
19
|
-
BaseDriver
|
|
25
|
+
BaseDataServer,
|
|
26
|
+
BaseDriver,
|
|
27
|
+
DriversMap: {
|
|
28
|
+
'objection-js': ObjectionJsDataServer,
|
|
29
|
+
'mikro-orm': MikroOrmDataServer,
|
|
30
|
+
'prisma': PrismaDataServer
|
|
31
|
+
},
|
|
20
32
|
// objection-js:
|
|
21
|
-
ObjectionJsDataServer
|
|
22
|
-
ObjectionJsDriver
|
|
33
|
+
ObjectionJsDataServer,
|
|
34
|
+
ObjectionJsDriver,
|
|
23
35
|
ObjectionJsRawModel: Model,
|
|
24
36
|
// mikro-orm:
|
|
25
37
|
MikroOrmCore,
|
|
26
|
-
MikroOrmDataServer
|
|
27
|
-
MikroOrmDriver
|
|
38
|
+
MikroOrmDataServer,
|
|
39
|
+
MikroOrmDriver,
|
|
40
|
+
// prisma:
|
|
41
|
+
PrismaDataServer,
|
|
42
|
+
PrismaDriver,
|
|
43
|
+
PrismaSchemaGenerator,
|
|
44
|
+
// entities:
|
|
45
|
+
EntitiesGenerator,
|
|
46
|
+
EntityProperties,
|
|
47
|
+
TypeMapper,
|
|
48
|
+
MySQLTablesProvider
|
|
28
49
|
};
|
package/lib/base-data-server.js
CHANGED
|
@@ -56,6 +56,11 @@ class BaseDataServer
|
|
|
56
56
|
ErrorManager.error('BaseDriver connect() not implemented.');
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
async fetchEntitiesFromDatabase()
|
|
60
|
+
{
|
|
61
|
+
ErrorManager.error('BaseDriver fetchEntitiesFromDatabase() not implemented.');
|
|
62
|
+
}
|
|
63
|
+
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
module.exports.BaseDataServer = BaseDataServer;
|