@salesforce/metadata-enrichment 0.0.6 → 0.0.7

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 (48) hide show
  1. package/lib/enrichment/constants/api.d.ts +33 -4
  2. package/lib/enrichment/constants/api.js +37 -9
  3. package/lib/enrichment/constants/api.js.map +1 -1
  4. package/lib/enrichment/constants/component.d.ts +4 -9
  5. package/lib/enrichment/constants/component.js +4 -12
  6. package/lib/enrichment/constants/component.js.map +1 -1
  7. package/lib/enrichment/constants/index.d.ts +3 -2
  8. package/lib/enrichment/constants/index.js +2 -2
  9. package/lib/enrichment/constants/index.js.map +1 -1
  10. package/lib/enrichment/constants/mimeTypes.js +7 -3
  11. package/lib/enrichment/constants/mimeTypes.js.map +1 -1
  12. package/lib/enrichment/enrichmentHandler.d.ts +5 -16
  13. package/lib/enrichment/enrichmentHandler.js +6 -13
  14. package/lib/enrichment/enrichmentHandler.js.map +1 -1
  15. package/lib/enrichment/enrichmentMetrics.d.ts +1 -1
  16. package/lib/enrichment/enrichmentMetrics.js +1 -1
  17. package/lib/enrichment/enrichmentMetrics.js.map +1 -1
  18. package/lib/enrichment/enrichmentRecords.d.ts +3 -4
  19. package/lib/enrichment/enrichmentRecords.js +7 -57
  20. package/lib/enrichment/enrichmentRecords.js.map +1 -1
  21. package/lib/enrichment/index.d.ts +3 -3
  22. package/lib/enrichment/index.js +2 -2
  23. package/lib/enrichment/index.js.map +1 -1
  24. package/lib/enrichment/types/requestTypes.d.ts +1 -1
  25. package/lib/files/fileProcessor.d.ts +11 -14
  26. package/lib/files/fileProcessor.js +109 -29
  27. package/lib/files/fileProcessor.js.map +1 -1
  28. package/lib/files/sourceComponentProcessor.d.ts +2 -2
  29. package/lib/files/sourceComponentProcessor.js +25 -7
  30. package/lib/files/sourceComponentProcessor.js.map +1 -1
  31. package/lib/index.d.ts +1 -1
  32. package/lib/index.js +1 -1
  33. package/lib/index.js.map +1 -1
  34. package/lib/schemas/index.d.ts +2 -0
  35. package/lib/{enrichment/validators → schemas}/index.js +1 -1
  36. package/lib/schemas/index.js.map +1 -0
  37. package/lib/schemas/schemas.d.ts +47 -0
  38. package/lib/schemas/schemas.js +113 -0
  39. package/lib/schemas/schemas.js.map +1 -0
  40. package/package.json +5 -5
  41. package/lib/enrichment/validators/index.d.ts +0 -1
  42. package/lib/enrichment/validators/index.js.map +0 -1
  43. package/lib/enrichment/validators/lwcComponentValidator.d.ts +0 -8
  44. package/lib/enrichment/validators/lwcComponentValidator.js +0 -26
  45. package/lib/enrichment/validators/lwcComponentValidator.js.map +0 -1
  46. package/lib/files/lwcProcessor.d.ts +0 -14
  47. package/lib/files/lwcProcessor.js +0 -125
  48. package/lib/files/lwcProcessor.js.map +0 -1
@@ -13,36 +13,70 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { readFile } from 'node:fs/promises';
16
+ import { readFile, writeFile } from 'node:fs/promises';
17
+ import { SfError } from '@salesforce/core';
18
+ import { Messages } from '@salesforce/core/messages';
19
+ import { XMLParser, XMLBuilder } from 'fast-xml-parser';
20
+ import { EnrichmentStatus, SUPPORTED_COMPONENT_TYPES, METADATA_TYPE_CONFIGS } from '../enrichment/constants/api.js';
21
+ import { DEFAULT_XML_METADATA_SCHEMA } from '../schemas/index.js';
17
22
  import { getMimeTypeFromExtension } from '../enrichment/enrichmentHandler.js';
