cob-cli 2.40.0 → 2.41.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/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
- if (id != table) { console.debug(`\t${id}["${table}"]{}`) }
38
+ console.debug(`\t${id}["${table}"]{}`)
43
39
  }
44
40
  console.debug("")
45
41
  // Output relations
46
42
  for (const ref of refs) {
47
- const one = toMermaidId(ref.one);
48
- const many = toMermaidId(ref.many);
49
- const left = '|o';
50
- const right = (ref.required ? '|' : 'o') + '{';
51
- const msgType = references.some(r => r.one === ref.one && r.many === ref.many) ? "hasMany" : "isOf"
52
- let msg = "";
53
- switch (args.label) {
54
- case "en":
55
- msg = msgType == "hasMany" ? `${ref.one} have many ${ref.many}` : `_${ref.fieldName}_ is one of ${ref.one}`;
56
- break;
57
- case "pt":
58
- msg = msgType == "hasMany" ? `${ref.one} têm ${ref.many}` : `_${ref.fieldName}_ refere um registo de ${ref.one}`;
59
- break;
60
- case "es":
61
- msg = msgType == "hasMany" ? `${ref.one} tienen ${ref.many}` : `_${ref.fieldName}_ se refiere a un registro de ${ref.one}`;
62
- break;
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
- if(filter) defs = defs.filter(def => {
101
- return def.name.match(filter) || def.description?.match(filter)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cob-cli",
3
- "version": "2.40.0",
3
+ "version": "2.41.0",
4
4
  "description": "A command line utility to help Cult of Bits partners develop with higher speed and reusing common code and best practices.",
5
5
  "preferGlobal": true,
6
6
  "repository": {