diff --git a/METADATA_SUPPORT.md b/METADATA_SUPPORT.md index bc7af79d1..bc92d7bac 100644 --- a/METADATA_SUPPORT.md +++ b/METADATA_SUPPORT.md @@ -387,6 +387,7 @@ To contribute a new metadata type, please see the [Contributing Metadata Types t |FlowSettings|✅|| |FlowTest|✅|| |FlowValueMap|✅|| +|FragmentBundle|✅|| |ForecastingFilter|✅|| |ForecastingFilterCondition|✅|| |ForecastingGroup|✅|| diff --git a/src/registry/metadataRegistry.json b/src/registry/metadataRegistry.json index 4dbdd7c9b..1ce37e56a 100644 --- a/src/registry/metadataRegistry.json +++ b/src/registry/metadataRegistry.json @@ -71,7 +71,8 @@ "waveTemplates": "wavetemplatebundle", "appTemplates": "appframeworktemplatebundle", "lightningTypes": "lightningtypebundle", - "uiBundles": "uibundle" + "uiBundles": "uibundle", + "fragments": "fragmentbundle" }, "suffixes": { "Canvas": "canvasmetadata", @@ -5371,6 +5372,18 @@ "directoryName": "policyRuleDefinitionSets", "inFolder": false, "strictDirectoryName": false + }, + "fragmentbundle": { + "id": "fragmentbundle", + "name": "FragmentBundle", + "directoryName": "fragments", + "inFolder": false, + "strictDirectoryName": true, + "strategies": { + "adapter": "bundle" + }, + "supportsPartialDelete": true, + "metaFileSuffix": "fragment.json" } } } diff --git a/src/resolve/metadataResolver.ts b/src/resolve/metadataResolver.ts index 036f5b078..bfaa66838 100644 --- a/src/resolve/metadataResolver.ts +++ b/src/resolve/metadataResolver.ts @@ -400,7 +400,13 @@ const parseAsMetadata = if (tree.isDirectory(fsPath)) { return; } - return ['DigitalExperience', 'ExperiencePropertyTypeBundle', 'LightningTypeBundle', 'ContentTypeBundle'] + return [ + 'DigitalExperience', + 'ExperiencePropertyTypeBundle', + 'LightningTypeBundle', + 'ContentTypeBundle', + 'FragmentBundle', + ] .map((type) => registry.getTypeByName(type)) .find((type) => fsPath.split(sep).includes(type.directoryName))?.name; }; diff --git a/src/utils/filePathGenerator.ts b/src/utils/filePathGenerator.ts index 4804c1c76..4fb797e68 100644 --- a/src/utils/filePathGenerator.ts +++ b/src/utils/filePathGenerator.ts @@ -125,6 +125,7 @@ export const filePathsFromMetadataComponent = ( ['ExperiencePropertyTypeBundle', [join(packageDirWithTypeDir, `${fullName}${sep}schema.json`)]], ['LightningTypeBundle', [join(packageDirWithTypeDir, `${fullName}${sep}schema.json`)]], ['ContentTypeBundle', [join(packageDirWithTypeDir, `${fullName}${sep}schema.json`)]], + ['FragmentBundle', [join(packageDirWithTypeDir, `${fullName}${sep}fragment.json`)]], ['WaveTemplateBundle', [join(packageDirWithTypeDir, `${fullName}${sep}template-info.json`)]], // ui-bundle.json is optional, so only the meta XML is a guaranteed file path. ['UIBundle', [join(packageDirWithTypeDir, `${fullName}${sep}${fullName}.uibundle${META_XML_SUFFIX}`)]], diff --git a/test/resolve/metadataResolver.test.ts b/test/resolve/metadataResolver.test.ts index 529dd7367..a255d8137 100644 --- a/test/resolve/metadataResolver.test.ts +++ b/test/resolve/metadataResolver.test.ts @@ -266,6 +266,16 @@ describe('MetadataResolver', () => { expect(mdResolver.getComponentsFromPath(path)).to.deep.equal([expectedComponent]); }); + it('Should determine type for FragmentBundle content file', () => { + const fragmentPath = join('unpackaged', 'fragments', 'myFragment', 'fragment.json'); + const treeContainer = VirtualTreeContainer.fromFilePaths([fragmentPath]); + const mdResolver = new MetadataResolver(undefined, treeContainer); + const components = mdResolver.getComponentsFromPath(fragmentPath); + expect(components).to.have.lengthOf(1); + expect(components[0].type.name).to.equal('FragmentBundle'); + expect(components[0].name).to.equal('myFragment'); + }); + it('Should determine type for path of mixed content type', () => { const path = mixedContentDirectory.MIXED_CONTENT_DIRECTORY_SOURCE_PATHS[1]; const access = testUtil.createMetadataResolver([ diff --git a/test/utils/filePathGenerator.test.ts b/test/utils/filePathGenerator.test.ts index e0b51498c..94d5337fd 100644 --- a/test/utils/filePathGenerator.test.ts +++ b/test/utils/filePathGenerator.test.ts @@ -182,6 +182,16 @@ const testData = { }, ], }, + bundleFragment: { + fullName: 'myFragment', + typeName: 'FragmentBundle', + expectedFilePaths: [getFilePath('fragments/myFragment/fragment.json')], + expectedComponents: [ + { + content: getFilePath('fragments/myFragment'), + }, + ], + }, nonDecomposedExplicit: { fullName: 'CustomLabels', typeName: 'CustomLabels',