@reldens/storage 0.53.0 → 0.55.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
@@ -23,32 +23,39 @@ It ensures consistent data access methods across different database types and OR
23
23
  ### CLI Tools
24
24
  Generate entity files directly from your database structure:
25
25
  ```bash
26
- npx reldens-storage generateEntities --user=dbuser --pass=dbpass --database=dbname --driver=objection-js
26
+ npx reldens-storage generateEntities --user=[dbuser] --pass=[dbpass] --database=[dbname] --driver=[objection-js]
27
27
  ```
28
28
 
29
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:
30
+ - `--user=[username]` - Database username
31
+ - `--pass=[password]` - Database password
32
+ - `--host=[host]` - Database host (default: localhost)
33
+ - `--port=[port]` - Database port (default: 3306)
34
+ - `--database=[name]` - Database name
35
+ - `--driver=[driver]` - ORM driver (objection-js|mikro-orm|prisma)
36
+ - `--client=[client]` - Database client (mysql|mysql2|mongodb)
37
+ - `--path=[path]` - Project path for output files
38
+ - `--override` - Regenerate all files even if they exist
39
+
40
+ Generate Prisma schema:
40
41
  ```bash
41
- npx reldens-storage-prisma --user=dbuser --pass=dbpass --database=dbname
42
+ npx reldens-generate-prisma-schema --host=[host] --port=[port] --user=[dbuser] --password=[dbpass] --database=[dbname]
42
43
  ```
43
44
 
44
45
  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
46
+ - `--host=[host]` - Database host (required)
47
+ - `--port=[port]` - Database port (required)
48
+ - `--user=[username]` - Database username (required)
49
+ - `--password=[password]` - Database password (required)
50
+ - `--database=[name]` - Database name (required)
51
+ - `--client=[client]` - Database client (default: mysql)
52
+ - `--debug` - Enable debug mode
53
+ - `--dataProxy` - Enable data proxy
54
+ - `--checkInterval=[ms]` - Check interval in milliseconds (default: 1000)
55
+ - `--maxWaitTime=[ms]` - Max wait time in milliseconds (default: 30000)
56
+ - `--prismaSchemaPath=[path]` - Path to Prisma schema directory
57
+ - `--clientOutputPath=[path]` - Client output path (if not set, uses Prisma default)
58
+ - `--generateBinaryTargets=[targets]` - Comma-separated binary targets (default: native)
52
59
 
53
60
  ## Usage Examples
54
61
 
@@ -96,7 +103,7 @@ const entities = server.generateEntities();
96
103
 
97
104
  First, generate your Prisma schema:
98
105
  ```bash
99
- npx reldens-storage-prisma --user=dbuser --pass=dbpass --database=dbname
106
+ npx reldens-generate-prisma-schema --host=localhost --port=3306 --user=dbuser --password=dbpass --database=dbname
100
107
  ```
101
108
 
102
109
  Then, use the PrismaDataServer in your code:
@@ -119,7 +126,7 @@ await server.connect();
119
126
  const entities = server.generateEntities();
