@simplysf/simply-document 0.2.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.
@@ -0,0 +1,466 @@
1
+ /*
2
+ * Copyright (c) 2026, Clay Chipps; Copyright (c) 2026 Salesforce, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /* eslint-disable no-await-in-loop */
17
+ /* eslint-disable complexity */
18
+ import fs from 'node:fs/promises';
19
+ import { Messages } from '@salesforce/core';
20
+ import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
21
+ import { ComponentSet } from '@salesforce/source-deploy-retrieve';
22
+ import { buildTechnicalDesignDocumentHtml, } from '../../../common/technicalDesignDocumentTemplate.js';
23
+ Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
24
+ const messages = Messages.loadMessages('@simplysf/simply-document', 'simply.document.generate');
25
+ /**
26
+ * Parse a component's metadata XML and return it flattened with the component's name, matching
27
+ * the shape the technical design document template expects.
28
+ *
29
+ * @param component - The component to parse.
30
+ * @param metadataType - The XML root element name to read (usually the component's metadata type).
31
+ * @returns The component's name, plus whatever fields were found under `metadataType`.
32
+ */
33
+ async function getMetadataFromComponent(component, metadataType) {
34
+ const parsed = await component.parseXml();
35
+ return { name: component.name, ...(parsed[metadataType] ?? {}) };
36
+ }
37
+ /**
38
+ * Extract the free-form "description" portion of a field description that follows this org's
39
+ * `description: ... usage notes: ...` convention, falling back to the raw description otherwise.
40
+ *
41
+ * @param description - The field's raw description, if any.
42
+ * @returns The extracted mini-description, or `undefined` if there was no description.
43
+ */
44
+ function extractDescription(description) {
45
+ if (!description) {
46
+ return undefined;
47
+ }
48
+ const regex = /description:\s*(?<description>.*?)\s*usage notes:/is;
49
+ const match = regex.exec(description);
50
+ return match?.groups?.description ?? description;
51
+ }
52
+ /**
53
+ * Derive a field's display type (e.g. `Lookup(Account)`, `Text(80)`) and mini-description.
54
+ *
55
+ * @param customField - The field's raw parsed XML.
56
+ * @returns The field, ready for rendering in the technical design document.
57
+ */
58
+ function massageCustomField(customField) {
59
+ const massaged = {
60
+ ...customField,
61
+ miniDescription: extractDescription(customField.description),
62
+ };
63
+ if (massaged.formula) {
64
+ massaged.type = `Formula(${massaged.type ?? ''})`;
65
+ return massaged;
66
+ }
67
+ switch (massaged.type ?? '') {
68
+ case 'LongTextArea':
69
+ massaged.type = `LongTextArea(${massaged.length ?? ''})`;
70
+ break;
71
+ case 'Lookup':
72
+ massaged.type = `Lookup(${massaged.referenceTo ?? ''})`;
73
+ break;
74
+ case 'MasterDetail':
75
+ massaged.type = `MasterDetail(${massaged.referenceTo ?? ''})`;
76
+ massaged.required = 'true';
77
+ break;
78
+ case 'Number':
79
+ massaged.type = `Number(${massaged.precision ?? ''},${massaged.scale ?? ''})`;
80
+ break;
81
+ case 'Text':
82
+ massaged.type = `Text(${massaged.length ?? ''})`;
83
+ break;
84
+ default:
85
+ break;
86
+ }
87
+ return massaged;
88
+ }
89
+ /**
90
+ * Scans a Salesforce project directory for metadata and generates a Confluence-storage-format
91
+ * technical design document covering the data model, security model, groups/queues/permissions,
92
+ * solution inventory, and custom code inventory.
93
+ */
94
+ export default class DocumentGenerate extends SfCommand {
95
+ static summary = messages.getMessage('summary');
96
+ static description = messages.getMessage('description');
97
+ static examples = messages.getMessages('examples');
98
+ static flags = {
99
+ ...SfCommand.baseFlags,
100
+ directory: Flags.directory({
101
+ summary: messages.getMessage('flags.directory.summary'),
102
+ char: 'd',
103
+ exists: true,
104
+ required: true,
105
+ }),
106
+ 'output-file': Flags.string({
107
+ summary: messages.getMessage('flags.output-file.summary'),
108
+ required: true,
109
+ }),
110
+ 'template-file': Flags.file({
111
+ summary: messages.getMessage('flags.template-file.summary'),
112
+ description: messages.getMessage('flags.template-file.description'),
113
+ exists: true,
114
+ }),
115
+ 'output-format': Flags.custom({ options: ['html'] })({
116
+ summary: messages.getMessage('flags.output-format.summary'),
117
+ description: messages.getMessage('flags.output-format.description'),
118
+ default: 'html',
119
+ }),
120
+ };
121
+ /** @returns Where the generated document was written, and how many top-level metadata items it covers. */
122
+ async run() {
123
+ const { flags } = await this.parse(DocumentGenerate);
124
+ const customTemplateSource = flags['template-file']
125
+ ? await fs.readFile(flags['template-file'], 'utf-8')
126
+ : undefined;
127
+ this.spinner.start(messages.getMessage('info.scanningProject'));
128
+ let components;
129
+ try {
130
+ components = ComponentSet.fromSource(flags.directory);
131
+ }
132
+ catch (error) {
133
+ this.spinner.stop();
134
+ throw messages.createError('error.scanFailed', [error.message]);
135
+ }
136
+ const apexClasses = [];
137
+ const apexTriggers = [];
138
+ const approvalProcesses = [];
139
+ const auraComponents = [];
140
+ const customApplications = [];
141
+ const customLabels = [];
142
+ const customMetadata = [];
143
+ const customMetadataTypes = [];
144
+ const customObjects = [];
145
+ const customSettings = [];
146
+ const dashboards = [];
147
+ const digitalExperienceBundles = [];
148
+ const emailTemplates = [];
149
+ const experienceBundles = [];
150
+ const flexipages = [];
151
+ const flows = [];
152
+ const groups = [];
153
+ const lightningComponents = [];
154
+ const objectMap = new Map();
155
+ const permissionSets = [];
156
+ const permissionSetGroups = [];
157
+ const platformEvents = [];
158
+ const queues = [];
159
+ const reports = [];
160
+ const sharingRules = [];
161
+ const standardObjects = [];
162
+ const staticResources = [];
163
+ const visualforcePages = [];
164
+ for (const rawComponent of components) {
165
+ const component = rawComponent;
166
+ this.spinner.status = component.name;
167
+ if (component.type.name === 'ApexClass') {
168
+ apexClasses.push(await getMetadataFromComponent(component, 'ApexClass'));
169
+ }
170
+ else if (component.type.name === 'ApexPage') {
171
+ visualforcePages.push(await getMetadataFromComponent(component, 'ApexPage'));
172
+ }
173
+ else if (component.type.name === 'ApexTrigger') {
174
+ apexTriggers.push(await getMetadataFromComponent(component, 'ApexTrigger'));
175
+ }
176
+ else if (component.type.name === 'ApprovalProcess') {
177
+ approvalProcesses.push(await getMetadataFromComponent(component, 'ApprovalProcess'));
178
+ }
179
+ else if (component.type.name === 'AuraDefinitionBundle') {
180
+ auraComponents.push(await getMetadataFromComponent(component, 'AuraDefinitionBundle'));
181
+ }
182
+ else if (component.type.name === 'CustomApplication') {
183
+ customApplications.push(await getMetadataFromComponent(component, 'CustomApplication'));
184
+ }
185
+ else if (component.type.name === 'CustomField') {
186
+ const customField = (await getMetadataFromComponent(component, 'CustomField'));
187
+ const objectName = component.parent?.name ?? '';
188
+ const objectFromMap = objectMap.get(objectName) ?? {};
189
+ objectFromMap.customFields = [...(objectFromMap.customFields ?? []), customField];
190
+ objectMap.set(objectName, objectFromMap);
191
+ }
192
+ else if (component.type.name === 'Layout') {
193
+ const pageLayout = await getMetadataFromComponent(component, 'Layout');
194
+ const nameParts = component.name.split('-');
195
+ const objectName = nameParts.at(0) ?? '';
196
+ const nameOnly = nameParts.at(1);
197
+ const objectFromMap = objectMap.get(objectName) ?? {};
198
+ objectFromMap.layouts = [...(objectFromMap.layouts ?? []), { ...pageLayout, nameOnly }];
199
+ objectMap.set(objectName, objectFromMap);
200
+ }
201
+ else if (component.type.name === 'CustomMetadata') {
202
+ customMetadata.push(await getMetadataFromComponent(component, 'CustomMetadata'));
203
+ }
204
+ else if (component.type.name === 'CustomObject') {
205
+ const customObjectXml = (await getMetadataFromComponent(component, 'CustomObject'));
206
+ const customObject = {
207
+ ...customObjectXml,
208
+ name: component.name,
209
+ miniDescription: extractDescription(customObjectXml.description),
210
+ };
211
+ const customFields = [];
212
+ const fieldSets = [];
213
+ const recordTypes = [];
214
+ const validationRules = [];
215
+ for (const child of component.getChildren()) {
216
+ if (child.type.name === 'FieldSet') {
217
+ fieldSets.push((await getMetadataFromComponent(child, 'FieldSet')));
218
+ continue;
219
+ }
220
+ if (child.type.name === 'CustomField') {
221
+ customFields.push((await getMetadataFromComponent(child, 'CustomField')));
222
+ continue;
223
+ }
224
+ if (child.type.name === 'RecordType') {
225
+ recordTypes.push((await getMetadataFromComponent(child, 'RecordType')));
226
+ continue;
227
+ }
228
+ if (child.type.name === 'ValidationRule') {
229
+ validationRules.push((await getMetadataFromComponent(child, 'ValidationRule')));
230
+ continue;
231
+ }
232
+ }
233
+ customObject.fieldSets = fieldSets;
234
+ customObject.customFields = customFields;
235
+ customObject.recordTypes = recordTypes;
236
+ customObject.validationRules = validationRules;
237
+ const objectFromMap = objectMap.get(component.name) ?? {};
238
+ objectFromMap.customObject = customObject;
239
+ objectMap.set(component.name, objectFromMap);
240
+ }
241
+ else if (component.type.name === 'CustomLabels') {
242
+ customLabels.push((await getMetadataFromComponent(component, 'CustomLabels')));
243
+ }
244
+ else if (component.type.name === 'Dashboard') {
245
+ const dashboard = (await getMetadataFromComponent(component, 'Dashboard'));
246
+ dashboard.folderName = dashboard.folderName ?? component.name.split('/').at(0);
247
+ dashboard.name = dashboard.title ?? component.name.split('/').at(1) ?? dashboard.name;
248
+ dashboards.push(dashboard);
249
+ }
250
+ else if (component.type.name === 'DigitalExperienceBundle') {
251
+ digitalExperienceBundles.push(await getMetadataFromComponent(component, 'DigitalExperienceBundle'));
252
+ }
253
+ else if (component.type.name === 'EmailTemplate') {
254
+ const emailTemplateXml = await component.parseXml();
255
+ emailTemplates.push({
256
+ apiName: component.name,
257
+ label: emailTemplateXml.EmailTemplate?.name,
258
+ ...emailTemplateXml.EmailTemplate,
259
+ });
260
+ }
261
+ else if (component.type.name === 'ExperienceBundle') {
262
+ experienceBundles.push(await getMetadataFromComponent(component, 'ExperienceBundle'));
263
+ }
264
+ else if (component.type.name === 'FieldSet') {
265
+ const fieldSets = objectMap.get(component.parent?.name ?? '')?.fieldSets ?? [];
266
+ fieldSets.push((await getMetadataFromComponent(component, 'FieldSet')));
267
+ const objectFromMap = objectMap.get(component.parent?.name ?? '') ?? {};
268
+ objectFromMap.fieldSets = fieldSets;
269
+ objectMap.set(component.parent?.name ?? '', objectFromMap);
270
+ }
271
+ else if (component.type.name === 'Flexipage') {
272
+ flexipages.push(await getMetadataFromComponent(component, 'FlexiPage'));
273
+ }
274
+ else if (component.type.name === 'Flow') {
275
+ flows.push(await getMetadataFromComponent(component, 'Flow'));
276
+ }
277
+ else if (component.type.name === 'Group') {
278
+ const groupXml = await component.parseXml();
279
+ groups.push({ apiName: component.name, label: groupXml.Group?.name, ...groupXml.Group });
280
+ }
281
+ else if (component.type.name === 'LightningComponentBundle') {
282
+ lightningComponents.push(await getMetadataFromComponent(component, 'LightningComponentBundle'));
283
+ }
284
+ else if (component.type.name === 'PermissionSet') {
285
+ permissionSets.push(await getMetadataFromComponent(component, 'PermissionSet'));
286
+ }
287
+ else if (component.type.name === 'PermissionSetGroup') {
288
+ permissionSetGroups.push(await getMetadataFromComponent(component, 'PermissionSetGroup'));
289
+ }
290
+ else if (component.type.name === 'Queue') {
291
+ const queueXml = await component.parseXml();
292
+ const queueObjects = [];
293
+ const queueSobject = queueXml.Queue?.queueSobject;
294
+ if (Array.isArray(queueSobject)) {
295
+ for (const sobject of queueSobject) {
296
+ if (sobject.sobjectType) {
297
+ queueObjects.push(sobject.sobjectType);
298
+ }
299
+ }
300
+ }
301
+ else if (queueSobject?.sobjectType) {
302
+ queueObjects.push(queueSobject.sobjectType);
303
+ }
304
+ queues.push({
305
+ doesSendEmailToMembers: queueXml.Queue?.doesSendEmailToMembers,
306
+ label: queueXml.Queue?.name,
307
+ name: component.name,
308
+ queueObjects,
309
+ });
310
+ }
311
+ else if (component.type.name === 'RecordType') {
312
+ const recordTypes = objectMap.get(component.parent?.name ?? '')?.recordTypes ?? [];
313
+ recordTypes.push((await getMetadataFromComponent(component, 'RecordType')));
314
+ const objectFromMap = objectMap.get(component.parent?.name ?? '') ?? {};
315
+ objectFromMap.recordTypes = recordTypes;
316
+ objectMap.set(component.parent?.name ?? '', objectFromMap);
317
+ }
318
+ else if (component.type.name === 'Report') {
319
+ const report = (await getMetadataFromComponent(component, 'Report'));
320
+ report.folderName = report.folderName ?? component.name.split('/').at(0);
321
+ report.name = component.name.split('/').at(1) ?? report.name;
322
+ reports.push(report);
323
+ }
324
+ else if (component.type.name === 'SharingRules') {
325
+ for (const child of component.getChildren()) {
326
+ const sharingRule = (await getMetadataFromComponent(child, child.type.name));
327
+ sharingRule.object = child.parent?.name;
328
+ sharingRule.type = child.type.name;
329
+ sharingRules.push(sharingRule);
330
+ }
331
+ }
332
+ else if (component.type.name === 'StaticResource') {
333
+ staticResources.push(await getMetadataFromComponent(component, 'StaticResource'));
334
+ }
335
+ else if (component.type.name === 'ValidationRule') {
336
+ const validationRules = objectMap.get(component.parent?.name ?? '')?.validationRules ?? [];
337
+ validationRules.push((await getMetadataFromComponent(component, 'ValidationRule')));
338
+ const objectFromMap = objectMap.get(component.parent?.name ?? '') ?? {};
339
+ objectFromMap.validationRules = validationRules;
340
+ objectMap.set(component.parent?.name ?? '', objectFromMap);
341
+ }
342
+ }
343
+ this.spinner.stop();
344
+ this.spinner.start(messages.getMessage('info.mappingObjects'));
345
+ for (const [key, value] of objectMap) {
346
+ const customObject = value.customObject ?? { name: key, label: key };
347
+ if (value.customFields ?? customObject.customFields) {
348
+ customObject.customFields = [...(value.customFields ?? []), ...(customObject.customFields ?? [])]
349
+ .toSorted((a, b) => a.fullName.localeCompare(b.fullName))
350
+ .map(massageCustomField);
351
+ }
352
+ if (value.layouts ?? customObject.layouts) {
353
+ customObject.layouts = [...(value.layouts ?? []), ...(customObject.layouts ?? [])].toSorted((a, b) => (a.nameOnly ?? '').localeCompare(b.nameOnly ?? ''));
354
+ }
355
+ // Platform Events
356
+ if (key.endsWith('__e')) {
357
+ platformEvents.push(customObject);
358
+ continue;
359
+ }
360
+ // Custom Metadata Types
361
+ if (key.includes('__mdt')) {
362
+ customMetadataTypes.push(customObject);
363
+ continue;
364
+ }
365
+ // Custom Settings
366
+ if (customObject.customSettingsType) {
367
+ customSettings.push(customObject);
368
+ continue;
369
+ }
370
+ if (value.recordTypes ?? customObject.recordTypes) {
371
+ customObject.recordTypes = [...(value.recordTypes ?? []), ...(customObject.recordTypes ?? [])].toSorted((a, b) => a.fullName.localeCompare(b.fullName));
372
+ }
373
+ if (value.fieldSets ?? customObject.fieldSets) {
374
+ customObject.fieldSets = [...(value.fieldSets ?? []), ...(customObject.fieldSets ?? [])].toSorted((a, b) => (a.label ?? '').localeCompare(b.label ?? ''));
375
+ }
376
+ if (value.validationRules ?? customObject.validationRules) {
377
+ customObject.validationRules = [
378
+ ...(value.validationRules ?? []),
379
+ ...(customObject.validationRules ?? []),
380
+ ].toSorted((a, b) => a.fullName.localeCompare(b.fullName));
381
+ }
382
+ if (customObject.name.endsWith('__c')) {
383
+ customObjects.push(customObject);
384
+ }
385
+ else {
386
+ standardObjects.push(customObject);
387
+ }
388
+ }
389
+ platformEvents.sort((a, b) => a.name.localeCompare(b.name));
390
+ customMetadataTypes.sort((a, b) => a.name.localeCompare(b.name));
391
+ customSettings.sort((a, b) => a.name.localeCompare(b.name));
392
+ customObjects.sort((a, b) => a.name.localeCompare(b.name));
393
+ this.spinner.stop();
394
+ this.spinner.start(messages.getMessage('info.renderingDocument'));
395
+ let html;
396
+ if (flags['output-format'] === 'html') {
397
+ html = buildTechnicalDesignDocumentHtml({
398
+ apexClasses,
399
+ apexTriggers,
400
+ approvalProcesses,
401
+ auraComponents,
402
+ customApplications,
403
+ customLabels,
404
+ customMetadata,
405
+ customMetadataTypes,
406
+ customObjects,
407
+ customSettings,
408
+ dashboards,
409
+ digitalExperienceBundles,
410
+ emailTemplates,
411
+ experienceBundles,
412
+ flexipages,
413
+ flows,
414
+ groups,
415
+ lightningComponents,
416
+ permissionSets,
417
+ permissionSetGroups,
418
+ platformEvents,
419
+ queues,
420
+ reports,
421
+ sharingRules,
422
+ standardObjects,
423
+ staticResources,
424
+ visualforcePages,
425
+ }, customTemplateSource);
426
+ }
427
+ else {
428
+ throw messages.createError('error.unsupportedOutputFormat', [flags['output-format']]);
429
+ }
430
+ await fs.writeFile(flags['output-file'], html, 'utf-8');
431
+ this.spinner.stop();
432
+ this.info(messages.getMessage('info.complete', [flags['output-file']]));
433
+ const componentCount = apexClasses.length +
434
+ apexTriggers.length +
435
+ approvalProcesses.length +
436
+ auraComponents.length +
437
+ customApplications.length +
438
+ customLabels.length +
439
+ customMetadata.length +
440
+ customMetadataTypes.length +
441
+ customObjects.length +
442
+ customSettings.length +
443
+ dashboards.length +
444
+ digitalExperienceBundles.length +
445
+ emailTemplates.length +
446
+ experienceBundles.length +
447
+ flexipages.length +
448
+ flows.length +
449
+ groups.length +
450
+ lightningComponents.length +
451
+ permissionSets.length +
452
+ permissionSetGroups.length +
453
+ platformEvents.length +
454
+ queues.length +
455
+ reports.length +
456
+ sharingRules.length +
457
+ standardObjects.length +
458
+ staticResources.length +
459
+ visualforcePages.length;
460
+ return {
461
+ outputFile: flags['output-file'],
462
+ componentCount,
463
+ };
464
+ }
465
+ }
466
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/commands/simply/document/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** A single changed component, as rendered in a change table row. */
2
+ export type ChangeEntry = {
3
+ componentName: string;
4
+ componentType: string;
5
+ changeType: string;
6
+ changeDescription: string;
7
+ path: string;
8
+ };
9
+ /** Changed components, grouped by component type (e.g. `apexClasses`, `customObjects`). */
10
+ export type ChangesByComponentType = Record<string, ChangeEntry[]>;
11
+ /**
12
+ * Render a Confluence-storage-format change report grouping a set of changed components by
13
+ * component type, for pasting into a release/change-management page.
14
+ *
15
+ * @param changes - The changed components, grouped by component type.
16
+ * @param customTemplateSource - A user-supplied Handlebars template to render instead of the
17
+ * built-in one. Compiled against the same Handlebars instance as the built-in template, so it
18
+ * can also use the `changeTable` partial. See the README's "Custom Templates" section for the
19
+ * `changes` data shape and the fields `changeTable` renders.
20
+ * @returns The rendered XHTML fragment.
21
+ */
22
+ export declare function buildChangeReportHtml(changes: ChangesByComponentType, customTemplateSource?: string): string;