@terafina/tffa-sfdx-plugin 16.0.0-rc.1 → 16.0.0-rc.3

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,382 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Copyright (c) NCR Terafina
5
+ **/
6
+ const command_1 = require("@salesforce/command");
7
+ const core_1 = require("@salesforce/core");
8
+ const fs_extra_1 = require("fs-extra");
9
+ // Initialize Messages with the current plugin directory
10
+ core_1.Messages.importMessagesDirectory(__dirname);
11
+ // Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
12
+ // or any library that is using the messages framework can also be loaded this way.
13
+ const messages = core_1.Messages.loadMessages('@terafina/tffa-sfdx-plugin', 'dataExport');
14
+ /**
15
+ * Represents a plan to export records of a specific SObject type.
16
+ */
17
+ class ExportPlan {
18
+ constructor(plan) {
19
+ Object.assign(this, plan);
20
+ if (!this.name) {
21
+ this.name = this.sObjectType;
22
+ }
23
+ }
24
+ }
25
+ /**
26
+ * Common regex used
27
+ */
28
+ const NON_ALPHANUM_RE = /[^a-zA-Z0-9]+/g;
29
+ const UPPER_LOWER_RE = /[A-Z][a-z]+/g;
30
+ const REFERENCE_ID_RE = /referenceId/g;
31
+ const MAX_OBJECTS_IN_FILE = 200;
32
+ /**
33
+ * Some internal configurations
34
+ */
35
+ const EXCLUDED_FIELDS = new Set(['OwnerId', 'RecordTypeId', 'tffa__IsDeleted__c']);
36
+ const EXTERNAL_ID_FIELDS = new Set(['ExternalId__c', 'tffa__ExternalId__c']);
37
+ const SORT_ORDER_FIELDS = new Set(['SortOrder__c', 'tffa__SortOrder__c']);
38
+ const CONTENT_URL_FIELDS = new Set(['ImageUrl__c', 'tffa__ImageUrl__c', 'tffa__Url__c']);
39
+ /**
40
+ * Export plans of SObject types that require fetching of child relationships, custom grouping, sorting etc.
41
+ * Export plans of SObject types that are simple and limited to itself need not be included here.
42
+ */
43
+ const EXPORT_PLANS = Object.fromEntries([
44
+ new ExportPlan({
45
+ sObjectType: 'tffa__Product__c',
46
+ children: ['tffa__Features__r', 'tffa__Terms__r'],
47
+ where: "tffa__Type__c='PRODUCT'"
48
+ }),
49
+ new ExportPlan({
50
+ sObjectType: 'tffa__Questionnaire__c',
51
+ groupBy: 'tffa__Type__c',
52
+ children: ['tffa__Outcomes__r', 'tffa__QuestionGroups__r'],
53
+ prefix: 'qn'
54
+ }),
55
+ new ExportPlan({ sObjectType: 'tffa__QuestionGroupTemplate__c', children: ['tffa__Questions__r'] }),
56
+ new ExportPlan({ sObjectType: 'tffa__AddOnService__c', orderBy: ['tffa__Type__c', 'Name'] }),
57
+ new ExportPlan({
58
+ sObjectType: 'tffa__ApplicationDecisionMatrix__c',
59
+ children: ['tffa__CounterOffers__r'],
60
+ orderBy: ['tffa__Type__c', 'tffa__SortOrder__c']
61
+ }),
62
+ new ExportPlan({ sObjectType: 'tffa__Brand__c', children: ['tffa__Locations__r'], prefix: 'brand', orderBy: ['tffa__SortOrder__c'] }),
63
+ new ExportPlan({ sObjectType: 'tffa__DecisionStrategyConfiguration__c', children: ['tffa__Strategies__r'] }),
64
+ new ExportPlan({ sObjectType: 'tffa__Offer__c', children: ['tffa__Terms__r'], orderBy: ['tffa__ProductCategory__c', 'Name'] }),
65
+ new ExportPlan({ sObjectType: 'tffa__Promotion__c', children: ['tffa__Plans__r'], prefix: 'pr' }),
66
+ new ExportPlan({ sObjectType: 'tffa__ListOfValues__c', groupBy: 'tffa__Locale__c' }),
67
+ new ExportPlan({
68
+ name: 'tffa__ProductBundle__c',
69
+ sObjectType: 'tffa__Product__c',
70
+ children: ['tffa__Features__r', 'tffa__Terms__r', 'tffa__ProductXrefs__r'],
71
+ where: "tffa__Type__c='BUNDLE'"
72
+ }),
73
+ new ExportPlan({ name: 'tffa__Address__c', sObjectType: 'tffa__Location__c', map: l => l.tffa__Address__r, prefix: 'addr' }),
74
+ new ExportPlan({ sObjectType: 'tffa__AddOnServiceChecklist__c', children: ['tffa__Items__r'], prefix: 'aoscl' }),
75
+ new ExportPlan({ sObjectType: 'tffa__DisclosureChecklist__c', children: ['tffa__Items__r'], prefix: 'dcl' }),
76
+ new ExportPlan({ sObjectType: 'tffa__StipulationChecklist__c', children: ['tffa__Items__r'], prefix: 'scl' }),
77
+ new ExportPlan({ sObjectType: 'tffa__DepositBoxConfiguration__c', children: ['tffa__Items__r'] }),
78
+ new ExportPlan({ sObjectType: 'tffa__RecommendationConfiguration__c', children: ['tffa__Items__r'] }),
79
+ new ExportPlan({ sObjectType: 'tffa__UXStrategy__c', prefix: 'uxs', orderBy: ['tffa__AppPage__c', 'tffa__SortOrder__c'] }),
80
+ new ExportPlan({ sObjectType: 'tffa__AllowedAddress__c', orderBy: ['tffa__SortOrder__c'] }),
81
+ new ExportPlan({ sObjectType: 'tffa__QuestionnaireMatrix__c', orderBy: ['tffa__Type__c', 'tffa__SortOrder__c'] })
82
+ ].map(p => [p.name, p]));
83
+ class DataExport extends command_1.SfdxCommand {
84
+ constructor() {
85
+ super(...arguments);
86
+ /**
87
+ * Custom prefixes
88
+ */
89
+ this.sObjectTypePrefixMap = new Map();
90
+ }
91
+ async run() {
92
+ for (const sObjectType of this.flags.sobjecttype) {
93
+ const plan = this.getExportPlan(sObjectType);
94
+ this.ux.startSpinner(`Fetching record(s) of ${sObjectType}`);
95
+ const records = await this.execute(plan);
96
+ this.ux.stopSpinner(`completed`);
97
+ this.log(`Fetched ${records.length} records of ${sObjectType}`);
98
+ this.transform(records);
99
+ if (records.length) {
100
+ this.writeRecords(records, plan);
101
+ }
102
+ }
103
+ }
104
+ async execute(plan, parent) {
105
+ let qb = this.org
106
+ .getConnection()
107
+ .sobject(plan.sObjectType)
108
+ .select(await this.getFields(plan, !!parent))
109
+ .orderby((await this.getOrderBy(plan, !parent && !plan.sObjectType.endsWith('Matrix__c'))).map(e => [e, 'asc']))
110
+ .where(plan.where);
111
+ for (const child of plan.children || []) {
112
+ const childPlan = await this.getChildExportPlan(plan.sObjectType, child);
113
+ qb = qb
114
+ .include(child)
115
+ .select(await this.getFields(childPlan, true))
116
+ .orderby((await this.getOrderBy(childPlan)).map(e => [e, 'asc']))
117
+ .end();
118
+ }
119
+ let records = await qb.execute();
120
+ if (plan.map) {
121
+ records = records.map(plan.map);
122
+ }
123
+ for (const child of plan.children || []) {
124
+ const childPlan = await this.getChildExportPlan(plan.sObjectType, child);
125
+ if (childPlan.children?.length) {
126
+ const childRecordMap = this.toMap(await this.execute(childPlan, plan));
127
+ for (const record of records) {
128
+ const relationshipNode = record[child];
129
+ if (relationshipNode) {
130
+ for (const [i, childRecord] of relationshipNode.records.entries()) {
131
+ relationshipNode.records[i] = childRecordMap.get(childRecord.Id) || childRecord;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ return records;
138
+ }
139
+ /**
140
+ * Gets fields to be included when exporting records.
141
+ */
142
+ async getFields(plan, skipMasterDetail = false, skipLookup = false) {
143
+ const sObjectType = plan.sObjectType;
144
+ const fields = ['Id'];
145
+ const conn = this.org.getConnection();
146
+ const describeResult = await conn.describe$(sObjectType);
147
+ for (const f of describeResult.fields) {
148
+ if (EXCLUDED_FIELDS.has(f.name) || !f.createable) {
149
+ continue;
150
+ }
151
+ if (f.referenceTo?.length) {
152
+ if (!skipLookup && (f.relationshipOrder !== 0 || !skipMasterDetail)) {
153
+ fields.push(f.name);
154
+ const refFields = await this.getFields(new ExportPlan({ sObjectType: f.referenceTo[0] }), true, true);
155
+ refFields.forEach(lf => fields.push(`${f.relationshipName}.${lf}`));
156
+ }
157
+ }
158
+ else {
159
+ fields.push(f.name);
160
+ }
161
+ }
162
+ return fields;
163
+ }
164
+ /**
165
+ * Gets the field to be used for ordering when exporting the records.
166
+ */
167
+ async getOrderBy(plan, skipSortOrder = false) {
168
+ const sObjectType = plan.sObjectType;
169
+ if (plan.orderBy) {
170
+ return plan.orderBy;
171
+ }
172
+ let sortOrderField = ['Name'];
173
+ if (!skipSortOrder) {
174
+ const describeResult = await this.org.getConnection().describe$(sObjectType);
175
+ for (const f of describeResult.fields) {
176
+ if (SORT_ORDER_FIELDS.has(f.name)) {
177
+ sortOrderField = [f.name];
178
+ break;
179
+ }
180
+ }
181
+ }
182
+ return sortOrderField;
183
+ }
184
+ /**
185
+ * Transforms the exported records, making it ready for writing to config files
186
+ * @param records
187
+ */
188
+ transform(records) {
189
+ for (const record of records) {
190
+ record.attributes.referenceId = this.getReferenceId(record);
191
+ record.attributes.url = undefined;
192
+ record.Id = undefined;
193
+ for (const [k, v] of Object.entries(record)) {
194
+ if (v === null || v === undefined) {
195
+ record[k] = undefined;
196
+ }
197
+ else if (typeof v === 'object' && k.endsWith('__r')) {
198
+ if (v.records) {
199
+ this.transform(v.records);
200
+ }
201
+ else {
202
+ record[k.replace('__r', '__c')] = `@${this.getReferenceId(v)}`;
203
+ record[k] = undefined;
204
+ }
205
+ }
206
+ else {
207
+ if (CONTENT_URL_FIELDS.has(k) && v.startsWith('/file-asset')) {
208
+ const url = new URL(v, 'http://localhost');
209
+ url.searchParams.delete('oid');
210
+ record[k] = url.pathname + url.search;
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ /**
217
+ * Gets the external id of the record
218
+ * @param record
219
+ * @returns
220
+ * @throws Error if external id or equivalent is not found
221
+ */
222
+ getExternalId(record) {
223
+ let externalId;
224
+ for (const externalIdField of EXTERNAL_ID_FIELDS) {
225
+ externalId = record[externalIdField];
226
+ if (externalId) {
227
+ break;
228
+ }
229
+ }
230
+ if (!externalId) {
231
+ throw new Error(`No external id found for sobject ${record.attributes.type} id=${record.Id}`);
232
+ }
233
+ return externalId;
234
+ }
235
+ /**
236
+ * Gets the reference id for the record
237
+ * @param record
238
+ */
239
+ getReferenceId(record) {
240
+ const sObjectType = record.attributes.type;
241
+ return `${this.getPrefix(sObjectType)}_${this.getExternalId(record)}`.replace(NON_ALPHANUM_RE, '_');
242
+ }
243
+ /**
244
+ * Gets the object prefix to be used when building the reference id
245
+ * @param sObjectType
246
+ * @returns
247
+ */
248
+ getPrefix(sObjectType) {
249
+ let prefix = this.sObjectTypePrefixMap.get(sObjectType) || this.getExportPlan(sObjectType).prefix;
250
+ if (!prefix) {
251
+ prefix = sObjectType
252
+ .match(UPPER_LOWER_RE)
253
+ .map(e => e[0])
254
+ .join('')
255
+ .toLowerCase();
256
+ this.sObjectTypePrefixMap.set(sObjectType, prefix);
257
+ }
258
+ return prefix;
259
+ }
260
+ /**
261
+ * Writes records to JSON files
262
+ * @param records
263
+ */
264
+ writeRecords(records, plan) {
265
+ const objectName = plan.name.replace('tffa__', '');
266
+ const outputDir = this.flags.outputdir;
267
+ const groupBy = plan.groupBy || '_';
268
+ (0, fs_extra_1.mkdirpSync)(outputDir);
269
+ const groupMap = new Map();
270
+ if (groupBy === '_') {
271
+ groupMap.set(groupBy, records);
272
+ }
273
+ else {
274
+ for (const record of records) {
275
+ const k = record[groupBy] || '_';
276
+ const group = groupMap.get(k) || groupMap.set(k, []).get(k);
277
+ group.push(record);
278
+ }
279
+ }
280
+ const filenames = [];
281
+ for (const [k, group] of groupMap.entries()) {
282
+ let batch = [];
283
+ let batchObjectCount = 0;
284
+ const batches = [batch];
285
+ for (const record of group) {
286
+ const count = this.getSObjectCount(record);
287
+ if (count + batchObjectCount > MAX_OBJECTS_IN_FILE) {
288
+ batch = [];
289
+ batches.push(batch);
290
+ batchObjectCount = 0;
291
+ }
292
+ batch.push(record);
293
+ batchObjectCount += count;
294
+ }
295
+ for (const [i, batch] of batches.entries()) {
296
+ const filename = `${objectName}${k === '_' ? '' : '-' + k}${i || ''}.json`;
297
+ const filepath = `${outputDir}/${filename}`;
298
+ this.log(`Writing ${batch.length} records to ${filepath}`);
299
+ (0, fs_extra_1.writeFileSync)(filepath, JSON.stringify({ records: batch }, null, 2));
300
+ filenames.push(filename);
301
+ }
302
+ }
303
+ if (!this.flags.skipconfigplan && plan.name === plan.sObjectType) {
304
+ const configPlanFilepath = `${outputDir}/config-data-plan.json`;
305
+ if ((0, fs_extra_1.existsSync)(configPlanFilepath)) {
306
+ const configPlans = JSON.parse((0, fs_extra_1.readFileSync)(configPlanFilepath, 'utf-8'));
307
+ let configPlan = configPlans.find(cp => cp.sobject === plan.sObjectType);
308
+ if (!configPlan) {
309
+ configPlan = { sobject: plan.sObjectType, files: [] };
310
+ configPlans.push(configPlan);
311
+ }
312
+ // update only if something changed
313
+ if (configPlan.files?.toString() !== filenames.toString()) {
314
+ configPlan.files = filenames;
315
+ (0, fs_extra_1.writeFileSync)(configPlanFilepath, JSON.stringify(configPlans, null, 2));
316
+ }
317
+ }
318
+ }
319
+ }
320
+ /**
321
+ * Counts the number of SObjects within the record. e.g. a record containing child relationships may contain more than one SObject.
322
+ * @param record
323
+ * @returns
324
+ */
325
+ getSObjectCount(record) {
326
+ return (JSON.stringify(record).match(REFERENCE_ID_RE) || []).length;
327
+ }
328
+ /**
329
+ * Gets the export plan for the specified object type.
330
+ * @param sObjectType
331
+ * @returns
332
+ */
333
+ getExportPlan(sObjectType) {
334
+ const plan = new ExportPlan({ sObjectType, ...(EXPORT_PLANS[sObjectType] || {}) });
335
+ const { sobjecttype: sobjecttypes, children, groupby, orderby } = this.flags;
336
+ if (sobjecttypes.length === 1 && sobjecttypes[0] === sObjectType) {
337
+ if (children) {
338
+ plan.children = children;
339
+ }
340
+ if (groupby) {
341
+ plan.groupBy = groupby;
342
+ }
343
+ if (orderby) {
344
+ plan.orderBy = orderby;
345
+ }
346
+ }
347
+ return plan;
348
+ }
349
+ async getChildExportPlan(sObjectType, relationshipName) {
350
+ const describeResult = await this.org.getConnection().describe$(sObjectType);
351
+ const relationship = describeResult.childRelationships.find(f => f.relationshipName === relationshipName);
352
+ if (!relationship) {
353
+ throw new Error(`Relationship ${relationshipName} not found on SObjectType ${sObjectType}`);
354
+ }
355
+ return this.getExportPlan(relationship.childSObject);
356
+ }
357
+ /**
358
+ * Returns a map of records where key is record.Id and value is record.
359
+ * @param records
360
+ * @returns
361
+ */
362
+ toMap(records) {
363
+ const recordMap = new Map();
364
+ for (const record of records) {
365
+ recordMap.set(record.Id, record);
366
+ }
367
+ return recordMap;
368
+ }
369
+ }
370
+ exports.default = DataExport;
371
+ DataExport.requiresUsername = true;
372
+ DataExport.description = messages.getMessage('commandDescription');
373
+ DataExport.examples = messages.getMessages('commandExamples');
374
+ DataExport.flagsConfig = {
375
+ sobjecttype: command_1.flags.array({ char: 's', required: true, description: messages.getMessage('sobjecttypeFlagDescription') }),
376
+ outputdir: command_1.flags.string({ char: 'd', description: messages.getMessage('outputdirFlagDescription'), default: './data/configuration' }),
377
+ groupby: command_1.flags.string({ char: 'g', required: false, description: messages.getMessage('groupbyFlagDescription') }),
378
+ orderby: command_1.flags.array({ char: 'o', required: false, description: messages.getMessage('orderbyFlagDescription') }),
379
+ children: command_1.flags.array({ char: 'c', required: false, description: messages.getMessage('childrenFlagDescription') }),
380
+ skipconfigplan: command_1.flags.boolean({ char: 's', required: false, description: messages.getMessage('skipconfigplanFlagDescription') })
381
+ };
382
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/commands/tffa/data/export.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,8 @@ class Meta extends command_1.SfdxCommand {
17
17
  }
18
18
  }
19
19
  exports.default = Meta;
20
- Meta.description = 'scan a sfdx project for metadata';
21
- Meta.examples = [`scan a sfdx project for metadata :\t$sfdx tffa:meta`];
20
+ Meta.description = 'Scan a sfdx project for generating metadata summary information';
21
+ Meta.examples = ['$ sfdx tffa:meta'];
22
22
  Meta.flagsConfig = {
23
23
  sourcefolder: command_1.flags.directory({
24
24
  char: 's',
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/commands/tffa/meta.ts"],"names":[],"mappings":";AAAA;;IAEI;;;AAEJ,iDAAyD;AACzD,2CAA+C;AAC/C,wFAAuD;AAEvD,MAAqB,IAAK,SAAQ,qBAAW;IA+B3C,8DAA8D;IACvD,KAAK,CAAC,GAAG;QACd,MAAM,kBAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,IAAI,oBAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC9G;IACH,CAAC;;AAtCH,uBAuCC;AAtCe,gBAAW,GAAG,kCAAkC,CAAC;AACjD,aAAQ,GAAG,CAAC,qDAAqD,CAAC,CAAC;AAEhE,gBAAW,GAAG;IAC7B,YAAY,EAAE,eAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,GAAG;KACb,CAAC;IACF,QAAQ,EAAE,eAAK,CAAC,SAAS,CAAC;QACxB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,GAAG;KACb,CAAC;IACF,UAAU,EAAE,eAAK,CAAC,SAAS,CAAC;QAC1B,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,GAAG;KACb,CAAC;IACF,MAAM,EAAE,eAAK,CAAC,IAAI,CAAC;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;QACjC,WAAW,EAAE,8BAA8B;KAC5C,CAAC;IACF,MAAM,EAAE,eAAK,CAAC,OAAO,CAAC;QACpB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,uBAAuB;KACrC,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/commands/tffa/meta.ts"],"names":[],"mappings":";AAAA;;IAEI;;;AAEJ,iDAAyD;AACzD,2CAA+C;AAC/C,wFAAuD;AAEvD,MAAqB,IAAK,SAAQ,qBAAW;IA+B3C,8DAA8D;IACvD,KAAK,CAAC,GAAG;QACd,MAAM,kBAAW,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,IAAI,oBAAS,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SAC9G;IACH,CAAC;;AAtCH,uBAuCC;AAtCe,gBAAW,GAAG,iEAAiE,CAAC;AAChF,aAAQ,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE7B,gBAAW,GAAG;IAC7B,YAAY,EAAE,eAAK,CAAC,SAAS,CAAC;QAC5B,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,GAAG;KACb,CAAC;IACF,QAAQ,EAAE,eAAK,CAAC,SAAS,CAAC;QACxB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,uBAAuB;QACpC,OAAO,EAAE,GAAG;KACb,CAAC;IACF,UAAU,EAAE,eAAK,CAAC,SAAS,CAAC;QAC1B,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,GAAG;KACb,CAAC;IACF,MAAM,EAAE,eAAK,CAAC,IAAI,CAAC;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC;QACjC,WAAW,EAAE,8BAA8B;KAC5C,CAAC;IACF,MAAM,EAAE,eAAK,CAAC,OAAO,CAAC;QACpB,IAAI,EAAE,GAAG;QACT,WAAW,EAAE,uBAAuB;KACrC,CAAC;CACH,CAAC"}
@@ -18,7 +18,7 @@ class LineReader {
18
18
  try {
19
19
  // NOTE: could use Node's os.EOL constant instead of the regexp
20
20
  // but hesitant because user could have EOL set contrary to the
21
- // platform they're on in . This might be safer in the end.
21
+ // platform they're on in. This might be safer in the end.
22
22
  const EOL = /(?:\r\n|[\r\n])/;
23
23
  this.content = (0, fs_1.readFileSync)(filePath).toString('utf8');
24
24
  this.lines = this.content.split(EOL);
@@ -1 +1 @@
1
- {"version":3,"file":"line-reader.js","sourceRoot":"","sources":["../../../../src/services/apexdoc/common/line-reader.ts"],"names":[],"mappings":";;;AAAA;;IAEI;AACJ,gFAA6C;AAE7C,2BAAkC;AAElC;;;;;GAKG;AACH,MAAM,UAAU;IAMd,YAAmB,QAAgB;QAJ3B,cAAS,GAAG,CAAC,CAAC;QAKpB,IAAI;YACF,+DAA+D;YAC/D,+DAA+D;YAC/D,2DAA2D;YAC3D,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;SAC9B;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,yBAAY,CAAC,CAAC,CAAC,CAAC;SAC3B;IACH,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;YAC7B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;SACf;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACI,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE;QAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,IAAI,IAAI,EAAE;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aACzD;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"line-reader.js","sourceRoot":"","sources":["../../../../src/services/apexdoc/common/line-reader.ts"],"names":[],"mappings":";;;AAAA;;IAEI;AACJ,gFAA6C;AAE7C,2BAAkC;AAElC;;;;;GAKG;AACH,MAAM,UAAU;IAMd,YAAmB,QAAgB;QAJ3B,cAAS,GAAG,CAAC,CAAC;QAKpB,IAAI;YACF,+DAA+D;YAC/D,+DAA+D;YAC/D,0DAA0D;YAC1D,MAAM,GAAG,GAAG,iBAAiB,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;SAC9B;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,IAAI,yBAAY,CAAC,CAAC,CAAC,CAAC;SAC3B;IACH,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,MAAM,CAAC;QACX,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;YAC7B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC;SACf;QAED,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;YACjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;SACvC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACI,QAAQ,CAAC,IAAI,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE;QAC1C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACrB,IAAI,IAAI,EAAE;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aACzD;YAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SACnC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,IAAI,CAAC,KAAK,CAAC;SACnB;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
@@ -19,14 +19,25 @@ class SourceMarkupGenerator extends markup_generator_1.default {
19
19
  return '';
20
20
  }
21
21
  }
22
- const source = model.source.replace(/</g, '&lt').replace(/>/g, '&gt');
22
+ let source = model.source;
23
23
  if (model.groupName === 'Pages') {
24
+ source = source.replace(/</g, '&lt').replace(/>/g, '&gt');
24
25
  markup = `<div class="subsection code">
25
26
  <h3 class="subsection-title code">${model.name} Code</h3>
26
27
  <pre class="code-example"><code class="language-xml">${source}</code></pre>
27
28
  </div>`;
28
29
  }
29
30
  else {
31
+ const NS = 'tffa';
32
+ const classNames = new Set(Array.from(models.values()).map(p => p.name));
33
+ const className = model.name;
34
+ source = source.replace(/[']?\w+__[cr][']?/g, word => {
35
+ return word.startsWith("'") || word.indexOf('__') !== word.length - 3 ? word : `${NS}__${word}`;
36
+ });
37
+ source = source.replace(/[.'a-z0-9]?[A-Z]\w+/g, word => {
38
+ return !classNames.has(word) || word === className ? word : `${NS}.${word}`;
39
+ });
40
+ source = source.replace(/</g, '&lt').replace(/>/g, '&gt');
30
41
  markup = `<div class="subsection code">
31
42
  <h3 class="subsection-title code">${model.name} Code</h3>
32
43
  <pre class="code-example"><code class="language-java">${source}</code></pre>
@@ -1 +1 @@
1
- {"version":3,"file":"source-markup-generator.js","sourceRoot":"","sources":["../../../../../../src/services/apexdoc/engine/generators/models/source-markup-generator.ts"],"names":[],"mappings":";;;AAAA;;IAEI;AACJ,kFAAiD;AACjD,mDAAmE;AAEnE,MAAM,qBAAsB,SAAQ,0BAA8B;IAChE,YAAsB,KAAoB,EAAE,MAAkC;QAC5E,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,KAAoB,EAAE,MAAkC;QAC7E,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAAI,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,mBAAU,EAAE;YAC/B,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,OAAO,EAAE,CAAC;aACX;SACF;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;YAC/B,MAAM,GAAG;gDACiC,KAAK,CAAC,IAAI;mEACS,MAAM;mBACtD,CAAC;SACf;aAAM;YACL,MAAM,GAAG;gDACiC,KAAK,CAAC,IAAI;oEACU,MAAM;mBACvD,CAAC;SACf;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,kBAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"source-markup-generator.js","sourceRoot":"","sources":["../../../../../../src/services/apexdoc/engine/generators/models/source-markup-generator.ts"],"names":[],"mappings":";;;AAAA;;IAEI;AACJ,kFAAiD;AACjD,mDAAmE;AAEnE,MAAM,qBAAsB,SAAQ,0BAA8B;IAChE,YAAsB,KAAoB,EAAE,MAAkC;QAC5E,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,QAAQ,CAAC,KAAoB,EAAE,MAAkC;QAC7E,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAAI,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE3D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,mBAAU,EAAE;YAC/B,IAAI,KAAK,CAAC,YAAY,EAAE;gBACtB,OAAO,EAAE,CAAC;aACX;SACF;QACD,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC1B,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;YAC/B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,GAAG;gDACiC,KAAK,CAAC,IAAI;mEACS,MAAM;mBACtD,CAAC;SACf;aAAM;YACL,MAAM,EAAE,GAAG,MAAM,CAAC;YAClB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE;gBACnD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC;YAClG,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE;gBACrD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YAC9E,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,GAAG;gDACiC,KAAK,CAAC,IAAI;oEACU,MAAM;mBACvD,CAAC;SACf;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,kBAAe,qBAAqB,CAAC"}
@@ -62,7 +62,7 @@ Rules.customrules = {
62
62
  label: 'Instances of (tffa\\.AbstractRepository\\.|tffa\\.AbstractController\\.|tffa\\.AbstractRESTService\\.)',
63
63
  category: 'INTERNAL',
64
64
  level: 'FATAL',
65
- message: 'Do not call methods directly of an abstract class . Extend the abstract class and use methods directly'
65
+ message: 'Do not call methods directly of an abstract class. Extend the abstract class and use methods directly'
66
66
  },
67
67
  SOQL_REPOSITORY: {
68
68
  label: 'Instances of (\\[select |\\[update |\\[upsert |\\[delete |\\bDatabase\\.query\\b|\\bDatabase\\.update\\b|\\bDatabase\\.insert\\b|\\bDatabase\\.upsert\\b|\\bDatabase\\.delete\\b)',
@@ -80,7 +80,7 @@ Rules.customrules = {
80
80
  label: 'Instances of (System\\.assertEquals\\(true\\, true\\)|System\\.assertNotEquals\\(true\\, false\\)|System\\.assertNotEquals\\(false\\, true\\)|System\\.assert\\(true\\))',
81
81
  category: 'PMD',
82
82
  level: 'FATAL',
83
- message: 'Apex unit tests should include at least one assertion . Do not hard code values. Use proper variables'
83
+ message: 'Apex unit tests should include at least one assertion. Do not hard code values. Use proper variables'
84
84
  }
85
85
  };
86
86
  //# sourceMappingURL=rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/services/lint/rules.ts"],"names":[],"mappings":";;;;AAAA;;IAEI;AACJ,sFAAqD;AASrD,MAAa,KAAK;;AAAlB,sBA6EC;AA5Ee,iBAAW,GAAyB;IAChD,oBAAoB,EAAE;QACpB,KAAK,EAAE,oCAAoC;QAC3C,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,uBAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;KACnG;IACD,sBAAsB,EAAE;QACtB,KAAK,EAAE,0CAA0C;QACjD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,+DAA+D;KACzE;IACD,wBAAwB,EAAE;QACxB,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,6DAA6D;KACvE;IACD,uBAAuB,EAAE;QACvB,KAAK,EAAE,+CAA+C;QACtD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,0EAA0E;KACpF;IACD,eAAe,EAAE;QACf,KAAK,EAAE,uDAAuD;QAC9D,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,oFAAoF;KAC9F;IACD,aAAa,EAAE;QACb,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,oGAAoG;KAC9G;IACD,cAAc,EAAE;QACd,KAAK,EAAE,gCAAgC;QACvC,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,mFAAmF;KAC7F;IACD,mBAAmB,EAAE;QACnB,KAAK,EAAE,2DAA2D;QAClE,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,qDAAqD;KAC/D;IACD,qBAAqB,EAAE;QACrB,KAAK,EAAE,wGAAwG;QAC/G,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,wGAAwG;KAClH;IACD,eAAe,EAAE;QACf,KAAK,EACH,mLAAmL;QACrL,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,gHAAgH;KAC1H;IACD,mBAAmB,EAAE;QACnB,KAAK,EAAE,+BAA+B;QACtC,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,iDAAiD;KAC3D;IACD,2BAA2B,EAAE;QAC3B,KAAK,EACH,2KAA2K;QAC7K,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,uGAAuG;KACjH;CACF,CAAC"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/services/lint/rules.ts"],"names":[],"mappings":";;;;AAAA;;IAEI;AACJ,sFAAqD;AASrD,MAAa,KAAK;;AAAlB,sBA6EC;AA5Ee,iBAAW,GAAyB;IAChD,oBAAoB,EAAE;QACpB,KAAK,EAAE,oCAAoC;QAC3C,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,uBAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;KACnG;IACD,sBAAsB,EAAE;QACtB,KAAK,EAAE,0CAA0C;QACjD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,+DAA+D;KACzE;IACD,wBAAwB,EAAE;QACxB,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,6DAA6D;KACvE;IACD,uBAAuB,EAAE;QACvB,KAAK,EAAE,+CAA+C;QACtD,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,0EAA0E;KACpF;IACD,eAAe,EAAE;QACf,KAAK,EAAE,uDAAuD;QAC9D,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,oFAAoF;KAC9F;IACD,aAAa,EAAE;QACb,KAAK,EAAE,sCAAsC;QAC7C,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,oGAAoG;KAC9G;IACD,cAAc,EAAE;QACd,KAAK,EAAE,gCAAgC;QACvC,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,mFAAmF;KAC7F;IACD,mBAAmB,EAAE;QACnB,KAAK,EAAE,2DAA2D;QAClE,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,qDAAqD;KAC/D;IACD,qBAAqB,EAAE;QACrB,KAAK,EAAE,wGAAwG;QAC/G,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,uGAAuG;KACjH;IACD,eAAe,EAAE;QACf,KAAK,EACH,mLAAmL;QACrL,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,gHAAgH;KAC1H;IACD,mBAAmB,EAAE;QACnB,KAAK,EAAE,+BAA+B;QACtC,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,iDAAiD;KAC3D;IACD,2BAA2B,EAAE;QAC3B,KAAK,EACH,2KAA2K;QAC7K,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,sGAAsG;KAChH;CACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "commandDescription": "Generate Apex API Documentation",
2
+ "commandDescription": "Command to generate apex documentation similar to javadoc based on the comments in apex classes.\nPlease read more at [Documenting Apex Classes](development-guidelines/documentation).\nOnce generated you can use vscode plugin [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) and select index.html from generated folder and run Open with LiveServer to render the html",
3
3
  "sourceFolderDescription": "directory containing sfdx project",
4
4
  "destFolderDescription": "directory to generate the api docs"
5
5
  }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Copyright (c) NCR Terafina
3
+ **/
4
+ module.exports = {
5
+ commandDescription: `Exports records of specified sobject types from target org into JSON file(s). Primarily used for exporting business configurations.
6
+ The export command requires a target org for exporting records. Run this command from within a sfdx project containing a default username or specify targetusername explicitly.`,
7
+ sobjecttypeFlagDescription: 'sobject types of records to be exported',
8
+ outputdirFlagDescription: 'output directory where the JSON files of exported records will be placed',
9
+ groupbyFlagDescription:
10
+ 'the field to be used for grouping the exported records; records belonging to each group are placed in separate JSON files (filename suffixed by group name)',
11
+ orderbyFlagDescription: 'the fields to be used for sorting the exported records',
12
+ childrenFlagDescription:
13
+ 'the child relationships to be included in the exported records; this is not required for tffa package objects. e.g. tffa__Features__r,tffa__Terms__r child relationships are auto included when running export command for tffa__Product__c',
14
+ skipconfigplanFlagDescription: 'skip import of exported record JSON files into configuration plan',
15
+ commandExamples: [
16
+ `$ sfdx tffa:data:export --sobjecttype tffa__Product__c
17
+ Fetched 101 records of tffa__Product__c
18
+ Writing 24 records to ./data/configuration/Product__c.json
19
+ Writing 30 records to ./data/configuration/Product__c1.json
20
+ Writing 20 records to ./data/configuration/Product__c2.json
21
+ Writing 27 records to ./data/configuration/Product__c3.json
22
+ `,
23
+ `$ sfdx tffa:data:export --sobjecttype tffa__DisclosureTemplate__c,tffa__DisclosureChecklist__c,tffa__DisclosureMatrix__c
24
+ Fetched 81 records of tffa__DisclosureTemplate__c
25
+ Writing 81 records to ./data/configuration/DisclosureTemplate__c.json
26
+ Fetched 57 records of tffa__DisclosureChecklist__c
27
+ Writing 57 records to ./data/configuration/DisclosureChecklist__c.json
28
+ Fetched 144 records of tffa__DisclosureMatrix__c
29
+ Writing 144 records to ./data/configuration/DisclosureMatrix__c.json
30
+ `
31
+ ]
32
+ };
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Copyright (c) NCR Terafina
3
+ **/
4
+ module.exports = {
5
+ commandDescription: `Scans a sfdx project and provide a violations report based on defined standards.
6
+ Performs static analysis of source code with a command-line interface and report output.
7
+ The command creates "Rule Violations" when the it identifies issues. Developers use this information as feedback to fix their code.
8
+
9
+ The rules used in the lint command are:
10
+
11
+ - [Apex PMD](https://pmd.github.io/latest/pmd_rules_apex.html) to statically analyse Apex Code to find design, performance and security vulnerabilities. It allowes us to have a better quality and avoid maintenance, performance and bug problems in our Apex code. for Salesforce apex classes are scans during build and development process.
12
+ - Custom rules
13
+ - Custom Objects should have a description
14
+ - Custom Fields should have a description'
15
+ - Custom fields should not contain underscores.
16
+ - Custom fields in managed object should start with CZ.
17
+ - Custom objects should start with CZ.
18
+ - Using Metadata API Version and Project source api version should be the latest supported.
19
+ - Files violating naming conventions
20
+ - Do not use isCreateable, isAccessible, isUpdateable, CRUD/FLS Checks are checked by tffa.AbstractRepository
21
+ - Do not call methods directly of an abstract class. Call methods from Repository classes extending tffa.AbstractRepository
22
+ - Do not call methods directly of an abstract class. Call methods from Controllers classes extending tffa.AbstractController',
23
+ - Do not call methods directly of an abstract class. Call methods from RESTService classes extending tffa.AbstractRESTService
24
+ - Any SOQL should be encapsulated into Repository classes extending tffa.AbstractRepository. Use doQuery method
25
+ - Do not supress PMD warnings using @SupressWarnings
26
+
27
+ The lint command is integrated into the jenkins build to report violations and fail builds
28
+ `,
29
+ flagApiversionDescription: 'minimum api version to use during quality checks',
30
+ sourceFolderDescription: 'directory containing sfdx project'
31
+ };
@@ -1,3 +1,3 @@
1
1
  {
2
- "commandDescription": "ping and test the plugin"
2
+ "commandDescription": "Ping and test the plugin"
3
3
  }