├── .gitignore ├── .travis.yml ├── README.md ├── css-ns.d.ts ├── css-ns.js ├── css-ns.spec.js ├── demo ├── less │ ├── .gitignore │ ├── input.less │ ├── output.css │ └── package.json ├── postcss │ ├── .gitignore │ ├── input.css │ ├── output.css │ └── package.json ├── react │ ├── .gitignore │ ├── README.md │ ├── app │ │ ├── index.html │ │ ├── index.js │ │ ├── index.scss │ │ ├── ui │ │ │ ├── ConversationPanel.js │ │ │ ├── ReactDemoApp.js │ │ │ └── ThreadListPanel.js │ │ └── util │ │ │ ├── css-ns.js │ │ │ └── data.js │ ├── dist │ │ └── .gitkeep │ ├── node_modules │ │ └── css-ns │ └── package.json ├── stylus │ ├── .gitignore │ ├── input.styl │ ├── output.css │ └── package.json └── vanilla │ ├── .gitignore │ ├── app │ ├── index.html │ └── index.js │ ├── dist │ └── .gitkeep │ ├── node_modules │ └── css-ns │ └── package.json ├── dist └── .gitkeep ├── logo.png ├── logo.svg ├── package-lock.json ├── package.json ├── selenium.png ├── selenium └── suite.spec.js └── test ├── index.html ├── mocha.css └── mocha.js /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .env 3 | .DS_Store 4 | /node_modules 5 | /.history 6 | /.vscode 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "7" 4 | - "8" 5 | - "9" 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![css-ns](logo.png) 2 | 3 | [![Build Status](https://travis-ci.org/jareware/css-ns.svg?branch=master)](https://travis-ci.org/jareware/css-ns) [![Dependency Status](https://david-dm.org/jareware/css-ns.svg)](https://david-dm.org/jareware/css-ns) [![devDependency Status](https://david-dm.org/jareware/css-ns/dev-status.svg)](https://david-dm.org/jareware/css-ns#info=devDependencies) 4 | 5 | ## tl;dr 6 | 7 | There's no shortage of solutions to the [problem of global CSS](https://medium.com/seek-ui-engineering/the-end-of-global-css-90d2a4a06284). The properties that set this one apart: 8 | 9 | * **It's very simple**, on the order of 100 [well](css-ns.spec.js)-[tested](selenium.png) lines of JS, with [0 dependencies](package.json). 10 | * **Works with all your favorite styling languages**, including [Sass](#use-with-sass), [PostCSS](#use-with-postcss), [Less](#use-with-less) and [Stylus](#use-with-stylus). 11 | * **Doesn't rely on a specific bundler**, meaning you can use [Browserify](http://browserify.org/), [webpack](https://webpack.github.io/), [RequireJS](http://requirejs.org/), or any bundler-de-jour. 12 | * **Isn't tied to any UI framework**, but has opt-in convenience for [use with React](#usage-example). 13 | * **Generates stable and predictable class names** for external parties, such as the consumers of your UI library on [npm](https://www.npmjs.com/), or your test automation system. 14 | 15 | The core API is very straightforward: 16 | 17 | ```js 18 | var ns = require('css-ns')('MyComponent'); 19 | 20 | ns('foo') // "MyComponent-foo" 21 | ``` 22 | 23 | Everything else is just added convenience for working with class names: 24 | 25 | ```js 26 | // Multiple class names: 27 | ns('foo bar') // "MyComponent-foo MyComponent-bar" 28 | 29 | // Dynamic list of class names, filtering falsy ones out: 30 | ns([ 'foo', null, 'bar' ]) // "MyComponent-foo MyComponent-bar" 31 | 32 | // Providing class names as object properties: 33 | ns({ foo: true, unwanted: false, bar: true }) // "MyComponent-foo MyComponent-bar" 34 | 35 | // Escaping the namespace where needed: 36 | ns('foo =icon-star') // "MyComponent-foo icon-star" 37 | ``` 38 | 39 | And with the optional [React integration](#use-with-react): 40 | 41 | ```jsx 42 | // Simplest possible integration: 43 |
//
44 | 45 | // Namespacing existing elements: 46 | ns(
) //
47 | 48 | // Creating a namespace-bound React instance: 49 | var { React } = require('./config/css-ns')('MyComponent'); 50 |
//
51 |
//
52 | ``` 53 | 54 | Creating a bound React instance is a powerful way of **enforcing a namespace** within a file. 55 | 56 | ## Getting started 57 | 58 | Install with: 59 | 60 | ``` 61 | $ npm install --save css-ns 62 | ``` 63 | 64 | Then, create a namespace function: 65 | 66 | ```js 67 | var ns = require('css-ns')('MyComponent'); 68 | ``` 69 | 70 | ## Usage example 71 | 72 | It's easy to add `css-ns` to most frameworks and workflows. For example, if you happen to use React, this is what `MyComponent.js` might look like: 73 | 74 | ```jsx 75 | var ns = require('css-ns')('MyComponent'); 76 | 77 | module.exports = (props) => ( 78 |
79 |
81 | ); 82 | ``` 83 | 84 | This component produces the following DOM when rendered with truthy `props.isActive`: 85 | 86 | ```html 87 |
88 | 89 |
90 | ``` 91 | 92 | To ensure you won't accidentally forget to wrap a `className` with `ns()`, you can use the optional [React integration](#use-with-react). Here we also use [`__filename`](https://nodejs.org/api/globals.html#globals_filename) (supported by node, Browserify, webpack and others) to make sure our namespace always matches the file that contains it: 93 | 94 | ```jsx 95 | // Instead of requiring React directly, let's require a 96 | // wrapped version that's bound to the current namespace: 97 | var { React } = require('./config/css-ns')(__filename); 98 | 99 | // All className props within this file are automatically fed through css-ns. There's really no 100 | // magic here; keep in mind
is just JSX sugar for React.createElement('div', {}); 101 | module.exports = (props) => ( 102 |
103 |
105 | ); 106 | ``` 107 | 108 | You'll note we also `require('./config/css-ns')`; this is explained thoroughly in [Configuration](#configuration). 109 | 110 | Finally, if we were to style this component [using Sass](#use-with-sass), those styles could be: 111 | 112 | ```scss 113 | .MyComponent { 114 | background: white; 115 | 116 | &-isActive { 117 | background: cyan; 118 | } 119 | 120 | &-submit { 121 | font-weight: bold; 122 | } 123 | } 124 | ``` 125 | 126 | The `&` reference is a [Sass built-in](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#parent-selector), no plugins needed. 127 | 128 | ## Configuration 129 | 130 | The simple `require('css-ns')(__filename)` one-liner might very well be enough for some projects. If you need to set some options, however, it might become tedious to repeat them in every file. Having an `.*rc`-style configuration file would tie `css-ns` to environments with a file system (browsers don't have one), so to create a configuration file, just use whatever module system you're already using. Let's say we're using ES6: 131 | 132 | ```js 133 | // e.g. config/css-ns.js 134 | 135 | import { createCssNs } from 'css-ns'; 136 | 137 | export default namespace => createCssNs({ 138 | namespace, 139 | exclude: /^fa-/ // exclude Font Awesome classes, as they have their own "fa-" namespace 140 | }); 141 | ``` 142 | 143 | Then, to create a local namespace with the `exclude` option set: 144 | 145 | ```js 146 | import createCssNs from './config/css-ns'; // instead of the global 'css-ns' 147 | 148 | const ns = createCssNs(__filename); 149 | ``` 150 | 151 | Or, in the more compact CommonJS form: 152 | 153 | ```js 154 | var ns = require('./config/css-ns')(__filename); 155 | ``` 156 | 157 | There's also a [complete demo app](demo/react) configured this way. 158 | 159 | ## API 160 | 161 | The `createCssNs()` factory takes either a string or an options object as its single argument: 162 | 163 | ```js 164 | var createCssNs = require('css-ns'); 165 | 166 | // This shorthand syntax... 167 | var ns = createCssNs(__filename); 168 | 169 | // ...is equivalent to this options object: 170 | var ns = createCssNs({ 171 | namespace: __filename 172 | }); 173 | ``` 174 | 175 | All available options are: 176 | 177 | | Option | Type | Default | Description 178 | |----------------|--------|------------|------------ 179 | | `namespace` | string | (none) | Mandatory base part for the namespace, e.g. `"MyComponent"` or `__filename`. For convenience, a possible file path and suffix are ignored, so that if the provided value is `"/path/to/MyComponent.js"`, the resulting namespace will still be `"MyComponent"`. 180 | | `prefix` | string | `""` | All namespaces are prefixed with this string. By default, namespaces aren't prefixed. Class names that begin with this `prefix` are automatically excluded . 181 | | `include` | regex | `/^[a-z]/` | Only class names matching this regex are namespaced. By default, only ones starting in lower-case are. This works out nicely with upper-cased `namespace` values: it ensures only one namespace can be applied to a class name, and calling `ns()` multiple times has the same effect as calling it once. 182 | | `exclude` | regex | `/^$/` | Class names matching this regex are not namespaced. By default, nothing is excluded (since `/^$/` won't ever match a class name). When both `include` and `exclude` match, `exclude` wins. 183 | | `escape` | string | `"="` | Class names beginning with this string are not namespaced. By default, `=` is used for escaping. 184 | | `self` | regex | `/^this$/` | Class names matching this regex are replaced with the name of the namespace itself. This allows you to e.g. mark the root of your UI component without any suffixes, just the component name. 185 | | `glue` | string | `"-"` | This string is used to combine the namespace and the class name. 186 | | `React` | object | (none) | Providing this option enables React integration. When provided, must be an instance of React, e.g. `{ react: require('react') }`. See [Use with React](#use-with-react) for details. 187 | 188 | ## Use with React 189 | 190 | By default, `css-ns` doesn't use or depend on React in any way. This ensures bundlers don't get confused in projects that don't need the React integration. To enable React integration, provide the [`React` option](#api) for `createCssNs()`: 191 | 192 | ```js 193 | // e.g. config/css-ns.js 194 | 195 | var createCssNs = require('css-ns'); 196 | var React = require('react'); 197 | 198 | module.exports = function(namespace) { 199 | return createCssNs({ 200 | namespace, 201 | React 202 | }); 203 | }; 204 | ``` 205 | 206 | ### Wrapped React instance 207 | 208 | Providing the `React` option will expose a wrapped React instance on resulting namespace functions: 209 | 210 | ```js 211 | var ns = require('./config/css-ns')('MyComponent'); 212 | 213 | ns.React.createElement('div', { className: 'foo' }) //
214 | ``` 215 | 216 | Because JSX just sugar for `React.createElement()` calls, this allows you to: 217 | 218 | ```jsx 219 | var { React } = require('./config/css-ns')('MyComponent'); 220 | 221 |
//
222 | ``` 223 | 224 | The wrapping is in fact [extremely thin](https://github.com/jareware/css-ns/blob/b62b5d4aef6d8c43707622da2fa63eeb601bdb66/css-ns.js#L70-L77), and everything except `React.createElement()` is just inherited from React proper. 225 | 226 | ### Namespacing existing React elements 227 | 228 | Providing the `React` option will also enable support for React elements in the `ns()` function, so that: 229 | 230 | ```jsx 231 | var React = require('react'); // vanilla, non-wrapped React instance 232 | 233 | ns(
) //
234 | ``` 235 | 236 | This can be useful in the (rare) cases where your namespace has to be dynamically applied to elements created by some other module. Because the only safe way to do this is to invoke `React.cloneElement()` under the hood, it can have performance implications if overused. 237 | 238 | ## Use with Sass 239 | 240 | Use with [Sass](http://sass-lang.com/) requires no special support or plugins. This input: 241 | 242 | ```scss 243 | .MyComponent { 244 | background: cyan; 245 | 246 | &-row { 247 | color: red; 248 | } 249 | } 250 | ``` 251 | 252 | will be compiled to this CSS: 253 | 254 | ```css 255 | .MyComponent { 256 | background: cyan; 257 | } 258 | .MyComponent-row { 259 | color: red; 260 | } 261 | ``` 262 | 263 | ## Use with PostCSS 264 | 265 | Use with [PostCSS](https://github.com/postcss/postcss) is easiest with the [`postcss-nested`](https://github.com/postcss/postcss-nested) plugin. With it, this input: 266 | 267 | ```scss 268 | .MyComponent { 269 | background: cyan; 270 | 271 | &-row { 272 | color: red; 273 | } 274 | } 275 | ``` 276 | 277 | will be compiled to this CSS: 278 | 279 | ```css 280 | .MyComponent { 281 | background: cyan; 282 | } 283 | .MyComponent-row { 284 | color: red; 285 | } 286 | ``` 287 | 288 | ## Use with Less 289 | 290 | Use with [Less](http://lesscss.org/) requires no special support or plugins. This input: 291 | 292 | ```less 293 | .MyComponent { 294 | background: cyan; 295 | 296 | &-row { 297 | color: red; 298 | } 299 | } 300 | ``` 301 | 302 | will be compiled to this CSS: 303 | 304 | ```css 305 | .MyComponent { 306 | background: cyan; 307 | } 308 | .MyComponent-row { 309 | color: red; 310 | } 311 | ``` 312 | 313 | ## Use with Stylus 314 | 315 | Use with [Stylus](http://stylus-lang.com/) requires no special support or plugins. This input: 316 | 317 | ``` 318 | .MyComponent 319 | background: cyan 320 | 321 | &-row 322 | color: red 323 | ``` 324 | 325 | will be compiled to this CSS: 326 | 327 | ```css 328 | .MyComponent { 329 | background: cyan; 330 | } 331 | .MyComponent-row { 332 | color: red; 333 | } 334 | ``` 335 | 336 | ## Test suite 337 | 338 | The web-based test suite is available at http://jrw.fi/css-ns/. 339 | 340 | ## Release 341 | 342 | 1. Bump version number in `package.json` 343 | 1. `$ git commit -m "Version bump for release." && git push` 344 | 1. `$ cp css-ns.{js,d.ts} package.json dist/` 345 | 1. `$ cd dist && npm publish` 346 | 1. Create release on GitHub, e.g. `v1.1.3` 347 | 348 | ## Licence 349 | 350 | [MIT](https://opensource.org/licenses/MIT) 351 | -------------------------------------------------------------------------------- /css-ns.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'css-ns' { 2 | interface Options { 3 | namespace: string; 4 | prefix?: string; 5 | include?: RegExp; 6 | exclude?: RegExp; 7 | self?: RegExp; 8 | glue?: string; 9 | escape?: string; 10 | React?: R; 11 | } 12 | 13 | type ClassMap = { [className: string]: boolean }; 14 | type ReactElement = any; 15 | 16 | export interface NsFunction { 17 | (classNames: string | any[] | ClassMap): string; 18 | (reactElement: T): T; 19 | React: R; 20 | } 21 | 22 | export const createCssNs: (options: Options | string) => NsFunction; 23 | } 24 | -------------------------------------------------------------------------------- /css-ns.js: -------------------------------------------------------------------------------- 1 | module.exports = createCssNs; 2 | module.exports.createCssNs = createCssNs; 3 | module.exports.createOptions = createOptions; 4 | module.exports.createReact = createReact; 5 | module.exports.nsAuto = nsAuto; 6 | module.exports.nsString = nsString; 7 | module.exports.nsArray = nsArray; 8 | module.exports.nsObject = nsObject; 9 | module.exports.nsReactElement = nsReactElement; 10 | 11 | var FILE_BASENAME = /.*[\/\\]([\w-]+).*/; 12 | 13 | function isString(x) { 14 | return typeof x === 'string'; 15 | } 16 | 17 | function isArray(x) { 18 | return Array.isArray(x); 19 | } 20 | 21 | function isObject(x) { 22 | return typeof x === 'object' && !isArray(x) && x !== null; 23 | } 24 | 25 | function isRegex(x) { 26 | return x instanceof RegExp; 27 | } 28 | 29 | function isReactElement(opt, x) { 30 | return opt.React && opt.React.isValidElement(x); 31 | } 32 | 33 | function assert(truthyValue, message) { 34 | if (!truthyValue) throw new Error(message); 35 | } 36 | 37 | function assertOptionType(assertion, readableType, name, value) { 38 | assert(assertion(value), 'The "' + name + '" option must be of type ' + readableType + ', got: ' + value); 39 | return value; 40 | } 41 | 42 | var assertRegexOption = assertOptionType.bind(null, isRegex, 'RegExp'); 43 | var assertStringOption = assertOptionType.bind(null, isString, 'string'); 44 | var assertObjectOption = assertOptionType.bind(null, isObject, 'object'); 45 | 46 | function createOptions(raw) { 47 | if (raw._cssNsOpts) return raw; // already processed, let's skip any extra work 48 | if (isString(raw)) return createOptions({ namespace: raw }); // shorthand for just specifying the namespace 49 | assert(isObject(raw), 'Options must be provided either as an object or a string, got: ' + raw); 50 | return { 51 | namespace: assertStringOption( 'namespace', raw.namespace).replace(FILE_BASENAME, '$1'), // e.g. "/path/to/MyComponent.js" becomes "MyComponent" 52 | prefix: assertStringOption( 'prefix', raw.prefix || ''), // e.g. "myapp-" 53 | include: assertRegexOption( 'include', raw.include || /^[a-z]/), // assume upper-cased classes are other components 54 | exclude: assertRegexOption( 'exclude', raw.exclude || /^$/), // don't exclude anything by default (this regex will never match anything of relevance) 55 | escape: assertStringOption( 'escape', raw.escape || '='), // escape classes beginning with "="" by default 56 | self: assertRegexOption( 'self', raw.self || /^this$/), // "this" references the current component directly 57 | glue: assertStringOption( 'glue', raw.glue || '-'), // allows e.g. "MyComponent_foo" when set to "_" 58 | React: raw.React && assertObjectOption('React', raw.React) || null, // passing in a React instance enables the React convenience methods 59 | _cssNsOpts: true // flag signaling that options are already processed, and don't need to be processed again 60 | }; 61 | } 62 | 63 | function createCssNs(options) { 64 | var opt = createOptions(options); 65 | var ns = nsAuto.bind(null, opt); 66 | ns.ns = ns; // allows: const { ns, React } = createCssNs(__filename); 67 | if (opt.React) ns.React = createReact(opt, ns); 68 | return ns; 69 | } 70 | 71 | function createReact(options, ns) { 72 | var opt = createOptions(options); 73 | ns = ns || nsAuto.bind(null, opt); // avoid creating another bound version of nsAuto() if our caller already provided one 74 | assert(opt.React, 'React support must be explicitly enabled by providing the "React" option'); 75 | return Object.create(opt.React, { // inherit everything from standard React 76 | createElement: { // ...except hijack createElement() 77 | value: function(_, props) { 78 | if (props) props.className = ns(props.className); 79 | return opt.React.createElement.apply(opt.React, arguments); 80 | } 81 | } 82 | }); 83 | } 84 | 85 | function nsAuto(options, x) { 86 | var opt = createOptions(options); 87 | if (isReactElement(opt, x)) 88 | return nsReactElement(opt, x); 89 | else if (isString(x)) 90 | return nsString(opt, x); 91 | else if (isArray(x)) 92 | return nsArray(opt, x); 93 | else if (isObject(x)) 94 | return nsObject(opt, x); 95 | else // input was something we don't understand (e.g. a falsy value) -> pass it through 96 | return x; 97 | } 98 | 99 | function nsString(options, string) { 100 | assert(isString(string), 'nsString() expects string input, got: ' + string); 101 | var opt = createOptions(options); 102 | return string.split(/\s+/).map(function(cls) { 103 | if (cls.match(opt.self)) // e.g. "this" 104 | return opt.prefix + opt.namespace; 105 | else if (opt.prefix && cls.substr(0, opt.prefix.length) === opt.prefix) // already prefixed 106 | return cls; // => don't touch it 107 | else if (opt.escape && cls.length >= opt.escape.length && cls.substr(0, opt.escape.length) === opt.escape) 108 | return cls.substr(opt.escape.length); // => remove the escape sign 109 | else if (cls.match(opt.include) && !cls.match(opt.exclude)) // matching non-prefixed, non-namespaced class name 110 | return opt.prefix + opt.namespace + opt.glue + cls; // => prefix & namespace 111 | else // something else 112 | return cls; // => don't touch it 113 | }).join(' ').trim(); 114 | } 115 | 116 | function nsArray(options, array) { 117 | assert(isArray(array), 'nsArray() expects array input, got: ' + array); 118 | var opt = createOptions(options); 119 | return array 120 | .filter(function(x) { return !!x }) 121 | .map(nsString.bind(null, opt)) 122 | .join(' '); 123 | } 124 | 125 | function nsObject(options, object) { 126 | assert(isObject(object), 'nsObject() expects object input, got: ' + object); 127 | var opt = createOptions(options); 128 | return nsArray(opt, Object.keys(object).map(function(key) { 129 | return object[key] ? key : null; 130 | })); 131 | } 132 | 133 | function nsReactElement(options, el) { 134 | if (isString(el)) return el; // we're mapping a text node -> leave it be 135 | var opt = createOptions(options); 136 | assert(isReactElement(opt, el), 'nsReactElement() expects a valid React element, got: ' + el); 137 | var props = el.props.className ? { className: nsAuto(opt, el.props.className) } : el.props; 138 | var children = opt.React.Children.map(el.props.children, nsReactElement.bind(null, opt)); 139 | return opt.React.cloneElement(el, props, children); 140 | } 141 | -------------------------------------------------------------------------------- /css-ns.spec.js: -------------------------------------------------------------------------------- 1 | var assert = require('chai').assert; // @see http://chaijs.com/api/assert/ 2 | var cssNs = require('./css-ns'); 3 | var React = require('react'); 4 | var ReactDOMServer = require('react-dom/server'); 5 | 6 | function assertEqualHtml(Component, expectedHtml) { 7 | assert.deepEqual( 8 | ReactDOMServer.renderToStaticMarkup(React.createElement(Component)), 9 | expectedHtml 10 | ); 11 | } 12 | 13 | // Enable this to repeat the test suite a few times 14 | // for (var i = 0; i < 100; i++) 15 | 16 | describe('css-ns', function() { 17 | 18 | describe('createOptions()', function() { 19 | 20 | it('accepts a string', function() { 21 | assert.deepEqual( 22 | cssNs.createOptions('MyComponent').namespace, 23 | 'MyComponent' 24 | ); 25 | }); 26 | 27 | it('accepts a file path', function() { 28 | assert.deepEqual( 29 | cssNs.createOptions('/path/to/MyComponent.jsx').namespace, 30 | 'MyComponent' 31 | ); 32 | }); 33 | 34 | it('accepts a relative file path', function() { 35 | assert.deepEqual( 36 | cssNs.createOptions('../MyComponent.jsx').namespace, 37 | 'MyComponent' 38 | ); 39 | }); 40 | 41 | it('accepts a full Windows file path', function() { 42 | assert.deepEqual( 43 | cssNs.createOptions('C:\\Users\\path\\to\\MyComponent.jsx').namespace, 44 | 'MyComponent' 45 | ); 46 | }); 47 | 48 | it('accepts a full Windows file path with whitespace', function() { 49 | assert.deepEqual( 50 | cssNs.createOptions('C:\\Program Files\\path\\to\\MyComponent.js').namespace, 51 | 'MyComponent' 52 | ); 53 | }); 54 | 55 | it('accepts underscores in file names', function() { 56 | assert.deepEqual( 57 | cssNs.createOptions('../my_component.jsx').namespace, 58 | 'my_component' 59 | ); 60 | }); 61 | 62 | it('processes options only once', function() { 63 | assert.deepEqual( 64 | cssNs.createOptions(cssNs.createOptions('MyComponent')).namespace, 65 | 'MyComponent' 66 | ); 67 | }); 68 | 69 | it('accepts an object', function() { 70 | assert.deepEqual( 71 | cssNs.createOptions({ namespace: 'MyComponent' }).namespace, 72 | 'MyComponent' 73 | ); 74 | }); 75 | 76 | }); 77 | 78 | describe('nsAuto()', function() { 79 | 80 | it('handles falsy input', function() { 81 | assert.equal(cssNs.nsAuto('MyComponent', null), null); 82 | }); 83 | 84 | it('handles class list input', function() { 85 | assert.equal(cssNs.nsAuto('Foo', 'bar'), 'Foo-bar'); 86 | }); 87 | 88 | it('handles React element input', function() { 89 | var MyComponent = function() { 90 | return cssNs.nsAuto( 91 | { namespace: 'MyComponent', React: React }, 92 | React.createElement('div', { className: 'row' }) 93 | ); 94 | }; 95 | assertEqualHtml( 96 | MyComponent, 97 | '
' 98 | ); 99 | }); 100 | 101 | }); 102 | 103 | describe('nsString()', function() { 104 | 105 | it('prefixes a single class', function() { 106 | assert.equal(cssNs.nsString('Foo', 'bar'), 'Foo-bar'); 107 | }); 108 | 109 | it('prefixes multiple classes', function() { 110 | assert.equal(cssNs.nsString('Foo', 'bar baz'), 'Foo-bar Foo-baz'); 111 | }); 112 | 113 | it('tolerates exotic classNames and whitespace', function() { 114 | // ...not that using these would be a good idea for other reasons, but we won't judge! 115 | assert.equal(cssNs.nsString('Foo', ' bar-baz lol{wtf$why%would__ANYONE"do.this} '), 'Foo-bar-baz Foo-lol{wtf$why%would__ANYONE"do.this}'); 116 | }); 117 | 118 | it('supports an include option', function() { 119 | var options = { 120 | namespace: 'Foo', 121 | include: /^b/ // only prefix classes that start with b 122 | }; 123 | assert.equal( 124 | cssNs.nsString(options, 'bar AnotherComponent car'), 125 | 'Foo-bar AnotherComponent car' 126 | ); 127 | }); 128 | 129 | it('supports an exclude option', function() { 130 | var options = { 131 | namespace: 'Foo', 132 | exclude: /^([A-Z]|icon)/ // ignore classes that start with caps or "icon" 133 | }; 134 | assert.equal( 135 | cssNs.nsString(options, 'bar AnotherComponent iconInfo baz'), 136 | 'Foo-bar AnotherComponent iconInfo Foo-baz' 137 | ); 138 | }); 139 | 140 | it('supports both include and exclude at the same time', function() { 141 | var options = { 142 | namespace: 'Foo', 143 | include: /^[a-z]/, // include classes that start with lower-case 144 | exclude: /^icon/ // ...but still ignore the "icon" prefix 145 | }; 146 | assert.equal( 147 | cssNs.nsString(options, 'bar iconInfo baz'), 148 | 'Foo-bar iconInfo Foo-baz' 149 | ); 150 | }); 151 | 152 | it('supports escaping', function() { 153 | var options = { 154 | namespace: 'Foo', 155 | escape: '~' 156 | }; 157 | assert.equal(cssNs.nsString(options, '~bar'), 'bar'); 158 | }); 159 | 160 | it('supports an exotic escape string', function() { 161 | var options = { 162 | namespace: 'Foo', 163 | escape: '@]]£20as+d09a+s+fsdkjnf' 164 | }; 165 | assert.equal(cssNs.nsString(options, '@]]£20as+d09a+s+fsdkjnfbar car'), 'bar Foo-car'); 166 | }); 167 | 168 | it('supports escaping with the default option', function() { 169 | var options = { 170 | namespace: 'Foo' 171 | }; 172 | assert.equal(cssNs.nsString(options, '=bar car'), 'bar Foo-car'); 173 | }); 174 | 175 | it('supports a self option', function() { 176 | var options = { 177 | namespace: 'Foo', 178 | self: /^__ns__$/ 179 | }; 180 | assert.equal(cssNs.nsString(options, '__ns__ bar'), 'Foo Foo-bar'); 181 | }); 182 | 183 | it('supports a glue option', function() { 184 | var options = { 185 | namespace: 'Foo', 186 | glue: '___' 187 | }; 188 | assert.equal(cssNs.nsString(options, 'bar'), 'Foo___bar'); 189 | }); 190 | 191 | describe('with prefix', function() { 192 | 193 | it('prefixes a single class', function() { 194 | assert.equal(cssNs.nsString({ prefix: 'app-', namespace: 'Foo' }, 'bar'), 'app-Foo-bar'); 195 | }); 196 | 197 | it('prefixes multiple classes', function() { 198 | assert.equal(cssNs.nsString({ prefix: 'app-', namespace: 'Foo' }, 'bar baz'), 'app-Foo-bar app-Foo-baz'); 199 | }); 200 | 201 | it('tolerates exotic classNames and whitespace', function() { 202 | // ...not that using these would be a good idea for other reasons, but we won't judge! 203 | assert.equal(cssNs.nsString({ prefix: 'app-', namespace: 'Foo' }, ' bar-baz lol{wtf$why%would__ANYONE"do.this} '), 'app-Foo-bar-baz app-Foo-lol{wtf$why%would__ANYONE"do.this}'); 204 | }); 205 | 206 | it('supports an include option', function() { 207 | var options = { 208 | prefix: 'app-', 209 | namespace: 'Foo', 210 | include: /^b/ // only prefix classes that start with b 211 | }; 212 | assert.equal( 213 | cssNs.nsString(options, 'bar AnotherComponent car'), 214 | 'app-Foo-bar AnotherComponent car' 215 | ); 216 | }); 217 | 218 | it('supports an exclude option', function() { 219 | var options = { 220 | prefix: 'app-', 221 | namespace: 'Foo', 222 | exclude: /^([A-Z]|icon)/ // ignore classes that start with caps or "icon" 223 | }; 224 | assert.equal( 225 | cssNs.nsString(options, 'bar AnotherComponent iconInfo baz'), 226 | 'app-Foo-bar AnotherComponent iconInfo app-Foo-baz' 227 | ); 228 | }); 229 | 230 | it('supports both include and exclude at the same time', function() { 231 | var options = { 232 | prefix: 'app-', 233 | namespace: 'Foo', 234 | include: /^[a-z]/, // include classes that start with lower-case 235 | exclude: /^icon/ // ...but still ignore the "icon" prefix 236 | }; 237 | assert.equal( 238 | cssNs.nsString(options, 'bar iconInfo baz'), 239 | 'app-Foo-bar iconInfo app-Foo-baz' 240 | ); 241 | }); 242 | 243 | it('supports a self option', function() { 244 | var options = { 245 | prefix: 'app-', 246 | namespace: 'Foo', 247 | self: /^__ns__$/ 248 | }; 249 | assert.equal(cssNs.nsString(options, '__ns__ bar'), 'app-Foo app-Foo-bar'); 250 | }); 251 | 252 | it('supports a glue option', function() { 253 | var options = { 254 | prefix: 'app-', 255 | namespace: 'Foo', 256 | glue: '___' 257 | }; 258 | assert.equal(cssNs.nsString(options, 'bar'), 'app-Foo___bar'); 259 | }); 260 | 261 | it('automatically ignores pre-prefixed classes', function() { 262 | var options = { 263 | prefix: 'app-', 264 | namespace: 'Foo' 265 | }; 266 | assert.equal( 267 | cssNs.nsString(options, 'bar app-AnotherComponent app-car'), 268 | 'app-Foo-bar app-AnotherComponent app-car' 269 | ); 270 | }); 271 | 272 | }); 273 | 274 | }); 275 | 276 | describe('nsArray()', function() { 277 | 278 | it('prefixes classes', function() { 279 | assert.equal(cssNs.nsArray('Foo', [ 'bar', 'baz' ]), 'Foo-bar Foo-baz'); 280 | }); 281 | 282 | it('tolerates falsy values', function() { 283 | assert.equal(cssNs.nsArray('Foo', [ 'bar', null, 'baz', false ]), 'Foo-bar Foo-baz'); 284 | }); 285 | 286 | }); 287 | 288 | describe('nsObject()', function() { 289 | 290 | it('prefixes classes', function() { 291 | assert.equal(cssNs.nsObject('Foo', { bar: true, baz: true }), 'Foo-bar Foo-baz'); 292 | }); 293 | 294 | it('tolerates falsy values', function() { 295 | assert.equal(cssNs.nsObject('Foo', { bar: true, ignoreThis: null, baz: true, alsoThis: false }), 'Foo-bar Foo-baz'); 296 | }); 297 | 298 | }); 299 | 300 | describe('createReact()', function() { 301 | 302 | it('creates an ns-bound React instance', function() { 303 | var nsReact = cssNs.createReact({ namespace: 'MyComponent', React: React }); 304 | var MyComponent = function() { 305 | return nsReact.createElement('div', { className: 'row' }); 306 | }; 307 | assertEqualHtml( 308 | MyComponent, 309 | '
' 310 | ); 311 | }); 312 | 313 | it('prefixes classNames on components as well', function() { 314 | // This is a bit of an edge case, since for a component, a prop called "className" holds no special value. 315 | // But if you're using a prop with that name it's highly likely this is the behaviour you want. 316 | var nsReact = cssNs.createReact({ namespace: 'MyComponent', React: React }); 317 | var MyChildComponent = function(props) { 318 | return nsReact.createElement('div', { className: props.className }); 319 | // ^ this won't get double-namespaced, but only because we ignore uppercased classes by default; otherwise it would 320 | }; 321 | var MyComponent = function() { 322 | return nsReact.createElement(MyChildComponent, { className: 'parentInjectedName' }) 323 | }; 324 | assertEqualHtml( 325 | MyComponent, 326 | '
' 327 | ); 328 | }); 329 | 330 | }); 331 | 332 | describe('nsReactElement()', function() { 333 | 334 | var nsReactElement = cssNs.nsReactElement.bind(null, { // bind default options 335 | namespace: 'MyComponent', 336 | React: React 337 | }); 338 | 339 | it('prefixes a single className', function() { 340 | var MyComponent = function() { 341 | return nsReactElement( 342 | React.createElement('div', { className: 'row' }) 343 | ); 344 | }; 345 | assertEqualHtml( 346 | MyComponent, 347 | '
' 348 | ); 349 | }); 350 | 351 | it('ignores text nodes', function() { 352 | var MyComponent = function() { 353 | return nsReactElement( 354 | React.createElement('div', { className: 'row' }, 'Hello World') 355 | ); 356 | }; 357 | assertEqualHtml( 358 | MyComponent, 359 | '
Hello World
' 360 | ); 361 | }); 362 | 363 | it('supports array input', function() { 364 | var MyComponent = function() { 365 | return nsReactElement( 366 | React.createElement('div', { className: [ 'row' ] }) 367 | ); 368 | }; 369 | assertEqualHtml( 370 | MyComponent, 371 | '
' 372 | ); 373 | }); 374 | 375 | it('supports object input', function() { 376 | var MyComponent = function() { 377 | return nsReactElement( 378 | React.createElement('div', { className: { row: true } }) 379 | ); 380 | }; 381 | assertEqualHtml( 382 | MyComponent, 383 | '
' 384 | ); 385 | }); 386 | 387 | it('prefixes classNames recursively', function() { 388 | var MyComponent = function() { 389 | return nsReactElement( 390 | React.createElement('div', { className: 'row' }, 391 | React.createElement('div', { className: 'column' }) 392 | ) 393 | ); 394 | }; 395 | assertEqualHtml( 396 | MyComponent, 397 | '
' 398 | ); 399 | }); 400 | 401 | it('allows elements without a className', function() { 402 | var MyComponent = function() { 403 | return nsReactElement( 404 | React.createElement('div', { className: 'row' }, 405 | React.createElement('section', null, 406 | React.createElement('div', { className: 'column' }) 407 | ) 408 | ) 409 | ); 410 | }; 411 | assertEqualHtml( 412 | MyComponent, 413 | '
' 414 | ); 415 | }); 416 | 417 | it('respects component boundaries', function() { 418 | var MyChildComponent = function() { 419 | return React.createElement('div', { className: 'protected' }); 420 | }; 421 | var MyComponent = function() { 422 | return nsReactElement( 423 | React.createElement('div', { className: 'container' }, 424 | React.createElement(MyChildComponent, null) 425 | ) 426 | ); 427 | }; 428 | assertEqualHtml( 429 | MyComponent, 430 | '
' 431 | ); 432 | }); 433 | 434 | it('respects ownership of children across components', function() { 435 | var MyChildComponent = function(props) { 436 | return React.createElement('div', { className: 'protected' }, props.children); 437 | }; 438 | var MyComponent = function() { 439 | return nsReactElement( 440 | React.createElement(MyChildComponent, null, 441 | React.createElement('div', { className: 'owned' }) // it doesn't matter that "owned" is a child of MyChildComponent, it's still OWNED by MyComponent 442 | ) 443 | ); 444 | }; 445 | assertEqualHtml( 446 | MyComponent, 447 | '
' 448 | ); 449 | }); 450 | 451 | it('works with nested components', function() { 452 | var MyChildComponent = function() { 453 | return cssNs.nsReactElement( 454 | { namespace: 'MyChildComponent', React: React }, 455 | React.createElement('div', { className: 'protected' }) 456 | ); 457 | }; 458 | var MyComponent = function() { 459 | return nsReactElement( 460 | React.createElement('div', { className: 'container' }, 461 | React.createElement(MyChildComponent, null) 462 | ) 463 | ); 464 | }; 465 | assertEqualHtml( 466 | MyComponent, 467 | '
' 468 | ); 469 | }); 470 | 471 | it('prefixes classNames on components as well', function() { 472 | // This is a bit of an edge case, since for a component, a prop called "className" holds no special value. 473 | // But if you're using a prop with that name it's highly likely this is the behaviour you want. 474 | var MyChildComponent = function(props) { 475 | return React.createElement('div', { className: props.className }); 476 | }; 477 | var MyComponent = function() { 478 | return nsReactElement( 479 | React.createElement(MyChildComponent, { className: 'parentInjectedName' }) 480 | ); 481 | }; 482 | assertEqualHtml( 483 | MyComponent, 484 | '
' 485 | ); 486 | }); 487 | 488 | }); 489 | 490 | }); 491 | -------------------------------------------------------------------------------- /demo/less/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /demo/less/input.less: -------------------------------------------------------------------------------- 1 | .MyComponent { 2 | 3 | &-row { 4 | color: red; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /demo/less/output.css: -------------------------------------------------------------------------------- 1 | .MyComponent-row { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /demo/less/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns_less-demo", 3 | "scripts": { 4 | "start": "lessc input.less output.css" 5 | }, 6 | "dependencies": { 7 | "less": "^2.5.3" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /demo/postcss/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /demo/postcss/input.css: -------------------------------------------------------------------------------- 1 | .MyComponent { 2 | 3 | &-row { 4 | color: red; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /demo/postcss/output.css: -------------------------------------------------------------------------------- 1 | .MyComponent-row { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /demo/postcss/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns_postcss-demo", 3 | "scripts": { 4 | "start": "postcss --use postcss-nested --output output.css input.css" 5 | }, 6 | "dependencies": { 7 | "postcss": "^5.0.14", 8 | "postcss-cli": "^2.3.3", 9 | "postcss-nested": "^1.0.0" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /demo/react/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/* 2 | !/node_modules/css-ns 3 | 4 | /dist/* 5 | -------------------------------------------------------------------------------- /demo/react/README.md: -------------------------------------------------------------------------------- 1 | # css-ns React demo 2 | 3 | ## Build performance notes 4 | 5 | At the time of writing (or committing). 6 | 7 | * Build with `uglifyjs --compress --mangle` is `409K`, but breaks `class` names 8 | * Build with `uglifyjs --compress --mangle --keep-fnames` is `435K`, and keeps names 9 | * Build with `uglifyjs --compress --mangle` but with [babel-plugin-react-class-display-name](https://github.com/researchgate/babel-plugin-react-class-display-name) is again `409K`, and keeps names 10 | * but see also [babel-plugin-react-class-display-name/issues/1](https://github.com/researchgate/babel-plugin-react-class-display-name/issues/1) 11 | 12 | **Conclusion:** `displayName` can be included in production builds for free in terms of file size, but not without a bit of a hassle. 13 | 14 | ## Runtime performance notes 15 | 16 | At the time of writing (or committing). In Chrome, with `SCALE_FACTOR = 10`. Application reloaded multiple times, and an "average" run was selected. Component render times are "exclusive render times" as reported by React's perf tools. This test run entails about 13,000 namespaced React elements (counted as the number of actual clones made by `nsReactElement()`). [See here about "manual namespacing"](https://github.com/jareware/css-ns/commit/1fb5e43aa2553a7ff5e05dfc7db152c0ac497671). 17 | 18 | | Setup | SingleMessage | SingleThread | Total | 19 | |:---|---:|---:|---:| 20 | | Dev build, no namespacing | 10 ms | 64 ms | 341 ms | 21 | | Dev build, with namespacing | 38 ms | 285 ms | 712 ms | 22 | | Dev build, with manual namespacing | 34 ms | 84 ms | 407 ms | 23 | | Prod build, no namespacing | n/a | n/a | 150 ms | 24 | | Prod build, with namespacing | n/a | n/a | 345 ms | 25 | | Prod build, with manual namespacing | n/a | n/a | 201 ms | 26 | 27 | **Conclusion:** Naive runtime-namespacing of ReactElements is quite costly, with roughly 4.5x penalty for the SingleThread component (dev build). The prod builds are much more important, though, and there the penalty for the whole app is roughly 2.5x. I'm sure this can be optimized in several ways, the most intriguing of which would be a Babel plugin for doing all non-dynamic namespacing already during compile time. 28 | -------------------------------------------------------------------------------- /demo/react/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | css-ns react-demo 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/react/app/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import Perf from 'react-addons-perf'; 4 | import ReactDemoApp from './ui/ReactDemoApp'; 5 | 6 | Perf.start(); // see https://facebook.github.io/react/docs/perf.html 7 | const then = Date.now(); 8 | ReactDOM.render(, document.querySelector('#container')); 9 | const now = Date.now(); 10 | Perf.stop(); 11 | 12 | // for NODE_ENV=production 13 | console.log('Total render time:', now - then, 'ms'); 14 | 15 | Perf.printInclusive(); 16 | Perf.printExclusive(); 17 | -------------------------------------------------------------------------------- /demo/react/app/index.scss: -------------------------------------------------------------------------------- 1 | body, html, #container { 2 | width: 100%; 3 | height: 100%; 4 | padding: 0; 5 | margin: 0; 6 | } 7 | 8 | .ReactDemoApp { 9 | display: flex; 10 | height: 100%; 11 | 12 | > .ThreadListPanel { 13 | width: 300px; 14 | margin: 20px; 15 | } 16 | > .ConversationPanel { 17 | flex: 1; 18 | margin: 20px; 19 | margin-left: 0; 20 | } 21 | } 22 | 23 | $verPadding: 15px; 24 | $horPadding: 15px; 25 | 26 | .ThreadListPanel { 27 | overflow: auto; 28 | 29 | &-thread { 30 | padding: 0 0 $verPadding 0; 31 | margin: 0 0 $verPadding 0; 32 | display: flex; 33 | border-bottom: 1px solid #ddd; 34 | cursor: pointer; 35 | } 36 | 37 | &-badge { 38 | width: 40px; 39 | height: 40px; 40 | margin-right: $horPadding; 41 | border-radius: 100%; 42 | text-align: center; 43 | color: white; 44 | overflow: hidden; 45 | font-size: 23px; 46 | padding-top: 4px; 47 | font-weight: 100; 48 | } 49 | 50 | &-details { 51 | flex: 1; 52 | color: #676767; 53 | } 54 | 55 | &-name { 56 | font-weight: bold; 57 | } 58 | 59 | &-message { 60 | white-space: nowrap; 61 | overflow: hidden; 62 | text-overflow: ellipsis; 63 | } 64 | } 65 | 66 | $verPadding: 15px; 67 | $horPadding: 50px; 68 | 69 | .ConversationPanel { 70 | overflow: auto; 71 | 72 | &-message { 73 | background: #F6F6F6; 74 | margin-bottom: $verPadding; 75 | padding: 8px 12px; 76 | margin-right: $horPadding; 77 | } 78 | 79 | &-mine { 80 | text-align: right; 81 | background: rgba(51, 122, 183, 0.25); 82 | margin-left: $horPadding; 83 | margin-right: 0; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /demo/react/app/ui/ConversationPanel.js: -------------------------------------------------------------------------------- 1 | import { Panel } from 'react-bootstrap'; 2 | import { getRandomMessages } from '../util/data'; 3 | 4 | const { React } = require('../util/css-ns')(__filename); 5 | 6 | class SingleMessage extends React.Component { 7 | 8 | render() { 9 | return ( 10 |
0.5 }}> 11 | {this.props.message} 12 |
13 | ); 14 | } 15 | 16 | } 17 | 18 | export default class ConversationPanel extends React.Component { 19 | 20 | render() { 21 | return ( 22 | 23 | {getRandomMessages().map((message, index) => ( 24 | 25 | ))} 26 | 27 | ); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /demo/react/app/ui/ReactDemoApp.js: -------------------------------------------------------------------------------- 1 | import createCssNs from 'css-ns'; 2 | import { Panel } from 'react-bootstrap'; 3 | import ThreadListPanel from './ThreadListPanel'; 4 | import ConversationPanel from './ConversationPanel'; 5 | 6 | const { React } = require('../util/css-ns')(__filename); 7 | 8 | export default class ReactDemoApp extends React.Component { 9 | 10 | render() { 11 | return ( 12 |
13 | 14 | 15 |
16 | ); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /demo/react/app/ui/ThreadListPanel.js: -------------------------------------------------------------------------------- 1 | import { Panel } from 'react-bootstrap'; 2 | import { getRandomNames, getRandomMessages, getRandomColors } from '../util/data'; 3 | 4 | const { React } = require('../util/css-ns')(__filename); 5 | 6 | const names = getRandomNames(); 7 | const messages = getRandomMessages(); 8 | const colors = getRandomColors(); 9 | 10 | // This remains disabled for now, since react-addons-perf can't count instances of stateless functional components (...yet?) 11 | /* 12 | const SingleThread = props => ns( 13 |
14 |
{props.name.substr(0, 1)}
15 |
16 |
{props.name}
17 |
{messages[props.index]}
18 |
19 |
20 | ); 21 | */ 22 | 23 | class SingleThread extends React.Component { 24 | 25 | render() { 26 | return ( 27 |
28 |
{this.props.name.substr(0, 1)}
29 |
30 |
{this.props.name}
31 |
{messages[this.props.index]}
32 |
{/* this cruft is here just to increase (non-namespaced) node count for perf tests */} 33 |
34 |
35 | ); 36 | } 37 | 38 | } 39 | 40 | export default class ThreadListPanel extends React.Component { 41 | 42 | render() { 43 | return ( 44 | 45 | {names.map((name, index) => ( 46 | 47 | ))} 48 | 49 | ); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /demo/react/app/util/css-ns.js: -------------------------------------------------------------------------------- 1 | import createCssNs from 'css-ns'; 2 | import React from 'react'; 3 | 4 | export default namespace => createCssNs({ 5 | namespace, 6 | React, 7 | exclude: /^material-icons/ 8 | }); 9 | -------------------------------------------------------------------------------- /demo/react/app/util/data.js: -------------------------------------------------------------------------------- 1 | const SCALE_FACTOR = 10; 2 | 3 | function scale(scaleFactor, inputArray) { 4 | return new Array(scaleFactor + 1) 5 | .join(' ') 6 | .split('') 7 | .map(() => inputArray) 8 | .reduce((prev, next) => prev.concat(next), []); 9 | } 10 | 11 | function shuffle(inputArray) { 12 | return [] 13 | .concat(inputArray) 14 | .sort(() => 0.5 - Math.random()); 15 | } 16 | 17 | export function getRandomColors() { 18 | return shuffle(scale(SCALE_FACTOR, [ // a 100, courtesy of http://llllll.li/randomColor/ 19 | '#7467c6', 20 | '#dc5ef2', 21 | '#7d02db', 22 | '#f4a1b4', 23 | '#f262f7', 24 | '#ba70e5', 25 | '#d0f282', 26 | '#4880ad', 27 | '#8de54e', 28 | '#391da5', 29 | '#5ff939', 30 | '#3fead6', 31 | '#bcbef4', 32 | '#a5e86a', 33 | '#110591', 34 | '#6ed87a', 35 | '#221670', 36 | '#e5a42b', 37 | '#c63c27', 38 | '#f7adee', 39 | '#fc948a', 40 | '#ea388b', 41 | '#f9343b', 42 | '#1929b7', 43 | '#83f268', 44 | '#1df448', 45 | '#83e041', 46 | '#a5f7ca', 47 | '#b7f23a', 48 | '#c98d1e', 49 | '#0befeb', 50 | '#bc5ed6', 51 | '#189963', 52 | '#dc81ea', 53 | '#54ea6a', 54 | '#20a396', 55 | '#5375b2', 56 | '#bfa901', 57 | '#119baa', 58 | '#f4d65f', 59 | '#7de8b0', 60 | '#ab53db', 61 | '#132470', 62 | '#61f9a8', 63 | '#11c9dd', 64 | '#38bc55', 65 | '#14fc5d', 66 | '#e5878f', 67 | '#b8dbfc', 68 | '#2074db', 69 | '#0e8757', 70 | '#338d9b', 71 | '#87e554', 72 | '#e09b11', 73 | '#76f7ca', 74 | '#b5acef', 75 | '#5fb526', 76 | '#4271aa', 77 | '#b25b05', 78 | '#fcef64', 79 | '#b8e85a', 80 | '#8571ce', 81 | '#d66659', 82 | '#669bc9', 83 | '#d272e5', 84 | '#c68707', 85 | '#e0599d', 86 | '#6d84ed', 87 | '#9e96e0', 88 | '#91eae1', 89 | '#2fe0a5', 90 | '#ea7983', 91 | '#68dbf2', 92 | '#50d8cb', 93 | '#4fa51a', 94 | '#4af224', 95 | '#ef0d09', 96 | '#a038d1', 97 | '#e89d78', 98 | '#abef62', 99 | '#d18dfc', 100 | '#ef9175', 101 | '#91eadb', 102 | '#0ec9bc', 103 | '#a8f7f7', 104 | '#e07fa9', 105 | '#cde22b', 106 | '#1e0b89', 107 | '#e08fd2', 108 | '#f9e6bd', 109 | '#c914a8', 110 | '#b1e6ef', 111 | '#aee8ef', 112 | '#adf774', 113 | '#eeef92', 114 | '#a6abea', 115 | '#e8d255', 116 | '#c64b21', 117 | '#ca7ff9', 118 | '#6f2faf' 119 | ])); 120 | } 121 | 122 | export function getRandomNames() { 123 | return shuffle(scale(SCALE_FACTOR, [ // a 100, courtesy of http://random-name-generator.info/random/?n=100&g=1&st=2 124 | 'Marianne Salazar', 125 | 'Alex Hernandez', 126 | 'Angela Park', 127 | 'Ricky Lyons', 128 | 'Carmen Garrett', 129 | 'Wm Schwartz', 130 | 'Wilbur Nguyen', 131 | 'Leigh Wilkins', 132 | 'Stephanie Dawson', 133 | 'Brian Walsh', 134 | 'Freda Washington', 135 | 'Karl Marshall', 136 | 'Lamar Reynolds', 137 | 'Blanca Ellis', 138 | 'Sue Smith', 139 | 'Gail Barker', 140 | 'Russell Stanley', 141 | 'Ollie Gutierrez', 142 | 'Dominic Rivera', 143 | 'Douglas Perez', 144 | 'Tasha Watson', 145 | 'Pamela Perry', 146 | 'Garry Nelson', 147 | 'Kevin Webster', 148 | 'Gayle Burgess', 149 | 'Fredrick Bowen', 150 | 'Paulette Ray', 151 | 'Luis Pearson', 152 | 'Erica Munoz', 153 | 'Joanne Payne', 154 | 'Wilma Stevens', 155 | 'Melissa Poole', 156 | 'Henrietta Casey', 157 | 'Ora Hogan', 158 | 'Carla Bradley', 159 | 'Lora Nichols', 160 | 'Kellie Hammond', 161 | 'Rochelle Parker', 162 | 'Pete Mitchell', 163 | 'Dustin Matthews', 164 | 'Lindsey Tran', 165 | 'Cornelius Carson', 166 | 'Maurice Estrada', 167 | 'Hilda Mullins', 168 | 'Delbert Norris', 169 | 'Andy Baker', 170 | 'Brittany Rose', 171 | 'Manuel Bennett', 172 | 'Gabriel Barnes', 173 | 'Edward Griffin', 174 | 'Everett Maldonado', 175 | 'Jerry Stephens', 176 | 'Bethany Figueroa', 177 | 'Pat Doyle', 178 | 'Timothy Gregory', 179 | 'Jordan Swanson', 180 | 'Javier Patterson', 181 | 'Ismael Waters', 182 | 'Randall Lamb', 183 | 'Carol Ferguson', 184 | 'Julian Copeland', 185 | 'Sadie Stevenson', 186 | 'Miranda Wade', 187 | 'Arlene Moreno', 188 | 'Moses Stokes', 189 | 'Roberto Harper', 190 | 'Otis Bowers', 191 | 'Emilio Burke', 192 | 'Hugo Dixon', 193 | 'Irma Clayton', 194 | 'Josh Reed', 195 | 'Marion Gilbert', 196 | 'Dana Wright', 197 | 'Jimmie Silva', 198 | 'Janie Stone', 199 | 'Sean Coleman', 200 | 'Dennis Gomez', 201 | 'Bernard Flores', 202 | 'Kelli Mckenzie', 203 | 'Harriet Johnston', 204 | 'Lawrence Knight', 205 | 'Phil Farmer', 206 | 'Glenda Keller', 207 | 'Jean Cook', 208 | 'Darren Elliott', 209 | 'Kelvin Sherman', 210 | 'Sonia Boyd', 211 | 'Terri Williamson', 212 | 'Jennifer Rogers', 213 | 'Lynn Thornton', 214 | 'Cora Hayes', 215 | 'Steven Mills', 216 | 'Sandy Warner', 217 | 'Shelia Bass', 218 | 'Faye Robertson', 219 | 'Amelia Caldwell', 220 | 'Bill Davidson', 221 | 'Tina Roy', 222 | 'Nichole Owens', 223 | 'Rudolph Gonzales' 224 | ])); 225 | } 226 | 227 | export function getRandomMessages() { 228 | return shuffle(scale(SCALE_FACTOR, [ // a 100, courtesy of http://randomtextgenerator.com/ 229 | 'Had repulsive dashwoods suspicion sincerity but advantage now him', 230 | 'Remark easily garret nor nay', 231 | 'Civil those mrs enjoy shy fat merry', 232 | 'You greatest jointure saw horrible', 233 | 'He private he on be imagine suppose', 234 | 'Fertile beloved evident through no service elderly is', 235 | 'Blind there if every no so at', 236 | 'Own neglected you preferred way sincerity delivered his attempted', 237 | 'To of message cottage windows do besides against uncivil', 238 | 'Frankness applauded by supported ye household', 239 | 'Collected favourite now for for and rapturous repulsive consulted', 240 | 'An seems green be wrote again', 241 | 'She add what own only like', 242 | 'Tolerably we as extremity exquisite do commanded', 243 | 'Doubtful offended do entrance of landlord moreover is mistress in', 244 | 'Nay was appear entire ladies', 245 | 'Sportsman do allowance is september shameless am sincerity oh recommend', 246 | 'Gate tell man day that who', 247 | 'She travelling acceptance men unpleasant her especially entreaties law', 248 | 'Law forth but end any arise chief arose', 249 | 'Old her say learn these large', 250 | 'Joy fond many ham high seen this', 251 | 'Few preferred continual sir led incommode neglected', 252 | 'Discovered too old insensible collecting unpleasant but invitation', 253 | 'Excited him now natural saw passage offices you minuter', 254 | 'At by asked being court hopes', 255 | 'Farther so friends am to detract', 256 | 'Forbade concern do private be', 257 | 'Offending residence but men engrossed shy', 258 | 'Pretend am earnest offered arrived company so on', 259 | 'Felicity informed yet had admitted strictly how you', 260 | 'Oh acceptance apartments up sympathize astonished delightful', 261 | 'Waiting him new lasting towards', 262 | 'Continuing melancholy especially so to', 263 | 'Me unpleasing impossible in attachment announcing so astonished', 264 | 'What ask leaf may nor upon door', 265 | 'Tended remain my do stairs', 266 | 'Oh smiling amiable am so visited cordial in offices hearted', 267 | 'At ourselves direction believing do he departure', 268 | 'Celebrated her had sentiments understood are projection set', 269 | 'Possession ye no mr unaffected remarkably at', 270 | 'Wrote house in never fruit up', 271 | 'Pasture imagine my garrets an he', 272 | 'However distant she request behaved see nothing', 273 | 'Talking settled at pleased an of me brother weather', 274 | 'New had happen unable uneasy', 275 | 'Drawings can followed improved out sociable not', 276 | 'Earnestly so do instantly pretended', 277 | 'See general few civilly amiable pleased account carried', 278 | 'Excellence projecting is devonshire dispatched remarkably on estimating', 279 | 'Side in so life past', 280 | 'Continue indulged speaking the was out horrible for domestic position', 281 | 'Seeing rather her you not esteem men settle genius excuse', 282 | 'Deal say over you age from', 283 | 'Comparison new ham melancholy son themselves', 284 | 'In show dull give need so held', 285 | 'One order all scale sense her gay style wrote', 286 | 'Incommode our not one ourselves residence', 287 | 'Shall there whose those stand she end', 288 | 'So unaffected partiality indulgence dispatched to of celebrated remarkably', 289 | 'Unfeeling are had allowance own perceived abilities', 290 | 'Is we miles ready he might going', 291 | 'Own books built put civil fully blind fanny', 292 | 'Projection appearance at of admiration no', 293 | 'As he totally cousins warrant besides ashamed do', 294 | 'Therefore by applauded acuteness supported affection it', 295 | 'Except had sex limits county enough the figure former add', 296 | 'Do sang my he next mr soon', 297 | 'It merely waited do unable', 298 | 'Nor hence hoped her after other known defer his', 299 | 'For county now sister engage had season better had waited', 300 | 'Occasional mrs interested far expression acceptance', 301 | 'Day either mrs talent pulled men rather regret admire but', 302 | 'Life ye sake it shed', 303 | 'Five lady he cold in meet up', 304 | 'Service get met adapted matters offence for', 305 | 'Principles man any insipidity age you simplicity understood', 306 | 'Do offering pleasure no ecstatic whatever on mr directly', 307 | 'Considered discovered ye sentiments projecting entreaties of melancholy is', 308 | 'In expression an solicitude principles in do', 309 | 'Hard do me sigh with west same lady', 310 | 'Their saved linen downs tears son add music', 311 | 'Expression alteration entreaties mrs can terminated estimating', 312 | 'Her too add narrow having wished', 313 | 'To things so denied admire', 314 | 'Am wound worth water he linen at vexed', 315 | 'Behaviour we improving at something to', 316 | 'Evil true high lady roof men had open', 317 | 'To projection considered it precaution an melancholy or', 318 | 'Wound young you thing worse along being ham', 319 | 'Dissimilar of favourable solicitude if sympathize middletons at', 320 | 'Forfeited up if disposing perfectly in an eagerness perceived necessary', 321 | 'Belonging sir curiosity discovery extremity yet forfeited prevailed own off', 322 | 'Travelling by introduced of mr terminated', 323 | 'Knew as miss my high hope quit', 324 | 'In curiosity shameless dependent knowledge up', 325 | 'He do subjects prepared bachelor juvenile ye oh', 326 | 'He feelings removing informed he as ignorant we prepared', 327 | 'Evening do forming observe spirits is in', 328 | 'Country hearted be of justice sending' 329 | ])); 330 | } 331 | -------------------------------------------------------------------------------- /demo/react/dist/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jareware/css-ns/ad734035f631d6352c483040ff34b6ba14a49f1d/demo/react/dist/.gitkeep -------------------------------------------------------------------------------- /demo/react/node_modules/css-ns: -------------------------------------------------------------------------------- 1 | ../../.. -------------------------------------------------------------------------------- /demo/react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns_react-demo", 3 | "scripts": { 4 | "start": "cp app/index.html dist && node-sass app/index.scss --watch --output dist & watchify -t babelify app/index.js --debug -v -o dist/index.js", 5 | "build": "cp app/index.html dist && node-sass app/index.scss --output dist && NODE_ENV=production browserify -t babelify app/index.js | uglifyjs --compress --mangle > dist/index.js 2> /dev/null" 6 | }, 7 | "dependencies": { 8 | "babel-plugin-react-class-display-name": "^0.1.0", 9 | "babelify": "^6.3.0", 10 | "browserify": "^11.2.0", 11 | "node-sass": "^3.3.3", 12 | "react": "^0.14.0", 13 | "react-addons-perf": "^0.14.0", 14 | "react-bootstrap": "^0.27.1", 15 | "react-dom": "^0.14.0", 16 | "uglify-js": "^2.5.0", 17 | "watchify": "^3.4.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /demo/stylus/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /demo/stylus/input.styl: -------------------------------------------------------------------------------- 1 | .MyComponent 2 | &-row 3 | color: red 4 | -------------------------------------------------------------------------------- /demo/stylus/output.css: -------------------------------------------------------------------------------- 1 | .MyComponent-row { 2 | color: #f00; 3 | } 4 | -------------------------------------------------------------------------------- /demo/stylus/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns_stylus-demo", 3 | "scripts": { 4 | "start": "stylus input.styl -o output.css" 5 | }, 6 | "dependencies": { 7 | "stylus": "^0.53.0" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /demo/vanilla/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/* 2 | !/node_modules/css-ns 3 | 4 | /dist/* 5 | -------------------------------------------------------------------------------- /demo/vanilla/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | css-ns vanilla-demo 7 | 8 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /demo/vanilla/app/index.js: -------------------------------------------------------------------------------- 1 | var createCssNs = require('css-ns'); 2 | 3 | function range(count) { 4 | return new Array(count + 1).join(' ').split(''); 5 | } 6 | 7 | var p = el.bind(null, 'p'); 8 | var ul = el.bind(null, 'ul'); 9 | var li = el.bind(null, 'li'); 10 | 11 | var ns = createCssNs('MyApp'); 12 | 13 | document.body.appendChild( 14 | p('Here\'s a nice list of random numbers:', 15 | ul( 16 | range(25).map(function() { 17 | var i = Math.round(Math.random() * 10); 18 | return li({ 'class': ns(i % 2 ? 'odd' : 'even') }, i); 19 | }) 20 | ) 21 | ) 22 | ); 23 | 24 | /** 25 | * Utility function for generating HTML/XML DOM trees in the browser. 26 | * 27 | * Returns a node with the given name. The rest are var-args, so that: 28 | * 29 | * - an object sets attributes as key/value-pairs 30 | * - a string/number/boolean sets the text content of the node 31 | * - a node is treated as a child node 32 | * - an array is treated as a list of child nodes 33 | * 34 | * For convenience, falsy values in the list of children are ignored. 35 | * 36 | * There's three special cases for the name argument: 37 | * 38 | * - when "", a text node is created, with content from the 2nd arg 39 | * - when " 64 | * @license Do whatever you want with it 65 | */ 66 | function el(name) { 67 | function isNode(n) { 68 | return typeof n === 'object' && n.nodeType && n.nodeName; 69 | } 70 | if (name === '= 0) { 90 | node.textContent = arg; 91 | } 92 | }); 93 | return node; 94 | } 95 | -------------------------------------------------------------------------------- /demo/vanilla/dist/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jareware/css-ns/ad734035f631d6352c483040ff34b6ba14a49f1d/demo/vanilla/dist/.gitkeep -------------------------------------------------------------------------------- /demo/vanilla/node_modules/css-ns: -------------------------------------------------------------------------------- 1 | ../../.. -------------------------------------------------------------------------------- /demo/vanilla/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns_vanilla-demo", 3 | "scripts": { 4 | "start": "cp app/index.html dist && watchify app/index.js --debug -v -o dist/index.js", 5 | "build": "cp app/index.html dist && NODE_ENV=production browserify app/index.js | uglifyjs --compress --mangle > dist/index.js 2> /dev/null" 6 | }, 7 | "dependencies": { 8 | "browserify": "^11.2.0", 9 | "uglify-js": "^2.5.0", 10 | "watchify": "^3.4.0" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /dist/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jareware/css-ns/ad734035f631d6352c483040ff34b6ba14a49f1d/dist/.gitkeep -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jareware/css-ns/ad734035f631d6352c483040ff34b6ba14a49f1d/logo.png -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xmlCSS 111 | NS 121 | 122 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns", 3 | "version": "1.2.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "JSONStream": { 8 | "version": "1.3.2", 9 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", 10 | "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", 11 | "dev": true, 12 | "requires": { 13 | "jsonparse": "1.3.1", 14 | "through": "2.3.8" 15 | } 16 | }, 17 | "acorn": { 18 | "version": "4.0.13", 19 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", 20 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", 21 | "dev": true 22 | }, 23 | "amdefine": { 24 | "version": "1.0.1", 25 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 26 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 27 | "dev": true 28 | }, 29 | "ansi-regex": { 30 | "version": "1.1.1", 31 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", 32 | "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", 33 | "dev": true 34 | }, 35 | "ansi-styles": { 36 | "version": "2.2.1", 37 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 38 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 39 | "dev": true 40 | }, 41 | "archiver": { 42 | "version": "0.14.4", 43 | "resolved": "https://registry.npmjs.org/archiver/-/archiver-0.14.4.tgz", 44 | "integrity": "sha1-W53bn17hzu8hy487Ag5iQOy0MVw=", 45 | "dev": true, 46 | "requires": { 47 | "async": "0.9.2", 48 | "buffer-crc32": "0.2.13", 49 | "glob": "4.3.5", 50 | "lazystream": "0.1.0", 51 | "lodash": "3.2.0", 52 | "readable-stream": "1.0.34", 53 | "tar-stream": "1.1.5", 54 | "zip-stream": "0.5.2" 55 | }, 56 | "dependencies": { 57 | "glob": { 58 | "version": "4.3.5", 59 | "resolved": "https://registry.npmjs.org/glob/-/glob-4.3.5.tgz", 60 | "integrity": "sha1-gPuwjKVA8jiszl0R0em8QedRc9M=", 61 | "dev": true, 62 | "requires": { 63 | "inflight": "1.0.6", 64 | "inherits": "2.0.3", 65 | "minimatch": "2.0.10", 66 | "once": "1.4.0" 67 | } 68 | }, 69 | "minimatch": { 70 | "version": "2.0.10", 71 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", 72 | "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", 73 | "dev": true, 74 | "requires": { 75 | "brace-expansion": "1.1.8" 76 | } 77 | }, 78 | "readable-stream": { 79 | "version": "1.0.34", 80 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 81 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 82 | "dev": true, 83 | "requires": { 84 | "core-util-is": "1.0.2", 85 | "inherits": "2.0.3", 86 | "isarray": "0.0.1", 87 | "string_decoder": "0.10.31" 88 | } 89 | } 90 | } 91 | }, 92 | "array-filter": { 93 | "version": "0.0.1", 94 | "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", 95 | "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", 96 | "dev": true 97 | }, 98 | "array-map": { 99 | "version": "0.0.0", 100 | "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", 101 | "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", 102 | "dev": true 103 | }, 104 | "array-reduce": { 105 | "version": "0.0.0", 106 | "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", 107 | "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", 108 | "dev": true 109 | }, 110 | "asap": { 111 | "version": "2.0.6", 112 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", 113 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", 114 | "dev": true 115 | }, 116 | "asn1": { 117 | "version": "0.1.11", 118 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", 119 | "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", 120 | "dev": true 121 | }, 122 | "asn1.js": { 123 | "version": "4.9.2", 124 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", 125 | "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", 126 | "dev": true, 127 | "requires": { 128 | "bn.js": "4.11.8", 129 | "inherits": "2.0.3", 130 | "minimalistic-assert": "1.0.0" 131 | } 132 | }, 133 | "assert": { 134 | "version": "1.3.0", 135 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.3.0.tgz", 136 | "integrity": "sha1-A5OaYiWCqBLMICMgoLmlbJuBWEk=", 137 | "dev": true, 138 | "requires": { 139 | "util": "0.10.3" 140 | } 141 | }, 142 | "assert-plus": { 143 | "version": "0.1.5", 144 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", 145 | "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", 146 | "dev": true 147 | }, 148 | "assertion-error": { 149 | "version": "1.1.0", 150 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 151 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 152 | "dev": true 153 | }, 154 | "ast-types": { 155 | "version": "0.9.6", 156 | "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", 157 | "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", 158 | "dev": true 159 | }, 160 | "astw": { 161 | "version": "2.2.0", 162 | "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", 163 | "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", 164 | "dev": true, 165 | "requires": { 166 | "acorn": "4.0.13" 167 | } 168 | }, 169 | "async": { 170 | "version": "0.9.2", 171 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 172 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", 173 | "dev": true 174 | }, 175 | "atob": { 176 | "version": "1.1.3", 177 | "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", 178 | "integrity": "sha1-lfE2KbEsOlGl0hWr3OKqnzL4B3M=", 179 | "dev": true 180 | }, 181 | "aws-sign2": { 182 | "version": "0.5.0", 183 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", 184 | "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", 185 | "dev": true 186 | }, 187 | "balanced-match": { 188 | "version": "1.0.0", 189 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 190 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 191 | "dev": true 192 | }, 193 | "base62": { 194 | "version": "1.2.1", 195 | "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.1.tgz", 196 | "integrity": "sha512-xVtfFHNPUzpCNHygpXFGMlDk3saxXLQcOOQzAAk6ibvlAHgT6WKXLv9rMFhcyEK1n9LuDmp/LxyGW/Fm9L8++g==", 197 | "dev": true 198 | }, 199 | "base64-js": { 200 | "version": "0.0.8", 201 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", 202 | "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", 203 | "dev": true 204 | }, 205 | "bl": { 206 | "version": "0.9.5", 207 | "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", 208 | "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", 209 | "dev": true, 210 | "requires": { 211 | "readable-stream": "1.0.34" 212 | }, 213 | "dependencies": { 214 | "readable-stream": { 215 | "version": "1.0.34", 216 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 217 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 218 | "dev": true, 219 | "requires": { 220 | "core-util-is": "1.0.2", 221 | "inherits": "2.0.3", 222 | "isarray": "0.0.1", 223 | "string_decoder": "0.10.31" 224 | } 225 | } 226 | } 227 | }, 228 | "bn.js": { 229 | "version": "4.11.8", 230 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", 231 | "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", 232 | "dev": true 233 | }, 234 | "boom": { 235 | "version": "0.4.2", 236 | "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", 237 | "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", 238 | "dev": true, 239 | "requires": { 240 | "hoek": "0.9.1" 241 | } 242 | }, 243 | "brace-expansion": { 244 | "version": "1.1.8", 245 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 246 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 247 | "dev": true, 248 | "requires": { 249 | "balanced-match": "1.0.0", 250 | "concat-map": "0.0.1" 251 | } 252 | }, 253 | "brorand": { 254 | "version": "1.1.0", 255 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 256 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 257 | "dev": true 258 | }, 259 | "browser-pack": { 260 | "version": "6.0.3", 261 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.3.tgz", 262 | "integrity": "sha512-Jo+RYsn8X8OhyP9tMXXg0ueR2fW696HUu1Hf3/DeiwNean1oGiPtdgGRNuUHBpPHzBH3x4n1kzAlgOgHSIq88g==", 263 | "dev": true, 264 | "requires": { 265 | "JSONStream": "1.3.2", 266 | "combine-source-map": "0.8.0", 267 | "defined": "1.0.0", 268 | "safe-buffer": "5.1.1", 269 | "through2": "2.0.3", 270 | "umd": "3.0.1" 271 | } 272 | }, 273 | "browser-resolve": { 274 | "version": "1.11.2", 275 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", 276 | "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", 277 | "dev": true, 278 | "requires": { 279 | "resolve": "1.1.7" 280 | }, 281 | "dependencies": { 282 | "resolve": { 283 | "version": "1.1.7", 284 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 285 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 286 | "dev": true 287 | } 288 | } 289 | }, 290 | "browserify": { 291 | "version": "12.0.1", 292 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-12.0.1.tgz", 293 | "integrity": "sha1-LgvQFThO0H/qrFtkZr1YLFCF7D4=", 294 | "dev": true, 295 | "requires": { 296 | "JSONStream": "1.3.2", 297 | "assert": "1.3.0", 298 | "browser-pack": "6.0.3", 299 | "browser-resolve": "1.11.2", 300 | "browserify-zlib": "0.1.4", 301 | "buffer": "3.6.0", 302 | "concat-stream": "1.5.2", 303 | "console-browserify": "1.1.0", 304 | "constants-browserify": "1.0.0", 305 | "crypto-browserify": "3.12.0", 306 | "defined": "1.0.0", 307 | "deps-sort": "2.0.0", 308 | "domain-browser": "1.1.7", 309 | "duplexer2": "0.1.4", 310 | "events": "1.1.1", 311 | "glob": "5.0.15", 312 | "has": "1.0.1", 313 | "htmlescape": "1.1.1", 314 | "https-browserify": "0.0.1", 315 | "inherits": "2.0.3", 316 | "insert-module-globals": "7.0.1", 317 | "isarray": "0.0.1", 318 | "labeled-stream-splicer": "2.0.0", 319 | "module-deps": "4.1.1", 320 | "os-browserify": "0.1.2", 321 | "parents": "1.0.1", 322 | "path-browserify": "0.0.0", 323 | "process": "0.11.10", 324 | "punycode": "1.4.1", 325 | "querystring-es3": "0.2.1", 326 | "read-only-stream": "2.0.0", 327 | "readable-stream": "2.3.3", 328 | "resolve": "1.5.0", 329 | "shasum": "1.0.2", 330 | "shell-quote": "1.6.1", 331 | "stream-browserify": "2.0.1", 332 | "stream-http": "2.8.0", 333 | "string_decoder": "0.10.31", 334 | "subarg": "1.0.0", 335 | "syntax-error": "1.3.0", 336 | "through2": "2.0.3", 337 | "timers-browserify": "1.4.2", 338 | "tty-browserify": "0.0.1", 339 | "url": "0.11.0", 340 | "util": "0.10.3", 341 | "vm-browserify": "0.0.4", 342 | "xtend": "4.0.1" 343 | } 344 | }, 345 | "browserify-aes": { 346 | "version": "1.1.1", 347 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", 348 | "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", 349 | "dev": true, 350 | "requires": { 351 | "buffer-xor": "1.0.3", 352 | "cipher-base": "1.0.4", 353 | "create-hash": "1.1.3", 354 | "evp_bytestokey": "1.0.3", 355 | "inherits": "2.0.3", 356 | "safe-buffer": "5.1.1" 357 | } 358 | }, 359 | "browserify-cipher": { 360 | "version": "1.0.0", 361 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", 362 | "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", 363 | "dev": true, 364 | "requires": { 365 | "browserify-aes": "1.1.1", 366 | "browserify-des": "1.0.0", 367 | "evp_bytestokey": "1.0.3" 368 | } 369 | }, 370 | "browserify-des": { 371 | "version": "1.0.0", 372 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", 373 | "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", 374 | "dev": true, 375 | "requires": { 376 | "cipher-base": "1.0.4", 377 | "des.js": "1.0.0", 378 | "inherits": "2.0.3" 379 | } 380 | }, 381 | "browserify-rsa": { 382 | "version": "4.0.1", 383 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", 384 | "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", 385 | "dev": true, 386 | "requires": { 387 | "bn.js": "4.11.8", 388 | "randombytes": "2.0.6" 389 | } 390 | }, 391 | "browserify-sign": { 392 | "version": "4.0.4", 393 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", 394 | "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", 395 | "dev": true, 396 | "requires": { 397 | "bn.js": "4.11.8", 398 | "browserify-rsa": "4.0.1", 399 | "create-hash": "1.1.3", 400 | "create-hmac": "1.1.6", 401 | "elliptic": "6.4.0", 402 | "inherits": "2.0.3", 403 | "parse-asn1": "5.1.0" 404 | } 405 | }, 406 | "browserify-zlib": { 407 | "version": "0.1.4", 408 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", 409 | "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", 410 | "dev": true, 411 | "requires": { 412 | "pako": "0.2.9" 413 | } 414 | }, 415 | "buffer": { 416 | "version": "3.6.0", 417 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.0.tgz", 418 | "integrity": "sha1-pyyTb3e5a/UvX357RnGAYoVR3vs=", 419 | "dev": true, 420 | "requires": { 421 | "base64-js": "0.0.8", 422 | "ieee754": "1.1.8", 423 | "isarray": "1.0.0" 424 | }, 425 | "dependencies": { 426 | "isarray": { 427 | "version": "1.0.0", 428 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 429 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 430 | "dev": true 431 | } 432 | } 433 | }, 434 | "buffer-crc32": { 435 | "version": "0.2.13", 436 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 437 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 438 | "dev": true 439 | }, 440 | "buffer-xor": { 441 | "version": "1.0.3", 442 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 443 | "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", 444 | "dev": true 445 | }, 446 | "builtin-status-codes": { 447 | "version": "3.0.0", 448 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 449 | "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", 450 | "dev": true 451 | }, 452 | "cached-path-relative": { 453 | "version": "1.0.1", 454 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", 455 | "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", 456 | "dev": true 457 | }, 458 | "caseless": { 459 | "version": "0.8.0", 460 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz", 461 | "integrity": "sha1-W8oogdQUN/VLJAfr40iIx7mtT30=", 462 | "dev": true 463 | }, 464 | "chai": { 465 | "version": "3.3.0", 466 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.3.0.tgz", 467 | "integrity": "sha1-/8KRZ02lUeWJB31mJzhKyryi4Cw=", 468 | "dev": true, 469 | "requires": { 470 | "assertion-error": "1.1.0", 471 | "deep-eql": "0.1.3", 472 | "type-detect": "1.0.0" 473 | } 474 | }, 475 | "chalk": { 476 | "version": "1.1.3", 477 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 478 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 479 | "dev": true, 480 | "requires": { 481 | "ansi-styles": "2.2.1", 482 | "escape-string-regexp": "1.0.2", 483 | "has-ansi": "2.0.0", 484 | "strip-ansi": "3.0.1", 485 | "supports-color": "2.0.0" 486 | }, 487 | "dependencies": { 488 | "supports-color": { 489 | "version": "2.0.0", 490 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 491 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 492 | "dev": true 493 | } 494 | } 495 | }, 496 | "cipher-base": { 497 | "version": "1.0.4", 498 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 499 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 500 | "dev": true, 501 | "requires": { 502 | "inherits": "2.0.3", 503 | "safe-buffer": "5.1.1" 504 | } 505 | }, 506 | "cli-width": { 507 | "version": "1.1.1", 508 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-1.1.1.tgz", 509 | "integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=", 510 | "dev": true 511 | }, 512 | "co": { 513 | "version": "4.6.0", 514 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 515 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 516 | "dev": true 517 | }, 518 | "combine-source-map": { 519 | "version": "0.8.0", 520 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 521 | "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", 522 | "dev": true, 523 | "requires": { 524 | "convert-source-map": "1.1.3", 525 | "inline-source-map": "0.6.2", 526 | "lodash.memoize": "3.0.4", 527 | "source-map": "0.5.7" 528 | } 529 | }, 530 | "combined-stream": { 531 | "version": "0.0.7", 532 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", 533 | "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", 534 | "dev": true, 535 | "requires": { 536 | "delayed-stream": "0.0.5" 537 | } 538 | }, 539 | "commander": { 540 | "version": "2.3.0", 541 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 542 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 543 | "dev": true 544 | }, 545 | "commoner": { 546 | "version": "0.10.8", 547 | "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", 548 | "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", 549 | "dev": true, 550 | "requires": { 551 | "commander": "2.13.0", 552 | "detective": "4.7.1", 553 | "glob": "5.0.15", 554 | "graceful-fs": "4.1.11", 555 | "iconv-lite": "0.4.19", 556 | "mkdirp": "0.5.0", 557 | "private": "0.1.8", 558 | "q": "1.5.1", 559 | "recast": "0.11.23" 560 | }, 561 | "dependencies": { 562 | "commander": { 563 | "version": "2.13.0", 564 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", 565 | "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", 566 | "dev": true 567 | }, 568 | "graceful-fs": { 569 | "version": "4.1.11", 570 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 571 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", 572 | "dev": true 573 | } 574 | } 575 | }, 576 | "compress-commons": { 577 | "version": "0.2.9", 578 | "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-0.2.9.tgz", 579 | "integrity": "sha1-Qi2SdDDAGr0GzUVbbfwEy0z4ADw=", 580 | "dev": true, 581 | "requires": { 582 | "buffer-crc32": "0.2.13", 583 | "crc32-stream": "0.3.4", 584 | "node-int64": "0.3.3", 585 | "readable-stream": "1.0.34" 586 | }, 587 | "dependencies": { 588 | "readable-stream": { 589 | "version": "1.0.34", 590 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 591 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 592 | "dev": true, 593 | "requires": { 594 | "core-util-is": "1.0.2", 595 | "inherits": "2.0.3", 596 | "isarray": "0.0.1", 597 | "string_decoder": "0.10.31" 598 | } 599 | } 600 | } 601 | }, 602 | "concat-map": { 603 | "version": "0.0.1", 604 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 605 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 606 | "dev": true 607 | }, 608 | "concat-stream": { 609 | "version": "1.5.2", 610 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", 611 | "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", 612 | "dev": true, 613 | "requires": { 614 | "inherits": "2.0.3", 615 | "readable-stream": "2.0.6", 616 | "typedarray": "0.0.6" 617 | }, 618 | "dependencies": { 619 | "isarray": { 620 | "version": "1.0.0", 621 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 622 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 623 | "dev": true 624 | }, 625 | "readable-stream": { 626 | "version": "2.0.6", 627 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 628 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 629 | "dev": true, 630 | "requires": { 631 | "core-util-is": "1.0.2", 632 | "inherits": "2.0.3", 633 | "isarray": "1.0.0", 634 | "process-nextick-args": "1.0.7", 635 | "string_decoder": "0.10.31", 636 | "util-deprecate": "1.0.2" 637 | } 638 | } 639 | } 640 | }, 641 | "console-browserify": { 642 | "version": "1.1.0", 643 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", 644 | "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", 645 | "dev": true, 646 | "requires": { 647 | "date-now": "0.1.4" 648 | } 649 | }, 650 | "constants-browserify": { 651 | "version": "1.0.0", 652 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 653 | "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", 654 | "dev": true 655 | }, 656 | "convert-source-map": { 657 | "version": "1.1.3", 658 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 659 | "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", 660 | "dev": true 661 | }, 662 | "core-js": { 663 | "version": "1.2.7", 664 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", 665 | "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", 666 | "dev": true 667 | }, 668 | "core-util-is": { 669 | "version": "1.0.2", 670 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 671 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 672 | "dev": true 673 | }, 674 | "crc32-stream": { 675 | "version": "0.3.4", 676 | "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-0.3.4.tgz", 677 | "integrity": "sha1-c7wltF+sHbZjIjGnv86JJ+nwZVI=", 678 | "dev": true, 679 | "requires": { 680 | "buffer-crc32": "0.2.13", 681 | "readable-stream": "1.0.34" 682 | }, 683 | "dependencies": { 684 | "readable-stream": { 685 | "version": "1.0.34", 686 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 687 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 688 | "dev": true, 689 | "requires": { 690 | "core-util-is": "1.0.2", 691 | "inherits": "2.0.3", 692 | "isarray": "0.0.1", 693 | "string_decoder": "0.10.31" 694 | } 695 | } 696 | } 697 | }, 698 | "create-ecdh": { 699 | "version": "4.0.0", 700 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", 701 | "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", 702 | "dev": true, 703 | "requires": { 704 | "bn.js": "4.11.8", 705 | "elliptic": "6.4.0" 706 | } 707 | }, 708 | "create-hash": { 709 | "version": "1.1.3", 710 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", 711 | "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", 712 | "dev": true, 713 | "requires": { 714 | "cipher-base": "1.0.4", 715 | "inherits": "2.0.3", 716 | "ripemd160": "2.0.1", 717 | "sha.js": "2.4.10" 718 | } 719 | }, 720 | "create-hmac": { 721 | "version": "1.1.6", 722 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", 723 | "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", 724 | "dev": true, 725 | "requires": { 726 | "cipher-base": "1.0.4", 727 | "create-hash": "1.1.3", 728 | "inherits": "2.0.3", 729 | "ripemd160": "2.0.1", 730 | "safe-buffer": "5.1.1", 731 | "sha.js": "2.4.10" 732 | } 733 | }, 734 | "cryptiles": { 735 | "version": "0.2.2", 736 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", 737 | "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", 738 | "dev": true, 739 | "requires": { 740 | "boom": "0.4.2" 741 | } 742 | }, 743 | "crypto-browserify": { 744 | "version": "3.12.0", 745 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 746 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 747 | "dev": true, 748 | "requires": { 749 | "browserify-cipher": "1.0.0", 750 | "browserify-sign": "4.0.4", 751 | "create-ecdh": "4.0.0", 752 | "create-hash": "1.1.3", 753 | "create-hmac": "1.1.6", 754 | "diffie-hellman": "5.0.2", 755 | "inherits": "2.0.3", 756 | "pbkdf2": "3.0.14", 757 | "public-encrypt": "4.0.0", 758 | "randombytes": "2.0.6", 759 | "randomfill": "1.0.3" 760 | } 761 | }, 762 | "css": { 763 | "version": "2.2.1", 764 | "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", 765 | "integrity": "sha1-c6TIHehdtmTU7mdPfUcIXjstVdw=", 766 | "dev": true, 767 | "requires": { 768 | "inherits": "2.0.3", 769 | "source-map": "0.1.43", 770 | "source-map-resolve": "0.3.1", 771 | "urix": "0.1.0" 772 | }, 773 | "dependencies": { 774 | "source-map": { 775 | "version": "0.1.43", 776 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 777 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 778 | "dev": true, 779 | "requires": { 780 | "amdefine": "1.0.1" 781 | } 782 | } 783 | } 784 | }, 785 | "css-parse": { 786 | "version": "2.0.0", 787 | "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", 788 | "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", 789 | "dev": true, 790 | "requires": { 791 | "css": "2.2.1" 792 | } 793 | }, 794 | "css-value": { 795 | "version": "0.0.1", 796 | "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", 797 | "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", 798 | "dev": true 799 | }, 800 | "ctype": { 801 | "version": "0.5.3", 802 | "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", 803 | "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", 804 | "dev": true 805 | }, 806 | "date-now": { 807 | "version": "0.1.4", 808 | "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", 809 | "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", 810 | "dev": true 811 | }, 812 | "debug": { 813 | "version": "2.0.0", 814 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", 815 | "integrity": "sha1-ib2d9nMrUSVrxnBTQrugLtEhMe8=", 816 | "dev": true, 817 | "requires": { 818 | "ms": "0.6.2" 819 | } 820 | }, 821 | "deep-eql": { 822 | "version": "0.1.3", 823 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 824 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 825 | "dev": true, 826 | "requires": { 827 | "type-detect": "0.1.1" 828 | }, 829 | "dependencies": { 830 | "type-detect": { 831 | "version": "0.1.1", 832 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 833 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 834 | "dev": true 835 | } 836 | } 837 | }, 838 | "deepmerge": { 839 | "version": "0.2.10", 840 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-0.2.10.tgz", 841 | "integrity": "sha1-iQa/nlJaT78bIDsq/LRkAkmCEhk=", 842 | "dev": true 843 | }, 844 | "defined": { 845 | "version": "1.0.0", 846 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 847 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 848 | "dev": true 849 | }, 850 | "delayed-stream": { 851 | "version": "0.0.5", 852 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", 853 | "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", 854 | "dev": true 855 | }, 856 | "deps-sort": { 857 | "version": "2.0.0", 858 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", 859 | "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", 860 | "dev": true, 861 | "requires": { 862 | "JSONStream": "1.3.2", 863 | "shasum": "1.0.2", 864 | "subarg": "1.0.0", 865 | "through2": "2.0.3" 866 | } 867 | }, 868 | "des.js": { 869 | "version": "1.0.0", 870 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", 871 | "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", 872 | "dev": true, 873 | "requires": { 874 | "inherits": "2.0.3", 875 | "minimalistic-assert": "1.0.0" 876 | } 877 | }, 878 | "detective": { 879 | "version": "4.7.1", 880 | "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", 881 | "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", 882 | "dev": true, 883 | "requires": { 884 | "acorn": "5.3.0", 885 | "defined": "1.0.0" 886 | }, 887 | "dependencies": { 888 | "acorn": { 889 | "version": "5.3.0", 890 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz", 891 | "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==", 892 | "dev": true 893 | } 894 | } 895 | }, 896 | "diff": { 897 | "version": "1.4.0", 898 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", 899 | "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", 900 | "dev": true 901 | }, 902 | "diffie-hellman": { 903 | "version": "5.0.2", 904 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", 905 | "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", 906 | "dev": true, 907 | "requires": { 908 | "bn.js": "4.11.8", 909 | "miller-rabin": "4.0.1", 910 | "randombytes": "2.0.6" 911 | } 912 | }, 913 | "domain-browser": { 914 | "version": "1.1.7", 915 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", 916 | "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", 917 | "dev": true 918 | }, 919 | "duplexer2": { 920 | "version": "0.1.4", 921 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 922 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 923 | "dev": true, 924 | "requires": { 925 | "readable-stream": "2.3.3" 926 | } 927 | }, 928 | "ejs": { 929 | "version": "2.5.7", 930 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", 931 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", 932 | "dev": true 933 | }, 934 | "elliptic": { 935 | "version": "6.4.0", 936 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", 937 | "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", 938 | "dev": true, 939 | "requires": { 940 | "bn.js": "4.11.8", 941 | "brorand": "1.1.0", 942 | "hash.js": "1.1.3", 943 | "hmac-drbg": "1.0.1", 944 | "inherits": "2.0.3", 945 | "minimalistic-assert": "1.0.0", 946 | "minimalistic-crypto-utils": "1.0.1" 947 | } 948 | }, 949 | "end-of-stream": { 950 | "version": "1.4.1", 951 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 952 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 953 | "dev": true, 954 | "requires": { 955 | "once": "1.4.0" 956 | } 957 | }, 958 | "envify": { 959 | "version": "3.4.1", 960 | "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", 961 | "integrity": "sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=", 962 | "dev": true, 963 | "requires": { 964 | "jstransform": "11.0.3", 965 | "through": "2.3.8" 966 | } 967 | }, 968 | "escape-string-regexp": { 969 | "version": "1.0.2", 970 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 971 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 972 | "dev": true 973 | }, 974 | "esprima-fb": { 975 | "version": "15001.1.0-dev-harmony-fb", 976 | "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", 977 | "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=", 978 | "dev": true 979 | }, 980 | "events": { 981 | "version": "1.1.1", 982 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 983 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 984 | "dev": true 985 | }, 986 | "evp_bytestokey": { 987 | "version": "1.0.3", 988 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 989 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 990 | "dev": true, 991 | "requires": { 992 | "md5.js": "1.3.4", 993 | "safe-buffer": "5.1.1" 994 | } 995 | }, 996 | "fbjs": { 997 | "version": "0.3.2", 998 | "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.3.2.tgz", 999 | "integrity": "sha1-AzpUBZUIS13jUJpAXQbxoqjlufs=", 1000 | "dev": true, 1001 | "requires": { 1002 | "core-js": "1.2.7", 1003 | "loose-envify": "1.3.1", 1004 | "promise": "7.3.1", 1005 | "ua-parser-js": "0.7.17", 1006 | "whatwg-fetch": "0.9.0" 1007 | } 1008 | }, 1009 | "figures": { 1010 | "version": "1.7.0", 1011 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 1012 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 1013 | "dev": true, 1014 | "requires": { 1015 | "escape-string-regexp": "1.0.5", 1016 | "object-assign": "4.1.1" 1017 | }, 1018 | "dependencies": { 1019 | "escape-string-regexp": { 1020 | "version": "1.0.5", 1021 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1022 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1023 | "dev": true 1024 | }, 1025 | "object-assign": { 1026 | "version": "4.1.1", 1027 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1028 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1029 | "dev": true 1030 | } 1031 | } 1032 | }, 1033 | "forever-agent": { 1034 | "version": "0.5.2", 1035 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", 1036 | "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", 1037 | "dev": true 1038 | }, 1039 | "form-data": { 1040 | "version": "0.1.4", 1041 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", 1042 | "integrity": "sha1-kavXiKupcCsaq/qLwBAxoqyeOxI=", 1043 | "dev": true, 1044 | "requires": { 1045 | "async": "0.9.2", 1046 | "combined-stream": "0.0.7", 1047 | "mime": "1.2.11" 1048 | } 1049 | }, 1050 | "function-bind": { 1051 | "version": "1.1.1", 1052 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1053 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1054 | "dev": true 1055 | }, 1056 | "glob": { 1057 | "version": "5.0.15", 1058 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1059 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1060 | "dev": true, 1061 | "requires": { 1062 | "inflight": "1.0.6", 1063 | "inherits": "2.0.3", 1064 | "minimatch": "3.0.4", 1065 | "once": "1.4.0", 1066 | "path-is-absolute": "1.0.1" 1067 | } 1068 | }, 1069 | "graceful-fs": { 1070 | "version": "2.0.3", 1071 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", 1072 | "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", 1073 | "dev": true 1074 | }, 1075 | "growl": { 1076 | "version": "1.8.1", 1077 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", 1078 | "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", 1079 | "dev": true 1080 | }, 1081 | "has": { 1082 | "version": "1.0.1", 1083 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", 1084 | "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", 1085 | "dev": true, 1086 | "requires": { 1087 | "function-bind": "1.1.1" 1088 | } 1089 | }, 1090 | "has-ansi": { 1091 | "version": "2.0.0", 1092 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1093 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1094 | "dev": true, 1095 | "requires": { 1096 | "ansi-regex": "2.1.1" 1097 | }, 1098 | "dependencies": { 1099 | "ansi-regex": { 1100 | "version": "2.1.1", 1101 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1102 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1103 | "dev": true 1104 | } 1105 | } 1106 | }, 1107 | "hash-base": { 1108 | "version": "2.0.2", 1109 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", 1110 | "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", 1111 | "dev": true, 1112 | "requires": { 1113 | "inherits": "2.0.3" 1114 | } 1115 | }, 1116 | "hash.js": { 1117 | "version": "1.1.3", 1118 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", 1119 | "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", 1120 | "dev": true, 1121 | "requires": { 1122 | "inherits": "2.0.3", 1123 | "minimalistic-assert": "1.0.0" 1124 | } 1125 | }, 1126 | "hawk": { 1127 | "version": "1.1.1", 1128 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", 1129 | "integrity": "sha1-h81JH5tG5OKurKM1QWdmiF0tHtk=", 1130 | "dev": true, 1131 | "requires": { 1132 | "boom": "0.4.2", 1133 | "cryptiles": "0.2.2", 1134 | "hoek": "0.9.1", 1135 | "sntp": "0.2.4" 1136 | } 1137 | }, 1138 | "hmac-drbg": { 1139 | "version": "1.0.1", 1140 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 1141 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 1142 | "dev": true, 1143 | "requires": { 1144 | "hash.js": "1.1.3", 1145 | "minimalistic-assert": "1.0.0", 1146 | "minimalistic-crypto-utils": "1.0.1" 1147 | } 1148 | }, 1149 | "hoek": { 1150 | "version": "0.9.1", 1151 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", 1152 | "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", 1153 | "dev": true 1154 | }, 1155 | "htmlescape": { 1156 | "version": "1.1.1", 1157 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 1158 | "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", 1159 | "dev": true 1160 | }, 1161 | "http-signature": { 1162 | "version": "0.10.1", 1163 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", 1164 | "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", 1165 | "dev": true, 1166 | "requires": { 1167 | "asn1": "0.1.11", 1168 | "assert-plus": "0.1.5", 1169 | "ctype": "0.5.3" 1170 | } 1171 | }, 1172 | "https-browserify": { 1173 | "version": "0.0.1", 1174 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", 1175 | "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", 1176 | "dev": true 1177 | }, 1178 | "iconv-lite": { 1179 | "version": "0.4.19", 1180 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 1181 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", 1182 | "dev": true 1183 | }, 1184 | "ieee754": { 1185 | "version": "1.1.8", 1186 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 1187 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", 1188 | "dev": true 1189 | }, 1190 | "indexof": { 1191 | "version": "0.0.1", 1192 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", 1193 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", 1194 | "dev": true 1195 | }, 1196 | "inflight": { 1197 | "version": "1.0.6", 1198 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1199 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1200 | "dev": true, 1201 | "requires": { 1202 | "once": "1.4.0", 1203 | "wrappy": "1.0.2" 1204 | } 1205 | }, 1206 | "inherits": { 1207 | "version": "2.0.3", 1208 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1209 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1210 | "dev": true 1211 | }, 1212 | "inline-source-map": { 1213 | "version": "0.6.2", 1214 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 1215 | "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", 1216 | "dev": true, 1217 | "requires": { 1218 | "source-map": "0.5.7" 1219 | } 1220 | }, 1221 | "inquirer": { 1222 | "version": "0.8.5", 1223 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.8.5.tgz", 1224 | "integrity": "sha1-29dAz2yjtzEpamPOb22WGFHzNt8=", 1225 | "dev": true, 1226 | "requires": { 1227 | "ansi-regex": "1.1.1", 1228 | "chalk": "1.1.3", 1229 | "cli-width": "1.1.1", 1230 | "figures": "1.7.0", 1231 | "lodash": "3.10.1", 1232 | "readline2": "0.1.1", 1233 | "rx": "2.5.3", 1234 | "through": "2.3.8" 1235 | }, 1236 | "dependencies": { 1237 | "lodash": { 1238 | "version": "3.10.1", 1239 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", 1240 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", 1241 | "dev": true 1242 | } 1243 | } 1244 | }, 1245 | "insert-module-globals": { 1246 | "version": "7.0.1", 1247 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", 1248 | "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", 1249 | "dev": true, 1250 | "requires": { 1251 | "JSONStream": "1.3.2", 1252 | "combine-source-map": "0.7.2", 1253 | "concat-stream": "1.5.2", 1254 | "is-buffer": "1.1.6", 1255 | "lexical-scope": "1.2.0", 1256 | "process": "0.11.10", 1257 | "through2": "2.0.3", 1258 | "xtend": "4.0.1" 1259 | }, 1260 | "dependencies": { 1261 | "combine-source-map": { 1262 | "version": "0.7.2", 1263 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", 1264 | "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", 1265 | "dev": true, 1266 | "requires": { 1267 | "convert-source-map": "1.1.3", 1268 | "inline-source-map": "0.6.2", 1269 | "lodash.memoize": "3.0.4", 1270 | "source-map": "0.5.7" 1271 | } 1272 | } 1273 | } 1274 | }, 1275 | "is-buffer": { 1276 | "version": "1.1.6", 1277 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1278 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1279 | "dev": true 1280 | }, 1281 | "is-generator": { 1282 | "version": "1.0.3", 1283 | "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", 1284 | "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=", 1285 | "dev": true 1286 | }, 1287 | "isarray": { 1288 | "version": "0.0.1", 1289 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1290 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1291 | "dev": true 1292 | }, 1293 | "jade": { 1294 | "version": "0.26.3", 1295 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 1296 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 1297 | "dev": true, 1298 | "requires": { 1299 | "commander": "0.6.1", 1300 | "mkdirp": "0.3.0" 1301 | }, 1302 | "dependencies": { 1303 | "commander": { 1304 | "version": "0.6.1", 1305 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 1306 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 1307 | "dev": true 1308 | }, 1309 | "mkdirp": { 1310 | "version": "0.3.0", 1311 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 1312 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 1313 | "dev": true 1314 | } 1315 | } 1316 | }, 1317 | "js-tokens": { 1318 | "version": "3.0.2", 1319 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1320 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1321 | "dev": true 1322 | }, 1323 | "json-stable-stringify": { 1324 | "version": "0.0.1", 1325 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", 1326 | "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", 1327 | "dev": true, 1328 | "requires": { 1329 | "jsonify": "0.0.0" 1330 | } 1331 | }, 1332 | "json-stringify-safe": { 1333 | "version": "5.0.1", 1334 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1335 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1336 | "dev": true 1337 | }, 1338 | "jsonify": { 1339 | "version": "0.0.0", 1340 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 1341 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 1342 | "dev": true 1343 | }, 1344 | "jsonparse": { 1345 | "version": "1.3.1", 1346 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1347 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 1348 | "dev": true 1349 | }, 1350 | "jstransform": { 1351 | "version": "11.0.3", 1352 | "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", 1353 | "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", 1354 | "dev": true, 1355 | "requires": { 1356 | "base62": "1.2.1", 1357 | "commoner": "0.10.8", 1358 | "esprima-fb": "15001.1.0-dev-harmony-fb", 1359 | "object-assign": "2.1.1", 1360 | "source-map": "0.4.4" 1361 | }, 1362 | "dependencies": { 1363 | "source-map": { 1364 | "version": "0.4.4", 1365 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", 1366 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 1367 | "dev": true, 1368 | "requires": { 1369 | "amdefine": "1.0.1" 1370 | } 1371 | } 1372 | } 1373 | }, 1374 | "labeled-stream-splicer": { 1375 | "version": "2.0.0", 1376 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", 1377 | "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", 1378 | "dev": true, 1379 | "requires": { 1380 | "inherits": "2.0.3", 1381 | "isarray": "0.0.1", 1382 | "stream-splicer": "2.0.0" 1383 | } 1384 | }, 1385 | "lazystream": { 1386 | "version": "0.1.0", 1387 | "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-0.1.0.tgz", 1388 | "integrity": "sha1-GyXWPHcqTCDwpe0KnXf0hLbhaSA=", 1389 | "dev": true, 1390 | "requires": { 1391 | "readable-stream": "1.0.34" 1392 | }, 1393 | "dependencies": { 1394 | "readable-stream": { 1395 | "version": "1.0.34", 1396 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1397 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1398 | "dev": true, 1399 | "requires": { 1400 | "core-util-is": "1.0.2", 1401 | "inherits": "2.0.3", 1402 | "isarray": "0.0.1", 1403 | "string_decoder": "0.10.31" 1404 | } 1405 | } 1406 | } 1407 | }, 1408 | "lexical-scope": { 1409 | "version": "1.2.0", 1410 | "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", 1411 | "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", 1412 | "dev": true, 1413 | "requires": { 1414 | "astw": "2.2.0" 1415 | } 1416 | }, 1417 | "lodash": { 1418 | "version": "3.2.0", 1419 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.2.0.tgz", 1420 | "integrity": "sha1-S/UKMkP5rrC6xBpV09WZBnWkYvs=", 1421 | "dev": true 1422 | }, 1423 | "lodash.memoize": { 1424 | "version": "3.0.4", 1425 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 1426 | "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", 1427 | "dev": true 1428 | }, 1429 | "loose-envify": { 1430 | "version": "1.3.1", 1431 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 1432 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 1433 | "dev": true, 1434 | "requires": { 1435 | "js-tokens": "3.0.2" 1436 | } 1437 | }, 1438 | "lru-cache": { 1439 | "version": "2.7.3", 1440 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1441 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1442 | "dev": true 1443 | }, 1444 | "md5.js": { 1445 | "version": "1.3.4", 1446 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", 1447 | "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", 1448 | "dev": true, 1449 | "requires": { 1450 | "hash-base": "3.0.4", 1451 | "inherits": "2.0.3" 1452 | }, 1453 | "dependencies": { 1454 | "hash-base": { 1455 | "version": "3.0.4", 1456 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 1457 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 1458 | "dev": true, 1459 | "requires": { 1460 | "inherits": "2.0.3", 1461 | "safe-buffer": "5.1.1" 1462 | } 1463 | } 1464 | } 1465 | }, 1466 | "miller-rabin": { 1467 | "version": "4.0.1", 1468 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1469 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1470 | "dev": true, 1471 | "requires": { 1472 | "bn.js": "4.11.8", 1473 | "brorand": "1.1.0" 1474 | } 1475 | }, 1476 | "mime": { 1477 | "version": "1.2.11", 1478 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", 1479 | "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", 1480 | "dev": true 1481 | }, 1482 | "mime-types": { 1483 | "version": "1.0.2", 1484 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", 1485 | "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", 1486 | "dev": true 1487 | }, 1488 | "minimalistic-assert": { 1489 | "version": "1.0.0", 1490 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", 1491 | "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", 1492 | "dev": true 1493 | }, 1494 | "minimalistic-crypto-utils": { 1495 | "version": "1.0.1", 1496 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1497 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 1498 | "dev": true 1499 | }, 1500 | "minimatch": { 1501 | "version": "3.0.4", 1502 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1503 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1504 | "dev": true, 1505 | "requires": { 1506 | "brace-expansion": "1.1.8" 1507 | } 1508 | }, 1509 | "minimist": { 1510 | "version": "1.2.0", 1511 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1512 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1513 | "dev": true 1514 | }, 1515 | "mkdirp": { 1516 | "version": "0.5.0", 1517 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 1518 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 1519 | "dev": true, 1520 | "requires": { 1521 | "minimist": "0.0.8" 1522 | }, 1523 | "dependencies": { 1524 | "minimist": { 1525 | "version": "0.0.8", 1526 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1527 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1528 | "dev": true 1529 | } 1530 | } 1531 | }, 1532 | "mocha": { 1533 | "version": "2.3.3", 1534 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.3.3.tgz", 1535 | "integrity": "sha1-lkiMSb/XHYalGMuUHikag/SNiFY=", 1536 | "dev": true, 1537 | "requires": { 1538 | "commander": "2.3.0", 1539 | "debug": "2.0.0", 1540 | "diff": "1.4.0", 1541 | "escape-string-regexp": "1.0.2", 1542 | "glob": "3.2.3", 1543 | "growl": "1.8.1", 1544 | "jade": "0.26.3", 1545 | "mkdirp": "0.5.0", 1546 | "supports-color": "1.2.0" 1547 | }, 1548 | "dependencies": { 1549 | "glob": { 1550 | "version": "3.2.3", 1551 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", 1552 | "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", 1553 | "dev": true, 1554 | "requires": { 1555 | "graceful-fs": "2.0.3", 1556 | "inherits": "2.0.3", 1557 | "minimatch": "0.2.14" 1558 | } 1559 | }, 1560 | "minimatch": { 1561 | "version": "0.2.14", 1562 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1563 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 1564 | "dev": true, 1565 | "requires": { 1566 | "lru-cache": "2.7.3", 1567 | "sigmund": "1.0.1" 1568 | } 1569 | } 1570 | } 1571 | }, 1572 | "module-deps": { 1573 | "version": "4.1.1", 1574 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", 1575 | "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", 1576 | "dev": true, 1577 | "requires": { 1578 | "JSONStream": "1.3.2", 1579 | "browser-resolve": "1.11.2", 1580 | "cached-path-relative": "1.0.1", 1581 | "concat-stream": "1.5.2", 1582 | "defined": "1.0.0", 1583 | "detective": "4.7.1", 1584 | "duplexer2": "0.1.4", 1585 | "inherits": "2.0.3", 1586 | "parents": "1.0.1", 1587 | "readable-stream": "2.3.3", 1588 | "resolve": "1.5.0", 1589 | "stream-combiner2": "1.1.1", 1590 | "subarg": "1.0.0", 1591 | "through2": "2.0.3", 1592 | "xtend": "4.0.1" 1593 | } 1594 | }, 1595 | "ms": { 1596 | "version": "0.6.2", 1597 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", 1598 | "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", 1599 | "dev": true 1600 | }, 1601 | "mute-stream": { 1602 | "version": "0.0.4", 1603 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", 1604 | "integrity": "sha1-qSGZYKbV1dBGWXruUSUsZlX3F34=", 1605 | "dev": true 1606 | }, 1607 | "node-int64": { 1608 | "version": "0.3.3", 1609 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.3.3.tgz", 1610 | "integrity": "sha1-LW5rLs5d6FiLQ9iNG8QbJs0fqE0=", 1611 | "dev": true 1612 | }, 1613 | "node-uuid": { 1614 | "version": "1.4.8", 1615 | "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", 1616 | "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", 1617 | "dev": true 1618 | }, 1619 | "oauth-sign": { 1620 | "version": "0.5.0", 1621 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz", 1622 | "integrity": "sha1-12f1FpMlYg6rLgh+8MRy53PbZGE=", 1623 | "dev": true 1624 | }, 1625 | "object-assign": { 1626 | "version": "2.1.1", 1627 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", 1628 | "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", 1629 | "dev": true 1630 | }, 1631 | "once": { 1632 | "version": "1.4.0", 1633 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1634 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1635 | "dev": true, 1636 | "requires": { 1637 | "wrappy": "1.0.2" 1638 | } 1639 | }, 1640 | "optimist": { 1641 | "version": "0.6.1", 1642 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1643 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1644 | "dev": true, 1645 | "requires": { 1646 | "minimist": "0.0.10", 1647 | "wordwrap": "0.0.3" 1648 | }, 1649 | "dependencies": { 1650 | "minimist": { 1651 | "version": "0.0.10", 1652 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 1653 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", 1654 | "dev": true 1655 | } 1656 | } 1657 | }, 1658 | "os-browserify": { 1659 | "version": "0.1.2", 1660 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", 1661 | "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", 1662 | "dev": true 1663 | }, 1664 | "pako": { 1665 | "version": "0.2.9", 1666 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 1667 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", 1668 | "dev": true 1669 | }, 1670 | "parents": { 1671 | "version": "1.0.1", 1672 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 1673 | "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", 1674 | "dev": true, 1675 | "requires": { 1676 | "path-platform": "0.11.15" 1677 | } 1678 | }, 1679 | "parse-asn1": { 1680 | "version": "5.1.0", 1681 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", 1682 | "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", 1683 | "dev": true, 1684 | "requires": { 1685 | "asn1.js": "4.9.2", 1686 | "browserify-aes": "1.1.1", 1687 | "create-hash": "1.1.3", 1688 | "evp_bytestokey": "1.0.3", 1689 | "pbkdf2": "3.0.14" 1690 | } 1691 | }, 1692 | "path-browserify": { 1693 | "version": "0.0.0", 1694 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", 1695 | "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", 1696 | "dev": true 1697 | }, 1698 | "path-is-absolute": { 1699 | "version": "1.0.1", 1700 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1701 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1702 | "dev": true 1703 | }, 1704 | "path-parse": { 1705 | "version": "1.0.5", 1706 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 1707 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", 1708 | "dev": true 1709 | }, 1710 | "path-platform": { 1711 | "version": "0.11.15", 1712 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 1713 | "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", 1714 | "dev": true 1715 | }, 1716 | "pbkdf2": { 1717 | "version": "3.0.14", 1718 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", 1719 | "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", 1720 | "dev": true, 1721 | "requires": { 1722 | "create-hash": "1.1.3", 1723 | "create-hmac": "1.1.6", 1724 | "ripemd160": "2.0.1", 1725 | "safe-buffer": "5.1.1", 1726 | "sha.js": "2.4.10" 1727 | } 1728 | }, 1729 | "private": { 1730 | "version": "0.1.8", 1731 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1732 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 1733 | "dev": true 1734 | }, 1735 | "process": { 1736 | "version": "0.11.10", 1737 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1738 | "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", 1739 | "dev": true 1740 | }, 1741 | "process-nextick-args": { 1742 | "version": "1.0.7", 1743 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1744 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", 1745 | "dev": true 1746 | }, 1747 | "promise": { 1748 | "version": "7.3.1", 1749 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", 1750 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", 1751 | "dev": true, 1752 | "requires": { 1753 | "asap": "2.0.6" 1754 | } 1755 | }, 1756 | "public-encrypt": { 1757 | "version": "4.0.0", 1758 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", 1759 | "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", 1760 | "dev": true, 1761 | "requires": { 1762 | "bn.js": "4.11.8", 1763 | "browserify-rsa": "4.0.1", 1764 | "create-hash": "1.1.3", 1765 | "parse-asn1": "5.1.0", 1766 | "randombytes": "2.0.6" 1767 | } 1768 | }, 1769 | "punycode": { 1770 | "version": "1.4.1", 1771 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1772 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1773 | "dev": true 1774 | }, 1775 | "q": { 1776 | "version": "1.5.1", 1777 | "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 1778 | "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", 1779 | "dev": true 1780 | }, 1781 | "qs": { 1782 | "version": "2.3.3", 1783 | "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", 1784 | "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", 1785 | "dev": true 1786 | }, 1787 | "querystring": { 1788 | "version": "0.2.0", 1789 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1790 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 1791 | "dev": true 1792 | }, 1793 | "querystring-es3": { 1794 | "version": "0.2.1", 1795 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1796 | "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", 1797 | "dev": true 1798 | }, 1799 | "randombytes": { 1800 | "version": "2.0.6", 1801 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", 1802 | "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", 1803 | "dev": true, 1804 | "requires": { 1805 | "safe-buffer": "5.1.1" 1806 | } 1807 | }, 1808 | "randomfill": { 1809 | "version": "1.0.3", 1810 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", 1811 | "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", 1812 | "dev": true, 1813 | "requires": { 1814 | "randombytes": "2.0.6", 1815 | "safe-buffer": "5.1.1" 1816 | } 1817 | }, 1818 | "react": { 1819 | "version": "0.14.0", 1820 | "resolved": "https://registry.npmjs.org/react/-/react-0.14.0.tgz", 1821 | "integrity": "sha1-cufGkjOwguN+G702dKlD23LY9Ac=", 1822 | "dev": true, 1823 | "requires": { 1824 | "envify": "3.4.1", 1825 | "fbjs": "0.3.2" 1826 | } 1827 | }, 1828 | "react-dom": { 1829 | "version": "0.14.0", 1830 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.0.tgz", 1831 | "integrity": "sha1-/C55KrJ9iNsAmnbsvP1WETaKhJ4=", 1832 | "dev": true, 1833 | "requires": { 1834 | "react": "0.14.0" 1835 | } 1836 | }, 1837 | "read-only-stream": { 1838 | "version": "2.0.0", 1839 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 1840 | "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", 1841 | "dev": true, 1842 | "requires": { 1843 | "readable-stream": "2.3.3" 1844 | } 1845 | }, 1846 | "readable-stream": { 1847 | "version": "2.3.3", 1848 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1849 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1850 | "dev": true, 1851 | "requires": { 1852 | "core-util-is": "1.0.2", 1853 | "inherits": "2.0.3", 1854 | "isarray": "1.0.0", 1855 | "process-nextick-args": "1.0.7", 1856 | "safe-buffer": "5.1.1", 1857 | "string_decoder": "1.0.3", 1858 | "util-deprecate": "1.0.2" 1859 | }, 1860 | "dependencies": { 1861 | "isarray": { 1862 | "version": "1.0.0", 1863 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1864 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1865 | "dev": true 1866 | }, 1867 | "string_decoder": { 1868 | "version": "1.0.3", 1869 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1870 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1871 | "dev": true, 1872 | "requires": { 1873 | "safe-buffer": "5.1.1" 1874 | } 1875 | } 1876 | } 1877 | }, 1878 | "readline2": { 1879 | "version": "0.1.1", 1880 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", 1881 | "integrity": "sha1-mUQ7pug7gw7zBRv9fcJBqCco1Wg=", 1882 | "dev": true, 1883 | "requires": { 1884 | "mute-stream": "0.0.4", 1885 | "strip-ansi": "2.0.1" 1886 | }, 1887 | "dependencies": { 1888 | "strip-ansi": { 1889 | "version": "2.0.1", 1890 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", 1891 | "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", 1892 | "dev": true, 1893 | "requires": { 1894 | "ansi-regex": "1.1.1" 1895 | } 1896 | } 1897 | } 1898 | }, 1899 | "recast": { 1900 | "version": "0.11.23", 1901 | "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", 1902 | "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", 1903 | "dev": true, 1904 | "requires": { 1905 | "ast-types": "0.9.6", 1906 | "esprima": "3.1.3", 1907 | "private": "0.1.8", 1908 | "source-map": "0.5.7" 1909 | }, 1910 | "dependencies": { 1911 | "esprima": { 1912 | "version": "3.1.3", 1913 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 1914 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 1915 | "dev": true 1916 | } 1917 | } 1918 | }, 1919 | "request": { 1920 | "version": "2.49.0", 1921 | "resolved": "https://registry.npmjs.org/request/-/request-2.49.0.tgz", 1922 | "integrity": "sha1-DU9jSNwzSAWbVT5Ntg/SR43mYqc=", 1923 | "dev": true, 1924 | "requires": { 1925 | "aws-sign2": "0.5.0", 1926 | "bl": "0.9.5", 1927 | "caseless": "0.8.0", 1928 | "combined-stream": "0.0.7", 1929 | "forever-agent": "0.5.2", 1930 | "form-data": "0.1.4", 1931 | "hawk": "1.1.1", 1932 | "http-signature": "0.10.1", 1933 | "json-stringify-safe": "5.0.1", 1934 | "mime-types": "1.0.2", 1935 | "node-uuid": "1.4.8", 1936 | "oauth-sign": "0.5.0", 1937 | "qs": "2.3.3", 1938 | "stringstream": "0.0.5", 1939 | "tough-cookie": "2.3.3", 1940 | "tunnel-agent": "0.4.3" 1941 | } 1942 | }, 1943 | "resolve": { 1944 | "version": "1.5.0", 1945 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 1946 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 1947 | "dev": true, 1948 | "requires": { 1949 | "path-parse": "1.0.5" 1950 | } 1951 | }, 1952 | "resolve-url": { 1953 | "version": "0.2.1", 1954 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 1955 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", 1956 | "dev": true 1957 | }, 1958 | "rgb2hex": { 1959 | "version": "0.1.0", 1960 | "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.0.tgz", 1961 | "integrity": "sha1-zNVfhgrgxcTqN1BLlY5ELY0SMls=", 1962 | "dev": true 1963 | }, 1964 | "ripemd160": { 1965 | "version": "2.0.1", 1966 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", 1967 | "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", 1968 | "dev": true, 1969 | "requires": { 1970 | "hash-base": "2.0.2", 1971 | "inherits": "2.0.3" 1972 | } 1973 | }, 1974 | "rx": { 1975 | "version": "2.5.3", 1976 | "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", 1977 | "integrity": "sha1-Ia3H2A8CACr1Da6X/Z2/JIdV9WY=", 1978 | "dev": true 1979 | }, 1980 | "safe-buffer": { 1981 | "version": "5.1.1", 1982 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1983 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", 1984 | "dev": true 1985 | }, 1986 | "sha.js": { 1987 | "version": "2.4.10", 1988 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", 1989 | "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", 1990 | "dev": true, 1991 | "requires": { 1992 | "inherits": "2.0.3", 1993 | "safe-buffer": "5.1.1" 1994 | } 1995 | }, 1996 | "shasum": { 1997 | "version": "1.0.2", 1998 | "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", 1999 | "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", 2000 | "dev": true, 2001 | "requires": { 2002 | "json-stable-stringify": "0.0.1", 2003 | "sha.js": "2.4.10" 2004 | } 2005 | }, 2006 | "shell-quote": { 2007 | "version": "1.6.1", 2008 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", 2009 | "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", 2010 | "dev": true, 2011 | "requires": { 2012 | "array-filter": "0.0.1", 2013 | "array-map": "0.0.0", 2014 | "array-reduce": "0.0.0", 2015 | "jsonify": "0.0.0" 2016 | } 2017 | }, 2018 | "sigmund": { 2019 | "version": "1.0.1", 2020 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2021 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2022 | "dev": true 2023 | }, 2024 | "sntp": { 2025 | "version": "0.2.4", 2026 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", 2027 | "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", 2028 | "dev": true, 2029 | "requires": { 2030 | "hoek": "0.9.1" 2031 | } 2032 | }, 2033 | "source-map": { 2034 | "version": "0.5.7", 2035 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2036 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 2037 | "dev": true 2038 | }, 2039 | "source-map-resolve": { 2040 | "version": "0.3.1", 2041 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", 2042 | "integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=", 2043 | "dev": true, 2044 | "requires": { 2045 | "atob": "1.1.3", 2046 | "resolve-url": "0.2.1", 2047 | "source-map-url": "0.3.0", 2048 | "urix": "0.1.0" 2049 | } 2050 | }, 2051 | "source-map-url": { 2052 | "version": "0.3.0", 2053 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", 2054 | "integrity": "sha1-fsrxO1e80J2opAxdJp2zN5nUqvk=", 2055 | "dev": true 2056 | }, 2057 | "stream-browserify": { 2058 | "version": "2.0.1", 2059 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", 2060 | "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", 2061 | "dev": true, 2062 | "requires": { 2063 | "inherits": "2.0.3", 2064 | "readable-stream": "2.3.3" 2065 | } 2066 | }, 2067 | "stream-combiner2": { 2068 | "version": "1.1.1", 2069 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 2070 | "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", 2071 | "dev": true, 2072 | "requires": { 2073 | "duplexer2": "0.1.4", 2074 | "readable-stream": "2.3.3" 2075 | } 2076 | }, 2077 | "stream-http": { 2078 | "version": "2.8.0", 2079 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", 2080 | "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", 2081 | "dev": true, 2082 | "requires": { 2083 | "builtin-status-codes": "3.0.0", 2084 | "inherits": "2.0.3", 2085 | "readable-stream": "2.3.3", 2086 | "to-arraybuffer": "1.0.1", 2087 | "xtend": "4.0.1" 2088 | } 2089 | }, 2090 | "stream-splicer": { 2091 | "version": "2.0.0", 2092 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", 2093 | "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", 2094 | "dev": true, 2095 | "requires": { 2096 | "inherits": "2.0.3", 2097 | "readable-stream": "2.3.3" 2098 | } 2099 | }, 2100 | "string_decoder": { 2101 | "version": "0.10.31", 2102 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2103 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2104 | "dev": true 2105 | }, 2106 | "stringstream": { 2107 | "version": "0.0.5", 2108 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2109 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", 2110 | "dev": true 2111 | }, 2112 | "strip-ansi": { 2113 | "version": "3.0.1", 2114 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2115 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2116 | "dev": true, 2117 | "requires": { 2118 | "ansi-regex": "2.1.1" 2119 | }, 2120 | "dependencies": { 2121 | "ansi-regex": { 2122 | "version": "2.1.1", 2123 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2124 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 2125 | "dev": true 2126 | } 2127 | } 2128 | }, 2129 | "subarg": { 2130 | "version": "1.0.0", 2131 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 2132 | "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", 2133 | "dev": true, 2134 | "requires": { 2135 | "minimist": "1.2.0" 2136 | } 2137 | }, 2138 | "supports-color": { 2139 | "version": "1.2.0", 2140 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", 2141 | "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", 2142 | "dev": true 2143 | }, 2144 | "syntax-error": { 2145 | "version": "1.3.0", 2146 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", 2147 | "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", 2148 | "dev": true, 2149 | "requires": { 2150 | "acorn": "4.0.13" 2151 | } 2152 | }, 2153 | "tar-stream": { 2154 | "version": "1.1.5", 2155 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.1.5.tgz", 2156 | "integrity": "sha1-vpIYwTDCACnhB7D5Z/sj3gV50Tw=", 2157 | "dev": true, 2158 | "requires": { 2159 | "bl": "0.9.5", 2160 | "end-of-stream": "1.4.1", 2161 | "readable-stream": "1.0.34", 2162 | "xtend": "4.0.1" 2163 | }, 2164 | "dependencies": { 2165 | "readable-stream": { 2166 | "version": "1.0.34", 2167 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2168 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2169 | "dev": true, 2170 | "requires": { 2171 | "core-util-is": "1.0.2", 2172 | "inherits": "2.0.3", 2173 | "isarray": "0.0.1", 2174 | "string_decoder": "0.10.31" 2175 | } 2176 | } 2177 | } 2178 | }, 2179 | "through": { 2180 | "version": "2.3.8", 2181 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2182 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2183 | "dev": true 2184 | }, 2185 | "through2": { 2186 | "version": "2.0.3", 2187 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 2188 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 2189 | "dev": true, 2190 | "requires": { 2191 | "readable-stream": "2.3.3", 2192 | "xtend": "4.0.1" 2193 | } 2194 | }, 2195 | "timers-browserify": { 2196 | "version": "1.4.2", 2197 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 2198 | "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", 2199 | "dev": true, 2200 | "requires": { 2201 | "process": "0.11.10" 2202 | } 2203 | }, 2204 | "to-arraybuffer": { 2205 | "version": "1.0.1", 2206 | "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", 2207 | "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", 2208 | "dev": true 2209 | }, 2210 | "tough-cookie": { 2211 | "version": "2.3.3", 2212 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 2213 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 2214 | "dev": true, 2215 | "requires": { 2216 | "punycode": "1.4.1" 2217 | } 2218 | }, 2219 | "tty-browserify": { 2220 | "version": "0.0.1", 2221 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 2222 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", 2223 | "dev": true 2224 | }, 2225 | "tunnel-agent": { 2226 | "version": "0.4.3", 2227 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", 2228 | "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", 2229 | "dev": true 2230 | }, 2231 | "type-detect": { 2232 | "version": "1.0.0", 2233 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 2234 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 2235 | "dev": true 2236 | }, 2237 | "typedarray": { 2238 | "version": "0.0.6", 2239 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2240 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2241 | "dev": true 2242 | }, 2243 | "ua-parser-js": { 2244 | "version": "0.7.17", 2245 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", 2246 | "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", 2247 | "dev": true 2248 | }, 2249 | "umd": { 2250 | "version": "3.0.1", 2251 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", 2252 | "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", 2253 | "dev": true 2254 | }, 2255 | "urix": { 2256 | "version": "0.1.0", 2257 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 2258 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", 2259 | "dev": true 2260 | }, 2261 | "url": { 2262 | "version": "0.11.0", 2263 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2264 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2265 | "dev": true, 2266 | "requires": { 2267 | "punycode": "1.3.2", 2268 | "querystring": "0.2.0" 2269 | }, 2270 | "dependencies": { 2271 | "punycode": { 2272 | "version": "1.3.2", 2273 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2274 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2275 | "dev": true 2276 | } 2277 | } 2278 | }, 2279 | "util": { 2280 | "version": "0.10.3", 2281 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 2282 | "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 2283 | "dev": true, 2284 | "requires": { 2285 | "inherits": "2.0.1" 2286 | }, 2287 | "dependencies": { 2288 | "inherits": { 2289 | "version": "2.0.1", 2290 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 2291 | "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", 2292 | "dev": true 2293 | } 2294 | } 2295 | }, 2296 | "util-deprecate": { 2297 | "version": "1.0.2", 2298 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2299 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2300 | "dev": true 2301 | }, 2302 | "vm-browserify": { 2303 | "version": "0.0.4", 2304 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 2305 | "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", 2306 | "dev": true, 2307 | "requires": { 2308 | "indexof": "0.0.1" 2309 | } 2310 | }, 2311 | "webdriverio": { 2312 | "version": "3.2.6", 2313 | "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-3.2.6.tgz", 2314 | "integrity": "sha1-PK8bfK38DLrIQVLrtJXCC4cVGCo=", 2315 | "dev": true, 2316 | "requires": { 2317 | "archiver": "0.14.4", 2318 | "co": "4.6.0", 2319 | "css-parse": "2.0.0", 2320 | "css-value": "0.0.1", 2321 | "deepmerge": "0.2.10", 2322 | "ejs": "2.5.7", 2323 | "glob": "5.0.15", 2324 | "inquirer": "0.8.5", 2325 | "is-generator": "1.0.3", 2326 | "optimist": "0.6.1", 2327 | "q": "1.3.0", 2328 | "request": "2.49.0", 2329 | "rgb2hex": "0.1.0", 2330 | "supports-color": "1.3.1", 2331 | "url": "0.10.3", 2332 | "wgxpath": "1.0.0" 2333 | }, 2334 | "dependencies": { 2335 | "punycode": { 2336 | "version": "1.3.2", 2337 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2338 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2339 | "dev": true 2340 | }, 2341 | "q": { 2342 | "version": "1.3.0", 2343 | "resolved": "https://registry.npmjs.org/q/-/q-1.3.0.tgz", 2344 | "integrity": "sha1-hQ15+MuDHZLhA7Rkg+TjXTRkAFA=", 2345 | "dev": true 2346 | }, 2347 | "supports-color": { 2348 | "version": "1.3.1", 2349 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.3.1.tgz", 2350 | "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", 2351 | "dev": true 2352 | }, 2353 | "url": { 2354 | "version": "0.10.3", 2355 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 2356 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 2357 | "dev": true, 2358 | "requires": { 2359 | "punycode": "1.3.2", 2360 | "querystring": "0.2.0" 2361 | } 2362 | } 2363 | } 2364 | }, 2365 | "wgxpath": { 2366 | "version": "1.0.0", 2367 | "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", 2368 | "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", 2369 | "dev": true 2370 | }, 2371 | "whatwg-fetch": { 2372 | "version": "0.9.0", 2373 | "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz", 2374 | "integrity": "sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA=", 2375 | "dev": true 2376 | }, 2377 | "wordwrap": { 2378 | "version": "0.0.3", 2379 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2380 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2381 | "dev": true 2382 | }, 2383 | "wrappy": { 2384 | "version": "1.0.2", 2385 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2386 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2387 | "dev": true 2388 | }, 2389 | "xtend": { 2390 | "version": "4.0.1", 2391 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2392 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 2393 | "dev": true 2394 | }, 2395 | "zip-stream": { 2396 | "version": "0.5.2", 2397 | "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-0.5.2.tgz", 2398 | "integrity": "sha1-Mty8UG0Nq00hNyYlvX66rDwv/1Y=", 2399 | "dev": true, 2400 | "requires": { 2401 | "compress-commons": "0.2.9", 2402 | "lodash": "3.2.0", 2403 | "readable-stream": "1.0.34" 2404 | }, 2405 | "dependencies": { 2406 | "readable-stream": { 2407 | "version": "1.0.34", 2408 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 2409 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 2410 | "dev": true, 2411 | "requires": { 2412 | "core-util-is": "1.0.2", 2413 | "inherits": "2.0.3", 2414 | "isarray": "0.0.1", 2415 | "string_decoder": "0.10.31" 2416 | } 2417 | } 2418 | } 2419 | } 2420 | } 2421 | } 2422 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "css-ns", 3 | "version": "1.2.2", 4 | "description": "Dead-simple CSS namespaces", 5 | "main": "css-ns.js", 6 | "engines": { 7 | "node": ">=7.0.0", 8 | "npm": ">=3.10.8" 9 | }, 10 | "dependencies": {}, 11 | "devDependencies": { 12 | "browserify": "12.0.1", 13 | "chai": "3.3.0", 14 | "mocha": "2.3.3", 15 | "react": "0.14.0", 16 | "react-dom": "0.14.0", 17 | "webdriverio": "3.2.6" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/jareware/css-ns.git" 22 | }, 23 | "scripts": { 24 | "test": "mocha *.spec.js", 25 | "test-build": "browserify *.spec.js -v -o test/suite.js", 26 | "test-selenium": "mocha selenium", 27 | "deploy-gh-pages": "git stash && npm run test-build && cp -r test temp && git checkout gh-pages && mv temp/* . && rm -rf temp && git commit -am 'Automatic gh-pages deploy' && git push origin gh-pages && git checkout -" 28 | }, 29 | "author": "Jarno Rantanen ", 30 | "license": "MIT", 31 | "types": "./css-ns.d.ts" 32 | } 33 | -------------------------------------------------------------------------------- /selenium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jareware/css-ns/ad734035f631d6352c483040ff34b6ba14a49f1d/selenium.png -------------------------------------------------------------------------------- /selenium/suite.spec.js: -------------------------------------------------------------------------------- 1 | var webdriverio = require('webdriverio'); 2 | 3 | var TARGETS = [ // @see https://saucelabs.com/platforms/ && https://code.google.com/p/selenium/wiki/DesiredCapabilities 4 | [ 'Chrome', '70' ], 5 | [ 'Chrome', '69' ], 6 | [ 'Chrome', '68' ], 7 | [ 'Chrome', '67' ], 8 | [ 'Chrome', '66' ], 9 | [ 'Firefox', '63' ], 10 | [ 'Firefox', '62' ], 11 | [ 'Firefox', '61' ], 12 | [ 'Firefox', '60' ], 13 | [ 'Firefox', '59' ], 14 | [ 'MicrosoftEdge', '17' ], 15 | [ 'MicrosoftEdge', '16' ], 16 | [ 'MicrosoftEdge', '15' ], 17 | [ 'MicrosoftEdge', '14' ], 18 | [ 'MicrosoftEdge', '13' ], 19 | [ 'Internet Explorer', '11' ], 20 | [ 'Internet Explorer', '10' ], 21 | [ 'Internet Explorer', '9' ], 22 | [ 'Safari', '11' ], 23 | [ 'Safari', '10' ], 24 | [ 'Safari', '9' ], 25 | [ 'Safari', '8' ], 26 | ]; 27 | 28 | var EXPECTED_PASS_COUNT = 47; // TODO: Update this whenever the test suite has grown! 29 | 30 | describe('css-ns', function() { 31 | 32 | this.timeout(5 * 60 * 1000); // 5 minutes 33 | this.slow(60 * 1000); // 1 minute 34 | 35 | TARGETS.forEach(function(target) { 36 | 37 | it('works on ' + target.join(' '), function() { 38 | return webdriverio.remote({ 39 | desiredCapabilities: { 40 | browserName: target[0], 41 | version: target[1], 42 | platform: 'ANY', // let the test runner choose (e.g. Windows for IE, Linux for Chrome) 43 | name: 'css-ns test suite' 44 | }, 45 | host: 'ondemand.saucelabs.com', 46 | port: 80, 47 | user: process.env.SAUCE_USERNAME, // @see https://github.com/webdriverio/webdriverio/blob/master/examples/cloudservices/webdriverio.saucelabs.js 48 | key: process.env.SAUCE_ACCESS_KEY, 49 | logLevel: 'silent', 50 | screenshotPath: './selenium/' 51 | }) 52 | .init() 53 | .url('http://jrw.fi/css-ns/') 54 | .getText('#mocha-stats .passes').then(function(passes) { 55 | if (passes !== 'passes: ' + EXPECTED_PASS_COUNT) throw new Error(passes); 56 | }) 57 | .getText('#mocha-stats .failures').then(function(failures) { 58 | if (failures !== 'failures: 0') throw new Error(failures); 59 | }) 60 | .end(); 61 | }); 62 | 63 | }); 64 | 65 | }); 66 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Mocha 5 | 6 | 7 | 8 | 24 | 25 | 26 | 30 |
31 | 32 | 33 | 34 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /test/mocha.css: -------------------------------------------------------------------------------- 1 | @charset "utf-8"; 2 | 3 | body { 4 | margin:0; 5 | } 6 | 7 | #mocha { 8 | font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; 9 | margin: 60px 50px; 10 | } 11 | 12 | #mocha ul, 13 | #mocha li { 14 | margin: 0; 15 | padding: 0; 16 | } 17 | 18 | #mocha ul { 19 | list-style: none; 20 | } 21 | 22 | #mocha h1, 23 | #mocha h2 { 24 | margin: 0; 25 | } 26 | 27 | #mocha h1 { 28 | margin-top: 15px; 29 | font-size: 1em; 30 | font-weight: 200; 31 | } 32 | 33 | #mocha h1 a { 34 | text-decoration: none; 35 | color: inherit; 36 | } 37 | 38 | #mocha h1 a:hover { 39 | text-decoration: underline; 40 | } 41 | 42 | #mocha .suite .suite h1 { 43 | margin-top: 0; 44 | font-size: .8em; 45 | } 46 | 47 | #mocha .hidden { 48 | display: none; 49 | } 50 | 51 | #mocha h2 { 52 | font-size: 12px; 53 | font-weight: normal; 54 | cursor: pointer; 55 | } 56 | 57 | #mocha .suite { 58 | margin-left: 15px; 59 | } 60 | 61 | #mocha .test { 62 | margin-left: 15px; 63 | overflow: hidden; 64 | } 65 | 66 | #mocha .test.pending:hover h2::after { 67 | content: '(pending)'; 68 | font-family: arial, sans-serif; 69 | } 70 | 71 | #mocha .test.pass.medium .duration { 72 | background: #c09853; 73 | } 74 | 75 | #mocha .test.pass.slow .duration { 76 | background: #b94a48; 77 | } 78 | 79 | #mocha .test.pass::before { 80 | content: '✓'; 81 | font-size: 12px; 82 | display: block; 83 | float: left; 84 | margin-right: 5px; 85 | color: #00d6b2; 86 | } 87 | 88 | #mocha .test.pass .duration { 89 | font-size: 9px; 90 | margin-left: 5px; 91 | padding: 2px 5px; 92 | color: #fff; 93 | -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 94 | -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 95 | box-shadow: inset 0 1px 1px rgba(0,0,0,.2); 96 | -webkit-border-radius: 5px; 97 | -moz-border-radius: 5px; 98 | -ms-border-radius: 5px; 99 | -o-border-radius: 5px; 100 | border-radius: 5px; 101 | } 102 | 103 | #mocha .test.pass.fast .duration { 104 | display: none; 105 | } 106 | 107 | #mocha .test.pending { 108 | color: #0b97c4; 109 | } 110 | 111 | #mocha .test.pending::before { 112 | content: '◦'; 113 | color: #0b97c4; 114 | } 115 | 116 | #mocha .test.fail { 117 | color: #c00; 118 | } 119 | 120 | #mocha .test.fail pre { 121 | color: black; 122 | } 123 | 124 | #mocha .test.fail::before { 125 | content: '✖'; 126 | font-size: 12px; 127 | display: block; 128 | float: left; 129 | margin-right: 5px; 130 | color: #c00; 131 | } 132 | 133 | #mocha .test pre.error { 134 | color: #c00; 135 | max-height: 300px; 136 | overflow: auto; 137 | } 138 | 139 | #mocha .test .html-error { 140 | overflow: auto; 141 | color: black; 142 | line-height: 1.5; 143 | display: block; 144 | float: left; 145 | clear: left; 146 | font: 12px/1.5 monaco, monospace; 147 | margin: 5px; 148 | padding: 15px; 149 | border: 1px solid #eee; 150 | max-width: 85%; /*(1)*/ 151 | max-width: calc(100% - 42px); /*(2)*/ 152 | max-height: 300px; 153 | word-wrap: break-word; 154 | border-bottom-color: #ddd; 155 | -webkit-border-radius: 3px; 156 | -webkit-box-shadow: 0 1px 3px #eee; 157 | -moz-border-radius: 3px; 158 | -moz-box-shadow: 0 1px 3px #eee; 159 | border-radius: 3px; 160 | } 161 | 162 | #mocha .test .html-error pre.error { 163 | border: none; 164 | -webkit-border-radius: none; 165 | -webkit-box-shadow: none; 166 | -moz-border-radius: none; 167 | -moz-box-shadow: none; 168 | padding: 0; 169 | margin: 0; 170 | margin-top: 18px; 171 | max-height: none; 172 | } 173 | 174 | /** 175 | * (1): approximate for browsers not supporting calc 176 | * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) 177 | * ^^ seriously 178 | */ 179 | #mocha .test pre { 180 | display: block; 181 | float: left; 182 | clear: left; 183 | font: 12px/1.5 monaco, monospace; 184 | margin: 5px; 185 | padding: 15px; 186 | border: 1px solid #eee; 187 | max-width: 85%; /*(1)*/ 188 | max-width: calc(100% - 42px); /*(2)*/ 189 | word-wrap: break-word; 190 | border-bottom-color: #ddd; 191 | -webkit-border-radius: 3px; 192 | -webkit-box-shadow: 0 1px 3px #eee; 193 | -moz-border-radius: 3px; 194 | -moz-box-shadow: 0 1px 3px #eee; 195 | border-radius: 3px; 196 | } 197 | 198 | #mocha .test h2 { 199 | position: relative; 200 | } 201 | 202 | #mocha .test a.replay { 203 | position: absolute; 204 | top: 3px; 205 | right: 0; 206 | text-decoration: none; 207 | vertical-align: middle; 208 | display: block; 209 | width: 15px; 210 | height: 15px; 211 | line-height: 15px; 212 | text-align: center; 213 | background: #eee; 214 | font-size: 15px; 215 | -moz-border-radius: 15px; 216 | border-radius: 15px; 217 | -webkit-transition: opacity 200ms; 218 | -moz-transition: opacity 200ms; 219 | transition: opacity 200ms; 220 | opacity: 0.3; 221 | color: #888; 222 | } 223 | 224 | #mocha .test:hover a.replay { 225 | opacity: 1; 226 | } 227 | 228 | #mocha-report.pass .test.fail { 229 | display: none; 230 | } 231 | 232 | #mocha-report.fail .test.pass { 233 | display: none; 234 | } 235 | 236 | #mocha-report.pending .test.pass, 237 | #mocha-report.pending .test.fail { 238 | display: none; 239 | } 240 | #mocha-report.pending .test.pass.pending { 241 | display: block; 242 | } 243 | 244 | #mocha-error { 245 | color: #c00; 246 | font-size: 1.5em; 247 | font-weight: 100; 248 | letter-spacing: 1px; 249 | } 250 | 251 | #mocha-stats { 252 | position: fixed; 253 | top: 15px; 254 | right: 10px; 255 | font-size: 12px; 256 | margin: 0; 257 | color: #888; 258 | z-index: 1; 259 | } 260 | 261 | #mocha-stats .progress { 262 | float: right; 263 | padding-top: 0; 264 | } 265 | 266 | #mocha-stats em { 267 | color: black; 268 | } 269 | 270 | #mocha-stats a { 271 | text-decoration: none; 272 | color: inherit; 273 | } 274 | 275 | #mocha-stats a:hover { 276 | border-bottom: 1px solid #eee; 277 | } 278 | 279 | #mocha-stats li { 280 | display: inline-block; 281 | margin: 0 5px; 282 | list-style: none; 283 | padding-top: 11px; 284 | } 285 | 286 | #mocha-stats canvas { 287 | width: 40px; 288 | height: 40px; 289 | } 290 | 291 | #mocha code .comment { color: #ddd; } 292 | #mocha code .init { color: #2f6fad; } 293 | #mocha code .string { color: #5890ad; } 294 | #mocha code .keyword { color: #8a6343; } 295 | #mocha code .number { color: #2f6fad; } 296 | 297 | @media screen and (max-device-width: 480px) { 298 | #mocha { 299 | margin: 60px 0px; 300 | } 301 | 302 | #mocha #stats { 303 | position: absolute; 304 | } 305 | } 306 | --------------------------------------------------------------------------------