├── .bundle └── config ├── .gitignore ├── .nvmrc ├── .ruby-gemset ├── .ruby-version ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── README.md ├── bower.json ├── cli.js ├── index.js ├── lib ├── ruby-info.js └── sassc-include-args.js ├── package-lock.json ├── package.json └── test ├── prepare.sh ├── ruby-system └── docker-compose.yml ├── test.js └── test_sassc-include-args.js /.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_PATH: "vendor/bundle" 3 | BUNDLE_DISABLE_SHARED_GEMS: "true" 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Bower 30 | bower_components 31 | 32 | # Ruby Bundler 33 | vendor 34 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v5.3.0 2 | -------------------------------------------------------------------------------- /.ruby-gemset: -------------------------------------------------------------------------------- 1 | sass-include-paths 2 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.5.5 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'toolkit', '~> 2.9' 4 | gem 'modular-scale', '~> 2.1', '>= 2.1.1' 5 | gem 'shevy', '~> 2.1.0' 6 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | chunky_png (1.3.5) 5 | compass (1.0.3) 6 | chunky_png (~> 1.2) 7 | compass-core (~> 1.0.2) 8 | compass-import-once (~> 1.0.5) 9 | rb-fsevent (>= 0.9.3) 10 | rb-inotify (>= 0.9) 11 | sass (>= 3.3.13, < 3.5) 12 | compass-core (1.0.3) 13 | multi_json (~> 1.0) 14 | sass (>= 3.3.0, < 3.5) 15 | compass-import-once (1.0.5) 16 | sass (>= 3.2, < 3.5) 17 | ffi (1.9.24) 18 | modular-scale (2.1.1) 19 | compass (>= 0.12.0) 20 | multi_json (1.11.2) 21 | rb-fsevent (0.9.6) 22 | rb-inotify (0.9.5) 23 | ffi (>= 0.5.0) 24 | sass (3.4.19) 25 | shevy (2.1.0) 26 | toolkit (2.9.0) 27 | sass (~> 3.3) 28 | 29 | PLATFORMS 30 | ruby 31 | 32 | DEPENDENCIES 33 | modular-scale (~> 2.1, >= 2.1.1) 34 | shevy (~> 2.1.0) 35 | toolkit (~> 2.9) 36 | 37 | BUNDLED WITH 38 | 2.0.1 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 strarsis 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 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # sass-include-paths 2 | Generates include paths for node-sass for packages from popular package managers like npm, bower, ruby gem, ruby bundler. 3 | 4 | [![david](https://david-dm.org/strarsis/sass-include-paths.svg)](https://david-dm.org/strarsis/sass-include-paths) 5 | 6 | [![NPM](https://nodei.co/npm/sass-include-paths.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/sass-include-paths/) 7 | 8 | The generated array with the include paths can be passed to node-sass. 9 | 10 | Allows interoperability between sass variants, ruby sass, libsass and sass-eyeglass (libsass + eyeglass) 11 | 12 | 13 | Async/Sync 14 | ---------- 15 | This module offers an async and a sync version of each function. 16 | The async version returns a thenable (Promise based) for easier chaining. 17 | The sync version is intended for being used in tools like Gulp where this doesn't matter in a task. 18 | 19 | 20 | Methods 21 | ------- 22 | 23 | ### node modules 24 | For node modules that contain SCSS/SASS files. 25 | 26 | #### nodeModulesSync() 27 | Sync version, returns the array directly. 28 | 29 | #### nodeModules() 30 | Async version, returns a theneable. 31 | 32 | 33 | 34 | ### bower components 35 | For bower components that contain SCSS/SASS files. 36 | 37 | #### bowerComponentsSync() 38 | Sync version, returns the array directly. 39 | 40 | #### bowerComponents() 41 | Async version, returns a theneable. 42 | 43 | 44 | 45 | ### bundled ruby gems 46 | For bundled ruby gems installed in folder by bundler (default is ./vendor/bundle) that contain SCSS/SASS files. 47 | 48 | #### rubyGemsBundleSync() 49 | Sync version, returns the array directly. 50 | 51 | #### rubyGemsBundle() 52 | Async version, returns a theneable. 53 | 54 | 55 | 56 | ### system/global ruby gems 57 | For ruby gems installed on current (activated/available) ruby environment (system/globally installed gems) that contain SCSS/SASS files. 58 | 59 | #### rubyGemsSync() 60 | Sync version, returns the array directly. 61 | 62 | #### rubyGems() 63 | Async version, returns a theneable. 64 | 65 | 66 | 67 | Usage 68 | ----- 69 | 70 | Require this module and optionally define an array of include paths, 71 | either empty or already with some paths to include: 72 | ```javascript 73 | var sassIncl = require('sass-include-paths'), 74 | scssIncludePaths = []; 75 | ```` 76 | 77 | When the module functions are invoked outside the task scope, 78 | the scan is run only once when gulp is started, notably when using gulp-watch. 79 | This spares extra scans each time workspace files are changed. 80 | When packages, gems or bower components are changed, gulp watch has to be restarted for a rescan. 81 | 82 | 83 | For importing sass/scss files from sass/eyeglass npm packages... 84 | #### using gulp-ruby-sass (ruby sass) 85 | ```javascript 86 | [...] 87 | scssIncludePaths = [] // additional include paths 88 | .concat(sassIncl.nodeModulesSync()); 89 | [...] 90 | rubySass(srcAssets.scss + '/*.scss', { 91 | loadPath: scssIncludePaths 92 | }) 93 | [...] 94 | ```` 95 | As gulp-ruby-sass (ruby-sass) already imports sass/scss files from ruby gems 96 | (autorequired by Gemfile or explicitly required in compass config.rb or elsewhere), 97 | there is no need to pass paths to these, too. 98 | 99 | 100 | For importing sass/scss files from plain or eyeglass npm packges and from ruby gems and local bundle... 101 | #### using gulp-sass (plain libsass) 102 | ```javascript 103 | [...] 104 | scssIncludePaths = [] // additional include paths 105 | .concat(sassIncl.nodeModulesSync()) 106 | .concat(sassIncl.rubyGemsSync()) 107 | .concat(sassIncl.rubyGemsBundleSync()); 108 | [...] 109 | .pipe(plugins.sass({ 110 | includePaths: scssIncludePaths 111 | })) 112 | [...] 113 | ```` 114 | One could argue using a custom importer for node-sass instead, but currently there are no custom importers 115 | that scan node_modules/ because in most opinions this should be handled by eyeglass (libsass + eyeglass) instead, 116 | however, even using eyeglass, there is still an use case (see further below). 117 | 118 | 119 | For importing sass/scss files from plain npm packages and from ruby gems and local bundle... 120 | #### using eyeglass (libsass + eyeglass) 121 | ```javascript 122 | [...] 123 | // Outside the gulp task 124 | scssIncludePaths = [] // additional include paths 125 | .concat(sassIncl.nodeModulesSync()) 126 | .concat(sassIncl.rubyGemsSync()) 127 | .concat(sassIncl.rubyGemsBundleSync()): 128 | [...] 129 | var eyeglass = new Eyeglass({ 130 | includePaths: scssIncludePaths 131 | }); 132 | [...] 133 | ```` 134 | One use case to also add node_module paths when using eyeglass 135 | is to be able to import npm packages that haven't been made eyeglass-ready yet. 136 | Though it may work fine using this module, please still consider creating an issue 137 | to inform the package creator that eyeglass metadata is still missing for the package. 138 | 139 | 140 | ### CLI/sassc usage 141 | A cli wrapper comes with this module which can generate the list of include paths to be used on cli. 142 | For sassc-compatible options output, pass the --sassc switch. 143 | Example: 144 | ```` 145 | $ npm install -g sass-include-paths 146 | $ sassc $(sassIncludePaths --sassc --node_modules --bower_components) [...] 147 | ```` 148 | Note: `$(...)` executes the command and re-uses its stdout. 149 | 150 | 151 | 152 | 153 | Development 154 | ----------- 155 | In order to run the tests, npm, bower and ruby gem/bundler have to be available. 156 | bower will be installed as development dependency of this package. 157 | For consistent tests, the ruby and node versions have been locked using rvm/nvm config files, 158 | so both or similar tools have to be installed to ensure the right versions and isolation. 159 | 160 | ./test/prepare.sh can be run after `npm install` for quickly installing the bower dependencies and ruby bundle. 161 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sass-include-paths", 3 | "description": "Generates include paths for node-sass for packages from popular package managers like npm, bower, ruby gem, ruby bundler.", 4 | "main": "index.js", 5 | "authors": [ 6 | "strarsis " 7 | ], 8 | "license": "MIT", 9 | "moduleType": [], 10 | "homepage": "https://github.com/strarsis/sass-include-paths", 11 | "ignore": [ 12 | "**/.*", 13 | "node_modules", 14 | "bower_components", 15 | "test", 16 | "tests" 17 | ], 18 | "dependencies": {}, 19 | "devDependencies": { 20 | "modular-scale": "~2.1.1", 21 | "sass-toolkit": "~2.9.0", 22 | "Scut": "scut#^1.3.1", 23 | "bootstrap-sass": "^3.3.6", 24 | "font-awesome": "^4.5.0", 25 | "normalize-scss": "^3.0.3", 26 | "sass-mq": "^3.2.9", 27 | "neutroncss": "^0.9.2", 28 | "sass-flex-mixin": "^1.0.3", 29 | "shevy": "^2.1.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | 4 | var Promise = require('bluebird'), 5 | flatten = require('array-flatten'), 6 | yargs = require('yargs'), 7 | sassIncludePaths = require('./'), 8 | sasscIncludeArgs = require('./lib/sassc-include-args'); 9 | 10 | var argv = yargs 11 | 12 | .alias('v', 'version') 13 | .version(function() { return require('./package').version; }) 14 | 15 | .boolean('node_modules') 16 | .boolean('bower_components') 17 | .boolean('ruby-gems-bundle') 18 | .boolean('ruby-gems-system') 19 | .boolean('sassc') 20 | 21 | .argv; 22 | 23 | if(!argv['node_modules'] && 24 | !argv['bower_components'] && 25 | !argv['ruby-gems-bundle'] && 26 | !argv['ruby-gems-system']) { 27 | console.error('Warning: No include path sources selected by user.'); 28 | console.error('--sassc, --node_modules, --bower_components, --ruby-gems-bundle, --ruby-gems-system'); 29 | } 30 | 31 | 32 | var getIncludePaths = []; 33 | if(argv['node_modules']) { 34 | getIncludePaths.push(sassIncludePaths.nodeModules()); 35 | } 36 | if(argv['bower_components']) { 37 | getIncludePaths.push(sassIncludePaths.bowerComponents()); 38 | } 39 | if(argv['ruby-gems-bundle']) { 40 | getIncludePaths.push(sassIncludePaths.rubyGemsBundle()); 41 | } 42 | if(argv['ruby-gems-system']) { 43 | getIncludePaths.push(sassIncludePaths.rubyGemsSystem()); 44 | } 45 | 46 | 47 | Promise.all(getIncludePaths) 48 | .then(function(gotIncludePaths) { 49 | return flatten(gotIncludePaths); 50 | }) 51 | .then(function(includePaths) { 52 | if(includePaths.length == 0) { 53 | console.error('Warning: No include paths were found/passed!'); 54 | } 55 | 56 | if(argv.sassc) { 57 | console.log(sasscIncludeArgs(includePaths)); 58 | return; 59 | } 60 | console.log(includePaths); 61 | }); 62 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('es6-shim'); // Object.assign (node 0.12.0) 4 | 5 | var path = require('path'), 6 | uniq = require('uniq'), 7 | glob = require('glob'), 8 | globSync = glob.sync, 9 | Promise = require('bluebird'), 10 | globAsync = Promise.promisify(glob), 11 | rubyInfo = require('./lib/ruby-info'); 12 | 13 | 14 | var _opts = function(opts, defaults) { 15 | var args = Object.assign(defaults, opts); 16 | if( args.absolute === undefined) { args.absolute = defaults.absolute; } 17 | if(!args.basePath) { args.basePath = defaults.basePath; } 18 | if( args.absolute) { args.basePath = path.join(__dirname, args.basePath); } 19 | return args; 20 | }; 21 | 22 | 23 | var sassFoldersGlobStr = '{stylesheets,sass,core}'; 24 | var sassLibFoldersGlobStr = '{stylesheets,sass,core,lib,dist,assets/{sass,stylesheets},scss}'; 25 | var sassFilesGlobStr = '*.{sass,scss}'; 26 | var sassGemsGlobStr = path.join('gems/*', sassFoldersGlobStr); 27 | 28 | var _nodeModulesGlobStr = function(opts) { 29 | var args = _opts(opts, {basePath: './node_modules', absolute: false}); 30 | // in some rare cases the styles are directly inside the module folder 31 | var globStr1 = path.join(args.basePath, '*', sassFilesGlobStr); 32 | var globStr2 = path.join(args.basePath, '*', sassLibFoldersGlobStr, sassFilesGlobStr); 33 | var globStr = '{' + [ globStr1, globStr2 ].join(',') + '}'; 34 | return globStr; 35 | }; 36 | var nodeModules = function(opts) { 37 | return globAsync(_nodeModulesGlobStr(opts), {}) 38 | .then(function(scssNodePaths) { 39 | var scssNodePathsDirs = uniq(scssNodePaths.map(path.dirname)); 40 | return scssNodePathsDirs; 41 | }); 42 | }; 43 | var nodeModulesSync = function(opts) { 44 | var scssNodePaths = globSync(_nodeModulesGlobStr(opts), {}); 45 | var scssNodePathsDirs = uniq(scssNodePaths.map(path.dirname)); 46 | return scssNodePathsDirs; 47 | }; 48 | 49 | 50 | var _rubyGemsBundleGlobStr = function(opts) { 51 | var args = _opts(opts, {basePath: './vendor/bundle', absolute: false}); 52 | var globStr = path.join(args.basePath, 'ruby/*', sassGemsGlobStr); 53 | return globStr; 54 | }; 55 | var rubyGemsBundle = function(opts) { 56 | return globAsync(_rubyGemsBundleGlobStr(opts), {}); 57 | }; 58 | var rubyGemsBundleSync = function(opts) { 59 | return globSync(_rubyGemsBundleGlobStr(opts), {}); 60 | }; 61 | 62 | 63 | var _bowerComponentsGlobStr = function(opts) { 64 | var args = _opts(opts, {basePath: './bower_components', absolute: false}); 65 | // in some cases the styles are directly inside the module folder 66 | var globStr1 = path.join(args.basePath, '*', sassFilesGlobStr); 67 | var globStr2 = path.join(args.basePath, '*', sassLibFoldersGlobStr, sassFilesGlobStr); 68 | var globStr = '{' + [ globStr1, globStr2 ].join(',') + '}'; 69 | return globStr; 70 | }; 71 | var bowerComponents = function(opts) { 72 | return globAsync(_bowerComponentsGlobStr(opts), {}) 73 | .then(function(scssBowerPaths) { 74 | var scssBowerPathsDirs = uniq(scssBowerPaths.map(path.dirname)); 75 | return scssBowerPathsDirs; 76 | }); 77 | }; 78 | var bowerComponentsSync = function(opts) { 79 | var scssBowerPaths = globSync(_bowerComponentsGlobStr(opts), {}); 80 | var scssBowerPathsDirs = uniq(scssBowerPaths.map(path.dirname)); 81 | return scssBowerPathsDirs; 82 | }; 83 | 84 | 85 | // always uses absolute paths and determined base path (system installed) 86 | var _rubyGemsGlobStr = function(gemPaths) { 87 | var globStr = 88 | '{' + 89 | gemPaths.map(function(gemPath){ 90 | return path.join(gemPath, sassGemsGlobStr); 91 | }).join(',') + 92 | '}'; 93 | return globStr; 94 | }; 95 | var rubyGems = function(cb) { 96 | return rubyInfo.gemPathsAsync() 97 | .then(function(gemPaths) { 98 | return globAsync(_rubyGemsGlobStr(gemPaths), {}); 99 | }); 100 | }; 101 | var rubyGemsSync = function() { 102 | var gemPaths = rubyInfo.gemPathsSync(); 103 | return globSync(_rubyGemsGlobStr(gemPaths), {}); 104 | }; 105 | 106 | 107 | module.exports.nodeModules = nodeModules; 108 | module.exports.nodeModulesSync = nodeModulesSync; 109 | 110 | module.exports.rubyGems = rubyGems; 111 | module.exports.rubyGemsSync = rubyGemsSync; 112 | 113 | module.exports.rubyGemsBundle = rubyGemsBundle; 114 | module.exports.rubyGemsBundleSync = rubyGemsBundleSync; 115 | 116 | module.exports.bowerComponents = bowerComponents; 117 | module.exports.bowerComponentsSync = bowerComponentsSync; 118 | -------------------------------------------------------------------------------- /lib/ruby-info.js: -------------------------------------------------------------------------------- 1 | var Promise = require('bluebird'), 2 | syncExec = require('sync-exec'), 3 | execAsync = Promise.promisify(require('child_process').exec); 4 | 5 | var _runCmdSync = function(cmd) { 6 | var child = syncExec(cmd); 7 | if(child.status != 0) { 8 | throw Error('`' + cmd + '` failed with status ' + child.status + ': ', child.stderr); 9 | } 10 | return child; 11 | }; 12 | 13 | var rubyInfo = { 14 | getGempath: function(cb) { 15 | var child = execAsync('gem env gempath') 16 | .then(function (stdout, stderr) { 17 | cb(undefined, stdout); 18 | return; 19 | }) 20 | .catch(function(err){ 21 | cb(error, undefined); 22 | return; 23 | }); 24 | return; 25 | }, 26 | getGempathSync: function() { 27 | return _runCmdSync('gem env gempath').stdout; 28 | } 29 | }; 30 | rubyInfo.getGempathAsync = Promise.promisify(rubyInfo.getGempath); 31 | 32 | var _trim = function(s){return s.trim();} 33 | var _gemPaths = function(cb) { 34 | return rubyInfo.getGempathAsync() 35 | .then(function(gemPath) { 36 | var gemPaths = gemPath.split(':').map(_trim); 37 | cb(undefined, gemPaths); 38 | return; 39 | }); 40 | }; 41 | rubyInfo.gemPathsAsync = Promise.promisify(_gemPaths); 42 | rubyInfo.gemPathsSync = function() { 43 | return rubyInfo.getGempathSync() 44 | .split(':').map(_trim); 45 | }; 46 | 47 | module.exports = rubyInfo; 48 | -------------------------------------------------------------------------------- /lib/sassc-include-args.js: -------------------------------------------------------------------------------- 1 | const includeKeyShort = '-I'; 2 | module.exports = function(includePaths) { 3 | if(!Array.isArray(includePaths)) { 4 | throw Error('Argument is not an Array.'); 5 | } 6 | return includePaths.map(function(includePath) { 7 | return includeKeyShort + ' ' + includePath; 8 | }).join(' '); 9 | }; 10 | 11 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sass-include-paths", 3 | "version": "4.10.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-regex": { 8 | "version": "3.0.0", 9 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 10 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 11 | }, 12 | "ansi-styles": { 13 | "version": "1.0.0", 14 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", 15 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=", 16 | "dev": true 17 | }, 18 | "array-flatten": { 19 | "version": "2.1.2", 20 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", 21 | "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" 22 | }, 23 | "balanced-match": { 24 | "version": "1.0.0", 25 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 26 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 27 | }, 28 | "bluebird": { 29 | "version": "3.5.3", 30 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", 31 | "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" 32 | }, 33 | "bootstrap-sass": { 34 | "version": "3.4.1", 35 | "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", 36 | "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==", 37 | "dev": true 38 | }, 39 | "bower": { 40 | "version": "1.8.8", 41 | "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.8.tgz", 42 | "integrity": "sha512-1SrJnXnkP9soITHptSO+ahx3QKp3cVzn8poI6ujqc5SeOkg5iqM1pK9H+DSc2OQ8SnO0jC/NG4Ur/UIwy7574A==", 43 | "dev": true 44 | }, 45 | "brace-expansion": { 46 | "version": "1.1.11", 47 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 48 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 49 | "requires": { 50 | "balanced-match": "^1.0.0", 51 | "concat-map": "0.0.1" 52 | } 53 | }, 54 | "camelcase": { 55 | "version": "5.2.0", 56 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.2.0.tgz", 57 | "integrity": "sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==" 58 | }, 59 | "chalk": { 60 | "version": "0.4.0", 61 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", 62 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", 63 | "dev": true, 64 | "requires": { 65 | "ansi-styles": "~1.0.0", 66 | "has-color": "~0.1.0", 67 | "strip-ansi": "~0.1.0" 68 | }, 69 | "dependencies": { 70 | "strip-ansi": { 71 | "version": "0.1.1", 72 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", 73 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=", 74 | "dev": true 75 | } 76 | } 77 | }, 78 | "cliui": { 79 | "version": "4.1.0", 80 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 81 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 82 | "requires": { 83 | "string-width": "^2.1.1", 84 | "strip-ansi": "^4.0.0", 85 | "wrap-ansi": "^2.0.0" 86 | }, 87 | "dependencies": { 88 | "string-width": { 89 | "version": "2.1.1", 90 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 91 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 92 | "requires": { 93 | "is-fullwidth-code-point": "^2.0.0", 94 | "strip-ansi": "^4.0.0" 95 | } 96 | } 97 | } 98 | }, 99 | "code-point-at": { 100 | "version": "1.1.0", 101 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 102 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 103 | }, 104 | "concat-map": { 105 | "version": "0.0.1", 106 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 107 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 108 | }, 109 | "cross-spawn": { 110 | "version": "6.0.5", 111 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 112 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 113 | "requires": { 114 | "nice-try": "^1.0.4", 115 | "path-key": "^2.0.1", 116 | "semver": "^5.5.0", 117 | "shebang-command": "^1.2.0", 118 | "which": "^1.2.9" 119 | } 120 | }, 121 | "date-time": { 122 | "version": "0.1.1", 123 | "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", 124 | "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=", 125 | "dev": true 126 | }, 127 | "decamelize": { 128 | "version": "1.2.0", 129 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 130 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 131 | }, 132 | "deep-equal": { 133 | "version": "1.0.1", 134 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 135 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 136 | "dev": true 137 | }, 138 | "define-properties": { 139 | "version": "1.1.3", 140 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 141 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 142 | "dev": true, 143 | "requires": { 144 | "object-keys": "^1.0.12" 145 | } 146 | }, 147 | "defined": { 148 | "version": "1.0.0", 149 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 150 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 151 | "dev": true 152 | }, 153 | "emoji-regex": { 154 | "version": "7.0.3", 155 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 156 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 157 | }, 158 | "end-of-stream": { 159 | "version": "1.4.1", 160 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 161 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 162 | "requires": { 163 | "once": "^1.4.0" 164 | } 165 | }, 166 | "es-abstract": { 167 | "version": "1.13.0", 168 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 169 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 170 | "dev": true, 171 | "requires": { 172 | "es-to-primitive": "^1.2.0", 173 | "function-bind": "^1.1.1", 174 | "has": "^1.0.3", 175 | "is-callable": "^1.1.4", 176 | "is-regex": "^1.0.4", 177 | "object-keys": "^1.0.12" 178 | } 179 | }, 180 | "es-to-primitive": { 181 | "version": "1.2.0", 182 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 183 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 184 | "dev": true, 185 | "requires": { 186 | "is-callable": "^1.1.4", 187 | "is-date-object": "^1.0.1", 188 | "is-symbol": "^1.0.2" 189 | } 190 | }, 191 | "es6-shim": { 192 | "version": "0.35.5", 193 | "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.5.tgz", 194 | "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==" 195 | }, 196 | "execa": { 197 | "version": "1.0.0", 198 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 199 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 200 | "requires": { 201 | "cross-spawn": "^6.0.0", 202 | "get-stream": "^4.0.0", 203 | "is-stream": "^1.1.0", 204 | "npm-run-path": "^2.0.0", 205 | "p-finally": "^1.0.0", 206 | "signal-exit": "^3.0.0", 207 | "strip-eof": "^1.0.0" 208 | } 209 | }, 210 | "eyeglass-math": { 211 | "version": "1.0.1", 212 | "resolved": "https://registry.npmjs.org/eyeglass-math/-/eyeglass-math-1.0.1.tgz", 213 | "integrity": "sha1-mD5Q0t2CL5rhjKnI0ZW8/8olW8I=", 214 | "dev": true, 215 | "requires": { 216 | "node-sass-utils": "^0.2.1" 217 | } 218 | }, 219 | "find-up": { 220 | "version": "3.0.0", 221 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 222 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 223 | "requires": { 224 | "locate-path": "^3.0.0" 225 | } 226 | }, 227 | "font-awesome": { 228 | "version": "4.7.0", 229 | "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", 230 | "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", 231 | "dev": true 232 | }, 233 | "for-each": { 234 | "version": "0.3.3", 235 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 236 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 237 | "dev": true, 238 | "requires": { 239 | "is-callable": "^1.1.3" 240 | } 241 | }, 242 | "fs.realpath": { 243 | "version": "1.0.0", 244 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 245 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 246 | }, 247 | "function-bind": { 248 | "version": "1.1.1", 249 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 250 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 251 | "dev": true 252 | }, 253 | "get-caller-file": { 254 | "version": "2.0.5", 255 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 256 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 257 | }, 258 | "get-stream": { 259 | "version": "4.1.0", 260 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 261 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 262 | "requires": { 263 | "pump": "^3.0.0" 264 | } 265 | }, 266 | "glob": { 267 | "version": "7.1.3", 268 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 269 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 270 | "requires": { 271 | "fs.realpath": "^1.0.0", 272 | "inflight": "^1.0.4", 273 | "inherits": "2", 274 | "minimatch": "^3.0.4", 275 | "once": "^1.3.0", 276 | "path-is-absolute": "^1.0.0" 277 | } 278 | }, 279 | "has": { 280 | "version": "1.0.3", 281 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 282 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 283 | "dev": true, 284 | "requires": { 285 | "function-bind": "^1.1.1" 286 | } 287 | }, 288 | "has-color": { 289 | "version": "0.1.7", 290 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 291 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=", 292 | "dev": true 293 | }, 294 | "has-symbols": { 295 | "version": "1.0.0", 296 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 297 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 298 | "dev": true 299 | }, 300 | "inflight": { 301 | "version": "1.0.6", 302 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 303 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 304 | "requires": { 305 | "once": "^1.3.0", 306 | "wrappy": "1" 307 | } 308 | }, 309 | "inherits": { 310 | "version": "2.0.3", 311 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 312 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 313 | }, 314 | "invert-kv": { 315 | "version": "2.0.0", 316 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 317 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" 318 | }, 319 | "is-callable": { 320 | "version": "1.1.4", 321 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 322 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 323 | "dev": true 324 | }, 325 | "is-date-object": { 326 | "version": "1.0.1", 327 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 328 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 329 | "dev": true 330 | }, 331 | "is-fullwidth-code-point": { 332 | "version": "2.0.0", 333 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 334 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 335 | }, 336 | "is-regex": { 337 | "version": "1.0.4", 338 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 339 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 340 | "dev": true, 341 | "requires": { 342 | "has": "^1.0.1" 343 | } 344 | }, 345 | "is-stream": { 346 | "version": "1.1.0", 347 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 348 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 349 | }, 350 | "is-symbol": { 351 | "version": "1.0.2", 352 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 353 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 354 | "dev": true, 355 | "requires": { 356 | "has-symbols": "^1.0.0" 357 | } 358 | }, 359 | "isexe": { 360 | "version": "2.0.0", 361 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 362 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 363 | }, 364 | "lcid": { 365 | "version": "2.0.0", 366 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 367 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 368 | "requires": { 369 | "invert-kv": "^2.0.0" 370 | } 371 | }, 372 | "locate-path": { 373 | "version": "3.0.0", 374 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 375 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 376 | "requires": { 377 | "p-locate": "^3.0.0", 378 | "path-exists": "^3.0.0" 379 | } 380 | }, 381 | "map-age-cleaner": { 382 | "version": "0.1.3", 383 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 384 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 385 | "requires": { 386 | "p-defer": "^1.0.0" 387 | } 388 | }, 389 | "mem": { 390 | "version": "4.2.0", 391 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.2.0.tgz", 392 | "integrity": "sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==", 393 | "requires": { 394 | "map-age-cleaner": "^0.1.1", 395 | "mimic-fn": "^2.0.0", 396 | "p-is-promise": "^2.0.0" 397 | } 398 | }, 399 | "mimic-fn": { 400 | "version": "2.0.0", 401 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.0.0.tgz", 402 | "integrity": "sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==" 403 | }, 404 | "minimatch": { 405 | "version": "3.0.4", 406 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 407 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 408 | "requires": { 409 | "brace-expansion": "^1.1.7" 410 | } 411 | }, 412 | "minimist": { 413 | "version": "1.2.0", 414 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 415 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 416 | "dev": true 417 | }, 418 | "modularscale-sass": { 419 | "version": "2.1.1", 420 | "resolved": "https://registry.npmjs.org/modularscale-sass/-/modularscale-sass-2.1.1.tgz", 421 | "integrity": "sha1-pCw6OSRXrIOmuMKaGDyVVA5rOIs=", 422 | "dev": true 423 | }, 424 | "nice-try": { 425 | "version": "1.0.5", 426 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 427 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 428 | }, 429 | "node-sass-utils": { 430 | "version": "0.2.1", 431 | "resolved": "https://registry.npmjs.org/node-sass-utils/-/node-sass-utils-0.2.1.tgz", 432 | "integrity": "sha1-BvaWSmDFQws55XZO5SzXcnj8y+w=", 433 | "dev": true 434 | }, 435 | "normalize-scss": { 436 | "version": "5.0.4", 437 | "resolved": "https://registry.npmjs.org/normalize-scss/-/normalize-scss-5.0.4.tgz", 438 | "integrity": "sha1-x4qtyOKsC7QYO0rYqn4mrEHo/s0=", 439 | "dev": true 440 | }, 441 | "npm-run-path": { 442 | "version": "2.0.2", 443 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 444 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 445 | "requires": { 446 | "path-key": "^2.0.0" 447 | } 448 | }, 449 | "number-is-nan": { 450 | "version": "1.0.1", 451 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 452 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 453 | }, 454 | "object-inspect": { 455 | "version": "1.6.0", 456 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 457 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 458 | "dev": true 459 | }, 460 | "object-keys": { 461 | "version": "1.1.0", 462 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", 463 | "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", 464 | "dev": true 465 | }, 466 | "once": { 467 | "version": "1.4.0", 468 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 469 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 470 | "requires": { 471 | "wrappy": "1" 472 | } 473 | }, 474 | "os-locale": { 475 | "version": "3.1.0", 476 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 477 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 478 | "requires": { 479 | "execa": "^1.0.0", 480 | "lcid": "^2.0.0", 481 | "mem": "^4.0.0" 482 | } 483 | }, 484 | "p-defer": { 485 | "version": "1.0.0", 486 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 487 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" 488 | }, 489 | "p-finally": { 490 | "version": "1.0.0", 491 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 492 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 493 | }, 494 | "p-is-promise": { 495 | "version": "2.0.0", 496 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", 497 | "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==" 498 | }, 499 | "p-limit": { 500 | "version": "2.2.0", 501 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 502 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 503 | "requires": { 504 | "p-try": "^2.0.0" 505 | } 506 | }, 507 | "p-locate": { 508 | "version": "3.0.0", 509 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 510 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 511 | "requires": { 512 | "p-limit": "^2.0.0" 513 | } 514 | }, 515 | "p-try": { 516 | "version": "2.1.0", 517 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz", 518 | "integrity": "sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA==" 519 | }, 520 | "parse-ms": { 521 | "version": "0.1.2", 522 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", 523 | "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=", 524 | "dev": true 525 | }, 526 | "path-exists": { 527 | "version": "3.0.0", 528 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 529 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 530 | }, 531 | "path-is-absolute": { 532 | "version": "1.0.1", 533 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 534 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 535 | }, 536 | "path-key": { 537 | "version": "2.0.1", 538 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 539 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 540 | }, 541 | "path-parse": { 542 | "version": "1.0.6", 543 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 544 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 545 | "dev": true 546 | }, 547 | "pretty-ms": { 548 | "version": "0.2.2", 549 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", 550 | "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=", 551 | "dev": true, 552 | "requires": { 553 | "parse-ms": "^0.1.0" 554 | } 555 | }, 556 | "pump": { 557 | "version": "3.0.0", 558 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 559 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 560 | "requires": { 561 | "end-of-stream": "^1.1.0", 562 | "once": "^1.3.1" 563 | } 564 | }, 565 | "require-directory": { 566 | "version": "2.1.1", 567 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 568 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 569 | }, 570 | "require-main-filename": { 571 | "version": "2.0.0", 572 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 573 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 574 | }, 575 | "resolve": { 576 | "version": "1.10.0", 577 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 578 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 579 | "dev": true, 580 | "requires": { 581 | "path-parse": "^1.0.6" 582 | } 583 | }, 584 | "resumer": { 585 | "version": "0.0.0", 586 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 587 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 588 | "dev": true, 589 | "requires": { 590 | "through": "~2.3.4" 591 | } 592 | }, 593 | "sassline": { 594 | "version": "2.1.2", 595 | "resolved": "https://registry.npmjs.org/sassline/-/sassline-2.1.2.tgz", 596 | "integrity": "sha1-eY9mITIJlEwQswvuiArSHXxdhRQ=", 597 | "dev": true 598 | }, 599 | "scut": { 600 | "version": "1.4.0", 601 | "resolved": "https://registry.npmjs.org/scut/-/scut-1.4.0.tgz", 602 | "integrity": "sha1-vF4XhGunO20aTR1g3Sp5Os+mk7w=", 603 | "dev": true 604 | }, 605 | "semver": { 606 | "version": "5.6.0", 607 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 608 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 609 | }, 610 | "set-blocking": { 611 | "version": "2.0.0", 612 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 613 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 614 | }, 615 | "shebang-command": { 616 | "version": "1.2.0", 617 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 618 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 619 | "requires": { 620 | "shebang-regex": "^1.0.0" 621 | } 622 | }, 623 | "shebang-regex": { 624 | "version": "1.0.0", 625 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 626 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 627 | }, 628 | "shevy": { 629 | "version": "2.1.0", 630 | "resolved": "https://registry.npmjs.org/shevy/-/shevy-2.1.0.tgz", 631 | "integrity": "sha1-KqeHoixFAxmSL19TuWeI3L1KPLY=", 632 | "dev": true 633 | }, 634 | "signal-exit": { 635 | "version": "3.0.2", 636 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 637 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 638 | }, 639 | "string-width": { 640 | "version": "3.1.0", 641 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 642 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 643 | "requires": { 644 | "emoji-regex": "^7.0.1", 645 | "is-fullwidth-code-point": "^2.0.0", 646 | "strip-ansi": "^5.1.0" 647 | }, 648 | "dependencies": { 649 | "ansi-regex": { 650 | "version": "4.1.0", 651 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 652 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 653 | }, 654 | "strip-ansi": { 655 | "version": "5.2.0", 656 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 657 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 658 | "requires": { 659 | "ansi-regex": "^4.1.0" 660 | } 661 | } 662 | } 663 | }, 664 | "string.prototype.trim": { 665 | "version": "1.1.2", 666 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 667 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 668 | "dev": true, 669 | "requires": { 670 | "define-properties": "^1.1.2", 671 | "es-abstract": "^1.5.0", 672 | "function-bind": "^1.0.2" 673 | } 674 | }, 675 | "strip-ansi": { 676 | "version": "4.0.0", 677 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 678 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 679 | "requires": { 680 | "ansi-regex": "^3.0.0" 681 | } 682 | }, 683 | "strip-eof": { 684 | "version": "1.0.0", 685 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 686 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 687 | }, 688 | "support-for": { 689 | "version": "1.0.7", 690 | "resolved": "https://registry.npmjs.org/support-for/-/support-for-1.0.7.tgz", 691 | "integrity": "sha1-GFMRoAHnaYHNqKIXFE3rgo/aICg=", 692 | "dev": true 693 | }, 694 | "sync-exec": { 695 | "version": "0.6.2", 696 | "resolved": "https://registry.npmjs.org/sync-exec/-/sync-exec-0.6.2.tgz", 697 | "integrity": "sha1-cX0izFPwzh3vVZQ2LzqJouu5EQU=" 698 | }, 699 | "tape": { 700 | "version": "4.10.1", 701 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.10.1.tgz", 702 | "integrity": "sha512-G0DywYV1jQeY3axeYnXUOt6ktnxS9OPJh97FGR3nrua8lhWi1zPflLxcAHavZ7Jf3qUfY7cxcVIVFa4mY2IY1w==", 703 | "dev": true, 704 | "requires": { 705 | "deep-equal": "~1.0.1", 706 | "defined": "~1.0.0", 707 | "for-each": "~0.3.3", 708 | "function-bind": "~1.1.1", 709 | "glob": "~7.1.3", 710 | "has": "~1.0.3", 711 | "inherits": "~2.0.3", 712 | "minimist": "~1.2.0", 713 | "object-inspect": "~1.6.0", 714 | "resolve": "~1.10.0", 715 | "resumer": "~0.0.0", 716 | "string.prototype.trim": "~1.1.2", 717 | "through": "~2.3.8" 718 | } 719 | }, 720 | "text-table": { 721 | "version": "0.2.0", 722 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 723 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 724 | "dev": true 725 | }, 726 | "through": { 727 | "version": "2.3.8", 728 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 729 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 730 | "dev": true 731 | }, 732 | "time-require": { 733 | "version": "0.1.2", 734 | "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", 735 | "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", 736 | "dev": true, 737 | "requires": { 738 | "chalk": "^0.4.0", 739 | "date-time": "^0.1.1", 740 | "pretty-ms": "^0.2.1", 741 | "text-table": "^0.2.0" 742 | } 743 | }, 744 | "uniq": { 745 | "version": "1.0.1", 746 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 747 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" 748 | }, 749 | "which": { 750 | "version": "1.3.1", 751 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 752 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 753 | "requires": { 754 | "isexe": "^2.0.0" 755 | } 756 | }, 757 | "which-module": { 758 | "version": "2.0.0", 759 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 760 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 761 | }, 762 | "wrap-ansi": { 763 | "version": "2.1.0", 764 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 765 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 766 | "requires": { 767 | "string-width": "^1.0.1", 768 | "strip-ansi": "^3.0.1" 769 | }, 770 | "dependencies": { 771 | "ansi-regex": { 772 | "version": "2.1.1", 773 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 774 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 775 | }, 776 | "is-fullwidth-code-point": { 777 | "version": "1.0.0", 778 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 779 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 780 | "requires": { 781 | "number-is-nan": "^1.0.0" 782 | } 783 | }, 784 | "string-width": { 785 | "version": "1.0.2", 786 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 787 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 788 | "requires": { 789 | "code-point-at": "^1.0.0", 790 | "is-fullwidth-code-point": "^1.0.0", 791 | "strip-ansi": "^3.0.0" 792 | } 793 | }, 794 | "strip-ansi": { 795 | "version": "3.0.1", 796 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 797 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 798 | "requires": { 799 | "ansi-regex": "^2.0.0" 800 | } 801 | } 802 | } 803 | }, 804 | "wrappy": { 805 | "version": "1.0.2", 806 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 807 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 808 | }, 809 | "y18n": { 810 | "version": "4.0.0", 811 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 812 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 813 | }, 814 | "yargs": { 815 | "version": "13.2.2", 816 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", 817 | "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", 818 | "requires": { 819 | "cliui": "^4.0.0", 820 | "find-up": "^3.0.0", 821 | "get-caller-file": "^2.0.1", 822 | "os-locale": "^3.1.0", 823 | "require-directory": "^2.1.1", 824 | "require-main-filename": "^2.0.0", 825 | "set-blocking": "^2.0.0", 826 | "string-width": "^3.0.0", 827 | "which-module": "^2.0.0", 828 | "y18n": "^4.0.0", 829 | "yargs-parser": "^13.0.0" 830 | } 831 | }, 832 | "yargs-parser": { 833 | "version": "13.0.0", 834 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", 835 | "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", 836 | "requires": { 837 | "camelcase": "^5.0.0", 838 | "decamelize": "^1.2.0" 839 | } 840 | } 841 | } 842 | } 843 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "array-flatten": "^2.1.0", 4 | "bluebird": "^3.0.5", 5 | "es6-shim": "^0.35.1", 6 | "glob": "^7.0.0", 7 | "sync-exec": "^0.6.2", 8 | "uniq": "^1.0.1", 9 | "yargs": "^13.2.2" 10 | }, 11 | "devDependencies": { 12 | "bootstrap-sass": "^3.3.6", 13 | "bower": "^1.7.2", 14 | "eyeglass-math": "^1.0.1", 15 | "font-awesome": "^4.5.0", 16 | "modularscale-sass": "^2.1.1", 17 | "normalize-scss": "^5.0.3", 18 | "sassline": "^2.1.0", 19 | "scut": "^1.3.0", 20 | "shevy": "^2.1.0", 21 | "support-for": "^1.0.6", 22 | "tape": "^4.2.2", 23 | "time-require": "^0.1.2" 24 | }, 25 | "name": "sass-include-paths", 26 | "version": "4.11.0", 27 | "main": "index.js", 28 | "directories": { 29 | "test": "test" 30 | }, 31 | "scripts": { 32 | "test": "tape test/test*.js" 33 | }, 34 | "bin": { 35 | "sassIncludePaths": "cli.js" 36 | }, 37 | "author": "strarsis (https://github.com/strarsis)", 38 | "license": "MIT", 39 | "description": "Generates include paths for node-sass for packages from popular package managers like npm, bower, ruby gem, ruby bundler.", 40 | "repository": { 41 | "type": "git", 42 | "url": "git+https://github.com/strarsis/sass-include-paths.git" 43 | }, 44 | "keywords": [ 45 | "sass", 46 | "scss", 47 | "include", 48 | "include", 49 | "paths", 50 | "paths", 51 | "path", 52 | "npm", 53 | "ruby", 54 | "gem", 55 | "bundle", 56 | "bundler", 57 | "gems", 58 | "bower", 59 | "nodejs", 60 | "package", 61 | "import", 62 | "load", 63 | "components", 64 | "bower", 65 | "components" 66 | ], 67 | "bugs": { 68 | "url": "https://github.com/strarsis/sass-include-paths/issues" 69 | }, 70 | "homepage": "https://github.com/strarsis/sass-include-paths#readme" 71 | } 72 | -------------------------------------------------------------------------------- /test/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | ./node_modules/.bin/bower install --config.interactive=false && \ 3 | 4 | gem install bundler --no-ri --no-rdoc && \ 5 | bundle install --path vendor/bundle 6 | -------------------------------------------------------------------------------- /test/ruby-system/docker-compose.yml: -------------------------------------------------------------------------------- 1 | ruby: 2 | image: ruby:2.2 3 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var test = require('tape'), 4 | sassIncludePaths = require('../'); 5 | 6 | 7 | var path = require('path'), 8 | pathIsAbs = require('path-is-absolute'); 9 | var makePathAbsolute = function(pathStr) { 10 | if(pathIsAbs(pathStr)) { 11 | return pathStr; 12 | } 13 | var dirnameIndex = path.resolve(__dirname, '..'); 14 | return path.join(dirnameIndex, pathStr); 15 | }; 16 | 17 | 18 | var testPathsAsync = function(t, fnAsync, paths, opts) { 19 | fnAsync(opts).then(function(actualPaths){ t.deepEqual(actualPaths, paths); }); 20 | }; 21 | var testPathsSync = function(t, fnSync, paths, opts) { 22 | t.deepEqual(fnSync(opts), paths); 23 | } 24 | var testPaths = function(t, fnAsync, fnSync, paths, opts) { 25 | testPathsAsync(t, fnAsync, paths, opts); 26 | testPathsSync(t, fnSync, paths, opts); 27 | } 28 | 29 | var testRel = function(t, fnAsync, fnSync, pathsExpectedRel) { 30 | testPaths(t, fnAsync, fnSync, pathsExpectedRel, {absolute: false}); 31 | }; 32 | var testAbs = function(t, fnAsync, fnSync, pathsExpectedRel) { 33 | var pathsExpectAbs = pathsExpectedRel.map(makePathAbsolute); 34 | testPaths(t, fnAsync, fnSync, pathsExpectAbs, {absolute: true}); 35 | }; 36 | 37 | var testFull = function(t, fnAsync, fnSync, pathsExpectedRel) { 38 | testRel(t, fnAsync, fnSync, pathsExpectedRel); 39 | testAbs(t, fnAsync, fnSync, pathsExpectedRel); 40 | }; 41 | 42 | 43 | test('works with node_modules', function (t) { 44 | 45 | // (in this package dev dependencies) 46 | // $ npm install bootstrap-sass@3.3.6 47 | // $ npm install eyeglass-math@1.0.1 48 | // $ npm install font-awesome@4.5.0 49 | // $ npm install modularscale-sass@2.1.1 50 | // $ npm install normalize-scss@4.0.3 51 | // $ npm install sassline@2.1.0 52 | // $ npm install scut@1.3.0 53 | // $ npm install github:kyleshevlin/shevy#2.1.0 54 | 55 | t.plan(4); 56 | testFull(t, sassIncludePaths.nodeModules, sassIncludePaths.nodeModulesSync, [ 57 | 'node_modules/bootstrap-sass/assets/stylesheets', 58 | 'node_modules/eyeglass-math/sass', 59 | 'node_modules/font-awesome/scss', 60 | 'node_modules/modularscale-sass/stylesheets', 61 | 'node_modules/normalize-scss/sass', 62 | 'node_modules/sassline/assets/sass', 63 | 'node_modules/scut/dist', 64 | 'node_modules/shevy/core', 65 | 'node_modules/support-for/sass' 66 | ]); 67 | }); 68 | 69 | 70 | test('works with local ruby bundle', function (t) { 71 | 72 | // $ rvm ruby-2.5.5@sass-include-paths --create 73 | // (in this package Gemfile) 74 | // modular-scale 2.1.1 75 | // toolkit 2.9.0 76 | // shevy 2.1.0 77 | 78 | // $ gem install bundler # important for bundler+rake 79 | // $ bundle install --path vendor/bundle 80 | 81 | t.plan(4); 82 | testFull(t, sassIncludePaths.rubyGemsBundle, sassIncludePaths.rubyGemsBundleSync, [ 83 | 'vendor/bundle/ruby/2.5.0/gems/compass-core-1.0.3/stylesheets', 84 | 'vendor/bundle/ruby/2.5.0/gems/modular-scale-2.1.1/stylesheets', 85 | 'vendor/bundle/ruby/2.5.0/gems/shevy-2.1.0/core', 86 | 'vendor/bundle/ruby/2.5.0/gems/toolkit-2.9.0/stylesheets' 87 | ]); 88 | }); 89 | 90 | 91 | test('works with bower components folder', function (t) { 92 | 93 | // (in this package bower.json 94 | // modular-scale 2.1.1 95 | // sass-toolki 9.2.0 96 | // Scut 1.3.1 97 | // bootstrap-sass 3.3.6 98 | // font-awesome 4.5.0 99 | // normalize-scss 3.0.3 100 | // sass-mq 3.2.9 101 | // neutroncss 0.9.2 102 | // sass-flex-mixin 1.0.3 103 | // shevy 2.1.0 104 | 105 | // $ npm install -g bower 106 | // $ bower install 107 | 108 | t.plan(4); 109 | testFull(t, sassIncludePaths.bowerComponents, sassIncludePaths.bowerComponentsSync, [ 110 | 'bower_components/Scut/dist', 111 | 'bower_components/bootstrap-sass/assets/stylesheets', 112 | 'bower_components/font-awesome/scss', 113 | 'bower_components/modular-scale/stylesheets', 114 | 'bower_components/neutroncss', 115 | 'bower_components/normalize-scss', 116 | 'bower_components/sass-flex-mixin', 117 | 'bower_components/sass-mq', 118 | 'bower_components/sass-toolkit/stylesheets', 119 | 'bower_components/shevy/core' 120 | ]); 121 | }); 122 | 123 | /* 124 | test('works with global ruby gems', function (t) { 125 | 126 | // $ rvm ruby-2.5.5@sass-include-paths --create 127 | // $ gem install modular-scale -v 2.1.1 128 | // $ gem install toolkit -v 2.9.0 129 | 130 | // Always uses absolute paths. 131 | 132 | t.plan(3); 133 | testAbs(t, sassIncludePaths.rubyGems, sassIncludePaths.rubyGemsSync, [ 134 | '/home/build/.rvm/gems/ruby-2.5.5@sass-include-paths/gems/compass-core-1.0.3/stylesheets', 135 | '/home/build/.rvm/gems/ruby-2.5.5@sass-include-paths/gems/modular-scale-2.1.1/stylesheets', 136 | '/home/build/.rvm/gems/ruby-2.5.5@sass-include-paths/gems/toolkit-2.9.0/stylesheets' 137 | ]); 138 | }); 139 | */ 140 | -------------------------------------------------------------------------------- /test/test_sassc-include-args.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var test = require('tape'), 4 | sasscIncludeArgs = require('../lib/sassc-include-args'); 5 | 6 | test('properly generates sassc include paths', function (t) { 7 | t.plan(4); 8 | 9 | // empty array 10 | t.equal(sasscIncludeArgs([]), ''); 11 | 12 | // one path 13 | t.equal(sasscIncludeArgs(['test']), '-I test'); 14 | 15 | // multiple paths 16 | t.equal(sasscIncludeArgs(['test1', 'test2', 'test3']), '-I test1 -I test2 -I test3'); 17 | 18 | // not an array 19 | t.throws(function() { return sasscIncludeArgs('incorrect'); }, /Argument is not an Array./, 'Argument is not an array.'); 20 | }); 21 | --------------------------------------------------------------------------------