sfdx-hardis 5.18.1 → 5.19.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.
Files changed (29) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/defaults/mkdocs-project-doc/mkdocs.yml +9 -5
  3. package/defaults/monitoring/.github/workflows/org-monitoring.yml +7 -6
  4. package/lib/commands/hardis/doc/mkdocs-to-cf.js +1 -1
  5. package/lib/commands/hardis/doc/mkdocs-to-cf.js.map +1 -1
  6. package/lib/commands/hardis/doc/mkdocs-to-salesforce.js +1 -1
  7. package/lib/commands/hardis/doc/mkdocs-to-salesforce.js.map +1 -1
  8. package/lib/commands/hardis/doc/packagexml2markdown.js +1 -1
  9. package/lib/commands/hardis/doc/packagexml2markdown.js.map +1 -1
  10. package/lib/commands/hardis/doc/plugin/generate.js +1 -1
  11. package/lib/commands/hardis/doc/plugin/generate.js.map +1 -1
  12. package/lib/commands/hardis/doc/project2markdown.d.ts +2 -1
  13. package/lib/commands/hardis/doc/project2markdown.js +83 -55
  14. package/lib/commands/hardis/doc/project2markdown.js.map +1 -1
  15. package/lib/commands/hardis/org/monitor/backup.js +4 -0
  16. package/lib/commands/hardis/org/monitor/backup.js.map +1 -1
  17. package/lib/commands/hardis/project/generate/bypass.d.ts +19 -0
  18. package/lib/commands/hardis/project/generate/bypass.js +153 -0
  19. package/lib/commands/hardis/project/generate/bypass.js.map +1 -0
  20. package/lib/common/{utils → docBuilder}/docUtils.d.ts +1 -0
  21. package/lib/common/{utils → docBuilder}/docUtils.js +17 -8
  22. package/lib/common/docBuilder/docUtils.js.map +1 -0
  23. package/lib/common/docBuilder/objectModelBuilder.d.ts +16 -0
  24. package/lib/common/docBuilder/objectModelBuilder.js +161 -0
  25. package/lib/common/docBuilder/objectModelBuilder.js.map +1 -0
  26. package/oclif.lock +237 -237
  27. package/oclif.manifest.json +166 -52
  28. package/package.json +5 -5
  29. package/lib/common/utils/docUtils.js.map +0 -1
