├── .editorconfig ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── example ├── .eslintrc ├── .gitignore ├── README.md ├── elm.json ├── package-lock.json ├── package.json ├── src │ ├── Hello │ │ ├── World.elm │ │ └── World │ │ │ └── Content.elm │ ├── Main.elm │ ├── index.html │ └── index.js └── webpack.config.js ├── index.js ├── package-lock.json ├── package.json └── test ├── .eslintrc ├── fixtures ├── Bad.elm ├── Good.elm ├── GoodDependency.elm └── elm.json ├── loader.js └── other_elm_source_dir └── DUMMY.md /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [node_modules/**.js] 16 | codepaint = false 17 | 18 | [Makefile] 19 | indent_style = tab 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | elm-stuff/ 2 | node_modules/ 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | 3 | cache: 4 | directories: 5 | - test/elm-stuff/build-artifacts 6 | 7 | os: 8 | - osx 9 | - linux 10 | 11 | env: 12 | matrix: 13 | - ELM_VERSION=0.19.0-no-deps TARGET_NODE_VERSION=8 14 | - ELM_VERSION=0.19.0-no-deps TARGET_NODE_VERSION=10 15 | - ELM_VERSION=0.19.0-no-deps TARGET_NODE_VERSION=11 16 | - ELM_VERSION=0.19.0-no-deps TARGET_NODE_VERSION=12 17 | 18 | before_install: 19 | - if [ ${TRAVIS_OS_NAME} == "osx" ]; 20 | then brew update; brew install nvm; mkdir ~/.nvm; export NVM_DIR=~/.nvm; source $(brew --prefix nvm)/nvm.sh; 21 | fi 22 | 23 | install: 24 | - nvm install $TARGET_NODE_VERSION 25 | - nvm use $TARGET_NODE_VERSION 26 | - node --version 27 | - npm --version 28 | - npm install -g elm@$ELM_VERSION 29 | - npm install 30 | 31 | script: 32 | - npm test 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015, Richard Feldman 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of elm-stylesheets nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Elm loader [![Version](https://img.shields.io/npm/v/elm-webpack-loader.svg)](https://www.npmjs.com/package/elm-webpack-loader) [![Travis build Status](https://travis-ci.org/elm-community/elm-webpack-loader.svg?branch=master)](http://travis-ci.org/elm-community/elm-webpack-loader) 2 | 3 | [Webpack](https://webpack.js.org/) loader for the [Elm](http://elm-lang.org/) programming language. 4 | 5 | It is aware of Elm dependencies and tracks them. This means that in watch 6 | mode, if you `require` an Elm module from a Webpack entry point, not only will 7 | that `.elm` file be watched for changes, but any other Elm modules it imports will 8 | be watched for changes as well. 9 | 10 | ## Installation 11 | 12 | ```sh 13 | $ npm install --save elm-webpack-loader 14 | ``` 15 | 16 | ## Usage 17 | 18 | Documentation: [rules](https://webpack.js.org/configuration/module/#rule) 19 | 20 | `webpack.config.js`: 21 | 22 | ```js 23 | module.exports = { 24 | module: { 25 | rules: [{ 26 | test: /\.elm$/, 27 | exclude: [/elm-stuff/, /node_modules/], 28 | use: { 29 | loader: 'elm-webpack-loader', 30 | options: {} 31 | } 32 | }] 33 | } 34 | }; 35 | ``` 36 | 37 | See the [examples](#example) section below for the complete webpack configuration. 38 | 39 | ### Options 40 | 41 | #### cwd (default null) *Recommended* 42 | 43 | You can add `cwd=elmSource` to the loader: 44 | 45 | ```js 46 | var elmSource = __dirname + '/elm/path/in/project' 47 | ... 48 | use: { 49 | loader: 'elm-webpack-loader', 50 | options: { 51 | cwd: elmSource 52 | } 53 | } 54 | ... 55 | ``` 56 | 57 | `cwd` should be set to the same directory as your `elm.json` file. You can use this to specify a custom location within your project for your elm files. Note, this 58 | will cause the compiler to look for **all** elm source files in the specified directory. This 59 | approach is recommended as it allows the compile to watch elm.json as well as every file 60 | in the source directories. 61 | 62 | #### Optimize (default is true in production mode) 63 | 64 | Set this to true to compile bundle in optimized mode. See for more information. 65 | 66 | ```js 67 | ... 68 | use: { 69 | loader: 'elm-webpack-loader', 70 | options: { 71 | optimize: true 72 | } 73 | } 74 | ... 75 | ``` 76 | 77 | #### Debug (default is true in development mode) 78 | 79 | Set this to true to enable Elm's time traveling debugger. 80 | 81 | ```js 82 | ... 83 | use: { 84 | loader: 'elm-webpack-loader', 85 | options: { 86 | debug: true 87 | } 88 | } 89 | ... 90 | ``` 91 | 92 | #### RuntimeOptions (default `undefined`) 93 | 94 | This allows you to control aspects of how `elm make` runs with [GHC Runtime Options](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/runtime_control.html). 95 | 96 | The 0.19 version of `elm make` supports a limited set of those options, the most useful of which is 97 | for profiling a build. To profile a build use the settings `runtimeOptions: '-s'`, which will print 98 | out information on how much time is spent in mutations, in the garbage collector, etc. 99 | 100 | _Note_: Using the flags below requires building a new `elm make` binary with `-rtsopts` enabled! 101 | 102 | If you notice your build spending a lot of time in the garbage collector, you can likely optimize it 103 | with some additional flags to give it more memory, `e.g. -A128M -H128M -n8m`. 104 | 105 | ```js 106 | ... 107 | use: { 108 | loader: 'elm-webpack-loader', 109 | options: { 110 | runtimeOptions: ['-A128M', '-H128M', '-n8m'] 111 | } 112 | } 113 | ... 114 | ``` 115 | 116 | #### Files (default - path to 'required' file) 117 | 118 | elm make allows you to specify multiple modules to be combined into a single bundle 119 | 120 | ```sh 121 | elm make Main.elm Path/To/OtherModule.elm --output=combined.js 122 | ``` 123 | 124 | The `files` option allows you to do the same within webpack 125 | 126 | ```js 127 | module: { 128 | loaders: [ 129 | { 130 | test: /\.elm$/, 131 | exclude: [/elm-stuff/, /node_modules/], 132 | loader: 'elm-webpack-loader', 133 | options: { 134 | files: [ 135 | path.resolve(__dirname, "path/to/Main.elm"), 136 | path.resolve(__dirname, "Path/To/OtherModule.elm") 137 | ] 138 | } 139 | } 140 | ] 141 | } 142 | ``` 143 | (Note: It's only possible to pass array options when using the object style of loader configuration.) 144 | 145 | You're then able to use this with 146 | 147 | ```js 148 | import Elm from "./elm/Main"; 149 | 150 | Elm.Main.init({node: document.getElementById("main")}); 151 | Elm.Path.To.OtherModule.init({node: document.getElementById("other")}); 152 | ``` 153 | 154 | ##### Hot module reloading 155 | 156 | Hot module reloading is supported by installing [elm-hot-webpack-loader](https://github.com/klazuka/elm-hot-webpack-loader) 157 | and adding it to your list of loaders. It should look something like this: 158 | 159 | ```js 160 | module: { 161 | rules: [ 162 | { 163 | test: /\.elm$/, 164 | exclude: [/elm-stuff/, /node_modules/], 165 | use: [ 166 | { loader: 'elm-hot-webpack-loader' }, 167 | { loader: 'elm-webpack-loader' } 168 | ] 169 | } 170 | ] 171 | } 172 | ``` 173 | 174 | **IMPORTANT**: `elm-hot-webpack-loader` must be placed in the list immediately *before* `elm-webpack-loader`. 175 | 176 | 177 | #### Upstream options 178 | 179 | All options are sent down as an `options` object to node-elm-compiler. For example, you can 180 | explicitly pick the local `elm` binary by setting the option `pathToElm`: 181 | 182 | ```js 183 | ... 184 | use: { 185 | loader: 'elm-webpack-loader', 186 | options: { 187 | pathToElm: 'node_modules/.bin/elm' 188 | } 189 | } 190 | ... 191 | ``` 192 | 193 | For a list all possible options, 194 | [consult the source](https://github.com/rtfeldman/node-elm-compiler/blob/3fde73d/index.js#L12-L23). 195 | 196 | ## Notes 197 | 198 | ### Example 199 | 200 | You can find an example in the `example` folder. 201 | To run: 202 | 203 | ```sh 204 | npm install 205 | npm run build 206 | ``` 207 | 208 | You can have webpack watch for changes with: `npm run watch` 209 | 210 | You can run the webpack dev server with: `npm run dev` 211 | 212 | For a full featured example project that uses elm-webpack-loader see [pmdesgn/elm-webpack-starter](https://github.com/pmdesgn/elm-webpack-starter) . 213 | 214 | ### noParse 215 | 216 | Webpack can complain about precompiled files (files compiled by `elm make`). 217 | You can silence this warning with 218 | [noParse](https://webpack.github.io/docs/configuration.html#module-noparse). You can see it in use 219 | in the example. 220 | 221 | ```js 222 | module: { 223 | rules: [...], 224 | noParse: [/.elm$/] 225 | } 226 | ``` 227 | 228 | ## Revisions 229 | 230 | ### 8.0.0 231 | 232 | - Fix watching when using the dev server. Use `compiler.watching` instead of `compiler.options.watch` as the latter doesn't work with the dev server. 233 | 234 | ### 7.0.0 235 | 236 | - Logs build output directly to stdout to retain formatting. 237 | - Remove stack trace for errors, as they're never relevant. 238 | - `optimize` and `debug` flags are now set by default depending on the webpack mode. 239 | - Removed several options which provide little benefit. 240 | - Reduced number of dependencies. 241 | 242 | ### 6.0.0 243 | 244 | - Elm is now a peer dependency. 245 | - Documentation fixes. 246 | 247 | ### 5.0.0 248 | 249 | - Support for Elm 0.19, drops support for Elm 0.18. 250 | 251 | ### 4.3.1 252 | 253 | - Fix a bug where maxInstances might end up being higher than expected 254 | 255 | ### 4.3.0 256 | 257 | - Set maxInstances to 1 258 | - Patch watching behaviour 259 | - Add `forceWatch` to force watch mode 260 | 261 | ### 4.2.0 262 | 263 | Make live reloading work more reliably 264 | 265 | ### 4.1.0 266 | 267 | Added `maxInstances` for limiting of instances 268 | 269 | ### 4.0.0 270 | 271 | Watching is now done based on elm-package.json, faster startup time via @eeue56 272 | 273 | ### 3.1.0 274 | 275 | Add support for `--debug` via `node-elm-compiler` 276 | 277 | ### 3.0.6 278 | 279 | Allow version bumps of node-elm-compiler. 280 | 281 | ### 3.0.5 282 | 283 | Upgrade to latest node-elm-compiler, which fixes some dependency tracking issues. 284 | 285 | ### 3.0.4 286 | 287 | Fix potential race condition between dependency checking and compilation. 288 | 289 | ### 3.0.3 290 | 291 | Use node-elm-compiler 4.0.1+ for important bugfix. 292 | 293 | ### 3.0.2 294 | 295 | Use node-elm-compiler 4.0.0+ 296 | 297 | ### 3.0.1 298 | 299 | Pass a real error object to webpack on failures. 300 | 301 | ### 3.0.0 302 | 303 | Support Elm 0.17, and remove obsolete `appendExport` option. 304 | 305 | ### 2.0.0 306 | 307 | Change `warn` to be a pass-through compiler flag rather than a way to specify 308 | logging behavior. 309 | 310 | ### 1.0.0 311 | 312 | Initial stable release. 313 | -------------------------------------------------------------------------------- /example/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | elm-stuff/ 3 | node_modules/ 4 | tmp/ 5 | -------------------------------------------------------------------------------- /example/README.md: -------------------------------------------------------------------------------- 1 | # Example using `elm-webpack-loader` 2 | 3 | After cloning the repository, install all the necessary dependencies: 4 | 5 | ``` 6 | $ cd elm-webpack-loader/example 7 | $ npm install 8 | $ elm make 9 | ``` 10 | 11 | You may also need to run `npm install` in the parent directory. 12 | 13 | Now build the example using webpack: 14 | 15 | ``` 16 | $ npm run build 17 | ``` 18 | 19 | Open the `dist/index.html` file to see the result. 20 | -------------------------------------------------------------------------------- /example/elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.0", 3 | "type": "application", 4 | "summary": "Example using webpack 5", 5 | "repository": "https://github.com/elm-community/elm-webpack-loader.git", 6 | "license": "BSD-3-Clause", 7 | "source-directories": [ 8 | "src" 9 | ], 10 | "elm-version": "0.19.1", 11 | "dependencies": { 12 | "direct": { 13 | "elm/browser": "1.0.0", 14 | "elm/core": "1.0.0", 15 | "elm/html": "1.0.0" 16 | }, 17 | "indirect": { 18 | "elm/json": "1.0.0", 19 | "elm/time": "1.0.0", 20 | "elm/url": "1.0.0", 21 | "elm/virtual-dom": "1.0.0" 22 | } 23 | }, 24 | "test-dependencies": { 25 | "direct": {}, 26 | "indirect": {} 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "elm-webpack4-loader-example", 3 | "version": "0.0.1", 4 | "license": "BSD-3-Clause", 5 | "private": true, 6 | "scripts": { 7 | "build": "webpack --mode production", 8 | "watch": "webpack --mode development --watch", 9 | "dev": "webpack serve --mode development --port 3000", 10 | "errors": "webpack --mode development --display-error-details" 11 | }, 12 | "dependencies": {}, 13 | "devDependencies": { 14 | "file-loader": "1.1.10", 15 | "loader-utils": "2.0.0", 16 | "webpack": "^5.20.0", 17 | "webpack-cli": "^4.5.0", 18 | "webpack-dev-server": "^3.11.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /example/src/Hello/World.elm: -------------------------------------------------------------------------------- 1 | module Hello.World exposing (hello) 2 | 3 | import Hello.World.Content exposing (content) 4 | 5 | 6 | hello : String 7 | hello = 8 | "Hello, " ++ content 9 | -------------------------------------------------------------------------------- /example/src/Hello/World/Content.elm: -------------------------------------------------------------------------------- 1 | module Hello.World.Content exposing (content) 2 | 3 | 4 | content : String 5 | content = 6 | "World!" 7 | -------------------------------------------------------------------------------- /example/src/Main.elm: -------------------------------------------------------------------------------- 1 | module Main exposing (..) 2 | 3 | import Hello.World exposing (hello) 4 | import Html exposing (text) 5 | 6 | 7 | main : Html.Html a 8 | main = 9 | text hello 10 | -------------------------------------------------------------------------------- /example/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | elm-webpack-loader webpack4 example 6 | 7 | 8 |
Loading...
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /example/src/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./index.html'); 4 | var Elm = require('./Main.elm').Elm; 5 | 6 | var app = Elm.Main.init({ 7 | node: document.getElementById('main') 8 | }); 9 | -------------------------------------------------------------------------------- /example/webpack.config.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | 3 | module.exports = { 4 | // If your entry-point is at "src/index.js" and 5 | // your output is in "/dist", you can omit 6 | // these parts of the config 7 | module: { 8 | rules: [{ 9 | test: /\.html$/, 10 | exclude: /node_modules/, 11 | loader: 'file-loader' 12 | }, 13 | { 14 | test: /\.elm$/, 15 | exclude: [/elm-stuff/, /node_modules/], 16 | // This is what you need in your own work 17 | // loader: "elm-webpack-loader", 18 | loader: '../index.js' 19 | } 20 | ] 21 | }, 22 | 23 | devServer: { 24 | contentBase: path.join(__dirname, "src"), 25 | stats: 'errors-only' 26 | }, 27 | 28 | }; 29 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var fs = require("fs"); 4 | var path = require("path"); 5 | var temp = require("temp").track(); 6 | var loaderUtils = require("loader-utils"); 7 | var elmCompiler = require("node-elm-compiler"); 8 | 9 | var getFiles = function(options) { 10 | var files = options && options.files; 11 | 12 | if (files === undefined) return [this.resourcePath]; 13 | 14 | if (!Array.isArray(files)) { 15 | throw new Error("files option must be an array"); 16 | } 17 | 18 | if (files.length === 0) { 19 | throw new Error("You specified the 'files' option but didn't list any files"); 20 | } 21 | 22 | delete options.files; 23 | return files; 24 | }; 25 | 26 | var getOptions = function(mode) { 27 | var defaultOptions = { 28 | debug: mode === "development", 29 | optimize: mode === "production", 30 | }; 31 | 32 | var globalOptions = this.options 33 | ? this.options.elm || {} 34 | : this.query.elm || {}; 35 | 36 | var loaderOptions = loaderUtils.getOptions(this) || {}; 37 | 38 | return Object.assign({}, defaultOptions, globalOptions, loaderOptions); 39 | }; 40 | 41 | var _addDependencies = function(dependency) { 42 | this.addDependency(dependency); 43 | }; 44 | 45 | var _addDirDependency = function(dirs){ 46 | dirs.forEach(this.addContextDependency.bind(this)); 47 | }; 48 | 49 | var isFlagSet = function(args, flag) { 50 | return typeof args[flag] !== "undefined" && args[flag]; 51 | }; 52 | 53 | /* Takes a working dir, tries to read elm.json, then grabs all the modules from in there 54 | */ 55 | var filesToWatch = function(cwd){ 56 | var readFile = fs.readFileSync(path.join(cwd, "elm.json"), "utf8"); 57 | var elmPackage = JSON.parse(readFile); 58 | 59 | var paths = elmPackage["source-directories"].map(function(dir){ 60 | return path.join(cwd, dir); 61 | }); 62 | 63 | return paths; 64 | }; 65 | 66 | var dependenciesFor = function(resourcePath, files) { 67 | return findAllDependencies(files) 68 | .then(function (dependencies) { 69 | return unique(dependencies.concat(remove(resourcePath, files))); 70 | }); 71 | } 72 | 73 | var findAllDependencies = function(files) { 74 | return Promise.all(files.map( 75 | function(f) { return elmCompiler.findAllDependencies(f) } 76 | )).then(flatten); 77 | } 78 | 79 | module.exports = function() { 80 | this.cacheable && this.cacheable(); 81 | 82 | var callback = this.async(); 83 | if (!callback) { 84 | throw "elm-webpack-loader currently only supports async mode."; 85 | } 86 | 87 | var compiler = this._compiler; 88 | 89 | // bind helper functions to `this` 90 | var addDependencies = _addDependencies.bind(this); 91 | var addDirDependency = _addDirDependency.bind(this); 92 | var emitError = this.emitError.bind(this); 93 | 94 | var options = getOptions.call(this, compiler.options.mode); 95 | var files = getFiles.call(this, options); 96 | var resourcePath = this.resourcePath; 97 | 98 | var promises = []; 99 | 100 | // we only need to track deps if we are in watch mode 101 | // otherwise, we trust elm to do it's job 102 | if (compiler.watching) { 103 | // we can do a glob to track deps we care about if cwd is set 104 | if (typeof options.cwd !== "undefined" && options.cwd !== null){ 105 | // watch elm.json 106 | var elmPackage = path.join(options.cwd, "elm.json"); 107 | addDependencies(elmPackage); 108 | var dirs = filesToWatch(options.cwd); 109 | // watch all the dirs in elm.json 110 | addDirDependency.bind(this)(dirs); 111 | } 112 | 113 | // find all the deps, adding them to the watch list if we successfully parsed everything 114 | // otherwise return an error which is currently ignored 115 | var dependencies = dependenciesFor(resourcePath, files).then(function(dependencies){ 116 | // add each dependency to the tree 117 | dependencies.map(addDependencies); 118 | return { kind: "success", result: true }; 119 | }).catch(function(v){ 120 | emitError(v); 121 | return { kind: "error", error: v }; 122 | }) 123 | 124 | promises.push(dependencies); 125 | } 126 | 127 | var compilation = compile(files, options) 128 | .then(function(v) { return { kind: "success", result: v }; }) 129 | .catch(function(v) { return { kind: "error", error: v }; }); 130 | 131 | promises.push(compilation); 132 | 133 | Promise.all(promises) 134 | .then(function(results) { 135 | var output = results[results.length - 1]; // compilation output is always last 136 | 137 | if (output.kind === "success") { 138 | callback(null, output.result); 139 | } else { 140 | if (typeof output.error === "string") { 141 | output.error = new Error(output.error); 142 | } 143 | 144 | output.error.message = "Compiler process exited with error " + output.error.message; 145 | output.error.stack = null; 146 | callback(output.error); 147 | } 148 | }).catch(function(err){ 149 | callback(err); 150 | }); 151 | } 152 | 153 | 154 | // Functions pulled and modified from node-elm-compiler: 155 | 156 | // this was called compileToString 157 | // - altered to log output to console instead to retain formatting 158 | function compile(sources, options) { 159 | var suffix = getSuffix(options.output, ".js"); 160 | return new Promise(function (resolve, reject) { 161 | temp.open({ suffix: suffix }, function (err, info) { 162 | if (err) { 163 | return reject(err); 164 | } 165 | options.output = info.path; 166 | options.processOpts = { stdio: "inherit" }; 167 | 168 | var compiler; 169 | 170 | try { 171 | compiler = elmCompiler.compile(sources, options); 172 | } 173 | catch (compileError) { 174 | return reject(compileError); 175 | } 176 | 177 | compiler.on("close", function (exitCode) { 178 | if (exitCode !== 0) { 179 | return reject("Compilation failed"); 180 | } 181 | 182 | fs.readFile(info.path, { encoding: "utf8" }, function (err, data) { 183 | return err ? reject(err) : resolve(data); 184 | }); 185 | }); 186 | }); 187 | }); 188 | } 189 | 190 | function getSuffix(outputPath, defaultSuffix) { 191 | if (outputPath) { 192 | return path.extname(outputPath) || defaultSuffix; 193 | } 194 | else { 195 | return defaultSuffix; 196 | } 197 | } 198 | 199 | 200 | // HELPERS 201 | 202 | function flatten(arrayOfArrays) { 203 | return arrayOfArrays.reduce(function(flattened, array) { 204 | return flattened.concat(array) 205 | }, []); 206 | } 207 | 208 | function unique(items) { 209 | return items.filter(function(item, index, array) { 210 | return array.indexOf(item) === index; 211 | }); 212 | } 213 | 214 | function remove(condemned, items) { 215 | return items.filter(function(item) { 216 | return item !== condemned; 217 | }); 218 | } 219 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "elm-webpack-loader", 3 | "version": "7.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-colors": { 8 | "version": "3.2.3", 9 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 10 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "2.1.1", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 16 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "3.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 22 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^1.9.0" 26 | } 27 | }, 28 | "argparse": { 29 | "version": "1.0.10", 30 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 31 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 32 | "dev": true, 33 | "requires": { 34 | "sprintf-js": "~1.0.2" 35 | } 36 | }, 37 | "assertion-error": { 38 | "version": "1.1.0", 39 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 40 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 41 | "dev": true 42 | }, 43 | "balanced-match": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 46 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 47 | }, 48 | "big.js": { 49 | "version": "5.2.2", 50 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 51 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" 52 | }, 53 | "brace-expansion": { 54 | "version": "1.1.11", 55 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 56 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 57 | "requires": { 58 | "balanced-match": "^1.0.0", 59 | "concat-map": "0.0.1" 60 | } 61 | }, 62 | "browser-stdout": { 63 | "version": "1.3.1", 64 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 65 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 66 | "dev": true 67 | }, 68 | "chai": { 69 | "version": "3.5.0", 70 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 71 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 72 | "dev": true, 73 | "requires": { 74 | "assertion-error": "^1.0.1", 75 | "deep-eql": "^0.1.3", 76 | "type-detect": "^1.0.0" 77 | } 78 | }, 79 | "chalk": { 80 | "version": "2.4.2", 81 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 82 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 83 | "dev": true, 84 | "requires": { 85 | "ansi-styles": "^3.2.1", 86 | "escape-string-regexp": "^1.0.5", 87 | "supports-color": "^5.3.0" 88 | }, 89 | "dependencies": { 90 | "supports-color": { 91 | "version": "5.5.0", 92 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 93 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 94 | "dev": true, 95 | "requires": { 96 | "has-flag": "^3.0.0" 97 | } 98 | } 99 | } 100 | }, 101 | "code-point-at": { 102 | "version": "1.1.0", 103 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 104 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 105 | "dev": true 106 | }, 107 | "color-convert": { 108 | "version": "1.9.3", 109 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 110 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 111 | "dev": true, 112 | "requires": { 113 | "color-name": "1.1.3" 114 | } 115 | }, 116 | "color-name": { 117 | "version": "1.1.3", 118 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 119 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 120 | "dev": true 121 | }, 122 | "concat-map": { 123 | "version": "0.0.1", 124 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 125 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 126 | }, 127 | "cross-spawn": { 128 | "version": "6.0.5", 129 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 130 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 131 | "requires": { 132 | "nice-try": "^1.0.4", 133 | "path-key": "^2.0.1", 134 | "semver": "^5.5.0", 135 | "shebang-command": "^1.2.0", 136 | "which": "^1.2.9" 137 | } 138 | }, 139 | "debug": { 140 | "version": "3.2.6", 141 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 142 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 143 | "dev": true, 144 | "requires": { 145 | "ms": "^2.1.1" 146 | } 147 | }, 148 | "decamelize": { 149 | "version": "1.2.0", 150 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 151 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 152 | "dev": true 153 | }, 154 | "deep-eql": { 155 | "version": "0.1.3", 156 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 157 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 158 | "dev": true, 159 | "requires": { 160 | "type-detect": "0.1.1" 161 | }, 162 | "dependencies": { 163 | "type-detect": { 164 | "version": "0.1.1", 165 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 166 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 167 | "dev": true 168 | } 169 | } 170 | }, 171 | "define-properties": { 172 | "version": "1.1.3", 173 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 174 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 175 | "dev": true, 176 | "requires": { 177 | "object-keys": "^1.0.12" 178 | } 179 | }, 180 | "diff": { 181 | "version": "3.5.0", 182 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 183 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 184 | "dev": true 185 | }, 186 | "emoji-regex": { 187 | "version": "7.0.3", 188 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 189 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 190 | "dev": true 191 | }, 192 | "emojis-list": { 193 | "version": "3.0.0", 194 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", 195 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" 196 | }, 197 | "es-abstract": { 198 | "version": "1.17.6", 199 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", 200 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", 201 | "dev": true, 202 | "requires": { 203 | "es-to-primitive": "^1.2.1", 204 | "function-bind": "^1.1.1", 205 | "has": "^1.0.3", 206 | "has-symbols": "^1.0.1", 207 | "is-callable": "^1.2.0", 208 | "is-regex": "^1.1.0", 209 | "object-inspect": "^1.7.0", 210 | "object-keys": "^1.1.1", 211 | "object.assign": "^4.1.0", 212 | "string.prototype.trimend": "^1.0.1", 213 | "string.prototype.trimstart": "^1.0.1" 214 | } 215 | }, 216 | "es-to-primitive": { 217 | "version": "1.2.1", 218 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 219 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 220 | "dev": true, 221 | "requires": { 222 | "is-callable": "^1.1.4", 223 | "is-date-object": "^1.0.1", 224 | "is-symbol": "^1.0.2" 225 | } 226 | }, 227 | "escape-string-regexp": { 228 | "version": "1.0.5", 229 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 230 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 231 | "dev": true 232 | }, 233 | "esprima": { 234 | "version": "4.0.1", 235 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 236 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 237 | "dev": true 238 | }, 239 | "find-elm-dependencies": { 240 | "version": "2.0.4", 241 | "resolved": "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.4.tgz", 242 | "integrity": "sha512-x/4w4fVmlD2X4PD9oQ+yh9EyaQef6OtEULdMGBTuWx0Nkppvo2Z/bAiQioW2n+GdRYKypME2b9OmYTw5tw5qDg==", 243 | "requires": { 244 | "firstline": "^1.2.0", 245 | "lodash": "^4.17.19" 246 | } 247 | }, 248 | "firstline": { 249 | "version": "1.3.1", 250 | "resolved": "https://registry.npmjs.org/firstline/-/firstline-1.3.1.tgz", 251 | "integrity": "sha512-ycwgqtoxujz1dm0kjkBFOPQMESxB9uKc/PlD951dQDIG+tBXRpYZC2UmJb0gDxopQ1ZX6oyRQN3goRczYu7Deg==" 252 | }, 253 | "flat": { 254 | "version": "4.1.0", 255 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 256 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 257 | "dev": true, 258 | "requires": { 259 | "is-buffer": "~2.0.3" 260 | } 261 | }, 262 | "fs.realpath": { 263 | "version": "1.0.0", 264 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 265 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 266 | }, 267 | "function-bind": { 268 | "version": "1.1.1", 269 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 270 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 271 | "dev": true 272 | }, 273 | "glob": { 274 | "version": "7.1.6", 275 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 276 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 277 | "requires": { 278 | "fs.realpath": "^1.0.0", 279 | "inflight": "^1.0.4", 280 | "inherits": "2", 281 | "minimatch": "^3.0.4", 282 | "once": "^1.3.0", 283 | "path-is-absolute": "^1.0.0" 284 | } 285 | }, 286 | "growl": { 287 | "version": "1.10.5", 288 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 289 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 290 | "dev": true 291 | }, 292 | "has": { 293 | "version": "1.0.3", 294 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 295 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 296 | "dev": true, 297 | "requires": { 298 | "function-bind": "^1.1.1" 299 | } 300 | }, 301 | "has-flag": { 302 | "version": "3.0.0", 303 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 304 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 305 | "dev": true 306 | }, 307 | "has-symbols": { 308 | "version": "1.0.1", 309 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 310 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 311 | "dev": true 312 | }, 313 | "he": { 314 | "version": "1.2.0", 315 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 316 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 317 | "dev": true 318 | }, 319 | "inflight": { 320 | "version": "1.0.6", 321 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 322 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 323 | "requires": { 324 | "once": "^1.3.0", 325 | "wrappy": "1" 326 | } 327 | }, 328 | "inherits": { 329 | "version": "2.0.4", 330 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 331 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 332 | }, 333 | "is-buffer": { 334 | "version": "2.0.4", 335 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 336 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 337 | "dev": true 338 | }, 339 | "is-callable": { 340 | "version": "1.2.0", 341 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", 342 | "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", 343 | "dev": true 344 | }, 345 | "is-date-object": { 346 | "version": "1.0.2", 347 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 348 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 349 | "dev": true 350 | }, 351 | "is-fullwidth-code-point": { 352 | "version": "1.0.0", 353 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 354 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 355 | "dev": true, 356 | "requires": { 357 | "number-is-nan": "^1.0.0" 358 | } 359 | }, 360 | "is-regex": { 361 | "version": "1.1.1", 362 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", 363 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", 364 | "dev": true, 365 | "requires": { 366 | "has-symbols": "^1.0.1" 367 | } 368 | }, 369 | "is-symbol": { 370 | "version": "1.0.3", 371 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 372 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 373 | "dev": true, 374 | "requires": { 375 | "has-symbols": "^1.0.1" 376 | } 377 | }, 378 | "isexe": { 379 | "version": "2.0.0", 380 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 381 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 382 | }, 383 | "js-yaml": { 384 | "version": "3.13.1", 385 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 386 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 387 | "dev": true, 388 | "requires": { 389 | "argparse": "^1.0.7", 390 | "esprima": "^4.0.0" 391 | } 392 | }, 393 | "json5": { 394 | "version": "2.2.0", 395 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", 396 | "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", 397 | "requires": { 398 | "minimist": "^1.2.5" 399 | } 400 | }, 401 | "loader-utils": { 402 | "version": "2.0.0", 403 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", 404 | "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", 405 | "requires": { 406 | "big.js": "^5.2.2", 407 | "emojis-list": "^3.0.0", 408 | "json5": "^2.1.2" 409 | } 410 | }, 411 | "locate-path": { 412 | "version": "3.0.0", 413 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 414 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 415 | "dev": true, 416 | "requires": { 417 | "p-locate": "^3.0.0", 418 | "path-exists": "^3.0.0" 419 | }, 420 | "dependencies": { 421 | "path-exists": { 422 | "version": "3.0.0", 423 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 424 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 425 | "dev": true 426 | } 427 | } 428 | }, 429 | "lodash": { 430 | "version": "4.17.20", 431 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 432 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 433 | }, 434 | "log-symbols": { 435 | "version": "2.2.0", 436 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 437 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 438 | "dev": true, 439 | "requires": { 440 | "chalk": "^2.0.1" 441 | } 442 | }, 443 | "minimatch": { 444 | "version": "3.0.4", 445 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 446 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 447 | "requires": { 448 | "brace-expansion": "^1.1.7" 449 | } 450 | }, 451 | "minimist": { 452 | "version": "1.2.5", 453 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 454 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 455 | }, 456 | "mkdirp": { 457 | "version": "0.5.4", 458 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", 459 | "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", 460 | "dev": true, 461 | "requires": { 462 | "minimist": "^1.2.5" 463 | } 464 | }, 465 | "mocha": { 466 | "version": "6.2.3", 467 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", 468 | "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", 469 | "dev": true, 470 | "requires": { 471 | "ansi-colors": "3.2.3", 472 | "browser-stdout": "1.3.1", 473 | "debug": "3.2.6", 474 | "diff": "3.5.0", 475 | "escape-string-regexp": "1.0.5", 476 | "find-up": "3.0.0", 477 | "glob": "7.1.3", 478 | "growl": "1.10.5", 479 | "he": "1.2.0", 480 | "js-yaml": "3.13.1", 481 | "log-symbols": "2.2.0", 482 | "minimatch": "3.0.4", 483 | "mkdirp": "0.5.4", 484 | "ms": "2.1.1", 485 | "node-environment-flags": "1.0.5", 486 | "object.assign": "4.1.0", 487 | "strip-json-comments": "2.0.1", 488 | "supports-color": "6.0.0", 489 | "which": "1.3.1", 490 | "wide-align": "1.1.3", 491 | "yargs": "13.3.2", 492 | "yargs-parser": "13.1.2", 493 | "yargs-unparser": "1.6.0" 494 | }, 495 | "dependencies": { 496 | "ansi-regex": { 497 | "version": "4.1.0", 498 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 499 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 500 | "dev": true 501 | }, 502 | "camelcase": { 503 | "version": "5.3.1", 504 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 505 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 506 | "dev": true 507 | }, 508 | "cliui": { 509 | "version": "5.0.0", 510 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 511 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 512 | "dev": true, 513 | "requires": { 514 | "string-width": "^3.1.0", 515 | "strip-ansi": "^5.2.0", 516 | "wrap-ansi": "^5.1.0" 517 | } 518 | }, 519 | "find-up": { 520 | "version": "3.0.0", 521 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 522 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 523 | "dev": true, 524 | "requires": { 525 | "locate-path": "^3.0.0" 526 | } 527 | }, 528 | "get-caller-file": { 529 | "version": "2.0.5", 530 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 531 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 532 | "dev": true 533 | }, 534 | "glob": { 535 | "version": "7.1.3", 536 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 537 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 538 | "dev": true, 539 | "requires": { 540 | "fs.realpath": "^1.0.0", 541 | "inflight": "^1.0.4", 542 | "inherits": "2", 543 | "minimatch": "^3.0.4", 544 | "once": "^1.3.0", 545 | "path-is-absolute": "^1.0.0" 546 | } 547 | }, 548 | "is-fullwidth-code-point": { 549 | "version": "2.0.0", 550 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 551 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 552 | "dev": true 553 | }, 554 | "require-main-filename": { 555 | "version": "2.0.0", 556 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 557 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 558 | "dev": true 559 | }, 560 | "string-width": { 561 | "version": "3.1.0", 562 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 563 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 564 | "dev": true, 565 | "requires": { 566 | "emoji-regex": "^7.0.1", 567 | "is-fullwidth-code-point": "^2.0.0", 568 | "strip-ansi": "^5.1.0" 569 | } 570 | }, 571 | "strip-ansi": { 572 | "version": "5.2.0", 573 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 574 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 575 | "dev": true, 576 | "requires": { 577 | "ansi-regex": "^4.1.0" 578 | } 579 | }, 580 | "which-module": { 581 | "version": "2.0.0", 582 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 583 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 584 | "dev": true 585 | }, 586 | "wrap-ansi": { 587 | "version": "5.1.0", 588 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 589 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 590 | "dev": true, 591 | "requires": { 592 | "ansi-styles": "^3.2.0", 593 | "string-width": "^3.0.0", 594 | "strip-ansi": "^5.0.0" 595 | } 596 | }, 597 | "y18n": { 598 | "version": "4.0.0", 599 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 600 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 601 | "dev": true 602 | }, 603 | "yargs": { 604 | "version": "13.3.2", 605 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 606 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 607 | "dev": true, 608 | "requires": { 609 | "cliui": "^5.0.0", 610 | "find-up": "^3.0.0", 611 | "get-caller-file": "^2.0.1", 612 | "require-directory": "^2.1.1", 613 | "require-main-filename": "^2.0.0", 614 | "set-blocking": "^2.0.0", 615 | "string-width": "^3.0.0", 616 | "which-module": "^2.0.0", 617 | "y18n": "^4.0.0", 618 | "yargs-parser": "^13.1.2" 619 | } 620 | }, 621 | "yargs-parser": { 622 | "version": "13.1.2", 623 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 624 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 625 | "dev": true, 626 | "requires": { 627 | "camelcase": "^5.0.0", 628 | "decamelize": "^1.2.0" 629 | } 630 | } 631 | } 632 | }, 633 | "ms": { 634 | "version": "2.1.1", 635 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 636 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 637 | "dev": true 638 | }, 639 | "nice-try": { 640 | "version": "1.0.5", 641 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 642 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 643 | }, 644 | "node-elm-compiler": { 645 | "version": "5.0.5", 646 | "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.5.tgz", 647 | "integrity": "sha512-vapB+VkmKMY1NRy7jjpGjzwWbKmtiRfzbgVoV/eROz5Kx30QvY0Nd5Ua7iST+9utrn1aG8cVToXC6UWdEO5BKQ==", 648 | "requires": { 649 | "cross-spawn": "6.0.5", 650 | "find-elm-dependencies": "^2.0.4", 651 | "lodash": "^4.17.19", 652 | "temp": "^0.9.0" 653 | } 654 | }, 655 | "node-environment-flags": { 656 | "version": "1.0.5", 657 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 658 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 659 | "dev": true, 660 | "requires": { 661 | "object.getownpropertydescriptors": "^2.0.3", 662 | "semver": "^5.7.0" 663 | } 664 | }, 665 | "number-is-nan": { 666 | "version": "1.0.1", 667 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 668 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 669 | "dev": true 670 | }, 671 | "object-inspect": { 672 | "version": "1.8.0", 673 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", 674 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", 675 | "dev": true 676 | }, 677 | "object-keys": { 678 | "version": "1.1.1", 679 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 680 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 681 | "dev": true 682 | }, 683 | "object.assign": { 684 | "version": "4.1.0", 685 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 686 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 687 | "dev": true, 688 | "requires": { 689 | "define-properties": "^1.1.2", 690 | "function-bind": "^1.1.1", 691 | "has-symbols": "^1.0.0", 692 | "object-keys": "^1.0.11" 693 | } 694 | }, 695 | "object.getownpropertydescriptors": { 696 | "version": "2.1.0", 697 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 698 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 699 | "dev": true, 700 | "requires": { 701 | "define-properties": "^1.1.3", 702 | "es-abstract": "^1.17.0-next.1" 703 | } 704 | }, 705 | "once": { 706 | "version": "1.4.0", 707 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 708 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 709 | "requires": { 710 | "wrappy": "1" 711 | } 712 | }, 713 | "p-limit": { 714 | "version": "2.3.0", 715 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 716 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 717 | "dev": true, 718 | "requires": { 719 | "p-try": "^2.0.0" 720 | } 721 | }, 722 | "p-locate": { 723 | "version": "3.0.0", 724 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 725 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 726 | "dev": true, 727 | "requires": { 728 | "p-limit": "^2.0.0" 729 | } 730 | }, 731 | "p-try": { 732 | "version": "2.2.0", 733 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 734 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 735 | "dev": true 736 | }, 737 | "path-is-absolute": { 738 | "version": "1.0.1", 739 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 740 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 741 | }, 742 | "path-key": { 743 | "version": "2.0.1", 744 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 745 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 746 | }, 747 | "require-directory": { 748 | "version": "2.1.1", 749 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 750 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 751 | "dev": true 752 | }, 753 | "rimraf": { 754 | "version": "2.6.3", 755 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 756 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 757 | "requires": { 758 | "glob": "^7.1.3" 759 | } 760 | }, 761 | "semver": { 762 | "version": "5.7.1", 763 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 764 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 765 | }, 766 | "set-blocking": { 767 | "version": "2.0.0", 768 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 769 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 770 | "dev": true 771 | }, 772 | "shebang-command": { 773 | "version": "1.2.0", 774 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 775 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 776 | "requires": { 777 | "shebang-regex": "^1.0.0" 778 | } 779 | }, 780 | "shebang-regex": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 783 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 784 | }, 785 | "sprintf-js": { 786 | "version": "1.0.3", 787 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 788 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 789 | "dev": true 790 | }, 791 | "string-width": { 792 | "version": "1.0.2", 793 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 794 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 795 | "dev": true, 796 | "requires": { 797 | "code-point-at": "^1.0.0", 798 | "is-fullwidth-code-point": "^1.0.0", 799 | "strip-ansi": "^3.0.0" 800 | } 801 | }, 802 | "string.prototype.trimend": { 803 | "version": "1.0.1", 804 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 805 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 806 | "dev": true, 807 | "requires": { 808 | "define-properties": "^1.1.3", 809 | "es-abstract": "^1.17.5" 810 | } 811 | }, 812 | "string.prototype.trimstart": { 813 | "version": "1.0.1", 814 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 815 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 816 | "dev": true, 817 | "requires": { 818 | "define-properties": "^1.1.3", 819 | "es-abstract": "^1.17.5" 820 | } 821 | }, 822 | "strip-ansi": { 823 | "version": "3.0.1", 824 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 825 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 826 | "dev": true, 827 | "requires": { 828 | "ansi-regex": "^2.0.0" 829 | } 830 | }, 831 | "strip-json-comments": { 832 | "version": "2.0.1", 833 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 834 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 835 | "dev": true 836 | }, 837 | "supports-color": { 838 | "version": "6.0.0", 839 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 840 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 841 | "dev": true, 842 | "requires": { 843 | "has-flag": "^3.0.0" 844 | } 845 | }, 846 | "temp": { 847 | "version": "0.9.1", 848 | "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", 849 | "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", 850 | "requires": { 851 | "rimraf": "~2.6.2" 852 | } 853 | }, 854 | "type-detect": { 855 | "version": "1.0.0", 856 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 857 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 858 | "dev": true 859 | }, 860 | "which": { 861 | "version": "1.3.1", 862 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 863 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 864 | "requires": { 865 | "isexe": "^2.0.0" 866 | } 867 | }, 868 | "wide-align": { 869 | "version": "1.1.3", 870 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 871 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 872 | "dev": true, 873 | "requires": { 874 | "string-width": "^1.0.2 || 2" 875 | } 876 | }, 877 | "wrappy": { 878 | "version": "1.0.2", 879 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 880 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 881 | }, 882 | "yargs-unparser": { 883 | "version": "1.6.0", 884 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 885 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 886 | "dev": true, 887 | "requires": { 888 | "flat": "^4.1.0", 889 | "lodash": "^4.17.15", 890 | "yargs": "^13.3.0" 891 | }, 892 | "dependencies": { 893 | "ansi-regex": { 894 | "version": "4.1.0", 895 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 896 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 897 | "dev": true 898 | }, 899 | "camelcase": { 900 | "version": "5.3.1", 901 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 902 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 903 | "dev": true 904 | }, 905 | "cliui": { 906 | "version": "5.0.0", 907 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 908 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 909 | "dev": true, 910 | "requires": { 911 | "string-width": "^3.1.0", 912 | "strip-ansi": "^5.2.0", 913 | "wrap-ansi": "^5.1.0" 914 | } 915 | }, 916 | "find-up": { 917 | "version": "3.0.0", 918 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 919 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 920 | "dev": true, 921 | "requires": { 922 | "locate-path": "^3.0.0" 923 | } 924 | }, 925 | "get-caller-file": { 926 | "version": "2.0.5", 927 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 928 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 929 | "dev": true 930 | }, 931 | "is-fullwidth-code-point": { 932 | "version": "2.0.0", 933 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 934 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 935 | "dev": true 936 | }, 937 | "require-main-filename": { 938 | "version": "2.0.0", 939 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 940 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 941 | "dev": true 942 | }, 943 | "string-width": { 944 | "version": "3.1.0", 945 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 946 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 947 | "dev": true, 948 | "requires": { 949 | "emoji-regex": "^7.0.1", 950 | "is-fullwidth-code-point": "^2.0.0", 951 | "strip-ansi": "^5.1.0" 952 | } 953 | }, 954 | "strip-ansi": { 955 | "version": "5.2.0", 956 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 957 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 958 | "dev": true, 959 | "requires": { 960 | "ansi-regex": "^4.1.0" 961 | } 962 | }, 963 | "which-module": { 964 | "version": "2.0.0", 965 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 966 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 967 | "dev": true 968 | }, 969 | "wrap-ansi": { 970 | "version": "5.1.0", 971 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 972 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 973 | "dev": true, 974 | "requires": { 975 | "ansi-styles": "^3.2.0", 976 | "string-width": "^3.0.0", 977 | "strip-ansi": "^5.0.0" 978 | } 979 | }, 980 | "y18n": { 981 | "version": "4.0.0", 982 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 983 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 984 | "dev": true 985 | }, 986 | "yargs": { 987 | "version": "13.3.2", 988 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", 989 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", 990 | "dev": true, 991 | "requires": { 992 | "cliui": "^5.0.0", 993 | "find-up": "^3.0.0", 994 | "get-caller-file": "^2.0.1", 995 | "require-directory": "^2.1.1", 996 | "require-main-filename": "^2.0.0", 997 | "set-blocking": "^2.0.0", 998 | "string-width": "^3.0.0", 999 | "which-module": "^2.0.0", 1000 | "y18n": "^4.0.0", 1001 | "yargs-parser": "^13.1.2" 1002 | } 1003 | }, 1004 | "yargs-parser": { 1005 | "version": "13.1.2", 1006 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", 1007 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", 1008 | "dev": true, 1009 | "requires": { 1010 | "camelcase": "^5.0.0", 1011 | "decamelize": "^1.2.0" 1012 | } 1013 | } 1014 | } 1015 | } 1016 | } 1017 | } 1018 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "elm-webpack-loader", 3 | "version": "8.0.0", 4 | "description": "Webpack loader for the Elm programming language.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha test/*.js" 8 | }, 9 | "engines": { 10 | "node": ">=8.0.0" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "https://github.com/elm-community/elm-webpack-loader.git" 15 | }, 16 | "keywords": [ 17 | "elm", 18 | "webpack", 19 | "loader" 20 | ], 21 | "author": "elm-community", 22 | "license": "BSD-3-Clause", 23 | "bugs": { 24 | "url": "https://github.com/elm-community/elm-webpack-loader/issues" 25 | }, 26 | "homepage": "https://github.com/elm-community/elm-webpack-loader", 27 | "dependencies": { 28 | "loader-utils": "^2.0.0", 29 | "node-elm-compiler": "^5.0.0" 30 | }, 31 | "devDependencies": { 32 | "chai": "^3.4.1", 33 | "mocha": "^6.1.4" 34 | }, 35 | "peerDependencies": { 36 | "elm": "^0.19.1-3 || 0.19.0-no-deps" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "jasmine": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/fixtures/Bad.elm: -------------------------------------------------------------------------------- 1 | module Bad where 2 | 3 | add x y = x + 4 | -------------------------------------------------------------------------------- /test/fixtures/Good.elm: -------------------------------------------------------------------------------- 1 | module Good exposing (..) 2 | 3 | import GoodDependency exposing ( add ) 4 | 5 | addSquares x y = add (x^2) (y^2) 6 | -------------------------------------------------------------------------------- /test/fixtures/GoodDependency.elm: -------------------------------------------------------------------------------- 1 | module GoodDependency exposing (..) 2 | 3 | add x y = x + y 4 | -------------------------------------------------------------------------------- /test/fixtures/elm.json: -------------------------------------------------------------------------------- 1 | { 2 | "summary": "Tests for `elm-webpack-loader`.", 3 | "type": "application", 4 | "source-directories": [ 5 | ".", 6 | "../other_elm_source_dir" 7 | ], 8 | "elm-version": "0.19.0", 9 | "dependencies": { 10 | "direct": { 11 | "elm/browser": "1.0.0", 12 | "elm/core": "1.0.0", 13 | "elm/html": "1.0.0" 14 | }, 15 | "indirect": { 16 | "elm/json": "1.0.0", 17 | "elm/time": "1.0.0", 18 | "elm/url": "1.0.0", 19 | "elm/virtual-dom": "1.0.0" 20 | } 21 | }, 22 | "test-dependencies": { 23 | "direct": {}, 24 | "indirect": {} 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/loader.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var crypto = require('crypto'); 3 | var assert = require('chai').assert; 4 | var compiler = require('node-elm-compiler'); 5 | var loader = require('../index.js'); 6 | 7 | var fixturesDir = path.join(__dirname, 'fixtures'); 8 | var badSource = path.join(fixturesDir, 'Bad.elm'); 9 | var goodSource = path.join(fixturesDir, 'Good.elm'); 10 | var goodDependency = path.join(fixturesDir, 'GoodDependency.elm'); 11 | var elmPackage = path.join(fixturesDir, 'elm.json'); 12 | var otherElmSourceDir = path.join(__dirname, 'other_elm_source_dir'); 13 | 14 | var toString = Object.prototype.toString; 15 | 16 | var isArray = function (obj) { 17 | return toString.call(obj) === '[object Array]'; 18 | }; 19 | 20 | var hash = function (data) { 21 | return crypto.createHash('md5').update(data).digest('hex'); 22 | }; 23 | 24 | var compile = function (filename) { 25 | return compiler.compileToString([filename], {cwd: fixturesDir}) 26 | .then(function (data) { 27 | return data.toString(); 28 | }); 29 | }; 30 | 31 | // Mock of webpack's loader context. 32 | var mock = function (source, query, opts, callback, watchMode, cwd) { 33 | var emittedError; 34 | var emittedWarning; 35 | var addedDependencies = []; 36 | var addedDirDependencies = []; 37 | 38 | var result = { 39 | loaders: [], 40 | loaderIndex: 0, 41 | 42 | resource: source, 43 | resourcePath: source, 44 | 45 | async: function () { return callback; }, 46 | 47 | emitError: function (err) { emittedError = err; }, 48 | emittedError: function () { return emittedError; }, 49 | emitWarning: function (warn) { emittedWarning = warn; }, 50 | emittedWarning: function () { return emittedWarning; }, 51 | 52 | addDependency: function (dep) { addedDependencies.push(dep); }, 53 | addContextDependency: function(dir) { addedDirDependencies.push(dir); }, 54 | addedDependencies: function () { return addedDependencies; }, 55 | addedDirDependencies: function() { return addedDirDependencies; }, 56 | 57 | cacheable: function () {}, 58 | 59 | options: {} 60 | }; 61 | 62 | if (query) { 63 | result.query = '?' + (isArray(query) ? query.join('&') : query); 64 | } 65 | 66 | if (opts) { 67 | result.options.elm = opts; 68 | } 69 | 70 | if (cwd){ 71 | result.options.cwd = "./" 72 | } 73 | 74 | if (watchMode) { 75 | result.isInWatchMode = function() { return true; }; 76 | result.argv = {watch : true}; 77 | } 78 | 79 | return result; 80 | }; 81 | 82 | describe('sync mode', function () { 83 | var context; 84 | 85 | it('throws', function () { 86 | context = mock(goodSource); 87 | 88 | assert.throw(function () { 89 | loader.call(context, goodSource); 90 | }, /currently only supports async mode/); 91 | }); 92 | }); 93 | 94 | describe('async mode', function () { 95 | var context; 96 | 97 | // Download of Elm can take a while. 98 | this.timeout(600000); 99 | 100 | it('compiles the resource', function (done) { 101 | var options = { 102 | cwd: fixturesDir 103 | }; 104 | 105 | var callback = function (loaderErr, loaderResult) { 106 | compile(goodSource).then(function (compilerResult) { 107 | assert.equal(hash(loaderResult), hash(compilerResult)); 108 | done(); 109 | }); 110 | }; 111 | 112 | context = mock(goodSource, null, options, callback); 113 | loader.call(context, goodSource); 114 | }); 115 | 116 | it('does not add dependencies in normal mode', function (done) { 117 | var options = { 118 | cwd: fixturesDir 119 | }; 120 | 121 | process.argv = []; 122 | var callback = function () { 123 | assert.equal(context.addedDependencies().length, 0); 124 | assert.equal(context.addedDirDependencies().length, 0); 125 | done(); 126 | }; 127 | 128 | context = mock(goodSource, null, options, callback); 129 | loader.call(context, goodSource); 130 | }); 131 | 132 | it('does add dependencies in watch mode', function (done) { 133 | var options = { 134 | cwd: fixturesDir 135 | }; 136 | 137 | process.argv = [ "--watch" ]; 138 | var callback = function () { 139 | assert.equal(context.addedDependencies().length, 2); 140 | assert.include(context.addedDependencies(), elmPackage); 141 | assert.equal(context.addedDirDependencies().length, 2); 142 | assert.include(context.addedDirDependencies(), fixturesDir); 143 | assert.include(context.addedDirDependencies(), otherElmSourceDir); 144 | done(); 145 | }; 146 | 147 | context = mock(goodSource, null, options, callback, true); 148 | loader.call(context, goodSource); 149 | }); 150 | 151 | it('emits warnings for unknown compiler options', function (done) { 152 | var options = { 153 | cwd: fixturesDir, 154 | foo: 'bar' 155 | }; 156 | 157 | var callback = function (err) { 158 | assert.isPrototypeOf(err, Error); 159 | assert.match(err.message, /unknown Elm compiler option/i); 160 | done(); 161 | }; 162 | 163 | context = mock(goodSource, null, options, callback); 164 | loader.call(context, goodSource); 165 | }); 166 | 167 | it('compiles successfully with runtimeOptions', function (done) { 168 | var options = { 169 | cwd: fixturesDir, 170 | runtimeOptions: '-s' 171 | }; 172 | 173 | var callback = function (loaderErr, loaderResult) { 174 | compile(goodSource).then(function (compilerResult) { 175 | assert.equal(hash(loaderResult), hash(compilerResult)); 176 | done(); 177 | }); 178 | }; 179 | 180 | context = mock(goodSource, null, options, callback); 181 | loader.call(context, goodSource); 182 | }); 183 | 184 | it('emits errors for incorrect source files', function (done) { 185 | var options = { 186 | cwd: fixturesDir 187 | }; 188 | 189 | var callback = function (err) { 190 | assert.match(err.message, /parse error/i); 191 | done(); 192 | }; 193 | 194 | context = mock(badSource, null, options, callback); 195 | loader.call(context, badSource); 196 | }); 197 | 198 | }); 199 | -------------------------------------------------------------------------------- /test/other_elm_source_dir/DUMMY.md: -------------------------------------------------------------------------------- 1 | This file was added, so it's possible to retain this folder in the CVS. 2 | --------------------------------------------------------------------------------