diff --git a/.github/workflows/perfScaleNut.yml b/.github/workflows/perfScaleNut.yml index 725b203cdb..44eeaa082e 100644 --- a/.github/workflows/perfScaleNut.yml +++ b/.github/workflows/perfScaleNut.yml @@ -15,7 +15,6 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: latest cache: yarn - run: npm install -g sfdx-cli --omit=dev - run: yarn install diff --git a/.github/workflows/registryCheck.yml b/.github/workflows/registryCheck.yml index eed169c6d2..bcc99cab20 100644 --- a/.github/workflows/registryCheck.yml +++ b/.github/workflows/registryCheck.yml @@ -13,8 +13,6 @@ jobs: steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 - with: - node-version: latest - run: yarn install - run: yarn build - run: yarn test:registry diff --git a/.github/workflows/registryCheckPreview.yml b/.github/workflows/registryCheckPreview.yml index 4d327251c8..4e577f7467 100644 --- a/.github/workflows/registryCheckPreview.yml +++ b/.github/workflows/registryCheckPreview.yml @@ -13,8 +13,6 @@ jobs: steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 - with: - node-version: latest - run: yarn install - run: yarn build - run: yarn metadata:preview diff --git a/src/resolve/manifestResolver.ts b/src/resolve/manifestResolver.ts index 31f09929ca..37293ed8b9 100644 --- a/src/resolve/manifestResolver.ts +++ b/src/resolve/manifestResolver.ts @@ -63,7 +63,16 @@ export class ManifestResolver { const apiVersion = parsedManifest.version; for (const typeMembers of packageTypeMembers) { - const typeName = typeMembers.name; + let typeName = typeMembers.name; + // protect against empty/invalid typeMember definitions in the manifest + if (typeof typeName !== 'string' || typeName.length === 0) { + if (typeof typeName === 'object') { + typeName = JSON.stringify(typeName); + } + const err = new Error(`Invalid types definition in manifest file: ${manifestPath}\nFound: "${typeName ?? ''}"`); + err.name = 'InvalidManifest'; + throw err; + } const type = this.registry.getTypeByName(typeName); const parentType = type.folderType ? this.registry.getTypeByName(type.folderType) : undefined; const members = ensureArray(typeMembers.members); diff --git a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/eda.json b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/eda.json index 31e8ffefed..45e095932b 100644 --- a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/eda.json +++ b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/eda.json @@ -1,18 +1,18 @@ [ { "name": "componentSetCreate", - "duration": 214.46215100004338 + "duration": 211.98616599995876 }, { "name": "sourceToMdapi", - "duration": 6232.359846999985 + "duration": 5675.445168000006 }, { "name": "sourceToZip", - "duration": 4866.491668000002 + "duration": 4325.303721999982 }, { "name": "mdapiToSource", - "duration": 4188.821088000026 + "duration": 3837.6363589999964 } ] \ No newline at end of file diff --git a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClasses.json b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClasses.json index e0d411e22f..535bc9562a 100644 --- a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClasses.json +++ b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClasses.json @@ -1,18 +1,18 @@ [ { "name": "componentSetCreate", - "duration": 428.76088600000367 + "duration": 414.30975700001 }, { "name": "sourceToMdapi", - "duration": 8602.956126999983 + "duration": 8222.016792999988 }, { "name": "sourceToZip", - "duration": 6805.6596850000205 + "duration": 6871.310621000011 }, { "name": "mdapiToSource", - "duration": 5127.636436000001 + "duration": 4824.338472999982 } ] \ No newline at end of file diff --git a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClassesOneDir.json b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClassesOneDir.json index b74a7235de..29d7b7df0b 100644 --- a/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClassesOneDir.json +++ b/test/nuts/perfResults/x64-linux-2xIntel-Xeon-Platinum-8272CL-CPU-2-60GHz/lotsOfClassesOneDir.json @@ -1,18 +1,18 @@ [ { "name": "componentSetCreate", - "duration": 776.4044480000157 + "duration": 710.4652360000182 }, { "name": "sourceToMdapi", - "duration": 12145.154593000014 + "duration": 11589.544998999976 }, { "name": "sourceToZip", - "duration": 11030.154324000003 + "duration": 11294.996881 }, { "name": "mdapiToSource", - "duration": 12548.084606999997 + "duration": 13089.373708 } ] \ No newline at end of file diff --git a/test/resolve/manifestResolver.test.ts b/test/resolve/manifestResolver.test.ts index 30d9387fbf..d098c1b8f0 100644 --- a/test/resolve/manifestResolver.test.ts +++ b/test/resolve/manifestResolver.test.ts @@ -80,6 +80,36 @@ describe('ManifestResolver', () => { expect(result.components).to.deep.equal(expected); }); + it('should throw when type is empty', async () => { + const badManifest: VirtualFile = { + name: 'bad-package.xml', + data: Buffer.from(` + + + + + + 52.0 + \n`), + }; + const tree = new VirtualTreeContainer([ + { + dirPath: '.', + children: [badManifest], + }, + ]); + const resolver = new ManifestResolver(tree); + try { + await resolver.resolve(badManifest.name); + expect(true, 'expected invalid types definition error').to.be.false; + } catch (error) { + expect(error).to.have.property('name', 'InvalidManifest'); + expect(error) + .to.have.property('message') + .and.include(`Invalid types definition in manifest file: ${badManifest.name}`); + } + }); + it('should resolve nested InFolder types', async () => { const registry = new RegistryAccess(); const reportType = registry.getTypeByName('report');