From 1a86609079999c204beaffe318e4861f475ec408 Mon Sep 17 00:00:00 2001 From: ehmicky Date: Wed, 29 Jul 2020 20:40:15 +0200 Subject: [PATCH] Fix crash during error reporting --- packages/build/src/error/monitor/report.js | 6 +- packages/build/src/error/parse/plugin.js | 8 +- .../plugin_homepage_no_repo/manifest.yml | 2 + .../plugin_homepage_no_repo/netlify.toml | 2 + .../plugin_homepage_no_repo/package.json | 11 +++ .../plugin_homepage_no_repo/plugin.js | 5 ++ .../build/tests/error/snapshots/tests.js.md | 85 ++++++++++++++++++ .../build/tests/error/snapshots/tests.js.snap | Bin 6057 -> 6226 bytes packages/build/tests/error/tests.js | 4 + 9 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 packages/build/tests/error/fixtures/plugin_homepage_no_repo/manifest.yml create mode 100644 packages/build/tests/error/fixtures/plugin_homepage_no_repo/netlify.toml create mode 100644 packages/build/tests/error/fixtures/plugin_homepage_no_repo/package.json create mode 100644 packages/build/tests/error/fixtures/plugin_homepage_no_repo/plugin.js 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 638ec69c6a36a69730219aee229451a37e1e72a1..e84b0c8aceacc5e53563e532e83c763fe3eeff18 100644 GIT binary patch literal 6226 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 literal 6057 zcmV;a7gp#&RzV=)xAH1yj&`eE8<(m2qwW~H&CjwQVN71&m@I}P!wUZJIPMiomu9Qup)|&TKl0Q z>P74I^Hm?M7p0%o`Y37@)X$67i+X+3Uge_YLoHW}daYXRJ&&2)ncdkWn`Ae$;h!&o z-Tygr=A8fepWpBQKXc}sWkV2}il$vCZhh*=ht~e^qD_yF`{VqZIYfRg8ide`wG($; z@aTfZd-gssWX`Gyf99BUI6~WYHykWEwDAMSda8!EdDG0rH!+o!h9zNl5dF$__ zlDCfg2}h-$PDJSR%3B{9{8IDC!8>nln|8{`RUDOWs6^<^6Fz=GJ88lF*MBwXlgGZA z^chE`mrg-w;)k2g(jQo`^y`O*Kep_}ee*afeQX*+LrdR|E&qpaob=o`XU@3itT`N& z-ZKNCE9X8@KIyLQ=T}tx+u7q5%{-f<((9`cYOZ@{#}jvtUHt8~i}qczzR09D8}?oBOV~>Xw@OUp;OgN2R}7jnKc# zbI*Th?df&96Ib4PTJy4D9F?}U;u24*9TI?C{Rl^;y9|VWJ^ii&%Qvs9I(O&DmUA9!I+CN(%hn@w@cL~RjQ9US{+AWE zp>lrkT^yAzx)h;9!?%C1`Pq|R*2@w{7%ewk&QYoFX9(R;{z=)Ej{R*98LOL4eDHxQ zI4a$J4ep;$jtPGL!W(+h!cpn)M-ck9^19uhEi5_kyE}FsbMu}SKS!loe~(N2d3ED;?=Beq z%$l>Gh`iGN2uG!V-HFhBJAb%;+R1~y`)5Z*x?ty@OE2CEu+cd+@IK+;84oGV9&TPT{EZntceB55MfsA3wGI)nitCy}QkK z?P!ilw;w?0jGCtd$1c2k{F%FdecjkM9>>}t(x*N}=s#ZCv+!4If4pNn*ZBJ1&#qn0 zQR$X15c;o+W^G?3-F#g5`TOSl>!mLqc5vq#);%;IKjRYZEjQ5;e(t{V5sDbr89?7biDzu=_Tb}{MW$Kn?6 z81wK=JB|NsYT7$&%wv`BG3l4MU7!8FZf%3SZVw-1gphCVlBN4*h1zgn!;I z&#k>#K6%S8?^|{?lO8DN(36LDKYD24?oIN_(YL?#-5WPC>F6pBU3su<_npGd7q)z_ z?SIyMGg)WSYo>B&;_?S?+k&om<)?oazFPd3XKrNDukffGd%*Dje8K&e;44IEP6{y+WIU85^DmtDR1@+X#;GwFxtacJ?d zj~4&!$%WG{j;uW49}9mlok{On&7mXEFp8ku5Hw~`Y>;o?jaToxabtddufwHZ#+yI2 zq8^o668vmKiiRyAPRDs}%v%j^_W5S;%S2U^6xqk~Gi6qZKr^kxWPg>visYCZ6=n-^78Q46Imp0A;|i;0>h zw2Jt9Q$&<`Rn(MdyCk=oI^v0joO*Irnx=;pQR8Jr=f!oBru!VWH)AN+p56BBX2xTE z#}!S|6*aL$QS>y6)J09Ni|bm@N7_NnW3eKW++e0TnrU2B;-ac2c-AX1L(}Jokx}V%{zT7TEr7*80WL;S2qpD{Y{g7`FqMArV%QCW@NAs+tpF>J4CdlN1 z5;-2@RYPVal=yr;vpK9ANdw|SBB}`Cpl?0CwuCCTIx1*dNsupL%@kQvN-B~W7Bg*- zEZtH^H=7@j1G2OEM3UBgB3hP_#cV$Lm}-5%+5A8WYXYvLF0Ru_?OiO3jn2NSh?NMPX7yj^L}JVi=3*ji@vpHCiRPUI?wheZ4?aWJju^ zM?@7%)>D%khzi3E+u+;aAd_>30hweclb8|~gG_zRiryP`DJ3PAk~>u!sw&DlAC^?y z>$oJG+g1$8k+PzUv?UC{!ltSDO!ElZVKRt4hp@<3R!Yp8>}hqXgoi-Tx}4pOfCtWm z%`|L;hc0|#j&WZL(uT; zS|nM-pkinQAMjVfi0VA$BAO6kQGO}&6FaJ>t#`yz zyvg8973NZi{z1`f=9dX4ZtX~JT_S`+VjTY`C(Q1}qh03{iot7fF(kD}0yk@8(uSW#kG8`OUni`XZ82+e{!lO}YYAP|+Xd)vg&Lqj9 zs1X*4wrK*pWvRvs?HCz_=BSu$YB(a9Ur^~J;_zF4LmOop5_$7qhzvN=%HK7j_p=yS0cBY_#uf)R(!%&8_gLwD=)lG zX+R|zBbC@pD%oawStEoQII`7rAsVG_0jq|OR-!wl7An4A_BKb1i*i_$Ly|~_2CcSz zH@QLv4z8gA``$r4K`Euyu(RGyb0hmz)ht7~Fj!SG=ObK7wwF%9{mBP|ef|~@?Ovt30c!{kz zgPQO=Zu1iY?h(bngB*`&nprUP2v$3W@VL<&m9z*i>3kWM7@EjRBj8Q2UlXG(r zW_ejiI+)y{l}2ZLsTqQl`suusC}7wi&>`^lTm(e?e4Q-vN=uOSiXzvmA{|cFcgL4{ zMbjOEr3Q{!G|l=-E0g>phhbVQj{~j;(_nPlQ5Mg;&V^;MBHLK)!isRvXE!4AtNnA* zgv{@z1)1M!7?WG})7?oW`|!+ZGRb~nYU@^SHNVi)H3NEP#^W9C;!yn-_KNq+5|BQh z*vQ#!aw%gbRgug34f0&yyt%(k^UecQR|}l%w~Zs-ZCQf7%^rHHnrY1*@LpY1mRz{v zMfa7Bg>E>DZeys|UL&2LC;ylpBMF3~lDx($&$^_eqr;EW+BABVIkW=qRm$dd(%V=! z&9*kDBsCODOxnrbt6h(K$C9bOcS>EV1>)JJB4&UW07Z~==CBVW<~CE7paYh3N~Mmx@8~5=(av9 z#z@^^&V3i9Tk8wcBjeA8fL{TTac7Y+1jXL?^@c}sSOvw0MP#`h7+`=fz<>%Hiy>Of zHzb>5$1NI6zChP6@6YvTyqE9C)1Hs}9O(UfKyN^AK<^$}7N9qe%~TfE20-%uMso1O z0m%W$dumyLL|i0i*3%98HWZK(N`VuA6Mz$XXj#As zzzKQd1d8)sh-AqJp{-b4Ec~qY-vaft^!|l33Dg z%-alOH%AY=r|cchu`341$5S&-u!G7#+(9Led!1(6MdcEROu@$hAERKuh4C@E@hrSB znn*nm&ylfMty56mJ-X_w#qK=S^%X!(J*TElwd=x0=R(9g5ZTC(^2kJ1KML_U5K&H+ z2*GX^#Xzu|CD^r(wLXh=J4XkIa|`557?Ot_iC)FH2aW=-VgPy-5aWVt;i9Bsb1lsJ zit8luf@=pxO8S`{V_8Kv-PEL3QhD-_k{s#QkUUkHk4dc&ogJfW77#W>a&n}=PLmYX zm?UEsk=e0v`BbFlXK0KxNGtBxJdIJ@u(D%^k^bkG`^*y z3upr0&?fWgB`4%IXaT^UJs4}JIBzw{m{D}jzc^@sR>r?L92EN`!0pEs5=S!!eTtC zB<6>cyJ^O-Wd?bAZL^~178phpvY^iI_d`5bnBSs{2g_^~a@N_ovrmEa%Jes@e!dwI zVhkz?sUn6x1~y9!xukH4bBzmCajij)^}x7qQ5POy0U<60+UeL1upz9mgLjzau2KzI zGdBmTz(oieiCJ24j1vy4gy{L2+Pa3hb&a)i*l^8y$~8e^i(xEuqxzD=aYZ8M<)-PY zlu`p3r6zB(>aCK(j#*cn(5!?LNqX(VXTZtr4B<#JZFed~({Tle+~k#1ib`WET>n*W zz6#B?fl`LgeTgv5VZJV+B`}M{N-L}>Fj>LEq#8|mh@xkPm>d_3#dAeH6ruMq<%Sx? z;vDGH@ML=|Y-_v(6R;RaE(THOouQ zJR7Xc#5Qn_^(mup*hI=0EL*UQAY}uYop0~^4W-WBhke?5fm%83(>7ul_+vTvW8i*y z&iyI|ud9%g@2*}HUF@?I$DVVjMHkSG+SoUq6l+1DoTxN)b;FA)4!?yptd}lJLEI4f zInlG}x-6t<_;Wp=kHw@a!b$8e>B zX8%|6OKYl^)HGzZpQMS(ioR6Dft8+Y{ozEhNq%MXdu}IQvXcn=gE^hQVU+$`p$(YD2XrPT(nN7M1VP1(dR!Uae!4L=* zM#B=O;sf+d8}oMXWH-kG47g4Xc7S6YeBM|gU7&*9cb>qAso0>8ADHCFW+S7f6?uj69FX=r zKpH?AKw6(bniQkZ0if33pf(tmAi}gwG2vb|8-r;Zn=)Y92BvL#Gi}2<2!9urLZ4crKBb{T)yFOJ4V=HWryv#cVoNQ_sE3;i}vzo>nfL91p%~KlrM>#_4_n zPG-*ECqvqs<9VZrk*)yQFX&i&p5d|J8G>gBo*{UKc~&lXhMxBf?WZS$mk3^BE~X7$ zV$LcnCND7nZxIhXFR}QamllKH21hAcYRGXH&dIO~C+xymth;c+DobEbkFsY`F$Ao# z^y(_hqhR|405#8mTAJNJNRXkDA_4qHIV2d^^R8J(ww9p~EszMo{Kj`+&s~qGN(b4? zK&Oh18VflvLFhE_j(|bEnauHTeIv`0pD0_lsejGh|G~$jz+!2Tyh4Ty=OFj)5!wn`!MwwqwTG}x4PzmdMEjuQ{JT0P9 zltT(Ndcl4&1Q|v$o5|%v=9yVhQEtU*C8M483~!FRHw$se zecNWcvNN`Cc9=>a!&U+%?wdGwd6|tpGq!W47iR9~oZJ`LWjklH!|CqJ>E@i=*IC7# zhuteJd0n>tH&0Q{x { 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 } })