@reldens/cms 0.65.0 → 0.66.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/.claude/api-reference.md +30 -5
- package/.claude/architecture-guide.md +11 -5
- package/.claude/installation-guide.md +11 -9
- package/bin/reldens-cms-generate-entities.js +1 -1
- package/bin/reldens-cms-update-password.js +1 -1
- package/bin/reldens-cms.js +31 -48
- package/lib/manager-component-validator.js +72 -0
- package/lib/manager-config-loader.js +33 -0
- package/lib/manager-services-initializer.js +323 -0
- package/lib/manager.js +28 -386
- package/lib/mysql-installer.js +104 -108
- package/lib/prisma-subprocess-worker.js +8 -7
- package/package.json +1 -1
- package/.claude/hook-approvals.json +0 -1
package/lib/mysql-installer.js
CHANGED
|
@@ -1,108 +1,104 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
* Reldens - CMS - MySQLInstaller
|
|
4
|
-
*
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const { execSync } = require('child_process');
|
|
8
|
-
const { FileHandler } = require('@reldens/server-utils');
|
|
9
|
-
const { Logger, sc } = require('@reldens/utils');
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
'install-
|
|
19
|
-
'install-
|
|
20
|
-
'install-default-
|
|
21
|
-
'install-default-
|
|
22
|
-
'install-
|
|
23
|
-
'install-
|
|
24
|
-
'install-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
module.exports.MySQLInstaller = MySQLInstaller;
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Reldens - CMS - MySQLInstaller
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { execSync } = require('child_process');
|
|
8
|
+
const { FileHandler } = require('@reldens/server-utils');
|
|
9
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
10
|
+
const { PrismaSchemaGenerator, PrismaClientLoader } = require('@reldens/storage');
|
|
11
|
+
|
|
12
|
+
class MySQLInstaller
|
|
13
|
+
{
|
|
14
|
+
|
|
15
|
+
static migrationFiles()
|
|
16
|
+
{
|
|
17
|
+
return {
|
|
18
|
+
'install-cms-tables': 'install.sql',
|
|
19
|
+
'install-user-auth': 'users-authentication.sql',
|
|
20
|
+
'install-default-user': 'default-user.sql',
|
|
21
|
+
'install-default-homepage': 'default-homepage.sql',
|
|
22
|
+
'install-default-blocks': 'default-blocks.sql',
|
|
23
|
+
'install-entity-access': 'default-entity-access.sql',
|
|
24
|
+
'install-dynamic-forms': 'default-forms.sql',
|
|
25
|
+
'install-seo-files': 'default-sitemaps-and-robots.sql'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
static async executeQueryFile(isMarked, fileName, dbDriver, migrationsPath)
|
|
30
|
+
{
|
|
31
|
+
if('on' !== isMarked){
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
let sqlFileContent = FileHandler.readFile(FileHandler.joinPaths(migrationsPath, fileName));
|
|
35
|
+
if(!sqlFileContent){
|
|
36
|
+
Logger.error('SQL file "'+fileName+'" not found.');
|
|
37
|
+
return '/?error=sql-file-not-found&file-name='+fileName;
|
|
38
|
+
}
|
|
39
|
+
let queryExecutionResult = await dbDriver.rawQuery(sqlFileContent);
|
|
40
|
+
if(!queryExecutionResult){
|
|
41
|
+
Logger.error('SQL file "'+fileName+'" raw execution failed.');
|
|
42
|
+
return '/?error=sql-file-execution-error&file-name='+fileName;
|
|
43
|
+
}
|
|
44
|
+
Logger.info('SQL file "'+fileName+'" raw execution successfully.');
|
|
45
|
+
return '';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
static normalizePrismaProvider(client)
|
|
49
|
+
{
|
|
50
|
+
if(-1 !== client.indexOf('mysql')){
|
|
51
|
+
return 'mysql';
|
|
52
|
+
}
|
|
53
|
+
if('postgresql' === client || 'postgres' === client){
|
|
54
|
+
return 'postgresql';
|
|
55
|
+
}
|
|
56
|
+
if('mongodb' === client){
|
|
57
|
+
return 'mongodb';
|
|
58
|
+
}
|
|
59
|
+
return client;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static buildMinimalSchemaContent(provider)
|
|
63
|
+
{
|
|
64
|
+
return 'generator client {\n provider = "prisma-client-js"\n output = "./client"\n}\n\n'
|
|
65
|
+
+'datasource db {\n provider = "'+provider+'"\n}';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static async generateMinimalPrismaClient(dbConfig, projectRoot)
|
|
69
|
+
{
|
|
70
|
+
PrismaSchemaGenerator.ensureStubFiles(projectRoot);
|
|
71
|
+
let generator = new PrismaSchemaGenerator({
|
|
72
|
+
...dbConfig,
|
|
73
|
+
config: sc.get(dbConfig, 'config', dbConfig),
|
|
74
|
+
clientOutputPath: FileHandler.joinPaths(projectRoot, 'prisma', 'client'),
|
|
75
|
+
prismaSchemaPath: FileHandler.joinPaths(projectRoot, 'prisma')
|
|
76
|
+
});
|
|
77
|
+
FileHandler.createFolder(FileHandler.joinPaths(projectRoot, 'prisma'));
|
|
78
|
+
FileHandler.writeFile(
|
|
79
|
+
FileHandler.joinPaths(projectRoot, 'prisma', 'schema.prisma'),
|
|
80
|
+
MySQLInstaller.buildMinimalSchemaContent(
|
|
81
|
+
MySQLInstaller.normalizePrismaProvider(sc.get(dbConfig, 'client', 'mysql'))
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
generator.setDatabaseEnvironmentVariables();
|
|
85
|
+
generator.generateConfigFile();
|
|
86
|
+
Logger.info('Running prisma generate...');
|
|
87
|
+
try {
|
|
88
|
+
execSync('npx prisma generate', { stdio: 'inherit', cwd: projectRoot });
|
|
89
|
+
} catch(error) {
|
|
90
|
+
Logger.error('Prisma generate failed: '+error.message);
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
let { PrismaClient } = require(FileHandler.joinPaths(projectRoot, 'prisma', 'client'));
|
|
94
|
+
return PrismaClientLoader.createWithAdapter(PrismaClient, process.env.DATABASE_URL) || false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
static createPrismaClient(projectRoot)
|
|
98
|
+
{
|
|
99
|
+
return PrismaClientLoader.load(projectRoot, null, null);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports.MySQLInstaller = MySQLInstaller;
|
|
@@ -4,10 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
const {
|
|
8
|
-
const {
|
|
9
|
-
const { Logger } = require('@reldens/utils');
|
|
10
|
-
const { sc } = require('@reldens/utils');
|
|
7
|
+
const { PrismaSchemaGenerator } = require('@reldens/storage/lib/prisma/prisma-schema-generator');
|
|
8
|
+
const { Logger, sc } = require('@reldens/utils');
|
|
11
9
|
|
|
12
10
|
class PrismaSubprocessWorker
|
|
13
11
|
{
|
|
@@ -25,18 +23,18 @@ class PrismaSubprocessWorker
|
|
|
25
23
|
} catch(error) {
|
|
26
24
|
Logger.error('PrismaSubprocessWorker error: '+error.message);
|
|
27
25
|
this.sendErrorResponse(error.message);
|
|
28
|
-
|
|
26
|
+
process.exit(1);
|
|
29
27
|
}
|
|
30
28
|
});
|
|
31
29
|
process.on('uncaughtException', (error) => {
|
|
32
30
|
Logger.error('PrismaSubprocessWorker uncaught exception: '+error.message);
|
|
33
31
|
this.sendErrorResponse(error.message);
|
|
34
|
-
|
|
32
|
+
process.exit(1);
|
|
35
33
|
});
|
|
36
34
|
process.on('unhandledRejection', (error) => {
|
|
37
35
|
Logger.error('PrismaSubprocessWorker unhandled rejection: '+error.message);
|
|
38
36
|
this.sendErrorResponse(error.message);
|
|
39
|
-
|
|
37
|
+
process.exit(1);
|
|
40
38
|
});
|
|
41
39
|
}
|
|
42
40
|
|
|
@@ -46,12 +44,15 @@ class PrismaSubprocessWorker
|
|
|
46
44
|
let templateVariables = sc.get(message, 'templateVariables', {});
|
|
47
45
|
let migrationsPath = sc.get(message, 'migrationsPath', './migrations');
|
|
48
46
|
let projectRoot = sc.get(message, 'projectRoot', './');
|
|
47
|
+
PrismaSchemaGenerator.ensureStubFiles(projectRoot);
|
|
48
|
+
let { MySQLInstaller } = require('./mysql-installer');
|
|
49
49
|
let generatedClient = await MySQLInstaller.generateMinimalPrismaClient(dbConfig, projectRoot);
|
|
50
50
|
if(!generatedClient){
|
|
51
51
|
this.sendErrorResponse('Failed to generate Prisma client.');
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
54
|
dbConfig.prismaClient = generatedClient;
|
|
55
|
+
let { DriversMap } = require('@reldens/storage');
|
|
55
56
|
let driverClass = DriversMap['prisma'];
|
|
56
57
|
if(!driverClass){
|
|
57
58
|
this.sendErrorResponse('Prisma driver class not found.');
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|