diff --git a/packages/build/src/error/monitor/report.js b/packages/build/src/error/monitor/report.js index 10c8af7874..65001359f1 100644 --- a/packages/build/src/error/monitor/report.js +++ b/packages/build/src/error/monitor/report.js @@ -61,19 +61,19 @@ const getGroupingHash = function(group, error, type) { } const getMetadata = function({ location, plugin }, childEnv, groupingHash) { - const pluginMetadata = getPluginMetadata(plugin) + const pluginMetadata = getPluginMetadata({ location, plugin }) const envMetadata = getEnvMetadata(childEnv) const locationMetadata = getLocationMetadata(location, envMetadata) return { location: locationMetadata, ...pluginMetadata, env: envMetadata, other: { groupingHash } } } -const getPluginMetadata = function(plugin) { +const getPluginMetadata = function({ location, plugin }) { if (plugin === undefined) { return {} } const { pluginPackageJson, ...pluginA } = plugin - const homepage = getHomepage(pluginPackageJson) + const homepage = getHomepage(pluginPackageJson, location) return { plugin: { ...pluginA, homepage }, pluginPackageJson } } diff --git a/packages/build/src/error/parse/plugin.js b/packages/build/src/error/parse/plugin.js index 80069bbe76..af1b4d7bed 100644 --- a/packages/build/src/error/parse/plugin.js +++ b/packages/build/src/error/parse/plugin.js @@ -36,8 +36,12 @@ const getVersion = function({ version }) { return version } -const getHomepage = function(pluginPackageJson = {}) { - return getRepository(pluginPackageJson) || getNpmLink(pluginPackageJson) || getIssuesLink(pluginPackageJson) +const getHomepage = function(pluginPackageJson = {}, { loadedFrom }) { + return ( + getRepository(pluginPackageJson) || + getNpmLink(pluginPackageJson, { loadedFrom }) || + getIssuesLink(pluginPackageJson) + ) } const getRepository = function({ repository: { url } = {} }) { diff --git a/packages/build/tests/error/fixtures/plugin_homepage_no_repo/manifest.yml b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/manifest.yml new file mode 100644 index 0000000000..a3512f0259 --- /dev/null +++ b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/manifest.yml @@ -0,0 +1,2 @@ +name: test +inputs: [] diff --git a/packages/build/tests/error/fixtures/plugin_homepage_no_repo/netlify.toml b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/netlify.toml new file mode 100644 index 0000000000..4b06556c85 --- /dev/null +++ b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/netlify.toml @@ -0,0 +1,2 @@ +[[plugins]] +package = "./plugin.js" diff --git a/packages/build/tests/error/fixtures/plugin_homepage_no_repo/package.json b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/package.json new file mode 100644 index 0000000000..b6717e5216 --- /dev/null +++ b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/package.json @@ -0,0 +1,11 @@ +{ + "name": "test-plugin", + "description": "test", + "version": "1.0.0", + "private": true, + "author": "Netlify", + "license": "MIT", + "bugs": { + "url": "https://test.com" + } +} diff --git a/packages/build/tests/error/fixtures/plugin_homepage_no_repo/plugin.js b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/plugin.js new file mode 100644 index 0000000000..ef78f0acf1 --- /dev/null +++ b/packages/build/tests/error/fixtures/plugin_homepage_no_repo/plugin.js @@ -0,0 +1,5 @@ +module.exports = { + onPreBuild() { + throw new Error('test') + }, +} diff --git a/packages/build/tests/error/snapshots/tests.js.md b/packages/build/tests/error/snapshots/tests.js.md index c3e58c8d4e..9780cf5b24 100644 --- a/packages/build/tests/error/snapshots/tests.js.md +++ b/packages/build/tests/error/snapshots/tests.js.md @@ -1603,6 +1603,91 @@ Generated by [AVA](https://ava.li). }␊ }` +## Report plugin homepage without a repository + +> Snapshot 1 + + `␊ + ┌─────────────────────────────┐␊ + │ Netlify Build │␊ + └─────────────────────────────┘␊ + ␊ + > Version␊ + @netlify/build 1.0.0␊ + ␊ + > Flags␊ + debug: true␊ + repositoryRoot: /file/path␊ + testOpts:␊ + errorMonitor: true␊ + ␊ + > Current directory␊ + /file/path␊ + ␊ + > Config file␊ + /file/path␊ + ␊ + > Resolved config␊ + plugins:␊ + - inputs: {}␊ + origin: config␊ + package: /file/path␊ + ␊ + > Context␊ + production␊ + ␊ + > Loading plugins␊ + - /file/path from netlify.toml␊ + ␊ + ┌────────────────────────────────────────┐␊ + │ 1. onPreBuild command from /file/path │␊ + └────────────────────────────────────────┘␊ + ␊ + ␊ + ┌─────────────────────────────────────┐␊ + │ Plugin "/file/path" internal error │␊ + └─────────────────────────────────────┘␊ + ␊ + Error message␊ + Error: test␊ + ␊ + Plugin details␊ + Package: /file/path␊ + Version: 1.0.0␊ + Report issues: https://test.com␊ + ␊ + Error location␊ + In "onPreBuild" event in "/file/path" from netlify.toml␊ + STACK TRACE␊ + ␊ + Resolved config␊ + plugins:␊ + - inputs: {}␊ + origin: config␊ + package: /file/path␊ + ␊ + Error monitoring payload:␊ + {␊ + "errorClass": "pluginInternal",␊ + "errorMessage": "test",␊ + "context": "Plugin /"/file/path" internal error",␊ + "groupingHash": "Plugin /"/file/path" internal error/ntest",␊ + "severity": "info",␊ + "unhandled": false,␊ + "location": {␊ + "event": "onPreBuild",␊ + "package": "/file/path",␊ + "loadedFrom": "local",␊ + "origin": "config"␊ + },␊ + "package": "/file/path",␊ + "pluginPackageJson": true,␊ + "homepage": "https://test.com",␊ + "other": {␊ + "groupingHash": "Plugin /"/file/path" internal error/ntest"␊ + }␊ + }` + ## Report plugin input error > Snapshot 1 diff --git a/packages/build/tests/error/snapshots/tests.js.snap b/packages/build/tests/error/snapshots/tests.js.snap index 638ec69c6a..e84b0c8ace 100644 Binary files a/packages/build/tests/error/snapshots/tests.js.snap and b/packages/build/tests/error/snapshots/tests.js.snap differ diff --git a/packages/build/tests/error/tests.js b/packages/build/tests/error/tests.js index dbe03f0394..c045a7917b 100644 --- a/packages/build/tests/error/tests.js +++ b/packages/build/tests/error/tests.js @@ -209,6 +209,10 @@ test('Report plugin homepage', async t => { await runFixture(t, 'plugin_homepage', { flags }) }) +test('Report plugin homepage without a repository', async t => { + await runFixture(t, 'plugin_homepage_no_repo', { flags }) +}) + test('Report plugin origin', async t => { const defaultConfig = JSON.stringify({ plugins: [{ package: './plugin.js' }] }) await runFixture(t, 'plugin_origin', { flags: { ...flags, defaultConfig } })