From c36d1a749d45199d43510e58cb6ee99dfeca7876 Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Sat, 1 Dec 2018 15:19:16 -0500 Subject: [PATCH 1/7] Defer throwing asset errors until after dependencies are handled. This allows compiled langauges like Elm that handle their own dependency compilation to set up watchers for dependencies so that hot-reload continues to work due to errors in new depdenencies. Fixes #2147. --- packages/core/parcel-bundler/src/Bundler.js | 7 +++ packages/core/parcel-bundler/src/Pipeline.js | 13 +++-- .../parcel-bundler/src/assets/ElmAsset.js | 18 ++++--- .../src/builtins/hmr-runtime.js | 50 +++++++++++-------- 4 files changed, 57 insertions(+), 31 deletions(-) diff --git a/packages/core/parcel-bundler/src/Bundler.js b/packages/core/parcel-bundler/src/Bundler.js index f82222bf88f..98238faa5a2 100644 --- a/packages/core/parcel-bundler/src/Bundler.js +++ b/packages/core/parcel-bundler/src/Bundler.js @@ -593,6 +593,13 @@ class Bundler extends EventEmitter { }) ); + // If there was a processing error, re-throw now that we've set up + // depdenency watchers. This keeps reloading working if there is an + // error in a dependency not directly handled by Parcel. + if (processed.error !== null) { + throw processed.error; + } + // Store resolved assets in their original order dependencies.forEach((dep, i) => { asset.dependencies.set(dep.name, dep); diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index 03a7579492f..b063495e0d3 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -17,16 +17,23 @@ class Pipeline { } let asset = this.parser.getAsset(path, options); - let generated = await this.processAsset(asset); + let error = null; let generatedMap = {}; - for (let rendition of generated) { - generatedMap[rendition.type] = rendition.value; + try { + let generated = await this.processAsset(asset); + for (let rendition of generated) { + generatedMap[rendition.type] = rendition.value; + } + } catch (err) { + error = err; + error.fileName = path; } return { id: asset.id, dependencies: Array.from(asset.dependencies.values()), generated: generatedMap, + error: error, hash: asset.hash, cacheData: asset.cacheData }; diff --git a/packages/core/parcel-bundler/src/assets/ElmAsset.js b/packages/core/parcel-bundler/src/assets/ElmAsset.js index 7a2309b3a5f..b4a6a56be59 100644 --- a/packages/core/parcel-bundler/src/assets/ElmAsset.js +++ b/packages/core/parcel-bundler/src/assets/ElmAsset.js @@ -44,12 +44,7 @@ class ElmAsset extends Asset { options.optimize = true; } - let compiled = await this.elm.compileToString(this.name, options); - this.contents = compiled.toString(); - if (this.options.hmr) { - let {inject} = await localRequire('elm-hot', this.name); - this.contents = inject(this.contents); - } + this.elmOpts = options; } async collectDependencies() { @@ -76,6 +71,13 @@ class ElmAsset extends Asset { } async generate() { + let compiled = await this.elm.compileToString(this.name, this.elmOpts); + this.contents = compiled.toString(); + if (this.options.hmr) { + let {inject} = await localRequire('elm-hot', this.name); + this.contents = inject(this.contents); + } + let output = this.contents; if (this.options.minify) { @@ -129,6 +131,10 @@ class ElmAsset extends Asset { return result.code; } } + + generateErrorMessage(err) { + return err.message; + } } module.exports = ElmAsset; diff --git a/packages/core/parcel-bundler/src/builtins/hmr-runtime.js b/packages/core/parcel-bundler/src/builtins/hmr-runtime.js index 74efb86d4d6..6d67895282a 100644 --- a/packages/core/parcel-bundler/src/builtins/hmr-runtime.js +++ b/packages/core/parcel-bundler/src/builtins/hmr-runtime.js @@ -8,10 +8,10 @@ function Module(moduleName) { data: module.bundle.hotData, _acceptCallbacks: [], _disposeCallbacks: [], - accept: function (fn) { - this._acceptCallbacks.push(fn || function () {}); + accept: function(fn) { + this._acceptCallbacks.push(fn || function() {}); }, - dispose: function (fn) { + dispose: function(fn) { this._disposeCallbacks.push(fn); } }; @@ -25,18 +25,20 @@ var parent = module.bundle.parent; if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { var hostname = process.env.HMR_HOSTNAME || location.hostname; var protocol = location.protocol === 'https:' ? 'wss' : 'ws'; - var ws = new WebSocket(protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/'); + var ws = new WebSocket( + protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/' + ); ws.onmessage = function(event) { var data = JSON.parse(event.data); if (data.type === 'update') { console.clear(); - data.assets.forEach(function (asset) { + data.assets.forEach(function(asset) { hmrApply(global.parcelRequire, asset); }); - data.assets.forEach(function (asset) { + data.assets.forEach(function(asset) { if (!asset.isNew) { hmrAccept(global.parcelRequire, asset.id); } @@ -45,9 +47,9 @@ if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { if (data.type === 'reload') { ws.close(); - ws.onclose = function () { + ws.onclose = function() { location.reload(); - } + }; } if (data.type === 'error-resolved') { @@ -57,7 +59,9 @@ if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { } if (data.type === 'error') { - console.error('[parcel] 🚨 ' + data.error.message + '\n' + data.error.stack); + console.error( + '[parcel] 🚨 ' + data.error.message + '\n' + (data.error.stack || '') + ); removeErrorOverlay(); @@ -82,19 +86,21 @@ function createErrorOverlay(data) { var message = document.createElement('div'); var stackTrace = document.createElement('pre'); message.innerText = data.error.message; - stackTrace.innerText = data.error.stack; + stackTrace.innerText = data.error.stack || ''; - overlay.innerHTML = ( + overlay.innerHTML = '
' + - 'ERROR' + - '🚨' + - '
' + message.innerHTML + '
' + - '
' + stackTrace.innerHTML + '
' + - '
' - ); + 'ERROR' + + '🚨' + + '
' + + message.innerHTML + + '
' + + '
' +
+    stackTrace.innerHTML +
+    '
' + + ''; return overlay; - } function getParents(bundle, id) { @@ -154,7 +160,7 @@ function hmrAccept(bundle, id) { } if (cached && cached.hot && cached.hot._disposeCallbacks.length) { - cached.hot._disposeCallbacks.forEach(function (cb) { + cached.hot._disposeCallbacks.forEach(function(cb) { cb(bundle.hotData); }); } @@ -164,13 +170,13 @@ function hmrAccept(bundle, id) { cached = bundle.cache[id]; if (cached && cached.hot && cached.hot._acceptCallbacks.length) { - cached.hot._acceptCallbacks.forEach(function (cb) { + cached.hot._acceptCallbacks.forEach(function(cb) { cb(); }); return true; } - return getParents(global.parcelRequire, id).some(function (id) { - return hmrAccept(global.parcelRequire, id) + return getParents(global.parcelRequire, id).some(function(id) { + return hmrAccept(global.parcelRequire, id); }); } From e7ba2847c09ed1edbe3b6c7c3ae8b653caba520d Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Thu, 27 Dec 2018 22:01:08 -0500 Subject: [PATCH 2/7] Fix Elm error generation. I'm not entirely sure why this fix is necessary, but without it a compile error during a rebuild results in Parcel printing "Unknown error" instead of anything useful. Since we are intecepting the error though, we can also remove redundant stack information. --- packages/core/parcel-bundler/src/assets/ElmAsset.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/core/parcel-bundler/src/assets/ElmAsset.js b/packages/core/parcel-bundler/src/assets/ElmAsset.js index b4a6a56be59..f16f6ffe8b6 100644 --- a/packages/core/parcel-bundler/src/assets/ElmAsset.js +++ b/packages/core/parcel-bundler/src/assets/ElmAsset.js @@ -133,7 +133,16 @@ class ElmAsset extends Asset { } generateErrorMessage(err) { - return err.message; + // For some reason, if not converted to a plain object, + // the error message is lost somewhere between Pipeline.js + // and Bundler.js. + + // The stack is not particularly useful, but other code may + // expect it and try to print it. + return { + message: err.message, + stack: '' + }; } } From 1315f350423e7ec0b78351a16d9e0e6f05352a57 Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Fri, 28 Dec 2018 00:02:26 -0500 Subject: [PATCH 3/7] Add test for tracking dependencies on error --- packages/core/integration-tests/test/hmr.js | 44 +++++++++++++++++ .../test/integration/elm/src/BrokenDep.elm | 8 ++++ .../integration/elm/src/MainWithBrokenDep.elm | 48 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm create mode 100644 packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm diff --git a/packages/core/integration-tests/test/hmr.js b/packages/core/integration-tests/test/hmr.js index e06276c6e30..a7e43ad26d9 100644 --- a/packages/core/integration-tests/test/hmr.js +++ b/packages/core/integration-tests/test/hmr.js @@ -529,4 +529,48 @@ describe('hmr', function() { await buildEnd; }); + + it('should watch new dependencies that cause errors', async function() { + await ncp( + path.join(__dirname, '/integration/elm'), + path.join(__dirname, '/input') + ); + + b = bundler(path.join(__dirname, '/input/index.js'), { + watch: true, + hmr: true + }); + await b.bundle(); + + ws = new WebSocket('ws://localhost:' + b.options.hmrPort); + + const buildEnd = nextEvent(b, 'buildEnd'); + + await sleep(100); + ncp( + path.join(__dirname, '/input/src/MainWithBrokenDep.elm'), + path.join(__dirname, '/input/src/Main.elm') + ); + + let msg = JSON.parse(await nextEvent(ws, 'message')); + assert.equal(msg.type, 'error'); + + await sleep(100); + fs.writeFile( + path.join(__dirname, '/input/src/BrokenDep.elm'), + ` +module BrokenDep exposing (anError) + + +anError : String +anError = + "2" + ` + ); + + msg = JSON.parse(await nextEvent(ws, 'message')); + assert.equal(msg.type, 'error-resolved'); + + await buildEnd; + }); }); diff --git a/packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm b/packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm new file mode 100644 index 00000000000..b52d49738bd --- /dev/null +++ b/packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm @@ -0,0 +1,8 @@ +module BrokenDep exposing (anError) + +{- This module causes a compiler error -} + + +anError : String +anError = + 2 diff --git a/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm b/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm new file mode 100644 index 00000000000..8f09a47fb43 --- /dev/null +++ b/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm @@ -0,0 +1,48 @@ +module Main exposing (main) + +import BrokenDep +import Browser +import Html exposing (Html, button, div, text) +import Html.Events exposing (onClick) + + +type alias Model = + { count : Int } + + +initialModel : Model +initialModel = + { count = 0 } + + +type Msg + = Increment + | Decrement + + +update : Msg -> Model -> Model +update msg model = + case msg of + Increment -> + { model | count = model.count + 1 } + + Decrement -> + { model | count = model.count - 1 } + + +view : Model -> Html Msg +view model = + div [] + [ button [ onClick Increment ] [ text "+1" ] + , div [] [ text <| String.fromInt model.count ] + , button [ onClick Decrement ] [ text "-1" ] + ] + + +main : Program () Model Msg +main = + Browser.sandbox + { init = initialModel + , view = view + , update = update + } From 83335d10ce79ebf96296e629ea6e216d9377bc6f Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Fri, 28 Dec 2018 00:15:13 -0500 Subject: [PATCH 4/7] revert hmr-runtime changes --- .../src/builtins/hmr-runtime.js | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/packages/core/parcel-bundler/src/builtins/hmr-runtime.js b/packages/core/parcel-bundler/src/builtins/hmr-runtime.js index 6d67895282a..74efb86d4d6 100644 --- a/packages/core/parcel-bundler/src/builtins/hmr-runtime.js +++ b/packages/core/parcel-bundler/src/builtins/hmr-runtime.js @@ -8,10 +8,10 @@ function Module(moduleName) { data: module.bundle.hotData, _acceptCallbacks: [], _disposeCallbacks: [], - accept: function(fn) { - this._acceptCallbacks.push(fn || function() {}); + accept: function (fn) { + this._acceptCallbacks.push(fn || function () {}); }, - dispose: function(fn) { + dispose: function (fn) { this._disposeCallbacks.push(fn); } }; @@ -25,20 +25,18 @@ var parent = module.bundle.parent; if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { var hostname = process.env.HMR_HOSTNAME || location.hostname; var protocol = location.protocol === 'https:' ? 'wss' : 'ws'; - var ws = new WebSocket( - protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/' - ); + var ws = new WebSocket(protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/'); ws.onmessage = function(event) { var data = JSON.parse(event.data); if (data.type === 'update') { console.clear(); - data.assets.forEach(function(asset) { + data.assets.forEach(function (asset) { hmrApply(global.parcelRequire, asset); }); - data.assets.forEach(function(asset) { + data.assets.forEach(function (asset) { if (!asset.isNew) { hmrAccept(global.parcelRequire, asset.id); } @@ -47,9 +45,9 @@ if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { if (data.type === 'reload') { ws.close(); - ws.onclose = function() { + ws.onclose = function () { location.reload(); - }; + } } if (data.type === 'error-resolved') { @@ -59,9 +57,7 @@ if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { } if (data.type === 'error') { - console.error( - '[parcel] 🚨 ' + data.error.message + '\n' + (data.error.stack || '') - ); + console.error('[parcel] 🚨 ' + data.error.message + '\n' + data.error.stack); removeErrorOverlay(); @@ -86,21 +82,19 @@ function createErrorOverlay(data) { var message = document.createElement('div'); var stackTrace = document.createElement('pre'); message.innerText = data.error.message; - stackTrace.innerText = data.error.stack || ''; + stackTrace.innerText = data.error.stack; - overlay.innerHTML = + overlay.innerHTML = ( '
' + - 'ERROR' + - '🚨' + - '
' + - message.innerHTML + - '
' + - '
' +
-    stackTrace.innerHTML +
-    '
' + - '
'; + 'ERROR' + + '🚨' + + '
' + message.innerHTML + '
' + + '
' + stackTrace.innerHTML + '
' + + '' + ); return overlay; + } function getParents(bundle, id) { @@ -160,7 +154,7 @@ function hmrAccept(bundle, id) { } if (cached && cached.hot && cached.hot._disposeCallbacks.length) { - cached.hot._disposeCallbacks.forEach(function(cb) { + cached.hot._disposeCallbacks.forEach(function (cb) { cb(bundle.hotData); }); } @@ -170,13 +164,13 @@ function hmrAccept(bundle, id) { cached = bundle.cache[id]; if (cached && cached.hot && cached.hot._acceptCallbacks.length) { - cached.hot._acceptCallbacks.forEach(function(cb) { + cached.hot._acceptCallbacks.forEach(function (cb) { cb(); }); return true; } - return getParents(global.parcelRequire, id).some(function(id) { - return hmrAccept(global.parcelRequire, id); + return getParents(global.parcelRequire, id).some(function (id) { + return hmrAccept(global.parcelRequire, id) }); } From 077f20eac3bff7b71ae09b39f6d344d0ae16a1f2 Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Fri, 28 Dec 2018 00:58:33 -0500 Subject: [PATCH 5/7] Transform all errors in Pipeline.process. This prevents error data from being lost when Pipeline is run via `WorkerFarm`. --- packages/core/parcel-bundler/src/Pipeline.js | 3 ++- .../core/parcel-bundler/src/assets/ElmAsset.js | 14 ++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index b063495e0d3..e076fa90f81 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -1,5 +1,6 @@ const Parser = require('./Parser'); const path = require('path'); +const {errorUtils} = require('@parcel/utils'); /** * A Pipeline composes multiple Asset types together. @@ -25,7 +26,7 @@ class Pipeline { generatedMap[rendition.type] = rendition.value; } } catch (err) { - error = err; + error = errorUtils.errorToJson(err); error.fileName = path; } diff --git a/packages/core/parcel-bundler/src/assets/ElmAsset.js b/packages/core/parcel-bundler/src/assets/ElmAsset.js index f16f6ffe8b6..849820fc3be 100644 --- a/packages/core/parcel-bundler/src/assets/ElmAsset.js +++ b/packages/core/parcel-bundler/src/assets/ElmAsset.js @@ -133,16 +133,10 @@ class ElmAsset extends Asset { } generateErrorMessage(err) { - // For some reason, if not converted to a plain object, - // the error message is lost somewhere between Pipeline.js - // and Bundler.js. - - // The stack is not particularly useful, but other code may - // expect it and try to print it. - return { - message: err.message, - stack: '' - }; + // The generated stack is notuseful, but other code may + // expect it and try to print it, so make it an empty string. + err.stack == ''; + return err; } } From a6b9358f9f133501ecf511d31d807851553f1267 Mon Sep 17 00:00:00 2001 From: Matthew Cheely Date: Fri, 28 Dec 2018 10:31:51 -0500 Subject: [PATCH 6/7] Separate error-depenency test input from basic Elm tests. --- packages/core/integration-tests/test/hmr.js | 18 +++++-- .../test/integration/elm-dep-error/elm.json | 24 ++++++++++ .../test/integration/elm-dep-error/index.js | 5 ++ .../{elm => elm-dep-error}/src/BrokenDep.elm | 0 .../integration/elm-dep-error/src/Main.elm | 7 +++ .../integration/elm/src/MainWithBrokenDep.elm | 48 ------------------- .../parcel-bundler/src/assets/ElmAsset.js | 2 +- 7 files changed, 50 insertions(+), 54 deletions(-) create mode 100644 packages/core/integration-tests/test/integration/elm-dep-error/elm.json create mode 100644 packages/core/integration-tests/test/integration/elm-dep-error/index.js rename packages/core/integration-tests/test/integration/{elm => elm-dep-error}/src/BrokenDep.elm (100%) create mode 100644 packages/core/integration-tests/test/integration/elm-dep-error/src/Main.elm delete mode 100644 packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm diff --git a/packages/core/integration-tests/test/hmr.js b/packages/core/integration-tests/test/hmr.js index a7e43ad26d9..7ea84ce743b 100644 --- a/packages/core/integration-tests/test/hmr.js +++ b/packages/core/integration-tests/test/hmr.js @@ -532,7 +532,7 @@ describe('hmr', function() { it('should watch new dependencies that cause errors', async function() { await ncp( - path.join(__dirname, '/integration/elm'), + path.join(__dirname, '/integration/elm-dep-error'), path.join(__dirname, '/input') ); @@ -547,9 +547,17 @@ describe('hmr', function() { const buildEnd = nextEvent(b, 'buildEnd'); await sleep(100); - ncp( - path.join(__dirname, '/input/src/MainWithBrokenDep.elm'), - path.join(__dirname, '/input/src/Main.elm') + fs.writeFile( + path.join(__dirname, '/input/src/Main.elm'), + ` +module Main exposing (main) + +import BrokenDep +import Html + +main = + Html.text "Hello, world!" + ` ); let msg = JSON.parse(await nextEvent(ws, 'message')); @@ -564,7 +572,7 @@ module BrokenDep exposing (anError) anError : String anError = - "2" + "fixed" ` ); diff --git a/packages/core/integration-tests/test/integration/elm-dep-error/elm.json b/packages/core/integration-tests/test/integration/elm-dep-error/elm.json new file mode 100644 index 00000000000..dd41cae2a31 --- /dev/null +++ b/packages/core/integration-tests/test/integration/elm-dep-error/elm.json @@ -0,0 +1,24 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.0", + "dependencies": { + "direct": { + "elm/browser": "1.0.0", + "elm/core": "1.0.0", + "elm/html": "1.0.0" + }, + "indirect": { + "elm/json": "1.0.0", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.0" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/elm-dep-error/index.js b/packages/core/integration-tests/test/integration/elm-dep-error/index.js new file mode 100644 index 00000000000..61906ed5a66 --- /dev/null +++ b/packages/core/integration-tests/test/integration/elm-dep-error/index.js @@ -0,0 +1,5 @@ +var local = require('./src/Main.elm'); + +module.exports = function () { + return local; +}; \ No newline at end of file diff --git a/packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm b/packages/core/integration-tests/test/integration/elm-dep-error/src/BrokenDep.elm similarity index 100% rename from packages/core/integration-tests/test/integration/elm/src/BrokenDep.elm rename to packages/core/integration-tests/test/integration/elm-dep-error/src/BrokenDep.elm diff --git a/packages/core/integration-tests/test/integration/elm-dep-error/src/Main.elm b/packages/core/integration-tests/test/integration/elm-dep-error/src/Main.elm new file mode 100644 index 00000000000..67393aaa654 --- /dev/null +++ b/packages/core/integration-tests/test/integration/elm-dep-error/src/Main.elm @@ -0,0 +1,7 @@ +module Main exposing (main) + +import Html + + +main = + Html.text "Hello, world!" diff --git a/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm b/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm deleted file mode 100644 index 8f09a47fb43..00000000000 --- a/packages/core/integration-tests/test/integration/elm/src/MainWithBrokenDep.elm +++ /dev/null @@ -1,48 +0,0 @@ -module Main exposing (main) - -import BrokenDep -import Browser -import Html exposing (Html, button, div, text) -import Html.Events exposing (onClick) - - -type alias Model = - { count : Int } - - -initialModel : Model -initialModel = - { count = 0 } - - -type Msg - = Increment - | Decrement - - -update : Msg -> Model -> Model -update msg model = - case msg of - Increment -> - { model | count = model.count + 1 } - - Decrement -> - { model | count = model.count - 1 } - - -view : Model -> Html Msg -view model = - div [] - [ button [ onClick Increment ] [ text "+1" ] - , div [] [ text <| String.fromInt model.count ] - , button [ onClick Decrement ] [ text "-1" ] - ] - - -main : Program () Model Msg -main = - Browser.sandbox - { init = initialModel - , view = view - , update = update - } diff --git a/packages/core/parcel-bundler/src/assets/ElmAsset.js b/packages/core/parcel-bundler/src/assets/ElmAsset.js index 849820fc3be..5a0f4cc86e7 100644 --- a/packages/core/parcel-bundler/src/assets/ElmAsset.js +++ b/packages/core/parcel-bundler/src/assets/ElmAsset.js @@ -133,7 +133,7 @@ class ElmAsset extends Asset { } generateErrorMessage(err) { - // The generated stack is notuseful, but other code may + // The generated stack is not useful, but other code may // expect it and try to print it, so make it an empty string. err.stack == ''; return err; From e1f027fe58dbd1fc3785d2cfc7b30d675b92ae93 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Mon, 31 Dec 2018 16:17:32 +0100 Subject: [PATCH 7/7] Update ElmAsset.js --- packages/core/parcel-bundler/src/assets/ElmAsset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/parcel-bundler/src/assets/ElmAsset.js b/packages/core/parcel-bundler/src/assets/ElmAsset.js index 5a0f4cc86e7..5f81ebc1260 100644 --- a/packages/core/parcel-bundler/src/assets/ElmAsset.js +++ b/packages/core/parcel-bundler/src/assets/ElmAsset.js @@ -135,7 +135,7 @@ class ElmAsset extends Asset { generateErrorMessage(err) { // The generated stack is not useful, but other code may // expect it and try to print it, so make it an empty string. - err.stack == ''; + err.stack = ''; return err; } }