├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── dist ├── config.js ├── demo │ ├── favicon.ico │ ├── import.scss │ ├── index.json │ ├── index.mustache │ ├── lambdas │ │ └── escape.js │ ├── logo.svg │ ├── non-processed-files-just-get-copied.txt │ ├── sass.scss │ ├── scripts.js │ ├── styles.css │ └── twitter.svg ├── index.js ├── plugins │ ├── cache-import.js │ ├── concat.js │ ├── copy-source.js │ ├── get-asset-content.js │ ├── get-web-path.js │ ├── minify.js │ ├── normalize-asset.js │ ├── normalize-base.js │ ├── normalize-dep.js │ ├── normalize.js │ ├── output-sourcemaps.js │ ├── output.js │ ├── read.js │ ├── remap-sources.js │ ├── static.js │ └── transpile.js ├── tasks │ ├── build.js │ ├── clean.js │ ├── demo.js │ ├── dev.js │ ├── make.js │ ├── preview.js │ └── serve.js └── utils │ ├── cache.js │ ├── lodash-flow.js │ ├── lodash-pipes.js │ ├── lodash-utils.js │ └── util.js ├── e2e ├── README.md ├── master │ ├── build.test.js │ ├── dest-build-snapshot │ │ ├── index-styles.min.css │ │ ├── index.html │ │ └── sourcemaps │ │ │ ├── index-styles.min.css.map │ │ │ └── styles.scss │ ├── dest-make-snapshot │ │ ├── index.html │ │ ├── sourcemaps │ │ │ ├── styles.css.map │ │ │ └── styles.scss │ │ └── styles.css │ ├── make.test.js │ └── src │ │ ├── index.json │ │ ├── index.mustache │ │ └── styles.scss ├── setup-src.js └── setup.js ├── logo.png ├── package.json ├── src ├── config.js ├── demo │ ├── import.scss │ ├── index.json │ ├── index.mustache │ ├── non-processed-files-just-get-copied.txt │ ├── sass.scss │ ├── scripts.js │ └── styles.css ├── index.js ├── plugins │ ├── cache-import.js │ ├── concat.js │ ├── copy-source.js │ ├── get-asset-content.js │ ├── get-web-path.js │ ├── minify.js │ ├── normalize-asset.js │ ├── normalize-base.js │ ├── normalize-dep.js │ ├── normalize.js │ ├── output-sourcemaps.js │ ├── output.js │ ├── read.js │ ├── remap-sources.js │ ├── static.js │ └── transpile.js ├── tasks │ ├── build.js │ ├── clean.js │ ├── demo.js │ ├── dev.js │ ├── make.js │ ├── preview.js │ └── serve.js └── utils │ ├── cache.js │ ├── lodash-flow.js │ ├── lodash-utils.js │ └── util.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | npm-debug.log 2 | node_modules 3 | dest 4 | e2e/*/dest-build 5 | e2e/*/dest-make 6 | .DS_Store -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "4" 4 | - "5" 5 | - "6" 6 | - "node" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 millwrightjs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | 4 | 7 | 8 |

9 |

10 | The easiest build tool you'll ever use. 11 |

12 |
13 |

14 | Build Status 17 | Join Gitter Chat 19 |

20 |
21 | 22 | ## Give us a star! 23 | Millwright is brand spanking new - the alpha release was announced at the beginning of the year. If 24 | you like where the project is headed, star us on GitHub and help spread the word! 25 | 26 | ## Get help on Gitter! 27 | Join the chat on [Gitter](https://gitter.im/millwrightjs/millwright) to get (or give) realtime help 28 | from the community. 29 | 30 |
31 | 32 | ## Intro 33 | Millwright provides the common build functionality that many web projects need without any tool 34 | configuration. 35 | 36 | Please visit [millwrightjs.com](https://millwrightjs.com) for more information, including usage and 37 | installation. 38 | 39 | ## Project status 40 | Millwright is currently in Alpha. That means that the basic feature set expected for the 1.0.0 41 | milestone is in place, and that it's generally expected to work as described. Alpha status also 42 | means that the library is highly untested, and that the project is ready for developer usage and 43 | contributions via issues and PR's. 44 | 45 | Current priorites include: 46 | 47 | * Windows support (look for that Appveyor badge soon) 48 | * Refactoring 49 | * Error messaging 50 | * Input validation 51 | * Testing, testing, and more testing 52 | 53 | ## Issues 54 | We'll take any and all issue reports, we just ask that any helpful info be provided, such as 55 | environment details and any stack traces or error messages. 56 | 57 | ## Pull Requests 58 | This project does not yet have a formal styleguide. For now, the following considerations should be 59 | observed when submitting code: 60 | 61 | * Communicate via issues and get confirmation before doing anything big 62 | * Style matters - keep it clean 63 | * Add or update relevant tests (currently happening in [e2e](https://github.com/millwrightjs/millwright/tree/master/e2e)). 64 | 65 | ## Building Locally 66 | The following commands are available for building Millwright locally: 67 | 68 | * `npm run build` - runs the build 69 | * `npm run watch` - runs the build, then watches for changes -------------------------------------------------------------------------------- /dist/config.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var fs = require('fs-extra'); 5 | var _ = require('lodash'); 6 | 7 | var configPath = path.join(process.cwd(), 'millwright.json'); 8 | var config = _.attemptSilent(fs.readJsonSync, configPath); 9 | 10 | var defaults = {}; 11 | defaults.defaultCommand = 'dev'; 12 | defaults.srcDir = 'src'; 13 | defaults.destDir = 'dest'; 14 | defaults.partialsDir = 'partials'; 15 | defaults.lambdasDir = 'lambdas'; 16 | defaults.assetIgnoredBasePaths = ['bower_components', 'node_modules']; 17 | defaults.templateTags = ['{[{', '}]}']; 18 | 19 | var defaultsCustom = _.assign({}, defaults, config); 20 | 21 | // Test environment overrides 22 | if (process.env.MILL_TEST === 'TRUE') { 23 | defaultsCustom.defaultCommand = process.env.MILL_TEST_CMD; 24 | defaultsCustom.srcDir = process.env.MILL_TEST_SRC; 25 | defaultsCustom.destDir = process.env.MILL_TEST_DEST; 26 | } 27 | 28 | defaultsCustom.assetIgnoredBasePaths.push(defaultsCustom.srcDir); 29 | defaultsCustom.partialsDir = path.join(defaultsCustom.srcDir, defaultsCustom.partialsDir); 30 | defaultsCustom.lambdasDir = path.join(defaultsCustom.srcDir, defaultsCustom.lambdasDir); 31 | 32 | module.exports = defaultsCustom; 33 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25maWcuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJmcyIsIl8iLCJjb25maWdQYXRoIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJjb25maWciLCJhdHRlbXB0U2lsZW50IiwicmVhZEpzb25TeW5jIiwiZGVmYXVsdHMiLCJkZWZhdWx0Q29tbWFuZCIsInNyY0RpciIsImRlc3REaXIiLCJwYXJ0aWFsc0RpciIsImxhbWJkYXNEaXIiLCJhc3NldElnbm9yZWRCYXNlUGF0aHMiLCJ0ZW1wbGF0ZVRhZ3MiLCJkZWZhdWx0c0N1c3RvbSIsImFzc2lnbiIsImVudiIsIk1JTExfVEVTVCIsIk1JTExfVEVTVF9DTUQiLCJNSUxMX1RFU1RfU1JDIiwiTUlMTF9URVNUX0RFU1QiLCJwdXNoIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxPQUFPQyxRQUFRLE1BQVIsQ0FBYjtBQUNBLElBQU1DLEtBQUtELFFBQVEsVUFBUixDQUFYO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUcsYUFBYUosS0FBS0ssSUFBTCxDQUFVQyxRQUFRQyxHQUFSLEVBQVYsRUFBeUIsaUJBQXpCLENBQW5CO0FBQ0EsSUFBTUMsU0FBU0wsRUFBRU0sYUFBRixDQUFnQlAsR0FBR1EsWUFBbkIsRUFBaUNOLFVBQWpDLENBQWY7O0FBRUEsSUFBTU8sV0FBVyxFQUFqQjtBQUNBQSxTQUFTQyxjQUFULEdBQTBCLEtBQTFCO0FBQ0FELFNBQVNFLE1BQVQsR0FBa0IsS0FBbEI7QUFDQUYsU0FBU0csT0FBVCxHQUFtQixNQUFuQjtBQUNBSCxTQUFTSSxXQUFULEdBQXVCLFVBQXZCO0FBQ0FKLFNBQVNLLFVBQVQsR0FBc0IsU0FBdEI7QUFDQUwsU0FBU00scUJBQVQsR0FBaUMsQ0FBQyxrQkFBRCxFQUFxQixjQUFyQixDQUFqQztBQUNBTixTQUFTTyxZQUFULEdBQXdCLENBQUMsS0FBRCxFQUFRLEtBQVIsQ0FBeEI7O0FBRUEsSUFBTUMsaUJBQWlCaEIsRUFBRWlCLE1BQUYsQ0FBUyxFQUFULEVBQWFULFFBQWIsRUFBdUJILE1BQXZCLENBQXZCOztBQUVBO0FBQ0EsSUFBSUYsUUFBUWUsR0FBUixDQUFZQyxTQUFaLEtBQTBCLE1BQTlCLEVBQXNDO0FBQ3BDSCxpQkFBZVAsY0FBZixHQUFnQ04sUUFBUWUsR0FBUixDQUFZRSxhQUE1QztBQUNBSixpQkFBZU4sTUFBZixHQUF3QlAsUUFBUWUsR0FBUixDQUFZRyxhQUFwQztBQUNBTCxpQkFBZUwsT0FBZixHQUF5QlIsUUFBUWUsR0FBUixDQUFZSSxjQUFyQztBQUNEOztBQUVETixlQUFlRixxQkFBZixDQUFxQ1MsSUFBckMsQ0FBMENQLGVBQWVOLE1BQXpEO0FBQ0FNLGVBQWVKLFdBQWYsR0FBNkJmLEtBQUtLLElBQUwsQ0FBVWMsZUFBZU4sTUFBekIsRUFBaUNNLGVBQWVKLFdBQWhELENBQTdCO0FBQ0FJLGVBQWVILFVBQWYsR0FBNEJoQixLQUFLSyxJQUFMLENBQVVjLGVBQWVOLE1BQXpCLEVBQWlDTSxlQUFlSCxVQUFoRCxDQUE1Qjs7QUFFQVcsT0FBT0MsT0FBUCxHQUFpQlQsY0FBakIiLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMtZXh0cmEnKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxuY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnbWlsbHdyaWdodC5qc29uJyk7XG5jb25zdCBjb25maWcgPSBfLmF0dGVtcHRTaWxlbnQoZnMucmVhZEpzb25TeW5jLCBjb25maWdQYXRoKTtcblxuY29uc3QgZGVmYXVsdHMgPSB7fTtcbmRlZmF1bHRzLmRlZmF1bHRDb21tYW5kID0gJ2Rldic7XG5kZWZhdWx0cy5zcmNEaXIgPSAnc3JjJztcbmRlZmF1bHRzLmRlc3REaXIgPSAnZGVzdCc7XG5kZWZhdWx0cy5wYXJ0aWFsc0RpciA9ICdwYXJ0aWFscyc7XG5kZWZhdWx0cy5sYW1iZGFzRGlyID0gJ2xhbWJkYXMnO1xuZGVmYXVsdHMuYXNzZXRJZ25vcmVkQmFzZVBhdGhzID0gWydib3dlcl9jb21wb25lbnRzJywgJ25vZGVfbW9kdWxlcyddO1xuZGVmYXVsdHMudGVtcGxhdGVUYWdzID0gWyd7W3snLCAnfV19J107XG5cbmNvbnN0IGRlZmF1bHRzQ3VzdG9tID0gXy5hc3NpZ24oe30sIGRlZmF1bHRzLCBjb25maWcpO1xuXG4vLyBUZXN0IGVudmlyb25tZW50IG92ZXJyaWRlc1xuaWYgKHByb2Nlc3MuZW52Lk1JTExfVEVTVCA9PT0gJ1RSVUUnKSB7XG4gIGRlZmF1bHRzQ3VzdG9tLmRlZmF1bHRDb21tYW5kID0gcHJvY2Vzcy5lbnYuTUlMTF9URVNUX0NNRDtcbiAgZGVmYXVsdHNDdXN0b20uc3JjRGlyID0gcHJvY2Vzcy5lbnYuTUlMTF9URVNUX1NSQztcbiAgZGVmYXVsdHNDdXN0b20uZGVzdERpciA9IHByb2Nlc3MuZW52Lk1JTExfVEVTVF9ERVNUO1xufVxuXG5kZWZhdWx0c0N1c3RvbS5hc3NldElnbm9yZWRCYXNlUGF0aHMucHVzaChkZWZhdWx0c0N1c3RvbS5zcmNEaXIpO1xuZGVmYXVsdHNDdXN0b20ucGFydGlhbHNEaXIgPSBwYXRoLmpvaW4oZGVmYXVsdHNDdXN0b20uc3JjRGlyLCBkZWZhdWx0c0N1c3RvbS5wYXJ0aWFsc0Rpcik7XG5kZWZhdWx0c0N1c3RvbS5sYW1iZGFzRGlyID0gcGF0aC5qb2luKGRlZmF1bHRzQ3VzdG9tLnNyY0RpciwgZGVmYXVsdHNDdXN0b20ubGFtYmRhc0Rpcik7XG5cbm1vZHVsZS5leHBvcnRzID0gZGVmYXVsdHNDdXN0b207XG4iXX0= -------------------------------------------------------------------------------- /dist/demo/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/millwrightjs/millwright/a4a47eedd9e2a81a5d8950a01deec4875833097a/dist/demo/favicon.ico -------------------------------------------------------------------------------- /dist/demo/import.scss: -------------------------------------------------------------------------------- 1 | $font-family: 'Roboto', sans-serif; 2 | -------------------------------------------------------------------------------- /dist/demo/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets": { 3 | "styles": [ 4 | "https://fonts.googleapis.com/css?family=Roboto:400,700", 5 | "styles.css", 6 | "sass.scss" 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /dist/demo/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | millwright.js demo 7 | 8 | 9 | {[{#assets.styles}]} 10 | 11 | {[{/assets.styles}]} 12 | 13 | 14 | 15 |
16 |

millwright.js

17 |

The easiest build tool you'll ever use.

18 |
19 |
20 |

Thanks for checking out the demo.

21 |

22 | Check out the src and dest directories to see what the project looks like, and be sure to 23 | see how the sourcemaps work in your dev tools! 24 |