18
- import { LWC_METADATA_TYPE_NAME, SUPPORTED_COMPONENT_TYPES } from '../enrichment/constants/component.js';
19
- import { LwcProcessor } from './lwcProcessor.js';
23
+ Messages.importMessagesDirectory(import.meta.dirname);
24
+ const messages = Messages.loadMessages('@salesforce/metadata-enrichment', 'errors');
20
25
  /**
21
- * Maps each supported component type to its corresponding processor.
22
- * Add new entries here when introducing support for additional component types.
23
- */
24
- const COMPONENT_TYPE_PROCESSOR_MAP = new Map([
25
- [LWC_METADATA_TYPE_NAME, new LwcProcessor()],
26
- ]);
27
- /**
28
- * A main entryway for processing file operations for metadata files.
29
- * This includes reading and writing component files.
30
- * Supported component types are defined in SUPPORTED_COMPONENT_TYPES and each maps
31
- * to a dedicated processor in COMPONENT_TYPE_PROCESSOR_MAP.
26
+ * A main entryway for processing metadata file operations
27
+ * with support for reading from and writing to component files.
28
+ * All supported component types write enrichment results to their xml metadata file (component.xml).
32
29
  */
33
30
  export class FileProcessor {
34
31
  static async updateMetadata(componentsToProcess, enrichmentRecords) {
35
- const componentsByType = FileProcessor.groupComponentsByType(componentsToProcess);
36
- for (const [componentType, components] of componentsByType) {
37
- if (!SUPPORTED_COMPONENT_TYPES.has(componentType)) {
32
+ for (const component of componentsToProcess) {
33
+ // Skip if unsupported component type
34
+ if (!SUPPORTED_COMPONENT_TYPES.has(component.type?.name ?? '')) {
35
+ continue;
36
+ }
37
+ // Skip if source component is missing name or metadata file location
38
+ const componentName = component.fullName ?? component.name;
39
+ if (!componentName || !component.xml) {
40
+ continue;
41
+ }
42
+ // Find the enrichment record matching the source component
43
+ let enrichmentRecord;
44
+ for (const record of enrichmentRecords) {
45
+ if (record.componentName === componentName) {
46
+ enrichmentRecord = record;
47
+ break;
48
+ }
49
+ }
50
+ // Skip if for some reason the enrichment record is missing a response
51
+ if (!enrichmentRecord?.response) {
38
52
  continue;
39
53
  }
40
- const processor = COMPONENT_TYPE_PROCESSOR_MAP.get(componentType);
41
- if (!processor) {
54
+ const enrichmentResult = enrichmentRecord.response.results[0];
55
+ if (!enrichmentResult) {
42
56
  continue;
43
57
  }
44
58
  // eslint-disable-next-line no-await-in-loop
45
- enrichmentRecords = await processor.updateMetadata(components, enrichmentRecords);
59
+ const fileResult = await FileProcessor.readComponentFile(componentName, component.xml);
60
+ if (!fileResult) {
61
+ continue;
62
+ }
63
+ const componentTypeName = component.type?.name ?? '';
64
+ // Skip processing if <skipUplift> tag is set to true
65
+ if (FileProcessor.isSkipUpliftEnabled(fileResult.fileContents, componentTypeName)) {
66
+ enrichmentRecord.message = 'skipUplift is set to true';
67
+ enrichmentRecord.status = EnrichmentStatus.SKIPPED;
68
+ continue;
69
+ }
70
+ // Write to component's metadata XML file
71
+ try {
72
+ const updatedXml = FileProcessor.updateMetaXml(fileResult.fileContents, enrichmentResult, componentTypeName);
73
+ // eslint-disable-next-line no-await-in-loop
74
+ await writeFile(component.xml, updatedXml, 'utf-8');
75
+ }
76
+ catch (error) {
77
+ const errorMessage = error instanceof Error ? error.message : String(error);
78
+ enrichmentRecord.message = errorMessage;
79
+ }
46
80
  }
47
81
  return enrichmentRecords;
48
82
  }
@@ -66,20 +100,66 @@ export class FileProcessor {
66
100
  if (!componentName) {
67
101
  return [];
68
102
  }
69
- const filePaths = Array.from(component.walkContent());
103
+ let filePaths = Array.from(component.walkContent());
104
+ // Some component types (e.g. FlexiPage) have no separate content files —
105
+ // their definition lives entirely in the XML metadata file.
106
+ if (filePaths.length === 0 && component.xml) {
107
+ filePaths = [component.xml];
108
+ }
70
109
  const fileReadPromises = filePaths.map((filePath) => FileProcessor.readComponentFile(componentName, filePath));
71
110
  const fileResults = await Promise.all(fileReadPromises);
72
111
  return fileResults.filter((result) => result !== null);
73
112
  }
74
- static groupComponentsByType(components) {
75
- const componentsByType = new Map();
76
- for (const component of components) {
77
- const componentTypeName = component.type?.name ?? 'Unknown';
78
- const existing = componentsByType.get(componentTypeName) ?? [];
79
- existing.push(component);
80
- componentsByType.set(componentTypeName, existing);
113
+ static updateMetaXml(xmlContent, result, componentTypeName) {
114
+ const parser = new XMLParser({
115
+ htmlEntities: true,
116
+ ignoreAttributes: false,
117
+ processEntities: false,
118
+ trimValues: true,
119
+ });
120
+ const builder = new XMLBuilder({
121
+ format: true,
122
+ ignoreAttributes: false,
123
+ processEntities: false,
124
+ });
125
+ try {
126
+ const xmlObj = parser.parse(xmlContent);
127
+ const rootKey = Object.keys(xmlObj).find((k) => k !== '?xml');
128
+ if (!rootKey) {
129
+ throw new SfError(messages.getMessage('errors.parsing.xml', [result.resourceName]));
130
+ }
131
+ if (!xmlObj[rootKey]) {
132
+ xmlObj[rootKey] = {};
133
+ }
134
+ const schema = (componentTypeName ? METADATA_TYPE_CONFIGS[componentTypeName]?.xmlSchema : undefined) ?? DEFAULT_XML_METADATA_SCHEMA;
135
+ schema.applyEnrichment(xmlObj[rootKey], result);
136
+ const builtXml = builder.build(xmlObj);
137
+ return builtXml.trim().replace(/\n{3,}/g, '\n\n');
138
+ }
139
+ catch (error) {
140
+ throw new SfError(messages.getMessage('errors.parsing.xml', [error instanceof Error ? error.message : String(error)]));
141
+ }
142
+ }
143
+ /**
144
+ * Checks if the component has opted out of enrichment.
145
+ * Delegates to the per-type XML schema's isSkipUpliftEnabled implementation.
146
+ */
147
+ static isSkipUpliftEnabled(xmlContent, componentTypeName) {
148
+ try {
149
+ const parser = new XMLParser({ ignoreAttributes: false, preserveOrder: false, trimValues: true });
150
+ const xmlObj = parser.parse(xmlContent);
151
+ const rootKey = Object.keys(xmlObj).find((k) => k !== '?xml');
152
+ if (!rootKey)
153
+ return false;
154
+ const xmlRoot = xmlObj[rootKey];
155
+ if (!xmlRoot)
156
+ return false;
157
+ const schema = (componentTypeName ? METADATA_TYPE_CONFIGS[componentTypeName]?.xmlSchema : undefined) ?? DEFAULT_XML_METADATA_SCHEMA;
158
+ return schema.isSkipUpliftEnabled(xmlRoot);
159
+ }
160
+ catch {
161
+ return false;
81
162
  }
82
- return componentsByType;
83
163
  }
84
164
  }
85
165
  //# sourceMappingURL=fileProcessor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileProcessor.js","sourceRoot":"","sources":["../../src/files/fileProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAqBjD;;;GAGG;AACH,MAAM,4BAA4B,GAAgD,IAAI,GAAG,CAAC;IACxF,CAAC,sBAAsB,EAAE,IAAI,YAAY,EAAE,CAAC;CAC7C,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAEjB,MAAM,CAAC,KAAK,CAAC,cAAc,CAChC,mBAAsC,EACtC,iBAA+C;QAE/C,MAAM,gBAAgB,GAAG,aAAa,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QAElF,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,gBAAgB,EAAE,CAAC;YAC3D,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBAClD,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,4BAA4B,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAClE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YAED,4CAA4C;YAC5C,iBAAiB,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,aAAqB,EAAE,QAAgB;QAC3E,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAEpD,OAAO;gBACL,aAAa;gBACb,QAAQ;gBACR,YAAY;gBACZ,QAAQ;aACT,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,SAA0B;QAC/D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC;QAC3D,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/G,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAA4B,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;IACnF,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,UAA6B;QAChE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA6B,CAAC;QAC9D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;YAC5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;YAC/D,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC1B,CAAC;CACF"}
1
+ {"version":3,"file":"fileProcessor.js","sourceRoot":"","sources":["../../src/files/fileProcessor.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type SourceComponent } from '@salesforce/source-deploy-retrieve';
2
- import type { MetadataTypeAndName } from '../common/types.js';
2
+ import type { EnrichmentRequestRecord } from '../enrichment/constants/api.js';
3
3
  export declare class SourceComponentProcessor {
4
4
  /**
5
5
  *
@@ -14,7 +14,7 @@ export declare class SourceComponentProcessor {
14
14
  * @param projectDir
15
15
  * @returns
16
16
  */
17
- static getComponentsToSkip(sourceComponents: SourceComponent[], metadataEntries: string[], projectDir?: string): Set<MetadataTypeAndName>;
17
+ static getComponentsToSkip(sourceComponents: SourceComponent[], metadataEntries: string[], projectDir?: string): Set<EnrichmentRequestRecord>;
18
18
  private static filterComponents;
19
19
  private static diffRequestedComponents;
20
20
  private static parseRequestedComponents;
@@ -14,7 +14,11 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { RegistryAccess } from '@salesforce/source-deploy-retrieve';
17
- import { COMPONENT_TYPE_VALIDATORS, SUPPORTED_COMPONENT_TYPES } from '../enrichment/constants/component.js';
17
+ import { Messages } from '@salesforce/core/messages';
18
+ import { EnrichmentStatus } from '../enrichment/constants/api.js';
19
+ import { SUPPORTED_COMPONENT_TYPES } from '../enrichment/constants/api.js';
20
+ Messages.importMessagesDirectory(import.meta.dirname);
21
+ const messages = Messages.loadMessages('@salesforce/metadata-enrichment', 'errors');
18
22
  export class SourceComponentProcessor {
19
23
  /**
20
24
  *
@@ -48,17 +52,24 @@ export class SourceComponentProcessor {
48
52
  // Filter out unsupported component types
49
53
  if (!SUPPORTED_COMPONENT_TYPES.has(typeName)) {
50
54
  filteredComponents.add({
51
- typeName: sourceComponent.type.name,
52
55
  componentName: requestedComponent.componentName,
56
+ componentType: sourceComponent.type,
57
+ requestBody: null,
58
+ response: null,
59
+ message: messages.getMessage('errors.unsupported.type', [typeName]),
60
+ status: EnrichmentStatus.SKIPPED,
53
61
  });
54
62
  continue;
55
63
  }
56
- // Run type-specific validation
57
- const validator = COMPONENT_TYPE_VALIDATORS.get(typeName);
58
- if (validator && !validator(sourceComponent)) {
64
+ // Filter out supported components missing their metadata file
65
+ if (sourceComponent.xml === undefined) {
59
66
  filteredComponents.add({
60
- typeName: sourceComponent.type.name,
61
67
  componentName: requestedComponent.componentName,
68
+ componentType: sourceComponent.type,
69
+ requestBody: null,
70
+ response: null,
71
+ message: messages.getMessage('errors.component.configuration.not.found'),
72
+ status: EnrichmentStatus.SKIPPED,
62
73
  });
63
74
  }
64
75
  }
@@ -69,7 +80,14 @@ export class SourceComponentProcessor {
69
80
  const missingComponents = new Set();
70
81
  for (const requestedComponent of requestedComponents) {
71
82
  if (requestedComponent.componentName && !existingSourceComponentNames.has(requestedComponent.componentName)) {
72
- missingComponents.add(requestedComponent);
83
+ missingComponents.add({
84
+ componentName: requestedComponent.componentName,
85
+ componentType: { name: requestedComponent.typeName },
86
+ requestBody: null,
87
+ response: null,
88
+ message: messages.getMessage('errors.component.not.found'),
89
+ status: EnrichmentStatus.SKIPPED,
90
+ });
73
91
  }
74
92
  }
75
93
  return missingComponents;
@@ -1 +1 @@
1
- {"version":3,"file":"sourceComponentProcessor.js","sourceRoot":"","sources":["../../src/files/sourceComponentProcessor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sourceComponentProcessor.js","sourceRoot":"","sources":["../../src/files/sourceComponentProcessor.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { SourceComponentProcessor, FileProcessor } from './files/index.js';
2
2
  export type { FileReadResult } from './files/index.js';
3
- export { getMimeTypeFromExtension, API_ENDPOINT_ENRICHMENT, SUPPORTED_MIME_TYPES, EnrichmentHandler, EnrichmentMetrics, EnrichmentRecords, EnrichmentStatus, LwcComponentValidator, } from './enrichment/index.js';
3
+ export { getMimeTypeFromExtension, API_ENDPOINT_ENRICHMENT, SUPPORTED_MIME_TYPES, EnrichmentHandler, EnrichmentMetrics, EnrichmentRecords, EnrichmentStatus, } from './enrichment/index.js';
4
4
  export type { ContentBundleFile, ContentBundle, EnrichmentRequestBody, EnrichmentMetadata, EnrichmentResult, EnrichMetadataResponse, EnrichmentRequestRecord, } from './enrichment/index.js';
5
5
  export type { ComponentEnrichmentStatus, MetadataTypeAndName } from './common/index.js';
package/lib/index.js CHANGED
@@ -14,5 +14,5 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  export { SourceComponentProcessor, FileProcessor } from './files/index.js';
17
- export { getMimeTypeFromExtension, API_ENDPOINT_ENRICHMENT, SUPPORTED_MIME_TYPES, EnrichmentHandler, EnrichmentMetrics, EnrichmentRecords, EnrichmentStatus, LwcComponentValidator, } from './enrichment/index.js';
17
+ export { getMimeTypeFromExtension, API_ENDPOINT_ENRICHMENT, SUPPORTED_MIME_TYPES, EnrichmentHandler, EnrichmentMetrics, EnrichmentRecords, EnrichmentStatus, } from './enrichment/index.js';
18
18
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG3E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { DEFAULT_XML_METADATA_SCHEMA, SALESFORCE_OBJECT_XML_METADATA_SCHEMA } from './schemas.js';
2
+ export type { MetadataTypeXmlSchema, MetadataTypeConfig } from './schemas.js';
@@ -13,5 +13,5 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- export { LwcComponentValidator } from './lwcComponentValidator.js';
16
+ export { DEFAULT_XML_METADATA_SCHEMA, SALESFORCE_OBJECT_XML_METADATA_SCHEMA } from './schemas.js';
17
17
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,2BAA2B,EAAE,qCAAqC,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { EnrichmentResult } from '../enrichment/types/index.js';
2
+ export type MetadataTypeXmlSchema = {
3
+ /**
4
+ * Define how to apply enrichment result data into the XML metadata.
5
+ * Called after the metadata file has been parsed and mutates xmlRoot in place.
6
+ */
7
+ applyEnrichment: (xmlRoot: Record<string, unknown>, result: EnrichmentResult) => void;
8
+ /**
9
+ * Define how to check if the user has opted out of enrichment based on the set <skipUplift> tag.
10
+ * If you want to ignore this capability, always return false.
11
+ */
12
+ isSkipUpliftEnabled: (xmlRoot: Record<string, unknown>) => boolean;
13
+ };
14
+ export type MetadataTypeConfig = {
15
+ apiType: string;
16
+ xmlSchema: MetadataTypeXmlSchema;
17
+ };
18
+ /**
19
+ * Default XML metadata schema where enrichment is written within <ai> block at metadata's root level.
20
+ *
21
+ * Example output structure:
22
+ * ```
23
+ * <LightningComponentBundle>
24
+ * <ai>
25
+ * <skipUplift>false</skipUplift>
26
+ * <description>...</description>
27
+ * <score>0.95</score>
28
+ * </ai>
29
+ * </LightningComponentBundle>
30
+ * ```
31
+ */
32
+ export declare const DEFAULT_XML_METADATA_SCHEMA: MetadataTypeXmlSchema;
33
+ /**
34
+ * XML metadata schema for SalesforceObject where enrichment is written within <aiDescriptor> block.
35
+ *
36
+ * Example output structure:
37
+ * ```
38
+ * <CustomObject>
39
+ * <aiDescriptor>
40
+ * <skipUplift>false</skipUplift>
41
+ * <enrichedDescription>...</enrichedDescription>
42
+ * <score>0.95</score>
43
+ * </aiDescriptor>
44
+ * </CustomObject>
45
+ * ```
46
+ */
47
+ export declare const SALESFORCE_OBJECT_XML_METADATA_SCHEMA: MetadataTypeXmlSchema;
@@ -0,0 +1,113 @@
1
+ /*
2
+ * Copyright 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
+ import { XMLParser } from 'fast-xml-parser';
17
+ /**
18
+ * Parses the description field from an EnrichmentResult into an object suitable
19
+ * for embedding in the <ai> XML block.
20
+ *
21
+ * The description may be plain text, or HTML-entity-encoded XML containing a
22
+ * description tag and optionally one or more property tags.
23
+ */
24
+ function parseDescriptionContent(description) {
25
+ const decodedDescription = description
26
+ .replace(/&lt;/g, '<')
27
+ .replace(/&gt;/g, '>')
28
+ .replace(/&amp;/g, '&')
29
+ .replace(/&quot;/g, '"')
30
+ .replace(/&apos;/g, "'");
31
+ // Plain text — no encoded XML tags present
32
+ // Wrap it in <description> tag and return it
33
+ if (!description.includes('&lt;description&gt;')) {
34
+ return { description: decodedDescription };
35
+ }
36
+ // Description contains encoded XML — parse the decoded fragment to extract child elements
37
+ // And return this XML content back within <ai> tags
38
+ const parser = new XMLParser({
39
+ ignoreAttributes: false,
40
+ processEntities: false,
41
+ trimValues: true,
42
+ isArray: (tagName) => tagName === 'property',
43
+ });
44
+ try {
45
+ // Use a temporary <root> element to wrap the XML content for serialization purposes only
46
+ const parsed = parser.parse(`<root>${decodedDescription}</root>`);
47
+ return parsed.root ?? { description: decodedDescription };
48
+ }
49
+ catch {
50
+ return { description: decodedDescription };
51
+ }
52
+ }
53
+ /**
54
+ * Default XML metadata schema where enrichment is written within <ai> block at metadata's root level.
55
+ *
56
+ * Example output structure:
57
+ * ```
58
+ * <LightningComponentBundle>
59
+ * <ai>
60
+ * <skipUplift>false</skipUplift>
61
+ * <description>...</description>
62
+ * <score>0.95</score>
63
+ * </ai>
64
+ * </LightningComponentBundle>
65
+ * ```
66
+ */
67
+ export const DEFAULT_XML_METADATA_SCHEMA = {
68
+ applyEnrichment(xmlRoot, result) {
69
+ Object.assign(xmlRoot, {
70
+ ai: {
71
+ skipUplift: 'false',
72
+ ...parseDescriptionContent(result.description),
73
+ score: String(result.descriptionScore),
74
+ },
75
+ });
76
+ },
77
+ isSkipUpliftEnabled(xmlRoot) {
78
+ const root = xmlRoot;
79
+ const skipUplift = root.ai?.skipUplift;
80
+ return skipUplift === true || String(skipUplift).toLowerCase() === 'true';
81
+ },
82
+ };
83
+ /**
84
+ * XML metadata schema for SalesforceObject where enrichment is written within <aiDescriptor> block.
85
+ *
86
+ * Example output structure:
87
+ * ```
88
+ * <CustomObject>
89
+ * <aiDescriptor>
90
+ * <skipUplift>false</skipUplift>
91
+ * <enrichedDescription>...</enrichedDescription>
92
+ * <score>0.95</score>
93
+ * </aiDescriptor>
94
+ * </CustomObject>
95
+ * ```
96
+ */
97
+ export const SALESFORCE_OBJECT_XML_METADATA_SCHEMA = {
98
+ applyEnrichment(xmlRoot, result) {
99
+ Object.assign(xmlRoot, {
100
+ aiDescriptor: {
101
+ skipUplift: 'false',
102
+ enrichedDescription: result.description,
103
+ score: String(result.descriptionScore),
104
+ },
105
+ });
106
+ },
107
+ isSkipUpliftEnabled(xmlRoot) {
108
+ const root = xmlRoot;
109
+ const skipUplift = root.aiDescriptor?.skipUplift;
110
+ return skipUplift === true || String(skipUplift).toLowerCase() === 'true';
111
+ },
112
+ };
113
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/schemas/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAwB5C;;;;;;GAMG;AACH,SAAS,uBAAuB,CAAC,WAAmB;IAClD,MAAM,kBAAkB,GAAG,WAAW;SACnC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAE3B,2CAA2C;IAC3C,6CAA6C;IAC7C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC7C,CAAC;IAED,0FAA0F;IAC1F,oDAAoD;IACpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,KAAK;QACtB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,UAAU;KAC7C,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,yFAAyF;QACzF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,kBAAkB,SAAS,CAAuC,CAAC;QACxG,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAA0B;IAChE,eAAe,CAAC,OAAO,EAAE,MAAM;QAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,EAAE,EAAE;gBACF,UAAU,EAAE,OAAO;gBACnB,GAAG,uBAAuB,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC9C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aACvC;SACF,CAAC,CAAC;IACL,CAAC;IACD,mBAAmB,CAAC,OAAO;QACzB,MAAM,IAAI,GAAG,OAAqD,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC;QACvC,OAAO,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC5E,CAAC;CACF,CAAC;AAGF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAA0B;IAC1E,eAAe,CAAC,OAAO,EAAE,MAAM;QAC7B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,YAAY,EAAE;gBACZ,UAAU,EAAE,OAAO;gBACnB,mBAAmB,EAAE,MAAM,CAAC,WAAW;gBACvC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC;aACvC;SACF,CAAC,CAAC;IACL,CAAC;IACD,mBAAmB,CAAC,OAAO;QACzB,MAAM,IAAI,GAAG,OAA+D,CAAC;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;QACjD,OAAO,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC5E,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/metadata-enrichment",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "A library for handling metadata enrichment",
5
5
  "author": "Salesforce",
6
6
  "main": "lib/index",
@@ -51,11 +51,11 @@
51
51
  "string-width": "^4.2.3"
52
52
  },
53
53
  "dependencies": {
54
- "@salesforce/core": "^8.24.0",
54
+ "@salesforce/core": "^8.26.3",
55
55
  "@salesforce/kit": "^3.2.4",
56
- "@salesforce/source-deploy-retrieve": "^12.0.1",
56
+ "@salesforce/source-deploy-retrieve": "^12.31.14",
57
57
  "@salesforce/ts-types": "^2.0.11",
58
- "fast-xml-parser": "^5.3.4"
58
+ "fast-xml-parser": "^5.4.1"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@salesforce/cli-plugins-testkit": "^5.3.41",
@@ -63,7 +63,7 @@
63
63
  "eslint-plugin-sf-plugin": "^1.20.33",
64
64
  "ts-node": "^10.9.2",
65
65
  "ts-patch": "^3.1.2",
66
- "typescript": "^5.5.4"
66
+ "typescript": "^5.9.2"
67
67
  },
68
68
  "publishConfig": {
69
69
  "access": "public"
@@ -1 +0,0 @@
1
- export { LwcComponentValidator } from './lwcComponentValidator.js';
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enrichment/validators/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -1,8 +0,0 @@
1
- import type { SourceComponent } from '@salesforce/source-deploy-retrieve';
2
- /**
3
- * Validator for LWC - "LightningComponentBundle" source components processing
4
- * Validates that a corresponding metadata XML file exists
5
- */
6
- export declare class LwcComponentValidator {
7
- static validate(this: void, component: SourceComponent): boolean;
8
- }
@@ -1,26 +0,0 @@
1
- /*
2
- * Copyright 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
- /**
17
- * Validator for LWC - "LightningComponentBundle" source components processing
18
- * Validates that a corresponding metadata XML file exists
19
- */
20
- export class LwcComponentValidator {
21
- static validate(component) {
22
- const hasMetadataFile = (component.xml !== undefined);
23
- return hasMetadataFile;
24
- }
25
- }
26
- //# sourceMappingURL=lwcComponentValidator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lwcComponentValidator.js","sourceRoot":"","sources":["../../../src/enrichment/validators/lwcComponentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;GAGG;AACH,MAAM,OAAO,qBAAqB;IACzB,MAAM,CAAC,QAAQ,CAAa,SAA0B;QAC3D,MAAM,eAAe,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QACtD,OAAO,eAAe,CAAC;IACzB,CAAC;CACF"}
@@ -1,14 +0,0 @@
1
- import type { SourceComponent } from '@salesforce/source-deploy-retrieve';
2
- import type { EnrichmentRequestRecord } from '../enrichment/enrichmentHandler.js';
3
- import type { EnrichmentResult } from '../enrichment/types/index.js';
4
- import type { ComponentTypeProcessor, FileReadResult } from './fileProcessor.js';
5
- /**
6
- * A LWC specific processor for reading and updating LWC metadata files.
7
- */
8
- export declare class LwcProcessor implements ComponentTypeProcessor {
9
- updateMetadata(lightningComponentBundles: SourceComponent[], enrichmentRecords: Set<EnrichmentRequestRecord>): Promise<Set<EnrichmentRequestRecord>>;
10
- readComponentFiles(sourceComponents: SourceComponent[]): Promise<FileReadResult[]>;
11
- updateMetaXml(xmlContent: string, result: EnrichmentResult): string;
12
- isMetaXmlFile(filePath: string): boolean;
13
- private isSkipUpliftEnabled;
14
- }