@@ -0,0 +1,161 @@
1
+ // import c from "chalk";
2
+ import { glob } from "glob";
3
+ import fs from "fs-extra";
4
+ // import { uxLog } from "../utils/index.js";
5
+ import * as path from "path";
6
+ import { XMLParser } from "fast-xml-parser";
7
+ import { GLOB_IGNORE_PATTERNS } from "../utils/projectUtils.js";
8
+ let ALL_LINKS_CACHE = [];
9
+ let ALL_OBJECTS_CACHE = [];
10
+ export class ObjectModelBuilder {
11
+ mainCustomObject;
12
+ relatedCustomObjects;
13
+ allLinks = [];
14
+ allObjects = [];
15
+ selectedObjectsNames = new Set();
16
+ selectedObjects = [];
17
+ selectedLinks = [];
18
+ constructor(mainCustomObject = "all", relatedCustomObjects = []) {
19
+ this.mainCustomObject = mainCustomObject;
20
+ if (this.mainCustomObject !== "all") {
21
+ this.selectedObjectsNames.add(this.mainCustomObject);
22
+ }
23
+ this.relatedCustomObjects = relatedCustomObjects;
24
+ }
25
+ async buildObjectsMermaidSchema() {
26
+ await this.buildAllLinks();
27
+ await this.buildAllObjects();
28
+ await this.selectObjects();
29
+ await this.selectLinks();
30
+ const mermaidSchema = await this.generateMermaidSchema();
31
+ return mermaidSchema;
32
+ }
33
+ async generateMermaidSchema() {
34
+ let mermaidSchema = `graph TD\n`;
35
+ for (const object of this.selectedObjects) {
36
+ const objectClass = object.name === this.mainCustomObject ? "mainObject" :
37
+ !object.name.endsWith("__c") ? "object" :
38
+ object.name.split("__").length > 2 ? "customObjectManaged" :
39
+ "customObject";
40
+ mermaidSchema += `${object.name}["${object.label}"]:::${objectClass}\n`;
41
+ if (fs.existsSync(`docs/objects/${object.name}.md`)) {
42
+ mermaidSchema += `click ${object.name} "/objects/${object.name}/"\n`;
43
+ }
44
+ }
45
+ mermaidSchema += `\n`;
46
+ let pos = 0;
47
+ const masterDetailPos = [];
48
+ const lookupPos = [];
49
+ for (const link of this.selectedLinks) {
50
+ if (link.type === "MasterDetail") {
51
+ mermaidSchema += `${link.from} ==>|${link.field}| ${link.to}\n`;
52
+ masterDetailPos.push(pos);
53
+ }
54
+ else {
55
+ mermaidSchema += `${link.from} -->|${link.field}| ${link.to}\n`;
56
+ lookupPos.push(pos);
57
+ }
58
+ pos++;
59
+ }
60
+ mermaidSchema += `\n`;
61
+ mermaidSchema += `classDef object fill:#D6E9FF,stroke:#0070D2,stroke-width:3px,rx:12px,ry:12px,shadow:drop,color:#333;
62
+ classDef customObject fill:#FFF4C2,stroke:#CCAA00,stroke-width:3px,rx:12px,ry:12px,shadow:drop,color:#333;
63
+ classDef customObjectManaged fill:#FFD8B2,stroke:#CC5500,stroke-width:3px,rx:12px,ry:12px,shadow:drop,color:#333;
64
+ classDef mainObject fill:#FFB3B3,stroke:#A94442,stroke-width:4px,rx:14px,ry:14px,shadow:drop,color:#333,font-weight:bold;
65
+ `;
66
+ if (masterDetailPos.length > 0) {
67
+ mermaidSchema += "linkStyle " + masterDetailPos.join(",") + " stroke:#4C9F70,stroke-width:4px;\n";
68
+ }
69
+ if (lookupPos.length > 0) {
70
+ mermaidSchema += "linkStyle " + lookupPos.join(",") + " stroke:#A6A6A6,stroke-width:2px;\n";
71
+ }
72
+ return mermaidSchema;
73
+ }
74
+ async buildAllLinks() {
75
+ if (ALL_LINKS_CACHE.length > 0) {
76
+ this.allLinks = ALL_LINKS_CACHE;
77
+ return;
78
+ }
79
+ // List all object links in the project
80
+ const findFieldsPattern = `**/objects/**/fields/**.field-meta.xml`;
81
+ const matchingFieldFiles = (await glob(findFieldsPattern, { cwd: process.cwd(), ignore: GLOB_IGNORE_PATTERNS })).map(file => file.replace(/\\/g, '/'));
82
+ for (const fieldFile of matchingFieldFiles) {
83
+ const objectName = fieldFile.substring(fieldFile.indexOf('objects/')).split("/")[1];
84
+ if (objectName.endsWith("__dlm") || objectName.endsWith("__dll")) {
85
+ continue;
86
+ }
87
+ const fieldXml = fs.readFileSync(fieldFile, "utf8").toString();
88
+ const fieldDetail = new XMLParser().parse(fieldXml);
89
+ if (fieldDetail?.CustomField?.type === "MasterDetail" || fieldDetail?.CustomField?.type === "Lookup") {
90
+ const fieldName = path.basename(fieldFile, ".field-meta.xml");
91
+ const link = {
92
+ from: objectName,
93
+ to: fieldDetail.CustomField.referenceTo,
94
+ field: fieldName,
95
+ relationshipName: fieldDetail.CustomField.relationshipName,
96
+ type: fieldDetail.CustomField.type
97
+ };
98
+ this.allLinks.push(link);
99
+ }
100
+ }
101
+ ALL_LINKS_CACHE = [...this.allLinks];
102
+ }
103
+ async buildAllObjects() {
104
+ if (ALL_OBJECTS_CACHE.length > 0) {
105
+ this.allObjects = ALL_OBJECTS_CACHE;
106
+ return;
107
+ }
108
+ // Get custom objects info
109
+ const findObjectsPattern = `**/objects/**/*.object-meta.xml`;
110
+ const matchingObjectFiles = (await glob(findObjectsPattern, { cwd: process.cwd(), ignore: GLOB_IGNORE_PATTERNS })).map(file => file.replace(/\\/g, '/'));
111
+ for (const objectFile of matchingObjectFiles) {
112
+ const objectName = path.basename(objectFile, ".object-meta.xml");
113
+ const objectXml = fs.readFileSync(objectFile, "utf8").toString();
114
+ const objectDetail = new XMLParser().parse(objectXml);
115
+ const object = {
116
+ name: objectName,
117
+ label: objectDetail?.CustomObject?.label || objectName,
118
+ description: objectDetail?.CustomObject?.description || '',
119
+ };
120
+ this.allObjects.push(object);
121
+ }
122
+ ALL_OBJECTS_CACHE = [...this.allObjects];
123
+ }
124
+ async selectObjects() {
125
+ for (const link of this.allLinks) {
126
+ if (this.relatedCustomObjects.includes(link.from) || this.relatedCustomObjects.includes(link.to)) {
127
+ this.selectedObjectsNames.add(link.from);
128
+ this.selectedObjectsNames.add(link.to);
129
+ }
130
+ else if (this.mainCustomObject === "all") {
131
+ this.selectedObjectsNames.add(link.from);
132
+ this.selectedObjectsNames.add(link.to);
133
+ }
134
+ else {
135
+ if (link.from === this.mainCustomObject || link.to === this.mainCustomObject) {
136
+ this.selectedObjectsNames.add(link.from);
137
+ this.selectedObjectsNames.add(link.to);
138
+ }
139
+ }
140
+ }
141
+ for (const object of this.allObjects) {
142
+ if (this.selectedObjectsNames.has(object.name)) {
143
+ this.selectedObjects.push(object);
144
+ }
145
+ }
146
+ // Complete with objects with missing .object-meta.xml file
147
+ for (const object of this.selectedObjectsNames) {
148
+ if (!this.selectedObjects.some(obj => obj.name === object)) {
149
+ this.selectedObjects.push({ name: object, label: object, description: '' });
150
+ }
151
+ }
152
+ }
153
+ async selectLinks() {
154
+ for (const link of this.allLinks) {
155
+ if (this.selectedObjectsNames.has(link.from) && this.selectedObjectsNames.has(link.to)) {
156
+ this.selectedLinks.push(link);
157
+ }
158
+ }
159
+ }
160
+ }
161
+ //# sourceMappingURL=objectModelBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectModelBuilder.js","sourceRoot":"","sources":["../../../src/common/docBuilder/objectModelBuilder.ts"],"names":[],"mappings":"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"}