├── .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 |
17 |
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 |
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3N0YXRpYy5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsImZzIiwicGF0aCIsImNvbmZpZyIsIm11c3RhY2hlIiwiZGVjYWNoZSIsImNoYW5nZUV4dCIsImNhY2hlIiwibW9kdWxlIiwiZXhwb3J0cyIsInN0YXRpY0dlbiIsInBhcnRpYWxzIiwibGFtYmRhcyIsImZpbGUiLCJvcHRzIiwiaXNPYmplY3QiLCJ0YWdzIiwidGVtcGxhdGVUYWdzIiwic2hvdWxkR2V0UGFydGlhbHMiLCJnZXRQYXJ0aWFscyIsInNob3VsZEdldExhbWJkYXMiLCJnZXRMYW1iZGFzIiwic3JjIiwiZGF0YVBhdGgiLCJkYXRhIiwid3JhcHBlckRhdGFQYXRoIiwid3JhcHBlckRhdGEiLCJ3cmFwcGVyIiwiaGFzIiwicmVhZEZpbGVTeW5jIiwicGFnZSIsImRhdGFSZWYiLCJnZXQiLCJ3cmFwcGVyRGF0YVJlZiIsInRlbXBsYXRlRGF0YSIsImFzc2lnbiIsImFzc2V0cyIsIm1lcmdlV2l0aCIsImRlc3QiLCJldmVyeSIsImlzQXJyYXkiLCJ1bmlvbiIsInVuZGVmaW5lZCIsInBhZ2VQYXJ0aWFscyIsInJlc3VsdCIsInJlbmRlciIsIm91dHB1dEZpbGVTeW5jIiwicHVzaCIsInNyY1Jlc29sdmVkIiwiY29uc3VtZXIiLCJ3cmFwcGVyUmVmIiwicGFydGlhbEZpbGVOYW1lcyIsImF0dGVtcHRTaWxlbnQiLCJyZWFkZGlyU3luYyIsInBhcnRpYWxzRGlyIiwicmVkdWNlIiwib2JqIiwicGFydGlhbEZpbGVOYW1lIiwibmFtZSIsImJhc2VuYW1lIiwicGFydGlhbFBhdGgiLCJqb2luIiwidG9TdHJpbmciLCJyZWxvYWQiLCJsYW1iZGFGaWxlTmFtZXMiLCJsYW1iZGFzRGlyIiwibGFtYmRhRmlsZU5hbWUiLCJtb2R1bGVQYXRoIiwicHJvY2VzcyIsImN3ZCIsIm1vZCIsImxhbWJkYSJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLEtBQUtELFFBQVEsVUFBUixDQUFYO0FBQ0EsSUFBTUUsT0FBT0YsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFdBQVIsQ0FBZjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1LLFVBQVVMLFFBQVEsU0FBUixDQUFoQjs7ZUFDb0JBLFFBQVEsZUFBUixDO0lBQWJNLFMsWUFBQUEsUzs7QUFDUCxJQUFNQyxRQUFRUCxRQUFRLGdCQUFSLENBQWQ7O0FBRUFRLE9BQU9DLE9BQVAsR0FBaUJDLFNBQWpCOztBQUVBLElBQUlDLGlCQUFKO0FBQUEsSUFBY0MsZ0JBQWQ7O0FBRUEsU0FBU0YsU0FBVCxDQUFtQkcsSUFBbkIsRUFBeUJDLElBQXpCLEVBQStCO0FBQzdCQSxTQUFPZixFQUFFZ0IsUUFBRixDQUFXRCxJQUFYLElBQW1CQSxJQUFuQixHQUEwQixFQUFqQztBQUNBVixXQUFTWSxJQUFULEdBQWdCYixPQUFPYyxZQUF2QjtBQUNBTixhQUFZLENBQUNBLFFBQUQsSUFBYUcsS0FBS0ksaUJBQW5CLEdBQXdDQyxhQUF4QyxHQUF3RFIsUUFBbkU7QUFDQUMsWUFBVyxDQUFDQSxPQUFELElBQVlFLEtBQUtNLGdCQUFsQixHQUFzQ0MsV0FBV1AsS0FBS00sZ0JBQWhCLENBQXRDLEdBQTBFUixPQUFwRjs7QUFKNkIsTUFNdEJVLEdBTnNCLEdBTStCVCxJQU4vQixDQU10QlMsR0FOc0I7QUFBQSxNQU1YQyxRQU5XLEdBTStCVixJQU4vQixDQU1qQlcsSUFOaUI7QUFBQSxNQU1ZQyxlQU5aLEdBTStCWixJQU4vQixDQU1EYSxXQU5DOztBQU83QixNQUFNQyxVQUFVNUIsRUFBRTZCLEdBQUYsQ0FBTWYsSUFBTixFQUFZLFNBQVosSUFBeUJaLEdBQUc0QixZQUFILENBQWdCaEIsS0FBS2MsT0FBckIsRUFBOEIsTUFBOUIsQ0FBekIsR0FBaUUsRUFBakY7QUFDQSxNQUFNRyxPQUFPN0IsR0FBRzRCLFlBQUgsQ0FBZ0JQLEdBQWhCLEVBQXFCLE1BQXJCLENBQWI7O0FBRUEsTUFBTVMsVUFBVXhCLE1BQU15QixHQUFOLENBQVUsT0FBVixFQUFtQlQsUUFBbkIsQ0FBaEI7QUFDQSxNQUFNQyxPQUFPekIsRUFBRWlDLEdBQUYsQ0FBTUQsT0FBTixFQUFlLFNBQWYsQ0FBYjtBQUNBLE1BQU1FLGlCQUFpQjFCLE1BQU15QixHQUFOLENBQVUsT0FBVixFQUFtQlAsZUFBbkIsQ0FBdkI7QUFDQSxNQUFNQyxjQUFjM0IsRUFBRWlDLEdBQUYsQ0FBTUMsY0FBTixFQUFzQixTQUF0QixDQUFwQjtBQUNBLE1BQU1DLGVBQWVuQyxFQUFFb0MsTUFBRixDQUFTLEVBQVQsRUFBYVQsV0FBYixFQUEwQkYsSUFBMUIsRUFBZ0MsRUFBQ1osZ0JBQUQsRUFBaEMsQ0FBckI7O0FBRUEsTUFBSWIsRUFBRTZCLEdBQUYsQ0FBTUYsV0FBTixFQUFtQixRQUFuQixLQUFnQzNCLEVBQUU2QixHQUFGLENBQU1KLElBQU4sRUFBWSxRQUFaLENBQXBDLEVBQTJEO0FBQ3pEVSxpQkFBYUUsTUFBYixHQUFzQnJDLEVBQUVzQyxTQUFGLENBQVksRUFBWixFQUFnQlgsWUFBWVUsTUFBNUIsRUFBb0NaLEtBQUtZLE1BQXpDLEVBQWlELFVBQUNFLElBQUQsRUFBT2hCLEdBQVAsRUFBZTtBQUNwRixhQUFPLENBQUNnQixJQUFELEVBQU9oQixHQUFQLEVBQVlpQixLQUFaLENBQWtCeEMsRUFBRXlDLE9BQXBCLElBQStCekMsRUFBRTBDLEtBQUYsQ0FBUUgsSUFBUixFQUFjaEIsR0FBZCxDQUEvQixHQUFvRG9CLFNBQTNEO0FBQ0QsS0FGcUIsQ0FBdEI7QUFHRDs7QUFFRCxNQUFNQyxlQUFlaEIsVUFBVTVCLEVBQUVvQyxNQUFGLENBQVMsRUFBVCxFQUFheEIsUUFBYixFQUF1QixFQUFDbUIsVUFBRCxFQUF2QixDQUFWLEdBQTJDbkIsUUFBaEU7QUFDQSxNQUFNaUMsU0FBU3hDLFNBQVN5QyxNQUFULENBQWdCbEIsV0FBV0csSUFBM0IsRUFBaUNJLFlBQWpDLEVBQStDUyxZQUEvQyxDQUFmOztBQUVBMUMsS0FBRzZDLGNBQUgsQ0FBa0JqQyxLQUFLeUIsSUFBdkIsRUFBNkJNLE1BQTdCOztBQUVBLE1BQUlwQixJQUFKLEVBQVU7QUFDUmpCLFVBQU13QyxJQUFOLENBQVcsTUFBWCxFQUFtQjtBQUNqQnpCLFdBQUtTLFFBQVFULEdBREk7QUFFakIwQixtQkFBYWpCLFFBQVFpQixXQUZKO0FBR2pCQyxnQkFBVXBDLEtBQUttQztBQUhFLEtBQW5CO0FBS0Q7O0FBRUQsTUFBSXRCLFdBQUosRUFBaUI7QUFDZm5CLFVBQU13QyxJQUFOLENBQVcsTUFBWCxFQUFtQjtBQUNqQnpCLFdBQUtXLGVBQWVYLEdBREg7QUFFakIwQixtQkFBYWYsZUFBZWUsV0FGWDtBQUdqQkMsZ0JBQVVwQyxLQUFLbUM7QUFIRSxLQUFuQjtBQUtEOztBQUVELE1BQUlyQixPQUFKLEVBQWE7QUFDWCxRQUFNdUIsYUFBYTNDLE1BQU15QixHQUFOLENBQVUsT0FBVixFQUFtQm5CLEtBQUtjLE9BQXhCLENBQW5CO0FBQ0FwQixVQUFNd0MsSUFBTixDQUFXLE1BQVgsRUFBbUI7QUFDakJ6QixXQUFLNEIsV0FBVzVCLEdBREM7QUFFakIwQixtQkFBYUUsV0FBV0YsV0FGUDtBQUdqQkMsZ0JBQVVwQyxLQUFLbUM7QUFIRSxLQUFuQjtBQUtEO0FBQ0Y7O0FBRUQsU0FBUzdCLFdBQVQsR0FBdUI7QUFDckIsTUFBTWdDLG1CQUFtQnBELEVBQUVxRCxhQUFGLENBQWdCbkQsR0FBR29ELFdBQW5CLEVBQWdDbEQsT0FBT21ELFdBQXZDLENBQXpCO0FBQ0EsU0FBT3ZELEVBQUV3RCxNQUFGLENBQVNKLGdCQUFULEVBQTJCLFVBQUNLLEdBQUQsRUFBTUMsZUFBTixFQUEwQjtBQUMxRCxRQUFNQyxPQUFPeEQsS0FBS3lELFFBQUwsQ0FBY0YsZUFBZCxFQUErQixXQUEvQixDQUFiO0FBQ0EsUUFBTUcsY0FBYzFELEtBQUsyRCxJQUFMLENBQVUxRCxPQUFPbUQsV0FBakIsRUFBOEJHLGVBQTlCLENBQXBCO0FBQ0FELFFBQUlFLElBQUosSUFBWXpELEdBQUc0QixZQUFILENBQWdCK0IsV0FBaEIsRUFBNkJFLFFBQTdCLEVBQVo7QUFDQSxXQUFPTixHQUFQO0FBQ0QsR0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1EOztBQUVELFNBQVNuQyxVQUFULENBQW9CMEMsTUFBcEIsRUFBNEI7QUFDMUIsTUFBTUMsa0JBQWtCakUsRUFBRXFELGFBQUYsQ0FBZ0JuRCxHQUFHb0QsV0FBbkIsRUFBZ0NsRCxPQUFPOEQsVUFBdkMsQ0FBeEI7QUFDQSxTQUFPbEUsRUFBRXdELE1BQUYsQ0FBU1MsZUFBVCxFQUEwQixVQUFDUixHQUFELEVBQU1VLGNBQU4sRUFBeUI7QUFDeEQsUUFBTVIsT0FBT3hELEtBQUt5RCxRQUFMLENBQWNPLGNBQWQsRUFBOEIsS0FBOUIsQ0FBYjtBQUNBLFFBQU1DLGFBQWFqRSxLQUFLMkQsSUFBTCxDQUFVTyxRQUFRQyxHQUFSLEVBQVYsRUFBeUJsRSxPQUFPOEQsVUFBaEMsRUFBNENQLElBQTVDLENBQW5CO0FBQ0EsUUFBTVksTUFBTXRFLFFBQVFtRSxVQUFSLEVBQW9CM0QsTUFBaEM7O0FBRUEsUUFBSXVELE1BQUosRUFBWTtBQUNWMUQsY0FBUThELFVBQVI7QUFDRDs7QUFFRFgsUUFBSUUsSUFBSixJQUFZO0FBQUEsYUFBTVksSUFBSXRFLE9BQUosQ0FBWW1FLFVBQVosRUFBd0JJLE1BQTlCO0FBQUEsS0FBWjtBQUNBLFdBQU9mLEdBQVA7QUFDRCxHQVhNLEVBV0osRUFYSSxDQUFQO0FBWUQiLCJmaWxlIjoic3RhdGljLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcy1leHRyYScpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NvbmZpZycpO1xuY29uc3QgbXVzdGFjaGUgPSByZXF1aXJlKCdtdXN0YWNoZScpO1xuY29uc3QgZGVjYWNoZSA9IHJlcXVpcmUoJ2RlY2FjaGUnKTtcbmNvbnN0IHtjaGFuZ2VFeHR9ID0gcmVxdWlyZSgnLi4vdXRpbHMvdXRpbCcpO1xuY29uc3QgY2FjaGUgPSByZXF1aXJlKCcuLi91dGlscy9jYWNoZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHN0YXRpY0dlbjtcblxubGV0IHBhcnRpYWxzLCBsYW1iZGFzO1xuXG5mdW5jdGlvbiBzdGF0aWNHZW4oZmlsZSwgb3B0cykge1xuICBvcHRzID0gXy5pc09iamVjdChvcHRzKSA/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 |
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 |
--------------------------------------------------------------------------------