├── .gitignore ├── .travis.yml ├── README.md ├── bin.js ├── dist.js ├── index.js └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | .nyc_output 4 | coverage -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | cache: 3 | directories: 4 | - node_modules 5 | notifications: 6 | email: false 7 | node_js: 8 | - '8' 9 | before_script: 10 | - npm prune 11 | after_success: 12 | - npm run semantic-release 13 | branches: 14 | except: 15 | - /^v\d+\.\d+\.\d+$/ 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # distjs 2 | 3 | Distribute standalone WebComponents w/ npm 4 | 5 |

6 | 7 | 8 | 9 |

10 | 11 | Usage: 12 | 13 | ``` 14 | > npm install distjs 15 | > distjs install 16 | ``` 17 | 18 | Or, you can manually enable in your package.json. 19 | 20 | ``` 21 | { 22 | ... 23 | "scripts": { 24 | "prepublishOnly": "distjs", 25 | ... 26 | } 27 | } 28 | ``` 29 | 30 | Before each npm publish `distjs` will build standealone scripts in a `dist/` 31 | directory. These scripts dynamically load a WebComponents polyfill before 32 | requiring your package. 33 | 34 | The dist files will be named `${pkgname}.js` and `${pkgname}.min.js`. 35 | 36 | This means that people can use your new elements with a simple script include 37 | from one of the many npm content CDN's. 38 | 39 | Example: 40 | 41 | ```html 42 | 43 | ``` 44 | -------------------------------------------------------------------------------- /bin.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | let fs = require('fs') 3 | let path = require('path') 4 | let minify = require('babel-minify') 5 | let browserify = require('browserify') 6 | let rimraf = require('rimraf') 7 | let mkdirp = require('mkdirp') 8 | let bl = require('bl') 9 | let distfile = fs.readFileSync(path.join(__dirname, 'dist.js')) 10 | 11 | const _browserify = _path => { 12 | return new Promise((resolve, reject) => { 13 | let b = browserify() 14 | b.add(_path) 15 | b.bundle().pipe(bl((err, buffer) => { 16 | if (err) return reject(err) 17 | resolve(buffer) 18 | })) 19 | }) 20 | } 21 | 22 | const mkdistfile = cwd => { 23 | console.log('Creating dist.js file...') 24 | fs.writeFileSync(path.join(cwd, 'dist.js'), distfile) 25 | } 26 | 27 | exports.build = async (cwd, name) => { 28 | mkdistfile(cwd) 29 | console.log('Creating dist directory...') 30 | rimraf.sync(path.join(cwd, 'dist')) 31 | mkdirp.sync(path.join(cwd, 'dist')) 32 | console.log('Creating browserify bundle...') 33 | let bundle = await _browserify(path.join(cwd, 'dist.js')) 34 | console.log(`Bundle size: ${bundle.length}`) 35 | console.log('Writing browserify bundle to dist/...') 36 | fs.writeFileSync(path.join(cwd, 'dist', `${name}.js`), bundle) 37 | console.log('Creating minified bundle...') 38 | let { code } = await minify(bundle) 39 | console.log(`Minified size: ${code.length}`) 40 | fs.writeFileSync(path.join(cwd, 'dist', `${name}.min.js`), code) 41 | console.log('Cleaning tmp dist.js file.') 42 | rimraf.sync(path.join(cwd, 'dist.js')) 43 | } 44 | 45 | const keys = Object.keys 46 | 47 | const install = cwd => { 48 | let pkg = require(`${cwd}/package.json`) 49 | if (!pkg.scripts) pkg.scripts = {} 50 | pkg.scripts.prepublishOnly = 'distjs' 51 | let deps = [] 52 | if (pkg.dependencies) deps = deps.concat(keys(pkg.dependencies)) 53 | if (pkg.devDependencies) deps = deps.concat(keys(pkg.devDependencies)) 54 | if (deps.includes('standard')) { 55 | if (!pkg.standard) pkg.standard = {} 56 | if (!pkg.standard.ignore) pkg.standard.ignore = [] 57 | if (!pkg.standard.ignore.includes('dist')) { 58 | pkg.standard.ignore.push('dist') 59 | } 60 | } 61 | fs.writeFileSync(`${cwd}/package.json`, JSON.stringify(pkg, null, 2)) 62 | } 63 | 64 | if (process.argv.length === 2) { 65 | let cwd = process.cwd() 66 | exports.build(cwd, require(`${cwd}/package.json`).name) 67 | } else if (process.argv.length === 3) { 68 | let cwd = process.cwd() 69 | let command = process.argv[2] 70 | if (command === 'distfile') { 71 | mkdistfile(cwd) 72 | } else if (command === 'install') { 73 | install(cwd) 74 | } else { 75 | throw new Error('unknown command') 76 | } 77 | } else { 78 | throw new Error('unknown command') 79 | } 80 | -------------------------------------------------------------------------------- /dist.js: -------------------------------------------------------------------------------- 1 | /* globals CustomEvent */ 2 | process.distjs = true 3 | let loadjs = require('distjs').loadjs 4 | 5 | const build = name => { 6 | // Fast Load for Chrome (avoids skip before render) 7 | const getChromeVersion = (force) => { 8 | if (force) return true 9 | var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./) 10 | return raw ? parseInt(raw[2], 10) > 59 : false 11 | } 12 | if (getChromeVersion()) require('./') 13 | 14 | window.addEventListener('WebComponentsReady', () => { 15 | let event = new CustomEvent(`${name}-ready`, require('./')) 16 | window.dispatchEvent(event) 17 | }) 18 | const polyfill = 'https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.0.12/webcomponents-loader.js' 19 | loadjs([{async: true, url: polyfill}]) 20 | } 21 | 22 | build(require('./package.json').name) 23 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | exports.loadjs = require('load-js') 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "distjs", 3 | "version": "0.0.0-development", 4 | "description": "", 5 | "main": "index.js", 6 | "bin": { 7 | "distjs": "./bin.js" 8 | }, 9 | "scripts": { 10 | "commit": "git-cz", 11 | "test": "standard", 12 | "start": "budo dist.js:bundle.js", 13 | "precommit": "npm test", 14 | "prepush": "npm test", 15 | "commitmsg": "validate-commit-msg", 16 | "semantic-release": "semantic-release pre && npm publish && semantic-release post" 17 | }, 18 | "keywords": [], 19 | "author": "Mikeal Rogers (http://www.mikealrogers.com)", 20 | "license": "Apache-2.0", 21 | "config": { 22 | "commitizen": { 23 | "path": "./node_modules/cz-conventional-changelog" 24 | } 25 | }, 26 | "dependencies": { 27 | "babel-minify": "^0.2.0", 28 | "bl": "^1.2.1", 29 | "browserify": "^14.4.0", 30 | "commitizen": "^2.9.6", 31 | "load-js": "^2.0.0", 32 | "mkdirp": "^0.5.1", 33 | "rimraf": "^2.6.2" 34 | }, 35 | "devDependencies": { 36 | "standard": "^10.0.3", 37 | "cz-conventional-changelog": "^2.0.0", 38 | "husky": "^0.14.3", 39 | "semantic-release": "^8.0.3", 40 | "validate-commit-msg": "^2.14.0" 41 | }, 42 | "repository": { 43 | "type": "git", 44 | "url": "https://github.com/mikeal/distjs.git" 45 | } 46 | } 47 | --------------------------------------------------------------------------------