diff --git a/.gitignore b/.gitignore index b333121..13a808f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,15 @@ -node_modules -tmp -/gulp-useref-weh/node_modules/ -/npm-debug.log +node_modules/ +tmp/ +npm-debug.log +run-web-ext.sh +inspector/ +skeleton/ +make-inspector.sh +.DS_Store +._.DS_Store +make-inspector-sign.sh +inspector-tmp/ +inspector-builds/ +build-inspector-firefox.sh +profile/ +run-inspector.sh diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d1a16eb..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "gulp-chrome-manifest"] - path = gulp-chrome-manifest - url = https://github.com/ragingwind/gulp-chrome-manifest.git diff --git a/README.md b/README.md index c5361e3..f474cf2 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,13 @@ This toolkit speeds up browser add-ons development by providing a number of facilities for WebExtensions-based (Firefox, Chrome, Opera and Edge) extensions. -This is not a framework in the sense that the developer does not have to embrace all the provided utilities and there is not many architectural constraints to follow in order to take benefit of the tool. +This is not a framework in the sense that the developer does not have to embrace all the provided utilities and there are not many architectural constraints to follow in order to take benefit of the tool. The build system generates automatically a directory you can directly install into your browser, compiling -automatically CoffeeScript, TypeScript and JSX to Javascript, Sass, Less and Stylus to CSS, optionally concatenating and minifying scripts, styles and HTML. +automatically CoffeeScript, TypeScript and JSX to Javascript, Sass, Less and Stylus to CSS. -**weh** also provides some libraries that goes into your addon to ease a number of common tasks like managing preferences and two-way communications between the extension background and its user interface content pages, -providing a way for the end-user to customize any string in the add-on user interface. Developing the user interface using ReactJS is also simplified but you may choose -not to use this library. +**weh** also provides some libraries that go into your addon to ease a number of common tasks like managing preferences and two-way communications between the extension background and its user interface content pages, +providing a way for the end-user to customize any string in the add-on user interface. Developing the user interface using ReactJS is also simplified but you may choose not to use this library. In addition, an inspector application (under the form of a **weh**-based extension) is provided to monitor other **weh** extensions in real-time. @@ -65,7 +64,7 @@ weh ``` You will notice that the last `weh` command does not return. It is in watch mode, meaning whenever you make a change into the `myextension/src` -directory, those changes are rebuild into `myextension/build`. If you do not want this behaviour and prefer running the build command manually, +directory, those changes are rebuild into `myextension/build`. If you do not want this behavior and prefer running the build command manually, add `--no-watch` to the command line. Run `weh help` to see more command line options. @@ -82,94 +81,31 @@ Run `weh help` to see more command line options. **weh** expects all project-specific code to be put into the `src` sub-directory: - `src/manifest.json`: your add-on's manifest -- `src/**/*.html`: those files are processed, so resources like js and css (and other supported languages) are learned and -processed to the build directory. -- `src/locales`: files are copied to `build/_locales` -- `src/manifest.json`: file is copied to `build` -- `src/**/_assets/`: files and directories are processed (for language compilation) and copied to the build directory -(without the `_assets` part) -- `etc/jsbanner.txt`: file that you can optionnally create to setup a header in the JS files. - -Note that a `.js` or `css` file that would be located in `src/` but not referenced from `manifest.json` nor any `.html` -file won't be copied to the build directory. If you want this file in the build, you must put it in a `_assets` -sub-directory of `src/`. +- `src/**/*`: those files are processed, so resources like js and css (and other supported languages) are learned and processed to the build directory. +- `src-modules/**/*`: files here are used to resolve dependencies +- `locales`: files are copied to `build/_locales` Also note that you can change the `src` directory by specifying a directory path with the `--srcdir` option. -## defining resources +## accessing weh services -You don't need to do anything special to make *weh* background libraries available to your add-on. Just declare your own modules in `manifest.json`: +Declaring `weh` from a background script: `const weh = require('weh-background');` +From a content script: `const weh = require('weh-content');` -``` - "background": { - "scripts": [ - "background/main.js" - ] - } -``` - -When the add-on is built, *weh* background modules will be added automatically. If the `--prod` option is provided, *weh* and custom files -will be concatenated and minified. - -Content scripts and styles included in `manifest.json`are processed the same way: -``` - "content_scripts": [{ - "js": [ "script1.js", "script2.js" ], - "css": [ "style1.css", "style2.css" ] - }] -``` - -For content files, you must load a number of scripts and styles into your HTML files. For instance: -``` - - - - - - - - - -
- - - - - - - - - -``` +You can then access a number of services from the `weh` variable: -When the extension is built, `` is first replaced by weh scripts inclusion. Then, the sections between -`` and `` are processed to be concatenated into a single file (per section) and minified -if you specify the `--prod` for production mode. +- `weh.rpc`: making function calls (both ways) through various components completely transparent: between background and content, background and workers, background and native apps, background and injected-content +- `weh.prefs`: preferences system +- `weh.i18n`: translation system +- `weh.ui`: content management from background utilities ## multi-language support -*Weh* obviously supports Javascript (`.js` file extension) for scripts and Cascading Style Sheets (`.css` extension), -but you can also use other languages: +*Weh* obviously supports Javascript (`.js` file extension) for scripts and Cascading Style Sheets (`.css` extension), but you can also use other languages: - scripts: *JSX* (`.jsx`), *Typescript* (`.ts`), *Coffee* (`.coffee`) - styling: *Sass* (`.scss`), *Less* (`.less`), *Stylus* (`.styl`) -Whether in `manifest.json`or `.html` files, just use the file as if it was Javascript or CSS: -``` - - - - - ... - - - - -``` - -*Weh* will then take care of calling the appropriate processors and renaming the files inside `manifest.json` and -`.html` files, so that the browser will be able to run this code. - ## pre-processing files All files with a `.ejs` are processed first by an *EJS* processor. For instance, a file named `myscript.js.ejs` will @@ -177,7 +113,7 @@ be transformed to `myscript.js` before being processed. You can specify one or s for the EJS resolution using the `--ejsdata` option. The EJS pre-processing occurs in a first place, so a file named `myscript.ts.ejs` will first be EJS-processed, then -compiled using Typescript, and will endup in the build directory as `myscript.js`. +compiled using Typescript, and will end up in the build directory as `myscript.js`. Any text file in the `src` directory can be processed with EJS, not only js and css-like. @@ -188,7 +124,7 @@ Pre-processing is useful if you want to generate different builds from the same ### weh preferences Preferences are to be formally defined in order to be used in your add-on. An example of preferences description could be: -``` +```js weh.prefs.declare([{ name: "myparam_string", type: "string", @@ -230,7 +166,7 @@ weh.prefs.declare([{ For each parameter, you must provide at least `name`, `type` and `defaultValue`. `type` must be one of `string`, `integer`, `float`, `boolean` or `choice`. A specific preference parameter can then be accessed, as read or write, through `weh.prefs["parameter name"]`. -You can install preferences listeners using `weh.prefs.on(whatToWatch,callback)` and uninstall listeners using `weh.prefs.off` with the same parameters. `whatToWatch` uses a dotted notation. For instance, listening to `""`, `"a"`, `"a.b"` or `"a.b.c"` will trigger the callback whenever +You can install preferences listeners using `weh.prefs.on(whatToWatch,callback)` and un-install listeners using `weh.prefs.off` with the same parameters. `whatToWatch` uses a dotted notation. For instance, listening to `""`, `"a"`, `"a.b"` or `"a.b.c"` will trigger the callback whenever parameter `a.b.c` is modified. Note that the preferences listeners are available from both background and local content. You should also define a couple of human viewable strings associated to each parameter in `locales//messages.json`: @@ -238,7 +174,7 @@ You should also define a couple of human viewable strings associated to each par - `weh_prefs_description_` defines an optional longer description for this parameter Example (`locales/en_US/messages.json`): -``` +```js "weh_prefs_label_myparam_string": { "message": "String parameter" }, @@ -256,154 +192,101 @@ You can define a number of constraints to your preferences. This is useful with - object containing fields `value` (the actual preference value) and `name` (what is to be displayed to the user) - string representing the actual preference value. The label to be displayed for this choice is searched in `locales//messages.json` as `weh_prefs_label__option_` -Note that the preferences definition can be declared or updated at any time. This is useful if, for instance, you don't the list of choices -in advance. +Note that the preferences definition can be declared or updated at any time. This is useful if, for instance, you don't the list of choices in advance. -From the content side, you should create an HTML file in your source code to represent the settings page: -``` - - - - - - - - - -
- - - - - - - - - - - -``` - -And a settings JSX file like this: -``` -function Prefs() { - return ( - - - - - - - ) -} - -ReactDOM.render ( -
-

{weh._("settings")}

-
- -
, - document.getElementById('root') -) -``` - -*weh* will automatically create a dynamic form to allow modifying settings based on the preferences definition. +*weh* takes care of adding/removing the listener when the component is mounted/unmounted and delivering the message to the `onWehMessage` method. -### weh user interface +## debugging tools -*weh* simplifies communications between background and content by handling automatically the message ports. +The *weh* toolkit includes an extension called *weh-inspector* which allows to: +- monitor messages between the background and UI +- read/write addon preferences +- read add-on storage -Let's see an example (`src/background/main.js`): -``` -weh.ui.update("default",{ - onMessage: function(message) { - switch(message.type) { - case "open-settings": - weh.ui.close("default"); - weh.ui.open("settings"); - break; - } - } -}); +The *weh-inspector* is available as a template in the *weh* toolkit. As such, you can install it with `weh init --template inspector --prjdir inspector` and then load the generated extension into the browser like any regular weh addon. -weh.ui.update("settings",{ - type: "tab", - contentURL: "content/settings.html", -}); -``` +## i18n -Here we defined 2 user interface pages. The first one has a special name `default` meaning this is the popup declared in `manifest.json`. When -this popup sends a message with the `type` field equal to `open-settings`, a tab is opened to URL `content/settings.html`. If a tab is already -open to this URL, it is activated instead. +*weh* provides some utilities for dealing with locales. -In the content popup code, when the *Setting* button/link is pressed, we just do: -``` - weh.post({ - type: "open-settings" - }); -``` +Instead of `browser.i18n.getMessage()`, you should use `weh._()`, with the same parameters: +- it's shorter +- it automatically turns character `'-'` into `'_'` in string tags while leaving a warning in the console +- more important: it allows overwriting some or all locale strings. Whenever a call is made to `weh._()`, the library first searches for a storage-based translation for this tag. If not found, it uses the default string defined in `_locales//messages.json`. By default, *weh* provides a user interface page for the user to edit locale strings. It is up to the add-on developer to write the code to centralize the user-generated translations on a server, so that it can be shared amongst all users. -To send asynchronous messages to the content pages, just do: +## rpc -``` - weh.ui.post(panelName,message) -``` +*weh* provides an easy way to call functions across components that do not run within the same threads. -Where `panelName` is the name of a page your previously defined with `weh.ui.update` and `message` is any JSONizable javascript object. +All the functions return promises. If a declared function returns something other than a Promise object, *weh* takes of promisifying the returned value. -You can also call `weh.ui.post(message)` to send the same message to all open pages. +Functions are declared on the called side using `weh.rpc.listen()` and are called with `weh.rpc.call()`. -When defining a content page, you can, in addition to catching messages with `onMessage`, define callbacks for page opening with `onShow` or closing -with `onHide`. +For instance, the background can define a function like this: +```js +weh.rpc.listen({ + my_function: (a,b) => { + return a + b; + } +}) +``` -The callback parameters are: -- `onMessage(message,postFn,panelName)` with `message` is the object sent from the content, `postFn` a function that can be used to send back messages directly and `panelName` the name of the panel (as defined in `weh.ui.update`) that sent the message. So doing `postFn({...})` is equivalent to `weh.ui.post(panelName,{...})`. +and a content script can call the function this way: +```js +weh.call("my_function",39,3) + .then((result)=>{ + console.info("=",result); + }); +``` -From the content side, you can listen for incoming background messages with `weh.on(callback)` and `weh.off(callback)` to remove the listerner. +`weh.rpc.listen()` can declare several functions at once, and can be called several times: only function with the same name are overwritten. -If you go for ReactJS for building your user interface, you can defines components like this: -``` -class MyComponent extends React.Component { - constructor(props) { - super(props); - weh.react.attach(this,this.onWehMessage); - } - onWehMessage(message) { - /* do something wxith the incoming message */ - } -} -``` +When using the `weh.ui` module to create a content, for instance creating a tab, a name is given to this content, for instance `settings`. When the background wants to call a function declared within this content, it must use the content name as the first parameter: `weh.rpc.call("settings","my_function",39,3); -*weh* takes care of adding/removing the listener when the component is mounted/unmounted and delivering the message to the `onWehMessage` method. +If the called function does not exists, throw an exception or return explicitly a failed promise the returned promise is rejected. -### content weh API +## native messaging -The preferences and localization API are available for background and local content. Some `weh` API methods are only available from the local content: +*weh* is also very useful when dealing with native messaging. -- `post(message)`: post a message to the background. `message` is any JSONizable object. -- `postLocal(message)`: emulate a message received from the background. `message` is any object. -- `on([type,]callback)`: install a handler to receive background messages. If `type` is used, the callback will be invoked only if the received message contains a field `type` with the same value. -- `off([type,]callback)`: uninstall the callback from a previous call to `on(...)`. -- `copyToClipboard(data,mimeType)`: copy data to the clipboard. `mimeType` default is `plain/text`. -- `setPageTitle(newTitle)`: update or create the `` element in the HTML `<head>` section. +```js +var nativeApp = require('weh-natmsg')("com.example.myapp"); -## debugging tools +nativeApp.call("my_function",...params) + .then((result)=>{ + // do something + }) + .catch((err)=>{ + // handle error + }) +``` -The *weh* toolkit includes an extension called *weh-inspector* which allows to: -- monitor messages between the background and UI -- read/write addon preferences -- read add-on storage +You can catch all errors due to the native app not being installed (or at least not being callable): +```js +nativeApp.onAppNotFound.addListener((err)=>{ + // for instance, open a tab to a site where to download the app +}) +``` -As of now, this tool is only available on Chrome and Opera, as Firefox currently lacks some APIs for the tool to operate. +You can just check whether the app is present, without triggering the `onAppNotFound()` if it is not: +```js +nativeApp.callCatchAppNotFound((err)=>{ + // this is called if the app could not be launched +},"my_function",...params); +``` -The *weh-inspector* is available as a template in the *weh* toolkit. As such, you can install it with `weh init --template weh-inspector --prjdir weh-inspector` and then load the generated extension into the browser like any regular weh addon. +On the native app side, assuming it is developed on node.js, you can use the exact same rpc mechanism, using `rpc.listen()` and `rpc.call()` to communicate both ways with the add-on. -## i18n +For now, the only implementation of such a native is available on the [`vdhcoapp` project](https://github.com/mi-g/vdhcoapp) under GPL-2.0 license. It is planned to release a version using a less restrictive license. -*weh* provides some utilities for dealing with locales. +## UI utilities -Instead of `browser.i18n.getMessage()`, you should use `weh._()`, with the same parameters: -- it's shorter -- it automatically turns character `'-'` into `'_'` in string tags while leaving a warning in the console -- more important: it allows overwriting some or all locale strings. Whenever a call is made to `weh._()`, the library first searches for a storage-based translation for this tag. If not found, it uses the default string defined in `_locales/<locale>/messages.json`. By default, *weh* provides a user interface page for the user to edit locale strings. It is up to the add-on developer to write the code to centralize the user-generated translations on a server, so that it can be shared amongst all users. +`weh.ui` provides the ability to open a tab or a panel, so that the created content can directly be callable from the background using `weh.rpc`. +```js +weh.ui.open("some_name",{ + url: "content/content.html", + type: "tab" +}); +weh.rpc.call("some_name","my_content_function",...params); +``` diff --git a/etc/jsbanner.txt b/etc/jsbanner.txt deleted file mode 100644 index 069314d..0000000 --- a/etc/jsbanner.txt +++ /dev/null @@ -1,10 +0,0 @@ -/* - * <%= manifest.name %> <%= manifest.description && (" - "+manifest.description) || "" %> - * @version <%= manifest.version %><% if(manifest.homepage_url) { %> - * @link <%= manifest.homepage_url %><% } - if(manifest.author) { %> - * @author: <%= manifest.author %><% } - if(manifest.license) { %> - * @license <%= manifest.license %><% } %> - */ - \ No newline at end of file diff --git a/gulp-useref-weh/index.js b/gulp-useref-weh/index.js deleted file mode 100644 index 7d5a4d6..0000000 --- a/gulp-useref-weh/index.js +++ /dev/null @@ -1,153 +0,0 @@ -/* - * gulp-useref-weh - * - * @summary an integration of useref into gulp, solves some gulp-useref issues - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -const useref = require("./useref"); -const es = require('event-stream'); -const through = require('through2'); -const minimatch = require("minimatch"); -const glob = require("glob"); -const gulp = require("gulp"); -const debug = require("gulp-debug"); -const concat = require("gulp-concat"); -const gulpif = require("gulp-if"); -const streamqueue = require('streamqueue'); -const path = require("path"); -const gutil = require('gulp-util'); -const File = gutil.File; - -module.exports = function () { - - var handlers, options; - - if(Array.isArray(arguments[0])) { - handlers = arguments[0]; - options = arguments[1] || {}; - } else { - handlers = [{src:"**/*.{js,css}"}]; - options = arguments[0] || {}; - } - - return through.obj(function (file, enc, callback) { - - var self = this; - var output = useref(file.contents.toString(),{ - noconcat: !!options.noconcat, - changeExt: options.changeExt - }); - var outputHTML = output[0]; - var allAssets = output[1]; - var processCount = 1; - var errorEmitted = false; - - var cwd = process.cwd(); - var baseDir = path.dirname(file.path); - if(options.base) - baseDir = options.base; - process.chdir(baseDir); - this.push(new File({ - path: file.path, - contents: Buffer.from(outputHTML) - })); - process.chdir(cwd); - var relDir = path.dirname(path.relative(baseDir,file.path)); - - function GetAssetStreams(scripts) { - - var assetStreams = []; - var fileScriptMap = {}; - - scripts.forEach(function(script) { - if(handlers.every(function(handler) { - var patterns = handler.src; - if(!Array.isArray(patterns)) - patterns = new Array(patterns); - if(!patterns.every(function(pattern) { - var files = glob.sync(pattern); - if(!files.every(function(file) { - if(minimatch(file,script,{matchBase:true})) { - assetStreams.push(handler.stream && handler.stream(file) || gulp.src(file)); - fileScriptMap[path.resolve(file)] = script; - return false; - } - return true; - })) - return false; - return true; - })) - return false - return true; - })) - console.warn("gulp-useref-weh: No handler found for",script); - }); - - return { - assetStreams: assetStreams, - fileScriptMap: fileScriptMap - } - } - - function Done() { - if(--processCount==0) - callback(); - } - - function ChangeExt(name) { - while(options.changeExt && (path.extname(name) in options.changeExt)) - name = name.substr(0, name.lastIndexOf(".")) + options.changeExt[path.extname(name)]; - return name; - } - - for(var type in allAssets) { - for(var oName in allAssets[type]) - (function(oName) { - var streamsObj = GetAssetStreams(allAssets[type][oName].assets); - var streams = streamsObj.assetStreams; - var fileScriptMap = {}; - for(var key in streamsObj.fileScriptMap) - fileScriptMap[ChangeExt(key)] = ChangeExt(streamsObj.fileScriptMap[key]); - - if(options.noconcat) - processCount+=streams.length; - else - processCount++; - - streamqueue.apply(null,[{objectMode:true}].concat(streams)) - .on("error",function(err) { - self.emit("error",err); - this.emit("end"); - }) - .pipe(gulpif(!options.noconcat,concat(oName))) - .pipe(through.obj(function(file,enc,cb) { - var scriptFile = fileScriptMap[file.path]; - var targetName = path.join(relDir,options.noconcat ? scriptFile : oName); - if(options.map) { - var baseName = path.basename(file.path); - if(!options.map[baseName]) - options.map[baseName] = []; - if(options.map[baseName].indexOf(targetName)<0) - options.map[baseName].push(targetName); - } - self.push(new File({ - path: targetName, - contents: file.contents - })); - - cb(); - Done(); - })); - })(oName); - } - - Done(); - }); - -} diff --git a/gulp-useref-weh/package.json b/gulp-useref-weh/package.json deleted file mode 100644 index a445bf6..0000000 --- a/gulp-useref-weh/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "gulp-useref-weh", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "minimatch": "^3.0.3", - "streamqueue": "^1.1.1", - "useref": "^1.2.0" - } -} diff --git a/gulp-useref-weh/useref/.editorconfig b/gulp-useref-weh/useref/.editorconfig deleted file mode 100644 index bc9504f..0000000 --- a/gulp-useref-weh/useref/.editorconfig +++ /dev/null @@ -1,25 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# editorconfig.org - -root = true - - -[*] - -# Change these settings to your own preference -indent_style = space -indent_size = 2 - -# We recommend you to keep these unchanged -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.md] -trim_trailing_whitespace = false - -[{package.json,*.yml}] -indent_style = space -indent_size = 2 diff --git a/gulp-useref-weh/useref/.eslintrc.json b/gulp-useref-weh/useref/.eslintrc.json deleted file mode 100644 index 1383224..0000000 --- a/gulp-useref-weh/useref/.eslintrc.json +++ /dev/null @@ -1,180 +0,0 @@ -{ - "env": { - "mocha": true, - "node": true - }, - "globals": {}, - "extends": "eslint:recommended", - "rules": { - "block-scoped-var": 2, - "complexity": [ - 1, - 5 - ], - "consistent-return": 2, - "curly": [ - 2, - "all" - ], - "dot-notation": 2, - "eqeqeq": 2, - "no-caller": 2, - "no-else-return": 2, - "no-eq-null": 2, - "no-extend-native": 2, - "no-implicit-coercion": 2, - "no-invalid-this": 2, - "no-loop-func": 2, - "no-multi-spaces": 2, - "no-multi-str": 2, - "no-new-func": 2, - "no-new-wrappers": 2, - "no-new": 2, - "no-param-reassign": 1, - "no-unused-expressions": 2, - "no-useless-call": 2, - "no-useless-concat": 2, - "no-with": 2, - "vars-on-top": 2, - "wrap-iife": [2, "any"], - "yoda": [ - 2, - "never" - ], - - "strict": [ - 2, - "global" - ], - - "no-shadow": 2, - "no-use-before-define": 2, - - "callback-return": 2, - "handle-callback-err": 2, - "no-path-concat": 2, - - "array-bracket-spacing": [ - 1, - "always", { - "objectsInArrays": false - } - ], - "block-spacing": 1, - "brace-style": 1, - "camelcase": [ - 1, { - "properties": "never" - } - ], - "comma-spacing": [ - 1, { - "before": false, - "after": true - } - ], - "comma-style": [ - 1, - "last" - ], - "computed-property-spacing": [ - 1, - "never" - ], - "consistent-this": [ - 1, - "self" - ], - "eol-last": 1, - "indent": [ - 2, - 2, { - "SwitchCase": 1 - } - ], - "key-spacing": [ - 1, { - "beforeColon": false, - "afterColon": true - } - ], - "keyword-spacing": 1, - "linebreak-style": [ - 1, - "unix" - ], - "lines-around-comment": [ - 1, { - "allowBlockStart": true, - "beforeBlockComment": true, - "beforeLineComment": true - } - ], - "max-depth": [ - 1, - 4 - ], - "max-params": [ - 1, - 3 - ], - "max-statements": [ - 1, - 10 - ], - "new-cap": 2, - "new-parens": 2, - "newline-after-var": [ - 1, - "always" - ], - "no-array-constructor": 2, - "no-bitwise": 1, - "no-lonely-if": 1, - "no-multi-spaces": 1, - "no-multiple-empty-lines": 1, - "no-new-object": 2, - "no-spaced-func": 1, - "no-trailing-spaces": 1, - "no-unneeded-ternary": 1, - "object-curly-spacing": [ - 1, - "always" - ], - "operator-assignment": [ - 1, - "always" - ], - "operator-linebreak": [ - 1, - "after" - ], - "quote-props": [ - 1, - "as-needed" - ], - "quotes": [ - 1, - "single" - ], - "semi": [ - 2, - "always" - ], - "semi-spacing": [ - 1, { - "before": false, - "after": true - } - ], - "space-before-blocks": [ - 1, - "always" - ], - "space-before-function-paren": [1, { "anonymous": "always", "named": "never" }], - "space-in-parens": [1, "never"], - "space-infix-ops": 1, - "space-unary-ops": 0, - "spaced-comment": [1, "always", { "line": { "exceptions": ["-"] } }] - } -} diff --git a/gulp-useref-weh/useref/.gitattributes b/gulp-useref-weh/useref/.gitattributes deleted file mode 100644 index dd73293..0000000 --- a/gulp-useref-weh/useref/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -* text=auto - -# Tell git not to change these line endings -test/testfiles/16-win-expected.html text=-crlf -test/testfiles/16-win.html text=-crlf diff --git a/gulp-useref-weh/useref/.gitignore b/gulp-useref-weh/useref/.gitignore deleted file mode 100644 index 1fd04da..0000000 --- a/gulp-useref-weh/useref/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -coverage -.nyc_output diff --git a/gulp-useref-weh/useref/.travis.yml b/gulp-useref-weh/useref/.travis.yml deleted file mode 100644 index 0f8a6b6..0000000 --- a/gulp-useref-weh/useref/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: node_js -node_js: - - '6' - - '4' -before_script: - - npm install -g gulp - - gulp lint -after_success: npm run coveralls - -# whitelist -branches: - only: - - master - -notifications: - email: - - kempdogg@gmail.com diff --git a/gulp-useref-weh/useref/CONTRIBUTING.md b/gulp-useref-weh/useref/CONTRIBUTING.md deleted file mode 100644 index 0c26321..0000000 --- a/gulp-useref-weh/useref/CONTRIBUTING.md +++ /dev/null @@ -1,199 +0,0 @@ -# Contributing to useref - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of -the developers managing and developing this open source project. In return, -they should reciprocate that respect in addressing your issue or assessing -patches and features. - - -## Using the issue tracker - -The issue tracker is the preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and [submitting pull -requests](#pull-requests), but please respect the following restrictions: - -* Please **do not** use the issue tracker for personal support requests (use - [Stack Overflow](http://stackoverflow.com) or IRC). - -* Please **do not** derail or troll issues. Keep the discussion on topic and - respect the opinions of others. - - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the GitHub issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `master` or development branch in the repository. - -3. **Isolate the problem** — create a [reduced test - case](https://css-tricks.com/reduced-test-cases/) and a live example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -Example: - -> Short and descriptive example bug report title -> -> A summary of the issue and the browser/OS environment in which it occurs. If -> suitable, include the steps required to reproduce the bug. -> -> 1. This is the first step -> 2. This is the second step -> 3. Further steps, etc. -> -> `<url>` - a link to the reduced test case -> -> Any other information you want to share that is relevant to the issue being -> reported. This might include the lines of code that you have identified as -> causing the bug, and potential solutions (and your opinions on their -> merits). - - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to *you* to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic -help. They should remain focused in scope and avoid containing unrelated -commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Follow this process if you'd like your work considered for inclusion in the -project: - -1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, - and configure the remotes: - - ```bash - # Clone your fork of the repo into the current directory - $ git clone https://github.com/<your-username>/useref - # Navigate to the newly cloned directory - $ cd useref - # Assign the original repo to a remote called "upstream" - $ git remote add upstream https://github.com/jonkemp/useref - ``` - -2. If you cloned a while ago, get the latest changes from upstream: - - ```bash - $ git checkout <dev-branch> - $ git pull upstream <dev-branch> - ``` - -3. Create a new topic branch (off the main project development branch) to - contain your feature, change, or fix: - - ```bash - $ git checkout -b <topic-branch-name> - ``` - -4. Add relevant tests to cover the change. - -5. Make sure test-suite passes: `npm test` - -6. Commit your changes in logical chunks. Please adhere to these [git commit - message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) - or your code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/interactive-rebase) - feature to tidy up your commits before making them public. - -7. Locally merge (or rebase) the upstream development branch into your topic branch: - - ```bash - $ git pull [--rebase] upstream <dev-branch> - ``` - -8. Push your topic branch up to your fork: - - ```bash - $ git push origin <topic-branch-name> - ``` - -9. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) - with a clear title and description. - -## Conventions of commit messages - -Addding files on repo - -```bash -$ git commit -m "Add filename" -``` - -Updating files on repo - -```bash -$ git commit -m "Update filename, filename2, filename3" -``` - -Removing files on repo - -```bash -$ git commit -m "Remove filename" -``` - -Renaming files on repo - -```bash -$ git commit -m "Rename filename" -``` - -Fixing errors and issues on repo - -```bash -$ git commit -m "Fixed #issuenumber Message about this fix" -``` - -Adding features on repo - -```bash -$ git commit -m "Add Feature: nameoffeature Message about this feature" -``` - -Updating features on repo - -```bash -$ git commit -m "Update Feature: nameoffeature Message about this update" -``` - -Removing features on repo - -```bash -$ git commit -m "Remove Feature: nameoffeature Message about this" -``` - -Ignoring Travis CI build on repo - -```bash -$ git commit -m "Commit message here [ci-skip]" -``` - -**IMPORTANT**: By submitting a patch, you agree to allow the project owner to -license your work under the same license as that used by the project. diff --git a/gulp-useref-weh/useref/LICENSE b/gulp-useref-weh/useref/LICENSE deleted file mode 100644 index e19ebc1..0000000 --- a/gulp-useref-weh/useref/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Jonathan Kemp - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/gulp-useref-weh/useref/README.md b/gulp-useref-weh/useref/README.md deleted file mode 100644 index 0264fc3..0000000 --- a/gulp-useref-weh/useref/README.md +++ /dev/null @@ -1,200 +0,0 @@ -# useref [![Build Status](https://travis-ci.org/jonkemp/useref.svg?branch=master)](https://travis-ci.org/jonkemp/useref) [![Coverage Status](https://coveralls.io/repos/jonkemp/useref/badge.svg?branch=master&service=github)](https://coveralls.io/github/jonkemp/useref?branch=master) - -[![NPM](https://nodei.co/npm/useref.png?downloads=true)](https://nodei.co/npm/useref/) - -> Parse build blocks in HTML files to replace references - -Extracted from the grunt plugin [grunt-useref](https://github.com/pajtai/grunt-useref). - -## Installation - -``` -npm install useref -``` - -## Usage - -```js -var useref = require('useref'); -var result = useref(inputHtml); -// result = [ replacedHtml, { type: { path: { 'assets': [ replacedFiles] }}} ] -``` - - -Blocks are expressed as: - -```html -<!-- build:<type>(alternate search path) <path> <parameters> --> -... HTML Markup, list of script / link tags. -<!-- endbuild --> -``` - -- **type**: either `js`, `css` or `remove` -- **alternate search path**: (optional) By default the input files are relative to the treated file. Alternate search path allows one to change that -- **path**: the file path of the optimized file, the target output -- **parameters**: extra parameters that should be added to the tag - -An example of this in completed form can be seen below: - -```html -<html> -<head> - <!-- build:css css/combined.css --> - <link href="css/one.css" rel="stylesheet"> - <link href="css/two.css" rel="stylesheet"> - <!-- endbuild --> -</head> -<body> - <!-- build:js scripts/combined.js --> - <script type="text/javascript" src="scripts/one.js"></script> - <script type="text/javascript" src="scripts/two.js"></script> - <!-- endbuild --> - - <!-- build:js scripts/async.js async data-foo="bar" --> - <script type="text/javascript" src="scripts/three.js"></script> - <script type="text/javascript" src="scripts/four.js"></script> - <!-- endbuild --> -</body> -</html> -``` - -The module would be used with the above sample HTML as follows: - -```js -var result = useref(sampleHtml); - -// [ -// resultHtml, -// { -// css: { -// 'css/combined.css': { -// 'assets': [ 'css/one.css', 'css/two.css' ] -// } -// }, -// js: { -// 'scripts/combined.js': { -// 'assets': [ 'scripts/one.js', 'scripts/two.js' ] -// }, -// 'scripts/async.js': { -// 'assets': [ 'scripts/three.js', 'scripts/four.js' ] -// } -// } -// } -// ] -``` - - -The resulting HTML would be: - -```html -<html> -<head> - <link rel="stylesheet" href="css/combined.css"/> -</head> -<body> - <script src="scripts/combined.js"></script> - <script src="scripts/async.js" async data-foo="bar" ></script> -</body> -</html> -``` - -## IE Conditional Comments - -Internet Explorer Conditional Comments are preserved. The code below: - -```html -<!-- build:js scripts/combined.js --> -<!--[if lt IE 9]> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<![endif]--> -<!-- endbuild --> -``` - -Results in: - -```html -<!--[if lt IE 9]> -<script src="scripts/combined.js"></script> -<![endif]--> -``` - -### Custom blocks - -Sometimes you need a bit more. If you would like to do custom processing, this is possible with a custom block, as demonstrated below. - -```html -<!-- build:import components --> -<link rel="import" href="/bower_components/some/path"></link> -<!-- endbuild --> -``` - -With - -```js -var useref = require('useref'); -var result = useref(inputHtml, { - // each property corresponds to any blocks with the same name, e.g. "build:import" - import: function (content, target, options, alternateSearchPath) { - // do something with `content` and return the desired HTML to replace the block content - return content.replace('bower_components', target); - } -}); -``` - -Becomes - -```html -<link rel="import" href="/components/some/path"></link> -``` - -The handler function gets the following arguments: - -- *content* (String): The content of the custom use block -- *target* (String): The "path" value of the use block definition -- *options* (String): The extra attributes from the use block definition, the developer can parse as JSON or do whatever they want with it -- *alternateSearchPath* (String): The alternate search path that can be used to maintain a coherent interface with standard handlers - -Include a handler for each custom block type. - -### Symfony Twig and Laravel 5 Blade assets - -Works with the [symfony2 assetic](http://symfony.com/doc/current/cookbook/assetic/asset_management.html) and [laravel asset](https://laravel.com/docs/5.1/helpers#method-asset) and [elixir](https://laravel.com/docs/5.2/elixir#versioning-and-cache-busting) links in twig or blade or html or php. - -```html -<!-- build:js scripts/combined.js --> -<script src="{{ asset('symfony/js/script.js') }}"></script> -<script src="{{ elixir('laravel/js/script.js') }}"></script> -<!-- endbuild --> -``` - -### Options - -#### options.noconcat - -Type: `Boolean` -Default: `false` - -Strips out build comments but leaves the rest of the block intact without replacing any tags. - -```html -<!-- build:js scripts/combined.js --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -``` - -Results in: - -```html -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -``` - -## Contributing - -See the [CONTRIBUTING Guidelines](https://github.com/jonkemp/useref/blob/master/CONTRIBUTING.md) - -## License - -MIT © [Jonathan Kemp](http://jonkemp.com) diff --git a/gulp-useref-weh/useref/gulpfile.js b/gulp-useref-weh/useref/gulpfile.js deleted file mode 100644 index 049e9bc..0000000 --- a/gulp-useref-weh/useref/gulpfile.js +++ /dev/null @@ -1,28 +0,0 @@ -/* eslint-disable */ -'use strict'; - -var gulp = require('gulp'), - mocha = require('gulp-mocha'), - eslint = require('gulp-eslint'); - -var paths = { - scripts: ['./*.js', './lib/*.js', '!./gulpfile.js'] -}; - -gulp.task('lint', function () { - return gulp.src(paths.scripts) - .pipe(eslint()) - .pipe(eslint.format()) - .pipe(eslint.failAfterError()); -}); - -gulp.task('test', function () { - return gulp.src('./test/*.js') - .pipe(mocha({ reporter: 'spec' })); -}); - -gulp.task('watch', function () { - gulp.watch(paths.scripts, ['lint', 'test']); -}); - -gulp.task('default', ['lint', 'test', 'watch']); diff --git a/gulp-useref-weh/useref/index.js b/gulp-useref-weh/useref/index.js deleted file mode 100644 index 2005589..0000000 --- a/gulp-useref-weh/useref/index.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var getBlocks = require('./lib/getBlocks'), - transformReferences = require('./lib/transformReferences'), - compactContent = require('./lib/compactContent'); - -module.exports = function (content, options) { - var blocks = getBlocks(content), - opts = options || {}, - transformedContent = transformReferences(blocks, content, opts), - replaced = compactContent(blocks); - - return [ transformedContent, replaced ]; -}; diff --git a/gulp-useref-weh/useref/lib/buildBlockManager.js b/gulp-useref-weh/useref/lib/buildBlockManager.js deleted file mode 100644 index 08c6b17..0000000 --- a/gulp-useref-weh/useref/lib/buildBlockManager.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -var resources = require('./resources'), - sectionsJoinChar = resources.sectionsJoinChar, - regend = resources.regend, - sectionKey; - -module.exports = { - block: false, - - sections: {}, - - sectionIndex: 0, - - last: null, - - removeBlockIndex: 0, - - getSectionKey: function (build) { - var key; - - if (build.attbs) { - key = [ build.type, build.target, build.attbs ].join(sectionsJoinChar); - } else if (build.target) { - key = [ build.type, build.target ].join(sectionsJoinChar); - } else { - key = build.type; - } - - return key; - }, - - setSections: function (build) { - if (build.type === 'remove') { - build.target = String(this.removeBlockIndex++); - } - - sectionKey = this.getSectionKey(build); - - if (this.sections[sectionKey]) { - sectionKey += this.sectionIndex++; - } - - this.sections[sectionKey] = this.last = []; - }, - - endbuild: function (line) { - return regend.test(line); - } -}; diff --git a/gulp-useref-weh/useref/lib/compactContent.js b/gulp-useref-weh/useref/lib/compactContent.js deleted file mode 100644 index 9c58fc4..0000000 --- a/gulp-useref-weh/useref/lib/compactContent.js +++ /dev/null @@ -1,52 +0,0 @@ -'use strict'; - -var parse = require('./parseBuildBlock'), - resources = require('./resources'), - sectionsJoinChar = resources.sectionsJoinChar, - regComment = resources.regComment; - -function removeComments(lines) { - return lines.join('\n').replace(regComment, '').split('\n'); -} - -module.exports = function (blocks) { - - var result = {}; - - Object.keys(blocks).forEach(function (dest) { - // Lines are the included scripts w/o the use blocks - var lines = blocks[dest].slice(1, -1), - parts = dest.split(sectionsJoinChar), - type = parts[0], - - // output is the useref block file - output = parts[1], - build = parse(blocks[dest][0]), - assets; - - // remove html comment blocks - lines = removeComments(lines); - - // parse out the list of assets to handle, and update the grunt config accordingly - assets = lines.map(function (tag) { - // Allow white space and comment in build blocks by checking if this line has an asset or not - // The asset is the string of the referenced source file - return (tag.match(/(href|src)=(?:["']\W+\s*(?:\w+)\()?["']([^'"]+)['"]/) || [])[2]; - }).reduce(function (a, b) { - return b ? a.concat(b) : a; - }, []); - - result[type] = result[type] || {}; - - result[type][output] = { - assets: assets - }; - - if (build.alternateSearchPaths) { - // Alternate search path - result[type][output].searchPaths = build.alternateSearchPaths; - } - }); - - return result; -}; diff --git a/gulp-useref-weh/useref/lib/getBlocks.js b/gulp-useref-weh/useref/lib/getBlocks.js deleted file mode 100644 index 46dbd87..0000000 --- a/gulp-useref-weh/useref/lib/getBlocks.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -var buildBlockManager = require('./buildBlockManager'), - parse = require('./parseBuildBlock'), - resources = require('./resources'); - -// Returns a hash object of all the directives for the given html. Results is -// of the following form: -// -// { -// 'css/site.css ':[ -// ' <!-- build:css css/site.css -->', -// ' <link rel="stylesheet" href="css/style.css">', -// ' <!-- endbuild -->' -// ], -// 'js/head.js ': [ -// ' <!-- build:js js/head.js -->', -// ' <script src="js/libs/modernizr-2.5.3.min.js"></script>', -// ' <!-- endbuild -->' -// ], -// 'js/site.js ': [ -// ' <!-- build:js js/site.js -->', -// ' <script src="js/plugins.js"></script>', -// ' <script src="js/script.js"></script>', -// ' <!-- endbuild -->' -// ] -// } -// - -module.exports = function (body) { - var lines = body.replace(/\r\n/g, '\n').split(/\n/), - bbm = Object.create(buildBlockManager); - - bbm.sections = {}; - - lines.forEach(function (l) { - if (resources.regbuild.test(l)) { - bbm.block = true; - - bbm.setSections(parse(l)); - } - - if (bbm.block && bbm.last) { - bbm.last.push(l); - } - - // switch back block flag when endbuild - if (bbm.block && bbm.endbuild(l)) { - bbm.block = false; - } - }); - - // sections is an array of lines starting with the build block comment opener, - // including all the references and including the build block comment closer. - return bbm.sections; -}; diff --git a/gulp-useref-weh/useref/lib/parseBuildBlock.js b/gulp-useref-weh/useref/lib/parseBuildBlock.js deleted file mode 100644 index bbb5cef..0000000 --- a/gulp-useref-weh/useref/lib/parseBuildBlock.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var resources = require('./resources'); - -module.exports = function (block) { - var parts = block.match(resources.regbuild); - - return { - type: parts[1], - alternateSearchPaths: parts[2], - target: parts[3] && parts[3].trim(), - attbs: parts[4] && parts[4].trim() - }; -}; diff --git a/gulp-useref-weh/useref/lib/refManager.js b/gulp-useref-weh/useref/lib/refManager.js deleted file mode 100644 index d723ef2..0000000 --- a/gulp-useref-weh/useref/lib/refManager.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict'; - -var parseBuildBlock = require('./parseBuildBlock'), - bb = {}; - -module.exports = { - setBuildBlock: function (block, options) { - var props = parseBuildBlock(block); - - bb.handler = options && options[props.type]; - bb.target = props.target || 'replace'; - bb.type = props.type; - bb.attbs = props.attbs; - bb.alternateSearchPaths = props.alternateSearchPaths; - }, - - transformCSSRefs: function (block, target, attbs) { - var ref = ''; - - // css link element regular expression - // TODO: Determine if 'href' attribute is present. - var regcss = /<?link.*?(?:>|\))/gmi; - - // Check to see if there are any css references at all. - if (block.search(regcss) !== -1) { - if (attbs) { - ref = '<link rel="stylesheet" href="' + target + '" ' + attbs + '>'; - } else { - ref = '<link rel="stylesheet" href="' + target + '">'; - } - } - - return ref; - }, - - transformJSRefs: function (block, target, attbs) { - var ref = ''; - - // script element regular expression - // TODO: Detect 'src' attribute. - var regscript = /<?script\(?\b[^<]*(?:(?!<\/script>|\))<[^<]*)*(?:<\/script>|\))/gmi; - - // Check to see if there are any js references at all. - if (block.search(regscript) !== -1) { - if (attbs) { - ref = '<script src="' + target + '" ' + attbs + '></script>'; - } else { - ref = '<script src="' + target + '"></script>'; - } - } - - return ref; - }, - - getRef: function (block, blockContent, options) { - var ref = ''; - - this.setBuildBlock(block, options); - - if (bb.type === 'css') { - ref = this.transformCSSRefs(blockContent, bb.target, bb.attbs); - } else if (bb.type === 'js') { - ref = this.transformJSRefs(blockContent, bb.target, bb.attbs); - } else if (bb.type === 'remove') { - ref = ''; - } else if (bb.handler) { - ref = bb.handler(blockContent, bb.target, bb.attbs, bb.alternateSearchPaths); - } else { - ref = null; - } - - return ref; - } -}; diff --git a/gulp-useref-weh/useref/lib/resources.js b/gulp-useref-weh/useref/lib/resources.js deleted file mode 100644 index a43cb30..0000000 --- a/gulp-useref-weh/useref/lib/resources.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -var exports = module.exports = {}; - -// start build pattern: <!-- build:[target] output --> -// $1 is the type, $2 is the alternate search path, $3 is the destination file name $4 extra attributes -exports.regbuild = /(?:<!--|\/\/-)\s*build:(\w+)(?:\(([^\)]+)\))?\s*([^\s]+(?=-->)|[^\s]+)?\s*(?:(.*))?\s*-->/; - -// end build pattern -- <!-- endbuild --> -exports.regend = /(?:<!--|\/\/-)\s*endbuild\s*-->/; - -// IE conditional comment pattern: $1 is the start tag and $2 is the end tag -exports.regcc = /(<!--\[if\s.*?\]>)[\s\S]*?(<!\[endif\]-->)/i; - -// Character used to create key for the `sections` object. This should probably be done more elegantly. -exports.sectionsJoinChar = '\ue000'; - -// strip all comments from HTML except for conditionals -exports.regComment = /<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->)(.|\n))*-->/g; diff --git a/gulp-useref-weh/useref/lib/transformReferences.js b/gulp-useref-weh/useref/lib/transformReferences.js deleted file mode 100644 index d8f83c3..0000000 --- a/gulp-useref-weh/useref/lib/transformReferences.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; - -var resources = require('./resources'), - refManager = require('./refManager'); - -module.exports = function (blocks, content, options) { - var replaced = content, - refm = Object.create(refManager), - - // Determine the linefeed from the content - linefeed = /\r\n/g.test(content) ? '\r\n' : '\n'; - - // handle blocks - Object.keys(blocks).forEach(function (key) { - var block = blocks[key].join(linefeed), - lines = block.split(linefeed), - indent = (lines[0].match(/^\s*/) || [])[0], - ccmatches = block.match(resources.regcc), - blockContent = lines.slice(1, -1).join(linefeed), - ref = refm.getRef(block, blockContent, options); - - if(options.changeExt) { - for(var ext in options.changeExt) { - var re = new RegExp('(<(?:script|link)\\b.*?\\b(?:src|href)\\s*=\\s*[\'"][^\'"]*?)'+ext.replace(".","\\.") - +'([\'"])','gm'); - blockContent = blockContent.replace(re,"$1"+options.changeExt[ext]+"$2"); - } - } - - if (ref !== null) { - ref = indent + ref; - - // Reserve IE conditional comment if exist - if (ccmatches) { - ref = indent + ccmatches[1] + linefeed + ref + linefeed + indent + ccmatches[2]; - } - - if (options.noconcat) { - replaced = replaced.replace(block, blockContent); - } else { - replaced = replaced.replace(block, ref); - } - } - }); - - return replaced; -}; diff --git a/gulp-useref-weh/useref/package.json b/gulp-useref-weh/useref/package.json deleted file mode 100644 index a21130f..0000000 --- a/gulp-useref-weh/useref/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "useref", - "version": "1.2.0", - "description": "Parse build blocks in HTML files to replace references", - "main": "index.js", - "directories": { - "test": "test" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "mocha", - "coverage": "nyc npm test && nyc report", - "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls" - }, - "files": [ - "index.js", - "lib" - ], - "keywords": [ - "build", - "blocks", - "build", - "comments", - "replace", - "scripts", - "link", - "ref" - ], - "author": "Jonathan Kemp <kempdogg@gmail.com> (http://jonkemp.com/)", - "license": "MIT", - "devDependencies": { - "chai": "^3.4.1", - "coveralls": "^2.11.4", - "gulp": "^3.9.0", - "gulp-eslint": "^3.0.1", - "gulp-mocha": "^3.0.1", - "mocha": "*", - "nyc": "^8.1.0" - }, - "repository": "jonkemp/useref" -} diff --git a/gulp-useref-weh/useref/test/test.js b/gulp-useref-weh/useref/test/test.js deleted file mode 100644 index 38e1e02..0000000 --- a/gulp-useref-weh/useref/test/test.js +++ /dev/null @@ -1,251 +0,0 @@ -/* eslint-disable */ -/* global describe, it */ -'use strict'; -var expect = require('chai').expect; -var fs = require('fs'); -var path = require('path'); -var useRef = require('../index'); - -function djoin(p) { - return path.normalize(path.join(__dirname, p)); -} -function fread(f) { - return fs.readFileSync(f, { encoding: 'utf-8'}); -} - -describe('html-ref-replace', function() { - - it('should replace reference in css block and return replaced files', function() { - var result = useRef(fread(djoin('testfiles/01.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/01-expected.html'))); - expect(result[1]).to.eql({ css: { '/css/combined.css': { 'assets': [ '/css/one.css', '/css/two.css' ] }}}); - }); - - it('should replace reference in js block and return replaced files', function() { - var result = useRef(fread(djoin('testfiles/02.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/02-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should not replace reference in css block with noconcat option', function() { - var result = useRef(fread(djoin('testfiles/01.html')), { noconcat: true }); - expect(result[0]).to.equal(fread(djoin('testfiles/noconcat-css.html'))); - }); - - it('should not replace reference in js block with noconcat option', function() { - var result = useRef(fread(djoin('testfiles/02.html')), { noconcat: true }); - expect(result[0]).to.equal(fread(djoin('testfiles/noconcat-js.html'))); - }); - - it('should remove `remove` block', function() { - var result = useRef(fread(djoin('testfiles/09.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/09-expected.html'))); - expect(result[1]).to.eql({ remove: { '0': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should remove multiple `remove` blocks', function() { - var result = useRef(fread(djoin('testfiles/10.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/10-expected.html'))); - expect(result[1]).to.eql({ remove: { '0': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }, '1': { 'assets': [ '/css/one.css', '/css/two.css' ] } }}); - }); - - it('should handle comments and whitespace in blocks', function() { - var result = useRef(fread(djoin('testfiles/03.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should handle comments and whitespace in blocks (without trailing space)', function() { - var result = useRef(fread(djoin('testfiles/03b.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should ignore script in comments (multi line)', function() { - var result = useRef(fread(djoin('testfiles/03c.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js' ] }}}); - }); - - it('should ignore script in comments (single line with "<!--script" )', function() { - var result = useRef(fread(djoin('testfiles/03d.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js' ] }}}); - }); - - it('should ignore script in comments (single line with "<!--<script" )', function() { - var result = useRef(fread(djoin('testfiles/03e.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js' ] }}}); - }); - - it('should ignore script in comments (single line with "<!-- <script" )', function() { - var result = useRef(fread(djoin('testfiles/03f.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/03-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js' ] }}}); - }); - - it('should handle multiple blocks', function() { - var result = useRef(fread(djoin('testfiles/04.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/04-expected.html'))); - expect(result[1]).to.eql({ - js: { - 'scripts/combined.concat.min.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }, - 'scripts/combined2.concat.min.js': { 'assets': [ 'scripts/anotherone.js', 'scripts/yetonemore.js' ] } - }, - css: { - '/css/combined.css': { 'assets': [ '/css/one.css', '/css/two.css' ] }, - '/css/combined2.css': { 'assets': [ '/css/three.css', '/css/four.css' ] } - } - }); - }); - - it('should remove empty blocks', function() { - var result = useRef(fread(djoin('testfiles/08.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/08-expected.html'))); - }); - - it('should return the alternate search path in css block', function() { - var result = useRef(fread(djoin('testfiles/05.html'))); - expect(result[1].css['/css/combined.css'].searchPaths).to.equal('.tmp'); - }); - - it('should return the alternate search path in js block', function() { - var result = useRef(fread(djoin('testfiles/06.html'))); - expect(result[1].js['scripts/combined.concat.min.js'].searchPaths).to.equal('{.tmp,app}'); - }); - - it('should return the alternate search path in multiple blocks', function() { - var result = useRef(fread(djoin('testfiles/07.html'))); - expect(result[1].js['scripts/combined2.min.js'].searchPaths).to.equal('.tmp'); - }); - - it('should replace js blocks with async', function() { - var result = useRef(fread(djoin('testfiles/12.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/12-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.async.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should replace js blocks with data-main', function() { - var result = useRef(fread(djoin('testfiles/13.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/13-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/bootstrap.js': { 'assets': [ 'config.js', '../bower_components/requirejs/require.js' ] }}}); - }); - - it('should replace js blocks with data-main and async', function() { - var result = useRef(fread(djoin('testfiles/14.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/14-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/bootstrap.js': { 'assets': [ 'config.js', '../bower_components/requirejs/require.js' ] }}}); - }); - - it('should replace css blocks with attributes', function() { - var result = useRef(fread(djoin('testfiles/15.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/15-expected.html'))); - expect(result[1]).to.eql({ css: { '/css/combined.css': { 'assets': [ '/css/one.css', '/css/two.css' ] }}}); - }); - - it('should reserve IE conditional comments', function() { - var result = useRef(fread(djoin('testfiles/16.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/16-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should reserve IE conditional comments with Windows-style line breaks', function() { - var result = useRef(fread(djoin('testfiles/16-win.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/16-win-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.js': { 'assets': [ 'scripts/this.js', 'scripts/that.js' ] }}}); - }); - - it('should support symfony2 twig and laravel5 blade assets', function() { - var result = useRef(fread(djoin('testfiles/27.asset.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/27.asset-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.js': { 'assets': [ 'symfony/js/script.js', 'laravel/js/script.js' ] }}}); - }); - - it('should replace css blocks with attributes containing `:` and parenthesis', function() { - var result = useRef(fread(djoin('testfiles/17.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/17-expected.html'))); - expect(result[1]).to.eql({ css: { '/css/styles.css': { 'assets': [ '/css/styles.css' ] }}}); - }); - - it('should prevent just comments or whitespace from producing a css reference', function() { - var result = useRef(fread(djoin('testfiles/18.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/18-expected.html'))); - expect(result[1]).to.eql({ css: { '/css/styles.css': { 'assets': [] }}}); - }); - - it('should prevent just comments or whitespace from producing a js reference', function() { - var result = useRef(fread(djoin('testfiles/19.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/19-expected.html'))); - expect(result[1]).to.eql({ js: { '/js/scripts.js': { 'assets': [] }}}); - }); - - it('should detect script tag with whitespace text', function() { - var result = useRef(fread(djoin('testfiles/20.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/20-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.js': { 'assets': [ 'config.js' ] }}}); - }); - - it('should work on URLs with special characters', function() { - var result = useRef(fread(djoin('testfiles/21.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/21-expected.html'))); - expect(result[1]).to.eql({ js: { 'scripts/combined.concat.min.js': { 'assets': [ 'http://fonts.googleapis.com/css?family=Open+Sans:400,300,600' ] }}}); - }); - - it('should allow custom blocks', function() { - var result = useRef(fread(djoin('testfiles/22.html')), { - test: function (content, target, options) { - return content.replace('bower_components', target); - } - }); - expect(result[0]).to.equal(fread(djoin('testfiles/22-expected.html'))); - expect(result[1]).to.eql({ test: { components: { 'assets': [ '/bower_components/some/path' ] }}}); - }); - - it('should silently ignore unexisting blocks', function() { - var result = useRef(fread(djoin('testfiles/23.html'))); - expect(result[0]).to.equal(fread(djoin('testfiles/23.html'))); - expect(result[1]).to.eql({ invalidblock: { components: { 'assets': [ '/bower_components/some/path' ] }}}); - }); - - it('should pass alternateSearchPath to the custom block handler', function () { - useRef(fread(djoin('testfiles/24.html')), { - test: function (content, target, options, alternateSearchPath) { - expect(alternateSearchPath).to.equal('{.tmp,app}'); - } - }); - }); - - it('should handle multiple identical blocks separately', function () { - var result = useRef(fread(djoin('testfiles/25.html')), { - testSame: function (content, target) { - return target; - } - }); - expect(result[0]).to.equal(fread(djoin('testfiles/25-expected.html'))); - expect(result[1]).to.eql({ testSame: { target: { 'assets': [] }, target0: { 'assets': [] }}}); - }); - - it('should handle jade files', function() { - var result = useRef(fread(djoin('testfiles/26.jade'))); - expect(result[0]).to.equal(fread(djoin('testfiles/26-expected.jade'))); - expect(result[1]).to.eql({ - css: { - '/styles/vendor.css': { - 'assets': [ '/bower_components/some_module/main.css' ], - 'searchPaths': '{.tmp/serve,src}' - } - }, - js: { - '/scripts/vendor.js': { - 'assets': [ '/bower_components/jquery/dist/jquery.js' ], - 'searchPaths': '{.tmp/serve,src}' - }, - '/scripts/app.js': { - 'assets': [ '/config.js' ], - 'searchPaths': '{src,.tmp/serve}' - } - } - }); - }); -}); diff --git a/gulp-useref-weh/useref/test/testfiles/01-expected.html b/gulp-useref-weh/useref/test/testfiles/01-expected.html deleted file mode 100644 index eee86ef..0000000 --- a/gulp-useref-weh/useref/test/testfiles/01-expected.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<head> - <link rel="stylesheet" href="/css/combined.css"> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/01.html b/gulp-useref-weh/useref/test/testfiles/01.html deleted file mode 100644 index 91a9423..0000000 --- a/gulp-useref-weh/useref/test/testfiles/01.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head> - <!-- build:css /css/combined.css --> - <link href="/css/one.css" rel="stylesheet"> - <link href="/css/two.css" rel="stylesheet"> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/02-expected.html b/gulp-useref-weh/useref/test/testfiles/02-expected.html deleted file mode 100644 index d196a7e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/02-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.concat.min.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/02.html b/gulp-useref-weh/useref/test/testfiles/02.html deleted file mode 100644 index 3f20533..0000000 --- a/gulp-useref-weh/useref/test/testfiles/02.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03-expected.html b/gulp-useref-weh/useref/test/testfiles/03-expected.html deleted file mode 100644 index d196a7e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.concat.min.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03.html b/gulp-useref-weh/useref/test/testfiles/03.html deleted file mode 100644 index b99a56d..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03.html +++ /dev/null @@ -1,11 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js --> -<!-- some comment --> -<script type="text/javascript" src="scripts/this.js"></script> - -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03b.html b/gulp-useref-weh/useref/test/testfiles/03b.html deleted file mode 100755 index cb57e42..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03b.html +++ /dev/null @@ -1,11 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js--> -<!-- some comment --> -<script type="text/javascript" src="scripts/this.js"></script> - -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03c.html b/gulp-useref-weh/useref/test/testfiles/03c.html deleted file mode 100644 index e670d97..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03c.html +++ /dev/null @@ -1,11 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js--> -<script type="text/javascript" src="scripts/this.js"></script> -<!-- -<script type="text/javascript" src="scripts/that.js"></script> ---> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03d.html b/gulp-useref-weh/useref/test/testfiles/03d.html deleted file mode 100644 index 8195a8d..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03d.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js--> -<script type="text/javascript" src="scripts/this.js"></script> -<!--script type="text/javascript" src="scripts/that.js"></script--> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03e.html b/gulp-useref-weh/useref/test/testfiles/03e.html deleted file mode 100644 index a8371f0..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03e.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js--> -<script type="text/javascript" src="scripts/this.js"></script> -<!--<script type="text/javascript" src="scripts/that.js"></script>--> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/03f.html b/gulp-useref-weh/useref/test/testfiles/03f.html deleted file mode 100644 index 0dba40c..0000000 --- a/gulp-useref-weh/useref/test/testfiles/03f.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js--> -<script type="text/javascript" src="scripts/this.js"></script> -<!-- <script type="text/javascript" src="scripts/that.js"></script> --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/04-expected.html b/gulp-useref-weh/useref/test/testfiles/04-expected.html deleted file mode 100644 index 16b67e5..0000000 --- a/gulp-useref-weh/useref/test/testfiles/04-expected.html +++ /dev/null @@ -1,17 +0,0 @@ -<html> -<head> - - <link rel="stylesheet" href="/css/combined.css"> - -</head> -<body> - - - <link rel="stylesheet" href="/css/combined2.css"> - - -<script src="scripts/combined.concat.min.js"></script> - -<script src="scripts/combined2.concat.min.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/04.html b/gulp-useref-weh/useref/test/testfiles/04.html deleted file mode 100644 index 20b6b7a..0000000 --- a/gulp-useref-weh/useref/test/testfiles/04.html +++ /dev/null @@ -1,29 +0,0 @@ -<html> -<head> - - <!-- build:css /css/combined.css --> - <link href="/css/one.css" rel="stylesheet"> - <link href="/css/two.css" rel="stylesheet"> - <!-- endbuild --> - -</head> -<body> - - - <!-- build:css /css/combined2.css --> - <link href="/css/three.css" rel="stylesheet"> - <link href="/css/four.css" rel="stylesheet"> - <!-- endbuild --> - - -<!-- build:js scripts/combined.concat.min.js --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> - -<!-- build:js scripts/combined2.concat.min.js --> -<script type="text/javascript" src="scripts/anotherone.js"></script> -<script type="text/javascript" src="scripts/yetonemore.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/05.html b/gulp-useref-weh/useref/test/testfiles/05.html deleted file mode 100644 index 3863702..0000000 --- a/gulp-useref-weh/useref/test/testfiles/05.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head> - <!-- build:css(.tmp) /css/combined.css --> - <link href="/css/one.css" rel="stylesheet"> - <link href="/css/two.css" rel="stylesheet"> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/06.html b/gulp-useref-weh/useref/test/testfiles/06.html deleted file mode 100644 index 5300128..0000000 --- a/gulp-useref-weh/useref/test/testfiles/06.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js({.tmp,app}) scripts/combined.concat.min.js --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/07.html b/gulp-useref-weh/useref/test/testfiles/07.html deleted file mode 100644 index bf5dfc2..0000000 --- a/gulp-useref-weh/useref/test/testfiles/07.html +++ /dev/null @@ -1,20 +0,0 @@ -<html> -<head> - <!-- build:css /css/combined.css --> - <link href="/css/one.css" rel="stylesheet"> - <link href="/css/two.css" rel="stylesheet"> - <!-- endbuild --> -</head> -<body> - -<!-- build:js scripts/combined.min.js --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> - -<!-- build:js(.tmp) scripts/combined2.min.js --> -<script type="text/javascript" src="scripts/anotherone.js"></script> -<script type="text/javascript" src="scripts/yetonemore.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/08-expected.html b/gulp-useref-weh/useref/test/testfiles/08-expected.html deleted file mode 100644 index ab9d94a..0000000 --- a/gulp-useref-weh/useref/test/testfiles/08-expected.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<head> - -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/08.html b/gulp-useref-weh/useref/test/testfiles/08.html deleted file mode 100644 index 7f5f71c..0000000 --- a/gulp-useref-weh/useref/test/testfiles/08.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head> - <!-- build:css /css/vendor.css --> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/09-expected.html b/gulp-useref-weh/useref/test/testfiles/09-expected.html deleted file mode 100644 index c61e473..0000000 --- a/gulp-useref-weh/useref/test/testfiles/09-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> - -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/09.html b/gulp-useref-weh/useref/test/testfiles/09.html deleted file mode 100644 index e731960..0000000 --- a/gulp-useref-weh/useref/test/testfiles/09.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:remove --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/10-expected.html b/gulp-useref-weh/useref/test/testfiles/10-expected.html deleted file mode 100644 index ae96e34..0000000 --- a/gulp-useref-weh/useref/test/testfiles/10-expected.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> - -<div>keepthis</div> - -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/10.html b/gulp-useref-weh/useref/test/testfiles/10.html deleted file mode 100644 index 52e4393..0000000 --- a/gulp-useref-weh/useref/test/testfiles/10.html +++ /dev/null @@ -1,14 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:remove --> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -<div>keepthis</div> -<!-- build:remove --> -<link href="/css/one.css" rel="stylesheet"> -<link href="/css/two.css" rel="stylesheet"> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/12-expected.html b/gulp-useref-weh/useref/test/testfiles/12-expected.html deleted file mode 100644 index 2b672fe..0000000 --- a/gulp-useref-weh/useref/test/testfiles/12-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.async.js" async></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/12.html b/gulp-useref-weh/useref/test/testfiles/12.html deleted file mode 100644 index 1e1aec4..0000000 --- a/gulp-useref-weh/useref/test/testfiles/12.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.async.js async--> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/13-expected.html b/gulp-useref-weh/useref/test/testfiles/13-expected.html deleted file mode 100644 index ed256db..0000000 --- a/gulp-useref-weh/useref/test/testfiles/13-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/bootstrap.js" data-main="scripts/bootstrap"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/13.html b/gulp-useref-weh/useref/test/testfiles/13.html deleted file mode 100644 index d6f69d6..0000000 --- a/gulp-useref-weh/useref/test/testfiles/13.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/bootstrap.js data-main="scripts/bootstrap"--> -<script src="config.js"> </script> -<script data-main="scripts/bootstrap" src="../bower_components/requirejs/require.js"> </script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/14-expected.html b/gulp-useref-weh/useref/test/testfiles/14-expected.html deleted file mode 100644 index 48396d9..0000000 --- a/gulp-useref-weh/useref/test/testfiles/14-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/bootstrap.js" data-main="scripts/bootstrap" async></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/14.html b/gulp-useref-weh/useref/test/testfiles/14.html deleted file mode 100644 index d87844e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/14.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/bootstrap.js data-main="scripts/bootstrap" async--> -<script src="config.js"> </script> -<script data-main="scripts/bootstrap" src="../bower_components/requirejs/require.js"> </script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/15-expected.html b/gulp-useref-weh/useref/test/testfiles/15-expected.html deleted file mode 100644 index 9a66ab1..0000000 --- a/gulp-useref-weh/useref/test/testfiles/15-expected.html +++ /dev/null @@ -1,5 +0,0 @@ -<html> -<head> - <link rel="stylesheet" href="/css/combined.css" media="print"> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/15.html b/gulp-useref-weh/useref/test/testfiles/15.html deleted file mode 100644 index 555dba3..0000000 --- a/gulp-useref-weh/useref/test/testfiles/15.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head> - <!-- build:css /css/combined.css media="print" --> - <link href="/css/one.css" rel="stylesheet" media="print"> - <link href="/css/two.css" rel="stylesheet" media="print"> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/16-expected.html b/gulp-useref-weh/useref/test/testfiles/16-expected.html deleted file mode 100644 index e2768ab..0000000 --- a/gulp-useref-weh/useref/test/testfiles/16-expected.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<head> - <!--[if lt IE 9]> - <script src="scripts/combined.js"></script> - <![endif]--> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/16-win-expected.html b/gulp-useref-weh/useref/test/testfiles/16-win-expected.html deleted file mode 100644 index e2768ab..0000000 --- a/gulp-useref-weh/useref/test/testfiles/16-win-expected.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<head> - <!--[if lt IE 9]> - <script src="scripts/combined.js"></script> - <![endif]--> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/16-win.html b/gulp-useref-weh/useref/test/testfiles/16-win.html deleted file mode 100644 index 3a06fab..0000000 --- a/gulp-useref-weh/useref/test/testfiles/16-win.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head> - <!-- build:js scripts/combined.js --> - <!--[if lt IE 9]> - <script type="text/javascript" src="scripts/this.js"></script> - <script type="text/javascript" src="scripts/that.js"></script> - <![endif]--> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/16.html b/gulp-useref-weh/useref/test/testfiles/16.html deleted file mode 100644 index 3a06fab..0000000 --- a/gulp-useref-weh/useref/test/testfiles/16.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head> - <!-- build:js scripts/combined.js --> - <!--[if lt IE 9]> - <script type="text/javascript" src="scripts/this.js"></script> - <script type="text/javascript" src="scripts/that.js"></script> - <![endif]--> - <!-- endbuild --> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/17-expected.html b/gulp-useref-weh/useref/test/testfiles/17-expected.html deleted file mode 100644 index 928046f..0000000 --- a/gulp-useref-weh/useref/test/testfiles/17-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<link rel="stylesheet" href="/css/styles.css" media="screen and (min-width: 40em)"> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/17.html b/gulp-useref-weh/useref/test/testfiles/17.html deleted file mode 100644 index 8ed863e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/17.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:css /css/styles.css media="screen and (min-width: 40em)" --> -<link rel="stylesheet" href="/css/styles.css" /> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/18-expected.html b/gulp-useref-weh/useref/test/testfiles/18-expected.html deleted file mode 100644 index c61e473..0000000 --- a/gulp-useref-weh/useref/test/testfiles/18-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> - -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/18.html b/gulp-useref-weh/useref/test/testfiles/18.html deleted file mode 100644 index e86b29c..0000000 --- a/gulp-useref-weh/useref/test/testfiles/18.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:css /css/styles.css --> -<!-- bower:css --> - -<!-- endbower --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/19-expected.html b/gulp-useref-weh/useref/test/testfiles/19-expected.html deleted file mode 100644 index c61e473..0000000 --- a/gulp-useref-weh/useref/test/testfiles/19-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> - -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/19.html b/gulp-useref-weh/useref/test/testfiles/19.html deleted file mode 100644 index 8be566e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/19.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js /js/scripts.js --> -<!-- bower:js --> - -<!-- endbower --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/20-expected.html b/gulp-useref-weh/useref/test/testfiles/20-expected.html deleted file mode 100644 index ba3aada..0000000 --- a/gulp-useref-weh/useref/test/testfiles/20-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/20.html b/gulp-useref-weh/useref/test/testfiles/20.html deleted file mode 100644 index cb28a0f..0000000 --- a/gulp-useref-weh/useref/test/testfiles/20.html +++ /dev/null @@ -1,12 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.js --> -<!-- bower:js --> -<script src="config.js"> - -</script> -<!-- endbower --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/21-expected.html b/gulp-useref-weh/useref/test/testfiles/21-expected.html deleted file mode 100644 index d196a7e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/21-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.concat.min.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/21.html b/gulp-useref-weh/useref/test/testfiles/21.html deleted file mode 100644 index 2b01939..0000000 --- a/gulp-useref-weh/useref/test/testfiles/21.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.concat.min.js --> -<script type="text/javascript" src="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/22-expected.html b/gulp-useref-weh/useref/test/testfiles/22-expected.html deleted file mode 100644 index 10b4af1..0000000 --- a/gulp-useref-weh/useref/test/testfiles/22-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<link rel="import" href="/components/some/path"></link> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/22.html b/gulp-useref-weh/useref/test/testfiles/22.html deleted file mode 100644 index 3039c22..0000000 --- a/gulp-useref-weh/useref/test/testfiles/22.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:test components --> -<link rel="import" href="/bower_components/some/path"></link> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/23.html b/gulp-useref-weh/useref/test/testfiles/23.html deleted file mode 100644 index 50cd79f..0000000 --- a/gulp-useref-weh/useref/test/testfiles/23.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:invalidblock components --> -<link rel="import" href="/bower_components/some/path"></link> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/24.html b/gulp-useref-weh/useref/test/testfiles/24.html deleted file mode 100644 index 680e385..0000000 --- a/gulp-useref-weh/useref/test/testfiles/24.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:test({.tmp,app}) target --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/25-expected.html b/gulp-useref-weh/useref/test/testfiles/25-expected.html deleted file mode 100644 index da3494b..0000000 --- a/gulp-useref-weh/useref/test/testfiles/25-expected.html +++ /dev/null @@ -1,8 +0,0 @@ -<html> -<head></head> -<body> -target - -target -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/25.html b/gulp-useref-weh/useref/test/testfiles/25.html deleted file mode 100644 index 126505f..0000000 --- a/gulp-useref-weh/useref/test/testfiles/25.html +++ /dev/null @@ -1,10 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:testSame target --> -<!-- endbuild --> - -<!-- build:testSame target --> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/26-expected.jade b/gulp-useref-weh/useref/test/testfiles/26-expected.jade deleted file mode 100644 index 8a48a38..0000000 --- a/gulp-useref-weh/useref/test/testfiles/26-expected.jade +++ /dev/null @@ -1,13 +0,0 @@ -doctype html -html(lang='en') - head - - <link rel="stylesheet" href="/styles/vendor.css"> - - - body - block content - - <script src="/scripts/vendor.js"></script> - - <script src="/scripts/app.js"></script> diff --git a/gulp-useref-weh/useref/test/testfiles/26.jade b/gulp-useref-weh/useref/test/testfiles/26.jade deleted file mode 100644 index 8d2df0e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/26.jade +++ /dev/null @@ -1,19 +0,0 @@ -doctype html -html(lang='en') - head - - //- build:css({.tmp/serve,src}) /styles/vendor.css --> - link(rel='stylesheet', href='/bower_components/some_module/main.css') - //- endbuild --> - - - body - block content - - //- build:js({.tmp/serve,src}) /scripts/vendor.js --> - script(type='text/javascript', src='/bower_components/jquery/dist/jquery.js') - //- endbuild --> - - //- build:js({src,.tmp/serve}) /scripts/app.js --> - script(type='text/javascript', src='/config.js') - //- endbuild --> diff --git a/gulp-useref-weh/useref/test/testfiles/27.asset-expected.html b/gulp-useref-weh/useref/test/testfiles/27.asset-expected.html deleted file mode 100644 index ba3aada..0000000 --- a/gulp-useref-weh/useref/test/testfiles/27.asset-expected.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head></head> -<body> -<script src="scripts/combined.js"></script> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/27.asset.html b/gulp-useref-weh/useref/test/testfiles/27.asset.html deleted file mode 100644 index f4942b5..0000000 --- a/gulp-useref-weh/useref/test/testfiles/27.asset.html +++ /dev/null @@ -1,9 +0,0 @@ -<html> -<head></head> -<body> -<!-- build:js scripts/combined.js --> -<script src="{{ asset('symfony/js/script.js') }}"></script> -<script src="{{ elixir('laravel/js/script.js') }}"></script> -<!-- endbuild --> -</body> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/noconcat-css.html b/gulp-useref-weh/useref/test/testfiles/noconcat-css.html deleted file mode 100644 index 5c3377e..0000000 --- a/gulp-useref-weh/useref/test/testfiles/noconcat-css.html +++ /dev/null @@ -1,6 +0,0 @@ -<html> -<head> - <link href="/css/one.css" rel="stylesheet"> - <link href="/css/two.css" rel="stylesheet"> -</head> -</html> diff --git a/gulp-useref-weh/useref/test/testfiles/noconcat-js.html b/gulp-useref-weh/useref/test/testfiles/noconcat-js.html deleted file mode 100644 index 20f9273..0000000 --- a/gulp-useref-weh/useref/test/testfiles/noconcat-js.html +++ /dev/null @@ -1,7 +0,0 @@ -<html> -<head></head> -<body> -<script type="text/javascript" src="scripts/this.js"></script> -<script type="text/javascript" src="scripts/that.js"></script> -</body> -</html> diff --git a/gulp-webext-manifest/index.js b/gulp-webext-manifest/index.js deleted file mode 100644 index fb1dd37..0000000 --- a/gulp-webext-manifest/index.js +++ /dev/null @@ -1,217 +0,0 @@ -'use strict'; - -const gulp = require("gulp"); -const through = require('through2'); -const minimatch = require("minimatch"); -const concat = require("gulp-concat"); -const streamqueue = require('streamqueue'); -const glob = require("glob"); -const gulpif = require("gulp-if"); -const path = require("path"); -const fs = require("fs"); -const gutil = require('gulp-util'); -const File = gutil.File; - -if (!String.prototype.endsWith) { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.lastIndexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; -} - -module.exports = function () { - - var handlers, options; - - if(Array.isArray(arguments[0])) { - handlers = arguments[0]; - options = arguments[1] || {}; - } else { - handlers = [{src:"**/*.{js,css}"}]; - options = arguments[0] || {}; - } - - function GetAssetStreams(scripts) { - - var assetStreams = []; - var fileScriptMap = {}; - - scripts.forEach(function(script) { - if(handlers.every(function(handler) { - var patterns = handler.src; - if(!Array.isArray(patterns)) - patterns = new Array(patterns); - if(!patterns.every(function(pattern) { - var files = glob.sync(pattern); - if(!files.every(function(file) { - if(file.endsWith(script)) { - assetStreams.push(handler.stream && handler.stream(file) || gulp.src(file)); - fileScriptMap[path.resolve(file)] = script; - return false; - } - return true; - })) - return false; - return true; - })) - return false - return true; - })) - if(!(options.ignoreMissing || []).every(function(pattern) { - return minimatch(script,pattern); - })) - console.warn("gulp-webext-manifest: No handler found for",script); - }); - - return { - assetStreams: assetStreams, - fileScriptMap: fileScriptMap - } - } - - function ChangeExt(name) { - while(options.changeExt && (path.extname(name) in options.changeExt)) - name = name.substr(0, name.lastIndexOf(".")) + options.changeExt[path.extname(name)]; - return name; - } - - return through.obj(function (file, enc, callback) { - - var self = this; - var processCount = 1; - var baseDir = path.dirname(file.path); - var relDir = path.dirname(path.relative(baseDir,file.path)); - - function Done() { - if(--processCount==0) - callback(); - } - - function HandleAssets(scripts,bundle,noconcat) { - if(!Array.isArray(scripts)) - scripts = [ scripts ]; - noconcat = noconcat || options.noconcat; - - var streamsObj = GetAssetStreams(scripts); - var streams = streamsObj.assetStreams; - var fileScriptMap = {}; - for(var key in streamsObj.fileScriptMap) - fileScriptMap[ChangeExt(key)] = ChangeExt(streamsObj.fileScriptMap[key]); - - if(noconcat) - processCount += streams.length; - else - processCount++; - - streamqueue.apply(null,[{objectMode:true}].concat(streams)) - .on("error",function(err) { - console.info("gulp-webext-manifest got an error"); - self.emit("error",err); - this.emit("end"); - }) - .pipe(gulpif(!noconcat,concat(bundle))) - .pipe(through.obj(function(file,enc,cb) { - var scriptFile = fileScriptMap[file.path]; - var targetName = path.join(relDir,noconcat ? scriptFile : bundle); - if(options.map) { - var baseName = path.basename(file.path); - if(!options.map[baseName]) - options.map[baseName] = []; - if(options.map[baseName].indexOf(targetName)<0) - options.map[baseName].push(targetName); - } - self.push(new File({ - path: targetName, - contents: file.contents - })); - - cb(); - Done(); - })); - - if(!noconcat) - return [bundle]; - else - return scripts.map(function(script) { - return ChangeExt(script); - }); - - } - - var manifest = JSON.parse(file.contents.toString(enc)); - - if(manifest.background && manifest.background.scripts) { - if(options.background && options.background.initialScripts) - manifest.background.scripts = options.background.initialScripts.concat(manifest.background.scripts); - var bundle = options.background && options.background.target || "background/background.js"; - manifest.background.scripts = HandleAssets(manifest.background.scripts,bundle); - if(options.background && options.background.replaceScriptNames) - manifest.background.scripts.forEach(function(scriptName,index) { - manifest.background.scripts[index] = options.background.replaceScriptNames[scriptName] || manifest.background.scripts[index]; - }); - } - - if(Array.isArray(manifest.content_scripts)) - manifest.content_scripts.forEach(function(cs,index) { - if(Array.isArray(cs.js)) { - var bundle = options.content && options.content[index] && options.content[index].js_target || - "content/content-script-"+index+".js"; - manifest.content_scripts[index].js = HandleAssets(cs.js,bundle); - } - if(Array.isArray(cs.css)) { - var bundle = options.content && options.content[index] && options.content[index].css_target || - "content/content-style-"+index+".css"; - manifest.content_scripts[index].css = HandleAssets(cs.css,bundle); - } - }); - - if(Array.isArray(manifest.web_accessible_resources)) { - var allFiles = {}; - function GetFiles(dir,asDir) { - var files = glob.sync(path.join(dir,"*")); - files.forEach(function(file) { - if(fs.lstatSync(file).isDirectory()) { - var baseName = path.basename(file); - if(baseName=="_assets") - GetFiles(file,asDir); - else - GetFiles(file,path.join(asDir,baseName)); - } else - allFiles[path.join(asDir,path.basename(file))] = file; - }); - } - GetFiles(baseDir,""); - var resources = {}; - manifest.web_accessible_resources.forEach(function(resource) { - var files = {}; - for(var file in allFiles) - if(minimatch(file,resource)) - files[file] = allFiles[file]; - for(var file in files) { - var procFile = HandleAssets(file,"foo",true); - resources[procFile] = 1; - } - }); - manifest.web_accessible_resources = Object.keys(resources); - } - - var appBasePath = path.dirname(file.path); - var cwd = process.cwd(); - process.chdir(appBasePath); - - this.push(new File({ - path: file.path, - contents: Buffer.from(JSON.stringify(manifest,null,2)) - })); - - process.chdir(cwd); - - Done(); - }); -} - diff --git a/gulp-webext-manifest/package.json b/gulp-webext-manifest/package.json deleted file mode 100644 index 579ec5d..0000000 --- a/gulp-webext-manifest/package.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "gulp-webext-manifest", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Michel Gutierrez", - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "minimatch": "^3.0.3", - "streamqueue": "^1.1.1" - } -} diff --git a/gulpfile.js b/gulpfile.js index 035babd..7d8f800 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,159 +1,236 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ const gulp = require("gulp"); -const gutil = require("gulp-util"); -const babel = require('gulp-babel'); -const uglify = require('gulp-uglify'); -const del = require("del"); -const sass = require('gulp-sass'); -const replace = require('gulp-replace'); +const clean = require('gulp-clean'); +const runSequence = require('gulp4-run-sequence'); +const rename = require("gulp-rename"); +const through = require('through2'); const gulpif = require('gulp-if'); +const lazypipe = require('lazypipe'); +const vinylString = require("vinyl-string"); +const source = require('vinyl-source-stream'); +const filter = require('gulp-filter'); const debug = require('gulp-debug'); -const cleanCSS = require('gulp-clean-css'); -const htmlmin = require('gulp-htmlmin'); -const header = require("gulp-header"); -const ejs = require("gulp-ejs"); -const rename = require("gulp-rename"); -const typescript = require("gulp-typescript"); -const coffee = require("gulp-coffee"); +const sass = require('gulp-sass'); const less = require("gulp-less"); const stylus = require("gulp-stylus"); -const gfile = require("gulp-file"); -const lec = require('gulp-line-ending-corrector'); -const userefWeh = require("./gulp-useref-weh"); -const runSequence = require('run-sequence'); +const babel = require('gulp-babel'); const es2015 = require('babel-preset-es2015'); const react = require('babel-preset-react'); -const manifest = require('./gulp-webext-manifest'); - +const typescript = require("gulp-typescript"); +const coffee = require("gulp-coffee"); +const sourcemaps = require('gulp-sourcemaps'); +const gutil = require('gulp-util'); +const install = require('gulp-install'); const merge = require('merge-stream'); -const fs = require("fs"); +const ejs = require('gulp-ejs'); +const sort = require('gulp-sort'); + +const package = require('./package.json'); +const webpack = require('webpack'); +const webpackStream = require('webpack-stream'); +const uglify = require("uglifyjs-webpack-plugin"); + +const named = require('vinyl-named'); var argv = require('yargs').argv; +const fs = require("fs"); const path = require("path"); -const glob = require("glob"); -const through = require('through2'); const exec = require('child_process').exec; -const File = gutil.File; +const stringify = require('json-stable-stringify'); + +const now = "" + new Date(); if(process.env.wehCwd) process.chdir(process.env.wehCwd); function OverrideOptions() { - try { - // on init project, the options file is in the template not the project dir - var optionsFile = argv._.indexOf("init")<0 ? - path.join(etcDir,"weh-options.json") : - path.join(__dirname,"templates",template,"etc/weh-options.json"); - fs.lstatSync(optionsFile); - try { - var wehOptions = JSON.parse(fs.readFileSync(optionsFile,"utf8")); - var newArgv = {} - Object.assign( - newArgv, - wehOptions.all || {}, - dev ? (wehOptions.dev || {}) : (wehOptions.prod || {}), - argv); - argv = newArgv; - } catch(e) { - console.warn("Error parsing",optionsFile,"option file:",e); - } - } catch(e) {} + var globalOptions = {}; + var globalOptionsFile = process.env.HOME ? + path.join(process.env.HOME,".weh.json") : + path.join(process.env.HOMEPATH,"AppData","Local","weh","config.json"); + try { + fs.lstatSync(globalOptionsFile); + try { + globalOptions = JSON.parse(fs.readFileSync(globalOptionsFile,"utf8")); + } catch(e) { + console.warn("Error parsing",globalOptionsFile,"option file:",e); + } + } catch(e) {} + var wehOptions = {}; + // on init project, the options file is in the template not the project dir + var optionsFile = argv._.indexOf("init")<0 ? + path.join(etcDir,"weh-options.json") : + path.join(__dirname,"templates",template,"etc/weh-options.json"); + try { + fs.lstatSync(optionsFile); + try { + wehOptions = JSON.parse(fs.readFileSync(optionsFile,"utf8")); + } catch(e) { + console.warn("Error parsing",optionsFile,"option file:",e); + } + } catch(e) {} + var newArgv = {} + Object.assign( + newArgv, + Object.assign({},globalOptions.all,wehOptions.all), + dev ? Object.assign({},globalOptions.dev,wehOptions.dev) : Object.assign({},globalOptions.prod,wehOptions.prod), + argv); + argv = newArgv; } var dev = !argv.prod; var prjDir = path.resolve(argv.prjdir || '.'); var etcDir = path.join(prjDir,argv.etcdir || "etc"); -var template = argv.template || "skeleton-react"; +var template = argv.template || "skeleton"; OverrideOptions(); -var buildDir = path.join(prjDir,argv.builddir || "build"); +var buildPost = argv.buildpost && "-"+argv.buildpost || ""; +var buildDir = path.join(prjDir,argv.builddir || "build"+buildPost); +var buildTmpDir = path.join(prjDir,argv.buildtmpdir || "build-tmp"+buildPost); +var buildTmpAddonDir = path.join(buildTmpDir,"addon"); +var buildTmpModDir = path.join(buildTmpDir,"modules"); +var buildTmpWehDir = path.join(buildTmpDir,"weh"); var srcDir = path.join(prjDir,argv.srcdir || "src"); -var locDir = path.join(prjDir,argv.locdir || "src/locales"); -var resourceMap = {}; - - - -argv.uifrmwrk = argv.uifrmwrk || "none"; +var srcModDir = path.join(prjDir,argv.srcmoddir || "src-modules"); +var locDir = path.join(prjDir,argv.locdir || "locales"); +var ejsData = {}; +const mapExtensions = /.*\.(js|jsx|ts|coffee)$/; + +if(typeof argv.ejsdata !== "undefined") { + if(!Array.isArray(argv.ejsdata)) + argv.ejsdata = [argv.ejsdata]; + argv.ejsdata.forEach((statement)=>{ + var m = /^(.*?)=(.*)$/.exec(statement); + if(m) + ejsData[m[1]] = m[2]; + else + console.warn("Invalid statement --args",statement); + }); +} +var buildTmpError = null; -var wehBackgroundModules = ["background/weh-core.js","common/weh-prefs.js","common/weh-i18n.js"]; -if(argv.inspect!==false) - wehBackgroundModules.push("background/weh-inspect.js"); -wehBackgroundModules.push("background/weh-bg-prefs.js","background/weh-ui.js","background/weh-ajax.js"); -if(argv.i18nkeys!==false) - wehBackgroundModules.push("locales"); +gulp.task('clean', function() { + return gulp.src([buildDir+"/*",buildTmpDir+"/*"],{read: false}) + .pipe(clean()); +}); -var jsBanner = null, jsBannerData; +var WebPack = (function() { + var paths = {}; + return lazypipe() + .pipe(named) + .pipe(function() { + return rename(function(filePath) { + paths[filePath.basename] = filePath.dirname; + }); + }) + .pipe(function() { + return webpackStream({ + context: srcDir, + output: { + filename: '[name].js' + }, + resolve: { + modules: [ + buildTmpModDir, + buildTmpWehDir, + buildTmpDir+"/node_modules", + __dirname+"/node_modules" + ], + }, + module: { + loaders: [{ + test: /\.css$/, + loader: __dirname+"/node_modules/style-loader!"+__dirname+"/node_modules/css-loader?importLoaders=true" + },{ + test: /\.(png|woff|woff2|eot|ttf|svg)$/, + loaders: [__dirname+"/node_modules/url-loader?limit=100000"] + } + ]}, + plugins: dev ? [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `""` + } + }) + ] : [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `"production"` + } + }), + new uglify() + ] + },webpack,(err,stats) => { + if(stats.compilation.errors.length) { + gutil.log(stats.toString({ + colors: gutil.colors.supportsColor + })); + if(argv.onerror) + exec(argv.onerror,function(error) { + if(error) + console.warn("Could not execute onerror handle:",error.message); + }); + } else { + if(argv.onsuccess) + exec(argv.onsuccess,function(error) { + if(error) + console.warn("Could not execute onsuccess handle:",error.message); + }); + } + return true; + }); + }) + .pipe(function() { + return rename(function(filePath) { + filePath.dirname = paths[filePath.basename] || filePath.dirname; + }); + }) + ; +})(); -// banner to go to js files after concat + minify -if(argv.jsheader || (!dev && argv.jsheader!==false)) { - try { - jsBannerData = { - manifest: require(path.join(srcDir,"manifest.json")) - } - try { - jsBanner = fs.readFileSync(path.join(etcDir,"jsbanner.txt"),"utf8"); - } catch(e) { - jsBanner = fs.readFileSync(path.join(__dirname,"etc/jsbanner.txt"),"utf8"); - } - } catch(e) {} -} - -// load data to be used in case of ejs pre-processing -var ejsData = {}; -if(argv.ejsdata) { - argv.ejsdata.split(path.delimiter).forEach(function(jsonFile) { - try { - Object.assign(ejsData,JSON.parse(fs.readFileSync(jsonFile,"utf8"))); - } catch(e) { - console.warn("Error reading",jsonFile,":",e.message); - } - }); -} +gulp.task("build-locales",function() { + return gulp.src(locDir+"/**/*") + .pipe(gulp.dest(buildTmpAddonDir+"/_locales")); +}); -// replace gulp.src to process ejs if needed -function SrcExtend(glob) { - if(!Array.isArray(glob)) - glob = [ glob ]; - var streams = []; - glob.forEach(function(g) { - streams.push(gulp.src(g)); - streams.push(gulp.src(g+".ejs") - .pipe(ejs(ejsData)) - .pipe(rename(function (path) { - path.extname = "" - })) - ); - }); - return merge.apply(null,streams) - .pipe(gulpif('*.html',lec())); -} +gulp.task("build-final",function(callback) { + if(buildTmpError) { + console.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + console.error("!!! INTERMEDIATE BUILD HAS AN ERROR !!!"); + console.error("!!! Skipping final build !!!"); + console.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + callback(); + return; + } + gulp.src(buildTmpAddonDir+"/**/*") + .pipe(sort()) + .pipe(gulpif('*.js',gulpif(dev,sourcemaps.init({loadMaps:true})))) + .pipe(gulpif("*.js",WebPack())) + .on("error",function(error) { + this.emit("end"); + }) + .pipe(gulpif(dev,sourcemaps.write('.'))) + .pipe(gulp.dest(buildDir)) + .on("end",()=>{ + fs.writeFileSync(buildDir+"/build.date",argv["force-build-date"] || now); + callback(); + }) +}); -// process input files to handle various script and styles languages -function ResolveInput(stream) { +function ProcessFiles(stream) { var error = null; function Error(err) { - if(!error) { - error = err; - this.emit("end") - } + HandleError(err); + buildTmpError = err; + this.emit("end"); } - return stream - .pipe(gulpif('*.ejs',ejs(ejsData))) - .on("error",Error) - .pipe(gulpif('*.ejs',rename(function(path) { - path.extname = ""; - }))) - .pipe(gulpif('*.jsx',babel({ + return stream + .pipe(gulpif(mapExtensions,gulpif(dev,sourcemaps.init()))) + .pipe(gulpif('*.ejs',ejs(ejsData))) + .pipe(rename(function(filePath) { + if(filePath.extname==".ejs") + filePath.extname = ""; + })) + .pipe(gulpif('*.jsx',babel({ presets: [react], compact: false }))) @@ -172,410 +249,136 @@ function ResolveInput(stream) { .pipe(gulpif('*.less',less())) .on("error",Error) .pipe(gulpif('*.styl',stylus())) - .on("end",function() { - if(error) - this.emit("error",error); - }); -} - -// potential input files in the process -var prjCodeGlobs = [path.join(srcDir,"**/*.{js,css,js.ejs,css.ejs,jsx,jsx.ejs,scss,scss.ejs,"+ - "ts,ts.ejs,coffee,coffee.ejs,less,less.ejs,styl,styl.ejs}")]; -// files to be considered from weh -var wehCodeGlobs = [path.join(__dirname,"src/{background,content,common}/*.{js,css,jsx}")]; - -var wehAssetsGlobs = [ - path.join(srcDir,"**/_assets/**/*"), - path.join(__dirname,"src/**/_assets/**/*") -]; - -// all potential input files, including vendor libraries -var globs = [].concat(wehCodeGlobs,prjCodeGlobs,[ - "node_modules/react/dist/**/*.{js,css}", - "node_modules/react-dom/dist/**/*.{js,css}", - "node_modules/bootstrap/dist/css/*.css", - "node_modules/bootstrap/dist/js/*.js", - "node_modules/jquery/dist/**/*.js", - "node_modules/angular/*.js" -].map(function(pattern) { - return path.join(__dirname,pattern); -})); - -var usedSourceFiles = {}; // retain files used when processing html or manifest - -// streams to serve input files when processing html and manifest -var sources = [{ - src: globs, - stream: function(fileName) { - usedSourceFiles[path.resolve(fileName)] = 1; - return ResolveInput(gulp.src(fileName)) - } -}]; - -if(argv.i18nkeys!==false && !(argv.concat===false || (dev && argv.concat!==false))) - sources.push({ - src: [locDir], - stream: function(fileName) { - var localeKeys = {}; - function LocaleKeys() { - return through.obj(function (file, enc, callback) { - try { - var json = JSON.parse(file.contents); - Object.keys(json).forEach(function(key) { - localeKeys[key] = 1; - }); - } catch(e) { - console.warn("File",file.path,"is not JSON",file.contents) - } - this.push(file); - callback(); - }); - } - - function BuildI18nKeys() { - return through.obj(function (file, enc, callback) { - var self = this; - gulp.src(path.join(file.path,"**"+"/"+"*.json")) - .on("end",function() { - var str = "/"+"* generated automatically by weh *"+"/\nweh.i18nKeys="+ - JSON.stringify(Object.keys(localeKeys)); - self.push(new gutil.File({ - path: "background/weh-i18n-keys.js", - contents: new Buffer(str, "utf8") - })); - callback(); - }) - .pipe(LocaleKeys()) - ; - }); - } - return gulp.src(fileName) - .pipe(BuildI18nKeys()) - ; - } - }); - -// file extension translation map -var changeExt = { - ".ejs": "", - ".jsx": ".js", - ".ts": ".js", - ".coffee": ".js", - ".scss": ".css", - ".less": ".css", - ".styl": ".css" -} - -// use resource pathes discovered in HTML processing when writing target file -function RelocateHtmlResources() { - return through.obj(function (file, enc, callback) { - var self = this; - var retarget = resourceMap[path.basename(file.path)]; - if(retarget) - retarget.forEach(function(target) { - self.push(new File({ - path: target, - contents: file.contents - })); - }); - else - this.push(file); - callback(); - }); -} - -// processing output files for minification -function ResolveOutput(stream) { - var error = null; - function Error(err) { - error = err; - } - return stream - .on("error",Error) - .pipe(rename(function(path) { - path.dirname = path.dirname.replace(/\b_assets\b/,"/").replace("//","/"); - return path; - })) - .on("error",Error) - .pipe(gulpif(argv.minifyjs || (!dev && argv.minifyjs!==false), - gulpif('*.js', uglify()))) - .on("error",Error) - .pipe(gulpif(!!jsBanner, - gulpif('*.js',header(jsBanner,jsBannerData)))) - .on("error",Error) - .pipe(gulpif(argv.minifycss || (!dev && argv.minifycss!==false), - gulpif('*.css',cleanCSS({compatibility: 'ie8'})))) - .on("error",Error) - .pipe(gulpif(argv.minifyhtml || (!dev && argv.minifyhtml!==false), - gulpif('*.html',htmlmin({collapseWhitespace: true})))) .on("error",Error) - .pipe(RelocateHtmlResources()) - .pipe(gulp.dest(buildDir)) + .pipe(gulpif(dev,sourcemaps.write('.'))) .on("error",Error) - .on("end",function() { - if(error) - this.emit("error",error); - }); -} - -// return html code to included required scripts -function AddScripts(org,match) { - var scripts = []; - function AddUIFrameworkScripts() { - switch(argv.uifrmwrk) { - case "react": - scripts.push("<script src=\"react.js\"></script>"); - scripts.push("<script src=\"react-dom.js\"></script>"); - break; - case "angular": - scripts.push("<script src=\"angular.js\"></script>"); - break; - case "jquery": - scripts.push("<script src=\"jquery.js\"></script>"); - break; - } - } - function AddWehScripts() { - if(argv.weh!==false) { - scripts.push("<script src=\"weh-ct.js\"></script>"); - scripts.push("<script src=\"weh-i18n.js\"></script>"); - switch(argv.uifrmwrk) { - case "react": - scripts.push("<script src=\"weh-ct-react.jsx\"></script>"); - break; - case "angular": - scripts.push("<script src=\"weh-ct-angular.js\"></script>"); - break; - case "jquery": - scripts.push("<script src=\"weh-ct-jquery.js\"></script>"); - break; - } - if(argv["prefs"]!==false) { - scripts.push("<script src=\"weh-prefs.js\"></script>"); - scripts.push("<script src=\"weh-ct-prefs.js\"></script>"); - switch(argv.uifrmwrk) { - case "react": - scripts.push("<script src=\"weh-ct-react-prefs.jsx\"></script>"); - break; - case "angular": - scripts.push("<script src=\"weh-ct-angular-prefs.js\"></script>"); - break; - case "jquery": - scripts.push("<script src=\"weh-ct-jquery-prefs.js\"></script>"); - break; - } - } - if(argv["translator"]!==false) - switch(argv.uifrmwrk) { - case "react": - scripts.push("<script src=\"weh-ct-react-translate.jsx\"></script>"); - break; - case "angular": - scripts.push("<script src=\"weh-ct-angular-translate.js\"></script>"); - break; - case "jquery": - scripts.push("<script src=\"weh-ct-jquery-translate.js\"></script>"); - break; - } - scripts.push("<script src=\"weh-ct-ready.js\"></script>"); - } - } - match.split(",").map(function(term) { - return term.trim(); - }).forEach(function(term) { - switch(term) { - case "jquery": - scripts.push("<script src=\"jquery.js\"></script>"); - break; - case "bootstrap": - scripts.push("<script src=\"bootstrap.js\"></script>"); - break; - case "react": - case "angular": - case "jquery": - AddUIFrameworkScripts(); - break; - case "weh-all": - AddUIFrameworkScripts(); - AddWehScripts(); - break; - case "weh": - AddWehScripts(); - break; - default: - console.warn("Unknown term",term,"in weh:js placeholder"); - } - }); - return scripts.join("\n"); -} - -// return html code to included required stylesheets -function AddStyles(org,match) { - var styles = []; - match.split(",").map(function(term) { - return term.trim(); - }).forEach(function(term) { - switch(term) { - case "bootstrap": - styles.push('<link href="bootstrap.css" type="text/css" rel="stylesheet">'); - break; - default: - console.warn("Unknown term",term,"in weh:css placeholder"); - } - }); - return styles.join("\n"); } -// display error nicely -function HandleError(err) { - console.log('[Compilation Error]'); - if(err.plugin) - console.info("plugin:",err.plugin); - if(err.fileName && err.loc) - console.log(err.fileName + ( err.loc ? `( ${err.loc.line}, ${err.loc.column} ): ` : ': ')); - console.log('error: ' + err.message + '\n'); - if(err.codeFrame) - console.log(err.codeFrame); - if(argv.onerror) - exec(argv.onerror,function(error) { - if(error) - console.warn("Could not execute onerror handle:",error.message); - }); -} +gulp.task("build-tmp-src",function() { + buildTmpError = null; + return ProcessFiles(gulp.src([srcDir+"/**/*"])) + .pipe(gulp.dest(buildTmpAddonDir)) + ; +}); -// display error nicely and end the stream -function HandleErrorEnd(err) { - HandleError.call(this,err); - this.emit("end"); -} +gulp.task("build-tmp-src-mod",function() { + buildTmpError = null; + return ProcessFiles(gulp.src([srcModDir+"/**/*"])) + .pipe(gulp.dest(buildTmpModDir)) + ; +}); -// process html files -gulp.task("build-html",function(callback) { - ResolveOutput(SrcExtend(path.join(srcDir,"**/*.html")) - .pipe(replace(/<\!--\s*weh:js\s*(.*?)\s*-->/g,AddScripts)) - .pipe(replace(/<\!--\s*weh:css\s*(.*?)\s*-->/g,AddStyles)) - .pipe(userefWeh(sources,{ - noconcat: argv.concat===false || (dev && argv.concat!==false), - changeExt: changeExt, - base: srcDir, - map: resourceMap - })) - .on("error",function(err) { - HandleErrorEnd.call(this,err); - }) - ).on("end",callback); +gulp.task("build-tmp-install",function() { + return gulp.src(prjDir+'/package.json') + .pipe(gulp.dest(buildTmpDir)) + .pipe(install()); }); -// process manifest.json file -gulp.task("build-manifest",function(callback) { - ResolveOutput(SrcExtend(path.join(srcDir,"manifest.json")) - .pipe(manifest(sources,{ - background: { - initialScripts: wehBackgroundModules, - replaceScriptNames: {"locales": "background/weh-i18n-keys.js"} - }, - noconcat: argv.concat===false || (dev && argv.concat!==false), - changeExt: changeExt, - ignoreMissing: ["locales"] - })) - .on("error",function(err) { - HandleErrorEnd.call(this,err); - }) - ).on("end",callback); +gulp.task("build-tmp-copylock",function() { + return gulp.src(prjDir+'/package-lock.json') + .pipe(gulp.dest(buildTmpDir)); }); -// build assets: input files that need to be processed but discovered in html nor manifest -gulp.task("build-assets",function(callback) { - return ResolveOutput(ResolveInput(SrcExtend(wehAssetsGlobs))); +gulp.task("build-tmp-weh",function() { + return ProcessFiles(gulp.src(__dirname+"/src/**/*")) + .pipe(gulp.dest(buildTmpWehDir)); }); -// copy locale files -gulp.task("build-locales",function() { - var localeKeys = {}; - function LocaleKeys() { - return through.obj(function (file, enc, callback) { - try { - var json = JSON.parse(file.contents); - Object.keys(json).forEach(function(key) { - localeKeys[key] = 1; - }); - } catch(e) { - console.warn("File",file.path,"is not JSON",file.contents) - } - this.push(file); - callback(); - }); - } +gulp.task("make-i86n-keys",function(callback) { + var keys = {}; + fs.readdir(locDir,(err,files) => { + if(err) + throw err; + var promises = files.map((lang) => { + return new Promise((resolve,reject)=>{ + fs.readFile(path.join(locDir,lang,"messages.json"),(err,content)=>{ + if(err) + return reject(err); + try { + var messages = JSON.parse(content); + Object.keys(messages).forEach((key)=>{ + keys[key] = 1; + }); + resolve(); + } catch(e) { + reject(e); + } + }); + }); + }); + Promise.all(promises) + .then(()=>{ + vinylString('module.exports = ' + stringify(keys,{ space: ' ' }),{ + path: 'weh-i18n-keys.js' + }) + .pipe(gulp.dest(buildTmpModDir)) + .on('end',callback); + }) + .catch((err)=>{ + throw err; + }); + }); +}); - return gulp.src(path.join(locDir,"**/*.json")) - .pipe(LocaleKeys()) - .pipe(gulp.dest(path.join(buildDir,"_locales"))) - .on("end",function() { - if(argv.i18nkeys!==false && (argv.concat===false || (dev && argv.concat!==false))) { - var str = "/* generated automatically by weh */\nweh.i18nKeys="+ - JSON.stringify(Object.keys(localeKeys)); - gfile('background/weh-i18n-keys.js', str, { src: true }) - .pipe(gulp.dest(path.join(buildDir))); - } - }); +gulp.task("make-build-manifest",function(callback) { + const buildManifest = { + prod: !dev, + buildDate: argv["force-build-date"] || now, + buildOptions: ejsData + }; + const buildManifestCode = "module.exports = "+stringify(buildManifest,{ space: ' ' }); + fs.writeFile(buildTmpWehDir+"/weh-build.js",buildManifestCode,(err)=>{ + if(err) + throw err; + callback(); + }); }); -// filter to prevent unused file to be processed on watch -function FilterUsed() { - return through.obj(function (file, enc, callback) { - if(usedSourceFiles[file.path]) - this.push(file); - callback(); - }); -} +gulp.task("build",function(callback) { + return runSequence( + ["build-tmp-src","build-tmp-src-mod","build-tmp-weh","build-locales","make-i86n-keys"], + ["make-build-manifest"], + ["build-tmp-copylock"], + ["build-tmp-install"], + ["build-final"], + callback); +}); -// build project files on watch -gulp.task("build-code-prj",function(callback) { - ResolveOutput(ResolveInput(gulp.src(prjCodeGlobs) - .pipe(FilterUsed()) - ).on("error",function(err) { - HandleError.call(this,err); - }) - ).on("end",callback); +gulp.task("watch-locales",function(callback) { + return runSequence( + ["build-locales","make-i86n-keys"], + ["build-final"], + callback); }); -// build weh files on watch -gulp.task("build-code-weh",function(callback) { - ResolveOutput(ResolveInput(gulp.src(wehCodeGlobs) - .pipe(FilterUsed()) - ).on("error",function(err) { - HandleError.call(this,err); - }) - ).on("end",callback); +gulp.task("watch-src",function(callback) { + return runSequence( + ["build-tmp-src","build-tmp-src-mod","build-tmp-weh"], + ["build-tmp-install"], + ["build-final"], + callback + ); }); -// erase build directory -gulp.task("clean",function() { - return del([buildDir+"/*"],{force:true}); +gulp.task("watch", function(callback) { + gulp.watch([srcDir+"/**/*",srcModDir+"/**/*","src/**/*",__dirname+"/src/**/*"],gulp.series("watch-src")); + gulp.watch(locDir+"/**/*",gulp.series("watch-locales")); + callback(); }); -// build everything -gulp.task("build",[ - "build-html", - "build-manifest", - "build-assets", - "build-locales" -]); - -// watch for changes and rebuild what's needed -gulp.task("watch",function() { - gulp.watch(path.join(locDir,"**/*"), ["build-locales"]); - gulp.watch(wehAssetsGlobs, ["build-assets"]); - gulp.watch(path.join(srcDir,"**/*.html"), ["build-html"]); - gulp.watch(path.join(srcDir,"manifest.json"), ["build-manifest"]); - gulp.watch(prjCodeGlobs,["build-code-prj"]); - gulp.watch(wehCodeGlobs,["build-code-weh"]); - setTimeout(function() { - console.info("Watching for changes"); - }); +// list available templates +gulp.task("templates",function(callback) { + var templates = fs.readdirSync(path.join(__dirname,"templates")); + templates.forEach(function(template) { + var manifest = null; + try { + manifest = JSON.parse(fs.readFileSync(path.join(__dirname,"templates",template,"src/manifest.json"),"utf8")); + } catch(e) {} + console.info(template+":",manifest && manifest.description ? manifest.description : "no description found"); + }); + callback(); }); -// default task if none specified in command line gulp.task("default", function(callback) { if(argv.help) return runSequence("help"); @@ -584,6 +387,7 @@ gulp.task("default", function(callback) { console.info("Directories:"); console.info(" src:",srcDir); + console.info(" src-modules:",srcModDir); console.info(" build:",buildDir); console.info(" locales:",locDir); console.info(" etc:",etcDir); @@ -591,8 +395,12 @@ gulp.task("default", function(callback) { try { JSON.parse(fs.readFileSync(path.join(srcDir,"manifest.json"),"utf8")); } catch(e) { - console.error("Directory",srcDir,"does not contain a valid manifest.json file. You may want to init a new weh project first with 'weh init --prjdir my-project'"); - process.exit(-1); + try { + fs.readFileSync(path.join(srcDir,"manifest.json.ejs"),"utf8"); + } catch(e) { + console.error("Directory",srcDir,"does not contain a valid manifest.json nor manifest.json.ejs file. You may want to init a new weh project first with 'weh init --prjdir my-project'"); + process.exit(-1); + } } var tasks = ["clean","build"]; @@ -602,42 +410,15 @@ gulp.task("default", function(callback) { runSequence.apply(null,tasks); }); -// copy template directory when creating new project -gulp.task("copy-template",function(callback) { - try { - fs.accessSync(prjDir,fs.F_OK); - if(!argv.force) { - console.error(prjDir+" already exists. Use --force option to overwrite."); - process.exit(-1); - return; - } - } catch(e) {} - gulp.src(path.join(__dirname,"templates",template,"/**/*")) - .pipe(gulp.dest(prjDir)) - .on("end",callback); -}); - -// list available templates -gulp.task("templates",function() { - var templates = fs.readdirSync(path.join(__dirname,"templates")); - templates.forEach(function(template) { - var manifest = null; - try { - manifest = JSON.parse(fs.readFileSync(path.join(__dirname,"templates",template,"src/manifest.json"),"utf8")); - } catch(e) {} - console.info(template+":",manifest && manifest.description ? manifest.description : "no description found"); - }); - process.exit(0); -}); - // create new project gulp.task("init", function(callback) { runSequence("copy-template","build",callback); }); // get some help -gulp.task("help", function() { +gulp.task("help", function(callback) { var help = [ + "weh version "+package.version, "usage: gulp [<commands>] [<options>]", "", "commands:", @@ -645,29 +426,57 @@ gulp.task("help", function() { " clean: remove project build recursively", " watch: watch project and build dynamically on changes", " init: generate project from template", + " templates: display available templates", + "", "default commands: clean + build + watch", "", "options:", - " --prjdir <dir>: project directory (required for most commands)", + " --prjdir <dir>: project directory (required for most commands)", + " --srcdir <sub-dir>: add-on source sub-directory (relative to project directory), defaults to 'src'", + " --srcmoddir <sub-dir>: add-on source modules sub-directory (relative to project directory), defaults to 'src-modules'", " --prod: addon generated for production", " --template <template>: template to be used when creating a new project", - " --templates: display available templates", " --no-watch: do not generate builds dynamically", " --force: force overwrite output directory", - " --uifrmwrk: user interface framework (react|angular|jquery|none), default is none", - " --jsheader/--no-jsheader: force JS headers on dev builds/disable JS headers on prod builds", - " --minifyjs/--no-minifyjs: force JS minification on/off, default is minification on prod builds", - " --minifycss/--no-minifycss: force CSS minification on/off, default is minification on prod builds", - " --minifyhtml/--no-minifyhtml: force HTML minification on/off, default is minification on prod builds", - " --concat/--no-concat: force HTML and CSS concatenation on/off, default is concatenation on prod builds", - " --ejsdata: one or several (separated by '"+path.delimiter+"') JSON files used as data source when compiling "+ - "EJS files", " --onerror <command>: execute a command (like playing a sound) on errors", - " --no-inspect: do not allow this add-on to be accessed by weh inspector tools", - " --no-i18nkeys: do not generate the translation keys automatically", - " --no-prefs: do not include preference editor module", - " --no-translator: do not include locale editor module" + " --onsuccess <command>: execute a command (like playing a sound) on build success", + " --buildpost <string>: if set, the build directory names are appended with '-<value>'", + " --ejsdata <name=value>: define variable to be used in EJS preprocessing", + " --force-build-date <date>: force build date" ]; - console.log(help.join("\n")); - process.exit(0); + console.log(help.join("\n")); + callback(); }); + +// copy template directory when creating new project +gulp.task("copy-template",function(callback) { + try { + fs.accessSync(prjDir,fs.F_OK); + if(!argv.force) { + console.error(prjDir+" already exists. Use --force option to overwrite."); + process.exit(-1); + return; + } + } catch(e) {} + console.info("copying template from",path.join(__dirname,"templates",template,"/**/*"), "to", prjDir); + gulp.src(path.join(__dirname,"templates",template,"/**/*")) + .pipe(gulp.dest(prjDir)) + .on("end",callback); +}); + +// display error nicely +function HandleError(err) { + console.log('[Compilation Error]'); + if(err.plugin) + console.info("plugin:",err.plugin); + if(err.fileName && err.loc) + console.log(err.fileName + ( err.loc ? `( ${err.loc.line}, ${err.loc.column} ): ` : ': ')); + console.log('error: ' + err.message + '\n'); + if(err.codeFrame) + console.log(err.codeFrame); + if(argv.onerror) + exec(argv.onerror,function(error) { + if(error) + console.warn("Could not execute onerror handle:",error.message); + }); +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..352917e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13212 @@ +{ + "name": "weh", + "version": "2.4.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@gulp-sourcemaps/identity-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", + "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", + "requires": { + "acorn": "^5.0.3", + "css": "^2.2.1", + "normalize-path": "^2.1.1", + "source-map": "^0.6.0", + "through2": "^2.0.3" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@gulp-sourcemaps/map-sources": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", + "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "requires": { + "normalize-path": "^2.0.1", + "through2": "^2.0.3" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accord": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.29.0.tgz", + "integrity": "sha512-3OOR92FTc2p5/EcOzPcXp+Cbo+3C15nV9RXHlOUBCBpHhcB+0frbSNR9ehED/o7sTcyGVtqGJpguToEdlXhD0w==", + "requires": { + "convert-source-map": "^1.5.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.5.0", + "semver": "^5.3.0", + "uglify-js": "^2.8.22", + "when": "^3.7.8" + }, + "dependencies": { + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "requires": { + "buffer-equal": "^1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "requires": { + "make-iterator": "^1.0.0" + } + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "requires": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "requires": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "async-done": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", + "integrity": "sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^1.0.7", + "stream-exhaust": "^1.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + } + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "requires": { + "async-done": "^1.2.2" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "requires": { + "babel-plugin-transform-flow-strip-types": "^6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "requires": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + } + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", + "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "bootstrap": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.3.tgz", + "integrity": "sha512-rDFIzgXcof0jDyjNosjv4Sno77X4KuPeFxG2XZZv1/Kc8DRVGVADdoQyyOVDwPqL36DDmtCQbrpMCqvpPLJQ0w==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + } + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "cloneable-readable": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", + "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" + }, + "collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "requires": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-props": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", + "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "requires": { + "each-props": "^1.3.0", + "is-plain-object": "^2.0.1" + } + }, + "core-js": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.7.tgz", + "integrity": "sha512-ydmsQxDVH7lDpYoirXft8S83ddKKfdsrsmWhtyj7xafXVLbLhKOyfD7kAi2ueFfeP7m9rNavjW59O3hLLzzC5A==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "^0.10.9" + } + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debug-fabulous": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", + "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", + "requires": { + "debug": "3.X", + "memoizee": "0.4.X", + "object-assign": "4.X" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "requires": { + "kind-of": "^5.0.2" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + } + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "~1.1.9" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "requires": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + } + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es5-ext": { + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "requires": { + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fbemitter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-2.1.1.tgz", + "integrity": "sha1-Uj4U/a9SSIBbsC9i78M75wP1GGU=", + "requires": { + "fbjs": "^0.8.4" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "file-loader": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "integrity": "sha512-N+uhF3mswIFeziHQjGScJ/yHXYt3DiLBeC+9vWW+WjUBiClMSOlV1YrXQi+7KM2aA3Rn4Bybgv+uXFQbfkzpvg==", + "requires": { + "loader-utils": "^1.0.2" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "flux": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/flux/-/flux-3.1.3.tgz", + "integrity": "sha1-0jvtUVp5oi2TOrU6tK2hnQWy8Io=", + "requires": { + "fbemitter": "^2.0.0", + "fbjs": "^0.8.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", + "integrity": "sha512-CIJYJC4GGF06TakLg8z4GQKvDsx9EMspVxOYih7LerEL/WosUnFIww45CGfxfeKHqlg3twgUrYRT1O3WQqjGCg==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "glob-watcher": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", + "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", + "requires": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "object.defaults": "^1.1.0" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "requires": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "requires": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + } + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + } + } + }, + "gulp-babel": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-6.1.3.tgz", + "integrity": "sha512-tm15R3rt4gO59WXCuqrwf4QXJM9VIJC+0J2NPYSC6xZn+cZRD5y5RPGAiHaDxCJq7Rz5BDljlrk3cEjWADF+wQ==", + "requires": { + "babel-core": "^6.23.1", + "object-assign": "^4.0.1", + "plugin-error": "^1.0.1", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-clean": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/gulp-clean/-/gulp-clean-0.3.2.tgz", + "integrity": "sha1-o0fUc6zqQBgvk1WHpFGUFnGSgQI=", + "requires": { + "gulp-util": "^2.2.14", + "rimraf": "^2.2.8", + "through2": "^0.4.2" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=" + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.3.0" + } + }, + "gulp-util": { + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz", + "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", + "requires": { + "chalk": "^0.5.0", + "dateformat": "^1.0.7-1.2.3", + "lodash._reinterpolate": "^2.4.1", + "lodash.template": "^2.4.1", + "minimist": "^0.2.0", + "multipipe": "^0.1.0", + "through2": "^0.5.0", + "vinyl": "^0.2.1" + }, + "dependencies": { + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + } + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "lodash._reinterpolate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz", + "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=" + }, + "lodash.escape": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz", + "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", + "requires": { + "lodash._escapehtmlchar": "~2.4.1", + "lodash._reunescapedhtml": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "lodash.template": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz", + "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", + "requires": { + "lodash._escapestringchar": "~2.4.1", + "lodash._reinterpolate": "~2.4.1", + "lodash.defaults": "~2.4.1", + "lodash.escape": "~2.4.1", + "lodash.keys": "~2.4.1", + "lodash.templatesettings": "~2.4.1", + "lodash.values": "~2.4.1" + } + }, + "lodash.templatesettings": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz", + "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", + "requires": { + "lodash._reinterpolate": "~2.4.1", + "lodash.escape": "~2.4.1" + } + }, + "minimist": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + }, + "through2": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", + "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", + "requires": { + "readable-stream": "~1.0.17", + "xtend": "~2.1.1" + }, + "dependencies": { + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, + "vinyl": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz", + "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", + "requires": { + "clone-stats": "~0.0.1" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=" + } + } + }, + "gulp-coffee": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/gulp-coffee/-/gulp-coffee-2.3.5.tgz", + "integrity": "sha512-PbgPGZVyYFnBTYtfYkVN6jcK8Qsuh3BxycPzvu8y5lZroCw3/x1m25KeyEDX110KsVLDmJxoULjscR21VEN4wA==", + "requires": { + "coffeescript": "^1.10.0", + "gulp-util": "^3.0.2", + "merge": "^1.2.0", + "through2": "^2.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + } + }, + "gulp-debug": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gulp-debug/-/gulp-debug-3.2.0.tgz", + "integrity": "sha512-2LZzP+ydczqz1rhqq/NYxvVvYTmOa0IgBl2B1sQTdkQgku9ayOUM/KHuGPjF4QA5aO1VcG+Sskw7iCcRUqHKkA==", + "requires": { + "chalk": "^2.3.0", + "fancy-log": "^1.3.2", + "plur": "^2.0.0", + "stringify-object": "^3.0.0", + "through2": "^2.0.0", + "tildify": "^1.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "gulp-ejs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/gulp-ejs/-/gulp-ejs-3.1.2.tgz", + "integrity": "sha512-S6gxTYzca5E3ueTMErko0hsmZIqN/nSsWBEPQ3nykSmC7N9/FMzeaxqXbVIlO7KOgS/sGPbuMTnq10MvprYQWA==", + "requires": { + "ejs": "2.5.7", + "plugin-error": "^1.0.0", + "replace-ext": "^1.0.0", + "safe-buffer": "^5.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + } + } + }, + "gulp-filter": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", + "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "requires": { + "multimatch": "^2.0.0", + "plugin-error": "^0.1.2", + "streamfilter": "^1.0.5" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", + "requires": { + "gulp-match": "^1.0.3", + "ternary-stream": "^2.0.1", + "through2": "^2.0.1" + } + }, + "gulp-install": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-install/-/gulp-install-1.1.0.tgz", + "integrity": "sha1-k4a0bLRmm0cle2rfTj6i6DySiho=", + "requires": { + "dargs": "^5.1.0", + "gulp-util": "^3.0.7", + "lodash.groupby": "^4.6.0", + "p-queue": "^1.0.0", + "through2": "^2.0.3", + "which": "^1.2.14" + } + }, + "gulp-less": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gulp-less/-/gulp-less-4.0.1.tgz", + "integrity": "sha512-hmM2k0FfQp7Ptm3ZaqO2CkMX3hqpiIOn4OHtuSsCeFym63F7oWlEua5v6u1cIjVUKYsVIs9zPg9vbqTEb/udpA==", + "requires": { + "accord": "^0.29.0", + "less": "2.6.x || ^3.7.1", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "replace-ext": "^1.0.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + } + } + }, + "gulp-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", + "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "requires": { + "minimatch": "^3.0.3" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "gulp-rename": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", + "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=" + }, + "gulp-sass": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-3.1.0.tgz", + "integrity": "sha1-U9xLaKH13f5EJKtMJHZVJpqLdLc=", + "requires": { + "gulp-util": "^3.0", + "lodash.clonedeep": "^4.3.2", + "node-sass": "^4.2.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, + "gulp-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz", + "integrity": "sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=", + "requires": { + "through2": "^2.0.1" + } + }, + "gulp-sourcemaps": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", + "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", + "requires": { + "@gulp-sourcemaps/identity-map": "1.X", + "@gulp-sourcemaps/map-sources": "1.X", + "acorn": "5.X", + "convert-source-map": "1.X", + "css": "2.X", + "debug-fabulous": "1.X", + "detect-newline": "2.X", + "graceful-fs": "4.X", + "source-map": "~0.6.0", + "strip-bom-string": "1.X", + "through2": "2.X" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "gulp-stylus": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/gulp-stylus/-/gulp-stylus-2.7.0.tgz", + "integrity": "sha512-LlneLeHcaRBaEqxwo5YCirpsfkR7uleQ4pHXW8IE2ZeA6M3jpgI90+zQ6SptMTSWr1RSQW3WYFZVA3P0coUojw==", + "requires": { + "accord": "^0.26.3", + "lodash.assign": "^3.2.0", + "plugin-error": "^0.1.2", + "replace-ext": "0.0.1", + "stylus": "^0.54.0", + "through2": "^2.0.0", + "vinyl-sourcemaps-apply": "^0.2.0" + }, + "dependencies": { + "accord": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/accord/-/accord-0.26.4.tgz", + "integrity": "sha1-/EyNPrq0BqB8sogZuFllHESpLoA=", + "requires": { + "convert-source-map": "^1.2.0", + "glob": "^7.0.5", + "indx": "^0.2.3", + "lodash.clone": "^4.3.2", + "lodash.defaults": "^4.0.1", + "lodash.flatten": "^4.2.0", + "lodash.merge": "^4.4.0", + "lodash.partialright": "^4.1.4", + "lodash.pick": "^4.2.1", + "lodash.uniq": "^4.3.0", + "resolve": "^1.1.7", + "semver": "^5.3.0", + "uglify-js": "^2.7.0", + "when": "^3.7.7" + } + }, + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + } + } + }, + "gulp-typescript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", + "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", + "requires": { + "ansi-colors": "^3.0.5", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^3.0.0", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "requires": { + "readable-stream": "2 || 3" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" + } + } + }, + "gulp4-run-sequence": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/gulp4-run-sequence/-/gulp4-run-sequence-0.3.3.tgz", + "integrity": "sha512-ifPhpiyI/mm8eKrJEV4XlC7G6XXM38Pe1UDyI2KPrzVOEehYdwHH3+pSmLB0aH3l3ULziV77jGEBWmyZqU19PQ==" + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "optional": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.0.tgz", + "integrity": "sha512-3DEun4VOeMvSczifM3F2cKQrDQ5Pj6WKhkOq6HD4QTnDUAq8MQRxy5TX6Sy1iY6WPBe4gQ3p5vTECjbIkglkkQ==", + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "optional": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "indx": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/indx/-/indx-0.2.3.tgz", + "integrity": "sha1-Fdz1bunPZcAjTFE8J/vVgOcPvFA=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "install": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/install/-/install-0.10.4.tgz", + "integrity": "sha512-+IRyOastuPmLVx9zlVXJoKErSqz1Ma5at9A7S8yfsj3W+Kg95faPoh3bPDtMrZ/grz4PRmXzrswmlzfLlYyLOw==" + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "requires": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lazypipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazypipe/-/lazypipe-1.0.1.tgz", + "integrity": "sha1-FHGu9rN6NA1Rw030Rpnc7wZMGUA=", + "requires": { + "stream-combiner": "*" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "requires": { + "flush-write-stream": "^1.0.2" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash-es": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.11.tgz", + "integrity": "sha512-DHb1ub+rMjjrxqlB3H56/6MXtm1lSksDp2rA2cNWjG8mlDUYFhUj3Di2Zn5IwSU87xLv8tNIQ7sSwE/YOX/D/Q==" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._escapehtmlchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz", + "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", + "requires": { + "lodash._htmlescapes": "~2.4.1" + } + }, + "lodash._escapestringchar": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz", + "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._htmlescapes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz", + "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=" + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash._reunescapedhtml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz", + "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", + "requires": { + "lodash._htmlescapes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" + }, + "lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "requires": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.defaults": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", + "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", + "requires": { + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", + "requires": { + "lodash._objecttypes": "~2.4.1" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, + "lodash.partialright": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz", + "integrity": "sha1-ATDYDoM2MmTUAHTzKbij56ihzEs=" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "lodash.values": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", + "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", + "requires": { + "lodash.keys": "~2.4.1" + }, + "dependencies": { + "lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", + "requires": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "requires": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "dependencies": { + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memoizee": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", + "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", + "requires": { + "d": "1", + "es5-ext": "^0.10.45", + "es6-weak-map": "^2.0.2", + "event-emitter": "^0.3.5", + "is-promise": "^2.1", + "lru-queue": "0.1", + "next-tick": "1", + "timers-ext": "^0.1.5" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + } + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, + "mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "node-sass": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", + "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.11", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "requires": { + "once": "^1.3.2" + } + }, + "npm": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.9.0.tgz", + "integrity": "sha512-91V+zB5hDxO+Jyp2sUKS7juHlIM95dGQxTeQtmZI1nAI/7kjWXFipPrtwwKjhyKmV4GsS2LzJhrxRjGWsU9z/w==", + "requires": { + "JSONStream": "^1.3.5", + "abbrev": "~1.1.1", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "aproba": "^2.0.0", + "archy": "~1.0.0", + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "byte-size": "^5.0.1", + "cacache": "^11.3.2", + "call-limit": "~1.1.0", + "chownr": "^1.1.1", + "ci-info": "^2.0.0", + "cli-columns": "^3.1.2", + "cli-table3": "^0.5.1", + "cmd-shim": "~2.0.2", + "columnify": "~1.5.4", + "config-chain": "^1.1.12", + "debuglog": "*", + "detect-indent": "~5.0.0", + "detect-newline": "^2.1.0", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "fs-vacuum": "~1.2.10", + "fs-write-stream-atomic": "~1.0.10", + "gentle-fs": "^2.0.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "has-unicode": "~2.0.1", + "hosted-git-info": "^2.7.1", + "iferr": "^1.0.2", + "imurmurhash": "*", + "inflight": "~1.0.6", + "inherits": "~2.0.3", + "ini": "^1.3.5", + "init-package-json": "^1.10.3", + "is-cidr": "^3.0.0", + "json-parse-better-errors": "^1.0.2", + "lazy-property": "~1.0.0", + "libcipm": "^3.0.3", + "libnpm": "^2.0.1", + "libnpmaccess": "*", + "libnpmhook": "^5.0.2", + "libnpmorg": "*", + "libnpmsearch": "*", + "libnpmteam": "*", + "libnpx": "^10.2.0", + "lock-verify": "^2.1.0", + "lockfile": "^1.0.4", + "lodash._baseindexof": "*", + "lodash._baseuniq": "~4.6.0", + "lodash._bindcallback": "*", + "lodash._cacheindexof": "*", + "lodash._createcache": "*", + "lodash._getnative": "*", + "lodash.clonedeep": "~4.5.0", + "lodash.restparam": "*", + "lodash.union": "~4.6.0", + "lodash.uniq": "~4.5.0", + "lodash.without": "~4.4.0", + "lru-cache": "^4.1.5", + "meant": "~1.0.1", + "mississippi": "^3.0.0", + "mkdirp": "~0.5.1", + "move-concurrently": "^1.0.1", + "node-gyp": "^3.8.0", + "nopt": "~4.0.1", + "normalize-package-data": "^2.5.0", + "npm-audit-report": "^1.3.2", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~3.0.0", + "npm-lifecycle": "^2.1.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.4.1", + "npm-pick-manifest": "^2.2.3", + "npm-profile": "*", + "npm-registry-fetch": "^3.9.0", + "npm-user-validate": "~1.0.0", + "npmlog": "~4.1.2", + "once": "~1.4.0", + "opener": "^1.5.1", + "osenv": "^0.1.5", + "pacote": "^9.5.0", + "path-is-inside": "~1.0.2", + "promise-inflight": "~1.0.1", + "qrcode-terminal": "^0.12.0", + "query-string": "^6.2.0", + "qw": "~1.0.1", + "read": "~1.0.7", + "read-cmd-shim": "~1.0.1", + "read-installed": "~4.0.3", + "read-package-json": "^2.0.13", + "read-package-tree": "^5.2.2", + "readable-stream": "^3.1.1", + "readdir-scoped-modules": "*", + "request": "^2.88.0", + "retry": "^0.12.0", + "rimraf": "^2.6.3", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~2.0.1", + "sorted-union-stream": "~2.1.3", + "ssri": "^6.0.1", + "stringify-package": "^1.0.0", + "tar": "^4.4.8", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "unique-filename": "^1.1.1", + "unpipe": "~1.0.0", + "update-notifier": "^2.5.0", + "uuid": "^3.3.2", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "~3.0.0", + "which": "^1.3.1", + "worker-farm": "^1.6.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.5", + "bundled": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "bundled": true + }, + "agent-base": { + "version": "4.2.1", + "bundled": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.4.1", + "bundled": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "bundled": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ansi-align": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "^2.0.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true + }, + "ansistyles": { + "version": "0.1.3", + "bundled": true + }, + "aproba": { + "version": "2.0.0", + "bundled": true + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "asap": { + "version": "2.0.6", + "bundled": true + }, + "asn1": { + "version": "0.2.4", + "bundled": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.7.0", + "bundled": true + }, + "aws4": { + "version": "1.8.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bin-links": { + "version": "1.1.2", + "bundled": true, + "requires": { + "bluebird": "^3.5.0", + "cmd-shim": "^2.0.2", + "gentle-fs": "^2.0.0", + "graceful-fs": "^4.1.11", + "write-file-atomic": "^2.3.0" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.3", + "bundled": true + }, + "boxen": { + "version": "1.3.0", + "bundled": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "bundled": true + }, + "builtins": { + "version": "1.0.3", + "bundled": true + }, + "byline": { + "version": "5.0.0", + "bundled": true + }, + "byte-size": { + "version": "5.0.1", + "bundled": true + }, + "cacache": { + "version": "11.3.2", + "bundled": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "call-limit": { + "version": "1.1.0", + "bundled": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "chalk": { + "version": "2.4.1", + "bundled": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "ci-info": { + "version": "2.0.0", + "bundled": true + }, + "cidr-regex": { + "version": "2.0.10", + "bundled": true, + "requires": { + "ip-regex": "^2.1.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "bundled": true + }, + "cli-columns": { + "version": "3.1.2", + "bundled": true, + "requires": { + "string-width": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "cli-table3": { + "version": "0.5.1", + "bundled": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "bundled": true + }, + "cmd-shim": { + "version": "2.0.2", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "color-convert": { + "version": "1.9.1", + "bundled": true, + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true + }, + "colors": { + "version": "1.3.3", + "bundled": true, + "optional": true + }, + "columnify": { + "version": "1.5.4", + "bundled": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "bundled": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "config-chain": { + "version": "1.1.12", + "bundled": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "bundled": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "create-error-class": { + "version": "3.0.2", + "bundled": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "bundled": true + }, + "cyclist": { + "version": "0.2.2", + "bundled": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "bundled": true + } + } + }, + "debuglog": { + "version": "1.0.1", + "bundled": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true + }, + "defaults": { + "version": "1.0.3", + "bundled": true, + "requires": { + "clone": "^1.0.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "detect-indent": { + "version": "5.0.0", + "bundled": true + }, + "detect-newline": { + "version": "2.1.0", + "bundled": true + }, + "dezalgo": { + "version": "1.0.3", + "bundled": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "bundled": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "5.0.1", + "bundled": true + }, + "duplexer3": { + "version": "0.1.4", + "bundled": true + }, + "duplexify": { + "version": "3.6.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editor": { + "version": "1.0.0", + "bundled": true + }, + "encoding": { + "version": "0.1.12", + "bundled": true, + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "err-code": { + "version": "1.1.2", + "bundled": true + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es6-promise": { + "version": "4.2.6", + "bundled": true + }, + "es6-promisify": { + "version": "5.0.0", + "bundled": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + } + } + }, + "extend": { + "version": "3.0.2", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "fast-deep-equal": { + "version": "1.1.0", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true + }, + "find-npm-prefix": { + "version": "1.0.2", + "bundled": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.3.2", + "bundled": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-vacuum": { + "version": "1.2.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.5.2" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "genfun": { + "version": "5.0.0", + "bundled": true + }, + "gentle-fs": { + "version": "2.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.2", + "fs-vacuum": "^1.2.10", + "graceful-fs": "^4.1.11", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "path-is-inside": "^1.0.2", + "read-cmd-shim": "^1.0.1", + "slide": "^1.1.6" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "bundled": true, + "requires": { + "ini": "^1.3.4" + } + }, + "got": { + "version": "6.7.1", + "bundled": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "bundled": true + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true + }, + "har-schema": { + "version": "2.0.0", + "bundled": true + }, + "har-validator": { + "version": "5.1.0", + "bundled": true, + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hosted-git-info": { + "version": "2.7.1", + "bundled": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "bundled": true + }, + "http-proxy-agent": { + "version": "2.1.0", + "bundled": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + } + }, + "http-signature": { + "version": "1.2.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "bundled": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "bundled": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "bundled": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "1.0.2", + "bundled": true + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "init-package-json": { + "version": "1.10.3", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true + }, + "ip": { + "version": "1.1.5", + "bundled": true + }, + "ip-regex": { + "version": "2.1.0", + "bundled": true + }, + "is-ci": { + "version": "1.1.0", + "bundled": true, + "requires": { + "ci-info": "^1.0.0" + }, + "dependencies": { + "ci-info": { + "version": "1.6.0", + "bundled": true + } + } + }, + "is-cidr": { + "version": "3.0.0", + "bundled": true, + "requires": { + "cidr-regex": "^2.0.10" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "bundled": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "bundled": true + }, + "is-obj": { + "version": "1.0.1", + "bundled": true + }, + "is-path-inside": { + "version": "1.0.1", + "bundled": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-redirect": { + "version": "1.0.0", + "bundled": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "bundled": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonparse": { + "version": "1.3.1", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "latest-version": { + "version": "3.1.0", + "bundled": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lazy-property": { + "version": "1.0.0", + "bundled": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "libcipm": { + "version": "3.0.3", + "bundled": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.5.1", + "find-npm-prefix": "^1.0.2", + "graceful-fs": "^4.1.11", + "ini": "^1.3.5", + "lock-verify": "^2.0.2", + "mkdirp": "^0.5.1", + "npm-lifecycle": "^2.0.3", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "pacote": "^9.1.0", + "read-package-json": "^2.0.13", + "rimraf": "^2.6.2", + "worker-farm": "^1.6.0" + } + }, + "libnpm": { + "version": "2.0.1", + "bundled": true, + "requires": { + "bin-links": "^1.1.2", + "bluebird": "^3.5.3", + "find-npm-prefix": "^1.0.2", + "libnpmaccess": "^3.0.1", + "libnpmconfig": "^1.2.1", + "libnpmhook": "^5.0.2", + "libnpmorg": "^1.0.0", + "libnpmpublish": "^1.1.0", + "libnpmsearch": "^2.0.0", + "libnpmteam": "^1.0.1", + "lock-verify": "^2.0.2", + "npm-lifecycle": "^2.1.0", + "npm-logical-tree": "^1.2.1", + "npm-package-arg": "^6.1.0", + "npm-profile": "^4.0.1", + "npm-registry-fetch": "^3.8.0", + "npmlog": "^4.1.2", + "pacote": "^9.2.3", + "read-package-json": "^2.0.13", + "stringify-package": "^1.0.0" + } + }, + "libnpmaccess": { + "version": "3.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "get-stream": "^4.0.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true + } + } + }, + "libnpmconfig": { + "version": "1.2.1", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "bundled": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true + } + } + }, + "libnpmhook": { + "version": "5.0.2", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + } + }, + "libnpmorg": { + "version": "1.0.0", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true + } + } + }, + "libnpmpublish": { + "version": "1.1.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "lodash.clonedeep": "^4.5.0", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-registry-fetch": "^3.8.0", + "semver": "^5.5.1", + "ssri": "^6.0.1" + } + }, + "libnpmsearch": { + "version": "2.0.0", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + } + }, + "libnpmteam": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^2.0.0", + "figgy-pudding": "^3.4.1", + "get-stream": "^4.0.0", + "npm-registry-fetch": "^3.8.0" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "bundled": true + } + } + }, + "libnpx": { + "version": "10.2.0", + "bundled": true, + "requires": { + "dotenv": "^5.0.1", + "npm-package-arg": "^6.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.0", + "update-notifier": "^2.3.0", + "which": "^1.3.0", + "y18n": "^4.0.0", + "yargs": "^11.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lock-verify": { + "version": "2.1.0", + "bundled": true, + "requires": { + "npm-package-arg": "^6.1.0", + "semver": "^5.4.1" + } + }, + "lockfile": { + "version": "1.0.4", + "bundled": true, + "requires": { + "signal-exit": "^3.0.2" + } + }, + "lodash._baseindexof": { + "version": "3.1.0", + "bundled": true + }, + "lodash._baseuniq": { + "version": "4.6.0", + "bundled": true, + "requires": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "bundled": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "bundled": true + }, + "lodash._createcache": { + "version": "3.1.2", + "bundled": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._createset": { + "version": "4.0.3", + "bundled": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash._root": { + "version": "3.0.1", + "bundled": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "bundled": true + }, + "lodash.restparam": { + "version": "3.6.1", + "bundled": true + }, + "lodash.union": { + "version": "4.6.0", + "bundled": true + }, + "lodash.uniq": { + "version": "4.5.0", + "bundled": true + }, + "lodash.without": { + "version": "4.4.0", + "bundled": true + }, + "lowercase-keys": { + "version": "1.0.1", + "bundled": true + }, + "lru-cache": { + "version": "4.1.5", + "bundled": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "bundled": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "meant": { + "version": "1.0.1", + "bundled": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mime-db": { + "version": "1.35.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.19", + "bundled": true, + "requires": { + "mime-db": "~1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.3", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "bundled": true + } + } + }, + "minizlib": { + "version": "1.1.1", + "bundled": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + } + } + }, + "ms": { + "version": "2.1.1", + "bundled": true + }, + "mute-stream": { + "version": "0.0.7", + "bundled": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "bundled": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "bundled": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "resolve": { + "version": "1.10.0", + "bundled": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "npm-audit-report": { + "version": "1.3.2", + "bundled": true, + "requires": { + "cli-table3": "^0.5.0", + "console-control-strings": "^1.1.0" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true + }, + "npm-cache-filename": { + "version": "1.0.2", + "bundled": true + }, + "npm-install-checks": { + "version": "3.0.0", + "bundled": true, + "requires": { + "semver": "^2.3.0 || 3.x || 4 || 5" + } + }, + "npm-lifecycle": { + "version": "2.1.0", + "bundled": true, + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-logical-tree": { + "version": "1.2.1", + "bundled": true + }, + "npm-package-arg": { + "version": "6.1.0", + "bundled": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-profile": { + "version": "4.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.2 || 2", + "figgy-pudding": "^3.4.1", + "npm-registry-fetch": "^3.8.0" + } + }, + "npm-registry-fetch": { + "version": "3.9.0", + "bundled": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-user-validate": { + "version": "1.0.0", + "bundled": true + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.9.0", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.1", + "bundled": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true + }, + "package-json": { + "version": "4.0.1", + "bundled": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "pacote": { + "version": "9.5.0", + "bundled": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true + }, + "performance-now": { + "version": "2.1.0", + "bundled": true + }, + "pify": { + "version": "3.0.0", + "bundled": true + }, + "prepend-http": { + "version": "1.0.4", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "promise-retry": { + "version": "1.1.1", + "bundled": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "bundled": true + } + } + }, + "promzard": { + "version": "0.3.0", + "bundled": true, + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "bundled": true + }, + "protoduck": { + "version": "5.0.1", + "bundled": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "prr": { + "version": "1.0.1", + "bundled": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "psl": { + "version": "1.1.29", + "bundled": true + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "qrcode-terminal": { + "version": "0.12.0", + "bundled": true + }, + "qs": { + "version": "6.5.2", + "bundled": true + }, + "query-string": { + "version": "6.2.0", + "bundled": true, + "requires": { + "decode-uri-component": "^0.2.0", + "strict-uri-encode": "^2.0.0" + } + }, + "qw": { + "version": "1.0.1", + "bundled": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true + } + } + }, + "read": { + "version": "1.0.7", + "bundled": true, + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-installed": { + "version": "4.0.3", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + } + }, + "read-package-json": { + "version": "2.0.13", + "bundled": true, + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.2", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.1.1", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "bundled": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "bundled": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "bundled": true, + "requires": { + "rc": "^1.0.1" + } + }, + "request": { + "version": "2.88.0", + "bundled": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "resolve-from": { + "version": "4.0.0", + "bundled": true + }, + "retry": { + "version": "0.12.0", + "bundled": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "^1.1.1" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "bundled": true + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true + }, + "semver": { + "version": "5.6.0", + "bundled": true + }, + "semver-diff": { + "version": "2.1.0", + "bundled": true, + "requires": { + "semver": "^5.0.3" + } + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "sha": { + "version": "2.0.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "slash": { + "version": "1.0.0", + "bundled": true + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "smart-buffer": { + "version": "4.0.1", + "bundled": true + }, + "socks": { + "version": "2.2.0", + "bundled": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "bundled": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, + "sorted-object": { + "version": "2.0.1", + "bundled": true + }, + "sorted-union-stream": { + "version": "2.1.3", + "bundled": true, + "requires": { + "from2": "^1.3.0", + "stream-iterate": "^1.1.0" + }, + "dependencies": { + "from2": { + "version": "1.3.0", + "bundled": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~1.1.10" + } + }, + "isarray": { + "version": "0.0.1", + "bundled": true + }, + "readable-stream": { + "version": "1.1.14", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "bundled": true + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "bundled": true + }, + "sshpk": { + "version": "1.14.2", + "bundled": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.2", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-iterate": { + "version": "1.2.0", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.2.0", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringify-package": { + "version": "1.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "supports-color": { + "version": "5.4.0", + "bundled": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "term-size": { + "version": "1.2.0", + "bundled": true, + "requires": { + "execa": "^0.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + }, + "through2": { + "version": "2.0.3", + "bundled": true, + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "timed-out": { + "version": "4.0.1", + "bundled": true + }, + "tiny-relative-date": { + "version": "1.3.0", + "bundled": true + }, + "tough-cookie": { + "version": "2.4.3", + "bundled": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "umask": { + "version": "1.1.0", + "bundled": true + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "bundled": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "unpipe": { + "version": "1.0.0", + "bundled": true + }, + "unzip-response": { + "version": "2.0.1", + "bundled": true + }, + "update-notifier": { + "version": "2.5.0", + "bundled": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "bundled": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "util-extend": { + "version": "1.0.3", + "bundled": true + }, + "uuid": { + "version": "3.3.2", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "bundled": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "bundled": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "bundled": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "^1.0.2" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "widest-line": { + "version": "2.0.0", + "bundled": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "worker-farm": { + "version": "1.6.0", + "bundled": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "2.4.2", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "bundled": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + }, + "yargs": { + "version": "11.0.0", + "bundled": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "bundled": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + } + }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-queue": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-1.2.0.tgz", + "integrity": "sha1-Y5y4sHJwwVtx16ZEao4wQU88ltE=" + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + }, + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + "requires": { + "irregular-plurals": "^1.0.0" + } + }, + "popper.js": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.12.9.tgz", + "integrity": "sha1-DfvC3/lsRRuzMu3Pz6r1ZtMx1bM=" + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.16.tgz", + "integrity": "sha512-MOo8zNSlIqh22Uaa3drkdIAgUGEL+AD1ESiSdmElLUmE2uVDo1QloiT/IfW9qRw8Gw+Y/w69UVMGwbufMSftxA==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + }, + "dependencies": { + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + } + } + } + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.2.0.tgz", + "integrity": "sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-base16-styling": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.5.3.tgz", + "integrity": "sha1-OFjyTpxN2MvT9wLz901YHKKRcmk=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-dom": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.2.0.tgz", + "integrity": "sha512-zpGAdwHVn9K0091d+hr+R0qrjoJ84cIBFL2uU60KvWBPfZ7LPSrfqviTxGHWN0sjPZb2hxWzMexwrvJdKePvjg==", + "requires": { + "fbjs": "^0.8.16", + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-json-view": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.16.1.tgz", + "integrity": "sha512-9gx2S+b9+LHbjnIzIXrcDU14YI5KP3hhDgNHrQiLsV3dtnzoT8m6j37h7dpCaO1hPLZEc3Q/6VS1QjiLi0HT/w==", + "requires": { + "flux": "^3.1.3", + "react-base16-styling": "^0.5.3", + "react-textarea-autosize": "^5.1.0" + } + }, + "react-redux": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", + "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", + "requires": { + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.0.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "loose-envify": "^1.1.0", + "prop-types": "^15.6.0" + } + }, + "react-textarea-autosize": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", + "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", + "requires": { + "prop-types": "^15.6.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "redux-form": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/redux-form/-/redux-form-7.3.0.tgz", + "integrity": "sha512-WcZRsRsVG25l8Cih3bEeeoZFxSIvoHqTpBRe5Ifl1ob7xvEpYLXyYYHAFER1DpTfMZPgTPHZ4UkR4ILFP3hzkw==", + "requires": { + "deep-equal": "^1.0.1", + "es6-error": "^4.1.1", + "hoist-non-react-statics": "^2.5.0", + "invariant": "^2.2.3", + "is-promise": "^2.1.0", + "lodash": "^4.17.5", + "lodash-es": "^4.17.5", + "prop-types": "^15.6.1" + } + }, + "redux-logger": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha1-91VZZvMJjzyIYExEnPC69XeCdL8=", + "requires": { + "deep-diff": "^0.3.5" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "requires": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "requires": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "run-sequence": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", + "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==", + "requires": { + "chalk": "^1.1.3", + "fancy-log": "^1.3.2", + "plugin-error": "^0.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + } + } + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "requires": { + "ajv": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + } + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" + }, + "semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "requires": { + "sver-compat": "^1.5.0" + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + } + } + }, + "stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "streamfilter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", + "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "integrity": "sha512-WPpJPZGUxWYHWIUMNNOYqql7zh85zGmr84FdTVWq52WTIkqlW9xSxD3QYWi/T31cqn9UNSsietVEgGn2aaSCzw==", + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "requires": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "ternary-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", + "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "requires": { + "duplexify": "^3.5.0", + "fork-stream": "^0.0.4", + "merge-stream": "^1.0.0", + "through2": "^2.0.1" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.4.tgz", + "integrity": "sha512-64IiILNQlACWZLzFlpzNaG0bpQ4ytaB7fwOsbpsdIV70AfLUmIGGeuKL0YV2WmtcrURjE2aOvHD4/lrFV3Rg+Q==", + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.0.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^3.17.0", + "webpack-sources": "^1.3.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "requires": { + "through2": "^2.0.3" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "optional": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==" + }, + "ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.2", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + } + } + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "undertaker": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", + "requires": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + } + }, + "undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.3.tgz", + "integrity": "sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", + "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", + "requires": { + "bl": "^1.2.1", + "through2": "^2.0.3" + } + }, + "vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "requires": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vinyl-named": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-named/-/vinyl-named-1.1.0.tgz", + "integrity": "sha1-lOT+dB442w7DA+Wz2Giyl6Leq2Y=", + "requires": { + "through": "^2.3.6" + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "requires": { + "through2": "^2.0.3", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, + "vinyl-sourcemaps-apply": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", + "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", + "requires": { + "source-map": "^0.5.1" + } + }, + "vinyl-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vinyl-string/-/vinyl-string-1.0.2.tgz", + "integrity": "sha1-OiSe/rDTbEywpeWeMNaOVPc52OM=", + "requires": { + "vinyl": "^1.1.1" + }, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + } + } + }, + "webextension-polyfill": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.1.2.tgz", + "integrity": "sha1-piXj1NozB2yhRyk1ZuQu8VPcMAI=" + }, + "webpack": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", + "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpack-stream": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-stream/-/webpack-stream-5.2.1.tgz", + "integrity": "sha512-WvyVU0K1/VB1NZ7JfsaemVdG0PXAQUqbjUNW4A58th4pULvKMQxG+y33HXTL02JvD56ko2Cub+E2NyPwrLBT/A==", + "requires": { + "fancy-log": "^1.3.3", + "lodash.clone": "^4.3.2", + "lodash.some": "^4.2.2", + "memory-fs": "^0.4.1", + "plugin-error": "^1.0.1", + "supports-color": "^5.5.0", + "through": "^2.3.8", + "vinyl": "^2.1.0", + "webpack": "^4.26.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "webpack": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.32.0.tgz", + "integrity": "sha512-ofFq9jjAn4HRzlmkcZZrjijbRZcqDw+mM9KrjKd0r6lS0qxyZ7jzICzhphGafXL62dGdjP7TgMK9mZeMLUgZgw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + } + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/package.json b/package.json index 9032af6..473b760 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "weh", - "version": "1.3.0", - "description": "Toolkit for developing WebExtensions add-ons on Firefox, Chrome, Edge and Opera, using ReactJS, Angular or jQuery for the UI", + "version": "2.4.0", + "description": "Toolkit for developing WebExtensions add-ons on Firefox, Chrome, Edge, Opera and Vivaldi", "keywords": [ "webextensions", "add-on", @@ -10,24 +10,25 @@ "chrome", "firefox", "opera", + "vivaldi", "edge", - "reactjs", "react", - "angular", - "jquery" + "redux" ], "homepage": "https://github.com/mi-g/weh", "bugs": { "url": "https://github.com/mi-g/weh/issues" }, - "license": { - "license": " MPL-2.0" - }, + "license": "MPL-2.0", "author": { "name": "Michel Gutierrez", "email": "michel.gutierrez@gmail.com", "url": "https://github.com/mi-g" }, + "repository": { + "type": "git", + "url": "https://github.com/mi-g/weh.git" + }, "bin": { "weh": "./index.js" }, @@ -35,39 +36,55 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "angular": "^1.6.1", - "babel-preset-es2015": "^6.18.0", - "babel-preset-react": "^6.16.0", - "bootstrap": "^3.3.7", - "del": "^2.2.2", - "event-stream": "^3.3.4", - "gulp": "^3.9.1", - "gulp-babel": "^6.1.2", - "gulp-clean-css": "^2.0.13", - "gulp-coffee": "^2.3.3", - "gulp-concat": "^2.6.1", - "gulp-debug": "^3.0.0", - "gulp-ejs": "^2.2.1", - "gulp-file": "^0.3.0", - "gulp-header": "^1.8.8", - "gulp-htmlmin": "^3.0.0", - "gulp-if": "^2.0.2", - "gulp-less": "^3.3.0", - "gulp-line-ending-corrector": "^1.0.1", - "gulp-rename": "^1.2.2", - "gulp-replace": "^0.5.4", - "gulp-sass": "^2.3.2", - "gulp-sourcemaps": "^2.2.0", - "gulp-stylus": "^2.6.0", - "gulp-typescript": "^3.1.3", - "gulp-uglify": "^2.0.0", - "gulp-util": "^3.0.7", - "jquery": "^3.1.1", - "react": "^15.3.2", - "react-dom": "^15.3.2", - "run-sequence": "^1.2.2", - "streamqueue": "^1.1.1", - "typescript": "^2.0.10", - "yargs": "^6.3.0" + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", + "bootstrap": "4.1.3", + "css-loader": "2.1.1", + "file-loader": "0.11.2", + "gulp": "4.0.2", + "gulp-babel": "6.1.3", + "gulp-clean": "0.3.2", + "gulp-coffee": "2.3.5", + "gulp-debug": "3.2.0", + "gulp-ejs": "3.1.2", + "gulp-filter": "5.1.0", + "gulp-if": "2.0.2", + "gulp-install": "1.1.0", + "gulp-less": "4.0.1", + "gulp-rename": "1.2.2", + "gulp-sass": "3.1.0", + "gulp-sort": "2.0.0", + "gulp-sourcemaps": "2.6.5", + "gulp-stylus": "2.7.0", + "gulp-typescript": "5.0.1", + "gulp4-run-sequence": "0.3.3", + "install": "0.10.4", + "jquery": "3.4.1", + "json-stable-stringify": "1.0.1", + "lazypipe": "1.0.1", + "merge-stream": "1.0.1", + "npm": "6.9.0", + "popper.js": "1.12.9", + "react": "16.2.0", + "react-dom": "16.2.0", + "react-json-view": "1.16.1", + "react-redux": "5.0.7", + "redux": "3.7.2", + "redux-form": "7.3.0", + "redux-logger": "3.0.6", + "run-sequence": "2.2.1", + "style-loader": "0.18.2", + "through2": "2.0.3", + "typescript": "2.7.2", + "uglifyjs-webpack-plugin": "1.2.2", + "url-loader": "1.1.2", + "vinyl-buffer": "1.0.1", + "vinyl-named": "1.1.0", + "vinyl-source-stream": "1.1.2", + "vinyl-string": "1.0.2", + "webextension-polyfill": "0.1.2", + "webpack": "3.11.0", + "webpack-stream": "5.2.1", + "yargs": "6.6.0" } } diff --git a/src/background/weh-ajax.js b/src/background/weh-ajax.js deleted file mode 100644 index b5da565..0000000 --- a/src/background/weh-ajax.js +++ /dev/null @@ -1,75 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -weh.ajax = function(options) { - - const JSON_RE = new RegExp("\\bjson\\b"); - - if(!options.url) - throw new Error("ajax: url not present"); - options.onComplete = options.onComplete || function() {}; - options.headers = options.headers || {}; - options.content = options.content || null; - options.contentType = options.contentType || "application/x-www-form-urlencoded"; - if(options.overrideMimeType) - throw new Error("ajax: overrideMimeType not supported"); - options.anonymous = options.anonymous || false; - - var httpRequest = new XMLHttpRequest(); - - httpRequest.onreadystatechange = function() { - if (httpRequest.readyState === XMLHttpRequest.DONE) { - var data = null; - var contentType = httpRequest.getResponseHeader("Content-Type"); - if(contentType && JSON_RE.test(contentType)) { - try { - data = JSON.parse(httpRequest.responseText); - } catch(e) {} - } - data = data || httpRequest.responseXML; - data = data || httpRequest.responseText; - var err; - if(httpRequest.status==200) - err = null; - else if(httpRequest.status==0) - err = new Error("Network error"); - else - err = new Error("HTTP status "+httpRequest.status); - options.onComplete(err,data); - } - } - - function Request() {} - Request.prototype = { - proceed: function(method) { - httpRequest.open(method,options.url,true); - for(var header in options.headers) - if(options.headers.hasOwnProperty(header)) - httpRequest.setRequestHeader(header, options.headers[header]); - if(options.contentType) - httpRequest.setRequestHeader("Content-Type", options.contentType); - if(options.anonymous) { - httpRequest.setRequestHeader("Cookie", ""); - httpRequest.setRequestHeader("Authentication", ""); - httpRequest.mozAnon = true; - } - httpRequest.send(options.content); - }, - get: function() { - this.proceed("GET"); - }, - post: function() { - this.proceed("POST"); - }, - } - return new Request; -}; diff --git a/src/background/weh-bg-prefs.js b/src/background/weh-bg-prefs.js deleted file mode 100644 index 502ceb8..0000000 --- a/src/background/weh-bg-prefs.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - function Hash(str){ - var hash = 0, char; - if (str.length == 0) return hash; - for(var i=0; i<str.length; i++) { - char = str.charCodeAt(i); - hash = ((hash<<5)-hash)+char; - hash = hash & hash; - } - return hash; - } - - function Stringify(object) { - return JSON.stringify(Object.keys(object).sort().map(function(k) { - return { - name: k, - value: object[k] - } - })); - } - - function Parse(str) { - var object = {}; - JSON.parse(str).forEach(function(pair) { - object[pair.name] = pair.value; - }); - return object; - } - - var lastHash = 0; - var prefs = {}; - - try { - var prefsStr = localStorage.getItem("weh-prefs"); - prefs = Parse(prefsStr); - lastHash = Hash(prefsStr); - } catch(e) {} - - weh.prefs.assign(prefs); - weh.prefs.on("",{ - pack: true - },function(newPrefs,oldPrefs) { - Object.assign(prefs,newPrefs); - var prefsStr = Stringify(prefs); - var hash = Hash(prefsStr); - if(hash!=lastHash) { - lastHash = hash; - localStorage.setItem("weh-prefs",prefsStr); - } - }); - -})(); diff --git a/src/background/weh-core.js b/src/background/weh-core.js deleted file mode 100644 index cbabb02..0000000 --- a/src/background/weh-core.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - window.browser = window.browser || window.chrome; - window.weh = {}; - - if(typeof browser == "undefined" && typeof chrome !== "undefined" && chrome.runtime) { - if(/\bOPR\//.test(navigator.userAgent)) - weh.browserType = "opera"; - else - weh.browserType = "chrome"; - } else if(/\bEdge\//.test(navigator.userAgent)) - weh.browserType = "edge"; - else - weh.browserType = "firefox"; - - weh.is = function() { - for(var i=0; i<arguments.length; i++) - if(arguments[i]==weh.browserType) - return true; - return false; - } - -})(); - diff --git a/src/background/weh-inspect.js b/src/background/weh-inspect.js deleted file mode 100644 index 152826d..0000000 --- a/src/background/weh-inspect.js +++ /dev/null @@ -1,118 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -weh.inspect = (function() { - - var inspectorId = null; - - if(!browser.runtime.onMessageExternal) - return null; - - browser.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) { - switch(message.type) { - case "weh#ping": - inspectorId = sender.id; - sendResponse({ - type: "weh#pong", - version: 1, - manifest: browser.runtime.getManifest(), - monitorBgUi: exports.monitorBgUi - }); - break; - case "weh#inspect-bgui": - inspectorId = sender.id; - exports.monitorBgUi = message.status; - break; - case "weh#get-storage": - inspectorId = sender.id; - GetStorageData(function(data) { - exports.send({ - type: "weh#storage", - storage: data - }); - }); - break; - case "weh#get-prefs": - inspectorId = sender.id; - exports.send({ - type: "weh#prefs", - prefs: weh.prefs.getAll(), - specs: weh.prefs.getSpecs() - }); - break; - case "weh#save-prefs": - inspectorId = sender.id; - weh.prefs.assign(message.prefs); - break; - } - }); - - function GetStorageData(callback) { - var count = 1; - var data = {} - function Done() { - if(--count==0) - callback(data); - } - ["localStorage","sessionStorage"].forEach(function(which) { - var storage = window[which]; - if(storage) { - var webStorage = {}; - for(var i=0; i<storage.length; i++) { - var key = storage.key(i); - var value = storage.getItem(key); - try { - webStorage[key] = JSON.parse(value); - } catch(e) { - webStorage[key] = value; - } - } - data[which] = webStorage; - } - }); - ["local","sync","managed"].forEach(function(which) { - var storage = browser.storage && browser.storage[which]; - if(storage) { - count++; - storage.get(null,function(items) { - data[which] = items; - Done(); - }); - } - - }); - Done(); - } - - var exports = { - monitorBgUi: false, - send: function(message) { - if(!inspectorId) - return; - message.timestamp = Date.now(); - browser.runtime.sendMessage(inspectorId,message); - }, - sendBgUi: function(message) { - if(!inspectorId) - return; - message.timestamp = Date.now(); - message.type = "weh#bgui"; - browser.runtime.sendMessage(inspectorId,message,function(response) { - if(!response || response.type!="weh#ok") - exports.monitorBgUi = false; - }); - } - } - - return exports; - -})(); diff --git a/src/background/weh-ui.js b/src/background/weh-ui.js deleted file mode 100644 index 245215b..0000000 --- a/src/background/weh-ui.js +++ /dev/null @@ -1,289 +0,0 @@ -/* - * weh - WebExtensions Help - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -weh.ui = (function() { - - var manifest = browser.runtime.getManifest(); - var panels = {}; - - function Void() {} - - function UpdateOptions(options) { - options.type = options.type || "panel"; - options.contentURL = options.contentURL || null; - options.onShow = options.onShow || Void; - options.onHide = options.onHide || Void; - options.onMessage = options.onMessage || Void; - options.prefs = options.prefs!==false; - return options; - } - - function GotoTab(url, callback) { - var foundTab = false; - browser.tabs.query({}, function (tabs) { - tabs.forEach(function (tab) { - if (tab.url === url) { - browser.tabs.update(tab.id, { - selected: true - }); - browser.windows.update(tab.windowId, { - focused: true - }); - foundTab = true; - } - }); - if (callback) callback(foundTab); - }); - } - - browser.runtime.onConnect.addListener(function(port) { - var m = /^weh:panel:(.*):(.*)/.exec(port.name); - if(!m) - return; - if(m[1]!=browser.runtime.id) - return; - var panelName = m[2]; - var panel = panels[panelName]; - - if(!panel) - panel = panels[panelName] = { - name: panelName, - options: UpdateOptions({}), - } - panel.open = true; - - panel.post = function(message) { - try { - if(panel.open) { - port.postMessage(message); - weh.inspect && weh.inspect.monitorBgUi && weh.inspect.sendBgUi({ - way: "bgui", - panel: panel.name, - message: message - }); - } - } catch(e) { - /* Edge bug: port disconnect event not sent on panel closed */ - panel.open = false; - } - } - - port.onMessage.addListener(function(message) { - !message.wehInspectIgnore && weh.inspect && weh.inspect.monitorBgUi && weh.inspect.sendBgUi({ - way: "uibg", - panel: panel.name, - message: message - }); - switch(message.type) { - case "weh#on": - panel.open = true; - panel.post({ - type: "weh#panel-info", - details: { - panelType: panel.options.type - } - }); - if(panel.options.prefs) { - panel.post({ - type: "weh#prefs-specs", - specs: weh.prefs.getSpecs() - }); - panel.post({ - type: "weh#prefs", - prefs: weh.prefs.getAll() - }); - } - break; - case "weh#prefs": - message.prefs && weh.prefs.assign(message.prefs); - break; - case "weh#get-prefs": - var prefs = {}; - if(typeof message.prefs=="undefined") - prefs = weh.prefs.getAll(); - else { - if(!Array.isArray(message.prefs)) - message.prefs = [message.prefs]; - message.prefs.forEach(function(pref) { - prefs[pref] = weh.prefs[pref]; - }); - } - panel.post({ - type: "weh#prefs", - prefs: prefs - }); - break; - case "weh#get-prefs-specs": - var specs = {}; - var allSpecs = weh.prefs.getSpecs(); - if(typeof message.specs=="undefined") - specs = allSpecs; - else { - if(!Array.isArray(message.specs)) - message.specs = [message.specs]; - message.specs.forEach(function(pref) { - specs[pref] = allSpecs[pref]; - }); - panel.post({ - type: "weh#prefs-specs", - specs: specs - }); - } - break; - case "weh#get-i18n-keys": - panel.post({ - type: "weh#i18n-keys", - i18nKeys: weh.i18nKeys - }); - break; - default: - panel.options.onMessage(message,panel.post,panelName); - } - }); - port.onDisconnect.addListener(function(msg) { - panel.open = false; - panel.options.onHide(panelName); - }); - panel.options.onShow(panel.post,panelName); - }); - - weh.prefs.on("",function(pref,value) { - for(var k in panels) { - var panel = panels[k]; - if(panel.open) { - var prefs = {}; - prefs[pref] = value; - panel.post({ - type: "weh#prefs", - prefs: prefs - }); - } - } - }); - - function UrlAddIds(url,panelName) { - var m = /^([^\?]*)(?:\?(.*))?$/.exec(url); - var params = {}; - if(m[2]) - m[2].split("&").forEach(function(paramExpr) { - var terms = paramExpr.split("="); - params[terms[0]] = decodeURIComponent(terms[1]); - }); - params["panel"] = panelName; - var paramExprs = []; - for(var param in params) - paramExprs.push(param + "=" + encodeURIComponent(params[param])); - return m[1] + "?" + paramExprs.join("&"); - } - - var defaultPopup = manifest.browser_action && manifest.browser_action.default_popup; - if(defaultPopup) { - defaultPopup = UrlAddIds(defaultPopup,"default"); - browser.browserAction.setPopup({ - popup: defaultPopup - }); - } - - return { - - update: function(panelName,options) { - var panel = panels[panelName] || { - name: panelName, - open: false, - options: options, - } - UpdateOptions(panel.options); - panels[panelName] = panel; - return panel; - }, - - open: function(panelName, options) { - options = options || {}; - var panel = panels[panelName] || this.update(panelName,options); - UpdateOptions(panel.options); - - if(panel.options.type=="panel") - browser.windows.getCurrent(function(currentWindow) { - var width = 500; - var cwcParam = { - url: browser.extension.getURL(panel.options.contentURL+"?panel="+panelName), - type: "detached_panel", - left: Math.round((currentWindow.width-width)/2+currentWindow.left), - top: currentWindow.top, - }; - if(weh.is("chrome","opera")) - cwcParam.focused = true; - if(weh.is("edge","opera")) - cwcParam.type = "popup"; - - browser.windows.create(cwcParam,function(window) { - panels[panelName].windowId = window.id; - function OnFocusChanged(focusedWindowId) { - browser.windows.getCurrent(function(currentWindow) { - if(currentWindow.id!=window.id) - try { - browser.windows.remove(window.id,function() {}); - } catch(e) { } - }); - } - function OnRemoved(removedWindowId) { - if(removedWindowId==window.id) { - browser.windows.onFocusChanged.removeListener(OnFocusChanged); - browser.windows.onFocusChanged.removeListener(OnRemoved); - } - } - browser.windows.onFocusChanged.addListener(OnFocusChanged); - browser.windows.onRemoved.addListener(OnRemoved); - }); - }); - else if(panel.options.type=="tab") { - var url = browser.extension.getURL(panel.options.contentURL+"?panel="+panelName); - GotoTab(url,function(foundTab) { - if(!foundTab) - browser.tabs.create({ - url: url, - },function(tabs) {}); - }); - } else if(panel.options.type=="popup") { - console.warn("weh: a popup cannot be opened programmatically"); - } - }, - - close: function(panelName) { - var panel = panels[panelName]; - if(panel && panel.open) - panel.post({ - type: "weh#close" - }); - }, - - post: function() { - var message; - if(typeof arguments[0]=="string") { - var panelName = arguments[0]; - message = arguments[1]; - var panel = panels[panelName]; - if(panel && panel.post) - panel.post(message); - } else { - message = arguments[0]; - for(var panelName in panels) { - var panel = panels[panelName]; - if(panel.post) - panel.post(message); - } - } - }, - - } - -})(); diff --git a/src/common/weh-i18n.js b/src/common/weh-i18n.js deleted file mode 100644 index 945152b..0000000 --- a/src/common/weh-i18n.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * weh - WebExtensions Help - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - var customStrings = {} - - const substRe = new RegExp("^(|.*?[^\\\\])(?:\\$)(.*?[^\\\\])(?:\\$)(.*)"); - - function Load() { - try { - customStrings = JSON.parse(window.localStorage.getItem("wehI18nCustom")) || {}; - } catch(e) { - customStrings = {}; - } - } - Load(); - - function GetMessage(messageName,substitutions) { - if(/-/.test(messageName)) { - var fixedName = messageName.replace(/-/g,"_"); - console.warn("Wrong i18n message name. Should it be",fixedName,"instead of",messageName,"?"); - messageName = fixedName; - } - var custom = customStrings[messageName]; - if(custom && custom.message.length>0) { - if(!Array.isArray(substitutions)) - substitutions = [ substitutions ]; - var substs = {}; - substitutions.forEach(function(val,index) { - substs["$"+(index+1)] = val; - }); - var str = custom.message || ""; - var trans = []; - do { - var m = substRe.exec(str); - if(m) { - trans.push(m[1]); - if(custom.placeholders && - custom.placeholders[m[2]] && - custom.placeholders[m[2]].content && - substs[custom.placeholders[m[2]].content] ) - trans.push(substs[custom.placeholders[m[2]].content]); - else - trans.push("$"+m[2]+"$"); - str = m[3]; - } - } while(m); - trans.push(str); - return trans.join(""); - } - return browser.i18n.getMessage.apply(browser.i18n,arguments); - } - - weh.i18n = { - getMessage: GetMessage, - reload: Load - } - weh._ = weh.i18n.getMessage; - -})(); diff --git a/src/common/weh-prefs.js b/src/common/weh-prefs.js deleted file mode 100644 index 9468892..0000000 --- a/src/common/weh-prefs.js +++ /dev/null @@ -1,226 +0,0 @@ -/* - * weh - WebExtensions Help - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - function Prefs() { - - this.$specs = {}; - this.$values = null; - if(!this.$values) - this.$values = {}; - this.$listeners = {}; - - } - - Prefs.prototype = { - - notify: function(p,val,oldVal,spec) { - var self = this; - var terms = p.split("."); - var keys = []; - for(var i=terms.length;i>=0;i--) - keys.push(terms.slice(0,i).join(".")); - keys.forEach(function(key) { - var listeners = self.$listeners[key]; - if(listeners) - listeners.forEach(function(listener) { - if(listener.specs!=spec) - return; - if(!listener.pack) - try { - listener.callback(p,val,oldVal); - } catch(e) {} - else { - listener.pack[p] = val; - if(typeof listener.old[p]=="undefined") - listener.old[p] = oldVal; - if(listener.timer) - clearTimeout(listener.timer); - listener.timer = setTimeout(function() { - delete listener.timer; - var pack = listener.pack; - var old = listener.old; - listener.pack = {}; - listener.old = {}; - try { - listener.callback(pack,old); - } catch(e) {} - },0); - - } - }); - }); - - }, - - declare: function(specs) { - - var self = this; - - if(!Array.isArray(specs)) - specs = Object.keys(specs).map(function(prefName) { - var spec = specs[prefName]; - spec.name = prefName; - return spec; - }); - - specs.forEach(function(spec) { - - if(forbiddenKeys[spec.name]) - throw new Error("Forbidden prefs key "+spec.name); - - var localeName = spec.name.replace(/[^0-9a-zA-Z_]/g,'_'); - spec.label = spec.label || weh._("weh_prefs_label_"+localeName) || spec.name; - spec.description = spec.description || weh._("weh_prefs_description_"+localeName) || ""; - - if(spec.type == "choice") - spec.choices = (spec.choices || []).map(function(choice) { - if(typeof choice=="object") - return choice; - var localeChoice = choice.replace(/[^0-9a-zA-Z_]/g,'_'); - return { - value: choice, - name: weh._("weh_prefs_"+localeName+"_option_"+localeChoice) || choice - } - }); - - var prevValue = null; - - if(!self.$specs[spec.name]) - (function(p) { - if(typeof self[spec.name]!=="undefined") - prevValue = self[spec.name]; - Object.defineProperty(self, p, { - set: function(val) { - var oldVal = self.$values[p]; - if(oldVal===val) - return; - self.$values[p] = val; - - self.notify(p,val,oldVal,false); - - }, - get: function() { - return self.$values[p]!==undefined ? self.$values[p] : - (self.$specs[p] && self.$specs[p].defaultValue || undefined); - } - }); - })(spec.name); - - var oldSpecs = self.$specs[spec.name]; - self.$specs[spec.name] = spec; - if(prevValue!==null) - self.$values[spec.name] = prevValue; - else if(typeof self.$values[spec.name]=="undefined") - self.$values[spec.name] = spec.defaultValue; - - self.notify(spec.name,spec,oldSpecs,true); - }); - - }, - - on: function() { - var pref = "", options = {}, argIndex = 0; - if(typeof arguments[argIndex]=="string") - pref = arguments[argIndex++]; - if(typeof arguments[argIndex]=="object") - options = arguments[argIndex++]; - var callback = arguments[argIndex]; - var pack = !!options.pack; - - if(!this.$listeners[pref]) - this.$listeners[pref] = []; - var handler = { - callback: callback, - specs: !!options.specs - } - if(pack) { - handler.pack = {}; - handler.old = {}; - } - this.$listeners[pref].push(handler); - }, - - off: function() { - var pref = "", argIndex = 0; - if(typeof arguments[argIndex]=="string") - pref = arguments[argIndex++]; - var callback = arguments[argIndex]; - var listeners = this.$listeners[pref]; - if(!listeners) - return; - for(var i=listeners.length-1;i>=0;i--) - if(!callback || listeners[i]==callback) - listeners.splice(i,1); - }, - - getAll: function() { - return Object.assign({},this.$values); - }, - - getSpecs: function() { - return Object.assign({},this.$specs); - }, - - assign: function(prefs) { - for(var k in prefs) - this[k] = prefs[k]; - }, - - isValid: function(prefName,value) { - var spec = this.$specs[prefName]; - if(!spec) - return undefined; - switch(spec.type) { - case "string": - if(spec.regexp && !new RegExp(spec.regexp).test(value)) - return false; - break; - case "integer": - if(!/^-?[0-9]+$/.test(value)) - return false; - if(isNaN(parseInt(value))) - return false; - case "float": - if(spec.type=="float") { - if(!/^-?[0-9]+(\.[0-9]+)$/.test(value)) - return false; - if(isNaN(parseFloat(value))) - return false; - } - if(typeof spec.minimum!="undefined" && value<spec.minimum) - return false; - if(typeof spec.maximum!="undefined" && value>spec.maximum) - return false; - break; - case "choice": - var ok = false; - (spec.choices || []).forEach((choice) => { - if(value==choice.value) - ok = true; - }); - if(!ok) - return false; - break; - } - return true; - } - } - - weh.prefs = new Prefs(); - - var forbiddenKeys = {}; - for(var k in weh.prefs) - forbiddenKeys[k] = true; - -})(); diff --git a/src/content/weh-ct-angular-prefs.js b/src/content/weh-ct-angular-prefs.js deleted file mode 100644 index 5f697f0..0000000 --- a/src/content/weh-ct-angular-prefs.js +++ /dev/null @@ -1,270 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -var weh_prefs_paramIndex = 1; - -var prefsApp = angular.module('weh.prefs',[]); - -prefsApp.controller('wehParams',["$scope",function($scope) { - $scope.prefs = { - values: weh.prefs.getAll(), - saved: weh.prefs.getAll() - }; - - function UpdateSpecs(specs) { - $scope.prefs.specs = specs; - for(var spec in specs) { - if(typeof $scope.prefs.values[spec]=="undefined") - $scope.prefs.values[spec] = specs[spec].defaultValue; - if(typeof $scope.prefs.saved[spec]=="undefined") - $scope.prefs.saved[spec] = specs[spec].defaultValue; - } - $scope.$apply("prefs"); - } - weh.prefs.on({specs:true,pack:true},UpdateSpecs); - $scope.$on("$destroy",function() { - weh.prefs.off(UpdateSpecs); - }); - - function UpdatePrefs(prefs) { - Object.assign($scope.prefs.values,prefs); - Object.assign($scope.prefs.saved,prefs); - $scope.$apply("prefs") - } - weh.prefs.on({pack:true},UpdatePrefs); - $scope.$on("$destroy",function() { - weh.prefs.off(UpdatePrefs); - }); - - $scope.canCancel = function() { - for(var param in $scope.prefs.values) { - if($scope.prefs.values[param]!=$scope.prefs.saved[param]) - return true; - } - return false; - } - $scope.canDefault = function() { - if(!$scope.prefs.specs) - return false; - for(var param in $scope.prefs.values) { - if($scope.prefs.values[param]!=$scope.prefs.specs[param].defaultValue) - return true; - } - return false; - } - $scope.canSave = function() { - for(var param in $scope.prefs.values) - if(!weh.prefs.isValid(param,$scope.prefs.values[param])) - return false; - for(var param in $scope.prefs.values) { - if($scope.prefs.values[param]!=$scope.prefs.saved[param]) - return true; - } - return false; - } - $scope.handleCancel = function() { - for(var param in $scope.prefs.values) - $scope.prefs.values[param] = $scope.prefs.saved[param]; - } - $scope.handleDefault = function() { - for(var param in $scope.prefs.values) - $scope.prefs.values[param] = $scope.prefs.specs[param].defaultValue; - } - $scope.handleSave = function() { - for(var param in $scope.prefs.values) { - var value = $scope.prefs.values[param]; - weh.prefs[param] = value; - $scope.prefs.saved[param] = value; - } - } -}]); - -prefsApp.directive('wehPrefButtons',function() { - return { - restrict: "E", - scope: true, - replace: true, - template: function(elem,attr) { - return ` - <div class="text-center"> - <br/> - <div class="btn-toolbar" ng-style="{display: 'inline-block'}"> - <button type="button" - ng-click="handleCancel()" - ng-class="{btn:1, 'btn-default':1, disabled: !canCancel()}"> - {{_("cancel")}} - </button> - <button type="button" - ng-click="handleDefault()" - ng-class="{btn:1, 'btn-warning':1, disabled: !canDefault()}"> - {{_("default")}} - </button> - <button type="button" - ng-click="handleSave()" - ng-class="{btn:1, 'btn-primary':1, disabled: !canSave()}"> - {{_("save")}} - </button> - </div> - </div> - ` - }, - link: function(scope,element,attrs) { - } - } -}); - -prefsApp.directive('wehParamSet',function() { - return { - restrict: "E", - scope: true, - replace: true, - template: function(elem,attr) { - return ` - <form class="form-horizontal" role="form"> - <weh-param - ng-repeat='param in params' - param="{{param}}" - > - </weh-param> - </form> - ` - }, - link: function(scope,element,attrs) { - scope.params = attrs.params.split(","); - } - } -}); - -prefsApp.directive('wehParam',function() { - return { - restrict: "E", - scope: true, - replace: true, - require: "?^ngController", - template: ` - <div ng-class="formGroupClass()" ng-show="spec"> - <label class="col-sm-4 control-label" for="weh-param-{{this.paramIndex}}"> - {{spec.label}}</label> - <div class="col-sm-8"> - - <input - ng-if="['string','integer','float'].indexOf(spec.type)>=0" - ng-model="prefs.values[prefName]" - class="form-control" - maxLength="{{spec.maxLength || -1}}" - id="weh-param-{{paramIndex}}" - type="text" - ng-style="{ width: getInputWidth() }"/> - - <input - ng-if="spec.type=='boolean'" - class="form-control" - ng-model="prefs.values[prefName]" - id="weh-param-{{paramIndex}}" - type="checkbox" - ng-style="{width:'34px'}" - /> - - <select - ng-if="spec.type=='choice' && spec.choices.length>0" - ng-model="prefs.values[prefName]" - class="form-control" - id="weh-param-{{paramIndex}}" - ng-style="{ width: getInputWidth() }"> - <option - ng-repeat="option in spec.choices" - value="{{option.value}}"> - {{ option.name }} - </option> - </select> - - <div class="help-block" ng-show="spec.description"> - {{ spec.description }} - </div> - </div> - </div> - `, - link: function(scope,element,attrs,ctrl) { - scope.paramIndex = weh_prefs_paramIndex++; - scope.prefName = attrs.param; - scope.spec = {}; - function UpdateSpec(param,spec) { - scope.spec = spec; - scope.$apply("spec") - } - weh.prefs.on(attrs.param,{specs:true},UpdateSpec); - scope.$on("$destroy",function() { - weh.prefs.off(attrs.params,UpdateSpec); - }); - scope.formGroupClass = function() { - var value = scope.prefs.values[scope.prefName]; - var classes = ["form-group"]; - if(!scope.spec || !weh.prefs.isValid(scope.prefName,value)) - classes.push("has-error"); - else if(value != scope.prefs.saved[scope.prefName]) - classes.push("has-success"); - else if(value != scope.spec.defaultValue) - classes.push("has-warning"); - - return classes.join(" "); - } - scope.getInputWidth = function() { - switch(scope.spec.type) { - case "string": - return scope.spec.width || "20em"; - case "integer": - case "float": - return scope.spec.width || "8em"; - case "boolean": - return "34px"; - case "choice": - return scope.spec.width || "12em"; - } - } - - } - } -}); - -prefsApp.directive('wehVersion',function() { - return { - restrict: "E", - scope: true, - replace: true, - template: function(elem,attr) { - return ` - <form class="form-horizontal"> - <div class="form-group"> - <label class="col-sm-4 control-label"> - {{_("version")}} - </label> - <div class="col-sm-8"> - <p class="form-control-static">{{versionName}}</p> - </div> - </div> - </form> - ` - }, - link: function(scope,element,attrs) { - var manifest = browser.runtime.getManifest(); - var version = manifest.version; - scope.versionName = manifest.version_name; - if(scope.versionName) - if(version && version!=scope.versionName) { - scope.versionName += " (" + version + ")"; - } - else - scope.versionName = version; - } - } -}); - diff --git a/src/content/weh-ct-angular-translate.js b/src/content/weh-ct-angular-translate.js deleted file mode 100644 index 90135bc..0000000 --- a/src/content/weh-ct-angular-translate.js +++ /dev/null @@ -1,155 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -var transApp = angular.module('weh.translation',[]); - -transApp.directive('wehTranslationItem',function() { - return { - restrict: "E", - scope: true, - replace: true, - template: ` - <div ng-class="formGroupClass()"> - <label class="col-sm-4 control-label" for="weh-{{key}}"> - {{key}}</label> - <div class="col-sm-8"> - <input class="form-control" - ng-model="custom[key].message" - type="text" - id="weh-{{key}}" - /> - <div class="help-block">{{ original[key] }}</div> - </div> - </div> - `, - link: function(scope,element,attrs) { - scope.key = attrs.key; - scope.formGroupClass = function() { - var classes = ["form-group"]; - if((scope.custom[scope.key].message || "") !== - ((scope.customOrg[scope.key] && scope.customOrg[scope.key].message) || "")) - classes.push("has-success"); - return classes.join(" "); - } - } - } -}); - -transApp.directive('wehTranslation',function() { - return { - restrict: "E", - scope: true, - replace: true, - template: function(elem,attr) { - return ` - <div> - <form class="form-horizontal" - role="form"> - - <div - class="form-group" - ng-style="{'background-color':'#eee',padding:'8px'}"> - <div class="col-sm-4"></div> - <div class="col-sm-8"> - <input class="form-control" - ng-model="search" - placeholder="Search..." - type="text" - /> - </div> - </div> - - <weh-translation-item - ng-repeat="key in keys | orderBy | filter:filterSearch()" - key="{{key}}" - custom="{{custom[key]}}" - original="{{original[key]}}" - changed="{{(custom[key] && custom[key].message)!== (customOrg[key] && customOrg[key].message)}}" - /> - - </form> - <div class="text-center"> - <br/> - <div class="btn-toolbar" ng-style="{display:'inline-block'}"> - <button type="button" - ng-click="handleSave()" - ng-class="saveButtonClass()"> - Save - </button> - </div> - </div> - </div> - ` - }, - link: function(scope,element,attrs) { - var custom = {}; - try { - custom = JSON.parse(window.localStorage.getItem("wehI18nCustom")) || {}; - } catch(e) {} - Object.assign(scope,{ - keys: [], - strings: {}, - original: {}, - custom: custom, - customOrg: JSON.parse(JSON.stringify(custom)), - search: "" - }); - scope.saveButtonClass = function() { - var classes = ['btn', 'btn-primary']; - var changed = false; - for(var key in scope.custom) - if((scope.custom[key].message || "") !== - ((scope.customOrg[key] && scope.customOrg[key].message) || "")) { - changed = true; - break; - } - if(!changed) - classes.push("disabled"); - return classes.join(" "); - } - - function UpdateKeys(message) { - scope.keys = message.i18nKeys; - scope.keys.forEach(function(key) { - scope.original[key] = browser.i18n.getMessage(key); - }); - scope.$apply("keys"); - } - weh.on("weh#i18n-keys",UpdateKeys); - scope.$on("$destroy",function() { - weh.off("weh#i18n-keys",UpdateKeys); - }); - weh.post({type:"weh#get-i18n-keys"}); - - scope.filterSearch = function() { - return function(key) { - if(scope.search.length==0) - return true; - if(key.indexOf(scope.search)>=0) - return true; - if(scope.customOrg[key] && - scope.customOrg[key].message.indexOf(scope.search)>=0) - return true; - if(scope.original[key].indexOf(scope.search)>=0) - return true; - return false; - } - } - - scope.handleSave = function() { - window.localStorage.setItem("wehI18nCustom", - JSON.stringify(scope.custom)); - scope.customOrg = Object.assign({},scope.custom); - } - } - } -}); diff --git a/src/content/weh-ct-jquery-prefs.js b/src/content/weh-ct-jquery-prefs.js deleted file mode 100644 index 2b3d512..0000000 --- a/src/content/weh-ct-jquery-prefs.js +++ /dev/null @@ -1,383 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function($) { - - $.fn.wehParams = function() { - this.each( function() { - - var jElem = $(this); - - jElem.append($("<div/>").addClass("weh-buttons").wehPrefButtons()); - - var widgets = {}; - var prefs = { - values: weh.prefs.getAll() - } - function SendPrefs(param) { - for(var key in widgets) { - if(param && param!=key) - continue; - var widget = widgets[key]; - if(typeof prefs.values[key]!="undefined") { - widget.wehParam("value",prefs.values[key]); - } - } - UpdateButtons(); - } - function UpdateSpecs(specs) { - for(var key in specs) { - let spec = specs[key]; - var widget = widgets[key]; - if(widget) - widget.wehParam("spec",spec); - } - UpdateButtons(); - } - weh.prefs.on({specs:true,pack:true},UpdateSpecs); - - function UpdatePrefs(prefs2) { - Object.assign(prefs.values,prefs2); - SendPrefs(); - } - weh.prefs.on({pack:true},UpdatePrefs); - - jElem.on("weh-param",(event,extra)=>{ - widgets[extra.param] = extra.widget; - SendPrefs(extra.param); - }); - - function AllWidgets() { - var params = $(); - Object.keys(widgets).forEach((p)=>{ - params = params.add(widgets[p]); - }); - return params; - } - - function UpdateButtons() { - var info = AllWidgets().wehParam("info"); - var states = { - cancel: info.invalid || info.changed, - "default": info.invalid || info.notDefault, - save: !info.invalid && info.changed, - } - jElem.find(".weh-buttons").wehPrefButtons("setState",states); - } - - jElem.on("weh-info",UpdateButtons); - - jElem.on("weh-action",(event,action)=>{ - switch(action) { - case "save": - var values = {}; - AllWidgets().wehParam("get",values); - for(var param in values) - weh.prefs[param] = values[param]; - AllWidgets().wehParam("set",values); - UpdateButtons(); - break; - case "default": - var values = {}; - var specs = weh.prefs.getSpecs(); - for(var param in specs) - values[param] = specs[param].defaultValue; - AllWidgets().wehParam("set",values); - UpdateButtons(); - break; - case "cancel": - var values = weh.prefs.getAll(); - AllWidgets().wehParam("set",values); - UpdateButtons(); - break; - } - }); - - jElem.find("[data-weh-param-set]").wehParamSet(); - - }); - return this; - } - - $.fn.wehParamSet = function() { - this.each( function() { - var children = $(this).html(); - $(this).html(` - <form class="weh-paramset-form form-horizontal" role="form"> - ${children} - </form> - `); - var form = $(this).find("form.weh-paramset-form"); - var params = $(this).attr("params") || ""; - params.split(",").forEach((paramName)=>{ - var param = $("<div/>"); - form.append(param); - param.wehParam("new",paramName); - }); - }); - return this; - } - - $.fn.wehPrefButtons = function() { - var args = arguments; - var operation = args[0] || "new"; - this.each( function() { - var jElem = $(this); - switch(operation) { - case "new": - jElem.html(` - <div class="text-center"> - <br/> - <div class="btn-toolbar" style="display: inline-block"> - <button type="button" - action="cancel" - class="btn btn-default disabled" data-weh-i18n="cancel"> - </button> - <button type="button" - action="default" - class="btn btn-warning disabled" data-weh-i18n="default"> - </button> - <button type="button" - action="save" - class="btn btn-primary disabled" data-weh-i18n="save"> - </button> - </div> - </div> - `); - jElem.find("[data-weh-i18n]").wehI18n(); - jElem.find("button").bind("click",(event)=>{ - jElem.trigger("weh-action",$(event.target).attr("action")); - }); - break; - case "setState": - var states = args[1]; - for(var action in states) { - var button = jElem.find(`button[action=${action}]`); - if(states[action]) - button.removeClass("disabled"); - else - button.addClass("disabled"); - } - break; - } - }); - return this; - } - - var weh_prefs_paramIndex = 1; - - $.fn.wehParam = function(operation) { - var args = arguments; - var changed = false; - var invalid = false; - var notDefault = false; - this.each( function() { - var jElem = $(this); - var context = jElem.data("context"); - - function Get() { - if(!context.spec) - return undefined; - if(context.spec.type=="boolean") - return context.input.prop("checked"); - else - return context.input.val(); - } - - function Set(value) { - if(!context.spec) - return; - if(context.spec.type=="boolean") - return context.input.prop("checked",value); - else - return context.input.val(value); - } - - function IsChanged() { - var value = Get(); - if(typeof context.value!="undefined" && context.value != value) - return true; - if(context.spec && typeof context.value=="undefined" && context.spec.defaultValue != value) - return true; - return false; - } - - function UpdateClass() { - context.group.removeClass("has-success has-warning has-error"); - var value = Get(); - if(!weh.prefs.isValid(context.paramName,value)) - return context.group.addClass("has-error"); - if(IsChanged()) - return context.group.addClass("has-success"); - if(value != context.spec.defaultValue) - return context.group.addClass("has-warning"); - } - - switch(operation) { - case "new": - context = { - paramName: args[1] - } - jElem.data("context",context); - jElem.trigger("weh-param",{ - widget: jElem, - param: context.paramName - }); - break; - - case "spec": - context.spec = args[1]; - var paramIndex = weh_prefs_paramIndex++; - function BuildInput() { - switch(context.spec.type) { - case "string": - case "integer": - case "float": - return ` - <input - class="weh-input form-control" - maxLength="${context.spec.maxLength || -1}" - id="weh-param-${paramIndex}" - type="text" - /> - `; - case "boolean": - return ` - <input - class="weh-input form-control" - id="weh-param-${paramIndex}" - type="checkbox" - style="width:34px" - /> - `; - case "choice": - var options = context.spec.choices.map((option)=>{ - return ` - <option - ng-repeat="option in spec.choices" - value="${option.value}"> - ${option.name} - </option> - `; - }); - return ` - <select - ng-model="prefs.values[prefName]" - class="weh-input form-control" - id="weh-param-{{paramIndex}}" - ng-style="{ width: getInputWidth() }"> - ${options.join("\n")} - </select> - `; - } - } - jElem.html(` - <div class="weh-group form-group"> - <label class="col-sm-4 control-label" for="weh-param-${paramIndex}"> - ${context.spec.label}</label> - <div class="col-sm-8"> - ${BuildInput()} - <div class="help-block" ng-show="spec.description"> - ${context.spec.description} - </div> - </div> - </div> - `); - context.group = jElem.find(".weh-group"); - context.input = jElem.find(".weh-input"); - function GetInputWidth() { - switch(context.spec.type) { - case "string": - return context.spec.width || "20em"; - case "integer": - case "float": - return context.spec.width || "8em"; - case "boolean": - return "34px"; - case "choice": - return context.spec.width || "12em"; - } - } - context.input.width(GetInputWidth()); - Set(context.spec.defaultValue); - context.input.bind("change keyup",()=>{ - UpdateClass(); - jElem.trigger("weh-info"); - }); - break; - - case "value": - context.value = args[1]; - Set(context.value); - UpdateClass(); - break; - - case "info": - changed = changed || IsChanged(); - invalid = invalid || (!weh.prefs.isValid(context.paramName,Get())); - notDefault = notDefault || (context.spec && Get()!=context.spec.defaultValue); - break; - - case "get": - var values = args[1]; - values[context.paramName] = Get(); - break; - - case "set": - var values = args[1]; - if(typeof values[context.paramName!="undefined"]) { - Set(values[context.paramName]); - UpdateClass(); - } - break; - } - }); - if(operation=="info") - return { - changed: changed, - invalid: invalid, - notDefault: notDefault - } - return this; - } - - $.fn.wehVersion = function() { - this.each( function() { - var manifest = browser.runtime.getManifest(); - var version = manifest.version; - var versionName = manifest.version_name; - if(versionName) - if(version && version!=versionName) { - versionName += " (" + version + ")"; - } - else - versionName = version; - $(this).html(` - <form class="form-horizontal"> - <div class="form-group"> - <label class="col-sm-4 control-label" data-weh-i18n="version"> - </label> - <div class="col-sm-8"> - <p class="form-control-static">${versionName}</p> - </div> - </div> - </form> - `); - $(this).find("[data-weh-i18n]").wehI18n(); - }); - return this; - } - - - -}(jQuery)); - diff --git a/src/content/weh-ct-jquery-translate.js b/src/content/weh-ct-jquery-translate.js deleted file mode 100644 index 2afe3bf..0000000 --- a/src/content/weh-ct-jquery-translate.js +++ /dev/null @@ -1,177 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function($) { - - $.fn.wehTranslationItem = function() { - var args = arguments; - var operation = args[0] || "new"; - var changed = false; - this.each( function() { - var key = $(this).attr("key"); - var original = $(this).attr("original"); - var custom = $(this).data("custom"); - var customOrg = $(this).data("customOrg"); - if(operation=="new") - $(this).html(` - <div class="form-group"> - <label class="col-sm-4 control-label" for="weh-${key}"> - ${key}</label> - <div class="col-sm-8"> - <input class="form-control" - type="text" - id="weh-${key}" - /> - <div class="help-block">${original}</div> - </div> - </div> - `); - var group = $(this).find(".form-group"); - var input = $(this).find("input"); - if(operation=="new") { - input.val(custom && custom.message || ""); - input.bind("change keyup",() => { - var value = input.val(); - if(value!==(customOrg.message || "")) - group.addClass("has-success"); - else - group.removeClass("has-success"); - $.event.trigger({ - type: "wehChange", - message: key, - time: new Date() - }); - }); - } - changed = changed || (input.val()!==(customOrg && customOrg.message || "")); - if(operation=="save") { - var val = input.val(); - if(val.length>0) { - args[1][key] = val; - customOrg.message = val; - group.removeClass("has-success"); - } - } - }); - if(operation=="isChanged") - return changed; - return this; - } - - $.fn.wehTranslation = function() { - this.each( function() { - var transRoot = $(this); - var keys = {} - transRoot.html(` - <div> - <form class="form-horizontal" - role="form"> - - <div - class="form-group" - style="background-color:#eee;padding:8px"> - <div class="col-sm-4"></div> - <div class="col-sm-8"> - <input class="form-control" - id="search" - placeholder="Search..." - type="text" - /> - </div> - </div> - - <div class="weh-translation-item-model" style="display:none"></div> - - </form> - <div class="text-center"> - <br/> - <div class="btn-toolbar" style="display:inline-block"> - <button type="button" - id="save" - class="btn btn-primary disabled"> - Save - </button> - </div> - </div> - </div> - `); - var custom = JSON.parse(window.localStorage.getItem("wehI18nCustom")) || {}; - function Update() { - transRoot.find(".weh-translation-item").remove(); - var model = transRoot.find(".weh-translation-item-model"); - keys.forEach((key) => { - model.parent().append( - model.clone() - .removeClass("weh-translation-item-model") - .addClass("weh-translation-item") - .attr("key",key) - .attr("original",browser.i18n.getMessage(key)) - .data("custom", custom[key] || {}) - .data("customOrg", custom[key] || {}) - .show() - .wehTranslationItem() - ); - }); - } - function UpdateKeys(message) { - keys = message.i18nKeys; - Update(); - } - var search = $("#search"); - function UpdateSearch() { - var query = search.val(); - keys.forEach((key) => { - var elem = $(`.weh-translation-item[key=${key}]`); - if(elem.length==0) - return; - if(query.length==0) - return elem.show(); - if(key.indexOf(query)>=0) - return elem.show(); - var customOrg = elem.data("customOrg"); - if(customOrg.message && custom.message.indexOf(query)>=0) - return elem.show(); - if(elem.attr("original").indexOf(query)>=0) - return elem.show(); - elem.hide(); - }); - } - search.bind("change keyup",UpdateSearch); - var save = $("#save"); - save.bind("click",()=>{ - var transMap = {} - transRoot.find(".weh-translation-item").wehTranslationItem("save",transMap); - var newCustom = {}; - for(var key in transMap) { - newCustom[key] = custom[key] || {}; - newCustom[key].message = transMap[key]; - } - custom = newCustom; - window.localStorage.setItem("wehI18nCustom", - JSON.stringify(custom)); - save.addClass("disabled"); - }); - $(document).on("wehChange",()=>{ - var changed = transRoot.find(".weh-translation-item").wehTranslationItem("isChanged"); - if(changed) - save.removeClass("disabled"); - else - save.addClass("disabled"); - }); - weh.on("weh#i18n-keys",UpdateKeys); - weh.post({type:"weh#get-i18n-keys"}); - }); - - } - -}(jQuery)); - diff --git a/src/content/weh-ct-prefs.js b/src/content/weh-ct-prefs.js deleted file mode 100644 index e31cdf1..0000000 --- a/src/content/weh-ct-prefs.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - weh.prefs.on({pack: true},function(prefs) { - weh.post({ - type: "weh#prefs", - prefs: prefs - }); - }); - - weh.on(function(message) { - - switch(message.type) { - case "weh#prefs": - weh.prefs.assign(message.prefs); - break; - case "weh#prefs-specs": - weh.prefs.declare(message.specs); - break; - } - - }); - -})(); diff --git a/src/content/weh-ct-react-prefs.jsx b/src/content/weh-ct-react-prefs.jsx deleted file mode 100644 index 8dffd3d..0000000 --- a/src/content/weh-ct-react-prefs.jsx +++ /dev/null @@ -1,440 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -class WehParams extends React.Component { - constructor(props) { - super(props); - this.handleCancel = this.handleCancel.bind(this); - this.handleDefault = this.handleDefault.bind(this); - this.handleSave = this.handleSave.bind(this); - this.onPrefs = this.onPrefs.bind(this); - this.onPrefsSpecs = this.onPrefsSpecs.bind(this); - this.state = { - canCancel: false, - canDefault: false, - canSave: false - } - this.specs = {}; - this.originalValues = {}; - this.invalid = {}; - this.values = {}; - } - - componentDidMount() { - weh.prefs.on({pack:true},this.onPrefs); - weh.prefs.on({pack:true,specs:true},this.onPrefsSpecs); - Object.assign(this.originalValues,weh.prefs.getAll()); - Object.assign(this.values,weh.prefs.getAll()); - Object.assign(this.specs,weh.prefs.getSpecs()); - var prefs = {}; - Object.keys(this.values).forEach(function(prefName) { - prefs[prefName] = 1; - }) - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefs - }); - this.updateCan(); - } - - componentWillUnmoun() { - weh.prefs.off(this.onPrefs); - weh.prefs.off(this.onPrefsSpecs); - } - - onPrefs() { - this.originalValues = weh.prefs.getAll(); - var newPrefs = weh.prefs.getAll(); - var prefsKeys = {}; - for(var k in newPrefs) { - prefsKeys[k] = 1; - delete this.invalid[k]; - this.values[k] = this.originalValues[k]; - } - this.values = newPrefs; - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefsKeys - }); - this.updateCan(); - } - - onPrefsSpecs() { - var newSpecs = weh.prefs.getSpecs(); - var prefsKeys = {}; - for(var k in newSpecs) { - prefsKeys[k] = 1; - delete this.invalid[k]; - if(typeof this.originalValues[k]=="undefined") - this.originalValues[k] = newSpecs[k].defaultValue; - this.values[k] = this.originalValues[k]; - } - this.specs = newSpecs; - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefsKeys - }); - } - - getChildContext() { - return { - setPref: this.setPref.bind(this), - invalidPref: this.invalidPref.bind(this), - getPref: this.getPref.bind(this), - getOriginalPref: this.getOriginalPref.bind(this), - getSpec: this.getSpec.bind(this), - }; - } - - setPref(name,value) { - if(this.values[name]===value) - return; - this.values[name] = value; - delete this.invalid[name]; - var prefs = {}; - prefs[name] = 1; - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefs - }); - this.updateCan(); - } - - invalidPref(name) { - delete this.values[name]; - this.invalid[name] = 1; - this.updateCan(); - } - - getPref(name) { - return this.values[name]; - } - - getOriginalPref(name) { - return this.originalValues[name]; - } - - getSpec(name) { - return this.specs[name]; - } - - handleCancel() { - var prefs = {}; - for(var k in this.values) - if(this.values[k] !== this.originalValues[k]) - prefs[k] = 1; - Object.assign(this.values,prefs,weh.prefs); - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefs - }); - this.updateCan(); - } - - handleDefault() { - var prefs = {}; - for(var k in this.values) - if(this.specs[k] && this.specs[k].defaultValue !== this.values[k]) { - prefs[k] = 1; - this.values[k] = this.specs[k].defaultValue; - } - weh.postLocal({ - type: "weh#reload-prefs", - prefs: prefs - }); - this.updateCan(); - } - - handleSave() { - weh.prefs.assign(this.values); - } - - updateCan() { - var state = { - canCancel: false, - canDefault: false, - canSave: false - } - for(var k in this.values) { - if(this.originalValues[k] !== this.values[k]) { - state.canCancel = true; - state.canSave = true; - } - if(this.specs[k] && this.values[k] !== this.specs[k].defaultValue) { - state.canDefault = true; - } - } - if(Object.keys(this.invalid).length>0) - state.canSave = false; - this.setState(state); - } - - render() { - var self = this; - var children = React.Children.map(this.props.children, - (child) => React.cloneElement(child,{ - handlePref: self.handlePref - }) - ) - return ( - <div> - { children } - <div className="text-center"> - <br/> - <div className="btn-toolbar" style={{display:"inline-block"}}> - <button type="button" - onClick={this.handleCancel} - className={"btn btn-default " + (this.state.canCancel ? "" : "disabled") } >{weh._("cancel")}</button> - <button type="button" - onClick={this.handleDefault} - className={"btn btn-warning " + (this.state.canDefault ? "" : "disabled") }>{weh._("default")}</button> - <button type="button" - onClick={this.handleSave} - className={"btn btn-primary " + (this.state.canSave ? "" : "disabled") }>{weh._("save")}</button> - </div> - </div> - </div> - ) - } -} - -WehParams.childContextTypes = { - setPref: React.PropTypes.func, - invalidPref: React.PropTypes.func, - getPref: React.PropTypes.func, - getOriginalPref: React.PropTypes.func, - getSpec: React.PropTypes.func -}; - - -class WehParamSet extends React.Component { - constructor(props) { - super(props); - } - - render() { - var self = this; - var prefElements = this.props.wehPrefs.map((pref) => - React.cloneElement(React.Children.only(self.props.children),{ - key: pref, - wehPref: pref, - }) - ); - return ( - <form className="form-horizontal" role="form"> - { prefElements } - </form> - ) - } -} - -var wehParamIndex = 1; -class WehParam extends React.Component { - constructor(props) { - super(props); - this.prefName = props.wehPref; - this.handleChange=this.handleChange.bind(this); - weh.react.attach(this,this.onWehMessage); - this.paramIndex = wehParamIndex++; - this.originalValue = null; - this.state = { - spec: null, - value: null - }; - } - - update() { - var spec = this.context.getSpec(this.prefName); - var value = this.context.getPref(this.prefName); - if(typeof value=="undefined" && spec) - value = spec.defaultValue; - this.originalValue = this.context.getOriginalPref(this.prefName); - this.setState({ - spec: spec, - value: value - }); - if(spec) - this.notify(this.prefName,value); - } - - componentDidMount() { - this.update(); - } - - - onWehMessage(message) { - switch(message.type) { - case "weh#reload-prefs": - if(message.prefs[this.prefName]) - this.update(); - break; - } - } - - getInputWidth() { - switch(this.state.spec.type) { - case "string": - return this.state.spec.width || "20em"; - case "integer": - case "float": - return this.state.spec.width || "8em"; - case "boolean": - return "34px"; - case "choice": - return this.state.spec.width || "12em"; - } - } - - notify(param,value) { - if(value===null || typeof value=="undefined") - return; - if(this.isValid(value)) - this.context.setPref(param,value); - else - this.context.invalidPref(param); - } - - handleChange(event) { - var value = this.state.spec.type=="boolean" ? event.target.checked : event.target.value; - this.setState({ - value: value - }); - if(this.state.spec.type=="integer") - value = parseInt(value); - if(this.state.spec.type=="float") - value = parseFloat(value); - this.notify(this.prefName,value,this.state.spec); - } - - isValid(value) { - var spec = this.state.spec; - if(arguments.length==0) - value = this.state.value; - if(!spec) - return false; - return weh.prefs.isValid(this.prefName,value); - } - - formGroupClass() { - if(!this.isValid()) - return "has-error"; - else if(this.state.value != this.originalValue) - return "has-success"; - else if(this.state.value != this.state.spec.defaultValue) - return "has-warning"; - else - return ""; - } - - renderInput() { - switch(this.state.spec.type) { - case "string": - case "integer": - case "float": - return <input className="form-control" - value={this.state.value} - onChange={this.handleChange} - maxLength={this.state.spec.maxLength || -1} - id={"weh-param-"+this.paramIndex} - type="text" - style={{ width: this.getInputWidth() }}/> - case "boolean": - return <div> - <input className="form-control" - checked={this.state.value} - onChange={this.handleChange} - id={"weh-param-"+this.paramIndex} - type="checkbox" - style={{width:"34px"}} - /> - </div> - case "choice": - var options = (this.state.spec.choices || []).map( - (option) => <option key={option.value} value={option.value}>{option.name}</option> - ); - if(options.length==0) - return false; - return <select - value={this.state.value} - onChange={this.handleChange} - className="form-control" - id={"weh-param-"+this.paramIndex} - style={{ width: this.getInputWidth() }}> - {options} - </select> - - } - } - - render() { - if(!this.state.spec || this.state.value===null || typeof this.state.value=="undefined") - return false; - return ( - <div className={"form-group " + this.formGroupClass() }> - <label className="col-sm-4 control-label" htmlFor={"weh-param-"+this.paramIndex}> - {this.state.spec.label}</label> - <div className="col-sm-8"> - {this.renderInput()} - { this.state.spec.description && ( - <div className="help-block">{ this.state.spec.description }</div> - )} - </div> - </div> - ) - } -} - -WehParam.contextTypes = { - setPref: React.PropTypes.func, - invalidPref: React.PropTypes.func, - getPref: React.PropTypes.func, - getOriginalPref: React.PropTypes.func, - getSpec: React.PropTypes.func -}; - -class WehVersion extends React.Component { - - versionName() { - var manifest = browser.runtime.getManifest(); - var version = manifest.version; - var version_name = manifest.version_name; - if(version_name) - if(version && version!=version_name) - return version_name + " (" + version + ")"; - else - return version_name; - else - return version; - } - - render() { - return ( - <form className="form-horizontal"> - <div className="form-group"> - <label className="col-sm-4 control-label"> - {weh._("version")}</label> - <div className="col-sm-8"> - <p className="form-control-static">{this.versionName()}</p> - </div> - </div> - </form> - ) - } -} - - -Object.assign(window,{ - WehParams: WehParams, - WehParamSet: WehParamSet, - WehParam: WehParam, - WehVersion: WehVersion -}); diff --git a/src/content/weh-ct-react-translate.jsx b/src/content/weh-ct-react-translate.jsx deleted file mode 100644 index 54af1de..0000000 --- a/src/content/weh-ct-react-translate.jsx +++ /dev/null @@ -1,197 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - - -class WehTranslationItem extends React.Component { - - constructor(props) { - super(props); - this.handleChange=this.handleChange.bind(this); - } - - formGroupClass() { - if(this.props.changed) - return "has-success"; - if(this.props.custom.message!=="") - return "has-warning"; - return ""; - } - - handleChange(event) { - event.stopPropagation(); - var args = {}; - var str = event.target.value; - const substRe = new RegExp("^(?:|.*?[^\\\\])(?:\\$)arg([1-9])(?:\\$)(.*)"); - do { - var m = substRe.exec(str); - if(m) { - args[m[1]] = 1; - str = m[2]; - } - } while(m); - var item = { - message: event.target.value - } - if(Object.keys(args).length>0) { - item.placeholders = {}; - Object.keys(args).forEach(function(arg) { - item.placeholders["arg"+arg] = { - content: "$"+arg - } - }); - } - this.props.change(this.props.tkey,item); - } - - render() { - return ( - <div className={"form-group " + this.formGroupClass() }> - <label className="col-sm-4 control-label" htmlFor={"weh-"+this.props.tkey}> - {this.props.tkey}</label> - <div className="col-sm-8"> - <input className="form-control" - onChange={this.handleChange} - value={this.props.custom.message} - type="text" - id={"weh-"+this.props.tkey} - /> - <div className="help-block">{ this.props.original }</div> - </div> - </div> - ) - } -} - -class WehTranslation extends React.Component { - constructor(props) { - super(props); - this.handleSave = this.handleSave.bind(this); - this.handleChange=this.handleChange.bind(this); - this.handleSearchChange=this.handleSearchChange.bind(this); - var custom = {}; - try { - custom = JSON.parse(window.localStorage.getItem("wehI18nCustom")) || {}; - } catch(e) {} - this.state = { - keys: [], - custom: custom, - customOrg: JSON.parse(JSON.stringify(custom)), - search: "" - } - weh.react.attach(this,this.onWehMessage); - } - - componentDidMount() { - weh.post({type:"weh#get-i18n-keys"}); - } - - onWehMessage(message) { - switch(message.type) { - case "weh#i18n-keys": - this.setState({keys:message.i18nKeys}); - break; - } - } - - handleSave() { - window.localStorage.setItem("wehI18nCustom",JSON.stringify(this.state.custom)); - this.setState((state0) => { - return { - customOrg: JSON.parse(JSON.stringify(state0.custom)) - } - }); - } - - handleChange(key,value) { - this.setState((state0) => { - state0.custom[key] = value; - return { - custom: state0.custom - } - }); - } - - handleSearchChange(event) { - this.setState({ - search: event.target.value - }) - } - - saveButtonClass() { - for(var key in this.state.custom) { - if((this.state.custom[key].message || "") !== - ((this.state.customOrg[key] && this.state.customOrg[key].message) || "")) - return ""; - } - return "disabled"; - } - - render() { - var self = this; - var maxArgs = 4; // should be 9 but this is a bug in Edge - var argPlaceHolders = new Array(maxArgs).fill("").map((v,i) => {return "$arg"+(i+1)+"$"}); - var originals = {}; - this.state.keys.forEach((key) => { - originals[key] = browser.i18n.getMessage(key,argPlaceHolders); - }); - var items = this.state.keys.filter((key) => { - return self.state.search.length==0 || - key.indexOf(self.state.search)>=0 || - (self.state.customOrg[key] && - self.state.customOrg[key].message.indexOf(self.state.search)>=0) || - originals[key].indexOf(self.state.search)>=0; - }).sort().map((key) => { - var original = originals[key]; - var custom = self.state.custom[key] || { message:"" }; - return ( - <WehTranslationItem - key={key} - tkey={key} - custom={custom} - original={original} - changed={(this.state.custom[key] && this.state.custom[key].message)!== - (this.state.customOrg[key] && this.state.customOrg[key].message)} - change={this.handleChange} - /> - ) - }); - return ( - <div> - <form className="form-horizontal" - onChange={this.handleChange} - role="form"> - - <div className="form-group" style={{backgroundColor:"#eee",padding:"8px"}}> - <div className="col-sm-4"></div> - <div className="col-sm-8"> - <input className="form-control" - onChange={this.handleSearchChange} - placeholder="Search..." - type="text" - /> - </div> - </div> - - { items } - </form> - <div className="text-center"> - <br/> - <div className="btn-toolbar" style={{display:"inline-block"}}> - <button type="button" - onClick={this.handleSave} - className={"btn btn-primary "+this.saveButtonClass()}>Save</button> - </div> - </div> - </div> - ) - } -} diff --git a/src/content/weh-ct-react.jsx b/src/content/weh-ct-react.jsx deleted file mode 100644 index 489ec26..0000000 --- a/src/content/weh-ct-react.jsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - function wehReactAttach(component,callback) { - var previous = { - componentDidMount: component.componentDidMount, - componentWillUnmount: component.componentWillUnmount - } - var receiveCallback = callback.bind(component); - component.componentDidMount = function() { - weh.on(receiveCallback); - if(previous.componentDidMount) - previous.componentDidMount.apply(component,arguments); - } - component.componentWillUnmount = function() { - weh.off(receiveCallback); - if(previous.componentWillUnmount) - previous.componentWillUnmount.apply(component,arguments); - } - } - - weh.react = { - attach: wehReactAttach - } - -})(); diff --git a/src/content/weh-ct.js b/src/content/weh-ct.js deleted file mode 100644 index 6e516ff..0000000 --- a/src/content/weh-ct.js +++ /dev/null @@ -1,123 +0,0 @@ -/* - * weh - WebExtensions Helper - * - * @summary workflow and base code for developing WebExtensions browser add-ons - * @author Michel Gutierrez - * @link https://github.com/mi-g/weh - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -(function() { - - const ANY_TYPE = "<any>"; - - window.browser = window.browser || window.chrome; - - var m = /^([^\?]*)(?:\?(.*))?$/.exec(window.location.href); - var params = {}; - if(m[2]) - m[2].split("&").forEach(function(paramExpr) { - var terms = paramExpr.split("="); - params[terms[0]] = decodeURIComponent(terms[1]); - }); - if(!params.panel) - throw new Error("Panel name not defined in URL"); - - var listeners = {}; - var port = browser.runtime.connect({name: "weh:panel:"+browser.runtime.id+":"+params.panel}); - - function NotifyListeners(message) { - function Dispatch(type) { - var typeListeners = listeners[type]; - if(!typeListeners) - return; - typeListeners.forEach(function(listener) { - try { - listener.call(null,message); - } catch(e) { - console.warn("weh: exception in message listener",e,e.stack); - } - }); - } - if(message.type) - Dispatch(message.type); - Dispatch(ANY_TYPE); - } - - port.onMessage.addListener(function(message) { - switch(message.type) { - case "weh#close": - window.close(); - return; - case "weh#panel-info": - if(message.details.panelType) { - var className = document.body.getAttribute("class"); - className = (className && className+" " || "") + "weh-type-" + message.details.panelType; - document.body.setAttribute("class",className); - } - return; - } - NotifyListeners(message); - }); - - var weh = { - post: function(message) { - port.postMessage(message); - }, - postLocal: function(message) { - NotifyListeners(message); - }, - on: function() { - var type, handler; - if(typeof arguments[0]=="function") { - type = ANY_TYPE; - handler = arguments[0]; - } else { - type = arguments[0]; - handler = arguments[1]; - } - if(!listeners[type]) - listeners[type] = []; - listeners[type].push(handler); - }, - off: function() { - var type, handler; - if(typeof arguments[0]=="function") { - type = "<any>"; - handler = arguments[0]; - } else { - type = arguments[0]; - handler = arguments[1]; - } - if(!listeners[type]) - return; - for(var i=listeners[type].length-1;i>=0;i--) - if(listeners[type][i]==handler) - listeners[type].splice(i,1); - }, - copyToClipboard: function(data,mimeType) { - mimeType = mimeType || "text/plain"; - document.oncopy = function(event) { - event.clipboardData.setData(mimeType, data); - event.preventDefault(); - }; - document.execCommand("Copy", false, null); - }, - setPageTitle: function(title) { - var titleElement = document.querySelector("head title"); - if(!titleElement) { - titleElement = document.createElement("title"); - document.head.appendChild(titleElement); - } else - while(titleElement.firstChild) - titleElement.removeChild(titleElement.firstChild); - titleElement.appendChild(document.createTextNode(title)); - } - } - - window.weh = weh; - -})(); diff --git a/src/content/weh-ct-jquery.js b/src/css/weh-form-states.css similarity index 53% rename from src/content/weh-ct-jquery.js rename to src/css/weh-form-states.css index 5e00b08..1447936 100644 --- a/src/content/weh-ct-jquery.js +++ b/src/css/weh-form-states.css @@ -10,19 +10,26 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -(function($) { +.has-success .form-control { + border-color: #5cb85c; +} - $.fn.wehI18n = function() { - var args = arguments; - this.each( function() { - var text = args[0] ? weh._.apply(null,args) : weh._($(this).attr("data-weh-i18n")); - $(this).text(text); - }); +.has-success .col-form-label { + color: #5cb85c; +} - } +.has-warning .form-control { + border-color: #f0ad4e; +} -}(jQuery)); +.has-warning .col-form-label { + color: #f0ad4e; +} -$(document).ready( function() { - $("[data-weh-i18n]").wehI18n(); -}); +.has-danger .form-control { + border-color: #d9534f; +} + +.has-danger .col-form-label { + color: #d9534f; +} diff --git a/src/css/weh-header.css b/src/css/weh-header.css new file mode 100644 index 0000000..edec17b --- /dev/null +++ b/src/css/weh-header.css @@ -0,0 +1,38 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + + header { + min-height: 42px; + line-height: 42px; +} + +header .weh-header-title { + background-repeat: no-repeat; + background-position: 8px center; + background-size: contain; + padding-left: 42px; + font-weight: bold; + font-size: 1.2em; +} + +header .weh-header-close { + font-weight: 100; + font-size: 1.5em; + line-height: 1.5em; + cursor: pointer; + color: #808080; + padding: 0 12px 0 0; +} + +header .weh-header-close:hover { + color: #404040; +} diff --git a/src/css/weh-natmsg-shell.scss b/src/css/weh-natmsg-shell.scss new file mode 100644 index 0000000..dbbcf81 --- /dev/null +++ b/src/css/weh-natmsg-shell.scss @@ -0,0 +1,69 @@ + +.natmsgsh { + + background-color: #f8f8f8; + height: 100%; + display: flex; + flex-direction: column; + + .natmsgsh-result { + flex: 1 1 auto; + background-color: #fff; + border-radius: 3px; + margin: 3px 3px 0 3px; + border: 1px solid #ddd; + padding: 4px; + overflow: auto; + + .natmsgsh-call { + font-weight: 800; + } + .natmsgsh-return { + color: #888; + } + .natmsgsh-error { + color: #f88; + } + .natmsgsh-item { + span.natmsgsh-ret-marker { + margin-right: 8px; + } + .icon-container { + font-size: 1.3em; + } + .object-container { + font-size: .8em; + } + } + + .react-json-view.scalar-view { + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + display: inline-block; + color: rgb(0, 43, 54); + font-size: .9rem; + } + + } + + .natmsgsh-input { + flex: 0 0 auto; + padding: 3px; + display: flex; + flex-direction: row; + + input { + flex: 1 1 auto; + } + input.syntax-error { + background-color: #f88; + } + input.syntax-ok { + background-color: #8f8; + } + button { + flex: 0 0 auto; + margin-left: 3px; + } + } + } + \ No newline at end of file diff --git a/src/css/weh-shf.css b/src/css/weh-shf.css new file mode 100644 index 0000000..3175c76 --- /dev/null +++ b/src/css/weh-shf.css @@ -0,0 +1,47 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +/* + * SHF = Sticky Header Footer = fixed header at top, footer at bottom with scrollable main content + */ + +html, body { + height: 100%; +} + +body { + overflow: hidden; +} + +.weh-shf, .weh-shf > div, .weh-shf > div > div, .weh-shf > div > div > div, +.weh-shf > div > div > div > div, .weh-shf > div > div > div > div > div { + height: 100%; + display: flex; + flex-direction: column; +} + +header { + flex: 0 0 auto; + background-color: #f8f8f8; +} + +main { + flex: 1 1 auto; + position: relative; + overflow-y: auto; + height: 100%; +} + +footer { + flex: 0 0 auto; + background-color: #f8f8f8; +} diff --git a/src/react/weh-header.jsx b/src/react/weh-header.jsx new file mode 100644 index 0000000..85c2237 --- /dev/null +++ b/src/react/weh-header.jsx @@ -0,0 +1,49 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react'; +import toolbarCss from 'css/weh-header.css'; +import shfCss from 'css/weh-shf.css'; + +import weh from 'weh-content'; + +var manifest = weh.browser.runtime.getManifest(); + +export default class WehHeader extends React.Component { + + close() { + weh.rpc.call("closePanel",weh.uiName); + } + + render() { + var title; + if(this.props.title) + title = this.props.title; + else + title = manifest.name; + + var titleStyle = { + backgroundImage: "url("+(this.props.image || "images/icon-32.png")+")" + } + return ( + <header className="weh-header"> + <span className="weh-header-title" + style={titleStyle} + > + {title} + </span> + <span className="weh-header-close" style={{float:"right"}}onClick={this.close}>{"\u2297"}</span> + {this.props.children} + </header> + ) + } +} diff --git a/src/react/weh-natmsg-shell.jsx b/src/react/weh-natmsg-shell.jsx new file mode 100644 index 0000000..3b419b7 --- /dev/null +++ b/src/react/weh-natmsg-shell.jsx @@ -0,0 +1,234 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + + import React from 'react' +import ReactJson from 'react-json-view'; +import natmsgshStyles from '../css/weh-natmsg-shell.css'; +import weh from 'weh-content'; +import rpc from 'weh-rpc'; + +export class NativeMessagingShell extends React.Component { + + constructor(props) { + super(props); + this.state = { + className: "", + method: null, + args: null, + items: [] + }; + this.itemIndex = 0; + this.history = []; + this.historyIndex = 0; + this.handleChange = this.handleChange.bind(this); + this.handleKeyDown = this.handleKeyDown.bind(this); + this.clear = this.clear.bind(this); + } + + resetInput() { + this.input.value = ""; + this.setState({ + className: "", + method: null, + args: null + }); + } + + clear() { + this.setState({ + items: [] + }); + } + + handleChange(event) { + var value = this.input.value.trim(); + var className = "", method = null, args = null; + if(value.length) { + className = "syntax-error"; + var parts = /^\s*([^\s\(\)]+)\s*\((.*)\)\s*$/.exec(value); + if(parts) { + var argsStr = "[" + parts[2] +"]"; + try { + args = JSON.parse(argsStr); + method = parts[1]; + className = "syntax-ok" + } catch(e) {} + } + } + this.setState({ + className: className, + method: method, + args: args + }); + } + + addItem(item) { + item = Object.assign({},item,{ + key: ++this.itemIndex + }); + this.setState({ + items: this.state.items.concat([item]) + }) + } + + handleKeyDown(event) { + var self = this; + if(event.keyCode==13 && this.state.method) { + this.history.push({ + method: this.state.method, + args: this.state.args + }); + this.historyIndex = this.history.push(); + this.addItem({ + type: "call", + method: this.state.method, + args: this.state.args + }); + rpc.call(this.props.proxyFnName,this.state.method,...this.state.args) + .then((result)=>{ + console.info("result",result); + self.addItem({ + type: "result", + result + }); + }) + .catch((error)=>{ + console.info("error",error); + self.addItem({ + type: "error", + error + }); + }); + this.resetInput(); + } + if(event.keyCode==38 && this.historyIndex>0) { + let entry = this.history[--this.historyIndex]; + this.setState({ + method: entry.method, + args: entry.args, + className: "syntax-ok", + }); + this.input.value = this.entryString(entry); + } + if(event.keyCode==40 && this.historyIndex<this.history.length) { + let entry = this.history[++this.historyIndex]; + if(entry) { + this.setState({ + method: entry.method, + args: entry.args, + className: "syntax-ok", + }); + this.input.value = this.entryString(entry); + } else + this.resetInput(); + } + } + + entryString(entry) { + return entry.method+"("+entry.args.map((arg)=>JSON.stringify(arg)).join(", ")+")"; + } + + scrollToBottom() { + this.itemsEnd.scrollIntoView({ behavior: "smooth" }); + } + + componentDidMount() { + this.scrollToBottom(); + } + + componentDidUpdate() { + this.scrollToBottom(); + } + + renderJson(obj) { + switch(typeof obj) { + case "undefined": + return ( + <div className="react-json-view scalar-view"> + <em>no explicit return value</em> + </div> + ); + case "number": + case "string": + case "boolean": + return ( + <div className="react-json-view scalar-view"> + {JSON.stringify(obj)} + </div> + ); + } + return ( + <ReactJson src={obj} + name={null} + collapsed={true} + enableClipboard={false} + collapseStringsAfterLength={64} + displayDataTypes={false} + displayObjectSize={false} + style={{display:"inline-block"}} + /> + ) + } + + render() { + var self = this; + var items = this.state.items.map((item)=>{ + return ( + <div key={item.key} className="natmsgsh-item"> + { item.type == 'call' && ( + <div className="natmsgsh-call"> + {self.entryString(item)} + </div> + )} + { item.type == 'result' && ( + <div className="natmsgsh-return"> + <span className="natmsgsh-ret-marker" dangerouslySetInnerHTML={{__html:"⇒"}}/> + { self.renderJson(item.result) } + </div> + )} + { item.type == 'error' && ( + <div className="natmsgsh-error"> + <span className="natmsgsh-ret-marker" dangerouslySetInnerHTML={{__html:"⇒"}}/> + { item.error.message } + </div> + )} + </div> + ) + }); + return ( + <div className="natmsgsh"> + <div className="natmsgsh-result"> + {items} + <div style={{ float: "left", clear: "both" }} + ref={(el) => { this.itemsEnd = el; }}> + </div> + </div> + <div className="natmsgsh-input"> + <input + ref={(input) => this.input = input} + className={this.state.className} + onChange={this.handleChange} + placeholder="RPC call as: method(arg1,arg2)" + onKeyDown={this.handleKeyDown} + type="text" + /> + <button className="btn btn-outline-secondary" + onClick={()=>{rpc.call(this.props.proxyFnName,"quit")}}> + {this.props.exitAppText || "Exit app"} + </button> + <button className="btn btn-outline-secondary" + onClick={this.clear}>{this.props.clearText || "Clear"}</button> + </div> + </div> + ) + } +} diff --git a/src/react/weh-prefs-settings.jsx b/src/react/weh-prefs-settings.jsx new file mode 100644 index 0000000..71e0b02 --- /dev/null +++ b/src/react/weh-prefs-settings.jsx @@ -0,0 +1,321 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react'; +import {bindActionCreators} from 'redux'; +import {connect} from 'react-redux'; + +import 'bootstrap/dist/css/bootstrap.css' +import 'css/weh-form-states.css'; + +import weh from 'weh-content'; + +const initialState = { + values: {}, // the saved pref values + current: {}, // prefs values being edited + specs: {}, // prefs specifications + flags: {} // prefs flags +} + +export function reducer(state=initialState,action) { + + function GetFlags() { + var flags = { + isModified: false, + isDefault: true, + isValid: true + } + Object.keys(state.specs || {}).forEach((prefName)=>{ + var spec = (state.specs || {})[prefName]; + var value = state.current[prefName]; + if(!spec) return; + if(spec.defaultValue!==value) + flags.isDefault = false; + if(value!==state.values[prefName]) + flags.isModified = true; + if(!weh.prefs.isValid(prefName,value)) + flags.isValid = false; + }); + return flags; + } + + switch(action.type) { + case "PREFS_UPDATED": + state = Object.assign({},state,{ + values: Object.assign({},state.values,action.payload), + current: Object.assign({},action.payload,state.current), + }); + state.flags = GetFlags(); + break; + + case "PREFS_SPECS_UPDATED": + state = Object.assign({},state,{ + specs: Object.assign({},state.specs,action.payload), + }) + state.flags = GetFlags(); + break; + + case "PREF_UPDATE": + if(state.current[action.payload.prefName] != action.payload.value) { + state = Object.assign({},state); + state.current = Object.assign({},state.current); + state.current[action.payload.prefName] = action.payload.value; + state.flags = GetFlags(); + } + break; + + case "PREFS_RESET": + state = Object.assign({},state); + Object.keys(state.specs || {}).forEach((prefName)=>{ + var spec = (state.specs || {})[prefName]; + if(!spec) return; + state.current[prefName] = spec.defaultValue; + }); + state.flags = GetFlags(); + break; + + case "PREFS_CANCEL": + state = Object.assign({},state); + Object.keys(state.specs || {}).forEach((prefName)=>{ + state.current[prefName] = state.values[prefName]; + }); + state.flags = GetFlags(); + break; + + case "PREFS_SAVE": + weh.prefs.assign(state.current); + break; + } + return state; +} + +export class App extends React.Component { + render() { + return ( + <form className="weh-shf" noValidate onSubmit={(e)=>e.preventDefault()}> + <div>{this.props.children}</div> + </form> + ) + } +} + +var wehParamIndex = 1; +export var WehParam = connect( + // map redux state to react component props + (state, ownProps) => { + return { + initialValue: state.prefs.values[ownProps.prefName] || "", + value: state.prefs.current[ownProps.prefName] || "", + spec: state.prefs.specs[ownProps.prefName] || {} + } + }, + // make some redux actions available as react component props + (dispatch) => { + return bindActionCreators ({ + updateCurrentPref: (prefName,value) => { + return { + type: "PREF_UPDATE", + payload: { prefName, value } + } + } + },dispatch); + })( + +class extends React.Component { + + constructor(props) { + super(props); + this.state = { + value: this.props.value || "", + spec: this.props.spec + }; + this.paramIndex = wehParamIndex++; + this.handleChange=this.handleChange.bind(this); + } + + componentWillReceiveProps(props) { + this.setState({ + value: props.value || "", + spec: props.spec + }) + } + + handleChange(event) { + var value = this.state.spec.type=="boolean" ? event.target.checked : event.target.value; + this.setState({ + value: value + }); + if(this.state.spec.type=="integer") + value = parseInt(value); + if(this.state.spec.type=="float") + value = parseFloat(value); + this.props.updateCurrentPref(this.props.prefName,value); + } + + setCustomValue(value) { + var event = { target: {} }; + if(this.state.spec.type=="boolean") + event.target.checked = value; + else + event.target.value = value; + this.handleChange(event); + } + + isValid(value) { + var spec = this.state.spec; + if(arguments.length===0) + value = this.state.value; + if(!spec) + return false; + return weh.prefs.isValid(this.props.prefName,value); + } + + formGroupClass() { + if(!this.isValid()) + return "has-danger"; + else if(this.state.value != this.props.initialValue) + return "has-success"; + else if(this.state.value != this.state.spec.defaultValue) + return "has-warning"; + else + return ""; + } + + getInputWidth() { + switch(this.state.spec.type) { + case "string": + return this.state.spec.width || "20em"; + case "integer": + case "float": + return this.state.spec.width || "8em"; + case "boolean": + return "34px"; + case "choice": + return this.state.spec.width || "12em"; + } + } + + renderInput() { + switch(this.state.spec.type) { + case "string": + case "integer": + case "float": + return <input className="form-control" + value={this.state.value} + onChange={this.handleChange} + maxLength={this.state.spec.maxLength || -1} + id={"weh-param-"+this.paramIndex} + type="text" + style={{ width: this.getInputWidth() }}/> + case "boolean": + return <div> + <input className="form-control" + checked={this.state.value} + onChange={this.handleChange} + id={"weh-param-"+this.paramIndex} + type="checkbox" + style={{width:"34px"}} + /> + </div> + case "choice": + var options = (this.state.spec.choices || []).map( + (option) => <option key={option.value} value={option.value}>{option.name}</option> + ); + if(options.length===0) + return false; + return <select + value={this.state.value} + onChange={this.handleChange} + className="form-control" + id={"weh-param-"+this.paramIndex} + style={{ width: this.getInputWidth() }}> + {options} + </select> + + } + } + + render() { + return ( + <div className={"form-group row " + this.formGroupClass() }> + <label className="col-3 col-form-label" htmlFor={"weh-param-"+this.paramIndex}> + {this.state.spec.label}</label> + <div className="col-8"> + { this.props.renderInput && this.props.renderInput.call(this) || this.renderInput()} + { this.state.spec.description && ( + <div className="form-text"><em>{ this.state.spec.description }</em></div> + )} + </div> + </div> + ) + } +} + + ); // end export WehParam + + +export var WehPrefsControls = connect( + (state) => { + return { + flags: state.prefs.flags || {} + } + }, + (dispatch) => { + return bindActionCreators ({ + save: () => { + return { + type: "PREFS_SAVE" + } + }, + reset: () => { + return { + type: "PREFS_RESET" + } + }, + cancel: () => { + return { + type: "PREFS_CANCEL" + } + } + },dispatch); + } +)( + class extends React.Component { + + render() { + return this.props.render.call(this); + } + } +); + +export function listenPrefs(store) { + const wehPrefs = weh.prefs; + wehPrefs.on("",{ + pack: true + },(prefs)=>{ + store.dispatch({ + type: "PREFS_UPDATED", + payload: prefs + }) + }); + + wehPrefs.on("",{ + pack: true, + specs: true + },(specs)=>{ + store.dispatch({ + type: "PREFS_SPECS_UPDATED", + payload: specs + }) + }); + +} diff --git a/src/react/weh-translation.jsx b/src/react/weh-translation.jsx new file mode 100644 index 0000000..fdf22b1 --- /dev/null +++ b/src/react/weh-translation.jsx @@ -0,0 +1,439 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import {browser} from 'weh'; +import React from 'react'; +import {bindActionCreators} from 'redux'; +import {connect} from 'react-redux'; +import i18nKeys from 'weh-i18n-keys'; +import WehHeader from 'react/weh-header'; + +import 'bootstrap/dist/css/bootstrap.css' +import 'css/weh-form-states.css'; + +const initialState = {}; +var needRestore = false; + +function Initialize() { + var custom = {}; + function SetCustomMessages(customMessages) { + } + try { + var customMessages = JSON.parse(window.localStorage.getItem("wehI18nCustom")); + if(customMessages===null) { + customMessages = {}; + needRestore = true; + } else + Object.keys(customMessages).forEach((key)=>{ + custom[key] = customMessages[key].message; + }); + } catch(e) {} + initialState.custom = custom; + initialState.keys = Object.keys(i18nKeys); + initialState.modified = {}; +} +Initialize(); + +export function reducer(state=initialState,action) { + switch(action.type) { + case "UPDATE_STRING": + state = Object.assign({}, state, { + modified: Object.assign({},state.modified) + }); + if(state.custom[action.payload.key]===action.payload.value || + typeof state.custom[action.payload.key]==="undefined" && action.payload.value.trim()==="") + delete state.modified[action.payload.key]; + else + state.modified[action.payload.key] = action.payload.value; + break; + + case "SAVE": + state = Object.assign({}, state, { + custom: Object.assign({},state.custom,state.modified), + modified: {} + }); + var customMessages = {}; + Object.keys(state.custom).forEach((key)=>{ + customMessages[key] = { + message: state.custom[key] + } + }); + window.localStorage.setItem("wehI18nCustom",JSON.stringify(customMessages)); + browser.storage.local.set({ + "wehI18nCustom": customMessages + }); + break; + + case "CANCEL": + state = Object.assign({}, state, { + modified: {} + }); + break; + case "IMPORT": + state = Object.assign({}, state, { + modified: action.payload + }); + break; + case "RESET": + state = Object.assign({}, state, { + modified: {}, + custom: {} + }); + break; + case "RESTORE": + var customMessages = {}; + Object.keys(action.payload).forEach((key)=>{ + customMessages[key] = action.payload[key].message + }); + state = Object.assign({}, state, { + custom: customMessages, + modified: {} + }); + break; + } + return state; +} + +function IsObjectEmpty(obj) { + var empty = true; + for(var f in obj) + if(obj.hasOwnProperty(f)) { + empty = false; + break; + } + return empty; +} + +export var WehTranslationForm = connect( + // map redux state to react component props + (state) => { + return { + keys: state.translate.keys || [], + custom: state.translate.custom, + isModified: !IsObjectEmpty(state.translate.modified), + modified: state.translate.modified + } + }, + // make some redux actions available as react component props + (dispatch) => { + return bindActionCreators ({ + save: () => { + return { + type: "SAVE" + } + }, + cancel: () => { + return { + type: "CANCEL" + } + }, + import: (data) => { + return { + type: "IMPORT", + payload: data + } + }, + reset: (data) => { + return { + type: "RESET" + } + }, + restore: (data) => { + return { + type: "RESTORE", + payload: data + } + } + },dispatch); + } +)( + class extends React.Component { + + constructor(props) { + super(props); + this.state = { + search: "", + filter: props.missingTags && props.missingTags.length>0 && "missing" || "all" + } + var maxArgs = 4; // should be 9 but this is a bug in Edge + this.argPlaceHolders = new Array(maxArgs).fill("").map((v,i) => {return ""}); + + this.handleSearchChange = this.handleSearchChange.bind(this); + this.searchFilter = this.searchFilter.bind(this); + this.fileInputChange = this.fileInputChange.bind(this); + } + + componentWillMount(props) { + var self = this; + if(needRestore) { + needRestore = false; + browser.storage.local.get("wehI18nCustom") + .then((result)=>{ + const weCustomMessages = result.wehI18nCustom; + weCustomMessages && self.props.restore(weCustomMessages); + }); + } + } + + handleSearchChange(event) { + var search = event.target.value; + this.setState({ search }); + } + + searchFilter() { + var self = this; + return (key) => { + key = key.toLowerCase(); + var search = self.state.search.toLowerCase().trim(); + if(search.length===0) + return true; + if(typeof self.props.modified[key]!=="undefined") + return true; + if(key.indexOf(search)>=0) + return true; + if(self.props.custom[key] && self.props.custom[key].toLowerCase().indexOf(search)>=0) + return true; + if(self.props.modified[key] && self.props.modified[key].toLowerCase().indexOf(search)>=0) + return true; + var original = browser.i18n.getMessage(key,self.argPlaceHolders).toLowerCase(); + if(original.indexOf(search)>=0) + return true; + return false; + } + } + + typeFilter() { + var self = this; + return (key)=>{ + return self.state.filter!="missing" || !self.props.missingTags || + self.props.missingTags.length==0 || self.props.missingTags.indexOf(key)>=0; + } + } + + changedFilter() { + var self = this; + return (event) => { + self.setState({ + filter: event.target.value + }) + } + } + + reset() { + var self = this; + return ()=>{ + this.props.reset(); + } + } + + import() { + var self = this; + return () => { + self.fileInput.click(); + } + } + + fileInputChange(event) { + var self = this; + var file = self.fileInput.files[0]; + if(file) { + var reader = new FileReader(); + reader.onload = (event) => { + try { + var data = JSON.parse(event.target.result); + self.props.import(data); + } catch(e) { + alert("File "+file.name+": Invalid format "+e.message); + } + } + reader.readAsText(file); + } + } + + setFileInput(input) { + var self = this; + return (input) => { + if(input) + input.removeEventListener("change",self.fileInputChange); + self.fileInput = input; + if(!input) + return; + input.addEventListener("change",self.fileInputChange); + } + } + + export() { + var self = this; + return () => { + var data = Object.assign({},self.props.custom,self.props.modified); + var blob = new Blob([JSON.stringify(data,null,4)]); + browser.downloads.download({ + url: window.URL.createObjectURL(blob), + filename: "messages.json", + saveAs: true, + conflictAction: "uniquify" + }); + } + } + + render() { + var items = this.props.keys.filter(this.searchFilter()).filter(this.typeFilter()).sort().map((key)=>{ + return ( + <WehTranslationItem key={key} keyName={key}/> + ) + }); + return ( + <form className="weh-shf" + onChange={this.handleChange} + role="form"> + <WehHeader image={this.props.titleImage || "images/icon-32.png"}> + <div className="col-sm-4 float-sm-right" style={{display:"inline-flex",marginTop:"2px"}}> + <input className="form-control" + onChange={this.handleSearchChange} + placeholder="Filter..." + type="text" + value={this.state.search} + /> + {"\u00a0"} + { this.props.missingTags && this.props.missingTags.length>0 && ( + <select className="form-control" value={this.state.filter} onChange={this.changedFilter()}> + <option value="all">All strings</option> + <option value="missing">Missing strings</option> + </select> + )} + </div> + </WehHeader> + <main> + <div className="container"> + <section> + { items } + </section> + </div> + </main> + <footer> + <div style={{display:"none"}}> + <input type="file" accept="application/json" ref={this.setFileInput()}/> + </div> + { this.props.footerExtra && ( + <div className="form-control translation-footer-extra"> + {this.props.footerExtra} + </div> + )} + <div className="btn-toolbar justify-content-end"> + <div className="btn-group pull-right"> + <button type="button" + onClick={this.import()} + className="btn">Import</button> + <button type="button" + onClick={this.export()} + className="btn">Export</button> + <button type="button" + className="btn btn-danger" + onClick={this.reset()} + className="btn btn-danger">Reset</button> + <button type="button" + onClick={this.props.cancel} + className={"btn "+(this.props.isModified?"":"disabled")}>Cancel</button> + <button type="button" + onClick={this.props.save} + className={"btn btn-primary "+(this.props.isModified?"":"disabled")}>Save</button> + </div> + </div> + </footer> + </form> + ) + } + } +); + +export var WehTranslationItem = connect( + (state,ownProps) => { + var orgValue = state.translate.custom[ownProps.keyName]; + var value = orgValue; + if(typeof state.translate.modified[ownProps.keyName]!=="undefined") + value = state.translate.modified[ownProps.keyName]; + return { + value: value || "", + orgValue: orgValue || "" + } + }, + (dispatch) => { + return bindActionCreators ({ + updateString: (key,value) => { + return { + type: "UPDATE_STRING", + payload: { + key: key, + value: value + } + } + } + },dispatch); + } +)( + class extends React.Component { + + constructor(props) { + super(props); + this.state = { + value: this.props.value || "", + orgValue: this.props.orgValue || "" + } + var maxArgs = 4; // should be 9 but this is a bug in Edge + var argPlaceHolders = new Array(maxArgs).fill("").map((v,i) => {return "$ARG"+(i+1)+"$"}); + this.defaultString = browser.i18n.getMessage(this.props.keyName,argPlaceHolders); + this.handleChange = this.handleChange.bind(this); + this.formClass = this.formClass.bind(this); + } + + componentWillReceiveProps(props) { + this.setState({ + value: props.value || "", + orgValue: props.orgValue || "" + }) + } + + formClass(prefix="") { + if(this.state.value!==this.state.orgValue) + return prefix + "success"; + if(this.state.value!=="") + return prefix + "warning"; + return ""; + } + + handleChange(event) { + var value = event.target.value; + this.setState({ + value: value + }); + this.props.updateString(this.props.keyName,value); + } + + render() { + return ( + <div className={"form-group row " + this.formClass("has-") }> + <label className="col-4 col-form-label" htmlFor={"weh-"+this.props.keyName} title={this.props.keyName}> + {this.props.keyName}</label> + <div className="col-8"> + <input className="form-control" + onChange={this.handleChange} + value={this.state.value} + type="text" + id={"weh-"+this.props.keyName} + /> + <div className="form-text"><em>{ this.defaultString }</em></div> + </div> + </div> + ) + } + } +); \ No newline at end of file diff --git a/src/weh-background.js b/src/weh-background.js new file mode 100644 index 0000000..2442e0a --- /dev/null +++ b/src/weh-background.js @@ -0,0 +1,225 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var weh = require('weh'); +var browser = weh.browser; + +var apps = {}; + +weh.rpc = require('weh-rpc'); +//weh.rpc.setDebug(2); +weh.rpc.setUseTarget(true); + +weh.rpc.setPost((app,message)=>{ + var appOptions = apps[app]; + if(appOptions && appOptions.port) + appOptions.port.postMessage(message); +}); + +weh.rpc.listen({ + appStarted: (options) => { + }, + appReady: (app) => { + }, + closePanel: (app) => { + weh.ui.close(app); + } +}); + +browser.runtime.onConnect.addListener((port) => { + var m = /^weh:(.*?):(.*)/.exec(port.name); + if(!m) + return; + port.onMessage.addListener((message) => { + if(typeof message._method !== "undefined" && (message._method==="appStarted" || message._method==="appReady")) { + var app = message._args[0] && message._args[0].uiName || null; + var appOptions = apps[app] || { + ready: false + }; + apps[app] = appOptions; + Object.assign(appOptions,message._args[0],{ port: port }); + if(message._method=="appReady") { + appOptions.ready = true; + if(appOptions.initData) + setTimeout(()=>{ + weh.rpc.call(app,"wehInitData",appOptions.initData); + },0); + var wait = waiting[app]; + if(wait && wait.timer) { + clearTimeout(wait.timer); + delete wait.timer; + } + } + port._weh_app = app; + + } + weh.rpc.receive(message,port.postMessage.bind(port),port._weh_app); + }); + port.onDisconnect.addListener(() => { + var app = port._weh_app; + if(app) { + delete apps[app]; + var wait = waiting[app]; + if(wait) { + if(wait.timer) + clearTimeout(wait.timer); + delete waiting[app]; + wait.reject(new Error("Disconnected waiting for "+app)); + } + } + }); +}); + +weh.__declareAppTab = function(app,data) { + if(!apps[app]) + apps[app] = {}; + Object.assign(apps[app],data); +} + +weh.__closeByTab = function(tabId) { + Object.keys(apps).forEach((app)=>{ + var appOptions = apps[app]; + if(appOptions.tab===tabId) { + delete apps[app]; + var wait = waiting[app]; + if(wait) { + if(wait.timer) + clearTimeout(wait.timer); + delete waiting[app]; + wait.reject(new Error("Disconnected waiting for "+app)); + } + } + }); +} + +weh._ = require('weh-i18n').getMessage; +weh.ui = require('weh-ui'); +weh.openedContents = () => Object.keys(apps); + +var wehPrefs = require('weh-prefs'); +weh.prefs = wehPrefs; + +function Hash(str){ + var hash = 0, char; + if (str.length === 0) return hash; + for(var i=0; i<str.length; i++) { + char = str.charCodeAt(i); + hash = ((hash<<5)-hash)+char; + hash = hash & hash; + } + return hash; +} + +function Stringify(object) { + return JSON.stringify(Object.keys(object).sort().map(function(k) { + return { + name: k, + value: object[k] + } + })); +} + +function Parse(str) { + var object = {}; + JSON.parse(str).forEach(function(pair) { + object[pair.name] = pair.value; + }); + return object; +} + +var lastHash = 0; +var prefs = {}; + +try { + var prefsStr = localStorage.getItem("weh-prefs"); + if(prefsStr===null) { + browser.storage.local.get("weh-prefs") + .then((result)=>{ + var wePrefs = result["weh-prefs"]; + if(wePrefs) + wehPrefs.assign(wePrefs); + }) + } else { + prefs = Parse(prefsStr); + lastHash = Hash(prefsStr); + } +} catch(e) {} + +wehPrefs.assign(prefs); +wehPrefs.on("",{ + pack: true +},function(newPrefs,oldPrefs) { + Object.assign(prefs,newPrefs); + var prefsStr = Stringify(prefs); + var hash = Hash(prefsStr); + if(hash!=lastHash) { + lastHash = hash; + localStorage.setItem("weh-prefs",prefsStr); + browser.storage.local.set({ + "weh-prefs": prefs + }); + } + Object.keys(apps).forEach((app)=>{ + var appOptions = apps[app]; + if(appOptions.usePrefs) { + weh.rpc.call(app,"setPrefs",newPrefs); + } + }); +}); + +const waiting = {}; + +weh.wait = (id,options={}) => { + var wait = waiting[id]; + if(wait) { + if(wait.timer) + clearTimeout(wait.timer); + delete waiting[id]; + wait.reject(new Error("Waiter for "+id+" overriden")); + } + return new Promise((resolve, reject) => { + waiting[id] = { + resolve, + reject, + timer: setTimeout(()=>{ + delete waiting[id]; + reject(new Error("Waiter for "+id+" timed out")); + }, options.timeout || 60000) + } + }); +} + +weh.rpc.listen({ + prefsGetAll: () => { + return wehPrefs.getAll(); + }, + prefsGetSpecs: () => { + return wehPrefs.getSpecs(); + }, + prefsSet: (prefs) => { + return wehPrefs.assign(prefs); + }, + trigger: (id,result) => { + var wait = waiting[id]; + if(!wait) + throw new Error("No waiter for",id); + if(wait.timer) { + clearTimeout(wait.timer); + delete wait.timer; + } + delete waiting[id]; + wait.resolve(result); + } +}); + + +module.exports = weh; diff --git a/src/weh-content.js b/src/weh-content.js new file mode 100644 index 0000000..ef270e8 --- /dev/null +++ b/src/weh-content.js @@ -0,0 +1,163 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var weh = require('weh'); +var browser = weh.browser; + +/* extracting running parameters from URL */ +var urlParams = typeof _wehPanelName !== "undefined" && { panel: _wehPanelName } || function () { + var m = /^([^\?]*)(?:\?(.*))?$/.exec(window.location.href); + var params = {}; + if (m[2]) m[2].split("&").forEach(function (paramExpr) { + var terms = paramExpr.split("="); + params[terms[0]] = decodeURIComponent(terms[1]); + }); + return params; +}(); + +if (!urlParams.panel) throw new Error("Panel name not defined in URL"); + +weh.uiName = urlParams.panel; +var usePrefs = !urlParams.noprefs; + +/* setting up RPC */ +weh.rpc = require('weh-rpc'); +//weh.rpc.setDebug(2); +weh.rpc.listen({ + close: () => { + window.close() + } +}) + +/* connecting communication port with background */ +var port = browser.runtime.connect({ name: "weh:" + browser.runtime.id + ":" + weh.uiName }); +weh.rpc.setPost(port.postMessage.bind(port)); +port.onMessage.addListener((message) => { + weh.rpc.receive(message, port.postMessage.bind(port)); +}); + +/* notify background app is started */ +weh.rpc.call("appStarted", { + uiName: weh.uiName, + usePrefs: usePrefs + }).catch(function (err) { + console.info("appStarted failed", err); + }); + +/* initializing */ +var readyPromises = [ + new Promise((resolve,reject)=>{ + window.addEventListener("DOMContentLoaded", function () { + resolve(); + }); + + }) +]; + +if(usePrefs) { + let wehPrefs = require('weh-prefs'); + weh.prefs = wehPrefs; + let initialPrefs = {}; + try { + let prefsStr = localStorage.getItem("weh-prefs"); + if(prefsStr) + JSON.parse(prefsStr).forEach((entry)=>{ + initialPrefs[entry.name] = entry.value; + }); + } catch(e) {} + wehPrefs.assign(initialPrefs); + wehPrefs.on("", { + pack: true + }, function (newPrefs, oldPrefs) { + weh.rpc.call("prefsSet",newPrefs); + }); + readyPromises.push(new Promise((resolve,reject)=>{ + weh.rpc.call("prefsGetSpecs") + .then(function (specs) { + wehPrefs.declare(specs); + return weh.rpc.call("prefsGetAll"); + }) + .then((allPrefs)=>{ + wehPrefs.assign(allPrefs); + wehPrefs.forceNotify(false); + resolve(); + }) + .catch(reject); + })); + weh.rpc.listen({ + setPrefs: (prefs) => { + wehPrefs.assign(prefs); + } + }); + +} + +/* notifies app ready: DOM and prefs, if used, are loaded */ +Promise.all(readyPromises) + .then(()=>{ + return weh.rpc.call("appReady",{ + uiName: weh.uiName + }); + }).then(function () { + appStarted = true; + if(triggerRequested) { + let result = triggerArgs; + triggerArgs = undefined; + triggerRequested = false; + weh.doTrigger(result); + } + }) + .catch((err)=>{ + console.error("app not ready:",err); + }); + +var triggerRequested = false; +var triggerArgs = undefined; +var appStarted = false; + +weh.doTrigger = function (result) { + return weh.rpc.call("trigger",weh.uiName,result) + .catch(()=>{}); +} + +weh.trigger = function (result) { + if(appStarted) + return weh.doTrigger(result); + else { + triggerArgs = result; + triggerRequested = true; + } +} + +/* setting up translation */ +weh._ = require("weh-i18n").getMessage; + +/* utility functions */ +weh.copyToClipboard = function (data, mimeType) { + mimeType = mimeType || "text/plain"; + document.oncopy = function (event) { + event.clipboardData.setData(mimeType, data); + event.preventDefault(); + }; + document.execCommand("Copy", false, null); +}; +weh.setPageTitle = function (title) { + var titleElement = document.querySelector("head title"); + if (!titleElement) { + titleElement = document.createElement("title"); + document.head.appendChild(titleElement); + } else while (titleElement.firstChild) + titleElement.removeChild(titleElement.firstChild); + titleElement.appendChild(document.createTextNode(title)); +}; + +module.exports = weh; \ No newline at end of file diff --git a/src/weh-i18n.js b/src/weh-i18n.js new file mode 100644 index 0000000..9ac1809 --- /dev/null +++ b/src/weh-i18n.js @@ -0,0 +1,63 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +const { browser } = require('weh'); + +var customStrings = {} + +const SUBST_RE = new RegExp("\\$[a-zA-Z]*([0-9]+)\\$","g"); + +function Load() { + try { + customStrings = JSON.parse(window.localStorage.getItem("wehI18nCustom")); + if(customStrings===null) { + customStrings = {}; + browser.storage.local.get("wehI18nCustom") + .then((result)=>{ + var weCustomStrings = result.wehI18nCustom; + if(weCustomStrings) + Object.assign(customStrings,weCustomStrings); + }); + } + } catch(e) { + customStrings = {}; + } +} +Load(); + +function GetMessage(messageName,substitutions) { + if(/-/.test(messageName)) { + var fixedName = messageName.replace(/-/g,"_"); + console.warn("Wrong i18n message name. Should it be",fixedName,"instead of",messageName,"?"); + messageName = fixedName; + } + var custom = customStrings[messageName]; + if(custom && custom.message.length>0) { + if(!Array.isArray(substitutions)) + substitutions = [ substitutions ]; + var str = (custom.message || "").replace(SUBST_RE,(ph)=>{ + var m = SUBST_RE.exec(ph); + if(m) + return substitutions[parseInt(m[1])-1] || "??"; + else + return "??"; + }); + return str; + } + return browser.i18n.getMessage.apply(browser.i18n,arguments); +} + +module.exports = { + getMessage: GetMessage, + reload: Load +} + diff --git a/src/weh-inspect.js b/src/weh-inspect.js new file mode 100644 index 0000000..57bf14c --- /dev/null +++ b/src/weh-inspect.js @@ -0,0 +1,142 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +const weh = require('weh'); +const wehRpc = require('weh-rpc'); +const wehPrefs = require('weh-prefs'); + +var browser = weh.browser; + +var inspectorId = null; +var inspect = null; +var inspected = false; + +if(browser.runtime.onMessageExternal) { + browser.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) { + switch(message.type) { + case "weh#inspect-ping": + inspectorId = sender.id; + sendResponse({ + type: "weh#inspect-pong", + version: 1, + manifest: browser.runtime.getManifest() + }); + break; + case "weh#inspect": + inspectorId = sender.id; + inspected = message.inspected; + if(inspected) + wehRpc.setHook((message) => { + if(inspected && inspectorId) + browser.runtime.sendMessage(inspectorId,{ + type: "weh#inspect-message", + message + }) + .catch((err)=>{ + console.info("Error sending message",err); + inspected = false; + }); + }); + else + wehRpc.setHook(null); + sendResponse({ + type: "weh#inspect", + version: 1, + inspected + }); + break; + case "weh#get-prefs": + inspectorId = sender.id; + sendResponse({ + type: "weh#prefs", + prefs: wehPrefs.getAll(), + specs: wehPrefs.getSpecs() + }); + break; + case "weh#set-pref": + wehPrefs[message.pref] = message.value; + sendResponse(true); + break; + case "weh#get-storage": + inspectorId = sender.id; + GetStorageData() + .then((data) => { + browser.runtime.sendMessage(inspectorId,{ + type: "weh#storage", + storage: data + }); + }) + .catch((err)=>{ + console.error("Error get storage data",err); + }); + sendResponse({ + type: "weh#storage-pending" + }); + break; + + } + }); + inspect = { + send: () => { + console.info("TODO implement inspect.send"); + } + } +} + +function GetStorageData() { + return new Promise((resolve,reject) => { + var data = {}; + ["localStorage","sessionStorage"].forEach(function(which) { + try { + var storage = window[which]; + if(storage) { + var webStorage = {}; + for(var i=0; i<storage.length; i++) { + var key = storage.key(i); + var value = storage.getItem(key); + try { + webStorage[key] = JSON.parse(value); + } catch(e) { + webStorage[key] = value; + } + } + data[which] = webStorage; + } + } catch(e) {} + }); + var storagePromises = []; + ["local","sync","managed"].forEach(function(which) { + try { + var storage = browser.storage && browser.storage[which]; + if(storage) { + return new Promise((resolve, reject) => { + var storagePromise = storage.get(null) + .then((items) => { + data[which] = items; + }) + .catch((err)=>{ + + }) + storagePromises.push(storagePromise); + }); + } + } catch(e) {} + }); + Promise.all(storagePromises) + .then(()=>{ + resolve(data); + }) + .catch(reject); + }); +} + +module.exports = inspect; \ No newline at end of file diff --git a/src/weh-natmsg.js b/src/weh-natmsg.js new file mode 100644 index 0000000..fb05e4f --- /dev/null +++ b/src/weh-natmsg.js @@ -0,0 +1,250 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +const weh = require('weh'); +var browser = weh.browser; +const rpc = require('weh-rpc'); + +class EventHandler { + constructor() { + this.listeners = []; + } + addListener(listener) { + this.listeners.push(listener); + } + removeListener(listener) { + this.listeners = this.listeners.filter((_listener) => listener !== _listener); + } + removeAllListeners() { + this.listeners = []; + } + notify(...args) { + this.listeners.forEach((listener) => { + try { + listener(...args); + } catch(e) { + console.warn(e); + } + }); + } +} + +const ADDON2APP = 1; +const APP2ADDON = 2; + +class NativeMessagingApp { + + constructor(appId,options={}) { + this.appId = appId; + this.name = options.name || appId; + this.appPort = null; + this.pendingCalls = []; + this.runningCalls = []; + this.state = "idle"; + this.postFn = this.post.bind(this); + this.postMessageFn = this.postMessage.bind(this); + this.onAppNotFound = new EventHandler(); // general + this.onAppNotFoundCheck = new EventHandler(); // call specific + this.onCallCount = new EventHandler(); + this.appStatus = "unknown"; + this.app2AddonCallCount = 0; + this.addon2AppCallCount = 0; + } + + post(receiver,message) { + this.appPort.postMessage(message); + } + + // workaround to handle the fact that returning functions do not have + // receiver parameter + // TODO have a unique post() function + postMessage(message) { + this.appPort.postMessage(message); + } + + updateCallCount(way,delta) { + switch(way) { + case APP2ADDON: + this.app2AddonCallCount += delta; + break; + case ADDON2APP: + this.addon2AppCallCount += delta; + break; + } + this.onCallCount.notify(this.addon2AppCallCount,this.app2AddonCallCount); + } + + close() { + if(this.appPort) + try { + this.appPort.disconnect(); + this.cleanup(); + } catch(e) {} + } + + call(...params) { + var self = this; + return this.callCatchAppNotFound(null,...params); + } + + callCatchAppNotFound(appNotFoundHandler,...params) { + var self = this; + + function ProcessPending(err) { + var call; + while(call=self.pendingCalls.shift()) { + if(err) + call.reject(err); + else { + self.runningCalls.push(call); + let _call = call; + rpc.call(self.postFn,self.name,...call.params) + .then((result)=>{ + self.runningCalls.splice(self.runningCalls.indexOf(_call),1); + return result; + }) + .then(_call.resolve) + .catch((err) => { + self.runningCalls.splice(self.runningCalls.indexOf(_call),1); + _call.reject(err); + }); + } + } + } + + if(appNotFoundHandler && (self.appStatus=="unknown" || self.appStatus=="checking")) + self.onAppNotFoundCheck.addListener(appNotFoundHandler); + + self.updateCallCount(ADDON2APP,1); + + switch(this.state) { + case "running": + return new Promise((resolve,reject)=>{ + var call = { + resolve, + reject, + params: [...params] + }; + self.runningCalls.push(call); + rpc.call(self.postFn,self.name,...params) + .then((result)=>{ + self.runningCalls.splice(self.runningCalls.indexOf(call),1); + return result; + }) + .then(call.resolve) + .catch((err)=>{ + self.runningCalls.splice(self.runningCalls.indexOf(call),1); + call.reject(err); + }) + }) + .then((result)=>{ + self.updateCallCount(ADDON2APP,-1); + return result; + }) + .catch((err)=>{ + self.updateCallCount(ADDON2APP,-1); + throw err; + }); + case "idle": + self.state = "pending"; + return new Promise((resolve,reject)=>{ + self.pendingCalls.push({ + resolve, + reject, + params: [...params] + }); + var appPort = browser.runtime.connectNative(self.appId); + self.appStatus = "checking"; + self.appPort = appPort; + appPort.onMessage.addListener((response) => { + if(self.appStatus=="checking") { + self.appStatus="ok"; + self.onAppNotFoundCheck.removeAllListeners(); + } + rpc.receive(response,self.postMessageFn,self.name); + }); + appPort.onDisconnect.addListener(() => { + ProcessPending(new Error("Disconnected")); + self.cleanup(); + if(self.appStatus=="checking" && !appNotFoundHandler) + self.onAppNotFound.notify(self.appPort && self.appPort.error || browser.runtime.lastError); + + }); + self.state = "running"; + ProcessPending(); + }) + .then((result)=>{ + self.updateCallCount(ADDON2APP,-1); + return result; + }) + .catch((err)=>{ + self.updateCallCount(ADDON2APP,-1); + throw err; + }); + case "pending": + return new Promise((resolve,reject)=>{ + self.pendingCalls.push({ + resolve, + reject, + params: [...params] + }); + }) + .then((result)=>{ + self.updateCallCount(ADDON2APP,-1); + return result; + }) + .catch((err)=>{ + self.updateCallCount(ADDON2APP,-1); + throw err; + }); + } + } + + listen(handlers) { + var self = this; + var rpcHandlers = {} + Object.keys(handlers).forEach((handler)=>{ + rpcHandlers[handler] = (...args) => { + self.updateCallCount(APP2ADDON,1); + return Promise.resolve(handlers[handler](...args)) + .then((result)=>{ + self.updateCallCount(APP2ADDON,-1); + return result; + }) + .catch((err)=>{ + self.updateCallCount(APP2ADDON,-1); + throw err; + }) + } + }); + return rpc.listen(rpcHandlers); + } + + cleanup() { + var self = this; + if(self.appStatus=="checking") { + self.onAppNotFoundCheck.notify(self.appPort && self.appPort.error || browser.runtime.lastError); + self.onAppNotFoundCheck.removeAllListeners(); + } + var call; + while(call=self.runningCalls.shift()) { + call.reject(new Error("Native port disconnected")); + } + self.state = "idle"; + self.appStatus = "unknown"; + self.appPort = null; + } +} + +module.exports = function New(...params) { + return new NativeMessagingApp(...params); +} diff --git a/src/weh-prefs.js b/src/weh-prefs.js new file mode 100644 index 0000000..27bd14d --- /dev/null +++ b/src/weh-prefs.js @@ -0,0 +1,274 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var _ = require('weh-i18n').getMessage; + +function Prefs() { + + this.$specs = {}; + this.$values = null; + if(!this.$values) + this.$values = {}; + this.$listeners = {}; +} + +Prefs.prototype = { + + notify: function(p,val,oldVal,spec) { + var self = this; + var terms = p.split("."); + var keys = []; + for(var i=terms.length;i>=0;i--) + keys.push(terms.slice(0,i).join(".")); + keys.forEach(function(key) { + var listeners = self.$listeners[key]; + if(listeners) + listeners.forEach(function(listener) { + if(listener.specs!=spec) + return; + if(!listener.pack) + try { + listener.callback(p,val,oldVal); + } catch(e) {} + else { + listener.pack[p] = val; + if(typeof listener.old[p]=="undefined") + listener.old[p] = oldVal; + if(listener.timer) + clearTimeout(listener.timer); + listener.timer = setTimeout(function() { + delete listener.timer; + var pack = listener.pack; + var old = listener.old; + listener.pack = {}; + listener.old = {}; + try { + listener.callback(pack,old); + } catch(e) {} + },0); + + } + }); + }); + + }, + + forceNotify: function(spec) { + + if(typeof spec==="undefined") + spec = false; + + var self = this; + + Object.keys(self.$specs).forEach((key)=>{ + self.notify(key, self.$values[key], self.$values[key], spec); + }); + + }, + + declare: function(specs) { + + var self = this; + + if(!Array.isArray(specs)) + specs = Object.keys(specs).map(function(prefName) { + var spec = specs[prefName]; + spec.name = prefName; + return spec; + }); + + specs.forEach(function(spec) { + + if(forbiddenKeys[spec.name]) + throw new Error("Forbidden prefs key "+spec.name); + + if(spec.hidden) { + spec.label = spec.name; + spec.description = ""; + } else { + var localeName = spec.name.replace(/[^0-9a-zA-Z_]/g,'_'); + spec.label = spec.label || _("weh_prefs_label_"+localeName) || spec.name; + spec.description = spec.description || _("weh_prefs_description_"+localeName) || ""; + } + + if(spec.type == "choice") + spec.choices = (spec.choices || []).map(function(choice) { + if(typeof choice=="object") + return choice; + if(spec.hidden) + return { + value: choice, + name: choice + } + else { + var localeChoice = choice.replace(/[^0-9a-zA-Z_]/g,'_'); + var localeChoiceTag = "weh_prefs_"+localeName+"_option_"+localeChoice; + return { + value: choice, + name: _("weh_prefs_"+localeName+"_option_"+localeChoice) || choice + } + } + }); + + var prevValue = null; + + if(!self.$specs[spec.name]) + (function(p) { + if(typeof self[spec.name]!=="undefined") + prevValue = self[spec.name]; + Object.defineProperty(self, p, { + set: function(val) { + var oldVal = self.$values[p]; + if(oldVal===val) + return; + self.$values[p] = val; + self.notify(p,val,oldVal,false); + + }, + get: function() { + return self.$values[p]!==undefined ? self.$values[p] : + (self.$specs[p] && self.$specs[p].defaultValue || undefined); + } + }); + })(spec.name); + + var oldSpecs = self.$specs[spec.name]; + self.$specs[spec.name] = spec; + if(prevValue!==null) + self.$values[spec.name] = prevValue; + else if(typeof self.$values[spec.name]=="undefined") + self.$values[spec.name] = spec.defaultValue; + + self.notify(spec.name,spec,oldSpecs,true); + }); + + }, + + on: function() { + var pref = "", options = {}, argIndex = 0; + if(typeof arguments[argIndex]=="string") + pref = arguments[argIndex++]; + if(typeof arguments[argIndex]=="object") + options = arguments[argIndex++]; + var callback = arguments[argIndex]; + var pack = !!options.pack; + + if(!this.$listeners[pref]) + this.$listeners[pref] = []; + var handler = { + callback: callback, + specs: !!options.specs + } + if(pack) { + handler.pack = {}; + handler.old = {}; + } + this.$listeners[pref].push(handler); + }, + + off: function() { + var pref = "", argIndex = 0; + if(typeof arguments[argIndex]=="string") + pref = arguments[argIndex++]; + var callback = arguments[argIndex]; + var listeners = this.$listeners[pref]; + if(!listeners) + return; + for(var i=listeners.length-1;i>=0;i--) + if(!callback || listeners[i]==callback) + listeners.splice(i,1); + }, + + getAll: function() { + return Object.assign({},this.$values); + }, + + getSpecs: function() { + return Object.assign({},this.$specs); + }, + + assign: function(prefs) { + for(var k in prefs) + if(prefs.hasOwnProperty(k)) + this[k] = prefs[k]; + }, + + isValid: function(prefName,value) { + var spec = this.$specs[prefName]; + if(!spec) + return undefined; + switch(spec.type) { + case "string": + if(spec.regexp && !new RegExp(spec.regexp).test(value)) + return false; + break; + case "integer": + if(!/^-?[0-9]+$/.test(value)) + return false; + if(isNaN(parseInt(value))) + return false; + /* falls through */ + case "float": + if(spec.type=="float") { + if(!/^-?[0-9]+(\.[0-9]+)?|(\.[0-9]+)$/.test(value)) + return false; + if(isNaN(parseFloat(value))) + return false; + } + if(typeof spec.minimum!="undefined" && value<spec.minimum) + return false; + if(typeof spec.maximum!="undefined" && value>spec.maximum) + return false; + break; + case "choice": + var ok = false; + (spec.choices || []).forEach((choice) => { + if(value==choice.value) + ok = true; + }); + if(!ok) + return false; + break; + } + return true; + }, + + reducer: function(state={}, action) { + switch(action.type) { + case "weh.SET_PREFS": + state = Object.assign({},state,action.payload); + break; + } + return state; + }, + + reduxDispatch(store) { + this.on("", { + pack:true + },(changedPrefs)=>{ + store.dispatch({ + type: "weh.SET_PREFS", + payload: changedPrefs + }); + }); + } + +} + +var prefs = new Prefs(); + +var forbiddenKeys = {}; +for(var k in prefs) + if(prefs.hasOwnProperty(k)) + forbiddenKeys[k] = true; + +module.exports = prefs; diff --git a/src/weh-rpc.js b/src/weh-rpc.js new file mode 100644 index 0000000..686da61 --- /dev/null +++ b/src/weh-rpc.js @@ -0,0 +1,204 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +class RPC { + + constructor() { + this.replyId = 0; + this.replies = {}; + this.listeners = {}; + this.hook = this.nullHook; + this.debugLevel = 0; + this.useTarget = false; + this.logger = console; + this.posts = {}; + } + + setPost(arg1, arg2) { + if(typeof arg1=="string") + this.posts[arg1] = arg2; + else + this.post = arg1; + } + + setUseTarget(useTarget) { + this.useTarget = useTarget; + } + + setDebugLevel(_debugLevel) { + this.debugLevel = _debugLevel; + } + + setHook(hook) { + var self = this; + var timestamp0 = Date.now(); + function Now() { + if(typeof window!="undefined" && typeof window.performance!="undefined") + return window.performance.now(); + else + return Date.now() - timestamp0; + } + if(hook) + this.hook = (message) => { + message.timestamp = Now(); + try { + hook(message); + } catch(e) { + self.logger.warn("Hoor error",e); + } + } + else + this.hook = this.nullHook; + } + + nullHook() {} + + call() { + var self = this; + var _post, receiver, method, args; + var _arguments = Array.prototype.slice.call(arguments); + if(typeof _arguments[0]=="function") + _post = _arguments.shift(); + if (self.useTarget) + [receiver, method, ...args] = _arguments; + else + [method, ...args] = _arguments; + var promise = new Promise(function (resolve, reject) { + var rid = ++self.replyId; + if (self.debugLevel >= 2) + self.logger.info("rpc #" + rid, "call =>", method, args); + self.hook({ + type: "call", + callee: receiver, + rid, + method, + args + }); + self.replies[rid] = { + resolve: resolve, + reject: reject, + peer: receiver + } + var post = _post || (self.useTarget && self.posts[receiver]) || self.post; + if(self.useTarget) { + post(receiver,{ + type: "weh#rpc", + _request: rid, + _method: method, + _args: [...args] + }); + } else + post({ + type: "weh#rpc", + _request: rid, + _method: method, + _args: [...args] + }); + }); + return promise; + } + + receive(message,send,peer) { + var self = this; + if (message._request) + Promise.resolve() + .then(() => { + var method = self.listeners[message._method]; + if (typeof method == "function") { + if (self.debugLevel >= 2) + self.logger.info("rpc #" + message._request, "serve <= ", message._method, message._args); + self.hook({ + type: "call", + caller: peer, + rid: message._request, + method: message._method, + args: message._args + }); + return Promise.resolve(method.apply(null, message._args)) + .then((result)=>{ + self.hook({ + type: "reply", + caller: peer, + rid: message._request, + result: result + }); + return result; + }) + .catch((error)=>{ + self.hook({ + type: "reply", + caller: peer, + rid: message._request, + error: error.message + }); + throw error; + }) + } else + throw new Error("Method " + message._method + " is not a function"); + }) + .then((result) => { + if (self.debugLevel >= 2) + self.logger.info("rpc #" + message._request, "serve => ", result); + send({ + type: "weh#rpc", + _reply: message._request, + _result: result + }); + }) + .catch((error) => { + if (self.debugLevel >= 1) + self.logger.info("rpc #" + message._request, "serve => !", error.message); + send({ + type: "weh#rpc", + _reply: message._request, + _error: error.message + }); + }); + else if (message._reply) { + var reply = self.replies[message._reply]; + delete self.replies[message._reply]; + if (!reply) + self.logger.error("Missing reply handler"); + else if (message._error) { + if (self.debugLevel >= 1) + self.logger.info("rpc #" + message._reply, "call <= !", message._error); + self.hook({ + type: "reply", + callee: reply.peer, + rid: message._reply, + error: message._error + }); + reply.reject(new Error(message._error)); + } else { + if (self.debugLevel >= 2) + self.logger.info("rpc #" + message._reply, "call <= ", message._result); + self.hook({ + type: "reply", + callee: reply.peer, + rid: message._reply, + result: message._result + }); + reply.resolve(message._result); + } + } + } + + listen(listener) { + Object.assign(this.listeners,listener); + } + +} + +module.exports = new RPC(); + + + diff --git a/src/weh-ui.js b/src/weh-ui.js new file mode 100644 index 0000000..62bcd28 --- /dev/null +++ b/src/weh-ui.js @@ -0,0 +1,243 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var weh = require('weh'); +var wehRpc = require('weh-rpc'); + +var browser = weh.browser; +var panels = {}; +var tabs = {}; + +function Open(name,options) { + switch(options.type) { + case "panel": + return OpenPanel(name,options); + break; + case "tab": + default: + return OpenTab(name,options); + } +} + +function OpenTab(name,options) { + return new Promise((resolve, reject) => { + var url = browser.extension.getURL(options.url+"?panel="+name); + GotoTab(url) + .then(function(foundTab) { + if(!foundTab) + return browser.tabs.create({ + url: url, + }) + .then(function(tab) { + weh.__declareAppTab(name,{tab:tab.id,initData:options.initData}); + panels[name] = { + type: "tab", + tabId: tab.id + } + tabs[tab.id] = name; + }); + }) + .then(resolve) + .catch(reject); + }) +} + +function CreatePanel(name,options) { + return new Promise((resolve, reject) => { + var url = browser.extension.getURL(options.url+"?panel="+name); + + browser.windows.getCurrent() + .then((currentWindow) => { + var width = options.width || 500; + var height = options.height || 400; + var cwcParam = { + url, + width, + height, + type: "popup", + left: Math.round((currentWindow.width-width)/2+currentWindow.left), + top: Math.round((currentWindow.height-height)/2+currentWindow.top), + }; + if(weh.isBrowser("chrome","opera")) + cwcParam.focused = true; + + return browser.windows.create(cwcParam) + .then((window) => { + panels[name] = { + type: "window", + windowId: window.id + } + return Promise.all([window,browser.windows.update(window.id,{ + focused: true + })]); + }) + .then(([window]) => { + // trick to repaint window on Firefox + // useless if auto resize + Promise.resolve() + .then(()=>{ + if(options.initData && options.initData.autoResize) + return; + else + return browser.windows.update(window.id,{ + height: window.height+1 + }) + .then(()=>{ + return browser.windows.update(window.id,{ + height: window.height-1 + }) + }); + }) + .then(()=>{ + var promise1 = new Promise((resolve, reject) => { + var timer = setTimeout(()=>{ + browser.tabs.onCreated.removeListener(ListenOpenedTabs); + reject(new Error("Tab did not open")); + },5000); + function ListenOpenedTabs(tab) { + if(tab.windowId==window.id) { + clearTimeout(timer); + browser.tabs.onCreated.removeListener(ListenOpenedTabs); + resolve(tab); + } + } + browser.tabs.onCreated.addListener(ListenOpenedTabs); + }); + var promise2 = browser.tabs.query({ + windowId: window.id + }).then((_tabs)=>{ + return new Promise((resolve, reject) => { + if(_tabs.length>0) + resolve(_tabs[0]); + }); + }); + return Promise.race([promise1,promise2]); + }) + .then((tab)=>{ + if(tab.status=="loading") { + return new Promise((resolve, reject) => { + var timer = setTimeout(()=>{ + browser.tabs.onUpdated.removeListener(onUpdated); + reject(new Error("Tab did not complete")); + },60000); + function onUpdated(tabId,changeInfo,_tab) { + if(tabId == tab.id && _tab.status=="complete") { + clearTimeout(timer); + browser.tabs.onUpdated.removeListener(onUpdated); + resolve(_tab); + } + } + browser.tabs.onUpdated.addListener(onUpdated); + }) + } else + return tab; + }) + .then((tab)=>{ + weh.__declareAppTab(name,{tab:tab.id,initData:options.initData}); + tabs[tab.id] = name; + }).then(resolve) + .catch(reject); + + + function OnFocusChanged(focusedWindowId) { + if(focusedWindowId==window.id) + return; + + if(!options.autoClose) + return; + + browser.windows.getCurrent() + .then((currentWindow) => { + if(currentWindow.id!=window.id) + browser.windows.remove(window.id) + .then(()=>{},()=>{}); + }); + } + function OnRemoved(removedWindowId) { + if(removedWindowId==window.id) { + browser.windows.onFocusChanged.removeListener(OnFocusChanged); + browser.windows.onFocusChanged.removeListener(OnRemoved); + } + } + browser.windows.onFocusChanged.addListener(OnFocusChanged); + browser.windows.onRemoved.addListener(OnRemoved); + }) + .catch(reject); + }) + .catch(reject); + }) +} + +function OpenPanel(name,options) { + return new Promise((resolve, reject) => { + var url = browser.extension.getURL(options.url+"?panel="+name); + GotoTab(url) + .then((found)=>{ + if(!found) + return CreatePanel(name,options); + }) + .then(resolve) + .catch(reject); + }) +} + + +browser.tabs.onRemoved.addListener((tabId)=>{ + weh.__closeByTab(tabId); + var panelName = tabs[tabId]; + if(panelName) { + delete tabs[tabId]; + delete panels[panelName]; + } +}); + +function GotoTab(url, callback) { + var foundTab = false; + return new Promise( function(resolve, reject) { + return browser.tabs.query({}) + .then(function (tabs) { + tabs.forEach(function (tab) { + if (tab.url === url) { + browser.tabs.update(tab.id, { + active: true + }); + browser.windows.update(tab.windowId, { + focused: true + }); + foundTab = true; + } + }); + resolve(foundTab); + }) + }); +} + + +function Close(name) { + var tab = panels[name]; + if(tab && tab.type=="tab") + browser.tabs.remove(tab.tabId); + else if(tab && tab.type=="window") + browser.windows.remove(tab.windowId); + else + wehRpc.call(name,"close"); +} + +function IsOpen(name) { + return !!panels[name]; +} + +module.exports = { + open: Open, + close: Close, + isOpen: IsOpen +} diff --git a/src/content/weh-ct-ready.js b/src/weh-worker-rpc.js similarity index 65% rename from src/content/weh-ct-ready.js rename to src/weh-worker-rpc.js index 990982a..c81f346 100644 --- a/src/content/weh-ct-ready.js +++ b/src/weh-worker-rpc.js @@ -10,6 +10,13 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -weh.post({ - type: "weh#on" -}); +/* setting up RPC */ +const rpc = require('./weh-rpc'); + +/* connecting with main thread */ +rpc.setPost(postMessage); +global.onmessage = (event)=>{ + rpc.receive(event.data, postMessage); +}; + +module.exports = rpc; \ No newline at end of file diff --git a/src/weh-worker.js b/src/weh-worker.js new file mode 100644 index 0000000..2915ae5 --- /dev/null +++ b/src/weh-worker.js @@ -0,0 +1,93 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +const rpc = require('weh-rpc'); + +class WehWorker { + + constructor(file, options = {}) { + this.name = options.name || file; + this.autoKill = (typeof options.autoKill !== "undefined") ? options.autoKill : false; + this.autoKillTimer = null; + this.file = file; + this.callsInProgress = 0; + this.postFn = this.post.bind(this); + this.worker = null; + if(options.startNow) + this.ensureWorkerStarted(); + } + + ensureWorkerStarted() { + if(!this.worker) { + var self = this; + this.startKillTimer(); + this.worker = new Worker(this.file); + this.worker.onmessage = (event) => { + rpc.receive(event.data,self.postFn,self.name); + }; + } + } + + post(receiver,message) { + this.ensureWorkerStarted(); + this.worker.postMessage(message); + } + + endKillTimer() { + if(this.autoKillTimer) { + clearTimeout(this.autoKillTimer); + this.autoKillTimer = null; + } + } + + startKillTimer() { + this.endKillTimer(); + if(this.autoKill!==false) { + var self = this; + this.autoKillTimer = setTimeout(function() { + self.worker.terminate(); + self.worker = null; + }, this.autoKill); + } + } + + callEnded() { + this.callsInProgress--; + if(this.callsInProgress===0) + this.startKillTimer(); + } + + call(...params) { + var self = this; + this.callsInProgress++; + this.endKillTimer(); + return rpc.call(this.postFn,this.name,...params) + .then((result)=>{ + self.callEnded(); + return result; + }) + .catch((err)=>{ + self.callEnded(); + throw err; + }); + } + +} + +module.exports = (...params) => { + return new WehWorker(...params); +} +/* +export default (...params) => { + return new WehWorker(...params); +} +*/ diff --git a/src/weh.js b/src/weh.js new file mode 100644 index 0000000..168500d --- /dev/null +++ b/src/weh.js @@ -0,0 +1,39 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +exports.browser = require('webextension-polyfill'); + +var browserType; +if(typeof browser == "undefined" && typeof chrome !== "undefined" && chrome.runtime) { + if(/\bOPR\//.test(navigator.userAgent)) + browserType = "opera"; + else + browserType = "chrome"; + } else if(/\bEdge\//.test(navigator.userAgent)) + browserType = "edge"; + else + browserType = "firefox"; +exports.browserType = browserType; + +exports.isBrowser = (...args) => { + for(var i=0; i<args.length; i++) + if(args[i]==exports.browserType) + return true; + return false; +} + +exports.error = (err) => { + console.groupCollapsed(err.message); + if(err.stack) + console.error(err.stack); + console.groupEnd(); +} diff --git a/templates/inspector/locales/en_US/messages.json b/templates/inspector/locales/en_US/messages.json new file mode 100644 index 0000000..c99accb --- /dev/null +++ b/templates/inspector/locales/en_US/messages.json @@ -0,0 +1,77 @@ +{ + "weh_inspector": { + "message": "Weh Inspector" + }, + "rescan_addons": { + "message": "Rescan addons" + }, + "messages_none": { + "message": "No message" + }, + "clear_messages": { + "message": "Clear messages" + }, + "storage": { + "message": "Storage" + }, + "show_storage": { + "message": "Storage" + }, + "get_prefs": { + "message": "Preferences" + }, + "prefs": { + "message": "Preferences" + }, + "prefs_save": { + "message": "Save" + }, + "weh_prefs_label_messages_display_mode": { + "message": "Messages display mode" + }, + "weh_prefs_description_messages_display_mode": { + "message": "How calls/replies should be displayed" + }, + "weh_prefs_messages_display_mode_option_async": { + "message": "Asynchronous" + }, + "weh_prefs_messages_display_mode_option_sync_call": { + "message": "Synchronous (on call)" + }, + "weh_prefs_messages_display_mode_option_sync_reply": { + "message": "Synchronous (on reply)" + }, + "weh_prefs_label_display_timestamp": { + "message": "Display timestamp" + }, + "weh_prefs_description_display_timestamp": { + "message": "Should the event timestamp be displayed" + }, + "weh_prefs_label_display_call_duration": { + "message": "Display call duration" + }, + "weh_prefs_description_display_call_duration": { + "message": "Should the call duration be displayed" + }, + "weh_prefs_label_max_messages": { + "message": "Max messages" + }, + "weh_prefs_description_max_messages": { + "message": "Maximum number of messages to be displayed (0=no limit)" + }, + "translation": { + "message": "Translation" + }, + "save": { + "message": "Save" + }, + "cancel": { + "message": "Cancel" + }, + "default": { + "message": "Default" + }, + "rpc_messages": { + "message": "RPC messages" + } +} diff --git a/templates/inspector/package.json b/templates/inspector/package.json new file mode 100644 index 0000000..51adc5d --- /dev/null +++ b/templates/inspector/package.json @@ -0,0 +1,7 @@ +{ + "name": "weh-inspector", + "version": "1.0.0", + "dependencies": { + "react-json-view": "^1.11.8" + } +} diff --git a/templates/inspector/src-modules/default-prefs.js b/templates/inspector/src-modules/default-prefs.js new file mode 100644 index 0000000..7c91f4c --- /dev/null +++ b/templates/inspector/src-modules/default-prefs.js @@ -0,0 +1,25 @@ + +module.exports = [{ + name: "messages_display_mode", + type: "choice", + defaultValue: "sync_reply", + width: "20em", + choices: ["async","sync_call","sync_reply"] +},{ + name: "display_timestamp", + type: "boolean", + defaultValue: false +},{ + name: "display_call_duration", + type: "boolean", + defaultValue: true +},{ + name: "max_messages", + type: "integer", + defaultValue: 100 +},{ + name: "redux_logger", + type: "boolean", + defaultValue: false, + hidden: true +}]; diff --git a/templates/inspector/src/background/main.js b/templates/inspector/src/background/main.js new file mode 100644 index 0000000..be7d6f9 --- /dev/null +++ b/templates/inspector/src/background/main.js @@ -0,0 +1,190 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var weh = require('weh-background'); + +var browser = weh.browser; + +var allowFromAddonId = null; + +weh.rpc.listen({ + openSettings: () => { + weh.ui.open("settings",{ + type: "tab", + url: "content/settings.html" + }); + weh.ui.close("main"); + }, + openTranslation: () => { + weh.ui.open("translation",{ + type: "tab", + url: "content/translation.html" + }); + weh.ui.close("main"); + }, + getAddons: () => { + return new Promise((resolve,reject)=>{ + if(!browser.management) + return reject(new Error("Browser management not available")); + browser.management.getAll() + .then((extensions) => { + Promise.all(extensions.map(CheckAddon)) + .then((addons)=>{ + resolve(addons.filter((addon)=>{ + return addon!==null; + })) + }) + .catch(reject); + }) + .catch(reject); + }); + }, + updateMonitoredAddon: (newAddonId,oldAddonId) => { + allowFromAddonId = newAddonId; + if(oldAddonId && oldAddonId!=newAddonId) + browser.runtime.sendMessage(oldAddonId,{ + type: "weh#inspect", + inspected: false + }); + if(newAddonId) + browser.runtime.sendMessage(newAddonId,{ + type: "weh#inspect", + inspected: true + }); + }, + getPrefs: (addonId) => { + return new Promise((resolve,reject) => { + browser.runtime.sendMessage(addonId,{ + type: "weh#get-prefs" + }) + .then((response) => { + if(!response) + reject(new Error("No addon answer")); + else + resolve(response); + }) + .catch(reject); + }) + }, + getStorage: (addonId) => { + return new Promise((resolve,reject) => { + browser.runtime.sendMessage(addonId,{ + type: "weh#get-storage" + }) + .then((response) => { + if(!response) + reject(new Error("No addon answer")); + else + resolve(response); + }) + .catch(reject); + }) + }, + setAddonPref: (pref,value,addonId) => { + return new Promise((resolve,reject) => { + browser.runtime.sendMessage(addonId,{ + type: "weh#set-pref", + pref, + value + }) + .then((response) => { + if(!response) + reject(new Error("No addon answer")); + else + resolve(response); + }) + .catch(reject); + }) + } +}); + +function CheckNewAddon(addon) { + if(addon.id==allowFromAddonId) { + var counter=0; + function Connect() { + if(counter++>100) + return; + browser.runtime.sendMessage(addon.id,{ + type: "weh#inspect", + inspected: true + }) + .then((response)=>{ + if(!response) + setTimeout(Connect,100); + }) + .catch((err)=>{ + setTimeout(Connect,100); + }); + } + Connect(); + } +} + +function SetupContextMenu() { + browser.contextMenus.create({ + "title": weh._("weh_inspector"), + "type": "normal", + "contexts":["page"], + "id": "weh-inspector" + }); +} + +SetupContextMenu(); + +function CheckAddon(extension) { + var id = extension.id; + return new Promise((resolve,reject)=>{ + browser.runtime.sendMessage(id,{ + type: "weh#inspect-ping" + }) + .then((response) => { + if(response && response.type=="weh#inspect-pong") { + resolve(Object.assign({},response.manifest,{ id })); + } else { + resolve(null); + } + }) + .catch(()=>{ + resolve(null); + }); + }); +} + +browser.contextMenus.onClicked.addListener(function(info) { + if(info.menuItemId == "weh-inspector" ) { + weh.ui.open("inspector",{ + type: "tab", + url: "content/inspector.html" + }); + } +}); + +browser.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) { + switch(message.type) { + case "weh#inspect-message": + if(sender.id===allowFromAddonId) + weh.rpc.call("inspector","newMessage",message.message); + break; + case "weh#storage": + if(sender.id===allowFromAddonId) + weh.rpc.call("inspector","setAddonStorage",message); + break; + } + sendResponse(true); +}); + +weh.prefs.declare(require('default-prefs')); + +if(browser.management.onInstalled) + browser.management.onInstalled.addListener(CheckNewAddon); +if(browser.management.onEnabled) + browser.management.onEnabled.addListener(CheckNewAddon); diff --git a/templates/weh-inspector/src/content/_assets/images/icon-128.png b/templates/inspector/src/content/images/icon-128.png similarity index 100% rename from templates/weh-inspector/src/content/_assets/images/icon-128.png rename to templates/inspector/src/content/images/icon-128.png diff --git a/templates/weh-inspector/src/content/_assets/images/icon-32.png b/templates/inspector/src/content/images/icon-32.png similarity index 100% rename from templates/weh-inspector/src/content/_assets/images/icon-32.png rename to templates/inspector/src/content/images/icon-32.png diff --git a/templates/weh-inspector/src/content/_assets/images/icon-40.png b/templates/inspector/src/content/images/icon-40.png similarity index 100% rename from templates/weh-inspector/src/content/_assets/images/icon-40.png rename to templates/inspector/src/content/images/icon-40.png diff --git a/templates/weh-inspector/src/content/_assets/images/icon-48.png b/templates/inspector/src/content/images/icon-48.png similarity index 100% rename from templates/weh-inspector/src/content/_assets/images/icon-48.png rename to templates/inspector/src/content/images/icon-48.png diff --git a/templates/inspector/src/content/inspector.html b/templates/inspector/src/content/inspector.html new file mode 100644 index 0000000..0f8672e --- /dev/null +++ b/templates/inspector/src/content/inspector.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html class="weh-shf"> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root" class="weh-shf"></div> + <script src="inspector.js"></script> + </body> +</html> diff --git a/templates/inspector/src/content/inspector.jsx b/templates/inspector/src/content/inspector.jsx new file mode 100644 index 0000000..797d015 --- /dev/null +++ b/templates/inspector/src/content/inspector.jsx @@ -0,0 +1,923 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react'; +import { render } from 'react-dom'; +import { Provider } from 'react-redux'; +import { applyMiddleware, createStore, combineReducers } from 'redux'; +import { createLogger } from 'redux-logger'; +import WehHeader from 'react/weh-header'; +import {connect} from 'react-redux'; +import {bindActionCreators} from 'redux'; +import ReactJson from 'react-json-view'; + +import weh from 'weh-content'; + +import bootstrapStyles from 'bootstrap/dist/css/bootstrap.css'; + +var messageIndex = 1; + +function MessagesReducer(state={ + raw: [], + calls: {} + }, action) { + switch(action.type) { + case "CLEAR_MESSAGES": + state = { + raw: [], + calls: {} + } + break; + + case "NEW_MESSAGE": { + state = Object.assign({},state); + let index = state.raw.length; + let callKey = (action.payload.caller||"!") + "#" + + (action.payload.callee||"!") + "#" + + action.payload.rid; + if(action.payload.type=="call") { + let calls = Object.assign({},state.calls); + calls[callKey] = index; + state.calls = calls; + state.raw = state.raw.concat({ + type: "call", + call: action.payload, + key: messageIndex++ + }); + } else if(action.payload.type=="reply") { + let callIndex = state.calls[callKey]; + let entry = { + type: "reply", + reply: action.payload, + key: messageIndex++ + } + if(typeof callIndex!=="undefined") { + let call = state.raw[callIndex]; + call.reply = action.payload; + entry.call = call.call; + } + entry.result = action.payload.result; + entry.error = action.payload.error; + state.raw = state.raw.concat(entry); + } + if(weh.prefs.max_messages && state.raw.length>weh.prefs.max_messages) { + var calls = {}; + var raw = state.raw.slice(0); + while(raw.length>weh.prefs.max_messages) { + Object.keys(state.calls).forEach((key)=>{ + var callIndex = state.calls[key]; + if(callIndex>0) + calls[key] = callIndex-1; + }); + raw.shift(); + } + state = { calls, raw }; + } + } + break; + } + return state; +} + +function AddonsReducer(state={ + all: [], + selected: null, + prefs: null, + storage: null + }, action) { + var oldSelectedId = state.selected && state.selected.id || null; + var selected; + switch(action.type) { + case "SET_PREF": { + let { pref, value, addonId } = action.payload; + if(state.prefs) { + state = Object.assign({}, state, { + prefs: Object.assign({},state.prefs,{ + [pref]: value + }) + }); + weh.rpc.call("setAddonPref",pref,value,addonId); + } + } + break; + case "ADDONS": + selected = action.payload.filter((addon)=>{ + return addon.id === oldSelectedId; + })[0] || action.payload[0] || null; + state = { + all: action.payload, + selected, + prefs: null, + storage: null + } + UpdateMonitoredAddon(selected && selected.id || null, oldSelectedId); + break; + + case "SELECT_ADDON": + selected = state.all.filter((addon)=>{ + return addon.id === action.payload; + })[0] || null; + state = { + all: state.all, + prefs: null, + storage: null, + selected + } + UpdateMonitoredAddon(selected && selected.id || null, oldSelectedId); + break; + + case "SET_ADDON_PREFS": + state = { + all: state.all, + prefs: action.payload.prefs, + specs: action.payload.specs, + storage: state.storage, + selected: state.selected + } + break; + + case "SET_ADDON_STORAGE": + state = { + all: state.all, + prefs: state.prefs, + storage: action.payload.storage, + selected: state.selected + } + break; + } + return state; +} + +function AppReducer(state={ + tab: "messages" + },action) { + switch(action.type) { + case "SELECT_TAB": + state = { + tab: action.payload + } + break; + } + return state; +} + +function UpdateMonitoredAddon(newAddonId,oldAddonId) { + if(newAddonId!==oldAddonId) + weh.rpc.call("updateMonitoredAddon",newAddonId,oldAddonId); +} + +let reducers = combineReducers({ + messages: MessagesReducer, + addons: AddonsReducer, + app: AppReducer, + prefs: weh.prefs.reducer +}); + +var middlewares = []; +if(weh.prefs.redux_logger) + middlewares.push(createLogger({ + collapsed: (getState, action, logEntry) => true + })) + + +let store = createStore(reducers, applyMiddleware(...middlewares)); + +weh.prefs.reduxDispatch(store); + +weh.rpc.listen({ + newMessage: (message) => { + store.dispatch({ + type: "NEW_MESSAGE", + payload: message + }) + }, + setAddonStorage: (storage) => { + store.dispatch({ + type: "SET_ADDON_STORAGE", + payload: storage + }); + store.dispatch({ + type: "SELECT_TAB", + payload: "storage" + }); + } +}); + +var AddonSelector = connect( + // map redux state to react component props + (state) => { + return { + addons: state.addons.all, + addon: state.addons.selected, + } + }, + // make some redux actions available as react component props + (dispatch) => { + return bindActionCreators ({ + select: (addonId) => { + return { + type: "SELECT_ADDON", + payload: addonId + } + } + },dispatch); + } +)( + class extends React.Component { + constructor(props) { + super(props); + this.handleChange = this.handleChange.bind(this); + this.state = { + addon: this.props.addon || "" + } + } + + componentWillReceiveProps(props) { + this.setState({ + addon: props.addon || "" + }) + } + + handleChange(event) { + var value = event.target.value; + this.props.select(value || null); + } + + render() { + var options = (this.props.addons || []) + .map((addon)=>{ + return ( + <option key={addon.id} value={addon.id}>{addon.name}</option> + ) + }); + return ( + <select + value={this.state.addon && this.state.addon.id || ""} + onChange={this.handleChange} + className="form-control" + style={{ width: "100%" }}> + {options} + </select> + ) + } + } +) + +var Message = connect( + // map redux state to react component props + (state) => { + return { + displayMode: state.prefs.messages_display_mode, + displayTimestamp: state.prefs.display_timestamp, + displayDuration: state.prefs.display_call_duration + } + }, + null +)( + class extends React.Component { + + displayTimestamp(which) { + if(this.props.displayTimestamp && this.props.src[which]) + return ( + <span className="im-timestamp">{this.props.src[which].timestamp.toFixed(3)}</span> + ) + else + return ""; + } + + displayCallDuration() { + if(this.props.displayDuration && this.props.src.call && this.props.src.reply) + return ( + <span className="im-duration"> + {(this.props.src.reply.timestamp - this.props.src.call.timestamp).toFixed(3)}ms + </span> + ) + else + return ""; + + } + + renderJson(obj) { + switch(typeof obj) { + case "number": + case "string": + case "boolean": + return ( + <div className="react-json-view scalar-view"> + {JSON.stringify(obj)} + </div> + ); + } + if(obj === null) + return ( + <div className="react-json-view scalar-view">null</div> + ); + return ( + <ReactJson src={obj} + name={null} + collapsed={true} + enableClipboard={false} + collapseStringsAfterLength={64} + displayDataTypes={false} + displayObjectSize={false} + style={{display:"inline-block"}} + /> + ) + } + + renderResult() { + if(typeof this.props.src.reply.result !=="undefined") + return ( + <span> + <span className="im-result-sign">=</span> + {this.renderJson(this.props.src.reply.result)} + </span> + ) + else if(this.props.src.reply.error) + return ( + <span className="im-error"> + <span className="im-error-sign" dangerouslySetInnerHTML={{__html:"⇒"}}/> + {this.props.src.reply.error} + </span> + ) + else + return ""; + } + + renderSync() { + if(this.props.displayMode=="sync_"+this.props.src.type && this.props.src.call && + (this.props.src.reply || this.props.src.error)) { + var label = "<" + (this.props.src.call.caller || '') + "> => " + + "<" + (this.props.src.call.callee || '') + ">." + this.props.src.call.method; + return ( + <div className="insp-msg"> + {this.displayTimestamp(this.props.src.type)} + <span className="im-caller"><{this.props.src.call.caller || ''}></span> + <span className="im-call-sign">⇒</span> + <span className="im-callee"><{this.props.src.call.callee || ''}> + </span>.<span className="im-method">{this.props.src.call.method} + </span>({this.props.src.call.args.length && this.renderJson(this.props.src.call.args) || ''}) + {this.renderResult()} + {this.displayCallDuration()} + </div> + ) + } else + return null; + } + + renderAsync() { + if(this.props.src.type=="call" && this.props.src.call) + return ( + <div className="insp-msg"> + <span className="im-caller"><{this.props.src.call.caller || ''}#{this.props.src.call.rid}></span> + <span className="im-call-sign">⇒</span> + <span className="im-callee"><{this.props.src.call.callee || ''}> + </span>.<span className="im-method">{this.props.src.call.method} + </span>({this.props.src.call.args.length && this.renderJson(this.props.src.call.args) || ''}) + </div> + ) + else if(this.props.src.type=="reply" && this.props.src.reply) + if(this.props.src.call) + return ( + <div className="insp-msg"> + <span className="im-caller"><{this.props.src.call.caller || ''}#{this.props.src.call.rid}></span> + <span className="im-call-sign">⇐</span> + <span className="im-callee"><{this.props.src.call.callee || ''}> + </span>.<span className="im-method">{this.props.src.call.method} + </span>() + {this.renderResult()} + </div> + ) + else // original call expired from inspector + return ( + <div className="insp-msg"> + <span className="im-caller"><???></span> + <span className="im-call-sign">⇐</span> + <span className="im-callee"><???> + </span>.<span className="im-method">??? + </span>() + {this.renderResult()} + </div> + ) + else + return null; + } + + render() { + if(this.props.displayMode=="async") + return this.renderAsync(); + else if(/sync_(?:call|reply)/.test(this.props.displayMode)) + return this.renderSync(); + return null + } + } +) + +var Messages = connect( + // map redux state to react component props + (state) => { + return { + messages: state.messages, + } + }, + null +)( + class extends React.Component { + + render() { + if(this.props.messages.raw.length==0) + return ( + <div className="no-message">{weh._('messages_none')}</div> + ) + var messages = this.props.messages.raw + .map((message)=>{ + // ensures key changes when reply field added to message + var key = message.key + "-" + (message.call && "C") + (message.reply && "R"); + return ( + <Message src={message} key={key}/> + ) + }); + return ( + <ul className="list-group"> + {messages} + </ul> + ) + } + } +) + +var AddonPrefs = connect( + // map redux state to react component props + (state) => { + return { + addon: state.addons.selected, + addonPrefs: state.addons.prefs, + addonPrefSpecs: state.addons.specs, + } + }, + (dispatch) => { + return bindActionCreators ({ + setPref: (pref,value,addonId) => { + return { + type: "SET_PREF", + payload: { pref, value, addonId } + } + } + },dispatch); + } + +)( + class extends React.Component { + + constructor(props) { + super(props); + this.state = { + editing: {}, + valid: {} + } + } + + editingChanged(pref) { + var self = this; + return (event)=>{ + if(event.target.checked) + self.setState({ + editing: Object.assign({},self.state.editing,{ + [pref]: self.props.addonPrefs[pref] + }), + valid: Object.assign({},self.state.valid,{ + [pref]: true + }) + }); + else { + var editing = Object.assign({},self.state.editing); + delete editing[pref]; + var valid = Object.assign({},self.state.valid); + delete valid[pref]; + self.setState({ editing, valid }); + } + } + } + + valueChanged(pref) { + var self = this; + return (event)=>{ + var value = event.target.value; + var valid = true; + switch(self.props.addonPrefSpecs[pref].type) { + case "boolean": + if(value!="true" && value!="false") + valid = false; + break; + case "integer": + valid = /^\d+$/.test(value); + break; + case "float": + valid = /^(\.\d+|\d+(\.\d*)?)$/.test(value); + break; + } + self.setState({ + editing: Object.assign({},self.state.editing,{ + [pref]: value + }), + valid: Object.assign({},self.state.editing,{ + [pref]: valid + }) + }) + } + } + + onKeyPress(pref) { + var self = this; + return (event)=>{ + if(event.key=='Enter' && self.state.valid[pref]) { + var value = self.state.editing[pref]; + var editing = Object.assign({},self.state.editing); + delete editing[pref]; + var valid = Object.assign({},self.state.valid); + delete valid[pref]; + self.setState({ editing, valid }); + switch(self.props.addonPrefSpecs[pref].type) { + case "boolean": + value = value=="true"; + break; + case "integer": + value = parseInt(value); + break; + case "float": + value = parseFloat(value); + break; + } + self.props.setPref(pref,value,self.props.addon.id); + } + } + } + + render() { + if(!this.props.addonPrefs) + return null; + var self = this; + var rows = Object.keys(this.props.addonPrefs).sort().map((key)=>{ + return ( + <tr key={key}> + <td><input data-pref-sel={key} checked={!!this.state.editing[key]} + onChange={this.editingChanged(key)} type="checkbox"/></td> + <td><strong>{key}</strong></td> + { typeof this.state.editing[key] === "undefined" && ( + <td className="pref-value">{JSON.stringify(self.props.addonPrefs[key],null,4)}</td> + )} + { typeof this.state.editing[key] !== "undefined" && ( + <td className={"pref-edit "+(this.state.valid[key]?"":"error")}> + <input data-pref={key} type="text" + onChange={this.valueChanged(key)} + onKeyPress={this.onKeyPress(key)} + value={this.state.editing[key]}/> + </td> + )} + </tr> + ) + }) + return ( + <div className="table-responsive"> + <table className="table prefs-table"> + <tbody> + {rows} + </tbody> + </table> + </div> + ) + } + } +) + +var AddonStorage = connect( + // map redux state to react component props + (state) => { + return { + addonStorage: state.addons.storage, + } + }, + null +)( + class extends React.Component { + + render() { + if(!this.props.addonStorage) + return null; + var self = this; + var rows = []; + Object.keys(this.props.addonStorage).sort().forEach((storageType)=>{ + if(Object.keys(self.props.addonStorage[storageType]).length==0) + return; + rows.push( + <tr className="storage-type" key={"type."+storageType}><td colSpan={2}>{storageType}</td></tr> + ); + Object.keys(self.props.addonStorage[storageType]).sort().forEach((key)=>{ + rows.push( + <tr key={"type."+storageType+"."+key}> + <td><strong>{key}</strong></td> + <td className="insp-msg"> + { self.props.addonStorage[storageType][key] instanceof Object && ( + <ReactJson src={self.props.addonStorage[storageType][key]} + name={null} + collapsed={true} + enableClipboard={false} + collapseStringsAfterLength={256} + displayDataTypes={true} + displayObjectSize={true} + /> + )} + { !(self.props.addonStorage[storageType][key] instanceof Object) && ( + <span>{JSON.stringify(self.props.addonStorage[storageType][key])}</span> + )} + </td> + </tr> + ); + }); + }); + + return ( + <div className="table-responsive"> + <table className="table storage-table"> + <tbody> + {rows} + </tbody> + </table> + </div> + ) + } + } +) + +var SelectedAddon = connect( + // map redux state to react component props + (state) => { + return { + addon: state.addons.selected, + } + }, + null +)( + class extends React.Component { + + render() { + if(!this.props.addon) + return null; + return ( + <div className="sel-addon float-right"> + {this.props.addon.name} {this.props.addon.version} + <span className="sel-addon-id">{this.props.addon.id}</span> + </div> + ) + } + } +) + +var Commands = connect( + // map redux state to react component props + (state) => { + return { + addon: state.addons.selected, + } + }, + // make some redux actions available as react component props + (dispatch) => { + return bindActionCreators ({ + clearMessages: () => { + return { + type: "CLEAR_MESSAGES" + } + }, + setAddonPrefs: (prefs) => { + return { + type: "SET_ADDON_PREFS", + payload: prefs + } + }, + selectTab: (tab) => { + return { + type: "SELECT_TAB", + payload: tab + } + } + },dispatch); + } + +)( + class extends React.Component { + + constructor(props) { + super(props); + this.getAddonPrefs = this.getAddonPrefs.bind(this); + this.getAddonStorage = this.getAddonStorage.bind(this); + } + + getAddonPrefs() { + var self = this; + weh.rpc.call("getPrefs",this.props.addon.id) + .then((addonPrefs)=>{ + self.props.selectTab("prefs"); + self.props.setAddonPrefs(addonPrefs); + }) + } + + getAddonStorage() { + var self = this; + weh.rpc.call("getStorage",this.props.addon.id); + } + + render() { + return ( + <ul className="list-group commands"> + <li className=""> + <a + className="" + onClick={ScanAddons}> + {weh._('rescan_addons')} + </a> + </li> + { this.props.addon && ( + <li className=""> + <a + className="" + onClick={this.props.clearMessages}> + {weh._('clear_messages')} + </a> + </li> + )} + { this.props.addon && ( + <li className=""> + <a + className="" + onClick={this.getAddonPrefs}> + {weh._('get_prefs')} + </a> + </li> + )} + { this.props.addon && ( + <li className=""> + <a + className="" + onClick={this.getAddonStorage}> + {weh._('show_storage')} + </a> + </li> + )} + </ul> + ) + } + } +) + +var App = connect( + // map redux state to react component props + (state) => { + return { + tab: state.app.tab, + addon: state.addons.selected, + addonPrefs: state.addons.prefs, + addonStorage: state.addons.storage + } + }, + // make some redux actions available as react component props + (dispatch) => { + return bindActionCreators ({ + selectTabMessages: (tab) => { + return { + type: "SELECT_TAB", + payload: "messages" + } + }, + selectTabPrefs: (tab) => { + return { + type: "SELECT_TAB", + payload: "prefs" + } + }, + selectTabStorage: (tab) => { + return { + type: "SELECT_TAB", + payload: "storage" + } + } + },dispatch); + } + +)( + class extends React.Component { + + renderSidebar() { + return ( + <div className="p-3 insp-scrollable"> + <AddonSelector/> + <Commands/> + </div> + ) + } + + renderNavItem(tab,onClick,labelTag) { + return ( + <li className="nav-item"> + <a + className={ "nav-link "+(this.props.tab==tab ? "active":"")} + href="#" + data-toggle="tab" + onClick={onClick}> + {weh._(labelTag)} + </a> + </li> + ) + } + + renderContent() { + return ( + <div className="p-3 insp-container"> + <ul className="nav nav-tabs insp-tabs"> + { this.renderNavItem("messages",this.props.selectTabMessages,"rpc_messages") } + { this.props.addonPrefs && ( + <li className="nav-item"> + <a + className={ "nav-link "+(this.props.tab=="prefs" ? "active":"")} + href="#tab-prefs" + data-toggle="tab" + onClick={this.props.selectTabPrefs}> + {weh._('prefs')} + </a> + </li> + )} + { this.props.addonStorage && ( + <li className="nav-item"> + <a + className={ "nav-link "+(this.props.tab=="storage" ? "active":"")} + href="#tab-storage" + data-toggle="tab" + onClick={this.props.selectTabStorage}> + {weh._('storage')} + </a> + </li> + )} + </ul> + <div className="insp-main-content"> + <div className="tab-content"> + <div className="tab-pane active"> + <br/> + { this.props.tab=="messages" && (<Messages/>)} + { this.props.tab=="prefs" && (<AddonPrefs/>)} + { this.props.tab=="storage" && (<AddonStorage/>)} + </div> + </div> + </div> + </div> + ) + } + + render() { + return ( + <div className="weh-shf"> + <WehHeader> + <SelectedAddon/> + </WehHeader> + <main className="insp-layout"> + <div className="insp-main"> + <div className="insp-left"> + {this.renderSidebar()} + </div> + <div className="insp-content"> + {this.renderContent()} + </div> + </div> + </main> + </div> + ) + } + } +) + +render( + <Provider store={store}> + <App/> + </Provider>, + document.getElementById('root') +); + +weh.setPageTitle(weh._("weh_inspector")); + +function ScanAddons() { + weh.rpc.call("getAddons") + .then((addons)=>{ + store.dispatch({ + type: "ADDONS", + payload: addons + }); + }); +} +ScanAddons(); \ No newline at end of file diff --git a/templates/inspector/src/content/settings.html b/templates/inspector/src/content/settings.html new file mode 100644 index 0000000..1d58f65 --- /dev/null +++ b/templates/inspector/src/content/settings.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html class="weh-shf"> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root" class="weh-shf"></div> + + <script src="settings.js"></script> + + </body> +</html> diff --git a/templates/inspector/src/content/settings.jsx b/templates/inspector/src/content/settings.jsx new file mode 100644 index 0000000..aad994a --- /dev/null +++ b/templates/inspector/src/content/settings.jsx @@ -0,0 +1,91 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' +import { applyMiddleware, createStore, combineReducers } from 'redux' +import { + reducer as prefsSettingsReducer, + App as PrefsSettingsApp, + WehParam, + WehPrefsControls, + listenPrefs + } from 'react/weh-prefs-settings' +import logger from 'redux-logger' +import WehHeader from 'react/weh-header'; +import weh from 'weh-content'; + +import bootstrapStyles from 'bootstrap/dist/css/bootstrap.css' + +let reducers = combineReducers({ + prefs: prefsSettingsReducer, +}); +let store = createStore(reducers, applyMiddleware(logger)); + +listenPrefs(store); + +function openTranslation() { + weh.rpc.call("openTranslation") +} + +function RenderControls() { + return ( + <div className="btn-toolbar justify-content-between"> + <button type="button" + onClick={openTranslation} + className="btn btn-default"> + {weh._("translation")} + </button> + <div className="btn-group"> + <button type="button" + onClick={this.props.cancel} + className={"btn btn-default " + (this.props.flags.isModified ? "" : "disabled") }> + {weh._("cancel")} + </button> + <button type="button" + onClick={this.props.reset} + className={"btn btn-warning " + (!this.props.flags.isDefault ? "" : "disabled") }> + {weh._("default")} + </button> + <button type="button" + onClick={this.props.save} + className={"btn btn-primary " + (this.props.flags.isModified && this.props.flags.isValid ? "" : "disabled") }> + {weh._("save")} + </button> + </div> + </div> + ) +} + +render( + <Provider store={store}> + <PrefsSettingsApp> + <main style={{minHeight:"160px"}}> + <div className="container"> + <section> + <WehParam prefName="messages_display_mode"/> + <WehParam prefName="display_timestamp"/> + <WehParam prefName="display_call_duration"/> + <WehParam prefName="max_messages"/> + </section> + </div> + </main> + <footer> + <WehPrefsControls render={RenderControls}/> + </footer> + </PrefsSettingsApp> + </Provider>, + document.getElementById('root') +) + +weh.setPageTitle(weh._("settings")); diff --git a/templates/inspector/src/content/styles.scss b/templates/inspector/src/content/styles.scss new file mode 100644 index 0000000..4372656 --- /dev/null +++ b/templates/inspector/src/content/styles.scss @@ -0,0 +1,218 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#root { + min-width: 500px; +} + +:focus {outline:none;} +::-moz-focus-inner {border:0;} + +.sample-popup { + .sample-panel { + padding: 2em; + font-size: 20pt; + text-align: center; + } + .sample-toolbar { + overflow: hidden; + padding: 8px; + background-color: #eee; + a { + float: right; + cursor: pointer; + margin: 0 8px; + } + } +} + +.insp-msg:nth-child(even) { + background-color: #f8f8f8; +} + +.insp-msg { + + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + + .im-caller { + color: #484; + } + .im-callee { + color: #484; + } + .im-call-sign { + margin: 0 4px; + } + .im-result-sign { + margin: 0 4px 0 12px; + } + .im-error-sign { + position: relative; + top: 3px; + margin: 0 8px; + font-size: 1.5rem; + } + .im-error { + color: #e44; + } + .im-method { + color: #448; + } + .im-timestamp { + margin: 0 12px 0 0; + color: #888; + font-size: .8rem; + } + .im-duration { + margin: 0 0 0 8px; + color: #888; + font-size: .8rem; + } + .collapsed-icon { + position: relative; + top: 4px; + left: 6px; + } +} + +.sel-addon { + display: inline-flex; + + .sel-addon-id { + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + font-size: .7rem; + margin: 0 8px; + } +} + +.commands { + padding: 12px 0; + + li { + list-style: none; + + a:not([href]):not([tabindex]) { + color: #007bff; + text-decoration: none; + background-color: transparent; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + } + + a:hover:not([href]):not([tabindex]) { + color: #0056b3; + text-decoration: underline; + } + } +} + +.prefs-table.table { + + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + + tr:nth-child(even) { + background-color: #f8f8f8; + } + + td { + vertical-align: middle; + } + .pref-value { + padding: 0 0 0 8px; + } +} + +.storage-table { + + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + + tr:nth-child(odd) { + background-color: #f8f8f8; + } + + tr.storage-type { + background-color: #eee; + font-weight: 800; + font-size: 1.1rem; + } +} + +.no-message { + color: #ccc; + padding: 2em; +} + +.insp-layout { + + .insp-main { + display: flex; + flex-direction: row; + height: 100%; + } + + .insp-left { + flex: 0 0 auto; + max-width: 200px; + } + + .insp-content { + flex: 1 1 auto; + display: flex; + flex-direction: column; + } + + .insp-scrollable { + overflow-y: auto; + height: 100%; + } + + .insp-container { + flex: 1 1 auto; + display: flex; + flex-direction: column; + height: 100%; + } + + .insp-tabs { + flex: 0 0 auto; + } + + .insp-main-content { + flex: 1 1 auto; + height: 100%; + overflow-y: auto; + } + +} + +.react-json-view.scalar-view { + font-family: "Courier New", Courier, "Lucida Sans Typewriter", "Lucida Typewriter", monospace; + display: inline-block; + color: rgb(0, 43, 54); + font-size: .9rem; +} + +.pref-edit { + input { + width: 100%; + border: 0; + background-color: #444; + color: #fff; + padding-left: .5em; + } +} + +.pref-edit.error { + background-color: #f44; +} + diff --git a/templates/inspector/src/content/translation.html b/templates/inspector/src/content/translation.html new file mode 100644 index 0000000..f9cf27d --- /dev/null +++ b/templates/inspector/src/content/translation.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html class="weh-shf"> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root" class="weh-shf"></div> + + <script src="translation.js"></script> + + </body> +</html> diff --git a/templates/inspector/src/content/translation.jsx b/templates/inspector/src/content/translation.jsx new file mode 100644 index 0000000..fbf9a6b --- /dev/null +++ b/templates/inspector/src/content/translation.jsx @@ -0,0 +1,35 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' +import { applyMiddleware, createStore, combineReducers } from 'redux' +import logger from 'redux-logger' +import { reducer as translateReducer, WehTranslationForm } from 'react/weh-translation' + +import weh from 'weh-content'; + +let reducers = combineReducers({ + translate: translateReducer +}); + +let store = createStore(reducers, applyMiddleware(logger)); + +render( + <Provider store={store}> + <WehTranslationForm /> + </Provider>, + document.getElementById('root') +); + +weh.setPageTitle(weh._("translation")); diff --git a/templates/inspector/src/manifest.json b/templates/inspector/src/manifest.json new file mode 100644 index 0000000..227f08c --- /dev/null +++ b/templates/inspector/src/manifest.json @@ -0,0 +1,37 @@ +{ + "manifest_version": 2, + "name": "Weh Inspector", + "default_locale": "en_US", + "version": "2.1.1", + "version_name": "2.1.1", + "author": "Michel Gutierrez", + "description": "Trace remote procedure calls on Weh 2 addons", + "background": { + "scripts": [ + "background/main.js" + ], + "persistent": true + }, + "icons": { + "32": "content/images/icon-32.png", + "40": "content/images/icon-40.png", + "48": "content/images/icon-48.png", + "128": "content/images/icon-128.png" + }, + "options_ui": { + "page": "content/settings.html?panel=settings", + "open_in_tab": false + }, + "permissions": [ + "tabs", + "contextMenus", + "management", + "storage", + "downloads" + ], + "applications": { + "gecko": { + "id": "weh-inspector@downloadhelper.net" + } + } +} \ No newline at end of file diff --git a/templates/skeleton-angular/etc/weh-options.json b/templates/skeleton-angular/etc/weh-options.json deleted file mode 100644 index 268faec..0000000 --- a/templates/skeleton-angular/etc/weh-options.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "all": { - "uifrmwrk": "angular" - } -} diff --git a/templates/skeleton-angular/src/_assets/LICENSE.txt b/templates/skeleton-angular/src/_assets/LICENSE.txt deleted file mode 100644 index c33dcc7..0000000 --- a/templates/skeleton-angular/src/_assets/LICENSE.txt +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/templates/skeleton-angular/src/background/main.js b/templates/skeleton-angular/src/background/main.js deleted file mode 100644 index 27123bf..0000000 --- a/templates/skeleton-angular/src/background/main.js +++ /dev/null @@ -1,56 +0,0 @@ - -/* if you don't need a panel that opens from a toolbar button: - - delete the call below - - remove entry browser_action in manifest.json - - delete files src/content/popup.* files -*/ -weh.ui.update("default",{ - type: "popup", - onMessage: function(message) { - switch(message.type) { - case "open-settings": - weh.ui.close("default"); - weh.ui.open("settings"); - break; - case "open-translation": - weh.ui.close("default"); - weh.ui.open("translation"); - break; - } - } -}); - -/* if you don't need settings in your add-on: - - delete the call below - - remove entry options_page in manifest.json - - delete files src/content/settings.* files -*/ -weh.ui.update("settings",{ - type: "tab", - contentURL: "content/settings.html" -}); - -/* if you don't want custom translation in your add-on: - - delete the call below - - delete files src/content/manifest.* files -*/ -weh.ui.update("translation",{ - type: "tab", - contentURL: "content/translation.html", -}); - -/* if you don't need to activate the addon from the browser context menu, - - remove section below -*/ -browser.contextMenus.create({ - "title": weh._("title"), - "type": "normal", - "contexts":["page"], - "id": "weh-skeleton" -}); - -browser.contextMenus.onClicked.addListener(function(info) { - if(info.menuItemId == "weh-skeleton" ) { - /* do something here */ - } -}); diff --git a/templates/skeleton-angular/src/content/popup.html b/templates/skeleton-angular/src/content/popup.html deleted file mode 100644 index e541c71..0000000 --- a/templates/skeleton-angular/src/content/popup.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html ng-controller="WehCtrl"> - <head> - <!-- build:css styles.css --> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - - </head> - <body ng-controller="SkelCtrl"> - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js popup-bundle.js --> - <script src="popup.js"></script> - <!-- endbuild --> - - <div id="root"> - <div class="sample-panel">{{_('sample_panel_text')}}</div> - <div class="sample-toolbar"> - <skel-link messageType="open-translation" label="{{_('translation')}}"}></skel-link> - <skel-link messageType="open-settings" label="{{_('settings')}}"></skel-link> - </div> - </div> - - </body> -</html> diff --git a/templates/skeleton-angular/src/content/popup.js b/templates/skeleton-angular/src/content/popup.js deleted file mode 100644 index 906b7b0..0000000 --- a/templates/skeleton-angular/src/content/popup.js +++ /dev/null @@ -1,21 +0,0 @@ - -angular.module('skeleton',[]); - -angular.module('skeleton').directive('skelLink',function() { - return { - template: function(elem,attr) { - return ` - <a - ng-click="post({type: '${attr.messagetype}' })"> - ${attr.label} - </a> - `; - } - } -}); - -angular.module('skeleton').controller('SkelCtrl',['$scope',function($scope) { - // in case you need a controller to do stuff -}]); - -weh.ngBootstrap('skeleton'); diff --git a/templates/skeleton-angular/src/content/settings.html b/templates/skeleton-angular/src/content/settings.html deleted file mode 100644 index 747a7e1..0000000 --- a/templates/skeleton-angular/src/content/settings.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html ng-controller="WehCtrl"> - <head> - <!-- build:css settings.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js settings-bundle.js --> - <script src="settings.js"></script> - <!-- endbuild --> - - <div id="root" ng-controller="wehParams"> - <h1 class="text-center">{{_("settings")}}</h1> - <br/> - <div> - <weh-version></weh-version> - <weh-param-set - params="myparam_string,myparam_integer,myparam_float,myparam_boolean,myparam_choice" - > - </weh-param-set> - </div> - <weh-pref-buttons></weh-pref-buttons> - </div> - - </body> -</html> diff --git a/templates/skeleton-angular/src/content/settings.js b/templates/skeleton-angular/src/content/settings.js deleted file mode 100644 index 3b5a0af..0000000 --- a/templates/skeleton-angular/src/content/settings.js +++ /dev/null @@ -1,4 +0,0 @@ - -weh.ngBootstrap('weh.prefs'); - -weh.setPageTitle(weh._("settings")); diff --git a/templates/skeleton-angular/src/content/styles.css b/templates/skeleton-angular/src/content/styles.css deleted file mode 100644 index 381dd74..0000000 --- a/templates/skeleton-angular/src/content/styles.css +++ /dev/null @@ -1,27 +0,0 @@ - -body { - padding: 0; - margin: 0; -} - -#root { - min-width: 500px; -} - -.sample-panel { - padding: 2em; - font-size: 20pt; - text-align: center; -} - -.sample-toolbar { - overflow: hidden; - padding: 8px; - background-color: #eee; -} - -.sample-toolbar a { - float: right; - cursor: pointer; - margin: 0 8px; -} diff --git a/templates/skeleton-angular/src/content/translation.html b/templates/skeleton-angular/src/content/translation.html deleted file mode 100644 index 72e2c0c..0000000 --- a/templates/skeleton-angular/src/content/translation.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html ng-controller="WehCtrl"> - <head> - <!-- build:css styles.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js translation-bundle.js --> - <script src="translation.js"></script> - <!-- endbuild --> - - <div id="root"> - <h1 class="text-center">Custom translation</h1> - <br/> - <weh-translation></weh-translation> - </div> - - </body> -</html> diff --git a/templates/skeleton-angular/src/content/translation.js b/templates/skeleton-angular/src/content/translation.js deleted file mode 100644 index 7f29c3c..0000000 --- a/templates/skeleton-angular/src/content/translation.js +++ /dev/null @@ -1,4 +0,0 @@ - -weh.ngBootstrap('weh.translation'); - -weh.setPageTitle(weh._("translation")); diff --git a/templates/skeleton-angular/src/manifest.json b/templates/skeleton-angular/src/manifest.json deleted file mode 100644 index db2e1b5..0000000 --- a/templates/skeleton-angular/src/manifest.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "manifest_version": 2 - , "name": "Skeleton Angular" - , "default_locale": "en_US" - , "version": "0.1" - , "version_name": "0.1 beta 1" - , "author": "Michel Gutierrez" - , "description": "Basic add-on code to start from" - , "background": { - "scripts": [ - "background/default-prefs.js", - "background/main.js" - ] - , "persistent": true - } - , "icons": { - "32": "content/images/icon-32.png" - , "40": "content/images/icon-40.png" - , "48": "content/images/icon-48.png" - , "128": "content/images/icon-128.png" - } - , "browser_action": { - "default_icon": { - "40": "content/images/icon-40.png" - } - , "default_title": "WebExtensions Helper" - , "default_popup": "content/popup.html" - } - , "options_page": "content/settings.html?panel=settings" - , "permissions": [ - "tabs", - "contextMenus" - ] -} diff --git a/templates/skeleton-jquery/etc/weh-options.json b/templates/skeleton-jquery/etc/weh-options.json deleted file mode 100644 index 4a08efd..0000000 --- a/templates/skeleton-jquery/etc/weh-options.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "all": { - "uifrmwrk": "jquery" - } -} diff --git a/templates/skeleton-jquery/src/_assets/LICENSE.txt b/templates/skeleton-jquery/src/_assets/LICENSE.txt deleted file mode 100644 index c33dcc7..0000000 --- a/templates/skeleton-jquery/src/_assets/LICENSE.txt +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/templates/skeleton-jquery/src/background/default-prefs.js b/templates/skeleton-jquery/src/background/default-prefs.js deleted file mode 100644 index 95466d2..0000000 --- a/templates/skeleton-jquery/src/background/default-prefs.js +++ /dev/null @@ -1,38 +0,0 @@ - -weh.prefs.declare([{ - name: "myparam_string", - type: "string", - defaultValue: "Default value", - maxLength: 15, - regexp: "^[a-zA-Z ]+$" -},{ - name: "myparam_integer", - type: "integer", - defaultValue: 42, - minimum: -10, - maximum: 100 -},{ - name: "myparam_float", - type: "float", - defaultValue: 3.14159, - minimum: 1.5, - maximum: 10.8 -},{ - name: "myparam_boolean", - type: "boolean", - defaultValue: true -},{ - name: "myparam_choice", - type: "choice", - defaultValue: "second", - choices: [{ - name: "First choice", - value: "first" - },{ - name: "Second choice", - value: "second" - },{ - name: "Third choice", - value: "third" - }] -}]); diff --git a/templates/skeleton-jquery/src/background/main.js b/templates/skeleton-jquery/src/background/main.js deleted file mode 100644 index 27123bf..0000000 --- a/templates/skeleton-jquery/src/background/main.js +++ /dev/null @@ -1,56 +0,0 @@ - -/* if you don't need a panel that opens from a toolbar button: - - delete the call below - - remove entry browser_action in manifest.json - - delete files src/content/popup.* files -*/ -weh.ui.update("default",{ - type: "popup", - onMessage: function(message) { - switch(message.type) { - case "open-settings": - weh.ui.close("default"); - weh.ui.open("settings"); - break; - case "open-translation": - weh.ui.close("default"); - weh.ui.open("translation"); - break; - } - } -}); - -/* if you don't need settings in your add-on: - - delete the call below - - remove entry options_page in manifest.json - - delete files src/content/settings.* files -*/ -weh.ui.update("settings",{ - type: "tab", - contentURL: "content/settings.html" -}); - -/* if you don't want custom translation in your add-on: - - delete the call below - - delete files src/content/manifest.* files -*/ -weh.ui.update("translation",{ - type: "tab", - contentURL: "content/translation.html", -}); - -/* if you don't need to activate the addon from the browser context menu, - - remove section below -*/ -browser.contextMenus.create({ - "title": weh._("title"), - "type": "normal", - "contexts":["page"], - "id": "weh-skeleton" -}); - -browser.contextMenus.onClicked.addListener(function(info) { - if(info.menuItemId == "weh-skeleton" ) { - /* do something here */ - } -}); diff --git a/templates/skeleton-jquery/src/content/_assets/images/icon-128.png b/templates/skeleton-jquery/src/content/_assets/images/icon-128.png deleted file mode 100644 index 2899a1e..0000000 Binary files a/templates/skeleton-jquery/src/content/_assets/images/icon-128.png and /dev/null differ diff --git a/templates/skeleton-jquery/src/content/_assets/images/icon-32.png b/templates/skeleton-jquery/src/content/_assets/images/icon-32.png deleted file mode 100644 index a600285..0000000 Binary files a/templates/skeleton-jquery/src/content/_assets/images/icon-32.png and /dev/null differ diff --git a/templates/skeleton-jquery/src/content/_assets/images/icon-40.png b/templates/skeleton-jquery/src/content/_assets/images/icon-40.png deleted file mode 100644 index e66f503..0000000 Binary files a/templates/skeleton-jquery/src/content/_assets/images/icon-40.png and /dev/null differ diff --git a/templates/skeleton-jquery/src/content/_assets/images/icon-48.png b/templates/skeleton-jquery/src/content/_assets/images/icon-48.png deleted file mode 100644 index 55c1ff9..0000000 Binary files a/templates/skeleton-jquery/src/content/_assets/images/icon-48.png and /dev/null differ diff --git a/templates/skeleton-jquery/src/content/popup.html b/templates/skeleton-jquery/src/content/popup.html deleted file mode 100644 index cf3944e..0000000 --- a/templates/skeleton-jquery/src/content/popup.html +++ /dev/null @@ -1,27 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css styles.css --> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - - </head> - <body ng-controller="SkelCtrl"> - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js popup-bundle.js --> - <script src="popup.js"></script> - <!-- endbuild --> - - <div id="root"> - <div class="sample-panel" data-weh-i18n="sample_panel_text"></div> - <div class="sample-toolbar"> - <a data-skel-message="open-translation" data-weh-i18n="translation"></a> - <a data-skel-message="open-settings" data-weh-i18n="settings"></a> - </div> - </div> - - </body> -</html> diff --git a/templates/skeleton-jquery/src/content/popup.js b/templates/skeleton-jquery/src/content/popup.js deleted file mode 100644 index 5ba8793..0000000 --- a/templates/skeleton-jquery/src/content/popup.js +++ /dev/null @@ -1,21 +0,0 @@ - -(function($) { - - $.fn.skelMessage = function() { - this.each( function() { - $(this).bind("click",function() { - console.info("click",$(this).attr("data-skel-message")); - var messageType = $(this).attr("data-skel-message"); - weh.post({ - type: messageType - }); - }); - }); - - } - -}(jQuery)); - -$(document).ready( function() { - $("[data-skel-message]").skelMessage(); -}); diff --git a/templates/skeleton-jquery/src/content/settings.html b/templates/skeleton-jquery/src/content/settings.html deleted file mode 100644 index 4bd9504..0000000 --- a/templates/skeleton-jquery/src/content/settings.html +++ /dev/null @@ -1,33 +0,0 @@ -<!DOCTYPE html> -<html ng-controller="WehCtrl"> - <head> - <!-- build:css settings.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js settings-bundle.js --> - <script src="settings.js"></script> - <!-- endbuild --> - - <div id="root" data-weh-params> - <h1 class="text-center" data-weh-i18n="settings"></h1> - <br/> - <div> - <div data-weh-version></div> - <div data-weh-param-set - params="myparam_string,myparam_integer,myparam_float,myparam_boolean,myparam_choice" - > - </div> - </div> - <div data-weh-pref-buttons></div> - </div> - - </body> -</html> diff --git a/templates/skeleton-jquery/src/content/settings.js b/templates/skeleton-jquery/src/content/settings.js deleted file mode 100644 index 7602285..0000000 --- a/templates/skeleton-jquery/src/content/settings.js +++ /dev/null @@ -1,7 +0,0 @@ - -$(document).ready( function() { - $("[data-weh-params]").wehParams(); - $("[data-weh-version]").wehVersion(); -}); - -weh.setPageTitle(weh._("settings")); diff --git a/templates/skeleton-jquery/src/content/styles.css b/templates/skeleton-jquery/src/content/styles.css deleted file mode 100644 index 381dd74..0000000 --- a/templates/skeleton-jquery/src/content/styles.css +++ /dev/null @@ -1,27 +0,0 @@ - -body { - padding: 0; - margin: 0; -} - -#root { - min-width: 500px; -} - -.sample-panel { - padding: 2em; - font-size: 20pt; - text-align: center; -} - -.sample-toolbar { - overflow: hidden; - padding: 8px; - background-color: #eee; -} - -.sample-toolbar a { - float: right; - cursor: pointer; - margin: 0 8px; -} diff --git a/templates/skeleton-jquery/src/content/translation.html b/templates/skeleton-jquery/src/content/translation.html deleted file mode 100644 index dc6cc2d..0000000 --- a/templates/skeleton-jquery/src/content/translation.html +++ /dev/null @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css styles.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js translation-bundle.js --> - <script src="translation.js"></script> - <!-- endbuild --> - - <div id="root"> - <h1 class="text-center">Custom translation</h1> - <br/> - <div data-weh-translation></div> - </div> - - </body> -</html> diff --git a/templates/skeleton-jquery/src/content/translation.js b/templates/skeleton-jquery/src/content/translation.js deleted file mode 100644 index bba69ff..0000000 --- a/templates/skeleton-jquery/src/content/translation.js +++ /dev/null @@ -1,6 +0,0 @@ - -$(document).ready( function() { - $("[data-weh-translation]").wehTranslation(); -}); - -weh.setPageTitle(weh._("translation")); diff --git a/templates/skeleton-jquery/src/locales/en_US/messages.json b/templates/skeleton-jquery/src/locales/en_US/messages.json deleted file mode 100644 index 99df871..0000000 --- a/templates/skeleton-jquery/src/locales/en_US/messages.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "title": { - "message": "Weh Skeleton" - }, - "weh_prefs_label_myparam_string": { - "message": "String parameter" - }, - "weh_prefs_description_myparam_string": { - "message": "Only letters and spaces, 20 characters max" - }, - "weh_prefs_label_myparam_integer": { - "message": "Integer parameter" - }, - "weh_prefs_description_myparam_integer": { - "message": "Minimum -10, maximum 100" - }, - "weh_prefs_label_myparam_float": { - "message": "Float parameter" - }, - "weh_prefs_description_myparam_float": { - "message": "Minimum 1.5, maximum 10.8" - }, - "weh_prefs_label_myparam_boolean": { - "message": "Boolean parameter" - }, - "weh_prefs_description_myparam_boolean": { - "message": "This is a boolean" - }, - "weh_prefs_label_myparam_choice": { - "message": "Choice parameter" - }, - "weh_prefs_description_myparam_choice": { - "message": "Pick one option" - }, - - "sample_panel_text": { - "message": "Hello there !" - }, - "settings": { - "message": "Settings" - }, - "translation": { - "message": "Translation" - }, - - "save": { - "message": "Save" - }, - "cancel": { - "message": "Cancel" - }, - "default": { - "message": "Default" - }, - "version": { - "message": "Version" - } - -} diff --git a/templates/skeleton-jquery/src/manifest.json b/templates/skeleton-jquery/src/manifest.json deleted file mode 100644 index 870cd9d..0000000 --- a/templates/skeleton-jquery/src/manifest.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "manifest_version": 2 - , "name": "Skeleton JQuery" - , "default_locale": "en_US" - , "version": "0.1" - , "version_name": "0.1 beta 1" - , "author": "Michel Gutierrez" - , "description": "Basic add-on code to start from" - , "background": { - "scripts": [ - "background/default-prefs.js", - "background/main.js" - ] - , "persistent": true - } - , "icons": { - "32": "content/images/icon-32.png" - , "40": "content/images/icon-40.png" - , "48": "content/images/icon-48.png" - , "128": "content/images/icon-128.png" - } - , "browser_action": { - "default_icon": { - "40": "content/images/icon-40.png" - } - , "default_title": "WebExtensions Helper" - , "default_popup": "content/popup.html" - } - , "options_page": "content/settings.html?panel=settings" - , "permissions": [ - "tabs", - "contextMenus" - ] -} diff --git a/templates/skeleton-react/etc/weh-options.json b/templates/skeleton-react/etc/weh-options.json deleted file mode 100644 index 63133cb..0000000 --- a/templates/skeleton-react/etc/weh-options.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "all": { - "uifrmwrk": "react" - } -} diff --git a/templates/skeleton-react/src/_assets/LICENSE.txt b/templates/skeleton-react/src/_assets/LICENSE.txt deleted file mode 100644 index c33dcc7..0000000 --- a/templates/skeleton-react/src/_assets/LICENSE.txt +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/templates/skeleton-react/src/background/default-prefs.js b/templates/skeleton-react/src/background/default-prefs.js deleted file mode 100644 index 95466d2..0000000 --- a/templates/skeleton-react/src/background/default-prefs.js +++ /dev/null @@ -1,38 +0,0 @@ - -weh.prefs.declare([{ - name: "myparam_string", - type: "string", - defaultValue: "Default value", - maxLength: 15, - regexp: "^[a-zA-Z ]+$" -},{ - name: "myparam_integer", - type: "integer", - defaultValue: 42, - minimum: -10, - maximum: 100 -},{ - name: "myparam_float", - type: "float", - defaultValue: 3.14159, - minimum: 1.5, - maximum: 10.8 -},{ - name: "myparam_boolean", - type: "boolean", - defaultValue: true -},{ - name: "myparam_choice", - type: "choice", - defaultValue: "second", - choices: [{ - name: "First choice", - value: "first" - },{ - name: "Second choice", - value: "second" - },{ - name: "Third choice", - value: "third" - }] -}]); diff --git a/templates/skeleton-react/src/background/main.js b/templates/skeleton-react/src/background/main.js deleted file mode 100644 index 27123bf..0000000 --- a/templates/skeleton-react/src/background/main.js +++ /dev/null @@ -1,56 +0,0 @@ - -/* if you don't need a panel that opens from a toolbar button: - - delete the call below - - remove entry browser_action in manifest.json - - delete files src/content/popup.* files -*/ -weh.ui.update("default",{ - type: "popup", - onMessage: function(message) { - switch(message.type) { - case "open-settings": - weh.ui.close("default"); - weh.ui.open("settings"); - break; - case "open-translation": - weh.ui.close("default"); - weh.ui.open("translation"); - break; - } - } -}); - -/* if you don't need settings in your add-on: - - delete the call below - - remove entry options_page in manifest.json - - delete files src/content/settings.* files -*/ -weh.ui.update("settings",{ - type: "tab", - contentURL: "content/settings.html" -}); - -/* if you don't want custom translation in your add-on: - - delete the call below - - delete files src/content/manifest.* files -*/ -weh.ui.update("translation",{ - type: "tab", - contentURL: "content/translation.html", -}); - -/* if you don't need to activate the addon from the browser context menu, - - remove section below -*/ -browser.contextMenus.create({ - "title": weh._("title"), - "type": "normal", - "contexts":["page"], - "id": "weh-skeleton" -}); - -browser.contextMenus.onClicked.addListener(function(info) { - if(info.menuItemId == "weh-skeleton" ) { - /* do something here */ - } -}); diff --git a/templates/skeleton-react/src/content/_assets/images/icon-128.png b/templates/skeleton-react/src/content/_assets/images/icon-128.png deleted file mode 100644 index 2899a1e..0000000 Binary files a/templates/skeleton-react/src/content/_assets/images/icon-128.png and /dev/null differ diff --git a/templates/skeleton-react/src/content/_assets/images/icon-32.png b/templates/skeleton-react/src/content/_assets/images/icon-32.png deleted file mode 100644 index a600285..0000000 Binary files a/templates/skeleton-react/src/content/_assets/images/icon-32.png and /dev/null differ diff --git a/templates/skeleton-react/src/content/_assets/images/icon-40.png b/templates/skeleton-react/src/content/_assets/images/icon-40.png deleted file mode 100644 index e66f503..0000000 Binary files a/templates/skeleton-react/src/content/_assets/images/icon-40.png and /dev/null differ diff --git a/templates/skeleton-react/src/content/_assets/images/icon-48.png b/templates/skeleton-react/src/content/_assets/images/icon-48.png deleted file mode 100644 index 55c1ff9..0000000 Binary files a/templates/skeleton-react/src/content/_assets/images/icon-48.png and /dev/null differ diff --git a/templates/skeleton-react/src/content/popup.html b/templates/skeleton-react/src/content/popup.html deleted file mode 100644 index b4de0cf..0000000 --- a/templates/skeleton-react/src/content/popup.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css styles.css --> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - - </head> - <body> - <div id="root"></div> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js popup-bundle.js --> - <script src="popup.jsx"></script> - <!-- endbuild --> - - </body> -</html> diff --git a/templates/skeleton-react/src/content/popup.jsx b/templates/skeleton-react/src/content/popup.jsx deleted file mode 100644 index 53664c7..0000000 --- a/templates/skeleton-react/src/content/popup.jsx +++ /dev/null @@ -1,31 +0,0 @@ - -class Link extends React.Component { - - constructor(props) { - super(props); - this.handleClick = this.handleClick.bind(this); - } - - handleClick() { - weh.post({ - type: this.props.messageType - }); - } - - render() { - return ( - <a onClick={this.handleClick}>{weh._(this.props.label)}</a> - ) - } -} - -ReactDOM.render ( - <div> - <div className="sample-panel">{weh._("sample_panel_text")}</div> - <div className="sample-toolbar"> - <Link messageType={"open-translation"} label={"translation"}/> - <Link messageType={"open-settings"} label={"settings"}/> - </div> - </div>, - document.getElementById('root') -) diff --git a/templates/skeleton-react/src/content/settings.html b/templates/skeleton-react/src/content/settings.html deleted file mode 100644 index 1efaccc..0000000 --- a/templates/skeleton-react/src/content/settings.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css settings.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - <div id="root"></div> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js settings-bundle.js --> - <script src="settings.jsx"></script> - <!-- endbuild --> - - </body> -</html> diff --git a/templates/skeleton-react/src/content/settings.jsx b/templates/skeleton-react/src/content/settings.jsx deleted file mode 100644 index 32cd03a..0000000 --- a/templates/skeleton-react/src/content/settings.jsx +++ /dev/null @@ -1,22 +0,0 @@ - -function Prefs() { - return ( - <WehParams> - <WehVersion/> - <WehParamSet wehPrefs={["myparam_string","myparam_integer","myparam_float","myparam_boolean","myparam_choice"]}> - <WehParam/> - </WehParamSet> - </WehParams> - ) -} - -ReactDOM.render ( - <div> - <h1 className="text-center">{weh._("settings")}</h1> - <br/> - <Prefs/> - </div>, - document.getElementById('root') -) - -weh.setPageTitle(weh._("settings")); diff --git a/templates/skeleton-react/src/content/styles.css b/templates/skeleton-react/src/content/styles.css deleted file mode 100644 index 381dd74..0000000 --- a/templates/skeleton-react/src/content/styles.css +++ /dev/null @@ -1,27 +0,0 @@ - -body { - padding: 0; - margin: 0; -} - -#root { - min-width: 500px; -} - -.sample-panel { - padding: 2em; - font-size: 20pt; - text-align: center; -} - -.sample-toolbar { - overflow: hidden; - padding: 8px; - background-color: #eee; -} - -.sample-toolbar a { - float: right; - cursor: pointer; - margin: 0 8px; -} diff --git a/templates/skeleton-react/src/content/translation.html b/templates/skeleton-react/src/content/translation.html deleted file mode 100644 index da4ee18..0000000 --- a/templates/skeleton-react/src/content/translation.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css styles.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="styles.css" type="text/css" rel="stylesheet"> - <!-- endbuild --> - </head> - <body class="container-fluid"> - <div id="root"></div> - - <!-- build:js vendor-bundle.js --> - <!-- weh:js weh-all --> - <!-- endbuild --> - - <!-- build:js translation-bundle.js --> - <script src="translation.jsx"></script> - <!-- endbuild --> - - </body> -</html> diff --git a/templates/skeleton-react/src/content/translation.jsx b/templates/skeleton-react/src/content/translation.jsx deleted file mode 100644 index cb0d23b..0000000 --- a/templates/skeleton-react/src/content/translation.jsx +++ /dev/null @@ -1,11 +0,0 @@ - -ReactDOM.render ( - <div> - <h1 className="text-center">Custom translation</h1> - <br/> - <WehTranslation/> - </div>, - document.getElementById('root') -) - -weh.setPageTitle(weh._("translation")); diff --git a/templates/skeleton-react/src/locales/en_US/messages.json b/templates/skeleton-react/src/locales/en_US/messages.json deleted file mode 100644 index 99df871..0000000 --- a/templates/skeleton-react/src/locales/en_US/messages.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "title": { - "message": "Weh Skeleton" - }, - "weh_prefs_label_myparam_string": { - "message": "String parameter" - }, - "weh_prefs_description_myparam_string": { - "message": "Only letters and spaces, 20 characters max" - }, - "weh_prefs_label_myparam_integer": { - "message": "Integer parameter" - }, - "weh_prefs_description_myparam_integer": { - "message": "Minimum -10, maximum 100" - }, - "weh_prefs_label_myparam_float": { - "message": "Float parameter" - }, - "weh_prefs_description_myparam_float": { - "message": "Minimum 1.5, maximum 10.8" - }, - "weh_prefs_label_myparam_boolean": { - "message": "Boolean parameter" - }, - "weh_prefs_description_myparam_boolean": { - "message": "This is a boolean" - }, - "weh_prefs_label_myparam_choice": { - "message": "Choice parameter" - }, - "weh_prefs_description_myparam_choice": { - "message": "Pick one option" - }, - - "sample_panel_text": { - "message": "Hello there !" - }, - "settings": { - "message": "Settings" - }, - "translation": { - "message": "Translation" - }, - - "save": { - "message": "Save" - }, - "cancel": { - "message": "Cancel" - }, - "default": { - "message": "Default" - }, - "version": { - "message": "Version" - } - -} diff --git a/templates/skeleton-react/src/manifest.json b/templates/skeleton-react/src/manifest.json deleted file mode 100644 index 4eb392b..0000000 --- a/templates/skeleton-react/src/manifest.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "manifest_version": 2 - , "name": "Skeleton React" - , "default_locale": "en_US" - , "version": "0.1" - , "version_name": "0.1 beta 1" - , "author": "Michel Gutierrez" - , "description": "Basic add-on code to start from" - , "background": { - "scripts": [ - "background/default-prefs.js", - "background/main.js" - ] - , "persistent": true - } - , "icons": { - "32": "content/images/icon-32.png" - , "40": "content/images/icon-40.png" - , "48": "content/images/icon-48.png" - , "128": "content/images/icon-128.png" - } - , "browser_action": { - "default_icon": { - "40": "content/images/icon-40.png" - } - , "default_title": "WebExtensions Helper" - , "default_popup": "content/popup.html" - } - , "options_page": "content/settings.html?panel=settings" - , "permissions": [ - "tabs", - "contextMenus" - ] -} diff --git a/templates/skeleton-angular/src/locales/en_US/messages.json b/templates/skeleton/locales/en_US/messages.json similarity index 100% rename from templates/skeleton-angular/src/locales/en_US/messages.json rename to templates/skeleton/locales/en_US/messages.json diff --git a/templates/skeleton-angular/src/background/default-prefs.js b/templates/skeleton/src-modules/default-prefs.js similarity index 96% rename from templates/skeleton-angular/src/background/default-prefs.js rename to templates/skeleton/src-modules/default-prefs.js index 95466d2..a427b0e 100644 --- a/templates/skeleton-angular/src/background/default-prefs.js +++ b/templates/skeleton/src-modules/default-prefs.js @@ -1,5 +1,5 @@ -weh.prefs.declare([{ +module.exports = [{ name: "myparam_string", type: "string", defaultValue: "Default value", @@ -35,4 +35,4 @@ weh.prefs.declare([{ name: "Third choice", value: "third" }] -}]); +}]; diff --git a/templates/skeleton/src/background/main.js b/templates/skeleton/src/background/main.js new file mode 100644 index 0000000..3ea760a --- /dev/null +++ b/templates/skeleton/src/background/main.js @@ -0,0 +1,36 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +var weh = require('weh-background'); +require('weh-inspect'); + +weh.rpc.listen({ + openSettings: () => { + console.info("openSettings"); + weh.ui.open("settings",{ + type: "tab", + url: "content/settings.html" + }); + weh.ui.close("main"); + }, + openTranslation: () => { + console.info("openTranslation"); + weh.ui.open("translation",{ + type: "tab", + url: "content/translation.html" + }); + weh.ui.close("main"); + }, +}); + +weh.prefs.declare(require('default-prefs')); + diff --git a/templates/skeleton-angular/src/content/_assets/images/icon-128.png b/templates/skeleton/src/content/images/icon-128.png similarity index 100% rename from templates/skeleton-angular/src/content/_assets/images/icon-128.png rename to templates/skeleton/src/content/images/icon-128.png diff --git a/templates/skeleton-angular/src/content/_assets/images/icon-32.png b/templates/skeleton/src/content/images/icon-32.png similarity index 100% rename from templates/skeleton-angular/src/content/_assets/images/icon-32.png rename to templates/skeleton/src/content/images/icon-32.png diff --git a/templates/skeleton-angular/src/content/_assets/images/icon-40.png b/templates/skeleton/src/content/images/icon-40.png similarity index 100% rename from templates/skeleton-angular/src/content/_assets/images/icon-40.png rename to templates/skeleton/src/content/images/icon-40.png diff --git a/templates/skeleton-angular/src/content/_assets/images/icon-48.png b/templates/skeleton/src/content/images/icon-48.png similarity index 100% rename from templates/skeleton-angular/src/content/_assets/images/icon-48.png rename to templates/skeleton/src/content/images/icon-48.png diff --git a/templates/skeleton/src/content/popup.html b/templates/skeleton/src/content/popup.html new file mode 100644 index 0000000..d5a669d --- /dev/null +++ b/templates/skeleton/src/content/popup.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root"></div> + + <script src="popup.js"></script> + + </body> +</html> diff --git a/templates/skeleton/src/content/popup.jsx b/templates/skeleton/src/content/popup.jsx new file mode 100644 index 0000000..e64acdf --- /dev/null +++ b/templates/skeleton/src/content/popup.jsx @@ -0,0 +1,45 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react'; +import { render } from 'react-dom'; + +import weh from 'weh-content'; + +class Link extends React.Component { + + constructor(props) { + super(props); + this.handleClick = this.handleClick.bind(this); + } + + handleClick() { + weh.rpc.call(this.props.messageCall); + } + + render() { + return ( + <a onClick={this.handleClick}>{weh._(this.props.label)}</a> + ) + } +} + +render ( + <div className="sample-popup"> + <div className="sample-panel">{weh._("sample_panel_text")}</div> + <div className="sample-toolbar"> + <Link messageCall={"openTranslation"} label={"translation"}/> + <Link messageCall={"openSettings"} label={"settings"}/> + </div> + </div>, + document.getElementById('root') +) \ No newline at end of file diff --git a/templates/skeleton/src/content/settings.html b/templates/skeleton/src/content/settings.html new file mode 100644 index 0000000..1d58f65 --- /dev/null +++ b/templates/skeleton/src/content/settings.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html class="weh-shf"> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root" class="weh-shf"></div> + + <script src="settings.js"></script> + + </body> +</html> diff --git a/templates/skeleton/src/content/settings.jsx b/templates/skeleton/src/content/settings.jsx new file mode 100644 index 0000000..ddc6dd8 --- /dev/null +++ b/templates/skeleton/src/content/settings.jsx @@ -0,0 +1,94 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' +import { applyMiddleware, createStore, combineReducers } from 'redux' +import { + reducer as prefsSettingsReducer, + App as PrefsSettingsApp, + WehParam, + WehPrefsControls, + listenPrefs + } from 'react/weh-prefs-settings' +import logger from 'redux-logger' +import WehHeader from 'react/weh-header'; + +import weh from 'weh-content'; + +import bootstrapStyles from 'bootstrap/dist/css/bootstrap.css' + +let reducers = combineReducers({ + prefs: prefsSettingsReducer, +}); +let store = createStore(reducers, applyMiddleware(logger)); + +listenPrefs(store); + +function openTranslation() { + weh.rpc.call("openTranslation") +} + +function RenderControls() { + return ( + <div className="btn-toolbar justify-content-between"> + <button type="button" + onClick={openTranslation} + className="btn btn-default pull-left"> + {weh._("translation")} + </button> + <div className="btn-group pull-right"> + <button type="button" + onClick={this.props.cancel} + className={"btn btn-default " + (this.props.flags.isModified ? "" : "disabled") }> + {weh._("cancel")} + </button> + <button type="button" + onClick={this.props.reset} + className={"btn btn-warning " + (!this.props.flags.isDefault ? "" : "disabled") }> + {weh._("default")} + </button> + <button type="button" + onClick={this.props.save} + className={"btn btn-primary " + (this.props.flags.isModified && this.props.flags.isValid ? "" : "disabled") }> + {weh._("save")} + </button> + </div> + </div> + ) +} + +render( + <Provider store={store}> + <PrefsSettingsApp> + <WehHeader/> + <main> + <div className="container"> + <section> + <WehParam prefName="myparam_string"/> + <WehParam prefName="myparam_integer"/> + <WehParam prefName="myparam_float"/> + <WehParam prefName="myparam_boolean"/> + <WehParam prefName="myparam_choice"/> + </section> + </div> + </main> + <footer> + <WehPrefsControls render={RenderControls}/> + </footer> + </PrefsSettingsApp> + </Provider>, + document.getElementById('root') +) + +weh.setPageTitle(weh._("settings")); diff --git a/src/content/weh-ct-angular.js b/templates/skeleton/src/content/styles.scss similarity index 51% rename from src/content/weh-ct-angular.js rename to templates/skeleton/src/content/styles.scss index 06032b3..e3b765e 100644 --- a/src/content/weh-ct-angular.js +++ b/templates/skeleton/src/content/styles.scss @@ -10,19 +10,25 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -weh.ngBootstrap = function(mod) { - angular.element(document).ready(function() { - angular.bootstrap(document.documentElement,['weh',mod]); - }); +#root { + min-width: 500px; } -weh.ngController = function(scope) { - //scope.weh = weh; - scope.post = weh.post; - scope._ = weh._; +.sample-popup { + .sample-panel { + padding: 2em; + font-size: 20pt; + text-align: center; + } + .sample-toolbar { + overflow: hidden; + padding: 8px; + background-color: #eee; + a { + float: right; + cursor: pointer; + margin: 0 8px; + } + } } -angular.module('weh',[]) -.controller('WehCtrl',["$scope",function($scope) { - weh.ngController($scope); -}]); diff --git a/templates/skeleton/src/content/translation.html b/templates/skeleton/src/content/translation.html new file mode 100644 index 0000000..f9cf27d --- /dev/null +++ b/templates/skeleton/src/content/translation.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html class="weh-shf"> + <head> + <link href="styles.css" type="text/css" rel="stylesheet"> + <meta charset="utf-8" /> + </head> + <body> + <div id="root" class="weh-shf"></div> + + <script src="translation.js"></script> + + </body> +</html> diff --git a/templates/skeleton/src/content/translation.jsx b/templates/skeleton/src/content/translation.jsx new file mode 100644 index 0000000..fbf9a6b --- /dev/null +++ b/templates/skeleton/src/content/translation.jsx @@ -0,0 +1,35 @@ +/* + * weh - WebExtensions Helper + * + * @summary workflow and base code for developing WebExtensions browser add-ons + * @author Michel Gutierrez + * @link https://github.com/mi-g/weh + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import React from 'react' +import { render } from 'react-dom' +import { Provider } from 'react-redux' +import { applyMiddleware, createStore, combineReducers } from 'redux' +import logger from 'redux-logger' +import { reducer as translateReducer, WehTranslationForm } from 'react/weh-translation' + +import weh from 'weh-content'; + +let reducers = combineReducers({ + translate: translateReducer +}); + +let store = createStore(reducers, applyMiddleware(logger)); + +render( + <Provider store={store}> + <WehTranslationForm /> + </Provider>, + document.getElementById('root') +); + +weh.setPageTitle(weh._("translation")); diff --git a/templates/skeleton/src/manifest.json b/templates/skeleton/src/manifest.json new file mode 100644 index 0000000..df5ad79 --- /dev/null +++ b/templates/skeleton/src/manifest.json @@ -0,0 +1,37 @@ +{ + "manifest_version": 2, + "name": "Skeleton React", + "default_locale": "en_US", + "version": "0.1", + "version_name": "0.1", + "author": "Michel Gutierrez", + "description": "Basic add-on code to start from", + "background": { + "scripts": [ + "background/main.js" + ], + "persistent": true + }, + "icons": { + "32": "content/images/icon-32.png", + "40": "content/images/icon-40.png", + "48": "content/images/icon-48.png", + "128": "content/images/icon-128.png" + }, + "browser_action": { + "default_icon": { + "40": "content/images/icon-40.png" + }, + "default_title": "WebExtensions Helper", + "default_popup": "content/popup.html?panel=main" + }, + "options_ui": { + "page": "content/settings.html?panel=settings", + "open_in_tab": true + }, + "permissions": [ + "tabs", + "contextMenus", + "storage" + ] +} \ No newline at end of file diff --git a/templates/weh-inspector/etc/weh-options.json b/templates/weh-inspector/etc/weh-options.json deleted file mode 100644 index 63133cb..0000000 --- a/templates/weh-inspector/etc/weh-options.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "all": { - "uifrmwrk": "react" - } -} diff --git a/templates/weh-inspector/src/_assets/LICENSE.txt b/templates/weh-inspector/src/_assets/LICENSE.txt deleted file mode 100644 index c33dcc7..0000000 --- a/templates/weh-inspector/src/_assets/LICENSE.txt +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/templates/weh-inspector/src/background/default-prefs.js b/templates/weh-inspector/src/background/default-prefs.js deleted file mode 100644 index 95466d2..0000000 --- a/templates/weh-inspector/src/background/default-prefs.js +++ /dev/null @@ -1,38 +0,0 @@ - -weh.prefs.declare([{ - name: "myparam_string", - type: "string", - defaultValue: "Default value", - maxLength: 15, - regexp: "^[a-zA-Z ]+$" -},{ - name: "myparam_integer", - type: "integer", - defaultValue: 42, - minimum: -10, - maximum: 100 -},{ - name: "myparam_float", - type: "float", - defaultValue: 3.14159, - minimum: 1.5, - maximum: 10.8 -},{ - name: "myparam_boolean", - type: "boolean", - defaultValue: true -},{ - name: "myparam_choice", - type: "choice", - defaultValue: "second", - choices: [{ - name: "First choice", - value: "first" - },{ - name: "Second choice", - value: "second" - },{ - name: "Third choice", - value: "third" - }] -}]); diff --git a/templates/weh-inspector/src/background/main.js b/templates/weh-inspector/src/background/main.js deleted file mode 100644 index 6dfaae0..0000000 --- a/templates/weh-inspector/src/background/main.js +++ /dev/null @@ -1,132 +0,0 @@ - -if(!browser.runtime.onMessageExternal) { - var error = "weh-inspector: This browser lacks support for browser.runtime.onMessageExternal"; - console.error(error); - throw new Error(error); -} - -if(!browser.management) { - var error = "weh-inspector: This browser lacks support for browser.management"; - console.error(error); - throw new Error(error); -} - -var addons = {} -var bguiIndex = 1; - -weh.ui.update("inspector",{ - type: "tab", - contentURL: "content/inspector.html", - onMessage: function(message,post) { - switch(message.type) { - case "get-addons": - post({ - type: "addons", - addons: addons, - }); - break; - case "scan-addons": - ScanAddons(message.addons); - break; - case "monitor-bgui": - if(addons[message.addonId]) - addons[message.addonId].monitorBgUi = message.status; - browser.runtime.sendMessage(message.addonId,{ - type: "weh#inspect-bgui", - status: message.status - }); - break; - case "get-storage": - browser.runtime.sendMessage(message.addonId,{ - type: "weh#get-storage", - }); - break; - case "get-prefs": - browser.runtime.sendMessage(message.addonId,{ - type: "weh#get-prefs", - }); - break; - case "save-prefs": - browser.runtime.sendMessage(message.addonId,{ - type: "weh#save-prefs", - prefs: message.prefs - }); - break; - } - }, - onShow: function() { - } -}); - -function CheckAddon(id) { - browser.runtime.sendMessage(id,{ - type: "weh#ping" - },function(response) { - if(response) { - addons[id] = response.manifest; - addons[id].id = id; - addons[id].monitorBgUi = response.monitorBgUi; - weh.ui.post("inspector",{ - type: "add-addon", - addon: addons[id], - }); - } else { - delete addons[id]; - weh.ui.post("inspector",{ - type: "remove-addon", - id: id, - }); - } - }); -} - -function ScanAddons() { - - if(browser.management) { - browser.management.getAll(function(extensions) { - extensions.forEach((extension) => CheckAddon(extension.id)); - }); - } -} -ScanAddons(); - -function SetupContextMenu() { - browser.contextMenus.create({ - "title": weh._("weh_inspector"), - "type": "normal", - "contexts":["page"], - "id": "weh-inspector" - }); -} - -if(browser.runtime.onInstalled) - browser.runtime.onInstalled.addListener(SetupContextMenu); -else - SetupContextMenu(); - -browser.contextMenus.onClicked.addListener(function(info) { - if(info.menuItemId == "weh-inspector" ) { - weh.ui.open("inspector"); - } -}); - -browser.runtime.onMessageExternal.addListener(function(message, sender, sendResponse) { - message.addonId = sender.id; - switch(message.type) { - case "weh#bgui": - message.key = bguiIndex++; - weh.ui.post("inspector",message); - sendResponse({ - type: (addons[sender.id] && addons[sender.id].monitorBgUi) ? "weh#ok" : "weh#ko" - }); - break; - case "weh#storage": - weh.ui.post("inspector",message); - break; - case "weh#prefs": - message.type = "weh#foreign-prefs"; - weh.ui.post("inspector",message); - break; - } -}); - diff --git a/templates/weh-inspector/src/content/inspector.html b/templates/weh-inspector/src/content/inspector.html deleted file mode 100644 index 973bbe0..0000000 --- a/templates/weh-inspector/src/content/inspector.html +++ /dev/null @@ -1,23 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <!-- build:css styles.css --> - <link href="bootstrap.css" type="text/css" rel="stylesheet"> - <link href="select2.css" type="text/css" rel="stylesheet"> - <link href="jquery.json-viewer.css" type="text/css" rel="stylesheet"> - <link href="styles.scss" type="text/css" rel="stylesheet"> - <!-- endbuild --> - - </head> - <body> - <div id="root"></div> - - <!-- build:js bundle.js --> - <!-- weh:js jquery,bootstrap,weh-all --> - <script src="select2.js"></script> - <script src="jquery.json-viewer.js"></script> - <script src="inspector.jsx"></script> - <!-- endbuild --> - - </body> -</html> diff --git a/templates/weh-inspector/src/content/inspector.jsx b/templates/weh-inspector/src/content/inspector.jsx deleted file mode 100644 index c0a84df..0000000 --- a/templates/weh-inspector/src/content/inspector.jsx +++ /dev/null @@ -1,684 +0,0 @@ - -class AddonSelector extends React.Component { - - constructor(props) { - super(props); - this.selectElement = null; - this.pickAddon = this.pickAddon.bind(this); - } - - componentDidUpdate() { - if(this.oldSelectElement!==this.refs.addonSelector) { - this.oldSelectElement = this.refs.addonSelector; - this.install(this.refs.addonSelector); - } - } - - pickAddon(event) { - this.props.pickAddon(event.target.value); - } - - install(selectElement) { - this.selectElement = selectElement; - var self = this; - $(document).ready(function() { - var plugin = $(selectElement).select2({ - minimumResultsForSearch: Infinity, - placeholder: weh._("pick_addon") - }).on("change",self.pickAddon); - if(self.props.addonId) { - console.info("set select2",self.props.addonId); - plugin.val(self.props.addonId) - } - }); - } - - render() { - var items = this.props.addons.map((addon) => - <option key={addon.id} value={addon.id}> - {addon.name} - </option> - ); - items.unshift( - <option key="" value=""></option> - ); - return ( - <div className="addon-selector"> - <select - ref="addonSelector"> - {items} - </select> - <div className="commands"> - {browser.management && ( - <a onClick={this.props.rescanAddons}>{weh._("rescan_addons")}</a> - )} - </div> - </div> - ) - } -} - -class AddonControl extends React.Component { - - render() { - return ( - <div className={"addon-control "+(this.props.addon ? "selected" : "none")}> - { this.props.addon && ( - <div> - <div className="info"> - <div className="addon-name">{ this.props.addon.name }</div> - <div className="addon-version">{ this.props.addon.version_name || this.props.addon.version }</div> - <div className="addon-id">{ this.props.addon.id }</div> - </div> - <div className="commands"> - { this.props.addon.monitorBgUi && ( - <a onClick={(() => this.props.addonControl("stopMonitorBgUi")).bind(this)}> - {weh._("stop_monitor_bgui")} - </a> - ) || ( - <a onClick={(() => this.props.addonControl("startMonitorBgUi")).bind(this)}> - {weh._("start_monitor_bgui")} - </a> - )} - <a onClick={(() => this.props.addonControl("getStorage")).bind(this)}> - {weh._("show_storage")} - </a> - <a onClick={(() => this.props.addonControl("getPrefs")).bind(this)}> - {weh._("get_prefs")} - </a> - - </div> - </div> - )} - </div> - ) - } -} - -class Message extends React.Component { - - componentDidUpdate() { - if(this.oldElement!==this.refs.element) { - this.oldElement = this.refs.element; - this.install(this.refs.element); - } - } - - install(element) { - var self = this; - $(document).ready(function() { - $(element).jsonViewer(self.props.message.message, {collapsed: true}); - }); - } - - render() { - var message = this.props.message; - return ( - <tr key={message.key} className={"message-way-"+this.props.message.way}> - <td>{message.timestamp - this.props.timestamp0}</td> - <td>{this.props.addonName}</td> - <td>{message.panel}</td> - <td>{weh._("message_way_"+message.way)}</td> - <td>{this.props.message.message.type || "???"}</td> - <td><span ref="element"></span></td> - </tr> - ) - } -} - -class MessagesTab extends React.Component { - - constructor() { - super(); - this.state = { - messages: [], - } - this.clearMessages = this.clearMessages.bind(this); - weh.react.attach(this,this.onWehMessage); - } - - clearMessages() { - this.setState({ - messages: [] - }); - } - - onWehMessage(message) { - switch(message.type) { - case "weh#bgui": - this.setState((state0) => { - var messages = state0.messages.slice(); - messages.push(message); - return { - messages: messages - } - }); - break; - } - } - - render() { - var timestamp0 = this.state.messages[0] && this.state.messages[0].timestamp; - var items = this.state.messages.map((message) => - <Message - key={message.key} - timestamp0={timestamp0} - message={message} - addonName={this.props.addons[message.addonId].name} - /> - ); - setTimeout((() => { - if(this.scrollingElement) - this.scrollingElement.scrollTop = this.scrollingElement.scrollHeight; - }).bind(this),10); - return ( - <div className="weh-table messages-tab"> - <div> - { this.state.messages.length>0 && ( - <div> - <div className="weh-table-content fullheight"> - <div ref={(element)=>{this.scrollingElement=element}}> - <table className="message-table"> - <thead> - <tr> - <th>{weh._("msgtable_delta_t")}</th> - <th>{weh._("msgtable_addon")}</th> - <th>{weh._("msgtable_panel")}</th> - <th>{weh._("msgtable_direction")}</th> - <th>{weh._("msgtable_type")}</th> - <th>{weh._("msgtable_message")}</th> - </tr> - </thead> - <tbody> - {items} - </tbody> - </table> - </div> - </div> - </div> - ) || ( - <div className="weh-table-middle messages-none">{weh._("messages_none")}</div> - )} - </div> - <div className="statusbar"> - <div className="weh-table-middle"> - <div> - <a onClick={this.clearMessages}>{weh._("clear_messages")}</a> - </div> - </div> - </div> - </div> - ) - } - -} - -class StorageTab extends React.Component { - - install(element,store,key) { - var self = this; - this.storeElements = this.storeElements || {}; - if(this.storeElements[store]!==element) { - this.storeElements[store] = element; - $(document).ready(function() { - if(self.props.storage[store]) - $(element).jsonViewer(self.props.storage[store][key], {collapsed: true}); - }); - } - } - - render() { - var self = this; - var stores = Object.keys(this.props.storage).map((storeName) => { - var store = this.props.storage[storeName]; - var items = Object.keys(store).map((key) => { - var value = store[key]; - return ( - <li key={key} className="storage-item"> - <span className="storage-item-name">{key}</span> - <span className="storage-item-value" - ref={(element) => { self.install(element,storeName,key) }}></span> - </li> - ) - }); - return ( - <li key={storeName} className="storage-store"> - <div className="storage-store-name">{storeName}</div> - <ul className="storage-store-items">{items}</ul> - </li> - ) - }); - return ( - <div className="weh-table storage-tab"> - <div> - <div className="storage-addon"> - { this.props.addon && ( - <div>{weh._("storage_for",[this.props.addon.name])}</div> - )} - </div> - </div> - <div> - <div> - <div className="weh-table-content fullheight"> - <div> - <div> - <ul className="storage-stores">{stores}</ul> - </div> - </div> - </div> - </div> - </div> - <div className="statusbar"> - <div className="weh-table-middle"> - <div> - <a onClick={()=>{this.props.addonControl("closeStorage")}}>{weh._("close")}</a> - </div> - </div> - </div> - </div> - ) - } -} - -class PrefsTab extends React.Component { - - constructor(props) { - super(props); - this.paramIndex = 1; - this.handleChange = this.handleChange.bind(this); - } - - formGroupClass(param) { - if(this.props.specs[param].defaultValue!==this.props.prefs[param]) - return "has-warning"; - return ""; - } - - getInputWidth(spec) { - switch(spec.type) { - case "string": - return spec.width || "20em"; - case "integer": - case "float": - return spec.width || "8em"; - case "boolean": - return "34px"; - case "choice": - return spec.width || "12em"; - } - } - - handleChange(event) { - var param = event.target.name; - var value = this.props.specs[param].type=="boolean" ? event.target.checked : event.target.value; - this.props.changePref(param,value); - } - - renderInput(name,spec,paramIndex) { - var value = this.props.prefs[name]; - switch(spec.type) { - case "string": - case "integer": - case "float": - return <input className="form-control" - name={name} - value={value} - onChange={this.handleChange} - maxLength={spec.maxLength || -1} - id={"weh-param-"+paramIndex} - type="text" - style={{ width: this.getInputWidth(spec) }}/> - case "boolean": - return <div> - <input className="form-control" - name={name} - checked={value} - onChange={this.handleChange} - id={"weh-param-"+paramIndex} - type="checkbox" - style={{width:"34px"}} - /> - </div> - case "choice": - var options = (spec.choices || []).map( - (option) => <option key={option.value} value={option.value}>{option.name}</option> - ); - if(options.length==0) - return false; - return <select - name={name} - value={value} - onChange={this.handleChange} - className="form-control" - id={"weh-param-"+paramIndex} - style={{ width: this.getInputWidth(spec) }}> - {options} - </select> - } - } - - renderParam(name,spec) { - var paramIndex = this.paramIndex++; - return ( - <div key={name} className={"form-group param " + this.formGroupClass(name) }> - <label className="col-sm-4 control-label" htmlFor={"weh-param-"+paramIndex}> - {name}</label> - <div className="col-sm-8"> - {this.renderInput(name,spec,paramIndex)} - <label>{spec.label}</label> - { spec.description && ( - <div className="help-block">{ spec.description }</div> - )} - </div> - </div> - ); - } - - render() { - - var self = this; - var params = Object.keys(this.props.specs).sort().map((name) => self.renderParam(name,self.props.specs[name])); - - return ( - <div className="weh-table prefs-tab"> - <div> - <div className="prefs-addon"> - { this.props.addon && ( - <div>{weh._("prefs_for",[this.props.addon.name])}</div> - )} - </div> - </div> - <div> - <div> - <div className="weh-table-content fullheight"> - <div> - <div> - <div className="container fullwidth"> - <form className="form-horizontal"> - {params} - </form> - </div> - </div> - </div> - </div> - </div> - </div> - <div className="statusbar"> - <div className="weh-table-middle"> - <div> - <a onClick={()=>{this.props.addonControl("closePrefs")}}>{weh._("close")}</a> - <a onClick={()=>{this.props.addonControl("savePrefs")}}>{weh._("prefs_save")}</a> - </div> - </div> - </div> - </div> - ) - } -} - -class App extends React.Component { - - constructor() { - super(); - this.state = { - addons: {}, - addonId: null, - storage: null, - storageAddonId: null, - prefs: null, - prefsAddonId: null, - activeTab: "messages" - } - this.rescanAddons = this.rescanAddons.bind(this); - this.pickAddon = this.pickAddon.bind(this); - this.addonControl = this.addonControl.bind(this); - this.selectTab = this.selectTab.bind(this); - this.changePref = this.changePref.bind(this); - weh.react.attach(this,this.onWehMessage); - } - - onWehMessage(message) { - switch(message.type) { - case "addons": - this.setState((state0) => { - return { - addons: message.addons, - addonId: message.addons[state0.addonId] || null - } - }); - break; - case "add-addon": - this.setState(function(state0) { - state0.addons[message.addon.id] = message.addon; - return { - addons: state0.addons - } - }); - break; - case "remove-addon": - this.setState(function(state0) { - delete state0[message.id]; - return { - addons: state0.addons - } - }); - break; - case "weh#storage": - this.setState({ - storageAddonId: message.addonId, - storage: message.storage, - activeTab: "storage" - }); - break; - case "weh#foreign-prefs": - this.setState({ - prefsAddonId: message.addonId, - prefs: message.prefs, - specs: message.specs, - activeTab: "prefs" - }); - break; - } - } - - componentDidMount() { - weh.post({ - type: "get-addons" - }); - } - - rescanAddons() { - this.setState({ - addons: {} - }); - weh.post({ - type: "scan-addons", - }); - } - - pickAddon(id) { - this.setState({ - addonId: id - }); - } - - addonControl(command) { - switch(command) { - case "startMonitorBgUi": - case "stopMonitorBgUi": - var status = command == "startMonitorBgUi" - this.setState((state0) => { - this.state.addons[this.state.addonId].monitorBgUi = status; - return state0; - }); - weh.post({ - type: "monitor-bgui", - addonId: this.state.addonId, - status: status - }); - this.setState({ - monitorBgUi: status - }); - break; - case "getStorage": - weh.post({ - type: "get-storage", - addonId: this.state.addonId - }); - break; - case "getPrefs": - weh.post({ - type: "get-prefs", - addonId: this.state.addonId - }); - break; - case "savePrefs": - weh.post({ - type: "save-prefs", - addonId: this.state.prefsAddonId, - prefs: this.state.prefs - }); - break; - case "closePrefs": - this.setState({ - prefs: null, - specs: null, - prefsAddondId: null, - activeTab: "messages" - }); - break; - case "closeStorage": - this.setState({ - storage: null, - storageAddondId: null, - activeTab: "messages" - }); - break; - } - } - - selectTab(tabName) { - this.setState({ - activeTab: tabName - }); - } - - tabClass(tabName) { - return tabName==this.state.activeTab ? "active":""; - } - - changePref(name,value) { - if(this.state.prefs) - this.setState((state0) => { - state0.prefs[name] = value; - return state0; - }); - } - - render() { - var self = this; - var addonList = Object.keys(this.state.addons).map((id) => this.state.addons[id]); - var monitoredBgUiCount = 0; - Object.keys(this.state.addons).forEach((id) => { - if(self.state.addons[id].monitorBgUi) - monitoredBgUiCount ++; - }); - - return ( - <div className="fullheight"> - <div className="sidebar fullheight col-md-3"> - <h1>{weh._("weh_inspector")}</h1> - <AddonSelector - addons={addonList} - addonId={this.state.addonId} - rescanAddons={this.rescanAddons} - pickAddon={this.pickAddon} - /> - { this.state.addons[this.state.addonId] && ( - <AddonControl - addon={this.state.addons[this.state.addonId]} - addonControl={this.addonControl} - /> - )} - </div> - <div className="addon-tabs col-md-9 fullheight"> - <div className="weh-table"> - <div className="addon-tabs-tabs"> - <div> - <ul className="nav nav-tabs" role="tablist"> - <li role="presentation" className={this.tabClass("messages")}> - <a href="#messages" role="tab" - onClick={()=>this.selectTab("messages")} - data-toggle="tab">{weh._("bgui_messages")}</a> - </li> - { this.state.storage && ( - <li role="presentation" className={this.tabClass("storage")}> - <a href="#storage" role="tab" - onClick={()=>this.selectTab("storage")} - data-toggle="tab">{weh._("storage")}</a> - </li> - )} - { this.state.prefs && ( - <li role="presentation" className={this.tabClass("prefs")}> - <a href="#prefs" role="tab" - onClick={()=>this.selectTab("prefs")} - data-toggle="tab">{weh._("prefs")}</a> - </li> - )} - </ul> - </div> - </div> - <div> - <div> - <div className="fullheight weh-table-content"> - <div className="tab-content"> - <div role="tabpanel" - className={"tab-pane fullheight "+this.tabClass("messages")} - id="messages"> - <MessagesTab - addons={this.state.addons} - /> - </div> - { this.state.storage && ( - <div role="tabpanel" - className={"tab-pane fullheight "+this.tabClass("storage")} - id="storage"> - <StorageTab - addon={this.state.addons[this.state.storageAddonId]} - storage={this.state.storage} - addonControl={this.addonControl} - /> - </div> - )} - { this.state.prefs && ( - <div role="tabpanel" - className={"tab-pane fullheight "+this.tabClass("prefs")} - id="prefs"> - <PrefsTab - addon={this.state.addons[this.state.prefsAddonId]} - prefs={this.state.prefs} - specs={this.state.specs} - changePref={this.changePref} - addonControl={this.addonControl} - /> - </div> - )} - </div> - </div> - </div> - </div> - </div> - </div> - </div> - ) - } -} - -ReactDOM.render ( - <div className="container fullheight"> - <App/> - </div>, - document.getElementById('root') -) - -weh.setPageTitle(weh._("weh_inspector")); diff --git a/templates/weh-inspector/src/content/jquery.json-viewer.css b/templates/weh-inspector/src/content/jquery.json-viewer.css deleted file mode 100644 index d6143f9..0000000 --- a/templates/weh-inspector/src/content/jquery.json-viewer.css +++ /dev/null @@ -1,45 +0,0 @@ -/* Syntax highlighting for JSON objects */ -ul.json-dict, ol.json-array { - list-style-type: none; - margin: 0 0 0 1px; - border-left: 1px dotted #ccc; - padding-left: 2em; -} -.json-string { - color: #0B7500; -} -.json-literal { - color: #1A01CC; - font-weight: bold; -} - -/* Toggle button */ -a.json-toggle { - position: relative; - color: inherit; - text-decoration: none; -} -a.json-toggle:focus { - outline: none; -} -a.json-toggle:before { - color: #aaa; - content: "\25BC"; /* down arrow */ - position: absolute; - display: inline-block; - width: 1em; - left: -1em; -} -a.json-toggle.collapsed:before { - content: "\25B6"; /* left arrow */ -} - -/* Collapsable placeholder links */ -a.json-placeholder { - color: #aaa; - padding: 0 1em; - text-decoration: none; -} -a.json-placeholder:hover { - text-decoration: underline; -} diff --git a/templates/weh-inspector/src/content/jquery.json-viewer.js b/templates/weh-inspector/src/content/jquery.json-viewer.js deleted file mode 100644 index 3807182..0000000 --- a/templates/weh-inspector/src/content/jquery.json-viewer.js +++ /dev/null @@ -1,148 +0,0 @@ -/** - * jQuery json-viewer - * @author: Alexandre Bodelot <alexandre.bodelot@gmail.com> - */ -(function($){ - - /** - * Check if arg is either an array with at least 1 element, or a dict with at least 1 key - * @return boolean - */ - function isCollapsable(arg) { - return arg instanceof Object && Object.keys(arg).length > 0; - } - - /** - * Check if a string represents a valid url - * @return boolean - */ - function isUrl(string) { - var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ - return regexp.test(string); - } - - /** - * Transform a json object into html representation - * @return string - */ - function json2html(json, options) { - var html = ''; - if (typeof json === 'string') { - // Escape tags - json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); - if (isUrl(json)) - html += '<a href="' + json + '" class="json-string">' + json + '</a>'; - else - html += '<span class="json-string">"' + json + '"</span>'; - } - else if (typeof json === 'number') { - html += '<span class="json-literal">' + json + '</span>'; - } - else if (typeof json === 'boolean') { - html += '<span class="json-literal">' + json + '</span>'; - } - else if (json === null) { - html += '<span class="json-literal">null</span>'; - } - else if (json instanceof Array) { - if (json.length > 0) { - html += '[<ol class="json-array">'; - for (var i = 0; i < json.length; ++i) { - html += '<li>' - // Add toggle button if item is collapsable - if (isCollapsable(json[i])) { - html += '<a href class="json-toggle"></a>'; - } - html += json2html(json[i], options); - // Add comma if item is not last - if (i < json.length - 1) { - html += ','; - } - html += '</li>'; - } - html += '</ol>]'; - } - else { - html += '[]'; - } - } - else if (typeof json === 'object') { - var key_count = Object.keys(json).length; - if (key_count > 0) { - html += '{<ul class="json-dict">'; - for (var key in json) { - if (json.hasOwnProperty(key)) { - html += '<li>'; - var keyRepr = options.withQuotes ? - '<span class="json-string">"' + key + '"</span>' : key; - // Add toggle button if item is collapsable - if (isCollapsable(json[key])) { - html += '<a href class="json-toggle">' + keyRepr + '</a>'; - } - else { - html += keyRepr; - } - html += ': ' + json2html(json[key], options); - // Add comma if item is not last - if (--key_count > 0) - html += ','; - html += '</li>'; - } - } - html += '</ul>}'; - } - else { - html += '{}'; - } - } - return html; - } - - /** - * jQuery plugin method - * @param json: a javascript object - * @param options: an optional options hash - */ - $.fn.jsonViewer = function(json, options) { - options = options || {}; - - // jQuery chaining - return this.each(function() { - - // Transform to HTML - var html = json2html(json, options) - if (isCollapsable(json)) - html = '<a href class="json-toggle"></a>' + html; - - // Insert HTML in target DOM element - $(this).html(html); - - // Bind click on toggle buttons - $(this).off('click'); - $(this).on('click', 'a.json-toggle', function() { - var target = $(this).toggleClass('collapsed').siblings('ul.json-dict, ol.json-array'); - target.toggle(); - if (target.is(':visible')) { - target.siblings('.json-placeholder').remove(); - } - else { - var count = target.children('li').length; - var placeholder = count + (count > 1 ? ' items' : ' item'); - target.after('<a href class="json-placeholder">' + placeholder + '</a>'); - } - return false; - }); - - // Simulate click on toggle button when placeholder is clicked - $(this).on('click', 'a.json-placeholder', function() { - $(this).siblings('a.json-toggle').click(); - return false; - }); - - if (options.collapsed == true) { - // Trigger click to collapse all nodes - $(this).find('a.json-toggle').click(); - } - }); - }; -})(jQuery); diff --git a/templates/weh-inspector/src/content/select2.css b/templates/weh-inspector/src/content/select2.css deleted file mode 100644 index 447b2b8..0000000 --- a/templates/weh-inspector/src/content/select2.css +++ /dev/null @@ -1,484 +0,0 @@ -.select2-container { - box-sizing: border-box; - display: inline-block; - margin: 0; - position: relative; - vertical-align: middle; } - .select2-container .select2-selection--single { - box-sizing: border-box; - cursor: pointer; - display: block; - height: 28px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--single .select2-selection__rendered { - display: block; - padding-left: 8px; - padding-right: 20px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-selection--single .select2-selection__clear { - position: relative; } - .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { - padding-right: 8px; - padding-left: 20px; } - .select2-container .select2-selection--multiple { - box-sizing: border-box; - cursor: pointer; - display: block; - min-height: 32px; - user-select: none; - -webkit-user-select: none; } - .select2-container .select2-selection--multiple .select2-selection__rendered { - display: inline-block; - overflow: hidden; - padding-left: 8px; - text-overflow: ellipsis; - white-space: nowrap; } - .select2-container .select2-search--inline { - float: left; } - .select2-container .select2-search--inline .select2-search__field { - box-sizing: border-box; - border: none; - font-size: 100%; - margin-top: 5px; - padding: 0; } - .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - -.select2-dropdown { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - box-sizing: border-box; - display: block; - position: absolute; - left: -100000px; - width: 100%; - z-index: 1051; } - -.select2-results { - display: block; } - -.select2-results__options { - list-style: none; - margin: 0; - padding: 0; } - -.select2-results__option { - padding: 6px; - user-select: none; - -webkit-user-select: none; } - .select2-results__option[aria-selected] { - cursor: pointer; } - -.select2-container--open .select2-dropdown { - left: 0; } - -.select2-container--open .select2-dropdown--above { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--open .select2-dropdown--below { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-search--dropdown { - display: block; - padding: 4px; } - .select2-search--dropdown .select2-search__field { - padding: 4px; - width: 100%; - box-sizing: border-box; } - .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { - -webkit-appearance: none; } - .select2-search--dropdown.select2-search--hide { - display: none; } - -.select2-close-mask { - border: 0; - margin: 0; - padding: 0; - display: block; - position: fixed; - left: 0; - top: 0; - min-height: 100%; - min-width: 100%; - height: auto; - width: auto; - opacity: 0; - z-index: 99; - background-color: #fff; - filter: alpha(opacity=0); } - -.select2-hidden-accessible { - border: 0 !important; - clip: rect(0 0 0 0) !important; - height: 1px !important; - margin: -1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; } - -.select2-container--default .select2-selection--single { - background-color: #fff; - border: 1px solid #aaa; - border-radius: 4px; } - .select2-container--default .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--default .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; } - .select2-container--default .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--default .select2-selection--single .select2-selection__arrow { - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; } - .select2-container--default .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { - left: 1px; - right: auto; } - -.select2-container--default.select2-container--disabled .select2-selection--single { - background-color: #eee; - cursor: default; } - .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { - display: none; } - -.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--default .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0 5px; - width: 100%; } - .select2-container--default .select2-selection--multiple .select2-selection__rendered li { - list-style: none; } - .select2-container--default .select2-selection--multiple .select2-selection__placeholder { - color: #999; - margin-top: 5px; - float: left; } - .select2-container--default .select2-selection--multiple .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-top: 5px; - margin-right: 10px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { - color: #999; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #333; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { - float: right; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--default.select2-container--focus .select2-selection--multiple { - border: solid black 1px; - outline: 0; } - -.select2-container--default.select2-container--disabled .select2-selection--multiple { - background-color: #eee; - cursor: default; } - -.select2-container--default.select2-container--disabled .select2-selection__choice__remove { - display: none; } - -.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--default .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; } - -.select2-container--default .select2-search--inline .select2-search__field { - background: transparent; - border: none; - outline: 0; - box-shadow: none; - -webkit-appearance: textfield; } - -.select2-container--default .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--default .select2-results__option[role=group] { - padding: 0; } - -.select2-container--default .select2-results__option[aria-disabled=true] { - color: #999; } - -.select2-container--default .select2-results__option[aria-selected=true] { - background-color: #ddd; } - -.select2-container--default .select2-results__option .select2-results__option { - padding-left: 1em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__group { - padding-left: 0; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option { - margin-left: -1em; - padding-left: 2em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -2em; - padding-left: 3em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -3em; - padding-left: 4em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -4em; - padding-left: 5em; } - .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { - margin-left: -5em; - padding-left: 6em; } - -.select2-container--default .select2-results__option--highlighted[aria-selected] { - background-color: #5897fb; - color: white; } - -.select2-container--default .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic .select2-selection--single { - background-color: #f7f7f7; - border: 1px solid #aaa; - border-radius: 4px; - outline: 0; - background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); - background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - .select2-container--classic .select2-selection--single:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--single .select2-selection__rendered { - color: #444; - line-height: 28px; } - .select2-container--classic .select2-selection--single .select2-selection__clear { - cursor: pointer; - float: right; - font-weight: bold; - margin-right: 10px; } - .select2-container--classic .select2-selection--single .select2-selection__placeholder { - color: #999; } - .select2-container--classic .select2-selection--single .select2-selection__arrow { - background-color: #ddd; - border: none; - border-left: 1px solid #aaa; - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - height: 26px; - position: absolute; - top: 1px; - right: 1px; - width: 20px; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } - .select2-container--classic .select2-selection--single .select2-selection__arrow b { - border-color: #888 transparent transparent transparent; - border-style: solid; - border-width: 5px 4px 0 4px; - height: 0; - left: 50%; - margin-left: -4px; - margin-top: -2px; - position: absolute; - top: 50%; - width: 0; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { - float: left; } - -.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { - border: none; - border-right: 1px solid #aaa; - border-radius: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - left: 1px; - right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--single { - border: 1px solid #5897fb; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { - background: transparent; - border: none; } - .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { - border-color: transparent transparent #888 transparent; - border-width: 0 4px 5px 4px; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; - background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); - background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); - background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } - -.select2-container--classic .select2-selection--multiple { - background-color: white; - border: 1px solid #aaa; - border-radius: 4px; - cursor: text; - outline: 0; } - .select2-container--classic .select2-selection--multiple:focus { - border: 1px solid #5897fb; } - .select2-container--classic .select2-selection--multiple .select2-selection__rendered { - list-style: none; - margin: 0; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__clear { - display: none; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice { - background-color: #e4e4e4; - border: 1px solid #aaa; - border-radius: 4px; - cursor: default; - float: left; - margin-right: 5px; - margin-top: 5px; - padding: 0 5px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { - color: #888; - cursor: pointer; - display: inline-block; - font-weight: bold; - margin-right: 2px; } - .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { - color: #555; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - float: right; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { - margin-left: 5px; - margin-right: auto; } - -.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { - margin-left: 2px; - margin-right: auto; } - -.select2-container--classic.select2-container--open .select2-selection--multiple { - border: 1px solid #5897fb; } - -.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { - border-top: none; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { - border-bottom: none; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; } - -.select2-container--classic .select2-search--dropdown .select2-search__field { - border: 1px solid #aaa; - outline: 0; } - -.select2-container--classic .select2-search--inline .select2-search__field { - outline: 0; - box-shadow: none; } - -.select2-container--classic .select2-dropdown { - background-color: white; - border: 1px solid transparent; } - -.select2-container--classic .select2-dropdown--above { - border-bottom: none; } - -.select2-container--classic .select2-dropdown--below { - border-top: none; } - -.select2-container--classic .select2-results > .select2-results__options { - max-height: 200px; - overflow-y: auto; } - -.select2-container--classic .select2-results__option[role=group] { - padding: 0; } - -.select2-container--classic .select2-results__option[aria-disabled=true] { - color: grey; } - -.select2-container--classic .select2-results__option--highlighted[aria-selected] { - background-color: #3875d7; - color: white; } - -.select2-container--classic .select2-results__group { - cursor: default; - display: block; - padding: 6px; } - -.select2-container--classic.select2-container--open .select2-dropdown { - border-color: #5897fb; } diff --git a/templates/weh-inspector/src/content/select2.js b/templates/weh-inspector/src/content/select2.js deleted file mode 100644 index 13b84fa..0000000 --- a/templates/weh-inspector/src/content/select2.js +++ /dev/null @@ -1,5725 +0,0 @@ -/*! - * Select2 4.0.3 - * https://select2.github.io - * - * Released under the MIT license - * https://github.com/select2/select2/blob/master/LICENSE.md - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function (jQuery) { - // This is needed so we can catch the AMD loader configuration and use it - // The inner file should be wrapped (by `banner.start.js`) in a function that - // returns the AMD loader references. - var S2 = -(function () { - // Restore the Select2 AMD loader so it can be used - // Needed mostly in the language files, where the loader is not inserted - if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { - var S2 = jQuery.fn.select2.amd; - } -var S2;(function () { if (!S2 || !S2.requirejs) { -if (!S2) { S2 = {}; } else { require = S2; } -/** - * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/almond for details - */ -//Going sloppy to avoid 'use strict' string cost, but strict practices should -//be followed. -/*jslint sloppy: true */ -/*global setTimeout: false */ - -var requirejs, require, define; -(function (undef) { - var main, req, makeMap, handlers, - defined = {}, - waiting = {}, - config = {}, - defining = {}, - hasOwn = Object.prototype.hasOwnProperty, - aps = [].slice, - jsSuffixRegExp = /\.js$/; - - function hasProp(obj, prop) { - return hasOwn.call(obj, prop); - } - - /** - * Given a relative module name, like ./something, normalize it to - * a real name that can be mapped to a path. - * @param {String} name the relative name - * @param {String} baseName a real name that the name arg is relative - * to. - * @returns {String} normalized name - */ - function normalize(name, baseName) { - var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, - baseParts = baseName && baseName.split("/"), - map = config.map, - starMap = (map && map['*']) || {}; - - //Adjust any relative paths. - if (name && name.charAt(0) === ".") { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - name = name.split('/'); - lastIndex = name.length - 1; - - // Node .js allowance: - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } - - //Lop off the last part of baseParts, so that . matches the - //"directory" and not name of the baseName's module. For instance, - //baseName of "one/two/three", maps to "one/two/three.js", but we - //want the directory, "one/two" for this normalization. - name = baseParts.slice(0, baseParts.length - 1).concat(name); - - //start trimDots - for (i = 0; i < name.length; i += 1) { - part = name[i]; - if (part === ".") { - name.splice(i, 1); - i -= 1; - } else if (part === "..") { - if (i === 1 && (name[2] === '..' || name[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } - } - } - //end trimDots - - name = name.join("/"); - } else if (name.indexOf('./') === 0) { - // No baseName, so this is ID is resolved relative - // to baseUrl, pull off the leading dot. - name = name.substring(2); - } - } - - //Apply map config if available. - if ((baseParts || starMap) && map) { - nameParts = name.split('/'); - - for (i = nameParts.length; i > 0; i -= 1) { - nameSegment = nameParts.slice(0, i).join("/"); - - if (baseParts) { - //Find the longest baseName segment match in the config. - //So, do joins on the biggest to smallest lengths of baseParts. - for (j = baseParts.length; j > 0; j -= 1) { - mapValue = map[baseParts.slice(0, j).join('/')]; - - //baseName segment has config, find if it has one for - //this name. - if (mapValue) { - mapValue = mapValue[nameSegment]; - if (mapValue) { - //Match, update name to the new value. - foundMap = mapValue; - foundI = i; - break; - } - } - } - } - - if (foundMap) { - break; - } - - //Check for a star map match, but just hold on to it, - //if there is a shorter segment match later in a matching - //config, then favor over this star map. - if (!foundStarMap && starMap && starMap[nameSegment]) { - foundStarMap = starMap[nameSegment]; - starI = i; - } - } - - if (!foundMap && foundStarMap) { - foundMap = foundStarMap; - foundI = starI; - } - - if (foundMap) { - nameParts.splice(0, foundI, foundMap); - name = nameParts.join('/'); - } - } - - return name; - } - - function makeRequire(relName, forceSync) { - return function () { - //A version of a require function that passes a moduleName - //value for items that may need to - //look up paths relative to the moduleName - var args = aps.call(arguments, 0); - - //If first arg is not require('string'), and there is only - //one arg, it is the array form without a callback. Insert - //a null so that the following concat is correct. - if (typeof args[0] !== 'string' && args.length === 1) { - args.push(null); - } - return req.apply(undef, args.concat([relName, forceSync])); - }; - } - - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(depName) { - return function (value) { - defined[depName] = value; - }; - } - - function callDep(name) { - if (hasProp(waiting, name)) { - var args = waiting[name]; - delete waiting[name]; - defining[name] = true; - main.apply(undef, args); - } - - if (!hasProp(defined, name) && !hasProp(defining, name)) { - throw new Error('No ' + name); - } - return defined[name]; - } - - //Turns a plugin!resource to [plugin, resource] - //with the plugin being undefined if the name - //did not have a plugin prefix. - function splitPrefix(name) { - var prefix, - index = name ? name.indexOf('!') : -1; - if (index > -1) { - prefix = name.substring(0, index); - name = name.substring(index + 1, name.length); - } - return [prefix, name]; - } - - /** - * Makes a name map, normalizing the name, and using a plugin - * for normalization if necessary. Grabs a ref to plugin - * too, as an optimization. - */ - makeMap = function (name, relName) { - var plugin, - parts = splitPrefix(name), - prefix = parts[0]; - - name = parts[1]; - - if (prefix) { - prefix = normalize(prefix, relName); - plugin = callDep(prefix); - } - - //Normalize according - if (prefix) { - if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relName)); - } else { - name = normalize(name, relName); - } - } else { - name = normalize(name, relName); - parts = splitPrefix(name); - prefix = parts[0]; - name = parts[1]; - if (prefix) { - plugin = callDep(prefix); - } - } - - //Using ridiculous property names for space reasons - return { - f: prefix ? prefix + '!' + name : name, //fullName - n: name, - pr: prefix, - p: plugin - }; - }; - - function makeConfig(name) { - return function () { - return (config && config.config && config.config[name]) || {}; - }; - } - - handlers = { - require: function (name) { - return makeRequire(name); - }, - exports: function (name) { - var e = defined[name]; - if (typeof e !== 'undefined') { - return e; - } else { - return (defined[name] = {}); - } - }, - module: function (name) { - return { - id: name, - uri: '', - exports: defined[name], - config: makeConfig(name) - }; - } - }; - - main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, - args = [], - callbackType = typeof callback, - usingExports; - - //Use name if no relName - relName = relName || name; - - //Call the callback to define the module, if necessary. - if (callbackType === 'undefined' || callbackType === 'function') { - //Pull out the defined dependencies and pass the ordered - //values to the callback. - //Default to [require, exports, module] if no deps - deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; - for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relName); - depName = map.f; - - //Fast path CommonJS standard dependencies. - if (depName === "require") { - args[i] = handlers.require(name); - } else if (depName === "exports") { - //CommonJS module spec 1.1 - args[i] = handlers.exports(name); - usingExports = true; - } else if (depName === "module") { - //CommonJS module spec 1.1 - cjsModule = args[i] = handlers.module(name); - } else if (hasProp(defined, depName) || - hasProp(waiting, depName) || - hasProp(defining, depName)) { - args[i] = callDep(depName); - } else if (map.p) { - map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); - args[i] = defined[depName]; - } else { - throw new Error(name + ' missing ' + depName); - } - } - - ret = callback ? callback.apply(defined[name], args) : undefined; - - if (name) { - //If setting exports via "module" is in play, - //favor that over return value and exports. After that, - //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef && - cjsModule.exports !== defined[name]) { - defined[name] = cjsModule.exports; - } else if (ret !== undef || !usingExports) { - //Use the return value from the function. - defined[name] = ret; - } - } - } else if (name) { - //May just be an object definition for the module. Only - //worry about defining if have a module name. - defined[name] = callback; - } - }; - - requirejs = require = req = function (deps, callback, relName, forceSync, alt) { - if (typeof deps === "string") { - if (handlers[deps]) { - //callback in this case is really relName - return handlers[deps](callback); - } - //Just return the module wanted. In this scenario, the - //deps arg is the module name, and second arg (if passed) - //is just the relName. - //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, callback).f); - } else if (!deps.splice) { - //deps is a config object, not an array. - config = deps; - if (config.deps) { - req(config.deps, config.callback); - } - if (!callback) { - return; - } - - if (callback.splice) { - //callback is an array, which means it is a dependency list. - //Adjust args if there are dependencies - deps = callback; - callback = relName; - relName = null; - } else { - deps = undef; - } - } - - //Support require(['a']) - callback = callback || function () {}; - - //If relName is a function, it is an errback handler, - //so remove it. - if (typeof relName === 'function') { - relName = forceSync; - forceSync = alt; - } - - //Simulate async callback; - if (forceSync) { - main(undef, deps, callback, relName); - } else { - //Using a non-zero value because of concern for what old browsers - //do, and latest browsers "upgrade" to 4 if lower value is used: - //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: - //If want a value immediately, use require('id') instead -- something - //that works in almond on the global level, but not guaranteed and - //unlikely to work in other AMD implementations. - setTimeout(function () { - main(undef, deps, callback, relName); - }, 4); - } - - return req; - }; - - /** - * Just drops the config on the floor, but returns req in case - * the config return value is used. - */ - req.config = function (cfg) { - return req(cfg); - }; - - /** - * Expose module registry for debugging and tooling - */ - requirejs._defined = defined; - - define = function (name, deps, callback) { - if (typeof name !== 'string') { - throw new Error('See almond README: incorrect module build, no module name'); - } - - //This module may not have dependencies - if (!deps.splice) { - //deps is not an array, so probably means - //an object literal or factory function for - //the value. Adjust args. - callback = deps; - deps = []; - } - - if (!hasProp(defined, name) && !hasProp(waiting, name)) { - waiting[name] = [name, deps, callback]; - } - }; - - define.amd = { - jQuery: true - }; -}()); - -S2.requirejs = requirejs;S2.require = require;S2.define = define; -} -}()); -S2.define("almond", function(){}); - -/* global jQuery:false, $:false */ -S2.define('jquery',[],function () { - var _$ = jQuery || $; - - if (_$ == null && console && console.error) { - console.error( - 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + - 'found. Make sure that you are including jQuery before Select2 on your ' + - 'web page.' - ); - } - - return _$; -}); - -S2.define('select2/utils',[ - 'jquery' -], function ($) { - var Utils = {}; - - Utils.Extend = function (ChildClass, SuperClass) { - var __hasProp = {}.hasOwnProperty; - - function BaseConstructor () { - this.constructor = ChildClass; - } - - for (var key in SuperClass) { - if (__hasProp.call(SuperClass, key)) { - ChildClass[key] = SuperClass[key]; - } - } - - BaseConstructor.prototype = SuperClass.prototype; - ChildClass.prototype = new BaseConstructor(); - ChildClass.__super__ = SuperClass.prototype; - - return ChildClass; - }; - - function getMethods (theClass) { - var proto = theClass.prototype; - - var methods = []; - - for (var methodName in proto) { - var m = proto[methodName]; - - if (typeof m !== 'function') { - continue; - } - - if (methodName === 'constructor') { - continue; - } - - methods.push(methodName); - } - - return methods; - } - - Utils.Decorate = function (SuperClass, DecoratorClass) { - var decoratedMethods = getMethods(DecoratorClass); - var superMethods = getMethods(SuperClass); - - function DecoratedClass () { - var unshift = Array.prototype.unshift; - - var argCount = DecoratorClass.prototype.constructor.length; - - var calledConstructor = SuperClass.prototype.constructor; - - if (argCount > 0) { - unshift.call(arguments, SuperClass.prototype.constructor); - - calledConstructor = DecoratorClass.prototype.constructor; - } - - calledConstructor.apply(this, arguments); - } - - DecoratorClass.displayName = SuperClass.displayName; - - function ctr () { - this.constructor = DecoratedClass; - } - - DecoratedClass.prototype = new ctr(); - - for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; - - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; - } - - var calledMethod = function (methodName) { - // Stub out the original method if it's not decorating an actual method - var originalMethod = function () {}; - - if (methodName in DecoratedClass.prototype) { - originalMethod = DecoratedClass.prototype[methodName]; - } - - var decoratedMethod = DecoratorClass.prototype[methodName]; - - return function () { - var unshift = Array.prototype.unshift; - - unshift.call(arguments, originalMethod); - - return decoratedMethod.apply(this, arguments); - }; - }; - - for (var d = 0; d < decoratedMethods.length; d++) { - var decoratedMethod = decoratedMethods[d]; - - DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); - } - - return DecoratedClass; - }; - - var Observable = function () { - this.listeners = {}; - }; - - Observable.prototype.on = function (event, callback) { - this.listeners = this.listeners || {}; - - if (event in this.listeners) { - this.listeners[event].push(callback); - } else { - this.listeners[event] = [callback]; - } - }; - - Observable.prototype.trigger = function (event) { - var slice = Array.prototype.slice; - var params = slice.call(arguments, 1); - - this.listeners = this.listeners || {}; - - // Params should always come in as an array - if (params == null) { - params = []; - } - - // If there are no arguments to the event, use a temporary object - if (params.length === 0) { - params.push({}); - } - - // Set the `_type` of the first object to the event - params[0]._type = event; - - if (event in this.listeners) { - this.invoke(this.listeners[event], slice.call(arguments, 1)); - } - - if ('*' in this.listeners) { - this.invoke(this.listeners['*'], arguments); - } - }; - - Observable.prototype.invoke = function (listeners, params) { - for (var i = 0, len = listeners.length; i < len; i++) { - listeners[i].apply(this, params); - } - }; - - Utils.Observable = Observable; - - Utils.generateChars = function (length) { - var chars = ''; - - for (var i = 0; i < length; i++) { - var randomChar = Math.floor(Math.random() * 36); - chars += randomChar.toString(36); - } - - return chars; - }; - - Utils.bind = function (func, context) { - return function () { - func.apply(context, arguments); - }; - }; - - Utils._convertData = function (data) { - for (var originalKey in data) { - var keys = originalKey.split('-'); - - var dataLevel = data; - - if (keys.length === 1) { - continue; - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k]; - - // Lowercase the first letter - // By default, dash-separated becomes camelCase - key = key.substring(0, 1).toLowerCase() + key.substring(1); - - if (!(key in dataLevel)) { - dataLevel[key] = {}; - } - - if (k == keys.length - 1) { - dataLevel[key] = data[originalKey]; - } - - dataLevel = dataLevel[key]; - } - - delete data[originalKey]; - } - - return data; - }; - - Utils.hasScroll = function (index, el) { - // Adapted from the function created by @ShadowScripter - // and adapted by @BillBarry on the Stack Exchange Code Review website. - // The original code can be found at - // http://codereview.stackexchange.com/q/13338 - // and was designed to be used with the Sizzle selector engine. - - var $el = $(el); - var overflowX = el.style.overflowX; - var overflowY = el.style.overflowY; - - //Check both x and y declarations - if (overflowX === overflowY && - (overflowY === 'hidden' || overflowY === 'visible')) { - return false; - } - - if (overflowX === 'scroll' || overflowY === 'scroll') { - return true; - } - - return ($el.innerHeight() < el.scrollHeight || - $el.innerWidth() < el.scrollWidth); - }; - - Utils.escapeMarkup = function (markup) { - var replaceMap = { - '\\': '\', - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '/': '/' - }; - - // Do not try to escape the markup if it's not a string - if (typeof markup !== 'string') { - return markup; - } - - return String(markup).replace(/[&<>"'\/\\]/g, function (match) { - return replaceMap[match]; - }); - }; - - // Append an array of jQuery nodes to a given element. - Utils.appendMany = function ($element, $nodes) { - // jQuery 1.7.x does not support $.fn.append() with an array - // Fall back to a jQuery object collection using $.fn.add() - if ($.fn.jquery.substr(0, 3) === '1.7') { - var $jqNodes = $(); - - $.map($nodes, function (node) { - $jqNodes = $jqNodes.add(node); - }); - - $nodes = $jqNodes; - } - - $element.append($nodes); - }; - - return Utils; -}); - -S2.define('select2/results',[ - 'jquery', - './utils' -], function ($, Utils) { - function Results ($element, options, dataAdapter) { - this.$element = $element; - this.data = dataAdapter; - this.options = options; - - Results.__super__.constructor.call(this); - } - - Utils.Extend(Results, Utils.Observable); - - Results.prototype.render = function () { - var $results = $( - '<ul class="select2-results__options" role="tree"></ul>' - ); - - if (this.options.get('multiple')) { - $results.attr('aria-multiselectable', 'true'); - } - - this.$results = $results; - - return $results; - }; - - Results.prototype.clear = function () { - this.$results.empty(); - }; - - Results.prototype.displayMessage = function (params) { - var escapeMarkup = this.options.get('escapeMarkup'); - - this.clear(); - this.hideLoading(); - - var $message = $( - '<li role="treeitem" aria-live="assertive"' + - ' class="select2-results__option"></li>' - ); - - var message = this.options.get('translations').get(params.message); - - $message.append( - escapeMarkup( - message(params.args) - ) - ); - - $message[0].className += ' select2-results__message'; - - this.$results.append($message); - }; - - Results.prototype.hideMessages = function () { - this.$results.find('.select2-results__message').remove(); - }; - - Results.prototype.append = function (data) { - this.hideLoading(); - - var $options = []; - - if (data.results == null || data.results.length === 0) { - if (this.$results.children().length === 0) { - this.trigger('results:message', { - message: 'noResults' - }); - } - - return; - } - - data.results = this.sort(data.results); - - for (var d = 0; d < data.results.length; d++) { - var item = data.results[d]; - - var $option = this.option(item); - - $options.push($option); - } - - this.$results.append($options); - }; - - Results.prototype.position = function ($results, $dropdown) { - var $resultsContainer = $dropdown.find('.select2-results'); - $resultsContainer.append($results); - }; - - Results.prototype.sort = function (data) { - var sorter = this.options.get('sorter'); - - return sorter(data); - }; - - Results.prototype.highlightFirstItem = function () { - var $options = this.$results - .find('.select2-results__option[aria-selected]'); - - var $selected = $options.filter('[aria-selected=true]'); - - // Check if there are any selected options - if ($selected.length > 0) { - // If there are selected options, highlight the first - $selected.first().trigger('mouseenter'); - } else { - // If there are no selected options, highlight the first option - // in the dropdown - $options.first().trigger('mouseenter'); - } - - this.ensureHighlightVisible(); - }; - - Results.prototype.setClasses = function () { - var self = this; - - this.data.current(function (selected) { - var selectedIds = $.map(selected, function (s) { - return s.id.toString(); - }); - - var $options = self.$results - .find('.select2-results__option[aria-selected]'); - - $options.each(function () { - var $option = $(this); - - var item = $.data(this, 'data'); - - // id needs to be converted to a string when comparing - var id = '' + item.id; - - if ((item.element != null && item.element.selected) || - (item.element == null && $.inArray(id, selectedIds) > -1)) { - $option.attr('aria-selected', 'true'); - } else { - $option.attr('aria-selected', 'false'); - } - }); - - }); - }; - - Results.prototype.showLoading = function (params) { - this.hideLoading(); - - var loadingMore = this.options.get('translations').get('searching'); - - var loading = { - disabled: true, - loading: true, - text: loadingMore(params) - }; - var $loading = this.option(loading); - $loading.className += ' loading-results'; - - this.$results.prepend($loading); - }; - - Results.prototype.hideLoading = function () { - this.$results.find('.loading-results').remove(); - }; - - Results.prototype.option = function (data) { - var option = document.createElement('li'); - option.className = 'select2-results__option'; - - var attrs = { - 'role': 'treeitem', - 'aria-selected': 'false' - }; - - if (data.disabled) { - delete attrs['aria-selected']; - attrs['aria-disabled'] = 'true'; - } - - if (data.id == null) { - delete attrs['aria-selected']; - } - - if (data._resultId != null) { - option.id = data._resultId; - } - - if (data.title) { - option.title = data.title; - } - - if (data.children) { - attrs.role = 'group'; - attrs['aria-label'] = data.text; - delete attrs['aria-selected']; - } - - for (var attr in attrs) { - var val = attrs[attr]; - - option.setAttribute(attr, val); - } - - if (data.children) { - var $option = $(option); - - var label = document.createElement('strong'); - label.className = 'select2-results__group'; - - var $label = $(label); - this.template(data, label); - - var $children = []; - - for (var c = 0; c < data.children.length; c++) { - var child = data.children[c]; - - var $child = this.option(child); - - $children.push($child); - } - - var $childrenContainer = $('<ul></ul>', { - 'class': 'select2-results__options select2-results__options--nested' - }); - - $childrenContainer.append($children); - - $option.append(label); - $option.append($childrenContainer); - } else { - this.template(data, option); - } - - $.data(option, 'data', data); - - return option; - }; - - Results.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-results'; - - this.$results.attr('id', id); - - container.on('results:all', function (params) { - self.clear(); - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - self.highlightFirstItem(); - } - }); - - container.on('results:append', function (params) { - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - } - }); - - container.on('query', function (params) { - self.hideMessages(); - self.showLoading(params); - }); - - container.on('select', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - self.highlightFirstItem(); - }); - - container.on('unselect', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - self.highlightFirstItem(); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expended="true" - self.$results.attr('aria-expanded', 'true'); - self.$results.attr('aria-hidden', 'false'); - - self.setClasses(); - self.ensureHighlightVisible(); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expended="false" - self.$results.attr('aria-expanded', 'false'); - self.$results.attr('aria-hidden', 'true'); - self.$results.removeAttr('aria-activedescendant'); - }); - - container.on('results:toggle', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - $highlighted.trigger('mouseup'); - }); - - container.on('results:select', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var data = $highlighted.data('data'); - - if ($highlighted.attr('aria-selected') == 'true') { - self.trigger('close', {}); - } else { - self.trigger('select', { - data: data - }); - } - }); - - container.on('results:previous', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - // If we are already at te top, don't move further - if (currentIndex === 0) { - return; - } - - var nextIndex = currentIndex - 1; - - // If none are highlighted, highlight the first - if ($highlighted.length === 0) { - nextIndex = 0; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top; - var nextTop = $next.offset().top; - var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextTop - currentOffset < 0) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:next', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var nextIndex = currentIndex + 1; - - // If we are at the last option, stay there - if (nextIndex >= $options.length) { - return; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var nextBottom = $next.offset().top + $next.outerHeight(false); - var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextBottom > currentOffset) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:focus', function (params) { - params.element.addClass('select2-results__option--highlighted'); - }); - - container.on('results:message', function (params) { - self.displayMessage(params); - }); - - if ($.fn.mousewheel) { - this.$results.on('mousewheel', function (e) { - var top = self.$results.scrollTop(); - - var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; - - var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; - var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); - - if (isAtTop) { - self.$results.scrollTop(0); - - e.preventDefault(); - e.stopPropagation(); - } else if (isAtBottom) { - self.$results.scrollTop( - self.$results.get(0).scrollHeight - self.$results.height() - ); - - e.preventDefault(); - e.stopPropagation(); - } - }); - } - - this.$results.on('mouseup', '.select2-results__option[aria-selected]', - function (evt) { - var $this = $(this); - - var data = $this.data('data'); - - if ($this.attr('aria-selected') === 'true') { - if (self.options.get('multiple')) { - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } else { - self.trigger('close', {}); - } - - return; - } - - self.trigger('select', { - originalEvent: evt, - data: data - }); - }); - - this.$results.on('mouseenter', '.select2-results__option[aria-selected]', - function (evt) { - var data = $(this).data('data'); - - self.getHighlightedResults() - .removeClass('select2-results__option--highlighted'); - - self.trigger('results:focus', { - data: data, - element: $(this) - }); - }); - }; - - Results.prototype.getHighlightedResults = function () { - var $highlighted = this.$results - .find('.select2-results__option--highlighted'); - - return $highlighted; - }; - - Results.prototype.destroy = function () { - this.$results.remove(); - }; - - Results.prototype.ensureHighlightVisible = function () { - var $highlighted = this.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var $options = this.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var currentOffset = this.$results.offset().top; - var nextTop = $highlighted.offset().top; - var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); - - var offsetDelta = nextTop - currentOffset; - nextOffset -= $highlighted.outerHeight(false) * 2; - - if (currentIndex <= 2) { - this.$results.scrollTop(0); - } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { - this.$results.scrollTop(nextOffset); - } - }; - - Results.prototype.template = function (result, container) { - var template = this.options.get('templateResult'); - var escapeMarkup = this.options.get('escapeMarkup'); - - var content = template(result, container); - - if (content == null) { - container.style.display = 'none'; - } else if (typeof content === 'string') { - container.innerHTML = escapeMarkup(content); - } else { - $(container).append(content); - } - }; - - return Results; -}); - -S2.define('select2/keys',[ - -], function () { - var KEYS = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - SHIFT: 16, - CTRL: 17, - ALT: 18, - ESC: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - DELETE: 46 - }; - - return KEYS; -}); - -S2.define('select2/selection/base',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function BaseSelection ($element, options) { - this.$element = $element; - this.options = options; - - BaseSelection.__super__.constructor.call(this); - } - - Utils.Extend(BaseSelection, Utils.Observable); - - BaseSelection.prototype.render = function () { - var $selection = $( - '<span class="select2-selection" role="combobox" ' + - ' aria-haspopup="true" aria-expanded="false">' + - '</span>' - ); - - this._tabindex = 0; - - if (this.$element.data('old-tabindex') != null) { - this._tabindex = this.$element.data('old-tabindex'); - } else if (this.$element.attr('tabindex') != null) { - this._tabindex = this.$element.attr('tabindex'); - } - - $selection.attr('title', this.$element.attr('title')); - $selection.attr('tabindex', this._tabindex); - - this.$selection = $selection; - - return $selection; - }; - - BaseSelection.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-container'; - var resultsId = container.id + '-results'; - - this.container = container; - - this.$selection.on('focus', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('blur', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', function (evt) { - self.trigger('keypress', evt); - - if (evt.which === KEYS.SPACE) { - evt.preventDefault(); - } - }); - - container.on('results:focus', function (params) { - self.$selection.attr('aria-activedescendant', params.data._resultId); - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expanded="true" - self.$selection.attr('aria-expanded', 'true'); - self.$selection.attr('aria-owns', resultsId); - - self._attachCloseHandler(container); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expanded="false" - self.$selection.attr('aria-expanded', 'false'); - self.$selection.removeAttr('aria-activedescendant'); - self.$selection.removeAttr('aria-owns'); - - self.$selection.focus(); - - self._detachCloseHandler(container); - }); - - container.on('enable', function () { - self.$selection.attr('tabindex', self._tabindex); - }); - - container.on('disable', function () { - self.$selection.attr('tabindex', '-1'); - }); - }; - - BaseSelection.prototype._handleBlur = function (evt) { - var self = this; - - // This needs to be delayed as the active element is the body when the tab - // key is pressed, possibly along with others. - window.setTimeout(function () { - // Don't trigger `blur` if the focus is still in the selection - if ( - (document.activeElement == self.$selection[0]) || - ($.contains(self.$selection[0], document.activeElement)) - ) { - return; - } - - self.trigger('blur', evt); - }, 1); - }; - - BaseSelection.prototype._attachCloseHandler = function (container) { - var self = this; - - $(document.body).on('mousedown.select2.' + container.id, function (e) { - var $target = $(e.target); - - var $select = $target.closest('.select2'); - - var $all = $('.select2.select2-container--open'); - - $all.each(function () { - var $this = $(this); - - if (this == $select[0]) { - return; - } - - var $element = $this.data('element'); - - $element.select2('close'); - }); - }); - }; - - BaseSelection.prototype._detachCloseHandler = function (container) { - $(document.body).off('mousedown.select2.' + container.id); - }; - - BaseSelection.prototype.position = function ($selection, $container) { - var $selectionContainer = $container.find('.selection'); - $selectionContainer.append($selection); - }; - - BaseSelection.prototype.destroy = function () { - this._detachCloseHandler(this.container); - }; - - BaseSelection.prototype.update = function (data) { - throw new Error('The `update` method must be defined in child classes.'); - }; - - return BaseSelection; -}); - -S2.define('select2/selection/single',[ - 'jquery', - './base', - '../utils', - '../keys' -], function ($, BaseSelection, Utils, KEYS) { - function SingleSelection () { - SingleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(SingleSelection, BaseSelection); - - SingleSelection.prototype.render = function () { - var $selection = SingleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--single'); - - $selection.html( - '<span class="select2-selection__rendered"></span>' + - '<span class="select2-selection__arrow" role="presentation">' + - '<b role="presentation"></b>' + - '</span>' - ); - - return $selection; - }; - - SingleSelection.prototype.bind = function (container, $container) { - var self = this; - - SingleSelection.__super__.bind.apply(this, arguments); - - var id = container.id + '-container'; - - this.$selection.find('.select2-selection__rendered').attr('id', id); - this.$selection.attr('aria-labelledby', id); - - this.$selection.on('mousedown', function (evt) { - // Only respond to left clicks - if (evt.which !== 1) { - return; - } - - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on('focus', function (evt) { - // User focuses on the container - }); - - this.$selection.on('blur', function (evt) { - // User exits the container - }); - - container.on('focus', function (evt) { - if (!container.isOpen()) { - self.$selection.focus(); - } - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - }; - - SingleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); - }; - - SingleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - SingleSelection.prototype.selectionContainer = function () { - return $('<span></span>'); - }; - - SingleSelection.prototype.update = function (data) { - if (data.length === 0) { - this.clear(); - return; - } - - var selection = data[0]; - - var $rendered = this.$selection.find('.select2-selection__rendered'); - var formatted = this.display(selection, $rendered); - - $rendered.empty().append(formatted); - $rendered.prop('title', selection.title || selection.text); - }; - - return SingleSelection; -}); - -S2.define('select2/selection/multiple',[ - 'jquery', - './base', - '../utils' -], function ($, BaseSelection, Utils) { - function MultipleSelection ($element, options) { - MultipleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(MultipleSelection, BaseSelection); - - MultipleSelection.prototype.render = function () { - var $selection = MultipleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--multiple'); - - $selection.html( - '<ul class="select2-selection__rendered"></ul>' - ); - - return $selection; - }; - - MultipleSelection.prototype.bind = function (container, $container) { - var self = this; - - MultipleSelection.__super__.bind.apply(this, arguments); - - this.$selection.on('click', function (evt) { - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on( - 'click', - '.select2-selection__choice__remove', - function (evt) { - // Ignore the event if it is disabled - if (self.options.get('disabled')) { - return; - } - - var $remove = $(this); - var $selection = $remove.parent(); - - var data = $selection.data('data'); - - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } - ); - }; - - MultipleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); - }; - - MultipleSelection.prototype.display = function (data, container) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data, container)); - }; - - MultipleSelection.prototype.selectionContainer = function () { - var $container = $( - '<li class="select2-selection__choice">' + - '<span class="select2-selection__choice__remove" role="presentation">' + - '×' + - '</span>' + - '</li>' - ); - - return $container; - }; - - MultipleSelection.prototype.update = function (data) { - this.clear(); - - if (data.length === 0) { - return; - } - - var $selections = []; - - for (var d = 0; d < data.length; d++) { - var selection = data[d]; - - var $selection = this.selectionContainer(); - var formatted = this.display(selection, $selection); - - $selection.append(formatted); - $selection.prop('title', selection.title || selection.text); - - $selection.data('data', selection); - - $selections.push($selection); - } - - var $rendered = this.$selection.find('.select2-selection__rendered'); - - Utils.appendMany($rendered, $selections); - }; - - return MultipleSelection; -}); - -S2.define('select2/selection/placeholder',[ - '../utils' -], function (Utils) { - function Placeholder (decorated, $element, options) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options); - } - - Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { - var $placeholder = this.selectionContainer(); - - $placeholder.html(this.display(placeholder)); - $placeholder.addClass('select2-selection__placeholder') - .removeClass('select2-selection__choice'); - - return $placeholder; - }; - - Placeholder.prototype.update = function (decorated, data) { - var singlePlaceholder = ( - data.length == 1 && data[0].id != this.placeholder.id - ); - var multipleSelections = data.length > 1; - - if (multipleSelections || singlePlaceholder) { - return decorated.call(this, data); - } - - this.clear(); - - var $placeholder = this.createPlaceholder(this.placeholder); - - this.$selection.find('.select2-selection__rendered').append($placeholder); - }; - - return Placeholder; -}); - -S2.define('select2/selection/allowClear',[ - 'jquery', - '../keys' -], function ($, KEYS) { - function AllowClear () { } - - AllowClear.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - if (this.placeholder == null) { - if (this.options.get('debug') && window.console && console.error) { - console.error( - 'Select2: The `allowClear` option should be used in combination ' + - 'with the `placeholder` option.' - ); - } - } - - this.$selection.on('mousedown', '.select2-selection__clear', - function (evt) { - self._handleClear(evt); - }); - - container.on('keypress', function (evt) { - self._handleKeyboardClear(evt, container); - }); - }; - - AllowClear.prototype._handleClear = function (_, evt) { - // Ignore the event if it is disabled - if (this.options.get('disabled')) { - return; - } - - var $clear = this.$selection.find('.select2-selection__clear'); - - // Ignore the event if nothing has been selected - if ($clear.length === 0) { - return; - } - - evt.stopPropagation(); - - var data = $clear.data('data'); - - for (var d = 0; d < data.length; d++) { - var unselectData = { - data: data[d] - }; - - // Trigger the `unselect` event, so people can prevent it from being - // cleared. - this.trigger('unselect', unselectData); - - // If the event was prevented, don't clear it out. - if (unselectData.prevented) { - return; - } - } - - this.$element.val(this.placeholder.id).trigger('change'); - - this.trigger('toggle', {}); - }; - - AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { - if (container.isOpen()) { - return; - } - - if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { - this._handleClear(evt); - } - }; - - AllowClear.prototype.update = function (decorated, data) { - decorated.call(this, data); - - if (this.$selection.find('.select2-selection__placeholder').length > 0 || - data.length === 0) { - return; - } - - var $remove = $( - '<span class="select2-selection__clear">' + - '×' + - '</span>' - ); - $remove.data('data', data); - - this.$selection.find('.select2-selection__rendered').prepend($remove); - }; - - return AllowClear; -}); - -S2.define('select2/selection/search',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function Search (decorated, $element, options) { - decorated.call(this, $element, options); - } - - Search.prototype.render = function (decorated) { - var $search = $( - '<li class="select2-search select2-search--inline">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="off"' + - ' spellcheck="false" role="textbox" aria-autocomplete="list" />' + - '</li>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - var $rendered = decorated.call(this); - - this._transferTabIndex(); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('open', function () { - self.$search.trigger('focus'); - }); - - container.on('close', function () { - self.$search.val(''); - self.$search.removeAttr('aria-activedescendant'); - self.$search.trigger('focus'); - }); - - container.on('enable', function () { - self.$search.prop('disabled', false); - - self._transferTabIndex(); - }); - - container.on('disable', function () { - self.$search.prop('disabled', true); - }); - - container.on('focus', function (evt) { - self.$search.trigger('focus'); - }); - - container.on('results:focus', function (params) { - self.$search.attr('aria-activedescendant', params.id); - }); - - this.$selection.on('focusin', '.select2-search--inline', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('focusout', '.select2-search--inline', function (evt) { - self._handleBlur(evt); - }); - - this.$selection.on('keydown', '.select2-search--inline', function (evt) { - evt.stopPropagation(); - - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - - var key = evt.which; - - if (key === KEYS.BACKSPACE && self.$search.val() === '') { - var $previousChoice = self.$searchContainer - .prev('.select2-selection__choice'); - - if ($previousChoice.length > 0) { - var item = $previousChoice.data('data'); - - self.searchRemoveChoice(item); - - evt.preventDefault(); - } - } - }); - - // Try to detect the IE version should the `documentMode` property that - // is stored on the document. This is only implemented in IE and is - // slightly cleaner than doing a user agent check. - // This property is not available in Edge, but Edge also doesn't have - // this bug. - var msie = document.documentMode; - var disableInputEvents = msie && msie <= 11; - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$selection.on( - 'input.searchcheck', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents) { - self.$selection.off('input.search input.searchcheck'); - return; - } - - // Unbind the duplicated `keyup` event - self.$selection.off('keyup.search'); - } - ); - - this.$selection.on( - 'keyup.search input.search', - '.select2-search--inline', - function (evt) { - // IE will trigger the `input` event when a placeholder is used on a - // search box. To get around this issue, we are forced to ignore all - // `input` events in IE and keep using `keyup`. - if (disableInputEvents && evt.type === 'input') { - self.$selection.off('input.search input.searchcheck'); - return; - } - - var key = evt.which; - - // We can freely ignore events from modifier keys - if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { - return; - } - - // Tabbing will be handled during the `keydown` phase - if (key == KEYS.TAB) { - return; - } - - self.handleSearch(evt); - } - ); - }; - - /** - * This method will transfer the tabindex attribute from the rendered - * selection to the search box. This allows for the search box to be used as - * the primary focus instead of the selection container. - * - * @private - */ - Search.prototype._transferTabIndex = function (decorated) { - this.$search.attr('tabindex', this.$selection.attr('tabindex')); - this.$selection.attr('tabindex', '-1'); - }; - - Search.prototype.createPlaceholder = function (decorated, placeholder) { - this.$search.attr('placeholder', placeholder.text); - }; - - Search.prototype.update = function (decorated, data) { - var searchHadFocus = this.$search[0] == document.activeElement; - - this.$search.attr('placeholder', ''); - - decorated.call(this, data); - - this.$selection.find('.select2-selection__rendered') - .append(this.$searchContainer); - - this.resizeSearch(); - if (searchHadFocus) { - this.$search.focus(); - } - }; - - Search.prototype.handleSearch = function () { - this.resizeSearch(); - - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.searchRemoveChoice = function (decorated, item) { - this.trigger('unselect', { - data: item - }); - - this.$search.val(item.text); - this.handleSearch(); - }; - - Search.prototype.resizeSearch = function () { - this.$search.css('width', '25px'); - - var width = ''; - - if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').innerWidth(); - } else { - var minimumWidth = this.$search.val().length + 1; - - width = (minimumWidth * 0.75) + 'em'; - } - - this.$search.css('width', width); - }; - - return Search; -}); - -S2.define('select2/selection/eventRelay',[ - 'jquery' -], function ($) { - function EventRelay () { } - - EventRelay.prototype.bind = function (decorated, container, $container) { - var self = this; - var relayEvents = [ - 'open', 'opening', - 'close', 'closing', - 'select', 'selecting', - 'unselect', 'unselecting' - ]; - - var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; - - decorated.call(this, container, $container); - - container.on('*', function (name, params) { - // Ignore events that should not be relayed - if ($.inArray(name, relayEvents) === -1) { - return; - } - - // The parameters should always be an object - params = params || {}; - - // Generate the jQuery event for the Select2 event - var evt = $.Event('select2:' + name, { - params: params - }); - - self.$element.trigger(evt); - - // Only handle preventable events if it was one - if ($.inArray(name, preventableEvents) === -1) { - return; - } - - params.prevented = evt.isDefaultPrevented(); - }); - }; - - return EventRelay; -}); - -S2.define('select2/translation',[ - 'jquery', - 'require' -], function ($, require) { - function Translation (dict) { - this.dict = dict || {}; - } - - Translation.prototype.all = function () { - return this.dict; - }; - - Translation.prototype.get = function (key) { - return this.dict[key]; - }; - - Translation.prototype.extend = function (translation) { - this.dict = $.extend({}, translation.all(), this.dict); - }; - - // Static functions - - Translation._cache = {}; - - Translation.loadPath = function (path) { - if (!(path in Translation._cache)) { - var translations = require(path); - - Translation._cache[path] = translations; - } - - return new Translation(Translation._cache[path]); - }; - - return Translation; -}); - -S2.define('select2/diacritics',[ - -], function () { - var diacritics = { - '\u24B6': 'A', - '\uFF21': 'A', - '\u00C0': 'A', - '\u00C1': 'A', - '\u00C2': 'A', - '\u1EA6': 'A', - '\u1EA4': 'A', - '\u1EAA': 'A', - '\u1EA8': 'A', - '\u00C3': 'A', - '\u0100': 'A', - '\u0102': 'A', - '\u1EB0': 'A', - '\u1EAE': 'A', - '\u1EB4': 'A', - '\u1EB2': 'A', - '\u0226': 'A', - '\u01E0': 'A', - '\u00C4': 'A', - '\u01DE': 'A', - '\u1EA2': 'A', - '\u00C5': 'A', - '\u01FA': 'A', - '\u01CD': 'A', - '\u0200': 'A', - '\u0202': 'A', - '\u1EA0': 'A', - '\u1EAC': 'A', - '\u1EB6': 'A', - '\u1E00': 'A', - '\u0104': 'A', - '\u023A': 'A', - '\u2C6F': 'A', - '\uA732': 'AA', - '\u00C6': 'AE', - '\u01FC': 'AE', - '\u01E2': 'AE', - '\uA734': 'AO', - '\uA736': 'AU', - '\uA738': 'AV', - '\uA73A': 'AV', - '\uA73C': 'AY', - '\u24B7': 'B', - '\uFF22': 'B', - '\u1E02': 'B', - '\u1E04': 'B', - '\u1E06': 'B', - '\u0243': 'B', - '\u0182': 'B', - '\u0181': 'B', - '\u24B8': 'C', - '\uFF23': 'C', - '\u0106': 'C', - '\u0108': 'C', - '\u010A': 'C', - '\u010C': 'C', - '\u00C7': 'C', - '\u1E08': 'C', - '\u0187': 'C', - '\u023B': 'C', - '\uA73E': 'C', - '\u24B9': 'D', - '\uFF24': 'D', - '\u1E0A': 'D', - '\u010E': 'D', - '\u1E0C': 'D', - '\u1E10': 'D', - '\u1E12': 'D', - '\u1E0E': 'D', - '\u0110': 'D', - '\u018B': 'D', - '\u018A': 'D', - '\u0189': 'D', - '\uA779': 'D', - '\u01F1': 'DZ', - '\u01C4': 'DZ', - '\u01F2': 'Dz', - '\u01C5': 'Dz', - '\u24BA': 'E', - '\uFF25': 'E', - '\u00C8': 'E', - '\u00C9': 'E', - '\u00CA': 'E', - '\u1EC0': 'E', - '\u1EBE': 'E', - '\u1EC4': 'E', - '\u1EC2': 'E', - '\u1EBC': 'E', - '\u0112': 'E', - '\u1E14': 'E', - '\u1E16': 'E', - '\u0114': 'E', - '\u0116': 'E', - '\u00CB': 'E', - '\u1EBA': 'E', - '\u011A': 'E', - '\u0204': 'E', - '\u0206': 'E', - '\u1EB8': 'E', - '\u1EC6': 'E', - '\u0228': 'E', - '\u1E1C': 'E', - '\u0118': 'E', - '\u1E18': 'E', - '\u1E1A': 'E', - '\u0190': 'E', - '\u018E': 'E', - '\u24BB': 'F', - '\uFF26': 'F', - '\u1E1E': 'F', - '\u0191': 'F', - '\uA77B': 'F', - '\u24BC': 'G', - '\uFF27': 'G', - '\u01F4': 'G', - '\u011C': 'G', - '\u1E20': 'G', - '\u011E': 'G', - '\u0120': 'G', - '\u01E6': 'G', - '\u0122': 'G', - '\u01E4': 'G', - '\u0193': 'G', - '\uA7A0': 'G', - '\uA77D': 'G', - '\uA77E': 'G', - '\u24BD': 'H', - '\uFF28': 'H', - '\u0124': 'H', - '\u1E22': 'H', - '\u1E26': 'H', - '\u021E': 'H', - '\u1E24': 'H', - '\u1E28': 'H', - '\u1E2A': 'H', - '\u0126': 'H', - '\u2C67': 'H', - '\u2C75': 'H', - '\uA78D': 'H', - '\u24BE': 'I', - '\uFF29': 'I', - '\u00CC': 'I', - '\u00CD': 'I', - '\u00CE': 'I', - '\u0128': 'I', - '\u012A': 'I', - '\u012C': 'I', - '\u0130': 'I', - '\u00CF': 'I', - '\u1E2E': 'I', - '\u1EC8': 'I', - '\u01CF': 'I', - '\u0208': 'I', - '\u020A': 'I', - '\u1ECA': 'I', - '\u012E': 'I', - '\u1E2C': 'I', - '\u0197': 'I', - '\u24BF': 'J', - '\uFF2A': 'J', - '\u0134': 'J', - '\u0248': 'J', - '\u24C0': 'K', - '\uFF2B': 'K', - '\u1E30': 'K', - '\u01E8': 'K', - '\u1E32': 'K', - '\u0136': 'K', - '\u1E34': 'K', - '\u0198': 'K', - '\u2C69': 'K', - '\uA740': 'K', - '\uA742': 'K', - '\uA744': 'K', - '\uA7A2': 'K', - '\u24C1': 'L', - '\uFF2C': 'L', - '\u013F': 'L', - '\u0139': 'L', - '\u013D': 'L', - '\u1E36': 'L', - '\u1E38': 'L', - '\u013B': 'L', - '\u1E3C': 'L', - '\u1E3A': 'L', - '\u0141': 'L', - '\u023D': 'L', - '\u2C62': 'L', - '\u2C60': 'L', - '\uA748': 'L', - '\uA746': 'L', - '\uA780': 'L', - '\u01C7': 'LJ', - '\u01C8': 'Lj', - '\u24C2': 'M', - '\uFF2D': 'M', - '\u1E3E': 'M', - '\u1E40': 'M', - '\u1E42': 'M', - '\u2C6E': 'M', - '\u019C': 'M', - '\u24C3': 'N', - '\uFF2E': 'N', - '\u01F8': 'N', - '\u0143': 'N', - '\u00D1': 'N', - '\u1E44': 'N', - '\u0147': 'N', - '\u1E46': 'N', - '\u0145': 'N', - '\u1E4A': 'N', - '\u1E48': 'N', - '\u0220': 'N', - '\u019D': 'N', - '\uA790': 'N', - '\uA7A4': 'N', - '\u01CA': 'NJ', - '\u01CB': 'Nj', - '\u24C4': 'O', - '\uFF2F': 'O', - '\u00D2': 'O', - '\u00D3': 'O', - '\u00D4': 'O', - '\u1ED2': 'O', - '\u1ED0': 'O', - '\u1ED6': 'O', - '\u1ED4': 'O', - '\u00D5': 'O', - '\u1E4C': 'O', - '\u022C': 'O', - '\u1E4E': 'O', - '\u014C': 'O', - '\u1E50': 'O', - '\u1E52': 'O', - '\u014E': 'O', - '\u022E': 'O', - '\u0230': 'O', - '\u00D6': 'O', - '\u022A': 'O', - '\u1ECE': 'O', - '\u0150': 'O', - '\u01D1': 'O', - '\u020C': 'O', - '\u020E': 'O', - '\u01A0': 'O', - '\u1EDC': 'O', - '\u1EDA': 'O', - '\u1EE0': 'O', - '\u1EDE': 'O', - '\u1EE2': 'O', - '\u1ECC': 'O', - '\u1ED8': 'O', - '\u01EA': 'O', - '\u01EC': 'O', - '\u00D8': 'O', - '\u01FE': 'O', - '\u0186': 'O', - '\u019F': 'O', - '\uA74A': 'O', - '\uA74C': 'O', - '\u01A2': 'OI', - '\uA74E': 'OO', - '\u0222': 'OU', - '\u24C5': 'P', - '\uFF30': 'P', - '\u1E54': 'P', - '\u1E56': 'P', - '\u01A4': 'P', - '\u2C63': 'P', - '\uA750': 'P', - '\uA752': 'P', - '\uA754': 'P', - '\u24C6': 'Q', - '\uFF31': 'Q', - '\uA756': 'Q', - '\uA758': 'Q', - '\u024A': 'Q', - '\u24C7': 'R', - '\uFF32': 'R', - '\u0154': 'R', - '\u1E58': 'R', - '\u0158': 'R', - '\u0210': 'R', - '\u0212': 'R', - '\u1E5A': 'R', - '\u1E5C': 'R', - '\u0156': 'R', - '\u1E5E': 'R', - '\u024C': 'R', - '\u2C64': 'R', - '\uA75A': 'R', - '\uA7A6': 'R', - '\uA782': 'R', - '\u24C8': 'S', - '\uFF33': 'S', - '\u1E9E': 'S', - '\u015A': 'S', - '\u1E64': 'S', - '\u015C': 'S', - '\u1E60': 'S', - '\u0160': 'S', - '\u1E66': 'S', - '\u1E62': 'S', - '\u1E68': 'S', - '\u0218': 'S', - '\u015E': 'S', - '\u2C7E': 'S', - '\uA7A8': 'S', - '\uA784': 'S', - '\u24C9': 'T', - '\uFF34': 'T', - '\u1E6A': 'T', - '\u0164': 'T', - '\u1E6C': 'T', - '\u021A': 'T', - '\u0162': 'T', - '\u1E70': 'T', - '\u1E6E': 'T', - '\u0166': 'T', - '\u01AC': 'T', - '\u01AE': 'T', - '\u023E': 'T', - '\uA786': 'T', - '\uA728': 'TZ', - '\u24CA': 'U', - '\uFF35': 'U', - '\u00D9': 'U', - '\u00DA': 'U', - '\u00DB': 'U', - '\u0168': 'U', - '\u1E78': 'U', - '\u016A': 'U', - '\u1E7A': 'U', - '\u016C': 'U', - '\u00DC': 'U', - '\u01DB': 'U', - '\u01D7': 'U', - '\u01D5': 'U', - '\u01D9': 'U', - '\u1EE6': 'U', - '\u016E': 'U', - '\u0170': 'U', - '\u01D3': 'U', - '\u0214': 'U', - '\u0216': 'U', - '\u01AF': 'U', - '\u1EEA': 'U', - '\u1EE8': 'U', - '\u1EEE': 'U', - '\u1EEC': 'U', - '\u1EF0': 'U', - '\u1EE4': 'U', - '\u1E72': 'U', - '\u0172': 'U', - '\u1E76': 'U', - '\u1E74': 'U', - '\u0244': 'U', - '\u24CB': 'V', - '\uFF36': 'V', - '\u1E7C': 'V', - '\u1E7E': 'V', - '\u01B2': 'V', - '\uA75E': 'V', - '\u0245': 'V', - '\uA760': 'VY', - '\u24CC': 'W', - '\uFF37': 'W', - '\u1E80': 'W', - '\u1E82': 'W', - '\u0174': 'W', - '\u1E86': 'W', - '\u1E84': 'W', - '\u1E88': 'W', - '\u2C72': 'W', - '\u24CD': 'X', - '\uFF38': 'X', - '\u1E8A': 'X', - '\u1E8C': 'X', - '\u24CE': 'Y', - '\uFF39': 'Y', - '\u1EF2': 'Y', - '\u00DD': 'Y', - '\u0176': 'Y', - '\u1EF8': 'Y', - '\u0232': 'Y', - '\u1E8E': 'Y', - '\u0178': 'Y', - '\u1EF6': 'Y', - '\u1EF4': 'Y', - '\u01B3': 'Y', - '\u024E': 'Y', - '\u1EFE': 'Y', - '\u24CF': 'Z', - '\uFF3A': 'Z', - '\u0179': 'Z', - '\u1E90': 'Z', - '\u017B': 'Z', - '\u017D': 'Z', - '\u1E92': 'Z', - '\u1E94': 'Z', - '\u01B5': 'Z', - '\u0224': 'Z', - '\u2C7F': 'Z', - '\u2C6B': 'Z', - '\uA762': 'Z', - '\u24D0': 'a', - '\uFF41': 'a', - '\u1E9A': 'a', - '\u00E0': 'a', - '\u00E1': 'a', - '\u00E2': 'a', - '\u1EA7': 'a', - '\u1EA5': 'a', - '\u1EAB': 'a', - '\u1EA9': 'a', - '\u00E3': 'a', - '\u0101': 'a', - '\u0103': 'a', - '\u1EB1': 'a', - '\u1EAF': 'a', - '\u1EB5': 'a', - '\u1EB3': 'a', - '\u0227': 'a', - '\u01E1': 'a', - '\u00E4': 'a', - '\u01DF': 'a', - '\u1EA3': 'a', - '\u00E5': 'a', - '\u01FB': 'a', - '\u01CE': 'a', - '\u0201': 'a', - '\u0203': 'a', - '\u1EA1': 'a', - '\u1EAD': 'a', - '\u1EB7': 'a', - '\u1E01': 'a', - '\u0105': 'a', - '\u2C65': 'a', - '\u0250': 'a', - '\uA733': 'aa', - '\u00E6': 'ae', - '\u01FD': 'ae', - '\u01E3': 'ae', - '\uA735': 'ao', - '\uA737': 'au', - '\uA739': 'av', - '\uA73B': 'av', - '\uA73D': 'ay', - '\u24D1': 'b', - '\uFF42': 'b', - '\u1E03': 'b', - '\u1E05': 'b', - '\u1E07': 'b', - '\u0180': 'b', - '\u0183': 'b', - '\u0253': 'b', - '\u24D2': 'c', - '\uFF43': 'c', - '\u0107': 'c', - '\u0109': 'c', - '\u010B': 'c', - '\u010D': 'c', - '\u00E7': 'c', - '\u1E09': 'c', - '\u0188': 'c', - '\u023C': 'c', - '\uA73F': 'c', - '\u2184': 'c', - '\u24D3': 'd', - '\uFF44': 'd', - '\u1E0B': 'd', - '\u010F': 'd', - '\u1E0D': 'd', - '\u1E11': 'd', - '\u1E13': 'd', - '\u1E0F': 'd', - '\u0111': 'd', - '\u018C': 'd', - '\u0256': 'd', - '\u0257': 'd', - '\uA77A': 'd', - '\u01F3': 'dz', - '\u01C6': 'dz', - '\u24D4': 'e', - '\uFF45': 'e', - '\u00E8': 'e', - '\u00E9': 'e', - '\u00EA': 'e', - '\u1EC1': 'e', - '\u1EBF': 'e', - '\u1EC5': 'e', - '\u1EC3': 'e', - '\u1EBD': 'e', - '\u0113': 'e', - '\u1E15': 'e', - '\u1E17': 'e', - '\u0115': 'e', - '\u0117': 'e', - '\u00EB': 'e', - '\u1EBB': 'e', - '\u011B': 'e', - '\u0205': 'e', - '\u0207': 'e', - '\u1EB9': 'e', - '\u1EC7': 'e', - '\u0229': 'e', - '\u1E1D': 'e', - '\u0119': 'e', - '\u1E19': 'e', - '\u1E1B': 'e', - '\u0247': 'e', - '\u025B': 'e', - '\u01DD': 'e', - '\u24D5': 'f', - '\uFF46': 'f', - '\u1E1F': 'f', - '\u0192': 'f', - '\uA77C': 'f', - '\u24D6': 'g', - '\uFF47': 'g', - '\u01F5': 'g', - '\u011D': 'g', - '\u1E21': 'g', - '\u011F': 'g', - '\u0121': 'g', - '\u01E7': 'g', - '\u0123': 'g', - '\u01E5': 'g', - '\u0260': 'g', - '\uA7A1': 'g', - '\u1D79': 'g', - '\uA77F': 'g', - '\u24D7': 'h', - '\uFF48': 'h', - '\u0125': 'h', - '\u1E23': 'h', - '\u1E27': 'h', - '\u021F': 'h', - '\u1E25': 'h', - '\u1E29': 'h', - '\u1E2B': 'h', - '\u1E96': 'h', - '\u0127': 'h', - '\u2C68': 'h', - '\u2C76': 'h', - '\u0265': 'h', - '\u0195': 'hv', - '\u24D8': 'i', - '\uFF49': 'i', - '\u00EC': 'i', - '\u00ED': 'i', - '\u00EE': 'i', - '\u0129': 'i', - '\u012B': 'i', - '\u012D': 'i', - '\u00EF': 'i', - '\u1E2F': 'i', - '\u1EC9': 'i', - '\u01D0': 'i', - '\u0209': 'i', - '\u020B': 'i', - '\u1ECB': 'i', - '\u012F': 'i', - '\u1E2D': 'i', - '\u0268': 'i', - '\u0131': 'i', - '\u24D9': 'j', - '\uFF4A': 'j', - '\u0135': 'j', - '\u01F0': 'j', - '\u0249': 'j', - '\u24DA': 'k', - '\uFF4B': 'k', - '\u1E31': 'k', - '\u01E9': 'k', - '\u1E33': 'k', - '\u0137': 'k', - '\u1E35': 'k', - '\u0199': 'k', - '\u2C6A': 'k', - '\uA741': 'k', - '\uA743': 'k', - '\uA745': 'k', - '\uA7A3': 'k', - '\u24DB': 'l', - '\uFF4C': 'l', - '\u0140': 'l', - '\u013A': 'l', - '\u013E': 'l', - '\u1E37': 'l', - '\u1E39': 'l', - '\u013C': 'l', - '\u1E3D': 'l', - '\u1E3B': 'l', - '\u017F': 'l', - '\u0142': 'l', - '\u019A': 'l', - '\u026B': 'l', - '\u2C61': 'l', - '\uA749': 'l', - '\uA781': 'l', - '\uA747': 'l', - '\u01C9': 'lj', - '\u24DC': 'm', - '\uFF4D': 'm', - '\u1E3F': 'm', - '\u1E41': 'm', - '\u1E43': 'm', - '\u0271': 'm', - '\u026F': 'm', - '\u24DD': 'n', - '\uFF4E': 'n', - '\u01F9': 'n', - '\u0144': 'n', - '\u00F1': 'n', - '\u1E45': 'n', - '\u0148': 'n', - '\u1E47': 'n', - '\u0146': 'n', - '\u1E4B': 'n', - '\u1E49': 'n', - '\u019E': 'n', - '\u0272': 'n', - '\u0149': 'n', - '\uA791': 'n', - '\uA7A5': 'n', - '\u01CC': 'nj', - '\u24DE': 'o', - '\uFF4F': 'o', - '\u00F2': 'o', - '\u00F3': 'o', - '\u00F4': 'o', - '\u1ED3': 'o', - '\u1ED1': 'o', - '\u1ED7': 'o', - '\u1ED5': 'o', - '\u00F5': 'o', - '\u1E4D': 'o', - '\u022D': 'o', - '\u1E4F': 'o', - '\u014D': 'o', - '\u1E51': 'o', - '\u1E53': 'o', - '\u014F': 'o', - '\u022F': 'o', - '\u0231': 'o', - '\u00F6': 'o', - '\u022B': 'o', - '\u1ECF': 'o', - '\u0151': 'o', - '\u01D2': 'o', - '\u020D': 'o', - '\u020F': 'o', - '\u01A1': 'o', - '\u1EDD': 'o', - '\u1EDB': 'o', - '\u1EE1': 'o', - '\u1EDF': 'o', - '\u1EE3': 'o', - '\u1ECD': 'o', - '\u1ED9': 'o', - '\u01EB': 'o', - '\u01ED': 'o', - '\u00F8': 'o', - '\u01FF': 'o', - '\u0254': 'o', - '\uA74B': 'o', - '\uA74D': 'o', - '\u0275': 'o', - '\u01A3': 'oi', - '\u0223': 'ou', - '\uA74F': 'oo', - '\u24DF': 'p', - '\uFF50': 'p', - '\u1E55': 'p', - '\u1E57': 'p', - '\u01A5': 'p', - '\u1D7D': 'p', - '\uA751': 'p', - '\uA753': 'p', - '\uA755': 'p', - '\u24E0': 'q', - '\uFF51': 'q', - '\u024B': 'q', - '\uA757': 'q', - '\uA759': 'q', - '\u24E1': 'r', - '\uFF52': 'r', - '\u0155': 'r', - '\u1E59': 'r', - '\u0159': 'r', - '\u0211': 'r', - '\u0213': 'r', - '\u1E5B': 'r', - '\u1E5D': 'r', - '\u0157': 'r', - '\u1E5F': 'r', - '\u024D': 'r', - '\u027D': 'r', - '\uA75B': 'r', - '\uA7A7': 'r', - '\uA783': 'r', - '\u24E2': 's', - '\uFF53': 's', - '\u00DF': 's', - '\u015B': 's', - '\u1E65': 's', - '\u015D': 's', - '\u1E61': 's', - '\u0161': 's', - '\u1E67': 's', - '\u1E63': 's', - '\u1E69': 's', - '\u0219': 's', - '\u015F': 's', - '\u023F': 's', - '\uA7A9': 's', - '\uA785': 's', - '\u1E9B': 's', - '\u24E3': 't', - '\uFF54': 't', - '\u1E6B': 't', - '\u1E97': 't', - '\u0165': 't', - '\u1E6D': 't', - '\u021B': 't', - '\u0163': 't', - '\u1E71': 't', - '\u1E6F': 't', - '\u0167': 't', - '\u01AD': 't', - '\u0288': 't', - '\u2C66': 't', - '\uA787': 't', - '\uA729': 'tz', - '\u24E4': 'u', - '\uFF55': 'u', - '\u00F9': 'u', - '\u00FA': 'u', - '\u00FB': 'u', - '\u0169': 'u', - '\u1E79': 'u', - '\u016B': 'u', - '\u1E7B': 'u', - '\u016D': 'u', - '\u00FC': 'u', - '\u01DC': 'u', - '\u01D8': 'u', - '\u01D6': 'u', - '\u01DA': 'u', - '\u1EE7': 'u', - '\u016F': 'u', - '\u0171': 'u', - '\u01D4': 'u', - '\u0215': 'u', - '\u0217': 'u', - '\u01B0': 'u', - '\u1EEB': 'u', - '\u1EE9': 'u', - '\u1EEF': 'u', - '\u1EED': 'u', - '\u1EF1': 'u', - '\u1EE5': 'u', - '\u1E73': 'u', - '\u0173': 'u', - '\u1E77': 'u', - '\u1E75': 'u', - '\u0289': 'u', - '\u24E5': 'v', - '\uFF56': 'v', - '\u1E7D': 'v', - '\u1E7F': 'v', - '\u028B': 'v', - '\uA75F': 'v', - '\u028C': 'v', - '\uA761': 'vy', - '\u24E6': 'w', - '\uFF57': 'w', - '\u1E81': 'w', - '\u1E83': 'w', - '\u0175': 'w', - '\u1E87': 'w', - '\u1E85': 'w', - '\u1E98': 'w', - '\u1E89': 'w', - '\u2C73': 'w', - '\u24E7': 'x', - '\uFF58': 'x', - '\u1E8B': 'x', - '\u1E8D': 'x', - '\u24E8': 'y', - '\uFF59': 'y', - '\u1EF3': 'y', - '\u00FD': 'y', - '\u0177': 'y', - '\u1EF9': 'y', - '\u0233': 'y', - '\u1E8F': 'y', - '\u00FF': 'y', - '\u1EF7': 'y', - '\u1E99': 'y', - '\u1EF5': 'y', - '\u01B4': 'y', - '\u024F': 'y', - '\u1EFF': 'y', - '\u24E9': 'z', - '\uFF5A': 'z', - '\u017A': 'z', - '\u1E91': 'z', - '\u017C': 'z', - '\u017E': 'z', - '\u1E93': 'z', - '\u1E95': 'z', - '\u01B6': 'z', - '\u0225': 'z', - '\u0240': 'z', - '\u2C6C': 'z', - '\uA763': 'z', - '\u0386': '\u0391', - '\u0388': '\u0395', - '\u0389': '\u0397', - '\u038A': '\u0399', - '\u03AA': '\u0399', - '\u038C': '\u039F', - '\u038E': '\u03A5', - '\u03AB': '\u03A5', - '\u038F': '\u03A9', - '\u03AC': '\u03B1', - '\u03AD': '\u03B5', - '\u03AE': '\u03B7', - '\u03AF': '\u03B9', - '\u03CA': '\u03B9', - '\u0390': '\u03B9', - '\u03CC': '\u03BF', - '\u03CD': '\u03C5', - '\u03CB': '\u03C5', - '\u03B0': '\u03C5', - '\u03C9': '\u03C9', - '\u03C2': '\u03C3' - }; - - return diacritics; -}); - -S2.define('select2/data/base',[ - '../utils' -], function (Utils) { - function BaseAdapter ($element, options) { - BaseAdapter.__super__.constructor.call(this); - } - - Utils.Extend(BaseAdapter, Utils.Observable); - - BaseAdapter.prototype.current = function (callback) { - throw new Error('The `current` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.query = function (params, callback) { - throw new Error('The `query` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.bind = function (container, $container) { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.destroy = function () { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.generateResultId = function (container, data) { - var id = container.id + '-result-'; - - id += Utils.generateChars(4); - - if (data.id != null) { - id += '-' + data.id.toString(); - } else { - id += '-' + Utils.generateChars(4); - } - return id; - }; - - return BaseAdapter; -}); - -S2.define('select2/data/select',[ - './base', - '../utils', - 'jquery' -], function (BaseAdapter, Utils, $) { - function SelectAdapter ($element, options) { - this.$element = $element; - this.options = options; - - SelectAdapter.__super__.constructor.call(this); - } - - Utils.Extend(SelectAdapter, BaseAdapter); - - SelectAdapter.prototype.current = function (callback) { - var data = []; - var self = this; - - this.$element.find(':selected').each(function () { - var $option = $(this); - - var option = self.item($option); - - data.push(option); - }); - - callback(data); - }; - - SelectAdapter.prototype.select = function (data) { - var self = this; - - data.selected = true; - - // If data.element is a DOM node, use it instead - if ($(data.element).is('option')) { - data.element.selected = true; - - this.$element.trigger('change'); - - return; - } - - if (this.$element.prop('multiple')) { - this.current(function (currentData) { - var val = []; - - data = [data]; - data.push.apply(data, currentData); - - for (var d = 0; d < data.length; d++) { - var id = data[d].id; - - if ($.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - self.$element.trigger('change'); - }); - } else { - var val = data.id; - - this.$element.val(val); - this.$element.trigger('change'); - } - }; - - SelectAdapter.prototype.unselect = function (data) { - var self = this; - - if (!this.$element.prop('multiple')) { - return; - } - - data.selected = false; - - if ($(data.element).is('option')) { - data.element.selected = false; - - this.$element.trigger('change'); - - return; - } - - this.current(function (currentData) { - var val = []; - - for (var d = 0; d < currentData.length; d++) { - var id = currentData[d].id; - - if (id !== data.id && $.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - - self.$element.trigger('change'); - }); - }; - - SelectAdapter.prototype.bind = function (container, $container) { - var self = this; - - this.container = container; - - container.on('select', function (params) { - self.select(params.data); - }); - - container.on('unselect', function (params) { - self.unselect(params.data); - }); - }; - - SelectAdapter.prototype.destroy = function () { - // Remove anything added to child elements - this.$element.find('*').each(function () { - // Remove any custom data set by Select2 - $.removeData(this, 'data'); - }); - }; - - SelectAdapter.prototype.query = function (params, callback) { - var data = []; - var self = this; - - var $options = this.$element.children(); - - $options.each(function () { - var $option = $(this); - - if (!$option.is('option') && !$option.is('optgroup')) { - return; - } - - var option = self.item($option); - - var matches = self.matches(params, option); - - if (matches !== null) { - data.push(matches); - } - }); - - callback({ - results: data - }); - }; - - SelectAdapter.prototype.addOptions = function ($options) { - Utils.appendMany(this.$element, $options); - }; - - SelectAdapter.prototype.option = function (data) { - var option; - - if (data.children) { - option = document.createElement('optgroup'); - option.label = data.text; - } else { - option = document.createElement('option'); - - if (option.textContent !== undefined) { - option.textContent = data.text; - } else { - option.innerText = data.text; - } - } - - if (data.id) { - option.value = data.id; - } - - if (data.disabled) { - option.disabled = true; - } - - if (data.selected) { - option.selected = true; - } - - if (data.title) { - option.title = data.title; - } - - var $option = $(option); - - var normalizedData = this._normalizeItem(data); - normalizedData.element = option; - - // Override the option's data with the combined data - $.data(option, 'data', normalizedData); - - return $option; - }; - - SelectAdapter.prototype.item = function ($option) { - var data = {}; - - data = $.data($option[0], 'data'); - - if (data != null) { - return data; - } - - if ($option.is('option')) { - data = { - id: $option.val(), - text: $option.text(), - disabled: $option.prop('disabled'), - selected: $option.prop('selected'), - title: $option.prop('title') - }; - } else if ($option.is('optgroup')) { - data = { - text: $option.prop('label'), - children: [], - title: $option.prop('title') - }; - - var $children = $option.children('option'); - var children = []; - - for (var c = 0; c < $children.length; c++) { - var $child = $($children[c]); - - var child = this.item($child); - - children.push(child); - } - - data.children = children; - } - - data = this._normalizeItem(data); - data.element = $option[0]; - - $.data($option[0], 'data', data); - - return data; - }; - - SelectAdapter.prototype._normalizeItem = function (item) { - if (!$.isPlainObject(item)) { - item = { - id: item, - text: item - }; - } - - item = $.extend({}, { - text: '' - }, item); - - var defaults = { - selected: false, - disabled: false - }; - - if (item.id != null) { - item.id = item.id.toString(); - } - - if (item.text != null) { - item.text = item.text.toString(); - } - - if (item._resultId == null && item.id && this.container != null) { - item._resultId = this.generateResultId(this.container, item); - } - - return $.extend({}, defaults, item); - }; - - SelectAdapter.prototype.matches = function (params, data) { - var matcher = this.options.get('matcher'); - - return matcher(params, data); - }; - - return SelectAdapter; -}); - -S2.define('select2/data/array',[ - './select', - '../utils', - 'jquery' -], function (SelectAdapter, Utils, $) { - function ArrayAdapter ($element, options) { - var data = options.get('data') || []; - - ArrayAdapter.__super__.constructor.call(this, $element, options); - - this.addOptions(this.convertToOptions(data)); - } - - Utils.Extend(ArrayAdapter, SelectAdapter); - - ArrayAdapter.prototype.select = function (data) { - var $option = this.$element.find('option').filter(function (i, elm) { - return elm.value == data.id.toString(); - }); - - if ($option.length === 0) { - $option = this.option(data); - - this.addOptions($option); - } - - ArrayAdapter.__super__.select.call(this, data); - }; - - ArrayAdapter.prototype.convertToOptions = function (data) { - var self = this; - - var $existing = this.$element.find('option'); - var existingIds = $existing.map(function () { - return self.item($(this)).id; - }).get(); - - var $options = []; - - // Filter out all items except for the one passed in the argument - function onlyItem (item) { - return function () { - return $(this).val() == item.id; - }; - } - - for (var d = 0; d < data.length; d++) { - var item = this._normalizeItem(data[d]); - - // Skip items which were pre-loaded, only merge the data - if ($.inArray(item.id, existingIds) >= 0) { - var $existingOption = $existing.filter(onlyItem(item)); - - var existingData = this.item($existingOption); - var newData = $.extend(true, {}, item, existingData); - - var $newOption = this.option(newData); - - $existingOption.replaceWith($newOption); - - continue; - } - - var $option = this.option(item); - - if (item.children) { - var $children = this.convertToOptions(item.children); - - Utils.appendMany($option, $children); - } - - $options.push($option); - } - - return $options; - }; - - return ArrayAdapter; -}); - -S2.define('select2/data/ajax',[ - './array', - '../utils', - 'jquery' -], function (ArrayAdapter, Utils, $) { - function AjaxAdapter ($element, options) { - this.ajaxOptions = this._applyDefaults(options.get('ajax')); - - if (this.ajaxOptions.processResults != null) { - this.processResults = this.ajaxOptions.processResults; - } - - AjaxAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(AjaxAdapter, ArrayAdapter); - - AjaxAdapter.prototype._applyDefaults = function (options) { - var defaults = { - data: function (params) { - return $.extend({}, params, { - q: params.term - }); - }, - transport: function (params, success, failure) { - var $request = $.ajax(params); - - $request.then(success); - $request.fail(failure); - - return $request; - } - }; - - return $.extend({}, defaults, options, true); - }; - - AjaxAdapter.prototype.processResults = function (results) { - return results; - }; - - AjaxAdapter.prototype.query = function (params, callback) { - var matches = []; - var self = this; - - if (this._request != null) { - // JSONP requests cannot always be aborted - if ($.isFunction(this._request.abort)) { - this._request.abort(); - } - - this._request = null; - } - - var options = $.extend({ - type: 'GET' - }, this.ajaxOptions); - - if (typeof options.url === 'function') { - options.url = options.url.call(this.$element, params); - } - - if (typeof options.data === 'function') { - options.data = options.data.call(this.$element, params); - } - - function request () { - var $request = options.transport(options, function (data) { - var results = self.processResults(data, params); - - if (self.options.get('debug') && window.console && console.error) { - // Check to make sure that the response included a `results` key. - if (!results || !results.results || !$.isArray(results.results)) { - console.error( - 'Select2: The AJAX results did not return an array in the ' + - '`results` key of the response.' - ); - } - } - - callback(results); - }, function () { - // Attempt to detect if a request was aborted - // Only works if the transport exposes a status property - if ($request.status && $request.status === '0') { - return; - } - - self.trigger('results:message', { - message: 'errorLoading' - }); - }); - - self._request = $request; - } - - if (this.ajaxOptions.delay && params.term != null) { - if (this._queryTimeout) { - window.clearTimeout(this._queryTimeout); - } - - this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); - } else { - request(); - } - }; - - return AjaxAdapter; -}); - -S2.define('select2/data/tags',[ - 'jquery' -], function ($) { - function Tags (decorated, $element, options) { - var tags = options.get('tags'); - - var createTag = options.get('createTag'); - - if (createTag !== undefined) { - this.createTag = createTag; - } - - var insertTag = options.get('insertTag'); - - if (insertTag !== undefined) { - this.insertTag = insertTag; - } - - decorated.call(this, $element, options); - - if ($.isArray(tags)) { - for (var t = 0; t < tags.length; t++) { - var tag = tags[t]; - var item = this._normalizeItem(tag); - - var $option = this.option(item); - - this.$element.append($option); - } - } - } - - Tags.prototype.query = function (decorated, params, callback) { - var self = this; - - this._removeOldTags(); - - if (params.term == null || params.page != null) { - decorated.call(this, params, callback); - return; - } - - function wrapper (obj, child) { - var data = obj.results; - - for (var i = 0; i < data.length; i++) { - var option = data[i]; - - var checkChildren = ( - option.children != null && - !wrapper({ - results: option.children - }, true) - ); - - var checkText = option.text === params.term; - - if (checkText || checkChildren) { - if (child) { - return false; - } - - obj.data = data; - callback(obj); - - return; - } - } - - if (child) { - return true; - } - - var tag = self.createTag(params); - - if (tag != null) { - var $option = self.option(tag); - $option.attr('data-select2-tag', true); - - self.addOptions([$option]); - - self.insertTag(data, tag); - } - - obj.results = data; - - callback(obj); - } - - decorated.call(this, params, wrapper); - }; - - Tags.prototype.createTag = function (decorated, params) { - var term = $.trim(params.term); - - if (term === '') { - return null; - } - - return { - id: term, - text: term - }; - }; - - Tags.prototype.insertTag = function (_, data, tag) { - data.unshift(tag); - }; - - Tags.prototype._removeOldTags = function (_) { - var tag = this._lastTag; - - var $options = this.$element.find('option[data-select2-tag]'); - - $options.each(function () { - if (this.selected) { - return; - } - - $(this).remove(); - }); - }; - - return Tags; -}); - -S2.define('select2/data/tokenizer',[ - 'jquery' -], function ($) { - function Tokenizer (decorated, $element, options) { - var tokenizer = options.get('tokenizer'); - - if (tokenizer !== undefined) { - this.tokenizer = tokenizer; - } - - decorated.call(this, $element, options); - } - - Tokenizer.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - this.$search = container.dropdown.$search || container.selection.$search || - $container.find('.select2-search__field'); - }; - - Tokenizer.prototype.query = function (decorated, params, callback) { - var self = this; - - function createAndSelect (data) { - // Normalize the data object so we can use it for checks - var item = self._normalizeItem(data); - - // Check if the data object already exists as a tag - // Select it if it doesn't - var $existingOptions = self.$element.find('option').filter(function () { - return $(this).val() === item.id; - }); - - // If an existing option wasn't found for it, create the option - if (!$existingOptions.length) { - var $option = self.option(item); - $option.attr('data-select2-tag', true); - - self._removeOldTags(); - self.addOptions([$option]); - } - - // Select the item, now that we know there is an option for it - select(item); - } - - function select (data) { - self.trigger('select', { - data: data - }); - } - - params.term = params.term || ''; - - var tokenData = this.tokenizer(params, this.options, createAndSelect); - - if (tokenData.term !== params.term) { - // Replace the search term if we have the search box - if (this.$search.length) { - this.$search.val(tokenData.term); - this.$search.focus(); - } - - params.term = tokenData.term; - } - - decorated.call(this, params, callback); - }; - - Tokenizer.prototype.tokenizer = function (_, params, options, callback) { - var separators = options.get('tokenSeparators') || []; - var term = params.term; - var i = 0; - - var createTag = this.createTag || function (params) { - return { - id: params.term, - text: params.term - }; - }; - - while (i < term.length) { - var termChar = term[i]; - - if ($.inArray(termChar, separators) === -1) { - i++; - - continue; - } - - var part = term.substr(0, i); - var partParams = $.extend({}, params, { - term: part - }); - - var data = createTag(partParams); - - if (data == null) { - i++; - continue; - } - - callback(data); - - // Reset the term to not include the tokenized portion - term = term.substr(i + 1) || ''; - i = 0; - } - - return { - term: term - }; - }; - - return Tokenizer; -}); - -S2.define('select2/data/minimumInputLength',[ - -], function () { - function MinimumInputLength (decorated, $e, options) { - this.minimumInputLength = options.get('minimumInputLength'); - - decorated.call(this, $e, options); - } - - MinimumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (params.term.length < this.minimumInputLength) { - this.trigger('results:message', { - message: 'inputTooShort', - args: { - minimum: this.minimumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MinimumInputLength; -}); - -S2.define('select2/data/maximumInputLength',[ - -], function () { - function MaximumInputLength (decorated, $e, options) { - this.maximumInputLength = options.get('maximumInputLength'); - - decorated.call(this, $e, options); - } - - MaximumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (this.maximumInputLength > 0 && - params.term.length > this.maximumInputLength) { - this.trigger('results:message', { - message: 'inputTooLong', - args: { - maximum: this.maximumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MaximumInputLength; -}); - -S2.define('select2/data/maximumSelectionLength',[ - -], function (){ - function MaximumSelectionLength (decorated, $e, options) { - this.maximumSelectionLength = options.get('maximumSelectionLength'); - - decorated.call(this, $e, options); - } - - MaximumSelectionLength.prototype.query = - function (decorated, params, callback) { - var self = this; - - this.current(function (currentData) { - var count = currentData != null ? currentData.length : 0; - if (self.maximumSelectionLength > 0 && - count >= self.maximumSelectionLength) { - self.trigger('results:message', { - message: 'maximumSelected', - args: { - maximum: self.maximumSelectionLength - } - }); - return; - } - decorated.call(self, params, callback); - }); - }; - - return MaximumSelectionLength; -}); - -S2.define('select2/dropdown',[ - 'jquery', - './utils' -], function ($, Utils) { - function Dropdown ($element, options) { - this.$element = $element; - this.options = options; - - Dropdown.__super__.constructor.call(this); - } - - Utils.Extend(Dropdown, Utils.Observable); - - Dropdown.prototype.render = function () { - var $dropdown = $( - '<span class="select2-dropdown">' + - '<span class="select2-results"></span>' + - '</span>' - ); - - $dropdown.attr('dir', this.options.get('dir')); - - this.$dropdown = $dropdown; - - return $dropdown; - }; - - Dropdown.prototype.bind = function () { - // Should be implemented in subclasses - }; - - Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implmented in subclasses - }; - - Dropdown.prototype.destroy = function () { - // Remove the dropdown from the DOM - this.$dropdown.remove(); - }; - - return Dropdown; -}); - -S2.define('select2/dropdown/search',[ - 'jquery', - '../utils' -], function ($, Utils) { - function Search () { } - - Search.prototype.render = function (decorated) { - var $rendered = decorated.call(this); - - var $search = $( - '<span class="select2-search select2-search--dropdown">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="off"' + - ' spellcheck="false" role="textbox" />' + - '</span>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - $rendered.prepend($search); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - this.$search.on('keydown', function (evt) { - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - }); - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$search.on('input', function (evt) { - // Unbind the duplicated `keyup` event - $(this).off('keyup'); - }); - - this.$search.on('keyup input', function (evt) { - self.handleSearch(evt); - }); - - container.on('open', function () { - self.$search.attr('tabindex', 0); - - self.$search.focus(); - - window.setTimeout(function () { - self.$search.focus(); - }, 0); - }); - - container.on('close', function () { - self.$search.attr('tabindex', -1); - - self.$search.val(''); - }); - - container.on('focus', function () { - if (container.isOpen()) { - self.$search.focus(); - } - }); - - container.on('results:all', function (params) { - if (params.query.term == null || params.query.term === '') { - var showSearch = self.showSearch(params); - - if (showSearch) { - self.$searchContainer.removeClass('select2-search--hide'); - } else { - self.$searchContainer.addClass('select2-search--hide'); - } - } - }); - }; - - Search.prototype.handleSearch = function (evt) { - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.showSearch = function (_, params) { - return true; - }; - - return Search; -}); - -S2.define('select2/dropdown/hidePlaceholder',[ - -], function () { - function HidePlaceholder (decorated, $element, options, dataAdapter) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options, dataAdapter); - } - - HidePlaceholder.prototype.append = function (decorated, data) { - data.results = this.removePlaceholder(data.results); - - decorated.call(this, data); - }; - - HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - HidePlaceholder.prototype.removePlaceholder = function (_, data) { - var modifiedData = data.slice(0); - - for (var d = data.length - 1; d >= 0; d--) { - var item = data[d]; - - if (this.placeholder.id === item.id) { - modifiedData.splice(d, 1); - } - } - - return modifiedData; - }; - - return HidePlaceholder; -}); - -S2.define('select2/dropdown/infiniteScroll',[ - 'jquery' -], function ($) { - function InfiniteScroll (decorated, $element, options, dataAdapter) { - this.lastParams = {}; - - decorated.call(this, $element, options, dataAdapter); - - this.$loadingMore = this.createLoadingMore(); - this.loading = false; - } - - InfiniteScroll.prototype.append = function (decorated, data) { - this.$loadingMore.remove(); - this.loading = false; - - decorated.call(this, data); - - if (this.showLoadingMore(data)) { - this.$results.append(this.$loadingMore); - } - }; - - InfiniteScroll.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('query', function (params) { - self.lastParams = params; - self.loading = true; - }); - - container.on('query:append', function (params) { - self.lastParams = params; - self.loading = true; - }); - - this.$results.on('scroll', function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - self.$loadingMore[0] - ); - - if (self.loading || !isLoadMoreVisible) { - return; - } - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var loadingMoreOffset = self.$loadingMore.offset().top + - self.$loadingMore.outerHeight(false); - - if (currentOffset + 50 >= loadingMoreOffset) { - self.loadMore(); - } - }); - }; - - InfiniteScroll.prototype.loadMore = function () { - this.loading = true; - - var params = $.extend({}, {page: 1}, this.lastParams); - - params.page++; - - this.trigger('query:append', params); - }; - - InfiniteScroll.prototype.showLoadingMore = function (_, data) { - return data.pagination && data.pagination.more; - }; - - InfiniteScroll.prototype.createLoadingMore = function () { - var $option = $( - '<li ' + - 'class="select2-results__option select2-results__option--load-more"' + - 'role="treeitem" aria-disabled="true"></li>' - ); - - var message = this.options.get('translations').get('loadingMore'); - - $option.html(message(this.lastParams)); - - return $option; - }; - - return InfiniteScroll; -}); - -S2.define('select2/dropdown/attachBody',[ - 'jquery', - '../utils' -], function ($, Utils) { - function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || $(document.body); - - decorated.call(this, $element, options); - } - - AttachBody.prototype.bind = function (decorated, container, $container) { - var self = this; - - var setupResultsEvents = false; - - decorated.call(this, container, $container); - - container.on('open', function () { - self._showDropdown(); - self._attachPositioningHandler(container); - - if (!setupResultsEvents) { - setupResultsEvents = true; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - } - }); - - container.on('close', function () { - self._hideDropdown(); - self._detachPositioningHandler(container); - }); - - this.$dropdownContainer.on('mousedown', function (evt) { - evt.stopPropagation(); - }); - }; - - AttachBody.prototype.destroy = function (decorated) { - decorated.call(this); - - this.$dropdownContainer.remove(); - }; - - AttachBody.prototype.position = function (decorated, $dropdown, $container) { - // Clone all of the container classes - $dropdown.attr('class', $container.attr('class')); - - $dropdown.removeClass('select2'); - $dropdown.addClass('select2-container--open'); - - $dropdown.css({ - position: 'absolute', - top: -999999 - }); - - this.$container = $container; - }; - - AttachBody.prototype.render = function (decorated) { - var $container = $('<span></span>'); - - var $dropdown = decorated.call(this); - $container.append($dropdown); - - this.$dropdownContainer = $container; - - return $container; - }; - - AttachBody.prototype._hideDropdown = function (decorated) { - this.$dropdownContainer.detach(); - }; - - AttachBody.prototype._attachPositioningHandler = - function (decorated, container) { - var self = this; - - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.each(function () { - $(this).data('select2-scroll-position', { - x: $(this).scrollLeft(), - y: $(this).scrollTop() - }); - }); - - $watchers.on(scrollEvent, function (ev) { - var position = $(this).data('select2-scroll-position'); - $(this).scrollTop(position.y); - }); - - $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, - function (e) { - self._positionDropdown(); - self._resizeDropdown(); - }); - }; - - AttachBody.prototype._detachPositioningHandler = - function (decorated, container) { - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.off(scrollEvent); - - $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); - }; - - AttachBody.prototype._positionDropdown = function () { - var $window = $(window); - - var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); - var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); - - var newDirection = null; - - var offset = this.$container.offset(); - - offset.bottom = offset.top + this.$container.outerHeight(false); - - var container = { - height: this.$container.outerHeight(false) - }; - - container.top = offset.top; - container.bottom = offset.top + container.height; - - var dropdown = { - height: this.$dropdown.outerHeight(false) - }; - - var viewport = { - top: $window.scrollTop(), - bottom: $window.scrollTop() + $window.height() - }; - - var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); - var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); - - var css = { - left: offset.left, - top: container.bottom - }; - - // Determine what the parent element is to use for calciulating the offset - var $offsetParent = this.$dropdownParent; - - // For statically positoned elements, we need to get the element - // that is determining the offset - if ($offsetParent.css('position') === 'static') { - $offsetParent = $offsetParent.offsetParent(); - } - - var parentOffset = $offsetParent.offset(); - - css.top -= parentOffset.top; - css.left -= parentOffset.left; - - if (!isCurrentlyAbove && !isCurrentlyBelow) { - newDirection = 'below'; - } - - if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { - newDirection = 'above'; - } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { - newDirection = 'below'; - } - - if (newDirection == 'above' || - (isCurrentlyAbove && newDirection !== 'below')) { - css.top = container.top - parentOffset.top - dropdown.height; - } - - if (newDirection != null) { - this.$dropdown - .removeClass('select2-dropdown--below select2-dropdown--above') - .addClass('select2-dropdown--' + newDirection); - this.$container - .removeClass('select2-container--below select2-container--above') - .addClass('select2-container--' + newDirection); - } - - this.$dropdownContainer.css(css); - }; - - AttachBody.prototype._resizeDropdown = function () { - var css = { - width: this.$container.outerWidth(false) + 'px' - }; - - if (this.options.get('dropdownAutoWidth')) { - css.minWidth = css.width; - css.position = 'relative'; - css.width = 'auto'; - } - - this.$dropdown.css(css); - }; - - AttachBody.prototype._showDropdown = function (decorated) { - this.$dropdownContainer.appendTo(this.$dropdownParent); - - this._positionDropdown(); - this._resizeDropdown(); - }; - - return AttachBody; -}); - -S2.define('select2/dropdown/minimumResultsForSearch',[ - -], function () { - function countResults (data) { - var count = 0; - - for (var d = 0; d < data.length; d++) { - var item = data[d]; - - if (item.children) { - count += countResults(item.children); - } else { - count++; - } - } - - return count; - } - - function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { - this.minimumResultsForSearch = options.get('minimumResultsForSearch'); - - if (this.minimumResultsForSearch < 0) { - this.minimumResultsForSearch = Infinity; - } - - decorated.call(this, $element, options, dataAdapter); - } - - MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { - if (countResults(params.data.results) < this.minimumResultsForSearch) { - return false; - } - - return decorated.call(this, params); - }; - - return MinimumResultsForSearch; -}); - -S2.define('select2/dropdown/selectOnClose',[ - -], function () { - function SelectOnClose () { } - - SelectOnClose.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('close', function (params) { - self._handleSelectOnClose(params); - }); - }; - - SelectOnClose.prototype._handleSelectOnClose = function (_, params) { - if (params && params.originalSelect2Event != null) { - var event = params.originalSelect2Event; - - // Don't select an item if the close event was triggered from a select or - // unselect event - if (event._type === 'select' || event._type === 'unselect') { - return; - } - } - - var $highlightedResults = this.getHighlightedResults(); - - // Only select highlighted results - if ($highlightedResults.length < 1) { - return; - } - - var data = $highlightedResults.data('data'); - - // Don't re-select already selected resulte - if ( - (data.element != null && data.element.selected) || - (data.element == null && data.selected) - ) { - return; - } - - this.trigger('select', { - data: data - }); - }; - - return SelectOnClose; -}); - -S2.define('select2/dropdown/closeOnSelect',[ - -], function () { - function CloseOnSelect () { } - - CloseOnSelect.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function (evt) { - self._selectTriggered(evt); - }); - - container.on('unselect', function (evt) { - self._selectTriggered(evt); - }); - }; - - CloseOnSelect.prototype._selectTriggered = function (_, evt) { - var originalEvent = evt.originalEvent; - - // Don't close if the control key is being held - if (originalEvent && originalEvent.ctrlKey) { - return; - } - - this.trigger('close', { - originalEvent: originalEvent, - originalSelect2Event: evt - }); - }; - - return CloseOnSelect; -}); - -S2.define('select2/i18n/en',[],function () { - // English - return { - errorLoading: function () { - return 'The results could not be loaded.'; - }, - inputTooLong: function (args) { - var overChars = args.input.length - args.maximum; - - var message = 'Please delete ' + overChars + ' character'; - - if (overChars != 1) { - message += 's'; - } - - return message; - }, - inputTooShort: function (args) { - var remainingChars = args.minimum - args.input.length; - - var message = 'Please enter ' + remainingChars + ' or more characters'; - - return message; - }, - loadingMore: function () { - return 'Loading more results…'; - }, - maximumSelected: function (args) { - var message = 'You can only select ' + args.maximum + ' item'; - - if (args.maximum != 1) { - message += 's'; - } - - return message; - }, - noResults: function () { - return 'No results found'; - }, - searching: function () { - return 'Searching…'; - } - }; -}); - -S2.define('select2/defaults',[ - 'jquery', - 'require', - - './results', - - './selection/single', - './selection/multiple', - './selection/placeholder', - './selection/allowClear', - './selection/search', - './selection/eventRelay', - - './utils', - './translation', - './diacritics', - - './data/select', - './data/array', - './data/ajax', - './data/tags', - './data/tokenizer', - './data/minimumInputLength', - './data/maximumInputLength', - './data/maximumSelectionLength', - - './dropdown', - './dropdown/search', - './dropdown/hidePlaceholder', - './dropdown/infiniteScroll', - './dropdown/attachBody', - './dropdown/minimumResultsForSearch', - './dropdown/selectOnClose', - './dropdown/closeOnSelect', - - './i18n/en' -], function ($, require, - - ResultsList, - - SingleSelection, MultipleSelection, Placeholder, AllowClear, - SelectionSearch, EventRelay, - - Utils, Translation, DIACRITICS, - - SelectData, ArrayData, AjaxData, Tags, Tokenizer, - MinimumInputLength, MaximumInputLength, MaximumSelectionLength, - - Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, - AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, - - EnglishTranslation) { - function Defaults () { - this.reset(); - } - - Defaults.prototype.apply = function (options) { - options = $.extend(true, {}, this.defaults, options); - - if (options.dataAdapter == null) { - if (options.ajax != null) { - options.dataAdapter = AjaxData; - } else if (options.data != null) { - options.dataAdapter = ArrayData; - } else { - options.dataAdapter = SelectData; - } - - if (options.minimumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MinimumInputLength - ); - } - - if (options.maximumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumInputLength - ); - } - - if (options.maximumSelectionLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumSelectionLength - ); - } - - if (options.tags) { - options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); - } - - if (options.tokenSeparators != null || options.tokenizer != null) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Tokenizer - ); - } - - if (options.query != null) { - var Query = require(options.amdBase + 'compat/query'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Query - ); - } - - if (options.initSelection != null) { - var InitSelection = require(options.amdBase + 'compat/initSelection'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - InitSelection - ); - } - } - - if (options.resultsAdapter == null) { - options.resultsAdapter = ResultsList; - - if (options.ajax != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - InfiniteScroll - ); - } - - if (options.placeholder != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - HidePlaceholder - ); - } - - if (options.selectOnClose) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - SelectOnClose - ); - } - } - - if (options.dropdownAdapter == null) { - if (options.multiple) { - options.dropdownAdapter = Dropdown; - } else { - var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); - - options.dropdownAdapter = SearchableDropdown; - } - - if (options.minimumResultsForSearch !== 0) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - MinimumResultsForSearch - ); - } - - if (options.closeOnSelect) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - CloseOnSelect - ); - } - - if ( - options.dropdownCssClass != null || - options.dropdownCss != null || - options.adaptDropdownCssClass != null - ) { - var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - DropdownCSS - ); - } - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - AttachBody - ); - } - - if (options.selectionAdapter == null) { - if (options.multiple) { - options.selectionAdapter = MultipleSelection; - } else { - options.selectionAdapter = SingleSelection; - } - - // Add the placeholder mixin if a placeholder was specified - if (options.placeholder != null) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - Placeholder - ); - } - - if (options.allowClear) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - AllowClear - ); - } - - if (options.multiple) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - SelectionSearch - ); - } - - if ( - options.containerCssClass != null || - options.containerCss != null || - options.adaptContainerCssClass != null - ) { - var ContainerCSS = require(options.amdBase + 'compat/containerCss'); - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - ContainerCSS - ); - } - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - EventRelay - ); - } - - if (typeof options.language === 'string') { - // Check if the language is specified with a region - if (options.language.indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = options.language.split('-'); - var baseLanguage = languageParts[0]; - - options.language = [options.language, baseLanguage]; - } else { - options.language = [options.language]; - } - } - - if ($.isArray(options.language)) { - var languages = new Translation(); - options.language.push('en'); - - var languageNames = options.language; - - for (var l = 0; l < languageNames.length; l++) { - var name = languageNames[l]; - var language = {}; - - try { - // Try to load it with the original name - language = Translation.loadPath(name); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - name = this.defaults.amdLanguageBase + name; - language = Translation.loadPath(name); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files. - if (options.debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + name + '" could not be ' + - 'automatically loaded. A fallback will be used instead.' - ); - } - - continue; - } - } - - languages.extend(language); - } - - options.translations = languages; - } else { - var baseTranslation = Translation.loadPath( - this.defaults.amdLanguageBase + 'en' - ); - var customTranslation = new Translation(options.language); - - customTranslation.extend(baseTranslation); - - options.translations = customTranslation; - } - - return options; - }; - - Defaults.prototype.reset = function () { - function stripDiacritics (text) { - // Used 'uni range + named function' from http://jsperf.com/diacritics/18 - function match(a) { - return DIACRITICS[a] || a; - } - - return text.replace(/[^\u0000-\u007E]/g, match); - } - - function matcher (params, data) { - // Always return the object if there is nothing to compare - if ($.trim(params.term) === '') { - return data; - } - - // Do a recursive check for options with children - if (data.children && data.children.length > 0) { - // Clone the data object if there are children - // This is required as we modify the object to remove any non-matches - var match = $.extend(true, {}, data); - - // Check each child of the option - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - var matches = matcher(params, child); - - // If there wasn't a match, remove the object in the array - if (matches == null) { - match.children.splice(c, 1); - } - } - - // If any children matched, return the new object - if (match.children.length > 0) { - return match; - } - - // If there were no matching children, check just the plain object - return matcher(params, match); - } - - var original = stripDiacritics(data.text).toUpperCase(); - var term = stripDiacritics(params.term).toUpperCase(); - - // Check if the text contains the term - if (original.indexOf(term) > -1) { - return data; - } - - // If it doesn't contain the term, don't return anything - return null; - } - - this.defaults = { - amdBase: './', - amdLanguageBase: './i18n/', - closeOnSelect: true, - debug: false, - dropdownAutoWidth: false, - escapeMarkup: Utils.escapeMarkup, - language: EnglishTranslation, - matcher: matcher, - minimumInputLength: 0, - maximumInputLength: 0, - maximumSelectionLength: 0, - minimumResultsForSearch: 0, - selectOnClose: false, - sorter: function (data) { - return data; - }, - templateResult: function (result) { - return result.text; - }, - templateSelection: function (selection) { - return selection.text; - }, - theme: 'default', - width: 'resolve' - }; - }; - - Defaults.prototype.set = function (key, value) { - var camelKey = $.camelCase(key); - - var data = {}; - data[camelKey] = value; - - var convertedData = Utils._convertData(data); - - $.extend(this.defaults, convertedData); - }; - - var defaults = new Defaults(); - - return defaults; -}); - -S2.define('select2/options',[ - 'require', - 'jquery', - './defaults', - './utils' -], function (require, $, Defaults, Utils) { - function Options (options, $element) { - this.options = options; - - if ($element != null) { - this.fromElement($element); - } - - this.options = Defaults.apply(this.options); - - if ($element && $element.is('input')) { - var InputCompat = require(this.get('amdBase') + 'compat/inputData'); - - this.options.dataAdapter = Utils.Decorate( - this.options.dataAdapter, - InputCompat - ); - } - } - - Options.prototype.fromElement = function ($e) { - var excludedData = ['select2']; - - if (this.options.multiple == null) { - this.options.multiple = $e.prop('multiple'); - } - - if (this.options.disabled == null) { - this.options.disabled = $e.prop('disabled'); - } - - if (this.options.language == null) { - if ($e.prop('lang')) { - this.options.language = $e.prop('lang').toLowerCase(); - } else if ($e.closest('[lang]').prop('lang')) { - this.options.language = $e.closest('[lang]').prop('lang'); - } - } - - if (this.options.dir == null) { - if ($e.prop('dir')) { - this.options.dir = $e.prop('dir'); - } else if ($e.closest('[dir]').prop('dir')) { - this.options.dir = $e.closest('[dir]').prop('dir'); - } else { - this.options.dir = 'ltr'; - } - } - - $e.prop('disabled', this.options.disabled); - $e.prop('multiple', this.options.multiple); - - if ($e.data('select2Tags')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-select2-tags` attribute has been changed to ' + - 'use the `data-data` and `data-tags="true"` attributes and will be ' + - 'removed in future versions of Select2.' - ); - } - - $e.data('data', $e.data('select2Tags')); - $e.data('tags', true); - } - - if ($e.data('ajaxUrl')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-ajax-url` attribute has been changed to ' + - '`data-ajax--url` and support for the old attribute will be removed' + - ' in future versions of Select2.' - ); - } - - $e.attr('ajax--url', $e.data('ajaxUrl')); - $e.data('ajax--url', $e.data('ajaxUrl')); - } - - var dataset = {}; - - // Prefer the element's `dataset` attribute if it exists - // jQuery 1.x does not correctly handle data attributes with multiple dashes - if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, $e.data()); - } else { - dataset = $e.data(); - } - - var data = $.extend(true, {}, dataset); - - data = Utils._convertData(data); - - for (var key in data) { - if ($.inArray(key, excludedData) > -1) { - continue; - } - - if ($.isPlainObject(this.options[key])) { - $.extend(this.options[key], data[key]); - } else { - this.options[key] = data[key]; - } - } - - return this; - }; - - Options.prototype.get = function (key) { - return this.options[key]; - }; - - Options.prototype.set = function (key, val) { - this.options[key] = val; - }; - - return Options; -}); - -S2.define('select2/core',[ - 'jquery', - './options', - './utils', - './keys' -], function ($, Options, Utils, KEYS) { - var Select2 = function ($element, options) { - if ($element.data('select2') != null) { - $element.data('select2').destroy(); - } - - this.$element = $element; - - this.id = this._generateId($element); - - options = options || {}; - - this.options = new Options(options, $element); - - Select2.__super__.constructor.call(this); - - // Set up the tabindex - - var tabindex = $element.attr('tabindex') || 0; - $element.data('old-tabindex', tabindex); - $element.attr('tabindex', '-1'); - - // Set up containers and adapters - - var DataAdapter = this.options.get('dataAdapter'); - this.dataAdapter = new DataAdapter($element, this.options); - - var $container = this.render(); - - this._placeContainer($container); - - var SelectionAdapter = this.options.get('selectionAdapter'); - this.selection = new SelectionAdapter($element, this.options); - this.$selection = this.selection.render(); - - this.selection.position(this.$selection, $container); - - var DropdownAdapter = this.options.get('dropdownAdapter'); - this.dropdown = new DropdownAdapter($element, this.options); - this.$dropdown = this.dropdown.render(); - - this.dropdown.position(this.$dropdown, $container); - - var ResultsAdapter = this.options.get('resultsAdapter'); - this.results = new ResultsAdapter($element, this.options, this.dataAdapter); - this.$results = this.results.render(); - - this.results.position(this.$results, this.$dropdown); - - // Bind events - - var self = this; - - // Bind the container to all of the adapters - this._bindAdapters(); - - // Register any DOM event handlers - this._registerDomEvents(); - - // Register any internal event handlers - this._registerDataEvents(); - this._registerSelectionEvents(); - this._registerDropdownEvents(); - this._registerResultsEvents(); - this._registerEvents(); - - // Set the initial state - this.dataAdapter.current(function (initialData) { - self.trigger('selection:update', { - data: initialData - }); - }); - - // Hide the original select - $element.addClass('select2-hidden-accessible'); - $element.attr('aria-hidden', 'true'); - - // Synchronize any monitored attributes - this._syncAttributes(); - - $element.data('select2', this); - }; - - Utils.Extend(Select2, Utils.Observable); - - Select2.prototype._generateId = function ($element) { - var id = ''; - - if ($element.attr('id') != null) { - id = $element.attr('id'); - } else if ($element.attr('name') != null) { - id = $element.attr('name') + '-' + Utils.generateChars(2); - } else { - id = Utils.generateChars(4); - } - - id = id.replace(/(:|\.|\[|\]|,)/g, ''); - id = 'select2-' + id; - - return id; - }; - - Select2.prototype._placeContainer = function ($container) { - $container.insertAfter(this.$element); - - var width = this._resolveWidth(this.$element, this.options.get('width')); - - if (width != null) { - $container.css('width', width); - } - }; - - Select2.prototype._resolveWidth = function ($element, method) { - var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; - - if (method == 'resolve') { - var styleWidth = this._resolveWidth($element, 'style'); - - if (styleWidth != null) { - return styleWidth; - } - - return this._resolveWidth($element, 'element'); - } - - if (method == 'element') { - var elementWidth = $element.outerWidth(false); - - if (elementWidth <= 0) { - return 'auto'; - } - - return elementWidth + 'px'; - } - - if (method == 'style') { - var style = $element.attr('style'); - - if (typeof(style) !== 'string') { - return null; - } - - var attrs = style.split(';'); - - for (var i = 0, l = attrs.length; i < l; i = i + 1) { - var attr = attrs[i].replace(/\s/g, ''); - var matches = attr.match(WIDTH); - - if (matches !== null && matches.length >= 1) { - return matches[1]; - } - } - - return null; - } - - return method; - }; - - Select2.prototype._bindAdapters = function () { - this.dataAdapter.bind(this, this.$container); - this.selection.bind(this, this.$container); - - this.dropdown.bind(this, this.$container); - this.results.bind(this, this.$container); - }; - - Select2.prototype._registerDomEvents = function () { - var self = this; - - this.$element.on('change.select2', function () { - self.dataAdapter.current(function (data) { - self.trigger('selection:update', { - data: data - }); - }); - }); - - this.$element.on('focus.select2', function (evt) { - self.trigger('focus', evt); - }); - - this._syncA = Utils.bind(this._syncAttributes, this); - this._syncS = Utils.bind(this._syncSubtree, this); - - if (this.$element[0].attachEvent) { - this.$element[0].attachEvent('onpropertychange', this._syncA); - } - - var observer = window.MutationObserver || - window.WebKitMutationObserver || - window.MozMutationObserver - ; - - if (observer != null) { - this._observer = new observer(function (mutations) { - $.each(mutations, self._syncA); - $.each(mutations, self._syncS); - }); - this._observer.observe(this.$element[0], { - attributes: true, - childList: true, - subtree: false - }); - } else if (this.$element[0].addEventListener) { - this.$element[0].addEventListener( - 'DOMAttrModified', - self._syncA, - false - ); - this.$element[0].addEventListener( - 'DOMNodeInserted', - self._syncS, - false - ); - this.$element[0].addEventListener( - 'DOMNodeRemoved', - self._syncS, - false - ); - } - }; - - Select2.prototype._registerDataEvents = function () { - var self = this; - - this.dataAdapter.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerSelectionEvents = function () { - var self = this; - var nonRelayEvents = ['toggle', 'focus']; - - this.selection.on('toggle', function () { - self.toggleDropdown(); - }); - - this.selection.on('focus', function (params) { - self.focus(params); - }); - - this.selection.on('*', function (name, params) { - if ($.inArray(name, nonRelayEvents) !== -1) { - return; - } - - self.trigger(name, params); - }); - }; - - Select2.prototype._registerDropdownEvents = function () { - var self = this; - - this.dropdown.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerResultsEvents = function () { - var self = this; - - this.results.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerEvents = function () { - var self = this; - - this.on('open', function () { - self.$container.addClass('select2-container--open'); - }); - - this.on('close', function () { - self.$container.removeClass('select2-container--open'); - }); - - this.on('enable', function () { - self.$container.removeClass('select2-container--disabled'); - }); - - this.on('disable', function () { - self.$container.addClass('select2-container--disabled'); - }); - - this.on('blur', function () { - self.$container.removeClass('select2-container--focus'); - }); - - this.on('query', function (params) { - if (!self.isOpen()) { - self.trigger('open', {}); - } - - this.dataAdapter.query(params, function (data) { - self.trigger('results:all', { - data: data, - query: params - }); - }); - }); - - this.on('query:append', function (params) { - this.dataAdapter.query(params, function (data) { - self.trigger('results:append', { - data: data, - query: params - }); - }); - }); - - this.on('keypress', function (evt) { - var key = evt.which; - - if (self.isOpen()) { - if (key === KEYS.ESC || key === KEYS.TAB || - (key === KEYS.UP && evt.altKey)) { - self.close(); - - evt.preventDefault(); - } else if (key === KEYS.ENTER) { - self.trigger('results:select', {}); - - evt.preventDefault(); - } else if ((key === KEYS.SPACE && evt.ctrlKey)) { - self.trigger('results:toggle', {}); - - evt.preventDefault(); - } else if (key === KEYS.UP) { - self.trigger('results:previous', {}); - - evt.preventDefault(); - } else if (key === KEYS.DOWN) { - self.trigger('results:next', {}); - - evt.preventDefault(); - } - } else { - if (key === KEYS.ENTER || key === KEYS.SPACE || - (key === KEYS.DOWN && evt.altKey)) { - self.open(); - - evt.preventDefault(); - } - } - }); - }; - - Select2.prototype._syncAttributes = function () { - this.options.set('disabled', this.$element.prop('disabled')); - - if (this.options.get('disabled')) { - if (this.isOpen()) { - this.close(); - } - - this.trigger('disable', {}); - } else { - this.trigger('enable', {}); - } - }; - - Select2.prototype._syncSubtree = function (evt, mutations) { - var changed = false; - var self = this; - - // Ignore any mutation events raised for elements that aren't options or - // optgroups. This handles the case when the select element is destroyed - if ( - evt && evt.target && ( - evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' - ) - ) { - return; - } - - if (!mutations) { - // If mutation events aren't supported, then we can only assume that the - // change affected the selections - changed = true; - } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { - for (var n = 0; n < mutations.addedNodes.length; n++) { - var node = mutations.addedNodes[n]; - - if (node.selected) { - changed = true; - } - } - } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { - changed = true; - } - - // Only re-pull the data if we think there is a change - if (changed) { - this.dataAdapter.current(function (currentData) { - self.trigger('selection:update', { - data: currentData - }); - }); - } - }; - - /** - * Override the trigger method to automatically trigger pre-events when - * there are events that can be prevented. - */ - Select2.prototype.trigger = function (name, args) { - var actualTrigger = Select2.__super__.trigger; - var preTriggerMap = { - 'open': 'opening', - 'close': 'closing', - 'select': 'selecting', - 'unselect': 'unselecting' - }; - - if (args === undefined) { - args = {}; - } - - if (name in preTriggerMap) { - var preTriggerName = preTriggerMap[name]; - var preTriggerArgs = { - prevented: false, - name: name, - args: args - }; - - actualTrigger.call(this, preTriggerName, preTriggerArgs); - - if (preTriggerArgs.prevented) { - args.prevented = true; - - return; - } - } - - actualTrigger.call(this, name, args); - }; - - Select2.prototype.toggleDropdown = function () { - if (this.options.get('disabled')) { - return; - } - - if (this.isOpen()) { - this.close(); - } else { - this.open(); - } - }; - - Select2.prototype.open = function () { - if (this.isOpen()) { - return; - } - - this.trigger('query', {}); - }; - - Select2.prototype.close = function () { - if (!this.isOpen()) { - return; - } - - this.trigger('close', {}); - }; - - Select2.prototype.isOpen = function () { - return this.$container.hasClass('select2-container--open'); - }; - - Select2.prototype.hasFocus = function () { - return this.$container.hasClass('select2-container--focus'); - }; - - Select2.prototype.focus = function (data) { - // No need to re-trigger focus events if we are already focused - if (this.hasFocus()) { - return; - } - - this.$container.addClass('select2-container--focus'); - this.trigger('focus', {}); - }; - - Select2.prototype.enable = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("enable")` method has been deprecated and will' + - ' be removed in later Select2 versions. Use $element.prop("disabled")' + - ' instead.' - ); - } - - if (args == null || args.length === 0) { - args = [true]; - } - - var disabled = !args[0]; - - this.$element.prop('disabled', disabled); - }; - - Select2.prototype.data = function () { - if (this.options.get('debug') && - arguments.length > 0 && window.console && console.warn) { - console.warn( - 'Select2: Data can no longer be set using `select2("data")`. You ' + - 'should consider setting the value instead using `$element.val()`.' - ); - } - - var data = []; - - this.dataAdapter.current(function (currentData) { - data = currentData; - }); - - return data; - }; - - Select2.prototype.val = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("val")` method has been deprecated and will be' + - ' removed in later Select2 versions. Use $element.val() instead.' - ); - } - - if (args == null || args.length === 0) { - return this.$element.val(); - } - - var newVal = args[0]; - - if ($.isArray(newVal)) { - newVal = $.map(newVal, function (obj) { - return obj.toString(); - }); - } - - this.$element.val(newVal).trigger('change'); - }; - - Select2.prototype.destroy = function () { - this.$container.remove(); - - if (this.$element[0].detachEvent) { - this.$element[0].detachEvent('onpropertychange', this._syncA); - } - - if (this._observer != null) { - this._observer.disconnect(); - this._observer = null; - } else if (this.$element[0].removeEventListener) { - this.$element[0] - .removeEventListener('DOMAttrModified', this._syncA, false); - this.$element[0] - .removeEventListener('DOMNodeInserted', this._syncS, false); - this.$element[0] - .removeEventListener('DOMNodeRemoved', this._syncS, false); - } - - this._syncA = null; - this._syncS = null; - - this.$element.off('.select2'); - this.$element.attr('tabindex', this.$element.data('old-tabindex')); - - this.$element.removeClass('select2-hidden-accessible'); - this.$element.attr('aria-hidden', 'false'); - this.$element.removeData('select2'); - - this.dataAdapter.destroy(); - this.selection.destroy(); - this.dropdown.destroy(); - this.results.destroy(); - - this.dataAdapter = null; - this.selection = null; - this.dropdown = null; - this.results = null; - }; - - Select2.prototype.render = function () { - var $container = $( - '<span class="select2 select2-container">' + - '<span class="selection"></span>' + - '<span class="dropdown-wrapper" aria-hidden="true"></span>' + - '</span>' - ); - - $container.attr('dir', this.options.get('dir')); - - this.$container = $container; - - this.$container.addClass('select2-container--' + this.options.get('theme')); - - $container.data('element', this.$element); - - return $container; - }; - - return Select2; -}); - -S2.define('jquery-mousewheel',[ - 'jquery' -], function ($) { - // Used to shim jQuery.mousewheel for non-full builds. - return $; -}); - -S2.define('jquery.select2',[ - 'jquery', - 'jquery-mousewheel', - - './select2/core', - './select2/defaults' -], function ($, _, Select2, Defaults) { - if ($.fn.select2 == null) { - // All methods that should return the element - var thisMethods = ['open', 'close', 'destroy']; - - $.fn.select2 = function (options) { - options = options || {}; - - if (typeof options === 'object') { - this.each(function () { - var instanceOptions = $.extend(true, {}, options); - - var instance = new Select2($(this), instanceOptions); - }); - - return this; - } else if (typeof options === 'string') { - var ret; - var args = Array.prototype.slice.call(arguments, 1); - - this.each(function () { - var instance = $(this).data('select2'); - - if (instance == null && window.console && console.error) { - console.error( - 'The select2(\'' + options + '\') method was called on an ' + - 'element that is not using Select2.' - ); - } - - ret = instance[options].apply(instance, args); - }); - - // Check if we should be returning `this` - if ($.inArray(options, thisMethods) > -1) { - return this; - } - - return ret; - } else { - throw new Error('Invalid arguments for Select2: ' + options); - } - }; - } - - if ($.fn.select2.defaults == null) { - $.fn.select2.defaults = Defaults; - } - - return Select2; -}); - - // Return the AMD loader configuration so it can be used outside of this file - return { - define: S2.define, - require: S2.require - }; -}()); - - // Autoload the jQuery bindings - // We know that all of the modules exist above this, so we're safe - var select2 = S2.require('jquery.select2'); - - // Hold the AMD module references on the jQuery function that was just loaded - // This allows Select2 to use the internal loader outside of this file, such - // as in the language files. - jQuery.fn.select2.amd = S2; - - // Return the Select2 instance for anyone who is importing it. - return select2; -})); diff --git a/templates/weh-inspector/src/content/styles.scss b/templates/weh-inspector/src/content/styles.scss deleted file mode 100644 index 34eb684..0000000 --- a/templates/weh-inspector/src/content/styles.scss +++ /dev/null @@ -1,305 +0,0 @@ - -$back-color: #F5EBD7; -$back-color-dark: #D7C0A1; -$back-color-light: #FFF9F0; - -$msg-color1: rgba(#8EF2C2,.5); -$msg-color2: rgba(#EFC675,.5); -$msg-color3: rgba(#9749BC,.5); - -$front-color: #000066; - -@mixin ellipsis() { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -html,body,#root,.fullheight { - height: 100%; -} - -.fullwidth { - width: 100%; -} - -a { - cursor: pointer; -} - -.sidebar { - background-color: $back-color; - padding: 8px; - - h1 { - font-size: 16pt; - font-weight: 800; - } - - h2 { - font-size: 12pt; - } - - a { - text-align: right; - padding: 4px 0; - display: block; - } - -} - -.addon-list { - - ul { - background-color: #fff; - border: 1px solid #ccc; - padding: 0; - - li { - list-style-type: none; - cursor: pointer; - padding: 4px; - border-bottom: 1px solid #ccc; - } - - li:last-child { - border-bottom: 0; - } - - li:hover { - background-color: $back-color; - } - } - - .addon { - - .addon-name { - } - - .addon-id { - font-style: italic; - font-size: 8pt; - @include ellipsis; - } - } -} - - -.addon-selector { - - select { - width: 100%; - } - - .commands { - - overflow: hidden; - - a { - float: right; - } - - } -} - -.addon-control { - - background-color: $back-color-light; - padding: 8px; - - .info { - margin: 20px 0; - text-align: center; - - .addon-id { - font-style: italic; - font-size: 8pt; - @include ellipsis; - } - .addon-name { - font-weight: 800; - } - } - - .commands { - - } -} - -.weh-table { - - display: table; - width: 100%; - height: 100%; - - > div { - display: table-row; - - > div { - display: table-cell; - - - > div.weh-table-content { - position: relative; - - > div { - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - } - } - } - - div.weh-table-middle { - vertical-align: middle; - } - } -} - -.addon-tabs { - - padding: 0; - background-color: $back-color-light; - - .addon-tabs-tabs { - height: 0; - - div ul { - background-color: #fff; - } - } - - .messages-tab { - - .weh-table-content > div { - overflow: auto; - } - - .message-table { - width: 100%; - - td { - border-bottom: 1px solid #eee; - padding: 3px 4px; - } - - th { - Xtext-align: center; - padding: 4px 6px; - border-bottom: 1px solid #ccc; - } - - tr { - border-bottom: 1px solid #f00; - } - - } - - .messages-none { - text-align: center; - color: #aaa; - } - - .message-way-bgui { - background-color: $msg-color1; - } - - .message-way-uibg { - background-color: $msg-color2; - } - } - - .storage-tab { - - .storage-addon { - height: 30px; - line-height: 30pt; - font-size: 16pt; - font-weight: 800; - padding-left: 12px; - } - - .storage-stores { - - padding: 0; - - .storage-item { - - list-style: none; - - .storage-item-value { - display: table-cell; - } - - .storage-item-name { - display: table-cell; - vertical-align: middle; - padding-right: 25px; - font-style: italic; - } - } - - .storage-store { - list-style: none; - - .storage-store-name { - height: 25px; - line-height: 20pt; - font-size: 12pt; - font-weight: 600; - background-color: $back-color-dark; - margin: 8px 0; - padding-left: 12px; - } - - .storage-items { - padding-left: 24px; - } - } - } - - .weh-table-content > div { - overflow: auto; - } - - } - - .prefs-tab { - - .prefs-addon { - height: 30px; - line-height: 30pt; - font-size: 16pt; - font-weight: 800; - padding-left: 12px; - padding-bottom: 12px; - } - - .param > div > label { - margin-top: 6px; - } - - .weh-table-content > div { - overflow: auto; - } - } - - .statusbar { - height: 30px; - background-color: $back-color-dark; - - a { - float: right; - margin: 0 8px; - color: $front-color; - } - } - - .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { - background-color: $back-color-light; - } - -} - diff --git a/templates/weh-inspector/src/locales/en_US/messages.json b/templates/weh-inspector/src/locales/en_US/messages.json deleted file mode 100644 index fcf33ec..0000000 --- a/templates/weh-inspector/src/locales/en_US/messages.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "weh_inspector": { - "message": "Weh Inspector" - }, - "avail_addons": { - "message": "Available addons" - }, - "rescan_addons": { - "message": "Rescan addons" - }, - "start_monitor_bgui": { - "message": "Monitor messages" - }, - "stop_monitor_bgui": { - "message": "Stop monitoring messages" - }, - "pick_addon": { - "message": "Pick an addon..." - }, - "bgui_messages": { - "message": "Background/UI messages" - }, - "msgtable_delta_t": { - "message": "ΔT(ms)" - }, - "msgtable_addon": { - "message": "Addon" - }, - "msgtable_panel": { - "message": "Panel" - }, - "msgtable_direction": { - "message": "⇔" - }, - "msgtable_type": { - "message": "Type" - }, - "msgtable_message": { - "message": "Message" - }, - "messages_none": { - "message": "No message" - }, - "message_way_bgui": { - "message": "⇒" - }, - "message_way_uibg": { - "message": "⇐" - }, - "message_way_local": { - "message": "⇓" - }, - "clear_messages": { - "message": "Clear" - }, - "storage": { - "message": "Storage" - }, - "show_storage": { - "message": "Storage" - }, - "storage_for": { - "message": "Storage for $addon$", - "placeholders": { - "addon": { - "content": "$1" - } - } - }, - "get_prefs": { - "message": "Preferences" - }, - "prefs": { - "message": "Preferences" - }, - "prefs_for": { - "message": "Preferences for $addon$", - "placeholders": { - "addon": { - "content": "$1" - } - } - }, - "prefs_save": { - "message": "Save" - }, - "close": { - "message": "Close" - } -} diff --git a/templates/weh-inspector/src/manifest.json b/templates/weh-inspector/src/manifest.json deleted file mode 100644 index c010035..0000000 --- a/templates/weh-inspector/src/manifest.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "manifest_version": 2 - , "name": "Weh Inspector" - , "default_locale": "en_US" - , "version": "1.0" - , "version_name": "1.0" - , "author": "Michel Gutierrez" - , "background": { - "scripts": [ - "background/default-prefs.js", - "background/main.js" - ] - , "persistent": true - } - , "icons": { - "32": "content/images/icon-32.png" - , "40": "content/images/icon-40.png" - , "48": "content/images/icon-48.png" - , "128": "content/images/icon-128.png" - } - , "permissions": [ - "tabs", - "contextMenus", - "management" - ] -} - diff --git a/visuals/icon.xcf b/visuals/icon.xcf deleted file mode 100644 index e525f29..0000000 Binary files a/visuals/icon.xcf and /dev/null differ