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 |
80 |
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 |
104 |
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+xml CSS
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 |
27 |
This is the css-ns
test runner.
28 |
If you see something's broken on your browser, filing an issue is much appreciated.
29 |
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 |
--------------------------------------------------------------------------------