diff --git a/src/package.ts b/src/package.ts index 22a13906..75e51ff2 100644 --- a/src/package.ts +++ b/src/package.ts @@ -880,6 +880,22 @@ export function validateManifest(manifest: Manifest): Manifest { validateEngineCompatibility(manifest.engines['vscode']); + const hasActivationEvents = !!manifest.activationEvents; + const hasMain = !!manifest.main; + const hasBrowser = !!manifest.browser; + + if (hasActivationEvents) { + if (!hasMain && !hasBrowser) { + throw new Error( + "Manifest needs either a 'main' or 'browser' property, given it has a 'activationEvents' property." + ); + } + } else if (hasMain) { + throw new Error("Manifest needs the 'activationEvents' property, given it has a 'main' property."); + } else if (hasBrowser) { + throw new Error("Manifest needs the 'activationEvents' property, given it has a 'browser' property."); + } + if (manifest.devDependencies && manifest.devDependencies['@types/vscode']) { validateVSCodeTypesCompatibility(manifest.engines['vscode'], manifest.devDependencies['@types/vscode']); } diff --git a/src/test/package.test.ts b/src/test/package.test.ts index e7efeef8..e86d5a5f 100644 --- a/src/test/package.test.ts +++ b/src/test/package.test.ts @@ -377,6 +377,16 @@ describe('validateManifest', () => { ); }); }); + + it('should validate activationEvents against main and browser', () => { + assert.throws(() => validateManifest(createManifest({ activationEvents: ['any'] }))); + assert.throws(() => validateManifest(createManifest({ main: 'main.js' }))); + assert.throws(() => validateManifest(createManifest({ browser: 'browser.js' }))); + assert.throws(() => validateManifest(createManifest({ main: 'main.js', browser: 'browser.js' }))); + validateManifest(createManifest({ activationEvents: ['any'], main: 'main.js' })); + validateManifest(createManifest({ activationEvents: ['any'], browser: 'browser.js' })); + validateManifest(createManifest({ activationEvents: ['any'], main: 'main.js', browser: 'browser.js' })); + }); }); describe('toVsixManifest', () => {