├── .gitignore ├── package.json ├── README.md └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules/ 3 | .DS_Store -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gulp-npm-dist", 3 | "version": "1.0.4", 4 | "description": "A Gulp plugin for listing package.json dependencies and copying their minified (dist) files to a specific folder.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [ 10 | "gulp-npm-dist", 11 | "copy libs", 12 | "copy dist", 13 | "copy main files", 14 | "copy dependencies", 15 | "gulp", 16 | "npm" 17 | ], 18 | "repository": "dshemendiuk/gulp-npm-dist", 19 | "author": { 20 | "name": "Dima Shemendiuk", 21 | "email": "dshemendiuk@gmail.com", 22 | "url": "https://github.com/dshemendiuk" 23 | }, 24 | "license": "MIT" 25 | } 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gulp-npm-dist 2 | 3 | Gulp plugin for listing package.json dependencies and copying their dist files to a specific folder 4 | 5 | ## Get started 6 | 7 | ### Install 8 | 9 | ``` 10 | npm install gulp-npm-dist --save-dev 11 | ``` 12 | 13 | ### Usage 14 | 15 | ```javascript 16 | //package.json example 17 | { 18 | "name": "app", 19 | "version": "1.0.0", 20 | "dependencies": { 21 | "bootstrap": "^3.3.7", 22 | "bootstrap-3-typeahead": "^4.0.2", 23 | "bootstrap-select": "^1.12.1", 24 | "jquery": "^3.1.1", 25 | "jquery-lazyload": "^1.9.7", 26 | "shufflejs": "^4.0.2" 27 | }, 28 | "devDependencies": { 29 | "gulp": "^3.9.1", 30 | "gulp-rename": "^1.2.2", 31 | "gulp-less": "^3.1.0", 32 | "gulp-npm-dist": "^0.1.2", 33 | "pump": "^1.0.1" 34 | } 35 | } 36 | ``` 37 | 38 | ```javascript 39 | var gulp = require('gulp'); 40 | var npmDist = require('gulp-npm-dist'); 41 | 42 | // Copy dependencies to ./public/libs/ 43 | gulp.task('copy:libs', function() { 44 | gulp.src(npmDist(), {base:'./node_modules'}) 45 | .pipe(gulp.dest('./public/libs')); 46 | }); 47 | ``` 48 | 49 | Usage with gulp-rename 50 | ```javascript 51 | var gulp = require('gulp'); 52 | var npmDist = require('gulp-npm-dist'); 53 | var rename = require('gulp-rename'); 54 | 55 | gulp.task('copy:libs', function() { 56 | gulp.src(npmDist(), {base:'./node_modules/'}) 57 | .pipe(rename(function(path) { 58 | path.dirname = path.dirname.replace(/\/dist/, '').replace(/\\dist/, ''); 59 | })) 60 | .pipe(gulp.dest('./public/libs')); 61 | }); 62 | ``` 63 | will create this structure: 64 | 65 | ![gulp-npm-dist build structure](https://gulp-npm-dist.netlify.app/gulp-npm-dist-example.png) 66 | 67 | 68 | ### Options 69 | 70 | #### `copyUnminified` 71 | Type: `boolean` 72 | 73 | Default: `false` 74 | 75 | 76 | #### `excludes` 77 | Type: `array` 78 | 79 | Default: 80 | ``` 81 | [ 82 | '*.map', 83 | 'src/**/*', 84 | 'examples/**/*', 85 | 'example/**/*', 86 | 'demo/**/*', 87 | 'spec/**/*', 88 | 'docs/**/*', 89 | 'tests/**/*', 90 | 'test/**/*', 91 | 'Gruntfile.js', 92 | 'gulpfile.js', 93 | 'package.json', 94 | 'package-lock.json', 95 | 'bower.json', 96 | 'composer.json', 97 | 'yarn.lock', 98 | 'webpack.config.js', 99 | 'README', 100 | 'LICENSE', 101 | 'CHANGELOG', 102 | '*.yml', 103 | '*.md', 104 | '*.coffee', 105 | '*.ts', 106 | '*.scss', 107 | '*.less' 108 | ] 109 | ``` 110 | 111 | #### `replaceDefaultExcludes` 112 | Type: `boolean` 113 | 114 | Default: `false` (append your excludes to the default set) 115 | 116 | 117 | #### Usage with options 118 | 119 | ```javascript 120 | gulp.task('copy:libs', function () { 121 | gulp.src(npmDist({ 122 | copyUnminified: true, 123 | excludes: ['/**/*.txt'] 124 | }), { base: './node_modules' }) 125 | .pipe(gulp.dest('./public/libs')); 126 | }); 127 | ``` 128 | 129 | #### `nodeModulesPath` 130 | Type: `string` 131 | 132 | Default: `./` (relative to `gulpfile.js`) 133 | 134 | 135 | #### `packageJsonPath` 136 | Type: `string` 137 | 138 | Default: `./` (relative to `gulpfile.js`) 139 | 140 | 141 | #### Usage with alternative paths 142 | 143 | Assume the following locations: 144 | * `./node_modules/` 145 | * `./foo/gulpfile.js` 146 | * `./foo/bar/package.json` 147 | 148 | ```javascript 149 | gulp.task('copy:libs', function () { 150 | gulp.src(npmDist({ 151 | nodeModulesPath: '../', 152 | packageJsonPath: 'bar/' 153 | }), { base: '../node_modules' }) 154 | .pipe(gulp.dest('./public/libs')); 155 | }); 156 | ``` 157 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | 4 | var excludePatterns = [ 5 | '*.map', 6 | 'src/', 7 | 'src/**/*', 8 | 'examples/', 9 | 'examples/**/*', 10 | 'example/', 11 | 'example/**/*', 12 | 'demo/**/*', 13 | 'spec/', 14 | 'spec/**/*', 15 | 'docs/', 16 | 'docs/**/*', 17 | 'tests/', 18 | 'tests/**/*', 19 | 'test/', 20 | 'test/**/*', 21 | 'Gruntfile.js', 22 | 'gulpfile.js', 23 | 'package.json', 24 | 'package-lock.json', 25 | 'bower.json', 26 | 'composer.json', 27 | 'yarn.lock', 28 | 'webpack.config.js', 29 | 'README', 30 | 'LICENSE', 31 | 'CHANGELOG', 32 | '*.yml', 33 | '*.md', 34 | '*.coffee', 35 | '*.ts', 36 | '*.scss', 37 | '*.less' 38 | ]; 39 | 40 | module.exports = function (config) { 41 | config = config || {}; 42 | 43 | var copyUnminified = config.copyUnminified || false; 44 | var replaceDefaultExcludes = config.replaceDefaultExcludes || false; 45 | var nodeModulesPath = config.nodeModulesPath || false; 46 | var packageJsonPath = config.packageJsonPath || false; 47 | var excludes = config.excludes || []; 48 | 49 | var workingDir = process.cwd(); 50 | var nodeModDir = nodeModulesPath ? path.join(workingDir, nodeModulesPath) : '.'; 51 | var packageJsonFile = packageJsonPath ? path.join(workingDir, packageJsonPath, 'package.json') : 'package.json'; 52 | 53 | var buffer = fs.readFileSync(packageJsonFile); 54 | var packageJson = JSON.parse(buffer.toString().trim()); 55 | var packages = []; 56 | 57 | if (!replaceDefaultExcludes) { 58 | excludes = excludes.concat(excludePatterns); 59 | } 60 | 61 | for (lib in packageJson.dependencies) { 62 | var mainFileDir = path.join(nodeModDir, 'node_modules', lib); 63 | var libFiles = []; 64 | 65 | if (fs.existsSync(mainFileDir + '/dist')) { 66 | mainFileDir = mainFileDir + '/dist'; 67 | } else { 68 | var depPackageBuffer = fs.readFileSync(mainFileDir + '/package.json'); 69 | var depPackage = JSON.parse(depPackageBuffer.toString()); 70 | 71 | if (depPackage.main) { 72 | var mainFile = mainFileDir + '/' + depPackage.main; 73 | var distDirPos; 74 | 75 | distDirPos = mainFile.lastIndexOf('/dist/'); 76 | 77 | if (distDirPos !== -1) { 78 | mainFileDir = mainFile.substring(0, distDirPos) + '/dist'; 79 | } 80 | } 81 | } 82 | 83 | function readLibFilesRecursively(target) { 84 | try { 85 | fs.readdirSync(target).forEach(function (path) { 86 | var fullPath = target + '/' + path; 87 | if (fs.lstatSync(fullPath).isDirectory()) { 88 | readLibFilesRecursively(fullPath); 89 | } 90 | libFiles.push(fullPath); 91 | }); 92 | } catch (err) { 93 | console.log(err); 94 | } 95 | } 96 | 97 | readLibFilesRecursively(mainFileDir); 98 | 99 | // Includes 100 | packages.push(mainFileDir + '/**/*'); 101 | 102 | //Excludes 103 | excludes.map(function (value) { 104 | packages.push('!' + mainFileDir + '/**/' + value); 105 | }); 106 | 107 | if (copyUnminified === false) { 108 | // Delete unminified versions 109 | for (var i = 0; i < libFiles.length; i++) { 110 | var target; 111 | if (libFiles[i].indexOf('.min.js') > -1) { 112 | target = libFiles[i].replace(/\.min\.js/, '.js'); 113 | packages.push('!' + libFiles[libFiles.indexOf(target)]); 114 | } 115 | if (libFiles[i].indexOf('.min.css') > -1) { 116 | target = libFiles[i].replace(/\.min\.css/, '.css'); 117 | packages.push('!' + libFiles[libFiles.indexOf(target)]); 118 | } 119 | } 120 | } 121 | 122 | } 123 | 124 | return packages; 125 | }; 126 | --------------------------------------------------------------------------------