@salesforce/plugin-custom-metadata 1.0.11 → 2.0.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +23 -7
  2. package/LICENSE.txt +2 -2
  3. package/README.md +153 -149
  4. package/lib/commands/force/cmdt/create.d.ts +12 -6
  5. package/lib/commands/force/cmdt/create.js +80 -82
  6. package/lib/commands/force/cmdt/create.js.map +1 -1
  7. package/lib/commands/force/cmdt/field/create.d.ts +10 -5
  8. package/lib/commands/force/cmdt/field/create.js +98 -90
  9. package/lib/commands/force/cmdt/field/create.js.map +1 -1
  10. package/lib/commands/force/cmdt/generate.d.ts +12 -8
  11. package/lib/commands/force/cmdt/generate.js +199 -257
  12. package/lib/commands/force/cmdt/generate.js.map +1 -1
  13. package/lib/commands/force/cmdt/record/create.d.ts +20 -9
  14. package/lib/commands/force/cmdt/record/create.js +123 -125
  15. package/lib/commands/force/cmdt/record/create.js.map +1 -1
  16. package/lib/commands/force/cmdt/record/insert.d.ts +7 -7
  17. package/lib/commands/force/cmdt/record/insert.js +97 -109
  18. package/lib/commands/force/cmdt/record/insert.js.map +1 -1
  19. package/lib/index.js +3 -3
  20. package/lib/lib/helpers/createUtil.d.ts +10 -6
  21. package/lib/lib/helpers/createUtil.js +50 -98
  22. package/lib/lib/helpers/createUtil.js.map +1 -1
  23. package/lib/lib/helpers/fileWriter.d.ts +13 -11
  24. package/lib/lib/helpers/fileWriter.js +19 -27
  25. package/lib/lib/helpers/fileWriter.js.map +1 -1
  26. package/lib/lib/helpers/metadataUtil.d.ts +25 -51
  27. package/lib/lib/helpers/metadataUtil.js +58 -127
  28. package/lib/lib/helpers/metadataUtil.js.map +1 -1
  29. package/lib/lib/helpers/validationUtil.d.ts +25 -26
  30. package/lib/lib/helpers/validationUtil.js +69 -43
  31. package/lib/lib/helpers/validationUtil.js.map +1 -1
  32. package/lib/lib/interfaces/createConfig.d.ts +3 -2
  33. package/lib/lib/interfaces/createConfig.js +3 -3
  34. package/lib/lib/templates/templates.d.ts +10 -99
  35. package/lib/lib/templates/templates.js +52 -40
  36. package/lib/lib/templates/templates.js.map +1 -1
  37. package/messages/createField.json +22 -31
  38. package/messages/generate.json +38 -51
  39. package/messages/template.json +2 -2
  40. package/messages/validation.json +5 -0
  41. package/oclif.manifest.json +1 -1
  42. package/package.json +57 -46
  43. package/lib/lib/interfaces/customField.d.ts +0 -7
  44. package/lib/lib/interfaces/customField.js +0 -9
  45. package/lib/lib/interfaces/customField.js.map +0 -1
  46. package/lib/lib/interfaces/errorMessage.d.ts +0 -4
  47. package/lib/lib/interfaces/errorMessage.js +0 -9
  48. package/lib/lib/interfaces/errorMessage.js.map +0 -1
  49. package/lib/lib/interfaces/record.d.ts +0 -3
  50. package/lib/lib/interfaces/record.js +0 -9
  51. package/lib/lib/interfaces/record.js.map +0 -1
  52. package/lib/lib/interfaces/saveResults.d.ts +0 -5
  53. package/lib/lib/interfaces/saveResults.js +0 -9
  54. package/lib/lib/interfaces/saveResults.js.map +0 -1
@@ -1,35 +1,34 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateUtil = void 0;
2
4
  /*
3
- * Copyright (c) 2018-2020, salesforce.com, inc.
5
+ * Copyright (c) 2020, salesforce.com, inc.
4
6
  * All rights reserved.
5
- * SPDX-License-Identifier: BSD-3-Clause
6
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
+ * Licensed under the BSD 3-Clause license.
8
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
9
  */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.CreateUtil = void 0;
