cob-cli 2.40.1 → 2.41.1
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/bin/cob-cli.js
CHANGED
|
@@ -90,7 +90,8 @@ program
|
|
|
90
90
|
.command('generateMermaid')
|
|
91
91
|
.option('-e --environment <name>', 'environment to use')
|
|
92
92
|
.option('-s --server <name>', 'server to use (ignores -e)')
|
|
93
|
-
.option('-f --filter <regexp>', 'regexp used to filter against names & descriptions')
|
|
93
|
+
.option('-f --filter <regexp>', 'regexp used to filter against names & descriptions. You can use multiple filters separated by spaces and you can prefix the filter with a minus(-) to explicit Definition not containing that filter.')
|
|
94
|
+
.option('-i --includeReferencedTables', 'Includes tables referenced, even if excluded by the filter')
|
|
94
95
|
.option('-l --labels <lang>', 'add labels in the given language. Available options are "en", "pt" or "es"')
|
|
95
96
|
.option('-d --debug', 'send debug info to stderr')
|
|
96
97
|
.description('Generates mermaid diagram from Definitions')
|
|
@@ -19,9 +19,11 @@ async function generateMermaid(args) {
|
|
|
19
19
|
console.log('erDiagram');
|
|
20
20
|
let refs = [];
|
|
21
21
|
let references = [];
|
|
22
|
+
const tables = new Set();
|
|
22
23
|
for(const def of defs){
|
|
23
24
|
refs.push(...getRefs(def.name, def.fieldDefinitions, args.debug));
|
|
24
25
|
references.push(...getReferences(def.name, def.fieldDefinitions, args.debug));
|
|
26
|
+
tables.add(def.name);
|
|
25
27
|
}
|
|
26
28
|
refs = uniqBy(refs, r => r.one + ":" + r.many)
|
|
27
29
|
references = uniqBy(references, r => r.one + ":" + r.many)
|
|
@@ -30,41 +32,37 @@ async function generateMermaid(args) {
|
|
|
30
32
|
'references: ', references
|
|
31
33
|
)
|
|
32
34
|
|
|
33
|
-
const tables = new Set();
|
|
34
|
-
for(const ref of refs){
|
|
35
|
-
tables.add(ref.one);
|
|
36
|
-
tables.add(ref.many);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
35
|
// Output table defs
|
|
40
36
|
for(const table of tables){
|
|
41
37
|
const id = toMermaidId(table)
|
|
42
|
-
|
|
38
|
+
console.debug(`\t${id}["${table}"]{}`)
|
|
43
39
|
}
|
|
44
40
|
console.debug("")
|
|
45
41
|
// Output relations
|
|
46
42
|
for (const ref of refs) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
43
|
+
// Only output relations that involve tables not excluded (or if arg to include referenced tables is present)
|
|
44
|
+
if(args.includeReferencedTables || tables.has(ref.one) && tables.has(ref.many)) {
|
|
45
|
+
const one = toMermaidId(ref.one);
|
|
46
|
+
const many = toMermaidId(ref.many);
|
|
47
|
+
const left = '|o';
|
|
48
|
+
const right = (ref.required ? '|' : 'o') + '{';
|
|
49
|
+
const msgType = references.some(r => r.one === ref.one && r.many === ref.many) ? "hasMany" : "isOf"
|
|
50
|
+
let msg = "";
|
|
51
|
+
switch (args.labels) {
|
|
52
|
+
case "en":
|
|
53
|
+
msg = msgType == "hasMany" ? `${ref.one} have many ${ref.many}` : `_${ref.fieldName}_ is one of ${ref.one}`;
|
|
54
|
+
break;
|
|
55
|
+
case "pt":
|
|
56
|
+
msg = msgType == "hasMany" ? `${ref.one} têm ${ref.many}` : `_${ref.fieldName}_ refere um registo de ${ref.one}`;
|
|
57
|
+
break;
|
|
58
|
+
case "es":
|
|
59
|
+
msg = msgType == "hasMany" ? `${ref.one} tienen ${ref.many}` : `_${ref.fieldName}_ se refiere a un registro de ${ref.one}`;
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
console.debug(`\t${one} ${left}..${right} ${many}: " ${msg}"`)
|
|
63
64
|
}
|
|
64
|
-
|
|
65
|
-
console.debug(`\t${one} ${left}..${right} ${many}: " ${msg}"`)
|
|
66
65
|
}
|
|
67
|
-
|
|
68
66
|
} catch(err) {
|
|
69
67
|
console.error("\n",err.message);
|
|
70
68
|
}
|
|
@@ -76,9 +74,7 @@ async function readDefsFromDisk(dir, filter, debug) {
|
|
|
76
74
|
const defFiles = await fg([`${dir}/*.json`]);
|
|
77
75
|
return defFiles
|
|
78
76
|
.map((f) => JSON.parse(fs.readFileSync(f)))
|
|
79
|
-
.filter(def =>
|
|
80
|
-
return !filter || def.name.match(filter) || def.description?.match(filter)
|
|
81
|
-
})
|
|
77
|
+
.filter(def => relevant(def,filter))
|
|
82
78
|
}
|
|
83
79
|
|
|
84
80
|
async function readDefsFromServer(server, filter, debug) {
|
|
@@ -97,9 +93,8 @@ async function readDefsFromServer(server, filter, debug) {
|
|
|
97
93
|
})).data
|
|
98
94
|
if(debug) console.error('found a total of ', defs.length, 'Defs');
|
|
99
95
|
// filter
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
})
|
|
96
|
+
defs = defs.filter(def => relevant(def,filter))
|
|
97
|
+
|
|
103
98
|
if(debug) console.error('filtered to ', defs.length, 'Defs');
|
|
104
99
|
return await Promise.all(defs.map(async (def) => {
|
|
105
100
|
return (await axios.get(`https://${server}/recordm/recordm/definitions/${def.id}`,{
|
|
@@ -129,7 +124,6 @@ function getRefs(defName, fieldDefs, debug) {
|
|
|
129
124
|
many: defName,
|
|
130
125
|
fieldName: fd.name,
|
|
131
126
|
required: !!fd.required,
|
|
132
|
-
duplicable: !!fd.duplicable
|
|
133
127
|
});
|
|
134
128
|
}
|
|
135
129
|
if (fd.fields) acc.push(...getRefs(defName, fd.fields));
|
|
@@ -144,7 +138,6 @@ function getReferences(defName, fieldDefs, debug) {
|
|
|
144
138
|
acc.push({
|
|
145
139
|
one: defName,
|
|
146
140
|
many: fd.configuration.keys.References.args.definition,
|
|
147
|
-
duplicable: true
|
|
148
141
|
});
|
|
149
142
|
}
|
|
150
143
|
if (fd.fields) acc.push(...getReferences(defName, fd.fields));
|
|
@@ -166,3 +159,17 @@ function uniqBy(a, key) {
|
|
|
166
159
|
return seen.has(k) ? false : seen.add(k);
|
|
167
160
|
});
|
|
168
161
|
}
|
|
162
|
+
|
|
163
|
+
function relevant(def,filter) {
|
|
164
|
+
return !filter
|
|
165
|
+
|| filter
|
|
166
|
+
.split(" ")
|
|
167
|
+
.every( filterPart => {
|
|
168
|
+
if(filterPart.startsWith("-")) {
|
|
169
|
+
filterPart = filterPart.substring(1)
|
|
170
|
+
return !def.name.match(filterPart) && !def.description?.match(filterPart)
|
|
171
|
+
} else {
|
|
172
|
+
return def.name.match(filterPart) || def.description?.match(filterPart)
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
}
|
package/package.json
CHANGED