120
127
  ```
121
128
 
122
- Note: The PrismaDataServer requires the Prisma schema to be generated first. Make sure to run the `reldens-storage-prisma` command before using PrismaDataServer.
129
+ Note: The PrismaDataServer requires the Prisma schema to be generated first. Make sure to run the `reldens-generate-prisma-schema` command before using PrismaDataServer.
123
130
 
124
131
  ## Custom Drivers
125
132
 
@@ -7,83 +7,152 @@
7
7
  */
8
8
 
9
9
  const { PrismaSchemaGenerator } = require('../lib/prisma/prisma-schema-generator');
10
- const { FileHandler } = require('@reldens/server-utils');
11
- const { Logger } = require('@reldens/utils');
10
+ const { Logger, sc } = require('@reldens/utils');
12
11
 
13
- let args = process.argv.slice(2);
12
+ class PrismaSchemaGeneratorCLI
13
+ {
14
14
 
15
- let connectionData = {
16
- client: 'mysql',
17
- config: {
18
- user: '',
19
- password: '',
20
- host: 'localhost',
21
- database: '',
22
- port: 3306
15
+ constructor()
16
+ {
17
+ this.args = process.argv.slice(2);
18
+ this.config = {};
19
+ this.parseArguments();
23
20
  }
24
- };
25
21
 
26
- let projectPath = process.cwd();
27
- for(let i = 0; i < args.length; i++){
28
- let arg = args[i];
29
- if(!arg.startsWith('--')){
30
- continue;
22
+ parseArguments()
23
+ {
24
+ for(let i = 0; i < this.args.length; i++){
25
+ let arg = this.args[i];
26
+ if(!arg.startsWith('--')){
27
+ continue;
28
+ }
29
+ let equalIndex = arg.indexOf('=');
30
+ if(-1 === equalIndex){
31
+ let flag = arg.substring(2);
32
+ if('debug' === flag || 'dataProxy' === flag || 'help' === flag || 'h' === flag){
33
+ this.config[flag] = true;
34
+ }
35
+ continue;
36
+ }
37
+ let key = arg.substring(2, equalIndex);
38
+ let value = arg.substring(equalIndex + 1);
39
+ if('port' === key || 'checkInterval' === key || 'maxWaitTime' === key){
40
+ this.config[key] = parseInt(value);
41
+ continue;
42
+ }
43
+ if('generateBinaryTargets' === key){
44
+ this.config[key] = value.split(',').map(target => target.trim());
45
+ continue;
46
+ }
47
+ this.config[key] = value;
48
+ }
31
49
  }
32
- let [key, value] = arg.substring(2).split('=');
33
- if(!key || !value){
34
- continue;
35
- }
36
- if('pass' === key){
37
- connectionData.config.password = value;
38
- continue;
39
- }
40
- if('path' === key){
41
- projectPath = value;
42
- continue;
43
- }
44
- if('user' === key){
45
- connectionData.config.user = value;
46
- continue;
50
+
51
+ shouldShowHelp()
52
+ {
53
+ return 0 === this.args.length || sc.get(this.config, 'help', false) || sc.get(this.config, 'h', false);
47
54
  }
48
- if('database' === key){
49
- connectionData.config.database = value;
50
- continue;
55
+
56
+ showHelp()
57
+ {
58
+ Logger.info('');
59
+ Logger.info('Reldens Prisma Schema Generator');
60
+ Logger.info('================================');
61
+ Logger.info('');
62
+ Logger.info('Usage: npx reldens-generate-prisma-schema [options]');
63
+ Logger.info('');
64
+ Logger.info('Required Options:');
65
+ Logger.info(' --host=[host] Database host');
66
+ Logger.info(' --port=[port] Database port');
67
+ Logger.info(' --user=[user] Database user');
68
+ Logger.info(' --password=[password] Database password');
69
+ Logger.info(' --database=[database] Database name');
70
+ Logger.info('');
71
+ Logger.info('Optional Options:');
72
+ Logger.info(' --client=[client] Database client (default: mysql)');
73
+ Logger.info(' --debug Enable debug mode (default: false)');
74
+ Logger.info(' --dataProxy Enable data proxy (default: false)');
75
+ Logger.info(' --checkInterval=[ms] Check interval in milliseconds (default: 1000)');
76
+ Logger.info(' --maxWaitTime=[ms] Max wait time in milliseconds (default: 30000)');
77
+ Logger.info(' --prismaSchemaPath=[path] Path to Prisma schema directory');
78
+ Logger.info(' --clientOutputPath=[path] Client output path (if not set, uses Prisma default)');
79
+ Logger.info(' --generateBinaryTargets=[targets] Comma-separated binary targets (default: native)');
80
+ Logger.info('');
81
+ Logger.info('Example:');
82
+ Logger.info(' npx reldens-generate-prisma-schema --host=localhost --port=3306 --user=root --password=secret --database=mydb');
83
+ Logger.info('');
84
+ Logger.info('Advanced Example:');
85
+ Logger.info(' npx reldens-generate-prisma-schema --host=localhost --port=3306 --user=root --password=secret --database=mydb --client=postgresql --debug --dataProxy --checkInterval=2000 --maxWaitTime=60000 --prismaSchemaPath=./custom/prisma --clientOutputPath=./custom/client --generateBinaryTargets=native,debian-openssl-1.1.x');
86
+ Logger.info('');
51
87
  }
52
- if('host' === key){
53
- connectionData.config.host = value;
54
- continue;
88
+
89
+ validateRequiredArgs()
90
+ {
91
+ let requiredArgs = ['host', 'port', 'user', 'password', 'database'];
92
+ let missing = [];
93
+ for(let arg of requiredArgs){
94
+ if(!this.config[arg]){
95
+ missing.push(arg);
96
+ }
97
+ }
98
+ if(0 < missing.length){
99
+ Logger.error('Missing required arguments: ' + missing.join(', '));
100
+ this.showHelp();
101
+ return false;
102
+ }
103
+ return true;
55
104
  }
56
- if('port' === key){
57
- connectionData.config.port = value;
58
- continue;
105
+
106
+ getSchemaConfig()
107
+ {
108
+ return {
109
+ config: {
110
+ host: this.config.host,
111
+ port: this.config.port,
112
+ user: this.config.user,
113
+ password: this.config.password,
114
+ database: this.config.database
115
+ },
116
+ client: sc.get(this.config, 'client', 'mysql'),
117
+ debug: sc.get(this.config, 'debug', false),
118
+ dataProxy: sc.get(this.config, 'dataProxy', false),
119
+ checkInterval: sc.get(this.config, 'checkInterval', 1000),
120
+ maxWaitTime: sc.get(this.config, 'maxWaitTime', 30000),
121
+ prismaSchemaPath: sc.get(this.config, 'prismaSchemaPath'),
122
+ clientOutputPath: sc.get(this.config, 'clientOutputPath'),
123
+ generateBinaryTargets: sc.get(this.config, 'generateBinaryTargets')
124
+ };
59
125
  }
60
- if('client' === key){
61
- connectionData.client = value;
126
+
127
+ async run()
128
+ {
129
+ if(this.shouldShowHelp()){
130
+ this.showHelp();
131
+ return true;
132
+ }
133
+ if(!this.validateRequiredArgs()){
134
+ return false;
135
+ }
136
+ let schemaConfig = this.getSchemaConfig();
137
+ let generator = new PrismaSchemaGenerator(schemaConfig);
138
+ let success = await generator.generate();
139
+ if(!success){
140
+ Logger.critical('Failed to generate Prisma schema');
141
+ return false;
142
+ }
143
+ Logger.info('Prisma schema generation completed successfully');
144
+ return true;
62
145
  }
63
- }
64
146
 
65
- if(!connectionData.config.user || !connectionData.config.database){
66
- Logger.error('Required parameters missing.');
67
- Logger.error(
68
- 'Usage:',
69
- 'npx reldens-storage generatePrismaSchema --user=[db-username] --pass=[db-password] --host=[db-host] --database=[db-name] --client=[db-client] --path=[project-path]'
70
- );
71
- process.exit();
72
147
  }
73
148
 
74
- let generator = new PrismaSchemaGenerator({
75
- ...connectionData,
76
- prismaSchemaPath: FileHandler.joinPaths(projectPath, 'prisma')
77
- });
78
-
79
- generator.generate().then((success) => {
149
+ let generator = new PrismaSchemaGeneratorCLI();
150
+ generator.run().then((success) => {
80
151
  if(!success){
81
- Logger.error('Prisma schema generation failed.');
82
- process.exit();
152
+ process.exit(1);
83
153
  }
84
- Logger.info('Prisma schema generation completed successfully!');
85
- process.exit();
154
+ process.exit(0);
86
155
  }).catch((error) => {
87
- Logger.error('Error during Prisma schema generation: '+error.message);
88
- process.exit();
156
+ Logger.critical('Unexpected error: ' + error.message);
157
+ process.exit(1);
89
158
  });
@@ -7,69 +7,124 @@
7
7
  */
8
8
 
9
9
  const { EntitiesGenerator } = require('../lib/entities-generator');
10
- const { Logger } = require('@reldens/utils');
10
+ const { Logger, sc } = require('@reldens/utils');
11
11
 
12
- let args = process.argv.slice(2);
13
- let command = args[0];
12
+ class StorageEntitiesGenerator
13
+ {
14
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;
15
+ constructor()
16
+ {
17
+ this.args = process.argv.slice(2);
18
+ this.command = this.args[0];
19
+ this.config = {};
20
+ this.projectPath = process.cwd();
21
+ this.isOverride = false;
22
+ this.parseArguments();
35
23
  }
36
- let [key, value] = arg.substring(2).split('=');
37
- if(!key || !value){
38
- continue;
24
+
25
+ parseArguments()
26
+ {
27
+ for(let i = 1; i < this.args.length; i++){
28
+ let arg = this.args[i];
29
+ if(!arg.startsWith('--')){
30
+ continue;
31
+ }
32
+ let equalIndex = arg.indexOf('=');
33
+ if(-1 === equalIndex){
34
+ let flag = arg.substring(2);
35
+ if('override' === flag){
36
+ this.isOverride = true;
37
+ }
38
+ continue;
39
+ }
40
+ let key = arg.substring(2, equalIndex);
41
+ let value = arg.substring(equalIndex + 1);
42
+ if('path' === key){
43
+ this.projectPath = value;
44
+ continue;
45
+ }
46
+ if('pass' === key){
47
+ this.config['password'] = value;
48
+ continue;
49
+ }
50
+ if('port' === key){
51
+ this.config[key] = parseInt(value);
52
+ continue;
53
+ }
54
+ this.config[key] = value;
55
+ }
39
56
  }
40
- if('pass' === key){
41
- connectionData.password = value;
42
- continue;
57
+
58
+ getConnectionData()
59
+ {
60
+ let connectionData = {
61
+ driver: sc.get(this.config, 'driver', 'objection-js'),
62
+ client: sc.get(this.config, 'client', 'mysql2'),
63
+ user: sc.get(this.config, 'user', ''),
64
+ password: sc.get(this.config, 'password', ''),
65
+ host: sc.get(this.config, 'host', 'localhost'),
66
+ database: sc.get(this.config, 'database', ''),
67
+ port: sc.get(this.config, 'port', 3306)
68
+ };
69
+ if('mikro-orm' === connectionData.driver && !this.config.client){
70
+ connectionData.client = 'mysql';
71
+ }
72
+ return connectionData;
43
73
  }
44
- if('path' === key){
45
- projectPath = value;
46
- continue;
74
+
75
+ validateCommand()
76
+ {
77
+ if('generateEntities' !== this.command){
78
+ Logger.error('Unknown command. Available command "generateEntities".');
79
+ return false;
80
+ }
81
+ return true;
47
82
  }
48
- connectionData[key] = value;
49
- }
50
83
 
51
- if('mikro-orm' === connectionData.driver && !args.find(arg => arg.startsWith('--client='))){
52
- connectionData.client = 'mysql';
53
- }
84
+ validateRequiredArgs(connectionData)
85
+ {
86
+ if(!connectionData.user || !connectionData.database){
87
+ Logger.error('Required parameters missing.');
88
+ Logger.error('Usage: 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] --override');
89
+ Logger.error('');
90
+ Logger.error('Optional flags:');
91
+ Logger.error(' --override Regenerate all files even if they exist');
92
+ return false;
93
+ }
94
+ return true;
95
+ }
54
96
 
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();
97
+ async run()
98
+ {
99
+ if(!this.validateCommand()){
100
+ return false;
101
+ }
102
+ let connectionData = this.getConnectionData();
103
+ if(!this.validateRequiredArgs(connectionData)){
104
+ return false;
105
+ }
106
+ let generator = new EntitiesGenerator({
107
+ connectionData,
108
+ projectPath: this.projectPath,
109
+ isOverride: this.isOverride
110
+ });
111
+ let success = await generator.generate();
112
+ if(!success){
113
+ Logger.error('Entity generation failed.');
114
+ return false;
115
+ }
116
+ Logger.info('Entity generation completed successfully!');
117
+ return true;
118
+ }
62
119
  }
63
120
 
64
- let generator = new EntitiesGenerator({connectionData, projectPath});
65
- generator.generate().then((success) => {
121
+ let generator = new StorageEntitiesGenerator();
122
+ generator.run().then((success) => {
66
123
  if(!success){
67
- Logger.error('Entity generation failed.');
68
- process.exit();
124
+ process.exit(1);
69
125
  }
70
- Logger.info('Entity generation completed successfully!');
71
- process.exit();
126
+ process.exit(0);
72
127
  }).catch((error) => {
73
128
  Logger.error('Error during entity generation: '+error.message);
74
- process.exit();
129
+ process.exit(1);
75
130
  });