10
- const command_1 = require("@salesforce/command");
11
- const xml2js_1 = require("xml2js");
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+ const fast_xml_parser_1 = require("fast-xml-parser");
12
13
  const templates_1 = require("../templates/templates");
14
+ const fieldTypeMap = {
15
+ Checkbox: 'boolean',
16
+ Date: 'date',
17
+ DateTime: 'dateTime',
18
+ Email: 'string',
19
+ Phone: 'string',
20
+ Picklist: 'string',
21
+ Text: 'string',
22
+ TextArea: 'string',
23
+ LongTextArea: 'string',
24
+ Url: 'string',
25
+ };
13
26
  // NOTE: the template string indentation is important to output well-formatted XML. Altering that whitespace will change the whitespace of the output.
14
27
  class CreateUtil {
15
28
  /**
16
29
  * Number and Percent types will be int or double depending on their respective scale values.
17
30
  * If the scale === 0, it is an int, otherwise it is a double
18
31
  */
19
- constructor() {
20
- this.fieldTypeMap = {
21
- Checkbox: 'boolean',
22
- Date: 'date',
23
- DateTime: 'dateTime',
24
- Email: 'string',
25
- Phone: 'string',
26
- Picklist: 'string',
27
- Text: 'string',
28
- TextArea: 'string',
29
- LongTextArea: 'string',
30
- Url: 'string'
31
- };
32
- }
33
32
  /**
34
33
  * Creates the Custom Metadata Record
35
34
  *
@@ -37,24 +36,24 @@ class CreateUtil {
37
36
  * @return void
38
37
  */
39
38
  async createRecord(createConfig) {
40
- const outputFilePath = `${createConfig.outputdir}/${createConfig.typename}.${createConfig.recordname}.md-meta.xml`;
39
+ const outputFilePath = path.join(createConfig.outputdir, `${createConfig.typename}.${createConfig.recordname}.md-meta.xml`);
41
40
  const newRecordContent = this.getRecordTemplate(createConfig.label, createConfig.protected, this.buildCustomFieldXml(createConfig.fileData, createConfig.varargs, createConfig.ignorefields));
42
- return command_1.core.fs.writeFile(outputFilePath, newRecordContent);
41
+ return fs.promises.writeFile(outputFilePath, newRecordContent);
43
42
  }
43
+ /**
44
+ *
45
+ * @param fieldDirPath path to a /fields folder that contains all the fields to read
46
+ * @param fileNames filenames in that folder that should be read
47
+ * @returns CustomField[]
48
+ */
44
49
  async getFileData(fieldDirPath, fileNames) {
45
- const ret = [];
46
- let filePath = '';
47
- let fileData;
48
- let str = '';
49
- for (const file of fileNames) {
50
- filePath = `${fieldDirPath}/${file}`;
51
- fileData = await command_1.core.fs.readFile(filePath);
52
- str = fileData.toString('utf8');
53
- xml2js_1.parseString(str, (err, res) => {
54
- ret.push(res);
55
- });
56
- }
57
- return ret;
50
+ const parser = new fast_xml_parser_1.XMLParser();
51
+ return Promise.all(fileNames
52
+ .map((file) => path.join(fieldDirPath, file))
53
+ .map(async (filePath) => {
54
+ const fileData = await fs.promises.readFile(filePath, 'utf8');
55
+ return parser.parse(fileData).CustomField;
56
+ }));
58
57
  }
59
58
  /**
60
59
  * Filenames should have the suffix of '__mdt'. This will append that suffix if it does not exist.
@@ -62,12 +61,7 @@ class CreateUtil {
62
61
  * @param typename Name of file
63
62
  */
64
63
  appendDirectorySuffix(typename) {
65
- if (typename.endsWith('__mdt')) {
66
- return typename;
67
- }
68
- else {
69
- return typename + '__mdt';
70
- }
64
+ return typename.endsWith('__mdt') ? typename : `${typename}__mdt`;
71
65
  }
72
66
  /**
73
67
  * Get the field primitive type from the custom metadata type that has a matching field name.
@@ -76,24 +70,12 @@ class CreateUtil {
76
70
  * @param fieldName Name of the field
77
71
  * @return {string} Type used by a custom metadata record
78
72
  */
79
- getFieldPrimitiveType(fileData = [], fieldName = '') {
80
- let thisFieldName = '';
81
- let type = '';
82
- let ret = 'string';
83
- for (const file of fileData) {
84
- thisFieldName = file.CustomField.fullName[0];
85
- type = file.CustomField.type[0];
86
- if (type === 'Number' || type === 'Percent') {
87
- ret = this.getNumberType(type, file.CustomField.scale[0]);
88
- }
89
- else {
90
- ret = this.fieldTypeMap[type];
91
- }
92
- if (thisFieldName === fieldName) {
93
- return ret;
94
- }
95
- }
96
- return ret;
73
+ getFieldPrimitiveType(fileData = [], fieldName) {
74
+ var _a;
75
+ const matchingFile = fileData.find((file) => file.fullName === fieldName);
76
+ return matchingFile && ['Number', 'Percent'].includes(matchingFile.type)
77
+ ? this.getNumberType(matchingFile.type, matchingFile.scale)
78
+ : (_a = fieldTypeMap[matchingFile === null || matchingFile === void 0 ? void 0 : matchingFile.type]) !== null && _a !== void 0 ? _a : 'string';
97
79
  }
98
80
  /**
99
81
  * Get the field type from the custom metadata type that has a matching field name.
@@ -103,15 +85,8 @@ class CreateUtil {
103
85
  * @return {string} Data Type of the field.
104
86
  */
105
87
  getFieldDataType(fileData = [], fieldName = '') {
106
- let thisFieldName = '';
107
- let type = '';
108
- for (const file of fileData) {
109
- thisFieldName = file.CustomField.fullName[0];
110
- type = file.CustomField.type[0];
111
- if (thisFieldName === fieldName) {
112
- return type;
113
- }
114
- }
88
+ var _a;
89
+ return (_a = fileData.find((file) => file.fullName === fieldName)) === null || _a === void 0 ? void 0 : _a.type;
115
90
  }
116
91
  /**
117
92
  * Goes through the file data that has been genreated and gets all of the field names and adds the
@@ -122,13 +97,7 @@ class CreateUtil {
122
97
  * @return [] Array of field names
123
98
  */
124
99
  getFieldNames(fileData, nameField) {
125
- const metadataTypeFields = [];
126
- for (const file of fileData) {
127
- const fullName = file.CustomField.fullName[0];
128
- metadataTypeFields.push(fullName);
129
- }
130
- metadataTypeFields.push(nameField);
131
- return metadataTypeFields;
100
+ return [...fileData.map((file) => file.fullName), nameField];
132
101
  }
133
102
  /**
134
103
  * Takes JSON representation of CLI varargs and converts them to xml with help
@@ -140,21 +109,14 @@ class CreateUtil {
140
109
  */
141
110
  buildCustomFieldXml(fileData, cliParams, ignoreFields) {
142
111
  let ret = '';
143
- let type = '';
144
- let dataType = '';
145
112
  const templates = new templates_1.Templates();
146
113
  for (const fieldName of Object.keys(cliParams)) {
147
- type = this.getFieldPrimitiveType(fileData, fieldName);
148
- dataType = this.getFieldDataType(fileData, fieldName);
114
+ const type = this.getFieldPrimitiveType(fileData, fieldName);
115
+ const dataType = this.getFieldDataType(fileData, fieldName);
149
116
  // Added functionality to handle the igonre fields scenario.
150
- if (templates.canConvert(dataType)) {
117
+ if (templates.canConvert(dataType) || !ignoreFields) {
151
118
  ret += this.getFieldTemplate(fieldName, cliParams[fieldName], type);
152
119
  }
153
- else {
154
- if (!ignoreFields) {
155
- ret += this.getFieldTemplate(fieldName, cliParams[fieldName], type);
156
- }
157
- }
158
120
  }
159
121
  return ret;
160
122
  }
@@ -167,10 +129,7 @@ class CreateUtil {
167
129
  * @return {string} int or double
168
130
  */
169
131
  getNumberType(type, scale) {
170
- if (type === 'Number' && parseFloat(scale) === 0 || type === 'Percent' && parseFloat(scale) === 0) {
171
- return 'int';
172
- }
173
- return 'double';
132
+ return ['Number', 'Percent'].includes(type) && scale === 0 ? 'int' : 'double';
174
133
  }
175
134
  /**
176
135
  * Template for a single customMetadata record value. This is used by helper.getRecordTemplate.
@@ -181,15 +140,8 @@ class CreateUtil {
181
140
  * @return {string} String representation of XML
182
141
  */
183
142
  getFieldTemplate(fieldName, val, type) {
184
- // update to handle the null situation
185
- let value = '';
186
143
  const cleanValue = String(val).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
187
- if (val === null || val === '') {
188
- value = '<value xsi:nil="true"/>';
189
- }
190
- else {
191
- value = `<value xsi:type="xsd:${type}">${cleanValue}</value>`;
192
- }
144
+ const value = val === null || val === '' ? '<value xsi:nil="true"/>' : `<value xsi:type="xsd:${type}">${cleanValue}</value>`;
193
145
  return `
194
146
  <values>
195
147
  <field>${fieldName}</field>
@@ -1 +1 @@
1
- {"version":3,"file":"createUtil.js","sourceRoot":"","sources":["../../../src/lib/helpers/createUtil.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createUtil.js","sourceRoot":"","sources":["../../../src/lib/helpers/createUtil.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,27 @@
1
+ /// <reference types="node" />
2
+ import * as fs from 'fs';
3
+ interface FileWriterResult {
4
+ dir: string;
5
+ fileName: string;
6
+ updated: boolean;
7
+ }
1
8
  export declare class FileWriter {
2
9
  /**
3
10
  * Using the given file system, creates a file representing a new custom metadata type.
11
+ *
4
12
  * @param fs
5
13
  * @param devname
6
14
  * @param objectXML
7
15
  */
8
- writeTypeFile(corefs: any, dir: string, devName: string, objectXML: string): Promise<{
9
- dir: string;
10
- fileName: string;
11
- updated: boolean;
12
- }>;
16
+ writeTypeFile(corefs: typeof fs, dir: string, devName: string, objectXML: string): Promise<FileWriterResult>;
13
17
  /**
14
18
  * Using the given file system, creates a file representing a new field for the given custom metadata type
19
+ *
15
20
  * @param fs
16
21
  * @param fieldname
17
22
  * @param fieldXML
18
23
  */
19
- writeFieldFile(corefs: any, dir: any, fieldName: any, fieldXML: any): Promise<{
20
- dir: string;
21
- fileName: string;
22
- updated: boolean;
23
- }>;
24
- createDir(dir: any): any;
24
+ writeFieldFile(corefs: typeof fs, dir: string, fieldName: string, fieldXML: string): Promise<FileWriterResult>;
25
25
  }
26
+ export declare const removeTrailingSlash: (dir: string) => string;
27
+ export {};
@@ -1,23 +1,24 @@
1
1
  "use strict";
2
2
  /*
3
- * Copyright (c) 2018-2020, salesforce.com, inc.
3
+ * Copyright (c) 2020, salesforce.com, inc.
4
4
  * All rights reserved.
5
- * SPDX-License-Identifier: BSD-3-Clause
6
- * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
5
+ * Licensed under the BSD 3-Clause license.
6
+ * For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.FileWriter = void 0;
9
+ exports.removeTrailingSlash = exports.FileWriter = void 0;
10
10
  const fs = require("fs");
11
+ const path = require("path");
11
12
  class FileWriter {
12
13
  /**
13
14
  * Using the given file system, creates a file representing a new custom metadata type.
15
+ *
14
16
  * @param fs
15
17
  * @param devname
16
18
  * @param objectXML
17
19
  */
18
- async writeTypeFile(corefs, dir, devName, objectXML) {
20
+ async writeTypeFile(corefs = fs, dir, devName, objectXML) {
19
21
  let apiName = devName;
20
- const dirName = this.createDir(dir);
21
22
  // replace __c with __mdt
22
23
  if (apiName.endsWith('__c')) {
23
24
  apiName = apiName.replace('__c', '__mdt');
@@ -26,44 +27,35 @@ class FileWriter {
26
27
  if (!apiName.endsWith('__mdt')) {
27
28
  apiName += '__mdt';
28
29
  }
29
- const outputFilePath = `${dirName}${apiName}/`;
30
+ const outputFilePath = path.join((0, exports.removeTrailingSlash)(dir), apiName);
30
31
  const fileName = `${apiName}.object-meta.xml`;
31
- const updated = fs.existsSync(outputFilePath + fileName);
32
- await corefs.mkdirp(`${dirName}${apiName}`);
33
- await corefs.writeFile(outputFilePath + fileName, objectXML);
32
+ const updated = fs.existsSync(path.join(outputFilePath, fileName));
33
+ await corefs.promises.mkdir(outputFilePath, { recursive: true });
34
+ await corefs.promises.writeFile(path.join(outputFilePath, fileName), objectXML);
34
35
  return { dir: outputFilePath, fileName, updated };
35
36
  }
36
37
  /**
37
38
  * Using the given file system, creates a file representing a new field for the given custom metadata type
39
+ *
38
40
  * @param fs
39
41
  * @param fieldname
40
42
  * @param fieldXML
41
43
  */
42
44
  // /fields/{fieldAPI}.field-meta.xml
43
- async writeFieldFile(corefs, dir, fieldName, fieldXML) {
44
- const dirName = this.createDir(dir);
45
+ async writeFieldFile(corefs = fs, dir, fieldName, fieldXML) {
45
46
  // appending __c if its not already there
46
47
  if (fieldName.endsWith('__c') === false) {
47
48
  fieldName += '__c';
48
49
  }
49
- const outputFilePath = `${dirName}fields/`;
50
+ const outputFilePath = path.join((0, exports.removeTrailingSlash)(dir), 'fields');
50
51
  const fileName = `${fieldName}.field-meta.xml`;
51
- const updated = fs.existsSync(outputFilePath + fileName);
52
- await corefs.mkdirp(`${dirName}fields`);
53
- await corefs.writeFile(outputFilePath + fileName, fieldXML);
52
+ const updated = fs.existsSync(path.join(outputFilePath, fileName));
53
+ await corefs.promises.mkdir(outputFilePath, { recursive: true });
54
+ await corefs.promises.writeFile(path.join(outputFilePath, fileName), fieldXML);
54
55
  return { dir: outputFilePath, fileName, updated };
55
56
  }
56
- createDir(dir) {
57
- if (dir) {
58
- if (dir.endsWith('/')) {
59
- return dir;
60
- }
61
- else {
62
- return dir + '/';
63
- }
64
- }
65
- return '';
66
- }
67
57
  }
68
58
  exports.FileWriter = FileWriter;
59
+ const removeTrailingSlash = (dir) => dir.replace(/\/+$/, '');
60
+ exports.removeTrailingSlash = removeTrailingSlash;
69
61
  //# sourceMappingURL=fileWriter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../src/lib/helpers/fileWriter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yBAAyB;AAEzB,MAAa,UAAU;IAEnB;;;;;OAKG;IACI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAG,GAAW,EAAE,OAAe,EAAE,SAAiB;QAC/E,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEpC,yBAAyB;QACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACzB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SAC7C;QAED,8CAA8C;QAC9C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC5B,OAAO,IAAI,OAAO,CAAC;SACtB;QAED,MAAM,cAAc,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,CAAC;QAC/C,MAAM,QAAQ,GAAG,GAAG,OAAO,kBAAkB,CAAC;QAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC;QAEzD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,OAAO,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE7D,OAAO,EAAE,GAAG,EAAG,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,oCAAoC;IAC7B,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEpC,yCAAyC;QACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YACrC,SAAS,IAAI,KAAK,CAAC;SACtB;QACD,MAAM,cAAc,GAAG,GAAG,OAAO,SAAS,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,SAAS,iBAAiB,CAAC;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC;QACzD,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,SAAS,CAAC,cAAc,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE5D,OAAO,EAAE,GAAG,EAAG,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAC,CAAC;IACtD,CAAC;IAEM,SAAS,CAAC,GAAG;QAChB,IAAI,GAAG,EAAE;YACL,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACnB,OAAO,GAAG,CAAC;aACd;iBAAM;gBACH,OAAO,GAAG,GAAG,GAAG,CAAC;aACpB;SACJ;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ;AAjED,gCAiEC"}
1
+ {"version":3,"file":"fileWriter.js","sourceRoot":"","sources":["../../../src/lib/helpers/fileWriter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yBAAyB;AACzB,6BAA6B;AAQ7B,MAAa,UAAU;IACrB;;;;;;OAMG;IACI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,EAAE,EAAE,GAAW,EAAE,OAAe,EAAE,SAAiB;QACrF,IAAI,OAAO,GAAG,OAAO,CAAC;QAEtB,yBAAyB;QACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SAC3C;QAED,8CAA8C;QAC9C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;YAC9B,OAAO,IAAI,OAAO,CAAC;SACpB;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,GAAG,OAAO,kBAAkB,CAAC;QAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEnE,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEhF,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,oCAAoC;IAC7B,KAAK,CAAC,cAAc,CACzB,MAAM,GAAG,EAAE,EACX,GAAW,EACX,SAAiB,EACjB,QAAgB;QAEhB,yCAAyC;QACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YACvC,SAAS,IAAI,KAAK,CAAC;SACpB;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,GAAG,SAAS,iBAAiB,CAAC;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE/E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpD,CAAC;CACF;AAzDD,gCAyDC;AAEM,MAAM,mBAAmB,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAAvE,QAAA,mBAAmB,uBAAoD"}
@@ -1,51 +1,25 @@
1
- import { core } from '@salesforce/command';
2
- import { AnyJson } from '@salesforce/ts-types';
3
- export declare class MetadataUtil {
4
- private conn;
5
- constructor(connection: core.Connection);
6
- /**
7
- * Returns a describe object from the API name you specify
8
- *
9
- * @param objName API name of the object
10
- * @returns Promise - JSON representation of the describe object
11
- */
12
- describeObj(objName: string): Promise<AnyJson>;
13
- /**
14
- * Returns an array of object records from a SOQL query
15
- *
16
- * @param soqlStr String representation of the SOQL query
17
- * @returns Promise - Array of records in JSON format
18
- */
19
- queryObject(soqlStr: string): Promise<AnyJson>;
20
- /**
21
- * Returns an array of object records
22
- *
23
- * @param describeResult object describe result
24
- * @returns Promise - Promise - Array of records in JSON format
25
- */
26
- queryRecords(describeResult: AnyJson): Promise<AnyJson>;
27
- /**
28
- * Returns describe object for the field API name from the Object API name you specify
29
- *
30
- * @param objDescribe describe object JSON
31
- * @param fieldName API name of the field to query
32
- * @returns Promise - Promise - record in JSON format
33
- */
34
- describeField(objDescribe: AnyJson, fieldName: string): AnyJson;
35
- /**
36
- * Returns describe object for all fields from the object API name you specify
37
- *
38
- * @param objDescribe object describe JSON
39
- * @returns Promise - Promise - record in JSON format
40
- */
41
- describeObjFields(objDescribe: AnyJson): AnyJson;
42
- /**
43
- * Returns true if the object name you specify is a list type custom setting
44
- *
45
- * @param objName API name of the object to query
46
- * @returns boolean
47
- */
48
- validCustomSettingType(objDescribe: AnyJson): boolean;
49
- cleanQueryResponse(sObjecRecord: AnyJson, objectDescribe: AnyJson): import("@salesforce/ts-types").JsonMap;
50
- private _getSoqlQuery;
51
- }
1
+ import { CustomObject, CustomField } from 'jsforce/api/metadata';
2
+ import { Record } from 'jsforce';
3
+ /**
4
+ * Returns describe object for the field API name from the Object API name you specify
5
+ *
6
+ * @param objDescribe describe object JSON
7
+ * @param fieldName API name of the field to query
8
+ * @returns Promise - Promise - record in JSON format
9
+ */
10
+ export declare const describeField: (objDescribe: CustomObject, fieldName: string) => CustomField;
11
+ /**
12
+ * Returns true if the object name you specify is a list type custom setting
13
+ *
14
+ * @param objName object describe JSON
15
+ * @returns boolean
16
+ */
17
+ export declare const validCustomSettingType: (objDescribe: CustomObject) => boolean;
18
+ /**
19
+ * Returns describe object for all fields from the object API name you specify
20
+ *
21
+ * @param objDescribe object describe JSON
22
+ * @returns Promise - Promise - record in JSON format
23
+ */
24
+ export declare const describeObjFields: (objDescribe: CustomObject) => CustomField[];
25
+ export declare const cleanQueryResponse: (sObjectRecord: Record, objectDescribe: CustomObject) => Record;