25 |
26 | 27 | {[{#assets.scripts}]} 28 | 29 | {[{/assets.scripts}]} 30 | 31 | -------------------------------------------------------------------------------- /dist/demo/lambdas/escape.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var escape = require('escape-html'); 4 | 5 | module.exports = { module: module, lambda: lambda }; 6 | 7 | var unsetTags = ''; 8 | var resetTags = ''; 9 | 10 | function lambda(template) { 11 | return unsetTags + escape(template).trim() + resetTags; 12 | } 13 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vL2xhbWJkYXMvZXNjYXBlLmpzIl0sIm5hbWVzIjpbImVzY2FwZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwibGFtYmRhIiwidW5zZXRUYWdzIiwicmVzZXRUYWdzIiwidGVtcGxhdGUiLCJ0cmltIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLFNBQVNDLFFBQVEsYUFBUixDQUFmOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCLEVBQUNELGNBQUQsRUFBU0UsY0FBVCxFQUFqQjs7QUFFQSxJQUFNQyxrQ0FBTjtBQUNBLElBQU1DLGtDQUFOOztBQUVBLFNBQVNGLE1BQVQsQ0FBZ0JHLFFBQWhCLEVBQTBCO0FBQ3hCLFNBQU9GLFlBQVlMLE9BQU9PLFFBQVAsRUFBaUJDLElBQWpCLEVBQVosR0FBc0NGLFNBQTdDO0FBQ0QiLCJmaWxlIjoiZXNjYXBlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgZXNjYXBlID0gcmVxdWlyZSgnZXNjYXBlLWh0bWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7bW9kdWxlLCBsYW1iZGF9O1xuXG5jb25zdCB1bnNldFRhZ3MgPSBgPCEtLXtbez17eyB9fT19XX0tLT5gO1xuY29uc3QgcmVzZXRUYWdzID0gYDwhLS17ez17W3sgfV19PX19LS0+YDtcblxuZnVuY3Rpb24gbGFtYmRhKHRlbXBsYXRlKSB7XG4gIHJldHVybiB1bnNldFRhZ3MgKyBlc2NhcGUodGVtcGxhdGUpLnRyaW0oKSArIHJlc2V0VGFncztcbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/demo/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created with Sketch. 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dist/demo/non-processed-files-just-get-copied.txt: -------------------------------------------------------------------------------- 1 | (see title) 2 | -------------------------------------------------------------------------------- /dist/demo/sass.scss: -------------------------------------------------------------------------------- 1 | // Setting the font family for the site from this Sass file. 2 | 3 | // Imports work too! 4 | @import 'import.scss'; 5 | 6 | body, 7 | button { 8 | font-family: $font-family; 9 | } 10 | -------------------------------------------------------------------------------- /dist/demo/scripts.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 4 | 5 | // Use special focus styles when keyboard navigation is in use 6 | var lastEventType = void 0; 7 | var focusClass = 'js-keyboard-focus'; 8 | var links = document.getElementsByTagName('a'); 9 | var buttons = document.getElementsByTagName('button'); 10 | 11 | var blurHandler = function blurHandler(event) { 12 | event.target.classList.remove(focusClass); 13 | event.target.removeEventListener('blur', blurHandler); 14 | }; 15 | 16 | var focusHandler = function focusHandler(event) { 17 | if (lastEventType === 'keydown') { 18 | event.target.classList.add(focusClass); 19 | event.target.addEventListener('blur', blurHandler); 20 | } 21 | }; 22 | 23 | document.body.addEventListener('click', function () { 24 | return lastEventType = 'click'; 25 | }); 26 | document.body.addEventListener('keydown', function () { 27 | return lastEventType = 'keydown'; 28 | }); 29 | 30 | [].concat(_toConsumableArray(links), _toConsumableArray(buttons)).forEach(function (el) { 31 | return el.addEventListener('focus', focusHandler); 32 | }); 33 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZW1vL3NjcmlwdHMuanMiXSwibmFtZXMiOlsibGFzdEV2ZW50VHlwZSIsImZvY3VzQ2xhc3MiLCJsaW5rcyIsImRvY3VtZW50IiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJidXR0b25zIiwiYmx1ckhhbmRsZXIiLCJldmVudCIsInRhcmdldCIsImNsYXNzTGlzdCIsInJlbW92ZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJmb2N1c0hhbmRsZXIiLCJhZGQiLCJhZGRFdmVudExpc3RlbmVyIiwiYm9keSIsImZvckVhY2giLCJlbCJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0EsSUFBSUEsc0JBQUo7QUFDQSxJQUFNQyxhQUFhLG1CQUFuQjtBQUNBLElBQU1DLFFBQVFDLFNBQVNDLG9CQUFULENBQThCLEdBQTlCLENBQWQ7QUFDQSxJQUFNQyxVQUFVRixTQUFTQyxvQkFBVCxDQUE4QixRQUE5QixDQUFoQjs7QUFFQSxJQUFNRSxjQUFjLFNBQWRBLFdBQWMsUUFBUztBQUMzQkMsUUFBTUMsTUFBTixDQUFhQyxTQUFiLENBQXVCQyxNQUF2QixDQUE4QlQsVUFBOUI7QUFDQU0sUUFBTUMsTUFBTixDQUFhRyxtQkFBYixDQUFpQyxNQUFqQyxFQUF5Q0wsV0FBekM7QUFDRCxDQUhEOztBQUtBLElBQU1NLGVBQWUsU0FBZkEsWUFBZSxRQUFTO0FBQzVCLE1BQUlaLGtCQUFrQixTQUF0QixFQUFpQztBQUMvQk8sVUFBTUMsTUFBTixDQUFhQyxTQUFiLENBQXVCSSxHQUF2QixDQUEyQlosVUFBM0I7QUFDQU0sVUFBTUMsTUFBTixDQUFhTSxnQkFBYixDQUE4QixNQUE5QixFQUFzQ1IsV0FBdEM7QUFDRDtBQUNGLENBTEQ7O0FBT0FILFNBQVNZLElBQVQsQ0FBY0QsZ0JBQWQsQ0FBK0IsT0FBL0IsRUFBd0M7QUFBQSxTQUFNZCxnQkFBZ0IsT0FBdEI7QUFBQSxDQUF4QztBQUNBRyxTQUFTWSxJQUFULENBQWNELGdCQUFkLENBQStCLFNBQS9CLEVBQTBDO0FBQUEsU0FBTWQsZ0JBQWdCLFNBQXRCO0FBQUEsQ0FBMUM7O0FBRUEsNkJBQUlFLEtBQUosc0JBQWNHLE9BQWQsR0FBdUJXLE9BQXZCLENBQStCO0FBQUEsU0FBTUMsR0FBR0gsZ0JBQUgsQ0FBb0IsT0FBcEIsRUFBNkJGLFlBQTdCLENBQU47QUFBQSxDQUEvQiIsImZpbGUiOiJzY3JpcHRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVXNlIHNwZWNpYWwgZm9jdXMgc3R5bGVzIHdoZW4ga2V5Ym9hcmQgbmF2aWdhdGlvbiBpcyBpbiB1c2VcbmxldCBsYXN0RXZlbnRUeXBlO1xuY29uc3QgZm9jdXNDbGFzcyA9ICdqcy1rZXlib2FyZC1mb2N1cyc7XG5jb25zdCBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7XG5jb25zdCBidXR0b25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xuXG5jb25zdCBibHVySGFuZGxlciA9IGV2ZW50ID0+IHtcbiAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoZm9jdXNDbGFzcyk7XG4gIGV2ZW50LnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgYmx1ckhhbmRsZXIpO1xufTtcblxuY29uc3QgZm9jdXNIYW5kbGVyID0gZXZlbnQgPT4ge1xuICBpZiAobGFzdEV2ZW50VHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5hZGQoZm9jdXNDbGFzcyk7XG4gICAgZXZlbnQudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlcik7XG4gIH1cbn07XG5cbmRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsYXN0RXZlbnRUeXBlID0gJ2NsaWNrJyk7XG5kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoKSA9PiBsYXN0RXZlbnRUeXBlID0gJ2tleWRvd24nKTtcblxuWy4uLmxpbmtzLCAuLi5idXR0b25zXS5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZm9jdXNIYW5kbGVyKSk7XG4iXX0= -------------------------------------------------------------------------------- /dist/demo/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is written using progressive syntax that doesn't work in all browsers. 3 | * CSSNext is used to transpile this down to standard CSS that works everywhere. 4 | */ 5 | 6 | @custom-media --width-xx-narrow (width >= 360px); 7 | @custom-media --width-x-narrow (width >= 480px); 8 | @custom-media --width-narrow (width >= 860px); 9 | @custom-media --width-standard (width >= 1260px); 10 | @custom-media --width-wide (width >= 1600px); 11 | @custom-media --width-x-wide (width >= 1760px); 12 | 13 | :root { 14 | --container-padding: 16px; 15 | --clearfix: { 16 | content: ''; 17 | display: table; 18 | clear: both; 19 | } 20 | --container: { 21 | padding: 0 var(--container-padding); 22 | margin: 0 auto; 23 | max-width: 1200px; 24 | 25 | @media (--width-wide) { 26 | padding: 0; 27 | } 28 | } 29 | } 30 | 31 | * { 32 | box-sizing: border-box; 33 | } 34 | 35 | body { 36 | -webkit-text-size-adjust: 100%; 37 | margin: 0 auto; 38 | max-width: 2000px; 39 | } 40 | 41 | body, 42 | button { 43 | font-size: 16px; 44 | font-variant-ligatures: no-common-ligatures; 45 | 46 | @media (--width-narrow) { 47 | font-size: 18px; 48 | } 49 | 50 | @media (--width-wide) { 51 | font-size: 20px; 52 | } 53 | } 54 | 55 | a, 56 | a:visited { 57 | color: inherit; 58 | font-weight: bold; 59 | display: inline-block; 60 | } 61 | 62 | .nowrap { 63 | white-space: nowrap; 64 | } 65 | 66 | .preserve-line { 67 | display: inline-block; 68 | } 69 | 70 | button, 71 | .button { 72 | font-weight: normal; 73 | padding: 8px; 74 | border: 4px solid #000; 75 | border-radius: 10px; 76 | display: inline-block; 77 | background: #fff; 78 | cursor: pointer; 79 | 80 | @media (--width-narrow) { 81 | padding: 12px; 82 | } 83 | 84 | &, 85 | &:visited { 86 | color: #000; 87 | text-decoration: none; 88 | } 89 | 90 | &:hover { 91 | border-width: 5px; 92 | padding: 7px; 93 | 94 | @media (--width-narrow) { 95 | border-width: 6px; 96 | padding: 10px; 97 | } 98 | } 99 | 100 | &.js-keyboard-focus:hover { 101 | border-width: 4px; 102 | padding: 12px; 103 | } 104 | } 105 | 106 | a, 107 | button, 108 | .button { 109 | position: relative; 110 | 111 | &:focus { 112 | outline: none; 113 | } 114 | 115 | &.js-keyboard-focus:focus:before { 116 | content: ""; 117 | position: absolute; 118 | top: -14px; 119 | bottom: -14px; 120 | left: -14px; 121 | right: -14px; 122 | border: 6px dashed #f00; 123 | border-radius: 16px; 124 | } 125 | } 126 | 127 | .container { 128 | @apply --container; 129 | } 130 | 131 | header { 132 | text-align: center; 133 | } 134 | 135 | .header-title { 136 | font-size: 14vw; 137 | margin-top: 80px; 138 | margin-bottom: 0; 139 | 140 | @media (--width-x-narrow) { 141 | font-size: 12vw; 142 | } 143 | 144 | @media (--width-narrow) { 145 | font-size: 11vw; 146 | margin-top: 100px; 147 | } 148 | 149 | @media (--width-standard) { 150 | font-size: 10vw; 151 | margin-top: 120px; 152 | } 153 | 154 | @media (--width-wide) { 155 | font-size: 160px; 156 | } 157 | } 158 | 159 | .header-subtitle { 160 | font-size: 24px; 161 | margin-top: 40px; 162 | 163 | @media (--width-narrow) { 164 | font-size: 28px; 165 | margin-top: 60px; 166 | } 167 | 168 | @media (--width-standard) { 169 | font-size: 32px; 170 | } 171 | 172 | @media (--width-wide) { 173 | font-size: 40px; 174 | margin-top: 80px; 175 | } 176 | } 177 | 178 | .header-link { 179 | font-size: 24px; 180 | width: 100px; 181 | margin: 10px; 182 | 183 | @media (--width-x-narrow) { 184 | width: 160px; 185 | margin: 40px 24px; 186 | } 187 | 188 | @media (--width-standard) { 189 | font-size: 28px; 190 | width: 200px; 191 | margin: 60px 32px; 192 | } 193 | 194 | @media (--width-wide) { 195 | font-size: 32px; 196 | width: 240px; 197 | margin: 80px 40px; 198 | } 199 | 200 | &.header-link-single { 201 | width: 200px; 202 | margin-bottom: 0; 203 | } 204 | } 205 | 206 | .project-description { 207 | max-width: 600px; 208 | margin-top: 80px; 209 | text-align: center; 210 | 211 | @media (--width-narrow) { 212 | max-width: 1000px; 213 | padding: 0 100px; 214 | } 215 | 216 | @media (--width-standard) { 217 | padding: 0 120px; 218 | } 219 | 220 | @media (--width-wide) { 221 | padding: 0; 222 | } 223 | 224 | & h1 { 225 | font-size: 32px; 226 | line-height: 1.3; 227 | 228 | @media (--width-narrow) { 229 | font-size: 40px; 230 | } 231 | 232 | @media (--width-wide) { 233 | font-size: 48px; 234 | } 235 | } 236 | 237 | & p { 238 | font-size: 20px; 239 | line-height: 1.4; 240 | 241 | @media (--width-narrow) { 242 | font-size: 24px; 243 | } 244 | 245 | @media (--width-wide) { 246 | font-size: 28px; 247 | } 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /dist/demo/twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | Created with Sketch. 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // TODO: remove uncaught exception logging 4 | // This is in place temporarily to ensure we at least get a stack trace on failure while the project 5 | // is in alpha. 6 | process.on('uncaughtException', function (e) { 7 | console.log(e);process.exit(1); 8 | }); 9 | process.on('unhandledRejection', function (e) { 10 | console.log(e);process.exit(1); 11 | }); 12 | 13 | require('./utils/lodash-utils'); 14 | require('./utils/lodash-flow'); 15 | var _ = require('lodash'); 16 | var argv = require('yargs').argv; 17 | var requireDir = require('require-dir'); 18 | var tasks = requireDir('./tasks', { camelcase: true }); 19 | var config = require('./config'); 20 | 21 | var realCmd = Object.keys(tasks).indexOf(argv._[0]) >= 0; 22 | var cmd = realCmd ? argv._[0] : config.defaultCommand; 23 | 24 | module.exports = tasks[cmd]; 25 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJwcm9jZXNzIiwib24iLCJjb25zb2xlIiwibG9nIiwiZSIsImV4aXQiLCJyZXF1aXJlIiwiXyIsImFyZ3YiLCJyZXF1aXJlRGlyIiwidGFza3MiLCJjYW1lbGNhc2UiLCJjb25maWciLCJyZWFsQ21kIiwiT2JqZWN0Iiwia2V5cyIsImluZGV4T2YiLCJjbWQiLCJkZWZhdWx0Q29tbWFuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0FBLFFBQVFDLEVBQVIsQ0FBVyxtQkFBWCxFQUFnQyxhQUFLO0FBQUNDLFVBQVFDLEdBQVIsQ0FBWUMsQ0FBWixFQUFnQkosUUFBUUssSUFBUixDQUFhLENBQWI7QUFBaUIsQ0FBdkU7QUFDQUwsUUFBUUMsRUFBUixDQUFXLG9CQUFYLEVBQWlDLGFBQUs7QUFBQ0MsVUFBUUMsR0FBUixDQUFZQyxDQUFaLEVBQWdCSixRQUFRSyxJQUFSLENBQWEsQ0FBYjtBQUFpQixDQUF4RTs7QUFFQUMsUUFBUSxzQkFBUjtBQUNBQSxRQUFRLHFCQUFSO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxPQUFPRixRQUFRLE9BQVIsRUFBaUJFLElBQTlCO0FBQ0EsSUFBTUMsYUFBYUgsUUFBUSxhQUFSLENBQW5CO0FBQ0EsSUFBTUksUUFBUUQsV0FBVyxTQUFYLEVBQXNCLEVBQUNFLFdBQVcsSUFBWixFQUF0QixDQUFkO0FBQ0EsSUFBTUMsU0FBU04sUUFBUSxVQUFSLENBQWY7O0FBRUEsSUFBTU8sVUFBVUMsT0FBT0MsSUFBUCxDQUFZTCxLQUFaLEVBQW1CTSxPQUFuQixDQUEyQlIsS0FBS0QsQ0FBTCxDQUFPLENBQVAsQ0FBM0IsS0FBeUMsQ0FBekQ7QUFDQSxJQUFNVSxNQUFNSixVQUFVTCxLQUFLRCxDQUFMLENBQU8sQ0FBUCxDQUFWLEdBQXNCSyxPQUFPTSxjQUF6Qzs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQlYsTUFBTU8sR0FBTixDQUFqQiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE86IHJlbW92ZSB1bmNhdWdodCBleGNlcHRpb24gbG9nZ2luZ1xuLy8gVGhpcyBpcyBpbiBwbGFjZSB0ZW1wb3JhcmlseSB0byBlbnN1cmUgd2UgYXQgbGVhc3QgZ2V0IGEgc3RhY2sgdHJhY2Ugb24gZmFpbHVyZSB3aGlsZSB0aGUgcHJvamVjdFxuLy8gaXMgaW4gYWxwaGEuXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGUgPT4ge2NvbnNvbGUubG9nKGUpOyBwcm9jZXNzLmV4aXQoMSk7fSk7XG5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCBlID0+IHtjb25zb2xlLmxvZyhlKTsgcHJvY2Vzcy5leGl0KDEpO30pO1xuXG5yZXF1aXJlKCcuL3V0aWxzL2xvZGFzaC11dGlscycpO1xucmVxdWlyZSgnLi91dGlscy9sb2Rhc2gtZmxvdycpO1xuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgYXJndiA9IHJlcXVpcmUoJ3lhcmdzJykuYXJndjtcbmNvbnN0IHJlcXVpcmVEaXIgPSByZXF1aXJlKCdyZXF1aXJlLWRpcicpO1xuY29uc3QgdGFza3MgPSByZXF1aXJlRGlyKCcuL3Rhc2tzJywge2NhbWVsY2FzZTogdHJ1ZX0pO1xuY29uc3QgY29uZmlnID0gcmVxdWlyZSgnLi9jb25maWcnKTtcblxuY29uc3QgcmVhbENtZCA9IE9iamVjdC5rZXlzKHRhc2tzKS5pbmRleE9mKGFyZ3YuX1swXSkgPj0gMDtcbmNvbnN0IGNtZCA9IHJlYWxDbWQgPyBhcmd2Ll9bMF0gOiBjb25maWcuZGVmYXVsdENvbW1hbmQ7XG5cbm1vZHVsZS5leHBvcnRzID0gdGFza3NbY21kXTtcbiJdfQ== -------------------------------------------------------------------------------- /dist/plugins/cache-import.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | var pathExists = require('path-exists').sync; 6 | var requireDir = require('require-dir'); 7 | var plugins = requireDir('../plugins', { camelcase: true }); 8 | var cache = require('../utils/cache'); 9 | 10 | module.exports = cacheImport; 11 | 12 | function cacheImport(files) { 13 | _.forEach(files, function (file) { 14 | _.forEach(file.mapImports, function (source) { 15 | var resolved = path.resolve(source); 16 | if (pathExists(resolved)) { 17 | cache.push('deps', { 18 | src: source, 19 | srcResolved: resolved, 20 | consumer: file.srcResolved 21 | }); 22 | 23 | var cached = cache.get('files', resolved); 24 | 25 | if (cached) { 26 | cached.role = cached.role || 'import'; 27 | } else { 28 | cache.set('files', 'srcResolved', plugins.normalizeBase(source)); 29 | } 30 | } 31 | }); 32 | }); 33 | } 34 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL2NhY2hlLWltcG9ydC5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIl8iLCJwYXRoRXhpc3RzIiwic3luYyIsInJlcXVpcmVEaXIiLCJwbHVnaW5zIiwiY2FtZWxjYXNlIiwiY2FjaGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiY2FjaGVJbXBvcnQiLCJmaWxlcyIsImZvckVhY2giLCJmaWxlIiwibWFwSW1wb3J0cyIsInJlc29sdmVkIiwicmVzb2x2ZSIsInNvdXJjZSIsInB1c2giLCJzcmMiLCJzcmNSZXNvbHZlZCIsImNvbnN1bWVyIiwiY2FjaGVkIiwiZ2V0Iiwicm9sZSIsInNldCIsIm5vcm1hbGl6ZUJhc2UiXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsT0FBT0MsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLGFBQWFGLFFBQVEsYUFBUixFQUF1QkcsSUFBMUM7QUFDQSxJQUFNQyxhQUFhSixRQUFRLGFBQVIsQ0FBbkI7QUFDQSxJQUFNSyxVQUFVRCxXQUFXLFlBQVgsRUFBeUIsRUFBQ0UsV0FBVyxJQUFaLEVBQXpCLENBQWhCO0FBQ0EsSUFBTUMsUUFBUVAsUUFBUSxnQkFBUixDQUFkOztBQUVBUSxPQUFPQyxPQUFQLEdBQWlCQyxXQUFqQjs7QUFFQSxTQUFTQSxXQUFULENBQXFCQyxLQUFyQixFQUE0QjtBQUMxQlYsSUFBRVcsT0FBRixDQUFVRCxLQUFWLEVBQWlCLGdCQUFRO0FBQ3ZCVixNQUFFVyxPQUFGLENBQVVDLEtBQUtDLFVBQWYsRUFBMkIsa0JBQVU7QUFDbkMsVUFBTUMsV0FBV2hCLEtBQUtpQixPQUFMLENBQWFDLE1BQWIsQ0FBakI7QUFDQSxVQUFJZixXQUFXYSxRQUFYLENBQUosRUFBMEI7QUFDeEJSLGNBQU1XLElBQU4sQ0FBVyxNQUFYLEVBQW1CO0FBQ2pCQyxlQUFLRixNQURZO0FBRWpCRyx1QkFBYUwsUUFGSTtBQUdqQk0sb0JBQVVSLEtBQUtPO0FBSEUsU0FBbkI7O0FBTUEsWUFBTUUsU0FBU2YsTUFBTWdCLEdBQU4sQ0FBVSxPQUFWLEVBQW1CUixRQUFuQixDQUFmOztBQUVBLFlBQUlPLE1BQUosRUFBWTtBQUNWQSxpQkFBT0UsSUFBUCxHQUFjRixPQUFPRSxJQUFQLElBQWUsUUFBN0I7QUFDRCxTQUZELE1BRU87QUFDTGpCLGdCQUFNa0IsR0FBTixDQUFVLE9BQVYsRUFBbUIsYUFBbkIsRUFBa0NwQixRQUFRcUIsYUFBUixDQUFzQlQsTUFBdEIsQ0FBbEM7QUFDRDtBQUNGO0FBQ0YsS0FqQkQ7QUFrQkQsR0FuQkQ7QUFvQkQiLCJmaWxlIjoiY2FjaGUtaW1wb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IHBhdGhFeGlzdHMgPSByZXF1aXJlKCdwYXRoLWV4aXN0cycpLnN5bmM7XG5jb25zdCByZXF1aXJlRGlyID0gcmVxdWlyZSgncmVxdWlyZS1kaXInKTtcbmNvbnN0IHBsdWdpbnMgPSByZXF1aXJlRGlyKCcuLi9wbHVnaW5zJywge2NhbWVsY2FzZTogdHJ1ZX0pO1xuY29uc3QgY2FjaGUgPSByZXF1aXJlKCcuLi91dGlscy9jYWNoZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhY2hlSW1wb3J0O1xuXG5mdW5jdGlvbiBjYWNoZUltcG9ydChmaWxlcykge1xuICBfLmZvckVhY2goZmlsZXMsIGZpbGUgPT4ge1xuICAgIF8uZm9yRWFjaChmaWxlLm1hcEltcG9ydHMsIHNvdXJjZSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHBhdGgucmVzb2x2ZShzb3VyY2UpO1xuICAgICAgaWYgKHBhdGhFeGlzdHMocmVzb2x2ZWQpKSB7XG4gICAgICAgIGNhY2hlLnB1c2goJ2RlcHMnLCB7XG4gICAgICAgICAgc3JjOiBzb3VyY2UsXG4gICAgICAgICAgc3JjUmVzb2x2ZWQ6IHJlc29sdmVkLFxuICAgICAgICAgIGNvbnN1bWVyOiBmaWxlLnNyY1Jlc29sdmVkXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldCgnZmlsZXMnLCByZXNvbHZlZCk7XG5cbiAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgIGNhY2hlZC5yb2xlID0gY2FjaGVkLnJvbGUgfHwgJ2ltcG9ydCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FjaGUuc2V0KCdmaWxlcycsICdzcmNSZXNvbHZlZCcsIHBsdWdpbnMubm9ybWFsaXplQmFzZShzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/plugins/concat.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var config = require('../config'); 4 | var util = require('../utils/util'); 5 | var path = require('path'); 6 | var _ = require('lodash'); 7 | var Concat = require('concat-with-sourcemaps'); 8 | 9 | module.exports = function concat(assets) { 10 | var webPaths = _(assets).map('webPath').uniq().value(); 11 | 12 | return _.reduce(webPaths, function (acc, webPath) { 13 | var group = _.filter(assets, { webPath: webPath }); 14 | return _.concat(acc, concatenate(group)); 15 | }, []); 16 | 17 | function concatenate(group) { 18 | var result = _.pick(group[0], ['dirDest', 'filenameDest', 'groupKey', 'typeDest', 'filenameDest', 'dest', 'webPath', 'sourcemapPath']); 19 | 20 | var c = new Concat(true, result.dest, '\n'); 21 | _.forEach(group, function (asset) { 22 | var mappedPath = util.stripIgnoredBasePath(asset.src, config.assetIgnoredBasePaths); 23 | c.add(mappedPath, asset.content, asset.map); 24 | }); 25 | 26 | result.content = c.content.toString(); 27 | result.map = c.sourceMap; 28 | 29 | return result; 30 | } 31 | }; 32 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL2NvbmNhdC5qcyJdLCJuYW1lcyI6WyJjb25maWciLCJyZXF1aXJlIiwidXRpbCIsInBhdGgiLCJfIiwiQ29uY2F0IiwibW9kdWxlIiwiZXhwb3J0cyIsImNvbmNhdCIsImFzc2V0cyIsIndlYlBhdGhzIiwibWFwIiwidW5pcSIsInZhbHVlIiwicmVkdWNlIiwiYWNjIiwid2ViUGF0aCIsImdyb3VwIiwiZmlsdGVyIiwiY29uY2F0ZW5hdGUiLCJyZXN1bHQiLCJwaWNrIiwiYyIsImRlc3QiLCJmb3JFYWNoIiwibWFwcGVkUGF0aCIsInN0cmlwSWdub3JlZEJhc2VQYXRoIiwiYXNzZXQiLCJzcmMiLCJhc3NldElnbm9yZWRCYXNlUGF0aHMiLCJhZGQiLCJjb250ZW50IiwidG9TdHJpbmciLCJzb3VyY2VNYXAiXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsU0FBU0MsUUFBUSxXQUFSLENBQWY7QUFDQSxJQUFNQyxPQUFPRCxRQUFRLGVBQVIsQ0FBYjtBQUNBLElBQU1FLE9BQU9GLFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUcsSUFBSUgsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNSSxTQUFTSixRQUFRLHdCQUFSLENBQWY7O0FBRUFLLE9BQU9DLE9BQVAsR0FBaUIsU0FBU0MsTUFBVCxDQUFnQkMsTUFBaEIsRUFBd0I7QUFDdkMsTUFBTUMsV0FBV04sRUFBRUssTUFBRixFQUFVRSxHQUFWLENBQWMsU0FBZCxFQUF5QkMsSUFBekIsR0FBZ0NDLEtBQWhDLEVBQWpCOztBQUVBLFNBQU9ULEVBQUVVLE1BQUYsQ0FBU0osUUFBVCxFQUFtQixVQUFDSyxHQUFELEVBQU1DLE9BQU4sRUFBa0I7QUFDMUMsUUFBTUMsUUFBUWIsRUFBRWMsTUFBRixDQUFTVCxNQUFULEVBQWlCLEVBQUNPLGdCQUFELEVBQWpCLENBQWQ7QUFDQSxXQUFPWixFQUFFSSxNQUFGLENBQVNPLEdBQVQsRUFBY0ksWUFBWUYsS0FBWixDQUFkLENBQVA7QUFDRCxHQUhNLEVBR0osRUFISSxDQUFQOztBQUtBLFdBQVNFLFdBQVQsQ0FBcUJGLEtBQXJCLEVBQTRCO0FBQzFCLFFBQU1HLFNBQVNoQixFQUFFaUIsSUFBRixDQUFPSixNQUFNLENBQU4sQ0FBUCxFQUNiLENBQUMsU0FBRCxFQUFZLGNBQVosRUFBNEIsVUFBNUIsRUFBd0MsVUFBeEMsRUFBb0QsY0FBcEQsRUFBb0UsTUFBcEUsRUFBNEUsU0FBNUUsRUFBdUYsZUFBdkYsQ0FEYSxDQUFmOztBQUdBLFFBQU1LLElBQUksSUFBSWpCLE1BQUosQ0FBVyxJQUFYLEVBQWlCZSxPQUFPRyxJQUF4QixFQUE4QixJQUE5QixDQUFWO0FBQ0FuQixNQUFFb0IsT0FBRixDQUFVUCxLQUFWLEVBQWlCLGlCQUFTO0FBQ3hCLFVBQU1RLGFBQWF2QixLQUFLd0Isb0JBQUwsQ0FBMEJDLE1BQU1DLEdBQWhDLEVBQXFDNUIsT0FBTzZCLHFCQUE1QyxDQUFuQjtBQUNBUCxRQUFFUSxHQUFGLENBQU1MLFVBQU4sRUFBa0JFLE1BQU1JLE9BQXhCLEVBQWlDSixNQUFNaEIsR0FBdkM7QUFDRCxLQUhEOztBQUtBUyxXQUFPVyxPQUFQLEdBQWlCVCxFQUFFUyxPQUFGLENBQVVDLFFBQVYsRUFBakI7QUFDQVosV0FBT1QsR0FBUCxHQUFhVyxFQUFFVyxTQUFmOztBQUVBLFdBQU9iLE1BQVA7QUFDRDtBQUNGLENBdkJEIiwiZmlsZSI6ImNvbmNhdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWxzL3V0aWwnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5jb25zdCBDb25jYXQgPSByZXF1aXJlKCdjb25jYXQtd2l0aC1zb3VyY2VtYXBzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29uY2F0KGFzc2V0cykge1xuICBjb25zdCB3ZWJQYXRocyA9IF8oYXNzZXRzKS5tYXAoJ3dlYlBhdGgnKS51bmlxKCkudmFsdWUoKTtcblxuICByZXR1cm4gXy5yZWR1Y2Uod2ViUGF0aHMsIChhY2MsIHdlYlBhdGgpID0+IHtcbiAgICBjb25zdCBncm91cCA9IF8uZmlsdGVyKGFzc2V0cywge3dlYlBhdGh9KTtcbiAgICByZXR1cm4gXy5jb25jYXQoYWNjLCBjb25jYXRlbmF0ZShncm91cCkpO1xuICB9LCBbXSk7XG5cbiAgZnVuY3Rpb24gY29uY2F0ZW5hdGUoZ3JvdXApIHtcbiAgICBjb25zdCByZXN1bHQgPSBfLnBpY2soZ3JvdXBbMF0sXG4gICAgICBbJ2RpckRlc3QnLCAnZmlsZW5hbWVEZXN0JywgJ2dyb3VwS2V5JywgJ3R5cGVEZXN0JywgJ2ZpbGVuYW1lRGVzdCcsICdkZXN0JywgJ3dlYlBhdGgnLCAnc291cmNlbWFwUGF0aCddKTtcblxuICAgIGNvbnN0IGMgPSBuZXcgQ29uY2F0KHRydWUsIHJlc3VsdC5kZXN0LCAnXFxuJyk7XG4gICAgXy5mb3JFYWNoKGdyb3VwLCBhc3NldCA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRQYXRoID0gdXRpbC5zdHJpcElnbm9yZWRCYXNlUGF0aChhc3NldC5zcmMsIGNvbmZpZy5hc3NldElnbm9yZWRCYXNlUGF0aHMpO1xuICAgICAgYy5hZGQobWFwcGVkUGF0aCwgYXNzZXQuY29udGVudCwgYXNzZXQubWFwKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jb250ZW50ID0gYy5jb250ZW50LnRvU3RyaW5nKCk7XG4gICAgcmVzdWx0Lm1hcCA9IGMuc291cmNlTWFwO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/copy-source.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var bluebird = require('bluebird'); 5 | var fs = bluebird.promisifyAll(require('fs-extra')); 6 | var _ = require('lodash'); 7 | var config = require('../config'); 8 | var util = require('../utils/util'); 9 | 10 | module.exports = function copySource(file) { 11 | var promises = [copyToSourcemaps(file.src)]; 12 | 13 | if (file.map) { 14 | var parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 15 | _.forEach(parsedMap.sources, function (source) { 16 | return promises.push(copyToSourcemaps(source)); 17 | }); 18 | } 19 | 20 | return Promise.all(promises).then(function () { 21 | return file; 22 | }); 23 | 24 | function copyToSourcemaps(sourcePath) { 25 | var strippedSourcePath = util.stripIgnoredBasePath(sourcePath, config.assetIgnoredBasePaths); 26 | var sourcemapsPath = path.join(config.destDir, 'sourcemaps', strippedSourcePath); 27 | return _.attemptSilent(fs.copyAsync, sourcePath, sourcemapsPath, { dereference: true }); 28 | } 29 | }; 30 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL2NvcHktc291cmNlLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwiYmx1ZWJpcmQiLCJmcyIsInByb21pc2lmeUFsbCIsIl8iLCJjb25maWciLCJ1dGlsIiwibW9kdWxlIiwiZXhwb3J0cyIsImNvcHlTb3VyY2UiLCJmaWxlIiwicHJvbWlzZXMiLCJjb3B5VG9Tb3VyY2VtYXBzIiwic3JjIiwibWFwIiwicGFyc2VkTWFwIiwiaXNTdHJpbmciLCJKU09OIiwicGFyc2UiLCJmb3JFYWNoIiwic291cmNlcyIsInB1c2giLCJzb3VyY2UiLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsInNvdXJjZVBhdGgiLCJzdHJpcHBlZFNvdXJjZVBhdGgiLCJzdHJpcElnbm9yZWRCYXNlUGF0aCIsImFzc2V0SWdub3JlZEJhc2VQYXRocyIsInNvdXJjZW1hcHNQYXRoIiwiam9pbiIsImRlc3REaXIiLCJhdHRlbXB0U2lsZW50IiwiY29weUFzeW5jIiwiZGVyZWZlcmVuY2UiXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsT0FBT0MsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxLQUFLRCxTQUFTRSxZQUFULENBQXNCSCxRQUFRLFVBQVIsQ0FBdEIsQ0FBWDtBQUNBLElBQU1JLElBQUlKLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUssU0FBU0wsUUFBUSxXQUFSLENBQWY7QUFDQSxJQUFNTSxPQUFPTixRQUFRLGVBQVIsQ0FBYjs7QUFFQU8sT0FBT0MsT0FBUCxHQUFpQixTQUFTQyxVQUFULENBQW9CQyxJQUFwQixFQUEwQjtBQUN6QyxNQUFNQyxXQUFXLENBQUNDLGlCQUFpQkYsS0FBS0csR0FBdEIsQ0FBRCxDQUFqQjs7QUFFQSxNQUFJSCxLQUFLSSxHQUFULEVBQWM7QUFDWixRQUFNQyxZQUFZWCxFQUFFWSxRQUFGLENBQVdOLEtBQUtJLEdBQWhCLElBQXVCRyxLQUFLQyxLQUFMLENBQVdSLEtBQUtJLEdBQWhCLENBQXZCLEdBQThDSixLQUFLSSxHQUFyRTtBQUNBVixNQUFFZSxPQUFGLENBQVVKLFVBQVVLLE9BQXBCLEVBQTZCO0FBQUEsYUFBVVQsU0FBU1UsSUFBVCxDQUFjVCxpQkFBaUJVLE1BQWpCLENBQWQsQ0FBVjtBQUFBLEtBQTdCO0FBQ0Q7O0FBRUQsU0FBT0MsUUFBUUMsR0FBUixDQUFZYixRQUFaLEVBQXNCYyxJQUF0QixDQUEyQjtBQUFBLFdBQU1mLElBQU47QUFBQSxHQUEzQixDQUFQOztBQUVBLFdBQVNFLGdCQUFULENBQTBCYyxVQUExQixFQUFzQztBQUNwQyxRQUFNQyxxQkFBcUJyQixLQUFLc0Isb0JBQUwsQ0FBMEJGLFVBQTFCLEVBQXNDckIsT0FBT3dCLHFCQUE3QyxDQUEzQjtBQUNBLFFBQU1DLGlCQUFpQi9CLEtBQUtnQyxJQUFMLENBQVUxQixPQUFPMkIsT0FBakIsRUFBMEIsWUFBMUIsRUFBd0NMLGtCQUF4QyxDQUF2QjtBQUNBLFdBQU92QixFQUFFNkIsYUFBRixDQUFnQi9CLEdBQUdnQyxTQUFuQixFQUE4QlIsVUFBOUIsRUFBMENJLGNBQTFDLEVBQTBELEVBQUNLLGFBQWEsSUFBZCxFQUExRCxDQUFQO0FBQ0Q7QUFFRixDQWhCRCIsImZpbGUiOiJjb3B5LXNvdXJjZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBibHVlYmlyZCA9IHJlcXVpcmUoJ2JsdWViaXJkJyk7XG5jb25zdCBmcyA9IGJsdWViaXJkLnByb21pc2lmeUFsbChyZXF1aXJlKCdmcy1leHRyYScpKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJy4uL3V0aWxzL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb3B5U291cmNlKGZpbGUpIHtcbiAgY29uc3QgcHJvbWlzZXMgPSBbY29weVRvU291cmNlbWFwcyhmaWxlLnNyYyldO1xuXG4gIGlmIChmaWxlLm1hcCkge1xuICAgIGNvbnN0IHBhcnNlZE1hcCA9IF8uaXNTdHJpbmcoZmlsZS5tYXApID8gSlNPTi5wYXJzZShmaWxlLm1hcCkgOiBmaWxlLm1hcDtcbiAgICBfLmZvckVhY2gocGFyc2VkTWFwLnNvdXJjZXMsIHNvdXJjZSA9PiBwcm9taXNlcy5wdXNoKGNvcHlUb1NvdXJjZW1hcHMoc291cmNlKSkpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IGZpbGUpO1xuXG4gIGZ1bmN0aW9uIGNvcHlUb1NvdXJjZW1hcHMoc291cmNlUGF0aCkge1xuICAgIGNvbnN0IHN0cmlwcGVkU291cmNlUGF0aCA9IHV0aWwuc3RyaXBJZ25vcmVkQmFzZVBhdGgoc291cmNlUGF0aCwgY29uZmlnLmFzc2V0SWdub3JlZEJhc2VQYXRocyk7XG4gICAgY29uc3Qgc291cmNlbWFwc1BhdGggPSBwYXRoLmpvaW4oY29uZmlnLmRlc3REaXIsICdzb3VyY2VtYXBzJywgc3RyaXBwZWRTb3VyY2VQYXRoKTtcbiAgICByZXR1cm4gXy5hdHRlbXB0U2lsZW50KGZzLmNvcHlBc3luYywgc291cmNlUGF0aCwgc291cmNlbWFwc1BhdGgsIHtkZXJlZmVyZW5jZTogdHJ1ZX0pO1xuICB9XG5cbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/plugins/get-asset-content.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var cache = require('../utils/cache'); 5 | 6 | module.exports = getAssetContent; 7 | 8 | function getAssetContent(dep) { 9 | var _cache$get = cache.get('files', dep.srcResolved), 10 | content = _cache$get.content, 11 | map = _cache$get.map, 12 | mapImports = _cache$get.mapImports; 13 | 14 | return _.assign({}, dep, { content: content, map: map, mapImports: mapImports }); 15 | } 16 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL2dldC1hc3NldC1jb250ZW50LmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiY2FjaGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiZ2V0QXNzZXRDb250ZW50IiwiZGVwIiwiZ2V0Iiwic3JjUmVzb2x2ZWQiLCJjb250ZW50IiwibWFwIiwibWFwSW1wb3J0cyIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFFBQVFELFFBQVEsZ0JBQVIsQ0FBZDs7QUFFQUUsT0FBT0MsT0FBUCxHQUFpQkMsZUFBakI7O0FBRUEsU0FBU0EsZUFBVCxDQUF5QkMsR0FBekIsRUFBOEI7QUFBQSxtQkFDT0osTUFBTUssR0FBTixDQUFVLE9BQVYsRUFBbUJELElBQUlFLFdBQXZCLENBRFA7QUFBQSxNQUNyQkMsT0FEcUIsY0FDckJBLE9BRHFCO0FBQUEsTUFDWkMsR0FEWSxjQUNaQSxHQURZO0FBQUEsTUFDUEMsVUFETyxjQUNQQSxVQURPOztBQUU1QixTQUFPWCxFQUFFWSxNQUFGLENBQVMsRUFBVCxFQUFhTixHQUFiLEVBQWtCLEVBQUNHLGdCQUFELEVBQVVDLFFBQVYsRUFBZUMsc0JBQWYsRUFBbEIsQ0FBUDtBQUNEIiwiZmlsZSI6ImdldC1hc3NldC1jb250ZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgY2FjaGUgPSByZXF1aXJlKCcuLi91dGlscy9jYWNoZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFzc2V0Q29udGVudDtcblxuZnVuY3Rpb24gZ2V0QXNzZXRDb250ZW50KGRlcCkge1xuICBjb25zdCB7Y29udGVudCwgbWFwLCBtYXBJbXBvcnRzfSA9IGNhY2hlLmdldCgnZmlsZXMnLCBkZXAuc3JjUmVzb2x2ZWQpO1xuICByZXR1cm4gXy5hc3NpZ24oe30sIGRlcCwge2NvbnRlbnQsIG1hcCwgbWFwSW1wb3J0c30pO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/get-web-path.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var path = require('path'); 5 | var config = require('../config'); 6 | 7 | var _require = require('../utils/util'), 8 | getCompiledType = _require.getCompiledType, 9 | getType = _require.getType, 10 | stripIgnoredBasePath = _require.stripIgnoredBasePath; 11 | 12 | module.exports = getWebPath; 13 | 14 | function getWebPath(refPath, dataFile, groupKey) { 15 | var ref = path.parse(refPath); 16 | var type = getType(ref.ext); 17 | var compiledType = getCompiledType(type); 18 | 19 | if (compiledType) { 20 | ref.ext = '.' + compiledType; 21 | ref.base = ref.name + ref.ext; 22 | } 23 | 24 | var forWrapper = dataFile.name === 'wrapper'; 25 | var basePathStripped = stripIgnoredBasePath(dataFile.dir, config.assetIgnoredBasePaths); 26 | var prefix = forWrapper ? '' : dataFile.name + '-'; 27 | var pathBase = forWrapper ? '/' + basePathStripped : ''; 28 | 29 | // Fix dest for assets that are above the src directory, such as node modules 30 | var consumerDir = path.dirname(path.relative(path.join(process.cwd(), config.srcDir), dataFile.srcResolved)); 31 | 32 | if (process.env.task === 'build') { 33 | ref.base = prefix + groupKey + '.min' + ref.ext; 34 | return '/' + path.join(consumerDir, ref.base); 35 | } else { 36 | var srcStripped = stripIgnoredBasePath(refPath, config.assetIgnoredBasePaths); 37 | var dirStripped = path.dirname(srcStripped); 38 | var uniquePathPortion = _.trimStart(path.relative(consumerDir, dirStripped), path.sep + '.'); 39 | 40 | ref.dest = path.join(path.dirname(srcStripped), ref.base); 41 | 42 | if (!dirStripped.startsWith(consumerDir)) { 43 | ref.dest = path.join(consumerDir, ref.dest); 44 | } 45 | 46 | return '/' + ref.dest; 47 | } 48 | } 49 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL2dldC13ZWItcGF0aC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsInBhdGgiLCJjb25maWciLCJnZXRDb21waWxlZFR5cGUiLCJnZXRUeXBlIiwic3RyaXBJZ25vcmVkQmFzZVBhdGgiLCJtb2R1bGUiLCJleHBvcnRzIiwiZ2V0V2ViUGF0aCIsInJlZlBhdGgiLCJkYXRhRmlsZSIsImdyb3VwS2V5IiwicmVmIiwicGFyc2UiLCJ0eXBlIiwiZXh0IiwiY29tcGlsZWRUeXBlIiwiYmFzZSIsIm5hbWUiLCJmb3JXcmFwcGVyIiwiYmFzZVBhdGhTdHJpcHBlZCIsImRpciIsImFzc2V0SWdub3JlZEJhc2VQYXRocyIsInByZWZpeCIsInBhdGhCYXNlIiwiY29uc3VtZXJEaXIiLCJkaXJuYW1lIiwicmVsYXRpdmUiLCJqb2luIiwicHJvY2VzcyIsImN3ZCIsInNyY0RpciIsInNyY1Jlc29sdmVkIiwiZW52IiwidGFzayIsInNyY1N0cmlwcGVkIiwiZGlyU3RyaXBwZWQiLCJ1bmlxdWVQYXRoUG9ydGlvbiIsInRyaW1TdGFydCIsInNlcCIsImRlc3QiLCJzdGFydHNXaXRoIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsT0FBT0QsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFdBQVIsQ0FBZjs7ZUFDeURBLFFBQVEsZUFBUixDO0lBQWxERyxlLFlBQUFBLGU7SUFBaUJDLE8sWUFBQUEsTztJQUFTQyxvQixZQUFBQSxvQjs7QUFFakNDLE9BQU9DLE9BQVAsR0FBaUJDLFVBQWpCOztBQUVBLFNBQVNBLFVBQVQsQ0FBb0JDLE9BQXBCLEVBQTZCQyxRQUE3QixFQUF1Q0MsUUFBdkMsRUFBaUQ7QUFDL0MsTUFBTUMsTUFBTVgsS0FBS1ksS0FBTCxDQUFXSixPQUFYLENBQVo7QUFDQSxNQUFNSyxPQUFPVixRQUFRUSxJQUFJRyxHQUFaLENBQWI7QUFDQSxNQUFNQyxlQUFlYixnQkFBZ0JXLElBQWhCLENBQXJCOztBQUVBLE1BQUlFLFlBQUosRUFBa0I7QUFDaEJKLFFBQUlHLEdBQUosR0FBVSxNQUFNQyxZQUFoQjtBQUNBSixRQUFJSyxJQUFKLEdBQVdMLElBQUlNLElBQUosR0FBV04sSUFBSUcsR0FBMUI7QUFDRDs7QUFFRCxNQUFNSSxhQUFhVCxTQUFTUSxJQUFULEtBQWtCLFNBQXJDO0FBQ0EsTUFBTUUsbUJBQW1CZixxQkFBcUJLLFNBQVNXLEdBQTlCLEVBQW1DbkIsT0FBT29CLHFCQUExQyxDQUF6QjtBQUNBLE1BQU1DLFNBQVNKLGFBQWEsRUFBYixHQUFrQlQsU0FBU1EsSUFBVCxHQUFnQixHQUFqRDtBQUNBLE1BQU1NLFdBQVdMLGFBQWEsTUFBTUMsZ0JBQW5CLEdBQXNDLEVBQXZEOztBQUVBO0FBQ0EsTUFBTUssY0FBY3hCLEtBQUt5QixPQUFMLENBQWF6QixLQUFLMEIsUUFBTCxDQUFjMUIsS0FBSzJCLElBQUwsQ0FBVUMsUUFBUUMsR0FBUixFQUFWLEVBQXlCNUIsT0FBTzZCLE1BQWhDLENBQWQsRUFBdURyQixTQUFTc0IsV0FBaEUsQ0FBYixDQUFwQjs7QUFFQSxNQUFJSCxRQUFRSSxHQUFSLENBQVlDLElBQVosS0FBcUIsT0FBekIsRUFBa0M7QUFDaEN0QixRQUFJSyxJQUFKLEdBQVdNLFNBQVNaLFFBQVQsR0FBb0IsTUFBcEIsR0FBNkJDLElBQUlHLEdBQTVDO0FBQ0EsV0FBTyxNQUFNZCxLQUFLMkIsSUFBTCxDQUFVSCxXQUFWLEVBQXVCYixJQUFJSyxJQUEzQixDQUFiO0FBQ0QsR0FIRCxNQUdPO0FBQ0wsUUFBTWtCLGNBQWM5QixxQkFBcUJJLE9BQXJCLEVBQThCUCxPQUFPb0IscUJBQXJDLENBQXBCO0FBQ0EsUUFBTWMsY0FBY25DLEtBQUt5QixPQUFMLENBQWFTLFdBQWIsQ0FBcEI7QUFDQSxRQUFNRSxvQkFBb0J0QyxFQUFFdUMsU0FBRixDQUFZckMsS0FBSzBCLFFBQUwsQ0FBY0YsV0FBZCxFQUEyQlcsV0FBM0IsQ0FBWixFQUFxRG5DLEtBQUtzQyxHQUFMLEdBQVcsR0FBaEUsQ0FBMUI7O0FBRUEzQixRQUFJNEIsSUFBSixHQUFXdkMsS0FBSzJCLElBQUwsQ0FBVTNCLEtBQUt5QixPQUFMLENBQWFTLFdBQWIsQ0FBVixFQUFxQ3ZCLElBQUlLLElBQXpDLENBQVg7O0FBRUEsUUFBSSxDQUFDbUIsWUFBWUssVUFBWixDQUF1QmhCLFdBQXZCLENBQUwsRUFBMEM7QUFDeENiLFVBQUk0QixJQUFKLEdBQVd2QyxLQUFLMkIsSUFBTCxDQUFVSCxXQUFWLEVBQXVCYixJQUFJNEIsSUFBM0IsQ0FBWDtBQUNEOztBQUVELFdBQU8sTUFBTTVCLElBQUk0QixJQUFqQjtBQUNEO0FBQ0YiLCJmaWxlIjoiZ2V0LXdlYi1wYXRoLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3Qge2dldENvbXBpbGVkVHlwZSwgZ2V0VHlwZSwgc3RyaXBJZ25vcmVkQmFzZVBhdGh9ID0gcmVxdWlyZSgnLi4vdXRpbHMvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFdlYlBhdGg7XG5cbmZ1bmN0aW9uIGdldFdlYlBhdGgocmVmUGF0aCwgZGF0YUZpbGUsIGdyb3VwS2V5KSB7XG4gIGNvbnN0IHJlZiA9IHBhdGgucGFyc2UocmVmUGF0aCk7XG4gIGNvbnN0IHR5cGUgPSBnZXRUeXBlKHJlZi5leHQpO1xuICBjb25zdCBjb21waWxlZFR5cGUgPSBnZXRDb21waWxlZFR5cGUodHlwZSk7XG5cbiAgaWYgKGNvbXBpbGVkVHlwZSkge1xuICAgIHJlZi5leHQgPSAnLicgKyBjb21waWxlZFR5cGU7XG4gICAgcmVmLmJhc2UgPSByZWYubmFtZSArIHJlZi5leHQ7XG4gIH1cblxuICBjb25zdCBmb3JXcmFwcGVyID0gZGF0YUZpbGUubmFtZSA9PT0gJ3dyYXBwZXInO1xuICBjb25zdCBiYXNlUGF0aFN0cmlwcGVkID0gc3RyaXBJZ25vcmVkQmFzZVBhdGgoZGF0YUZpbGUuZGlyLCBjb25maWcuYXNzZXRJZ25vcmVkQmFzZVBhdGhzKTtcbiAgY29uc3QgcHJlZml4ID0gZm9yV3JhcHBlciA/ICcnIDogZGF0YUZpbGUubmFtZSArICctJztcbiAgY29uc3QgcGF0aEJhc2UgPSBmb3JXcmFwcGVyID8gJy8nICsgYmFzZVBhdGhTdHJpcHBlZCA6ICcnO1xuXG4gIC8vIEZpeCBkZXN0IGZvciBhc3NldHMgdGhhdCBhcmUgYWJvdmUgdGhlIHNyYyBkaXJlY3RvcnksIHN1Y2ggYXMgbm9kZSBtb2R1bGVzXG4gIGNvbnN0IGNvbnN1bWVyRGlyID0gcGF0aC5kaXJuYW1lKHBhdGgucmVsYXRpdmUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zcmNEaXIpLCBkYXRhRmlsZS5zcmNSZXNvbHZlZCkpO1xuXG4gIGlmIChwcm9jZXNzLmVudi50YXNrID09PSAnYnVpbGQnKSB7XG4gICAgcmVmLmJhc2UgPSBwcmVmaXggKyBncm91cEtleSArICcubWluJyArIHJlZi5leHQ7XG4gICAgcmV0dXJuICcvJyArIHBhdGguam9pbihjb25zdW1lckRpciwgcmVmLmJhc2UpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNyY1N0cmlwcGVkID0gc3RyaXBJZ25vcmVkQmFzZVBhdGgocmVmUGF0aCwgY29uZmlnLmFzc2V0SWdub3JlZEJhc2VQYXRocyk7XG4gICAgY29uc3QgZGlyU3RyaXBwZWQgPSBwYXRoLmRpcm5hbWUoc3JjU3RyaXBwZWQpO1xuICAgIGNvbnN0IHVuaXF1ZVBhdGhQb3J0aW9uID0gXy50cmltU3RhcnQocGF0aC5yZWxhdGl2ZShjb25zdW1lckRpciwgZGlyU3RyaXBwZWQpLCBwYXRoLnNlcCArICcuJyk7XG5cbiAgICByZWYuZGVzdCA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoc3JjU3RyaXBwZWQpLCByZWYuYmFzZSk7XG5cbiAgICBpZiAoIWRpclN0cmlwcGVkLnN0YXJ0c1dpdGgoY29uc3VtZXJEaXIpKSB7XG4gICAgICByZWYuZGVzdCA9IHBhdGguam9pbihjb25zdW1lckRpciwgcmVmLmRlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiAnLycgKyByZWYuZGVzdDtcbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/minify.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var postcss = require('postcss'); 5 | var cssnano = require('cssnano'); 6 | var uglifyjs = require('uglify-js'); 7 | 8 | module.exports = function minify(file) { 9 | var minified = minifiers[file.typeDest](file); 10 | return minified.then(function (result) { 11 | return _.assign(file, result); 12 | }); 13 | }; 14 | 15 | var minifiers = { css: css, js: js }; 16 | 17 | function css(file) { 18 | var opts = { 19 | from: file.src, 20 | to: file.src, 21 | map: { 22 | prev: file.map, 23 | inline: false, 24 | sourcesContent: false, 25 | annotation: false 26 | } 27 | }; 28 | 29 | return postcss([cssnano()]).process(file.content, opts).then(function (result) { 30 | return { 31 | content: result.css, 32 | map: result.map.toString() 33 | }; 34 | }); 35 | } 36 | 37 | function js(file) { 38 | var opts = { 39 | fromString: true, 40 | sourceMapUrl: false 41 | }; 42 | 43 | if (file.map) { 44 | opts.inSourceMap = _.isObject(file.map) ? file.map : JSON.parse(file.map); 45 | opts.outSourceMap = file.destFilename + '.map'; 46 | } 47 | 48 | var result = uglifyjs.minify(file.content, opts); 49 | 50 | return Promise.resolve({ content: result.code, map: result.map }); 51 | } 52 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL21pbmlmeS5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsInBvc3Rjc3MiLCJjc3NuYW5vIiwidWdsaWZ5anMiLCJtb2R1bGUiLCJleHBvcnRzIiwibWluaWZ5IiwiZmlsZSIsIm1pbmlmaWVkIiwibWluaWZpZXJzIiwidHlwZURlc3QiLCJ0aGVuIiwiYXNzaWduIiwicmVzdWx0IiwiY3NzIiwianMiLCJvcHRzIiwiZnJvbSIsInNyYyIsInRvIiwibWFwIiwicHJldiIsImlubGluZSIsInNvdXJjZXNDb250ZW50IiwiYW5ub3RhdGlvbiIsInByb2Nlc3MiLCJjb250ZW50IiwidG9TdHJpbmciLCJmcm9tU3RyaW5nIiwic291cmNlTWFwVXJsIiwiaW5Tb3VyY2VNYXAiLCJpc09iamVjdCIsIkpTT04iLCJwYXJzZSIsIm91dFNvdXJjZU1hcCIsImRlc3RGaWxlbmFtZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFVBQVVELFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1FLFVBQVVGLFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1HLFdBQVdILFFBQVEsV0FBUixDQUFqQjs7QUFFQUksT0FBT0MsT0FBUCxHQUFpQixTQUFTQyxNQUFULENBQWdCQyxJQUFoQixFQUFzQjtBQUNyQyxNQUFNQyxXQUFXQyxVQUFVRixLQUFLRyxRQUFmLEVBQXlCSCxJQUF6QixDQUFqQjtBQUNBLFNBQU9DLFNBQVNHLElBQVQsQ0FBYztBQUFBLFdBQVVaLEVBQUVhLE1BQUYsQ0FBU0wsSUFBVCxFQUFlTSxNQUFmLENBQVY7QUFBQSxHQUFkLENBQVA7QUFDRCxDQUhEOztBQUtBLElBQU1KLFlBQVksRUFBQ0ssUUFBRCxFQUFNQyxNQUFOLEVBQWxCOztBQUVBLFNBQVNELEdBQVQsQ0FBYVAsSUFBYixFQUFtQjtBQUNqQixNQUFNUyxPQUFPO0FBQ1hDLFVBQU1WLEtBQUtXLEdBREE7QUFFWEMsUUFBSVosS0FBS1csR0FGRTtBQUdYRSxTQUFLO0FBQ0hDLFlBQU1kLEtBQUthLEdBRFI7QUFFSEUsY0FBUSxLQUZMO0FBR0hDLHNCQUFnQixLQUhiO0FBSUhDLGtCQUFZO0FBSlQ7QUFITSxHQUFiOztBQVdBLFNBQU92QixRQUFRLENBQUNDLFNBQUQsQ0FBUixFQUNKdUIsT0FESSxDQUNJbEIsS0FBS21CLE9BRFQsRUFDa0JWLElBRGxCLEVBRUpMLElBRkksQ0FFQztBQUFBLFdBQVc7QUFDZmUsZUFBU2IsT0FBT0MsR0FERDtBQUVmTSxXQUFLUCxPQUFPTyxHQUFQLENBQVdPLFFBQVg7QUFGVSxLQUFYO0FBQUEsR0FGRCxDQUFQO0FBTUQ7O0FBRUQsU0FBU1osRUFBVCxDQUFZUixJQUFaLEVBQWtCO0FBQ2hCLE1BQU1TLE9BQU87QUFDWFksZ0JBQVksSUFERDtBQUVYQyxrQkFBYztBQUZILEdBQWI7O0FBS0EsTUFBSXRCLEtBQUthLEdBQVQsRUFBYztBQUNaSixTQUFLYyxXQUFMLEdBQW1CL0IsRUFBRWdDLFFBQUYsQ0FBV3hCLEtBQUthLEdBQWhCLElBQXVCYixLQUFLYSxHQUE1QixHQUFrQ1ksS0FBS0MsS0FBTCxDQUFXMUIsS0FBS2EsR0FBaEIsQ0FBckQ7QUFDQUosU0FBS2tCLFlBQUwsR0FBb0IzQixLQUFLNEIsWUFBTCxHQUFvQixNQUF4QztBQUNEOztBQUVELE1BQU10QixTQUFTVixTQUFTRyxNQUFULENBQWdCQyxLQUFLbUIsT0FBckIsRUFBOEJWLElBQTlCLENBQWY7O0FBRUEsU0FBT29CLFFBQVFDLE9BQVIsQ0FBZ0IsRUFBQ1gsU0FBU2IsT0FBT3lCLElBQWpCLEVBQXVCbEIsS0FBS1AsT0FBT08sR0FBbkMsRUFBaEIsQ0FBUDtBQUNEIiwiZmlsZSI6Im1pbmlmeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IHBvc3Rjc3MgPSByZXF1aXJlKCdwb3N0Y3NzJyk7XG5jb25zdCBjc3NuYW5vID0gcmVxdWlyZSgnY3NzbmFubycpO1xuY29uc3QgdWdsaWZ5anMgPSByZXF1aXJlKCd1Z2xpZnktanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBtaW5pZnkoZmlsZSkge1xuICBjb25zdCBtaW5pZmllZCA9IG1pbmlmaWVyc1tmaWxlLnR5cGVEZXN0XShmaWxlKTtcbiAgcmV0dXJuIG1pbmlmaWVkLnRoZW4ocmVzdWx0ID0+IF8uYXNzaWduKGZpbGUsIHJlc3VsdCkpO1xufVxuXG5jb25zdCBtaW5pZmllcnMgPSB7Y3NzLCBqc307XG5cbmZ1bmN0aW9uIGNzcyhmaWxlKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZnJvbTogZmlsZS5zcmMsXG4gICAgdG86IGZpbGUuc3JjLFxuICAgIG1hcDoge1xuICAgICAgcHJldjogZmlsZS5tYXAsXG4gICAgICBpbmxpbmU6IGZhbHNlLFxuICAgICAgc291cmNlc0NvbnRlbnQ6IGZhbHNlLFxuICAgICAgYW5ub3RhdGlvbjogZmFsc2VcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHBvc3Rjc3MoW2Nzc25hbm8oKV0pXG4gICAgLnByb2Nlc3MoZmlsZS5jb250ZW50LCBvcHRzKVxuICAgIC50aGVuKHJlc3VsdCA9PiAoe1xuICAgICAgY29udGVudDogcmVzdWx0LmNzcyxcbiAgICAgIG1hcDogcmVzdWx0Lm1hcC50b1N0cmluZygpXG4gICAgfSkpO1xufVxuXG5mdW5jdGlvbiBqcyhmaWxlKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgZnJvbVN0cmluZzogdHJ1ZSxcbiAgICBzb3VyY2VNYXBVcmw6IGZhbHNlXG4gIH07XG5cbiAgaWYgKGZpbGUubWFwKSB7XG4gICAgb3B0cy5pblNvdXJjZU1hcCA9IF8uaXNPYmplY3QoZmlsZS5tYXApID8gZmlsZS5tYXAgOiBKU09OLnBhcnNlKGZpbGUubWFwKTtcbiAgICBvcHRzLm91dFNvdXJjZU1hcCA9IGZpbGUuZGVzdEZpbGVuYW1lICsgJy5tYXAnO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gdWdsaWZ5anMubWluaWZ5KGZpbGUuY29udGVudCwgb3B0cyk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7Y29udGVudDogcmVzdWx0LmNvZGUsIG1hcDogcmVzdWx0Lm1hcH0pO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/normalize-asset.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var config = require('../config'); 5 | 6 | var _require = require('../utils/util'), 7 | getCompiledType = _require.getCompiledType, 8 | getType = _require.getType, 9 | stripIgnoredBasePath = _require.stripIgnoredBasePath; 10 | 11 | module.exports = normalizeAsset; 12 | 13 | function normalizeAsset(ref) { 14 | ref.type = getType(ref.ext); 15 | ref.typeDest = ref.type; 16 | ref.baseDest = ref.base; 17 | var compiledType = getCompiledType(ref.type); 18 | if (compiledType) { 19 | ref.typeDest = compiledType; 20 | ref.baseDest = ref.name + '.' + ref.typeDest; 21 | } 22 | ref.isMinified = ref.isMinified || path.extname(ref.name) === '.min'; 23 | if (ref.isMinified) { 24 | ref.name = path.basename(ref.name, '.min'); 25 | } 26 | ref.basePathStripped = stripIgnoredBasePath(ref.baseDir, config.assetIgnoredBasePaths); 27 | 28 | // set dest directory 29 | ref.srcStripped = stripIgnoredBasePath(ref.src, config.assetIgnoredBasePaths); 30 | ref.dirDest = path.join(config.destDir, path.dirname(ref.srcStripped)); 31 | 32 | if (process.env.task === 'build' && !ref.isMinified) { 33 | ref.baseDest = ref.name + '.min.' + ref.typeDest; 34 | } 35 | 36 | ref.dest = path.join(ref.dirDest, ref.baseDest); 37 | ref.destResolved = path.resolve(ref.dest); 38 | 39 | return ref; 40 | } 41 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL25vcm1hbGl6ZS1hc3NldC5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsImNvbmZpZyIsImdldENvbXBpbGVkVHlwZSIsImdldFR5cGUiLCJzdHJpcElnbm9yZWRCYXNlUGF0aCIsIm1vZHVsZSIsImV4cG9ydHMiLCJub3JtYWxpemVBc3NldCIsInJlZiIsInR5cGUiLCJleHQiLCJ0eXBlRGVzdCIsImJhc2VEZXN0IiwiYmFzZSIsImNvbXBpbGVkVHlwZSIsIm5hbWUiLCJpc01pbmlmaWVkIiwiZXh0bmFtZSIsImJhc2VuYW1lIiwiYmFzZVBhdGhTdHJpcHBlZCIsImJhc2VEaXIiLCJhc3NldElnbm9yZWRCYXNlUGF0aHMiLCJzcmNTdHJpcHBlZCIsInNyYyIsImRpckRlc3QiLCJqb2luIiwiZGVzdERpciIsImRpcm5hbWUiLCJwcm9jZXNzIiwiZW52IiwidGFzayIsImRlc3QiLCJkZXN0UmVzb2x2ZWQiLCJyZXNvbHZlIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxXQUFSLENBQWY7O2VBQ3lEQSxRQUFRLGVBQVIsQztJQUFsREUsZSxZQUFBQSxlO0lBQWlCQyxPLFlBQUFBLE87SUFBU0Msb0IsWUFBQUEsb0I7O0FBRWpDQyxPQUFPQyxPQUFQLEdBQWlCQyxjQUFqQjs7QUFFQSxTQUFTQSxjQUFULENBQXdCQyxHQUF4QixFQUE2QjtBQUMzQkEsTUFBSUMsSUFBSixHQUFXTixRQUFRSyxJQUFJRSxHQUFaLENBQVg7QUFDQUYsTUFBSUcsUUFBSixHQUFlSCxJQUFJQyxJQUFuQjtBQUNBRCxNQUFJSSxRQUFKLEdBQWVKLElBQUlLLElBQW5CO0FBQ0EsTUFBTUMsZUFBZVosZ0JBQWdCTSxJQUFJQyxJQUFwQixDQUFyQjtBQUNBLE1BQUlLLFlBQUosRUFBa0I7QUFDaEJOLFFBQUlHLFFBQUosR0FBZUcsWUFBZjtBQUNBTixRQUFJSSxRQUFKLEdBQWVKLElBQUlPLElBQUosR0FBVyxHQUFYLEdBQWlCUCxJQUFJRyxRQUFwQztBQUNEO0FBQ0RILE1BQUlRLFVBQUosR0FBaUJSLElBQUlRLFVBQUosSUFBa0JqQixLQUFLa0IsT0FBTCxDQUFhVCxJQUFJTyxJQUFqQixNQUEyQixNQUE5RDtBQUNBLE1BQUlQLElBQUlRLFVBQVIsRUFBb0I7QUFDbEJSLFFBQUlPLElBQUosR0FBV2hCLEtBQUttQixRQUFMLENBQWNWLElBQUlPLElBQWxCLEVBQXdCLE1BQXhCLENBQVg7QUFDRDtBQUNEUCxNQUFJVyxnQkFBSixHQUF1QmYscUJBQXFCSSxJQUFJWSxPQUF6QixFQUFrQ25CLE9BQU9vQixxQkFBekMsQ0FBdkI7O0FBRUE7QUFDQWIsTUFBSWMsV0FBSixHQUFrQmxCLHFCQUFxQkksSUFBSWUsR0FBekIsRUFBOEJ0QixPQUFPb0IscUJBQXJDLENBQWxCO0FBQ0FiLE1BQUlnQixPQUFKLEdBQWN6QixLQUFLMEIsSUFBTCxDQUFVeEIsT0FBT3lCLE9BQWpCLEVBQTBCM0IsS0FBSzRCLE9BQUwsQ0FBYW5CLElBQUljLFdBQWpCLENBQTFCLENBQWQ7O0FBRUEsTUFBSU0sUUFBUUMsR0FBUixDQUFZQyxJQUFaLEtBQXFCLE9BQXJCLElBQWdDLENBQUN0QixJQUFJUSxVQUF6QyxFQUFxRDtBQUNuRFIsUUFBSUksUUFBSixHQUFlSixJQUFJTyxJQUFKLEdBQVcsT0FBWCxHQUFxQlAsSUFBSUcsUUFBeEM7QUFDRDs7QUFFREgsTUFBSXVCLElBQUosR0FBV2hDLEtBQUswQixJQUFMLENBQVVqQixJQUFJZ0IsT0FBZCxFQUF1QmhCLElBQUlJLFFBQTNCLENBQVg7QUFDQUosTUFBSXdCLFlBQUosR0FBbUJqQyxLQUFLa0MsT0FBTCxDQUFhekIsSUFBSXVCLElBQWpCLENBQW5COztBQUVBLFNBQU92QixHQUFQO0FBQ0QiLCJmaWxlIjoibm9ybWFsaXplLWFzc2V0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3Qge2dldENvbXBpbGVkVHlwZSwgZ2V0VHlwZSwgc3RyaXBJZ25vcmVkQmFzZVBhdGh9ID0gcmVxdWlyZSgnLi4vdXRpbHMvdXRpbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5vcm1hbGl6ZUFzc2V0O1xuXG5mdW5jdGlvbiBub3JtYWxpemVBc3NldChyZWYpIHtcbiAgcmVmLnR5cGUgPSBnZXRUeXBlKHJlZi5leHQpO1xuICByZWYudHlwZURlc3QgPSByZWYudHlwZTtcbiAgcmVmLmJhc2VEZXN0ID0gcmVmLmJhc2U7XG4gIGNvbnN0IGNvbXBpbGVkVHlwZSA9IGdldENvbXBpbGVkVHlwZShyZWYudHlwZSk7XG4gIGlmIChjb21waWxlZFR5cGUpIHtcbiAgICByZWYudHlwZURlc3QgPSBjb21waWxlZFR5cGU7XG4gICAgcmVmLmJhc2VEZXN0ID0gcmVmLm5hbWUgKyAnLicgKyByZWYudHlwZURlc3Q7XG4gIH1cbiAgcmVmLmlzTWluaWZpZWQgPSByZWYuaXNNaW5pZmllZCB8fCBwYXRoLmV4dG5hbWUocmVmLm5hbWUpID09PSAnLm1pbic7XG4gIGlmIChyZWYuaXNNaW5pZmllZCkge1xuICAgIHJlZi5uYW1lID0gcGF0aC5iYXNlbmFtZShyZWYubmFtZSwgJy5taW4nKTtcbiAgfVxuICByZWYuYmFzZVBhdGhTdHJpcHBlZCA9IHN0cmlwSWdub3JlZEJhc2VQYXRoKHJlZi5iYXNlRGlyLCBjb25maWcuYXNzZXRJZ25vcmVkQmFzZVBhdGhzKTtcblxuICAvLyBzZXQgZGVzdCBkaXJlY3RvcnlcbiAgcmVmLnNyY1N0cmlwcGVkID0gc3RyaXBJZ25vcmVkQmFzZVBhdGgocmVmLnNyYywgY29uZmlnLmFzc2V0SWdub3JlZEJhc2VQYXRocyk7XG4gIHJlZi5kaXJEZXN0ID0gcGF0aC5qb2luKGNvbmZpZy5kZXN0RGlyLCBwYXRoLmRpcm5hbWUocmVmLnNyY1N0cmlwcGVkKSk7XG5cbiAgaWYgKHByb2Nlc3MuZW52LnRhc2sgPT09ICdidWlsZCcgJiYgIXJlZi5pc01pbmlmaWVkKSB7XG4gICAgcmVmLmJhc2VEZXN0ID0gcmVmLm5hbWUgKyAnLm1pbi4nICsgcmVmLnR5cGVEZXN0O1xuICB9XG5cbiAgcmVmLmRlc3QgPSBwYXRoLmpvaW4ocmVmLmRpckRlc3QsIHJlZi5iYXNlRGVzdCk7XG4gIHJlZi5kZXN0UmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUocmVmLmRlc3QpO1xuXG4gIHJldHVybiByZWY7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/plugins/normalize-base.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var config = require('../config'); 5 | 6 | var _require = require('../utils/util'), 7 | stripIgnoredBasePath = _require.stripIgnoredBasePath; 8 | 9 | module.exports = normalizeBase; 10 | 11 | function normalizeBase(src) { 12 | var normalized = path.parse(src); 13 | normalized.src = src; 14 | normalized.srcResolved = path.resolve(src); 15 | normalized.dirResolved = path.dirname(normalized.srcResolved); 16 | normalized.srcStripped = stripIgnoredBasePath(src, config.assetIgnoredBasePaths); 17 | 18 | return normalized; 19 | } 20 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL25vcm1hbGl6ZS1iYXNlLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwiY29uZmlnIiwic3RyaXBJZ25vcmVkQmFzZVBhdGgiLCJtb2R1bGUiLCJleHBvcnRzIiwibm9ybWFsaXplQmFzZSIsInNyYyIsIm5vcm1hbGl6ZWQiLCJwYXJzZSIsInNyY1Jlc29sdmVkIiwicmVzb2x2ZSIsImRpclJlc29sdmVkIiwiZGlybmFtZSIsInNyY1N0cmlwcGVkIiwiYXNzZXRJZ25vcmVkQmFzZVBhdGhzIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxXQUFSLENBQWY7O2VBQytCQSxRQUFRLGVBQVIsQztJQUF4QkUsb0IsWUFBQUEsb0I7O0FBRVBDLE9BQU9DLE9BQVAsR0FBaUJDLGFBQWpCOztBQUVBLFNBQVNBLGFBQVQsQ0FBdUJDLEdBQXZCLEVBQTRCO0FBQzFCLE1BQU1DLGFBQWFSLEtBQUtTLEtBQUwsQ0FBV0YsR0FBWCxDQUFuQjtBQUNBQyxhQUFXRCxHQUFYLEdBQWlCQSxHQUFqQjtBQUNBQyxhQUFXRSxXQUFYLEdBQXlCVixLQUFLVyxPQUFMLENBQWFKLEdBQWIsQ0FBekI7QUFDQUMsYUFBV0ksV0FBWCxHQUF5QlosS0FBS2EsT0FBTCxDQUFhTCxXQUFXRSxXQUF4QixDQUF6QjtBQUNBRixhQUFXTSxXQUFYLEdBQXlCWCxxQkFBcUJJLEdBQXJCLEVBQTBCTCxPQUFPYSxxQkFBakMsQ0FBekI7O0FBRUEsU0FBT1AsVUFBUDtBQUNEIiwiZmlsZSI6Im5vcm1hbGl6ZS1iYXNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3Qge3N0cmlwSWdub3JlZEJhc2VQYXRofSA9IHJlcXVpcmUoJy4uL3V0aWxzL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemVCYXNlO1xuXG5mdW5jdGlvbiBub3JtYWxpemVCYXNlKHNyYykge1xuICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5wYXJzZShzcmMpO1xuICBub3JtYWxpemVkLnNyYyA9IHNyYztcbiAgbm9ybWFsaXplZC5zcmNSZXNvbHZlZCA9IHBhdGgucmVzb2x2ZShzcmMpO1xuICBub3JtYWxpemVkLmRpclJlc29sdmVkID0gcGF0aC5kaXJuYW1lKG5vcm1hbGl6ZWQuc3JjUmVzb2x2ZWQpO1xuICBub3JtYWxpemVkLnNyY1N0cmlwcGVkID0gc3RyaXBJZ25vcmVkQmFzZVBhdGgoc3JjLCBjb25maWcuYXNzZXRJZ25vcmVkQmFzZVBhdGhzKTtcblxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/plugins/normalize-dep.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | var config = require('../config'); 6 | 7 | var _require = require('../utils/util'), 8 | getCompiledType = _require.getCompiledType, 9 | getType = _require.getType, 10 | stripIgnoredBasePath = _require.stripIgnoredBasePath; 11 | 12 | module.exports = normalizeDep; 13 | 14 | function normalizeDep(ref) { 15 | ref.srcStripped = stripIgnoredBasePath(ref.src, config.assetIgnoredBasePaths); 16 | ref.dirStripped = path.dirname(ref.srcStripped); 17 | ref.baseDest = ref.base; 18 | ref.extDest = ref.ext; 19 | var type = getType(ref.ext); 20 | ref.typeDest = type; 21 | var compiledType = getCompiledType(type); 22 | if (compiledType) { 23 | ref.typeDest = compiledType; 24 | ref.extDest = '.' + ref.typeDest; 25 | ref.baseDest = ref.name + ref.extDest; 26 | } 27 | ref.isMinified = ref.isMinified || path.extname(ref.name) === '.min'; 28 | if (ref.isMinified) { 29 | ref.name = path.basename(ref.name, '.min'); 30 | } 31 | 32 | var consumerName = path.basename(ref.consumer, '.json'); 33 | var consumerDir = path.dirname(path.relative(path.join(process.cwd(), config.srcDir), ref.consumer)); 34 | var forWrapper = consumerName === 'wrapper'; 35 | 36 | ref.dest = path.join(config.destDir, ref.dirStripped, ref.baseDest); 37 | 38 | // Fix dest for assets that are above the src directory, such as node modules 39 | if (!ref.dest.startsWith(consumerDir, config.destDir.length + 1)) { 40 | ref.dest = path.join(config.destDir, consumerDir, ref.dirStripped, ref.baseDest); 41 | } 42 | 43 | ref.dirDest = path.dirname(ref.dest); 44 | 45 | ref.sourcemapPath = path.join(ref.dirStripped, ref.baseDest + '.map'); 46 | 47 | if (process.env.task === 'build') { 48 | ref.extDest = '.min.' + ref.typeDest; 49 | 50 | if (!ref.isMinified) { 51 | ref.baseDest = ref.name + ref.extDest; 52 | ref.dest = path.join(ref.dirDest, ref.base); 53 | } 54 | 55 | ref.dirDest = consumerDir; 56 | 57 | var pagePrefix = forWrapper ? '' : consumerName + '-'; 58 | var webPathPrefix = (forWrapper ? '/' : '') + ref.dirDest; 59 | 60 | ref.dirDest = path.join(config.destDir, ref.dirDest); 61 | ref.filenameDest = pagePrefix + ref.groupKey + ref.extDest; 62 | ref.dest = path.join(ref.dirDest, ref.filenameDest); 63 | ref.webPath = path.join(webPathPrefix, ref.filenameDest); 64 | ref.sourcemapPath = ref.webPath + '.map'; 65 | } 66 | 67 | return ref; 68 | } 69 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL25vcm1hbGl6ZS1kZXAuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJfIiwiY29uZmlnIiwiZ2V0Q29tcGlsZWRUeXBlIiwiZ2V0VHlwZSIsInN0cmlwSWdub3JlZEJhc2VQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsIm5vcm1hbGl6ZURlcCIsInJlZiIsInNyY1N0cmlwcGVkIiwic3JjIiwiYXNzZXRJZ25vcmVkQmFzZVBhdGhzIiwiZGlyU3RyaXBwZWQiLCJkaXJuYW1lIiwiYmFzZURlc3QiLCJiYXNlIiwiZXh0RGVzdCIsImV4dCIsInR5cGUiLCJ0eXBlRGVzdCIsImNvbXBpbGVkVHlwZSIsIm5hbWUiLCJpc01pbmlmaWVkIiwiZXh0bmFtZSIsImJhc2VuYW1lIiwiY29uc3VtZXJOYW1lIiwiY29uc3VtZXIiLCJjb25zdW1lckRpciIsInJlbGF0aXZlIiwiam9pbiIsInByb2Nlc3MiLCJjd2QiLCJzcmNEaXIiLCJmb3JXcmFwcGVyIiwiZGVzdCIsImRlc3REaXIiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwiZGlyRGVzdCIsInNvdXJjZW1hcFBhdGgiLCJlbnYiLCJ0YXNrIiwicGFnZVByZWZpeCIsIndlYlBhdGhQcmVmaXgiLCJmaWxlbmFtZURlc3QiLCJncm91cEtleSIsIndlYlBhdGgiXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsT0FBT0MsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsV0FBUixDQUFmOztlQUN5REEsUUFBUSxlQUFSLEM7SUFBbERHLGUsWUFBQUEsZTtJQUFpQkMsTyxZQUFBQSxPO0lBQVNDLG9CLFlBQUFBLG9COztBQUVqQ0MsT0FBT0MsT0FBUCxHQUFpQkMsWUFBakI7O0FBRUEsU0FBU0EsWUFBVCxDQUFzQkMsR0FBdEIsRUFBMkI7QUFDekJBLE1BQUlDLFdBQUosR0FBa0JMLHFCQUFxQkksSUFBSUUsR0FB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a0MsT0FBakIsRUFBMEIzQixJQUFJOEIsT0FBOUIsQ0FBZDtBQUNBOUIsUUFBSW9DLFlBQUosR0FBbUJGLGFBQWFsQyxJQUFJcUMsUUFBakIsR0FBNEJyQyxJQUFJUSxPQUFuRDtBQUNBUixRQUFJMEIsSUFBSixHQUFXcEMsS0FBSytCLElBQUwsQ0FBVXJCLElBQUk4QixPQUFkLEVBQXVCOUIsSUFBSW9DLFlBQTNCLENBQVg7QUFDQXBDLFFBQUlzQyxPQUFKLEdBQWNoRCxLQUFLK0IsSUFBTCxDQUFVYyxhQUFWLEVBQXlCbkMsSUFBSW9DLFlBQTdCLENBQWQ7QUFDQXBDLFFBQUkrQixhQUFKLEdBQW9CL0IsSUFBSXNDLE9BQUosR0FBYyxNQUFsQztBQUNEOztBQUVELFNBQU90QyxHQUFQO0FBQ0QiLCJmaWxlIjoibm9ybWFsaXplLWRlcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5jb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcbmNvbnN0IHtnZXRDb21waWxlZFR5cGUsIGdldFR5cGUsIHN0cmlwSWdub3JlZEJhc2VQYXRofSA9IHJlcXVpcmUoJy4uL3V0aWxzL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBub3JtYWxpemVEZXA7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURlcChyZWYpIHtcbiAgcmVmLnNyY1N0cmlwcGVkID0gc3RyaXBJZ25vcmVkQmFzZVBhdGgocmVmLnNyYywgY29uZmlnLmFzc2V0SWdub3JlZEJhc2VQYXRocyk7XG4gIHJlZi5kaXJTdHJpcHBlZCA9IHBhdGguZGlybmFtZShyZWYuc3JjU3RyaXBwZWQpO1xuICByZWYuYmFzZURlc3QgPSByZWYuYmFzZTtcbiAgcmVmLmV4dERlc3QgPSByZWYuZXh0O1xuICBjb25zdCB0eXBlID0gZ2V0VHlwZShyZWYuZXh0KTtcbiAgcmVmLnR5cGVEZXN0ID0gdHlwZTtcbiAgY29uc3QgY29tcGlsZWRUeXBlID0gZ2V0Q29tcGlsZWRUeXBlKHR5cGUpO1xuICBpZiAoY29tcGlsZWRUeXBlKSB7XG4gICAgcmVmLnR5cGVEZXN0ID0gY29tcGlsZWRUeXBlO1xuICAgIHJlZi5leHREZXN0ID0gJy4nICsgcmVmLnR5cGVEZXN0O1xuICAgIHJlZi5iYXNlRGVzdCA9IHJlZi5uYW1lICsgcmVmLmV4dERlc3Q7XG4gIH1cbiAgcmVmLmlzTWluaWZpZWQgPSByZWYuaXNNaW5pZmllZCB8fCBwYXRoLmV4dG5hbWUocmVmLm5hbWUpID09PSAnLm1pbic7XG4gIGlmIChyZWYuaXNNaW5pZmllZCkge1xuICAgIHJlZi5uYW1lID0gcGF0aC5iYXNlbmFtZShyZWYubmFtZSwgJy5taW4nKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnN1bWVyTmFtZSA9IHBhdGguYmFzZW5hbWUocmVmLmNvbnN1bWVyLCAnLmpzb24nKTtcbiAgY29uc3QgY29uc3VtZXJEaXIgPSBwYXRoLmRpcm5hbWUocGF0aC5yZWxhdGl2ZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNyY0RpciksIHJlZi5jb25zdW1lcikpO1xuICBjb25zdCBmb3JXcmFwcGVyID0gY29uc3VtZXJOYW1lID09PSAnd3JhcHBlcic7XG5cbiAgcmVmLmRlc3QgPSBwYXRoLmpvaW4oY29uZmlnLmRlc3REaXIsIHJlZi5kaXJTdHJpcHBlZCwgcmVmLmJhc2VEZXN0KTtcblxuICAvLyBGaXggZGVzdCBmb3IgYXNzZXRzIHRoYXQgYXJlIGFib3ZlIHRoZSBzcmMgZGlyZWN0b3J5LCBzdWNoIGFzIG5vZGUgbW9kdWxlc1xuICBpZiAoIXJlZi5kZXN0LnN0YXJ0c1dpdGgoY29uc3VtZXJEaXIsIGNvbmZpZy5kZXN0RGlyLmxlbmd0aCArIDEpKSB7XG4gICAgcmVmLmRlc3QgPSBwYXRoLmpvaW4oY29uZmlnLmRlc3REaXIsIGNvbnN1bWVyRGlyLCByZWYuZGlyU3RyaXBwZWQsIHJlZi5iYXNlRGVzdCk7XG4gIH1cblxuICByZWYuZGlyRGVzdCA9IHBhdGguZGlybmFtZShyZWYuZGVzdCk7XG5cbiAgcmVmLnNvdXJjZW1hcFBhdGggPSBwYXRoLmpvaW4ocmVmLmRpclN0cmlwcGVkLCByZWYuYmFzZURlc3QgKyAnLm1hcCcpO1xuXG4gIGlmIChwcm9jZXNzLmVudi50YXNrID09PSAnYnVpbGQnKSB7XG4gICAgcmVmLmV4dERlc3QgPSAnLm1pbi4nICsgcmVmLnR5cGVEZXN0O1xuXG4gICAgaWYgKCFyZWYuaXNNaW5pZmllZCkge1xuICAgICAgcmVmLmJhc2VEZXN0ID0gcmVmLm5hbWUgKyByZWYuZXh0RGVzdDtcbiAgICAgIHJlZi5kZXN0ID0gcGF0aC5qb2luKHJlZi5kaXJEZXN0LCByZWYuYmFzZSk7XG4gICAgfVxuXG4gICAgcmVmLmRpckRlc3QgPSBjb25zdW1lckRpcjtcblxuICAgIGNvbnN0IHBhZ2VQcmVmaXggPSBmb3JXcmFwcGVyID8gJycgOiBjb25zdW1lck5hbWUgKyAnLSc7XG4gICAgY29uc3Qgd2ViUGF0aFByZWZpeCA9IChmb3JXcmFwcGVyID8gJy8nIDogJycpICsgcmVmLmRpckRlc3Q7XG5cbiAgICByZWYuZGlyRGVzdCA9IHBhdGguam9pbihjb25maWcuZGVzdERpciwgcmVmLmRpckRlc3QpO1xuICAgIHJlZi5maWxlbmFtZURlc3QgPSBwYWdlUHJlZml4ICsgcmVmLmdyb3VwS2V5ICsgcmVmLmV4dERlc3Q7XG4gICAgcmVmLmRlc3QgPSBwYXRoLmpvaW4ocmVmLmRpckRlc3QsIHJlZi5maWxlbmFtZURlc3QpO1xuICAgIHJlZi53ZWJQYXRoID0gcGF0aC5qb2luKHdlYlBhdGhQcmVmaXgsIHJlZi5maWxlbmFtZURlc3QpO1xuICAgIHJlZi5zb3VyY2VtYXBQYXRoID0gcmVmLndlYlBhdGggKyAnLm1hcCc7XG4gIH1cblxuICByZXR1cm4gcmVmO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/output-sourcemaps.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var bluebird = require('bluebird'); 5 | var fs = bluebird.promisifyAll(require('fs-extra')); 6 | var _ = require('lodash'); 7 | var config = require('../config'); 8 | 9 | module.exports = function outputSourcemaps(file) { 10 | // Get paths 11 | var mapPath = path.join(config.destDir, 'sourcemaps', file.sourcemapPath); 12 | 13 | // Append sourceMappingURL to file 14 | var mapUrl = '/' + path.relative(file.dirDest, mapPath); 15 | var mapUrlStringBase = '# sourceMappingURL=' + mapUrl; 16 | var mapUrlString = file.typeDest === 'css' ? '/*' + mapUrlStringBase + ' */' : '//' + mapUrlStringBase; 17 | file.content += _.endsWith(file.content, '\n') ? mapUrlString : '\n' + mapUrlString; 18 | 19 | // Rebuild sourcemap for consistency, remap sources, then output 20 | var parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 21 | var rebuiltMap = JSON.stringify(_.pick(parsedMap, 'version', 'mappings', 'names', 'sources')); 22 | var outputMap = fs.outputFileAsync(mapPath, rebuiltMap); 23 | 24 | return outputMap.then(function () { 25 | return file; 26 | }); 27 | }; 28 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL291dHB1dC1zb3VyY2VtYXBzLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwiYmx1ZWJpcmQiLCJmcyIsInByb21pc2lmeUFsbCIsIl8iLCJjb25maWciLCJtb2R1bGUiLCJleHBvcnRzIiwib3V0cHV0U291cmNlbWFwcyIsImZpbGUiLCJtYXBQYXRoIiwiam9pbiIsImRlc3REaXIiLCJzb3VyY2VtYXBQYXRoIiwibWFwVXJsIiwicmVsYXRpdmUiLCJkaXJEZXN0IiwibWFwVXJsU3RyaW5nQmFzZSIsIm1hcFVybFN0cmluZyIsInR5cGVEZXN0IiwiY29udGVudCIsImVuZHNXaXRoIiwicGFyc2VkTWFwIiwiaXNTdHJpbmciLCJtYXAiLCJKU09OIiwicGFyc2UiLCJyZWJ1aWx0TWFwIiwic3RyaW5naWZ5IiwicGljayIsIm91dHB1dE1hcCIsIm91dHB1dEZpbGVBc3luYyIsInRoZW4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsT0FBT0MsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxLQUFLRCxTQUFTRSxZQUFULENBQXNCSCxRQUFRLFVBQVIsQ0FBdEIsQ0FBWDtBQUNBLElBQU1JLElBQUlKLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUssU0FBU0wsUUFBUSxXQUFSLENBQWY7O0FBRUFNLE9BQU9DLE9BQVAsR0FBaUIsU0FBU0MsZ0JBQVQsQ0FBMEJDLElBQTFCLEVBQWdDO0FBQy9DO0FBQ0EsTUFBTUMsVUFBVVgsS0FBS1ksSUFBTCxDQUFVTixPQUFPTyxPQUFqQixFQUEwQixZQUExQixFQUF3Q0gsS0FBS0ksYUFBN0MsQ0FBaEI7O0FBRUE7QUFDQSxNQUFNQyxTQUFTLE1BQU1mLEtBQUtnQixRQUFMLENBQWNOLEtBQUtPLE9BQW5CLEVBQTRCTixPQUE1QixDQUFyQjtBQUNBLE1BQU1PLG1CQUFtQix3QkFBd0JILE1BQWpEO0FBQ0EsTUFBTUksZUFBZVQsS0FBS1UsUUFBTCxLQUFrQixLQUFsQixVQUErQkYsZ0JBQS9CLGtCQUE0REEsZ0JBQWpGO0FBQ0FSLE9BQUtXLE9BQUwsSUFBZ0JoQixFQUFFaUIsUUFBRixDQUFXWixLQUFLVyxPQUFoQixFQUF5QixJQUF6QixJQUFpQ0YsWUFBakMsR0FBZ0QsT0FBT0EsWUFBdkU7O0FBRUE7QUFDQSxNQUFNSSxZQUFZbEIsRUFBRW1CLFFBQUYsQ0FBV2QsS0FBS2UsR0FBaEIsSUFBdUJDLEtBQUtDLEtBQUwsQ0FBV2pCLEtBQUtlLEdBQWhCLENBQXZCLEdBQThDZixLQUFLZSxHQUFyRTtBQUNBLE1BQU1HLGFBQWFGLEtBQUtHLFNBQUwsQ0FBZXhCLEVBQUV5QixJQUFGLENBQU9QLFNBQVAsRUFBa0IsU0FBbEIsRUFBNkIsVUFBN0IsRUFBeUMsT0FBekMsRUFBa0QsU0FBbEQsQ0FBZixDQUFuQjtBQUNBLE1BQU1RLFlBQVk1QixHQUFHNkIsZUFBSCxDQUFtQnJCLE9BQW5CLEVBQTRCaUIsVUFBNUIsQ0FBbEI7O0FBRUEsU0FBT0csVUFBVUUsSUFBVixDQUFlO0FBQUEsV0FBTXZCLElBQU47QUFBQSxHQUFmLENBQVA7QUFDRCxDQWhCRCIsImZpbGUiOiJvdXRwdXQtc291cmNlbWFwcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBibHVlYmlyZCA9IHJlcXVpcmUoJ2JsdWViaXJkJyk7XG5jb25zdCBmcyA9IGJsdWViaXJkLnByb21pc2lmeUFsbChyZXF1aXJlKCdmcy1leHRyYScpKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG91dHB1dFNvdXJjZW1hcHMoZmlsZSkge1xuICAvLyBHZXQgcGF0aHNcbiAgY29uc3QgbWFwUGF0aCA9IHBhdGguam9pbihjb25maWcuZGVzdERpciwgJ3NvdXJjZW1hcHMnLCBmaWxlLnNvdXJjZW1hcFBhdGgpO1xuXG4gIC8vIEFwcGVuZCBzb3VyY2VNYXBwaW5nVVJMIHRvIGZpbGVcbiAgY29uc3QgbWFwVXJsID0gJy8nICsgcGF0aC5yZWxhdGl2ZShmaWxlLmRpckRlc3QsIG1hcFBhdGgpO1xuICBjb25zdCBtYXBVcmxTdHJpbmdCYXNlID0gJyMgc291cmNlTWFwcGluZ1VSTD0nICsgbWFwVXJsO1xuICBjb25zdCBtYXBVcmxTdHJpbmcgPSBmaWxlLnR5cGVEZXN0ID09PSAnY3NzJyA/IGAvKiR7bWFwVXJsU3RyaW5nQmFzZX0gKi9gIDogYC8vJHttYXBVcmxTdHJpbmdCYXNlfWA7XG4gIGZpbGUuY29udGVudCArPSBfLmVuZHNXaXRoKGZpbGUuY29udGVudCwgJ1xcbicpID8gbWFwVXJsU3RyaW5nIDogJ1xcbicgKyBtYXBVcmxTdHJpbmc7XG5cbiAgLy8gUmVidWlsZCBzb3VyY2VtYXAgZm9yIGNvbnNpc3RlbmN5LCByZW1hcCBzb3VyY2VzLCB0aGVuIG91dHB1dFxuICBjb25zdCBwYXJzZWRNYXAgPSBfLmlzU3RyaW5nKGZpbGUubWFwKSA/IEpTT04ucGFyc2UoZmlsZS5tYXApIDogZmlsZS5tYXA7XG4gIGNvbnN0IHJlYnVpbHRNYXAgPSBKU09OLnN0cmluZ2lmeShfLnBpY2socGFyc2VkTWFwLCAndmVyc2lvbicsICdtYXBwaW5ncycsICduYW1lcycsICdzb3VyY2VzJykpO1xuICBjb25zdCBvdXRwdXRNYXAgPSBmcy5vdXRwdXRGaWxlQXN5bmMobWFwUGF0aCwgcmVidWlsdE1hcCk7XG5cbiAgcmV0dXJuIG91dHB1dE1hcC50aGVuKCgpID0+IGZpbGUpO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/output.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var bluebird = require('bluebird'); 4 | var fs = bluebird.promisifyAll(require('fs-extra')); 5 | 6 | module.exports = function output(file) { 7 | return fs.outputFileAsync(file.dest, file.content).then(function () { 8 | return file; 9 | }); 10 | }; 11 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL291dHB1dC5qcyJdLCJuYW1lcyI6WyJibHVlYmlyZCIsInJlcXVpcmUiLCJmcyIsInByb21pc2lmeUFsbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJvdXRwdXQiLCJmaWxlIiwib3V0cHV0RmlsZUFzeW5jIiwiZGVzdCIsImNvbnRlbnQiLCJ0aGVuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLEtBQUtGLFNBQVNHLFlBQVQsQ0FBc0JGLFFBQVEsVUFBUixDQUF0QixDQUFYOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCLFNBQVNDLE1BQVQsQ0FBZ0JDLElBQWhCLEVBQXNCO0FBQ3JDLFNBQU9MLEdBQUdNLGVBQUgsQ0FBbUJELEtBQUtFLElBQXhCLEVBQThCRixLQUFLRyxPQUFuQyxFQUE0Q0MsSUFBNUMsQ0FBaUQ7QUFBQSxXQUFNSixJQUFOO0FBQUEsR0FBakQsQ0FBUDtBQUNELENBRkQiLCJmaWxlIjoib3V0cHV0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgYmx1ZWJpcmQgPSByZXF1aXJlKCdibHVlYmlyZCcpO1xuY29uc3QgZnMgPSBibHVlYmlyZC5wcm9taXNpZnlBbGwocmVxdWlyZSgnZnMtZXh0cmEnKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3V0cHV0KGZpbGUpIHtcbiAgcmV0dXJuIGZzLm91dHB1dEZpbGVBc3luYyhmaWxlLmRlc3QsIGZpbGUuY29udGVudCkudGhlbigoKSA9PiBmaWxlKTtcbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/plugins/read.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | var bluebird = require('bluebird'); 6 | var fs = bluebird.promisifyAll(require('fs-extra')); 7 | 8 | module.exports = function read(file) { 9 | return fs.readFileAsync(file.src).then(function (result) { 10 | return _.assign(file, { content: result.toString() }); 11 | }); 12 | }; 13 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3JlYWQuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJfIiwiYmx1ZWJpcmQiLCJmcyIsInByb21pc2lmeUFsbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZWFkIiwiZmlsZSIsInJlYWRGaWxlQXN5bmMiLCJzcmMiLCJ0aGVuIiwiYXNzaWduIiwiY29udGVudCIsInJlc3VsdCIsInRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxLQUFLRCxTQUFTRSxZQUFULENBQXNCSixRQUFRLFVBQVIsQ0FBdEIsQ0FBWDs7QUFFQUssT0FBT0MsT0FBUCxHQUFpQixTQUFTQyxJQUFULENBQWNDLElBQWQsRUFBb0I7QUFDbkMsU0FBT0wsR0FBR00sYUFBSCxDQUFpQkQsS0FBS0UsR0FBdEIsRUFBMkJDLElBQTNCLENBQWdDLGtCQUFVO0FBQy9DLFdBQU9WLEVBQUVXLE1BQUYsQ0FBU0osSUFBVCxFQUFlLEVBQUNLLFNBQVNDLE9BQU9DLFFBQVAsRUFBVixFQUFmLENBQVA7QUFDRCxHQUZNLENBQVA7QUFHRCxDQUpEIiwiZmlsZSI6InJlYWQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgYmx1ZWJpcmQgPSByZXF1aXJlKCdibHVlYmlyZCcpO1xuY29uc3QgZnMgPSBibHVlYmlyZC5wcm9taXNpZnlBbGwocmVxdWlyZSgnZnMtZXh0cmEnKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVhZChmaWxlKSB7XG4gIHJldHVybiBmcy5yZWFkRmlsZUFzeW5jKGZpbGUuc3JjKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgcmV0dXJuIF8uYXNzaWduKGZpbGUsIHtjb250ZW50OiByZXN1bHQudG9TdHJpbmcoKX0pO1xuICB9KTtcbn07XG4iXX0= -------------------------------------------------------------------------------- /dist/plugins/remap-sources.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | var config = require('../config'); 6 | var util = require('../utils/util'); 7 | 8 | module.exports = remapSources; 9 | 10 | function remapSources(file) { 11 | var parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 12 | parsedMap.sources = _.map(parsedMap.sources, function (source) { 13 | var strippedPath = util.stripIgnoredBasePath(source, config.assetIgnoredBasePaths); 14 | return path.join('/sourcemaps/', strippedPath); 15 | }); 16 | var map = JSON.stringify(_.pick(parsedMap, 'version', 'mappings', 'names', 'sources')); 17 | return _.assign(file, { map: map }); 18 | } 19 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3JlbWFwLXNvdXJjZXMuanMiXSwibmFtZXMiOlsicGF0aCIsInJlcXVpcmUiLCJfIiwiY29uZmlnIiwidXRpbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZW1hcFNvdXJjZXMiLCJmaWxlIiwicGFyc2VkTWFwIiwiaXNTdHJpbmciLCJtYXAiLCJKU09OIiwicGFyc2UiLCJzb3VyY2VzIiwic3RyaXBwZWRQYXRoIiwic3RyaXBJZ25vcmVkQmFzZVBhdGgiLCJzb3VyY2UiLCJhc3NldElnbm9yZWRCYXNlUGF0aHMiLCJqb2luIiwic3RyaW5naWZ5IiwicGljayIsImFzc2lnbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxPQUFPQyxRQUFRLE1BQVIsQ0FBYjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxXQUFSLENBQWY7QUFDQSxJQUFNRyxPQUFPSCxRQUFRLGVBQVIsQ0FBYjs7QUFFQUksT0FBT0MsT0FBUCxHQUFpQkMsWUFBakI7O0FBRUEsU0FBU0EsWUFBVCxDQUFzQkMsSUFBdEIsRUFBNEI7QUFDMUIsTUFBTUMsWUFBWVAsRUFBRVEsUUFBRixDQUFXRixLQUFLRyxHQUFoQixJQUF1QkMsS0FBS0MsS0FBTCxDQUFXTCxLQUFLRyxHQUFoQixDQUF2QixHQUE4Q0gsS0FBS0csR0FBckU7QUFDQUYsWUFBVUssT0FBVixHQUFvQlosRUFBRVMsR0FBRixDQUFNRixVQUFVSyxPQUFoQixFQUF5QixrQkFBVTtBQUNyRCxRQUFNQyxlQUFlWCxLQUFLWSxvQkFBTCxDQUEwQkMsTUFBMUIsRUFBa0NkLE9BQU9lLHFCQUF6QyxDQUFyQjtBQUNBLFdBQU9sQixLQUFLbUIsSUFBTCxDQUFVLGNBQVYsRUFBMEJKLFlBQTFCLENBQVA7QUFDRCxHQUhtQixDQUFwQjtBQUlBLE1BQU1KLE1BQU1DLEtBQUtRLFNBQUwsQ0FBZWxCLEVBQUVtQixJQUFGLENBQU9aLFNBQVAsRUFBa0IsU0FBbEIsRUFBNkIsVUFBN0IsRUFBeUMsT0FBekMsRUFBa0QsU0FBbEQsQ0FBZixDQUFaO0FBQ0EsU0FBT1AsRUFBRW9CLE1BQUYsQ0FBU2QsSUFBVCxFQUFlLEVBQUNHLFFBQUQsRUFBZixDQUFQO0FBQ0QiLCJmaWxlIjoicmVtYXAtc291cmNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5jb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi91dGlscy91dGlsJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVtYXBTb3VyY2VzO1xuXG5mdW5jdGlvbiByZW1hcFNvdXJjZXMoZmlsZSkge1xuICBjb25zdCBwYXJzZWRNYXAgPSBfLmlzU3RyaW5nKGZpbGUubWFwKSA/IEpTT04ucGFyc2UoZmlsZS5tYXApIDogZmlsZS5tYXA7XG4gIHBhcnNlZE1hcC5zb3VyY2VzID0gXy5tYXAocGFyc2VkTWFwLnNvdXJjZXMsIHNvdXJjZSA9PiB7XG4gICAgY29uc3Qgc3RyaXBwZWRQYXRoID0gdXRpbC5zdHJpcElnbm9yZWRCYXNlUGF0aChzb3VyY2UsIGNvbmZpZy5hc3NldElnbm9yZWRCYXNlUGF0aHMpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oJy9zb3VyY2VtYXBzLycsIHN0cmlwcGVkUGF0aCk7XG4gIH0pO1xuICBjb25zdCBtYXAgPSBKU09OLnN0cmluZ2lmeShfLnBpY2socGFyc2VkTWFwLCAndmVyc2lvbicsICdtYXBwaW5ncycsICduYW1lcycsICdzb3VyY2VzJykpO1xuICByZXR1cm4gXy5hc3NpZ24oZmlsZSwge21hcH0pO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/plugins/static.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var fs = require('fs-extra'); 5 | var path = require('path'); 6 | var config = require('../config'); 7 | var mustache = require('mustache'); 8 | var decache = require('decache'); 9 | 10 | var _require = require('../utils/util'), 11 | changeExt = _require.changeExt; 12 | 13 | var cache = require('../utils/cache'); 14 | 15 | module.exports = staticGen; 16 | 17 | var partials = void 0, 18 | lambdas = void 0; 19 | 20 | function staticGen(file, opts) { 21 | opts = _.isObject(opts) ? opts : {}; 22 | mustache.tags = config.templateTags; 23 | partials = !partials || opts.shouldGetPartials ? getPartials() : partials; 24 | lambdas = !lambdas || opts.shouldGetLambdas ? getLambdas(opts.shouldGetLambdas) : lambdas; 25 | 26 | var src = file.src, 27 | dataPath = file.data, 28 | wrapperDataPath = file.wrapperData; 29 | 30 | var wrapper = _.has(file, 'wrapper') ? fs.readFileSync(file.wrapper, 'utf8') : ''; 31 | var page = fs.readFileSync(src, 'utf8'); 32 | 33 | var dataRef = cache.get('files', dataPath); 34 | var data = _.get(dataRef, 'content'); 35 | var wrapperDataRef = cache.get('files', wrapperDataPath); 36 | var wrapperData = _.get(wrapperDataRef, 'content'); 37 | var templateData = _.assign({}, wrapperData, data, { lambdas: lambdas }); 38 | 39 | if (_.has(wrapperData, 'assets') && _.has(data, 'assets')) { 40 | templateData.assets = _.mergeWith({}, wrapperData.assets, data.assets, function (dest, src) { 41 | return [dest, src].every(_.isArray) ? _.union(dest, src) : undefined; 42 | }); 43 | } 44 | 45 | var pagePartials = wrapper ? _.assign({}, partials, { page: page }) : partials; 46 | var result = mustache.render(wrapper || page, templateData, pagePartials); 47 | 48 | fs.outputFileSync(file.dest, result); 49 | 50 | if (data) { 51 | cache.push('deps', { 52 | src: dataRef.src, 53 | srcResolved: dataRef.srcResolved, 54 | consumer: file.srcResolved 55 | }); 56 | } 57 | 58 | if (wrapperData) { 59 | cache.push('deps', { 60 | src: wrapperDataRef.src, 61 | srcResolved: wrapperDataRef.srcResolved, 62 | consumer: file.srcResolved 63 | }); 64 | } 65 | 66 | if (wrapper) { 67 | var wrapperRef = cache.get('files', file.wrapper); 68 | cache.push('deps', { 69 | src: wrapperRef.src, 70 | srcResolved: wrapperRef.srcResolved, 71 | consumer: file.srcResolved 72 | }); 73 | } 74 | } 75 | 76 | function getPartials() { 77 | var partialFileNames = _.attemptSilent(fs.readdirSync, config.partialsDir); 78 | return _.reduce(partialFileNames, function (obj, partialFileName) { 79 | var name = path.basename(partialFileName, '.mustache'); 80 | var partialPath = path.join(config.partialsDir, partialFileName); 81 | obj[name] = fs.readFileSync(partialPath).toString(); 82 | return obj; 83 | }, {}); 84 | } 85 | 86 | function getLambdas(reload) { 87 | var lambdaFileNames = _.attemptSilent(fs.readdirSync, config.lambdasDir); 88 | return _.reduce(lambdaFileNames, function (obj, lambdaFileName) { 89 | var name = path.basename(lambdaFileName, '.js'); 90 | var modulePath = path.join(process.cwd(), config.lambdasDir, name); 91 | var mod = require(modulePath).module; 92 | 93 | if (reload) { 94 | decache(modulePath); 95 | } 96 | 97 | obj[name] = function () { 98 | return mod.require(modulePath).lambda; 99 | }; 100 | return obj; 101 | }, {}); 102 | } 103 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3N0YXRpYy5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsImZzIiwicGF0aCIsImNvbmZpZyIsIm11c3RhY2hlIiwiZGVjYWNoZSIsImNoYW5nZUV4dCIsImNhY2hlIiwibW9kdWxlIiwiZXhwb3J0cyIsInN0YXRpY0dlbiIsInBhcnRpYWxzIiwibGFtYmRhcyIsImZpbGUiLCJvcHRzIiwiaXNPYmplY3QiLCJ0YWdzIiwidGVtcGxhdGVUYWdzIiwic2hvdWxkR2V0UGFydGlhbHMiLCJnZXRQYXJ0aWFscyIsInNob3VsZEdldExhbWJkYXMiLCJnZXRMYW1iZGFzIiwic3JjIiwiZGF0YVBhdGgiLCJkYXRhIiwid3JhcHBlckRhdGFQYXRoIiwid3JhcHBlckRhdGEiLCJ3cmFwcGVyIiwiaGFzIiwicmVhZEZpbGVTeW5jIiwicGFnZSIsImRhdGFSZWYiLCJnZXQiLCJ3cmFwcGVyRGF0YVJlZiIsInRlbXBsYXRlRGF0YSIsImFzc2lnbiIsImFzc2V0cyIsIm1lcmdlV2l0aCIsImRlc3QiLCJldmVyeSIsImlzQXJyYXkiLCJ1bmlvbiIsInVuZGVmaW5lZCIsInBhZ2VQYXJ0aWFscyIsInJlc3VsdCIsInJlbmRlciIsIm91dHB1dEZpbGVTeW5jIiwicHVzaCIsInNyY1Jlc29sdmVkIiwiY29uc3VtZXIiLCJ3cmFwcGVyUmVmIiwicGFydGlhbEZpbGVOYW1lcyIsImF0dGVtcHRTaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhcnRpYWxzRGlyIiwicmVkdWNlIiwib2JqIiwicGFydGlhbEZpbGVOYW1lIiwibmFtZSIsImJhc2VuYW1lIiwicGFydGlhbFBhdGgiLCJqb2luIiwidG9TdHJpbmciLCJyZWxvYWQiLCJsYW1iZGFGaWxlTmFtZXMiLCJsYW1iZGFzRGlyIiwibGFtYmRhRmlsZU5hbWUiLCJtb2R1bGVQYXRoIiwicHJvY2VzcyIsImN3ZCIsIm1vZCIsImxhbWJkYSJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFR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SUFBWXpELEdBQUc0QixZQUFILENBQWdCK0IsV0FBaEIsRUFBNkJFLFFBQTdCLEVBQVo7QUFDQSxXQUFPTixHQUFQO0FBQ0QsR0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1EOztBQUVELFNBQVNuQyxVQUFULENBQW9CMEMsTUFBcEIsRUFBNEI7QUFDMUIsTUFBTUMsa0JBQWtCakUsRUFBRXFELGFBQUYsQ0FBZ0JuRCxHQUFHb0QsV0FBbkIsRUFBZ0NsRCxPQUFPOEQsVUFBdkMsQ0FBeEI7QUFDQSxTQUFPbEUsRUFBRXdELE1BQUYsQ0FBU1MsZUFBVCxFQUEwQixVQUFDUixHQUFELEVBQU1VLGNBQU4sRUFBeUI7QUFDeEQsUUFBTVIsT0FBT3hELEtBQUt5RCxRQUFMLENBQWNPLGNBQWQsRUFBOEIsS0FBOUIsQ0FBYjtBQUNBLFFBQU1DLGFBQWFqRSxLQUFLMkQsSUFBTCxDQUFVTyxRQUFRQyxHQUFSLEVBQVYsRUFBeUJsRSxPQUFPOEQsVUFBaEMsRUFBNENQLElBQTVDLENBQW5CO0FBQ0EsUUFBTVksTUFBTXRFLFFBQVFtRSxVQUFSLEVBQW9CM0QsTUFBaEM7O0FBRUEsUUFBSXVELE1BQUosRUFBWTtBQUNWMUQsY0FBUThELFVBQVI7QUFDRDs7QUFFRFgsUUFBSUUsSUFBSixJQUFZO0FBQUEsYUFBTVksSUFBSXRFLE9BQUosQ0FBWW1FLFVBQVosRUFBd0JJLE1BQTlCO0FBQUEsS0FBWjtBQUNBLFdBQU9mLEdBQVA7QUFDRCxHQVhNLEVBV0osRUFYSSxDQUFQO0FBWUQiLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcy1leHRyYScpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3QgbXVzdGFjaGUgPSByZXF1aXJlKCdtdXN0YWNoZScpO1xuY29uc3QgZGVjYWNoZSA9IHJlcXVpcmUoJ2RlY2FjaGUnKTtcbmNvbnN0IHtjaGFuZ2VFeHR9ID0gcmVxdWlyZSgnLi4vdXRpbHMvdXRpbCcpO1xuY29uc3QgY2FjaGUgPSByZXF1aXJlKCcuLi91dGlscy9jYWNoZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YXRpY0dlbjtcblxubGV0IHBhcnRpYWxzLCBsYW1iZGFzO1xuXG5mdW5jdGlvbiBzdGF0aWNHZW4oZmlsZSwgb3B0cykge1xuICBvcHRzID0gXy5pc09iamVjdChvcHRzKSA/IG9wdHMgOiB7fTtcbiAgbXVzdGFjaGUudGFncyA9IGNvbmZpZy50ZW1wbGF0ZVRhZ3M7XG4gIHBhcnRpYWxzID0gKCFwYXJ0aWFscyB8fCBvcHRzLnNob3VsZEdldFBhcnRpYWxzKSA/IGdldFBhcnRpYWxzKCkgOiBwYXJ0aWFscztcbiAgbGFtYmRhcyA9ICghbGFtYmRhcyB8fCBvcHRzLnNob3VsZEdldExhbWJkYXMpID8gZ2V0TGFtYmRhcyhvcHRzLnNob3VsZEdldExhbWJkYXMpIDogbGFtYmRhcztcblxuICBjb25zdCB7c3JjLCBkYXRhOiBkYXRhUGF0aCwgd3JhcHBlckRhdGE6IHdyYXBwZXJEYXRhUGF0aH0gPSBmaWxlO1xuICBjb25zdCB3cmFwcGVyID0gXy5oYXMoZmlsZSwgJ3dyYXBwZXInKSA/IGZzLnJlYWRGaWxlU3luYyhmaWxlLndyYXBwZXIsICd1dGY4JykgOiAnJztcbiAgY29uc3QgcGFnZSA9IGZzLnJlYWRGaWxlU3luYyhzcmMsICd1dGY4Jyk7XG5cbiAgY29uc3QgZGF0YVJlZiA9IGNhY2hlLmdldCgnZmlsZXMnLCBkYXRhUGF0aCk7XG4gIGNvbnN0IGRhdGEgPSBfLmdldChkYXRhUmVmLCAnY29udGVudCcpO1xuICBjb25zdCB3cmFwcGVyRGF0YVJlZiA9IGNhY2hlLmdldCgnZmlsZXMnLCB3cmFwcGVyRGF0YVBhdGgpO1xuICBjb25zdCB3cmFwcGVyRGF0YSA9IF8uZ2V0KHdyYXBwZXJEYXRhUmVmLCAnY29udGVudCcpO1xuICBjb25zdCB0ZW1wbGF0ZURhdGEgPSBfLmFzc2lnbih7fSwgd3JhcHBlckRhdGEsIGRhdGEsIHtsYW1iZGFzfSk7XG5cbiAgaWYgKF8uaGFzKHdyYXBwZXJEYXRhLCAnYXNzZXRzJykgJiYgXy5oYXMoZGF0YSwgJ2Fzc2V0cycpKSB7XG4gICAgdGVtcGxhdGVEYXRhLmFzc2V0cyA9IF8ubWVyZ2VXaXRoKHt9LCB3cmFwcGVyRGF0YS5hc3NldHMsIGRhdGEuYXNzZXRzLCAoZGVzdCwgc3JjKSA9PiB7XG4gICAgICByZXR1cm4gW2Rlc3QsIHNyY10uZXZlcnkoXy5pc0FycmF5KSA/IF8udW5pb24oZGVzdCwgc3JjKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VQYXJ0aWFscyA9IHdyYXBwZXIgPyBfLmFzc2lnbih7fSwgcGFydGlhbHMsIHtwYWdlfSkgOiBwYXJ0aWFscztcbiAgY29uc3QgcmVzdWx0ID0gbXVzdGFjaGUucmVuZGVyKHdyYXBwZXIgfHwgcGFnZSwgdGVtcGxhdGVEYXRhLCBwYWdlUGFydGlhbHMpO1xuXG4gIGZzLm91dHB1dEZpbGVTeW5jKGZpbGUuZGVzdCwgcmVzdWx0KTtcblxuICBpZiAoZGF0YSkge1xuICAgIGNhY2hlLnB1c2goJ2RlcHMnLCB7XG4gICAgICBzcmM6IGRhdGFSZWYuc3JjLFxuICAgICAgc3JjUmVzb2x2ZWQ6IGRhdGFSZWYuc3JjUmVzb2x2ZWQsXG4gICAgICBjb25zdW1lcjogZmlsZS5zcmNSZXNvbHZlZFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHdyYXBwZXJEYXRhKSB7XG4gICAgY2FjaGUucHVzaCgnZGVwcycsIHtcbiAgICAgIHNyYzogd3JhcHBlckRhdGFSZWYuc3JjLFxuICAgICAgc3JjUmVzb2x2ZWQ6IHdyYXBwZXJEYXRhUmVmLnNyY1Jlc29sdmVkLFxuICAgICAgY29uc3VtZXI6IGZpbGUuc3JjUmVzb2x2ZWRcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh3cmFwcGVyKSB7XG4gICAgY29uc3Qgd3JhcHBlclJlZiA9IGNhY2hlLmdldCgnZmlsZXMnLCBmaWxlLndyYXBwZXIpO1xuICAgIGNhY2hlLnB1c2goJ2RlcHMnLCB7XG4gICAgICBzcmM6IHdyYXBwZXJSZWYuc3JjLFxuICAgICAgc3JjUmVzb2x2ZWQ6IHdyYXBwZXJSZWYuc3JjUmVzb2x2ZWQsXG4gICAgICBjb25zdW1lcjogZmlsZS5zcmNSZXNvbHZlZFxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFBhcnRpYWxzKCkge1xuICBjb25zdCBwYXJ0aWFsRmlsZU5hbWVzID0gXy5hdHRlbXB0U2lsZW50KGZzLnJlYWRkaXJTeW5jLCBjb25maWcucGFydGlhbHNEaXIpO1xuICByZXR1cm4gXy5yZWR1Y2UocGFydGlhbEZpbGVOYW1lcywgKG9iaiwgcGFydGlhbEZpbGVOYW1lKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUocGFydGlhbEZpbGVOYW1lLCAnLm11c3RhY2hlJyk7XG4gICAgY29uc3QgcGFydGlhbFBhdGggPSBwYXRoLmpvaW4oY29uZmlnLnBhcnRpYWxzRGlyLCBwYXJ0aWFsRmlsZU5hbWUpO1xuICAgIG9ialtuYW1lXSA9IGZzLnJlYWRGaWxlU3luYyhwYXJ0aWFsUGF0aCkudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldExhbWJkYXMocmVsb2FkKSB7XG4gIGNvbnN0IGxhbWJkYUZpbGVOYW1lcyA9IF8uYXR0ZW1wdFNpbGVudChmcy5yZWFkZGlyU3luYywgY29uZmlnLmxhbWJkYXNEaXIpO1xuICByZXR1cm4gXy5yZWR1Y2UobGFtYmRhRmlsZU5hbWVzLCAob2JqLCBsYW1iZGFGaWxlTmFtZSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGxhbWJkYUZpbGVOYW1lLCAnLmpzJyk7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBjb25maWcubGFtYmRhc0RpciwgbmFtZSk7XG4gICAgY29uc3QgbW9kID0gcmVxdWlyZShtb2R1bGVQYXRoKS5tb2R1bGU7XG5cbiAgICBpZiAocmVsb2FkKSB7XG4gICAgICBkZWNhY2hlKG1vZHVsZVBhdGgpO1xuICAgIH1cblxuICAgIG9ialtuYW1lXSA9ICgpID0+IG1vZC5yZXF1aXJlKG1vZHVsZVBhdGgpLmxhbWJkYTtcbiAgICByZXR1cm4gb2JqO1xuICB9LCB7fSk7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/plugins/transpile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var _ = require('lodash'); 5 | var bluebird = require('bluebird'); 6 | var _sass = require('node-sass'); 7 | var _less = require('less'); 8 | var _stylus = require('stylus'); 9 | var _coffee = require('coffee-script'); 10 | var babel = require('babel-core'); 11 | 12 | var _require = require('rollup'), 13 | rollup = _require.rollup; 14 | 15 | var rollupBabel = require('rollup-plugin-babel'); 16 | var rollupCommonJs = require('rollup-plugin-commonjs'); 17 | var rollupNodeResolve = require('rollup-plugin-node-resolve'); 18 | var rollupEnv = require('rollup-plugin-env'); 19 | var postcss = require('postcss'); 20 | var cssnext = require('postcss-cssnext'); 21 | var config = require('../config'); 22 | 23 | module.exports = function transpile(file) { 24 | var transpiled = transpilers[file.type](file); 25 | return transpiled.then(function (result) { 26 | return _.assign(file, result); 27 | }); 28 | }; 29 | 30 | var transpilers = { sass: sass, less: less, stylus: stylus, coffee: coffee, js: js, css: css }; 31 | 32 | function sass(file) { 33 | return bluebird.promisify(_sass.render)({ 34 | data: file.content, 35 | file: file.src, 36 | includePaths: [file.dir], 37 | sourceMap: true, 38 | outFile: file.name, 39 | omitSourceMapUrl: true 40 | }).then(function (result) { 41 | return { 42 | content: result.css.toString(), 43 | map: result.map.toString(), 44 | mapImports: _.map(result.stats.includedFiles, function (included) { 45 | return path.relative(process.cwd(), included); 46 | }) 47 | }; 48 | }); 49 | } 50 | 51 | function less(file) { 52 | return _less.render(file.content, { 53 | filename: file.src, 54 | sourceMap: {}, 55 | paths: [file.dir] 56 | }).then(function (result) { 57 | return { 58 | content: result.css.toString(), 59 | map: result.map, 60 | mapImports: result.imports 61 | }; 62 | }); 63 | } 64 | 65 | function stylus(file) { 66 | var result = void 0; 67 | var style = _stylus(file.content).set('filename', file.src).set('sourcemap', { comment: false }).define('url', _stylus.resolver()); 68 | 69 | style.render(function (err, css) { 70 | result = { 71 | content: css, 72 | map: style.sourcemap, 73 | mapImports: style.deps() 74 | }; 75 | }); 76 | 77 | return Promise.resolve(result); 78 | } 79 | 80 | function coffee(file) { 81 | var opts = { 82 | sourceMap: true, 83 | filename: file.src, 84 | sourceFiles: [file.src] 85 | }; 86 | var compiled = _coffee.compile(file.content, opts); 87 | var result = { 88 | content: compiled.js, 89 | map: compiled.v3SourceMap 90 | }; 91 | return Promise.resolve(result); 92 | } 93 | 94 | function js(file) { 95 | // TODO: unhack all the hacking 96 | var babelOpts = { 97 | filename: file.base, 98 | presets: [['babel-preset-es2015'], 'babel-preset-es2016', 'babel-preset-es2017', 'babel-preset-react'], 99 | sourceMaps: true, 100 | sourceFileName: file.src, 101 | ast: false, 102 | compact: false 103 | }; 104 | 105 | var nodeResolveOpts = { 106 | browser: true, 107 | jsnext: true, 108 | main: true 109 | }; 110 | 111 | var commonJsOpts = {}; 112 | 113 | if (config.modules) { 114 | babelOpts.presets[0][1] = { modules: false }; 115 | 116 | if (config.namedExports) { 117 | Object.assign(commonJsOpts, { namedExports: config.namedExports }); 118 | } 119 | 120 | var rollupOpts = { 121 | entry: file.src, 122 | plugins: [rollupEnv({ NODE_ENV: 'production' }), rollupNodeResolve(nodeResolveOpts), 123 | 124 | // Leaving this as a working example for a react/react-router app, but 125 | // Rollup won't take Millwright forward because it can't consume modules 126 | // without configuration - manually adding namedExports is often a requirement. 127 | // Webpack's Node API is probably our only path forward. 128 | rollupCommonJs(commonJsOpts), rollupBabel(babelOpts)] 129 | }; 130 | 131 | return rollup(rollupOpts).then(function (bundle) { 132 | var result = bundle.generate({ 133 | format: config.modules === true ? 'es' : config.modules, 134 | sourceMap: true, 135 | sourceMapFile: config.srcDir 136 | }); 137 | return { 138 | content: result.code, 139 | map: result.map, 140 | mapImports: result.map.sources 141 | }; 142 | }).catch(function (err) { 143 | return console.log(err); 144 | }); 145 | } 146 | 147 | var transformed = babel.transform(file.content, babelOpts); 148 | var result = { 149 | content: transformed.code, 150 | map: transformed.map 151 | }; 152 | return Promise.resolve(result); 153 | } 154 | 155 | function css(file) { 156 | return postcss([cssnext]).process(file.content, { 157 | from: file.src, 158 | map: { 159 | prev: file.map, 160 | inline: false, 161 | sourcesContent: false, 162 | annotation: false 163 | } 164 | }).then(function (result) { 165 | return { 166 | content: result.css, 167 | map: result.map.toString() 168 | }; 169 | }); 170 | } 171 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3RyYW5zcGlsZS5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIl8iLCJibHVlYmlyZCIsIl9zYXNzIiwiX2xlc3MiLCJfc3R5bHVzIiwiX2NvZmZlZSIsImJhYmVsIiwicm9sbHVwIiwicm9sbHVwQmFiZWwiLCJyb2xsdXBDb21tb25KcyIsInJvbGx1cE5vZGVSZXNvbHZlIiwicm9sbHVwRW52IiwicG9zdGNzcyIsImNzc25leHQiLCJjb25maWciLCJtb2R1bGUiLCJleHBvcnRzIiwidHJhbnNwaWxlIiwiZmlsZSIsInRyYW5zcGlsZWQiLCJ0cmFuc3BpbGVycyIsInR5cGUiLCJ0aGVuIiwiYXNzaWduIiwicmVzdWx0Iiwic2FzcyIsImxlc3MiLCJzdHlsdXMiLCJjb2ZmZWUiLCJqcyIsImNzcyIsInByb21pc2lmeSIsInJlbmRlciIsImRhdGEiLCJjb250ZW50Iiwic3JjIiwiaW5jbHVkZVBhdGhzIiwiZGlyIiwic291cmNlTWFwIiwib3V0RmlsZSIsIm5hbWUiLCJvbWl0U291cmNlTWFwVXJsIiwidG9TdHJpbmciLCJtYXAiLCJtYXBJbXBvcnRzIiwic3RhdHMiLCJpbmNsdWRlZEZpbGVzIiwicmVsYXRpdmUiLCJwcm9jZXNzIiwiY3dkIiwiaW5jbHVkZWQiLCJmaWxlbmFtZSIsInBhdGhzIiwiaW1wb3J0cyIsInN0eWxlIiwic2V0IiwiY29tbWVudCIsImRlZmluZSIsInJlc29sdmVyIiwiZXJyIiwic291cmNlbWFwIiwiZGVwcyIsIlByb21pc2UiLCJyZXNvbHZlIiwib3B0cyIsInNvdXJjZUZpbGVzIiwiY29tcGlsZWQiLCJjb21waWxlIiwidjNTb3VyY2VNYXAiLCJiYWJlbE9wdHMiLCJiYXNlIiwicHJlc2V0cyIsInNvdXJjZU1hcHMiLCJzb3VyY2VGaWxlTmFtZSIsImFzdCIsImNvbXBhY3QiLCJub2RlUmVzb2x2ZU9wdHMiLCJicm93c2VyIiwianNuZXh0IiwibWFpbiIsImNvbW1vbkpzT3B0cyIsIm1vZHVsZXMiLCJuYW1lZEV4cG9ydHMiLCJPYmplY3QiLCJyb2xsdXBPcHRzIiwiZW50cnkiLCJwbHVnaW5zIiwiTk9ERV9FTlYiLCJidW5kbGUiLCJnZW5lcmF0ZSIsImZvcm1hdCIsInNvdXJjZU1hcEZpbGUiLCJzcmNEaXIiLCJjb2RlIiwic291cmNlcyIsImNhdGNoIiwiY29uc29sZSIsImxvZyIsInRyYW5zZm9ybWVkIiwidHJhbnNmb3JtIiwiZnJvbSIsInByZXYiLCJpbmxpbmUiLCJzb3VyY2VzQ29udGVudCIsImFubm90YXRpb24iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBTUEsT0FBT0MsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1HLFFBQVFILFFBQVEsV0FBUixDQUFkO0FBQ0EsSUFBTUksUUFBUUosUUFBUSxNQUFSLENBQWQ7QUFDQSxJQUFNSyxVQUFVTCxRQUFRLFFBQVIsQ0FBaEI7QUFDQSxJQUFNTSxVQUFVTixRQUFRLGVBQVIsQ0FBaEI7QUFDQSxJQUFNTyxRQUFRUCxRQUFRLFlBQVIsQ0FBZDs7ZUFDaUJBLFFBQVEsUUFBUixDO0lBQVZRLE0sWUFBQUEsTTs7QUFDUCxJQUFNQyxjQUFjVCxRQUFRLHFCQUFSLENBQXBCO0FBQ0EsSUFBTVUsaUJBQWlCVixRQUFRLHdCQUFSLENBQXZCO0FBQ0EsSUFBTVcsb0JBQW9CWCxRQUFRLDRCQUFSLENBQTFCO0FBQ0EsSUFBTVksWUFBWVosUUFBUSxtQkFBUixDQUFsQjtBQUNBLElBQU1hLFVBQVViLFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1jLFVBQVVkLFFBQVEsaUJBQVIsQ0FBaEI7QUFDQSxJQUFNZSxTQUFTZixRQUFRLFdBQVIsQ0FBZjs7QUFFQWdCLE9BQU9DLE9BQVAsR0FBaUIsU0FBU0MsU0FBVCxDQUFtQkMsSUFBbkIsRUFBeUI7QUFDeEMsTUFBTUMsYUFBYUMsWUFBWUYsS0FBS0csSUFBakIsRUFBdUJILElBQXZC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RG5CO0FBRTdCM0MsbUJBQVcsSUFGa0I7QUFHN0JxRCx1QkFBZTdFLE9BQU84RTtBQUhPLE9BQWhCLENBQWY7QUFLQSxhQUFPO0FBQ0wxRCxpQkFBU1YsT0FBT3FFLElBRFg7QUFFTGxELGFBQUtuQixPQUFPbUIsR0FGUDtBQUdMQyxvQkFBWXBCLE9BQU9tQixHQUFQLENBQVdtRDtBQUhsQixPQUFQO0FBS0QsS0FaSSxFQWFKQyxLQWJJLENBYUU7QUFBQSxhQUFPQyxRQUFRQyxHQUFSLENBQVl0QyxHQUFaLENBQVA7QUFBQSxLQWJGLENBQVA7QUFjRDs7QUFFRCxNQUFNdUMsY0FBYzVGLE1BQU02RixTQUFOLENBQWdCakYsS0FBS2dCLE9BQXJCLEVBQThCbUMsU0FBOUIsQ0FBcEI7QUFDQSxNQUFNN0MsU0FBUztBQUNiVSxhQUFTZ0UsWUFBWUwsSUFEUjtBQUVibEQsU0FBS3VELFlBQVl2RDtBQUZKLEdBQWY7QUFJQSxTQUFPbUIsUUFBUUMsT0FBUixDQUFnQnZDLE1BQWhCLENBQVA7QUFDRDs7QUFFRCxTQUFTTSxHQUFULENBQWFaLElBQWIsRUFBbUI7QUFDakIsU0FBT04sUUFBUSxDQUFDQyxPQUFELENBQVIsRUFDSm1DLE9BREksQ0FDSTlCLEtBQUtnQixPQURULEVBQ2tCO0FBQ3JCa0UsVUFBTWxGLEtBQUtpQixHQURVO0FBRXJCUSxTQUFLO0FBQ0gwRCxZQUFNbkYsS0FBS3lCLEdBRFI7QUFFSDJELGNBQVEsS0FGTDtBQUdIQyxzQkFBZ0IsS0FIYjtBQUlIQyxrQkFBWTtBQUpUO0FBRmdCLEdBRGxCLEVBVUpsRixJQVZJLENBVUM7QUFBQSxXQUFXO0FBQ2ZZLGVBQVNWLE9BQU9NLEdBREQ7QUFFZmEsV0FBS25CLE9BQU9tQixHQUFQLENBQVdELFFBQVg7QUFGVSxLQUFYO0FBQUEsR0FWRCxDQUFQO0FBY0QiLCJmaWxlIjoidHJhbnNwaWxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IGJsdWViaXJkID0gcmVxdWlyZSgnYmx1ZWJpcmQnKTtcbmNvbnN0IF9zYXNzID0gcmVxdWlyZSgnbm9kZS1zYXNzJyk7XG5jb25zdCBfbGVzcyA9IHJlcXVpcmUoJ2xlc3MnKTtcbmNvbnN0IF9zdHlsdXMgPSByZXF1aXJlKCdzdHlsdXMnKTtcbmNvbnN0IF9jb2ZmZWUgPSByZXF1aXJlKCdjb2ZmZWUtc2NyaXB0Jyk7XG5jb25zdCBiYWJlbCA9IHJlcXVpcmUoJ2JhYmVsLWNvcmUnKTtcbmNvbnN0IHtyb2xsdXB9ID0gcmVxdWlyZSgncm9sbHVwJyk7XG5jb25zdCByb2xsdXBCYWJlbCA9IHJlcXVpcmUoJ3JvbGx1cC1wbHVnaW4tYmFiZWwnKTtcbmNvbnN0IHJvbGx1cENvbW1vbkpzID0gcmVxdWlyZSgncm9sbHVwLXBsdWdpbi1jb21tb25qcycpO1xuY29uc3Qgcm9sbHVwTm9kZVJlc29sdmUgPSByZXF1aXJlKCdyb2xsdXAtcGx1Z2luLW5vZGUtcmVzb2x2ZScpO1xuY29uc3Qgcm9sbHVwRW52ID0gcmVxdWlyZSgncm9sbHVwLXBsdWdpbi1lbnYnKTtcbmNvbnN0IHBvc3Rjc3MgPSByZXF1aXJlKCdwb3N0Y3NzJyk7XG5jb25zdCBjc3NuZXh0ID0gcmVxdWlyZSgncG9zdGNzcy1jc3NuZXh0Jyk7XG5jb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB0cmFuc3BpbGUoZmlsZSkge1xuICBjb25zdCB0cmFuc3BpbGVkID0gdHJhbnNwaWxlcnNbZmlsZS50eXBlXShmaWxlKTtcbiAgcmV0dXJuIHRyYW5zcGlsZWQudGhlbihyZXN1bHQgPT4gXy5hc3NpZ24oZmlsZSwgcmVzdWx0KSk7XG59O1xuXG5jb25zdCB0cmFuc3BpbGVycyA9IHtzYXNzLCBsZXNzLCBzdHlsdXMsIGNvZmZlZSwganMsIGNzc307XG5cbmZ1bmN0aW9uIHNhc3MoZmlsZSkge1xuICByZXR1cm4gYmx1ZWJpcmQucHJvbWlzaWZ5KF9zYXNzLnJlbmRlcikoe1xuICAgIGRhdGE6IGZpbGUuY29udGVudCxcbiAgICBmaWxlOiBmaWxlLnNyYyxcbiAgICBpbmNsdWRlUGF0aHM6IFtmaWxlLmRpcl0sXG4gICAgc291cmNlTWFwOiB0cnVlLFxuICAgIG91dEZpbGU6IGZpbGUubmFtZSxcbiAgICBvbWl0U291cmNlTWFwVXJsOiB0cnVlXG4gIH0pXG4gIC50aGVuKHJlc3VsdCA9PiAoe1xuICAgIGNvbnRlbnQ6IHJlc3VsdC5jc3MudG9TdHJpbmcoKSxcbiAgICBtYXA6IHJlc3VsdC5tYXAudG9TdHJpbmcoKSxcbiAgICBtYXBJbXBvcnRzOiBfLm1hcChyZXN1bHQuc3RhdHMuaW5jbHVkZWRGaWxlcywgaW5jbHVkZWQgPT4gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBpbmNsdWRlZCkpXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gbGVzcyhmaWxlKSB7XG4gIHJldHVybiBfbGVzcy5yZW5kZXIoZmlsZS5jb250ZW50LCB7XG4gICAgZmlsZW5hbWU6IGZpbGUuc3JjLFxuICAgIHNvdXJjZU1hcDoge30sXG4gICAgcGF0aHM6IFtmaWxlLmRpcl1cbiAgfSlcbiAgLnRoZW4ocmVzdWx0ID0+ICh7XG4gICAgY29udGVudDogcmVzdWx0LmNzcy50b1N0cmluZygpLFxuICAgIG1hcDogcmVzdWx0Lm1hcCxcbiAgICBtYXBJbXBvcnRzOiByZXN1bHQuaW1wb3J0c1xuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHN0eWx1cyhmaWxlKSB7XG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHN0eWxlID0gX3N0eWx1cyhmaWxlLmNvbnRlbnQpXG4gICAgLnNldCgnZmlsZW5hbWUnLCBmaWxlLnNyYylcbiAgICAuc2V0KCdzb3VyY2VtYXAnLCB7Y29tbWVudDogZmFsc2V9KVxuICAgIC5kZWZpbmUoJ3VybCcsIF9zdHlsdXMucmVzb2x2ZXIoKSk7XG5cbiAgc3R5bGUucmVuZGVyKChlcnIsIGNzcykgPT4ge1xuICAgIHJlc3VsdCA9IHtcbiAgICAgIGNvbnRlbnQ6IGNzcyxcbiAgICAgIG1hcDogc3R5bGUuc291cmNlbWFwLFxuICAgICAgbWFwSW1wb3J0czogc3R5bGUuZGVwcygpXG4gICAgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBjb2ZmZWUoZmlsZSkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICBmaWxlbmFtZTogZmlsZS5zcmMsXG4gICAgc291cmNlRmlsZXM6IFtmaWxlLnNyY11cbiAgfTtcbiAgY29uc3QgY29tcGlsZWQgPSBfY29mZmVlLmNvbXBpbGUoZmlsZS5jb250ZW50LCBvcHRzKTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNvbnRlbnQ6IGNvbXBpbGVkLmpzLFxuICAgIG1hcDogY29tcGlsZWQudjNTb3VyY2VNYXBcbiAgfTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBqcyhmaWxlKSB7XG4gIC8vIFRPRE86IHVuaGFjayBhbGwgdGhlIGhhY2tpbmdcbiAgY29uc3QgYmFiZWxPcHRzID0ge1xuICAgIGZpbGVuYW1lOiBmaWxlLmJhc2UsXG4gICAgcHJlc2V0czogW1xuICAgICAgWydiYWJlbC1wcmVzZXQtZXMyMDE1J10sXG4gICAgICAnYmFiZWwtcHJlc2V0LWVzMjAxNicsXG4gICAgICAnYmFiZWwtcHJlc2V0LWVzMjAxNycsXG4gICAgICAnYmFiZWwtcHJlc2V0LXJlYWN0J1xuICAgIF0sXG4gICAgc291cmNlTWFwczogdHJ1ZSxcbiAgICBzb3VyY2VGaWxlTmFtZTogZmlsZS5zcmMsXG4gICAgYXN0OiBmYWxzZSxcbiAgICBjb21wYWN0OiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0IG5vZGVSZXNvbHZlT3B0cyA9IHtcbiAgICBicm93c2VyOiB0cnVlLFxuICAgIGpzbmV4dDogdHJ1ZSxcbiAgICBtYWluOiB0cnVlXG4gIH07XG5cbiAgY29uc3QgY29tbW9uSnNPcHRzID0ge307XG5cbiAgaWYgKGNvbmZpZy5tb2R1bGVzKSB7XG4gICAgYmFiZWxPcHRzLnByZXNldHNbMF1bMV0gPSB7bW9kdWxlczogZmFsc2V9O1xuXG4gICAgaWYgKGNvbmZpZy5uYW1lZEV4cG9ydHMpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29tbW9uSnNPcHRzLCB7bmFtZWRFeHBvcnRzOiBjb25maWcubmFtZWRFeHBvcnRzfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9sbHVwT3B0cyA9IHtcbiAgICAgIGVudHJ5OiBmaWxlLnNyYyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgcm9sbHVwRW52KHtOT0RFX0VOVjogJ3Byb2R1Y3Rpb24nfSksXG4gICAgICAgIHJvbGx1cE5vZGVSZXNvbHZlKG5vZGVSZXNvbHZlT3B0cyksXG5cbiAgICAgICAgLy8gTGVhdmluZyB0aGlzIGFzIGEgd29ya2luZyBleGFtcGxlIGZvciBhIHJlYWN0L3JlYWN0LXJvdXRlciBhcHAsIGJ1dFxuICAgICAgICAvLyBSb2xsdXAgd29uJ3QgdGFrZSBNaWxsd3JpZ2h0IGZvcndhcmQgYmVjYXVzZSBpdCBjYW4ndCBjb25zdW1lIG1vZHVsZXNcbiAgICAgICAgLy8gd2l0aG91dCBjb25maWd1cmF0aW9uIC0gbWFudWFsbHkgYWRkaW5nIG5hbWVkRXhwb3J0cyBpcyBvZnRlbiBhIHJlcXVpcmVtZW50LlxuICAgICAgICAvLyBXZWJwYWNrJ3MgTm9kZSBBUEkgaXMgcHJvYmFibHkgb3VyIG9ubHkgcGF0aCBmb3J3YXJkLlxuICAgICAgICByb2xsdXBDb21tb25Kcyhjb21tb25Kc09wdHMpLFxuICAgICAgICByb2xsdXBCYWJlbChiYWJlbE9wdHMpXG4gICAgICBdXG4gICAgfTtcblxuICAgIHJldHVybiByb2xsdXAocm9sbHVwT3B0cylcbiAgICAgIC50aGVuKGJ1bmRsZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1bmRsZS5nZW5lcmF0ZSh7XG4gICAgICAgICAgZm9ybWF0OiBjb25maWcubW9kdWxlcyA9PT0gdHJ1ZSA/ICdlcycgOiBjb25maWcubW9kdWxlcyxcbiAgICAgICAgICBzb3VyY2VNYXA6IHRydWUsXG4gICAgICAgICAgc291cmNlTWFwRmlsZTogY29uZmlnLnNyY0RpclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiByZXN1bHQuY29kZSxcbiAgICAgICAgICBtYXA6IHJlc3VsdC5tYXAsXG4gICAgICAgICAgbWFwSW1wb3J0czogcmVzdWx0Lm1hcC5zb3VyY2VzXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmxvZyhlcnIpKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkID0gYmFiZWwudHJhbnNmb3JtKGZpbGUuY29udGVudCwgYmFiZWxPcHRzKTtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIGNvbnRlbnQ6IHRyYW5zZm9ybWVkLmNvZGUsXG4gICAgbWFwOiB0cmFuc2Zvcm1lZC5tYXBcbiAgfTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xufVxuXG5mdW5jdGlvbiBjc3MoZmlsZSkge1xuICByZXR1cm4gcG9zdGNzcyhbY3NzbmV4dF0pXG4gICAgLnByb2Nlc3MoZmlsZS5jb250ZW50LCB7XG4gICAgICBmcm9tOiBmaWxlLnNyYyxcbiAgICAgIG1hcDoge1xuICAgICAgICBwcmV2OiBmaWxlLm1hcCxcbiAgICAgICAgaW5saW5lOiBmYWxzZSxcbiAgICAgICAgc291cmNlc0NvbnRlbnQ6IGZhbHNlLFxuICAgICAgICBhbm5vdGF0aW9uOiBmYWxzZVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4ocmVzdWx0ID0+ICh7XG4gICAgICBjb250ZW50OiByZXN1bHQuY3NzLFxuICAgICAgbWFwOiByZXN1bHQubWFwLnRvU3RyaW5nKClcbiAgICB9KSk7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/tasks/build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var make = require('./make'); 4 | 5 | module.exports = build; 6 | 7 | function build() { 8 | process.env.task = 'build'; 9 | return make(); 10 | } 11 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9idWlsZC5qcyJdLCJuYW1lcyI6WyJtYWtlIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJidWlsZCIsInByb2Nlc3MiLCJlbnYiLCJ0YXNrIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsUUFBUixDQUFiOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCQyxLQUFqQjs7QUFFQSxTQUFTQSxLQUFULEdBQWlCO0FBQ2ZDLFVBQVFDLEdBQVIsQ0FBWUMsSUFBWixHQUFtQixPQUFuQjtBQUNBLFNBQU9QLE1BQVA7QUFDRCIsImZpbGUiOiJidWlsZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IG1ha2UgPSByZXF1aXJlKCcuL21ha2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZDtcblxuZnVuY3Rpb24gYnVpbGQoKSB7XG4gIHByb2Nlc3MuZW52LnRhc2sgPSAnYnVpbGQnO1xuICByZXR1cm4gbWFrZSgpO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/tasks/clean.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var fs = require('fs-extra'); 4 | var config = require('../config'); 5 | 6 | module.exports = clean; 7 | 8 | function clean() { 9 | fs.removeSync(config.destDir); 10 | } 11 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9jbGVhbi5qcyJdLCJuYW1lcyI6WyJmcyIsInJlcXVpcmUiLCJjb25maWciLCJtb2R1bGUiLCJleHBvcnRzIiwiY2xlYW4iLCJyZW1vdmVTeW5jIiwiZGVzdERpciJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxLQUFLQyxRQUFRLFVBQVIsQ0FBWDtBQUNBLElBQU1DLFNBQVNELFFBQVEsV0FBUixDQUFmOztBQUVBRSxPQUFPQyxPQUFQLEdBQWlCQyxLQUFqQjs7QUFFQSxTQUFTQSxLQUFULEdBQWlCO0FBQ2ZMLEtBQUdNLFVBQUgsQ0FBY0osT0FBT0ssT0FBckI7QUFDRCIsImZpbGUiOiJjbGVhbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGZzID0gcmVxdWlyZSgnZnMtZXh0cmEnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNsZWFuO1xuXG5mdW5jdGlvbiBjbGVhbigpIHtcbiAgZnMucmVtb3ZlU3luYyhjb25maWcuZGVzdERpcik7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/tasks/demo.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var fs = require('fs-extra'); 5 | var pathExists = require('path-exists').sync; 6 | var dev = require('./dev'); 7 | 8 | module.exports = demo; 9 | 10 | function demo() { 11 | if (pathExists('src')) { 12 | console.log('Millwright will only output the demo project if no \'src\' directory exists.'); 13 | process.exit(1); 14 | } 15 | 16 | fs.copySync(path.join(__dirname, '../demo'), 'src'); 17 | 18 | return dev(); 19 | } 20 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9kZW1vLmpzIl0sIm5hbWVzIjpbInBhdGgiLCJyZXF1aXJlIiwiZnMiLCJwYXRoRXhpc3RzIiwic3luYyIsImRldiIsIm1vZHVsZSIsImV4cG9ydHMiLCJkZW1vIiwiY29uc29sZSIsImxvZyIsInByb2Nlc3MiLCJleGl0IiwiY29weVN5bmMiLCJqb2luIiwiX19kaXJuYW1lIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUMsS0FBS0QsUUFBUSxVQUFSLENBQVg7QUFDQSxJQUFNRSxhQUFhRixRQUFRLGFBQVIsRUFBdUJHLElBQTFDO0FBQ0EsSUFBTUMsTUFBTUosUUFBUSxPQUFSLENBQVo7O0FBRUFLLE9BQU9DLE9BQVAsR0FBaUJDLElBQWpCOztBQUVBLFNBQVNBLElBQVQsR0FBZ0I7QUFDZCxNQUFJTCxXQUFXLEtBQVgsQ0FBSixFQUF1QjtBQUNyQk0sWUFBUUMsR0FBUjtBQUNBQyxZQUFRQyxJQUFSLENBQWEsQ0FBYjtBQUNEOztBQUVEVixLQUFHVyxRQUFILENBQVliLEtBQUtjLElBQUwsQ0FBVUMsU0FBVixFQUFxQixTQUFyQixDQUFaLEVBQTZDLEtBQTdDOztBQUVBLFNBQU9WLEtBQVA7QUFDRCIsImZpbGUiOiJkZW1vLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMtZXh0cmEnKTtcbmNvbnN0IHBhdGhFeGlzdHMgPSByZXF1aXJlKCdwYXRoLWV4aXN0cycpLnN5bmM7XG5jb25zdCBkZXYgPSByZXF1aXJlKCcuL2RldicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlbW87XG5cbmZ1bmN0aW9uIGRlbW8oKSB7XG4gIGlmIChwYXRoRXhpc3RzKCdzcmMnKSkge1xuICAgIGNvbnNvbGUubG9nKGBNaWxsd3JpZ2h0IHdpbGwgb25seSBvdXRwdXQgdGhlIGRlbW8gcHJvamVjdCBpZiBubyAnc3JjJyBkaXJlY3RvcnkgZXhpc3RzLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGZzLmNvcHlTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9kZW1vJyksICdzcmMnKTtcblxuICByZXR1cm4gZGV2KCk7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/tasks/dev.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var make = require('./make'); 4 | var serve = require('./serve'); 5 | 6 | module.exports = dev; 7 | 8 | function dev() { 9 | return make().then(serve); 10 | } 11 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9kZXYuanMiXSwibmFtZXMiOlsibWFrZSIsInJlcXVpcmUiLCJzZXJ2ZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJkZXYiLCJ0aGVuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLE9BQU9DLFFBQVEsUUFBUixDQUFiO0FBQ0EsSUFBTUMsUUFBUUQsUUFBUSxTQUFSLENBQWQ7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJDLEdBQWpCOztBQUVBLFNBQVNBLEdBQVQsR0FBZTtBQUNiLFNBQU9MLE9BQU9NLElBQVAsQ0FBWUosS0FBWixDQUFQO0FBQ0QiLCJmaWxlIjoiZGV2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgbWFrZSA9IHJlcXVpcmUoJy4vbWFrZScpO1xuY29uc3Qgc2VydmUgPSByZXF1aXJlKCcuL3NlcnZlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZGV2O1xuXG5mdW5jdGlvbiBkZXYoKSB7XG4gIHJldHVybiBtYWtlKCkudGhlbihzZXJ2ZSk7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/tasks/make.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var path = require('path'); 5 | var bluebird = require('bluebird'); 6 | var fs = bluebird.promisifyAll(require('fs-extra')); 7 | var clean = require('./clean'); 8 | var requireDir = require('require-dir'); 9 | var plugins = requireDir('../plugins', { camelcase: true }); 10 | var cache = require('../utils/cache'); 11 | var config = require('../config'); 12 | 13 | module.exports = make; 14 | 15 | function make(opts) { 16 | var task = process.env.task || 'make'; 17 | 18 | if (opts && opts.targeted && opts.assets) { 19 | return run(opts.assets); 20 | } 21 | 22 | cache.clear(); 23 | 24 | clean(); 25 | 26 | cache.set('files', 'srcResolved', plugins.normalize(fs.walkSync(config.srcDir))); 27 | 28 | _(cache.get('deps')).filter({ role: 'asset' }).forEach(function (dep) { 29 | var asset = cache.get('files')[dep.srcResolved]; 30 | if (!asset) { 31 | asset = plugins.normalize([dep.src])[0]; 32 | cache.set('files', 'srcResolved', asset); 33 | } 34 | asset.role = 'asset'; 35 | asset.isMinified = asset.isMinified || dep.isMinified; 36 | }); 37 | 38 | // We should remove passive assets from the file cache by this point 39 | 40 | _(cache.get('files')).filter({ role: 'template' }).forEach(plugins.static); 41 | 42 | return run(); 43 | 44 | function run(assets) { 45 | var transformAssets = runTransformAssets(assets || _.filter(cache.get('files'), { role: 'asset' })); 46 | 47 | return Promise.all(transformAssets).then(function () { 48 | var deps = _.filter(cache.get('deps'), function (dep) { 49 | return dep.role === 'asset'; 50 | }); 51 | if (assets) { 52 | var assetSources = _.map(assets, 'srcResolved'); 53 | deps = deps.reduce(function (acc, dep) { 54 | if (_.includes(assetSources, dep.srcResolved)) { 55 | acc.push(dep); 56 | } 57 | return acc; 58 | }, []); 59 | } 60 | return Promise.all(_.castArray(runGenerateDeps(deps))); 61 | }).then(function (result) { 62 | return Promise.all(_.flatten(result)); 63 | }).then(function () { 64 | return Promise.all(_.filter(assets || cache.get('files'), function (f) { 65 | return !f.role; 66 | }).map(function (asset) { 67 | var dest = path.join(config.destDir, asset.srcStripped); 68 | return fs.copyAsync(asset.src, dest); 69 | })); 70 | }); 71 | } 72 | 73 | function runTransformAssets(assets) { 74 | return _(assets).flow(plugins.normalizeAsset, !_.get(opts, 'targeted')).flow(plugins.read).flow(plugins.transpile, function (a) { 75 | return !a.isMinified; 76 | }).flowTap(plugins.cacheImport, function (a) { 77 | return !a.isMinified; 78 | }).flow(plugins.copySource).flow(plugins.minify, function (a) { 79 | return !a.isMinified; 80 | }, task === 'build').flow(plugins.remapSources, function (a) { 81 | return a.map; 82 | }).value(); 83 | } 84 | 85 | function runGenerateDeps(deps) { 86 | return _(deps).flow(plugins.normalizeDep).flow(plugins.getAssetContent).flowAll(plugins.concat, task === 'build').flow(plugins.outputSourcemaps).flow(plugins.output).value(); 87 | } 88 | } 89 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9tYWtlLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwicGF0aCIsImJsdWViaXJkIiwiZnMiLCJwcm9taXNpZnlBbGwiLCJjbGVhbiIsInJlcXVpcmVEaXIiLCJwbHVnaW5zIiwiY2FtZWxjYXNlIiwiY2FjaGUiLCJjb25maWciLCJtb2R1bGUiLCJleHBvcnRzIiwibWFrZSIsIm9wdHMiLCJ0YXNrIiwicHJvY2VzcyIsImVudiIsInRhcmdldGVkIiwiYXNzZXRzIiwicnVuIiwiY2xlYXIiLCJzZXQiLCJub3JtYWxpemUiLCJ3YWxrU3luYyIsInNyY0RpciIsImdldCIsImZpbHRlciIsInJvbGUiLCJmb3JFYWNoIiwiYXNzZXQiLCJkZXAiLCJzcmNSZXNvbHZlZCIsInNyYyIsImlzTWluaWZpZWQiLCJzdGF0aWMiLCJ0cmFuc2Zvcm1Bc3NldHMiLCJydW5UcmFuc2Zvcm1Bc3NldHMiLCJQcm9taXNlIiwiYWxsIiwidGhlbiIsImRlcHMiLCJhc3NldFNvdXJjZXMiLCJtYXAiLCJyZWR1Y2UiLCJhY2MiLCJpbmNsdWRlcyIsInB1c2giLCJjYXN0QXJyYXkiLCJydW5HZW5lcmF0ZURlcHMiLCJmbGF0dGVuIiwicmVzdWx0IiwiZiIsImRlc3QiLCJqb2luIiwiZGVzdERpciIsInNyY1N0cmlwcGVkIiwiY29weUFzeW5jIiwiZmxvdyIsIm5vcm1hbGl6ZUFzc2V0IiwicmVhZCIsInRyYW5zcGlsZSIsImEiLCJmbG93VGFwIiwiY2FjaGVJbXBvcnQiLCJjb3B5U291cmNlIiwibWluaWZ5IiwicmVtYXBTb3VyY2VzIiwidmFsdWUiLCJub3JtYWxpemVEZXAiLCJnZXRBc3NldENvbnRlbnQiLCJmbG93QWxsIiwiY29uY2F0Iiwib3V0cHV0U291cmNlbWFwcyIsIm91dHB1dCJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLE9BQU9ELFFBQVEsTUFBUixDQUFiO0FBQ0EsSUFBTUUs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aUI7QUFBQSxhQUFLLENBQUNKLEVBQUU1QixVQUFSO0FBQUEsS0FOakIsRUFNcUNuQixTQUFTLE9BTjlDLEVBT0oyQyxJQVBJLENBT0NuRCxRQUFRNEQsWUFQVCxFQU91QjtBQUFBLGFBQUtMLEVBQUVuQixHQUFQO0FBQUEsS0FQdkIsRUFRSnlCLEtBUkksRUFBUDtBQVNEOztBQUVELFdBQVNuQixlQUFULENBQXlCUixJQUF6QixFQUErQjtBQUM3QixXQUFPMUMsRUFBRTBDLElBQUYsRUFDSmlCLElBREksQ0FDQ25ELFFBQVE4RCxZQURULEVBRUpYLElBRkksQ0FFQ25ELFFBQVErRCxlQUZULEVBR0pDLE9BSEksQ0FHSWhFLFFBQVFpRSxNQUhaLEVBR29CekQsU0FBUyxPQUg3QixFQUlKMkMsSUFKSSxDQUlDbkQsUUFBUWtFLGdCQUpULEVBS0pmLElBTEksQ0FLQ25ELFFBQVFtRSxNQUxULEVBTUpOLEtBTkksRUFBUDtBQU9EO0FBQ0YiLCJmaWxlIjoibWFrZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBibHVlYmlyZCA9IHJlcXVpcmUoJ2JsdWViaXJkJyk7XG5jb25zdCBmcyA9IGJsdWViaXJkLnByb21pc2lmeUFsbChyZXF1aXJlKCdmcy1leHRyYScpKTtcbmNvbnN0IGNsZWFuID0gcmVxdWlyZSgnLi9jbGVhbicpO1xuY29uc3QgcmVxdWlyZURpciA9IHJlcXVpcmUoJ3JlcXVpcmUtZGlyJyk7XG5jb25zdCBwbHVnaW5zID0gcmVxdWlyZURpcignLi4vcGx1Z2lucycsIHtjYW1lbGNhc2U6IHRydWV9KTtcbmNvbnN0IGNhY2hlID0gcmVxdWlyZSgnLi4vdXRpbHMvY2FjaGUnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1ha2U7XG5cbmZ1bmN0aW9uIG1ha2Uob3B0cykge1xuICBjb25zdCB0YXNrID0gcHJvY2Vzcy5lbnYudGFzayB8fCAnbWFrZSc7XG5cbiAgaWYgKG9wdHMgJiYgb3B0cy50YXJnZXRlZCAmJiBvcHRzLmFzc2V0cykge1xuICAgIHJldHVybiBydW4ob3B0cy5hc3NldHMpO1xuICB9XG5cbiAgY2FjaGUuY2xlYXIoKTtcblxuICBjbGVhbigpO1xuXG4gIGNhY2hlLnNldCgnZmlsZXMnLCAnc3JjUmVzb2x2ZWQnLCBwbHVnaW5zLm5vcm1hbGl6ZShmcy53YWxrU3luYyhjb25maWcuc3JjRGlyKSkpO1xuXG4gIF8oY2FjaGUuZ2V0KCdkZXBzJykpXG4gICAgLmZpbHRlcih7cm9sZTogJ2Fzc2V0J30pXG4gICAgLmZvckVhY2goZGVwID0+IHtcbiAgICAgIGxldCBhc3NldCA9IGNhY2hlLmdldCgnZmlsZXMnKVtkZXAuc3JjUmVzb2x2ZWRdO1xuICAgICAgaWYgKCFhc3NldCkge1xuICAgICAgICBhc3NldCA9IHBsdWdpbnMubm9ybWFsaXplKFtkZXAuc3JjXSlbMF07XG4gICAgICAgIGNhY2hlLnNldCgnZmlsZXMnLCAnc3JjUmVzb2x2ZWQnLCBhc3NldCk7XG4gICAgICB9XG4gICAgICBhc3NldC5yb2xlID0gJ2Fzc2V0JztcbiAgICAgIGFzc2V0LmlzTWluaWZpZWQgPSBhc3NldC5pc01pbmlmaWVkIHx8IGRlcC5pc01pbmlmaWVkO1xuICAgIH0pO1xuXG4gIC8vIFdlIHNob3VsZCByZW1vdmUgcGFzc2l2ZSBhc3NldHMgZnJvbSB0aGUgZmlsZSBjYWNoZSBieSB0aGlzIHBvaW50XG5cbiAgXyhjYWNoZS5nZXQoJ2ZpbGVzJykpLmZpbHRlcih7cm9sZTogJ3RlbXBsYXRlJ30pLmZvckVhY2gocGx1Z2lucy5zdGF0aWMpO1xuXG5cbiAgcmV0dXJuIHJ1bigpO1xuXG4gIGZ1bmN0aW9uIHJ1bihhc3NldHMpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm1Bc3NldHMgPSBydW5UcmFuc2Zvcm1Bc3NldHMoYXNzZXRzIHx8IF8uZmlsdGVyKGNhY2hlLmdldCgnZmlsZXMnKSwge3JvbGU6ICdhc3NldCd9KSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodHJhbnNmb3JtQXNzZXRzKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBsZXQgZGVwcyA9IF8uZmlsdGVyKGNhY2hlLmdldCgnZGVwcycpLCBkZXAgPT4gZGVwLnJvbGUgPT09ICdhc3NldCcpO1xuICAgICAgICBpZiAoYXNzZXRzKSB7XG4gICAgICAgICAgY29uc3QgYXNzZXRTb3VyY2VzID0gXy5tYXAoYXNzZXRzLCAnc3JjUmVzb2x2ZWQnKTtcbiAgICAgICAgICBkZXBzID0gZGVwcy5yZWR1Y2UoKGFjYywgZGVwKSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhhc3NldFNvdXJjZXMsIGRlcC5zcmNSZXNvbHZlZCkpIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2goZGVwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwgW10pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChfLmNhc3RBcnJheShydW5HZW5lcmF0ZURlcHMoZGVwcykpKVxuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3VsdCA9PiBQcm9taXNlLmFsbChfLmZsYXR0ZW4ocmVzdWx0KSkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChfLmZpbHRlcihhc3NldHMgfHwgY2FjaGUuZ2V0KCdmaWxlcycpLCBmID0+ICFmLnJvbGUpLm1hcChhc3NldCA9PiB7XG4gICAgICAgICAgY29uc3QgZGVzdCA9IHBhdGguam9pbihjb25maWcuZGVzdERpciwgYXNzZXQuc3JjU3RyaXBwZWQpO1xuICAgICAgICAgIHJldHVybiBmcy5jb3B5QXN5bmMoYXNzZXQuc3JjLCBkZXN0KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBydW5UcmFuc2Zvcm1Bc3NldHMoYXNzZXRzKSB7XG4gICAgcmV0dXJuIF8oYXNzZXRzKVxuICAgICAgLmZsb3cocGx1Z2lucy5ub3JtYWxpemVBc3NldCwgIV8uZ2V0KG9wdHMsICd0YXJnZXRlZCcpKVxuICAgICAgLmZsb3cocGx1Z2lucy5yZWFkKVxuICAgICAgLmZsb3cocGx1Z2lucy50cmFuc3BpbGUsIGEgPT4gIWEuaXNNaW5pZmllZClcbiAgICAgIC5mbG93VGFwKHBsdWdpbnMuY2FjaGVJbXBvcnQsIGEgPT4gIWEuaXNNaW5pZmllZClcbiAgICAgIC5mbG93KHBsdWdpbnMuY29weVNvdXJjZSlcbiAgICAgIC5mbG93KHBsdWdpbnMubWluaWZ5LCBhID0+ICFhLmlzTWluaWZpZWQsIHRhc2sgPT09ICdidWlsZCcpXG4gICAgICAuZmxvdyhwbHVnaW5zLnJlbWFwU291cmNlcywgYSA9PiBhLm1hcClcbiAgICAgIC52YWx1ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcnVuR2VuZXJhdGVEZXBzKGRlcHMpIHtcbiAgICByZXR1cm4gXyhkZXBzKVxuICAgICAgLmZsb3cocGx1Z2lucy5ub3JtYWxpemVEZXApXG4gICAgICAuZmxvdyhwbHVnaW5zLmdldEFzc2V0Q29udGVudClcbiAgICAgIC5mbG93QWxsKHBsdWdpbnMuY29uY2F0LCB0YXNrID09PSAnYnVpbGQnKVxuICAgICAgLmZsb3cocGx1Z2lucy5vdXRwdXRTb3VyY2VtYXBzKVxuICAgICAgLmZsb3cocGx1Z2lucy5vdXRwdXQpXG4gICAgICAudmFsdWUoKTtcbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /dist/tasks/preview.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var build = require('./build'); 4 | var serve = require('./serve'); 5 | 6 | module.exports = preview; 7 | 8 | function preview() { 9 | return build().then(serve); 10 | } 11 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9wcmV2aWV3LmpzIl0sIm5hbWVzIjpbImJ1aWxkIiwicmVxdWlyZSIsInNlcnZlIiwibW9kdWxlIiwiZXhwb3J0cyIsInByZXZpZXciLCJ0aGVuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLFFBQVFDLFFBQVEsU0FBUixDQUFkO0FBQ0EsSUFBTUMsUUFBUUQsUUFBUSxTQUFSLENBQWQ7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJDLE9BQWpCOztBQUVBLFNBQVNBLE9BQVQsR0FBbUI7QUFDakIsU0FBT0wsUUFBUU0sSUFBUixDQUFhSixLQUFiLENBQVA7QUFDRCIsImZpbGUiOiJwcmV2aWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgYnVpbGQgPSByZXF1aXJlKCcuL2J1aWxkJyk7XG5jb25zdCBzZXJ2ZSA9IHJlcXVpcmUoJy4vc2VydmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBwcmV2aWV3O1xuXG5mdW5jdGlvbiBwcmV2aWV3KCkge1xuICByZXR1cm4gYnVpbGQoKS50aGVuKHNlcnZlKTtcbn1cbiJdfQ== -------------------------------------------------------------------------------- /dist/tasks/serve.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } 4 | 5 | var path = require('path'); 6 | var _ = require('lodash'); 7 | var chokidar = require('chokidar'); 8 | var bs = require('browser-sync').create(); 9 | var logger = require('connect-logger'); 10 | var historyApiFallback = require('connect-history-api-fallback'); 11 | var config = require('../config'); 12 | var cache = require('../utils/cache'); 13 | var make = require('./make'); 14 | var requireDir = require('require-dir'); 15 | var plugins = requireDir('../plugins', { camelcase: true }); 16 | 17 | module.exports = serve; 18 | 19 | function serve() { 20 | if (process.env.task !== 'build') { 21 | 22 | var srcDirResolved = path.resolve(config.srcDir); 23 | 24 | var aboveSrcPaths = _(cache.get('files')).keys().concat(_.map(cache.get('deps'), 'srcResolved')).filter(function (srcResolved) { 25 | return !srcResolved.startsWith(srcDirResolved); 26 | }).uniq().value(); 27 | 28 | var watchOpts = { 29 | ignoreInitial: true 30 | }; 31 | 32 | chokidar.watch([srcDirResolved].concat(_toConsumableArray(aboveSrcPaths)), watchOpts).on('all', function (event, changedPath) { 33 | if (event !== 'change') { 34 | return make().then(function () { 35 | return bs.reload(); 36 | }); 37 | } 38 | 39 | var file = cache.get('files', changedPath); 40 | var consumers = []; 41 | var assets = []; 42 | var reloadTargets = []; 43 | var shouldMake = false; 44 | var shouldMakeAll = false; 45 | 46 | if (_.includes(['asset', 'import', 'wrapper'], file.role)) { 47 | var deps = _(cache.get('deps')).filter({ srcResolved: changedPath }).map(function (dep) { 48 | return cache.get('files', dep.consumer); 49 | }).uniq().value(); 50 | 51 | consumers.push.apply(consumers, _toConsumableArray(deps)); 52 | } 53 | 54 | if (file.role === 'asset') { 55 | assets.push(file); 56 | var assetConsumers = _.filter(consumers, { role: 'asset' }); 57 | assets.push.apply(assets, _toConsumableArray(assetConsumers)); 58 | reloadTargets.push(file.destResolved); 59 | reloadTargets.push.apply(reloadTargets, _toConsumableArray(_.map(assetConsumers, 'destResolved'))); 60 | shouldMake = true; 61 | } else if (file.role === 'import') { 62 | var _assetConsumers = _.filter(consumers, { role: 'asset' }); 63 | assets.push.apply(assets, _toConsumableArray(_assetConsumers)); 64 | reloadTargets.push.apply(reloadTargets, _toConsumableArray(_.map(_assetConsumers, 'destResolved'))); 65 | shouldMake = true; 66 | } else if (file.role === 'data') { 67 | shouldMakeAll = true; 68 | } else if (file.role === 'template') { 69 | plugins.static(file); 70 | } else if (file.role === 'wrapper') { 71 | var templates = _.filter(consumers, { role: 'template' }); 72 | templates.forEach(plugins.static); 73 | } else if (_.includes(['partial', 'lambda'], file.role)) { 74 | var opts = { 75 | shouldGetPartials: file.role === 'partial', 76 | shouldGetLambdas: file.role === 'lambda' 77 | }; 78 | var _templates = _.filter(cache.get('files'), { role: 'template' }); 79 | _templates.forEach(function (template) { 80 | return plugins.static(template, opts); 81 | }); 82 | } else { 83 | shouldMakeAll = true; 84 | } 85 | 86 | if (shouldMakeAll) { 87 | make().then(function () { 88 | return bs.reload(); 89 | }); 90 | } else if (shouldMake) { 91 | make({ assets: assets, targeted: true }).then(function () { 92 | return bs.reload(reloadTargets); 93 | }); 94 | } else { 95 | bs.reload(); 96 | } 97 | }); 98 | } 99 | 100 | var bsMiddleware = [logger()]; 101 | 102 | if (config.spaRouting) { 103 | bsMiddleware.push(historyApiFallback()); 104 | } 105 | 106 | var bsOpts = { 107 | server: { 108 | baseDir: config.destDir, 109 | serveStaticOptions: { 110 | extensions: ['html'] 111 | } 112 | }, 113 | middleware: bsMiddleware, 114 | snippetOptions: { 115 | rule: { 116 | match: /$/, 117 | fn: function fn(snippet) { 118 | return snippet; 119 | } 120 | } 121 | }, 122 | notify: false, 123 | ghostMode: false 124 | }; 125 | 126 | bs.init(bsOpts); 127 | } 128 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9zZXJ2ZS5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsIl8iLCJjaG9raWRhciIsImJzIiwiY3JlYXRlIiwibG9nZ2VyIiwiaGlzdG9yeUFwaUZhbGxiYWNrIiwiY29uZmlnIiwiY2FjaGUiLCJtYWtlIiwicmVxdWlyZURpciIsInBsdWdpbnMiLCJjYW1lbGNhc2UiLCJtb2R1bGUiLCJleHBvcnRzIiwic2VydmUiLCJwcm9jZXNzIiwiZW52IiwidGFzayIsInNyY0RpclJlc29sdmVkIiwicmVzb2x2ZSIsInNyY0RpciIsImFib3ZlU3JjUGF0aHMiLCJnZXQiLCJrZXlzIiwiY29uY2F0IiwibWFwIiwiZmlsdGVyIiwic3JjUmVzb2x2ZWQiLCJzdGFydHNXaXRoIiwidW5pcSIsInZhbHVlIiwid2F0Y2hPcHRzIiwiaWdub3JlSW5pdGlhbCIsIndhdGNoIiwib24iLCJldmVudCIsImNoYW5nZWRQYXRoIiwidGhlbiIsInJlbG9hZCIsImZpbGUiLCJjb25zdW1lcnMiLCJhc3NldHMiLCJyZWxvYWRUYXJnZXRzIiwic2hvdWxkTWFrZSIsInNob3VsZE1ha2VBbGwiLCJpbmNsdWRlcyIsInJvbGUiLCJkZXBzIiwiZGVwIiwiY29uc3VtZXIiLCJwdXNoIiwiYXNzZXRDb25zdW1lcnMiLCJkZXN0UmVzb2x2ZWQiLCJzdGF0aWMiLCJ0ZW1wbGF0ZXMiLCJmb3JFYWNoIiwib3B0cyIsInNob3VsZEdldFBhcnRpYWxzIiwic2hvdWxkR2V0TGFtYmRhcyIsInRlbXBsYXRlIiwidGFyZ2V0ZWQiLCJic01pZGRsZXdhcmUiLCJzcGFSb3V0aW5nIiwiYnNPcHRzIiwic2VydmVyIiwiYmFzZURpciIsImRlc3REaXIiLCJzZXJ2ZVN0YXRpY09wdGlvbnMiLCJleHRlbnNpb25zIiwibWlkZGxld2FyZSIsInNuaXBwZXRPcHRpb25zIiwicnVsZSIsIm1hdGNoIiwiZm4iLCJzbmlwcGV0Iiwibm90aWZ5IiwiZ2hvc3RNb2RlIiwiaW5pdCJdLCJt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ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5jb25zdCBjaG9raWRhciA9IHJlcXVpcmUoJ2Nob2tpZGFyJyk7XG5jb25zdCBicyA9IHJlcXVpcmUoJ2Jyb3dzZXItc3luYycpLmNyZWF0ZSgpO1xuY29uc3QgbG9nZ2VyID0gcmVxdWlyZSgnY29ubmVjdC1sb2dnZXInKTtcbmNvbnN0IGhpc3RvcnlBcGlGYWxsYmFjayA9IHJlcXVpcmUoJ2Nvbm5lY3QtaGlzdG9yeS1hcGktZmFsbGJhY2snKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3QgY2FjaGUgPSByZXF1aXJlICgnLi4vdXRpbHMvY2FjaGUnKTtcbmNvbnN0IG1ha2UgPSByZXF1aXJlKCcuL21ha2UnKTtcbmNvbnN0IHJlcXVpcmVEaXIgPSByZXF1aXJlKCdyZXF1aXJlLWRpcicpO1xuY29uc3QgcGx1Z2lucyA9IHJlcXVpcmVEaXIoJy4uL3BsdWdpbnMnLCB7Y2FtZWxjYXNlOiB0cnVlfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gc2VydmU7XG5cbmZ1bmN0aW9uIHNlcnZlKCkge1xuICBpZiAocHJvY2Vzcy5lbnYudGFzayAhPT0gJ2J1aWxkJykge1xuXG4gICAgY29uc3Qgc3JjRGlyUmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29uZmlnLnNyY0Rpcik7XG5cbiAgICBjb25zdCBhYm92ZVNyY1BhdGhzID0gXyhjYWNoZS5nZXQoJ2ZpbGVzJykpXG4gICAgICAua2V5cygpXG4gICAgICAuY29uY2F0KF8ubWFwKGNhY2hlLmdldCgnZGVwcycpLCAnc3JjUmVzb2x2ZWQnKSlcbiAgICAgIC5maWx0ZXIoc3JjUmVzb2x2ZWQgPT4gIXNyY1Jlc29sdmVkLnN0YXJ0c1dpdGgoc3JjRGlyUmVzb2x2ZWQpKVxuICAgICAgLnVuaXEoKVxuICAgICAgLnZhbHVlKCk7XG5cbiAgICBjb25zdCB3YXRjaE9wdHMgPSB7XG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlXG4gICAgfTtcblxuICAgIGNob2tpZGFyLndhdGNoKFtzcmNEaXJSZXNvbHZlZCwgLi4uYWJvdmVTcmNQYXRoc10sIHdhdGNoT3B0cykub24oJ2FsbCcsIChldmVudCwgY2hhbmdlZFBhdGgpID0+IHtcbiAgICAgIGlmIChldmVudCAhPT0gJ2NoYW5nZScpIHtcbiAgICAgICAgcmV0dXJuIG1ha2UoKS50aGVuKCgpID0+IGJzLnJlbG9hZCgpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsZSA9IGNhY2hlLmdldCgnZmlsZXMnLCBjaGFuZ2VkUGF0aCk7XG4gICAgICBjb25zdCBjb25zdW1lcnMgPSBbXTtcbiAgICAgIGNvbnN0IGFzc2V0cyA9IFtdO1xuICAgICAgY29uc3QgcmVsb2FkVGFyZ2V0cyA9IFtdO1xuICAgICAgdmFyIHNob3VsZE1ha2UgPSBmYWxzZTtcbiAgICAgIHZhciBzaG91bGRNYWtlQWxsID0gZmFsc2U7XG5cbiAgICAgIGlmIChfLmluY2x1ZGVzKFsnYXNzZXQnLCAnaW1wb3J0JywgJ3dyYXBwZXInXSwgZmlsZS5yb2xlKSkge1xuICAgICAgICBjb25zdCBkZXBzID0gXyhjYWNoZS5nZXQoJ2RlcHMnKSlcbiAgICAgICAgICAuZmlsdGVyKHtzcmNSZXNvbHZlZDogY2hhbmdlZFBhdGh9KVxuICAgICAgICAgIC5tYXAoZGVwID0+IGNhY2hlLmdldCgnZmlsZXMnLCBkZXAuY29uc3VtZXIpKVxuICAgICAgICAgIC51bmlxKClcbiAgICAgICAgICAudmFsdWUoKTtcblxuICAgICAgICBjb25zdW1lcnMucHVzaCguLi5kZXBzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGUucm9sZSA9PT0gJ2Fzc2V0Jykge1xuICAgICAgICBhc3NldHMucHVzaChmaWxlKTtcbiAgICAgICAgY29uc3QgYXNzZXRDb25zdW1lcnMgPSBfLmZpbHRlcihjb25zdW1lcnMsIHtyb2xlOiAnYXNzZXQnfSk7XG4gICAgICAgIGFzc2V0cy5wdXNoKC4uLmFzc2V0Q29uc3VtZXJzKTtcbiAgICAgICAgcmVsb2FkVGFyZ2V0cy5wdXNoKGZpbGUuZGVzdFJlc29sdmVkKTtcbiAgICAgICAgcmVsb2FkVGFyZ2V0cy5wdXNoKC4uLl8ubWFwKGFzc2V0Q29uc3VtZXJzLCAnZGVzdFJlc29sdmVkJykpO1xuICAgICAgICBzaG91bGRNYWtlID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS5yb2xlID09PSAnaW1wb3J0Jykge1xuICAgICAgICBjb25zdCBhc3NldENvbnN1bWVycyA9IF8uZmlsdGVyKGNvbnN1bWVycywge3JvbGU6ICdhc3NldCd9KTtcbiAgICAgICAgYXNzZXRzLnB1c2goLi4uYXNzZXRDb25zdW1lcnMpO1xuICAgICAgICByZWxvYWRUYXJnZXRzLnB1c2goLi4uXy5tYXAoYXNzZXRDb25zdW1lcnMsICdkZXN0UmVzb2x2ZWQnKSk7XG4gICAgICAgIHNob3VsZE1ha2UgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmaWxlLnJvbGUgPT09ICdkYXRhJykge1xuICAgICAgICBzaG91bGRNYWtlQWxsID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS5yb2xlID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgIHBsdWdpbnMuc3RhdGljKGZpbGUpO1xuICAgICAgfSBlbHNlIGlmIChmaWxlLnJvbGUgPT09ICd3cmFwcGVyJykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBfLmZpbHRlcihjb25zdW1lcnMsIHtyb2xlOiAndGVtcGxhdGUnfSk7XG4gICAgICAgIHRlbXBsYXRlcy5mb3JFYWNoKHBsdWdpbnMuc3RhdGljKTtcbiAgICAgIH0gZWxzZSBpZiAoXy5pbmNsdWRlcyhbJ3BhcnRpYWwnLCAnbGFtYmRhJ10sIGZpbGUucm9sZSkpIHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgICBzaG91bGRHZXRQYXJ0aWFsczogZmlsZS5yb2xlID09PSAncGFydGlhbCcsXG4gICAgICAgICAgc2hvdWxkR2V0TGFtYmRhczogZmlsZS5yb2xlID09PSAnbGFtYmRhJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBfLmZpbHRlcihjYWNoZS5nZXQoJ2ZpbGVzJyksIHtyb2xlOiAndGVtcGxhdGUnfSk7XG4gICAgICAgIHRlbXBsYXRlcy5mb3JFYWNoKHRlbXBsYXRlID0+IHBsdWdpbnMuc3RhdGljKHRlbXBsYXRlLCBvcHRzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG91bGRNYWtlQWxsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZE1ha2VBbGwpIHtcbiAgICAgICAgbWFrZSgpLnRoZW4oKCkgPT4gYnMucmVsb2FkKCkpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRNYWtlKSB7XG4gICAgICAgIG1ha2Uoe2Fzc2V0cywgdGFyZ2V0ZWQ6IHRydWV9KS50aGVuKCgpID0+IGJzLnJlbG9hZChyZWxvYWRUYXJnZXRzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicy5yZWxvYWQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGJzTWlkZGxld2FyZSA9IFtsb2dnZXIoKV07XG5cbiAgaWYgKGNvbmZpZy5zcGFSb3V0aW5nKSB7XG4gICAgYnNNaWRkbGV3YXJlLnB1c2goaGlzdG9yeUFwaUZhbGxiYWNrKCkpO1xuICB9XG5cbiAgY29uc3QgYnNPcHRzID0ge1xuICAgIHNlcnZlcjoge1xuICAgICAgYmFzZURpcjogY29uZmlnLmRlc3REaXIsXG4gICAgICBzZXJ2ZVN0YXRpY09wdGlvbnM6IHtcbiAgICAgICAgZXh0ZW5zaW9uczogWydodG1sJ11cbiAgICAgIH1cbiAgICB9LFxuICAgIG1pZGRsZXdhcmU6IGJzTWlkZGxld2FyZSxcbiAgICBzbmlwcGV0T3B0aW9uczoge1xuICAgICAgcnVsZToge1xuICAgICAgICBtYXRjaDogLyQvLFxuICAgICAgICBmbjogZnVuY3Rpb24gKHNuaXBwZXQpIHtcbiAgICAgICAgICByZXR1cm4gc25pcHBldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbm90aWZ5OiBmYWxzZSxcbiAgICBnaG9zdE1vZGU6IGZhbHNlXG4gIH07XG5cbiAgYnMuaW5pdChic09wdHMpO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/utils/cache.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var path = require('path'); 4 | var fs = require('fs-extra'); 5 | var _ = require('lodash'); 6 | var cache = {}; 7 | 8 | module.exports = { get: get, set: set, push: push, clear: clear }; 9 | 10 | function get(key, valueKey) { 11 | return valueKey ? cache[key][valueKey] : cache[key]; 12 | } 13 | 14 | function set(key, valueKey, values) { 15 | cache[key] = cache[key] || {}; 16 | _.forEach(_.castArray(values), function (val) { 17 | return cache[key][val[valueKey]] = val; 18 | }); 19 | } 20 | 21 | function push(key, values) { 22 | cache[key] = (cache[key] || []).concat(_.castArray(values)); 23 | } 24 | 25 | function clear() { 26 | cache = {}; 27 | } 28 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jYWNoZS5qcyJdLCJuYW1lcyI6WyJwYXRoIiwicmVxdWlyZSIsImZzIiwiXyIsImNhY2hlIiwibW9kdWxlIiwiZXhwb3J0cyIsImdldCIsInNldCIsInB1c2giLCJjbGVhciIsImtleSIsInZhbHVlS2V5IiwidmFsdWVzIiwiZm9yRWFjaCIsImNhc3RBcnJheSIsInZhbCIsImNvbmNhdCJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxPQUFPQyxRQUFRLE1BQVIsQ0FBYjtBQUNBLElBQU1DLEtBQUtELFFBQVEsVUFBUixDQUFYO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFJRyxRQUFRLEVBQVo7O0FBRUFDLE9BQU9DLE9BQVAsR0FBaUIsRUFBQ0MsUUFBRCxFQUFNQyxRQUFOLEVBQVdDLFVBQVgsRUFBaUJDLFlBQWpCLEVBQWpCOztBQUVBLFNBQVNILEdBQVQsQ0FBYUksR0FBYixFQUFrQkMsUUFBbEIsRUFBNEI7QUFDMUIsU0FBT0EsV0FBV1IsTUFBTU8sR0FBTixFQUFXQyxRQUFYLENBQVgsR0FBa0NSLE1BQU1PLEdBQU4sQ0FBekM7QUFDRDs7QUFFRCxTQUFTSCxHQUFULENBQWFHLEdBQWIsRUFBa0JDLFFBQWxCLEVBQTRCQyxNQUE1QixFQUFvQztBQUNsQ1QsUUFBTU8sR0FBTixJQUFhUCxNQUFNTyxHQUFOLEtBQWMsRUFBM0I7QUFDQVIsSUFBRVcsT0FBRixDQUFVWCxFQUFFWSxTQUFGLENBQVlGLE1BQVosQ0FBVixFQUErQjtBQUFBLFdBQU9ULE1BQU1PLEdBQU4sRUFBV0ssSUFBSUosUUFBSixDQUFYLElBQTRCSSxHQUFuQztBQUFBLEdBQS9CO0FBQ0Q7O0FBRUQsU0FBU1AsSUFBVCxDQUFjRSxHQUFkLEVBQW1CRSxNQUFuQixFQUEyQjtBQUN6QlQsUUFBTU8sR0FBTixJQUFhLENBQUNQLE1BQU1PLEdBQU4sS0FBYyxFQUFmLEVBQW1CTSxNQUFuQixDQUEwQmQsRUFBRVksU0FBRixDQUFZRixNQUFaLENBQTFCLENBQWI7QUFDRDs7QUFFRCxTQUFTSCxLQUFULEdBQWlCO0FBQ2ZOLFVBQVEsRUFBUjtBQUNEIiwiZmlsZSI6ImNhY2hlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMtZXh0cmEnKTtcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmxldCBjYWNoZSA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtnZXQsIHNldCwgcHVzaCwgY2xlYXJ9O1xuXG5mdW5jdGlvbiBnZXQoa2V5LCB2YWx1ZUtleSkge1xuICByZXR1cm4gdmFsdWVLZXkgPyBjYWNoZVtrZXldW3ZhbHVlS2V5XSA6IGNhY2hlW2tleV07XG59XG5cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlS2V5LCB2YWx1ZXMpIHtcbiAgY2FjaGVba2V5XSA9IGNhY2hlW2tleV0gfHwge307XG4gIF8uZm9yRWFjaChfLmNhc3RBcnJheSh2YWx1ZXMpLCB2YWwgPT4gY2FjaGVba2V5XVt2YWxbdmFsdWVLZXldXSA9IHZhbCk7XG59XG5cbmZ1bmN0aW9uIHB1c2goa2V5LCB2YWx1ZXMpIHtcbiAgY2FjaGVba2V5XSA9IChjYWNoZVtrZXldIHx8IFtdKS5jb25jYXQoXy5jYXN0QXJyYXkodmFsdWVzKSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICBjYWNoZSA9IHt9O1xufVxuIl19 -------------------------------------------------------------------------------- /dist/utils/lodash-flow.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | 5 | _.mixin({ 6 | flow: flow, 7 | flowAll: flowAll, 8 | flowTap: flowTap, 9 | flowLog: flowLog 10 | }); 11 | 12 | function flow(coll, fn, cond, when) { 13 | if (arguments.length === 3) { 14 | _.isFunction(cond) ? when = true : (when = cond, cond = _.stubTrue); 15 | } else if (arguments.length === 2) { 16 | when = true, cond = _.stubTrue; 17 | } 18 | 19 | if (!when) { 20 | return coll; 21 | } 22 | 23 | var flowValues = _.curry(function (coll, fn, cond) { 24 | return _.map(coll, function (value, index, coll) { 25 | var runConditionally = function runConditionally(val) { 26 | return cond(val) ? fn(val) : val; 27 | }; 28 | return _.isPromise(value) ? value.then(runConditionally) : runConditionally(value); 29 | }); 30 | }); 31 | 32 | return _.isPromise(coll) ? coll.then(flowValues(_, fn, cond)) : flowValues(coll, fn, cond); 33 | } 34 | 35 | function flowAll(coll, fn, when) { 36 | when = arguments.length === 3 ? when : true; 37 | if (when) { 38 | return _.isPromise(coll) ? coll.then(fn) : Promise.all(_.castArray(coll)).then(fn); 39 | } 40 | return coll; 41 | } 42 | 43 | function flowTap(coll, fn, when) { 44 | flowAll(coll, fn, when); 45 | return coll; 46 | } 47 | 48 | function flowLog(coll) { 49 | var log = function log(vals) { 50 | return _.map(vals, function (val) { 51 | return _.isPromise(val) ? val.then(console.log) : console.log(val); 52 | }); 53 | }; 54 | _.isPromise(coll) ? coll.then(log) : log(coll); 55 | return coll; 56 | } 57 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sb2Rhc2gtZmxvdy5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIm1peGluIiwiZmxvdyIsImZsb3dBbGwiLCJmbG93VGFwIiwiZmxvd0xvZyIsImNvbGwiLCJmbiIsImNvbmQiLCJ3aGVuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiaXNGdW5jdGlvbiIsInN0dWJUcnVlIiwiZmxvd1ZhbHVlcyIsImN1cnJ5IiwibWFwIiwidmFsdWUiLCJpbmRleCIsInJ1bkNvbmRpdGlvbmFsbHkiLCJ2YWwiLCJpc1Byb21pc2UiLCJ0aGVuIiwiUHJvbWlzZSIsImFsbCIsImNhc3RBcnJheSIsImxvZyIsInZhbHMiLCJjb25zb2xlIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWOztBQUVBRCxFQUFFRSxLQUFGLENBQVE7QUFDTkMsWUFETTtBQUVOQyxrQkFGTTtBQUdOQyxrQkFITTtBQUlOQztBQUpNLENBQVI7O0FBT0EsU0FBU0gsSUFBVCxDQUFjSSxJQUFkLEVBQW9CQyxFQUFwQixFQUF3QkMsSUFBeEIsRUFBOEJDLElBQTlCLEVBQW9DO0FBQ2xDLE1BQUlDLFVBQVVDLE1BQVYsS0FBcUIsQ0FBekIsRUFBNEI7QUFDMUJaLE1BQUVhLFVBQUYsQ0FBYUosSUFBYixJQUFxQkMsT0FBTyxJQUE1QixJQUFvQ0EsT0FBT0QsSUFBUCxFQUFhQSxPQUFPVCxFQUFFYyxRQUExRDtBQUNELEdBRkQsTUFFTyxJQUFJSCxVQUFVQyxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQ2pDRixXQUFPLElBQVAsRUFBYUQsT0FBT1QsRUFBRWMsUUFBdEI7QUFDRDs7QUFFRCxNQUFJLENBQUNKLElBQUwsRUFBVztBQUNULFdBQU9ILElBQVA7QUFDRDs7QUFFRCxNQUFNUSxhQUFhZixFQUFFZ0IsS0FBRixDQUFRLFVBQUNULElBQUQsRUFBT0MsRUFBUCxFQUFXQyxJQUFYLEVBQW9CO0FBQzdDLFdBQU9ULEVBQUVpQixHQUFGLENBQU1WLElBQU4sRUFBWSxVQUFDVyxLQUFELEVBQVFDLEtBQVIsRUFBZVosSUFBZixFQUF3QjtBQUN6QyxVQUFNYSxtQkFBbUIsU0FBbkJBLGdCQUFtQjtBQUFBLGVBQU9YLEtBQUtZLEdBQUwsSUFBWWIsR0FBR2EsR0FBSCxDQUFaLEdBQXNCQSxHQUE3QjtBQUFBLE9BQXpCO0FBQ0EsYUFBT3JCLEVBQUVzQixTQUFGLENBQVlKLEtBQVosSUFBcUJBLE1BQU1LLElBQU4sQ0FBV0gsZ0JBQVgsQ0FBckIsR0FBb0RBLGlCQUFpQkYsS0FBakIsQ0FBM0Q7QUFDRCxLQUhNLENBQVA7QUFJRCxHQUxrQixDQUFuQjs7QUFPQSxTQUFPbEIsRUFBRXNCLFNBQUYsQ0FBWWYsSUFBWixJQUFvQkEsS0FBS2dCLElBQUwsQ0FBVVIsV0FBV2YsQ0FBWCxFQUFjUSxFQUFkLEVBQWtCQyxJQUFsQixDQUFWLENBQXBCLEdBQXlETSxXQUFXUixJQUFYLEVBQWlCQyxFQUFqQixFQUFxQkMsSUFBckIsQ0FBaEU7QUFDRDs7QUFFRCxTQUFTTCxPQUFULENBQWlCRyxJQUFqQixFQUF1QkMsRUFBdkIsRUFBMkJFLElBQTNCLEVBQWlDO0FBQy9CQSxTQUFPQyxVQUFVQyxNQUFWLEtBQXFCLENBQXJCLEdBQXlCRixJQUF6QixHQUFnQyxJQUF2QztBQUNBLE1BQUlBLElBQUosRUFBVTtBQUNSLFdBQU9WLEVBQUVzQixTQUFGLENBQVlmLElBQVosSUFBb0JBLEtBQUtnQixJQUFMLENBQVVmLEVBQVYsQ0FBcEIsR0FBb0NnQixRQUFRQyxHQUFSLENBQVl6QixFQUFFMEIsU0FBRixDQUFZbkIsSUFBWixDQUFaLEVBQStCZ0IsSUFBL0IsQ0FBb0NmLEVBQXBDLENBQTNDO0FBQ0Q7QUFDRCxTQUFPRCxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0YsT0FBVCxDQUFpQkUsSUFBakIsRUFBdUJDLEVBQXZCLEVBQTJCRSxJQUEzQixFQUFpQztBQUMvQk4sVUFBUUcsSUFBUixFQUFjQyxFQUFkLEVBQWtCRSxJQUFsQjtBQUNBLFNBQU9ILElBQVA7QUFDRDs7QUFFRCxTQUFTRCxPQUFULENBQWlCQyxJQUFqQixFQUF1QjtBQUNyQixNQUFNb0IsTUFBTSxTQUFOQSxHQUFNO0FBQUEsV0FBUTNCLEVBQUVpQixHQUFGLENBQU1XLElBQU4sRUFBWTtBQUFBLGFBQU81QixFQUFFc0IsU0FBRixDQUFZRCxHQUFaLElBQW1CQSxJQUFJRSxJQUFKLENBQVNNLFFBQVFGLEdBQWpCLENBQW5CLEdBQTJDRSxRQUFRRixHQUFSLENBQVlOLEdBQVosQ0FBbEQ7QUFBQSxLQUFaLENBQVI7QUFBQSxHQUFaO0FBQ0FyQixJQUFFc0IsU0FBRixDQUFZZixJQUFaLElBQW9CQSxLQUFLZ0IsSUFBTCxDQUFVSSxHQUFWLENBQXBCLEdBQXFDQSxJQUFJcEIsSUFBSixDQUFyQztBQUNBLFNBQU9BLElBQVA7QUFDRCIsImZpbGUiOiJsb2Rhc2gtZmxvdy5qcyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcblxuXy5taXhpbih7XG4gIGZsb3csXG4gIGZsb3dBbGwsXG4gIGZsb3dUYXAsXG4gIGZsb3dMb2dcbn0pO1xuXG5mdW5jdGlvbiBmbG93KGNvbGwsIGZuLCBjb25kLCB3aGVuKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgXy5pc0Z1bmN0aW9uKGNvbmQpID8gd2hlbiA9IHRydWUgOiAod2hlbiA9IGNvbmQsIGNvbmQgPSBfLnN0dWJUcnVlKTtcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgd2hlbiA9IHRydWUsIGNvbmQgPSBfLnN0dWJUcnVlO1xuICB9XG5cbiAgaWYgKCF3aGVuKSB7XG4gICAgcmV0dXJuIGNvbGw7XG4gIH1cblxuICBjb25zdCBmbG93VmFsdWVzID0gXy5jdXJyeSgoY29sbCwgZm4sIGNvbmQpID0+IHtcbiAgICByZXR1cm4gXy5tYXAoY29sbCwgKHZhbHVlLCBpbmRleCwgY29sbCkgPT4ge1xuICAgICAgY29uc3QgcnVuQ29uZGl0aW9uYWxseSA9IHZhbCA9PiBjb25kKHZhbCkgPyBmbih2YWwpIDogdmFsO1xuICAgICAgcmV0dXJuIF8uaXNQcm9taXNlKHZhbHVlKSA/IHZhbHVlLnRoZW4ocnVuQ29uZGl0aW9uYWxseSkgOiBydW5Db25kaXRpb25hbGx5KHZhbHVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIF8uaXNQcm9taXNlKGNvbGwpID8gY29sbC50aGVuKGZsb3dWYWx1ZXMoXywgZm4sIGNvbmQpKSA6IGZsb3dWYWx1ZXMoY29sbCwgZm4sIGNvbmQpO1xufVxuXG5mdW5jdGlvbiBmbG93QWxsKGNvbGwsIGZuLCB3aGVuKSB7XG4gIHdoZW4gPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gd2hlbiA6IHRydWU7XG4gIGlmICh3aGVuKSB7XG4gICAgcmV0dXJuIF8uaXNQcm9taXNlKGNvbGwpID8gY29sbC50aGVuKGZuKSA6IFByb21pc2UuYWxsKF8uY2FzdEFycmF5KGNvbGwpKS50aGVuKGZuKTtcbiAgfVxuICByZXR1cm4gY29sbDtcbn1cblxuZnVuY3Rpb24gZmxvd1RhcChjb2xsLCBmbiwgd2hlbikge1xuICBmbG93QWxsKGNvbGwsIGZuLCB3aGVuKTtcbiAgcmV0dXJuIGNvbGw7XG59XG5cbmZ1bmN0aW9uIGZsb3dMb2coY29sbCkge1xuICBjb25zdCBsb2cgPSB2YWxzID0+IF8ubWFwKHZhbHMsIHZhbCA9PiBfLmlzUHJvbWlzZSh2YWwpID8gdmFsLnRoZW4oY29uc29sZS5sb2cpIDogY29uc29sZS5sb2codmFsKSk7XG4gIF8uaXNQcm9taXNlKGNvbGwpID8gY29sbC50aGVuKGxvZykgOiBsb2coY29sbCk7XG4gIHJldHVybiBjb2xsO1xufVxuIl19 -------------------------------------------------------------------------------- /dist/utils/lodash-pipes.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | 5 | _.mixin({ 6 | flow: flow, 7 | flowAll: flowAll, 8 | flowTap: flowTap, 9 | flowLog: flowLog 10 | }); 11 | 12 | function flow(coll, fn, cond, when) { 13 | if (arguments.length === 3) { 14 | _.isFunction(cond) ? when = true : (when = cond, cond = _.stubTrue); 15 | } else if (arguments.length === 2) { 16 | when = true, cond = _.stubTrue; 17 | } 18 | 19 | if (!when) { 20 | return coll; 21 | } 22 | 23 | var flowValues = _.curry(function (coll, fn, cond) { 24 | return _.map(coll, function (value, index, coll) { 25 | var runConditionally = function runConditionally(val) { 26 | return cond(val) ? fn(val) : val; 27 | }; 28 | return _.isPromise(value) ? value.then(runConditionally) : runConditionally(value); 29 | }); 30 | }); 31 | 32 | return _.isPromise(coll) ? coll.then(flowValues(_, fn, cond)) : flowValues(coll, fn, cond); 33 | } 34 | 35 | function flowAll(coll, fn, when) { 36 | when = arguments.length === 3 ? when : true; 37 | if (when) { 38 | return _.isPromise(coll) ? coll.then(fn) : Promise.all(_.castArray(coll)).then(fn); 39 | } 40 | return coll; 41 | } 42 | 43 | function flowTap(coll, fn, when) { 44 | flowAll(coll, fn, when); 45 | return coll; 46 | } 47 | 48 | function flowLog(coll) { 49 | var log = function log(vals) { 50 | return _.map(vals, function (val) { 51 | return _.isPromise(val) ? val.then(console.log) : console.log(val); 52 | }); 53 | }; 54 | _.isPromise(coll) ? coll.then(log) : log(coll); 55 | return coll; 56 | } -------------------------------------------------------------------------------- /dist/utils/lodash-utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | 5 | _.mixin({ 6 | attemptSilent: attemptSilent, 7 | isPromise: isPromise 8 | }); 9 | 10 | function attemptSilent(fn) { 11 | for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 12 | args[_key - 1] = arguments[_key]; 13 | } 14 | 15 | var result = _.attempt.apply(_, [fn].concat(args)); 16 | if (isPromise(result)) { 17 | return result.catch(_.noop); 18 | } else if (!(result instanceof Error)) { 19 | return result; 20 | } 21 | } 22 | 23 | function isPromise(value) { 24 | return !!_.get(value, 'then'); 25 | } 26 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9sb2Rhc2gtdXRpbHMuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJtaXhpbiIsImF0dGVtcHRTaWxlbnQiLCJpc1Byb21pc2UiLCJmbiIsImFyZ3MiLCJyZXN1bHQiLCJhdHRlbXB0IiwiY2F0Y2giLCJub29wIiwiRXJyb3IiLCJ2YWx1ZSIsImdldCJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjs7QUFFQUQsRUFBRUUsS0FBRixDQUFRO0FBQ05DLDhCQURNO0FBRU5DO0FBRk0sQ0FBUjs7QUFLQSxTQUFTRCxhQUFULENBQXVCRSxFQUF2QixFQUFvQztBQUFBLG9DQUFOQyxJQUFNO0FBQU5BLFFBQU07QUFBQTs7QUFDbEMsTUFBTUMsU0FBU1AsRUFBRVEsT0FBRixXQUFVSCxFQUFWLFNBQWlCQyxJQUFqQixFQUFmO0FBQ0EsTUFBSUYsVUFBVUcsTUFBVixDQUFKLEVBQXVCO0FBQ3JCLFdBQU9BLE9BQU9FLEtBQVAsQ0FBYVQsRUFBRVUsSUFBZixDQUFQO0FBQ0QsR0FGRCxNQUlLLElBQUksRUFBRUgsa0JBQWtCSSxLQUFwQixDQUFKLEVBQWdDO0FBQ25DLFdBQU9KLE1BQVA7QUFDRDtBQUNGOztBQUVELFNBQVNILFNBQVQsQ0FBbUJRLEtBQW5CLEVBQTBCO0FBQ3hCLFNBQU8sQ0FBQyxDQUFDWixFQUFFYSxHQUFGLENBQU1ELEtBQU4sRUFBYSxNQUFiLENBQVQ7QUFDRCIsImZpbGUiOiJsb2Rhc2gtdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBfID0gcmVxdWlyZSgnbG9kYXNoJyk7XG5cbl8ubWl4aW4oe1xuICBhdHRlbXB0U2lsZW50LFxuICBpc1Byb21pc2Vcbn0pO1xuXG5mdW5jdGlvbiBhdHRlbXB0U2lsZW50KGZuLCAuLi5hcmdzKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uYXR0ZW1wdChmbiwgLi4uYXJncyk7XG4gIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgIHJldHVybiByZXN1bHQuY2F0Y2goXy5ub29wKTtcbiAgfVxuXG4gIGVsc2UgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UodmFsdWUpIHtcbiAgcmV0dXJuICEhXy5nZXQodmFsdWUsICd0aGVuJyk7XG59XG4iXX0= -------------------------------------------------------------------------------- /dist/utils/util.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var path = require('path'); 5 | 6 | module.exports = { 7 | getCompiledType: getCompiledType, 8 | getType: getType, 9 | stripIgnoredBasePath: stripIgnoredBasePath, 10 | changeExt: changeExt 11 | }; 12 | 13 | function getCompiledType(type) { 14 | // Accept an object with a 'type' property, or else assume a string 15 | type = _.get(type, 'type') || type; 16 | 17 | var typeMap = { 18 | css: ['sass', 'less', 'stylus'], 19 | js: ['coffee'] 20 | }; 21 | return _.findKey(typeMap, function (types) { 22 | return _.includes(types, type); 23 | }); 24 | } 25 | 26 | function getType(ext) { 27 | var typeMap = { 28 | js: 'js', 29 | css: 'css', 30 | scss: 'sass', 31 | less: 'less', 32 | styl: 'stylus', 33 | coffee: 'coffee' 34 | }; 35 | return typeMap[_.trimStart(ext, '.')]; 36 | } 37 | 38 | function stripIgnoredBasePath(_path, basePaths) { 39 | // Remove dots and slashes to ensure we never write above root. 40 | var trimmedPath = _.trimStart(_path, './\\'); 41 | 42 | var ignored = basePaths.find(function (base) { 43 | return _.startsWith(trimmedPath, _.trimEnd(base, './\\')); 44 | }); 45 | var ignoredLength = ignored ? (ignored + path.sep).length : 0; 46 | return trimmedPath.substring(ignoredLength); 47 | } 48 | 49 | function changeExt(file, toExt, fromExt) { 50 | var _path$parse = path.parse(file), 51 | dir = _path$parse.dir, 52 | name = _path$parse.name; 53 | 54 | return path.join(dir, (fromExt ? path.basename(file, fromExt) : name) + toExt); 55 | } 56 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlsLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwicGF0aCIsIm1vZHVsZSIsImV4cG9ydHMiLCJnZXRDb21waWxlZFR5cGUiLCJnZXRUeXBlIiwic3RyaXBJZ25vcmVkQmFzZVBhdGgiLCJjaGFuZ2VFeHQiLCJ0eXBlIiwiZ2V0IiwidHlwZU1hcCIsImNzcyIsImpzIiwiZmluZEtleSIsImluY2x1ZGVzIiwidHlwZXMiLCJleHQiLCJzY3NzIiwibGVzcyIsInN0eWwiLCJjb2ZmZWUiLCJ0cmltU3RhcnQiLCJfcGF0aCIsImJhc2VQYXRocyIsInRyaW1tZWRQYXRoIiwiaWdub3JlZCIsImZpbmQiLCJzdGFydHNXaXRoIiwidHJpbUVuZCIsImJhc2UiLCJpZ25vcmVkTGVuZ3RoIiwic2VwIiwibGVuZ3RoIiwic3Vic3RyaW5nIiwiZmlsZSIsInRvRXh0IiwiZnJvbUV4dCIsInBhcnNlIiwiZGlyIiwibmFtZSIsImpvaW4iLCJiYXNlbmFtZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLE9BQU9ELFFBQVEsTUFBUixDQUFiOztBQUVBRSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2ZDLGtDQURlO0FBRWZDLGtCQUZlO0FBR2ZDLDRDQUhlO0FBSWZDO0FBSmUsQ0FBakI7O0FBT0EsU0FBU0gsZUFBVCxDQUF5QkksSUFBekIsRUFBK0I7QUFDN0I7QUFDQUEsU0FBT1QsRUFBRVUsR0FBRixDQUFNRCxJQUFOLEVBQVksTUFBWixLQUF1QkEsSUFBOUI7O0FBRUEsTUFBTUUsVUFBVTtBQUNkQyxTQUFLLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsUUFBakIsQ0FEUztBQUVkQyxRQUFJLENBQUMsUUFBRDtBQUZVLEdBQWhCO0FBSUEsU0FBT2IsRUFBRWMsT0FBRixDQUFVSCxPQUFWLEVBQW1CO0FBQUEsV0FBU1gsRUFBRWUsUUFBRixDQUFXQyxLQUFYLEVBQWtCUCxJQUFsQixDQUFUO0FBQUEsR0FBbkIsQ0FBUDtBQUNEOztBQUVELFNBQVNILE9BQVQsQ0FBaUJXLEdBQWpCLEVBQXNCO0FBQ3BCLE1BQU1OLFVBQVU7QUFDZEUsUUFBSSxJQURVO0FBRWRELFNBQUssS0FGUztBQUdkTSxVQUFNLE1BSFE7QUFJZEMsVUFBTSxNQUpRO0FBS2RDLFVBQU0sUUFMUTtBQU1kQyxZQUFRO0FBTk0sR0FBaEI7QUFRQSxTQUFPVixRQUFRWCxFQUFFc0IsU0FBRixDQUFZTCxHQUFaLEVBQWlCLEdBQWpCLENBQVIsQ0FBUDtBQUNEOztBQUVELFNBQVNWLG9CQUFULENBQThCZ0IsS0FBOUIsRUFBcUNDLFNBQXJDLEVBQWdEO0FBQzlDO0FBQ0EsTUFBTUMsY0FBY3pCLEVBQUVzQixTQUFGLENBQVlDLEtBQVosRUFBbUIsTUFBbkIsQ0FBcEI7O0FBRUEsTUFBTUcsVUFBVUYsVUFBVUcsSUFBVixDQUFlO0FBQUEsV0FBUTNCLEVBQUU0QixVQUFGLENBQWFILFdBQWIsRUFBMEJ6QixFQUFFNkIsT0FBRixDQUFVQyxJQUFWLEVBQWdCLE1BQWhCLENBQTFCLENBQVI7QUFBQSxHQUFmLENBQWhCO0FBQ0EsTUFBTUMsZ0JBQWdCTCxVQUFVLENBQUNBLFVBQVV4QixLQUFLOEIsR0FBaEIsRUFBcUJDLE1BQS9CLEdBQXdDLENBQTlEO0FBQ0EsU0FBUVIsWUFBWVMsU0FBWixDQUFzQkgsYUFBdEIsQ0FBUjtBQUNEOztBQUVELFNBQVN2QixTQUFULENBQW1CMkIsSUFBbkIsRUFBeUJDLEtBQXpCLEVBQWdDQyxPQUFoQyxFQUF5QztBQUFBLG9CQUNuQm5DLEtBQUtvQyxLQUFMLENBQVdILElBQVgsQ0FEbUI7QUFBQSxNQUNoQ0ksR0FEZ0MsZUFDaENBLEdBRGdDO0FBQUEsTUFDM0JDLElBRDJCLGVBQzNCQSxJQUQyQjs7QUFFdkMsU0FBT3RDLEtBQUt1QyxJQUFMLENBQVVGLEdBQVYsRUFBZSxDQUFDRixVQUFVbkMsS0FBS3dDLFFBQUwsQ0FBY1AsSUFBZCxFQUFvQkUsT0FBcEIsQ0FBVixHQUF5Q0csSUFBMUMsSUFBa0RKLEtBQWpFLENBQVA7QUFDRCIsImZpbGUiOiJ1dGlsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbXBpbGVkVHlwZSxcbiAgZ2V0VHlwZSxcbiAgc3RyaXBJZ25vcmVkQmFzZVBhdGgsXG4gIGNoYW5nZUV4dFxufTtcblxuZnVuY3Rpb24gZ2V0Q29tcGlsZWRUeXBlKHR5cGUpIHtcbiAgLy8gQWNjZXB0IGFuIG9iamVjdCB3aXRoIGEgJ3R5cGUnIHByb3BlcnR5LCBvciBlbHNlIGFzc3VtZSBhIHN0cmluZ1xuICB0eXBlID0gXy5nZXQodHlwZSwgJ3R5cGUnKSB8fCB0eXBlO1xuXG4gIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgY3NzOiBbJ3Nhc3MnLCAnbGVzcycsICdzdHlsdXMnXSxcbiAgICBqczogWydjb2ZmZWUnXVxuICB9XG4gIHJldHVybiBfLmZpbmRLZXkodHlwZU1hcCwgdHlwZXMgPT4gXy5pbmNsdWRlcyh0eXBlcywgdHlwZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlKGV4dCkge1xuICBjb25zdCB0eXBlTWFwID0ge1xuICAgIGpzOiAnanMnLFxuICAgIGNzczogJ2NzcycsXG4gICAgc2NzczogJ3Nhc3MnLFxuICAgIGxlc3M6ICdsZXNzJyxcbiAgICBzdHlsOiAnc3R5bHVzJyxcbiAgICBjb2ZmZWU6ICdjb2ZmZWUnXG4gIH07XG4gIHJldHVybiB0eXBlTWFwW18udHJpbVN0YXJ0KGV4dCwgJy4nKV07XG59XG5cbmZ1bmN0aW9uIHN0cmlwSWdub3JlZEJhc2VQYXRoKF9wYXRoLCBiYXNlUGF0aHMpIHtcbiAgLy8gUmVtb3ZlIGRvdHMgYW5kIHNsYXNoZXMgdG8gZW5zdXJlIHdlIG5ldmVyIHdyaXRlIGFib3ZlIHJvb3QuXG4gIGNvbnN0IHRyaW1tZWRQYXRoID0gXy50cmltU3RhcnQoX3BhdGgsICcuL1xcXFwnKTtcblxuICBjb25zdCBpZ25vcmVkID0gYmFzZVBhdGhzLmZpbmQoYmFzZSA9PiBfLnN0YXJ0c1dpdGgodHJpbW1lZFBhdGgsIF8udHJpbUVuZChiYXNlLCAnLi9cXFxcJykpKTtcbiAgY29uc3QgaWdub3JlZExlbmd0aCA9IGlnbm9yZWQgPyAoaWdub3JlZCArIHBhdGguc2VwKS5sZW5ndGggOiAwO1xuICByZXR1cm4gIHRyaW1tZWRQYXRoLnN1YnN0cmluZyhpZ25vcmVkTGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlRXh0KGZpbGUsIHRvRXh0LCBmcm9tRXh0KSB7XG4gIGNvbnN0IHtkaXIsIG5hbWV9ID0gcGF0aC5wYXJzZShmaWxlKTtcbiAgcmV0dXJuIHBhdGguam9pbihkaXIsIChmcm9tRXh0ID8gcGF0aC5iYXNlbmFtZShmaWxlLCBmcm9tRXh0KSA6IG5hbWUpICsgdG9FeHQpO1xufVxuIl19 -------------------------------------------------------------------------------- /e2e/README.md: -------------------------------------------------------------------------------- 1 | ## Why e2e? 2 | End to end testing is the only means of testing Millwright as of this writing. The reason for this 3 | approach is twofold: 4 | 5 | 1. It's quick. 6 | 2. It's effective. 7 | 8 | Using e2e as our sole means of testing is only temporary, as we expect substantial unit test 9 | coverage before the 1.0.0 milestone. 10 | 11 | ## Overview 12 | The tests are broken down into a single directory per test case. As of this writing, the only test 13 | case is `master`, which is a sort of kitchen sink approach where we're (going to be) testing 14 | everything. Feel free to add to that test case, or create a new one if you really feel it's the best 15 | route. But keep in mind, the less crowded this directory is, the better. 16 | 17 | When each test file (`.test.js`) is run, the test case's sole `src` directory is processed 18 | by whatever command is indicated in the test file name, and a `dest-` directory is output 19 | right there in the case directory. This new output is then compared to the existing 20 | `dest--snapshot` directory. The test passes if the contents of the directories are the 21 | same. The contents of the files themselves are used for comparison. 22 | 23 | ### Test case anatomy 24 | Each test case is an individual mock project. The `src` directory is where the test is defined - it 25 | simply contains the project, with whatever files you want to include for your test case. 26 | 27 | Generally, each test case should run through the `make` and `build` commands, which is accomplished 28 | via the `.test.js` files. These files are just boilerplate, and will always have the same 29 | content. This was a quick fix to take advantage of AVA's per-file sub-processing and async/await 30 | transpiling. The actual test that we're reusing is written in `e2e/setup-src.js`, which is 31 | transpiled via `e2e/setup.js`. The test file's name is used to determine which command to run, so 32 | it's generally expected that every case will have a `make.test.js` and a `build.test.js`. 33 | 34 | Finally, every test case should have a `dest-snapshot` directory for each 35 | `.test.js` These directories are just static copies representing the exact `dest` output 36 | that we expect when the test case is run with each command, respectively. There is not yet an 37 | automated way to generate these directories. The `dest-` directories that are generated by 38 | the test suite are ignored for version control, and should not be committed. 39 | 40 | ### Writing e2e tests 41 | To update an existing case, you'll need to do the following: 42 | 43 | 1. Update the `src` directory, which is where these tests are defined. 44 | 2. Run the test (it should fail). 45 | 3. Check the generated `dest-` directories to ensure that contents are as expected. Using a 46 | diff is a good route for this. 47 | 4. If all is well, overwrite the existing `dest--snapshot` directory with the generated 48 | `dest-` directory. 49 | 50 | To create a new case: 51 | 52 | 1. Make a new directory within `e2e`. The directory name will be used as the test case name. 53 | 2. Copy the `*.test.js` files from an existing test case (they should have `build` and `make` 54 | variants). 55 | 3. Create a `src` directory, and define your mock project there. 56 | 4. Create empty `dest--snapshot` directories for each test file (again, should be `build` 57 | and `make`). 58 | 5. Follow steps 2 - 4 for updating an existing case. 59 | -------------------------------------------------------------------------------- /e2e/master/build.test.js: -------------------------------------------------------------------------------- 1 | const {test, message, cmd, compare, check} = require('../setup')(__filename); 2 | test(message, async t => (await cmd(), check(t, await compare()))); 3 | -------------------------------------------------------------------------------- /e2e/master/dest-build-snapshot/index-styles.min.css: -------------------------------------------------------------------------------- 1 | body{font-size:16px} 2 | /*# sourceMappingURL=/sourcemaps/index-styles.min.css.map */ -------------------------------------------------------------------------------- /e2e/master/dest-build-snapshot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /e2e/master/dest-build-snapshot/sourcemaps/index-styles.min.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"mappings":"AAEA,KACE,cAHc,CAIf","names":[],"sources":["/sourcemaps/styles.scss"]} -------------------------------------------------------------------------------- /e2e/master/dest-build-snapshot/sourcemaps/styles.scss: -------------------------------------------------------------------------------- 1 | $font-size: 16px; 2 | 3 | body { 4 | font-size: $font-size; 5 | } 6 | -------------------------------------------------------------------------------- /e2e/master/dest-make-snapshot/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /e2e/master/dest-make-snapshot/sourcemaps/styles.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"mappings":"AAEA,AAAA,IAAI,CAAC;EACH,SAAS,EAHC,IAAI,GAIf","names":[],"sources":["/sourcemaps/styles.scss"]} -------------------------------------------------------------------------------- /e2e/master/dest-make-snapshot/sourcemaps/styles.scss: -------------------------------------------------------------------------------- 1 | $font-size: 16px; 2 | 3 | body { 4 | font-size: $font-size; 5 | } 6 | -------------------------------------------------------------------------------- /e2e/master/dest-make-snapshot/styles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 16px; } 3 | /*# sourceMappingURL=/sourcemaps/styles.css.map */ -------------------------------------------------------------------------------- /e2e/master/make.test.js: -------------------------------------------------------------------------------- 1 | const {test, message, cmd, compare, check} = require('../setup')(__filename); 2 | test(message, async t => (await cmd(), check(t, await compare()))); 3 | -------------------------------------------------------------------------------- /e2e/master/src/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets": { 3 | "styles": [ 4 | "styles.scss" 5 | ] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /e2e/master/src/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | {[{#assets.styles}]} 3 | 4 | {[{/assets.styles}]} 5 | 6 | -------------------------------------------------------------------------------- /e2e/master/src/styles.scss: -------------------------------------------------------------------------------- 1 | $font-size: 16px; 2 | 3 | body { 4 | font-size: $font-size; 5 | } 6 | -------------------------------------------------------------------------------- /e2e/setup-src.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const test = require('ava').test; 3 | const dircompare = require('dir-compare'); 4 | const _ = require('lodash'); 5 | 6 | module.exports = setup; 7 | 8 | function setup(testPath) { 9 | const {dir: testDirFull, name: testFilename} = path.parse(testPath); 10 | const testName = path.basename(testDirFull); 11 | const cmdName = testFilename.split('.')[0]; 12 | const testDir = `e2e/${testName}`; 13 | const destDir = `${testDir}/dest-${cmdName}`; 14 | const compareDirBase = `./${destDir}`; 15 | const compareDirA = compareDirBase; 16 | const compareDirB = `${compareDirBase}-snapshot`; 17 | const compareOpts = {compareContent: true}; 18 | const message = `e2e - ${testName} - ${cmdName}`; 19 | 20 | process.env.MILL_TEST = 'TRUE'; 21 | process.env.MILL_TEST_CMD = cmdName; 22 | process.env.MILL_TEST_SRC = `${testDir}/src`; 23 | process.env.MILL_TEST_DEST = `${testDir}/dest-${cmdName}`; 24 | 25 | const cmd = require('../dist/index'); 26 | const compare = _.partial(dircompare.compare, compareDirA, compareDirB, compareOpts); 27 | const check = (t, c) => c.same ? t.pass() : t.fail(); 28 | 29 | return {test, message, cmd, compare, check}; 30 | } 31 | -------------------------------------------------------------------------------- /e2e/setup.js: -------------------------------------------------------------------------------- 1 | require('babel-register')({presets: ['es2015', 'es2016', 'es2017']}); 2 | const setup = require('./setup-src'); 3 | 4 | module.exports = setup; 5 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/millwrightjs/millwright/a4a47eedd9e2a81a5d8950a01deec4875833097a/logo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "millwright", 3 | "description": "The easiest build tool you'll ever use.", 4 | "version": "0.4.4", 5 | "homepage": "https://millwrightjs.com", 6 | "repository": "millwrightjs/millwright", 7 | "author": "Shawn Erquhart (https://github.com/erquhart)", 8 | "main": "./dist/index.js", 9 | "files": [ 10 | "dist" 11 | ], 12 | "dependencies": { 13 | "babel-core": "^6.18.2", 14 | "babel-plugin-external-helpers": "^6.22.0", 15 | "babel-preset-es2015": "^6.22.0", 16 | "babel-preset-es2016": "^6.22.0", 17 | "babel-preset-es2017": "^6.22.0", 18 | "babel-preset-react": "^6.22.0", 19 | "bluebird": "^3.4.7", 20 | "browser-sync": "^2.18.1", 21 | "chokidar": "^1.6.1", 22 | "coffee-script": "^1.10.0", 23 | "concat-with-sourcemaps": "^1.0.4", 24 | "connect-history-api-fallback": "^1.3.0", 25 | "connect-logger": "^0.0.1", 26 | "cssnano": "^3.7.5", 27 | "decache": "^4.1.0", 28 | "fs-extra": "^1.0.0", 29 | "less": "^2.7.1", 30 | "mustache": "^2.2.1", 31 | "node-sass": "^4.0.0", 32 | "path-exists": "^3.0.0", 33 | "postcss": "^5.1.2", 34 | "postcss-cssnext": "^2.8.0", 35 | "require-dir": "^0.3.1", 36 | "rollup": "^0.41.4", 37 | "rollup-plugin-babel": "^2.7.1", 38 | "rollup-plugin-commonjs": "^8.0.0", 39 | "rollup-plugin-env": "^0.21.2", 40 | "rollup-plugin-node-resolve": "^2.0.0", 41 | "rollup-plugin-replace": "^1.1.1", 42 | "stylus": "^0.54.5", 43 | "uglify-js": "^2.7.3", 44 | "yargs": "^6.4.0" 45 | }, 46 | "devDependencies": { 47 | "ava": "^0.17.0", 48 | "babel-cli": "^6.18.0", 49 | "babel-register": "^6.22.0", 50 | "dir-compare": "^1.3.0", 51 | "watch": "^1.0.1" 52 | }, 53 | "engines": { 54 | "node": ">= 4.0" 55 | }, 56 | "scripts": { 57 | "build": "babel src -d dist --presets es2015,es2016,es2017 --source-maps inline --copy-files", 58 | "watch": "watch 'npm run build && npm test' src", 59 | "test": "ava e2e/*/*.test.js" 60 | }, 61 | "license": "MIT" 62 | } 63 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs-extra'); 3 | const _ = require('lodash'); 4 | 5 | const configPath = path.join(process.cwd(), 'millwright.json'); 6 | const config = _.attemptSilent(fs.readJsonSync, configPath); 7 | 8 | const defaults = {}; 9 | defaults.defaultCommand = 'dev'; 10 | defaults.srcDir = 'src'; 11 | defaults.destDir = 'dest'; 12 | defaults.partialsDir = 'partials'; 13 | defaults.lambdasDir = 'lambdas'; 14 | defaults.assetIgnoredBasePaths = ['bower_components', 'node_modules']; 15 | defaults.templateTags = ['{[{', '}]}']; 16 | 17 | const defaultsCustom = _.assign({}, defaults, config); 18 | 19 | // Test environment overrides 20 | if (process.env.MILL_TEST === 'TRUE') { 21 | defaultsCustom.defaultCommand = process.env.MILL_TEST_CMD; 22 | defaultsCustom.srcDir = process.env.MILL_TEST_SRC; 23 | defaultsCustom.destDir = process.env.MILL_TEST_DEST; 24 | } 25 | 26 | defaultsCustom.assetIgnoredBasePaths.push(defaultsCustom.srcDir); 27 | defaultsCustom.partialsDir = path.join(defaultsCustom.srcDir, defaultsCustom.partialsDir); 28 | defaultsCustom.lambdasDir = path.join(defaultsCustom.srcDir, defaultsCustom.lambdasDir); 29 | 30 | module.exports = defaultsCustom; 31 | -------------------------------------------------------------------------------- /src/demo/import.scss: -------------------------------------------------------------------------------- 1 | $font-family: 'Roboto', sans-serif; 2 | -------------------------------------------------------------------------------- /src/demo/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "assets": { 3 | "styles": [ 4 | "https://fonts.googleapis.com/css?family=Roboto:400,700", 5 | "styles.css", 6 | "sass.scss" 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/demo/index.mustache: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | millwright.js demo 7 | 8 | 9 | {[{#assets.styles}]} 10 | 11 | {[{/assets.styles}]} 12 | 13 | 14 | 15 |
16 |

millwright.js

17 |

The easiest build tool you'll ever use.

18 |
19 |
20 |

Thanks for checking out the demo.

21 |

22 | Check out the src and dest directories to see what the project looks like, and be sure to 23 | see how the sourcemaps work in your dev tools! 24 |

25 |
26 | 27 | {[{#assets.scripts}]} 28 | 29 | {[{/assets.scripts}]} 30 | 31 | -------------------------------------------------------------------------------- /src/demo/non-processed-files-just-get-copied.txt: -------------------------------------------------------------------------------- 1 | (see title) 2 | -------------------------------------------------------------------------------- /src/demo/sass.scss: -------------------------------------------------------------------------------- 1 | // Setting the font family for the site from this Sass file. 2 | 3 | // Imports work too! 4 | @import 'import.scss'; 5 | 6 | body, 7 | button { 8 | font-family: $font-family; 9 | } 10 | -------------------------------------------------------------------------------- /src/demo/scripts.js: -------------------------------------------------------------------------------- 1 | // Use special focus styles when keyboard navigation is in use 2 | let lastEventType; 3 | const focusClass = 'js-keyboard-focus'; 4 | const links = document.getElementsByTagName('a'); 5 | const buttons = document.getElementsByTagName('button'); 6 | 7 | const blurHandler = event => { 8 | event.target.classList.remove(focusClass); 9 | event.target.removeEventListener('blur', blurHandler); 10 | }; 11 | 12 | const focusHandler = event => { 13 | if (lastEventType === 'keydown') { 14 | event.target.classList.add(focusClass); 15 | event.target.addEventListener('blur', blurHandler); 16 | } 17 | }; 18 | 19 | document.body.addEventListener('click', () => lastEventType = 'click'); 20 | document.body.addEventListener('keydown', () => lastEventType = 'keydown'); 21 | 22 | [...links, ...buttons].forEach(el => el.addEventListener('focus', focusHandler)); 23 | -------------------------------------------------------------------------------- /src/demo/styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is written using progressive syntax that doesn't work in all browsers. 3 | * CSSNext is used to transpile this down to standard CSS that works everywhere. 4 | */ 5 | 6 | @custom-media --width-xx-narrow (width >= 360px); 7 | @custom-media --width-x-narrow (width >= 480px); 8 | @custom-media --width-narrow (width >= 860px); 9 | @custom-media --width-standard (width >= 1260px); 10 | @custom-media --width-wide (width >= 1600px); 11 | @custom-media --width-x-wide (width >= 1760px); 12 | 13 | :root { 14 | --container-padding: 16px; 15 | --clearfix: { 16 | content: ''; 17 | display: table; 18 | clear: both; 19 | } 20 | --container: { 21 | padding: 0 var(--container-padding); 22 | margin: 0 auto; 23 | max-width: 1200px; 24 | 25 | @media (--width-wide) { 26 | padding: 0; 27 | } 28 | } 29 | } 30 | 31 | * { 32 | box-sizing: border-box; 33 | } 34 | 35 | body { 36 | -webkit-text-size-adjust: 100%; 37 | margin: 0 auto; 38 | max-width: 2000px; 39 | } 40 | 41 | body, 42 | button { 43 | font-size: 16px; 44 | font-variant-ligatures: no-common-ligatures; 45 | 46 | @media (--width-narrow) { 47 | font-size: 18px; 48 | } 49 | 50 | @media (--width-wide) { 51 | font-size: 20px; 52 | } 53 | } 54 | 55 | a, 56 | a:visited { 57 | color: inherit; 58 | font-weight: bold; 59 | display: inline-block; 60 | } 61 | 62 | .nowrap { 63 | white-space: nowrap; 64 | } 65 | 66 | .preserve-line { 67 | display: inline-block; 68 | } 69 | 70 | button, 71 | .button { 72 | font-weight: normal; 73 | padding: 8px; 74 | border: 4px solid #000; 75 | border-radius: 10px; 76 | display: inline-block; 77 | background: #fff; 78 | cursor: pointer; 79 | 80 | @media (--width-narrow) { 81 | padding: 12px; 82 | } 83 | 84 | &, 85 | &:visited { 86 | color: #000; 87 | text-decoration: none; 88 | } 89 | 90 | &:hover { 91 | border-width: 5px; 92 | padding: 7px; 93 | 94 | @media (--width-narrow) { 95 | border-width: 6px; 96 | padding: 10px; 97 | } 98 | } 99 | 100 | &.js-keyboard-focus:hover { 101 | border-width: 4px; 102 | padding: 12px; 103 | } 104 | } 105 | 106 | a, 107 | button, 108 | .button { 109 | position: relative; 110 | 111 | &:focus { 112 | outline: none; 113 | } 114 | 115 | &.js-keyboard-focus:focus:before { 116 | content: ""; 117 | position: absolute; 118 | top: -14px; 119 | bottom: -14px; 120 | left: -14px; 121 | right: -14px; 122 | border: 6px dashed #f00; 123 | border-radius: 16px; 124 | } 125 | } 126 | 127 | .container { 128 | @apply --container; 129 | } 130 | 131 | header { 132 | text-align: center; 133 | } 134 | 135 | .header-title { 136 | font-size: 14vw; 137 | margin-top: 80px; 138 | margin-bottom: 0; 139 | 140 | @media (--width-x-narrow) { 141 | font-size: 12vw; 142 | } 143 | 144 | @media (--width-narrow) { 145 | font-size: 11vw; 146 | margin-top: 100px; 147 | } 148 | 149 | @media (--width-standard) { 150 | font-size: 10vw; 151 | margin-top: 120px; 152 | } 153 | 154 | @media (--width-wide) { 155 | font-size: 160px; 156 | } 157 | } 158 | 159 | .header-subtitle { 160 | font-size: 24px; 161 | margin-top: 40px; 162 | 163 | @media (--width-narrow) { 164 | font-size: 28px; 165 | margin-top: 60px; 166 | } 167 | 168 | @media (--width-standard) { 169 | font-size: 32px; 170 | } 171 | 172 | @media (--width-wide) { 173 | font-size: 40px; 174 | margin-top: 80px; 175 | } 176 | } 177 | 178 | .header-link { 179 | font-size: 24px; 180 | width: 100px; 181 | margin: 10px; 182 | 183 | @media (--width-x-narrow) { 184 | width: 160px; 185 | margin: 40px 24px; 186 | } 187 | 188 | @media (--width-standard) { 189 | font-size: 28px; 190 | width: 200px; 191 | margin: 60px 32px; 192 | } 193 | 194 | @media (--width-wide) { 195 | font-size: 32px; 196 | width: 240px; 197 | margin: 80px 40px; 198 | } 199 | 200 | &.header-link-single { 201 | width: 200px; 202 | margin-bottom: 0; 203 | } 204 | } 205 | 206 | .project-description { 207 | max-width: 600px; 208 | margin-top: 80px; 209 | text-align: center; 210 | 211 | @media (--width-narrow) { 212 | max-width: 1000px; 213 | padding: 0 100px; 214 | } 215 | 216 | @media (--width-standard) { 217 | padding: 0 120px; 218 | } 219 | 220 | @media (--width-wide) { 221 | padding: 0; 222 | } 223 | 224 | & h1 { 225 | font-size: 32px; 226 | line-height: 1.3; 227 | 228 | @media (--width-narrow) { 229 | font-size: 40px; 230 | } 231 | 232 | @media (--width-wide) { 233 | font-size: 48px; 234 | } 235 | } 236 | 237 | & p { 238 | font-size: 20px; 239 | line-height: 1.4; 240 | 241 | @media (--width-narrow) { 242 | font-size: 24px; 243 | } 244 | 245 | @media (--width-wide) { 246 | font-size: 28px; 247 | } 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // TODO: remove uncaught exception logging 2 | // This is in place temporarily to ensure we at least get a stack trace on failure while the project 3 | // is in alpha. 4 | process.on('uncaughtException', e => {console.log(e); process.exit(1);}); 5 | process.on('unhandledRejection', e => {console.log(e); process.exit(1);}); 6 | 7 | require('./utils/lodash-utils'); 8 | require('./utils/lodash-flow'); 9 | const _ = require('lodash'); 10 | const argv = require('yargs').argv; 11 | const requireDir = require('require-dir'); 12 | const tasks = requireDir('./tasks', {camelcase: true}); 13 | const config = require('./config'); 14 | 15 | const realCmd = Object.keys(tasks).indexOf(argv._[0]) >= 0; 16 | const cmd = realCmd ? argv._[0] : config.defaultCommand; 17 | 18 | module.exports = tasks[cmd]; 19 | -------------------------------------------------------------------------------- /src/plugins/cache-import.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const pathExists = require('path-exists').sync; 4 | const requireDir = require('require-dir'); 5 | const plugins = requireDir('../plugins', {camelcase: true}); 6 | const cache = require('../utils/cache'); 7 | 8 | module.exports = cacheImport; 9 | 10 | function cacheImport(files) { 11 | _.forEach(files, file => { 12 | _.forEach(file.mapImports, source => { 13 | const resolved = path.resolve(source); 14 | if (pathExists(resolved)) { 15 | cache.push('deps', { 16 | src: source, 17 | srcResolved: resolved, 18 | consumer: file.srcResolved 19 | }); 20 | 21 | const cached = cache.get('files', resolved); 22 | 23 | if (cached) { 24 | cached.role = cached.role || 'import'; 25 | } else { 26 | cache.set('files', 'srcResolved', plugins.normalizeBase(source)); 27 | } 28 | } 29 | }); 30 | }); 31 | } 32 | -------------------------------------------------------------------------------- /src/plugins/concat.js: -------------------------------------------------------------------------------- 1 | const config = require('../config'); 2 | const util = require('../utils/util'); 3 | const path = require('path'); 4 | const _ = require('lodash'); 5 | const Concat = require('concat-with-sourcemaps'); 6 | 7 | module.exports = function concat(assets) { 8 | const webPaths = _(assets).map('webPath').uniq().value(); 9 | 10 | return _.reduce(webPaths, (acc, webPath) => { 11 | const group = _.filter(assets, {webPath}); 12 | return _.concat(acc, concatenate(group)); 13 | }, []); 14 | 15 | function concatenate(group) { 16 | const result = _.pick(group[0], 17 | ['dirDest', 'filenameDest', 'groupKey', 'typeDest', 'filenameDest', 'dest', 'webPath', 'sourcemapPath']); 18 | 19 | const c = new Concat(true, result.dest, '\n'); 20 | _.forEach(group, asset => { 21 | const mappedPath = util.stripIgnoredBasePath(asset.src, config.assetIgnoredBasePaths); 22 | c.add(mappedPath, asset.content, asset.map); 23 | }); 24 | 25 | result.content = c.content.toString(); 26 | result.map = c.sourceMap; 27 | 28 | return result; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/plugins/copy-source.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const bluebird = require('bluebird'); 3 | const fs = bluebird.promisifyAll(require('fs-extra')); 4 | const _ = require('lodash'); 5 | const config = require('../config'); 6 | const util = require('../utils/util'); 7 | 8 | module.exports = function copySource(file) { 9 | const promises = [copyToSourcemaps(file.src)]; 10 | 11 | if (file.map) { 12 | const parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 13 | _.forEach(parsedMap.sources, source => promises.push(copyToSourcemaps(source))); 14 | } 15 | 16 | return Promise.all(promises).then(() => file); 17 | 18 | function copyToSourcemaps(sourcePath) { 19 | const strippedSourcePath = util.stripIgnoredBasePath(sourcePath, config.assetIgnoredBasePaths); 20 | const sourcemapsPath = path.join(config.destDir, 'sourcemaps', strippedSourcePath); 21 | return _.attemptSilent(fs.copyAsync, sourcePath, sourcemapsPath, {dereference: true}); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/plugins/get-asset-content.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const cache = require('../utils/cache'); 3 | 4 | module.exports = getAssetContent; 5 | 6 | function getAssetContent(dep) { 7 | const {content, map, mapImports} = cache.get('files', dep.srcResolved); 8 | return _.assign({}, dep, {content, map, mapImports}); 9 | } 10 | -------------------------------------------------------------------------------- /src/plugins/get-web-path.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const path = require('path'); 3 | const config = require('../config'); 4 | const {getCompiledType, getType, stripIgnoredBasePath} = require('../utils/util'); 5 | 6 | module.exports = getWebPath; 7 | 8 | function getWebPath(refPath, dataFile, groupKey) { 9 | const ref = path.parse(refPath); 10 | const type = getType(ref.ext); 11 | const compiledType = getCompiledType(type); 12 | 13 | if (compiledType) { 14 | ref.ext = '.' + compiledType; 15 | ref.base = ref.name + ref.ext; 16 | } 17 | 18 | const forWrapper = dataFile.name === 'wrapper'; 19 | const basePathStripped = stripIgnoredBasePath(dataFile.dir, config.assetIgnoredBasePaths); 20 | const prefix = forWrapper ? '' : dataFile.name + '-'; 21 | const pathBase = forWrapper ? '/' + basePathStripped : ''; 22 | 23 | // Fix dest for assets that are above the src directory, such as node modules 24 | const consumerDir = path.dirname(path.relative(path.join(process.cwd(), config.srcDir), dataFile.srcResolved)); 25 | 26 | if (process.env.task === 'build') { 27 | ref.base = prefix + groupKey + '.min' + ref.ext; 28 | return '/' + path.join(consumerDir, ref.base); 29 | } else { 30 | const srcStripped = stripIgnoredBasePath(refPath, config.assetIgnoredBasePaths); 31 | const dirStripped = path.dirname(srcStripped); 32 | const uniquePathPortion = _.trimStart(path.relative(consumerDir, dirStripped), path.sep + '.'); 33 | 34 | ref.dest = path.join(path.dirname(srcStripped), ref.base); 35 | 36 | if (!dirStripped.startsWith(consumerDir)) { 37 | ref.dest = path.join(consumerDir, ref.dest); 38 | } 39 | 40 | return '/' + ref.dest; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/plugins/minify.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const postcss = require('postcss'); 3 | const cssnano = require('cssnano'); 4 | const uglifyjs = require('uglify-js'); 5 | 6 | module.exports = function minify(file) { 7 | const minified = minifiers[file.typeDest](file); 8 | return minified.then(result => _.assign(file, result)); 9 | } 10 | 11 | const minifiers = {css, js}; 12 | 13 | function css(file) { 14 | const opts = { 15 | from: file.src, 16 | to: file.src, 17 | map: { 18 | prev: file.map, 19 | inline: false, 20 | sourcesContent: false, 21 | annotation: false 22 | } 23 | }; 24 | 25 | return postcss([cssnano()]) 26 | .process(file.content, opts) 27 | .then(result => ({ 28 | content: result.css, 29 | map: result.map.toString() 30 | })); 31 | } 32 | 33 | function js(file) { 34 | const opts = { 35 | fromString: true, 36 | sourceMapUrl: false 37 | }; 38 | 39 | if (file.map) { 40 | opts.inSourceMap = _.isObject(file.map) ? file.map : JSON.parse(file.map); 41 | opts.outSourceMap = file.destFilename + '.map'; 42 | } 43 | 44 | const result = uglifyjs.minify(file.content, opts); 45 | 46 | return Promise.resolve({content: result.code, map: result.map}); 47 | } 48 | -------------------------------------------------------------------------------- /src/plugins/normalize-asset.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const config = require('../config'); 3 | const {getCompiledType, getType, stripIgnoredBasePath} = require('../utils/util'); 4 | 5 | module.exports = normalizeAsset; 6 | 7 | function normalizeAsset(ref) { 8 | ref.type = getType(ref.ext); 9 | ref.typeDest = ref.type; 10 | ref.baseDest = ref.base; 11 | const compiledType = getCompiledType(ref.type); 12 | if (compiledType) { 13 | ref.typeDest = compiledType; 14 | ref.baseDest = ref.name + '.' + ref.typeDest; 15 | } 16 | ref.isMinified = ref.isMinified || path.extname(ref.name) === '.min'; 17 | if (ref.isMinified) { 18 | ref.name = path.basename(ref.name, '.min'); 19 | } 20 | ref.basePathStripped = stripIgnoredBasePath(ref.baseDir, config.assetIgnoredBasePaths); 21 | 22 | // set dest directory 23 | ref.srcStripped = stripIgnoredBasePath(ref.src, config.assetIgnoredBasePaths); 24 | ref.dirDest = path.join(config.destDir, path.dirname(ref.srcStripped)); 25 | 26 | if (process.env.task === 'build' && !ref.isMinified) { 27 | ref.baseDest = ref.name + '.min.' + ref.typeDest; 28 | } 29 | 30 | ref.dest = path.join(ref.dirDest, ref.baseDest); 31 | ref.destResolved = path.resolve(ref.dest); 32 | 33 | return ref; 34 | } 35 | -------------------------------------------------------------------------------- /src/plugins/normalize-base.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const config = require('../config'); 3 | const {stripIgnoredBasePath} = require('../utils/util'); 4 | 5 | module.exports = normalizeBase; 6 | 7 | function normalizeBase(src) { 8 | const normalized = path.parse(src); 9 | normalized.src = src; 10 | normalized.srcResolved = path.resolve(src); 11 | normalized.dirResolved = path.dirname(normalized.srcResolved); 12 | normalized.srcStripped = stripIgnoredBasePath(src, config.assetIgnoredBasePaths); 13 | 14 | return normalized; 15 | } 16 | -------------------------------------------------------------------------------- /src/plugins/normalize-dep.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const config = require('../config'); 4 | const {getCompiledType, getType, stripIgnoredBasePath} = require('../utils/util'); 5 | 6 | module.exports = normalizeDep; 7 | 8 | function normalizeDep(ref) { 9 | ref.srcStripped = stripIgnoredBasePath(ref.src, config.assetIgnoredBasePaths); 10 | ref.dirStripped = path.dirname(ref.srcStripped); 11 | ref.baseDest = ref.base; 12 | ref.extDest = ref.ext; 13 | const type = getType(ref.ext); 14 | ref.typeDest = type; 15 | const compiledType = getCompiledType(type); 16 | if (compiledType) { 17 | ref.typeDest = compiledType; 18 | ref.extDest = '.' + ref.typeDest; 19 | ref.baseDest = ref.name + ref.extDest; 20 | } 21 | ref.isMinified = ref.isMinified || path.extname(ref.name) === '.min'; 22 | if (ref.isMinified) { 23 | ref.name = path.basename(ref.name, '.min'); 24 | } 25 | 26 | const consumerName = path.basename(ref.consumer, '.json'); 27 | const consumerDir = path.dirname(path.relative(path.join(process.cwd(), config.srcDir), ref.consumer)); 28 | const forWrapper = consumerName === 'wrapper'; 29 | 30 | ref.dest = path.join(config.destDir, ref.dirStripped, ref.baseDest); 31 | 32 | // Fix dest for assets that are above the src directory, such as node modules 33 | if (!ref.dest.startsWith(consumerDir, config.destDir.length + 1)) { 34 | ref.dest = path.join(config.destDir, consumerDir, ref.dirStripped, ref.baseDest); 35 | } 36 | 37 | ref.dirDest = path.dirname(ref.dest); 38 | 39 | ref.sourcemapPath = path.join(ref.dirStripped, ref.baseDest + '.map'); 40 | 41 | if (process.env.task === 'build') { 42 | ref.extDest = '.min.' + ref.typeDest; 43 | 44 | if (!ref.isMinified) { 45 | ref.baseDest = ref.name + ref.extDest; 46 | ref.dest = path.join(ref.dirDest, ref.base); 47 | } 48 | 49 | ref.dirDest = consumerDir; 50 | 51 | const pagePrefix = forWrapper ? '' : consumerName + '-'; 52 | const webPathPrefix = (forWrapper ? '/' : '') + ref.dirDest; 53 | 54 | ref.dirDest = path.join(config.destDir, ref.dirDest); 55 | ref.filenameDest = pagePrefix + ref.groupKey + ref.extDest; 56 | ref.dest = path.join(ref.dirDest, ref.filenameDest); 57 | ref.webPath = path.join(webPathPrefix, ref.filenameDest); 58 | ref.sourcemapPath = ref.webPath + '.map'; 59 | } 60 | 61 | return ref; 62 | } 63 | -------------------------------------------------------------------------------- /src/plugins/normalize.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const fs = require('fs-extra'); 4 | const pathExists = require('path-exists').sync; 5 | const config = require('../config'); 6 | const requireDir = require('require-dir'); 7 | const plugins = requireDir('../plugins', {camelcase: true}); 8 | const cache = require('../utils/cache'); 9 | const {getType, stripIgnoredBasePath, changeExt, getCompiledType} = require('../utils/util'); 10 | 11 | module.exports = normalize; 12 | 13 | function normalize(paths) { 14 | const task = process.env.task || 'make'; 15 | const srcDirResolved = path.resolve(config.srcDir); 16 | 17 | return _(paths) 18 | .map(src => { 19 | const normalized = plugins.normalizeBase(src); 20 | const type = _.trimStart(normalized.ext, '.'); 21 | const parentDir = normalized.dir.slice(normalized.dir.lastIndexOf(path.sep) + path.sep.length); 22 | 23 | if (type === 'mustache') { 24 | if (parentDir === 'partials') { 25 | normalized.role = 'partial'; 26 | } else if (normalized.name === 'wrapper') { 27 | normalized.role = 'wrapper'; 28 | } else { 29 | normalized.role = 'template'; 30 | normalized.dest = path.join(config.destDir, changeExt(normalized.srcStripped, '.html')); 31 | normalized.destResolved = path.resolve(normalized.dest); 32 | } 33 | } else if (type === 'js' && parentDir === 'lambdas') { 34 | normalized.role = 'lambda'; 35 | } 36 | 37 | return normalized; 38 | }) 39 | .map((file, index, files) => { 40 | if (file.role === 'wrapper') { 41 | const data = _.find(files, {srcResolved: changeExt(file.srcResolved, '.json')}); 42 | if (data) { 43 | data.role = 'data'; 44 | file.data = data.srcResolved; 45 | } 46 | } 47 | 48 | return file; 49 | }) 50 | .map((file, index, files) => { 51 | if (file.role === 'template') { 52 | const wrapper = getWrapper(file.srcResolved, files, srcDirResolved); 53 | if (wrapper) { 54 | file.wrapper = wrapper.srcResolved; 55 | file.wrapperData = wrapper.data; 56 | } 57 | const data = _.find(files, {src: changeExt(file.src, '.json')}); 58 | if (data) { 59 | data.role = 'data'; 60 | file.data = data.srcResolved; 61 | } 62 | } 63 | 64 | return file; 65 | }) 66 | .map(file => { 67 | if (file.role === 'data') { 68 | file.content = fs.readJsonSync(file.src); 69 | } 70 | return file; 71 | }) 72 | .map(file => { 73 | if (file.role === 'data' && file.content.assets) { 74 | file.content.assets = _.mapValues(file.content.assets, (group, key) => { 75 | return _(group).map(dep => { 76 | const activeAssetTypes = ['css', 'js', 'coffee', 'less', 'styl', 'sass', 'scss']; 77 | const depIsUrl = ['http://', 'https://', '//'].find(str => dep.startsWith(str)); 78 | 79 | if (depIsUrl) { 80 | return dep; 81 | } 82 | 83 | let src = path.join(file.dir, dep); 84 | 85 | // Cache non-assets as files without roles - this allows copying of arbitrary files from 86 | // above the src directory, eg. font files from the font-awesome npm package 87 | const type = path.extname(dep).slice(1); 88 | if (activeAssetTypes.indexOf(type) === -1) { 89 | const normalized = plugins.normalizeBase(src); 90 | cache.set('files', 'srcResolved', normalized); 91 | return path.join(config.destDir, normalized.srcStripped); 92 | } 93 | 94 | let ref = path.parse(src); 95 | 96 | // Swap in minified src when appropriate (and if exists) 97 | const compiledType = getCompiledType(getType(ref.ext)); 98 | if (!ref.name.endsWith('.min') && !compiledType) { 99 | const srcMinSuffix = ['.min', '-min'].find(suffix => { 100 | return pathExists(path.join(ref.dir, ref.name + suffix + ref.ext)); 101 | }); 102 | if (srcMinSuffix) { 103 | ref.isMinified = true; 104 | } 105 | if (srcMinSuffix && process.env.task === 'build') { 106 | src = path.join(ref.dir, ref.name + srcMinSuffix + ref.ext); 107 | ref = path.parse(src); 108 | ref.isMinified = true; 109 | } 110 | } 111 | 112 | ref.src = src; 113 | ref.srcResolved = path.resolve(src); 114 | ref.consumer = file.srcResolved; 115 | ref.groupKey = key; 116 | ref.role = 'asset'; 117 | cache.push('deps', ref); 118 | return plugins.getWebPath(src, file, key); 119 | }).uniq().value(); 120 | }); 121 | } 122 | return file; 123 | }) 124 | .value(); 125 | } 126 | 127 | 128 | function getWrapper(ref, files, srcRoot) { 129 | const dir = path.dirname(ref); 130 | return dir.length >= srcRoot.length && (files.find(f => { 131 | return _.isMatch(f, {role: 'wrapper', dirResolved: dir}); 132 | }) || getWrapper(dir, files, srcRoot)); 133 | } 134 | -------------------------------------------------------------------------------- /src/plugins/output-sourcemaps.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const bluebird = require('bluebird'); 3 | const fs = bluebird.promisifyAll(require('fs-extra')); 4 | const _ = require('lodash'); 5 | const config = require('../config'); 6 | 7 | module.exports = function outputSourcemaps(file) { 8 | // Get paths 9 | const mapPath = path.join(config.destDir, 'sourcemaps', file.sourcemapPath); 10 | 11 | // Append sourceMappingURL to file 12 | const mapUrl = '/' + path.relative(file.dirDest, mapPath); 13 | const mapUrlStringBase = '# sourceMappingURL=' + mapUrl; 14 | const mapUrlString = file.typeDest === 'css' ? `/*${mapUrlStringBase} */` : `//${mapUrlStringBase}`; 15 | file.content += _.endsWith(file.content, '\n') ? mapUrlString : '\n' + mapUrlString; 16 | 17 | // Rebuild sourcemap for consistency, remap sources, then output 18 | const parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 19 | const rebuiltMap = JSON.stringify(_.pick(parsedMap, 'version', 'mappings', 'names', 'sources')); 20 | const outputMap = fs.outputFileAsync(mapPath, rebuiltMap); 21 | 22 | return outputMap.then(() => file); 23 | } 24 | -------------------------------------------------------------------------------- /src/plugins/output.js: -------------------------------------------------------------------------------- 1 | const bluebird = require('bluebird'); 2 | const fs = bluebird.promisifyAll(require('fs-extra')); 3 | 4 | module.exports = function output(file) { 5 | return fs.outputFileAsync(file.dest, file.content).then(() => file); 6 | } 7 | -------------------------------------------------------------------------------- /src/plugins/read.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const bluebird = require('bluebird'); 4 | const fs = bluebird.promisifyAll(require('fs-extra')); 5 | 6 | module.exports = function read(file) { 7 | return fs.readFileAsync(file.src).then(result => { 8 | return _.assign(file, {content: result.toString()}); 9 | }); 10 | }; 11 | -------------------------------------------------------------------------------- /src/plugins/remap-sources.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const config = require('../config'); 4 | const util = require('../utils/util'); 5 | 6 | module.exports = remapSources; 7 | 8 | function remapSources(file) { 9 | const parsedMap = _.isString(file.map) ? JSON.parse(file.map) : file.map; 10 | parsedMap.sources = _.map(parsedMap.sources, source => { 11 | const strippedPath = util.stripIgnoredBasePath(source, config.assetIgnoredBasePaths); 12 | return path.join('/sourcemaps/', strippedPath); 13 | }); 14 | const map = JSON.stringify(_.pick(parsedMap, 'version', 'mappings', 'names', 'sources')); 15 | return _.assign(file, {map}); 16 | } 17 | -------------------------------------------------------------------------------- /src/plugins/static.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const fs = require('fs-extra'); 3 | const path = require('path'); 4 | const config = require('../config'); 5 | const mustache = require('mustache'); 6 | const decache = require('decache'); 7 | const {changeExt} = require('../utils/util'); 8 | const cache = require('../utils/cache'); 9 | 10 | module.exports = staticGen; 11 | 12 | let partials, lambdas; 13 | 14 | function staticGen(file, opts) { 15 | opts = _.isObject(opts) ? opts : {}; 16 | mustache.tags = config.templateTags; 17 | partials = (!partials || opts.shouldGetPartials) ? getPartials() : partials; 18 | lambdas = (!lambdas || opts.shouldGetLambdas) ? getLambdas(opts.shouldGetLambdas) : lambdas; 19 | 20 | const {src, data: dataPath, wrapperData: wrapperDataPath} = file; 21 | const wrapper = _.has(file, 'wrapper') ? fs.readFileSync(file.wrapper, 'utf8') : ''; 22 | const page = fs.readFileSync(src, 'utf8'); 23 | 24 | const dataRef = cache.get('files', dataPath); 25 | const data = _.get(dataRef, 'content'); 26 | const wrapperDataRef = cache.get('files', wrapperDataPath); 27 | const wrapperData = _.get(wrapperDataRef, 'content'); 28 | const templateData = _.assign({}, wrapperData, data, {lambdas}); 29 | 30 | if (_.has(wrapperData, 'assets') && _.has(data, 'assets')) { 31 | templateData.assets = _.mergeWith({}, wrapperData.assets, data.assets, (dest, src) => { 32 | return [dest, src].every(_.isArray) ? _.union(dest, src) : undefined; 33 | }); 34 | } 35 | 36 | const pagePartials = wrapper ? _.assign({}, partials, {page}) : partials; 37 | const result = mustache.render(wrapper || page, templateData, pagePartials); 38 | 39 | fs.outputFileSync(file.dest, result); 40 | 41 | if (data) { 42 | cache.push('deps', { 43 | src: dataRef.src, 44 | srcResolved: dataRef.srcResolved, 45 | consumer: file.srcResolved 46 | }); 47 | } 48 | 49 | if (wrapperData) { 50 | cache.push('deps', { 51 | src: wrapperDataRef.src, 52 | srcResolved: wrapperDataRef.srcResolved, 53 | consumer: file.srcResolved 54 | }); 55 | } 56 | 57 | if (wrapper) { 58 | const wrapperRef = cache.get('files', file.wrapper); 59 | cache.push('deps', { 60 | src: wrapperRef.src, 61 | srcResolved: wrapperRef.srcResolved, 62 | consumer: file.srcResolved 63 | }); 64 | } 65 | } 66 | 67 | function getPartials() { 68 | const partialFileNames = _.attemptSilent(fs.readdirSync, config.partialsDir); 69 | return _.reduce(partialFileNames, (obj, partialFileName) => { 70 | const name = path.basename(partialFileName, '.mustache'); 71 | const partialPath = path.join(config.partialsDir, partialFileName); 72 | obj[name] = fs.readFileSync(partialPath).toString(); 73 | return obj; 74 | }, {}); 75 | } 76 | 77 | function getLambdas(reload) { 78 | const lambdaFileNames = _.attemptSilent(fs.readdirSync, config.lambdasDir); 79 | return _.reduce(lambdaFileNames, (obj, lambdaFileName) => { 80 | const name = path.basename(lambdaFileName, '.js'); 81 | const modulePath = path.join(process.cwd(), config.lambdasDir, name); 82 | const mod = require(modulePath).module; 83 | 84 | if (reload) { 85 | decache(modulePath); 86 | } 87 | 88 | obj[name] = () => mod.require(modulePath).lambda; 89 | return obj; 90 | }, {}); 91 | } 92 | -------------------------------------------------------------------------------- /src/plugins/transpile.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const bluebird = require('bluebird'); 4 | const _sass = require('node-sass'); 5 | const _less = require('less'); 6 | const _stylus = require('stylus'); 7 | const _coffee = require('coffee-script'); 8 | const babel = require('babel-core'); 9 | const {rollup} = require('rollup'); 10 | const rollupBabel = require('rollup-plugin-babel'); 11 | const rollupCommonJs = require('rollup-plugin-commonjs'); 12 | const rollupNodeResolve = require('rollup-plugin-node-resolve'); 13 | const rollupEnv = require('rollup-plugin-env'); 14 | const postcss = require('postcss'); 15 | const cssnext = require('postcss-cssnext'); 16 | const config = require('../config'); 17 | 18 | module.exports = function transpile(file) { 19 | const transpiled = transpilers[file.type](file); 20 | return transpiled.then(result => _.assign(file, result)); 21 | }; 22 | 23 | const transpilers = {sass, less, stylus, coffee, js, css}; 24 | 25 | function sass(file) { 26 | return bluebird.promisify(_sass.render)({ 27 | data: file.content, 28 | file: file.src, 29 | includePaths: [file.dir], 30 | sourceMap: true, 31 | outFile: file.name, 32 | omitSourceMapUrl: true 33 | }) 34 | .then(result => ({ 35 | content: result.css.toString(), 36 | map: result.map.toString(), 37 | mapImports: _.map(result.stats.includedFiles, included => path.relative(process.cwd(), included)) 38 | })); 39 | } 40 | 41 | function less(file) { 42 | return _less.render(file.content, { 43 | filename: file.src, 44 | sourceMap: {}, 45 | paths: [file.dir] 46 | }) 47 | .then(result => ({ 48 | content: result.css.toString(), 49 | map: result.map, 50 | mapImports: result.imports 51 | })); 52 | } 53 | 54 | function stylus(file) { 55 | let result; 56 | const style = _stylus(file.content) 57 | .set('filename', file.src) 58 | .set('sourcemap', {comment: false}) 59 | .define('url', _stylus.resolver()); 60 | 61 | style.render((err, css) => { 62 | result = { 63 | content: css, 64 | map: style.sourcemap, 65 | mapImports: style.deps() 66 | }; 67 | }); 68 | 69 | return Promise.resolve(result); 70 | } 71 | 72 | function coffee(file) { 73 | const opts = { 74 | sourceMap: true, 75 | filename: file.src, 76 | sourceFiles: [file.src] 77 | }; 78 | const compiled = _coffee.compile(file.content, opts); 79 | const result = { 80 | content: compiled.js, 81 | map: compiled.v3SourceMap 82 | }; 83 | return Promise.resolve(result); 84 | } 85 | 86 | function js(file) { 87 | // TODO: unhack all the hacking 88 | const babelOpts = { 89 | filename: file.base, 90 | presets: [ 91 | ['babel-preset-es2015'], 92 | 'babel-preset-es2016', 93 | 'babel-preset-es2017', 94 | 'babel-preset-react' 95 | ], 96 | sourceMaps: true, 97 | sourceFileName: file.src, 98 | ast: false, 99 | compact: false 100 | }; 101 | 102 | const nodeResolveOpts = { 103 | browser: true, 104 | jsnext: true, 105 | main: true 106 | }; 107 | 108 | const commonJsOpts = {}; 109 | 110 | if (config.modules) { 111 | babelOpts.presets[0][1] = {modules: false}; 112 | 113 | if (config.namedExports) { 114 | Object.assign(commonJsOpts, {namedExports: config.namedExports}); 115 | } 116 | 117 | const rollupOpts = { 118 | entry: file.src, 119 | plugins: [ 120 | rollupEnv({NODE_ENV: 'production'}), 121 | rollupNodeResolve(nodeResolveOpts), 122 | 123 | // Leaving this as a working example for a react/react-router app, but 124 | // Rollup won't take Millwright forward because it can't consume modules 125 | // without configuration - manually adding namedExports is often a requirement. 126 | // Webpack's Node API is probably our only path forward. 127 | rollupCommonJs(commonJsOpts), 128 | rollupBabel(babelOpts) 129 | ] 130 | }; 131 | 132 | return rollup(rollupOpts) 133 | .then(bundle => { 134 | const result = bundle.generate({ 135 | format: config.modules === true ? 'es' : config.modules, 136 | sourceMap: true, 137 | sourceMapFile: config.srcDir 138 | }); 139 | return { 140 | content: result.code, 141 | map: result.map, 142 | mapImports: result.map.sources 143 | }; 144 | }) 145 | .catch(err => console.log(err)); 146 | } 147 | 148 | const transformed = babel.transform(file.content, babelOpts); 149 | const result = { 150 | content: transformed.code, 151 | map: transformed.map 152 | }; 153 | return Promise.resolve(result); 154 | } 155 | 156 | function css(file) { 157 | return postcss([cssnext]) 158 | .process(file.content, { 159 | from: file.src, 160 | map: { 161 | prev: file.map, 162 | inline: false, 163 | sourcesContent: false, 164 | annotation: false 165 | } 166 | }) 167 | .then(result => ({ 168 | content: result.css, 169 | map: result.map.toString() 170 | })); 171 | } 172 | -------------------------------------------------------------------------------- /src/tasks/build.js: -------------------------------------------------------------------------------- 1 | const make = require('./make'); 2 | 3 | module.exports = build; 4 | 5 | function build() { 6 | process.env.task = 'build'; 7 | return make(); 8 | } 9 | -------------------------------------------------------------------------------- /src/tasks/clean.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs-extra'); 2 | const config = require('../config'); 3 | 4 | module.exports = clean; 5 | 6 | function clean() { 7 | fs.removeSync(config.destDir); 8 | } 9 | -------------------------------------------------------------------------------- /src/tasks/demo.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs-extra'); 3 | const pathExists = require('path-exists').sync; 4 | const dev = require('./dev'); 5 | 6 | module.exports = demo; 7 | 8 | function demo() { 9 | if (pathExists('src')) { 10 | console.log(`Millwright will only output the demo project if no 'src' directory exists.`); 11 | process.exit(1); 12 | } 13 | 14 | fs.copySync(path.join(__dirname, '../demo'), 'src'); 15 | 16 | return dev(); 17 | } 18 | -------------------------------------------------------------------------------- /src/tasks/dev.js: -------------------------------------------------------------------------------- 1 | const make = require('./make'); 2 | const serve = require('./serve'); 3 | 4 | module.exports = dev; 5 | 6 | function dev() { 7 | return make().then(serve); 8 | } 9 | -------------------------------------------------------------------------------- /src/tasks/make.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const path = require('path'); 3 | const bluebird = require('bluebird'); 4 | const fs = bluebird.promisifyAll(require('fs-extra')); 5 | const clean = require('./clean'); 6 | const requireDir = require('require-dir'); 7 | const plugins = requireDir('../plugins', {camelcase: true}); 8 | const cache = require('../utils/cache'); 9 | const config = require('../config'); 10 | 11 | module.exports = make; 12 | 13 | function make(opts) { 14 | const task = process.env.task || 'make'; 15 | 16 | if (opts && opts.targeted && opts.assets) { 17 | return run(opts.assets); 18 | } 19 | 20 | cache.clear(); 21 | 22 | clean(); 23 | 24 | cache.set('files', 'srcResolved', plugins.normalize(fs.walkSync(config.srcDir))); 25 | 26 | _(cache.get('deps')) 27 | .filter({role: 'asset'}) 28 | .forEach(dep => { 29 | let asset = cache.get('files')[dep.srcResolved]; 30 | if (!asset) { 31 | asset = plugins.normalize([dep.src])[0]; 32 | cache.set('files', 'srcResolved', asset); 33 | } 34 | asset.role = 'asset'; 35 | asset.isMinified = asset.isMinified || dep.isMinified; 36 | }); 37 | 38 | // We should remove passive assets from the file cache by this point 39 | 40 | _(cache.get('files')).filter({role: 'template'}).forEach(plugins.static); 41 | 42 | 43 | return run(); 44 | 45 | function run(assets) { 46 | const transformAssets = runTransformAssets(assets || _.filter(cache.get('files'), {role: 'asset'})); 47 | 48 | return Promise.all(transformAssets) 49 | .then(() => { 50 | let deps = _.filter(cache.get('deps'), dep => dep.role === 'asset'); 51 | if (assets) { 52 | const assetSources = _.map(assets, 'srcResolved'); 53 | deps = deps.reduce((acc, dep) => { 54 | if (_.includes(assetSources, dep.srcResolved)) { 55 | acc.push(dep); 56 | } 57 | return acc; 58 | }, []); 59 | } 60 | return Promise.all(_.castArray(runGenerateDeps(deps))) 61 | }) 62 | .then(result => Promise.all(_.flatten(result))) 63 | .then(() => { 64 | return Promise.all(_.filter(assets || cache.get('files'), f => !f.role).map(asset => { 65 | const dest = path.join(config.destDir, asset.srcStripped); 66 | return fs.copyAsync(asset.src, dest); 67 | })); 68 | }); 69 | } 70 | 71 | function runTransformAssets(assets) { 72 | return _(assets) 73 | .flow(plugins.normalizeAsset, !_.get(opts, 'targeted')) 74 | .flow(plugins.read) 75 | .flow(plugins.transpile, a => !a.isMinified) 76 | .flowTap(plugins.cacheImport, a => !a.isMinified) 77 | .flow(plugins.copySource) 78 | .flow(plugins.minify, a => !a.isMinified, task === 'build') 79 | .flow(plugins.remapSources, a => a.map) 80 | .value(); 81 | } 82 | 83 | function runGenerateDeps(deps) { 84 | return _(deps) 85 | .flow(plugins.normalizeDep) 86 | .flow(plugins.getAssetContent) 87 | .flowAll(plugins.concat, task === 'build') 88 | .flow(plugins.outputSourcemaps) 89 | .flow(plugins.output) 90 | .value(); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/tasks/preview.js: -------------------------------------------------------------------------------- 1 | const build = require('./build'); 2 | const serve = require('./serve'); 3 | 4 | module.exports = preview; 5 | 6 | function preview() { 7 | return build().then(serve); 8 | } 9 | -------------------------------------------------------------------------------- /src/tasks/serve.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const _ = require('lodash'); 3 | const chokidar = require('chokidar'); 4 | const bs = require('browser-sync').create(); 5 | const logger = require('connect-logger'); 6 | const historyApiFallback = require('connect-history-api-fallback'); 7 | const config = require('../config'); 8 | const cache = require ('../utils/cache'); 9 | const make = require('./make'); 10 | const requireDir = require('require-dir'); 11 | const plugins = requireDir('../plugins', {camelcase: true}); 12 | 13 | module.exports = serve; 14 | 15 | function serve() { 16 | if (process.env.task !== 'build') { 17 | 18 | const srcDirResolved = path.resolve(config.srcDir); 19 | 20 | const aboveSrcPaths = _(cache.get('files')) 21 | .keys() 22 | .concat(_.map(cache.get('deps'), 'srcResolved')) 23 | .filter(srcResolved => !srcResolved.startsWith(srcDirResolved)) 24 | .uniq() 25 | .value(); 26 | 27 | const watchOpts = { 28 | ignoreInitial: true 29 | }; 30 | 31 | chokidar.watch([srcDirResolved, ...aboveSrcPaths], watchOpts).on('all', (event, changedPath) => { 32 | if (event !== 'change') { 33 | return make().then(() => bs.reload()); 34 | } 35 | 36 | const file = cache.get('files', changedPath); 37 | const consumers = []; 38 | const assets = []; 39 | const reloadTargets = []; 40 | var shouldMake = false; 41 | var shouldMakeAll = false; 42 | 43 | if (_.includes(['asset', 'import', 'wrapper'], file.role)) { 44 | const deps = _(cache.get('deps')) 45 | .filter({srcResolved: changedPath}) 46 | .map(dep => cache.get('files', dep.consumer)) 47 | .uniq() 48 | .value(); 49 | 50 | consumers.push(...deps); 51 | } 52 | 53 | if (file.role === 'asset') { 54 | assets.push(file); 55 | const assetConsumers = _.filter(consumers, {role: 'asset'}); 56 | assets.push(...assetConsumers); 57 | reloadTargets.push(file.destResolved); 58 | reloadTargets.push(..._.map(assetConsumers, 'destResolved')); 59 | shouldMake = true; 60 | } else if (file.role === 'import') { 61 | const assetConsumers = _.filter(consumers, {role: 'asset'}); 62 | assets.push(...assetConsumers); 63 | reloadTargets.push(..._.map(assetConsumers, 'destResolved')); 64 | shouldMake = true; 65 | } else if (file.role === 'data') { 66 | shouldMakeAll = true; 67 | } else if (file.role === 'template') { 68 | plugins.static(file); 69 | } else if (file.role === 'wrapper') { 70 | const templates = _.filter(consumers, {role: 'template'}); 71 | templates.forEach(plugins.static); 72 | } else if (_.includes(['partial', 'lambda'], file.role)) { 73 | const opts = { 74 | shouldGetPartials: file.role === 'partial', 75 | shouldGetLambdas: file.role === 'lambda' 76 | }; 77 | const templates = _.filter(cache.get('files'), {role: 'template'}); 78 | templates.forEach(template => plugins.static(template, opts)); 79 | } else { 80 | shouldMakeAll = true; 81 | } 82 | 83 | if (shouldMakeAll) { 84 | make().then(() => bs.reload()); 85 | } else if (shouldMake) { 86 | make({assets, targeted: true}).then(() => bs.reload(reloadTargets)); 87 | } else { 88 | bs.reload(); 89 | } 90 | }); 91 | } 92 | 93 | const bsMiddleware = [logger()]; 94 | 95 | if (config.spaRouting) { 96 | bsMiddleware.push(historyApiFallback()); 97 | } 98 | 99 | const bsOpts = { 100 | server: { 101 | baseDir: config.destDir, 102 | serveStaticOptions: { 103 | extensions: ['html'] 104 | } 105 | }, 106 | middleware: bsMiddleware, 107 | snippetOptions: { 108 | rule: { 109 | match: /$/, 110 | fn: function (snippet) { 111 | return snippet; 112 | } 113 | } 114 | }, 115 | notify: false, 116 | ghostMode: false 117 | }; 118 | 119 | bs.init(bsOpts); 120 | } 121 | -------------------------------------------------------------------------------- /src/utils/cache.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const fs = require('fs-extra'); 3 | const _ = require('lodash'); 4 | let cache = {}; 5 | 6 | module.exports = {get, set, push, clear}; 7 | 8 | function get(key, valueKey) { 9 | return valueKey ? cache[key][valueKey] : cache[key]; 10 | } 11 | 12 | function set(key, valueKey, values) { 13 | cache[key] = cache[key] || {}; 14 | _.forEach(_.castArray(values), val => cache[key][val[valueKey]] = val); 15 | } 16 | 17 | function push(key, values) { 18 | cache[key] = (cache[key] || []).concat(_.castArray(values)); 19 | } 20 | 21 | function clear() { 22 | cache = {}; 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/lodash-flow.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | 3 | _.mixin({ 4 | flow, 5 | flowAll, 6 | flowTap, 7 | flowLog 8 | }); 9 | 10 | function flow(coll, fn, cond, when) { 11 | if (arguments.length === 3) { 12 | _.isFunction(cond) ? when = true : (when = cond, cond = _.stubTrue); 13 | } else if (arguments.length === 2) { 14 | when = true, cond = _.stubTrue; 15 | } 16 | 17 | if (!when) { 18 | return coll; 19 | } 20 | 21 | const flowValues = _.curry((coll, fn, cond) => { 22 | return _.map(coll, (value, index, coll) => { 23 | const runConditionally = val => cond(val) ? fn(val) : val; 24 | return _.isPromise(value) ? value.then(runConditionally) : runConditionally(value); 25 | }); 26 | }); 27 | 28 | return _.isPromise(coll) ? coll.then(flowValues(_, fn, cond)) : flowValues(coll, fn, cond); 29 | } 30 | 31 | function flowAll(coll, fn, when) { 32 | when = arguments.length === 3 ? when : true; 33 | if (when) { 34 | return _.isPromise(coll) ? coll.then(fn) : Promise.all(_.castArray(coll)).then(fn); 35 | } 36 | return coll; 37 | } 38 | 39 | function flowTap(coll, fn, when) { 40 | flowAll(coll, fn, when); 41 | return coll; 42 | } 43 | 44 | function flowLog(coll) { 45 | const log = vals => _.map(vals, val => _.isPromise(val) ? val.then(console.log) : console.log(val)); 46 | _.isPromise(coll) ? coll.then(log) : log(coll); 47 | return coll; 48 | } 49 | -------------------------------------------------------------------------------- /src/utils/lodash-utils.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | 3 | _.mixin({ 4 | attemptSilent, 5 | isPromise 6 | }); 7 | 8 | function attemptSilent(fn, ...args) { 9 | const result = _.attempt(fn, ...args); 10 | if (isPromise(result)) { 11 | return result.catch(_.noop); 12 | } 13 | 14 | else if (!(result instanceof Error)) { 15 | return result; 16 | } 17 | } 18 | 19 | function isPromise(value) { 20 | return !!_.get(value, 'then'); 21 | } 22 | -------------------------------------------------------------------------------- /src/utils/util.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash'); 2 | const path = require('path'); 3 | 4 | module.exports = { 5 | getCompiledType, 6 | getType, 7 | stripIgnoredBasePath, 8 | changeExt 9 | }; 10 | 11 | function getCompiledType(type) { 12 | // Accept an object with a 'type' property, or else assume a string 13 | type = _.get(type, 'type') || type; 14 | 15 | const typeMap = { 16 | css: ['sass', 'less', 'stylus'], 17 | js: ['coffee'] 18 | } 19 | return _.findKey(typeMap, types => _.includes(types, type)); 20 | } 21 | 22 | function getType(ext) { 23 | const typeMap = { 24 | js: 'js', 25 | css: 'css', 26 | scss: 'sass', 27 | less: 'less', 28 | styl: 'stylus', 29 | coffee: 'coffee' 30 | }; 31 | return typeMap[_.trimStart(ext, '.')]; 32 | } 33 | 34 | function stripIgnoredBasePath(_path, basePaths) { 35 | // Remove dots and slashes to ensure we never write above root. 36 | const trimmedPath = _.trimStart(_path, './\\'); 37 | 38 | const ignored = basePaths.find(base => _.startsWith(trimmedPath, _.trimEnd(base, './\\'))); 39 | const ignoredLength = ignored ? (ignored + path.sep).length : 0; 40 | return trimmedPath.substring(ignoredLength); 41 | } 42 | 43 | function changeExt(file, toExt, fromExt) { 44 | const {dir, name} = path.parse(file); 45 | return path.join(dir, (fromExt ? path.basename(file, fromExt) : name) + toExt); 46 | } 47 | --------------------------------------------------------------------------------