@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 CHANGED
@@ -3,55 +3,145 @@
3
3
  # Reldens - Storage
4
4
 
5
5
  ## About this package
6
- This package is designed to provide a standard drivers support for managing Reldens project data.
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
- This way in any Reldens project we can trust that any driver implementation will have the exact same methods available to fetch and manage the project entities.
9
+ ## Features
9
10
 
10
- Every time you need to load, create, update or delete data in Reldens, the drivers from this package will be used.
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
- ## Current features
13
- The package currently has drivers to support two ORMs:
14
- - Objection JS (with Knex), for everything that's SQL related (this is our base and recommended package).
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
- let server = new ObjectionJsDataServer({
17
- client: 'mysql',
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
- port : 3306,
65
+ host: 'localhost',
66
+ port: 3306
23
67
  }
24
68
  });
69
+
70
+ await server.connect();
71
+ const entities = server.generateEntities();
25
72
  ```
26
- - Mikro-ORM, to offer support for nonSQL/MongoDB (this package is not finished, if you like to use it please contact us).
73
+
74
+ ### MongoDB with Mikro-ORM
27
75
  ```javascript
28
- let server = new MikroOrmDataServer({
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: 'test',
34
- port : 27017,
83
+ database: 'reldens',
84
+ host: 'localhost',
85
+ port: 27017
35
86
  },
36
- connectStringOptions: 'authSource=reldens&readPreference=primary&appname=MongoDB%20Compass&ssl=false',
37
- autoGenerateEntities: false,
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
- ## Custom drivers
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
- In order to do this, just extend the BaseDataServer and BaseDriver classes and fill all the required methods.
97
+ First, generate your Prisma schema:
98
+ ```bash
99
+ npx reldens-storage-prisma --user=dbuser --pass=dbpass --database=dbname
100
+ ```
46
101
 
47
- For last, on your Reldens implementation you just need to pass an instance of your data server to the server manager and you are done:
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
- const appServer = new ServerManager(serverConfig, eventsManager, yourDriverInstance);
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
- You can also check the [skeleton implementation](https://github.com/damian-pastorini/reldens-skeleton/) to see how it works.
140
+ ## Links
141
+ - [Reldens Website](https://www.reldens.com/)
142
+ - [GitHub Repository](https://github.com/damian-pastorini/reldens/tree/master)
53
143
 
54
- For reference see Reldens GitHub: [https://github.com/damian-pastorini/reldens/tree/master](https://github.com/damian-pastorini/reldens/tree/master)
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: BaseDataServer,
19
- BaseDriver: 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: ObjectionJsDataServer,
22
- ObjectionJsDriver: ObjectionJsDriver,
33
+ ObjectionJsDataServer,
34
+ ObjectionJsDriver,
23
35
  ObjectionJsRawModel: Model,
24
36
  // mikro-orm:
25
37
  MikroOrmCore,
26
- MikroOrmDataServer: MikroOrmDataServer,
27
- MikroOrmDriver: 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
  };
@@ -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;