diff --git a/.babelrc b/.babelrc
index a28ae14..418e31c 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,10 +1,6 @@
{
- "presets": [
- "@babel/env"
- ],
- "plugins": [
- "@babel/plugin-transform-runtime"
- ],
- "sourceMaps": "inline",
- "retainLines": true
+ "presets": ["es2015"],
+ "plugins":[
+ ["babel-plugin-root-import"]
+ ]
}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..4c265ca
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+root = true;
+
+[*]
+# Ensure there's no lingering whitespace
+trim_trailing_whitespace = false
+# Ensure a newline at the end of each file
+insert_final_newline = false
+
+[*.js]
+# Unix-style newlines
+# end_of_line = lf
+# charset = utf-8
+# indent_style = tab
+# indent_size = 2
diff --git a/.eslintrc b/.eslintrc
index 16f2621..fd5da33 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,70 +1,18 @@
{
- "extends": "eslint:recommended",
- "parserOptions": {
- "ecmaVersion": 8,
- "sourceType": "module"
- },
- "env": {
- "browser": true,
- "node": true
- },
- "globals": {
- "Promise": true
- },
- "rules": {
- "array-bracket-spacing": [ 2, "never" ],
- "block-scoped-var": 2,
- "brace-style": [ 2, "1tbs", { "allowSingleLine": true } ],
- "camelcase": [ 2, { "properties": "always" } ],
- "curly": [ 2, "multi-line" ],
- "dot-notation": [ 2, { "allowKeywords": true } ],
- "eol-last": 2,
- "eqeqeq": 0,
- "guard-for-in": 2,
- "indent": [ 2, "tab", { "SwitchCase": 1 } ],
- "key-spacing": [ 2,
- {
- "beforeColon": false,
- "afterColon": true
- }
- ],
- "keyword-spacing": [ 2 ],
- "new-cap": 2,
- "no-bitwise": 2,
- "no-caller": 2,
- "no-eval": 2,
- "no-extend-native": 2,
- "no-iterator": 2,
- "no-loop-func": 2,
- "no-multi-spaces": "error",
- "no-multi-str": 2,
- "no-multiple-empty-lines": 2,
- "no-new": 2,
- "no-proto": 2,
- "no-script-url": 2,
- "no-sequences": 2,
- "no-shadow": 2,
- "no-spaced-func": 2,
- "no-trailing-spaces": 2,
- "no-unused-vars": [ 1, { "args": "none" } ],
- "no-var": 2,
- "no-with": 2,
- "object-shorthand": [ 2, "methods" ],
- "operator-linebreak": [ 0, "after" ],
- "quotes": [ 2, "single" ],
- "semi": [ 0, "never" ],
- "space-before-blocks": [ 2, "always" ],
- "space-before-function-paren": [ 2, "never" ],
- "space-in-parens": [ 2, "never" ],
- "space-infix-ops": 2,
- "space-unary-ops": [ 2,
- {
- "nonwords": false,
- "overrides": {}
- }
- ],
- "strict": 0,
- "valid-jsdoc": 2,
- "wrap-iife": [ 2, "inside" ]
- }
- }
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
+ },
+ "rules": {
+ "camelcase": [ 2, { "properties": "always" } ]
+ },
+ "env": {
+ "browser": true,
+ "node": true
+ },
+ "globals": {
+ "define":true,
+ "document": true,
+ "window": true
+ }
+}
diff --git a/.gitignore b/.gitignore
index 46c339b..32f56a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,23 @@
logs
*.log
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
# Dependency directory
# Commenting this out is preferred by some people, see
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
@@ -13,7 +30,3 @@ demo
# Users Environment Variables
.lock-wscript
-yarn.lock
-.vscode
-
-
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..b1710f0
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,10 @@
+language: node_js
+node_js:
+ - "4"
+ - "5"
+ - "stable"
+sudo: false
+script: "gulp coverage"
+after_success:
+ - npm install -g codeclimate-test-reporter
+ - codeclimate-test-reporter < coverage/lcov.info
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..808c81f
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,3 @@
+### [0.0.1](https://github.com/taburetkin/marionette.yat/releases/tag/v0.0.1)
+
+- The first release
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8887cf2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,80 @@
+# marionette.yat
+
+[![Join the chat at https://gitter.im/marionette-yat/Lobby](https://badges.gitter.im/marionette-yat/Lobby.svg)](https://gitter.im/marionette-yat/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+# deprecated. check out v2
+
+The goal of Marionette Yet Another Toolkit is
+* allow to make things via mixins.
+* extend default functionality with some useful things
+
+Simple App with pages, modals*, popovers*, and common ui*.
+
+marked with asterisk is not yet implemented.
+
+
+## Examples
+* [Page and PageManager](https://codepen.io/dimatabu/full/opGPoQ) - simple application with pages.
+* [sort CollectionView by drag'n'drop](https://codepen.io/dimatabu/pen/JMaZXP)
+
+## marionette.yat content
+* [behaviors](./src/behaviors)
+ * [behavior](/docs/behaviors/behavior.md)
+ * [draggable](/docs/behaviors/draggable.md)
+ * droppable
+ * [dynamic-class](/docs/behaviors/dynamic-class.md)
+ * [form-to-hash](/docs/behaviors/form-to-hash.md)
+* [functions](./src/functions)
+ * [common](./src/functions/common)
+ * [flatten-unflatten](./src/functions/common/flatten-unflatten)
+ * [flatten-object](/docs/functions/common/flatten-unflatten/flatten-object.md)
+ * [unflatten-object](/docs/functions/common/flatten-unflatten/unflatten-object.md)
+ * [set-get-by-path](./src/functions/common/set-get-by-path)
+ * [get-by-path](/docs/functions/common/set-get-by-path/get-by-path.md)
+ * [set-by-path](/docs/functions/common/set-get-by-path/set-by-path.md)
+ * [get-label](/docs/functions/common/get-label.md)
+ * [get-name](/docs/functions/common/get-name.md)
+ * [get-value](/docs/functions/common/get-value.md)
+ * is-view
+ * [unwrap](/docs/functions/common/unwrap.md)
+ * [wrap](/docs/functions/common/wrap.md)
+ * [view](./src/functions/view)
+ * [compare-ab](/docs/functions/view/compare-ab.md)
+ * [view-comparator](/docs/functions/view/view-comparator.md)
+* [helpers](./src/helpers)
+ * [isKnownCtor](/docs/helpers/isKnownCtor.md)
+ * [mix](/docs/helpers/mix.md)
+* [mixins](./src/mixins)
+ * [childrenable](/docs/mixins/childrenable.md)
+ * [get-name-label](/docs/mixins/get-name-label.md)
+ * [get-option-property](/docs/mixins/get-option-property.md)
+ * global-template-context
+ * [radioable](/docs/mixins/radioable.md)
+ * [startable](/docs/mixins/startable.md)
+ * [stateable](/docs/mixins/stateable.md)
+* [models](./src/models)
+ * collection
+ * link
+ * model
+* [singletons](./src/singletons)
+ * [modals](./src/singletons/modals)
+ * config
+ * modalView
+ * identity
+ * template-context
+* [YatApp](/docs/YatApp.md)
+* YatCollectionGroups
+* YatCollectionView
+* YatConfig
+* [YatError](/docs/YatError.md)
+* [YatObject](/docs/YatObject.md)
+* [YatPage](/docs/YatPage.md)
+* [YatPageManager](/docs/YatPageManager.md)
+* [YatRouter](/docs/YatRouter.md)
+* YatView
+
+[![Travis build status](http://img.shields.io/travis/taburetkin/marionette.yat.svg?style=flat)](https://travis-ci.org/taburetkin/marionette.yat)
+[![Code Climate](https://codeclimate.com/github/taburetkin/marionette.yat/badges/gpa.svg)](https://codeclimate.com/github/taburetkin/marionette.yat)
+[![Test Coverage](https://codeclimate.com/github/taburetkin/marionette.yat/badges/coverage.svg)](https://codeclimate.com/github/taburetkin/marionette.yat)
+[![Dependency Status](https://david-dm.org/taburetkin/marionette.yat.svg)](https://david-dm.org/taburetkin/marionette.yat)
+[![devDependency Status](https://david-dm.org/taburetkin/marionette.yat/dev-status.svg)](https://david-dm.org/taburetkin/marionette.yat#info=devDependencies)
diff --git a/__gulpfile.js b/__gulpfile.js
new file mode 100644
index 0000000..46eb9a4
--- /dev/null
+++ b/__gulpfile.js
@@ -0,0 +1,221 @@
+/*
+
+package.json scripts section
+
+ "test": "gulp",
+ "lint": "gulp lint",
+ "test-browser": "gulp test-browser",
+ "watch": "gulp watch",
+ "build": "gulp build",
+ "coverage": "gulp coverage"
+
+
+
+*/
+
+const gulp = require('gulp');
+const loadPlugins = require('gulp-load-plugins');
+const del = require('del');
+const glob = require('glob');
+const path = require('path');
+const isparta = require('isparta');
+const webpack = require('webpack');
+const webpackStream = require('webpack-stream');
+
+const Instrumenter = isparta.Instrumenter;
+const mochaGlobals = require('./test/setup/.globals');
+const manifest = require('./package.json');
+
+// Load all of our Gulp plugins
+const $ = loadPlugins();
+
+// Gather the library data from `package.json`
+const config = manifest.babelBoilerplateOptions;
+const mainFile = manifest.main;
+const destinationFolder = path.dirname(mainFile);
+const exportFileName = path.basename(mainFile, path.extname(mainFile));
+
+function cleanDist(done) {
+ del([destinationFolder]).then(() => done());
+}
+
+function cleanTmp(done) {
+ del(['tmp']).then(() => done());
+}
+
+// Lint a set of files
+function lint(files) {
+ return gulp.src(files)
+ .pipe($.eslint())
+ .pipe($.eslint.format())
+ .pipe($.eslint.failAfterError());
+}
+
+function lintSrc() {
+ return lint('src/**/*.js');
+}
+
+function lintTest() {
+ return lint('test/**/*.js');
+}
+
+function lintGulpfile() {
+ return lint('gulpfile.js');
+}
+
+function build() {
+ return gulp.src(path.join('src', config.entryFileName))
+ .pipe(webpackStream({
+ output: {
+ filename: `${exportFileName}.js`,
+ libraryTarget: 'var',
+ library: config.mainVarName
+ },
+ // Add your own externals here. For instance,
+ externals:{
+ 'jquery': '$',
+ 'underscore': '_',
+ 'backbone':'Backbone',
+ 'backbone.radio':'Backbone.Radio',
+ 'backbone.marionette':'Marionette',
+ },
+ // would externalize the `jquery` module.
+ //externals: {},
+ module: {
+ loaders: [
+ {test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader'}
+ ]
+ },
+ devtool: 'source-map'
+ }))
+ .pipe(gulp.dest(destinationFolder))
+ .pipe($.filter(['**', '!**/*.js.map']))
+ .pipe($.rename(`${exportFileName}.min.js`))
+ .pipe($.sourcemaps.init({loadMaps: true}))
+ .pipe($.uglify())
+ .pipe($.sourcemaps.write('./'))
+ .pipe(gulp.dest(destinationFolder));
+}
+
+function _mocha() {
+ return gulp.src(['test/setup/node.js', 'test/unit/**/*.js'], {read: false})
+ .pipe($.mocha({
+ reporter: 'dot',
+ globals: Object.keys(mochaGlobals.globals),
+ ignoreLeaks: false
+ }));
+}
+
+function _registerBabel() {
+ require('babel-register');
+}
+
+function test() {
+ _registerBabel();
+ return _mocha();
+}
+
+function coverage(done) {
+ _registerBabel();
+ gulp.src(['src/**/*.js'])
+ .pipe($.istanbul({
+ instrumenter: Instrumenter,
+ includeUntested: true
+ }))
+ .pipe($.istanbul.hookRequire())
+ .on('finish', () => {
+ return test()
+ .pipe($.istanbul.writeReports())
+ .on('end', done);
+ });
+}
+
+const watchFiles = ['src/**/*', 'test/**/*', 'package.json', '**/.eslintrc'];
+
+// Run the headless unit tests as you make changes.
+function watch() {
+ gulp.watch(watchFiles, ['test']);
+}
+
+function testBrowser() {
+ // Our testing bundle is made up of our unit tests, which
+ // should individually load up pieces of our application.
+ // We also include the browser setup file.
+ const testFiles = glob.sync('./test/unit/**/*.js');
+ const allFiles = ['./test/setup/browser.js'].concat(testFiles);
+
+ // Lets us differentiate between the first build and subsequent builds
+ var firstBuild = true;
+
+ // This empty stream might seem like a hack, but we need to specify all of our files through
+ // the `entry` option of webpack. Otherwise, it ignores whatever file(s) are placed in here.
+ return gulp.src('')
+ .pipe($.plumber())
+ .pipe(webpackStream({
+ watch: true,
+ entry: allFiles,
+ output: {
+ filename: '__spec-build.js'
+ },
+ // Externals isn't necessary here since these are for tests.
+ module: {
+ loaders: [
+ // This is what allows us to author in future JavaScript
+ {test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader'},
+ // This allows the test setup scripts to load `package.json`
+ {test: /\.json$/, exclude: /node_modules/, loader: 'json-loader'}
+ ]
+ },
+ plugins: [
+ // By default, webpack does `n=>n` compilation with entry files. This concatenates
+ // them into a single chunk.
+ new webpack.optimize.LimitChunkCountPlugin({maxChunks: 1})
+ ],
+ devtool: 'inline-source-map'
+ }, null, () => {
+ if (firstBuild) {
+ $.livereload.listen({port: 35729, host: 'localhost', start: true});
+ gulp.watch(watchFiles, ['lint']);
+ } else {
+ $.livereload.reload('./tmp/__spec-build.js');
+ }
+ firstBuild = false;
+ }))
+ .pipe(gulp.dest('./tmp'));
+}
+
+// Remove the built files
+gulp.task('clean', cleanDist);
+
+// Remove our temporary files
+gulp.task('clean-tmp', cleanTmp);
+
+// Lint our source code
+gulp.task('lint-src', lintSrc);
+
+// Lint our test code
+gulp.task('lint-test', lintTest);
+
+// Lint this file
+gulp.task('lint-gulpfile', lintGulpfile);
+
+// Lint everything
+gulp.task('lint', ['lint-src', 'lint-test', 'lint-gulpfile']);
+
+// Build two versions of the library
+gulp.task('build', ['lint', 'clean'], build);
+
+// Lint and run our tests
+gulp.task('test', ['lint'], test);
+
+// Set up coverage and run tests
+gulp.task('coverage', ['lint'], coverage);
+
+// Set up a livereload environment for our spec runner `test/runner.html`
+gulp.task('test-browser', ['lint', 'clean-tmp'], testBrowser);
+
+// Run the headless unit tests as you make changes.
+gulp.task('watch', watch);
+
+// An alias of test
+gulp.task('default', ['test']);
diff --git a/banner.md b/banner.md
new file mode 100644
index 0000000..f6c5c0e
--- /dev/null
+++ b/banner.md
@@ -0,0 +1,16 @@
+# marionette.yat
+
+[![Join the chat at https://gitter.im/marionette-yat/Lobby](https://badges.gitter.im/marionette-yat/Lobby.svg)](https://gitter.im/marionette-yat/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+The goal of Marionette Yet Another Toolkit is
+* allow to make things via mixins.
+* extend default functionality with some useful things
+
+Simple App with pages, modals*, popovers*, and common ui*.
+
+marked with asterisk is not yet implemented.
+
+
+## Examples
+* [Page and PageManager](https://codepen.io/dimatabu/full/opGPoQ) - simple application with pages.
+* [sort CollectionView by drag'n'drop](https://codepen.io/dimatabu/pen/JMaZXP)
diff --git a/coms/asyncAwaiter.js b/coms/asyncAwaiter.js
deleted file mode 100644
index 9795130..0000000
--- a/coms/asyncAwaiter.js
+++ /dev/null
@@ -1,51 +0,0 @@
-import BaseClass from './baseClass';
-
-const AsyncAwaiter = BaseClass.extend({
- constructor(err, val) {
- this.set(err, val);
- },
- isError() {
- return this.error != null;
- },
- hasValue() {
- return !!this.value;
- },
- errOrVal() {
- return this.err() || this.val();
- },
- isEmpty() {
- return this.val() == null && this.err() == null;
- },
- isOk() {
- return !this.isError();
- },
- err() {
- return this.error;
- },
- val() {
- return this.value;
- },
- setValue(value) {
- this.value = value;
- },
- setError(err) {
- this.error = err;
- },
- set() {
- let arr = [];
- if (arguments.length == 2) {
- arr = arguments;
- } else if (arguments.length == 1 && Array.isArray(arguments[0])) {
- arr = arguments[0];
- }
- this.setError(arr[0]);
- this.setValue(arr[1]);
- }
-});
-
-AsyncAwaiter.create = (error, data) => new AsyncAwaiter(error, data);
-AsyncAwaiter.success = data => AsyncAwaiter.create(null, data);
-AsyncAwaiter.fail = err => AsyncAwaiter.create(err, null);
-
-
-export default AsyncAwaiter;
diff --git a/coms/baseClass.js b/coms/baseClass.js
deleted file mode 100644
index 9b09783..0000000
--- a/coms/baseClass.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import extend from '../utils/extend';
-
-const BaseClass = function() {};
-BaseClass.extend = extend;
-
-export default BaseClass;
diff --git a/coms/controls/control.js b/coms/controls/control.js
deleted file mode 100644
index 8291aab..0000000
--- a/coms/controls/control.js
+++ /dev/null
@@ -1,132 +0,0 @@
-import _ from 'underscore';
-import { MnObject } from '../../vendors';
-import { awaiter } from '../../utils/async-utils';
-
-const BaseControl = MnObject;
-const Control = BaseControl.extend({
- constructor(options) {
- BaseControl.apply(this, arguments);
- this._children = [];
- this.mergeOptions(options, ['value', 'initialValue', 'resetValue']);
- if (!this.hasOwnProperty('initialValue')) {
- this.initialValue = this.value;
- }
- },
-
-
- //#region SET/GET value
-
- getValue(options = {}) {
- if (options.type == 'initial') {
- return this.initialValue;
- } else if (options.type == 'reset') {
- return this.resetValue;
- }
- return this.value;
- },
-
- async setValue(value, options = {}) {
- let nextValue;
- if (options.merge) {
- let curValue = _.isObject(this.value) ? this.value : {};
- nextValue = _.extend({}, curValue, value);
- } else {
- nextValue = _.clone(value);
- }
- let validateResult = await this.validateValueAsync(nextValue);
- if (!validateResult.isEmpty()) {
- let err = validateResult.errOrVal();
- this.setErrors(err);
- return Promise.reject(err);
- } else {
- this.setErrors(null);
- }
- this._prevValue = this.value;
- this.value = nextValue;
-
- let eventName = options.changeEvent || 'change';
- this.triggerMethod(eventName, nextValue);
-
- },
-
- async mergeValue(value, options = {}) {
- options.merge = true;
- return await this.setValue(value, options);
- },
-
- async setKeyValue(key, value, options) {
- let mergeValue = { [key]: value };
- return await this.mergeValue(mergeValue, options);
- },
-
- //#endregion
-
- //#region validation
-
- validateValue(value, options) {
- let validate = this.getOption('validate', { force: false });
- if (_.isFunction(validate)) {
- return validate(value, options);
- } else if (validate) {
- return validate;
- }
- },
-
- validateValueAsync(value, options) {
- return awaiter(this.validateValue(value, options));
- },
-
- //#endregion
-
- //#region Children
-
- addChildControl(control, options) {
- let item = _.extend({}, options, { control });
- this._children.push(item);
- this.listenTo(control, {
- 'change': (value) => this._onChildControlChange(item, 'change', value),
- 'done': (value) => this._onChildControlChange(item, 'done', value),
- 'invalid': errors => this._onChildControlInvalid(item, errors),
- });
- },
-
- hasChildren() {
- return this._children && !!this._children.length;
- },
-
- _onChildControlChange(controlContext, changeType, value) {
- if (controlContext.key) {
- return this.setKeyValue(controlContext.key, value);
- } else {
- let options;
- if (controlContext.wrapper && changeType == 'done') {
- options.changeEvent = 'done';
- }
- return this.mergeValue(value, options);
- }
- },
-
- _onChildControlInvalid(controlContext, errors) {
- this.setErrors(errors);
- },
-
- //#endregion
-
- setErrors(errors) {
-
- this.errors = errors;
-
- if (this.isValid()) {
- this.triggerMethod('valid');
- } else {
- this.triggerMethod('invalid', errors);
- }
- },
-
- isValid() {
- return this.errors == null;
- },
-
-});
-
-export default Control;
diff --git a/coms/controls/controlView-mixin.js b/coms/controls/controlView-mixin.js
deleted file mode 100644
index 20e7837..0000000
--- a/coms/controls/controlView-mixin.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import Control from './control';
-export default Base => Base.extend({
- shouldInitializeControl: true,
- constructor() {
- Base.apply(this, arguments);
- if (this.getOption('shouldInitializeControl')) {
- this.initializeControl();
- }
- },
- initializeControl() {
- if (this._control) return;
- let options = this._getControlOptions();
- let control = this._control = new Control(options);
- let parentControl = this.getOption('parentControl');
- if (parentControl) {
- let key = this.getOption('controlValueKey');
- let wrapper = !key;
- let childOptions = { key, wrapper };
- parentControl.addChildControl(control, childOptions);
- }
- this.listenTo(control, {
- 'change': (...args) => this.triggerMethod('control:change', ...args),
- 'done': (...args) => this.triggerMethod('control:done', ...args),
- 'valid': (...args) => this.triggerMethod('control:valid', ...args),
- 'invalid': (...args) => this.triggerMethod('control:invalid', ...args),
- });
- },
- _getControlOptions() {
- let options = this.getOptions(['value', 'initialValue', 'resetValue']);
- return options;
- },
-});
diff --git a/coms/lifecycle/coreLifecycle.js b/coms/lifecycle/coreLifecycle.js
deleted file mode 100644
index ed41989..0000000
--- a/coms/lifecycle/coreLifecycle.js
+++ /dev/null
@@ -1,76 +0,0 @@
-import _ from 'underscore';
-import { triggerMethodOn } from '../../utils/events-utils';
-import { awaiter } from '../../utils/async-utils';
-import AsyncAwaiter from '../asyncAwaiter';
-
-import YatObject from '../yatObject';
-
-const Lifecycle = YatObject.extend({
- constructor(options) {
- YatObject.apply(this, arguments);
- this._isIddle = true;
- this.mergeOptions(options, ['context', 'name', 'canNotBeStarted']);
- if (!this.name) {
- this.name = _.uniqueId('lf');
- }
- },
- async start(options) {
- this._isIddle = false;
-
- await this.broadcast('begin', options);
-
- let error = await this._isNotAwailable();
- if (await this._tryCompleteWithError(error.err() || error.val(), options)) {
- return;
- }
-
- let result = await this.broadcast('before', options);
- if (await this._tryCompleteWithError(result, options)) {
- return;
- }
-
- this._complete();
- await this.broadcast('', options);
- return true;
- },
-
- async _tryCompleteWithError(err, options) {
- let sendErr = err instanceof AsyncAwaiter ? err.err() : err;
- if (!sendErr) return;
-
- await this.broadcast('error', sendErr, options);
- await this._complete(options);
- return true;
- },
-
- async _complete(options) {
- this._isIddle = true;
- return await this.broadcast('end', options);
- },
-
- _isNotAwailable() {
- return awaiter(this.getOption('isNotAvailable'));
- },
-
- async broadcast(prefix, ...args) {
- let selfEvent = prefix || 'done';
- let result = await awaiter(this.triggerMethod(selfEvent, ...args));
- if (this.context) {
- prefix && (prefix += ':');
- let eventName = prefix + this.name;
- return await awaiter(triggerMethodOn(this.context, eventName, ...args));
- }
- return result;
- },
- destroy() {
- if (this._isDestroying || this._isDestroyed) return;
- this._isDestroying = true;
- _.each(_.keys(this), key => delete this[key]);
- this._isDestroyed = true;
- },
- isDestroyed() {
- return this._isDestroyed === true;
- },
-});
-
-export default Lifecycle;
diff --git a/coms/lifecycle/index.js b/coms/lifecycle/index.js
deleted file mode 100644
index df1224b..0000000
--- a/coms/lifecycle/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export {default as CoreLifecycle} from './coreLifecycle';
-export {default as Lifecycle} from './lifecycle';
diff --git a/coms/lifecycle/lifecycle.js b/coms/lifecycle/lifecycle.js
deleted file mode 100644
index 3a4041a..0000000
--- a/coms/lifecycle/lifecycle.js
+++ /dev/null
@@ -1,40 +0,0 @@
-//import _ from 'underscore';
-import Lifecycle from './coreLifecycle';
-
-export default Lifecycle.extend({
- stateKey() {
- return (this.getOption('name') || 'lifecycle') + '-state';
- },
- statesMap: {
- initial: 'init',
- begin: 'running',
- done: 'done',
- error: 'error',
- },
- constructor(options) {
- Lifecycle.apply(this, arguments);
- this.mergeOptions(options, ['stateModel']);
-
-
- if (this.stateModel) {
-
- this._setMapState('initial');
-
- this.on({
- 'begin': () => this._setMapState('begin'),
- 'done': () => this._setMapState('done'),
- 'error': () => this._setMapState('error'),
- });
- }
-
- },
- _setMapState(key) {
- let map = this.getOption('statesMap') || {};
- this.setState(map[key]);
- },
- setState(val) {
- if (!this.stateModel) return;
- let key = this.getOption('stateKey');
- this.stateModel.state(key, val);
- },
-});
diff --git a/coms/startable/index.js b/coms/startable/index.js
deleted file mode 100644
index b6dcfd6..0000000
--- a/coms/startable/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export {default as StartLifecycle} from './startLifecycle';
-export {default as startableMixin} from './startable-mixin';
diff --git a/coms/startable/startLifecycle.js b/coms/startable/startLifecycle.js
deleted file mode 100644
index 96166fb..0000000
--- a/coms/startable/startLifecycle.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import { Lifecycle } from '../lifecycle';
-export default Lifecycle.extend({
- name: 'start',
- statesMap: {
- initial: 'init',
- begin: 'running',
- done: 'started',
- error: 'error',
- }
-});
diff --git a/coms/startable/startable-mixin.js b/coms/startable/startable-mixin.js
deleted file mode 100644
index 2e25dab..0000000
--- a/coms/startable/startable-mixin.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import StartLifecycle from './startLifecycle';
-import StateModel from '../stateModel/model';
-import { awaiter } from '../../utils/async-utils';
-
-export default Base => Base.extend({
- startStateKey: 'start-state',
- constructor() {
- Base.apply(this, arguments);
- if (!this.stateModel) {
- this.stateModel = new StateModel();
- }
- this._startable = new StartLifecycle({ context: this, stateModel: this.stateModel });
- this.once('destroy', () => {
- this._startable.destroy();
- });
- },
- start(...args) {
- return this._startable.start(...args);
- },
- startAsync() {
- return awaiter(this.start(...arguments));
- },
- stop(...args) {
- this.triggerMethod('before:stop', ...args);
- let key = this.getOption('startStateKey');
- this.stateModel.state(key, 'stopped');
- this.triggerMethod('stop', ...args);
- },
- isStarted() {
- let key = this.getOption('startStateKey');
- let state = this.stateModel.state(key);
- return state == 'started';
- }
-});
diff --git a/coms/stateModel/model.js b/coms/stateModel/model.js
deleted file mode 100644
index c944f8a..0000000
--- a/coms/stateModel/model.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import _ from 'underscore';
-import { Model } from '../../vendors';
-
-const toStateValue = function(name, value) {
- if (value === true) {
- return name;
- } else if (value) {
- return value;
- }
-}
-
-const StateModel = Model.extend({
- toggle(key) {
- let current = this.get(key);
- this.state(key, !current);
- },
- enable(key) {
- this.state(key, true);
- },
- disable(key) {
- this.state(key, false);
- },
- prevState(key) {
- return this.state('.' + key);
- },
- state(key, newvalue) {
- if (arguments.length == 1) {
- let val = this.get(key);
- return val;
- } else if (arguments.length == 2) {
- let prev = this.get(key);
- this.set({
- ['.' + key]: prev,
- [key]: newvalue
- });
- }
- },
- hasValue(key, strict) {
- if (strict) {
- return this.get(key) != null;
- } else {
- return !!this.get(key);
- }
- },
- toStateValue(key, value) {
- if (arguments.length == 1) {
- value = this.state(key);
- }
- return toStateValue(key, value);
- },
- find({ predicate, stateValues = false, onlyValued = true } = {}) {
- if (!predicate && onlyValued) {
- predicate = key => this.hasValue(key);
- }
- return _.reduce(this.attributes, (memo, value, key) => {
- if (key[0] === '.') return memo;
- if (!predicate || predicate(key, value)) {
- memo[key] = stateValues ? this.toStateValue(key, value) : value;
- }
- return memo;
- }, {});
- },
- toString(options = {}) {
- options.stateValues = true;
- let founded = this.find(options);
- let vals = _.map(founded, (value) => value);
- return vals.join(options.delimeter || ' ');
- }
-});
-
-export default StateModel;
diff --git a/coms/yatApplication.js b/coms/yatApplication.js
deleted file mode 100644
index 176e729..0000000
--- a/coms/yatApplication.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import _ from 'underscore';
-import { Application } from '../vendors';
-import mix from '../utils/mix';
-import commonMixin from '../mixins/commonMixin';
-import startableMixin from './startable/startable-mixin';
-import routingConfig from '../routing/config';
-import Backbone from 'backbone';
-
-const YatApplication = mix(Application).with(commonMixin, startableMixin);
-
-export default YatApplication.extend({
- resolveStartPromises() {
- let promises = this._startPromises || [];
- let proms = this.getOption('startPromises') || [];
- if (!_.isArray(promises)) {
- promises = [promises];
- }
- promises.push(...proms);
-
- promises = _.map(promises, prom => {
- if (_.isFunction(prom)) {
- return prom();
- } else {
- return prom;
- }
- });
-
- return Promise.all(promises);
- },
-
- onBeforeStart() {
- return this.resolveStartPromises();
- },
-
- addStartPromise(...args) {
- !this._startPromises && (this._startPromises = []);
- this._startPromises.push(...args);
- },
-
- //adds promise to startPromises and sets resolve and reject handlers
- waitFor(promise, onResolve, onReject) {
- promise.then(onResolve, onReject)
- return this.addStartPromise(promise);
- },
- createHistory(options = {}) {
- if (this.history) return;
- let History = this.getOption('History') || options.History;
- let history = this.getOption('history') || options.history || routingConfig.history || Backbone.history;
- routingConfig.history = History
- ? new History()
- : history;
- this.history = Backbone.history = routingConfig.history;
- },
-
- startHistory(options = {}) {
- _.defaults(options, { pushState: this.pushState });
- this.createHistory(options);
-
- this._bindRoutingEvents();
-
- let opts = _.omit(options, 'History', 'history');
- this.history.start(opts);
- },
- stopHistory() {
- this.history.stop();
- this._unbindRoutingEvents();
- },
-
- _bindRoutingEvents() {
- if (this._routingEventsInitialized) return;
- let routingEvents = this.getOption('routingEvents');
- this.bindEvents(this.history, routingEvents);
- },
- _unbindRoutingEvents() {
- this._routingEventsInitialized = false;
- this.off(this.history);
- },
-
- getCurrentPageRequest() {
- return this.currentPageRequest;
- },
- getCurrentPage() {
- let req = this.getCurrentPageRequest();
- return req && req.page;
- },
- setCurrentPageRequest(req, { shouldStopCurrentPage } = {}) {
- if (shouldStopCurrentPage) {
- this.stopCurrentPage();
- }
- this.currentPageRequest = req;
- },
- stopCurrentPage() {
- let page = this.getCurrentPage();
- page && page.stop();
- },
-
-});
diff --git a/coms/yatContext.js b/coms/yatContext.js
deleted file mode 100644
index 2426747..0000000
--- a/coms/yatContext.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import BaseClass from './baseClass';
-import { Events } from 'backbone';
-import mix from '../utils/mix';
-
-const YatContext = mix(BaseClass).with(Events, {
- constructor() {
- this._store = {};
- },
- get(key) {
- return this._store[key];
- },
- set(key, value) {
- this._store[key] = value;
- this.trigger('change:' + key, value);
- },
-});
-
-export default YatContext;
diff --git a/coms/yatObject.js b/coms/yatObject.js
deleted file mode 100644
index fee3df5..0000000
--- a/coms/yatObject.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import { MnObject } from 'backbone.marionette';
-import mix from '../utils/mix';
-import commonMixin from '../mixins/commonMixin';
-
-export default mix(MnObject).with(commonMixin);
diff --git a/dist/marionette.yat.esm.js b/dist/marionette.yat.esm.js
new file mode 100644
index 0000000..d08c33a
--- /dev/null
+++ b/dist/marionette.yat.esm.js
@@ -0,0 +1,3193 @@
+/**
+* @license
+* Marionette.Yat extension for Backbone.Marionette
+* Yet Another Toolkit
+* ----------------------------------
+* v0.0.32
+*
+* Distributed under MIT license
+* author: dimtabu
+*/
+
+
+import Bb from 'backbone';
+import Mn from 'backbone.marionette';
+import _ from 'underscore';
+import $$1 from 'jquery';
+
+var version = "0.0.32";
+
+var getCompareABModel = function getCompareABModel(arg) {
+ if (arg instanceof Bb.Model) return arg;else if (arg instanceof Mn.View) return arg.model;else return;
+};
+var getCompareABView = function getCompareABView(arg) {
+ if (arg instanceof Bb.View) return arg;else return;
+};
+
+var compareAB = function compareAB(a, b, func) {
+ if (typeof func === 'function') {
+ a = func.call(a, getCompareABModel(a), getCompareABView(a));
+ b = func.call(b, getCompareABModel(b), getCompareABView(b));
+ }
+ return a < b ? -1 : a > b ? 1 : 0;
+};
+
+/*
+* accepts:
+* variant #1: a, b, function
+* variant #2: [[a,b,function], [a,b,function]]
+* function can be undefined
+* example:
+* ascending : return viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });
+* descending : return viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });
+ multiple compares: return viewComparator([[viewB, viewA, func], [viewB, viewA, func]])
+*/
+var viewComparator = function viewComparator() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var compareArray = [];
+ var result = 0;
+
+ if (args.length >= 2) // single compare
+ return compareAB.apply(null, args);else if (args.length === 1 && args[0] instanceof Array) // array of compare
+ compareArray = args[0];
+
+ _(compareArray).every(function (singleCompare) {
+ result = compareAB.apply(null, singleCompare);
+ return result === 0;
+ });
+
+ return result;
+};
+
+var view = { compareAB: compareAB, viewComparator: viewComparator };
+
+function normalizeValue(context, value, args) {
+ if (_.isFunction(value)) value = value.apply(context, args || []);
+ return value;
+}
+
+function smartGet(context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (opts.fields == null || opts.fileds && !opts.fileds.length) throw new Error('fields option missing');
+
+ opts.checked || (opts.checked = {});
+
+ if (context == null) return;
+
+ var value = void 0;
+ var isModel = context instanceof Bb.Model;
+ var hasOptions = _.isObject(context.options);
+ var exclude = opts.exclude instanceof Array ? opts.exclude : typeof opts.exclude === 'string' ? [opts.exclude] : [];
+
+ _(opts.fields).some(function (fieldName) {
+ if (fieldName in opts.checked) return;
+ opts.checked[fieldName] = true;
+
+ if (exclude.indexOf(fieldName) >= 0) {
+ return;
+ }
+
+ if (isModel && value == null) value = normalizeValue(context, context.get(fieldName), opts.args);
+
+ if (value == null) value = normalizeValue(context, context[fieldName], opts.args);
+
+ if (value == null && hasOptions) value = normalizeValue(context, context.options[fieldName], opts.args);
+
+ return value != null;
+ });
+
+ return value == null ? opts.default : value;
+}
+
+var getLabel = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+var getName = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+var getValue = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+function cid (prefix, value) {
+ var delimeter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ':';
+
+ prefix || (prefix = '');
+ value = value == null ? '' : value.toString();
+ return prefix + delimeter + value;
+}
+
+function unwrap (value, prefix) {
+ var delimeter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ":";
+
+
+ if (value == null) return;
+ value = value.toString();
+ prefix || (prefix = '');
+ if (!value.length) return value;
+
+ var pattern = new RegExp('^' + prefix + delimeter);
+ return value.replace(pattern, '');
+}
+
+function getProperty(context, name) {
+ if (context == null || !_.isObject(context) || name == null || name == '') return;
+ if (context instanceof Bb.Model) return context.get(name);else return context[name];
+}
+
+function setProperty(context, name, value, options) {
+ if (context instanceof Bb.Model) {
+ context.set(name, value, { silent: true });
+ } else {
+ context[name] = value;
+ }
+
+ if (value instanceof Bb.Model) {
+ options.models.push({
+ path: options.passPath.join(':'),
+ property: name,
+ model: value
+ });
+ }
+
+ options.passPath.push(name);
+
+ return getProperty(context, name);
+}
+
+function setByPathArr(context, propertyName, pathArray, value, options) {
+
+ if (context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;
+
+ if (!pathArray.length) return setProperty(context, propertyName, value, options);
+
+ var prop = getProperty(context, propertyName);
+
+ if (!_.isObject(prop) && !options.force) return;else if (!_.isObject(prop) && options.force) prop = setProperty(context, propertyName, {}, options);
+
+ var nextName = pathArray.shift();
+
+ return setByPathArr(prop, nextName, pathArray, value, options);
+}
+
+var setByPath = function setByPath(context, path, value, opts) {
+
+ if (context == null || !_.isObject(context) || path == null || path == '') return;
+
+ var options = _.extend({}, opts);
+ options.silent = options.silent === true;
+ options.force = options.force !== false;
+
+ if (_.isObject(path) && !(path instanceof Array)) {
+ value = path.value;
+ options.force = path.force !== false;
+ options.silent = path.silent === true;
+ path = path.path;
+ }
+
+ options.path = path;
+ options.passPath = [];
+ options.models = [];
+
+ if (path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.') : path instanceof Array ? [].slice.call(path) : [path];
+
+ options.pathArray = [].slice.call(pathArray);
+
+ if (!pathArray.length) return;
+
+ var chunksCount = pathArray.length;
+ var prop = pathArray.shift();
+
+ if (context instanceof Bb.Model) {
+ options.models.push({
+ path: '',
+ property: prop,
+ model: context
+ });
+ }
+
+ var result = setByPathArr(context, prop, pathArray, value, options);
+
+ if (result === undefined && value !== undefined) return result;
+
+ //triggering change event on all met models
+ if (!options.silent) {
+ var originPath = options.pathArray.join(':');
+ while (options.models.length) {
+ var modelContext = options.models.pop();
+ var propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);
+ if (propertyEventName) {
+ modelContext.model.trigger('change:' + propertyEventName, value);
+ }
+ modelContext.model.trigger('change', modelContext.model);
+ }
+ }
+
+ return result;
+};
+
+function getByPathArray(context, propertyName, pathArray) {
+
+ if (context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;
+
+ var prop = getProperty(context, propertyName);
+
+ if (!pathArray.length || pathArray.length && prop == null) return prop;
+
+ var nextName = pathArray.shift();
+
+ return getByPathArray(prop, nextName, pathArray);
+}
+
+function getByPath(obj, path) {
+
+ if (obj == null || !_.isObject(obj) || path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.') : path instanceof Array ? [].slice.call(path) : [path];
+
+ var prop = pathArray.shift();
+
+ return getByPathArray(obj, prop, pathArray);
+}
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+function traverse(fields, root) {
+ root = root || '';
+ if (this == null || _typeof(this) != 'object') return;
+
+ var hash = this instanceof Bb.Model ? this.attributes : this;
+ var props = Object.getOwnPropertyNames(hash);
+ for (var x = 0; x < props.length; x++) {
+ var name = props[x];
+ var prop = this[name];
+
+ if (prop == null || (typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) != 'object' || prop instanceof Date || prop instanceof Array) fields[root + name] = prop;else if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) == 'object') traverse.call(prop, fields, root + name + '.');
+ }
+}
+
+function flattenObject(obj) {
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ traverse.call(obj, res);
+ return res;
+}
+
+function unFlattenObject(obj) {
+
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ for (var e in obj) {
+ setByPath(res, e, obj[e], true);
+ }
+ return res;
+}
+
+var isView = (function (arg) {
+ return arg instanceof Bb.View;
+});
+
+var __ = {
+ getLabel: getLabel, getName: getName, getValue: getValue, wrap: cid, unwrap: unwrap, setByPath: setByPath, getByPath: getByPath, flattenObject: flattenObject, unFlattenObject: unFlattenObject, isView: isView
+};
+
+var Functions = { view: view, common: __ };
+
+var knownCtors = [Bb.Model, Bb.Collection, Bb.View, Bb.Router, Mn.Object];
+
+function isKnownCtor(arg) {
+ var isFn = _.isFunction(arg);
+ var result = _(knownCtors).some(function (ctor) {
+ return arg === ctor || arg.prototype instanceof ctor;
+ });
+ return isFn && result;
+}
+
+var YatError = Mn.Error.extend({}, {
+ Http400: function Http400(message) {
+ return this.Http(400, message);
+ },
+ Http401: function Http401(message) {
+ return this.Http(401, message);
+ },
+ Http403: function Http403(message) {
+ return this.Http(403, message);
+ },
+ Http404: function Http404(message) {
+ return this.Http(404, message);
+ },
+ Http500: function Http500(message) {
+ return this.Http(500, message);
+ },
+ Http: function Http(status, message) {
+ var error = new this({ message: message, name: "HttpError" });
+ error.status = status;
+ return error;
+ },
+ HttpRedirect: function HttpRedirect(message) {
+ return this.Http(301, message);
+ },
+ NotFound: function NotFound(message) {
+ return this.Http404(message);
+ },
+ NotAuthorized: function NotAuthorized(message) {
+ return this.Http401(message);
+ },
+ Forbidden: function Forbidden(message) {
+ return this.Http403(message);
+ }
+});
+
+function smartExtend(Src, Dst) {
+ if (_.isFunction(Dst)) {
+ return Dst(Src);
+ } else if (_.isObject(Dst)) {
+ return Src.extend(Dst);
+ } else throw new YatError('Mixin fail, argument should be an object hash or mixin function');
+}
+
+function mix(BaseClass) {
+ var Mixed = null;
+ if (_.isFunction(BaseClass)) {
+ Mixed = BaseClass;
+ } else if (_.isObject(BaseClass) && BaseClass !== null) {
+ var tmp = function tmp() {};
+ tmp.extend = Mn.extend;
+ Mixed = tmp.extend(BaseClass);
+ } else {
+ throw new Error('argument should be an object or class definition');
+ }
+ if (!Mixed.extend) {
+ Mixed = Mn.extend.call(BaseClass, {});
+ Mixed.extend = Mn.extend;
+ }
+ var fake = {
+ with: function _with() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return _.reduce(args, function (memo, arg) {
+ return smartExtend(memo, arg);
+ }, Mixed);
+ },
+ class: Mixed
+ };
+ return fake;
+}
+
+var Helpers = {
+ isKnownCtor: isKnownCtor,
+ mix: mix
+};
+
+function GetNameLabel (Base) {
+ return Base.extend({
+ getName: function getName() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getName';
+ options.args = [options];
+ return __.getName(this, options);
+ },
+ getLabel: function getLabel() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getLabel';
+ options.args = [options];
+ return __.getLabel(this, options);
+ },
+ getValue: function getValue() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getValue';
+ options.args = [options];
+ return __.getValue(this, options);
+ }
+ });
+}
+
+var GetOptionProperty = (function (Base) {
+ var Mixin = Base.extend({
+ //property first approach
+ getProperty: function getProperty(key, options) {
+ return this._getOptionOrProperty(this, key, options, this.getOption);
+ },
+
+ //options first approach
+ getOption: function getOption(key, options) {
+ return this._getOptionOrProperty(this.getProperty('options', { deep: false }), key, options, this.getProperty);
+ },
+ _getOptionOrProperty: function _getOptionOrProperty(valueContext, key) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var fallback = arguments[3];
+
+ options.deep !== undefined || (options.deep = true);
+ options.force !== undefined || (options.force = true);
+ options.args || (options.args = []);
+
+ //key and valueContext should be passed
+ if (key == null || valueContext == null) return;
+
+ //getting raw value
+ var value = valueContext[key];
+
+ //if there is no raw value and deep option is true then getting value from fallback
+ if (value === undefined && options.deep && _.isFunction(fallback)) {
+ var fallbackOptions = _.extend({}, options, { deep: false, force: false });
+ value = fallback.call(this, key, fallbackOptions);
+ }
+
+ //if returned value is function and is not any of known constructors and options property force set to true
+ //we should return value of that function
+ //options.args will be passed as arguments
+ if (_.isFunction(value) && options.force && !isKnownCtor(value)) value = value.apply(this, options.args || []);
+
+ //console.log('key', key, value);
+
+ //if value is still undefined we will return default option value
+ return value === undefined ? options.default : value;
+ }
+ });
+ return Mixin;
+});
+
+var RadioMixin = (function (Base) {
+ var Mixin = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ var initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);
+ this._initRadio({ skip: initRadioOnInitialize });
+ },
+ getChannel: function getChannel() {
+ if (!this._channel) this._initRadio({ skip: false });
+ return this._channel;
+ },
+ _initRadio: function _initRadio() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { skip: true };
+
+ if (opts.skip == true) return;
+
+ var channelName = this.getProperty('channelName');
+ if (!channelName) {
+ var channel = this.getProperty('channel');
+ if (channel) this.channelName = channel.channelName;
+ }
+ Mn.Object.prototype._initRadio.call(this);
+ },
+ radioRequest: function radioRequest() {
+ var channel = this.getChannel();
+ if (channel) channel.request.apply(channel, arguments);
+ },
+ radioTrigger: function radioTrigger() {
+ var channel = this.getChannel();
+ if (channel) channel.trigger.apply(channel, arguments);
+ }
+ });
+
+ return Mixin;
+});
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var Stateable = (function (BaseClass) {
+ var Mixin = BaseClass.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ BaseClass.apply(this, args);
+ this.initializeStateable();
+ },
+ initializeStateable: function initializeStateable() {
+ this._state = {};
+ },
+ getState: function getState(key) {
+ var state = this._state;
+ if (!key) return state;else return state[key];
+ },
+ setState: function setState(key, value, options) {
+
+ if (key == null) return;
+
+ if (_.isObject(key)) {
+ var _this = this;
+ options = value;
+ value = key;
+ _(value).each(function (propertyValue, propertyName) {
+ return _this.setState(propertyName, propertyValue, _.extend({}, options, { doNotTriggerFullState: true }));
+ });
+ this._triggerStateChange(value, options);
+ } else {
+ var state = this.getState();
+ state[key] = value;
+ this._triggerStateChange(key, value, options);
+ }
+ },
+ clearState: function clearState() {
+ var state = this.getState();
+ var broadcast = _.extend({}, state);
+ _(state).each(function (s, key) {
+ broadcast[key] = undefined;
+ delete state[key];
+ });
+ this._triggerStateChange(broadcast);
+ },
+ _triggerStateChange: function _triggerStateChange(key, value, options) {
+
+ if (!_.isFunction(this.triggerMethod)) return;
+
+ if (!_.isObject(key)) {
+ this.triggerMethod('state:' + key, value, options);
+ if (value === true || value === false || !!value && typeof value === 'string') this.triggerMethod('state:' + key + ':' + value.toString(), options);
+ if (!options || options && !options.doNotTriggerFullState) {
+ this.triggerMethod('state', _defineProperty({}, key, value), options);
+ }
+ } else {
+ //key is a hash of states
+ //value is options
+ options = value;
+ value = key;
+ this.triggerMethod('state', value, options);
+ }
+ }
+ });
+ Mixin.Stateable = true;
+
+ return Mixin;
+});
+
+var STATES = {
+ INITIALIZED: 'initialized',
+ STARTING: 'starting',
+ RUNNING: 'running',
+ STOPPING: 'stopping',
+ WAITING: 'waiting',
+ DESTROYED: 'destroyed'
+};
+
+var STATE_KEY = 'life';
+
+function getPropertyPromise(context, propertyName) {
+ var _this2 = this;
+
+ if (context == null || propertyName == null) return Promise.resolve();
+
+ var _promises1 = context['_' + propertyName] || [];
+ var _promises2 = _.result(context, propertyName) || [];
+
+ var rawPromises = _promises1.concat(_promises2);
+ //context[propertyName] || [];
+
+ var promises = [];
+ _(rawPromises).each(function (promiseArg) {
+ if (_.isFunction(promiseArg)) promises.push(promiseArg.call(_this2));else if (promiseArg != null) promises.push(promiseArg);
+ });
+ return Promise.all(promises);
+}
+
+function addPropertyPromise(context, propertyName, promise) {
+ context[propertyName] || (context[propertyName] = []);
+ var promises = context[propertyName];
+ promises.push(promise);
+}
+
+var Startable = (function (Base) {
+ var Middle = mix(Base).with(Stateable);
+ var Mixin = Middle.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Middle.apply(this, args);
+ this.initializeStartable();
+ },
+
+
+ freezeWhileStarting: false,
+ freezeUI: function freezeUI() {},
+ unFreezeUI: function unFreezeUI() {},
+ isStartNotAllowed: function isStartNotAllowed() {},
+ isStopNotAllowed: function isStopNotAllowed() {},
+ addStartPromise: function addStartPromise(promise) {
+ addPropertyPromise(this, '_startRuntimePromises', promise);
+ },
+ addStopPromise: function addStopPromise(promise) {
+ addPropertyPromise(this, '_stopPromises', promise);
+ },
+ initializeStartable: function initializeStartable() {
+
+ if (!(this.constructor.Startable && this.constructor.Stateable)) return;
+
+ this._registerStartableLifecycleListeners();
+ this._setLifeState(STATES.INITIALIZED);
+ this._startRuntimePromises = [];
+ this._startPromises = [];
+ this._stopPromises = [];
+ },
+ start: function start() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ var options = args[0];
+ /*
+ let canNotBeStarted = this._ensureStartableCanBeStarted();
+ let resultPromise = null;
+ let catchMethod = null;
+ if(canNotBeStarted){
+ catchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);
+ //resultPromise = Promise.reject(canNotBeStarted);
+ }
+ if(resultPromise == null){
+ let declineReason = this.isStartNotAllowed(options);
+ if(declineReason) {
+ catchMethod = () => this.triggerMethod('start:decline',declineReason);
+ resultPromise = Promise.reject(declineReason);
+ }
+ }
+ if(resultPromise == null){
+ var currentState = this._getLifeState();
+ this._tryMergeStartOptions(options);
+ this.triggerMethod('before:start', ...args);
+ resultPromise = this._getStartPromise();
+ }
+ */
+
+ // return resultPromise.then(() => {
+ // this.triggerStart(options)
+ // }, (error) => {
+ // this._setLifeState(currentState);
+ // if(catchMethod) catchMethod();
+ // return Promise.reject(error);
+ // });
+ var _this = this;
+ var promise = new Promise(function (resolve, reject) {
+ var canNotBeStarted = _this._ensureStartableCanBeStarted();
+
+ if (canNotBeStarted) {
+ _this.triggerMethod('start:decline', canNotBeStarted);
+ reject(canNotBeStarted);
+ return;
+ }
+
+ var declineReason = _this.isStartNotAllowed(options);
+ if (declineReason) {
+ _this.triggerMethod('start:decline', declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ _this.triggerMethod.apply(_this, ['before:start'].concat(args));
+ var currentState = _this._getLifeState();
+ var dependedOn = _this._getStartPromise();
+ dependedOn.then(function () {
+ _this._tryMergeStartOptions(options);
+ _this.once('start', function () {
+ return resolve.apply(undefined, arguments);
+ });
+ _this.triggerStart(options);
+ }, function () {
+ _this._setLifeState(currentState);
+ reject.apply(undefined, arguments);
+ });
+ });
+ return promise;
+ },
+ triggerStart: function triggerStart(options) {
+ this.triggerMethod('start', options);
+ },
+ stop: function stop() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ var options = args[0];
+ /*
+ let canNotBeStopped = this._ensureStartableCanBeStopped();
+ if(canNotBeStopped){
+ this.triggerMethod('stop:decline',canNotBeStopped);
+ return Promise.reject(canNotBeStopped);
+ }
+ let declineReason = this.isStopNotAllowed(options);
+ if(declineReason){
+ this.triggerMethod('stop:decline', declineReason);
+ return Promise.reject(declineReason);
+ }
+
+ var currentState = this._getLifeState();
+ this._tryMergeStopOptions(options);
+ this.triggerMethod('before:stop', this, options);
+ let promise = this._getStopPromise();
+ return promise.then(() => {
+ this.triggerStop(options)
+ }, () => {
+ this._setLifeState(currentState);
+ });
+ */
+
+ var _this = this;
+ var promise = new Promise(function (resolve, reject) {
+ var canNotBeStopped = _this._ensureStartableCanBeStopped();
+
+ if (canNotBeStopped) {
+ _this.triggerMethod('stop:decline', canNotBeStopped);
+ reject(canNotBeStopped);
+ return;
+ }
+
+ var declineReason = _this.isStopNotAllowed(options);
+ if (declineReason) {
+ _this.triggerMethod('stop:decline', declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ var currentState = _this._getLifeState();
+ var dependedOn = _this._getStopPromise();
+ _this.triggerMethod.apply(_this, ['before:stop'].concat(args));
+ dependedOn.then(function () {
+ _this._tryMergeStopOptions(options);
+ _this.once('stop', function () {
+ return resolve.apply(undefined, arguments);
+ });
+ _this.triggerStop(options);
+ }, function () {
+ _this._setLifeState(currentState);
+ reject.apply(undefined, arguments);
+ });
+ });
+ return promise;
+ },
+ triggerStop: function triggerStop(options) {
+ this.triggerMethod('stop', options);
+ },
+
+
+ //lifecycle state helpers
+ _setLifeState: function _setLifeState(newstate) {
+ this.setState(STATE_KEY, newstate);
+ },
+ _getLifeState: function _getLifeState() {
+ return this.getState(STATE_KEY);
+ },
+ _isLifeState: function _isLifeState(state) {
+ return this._getLifeState() === state;
+ },
+ _isLifeStateIn: function _isLifeStateIn() {
+ var _this3 = this;
+
+ for (var _len4 = arguments.length, states = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ states[_key4] = arguments[_key4];
+ }
+
+ return _(states).some(function (state) {
+ return _this3._isLifeState(state);
+ });
+ },
+ _isInProcess: function _isInProcess() {
+ return this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);
+ },
+ _registerStartableLifecycleListeners: function _registerStartableLifecycleListeners() {
+ var _this4 = this;
+
+ var freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;
+ if (freezeWhileStarting && _.isFunction(this.freezeUI)) this.on('state:' + STATE_KEY + ':' + STATES.STARTING, function () {
+ _this4.freezeUI();
+ });
+ if (freezeWhileStarting && _.isFunction(this.unFreezeUI)) this.on('start', function () {
+ _this4.unFreezeUI();
+ });
+
+ this.on('before:start', function () {
+ return _this4._setLifeState(STATES.STARTING);
+ });
+ this.on('start', function () {
+ return _this4._setLifeState(STATES.RUNNING);
+ });
+ this.on('before:stop', function () {
+ return _this4._setLifeState(STATES.STOPPING);
+ });
+ this.on('stop', function () {
+ return _this4._setLifeState(STATES.WAITING);
+ });
+ this.on('destroy', function () {
+ return _this4._setLifeState(STATES.DESTROYED);
+ });
+ },
+ _tryMergeStartOptions: function _tryMergeStartOptions(options) {
+ if (!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStartOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+ _tryMergeStopOptions: function _tryMergeStopOptions(options) {
+ if (!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStopOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+ _ensureStartableIsIntact: function _ensureStartableIsIntact() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+ var message = 'Startable has already been destroyed and cannot be used.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var destroyed = this._isLifeState(STATES.DESTROYED);
+ if (opts.throwError && destroyed) {
+ throw error;
+ } else if (destroyed) {
+ return error;
+ }
+ },
+ _ensureStartableIsIdle: function _ensureStartableIsIdle() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+ var message = 'Startable is not idle. current state: ' + this._getLifeState();
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var isNotIntact = this._ensureStartableIsIntact(opts);
+ var notIdle = this._isInProcess();
+ if (opts.throwError && notIdle) {
+ throw error;
+ } else if (isNotIntact) {
+ return isNotIntact;
+ } else if (notIdle) {
+ return error;
+ }
+ },
+ _ensureStartableCanBeStarted: function _ensureStartableCanBeStarted() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+
+ var message = 'Startable has already been started.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var notIdle = this._ensureStartableIsIdle(opts);
+ var allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;
+
+ if (!notIdle && allowStartWithoutStop) return;
+
+ var running = this._isLifeState(STATES.RUNNING);
+ if (opts.throwError && running) {
+ throw error;
+ } else if (notIdle) {
+ return notIdle;
+ } else if (running) {
+ return error;
+ }
+ },
+ _ensureStartableCanBeStopped: function _ensureStartableCanBeStopped() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+
+ var message = 'Startable should be in `running` state.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var notIdle = this._ensureStartableIsIdle(opts);
+
+ var allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;
+ if (!notIdle && allowStopWithoutStart) return;
+
+ var running = this._isLifeState(STATES.RUNNING);
+
+ if (opts.throwError && !running) {
+ throw error;
+ } else if (notIdle) {
+ return notIdle;
+ } else if (!running) {
+ return error;
+ }
+ },
+ _getStartPromise: function _getStartPromise() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ return Promise.all(this._getStartPromises(options));
+ },
+ _getStartPromises: function _getStartPromises() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var promises = [];
+ promises.push(this._getStartParentPromise());
+ promises.push(this._getStartPagePromise());
+ if (options.noruntime !== true) promises.push(this._getStartRuntimePromise());
+ return promises;
+ },
+ _getStartRuntimePromise: function _getStartRuntimePromise() {
+ return getPropertyPromise(this, 'startRuntimePromises');
+ },
+ _getStartPagePromise: function _getStartPagePromise() {
+ return getPropertyPromise(this, 'startPromises');
+ },
+ _getStartParentPromise: function _getStartParentPromise() {
+ var parent = _.result(this, 'getParent');
+ if (_.isObject(parent) && _.isFunction(parent._getStartPromise)) return parent._getStartPromise({ noruntime: true });
+ },
+ _getStopPromise: function _getStopPromise() {
+ return Promise.all(this._getStopPromises());
+ },
+ _getStopPromises: function _getStopPromises() {
+ var promises = [];
+ promises.push(this._getStopRuntimePromise());
+ return promises;
+ },
+ _getStopRuntimePromise: function _getStopRuntimePromise() {
+ return getPropertyPromise(this, 'stopPromises');
+ },
+ _getStopParentPromise: function _getStopParentPromise() {
+ var parent = _.result(this, 'getParent');
+ if (_.isObject(parent) && _.isFunction(parent._getStopPromise)) return parent._getStopPromise();
+ }
+ });
+
+ Mixin.Startable = true;
+
+ return Mixin;
+});
+
+var Childrenable = (function (Base) {
+
+ var CHILDREN_FIELD = '_children';
+
+ var Mixin = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ this.initializeChildrenable.apply(this, args);
+ },
+ initializeChildrenable: function initializeChildrenable() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this._initializeParrent(options);
+ this._initializeChildren(options);
+ },
+ hasChildren: function hasChildren() {
+ var children = this.getChildren();
+ return this[CHILDREN_FIELD].length > 0;
+ },
+ getChildren: function getChildren() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { startable: true };
+
+ var all = this[CHILDREN_FIELD] || [];
+ if (!opts.startable) {
+ return all;
+ } else {
+ return all.filter(function (c) {
+ return !c.getProperty('isStartNotAllowed');
+ });
+ }
+ },
+ hasParent: function hasParent() {
+ var parent = this.getParent();
+ return _.isObject(parent);
+ },
+ getParent: function getParent() {
+ return this.getProperty('parent', { deep: false });
+ },
+ _initializeChildren: function _initializeChildren() {
+ var _this = this;
+
+ var _children = this.getProperty('children');
+ var children = [];
+ _(_children).each(function (child) {
+
+ var childContext = _this._normalizeChildContext(child);
+ var initialized = _this._initializeChild(childContext);
+ if (initialized) children.push(initialized);
+ });
+ this[CHILDREN_FIELD] = children;
+ },
+ _initializeChild: function _initializeChild(childContext) {
+ if (childContext == null || !_.isFunction(childContext.Child)) return;
+
+ var Child = childContext.Child;
+ var opts = this._normalizeChildOptions(childContext);
+ return this.buildChild(Child, opts);
+ },
+ _normalizeChildContext: function _normalizeChildContext(child) {
+ var childContext = {};
+
+ if (_.isFunction(child) && child.Childrenable) {
+ _.extend(childContext, { Child: child });
+ } else if (_.isFunction(child)) {
+ childContext = this._normalizeChildContext(child.call(this));
+ } else if (_.isObject(child)) {
+ childContext = child;
+ }
+ return childContext;
+ },
+ _normalizeChildOptions: function _normalizeChildOptions(options) {
+ var opts = _.extend({}, options);
+ if (this.getOption('passToChildren') === true) {
+ _.extend(opts, this.options);
+ }
+ opts.parent = this;
+ delete opts.Child;
+ return this._buildChildOptions(opts);
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ return _.extend(def, this.getProperty('childOptions'));
+ },
+
+ buildChild: function buildChild(ChildClass, options) {
+ return new ChildClass(options);
+ },
+ _initializeParrent: function _initializeParrent(opts) {
+ if (this.parent == null && opts.parent != null) this.parent = opts.parent;
+ }
+ });
+
+ Mixin.Childrenable = true;
+
+ return Mixin;
+});
+
+var templateContextStore = [function (view) {
+ return {
+ _v: view,
+ _m: view.model || {},
+ _cid: function _cid(arg) {
+ return cid(view.cid, arg);
+ }
+ };
+}];
+var compiledContext = {}; //rethink how it can be used
+var hasChanges = false;
+
+function normalizeValue$1(value) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (_.isFunction(value)) return value.apply(undefined, args);else if (_.isObject(value)) return value;else return {};
+}
+
+var GlobalTemplateContext$1 = {
+ mix: function mix(viewTemplateContext) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ var global = this.get.apply(this, args);
+ return _.extend(global, viewTemplateContext);
+ },
+ get: function get() {
+ return this.compile.apply(this, arguments);
+ },
+ add: function add() {
+ var _this = this;
+
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ _(args).each(function (item) {
+ return _this.push(item);
+ });
+ },
+ compile: function compile() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ if (hasChanges) compiledContext = {};
+
+ var newcontext = {};
+
+ _(templateContextStore).each(function (cntx) {
+ if (_.isFunction(cntx)) _.extend(newcontext, normalizeValue$1.apply(undefined, [cntx].concat(args)));else if (hasChanges) {
+ _.extend(compiledContext, cntx);
+ }
+ });
+ if (!hasChanges) _.extend(newcontext, compiledContext);
+
+ hasChanges = false;
+ return newcontext;
+ },
+ pop: function pop() {
+ hasChanges = true;
+ return templateContextStore.pop();
+ },
+ shift: function shift() {
+ hasChanges = true;
+ return templateContextStore.shift();
+ },
+ push: function push(item) {
+ hasChanges = true;
+ templateContextStore.push(item);
+ },
+ unshift: function unshift(item) {
+ hasChanges = true;
+ templateContextStore.unshift(item);
+ },
+ clear: function clear() {
+ hasChanges = false;
+ compiledContext = {};
+ templateContextStore = [];
+ }
+};
+
+var GlobalTemplateContext = (function (Base) {
+ return Base.extend({
+ mixinTemplateContext: function mixinTemplateContext() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ var templateContext = GlobalTemplateContext$1.mix(_.result(this, 'templateContext'), this);
+
+ return _.extend(target, templateContext);
+ }
+ });
+});
+
+var Mixins = {
+ GetNameLabel: GetNameLabel,
+ GetOptionProperty: GetOptionProperty,
+ Radioable: RadioMixin,
+ Stateable: Stateable,
+ Startable: Startable,
+ Childrenable: Childrenable,
+ GlobalTemplateContext: GlobalTemplateContext
+};
+
+var BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);
+var Behavior = BaseBehavior.extend({
+
+ listenViewInitialize: true,
+
+ constructor: function constructor() {
+
+ if (this.getProperty('listenViewInitialize') === true) this.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));
+
+ BaseBehavior.apply(this, arguments);
+ },
+
+
+ getModel: function getModel() {
+ return this.view.model;
+ },
+ cidle: function cidle(name) {
+ return __.wrap(this.view.cid, name);
+ },
+ unCidle: function unCidle(name) {
+ return __.unwrap(name, this.view.cid);
+ }
+});
+
+var BaseDraggable = Behavior.extend({
+
+ triggerEl: undefined, //drag initialization element, if not set equal to view.$el
+ moveBeforeStart: 10,
+ scope: 'drag',
+
+ getDragEventsContext: function getDragEventsContext() {
+ return this.$doc;
+ },
+ getDragEventsElementSelector: function getDragEventsElementSelector() {
+ return '*';
+ },
+ getTriggerEl: function getTriggerEl() {
+ if (this._$el) return this._$el;
+
+ var el = this.getOption('triggerEl');
+ if (el == null && this.view.$el) this._$el = this.view.$el;else if (el && el.jquery) this._$el = el;else if (el instanceof HTMLElement) this._$el = $(el);else if (typeof el === 'string' && el.length) this._$el = this.view.$(el);else throw new Error('trigger element should be a DOM or jQuery object or string selector.', el);
+
+ return this._$el;
+ },
+ isSameScope: function isSameScope(dragging) {
+ return dragging.scope === this.scope;
+ },
+ shouldHandleDomEvents: function shouldHandleDomEvents(dragging) {
+ return this.isSameScope(dragging) && this !== dragging;
+ },
+
+
+ constructor: function constructor() {
+
+ this._clearDragData();
+
+ this.$doc = $(document);
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Behavior.apply(this, args);
+
+ this._defineDocumentBindings();
+ },
+ _clearDragData: function _clearDragData() {
+ this._dragData = {};
+ },
+ _defineDocumentBindings: function _defineDocumentBindings() {
+ this.__b = {};
+ this.__b.setupDragDetection = _.bind(this._setupDragDetection, this);
+ this.__b.handleMouseUp = _.bind(this._handleMouseUp, this);
+ this.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);
+ this.__b.handleDragMove = _.bind(this._handleDragMove, this);
+ this.__b.handleElementEnter = _.bind(this._handleElementEnter, this);
+ this.__b.handleElementLeave = _.bind(this._handleElementLeave, this);
+ this.__b.handleElementOver = _.bind(this._handleElementOver, this);
+ },
+ onInitialize: function onInitialize() {
+ this._initializeDragListener();
+ },
+ _initializeDragListener: function _initializeDragListener() {
+ var $el = this.getTriggerEl();
+ $el.one('mousedown', this.__b.setupDragDetection);
+ },
+ _setupDragDetection: function _setupDragDetection(e) {
+ if (this.view.dragDisabled === true) {
+ this._initializeDragListener();
+ return;
+ }
+
+ e.stopPropagation();
+
+ this.$doc.one('mouseup', this.__b.handleMouseUp);
+
+ this._dragData.startX = e.pageX;
+ this._dragData.startY = e.pageY;
+ this.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);
+ },
+ _handleMouseUp: function _handleMouseUp(e) {
+ if (this._dragData.dragging) this._handleDragEnd(e);else this._handleEndWithoutDrag(e);
+
+ this._initializeDragListener();
+ },
+ _handleEndWithoutDrag: function _handleEndWithoutDrag(e) {
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+ },
+ _handleDragEnd: function _handleDragEnd(e) {
+ this._dragData.dragging = false;
+
+ this.$doc.off('mousemove', this.__b.handleDragMove);
+
+ var $context = this.getDragEventsContext();
+ $context.off('mouseenter', this.__b.handleElementEnter);
+ $context.off('mousemove', this.__b.handleElementOver);
+
+ if (this._dragData.drop && this._dragData.drop.context) {
+ this._dragData.drop.context.catchDraggable(this, this._dragData.drop);
+ this.triggerMethod('drag:drop', this._dragData.drop);
+ }
+
+ this.triggerMethod('drag:end');
+ },
+ _handleMoveAfterMouseDown: function _handleMoveAfterMouseDown(e) {
+ e.stopPropagation();
+
+ var distance = this._getStartPositionPixelOffset(e);
+ var startIfMoreThan = this.getOption('moveBeforeStart');
+ if (distance >= startIfMoreThan) this._startDragSession();
+ },
+ _getStartPositionPixelOffset: function _getStartPositionPixelOffset(e) {
+ var x = Math.abs(e.pageX - this._dragData.startX);
+ var y = Math.abs(e.pageY - this._dragData.startY);
+ return x > y ? x : y;
+ },
+ _startDragSession: function _startDragSession() {
+ this._dragData.dragging = true;
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+
+ this.$doc.on('mousemove', this.__b.handleDragMove);
+
+ var $context = this.getDragEventsContext();
+ var selector = this.getDragEventsElementSelector();
+
+ $context.on('mouseenter', selector, this.__b.handleElementEnter);
+
+ $context.on('mousemove', selector, this.__b.handleElementOver);
+
+ this.view.triggerMethod('drag:start');
+ },
+ _handleDragMove: function _handleDragMove(ev) {
+ ev.stopPropagation();
+
+ this.triggerMethod('drag', ev);
+ },
+ _handleElementEnter: function _handleElementEnter(e) {
+ var _this = this;
+
+ var $over = $(e.target);
+
+ if (this._dragData.over != $over) {
+ this._dragData.over = $over;
+ $over.trigger('drag:enter', this);
+ $over.one('mouseleave', function () {
+ return _this.trigger('drag:leave', _this);
+ });
+ }
+ },
+ _handleElementLeave: function _handleElementLeave(e) {
+ var $over = $(e.target);
+ $over.trigger('drag:leave', this);
+ },
+ _handleElementOver: function _handleElementOver(e) {
+ var $over = $(e.target);
+ var event = this._createCustomDomEvent('drag:over', e);
+ $over.trigger(event, this);
+ },
+
+ _createCustomDomEvent: function _createCustomDomEvent(name, event, merge) {
+ if (!merge) merge = ["pageX", "pageY", "clientX", "clientY", "offsetX", "offsetY", "target"];
+
+ var customEvent = jQuery.Event(name);
+ _(merge).each(function (prop) {
+ return customEvent[prop] = event[prop];
+ });
+
+ return customEvent;
+ }
+});
+
+var DraggableBehavior = BaseDraggable.extend({
+
+ useGhost: true,
+ viewCssClass: 'dragging',
+ ghostCssClass: 'ghost',
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ BaseDraggable.apply(this, args);
+
+ this.on('drag', this._onDrag);
+ this.on('drag:start', this._onDragStart);
+ this.on('drag:end', this._onDragEnd);
+ },
+
+ events: {
+ 'drag:enter': function dragEnter(e, dragging) {
+ if (!this.shouldHandleDomEvents(dragging)) return;
+ },
+ 'drag:over': function dragOver(e, dragging) {
+ if (!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+ var newEvent = this._createCustomDomEvent('drag:over', e);
+
+ var parent = this.$el.parent();
+ if (parent) parent.trigger(newEvent, [dragging, this]);
+ }
+ },
+
+ _onDragEnd: function _onDragEnd(ev) {
+
+ if (this.getOption('useGhost')) this._removeGhost();
+ if (this.getOption('viewCssClass')) this.view.$el.removeClass(this.getOption('viewCssClass'));
+
+ this._clearDragData();
+ },
+ _onDragStart: function _onDragStart(ev) {
+ if (this.getOption('useGhost')) this._createGhost();
+ if (this.getOption('viewCssClass')) this.view.$el.addClass(this.getOption('viewCssClass'));
+ },
+ _onDrag: function _onDrag(ev) {
+ this.setGhostPosition(ev.pageY, ev.pageX);
+ },
+ _removeGhost: function _removeGhost() {
+ this.$ghost.remove();
+ delete this.$ghost;
+ },
+ createGhost: function createGhost() {
+ var $g = this.$el.clone();
+
+ var _$el$offset = this.$el.offset(),
+ top = _$el$offset.top,
+ left = _$el$offset.left;
+
+ $g.css({
+ top: top + 'px',
+ left: left + 'px',
+ width: this.$el.outerWidth(),
+ height: this.$el.outerHeight()
+ });
+ return $g;
+ },
+ _createGhost: function _createGhost() {
+ var $g = this.createGhost();
+ if ($g.css('position') != 'absolute') $g.css('position', 'absolute');
+
+ var addClasses = this.getOption('ghostCssClass');
+ if (addClasses) $g.addClass(addClasses);
+
+ $g.appendTo($('body'));
+ this._setGhost($g);
+ },
+ _setGhost: function _setGhost($g) {
+ this.$ghost = $g;
+ },
+ getGhost: function getGhost() {
+ return this.$ghost;
+ },
+ setGhostPosition: function setGhostPosition(top, left) {
+
+ var $ghost = this.getGhost();
+ if (!$ghost) return;
+
+ $ghost.css({
+ top: top + 'px',
+ left: left + 'px'
+ });
+ }
+});
+
+var DroppableBehavior = Behavior.extend({
+ scope: 'drag',
+ events: {
+ 'drag:over': '_onDomDragOver'
+ },
+
+ //because of mn 3.5.1 bug of first render isAtached flag
+ _skipFirstAttach: true,
+
+ isSameScope: function isSameScope(dragging) {
+ return dragging.scope === this.scope;
+ },
+ getEventXY: function getEventXY(e) {
+ return { x: e.pageX, y: e.pageY };
+ },
+ getChildren: function getChildren() {
+ return _(this.view.children._views).filter(function (v) {
+ return v.model && v.isRendered() && v.isAttached();
+ });
+ },
+ catchDraggable: function catchDraggable(draggable, dropContext) {
+ this._onDrop(draggable, dropContext);
+ },
+
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Behavior.apply(this, args);
+ this._initReorderBehavior();
+ },
+ _initReorderBehavior: function _initReorderBehavior() {
+ var _this = this;
+
+ this.listenToOnce(this.view, 'render', function () {
+ _this.reOrder({ silent: true });
+ _this.listenTo(_this.view.collection, 'update', function (collection, options) {
+ var changes = (options || {}).changes || {};
+ this.reOrder();
+ });
+ });
+ },
+ reOrder: function reOrder() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ this.view.sort();
+
+ var children = this.children = [];
+ var skipAttach = this._skipFirstAttach;
+ _(this.view.children._views).each(function (view, index) {
+ if (!view.model) return;
+ view.model.set('order', index);
+ if (view.isRendered() && (skipAttach || view.isAttached())) children.push(view);
+ });
+
+ this.hasChildren = this.children.length > 0;
+
+ if (options.silent != true && this.view.collection) this.view.collection.trigger('reordered');
+
+ this._skipFirstAttach = false;
+ },
+
+
+ // _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },
+ // _onChildrenReady(){
+ // this._refreshChildren();
+ // },
+ // _refreshChildren(){
+
+ // this.children = this.getChildren();
+ // this.hasChildren = this.children.length > 0;
+
+ // this.view.collection.trigger('reordered', this.view.collection.cid);
+ // },
+
+
+ _onDomDragOver: function _onDomDragOver(e, dragging, child) {
+ if (!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+ if (dragging === child || this.hasChildren && !child) return;
+
+ dragging._dragData.drop || (dragging._dragData.drop = {});
+ var storedDrop = dragging._dragData.drop;
+
+ var xy = this.getEventXY(e);
+
+ var drop = this._getDropContext(xy, child);
+ drop.context = this;
+
+ var mixedDrop = _.extend({}, storedDrop, drop);
+ var keys = _.keys(mixedDrop);
+ var hasChanges = _(keys).some(function (k) {
+ return storedDrop[k] !== drop[k];
+ });
+ if (hasChanges) {
+ dragging._dragData.drop = drop;
+ this._onDropContextChange(dragging, drop);
+ }
+ },
+ _getDropContext: function _getDropContext(xy, child) {
+
+ var children = this.children || [];
+ if (!children.length) return { insert: 'before' };
+
+ var $el = child ? child.$el : this.$el;
+ var position = this._getPositionByEventXY(xy, $el);
+ return this._getDropContextByPosisiton(position, child);
+ },
+ _getPositionByEventXY: function _getPositionByEventXY(xy, $el) {
+
+ var elOffset = $el.offset();
+ var elDimension = { width: $el.outerWidth(), height: $el.outerHeight() };
+ var xHalf = elOffset.left + elDimension.width / 2;
+ var yHalf = elOffset.top + elDimension.height / 2;
+ var r = { x: undefined, y: undefined };
+
+ r.x = xy.x <= xHalf ? 'left' : 'right';
+ r.y = xy.y <= yHalf ? 'top' : 'bottom';
+
+ return r;
+ },
+ _getDropContextByPosisiton: function _getDropContextByPosisiton(position, child) {
+
+ var direction = this.getOption('direction') || 'vertical';
+
+ var insert = direction == 'horizontal' ? position.x == 'left' ? 'before' : 'after' : position.y == 'top' ? 'before' : 'after';
+
+ var childView = undefined;
+
+ if (child) {
+ childView = child.view;
+ } else {
+ childView = insert == 'before' ? this.children[0] : this.children.length && _(this.children).last();
+ }
+
+ var index = this.view.children._views.indexOf(childView);
+
+ return {
+ insert: insert,
+ childView: childView,
+ index: index,
+ noChild: !child
+ };
+ },
+ _onDropContextChange: function _onDropContextChange(dragging, context) {
+ this.triggerMethod('drop:context:change', dragging, context);
+ },
+ _onDrop: function _onDrop(draggable, dropContext) {
+ this.triggerMethod('drop', draggable, dropContext);
+ }
+});
+
+var DynamicClass = Behavior.extend({
+ updateElementClass: function updateElementClass(changeSource) {
+ var viewCls = _.result(this.view, 'className') || '';
+ var addCls = _.result(this.view, 'dynamicClassName') || '';
+ this.$el.attr({
+ class: (viewCls + ' ' + addCls).trim()
+ });
+ },
+
+
+ refreshOnModelChange: true,
+ refreshOnDomChange: false,
+ refreshOnViewRefresh: true,
+ refreshOnViewBeforeRender: true,
+ refreshOnViewRender: false,
+
+ modelEvents: {
+ 'change': function change() {
+ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change');
+ }
+ },
+ events: {
+ 'change': function change() {
+ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change');
+ }
+ },
+ onRefresh: function onRefresh() {
+ this.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh');
+ },
+ onRender: function onRender() {
+ this.getProperty('refreshOnViewRender') && this.updateElementClass('view:render');
+ },
+ onBeforeRender: function onBeforeRender() {
+ this.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render');
+ },
+ onRefreshCssClass: function onRefreshCssClass() {
+ this.updateElementClass();
+ },
+ onSetupRefreshCssClass: function onSetupRefreshCssClass(setup) {
+ var _this = this;
+
+ if (setup == null || !_.isObject(setup)) return;
+ _(setup).each(function (value, property) {
+ _this[property] = value === true;
+ });
+ }
+});
+
+function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var FormToHash = mix(Behavior).with(Stateable).extend({
+ applyDelay: 1, //in ms
+ autoApplyToModel: false, //finalize
+ autoChangeModel: false, //on every change
+
+ fillFormFromModel: true,
+
+ applySelector: '.apply',
+ cancelSelector: '.cancel',
+ resetSelector: '.reset',
+
+ initialize: function initialize(opts) {
+
+ this.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));
+ this.mergeOptions(opts, ['values']);
+
+ this.extendDefaultValues({});
+ },
+ extendDefaultValues: function extendDefaultValues(hash) {
+
+ this._values = _.extend(this._values || {}, hash);
+ },
+ onViewInitialize: function onViewInitialize() {
+
+ //this.extendDefaultValues(this.getProperty('values'));
+
+ var model = this.getModel();
+ if (model) {
+ this.extendDefaultValues(model.toJSON());
+ }
+ },
+ onRender: function onRender() {
+
+ if (!this.firstRender) {
+ this.buildFormBindings();
+ this.setState(this._tryFlatValues(this._values));
+ this.setValuesToForm(this.getValues({ raw: true }));
+ }
+ this.firstRender = true;
+ },
+
+
+ //finallizing
+ triggers: function triggers() {
+ var _ref;
+
+ return _ref = {}, _defineProperty$1(_ref, 'click ' + this.getProperty('applySelector'), 'trigger:apply'), _defineProperty$1(_ref, 'click ' + this.getProperty('cancelSelector'), 'trigger:cancel'), _defineProperty$1(_ref, 'click ' + this.getProperty('resetSelector'), 'trigger:reset'), _ref;
+ },
+ _tryFlatValues: function _tryFlatValues(raw) {
+ return flattenObject(raw);
+ },
+ _tryUnFlatValues: function _tryUnFlatValues(raw) {
+ return unFlattenObject(raw);
+ },
+ rollbackToDefaultValues: function rollbackToDefaultValues() {
+ this.clearState();
+ var rawvalues = this._values;
+ var values = this._tryFlatValues(rawvalues);
+ this.setState(values);
+ },
+ getValues: function getValues() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var raw = this.getState();
+ if (options.raw) return raw;
+ var values = this._tryUnFlatValues(raw);
+ return values;
+ },
+ onTriggerApply: function onTriggerApply() {
+ this._apply();
+ },
+ onTriggerCancel: function onTriggerCancel() {
+ this._cancel();
+ },
+ onTriggerReset: function onTriggerReset() {
+ this._reset();
+ },
+ _apply: function _apply() {
+ var values = this.getValues();
+ this.view.triggerMethod('values:apply', values);
+ this._tryChangeModel(values);
+ },
+ _cancel: function _cancel() {
+ this.rollbackToDefaultValues();
+ var values = this._getFullHash(this._values);
+ this.view.triggerMethod('values:cancel', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, { clear: true });
+ },
+ _reset: function _reset() {
+ this.clearState();
+ var values = this._getFullHash({});
+ this.view.triggerMethod('values:reset', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, { clear: true });
+ },
+ onState: function onState(state) {
+ this._tryChangeModel(state, { type: 'property' });
+ },
+ _tryChangeModel: function _tryChangeModel(hash) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';
+ var canChange = this.getProperty(canChangeProp) === true;
+
+ if (!canChange) return;
+ var model = this.getModel();
+ if (!model) return;
+
+ hash = this._tryUnFlatValues(hash);
+ if (options.clear === true) model.clear();
+ model.set(hash);
+ },
+ _getFullHash: function _getFullHash() {
+ var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var modelHash = this.getModel() && this.getModel().toJSON();
+ var full = _.extend({}, this.values, this.mappings, modelHash);
+ var res = {};
+ _(full).each(function (v, key) {
+ return res[key] = undefined;
+ });
+ return _.extend(res, values);
+ },
+
+
+ //dom manipulations
+ buildFormBindings: function buildFormBindings() {
+ var _this = this;
+
+ this.mappings = {};
+ var tags = ["input", "textarea", "select"];
+ this.$("[name]").each(function (i, el) {
+ if (tags.indexOf(el.tagName.toLowerCase()) == -1) return;
+
+ var property = _this.unCidle(el.name);
+ if (property in _this.mappings) return;
+
+ var info = _this._getElementInfo(el, tags);
+ if (info) _this.mappings[property] = info;
+ });
+ var ext = {};
+ _(this.mappings).each(function (context, name) {
+ context.values && (ext[name] = context.values);
+ });
+
+ this.extendDefaultValues(ext);
+ },
+ _getElementInfo: function _getElementInfo(el, tags) {
+ var context = {
+ name: el.name
+ };
+ var values = void 0;
+ var selector = '[name="' + el.name + '"]';
+ var $found = this.$(selector);
+ if (!$found.length) return;
+
+ if ($found.length > 1) {
+ var foundValues = [];
+ var isArray = false;
+ $found.each(function (i, found) {
+ if (tags.indexOf(found.tagName.toLowerCase()) == -1) return;
+ var $el = $(found);
+ if (found.type != 'checkbox' && found.type != 'radio' || $el.prop('checked')) {
+ var val = $el.val();
+ isArray || (isArray = found.type === 'checkbox' || val instanceof Array);
+ if (val instanceof Array) foundValues = foundValues.concat(val);else foundValues.push($el.val());
+ }
+ });
+ values = !foundValues.length || foundValues.length === 1 && !isArray ? foundValues[0] : foundValues;
+ } else {
+ values = $found.get(0).type === 'checkbox' ? $found.prop('checked') ? [$found.val()] : [] : $found.val();
+ }
+ context.values = values;
+ context.isArray = values instanceof Array;
+ context.$elements = $found;
+ return context;
+ },
+ setValuesToForm: function setValuesToForm(values) {
+ var _this2 = this;
+
+ _(values).each(function (propertyValues, propertyName) {
+ var property = _this2.mappings[propertyName];
+ var $els = property.$elements;
+ var arr = propertyValues instanceof Array ? propertyValues : [propertyValues];
+ $els.each(function (i, el) {
+
+ _this2._setValueToElement(el, i, arr);
+ });
+ });
+ },
+ _setValueToElement: function _setValueToElement(el, index, values) {
+ var value = index < values.length && values[index];
+ var $el = el.jquery ? el : $(el);
+ el = $el.get(0);
+ if (el.type === 'checkbox' || el.type === 'radio') {
+ $el.prop('checked', values.indexOf($el.val()) >= 0);
+ } else {
+ $el.val(value);
+ }
+ },
+
+
+ // dom listeners
+ events: {
+ 'change': 'domChange',
+ 'input': 'domInput'
+ },
+ domChange: function domChange(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ domInput: function domInput(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ _applyValue: function _applyValue(name, el, event) {
+ if (el.type == 'checkbox') this._applyCheckboxValue(name, el, event);else this._applySimpleValue(name, el, event);
+ },
+ _applySimpleValue: function _applySimpleValue(name, el, event) {
+ name = this.unCidle(name);
+ var $el = $(el);
+ this.setState(name, $el.val());
+ },
+ _applyCheckboxValue: function _applyCheckboxValue(name, el, event) {
+ var selector = 'input[type=checkbox][name="' + name + '"]:checked';
+ var values = this.$(selector).map(function (i, el) {
+ return el.value;
+ }).toArray();
+ name = this.unCidle(name);
+ this.setState(name, values);
+ }
+});
+
+var Behaviors = { Behavior: Behavior, Draggable: DraggableBehavior, Droppable: DroppableBehavior, DynamicClass: DynamicClass, FormToHash: FormToHash };
+
+var YatObject = mix(Mn.Object).with(GetOptionProperty, RadioMixin);
+
+var IDENTITY_CHANNEL = 'identity';
+
+var Base = mix(YatObject).with(Stateable);
+
+var nativeAjax = $ && $.ajax;
+
+var Identity = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ this._initializeYatUser();
+ },
+ _initializeYatUser: function _initializeYatUser() {},
+
+ channelName: IDENTITY_CHANNEL,
+ tokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires
+ isAnonym: function isAnonym() {
+ return !this.getState('id');
+ },
+ isUser: function isUser() {
+ return !this.isAnonym();
+ },
+ isMe: function isMe(id) {
+ return id && this.getState('id') === id;
+ },
+ update: function update(hash) {
+ this.setState(hash);
+ this.trigger('change');
+ },
+ logIn: function logIn(hash) {
+ if (!hash.id) return;
+ this.update(hash);
+ this.trigger('log:in');
+ },
+ logOut: function logOut() {
+ this.clearState();
+ this.trigger('change');
+ this.trigger('log:out');
+ },
+ getBearerToken: function getBearerToken(data) {
+ var _this = this;
+
+ var url = this.getOption('bearerTokenUrl');
+ var promise = new Promise(function (resolve, reject) {
+ nativeAjax({ url: url, data: data, method: 'POST' }).then(function (token) {
+ _this.setTokenObject(token);
+ resolve(token);
+ _this.triggerMethod('token', token);
+ }, function (error) {
+ return reject(error);
+ });
+ });
+ return promise;
+ },
+ ajax: function ajax() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ var options = args[0];
+ options.headers = _.extend({}, options.headers, this.getAjaxHeaders());
+ var needRefresh = this.isTokenRefreshNeeded();
+ if (!needRefresh) {
+ var _$;
+
+ return (_$ = $).ajax.apply(_$, args); //nativeAjax.apply($, args);
+ } else {
+ return this.refreshBearerToken().then(function () {
+ return nativeAjax.apply($, args);
+ }).catch(function (error) {
+ var promise = $.Deferred();
+ promise.reject(error);
+ return promise;
+ });
+ }
+ },
+ getAjaxHeaders: function getAjaxHeaders() {
+ this._ajaxHeaders || (this._ajaxHeaders = {});
+ return this._ajaxHeaders;
+ },
+ _updateHeaders: function _updateHeaders() {
+ var token = this.getTokenValue();
+ var headers = this.getAjaxHeaders();
+
+ if (token) {
+ headers.Authorization = 'Bearer ' + token;
+ headers.Accept = 'application/json';
+ } else {
+ delete headers.Authorization;
+ }
+ },
+ setTokenObject: function setTokenObject(token) {
+
+ if (token != null && _.isObject(token)) token.expires = new Date(Date.now() + token.expires_in * 1000);
+
+ this._token = token;
+ this._updateHeaders();
+ this._replaceBackboneAjax();
+
+ this.triggerMethod('tocken:change');
+ },
+ getTokenObject: function getTokenObject() {
+ return this._token;
+ },
+ _replaceBackboneAjax: function _replaceBackboneAjax() {
+ var _this2 = this;
+
+ var token = this.getTokenValue();
+ if (!token) Bb.ajax = $.ajax; //$.ajax = nativeAjax;
+ else Bb.ajax = function () {
+ return _this2.ajax.apply(_this2, arguments);
+ }; //$.ajax = (...args) => Yat.identity.ajax(...args);
+ },
+ getTokenValue: function getTokenValue() {
+ var token = this.getTokenObject();
+ return token.access_token;
+ },
+ getRefreshToken: function getRefreshToken() {
+ var token = this.getTokenObject();
+ return token.refresh_token;
+ },
+ getTokenExpires: function getTokenExpires() {
+ var token = this.getTokenObject();
+ return (token || {}).expires;
+ },
+ getTokenSeconds: function getTokenSeconds() {
+ var expires = this.getTokenExpires();
+
+ if (expires == null || isNaN(expires.valueOf())) {
+ console.warn('expires is null or wrong');
+ return 0;
+ }
+
+ var offset = this.getProperty('tokenExpireOffset');
+ if (offset == null) offset = 30000; //30 sec
+
+ var deadline = expires.valueOf() - offset;
+ var deadlineMs = deadline - Date.now();
+ return deadlineMs > 0 ? deadlineMs / 1000 : 0;
+ },
+ isTokenRefreshNeeded: function isTokenRefreshNeeded() {
+ var token = this.getTokenValue();
+ if (!token) return false;
+ return !this.getTokenSeconds();
+ },
+ refreshBearerToken: function refreshBearerToken() {
+ var _this3 = this;
+
+ var bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');
+ var doRefresh = this.isTokenRefreshNeeded();
+ return new Promise(function (resolve, reject) {
+ if (!doRefresh) {
+ resolve();
+ return;
+ }
+
+ if (bearerTokenRenewUrl == null) {
+ reject(new Error('Token expired and `bearerTokenRenewUrl` not set'));
+ return;
+ }
+ var data = {
+ 'grant_type': 'refresh_token',
+ 'refresh_token': _this3.getRefreshToken()
+ };
+ nativeAjax({
+ url: bearerTokenRenewUrl,
+ data: data,
+ method: 'POST'
+ }).then(function (token) {
+ _this3.setTokenObject(token);
+ resolve();
+ }, function () {
+ _this3.triggerMethod('refresh:token:expired');
+ reject(YatError.Http401());
+ });
+ });
+ }
+});
+
+var identity = new Identity();
+
+var YatView = mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({
+
+ instantRender: false,
+ renderOnReady: false,
+ triggerReady: false,
+
+ manualAfterInitialize: true,
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Mn.View.apply(this, args);
+
+ var options = args[0];
+ this.mergeOptions(options, ['instantRender', 'renderOnReady', 'triggerReady', 'manualAfterInitialize']);
+
+ if (this.manualAfterInitialize === true) this._afterInitialize();
+ },
+ _afterInitialize: function _afterInitialize() {
+
+ if (this.instantRender === true) this.render();
+
+ if (this.renderOnReady === true) this.once('ready', this.render);
+
+ if (this.renderOnReady === true || this.triggerReady === true) this.trigger('ready', this);
+ }
+});
+
+var YatConfig = YatObject.extend({
+ initialize: function initialize(options) {
+ this.mergeOptions(options, ['name', 'channelName', 'noRadio']);
+ if (this.noRadio !== true && this.channelName == null) this.channelName = name;
+ },
+ getStore: function getStore() {
+ this.store || (this.store = {});
+ return this.store;
+ },
+
+ radioRequest: {
+ get: function get() {
+ this.get.apply(this, arguments);
+ },
+ set: function set(path, value) {
+ this.set(path, value);
+ }
+ },
+ get: function get(path) {
+ var store = this.getStore();
+ var value = getByPath(store, path);
+ if (_.isFunction(value)) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ value = value.apply(this, args);
+ }
+
+ return value;
+ },
+ set: function set(path, value) {
+ var store = this.getStore();
+ var result = setByPath(store, path, value);
+ this.triggerSet(path, value);
+ },
+ triggerSet: function triggerSet(path, value) {
+ if (!path) return;
+ var arr = path.split('/');
+ var radio = this.getChannel();
+ do {
+ var event = arr.join(':');
+ this.triggerMethod(event, value);
+ radio && radio.trigger(event, value);
+ arr.pop();
+ } while (arr.length > 0);
+ }
+});
+
+function Config (name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ options.name = name;
+ return new YatConfig(options);
+}
+
+var config = new Config('yat:modals:singleton', { noRadio: true });
+
+var modalsShowFull = {
+ bg: true,
+ close: true
+};
+
+var modalsShowSimple = {
+ bg: false,
+ close: false
+};
+
+var modalOptionsDefault = {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: false
+};
+
+var modalsCssDefaults = {
+ wrapper: 'yat-modal-wrapper',
+ bg: 'yat-modal-bg',
+ contentWrapper: 'yat-modal-content-wrapper',
+ close: 'yat-modal-close',
+ header: 'yat-modal-header',
+ content: 'yat-modal-content',
+ actions: 'yat-modal-actions',
+ resolve: 'yat-modal-resolve',
+ reject: 'yat-modal-reject'
+};
+
+var modalsLabelsDefaults = {
+ close: '×',
+ resolve: 'ok',
+ reject: 'cancel'
+};
+
+var modalsTypes = {
+ full: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault
+ },
+ simple: {
+ css: modalsCssDefaults,
+ show: modalsShowSimple,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault
+ },
+ confirm: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: true
+ }
+ }
+};
+
+config.set('types.full', modalsTypes.full);
+config.set('types.simple', modalsTypes.simple);
+config.set('types.confirm', modalsTypes.confirm);
+
+config.set('defaultShow', modalsShowFull);
+config.set('defaultCss', modalsCssDefaults);
+config.set('defaultLabels', modalsLabelsDefaults);
+
+var template = _.template('<% if(show.bg) {%>
data-role="modal-bg">
<% } %>\n data-role="modal-content-wrapper">\n\t<% if(show.close) {%>
<% } %>\n\t<% if(show.header) {%>
data-role="modal-header"><%= header %><% } %>\n\t
data-role="modal-content"><%= text %>
\n\t<% if(show.actions) {%>\n\t
data-role="modal-actions">\n\t\t<% if(show.resolve) {%><% } %>\n\t\t<% if(show.reject) {%><% } %>\n\t
\n\t<% } %>\n
\n');
+
+var ModalView = mix(YatView).with(GetOptionProperty).extend({
+
+ renderOnReady: true,
+ template: template,
+
+ attributes: function attributes() {
+ return { 'data-role': 'modal-wrapper' };
+ },
+ initialize: function initialize(options) {
+ var _this2 = this;
+
+ this.mergeOptions(options, ['content', 'header', 'text']);
+
+ var _this = this;
+
+ if (this.getOption('asPromise') === true) {
+ this.promise = new Promise(function (resolve, reject) {
+ _this.once('resolve', function (arg) {
+ return resolve(arg);
+ });
+ _this.once('reject', function (arg) {
+ return reject(arg);
+ });
+ });
+ }
+
+ this.once('resolve reject', function (arg, destroying) {
+ _this2.preventClose = false;
+
+ if (_this2.getConfigValue('options', 'closeOnPromise') && !destroying) {
+ _this2.destroy();
+ }
+ });
+ },
+ canBeClosed: function canBeClosed() {
+ return this.getConfigValue('options', 'preventClose') !== true;
+ },
+ destroy: function destroy() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ if (!this.canBeClosed() && opts.force !== true) return;
+
+ return YatView.prototype.destroy.apply(this, arguments);
+ },
+
+ ui: {
+ 'bg': '[data-role="modal-bg"]',
+ 'contentWrapper': '[data-role="modal-content-wrapper"]',
+ 'text': '[data-role="modal-content"]',
+ 'header': '[data-role="modal-header"]',
+ 'close': '[data-role="modal-close"]',
+ 'resolve': '[data-role="modal-resolve"]',
+ 'reject': '[data-role="modal-reject"]'
+ },
+ triggers: {
+ 'click @ui.close': { event: 'click:close', stopPropagation: true },
+ 'click @ui.reject': { event: 'click:reject', stopPropagation: true },
+ 'click @ui.resolve': { event: 'click:resolve', stopPropagation: true },
+ 'click @ui.text': { event: 'click:content', stopPropagation: true },
+ 'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },
+ 'click @ui.bg': { event: 'click:bg', stopPropagation: true },
+ 'click': { event: 'click:wrapper', stopPropagation: true }
+ },
+ regions: {
+ 'content': '[data-role="modal-content"]'
+ },
+ onBeforeDestroy: function onBeforeDestroy() {
+ this.trigger('reject', this.getProperty('reject'), true);
+ },
+ onClickClose: function onClickClose() {
+ this.destroy();
+ },
+ onClickResolve: function onClickResolve() {
+ this.trigger('resolve', this.getProperty('resolve'));
+ },
+ onClickReject: function onClickReject() {
+ this.trigger('reject', this.getProperty('reject'));
+ },
+ onClickBg: function onClickBg() {
+ this.clickedOutsideOfModal();
+ },
+ onClickWrapper: function onClickWrapper() {
+ this.clickedOutsideOfModal();
+ },
+ clickedOutsideOfModal: function clickedOutsideOfModal() {
+ if (this.getConfigValue('options', 'closeOnClickOutside') === true) this.destroy();
+ },
+ onBeforeRender: function onBeforeRender() {
+ //apply wrapper class here;
+ var cfg = this.getConfig();
+ cfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);
+
+ this.$el.appendTo($('body'));
+ },
+ onRender: function onRender() {
+ if (this.content instanceof Bb.View) {
+ this.showChildView('content', this.content);
+ this.content.inModal = this;
+ }
+ },
+ _getModalOptions: function _getModalOptions() {
+ var h = {};
+ if (this.getOption('closeOnClickOutside') != null) h.closeOnClickOutside = this.getOption('closeOnClickOutside');
+ if (this.getOption('closeOnPromise') != null) h.closeOnPromise = this.getOption('closeOnPromise');
+ if (this.getOption('preventClose') != null) h.preventClose = this.getOption('preventClose');
+ if (this.getOption('asPromise') != null) h.asPromise = this.getOption('asPromise');
+
+ return h;
+ },
+ getConfigValue: function getConfigValue(section, name) {
+ var cfg = this.getConfig() || {};
+ return (cfg[section] || {})[name];
+ },
+ getConfig: function getConfig(key) {
+ if (this.config) return this.config;
+
+ var typeName = this.getOption('type') || 'simple';
+ var type = _.extend({}, config.get('types.' + typeName) || {});
+
+ type.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));
+ type.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));
+ type.css = _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));
+
+ type.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());
+
+ if (type.show.header == null && this.getOption('header')) type.show.header = true;
+
+ if (type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise)) type.show.resolve = true;
+ if (type.show.reject == null && this.getOption('reject')) type.show.reject = true;
+
+ if (type.show.actions == null && (type.show.resolve || type.show.reject)) type.show.actions = true;
+
+ return this.config = type;
+ },
+ templateContext: function templateContext() {
+ var cfg = this.getConfig();
+ return {
+ css: function css(name) {
+ return cfg.css[name] ? ' class="' + cfg.css[name] + '"' : '';
+ },
+ label: function label(name) {
+ return cfg.labels[name] || '';
+ },
+
+ show: cfg.show,
+ text: this.getOption('text'),
+ header: this.getOption('header')
+ };
+ }
+});
+
+var ModalEngine = mix(YatObject).with(Stateable).extend({
+ constructor: function constructor() {
+ var _this2 = this;
+
+ this.modals = [];
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ YatObject.apply(this, args);
+ this.listenForEsc = _.bind(this._listenForEsc, this);
+ $$1(function () {
+ _this2.doc = $$1(document);
+ _this2.doc.on('keyup', _this2.listenForEsc);
+ });
+ },
+
+ channelName: 'modals',
+
+ show: function show() {
+ var options = this._normalizeArguments.apply(this, arguments);
+ return this._create(options);
+ },
+ remove: function remove(modal) {
+
+ if (!modal) modal = _.last(this.modals);
+
+ modal && modal.destroy();
+ },
+ _listenForEsc: function _listenForEsc(e) {
+ if (e.keyCode !== 27) return;
+
+ if (this.modals.length) this.remove();
+ },
+ _create: function _create(options) {
+ var modal = new ModalView(options);
+ var _this = this;
+ this.listenToOnce(modal, 'destroy', function () {
+ _this._remove(modal);
+ });
+ this.modals.push(modal);
+ return modal;
+ },
+ _remove: function _remove(modal) {
+
+ if (!modal) return;
+
+ var ind = this.modals.indexOf(modal);
+ if (ind > -1) this.modals.splice(ind, 1);
+
+ this.stopListening(modal);
+ },
+ _normalizeArguments: function _normalizeArguments() {
+
+ var options = {};
+ var len = arguments.length;
+ if (!len) return;
+
+ if (len === 1) {
+ if (__.isView(arguments.length <= 0 ? undefined : arguments[0])) options.content = arguments.length <= 0 ? undefined : arguments[0];else if (_.isString(arguments.length <= 0 ? undefined : arguments[0])) options.text = arguments.length <= 0 ? undefined : arguments[0];else if (_.isObject(arguments.length <= 0 ? undefined : arguments[0])) _.extend(options, arguments.length <= 0 ? undefined : arguments[0]);
+ } else if (len === 2) {
+ if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && _.isString(arguments.length <= 1 ? undefined : arguments[1])) {
+ options.header = arguments.length <= 0 ? undefined : arguments[0];
+ options.text = arguments.length <= 1 ? undefined : arguments[1];
+ } else if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && __.isView(arguments.length <= 1 ? undefined : arguments[1])) {
+ options.header = arguments.length <= 0 ? undefined : arguments[0];
+ options.content = arguments.length <= 1 ? undefined : arguments[1];
+ } else if (_.isString(arguments.length <= 1 ? undefined : arguments[1]) && __.isView(arguments.length <= 0 ? undefined : arguments[0])) {
+ options.header = arguments.length <= 1 ? undefined : arguments[1];
+ options.content = arguments.length <= 0 ? undefined : arguments[0];
+ } else if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && _.isObject(arguments.length <= 1 ? undefined : arguments[1])) {
+ _.extend(options, arguments.length <= 1 ? undefined : arguments[1]);
+ if (__.isView(options.content)) options.header = arguments.length <= 0 ? undefined : arguments[0];else options.text = arguments.length <= 0 ? undefined : arguments[0];
+ } else if (__.isView(arguments.length <= 0 ? undefined : arguments[0]) && _.isObject(arguments.length <= 1 ? undefined : arguments[1])) {
+ _.extend(options, arguments.length <= 1 ? undefined : arguments[1]);
+ options.content = arguments.length <= 0 ? undefined : arguments[0];
+ }
+ } else {
+ if (_.isObject(arguments.length <= 3 ? undefined : arguments[3])) _.extend(options, arguments.length <= 3 ? undefined : arguments[3]);
+ if (_.isObject(arguments.length <= 2 ? undefined : arguments[2])) _.extend(options, arguments.length <= 2 ? undefined : arguments[2]);else if (_.isString(arguments.length <= 2 ? undefined : arguments[2])) options.type = arguments.length <= 2 ? undefined : arguments[2];
+
+ var two = this._normalizeArguments(arguments.length <= 0 ? undefined : arguments[0], arguments.length <= 1 ? undefined : arguments[1]);
+ _.extend(options, two);
+ }
+
+ return options;
+ },
+ onBeforeDestroy: function onBeforeDestroy() {
+ if (this.doc) this.doc.off('keyup', this.listenForEsc);
+ }
+});
+
+var modalEngine = new ModalEngine();
+
+var modals = {
+ show: function show() {
+ return modalEngine.show.apply(modalEngine, arguments);
+ },
+ addTypeConfig: function addTypeConfig(name, cfg) {
+ if (!name || !_.isString(name)) return;
+ config.set('types.' + name, cfg);
+ },
+ getTypeConfig: function getTypeConfig(name) {
+ if (!name || !_.isString(name)) return;
+ return config.get('types.' + name);
+ }
+};
+
+var Singletons = { TemplateContext: GlobalTemplateContext$1, identity: identity, modals: modals };
+
+var Base$1 = mix(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);
+
+var App = Base$1.extend({
+
+ initRadioOnInitialize: true,
+ _initRegion: function _initRegion() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { skip: true };
+
+ if (opts.skip) return;
+ var region = this.getProperty('region');
+ this.region = region;
+ Base$1.prototype._initRegion();
+ },
+ getRegion: function getRegion() {
+ if (!this._region) this._initRegion({ skip: false });
+ return this._region;
+ },
+ addPageManager: function addPageManager(pageManager) {
+ var _this = this;
+
+ this._pageManagers || (this._pageManagers = []);
+ this._pageManagers.push(pageManager);
+
+ var prefix = pageManager.getName();
+ if (!prefix) {
+ console.warn('pageManager prefix not defined');
+ return;
+ }
+
+ this.listenTo(pageManager, 'all', function (eventName) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var prefixedEventName = prefix + ':' + eventName;
+ _this.triggerMethod.apply(_this, [prefixedEventName].concat(args));
+ });
+ this.listenTo(pageManager, 'state:currentPage', function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return _this.triggerMethod.apply(_this, ['page:swapped'].concat(args));
+ });
+ },
+ hasPageManagers: function hasPageManagers() {
+ return this._pageManagers && this._pageManagers.length > 0;
+ },
+ getMenuTree: function getMenuTree() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { rebuild: false };
+
+ if (this._menuTree && !opts.rebuild) return this._menuTree;
+ var managers = this._pageManagers || [];
+ var links = _(managers).chain().map(function (manager) {
+ return manager.getLinks();
+ }).flatten().value();
+ this._menuTree = new Bb.Collection(links);
+ return this._menuTree;
+ },
+ getPage: function getPage(key) {
+ if (!this.hasPageManagers()) return;
+ return _(this._pageManagers).find(function (mngr) {
+ return mngr.getPage(key);
+ });
+ }
+});
+
+var Router = Mn.AppRouter.extend({}, {
+ create: function create(hash, context) {
+ var appRoutes = {};
+ var controller = {};
+ var _this = this;
+ _(hash).each(function (handlerContext, key) {
+ appRoutes[key] = key;
+ controller[key] = function () {
+ handlerContext.action.apply(handlerContext, arguments).catch(function (error) {
+ _this._catchError(error, context);
+ });
+ };
+ });
+ return new this({ controller: controller, appRoutes: appRoutes });
+ },
+ _catchError: function _catchError(error, context) {
+ if (!context || context.getProperty('throwChildErrors') === true) {
+ throw error;
+ } else {
+ var postfix = error.status ? ":" + error.status.toString() : '';
+ var commonEvent = 'error';
+ var event = commonEvent + postfix;
+
+ context.triggerMethod(commonEvent, error, this);
+
+ if (event != commonEvent) context.triggerMethod(event, error, this);
+ }
+ }
+});
+
+var Model = Bb.Model.extend({});
+
+var LinkModel = Model.extend({
+ defaults: {
+ url: undefined,
+ label: undefined,
+ target: '_self',
+ level: 0
+ },
+ destroy: function destroy() {
+ this.id = null;
+ Model.prototype.destroy.apply(this, arguments);
+ }
+});
+
+function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+/*
+ YatPage
+*/
+
+var Base$2 = mix(App).with(GetNameLabel);
+
+var YatPage = Base$2.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base$2.apply(this, args);
+ this.initializeYatPage();
+ },
+
+
+ allowStopWithoutStart: true,
+ allowStartWithoutStop: true,
+
+ initializeYatPage: function initializeYatPage(opts) {
+ this.mergeOptions(opts, ["manager"]);
+ this._initializeModels(opts);
+ this._initializeRoute(opts);
+ this._proxyEvents();
+ this._tryCreateRouter();
+ this._registerIdentityHandlers();
+ },
+ getLayout: function getLayout() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { rebuild: false };
+
+ if (!this._layoutView || opts.rebuild || this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed()) {
+ this.buildLayout();
+ }
+ return this._layoutView;
+ },
+ buildLayout: function buildLayout() {
+ var Layout = this.getProperty('Layout');
+ if (Layout == null) return;
+ var opts = _.extend({}, this.getProperty('layoutOptions'));
+
+ if (this.model && !opts.model) _.extend(opts, { model: this.model });
+
+ if (this.collection && !opts.collection) _.extend(opts, { collection: this.collection });
+
+ var options = this.buildLayoutOptions(opts);
+ options.page = this;
+ this._layoutView = new Layout(options);
+ return this._layoutView;
+ },
+ buildLayoutOptions: function buildLayoutOptions(rawOptions) {
+ return rawOptions;
+ },
+ addModel: function addModel(model) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (!model) return;
+ this.model = model;
+ var fetch = opts.fetch || this.getOption('fetchModelOnAdd');
+ if (fetch === undefined) {
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if (fetch === true) {
+ this.addStartPromise(model.fetch(opts));
+ }
+ },
+ addCollection: function addCollection(collection) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (!collection) return;
+ this.collection = collection;
+ var fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');
+ if (fetch === undefined) {
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if (fetch === true) {
+ this.addStartPromise(collection.fetch(opts));
+ }
+ },
+
+
+ freezeWhileStarting: true,
+ freezeUI: function freezeUI() {},
+ unFreezeUI: function unFreezeUI() {},
+ getRouteHash: function getRouteHash() {
+
+ var hashes = [{}, this._routeHandler].concat(this.getChildren({ startable: false }).map(function (children) {
+ return children.getRouteHash();
+ }));
+ return _.extend.apply(_, _toConsumableArray(hashes));
+ },
+ hasRouteHash: function hasRouteHash() {
+ return _.isObject(this.getRouteHash());
+ },
+ getLinkModel: function getLinkModel() {
+ var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ if (!this._canHaveLinkModel()) return;
+ if (this._linkModel) return this._linkModel;
+
+ var url = this.getRoute();
+ var label = this.getLabel();
+ var children = this._getSublinks(level);
+ this._linkModel = new LinkModel({ url: url, label: label, level: level, children: children });
+
+ return this._linkModel;
+ },
+ _canHaveLinkModel: function _canHaveLinkModel() {
+ return !(this.getProperty('skipMenu') === true || !!this.getProperty('isStartNotAllowed'));
+ },
+ _destroyLinkModel: function _destroyLinkModel() {
+ if (!this._linkModel) return;
+ this._linkModel.destroy();
+ delete this._linkModel;
+ },
+ getParentLinkModel: function getParentLinkModel() {
+ var parent = this.getParent();
+ if (!parent || !parent.getLinkModel) return;
+ var model = parent.getLinkModel();
+ return model;
+ },
+ getNeighbourLinks: function getNeighbourLinks() {
+ var link = this.getLinkModel();
+ if (link && link.collection) return link.collection;
+ },
+ getChildrenLinks: function getChildrenLinks() {
+ var model = this.getLinkModel();
+ if (!model) return;
+ return model.get('children');
+ },
+ _getSublinks: function _getSublinks(level) {
+ var children = this.getChildren();
+ if (!children || !children.length) return;
+ var sublinks = _(children).chain().filter(function (child) {
+ return child.getProperty("skipMenu") !== true;
+ }).map(function (child) {
+ return child.getLinkModel(level + 1);
+ }).value();
+ if (!sublinks.length) return;
+ var col = new Bb.Collection(sublinks);
+ return col;
+ },
+ _initializeModels: function _initializeModels() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.addModel(opts.model, opts);
+ this.addCollection(opts.collection, opts);
+ },
+ _initializeRoute: function _initializeRoute() {
+ var route = this.getRoute({ asPattern: true });
+ if (route == null) return;
+ var page = this;
+ this._routeHandler = _defineProperty$2({}, route, { context: page, action: function action() {
+ return page.start.apply(page, arguments);
+ } });
+ },
+ getRoute: function getRoute() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { asPattern: false };
+
+ var relative = this.getProperty('relativeRoute');
+ var route = this.getProperty('route');
+ var parent = this.getParent();
+ if (route == null) return;
+
+ var result = route;
+
+ if (relative && parent && parent.getRoute) {
+ var parentRoute = parent.getRoute();
+ result = parentRoute + '/' + route;
+ }
+
+ return this._normalizeRoute(result, opts);
+ },
+ _normalizeRoute: function _normalizeRoute(route, opts) {
+ route = route.replace(/\/+/gmi, '/').replace(/^\//, '');
+ if (opts.asPattern) {
+ return route;
+ } else {
+ var res = route.replace(/\(\/\)/gmi, '/').replace(/\/+/gmi, '/');
+ return res;
+ }
+ },
+ _tryCreateRouter: function _tryCreateRouter() {
+ var create = this.getProperty('createRouter') === true;
+ if (create) {
+ this.router = this._createAppRouter();
+ }
+ },
+ _createAppRouter: function _createAppRouter() {
+ var hash = this.getRouteHash();
+ if (!_.size(hash)) return;
+ return new Router(hash);
+ },
+ _proxyEvents: function _proxyEvents() {
+ var proxyContexts = this._getProxyContexts();
+ this._proxyEventsTo(proxyContexts);
+ },
+ _getProxyContexts: function _getProxyContexts() {
+ var rdy = [];
+ var manager = this.getProperty('manager');
+ if (manager) {
+ rdy.push({ context: manager });
+ }
+ var radio = this.getChannel();
+ if (radio) {
+ var allowed = this.getProperty('proxyEventsToRadio');
+ rdy.push({ context: radio, allowed: allowed });
+ }
+ return rdy;
+ },
+ _proxyEventsTo: function _proxyEventsTo(contexts) {
+ var all = [];
+ var eventsHash = {};
+
+ _(contexts).each(function (context) {
+ if (!context.allowed) all.push(context.context);else {
+ _(context.allowed).each(function (allowed) {
+ eventsHash[allowed] || (eventsHash[allowed] = []);
+ eventsHash[allowed].push(context.context);
+ });
+ }
+ });
+ var page = this;
+ page.on('all', function (eventName) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ var contexts = eventName in eventsHash ? eventsHash[eventName] : all;
+ var triggerArguments = [page].concat(args);
+ _(contexts).each(function (context) {
+ return context.triggerMethod.apply(context, ['page:' + eventName].concat(_toConsumableArray(triggerArguments)));
+ });
+ });
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ var add = {};
+ var manager = this.getProperty('manager');
+ if (manager) add.manager = manager;
+ return _.extend(def, this.getProperty('childOptions'), add);
+ },
+
+ _registerIdentityHandlers: function _registerIdentityHandlers() {
+ var _this = this;
+
+ this.listenTo(identity, 'change', function () {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ _this._destroyLinkModel();
+ _this.triggerMethod.apply(_this, ['identity:change'].concat(args));
+ });
+ }
+});
+
+var Base$3 = mix(App).with(GetNameLabel);
+
+var YatPageManager = Base$3.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base$3.apply(this, args);
+ this._initializeYatPageManager.apply(this, args);
+ },
+
+ throwChildErrors: true,
+ createRouter: function createRouter() {
+ var children = this.getChildren({ startable: false });
+ var hash = {};
+ _(children).each(function (page) {
+ if (_.isFunction(page.getRouteHash)) {
+ _.extend(hash, page.getRouteHash());
+ }
+ });
+ this._routesHash = hash;
+ this.setRouter(Router.create(hash, this));
+ },
+ setRouter: function setRouter(router) {
+ this.router = router;
+ },
+ getRouter: function getRouter() {
+ return this.router;
+ },
+ getLinks: function getLinks() {
+ var children = this.getChildren();
+ if (!children) return;
+ return _(children).chain().map(function (child) {
+ return child.getLinkModel();
+ }).filter(function (child) {
+ return !!child;
+ }).value();
+ },
+ execute: function execute(route) {
+ var page = this.getPage(route);
+ if (!!page) page.start({ text: error.message });else if (route === '*NotFound') throw new YatError.NotFound('*NotFound handler is missing');else this.execute('*NotFound');
+ },
+ navigate: function navigate(url) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { trigger: true };
+
+
+ var router = this.getRouter();
+ if (router) router.navigate(url, opts);else console.warn('router not found');
+ },
+ getPage: function getPage(key) {
+
+ var found = _(this._routesHash).find(function (pageContext, route) {
+ if (route === key) return true;
+ if (pageContext.context.getName() === key) return true;
+ });
+ return found && found.context;
+ },
+ navigateToRoot: function navigateToRoot() {
+ var current = this.getState('currentPage');
+ var rootUrl = this.getProperty('rootUrl');
+ if (!rootUrl) {
+ var children = this.getChildren();
+ if (children && children.length) {
+ var root = children.find(function (child) {
+ return child != current;
+ });
+ rootUrl = root && root.getRoute();
+ }
+ }
+ if (rootUrl != null) this.navigate(rootUrl);else console.warn('root page not found');
+ },
+ _initializeYatPageManager: function _initializeYatPageManager() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.mergeOptions(opts, ['id', 'name', 'label']);
+ this._registerPageHandlers(opts);
+ this._registerIdentityHandlers();
+ this.createRouter();
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ return _.extend(def, this.getProperty('childOptions'), {
+ manager: this
+ });
+ },
+
+ _registerPageHandlers: function _registerPageHandlers() {
+ this.on('page:before:start', this._pageBeforeStart);
+ this.on('page:start', this._pageStart);
+ this.on('page:start:decline', this._pageDecline);
+ },
+ _pageBeforeStart: function _pageBeforeStart(page) {
+ var current = this.getState('currentPage');
+ if (current && current != page) {
+ current.stop();
+ }
+ },
+ _pageStart: function _pageStart(page) {
+ this.setState('currentPage', page);
+ },
+ _pageDecline: function _pageDecline() {
+ //console.log("decline", args)
+ },
+ _registerIdentityHandlers: function _registerIdentityHandlers() {
+ var _this = this;
+
+ this.listenTo(identity, 'change', function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ _this.triggerMethod.apply(_this, ['identity:change'].concat(args));
+ _this._moveToRootIfCurrentPageNotAllowed();
+ });
+ },
+ _moveToRootIfCurrentPageNotAllowed: function _moveToRootIfCurrentPageNotAllowed() {
+ var current = this.getState('currentPage');
+ if (!current || !current.isStartNotAllowed()) return;
+
+ this.navigateToRoot();
+ }
+});
+
+var YatCollectionView = mix(Mn.NextCollectionView).with(GlobalTemplateContext);
+
+var Collection = Bb.Collection.extend({});
+
+var CollectionGroups = YatObject.extend({
+
+ collection: undefined,
+ groupBy: undefined,
+
+ getGroups: function getGroups() {
+ return this.groups;
+ },
+ getGroup: function getGroup(name) {
+ var groups = this.getGroups();
+ return groups[name];
+ },
+ isGroupExists: function isGroupExists(name) {
+ return name in this.getGroups();
+ },
+ addGroup: function addGroup(name, models) {
+ if (this.isGroupExists(name)) return;
+ var groups = this.getGroups();
+ groups[name] = this._createGroup(name, models);
+ return groups[name];
+ },
+ removeGroup: function removeGroup(name) {
+ var group = this.getGroup(name);
+
+ if (!group) return;
+
+ if (_.isFunction(group.destroy)) group.destroy();else if (_.isFunction(group.stopListening)) group.stopListening();
+
+ delete this.groups[name];
+ },
+ group: function group() {
+ var result = {};
+ var colGroups = this.collection.groupBy(this.groupBy);
+ var optionGroups = this.getOption('groups');
+ _(optionGroups).each(function (name) {
+ if (name in colGroups) {
+ result[name] = colGroups[name];
+ delete colGroups[name];
+ } else result[name] = [];
+ });
+ _(colGroups).each(function (models, name) {
+ return result[name] = models;
+ });
+ return result;
+ },
+
+
+ constructor: function constructor(options) {
+ YatObject.apply(this, arguments);
+ this._initializeGrouppedCollection(options);
+ },
+ _initializeGrouppedCollection: function _initializeGrouppedCollection(options) {
+ if (this._initializedGC == true) return;
+
+ this.mergeOptions(options, ['collection', 'groupBy']);
+ this._ensureOptions();
+ this._initializeGroups();
+ this._initializeEventHandlers();
+
+ this._initializedGC == true;
+ },
+ _ensureOptions: function _ensureOptions() {
+ if (!this.collection) throw new Error('collection must be set');
+
+ if (!this.groupBy) throw new Error('groupBy must be set');
+
+ if (typeof this.groupBy === 'string') {
+ var propertyName = this.getOption('groupBy');
+ this.groupBy = function (model) {
+ return model.get(propertyName);
+ };
+ }
+ },
+ _initializeGroups: function _initializeGroups() {
+ var _this = this;
+
+ this.groups = {};
+ var groups = this.group();
+ _(groups).each(function (models, name) {
+ return _this.addGroup(name, models);
+ });
+ },
+ _getCollectionClass: function _getCollectionClass() {
+ return this.getOption('CollectionClass') || Collection;
+ },
+ _createGroup: function _createGroup(name, models) {
+ var groupBy = this.groupBy;
+ var Collection$$1 = this._getCollectionClass();
+ var groupCol = new Collection$$1(models);
+ groupCol.on('change', function (model) {
+ if (groupBy(model) !== name) groupCol.remove(model);
+ });
+ groupCol.name = name;
+ return groupCol;
+ },
+ _initializeEventHandlers: function _initializeEventHandlers() {
+ this.listenTo(this.collection, 'update', this._onCollectionUpdate);
+ },
+ _onCollectionUpdate: function _onCollectionUpdate(col, opts) {
+ var _this2 = this;
+
+ var data = (opts.changes.added || []).concat(opts.changes.merged || []);
+
+ var toAdd = _(data).groupBy(this.groupBy);
+ var toRemove = _(opts.changes.removed).groupBy(this.groupBy);
+
+ var groups = this.groups;
+ _(toAdd).each(function (models, groupName) {
+ if (groupName in groups) groups[groupName].add(models);else if (_this2.getOption('autoCreateNewGroups')) _this2.addGroup(groupName, models);
+ });
+
+ _(toRemove).each(function (models, groupName) {
+ if (groupName in groups) groups[groupName].remove(models);
+ });
+ },
+ _onModelChange: function _onModelChange(model) {
+ var groupName = this.groupBy(model);
+ if (this.groups[groupName]) this.groups[groupName].add(model);else {
+ console.warn('model is out of groupping', model, groupName);
+ }
+ },
+ destroy: function destroy() {
+
+ _(this.groups).each(function (group) {
+ group.stopListening();
+ if (_.isFunction(group.destroy)) group.destroy();
+ });
+ delete this.groups;
+
+ if (_.isFunction(YatObject.prototype.destroy)) YatObject.prototype.destroy.apply(this, arguments);
+
+ if (_.isFunction(this.collection.destroy)) this.collection.destroy();
+
+ delete this.collection;
+ }
+});
+
+var marionetteYat = {
+ VERSION: version,
+ Functions: Functions,
+ Helpers: Helpers,
+ Mixins: Mixins,
+ Behaviors: Behaviors,
+ Singletons: Singletons,
+ TemplateContext: GlobalTemplateContext$1,
+ modals: modals,
+ identity: identity,
+ createConfig: Config,
+ Object: YatObject,
+ Error: YatError,
+ App: App,
+ Page: YatPage,
+ Router: Router,
+ PageManager: YatPageManager,
+ View: YatView,
+ CollectionView: YatCollectionView,
+ Model: Model,
+ Collection: Collection,
+ CollectionGroups: CollectionGroups
+};
+
+export default marionetteYat;
+//# sourceMappingURL=marionette.yat.esm.js.map
diff --git a/dist/marionette.yat.esm.js.map b/dist/marionette.yat.esm.js.map
new file mode 100644
index 0000000..de10215
--- /dev/null
+++ b/dist/marionette.yat.esm.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"marionette.yat.esm.js","sources":["src/functions/view/compare-ab.js","src/functions/view/view-comparator.js","src/functions/view/view.js","src/functions/common/_smart-get.js","src/functions/common/get-label.js","src/functions/common/get-name.js","src/functions/common/get-value.js","src/functions/common/wrap.js","src/functions/common/unwrap.js","src/functions/common/set-get-by-path/_get-property.js","src/functions/common/set-get-by-path/_set-property.js","src/functions/common/set-get-by-path/_set-by-path-array.js","src/functions/common/set-get-by-path/set-by-path.js","src/functions/common/set-get-by-path/_get-by-path-array.js","src/functions/common/set-get-by-path/get-by-path.js","src/functions/common/flatten-unflatten/flatten-object.js","src/functions/common/flatten-unflatten/unflatten-object.js","src/functions/common/is-view.js","src/functions/common/common.js","src/functions/functions.js","src/helpers/isKnownCtor.js","src/YatError.js","src/helpers/mix.js","src/helpers/Helpers.js","src/mixins/get-name-label.js","src/mixins/get-option-property.js","src/mixins/radioable.js","src/mixins/stateable.js","src/mixins/startable.js","src/mixins/childrenable.js","src/singletons/template-context.js","src/mixins/global-template-context.js","src/mixins/Mixins.js","src/behaviors/behavior.js","src/behaviors/_base-draggable.js","src/behaviors/draggable.js","src/behaviors/droppable.js","src/behaviors/dynamic-class.js","src/behaviors/form-to-hash.js","src/behaviors/behaviors.js","src/YatObject.js","src/singletons/identity.js","src/YatView.js","src/YatConfig.js","src/singletons/modals/config.js","src/singletons/modals/modalView.js","src/singletons/modals/modals.js","src/singletons/singletons.js","src/YatApp.js","src/YatRouter.js","src/models/model.js","src/models/link.js","src/YatPage.js","src/YatPageManager.js","src/YatCollectionView.js","src/models/collection.js","src/YatCollectionGroups.js","src/marionette.yat.js"],"sourcesContent":["import Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\n\r\nlet getCompareABModel = (arg) => {\r\n\tif (arg instanceof Bb.Model)\r\n\t\treturn arg;\r\n\telse if (arg instanceof Mn.View)\r\n\t\treturn arg.model;\r\n\telse\r\n\t\treturn;\r\n}\r\nlet getCompareABView = (arg) => {\r\n\tif (arg instanceof Bb.View)\r\n\t\treturn arg;\r\n\telse\r\n\t\treturn;\r\n}\r\n\r\nlet compareAB = (a, b, func) => {\r\n\tif (typeof func === 'function') {\r\n\t\ta = func.call(a, getCompareABModel(a), getCompareABView(a));\r\n\t\tb = func.call(b, getCompareABModel(b), getCompareABView(b));\r\n\t}\r\n\treturn a < b ? -1\r\n\t\t: a > b ? 1\r\n\t\t\t: 0;\r\n};\r\n\r\nexport default compareAB;\r\n","import _ from 'underscore';\r\nimport compareAB from './compare-ab';\r\n\r\n/*\r\n*\taccepts:\r\n*\t\tvariant #1: a, b, function\r\n*\t\tvariant #2: [[a,b,function], [a,b,function]]\r\n*\t\tfunction can be undefined\r\n*\t\texample:\r\n*\t\t\tascending\t:\t\treturn viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });\r\n*\t\t\tdescending\t:\t\treturn viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });\r\n\t\t\tmultiple compares: \treturn viewComparator([[viewB, viewA, func], [viewB, viewA, func]])\r\n*/\r\nlet viewComparator = (...args) => {\r\n\tvar compareArray = [];\r\n\tvar result = 0;\r\n\r\n\tif (args.length >= 2)\t// single compare\r\n\t\treturn compareAB.apply(null, args);\r\n\telse if (args.length === 1 && args[0] instanceof Array)\t// array of compare\r\n\t\tcompareArray = args[0];\r\n\r\n\t_(compareArray).every(function (singleCompare) {\r\n\t\tresult = compareAB.apply(null, singleCompare);\r\n\t\treturn result === 0;\r\n\t});\r\n\t\r\n\treturn result;\r\n}\r\n\r\nexport default viewComparator;\r\n","import compareAB from './compare-ab';\r\nimport viewComparator from './view-comparator';\r\nexport default { compareAB, viewComparator };\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction normalizeValue(context, value, args){\r\n\tif(_.isFunction(value))\r\n\t\tvalue = value.apply(context, args || []);\r\n\treturn value;\r\n}\r\n\r\nfunction smartGet(context, opts = {}){\r\n\tif(opts.fields == null || (opts.fileds && !opts.fileds.length))\r\n\t\tthrow new Error('fields option missing');\r\n\r\n\topts.checked || (opts.checked = {});\r\n\t\r\n\tif(context == null) return;\r\n\r\n\tlet value;\r\n\tlet isModel = context instanceof Bb.Model;\r\n\tlet hasOptions = _.isObject(context.options);\r\n\tlet exclude = opts.exclude instanceof Array ? opts.exclude \r\n\t\t\t\t: typeof opts.exclude === 'string' ? [opts.exclude]\r\n\t\t\t\t: [];\r\n\r\n\r\n\t_(opts.fields).some((fieldName) => {\r\n\t\tif(fieldName in opts.checked) return;\r\n\t\topts.checked[fieldName] = true;\r\n\t\t\r\n\t\tif(exclude.indexOf(fieldName)>=0){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(isModel && value == null)\r\n\t\t\tvalue = normalizeValue(context, context.get(fieldName), opts.args);\r\n\r\n\t\tif(value == null)\r\n\t\t\tvalue = normalizeValue(context, context[fieldName], opts.args);\r\n\r\n\t\tif(value == null && hasOptions)\r\n\t\t\tvalue = normalizeValue(context, context.options[fieldName], opts.args);\r\n\r\n\t\treturn value != null;\r\n\t});\r\n\r\n\treturn value == null ? opts.default : value;\r\n\r\n}\r\n\r\n\r\nexport default smartGet;\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import _ from 'underscore';\r\nexport default function(prefix, value, delimeter = ':'){\r\n\tprefix || (prefix = '');\t\r\n\tvalue = value == null ? '' : value.toString();\r\n\treturn prefix + delimeter + value;\r\n}\r\n","import _ from 'underscore';\r\nexport default function(value, prefix, delimeter = \":\"){\r\n\r\n\tif(value == null) return;\r\n\tvalue = value.toString();\r\n\tprefix || (prefix = '');\r\n\tif(!value.length) return value;\r\n\r\n\tlet pattern = new RegExp(`^${prefix}${delimeter}`);\r\n\treturn value.replace(pattern, '');\r\n\r\n}\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nfunction getProperty(context, name)\r\n{\r\n\tif(context == null || !_.isObject(context) || name == null || name == '') return;\r\n\tif (context instanceof Bb.Model)\r\n\t\treturn context.get(name);\r\n\telse\r\n\t\treturn context[name];\r\n}\r\nexport default getProperty;\t\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property';\r\n\r\nfunction setProperty(context, name, value, options) {\r\n\tif (context instanceof Bb.Model) {\r\n\t\tcontext.set(name, value, { silent: true });\r\n\t}\r\n\telse {\r\n\t\tcontext[name] = value;\r\n\t}\r\n\r\n\tif(value instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: options.passPath.join(':'),\r\n\t\t\tproperty: name,\r\n\t\t\tmodel: value\r\n\t\t});\t\t\r\n\t}\r\n\r\n\toptions.passPath.push(name);\r\n\r\n\treturn getProperty(context, name);\r\n}\r\n\r\nexport default setProperty;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property'\r\nimport setProperty from './_set-property';\r\n\r\nfunction setByPathArr(context, propertyName, pathArray, value, options) {\r\n\r\n\tif(context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;\r\n\t\r\n\r\n\tif (!pathArray.length)\r\n\t\treturn setProperty(context, propertyName, value, options);\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!_.isObject(prop) && !options.force)\r\n\t\treturn;\r\n\telse if (!_.isObject(prop) && options.force)\r\n\t\tprop = setProperty(context, propertyName, {}, options);\r\n\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn setByPathArr(prop, nextName, pathArray, value, options);\r\n}\r\n\r\nexport default setByPathArr;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport setByPathArray from './_set-by-path-array';\r\n\r\nconst setByPath = function (context, path, value, opts) {\r\n\t\r\n\t\r\n\tif(context == null || !_.isObject(context) || path == null || path == '') return;\r\n\t\r\n\tlet options = _.extend({}, opts);\r\n\toptions.silent = options.silent === true;\r\n\toptions.force = options.force !== false;\r\n\t\r\n\t\r\n\tif (_.isObject(path) && !(path instanceof Array)) {\r\n\t\tvalue = path.value;\r\n\t\toptions.force = path.force !== false;\r\n\t\toptions.silent = path.silent === true;\r\n\t\tpath = path.path;\r\n\t}\r\n\t\r\n\toptions.path = path;\r\n\toptions.passPath = [];\r\n\toptions.models = [];\r\n\r\n\r\n\tif (path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\t\r\n\toptions.pathArray = [].slice.call(pathArray);\r\n\r\n\tif(!pathArray.length) return;\r\n\r\n\tlet chunksCount = pathArray.length;\r\n\tvar prop = pathArray.shift();\r\n\r\n\tif(context instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: '',\r\n\t\t\tproperty: prop,\r\n\t\t\tmodel: context\r\n\t\t});\r\n\t}\r\n\r\n\tlet result = setByPathArray(context, prop, pathArray, value, options);\r\n\r\n\tif(result === undefined && value !== undefined)\r\n\t\treturn result;\r\n\r\n\t//triggering change event on all met models\r\n\tif(!options.silent){\r\n\t\tlet originPath = options.pathArray.join(':');\r\n\t\twhile(options.models.length){\r\n\t\t\tlet modelContext = options.models.pop();\r\n\t\t\tlet propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);\r\n\t\t\tif(propertyEventName){\r\n\t\t\t\tmodelContext.model.trigger('change:' + propertyEventName, value);\r\n\t\t\t}\r\n\t\t\tmodelContext.model.trigger('change', modelContext.model);\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\treturn result;\r\n};\r\n\r\nexport default setByPath;\r\n","import _ from 'underscore';\r\nimport getProperty from './_get-property';\r\n\r\nfunction getByPathArray(context, propertyName, pathArray) {\r\n\t\r\n\tif (context == null || !_.isObject(context) || propertyName == null || propertyName == '')\r\n\t\treturn;\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!pathArray.length || (pathArray.length && prop == null))\r\n\t\treturn prop;\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn getByPathArray(prop, nextName, pathArray);\r\n\r\n}\r\n\r\nexport default getByPathArray;\r\n","import _ from 'underscore';\r\nimport getByPathArray from './_get-by-path-array';\r\n\r\nfunction getByPath (obj, path) {\r\n\r\n\tif(obj == null || !_.isObject(obj) || path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\r\n\tvar prop = pathArray.shift();\r\n\r\n\treturn getByPathArray(obj, prop, pathArray);\r\n}\r\n\r\nexport default getByPath;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction traverse(fields, root)\r\n{\r\n\troot = root || '';\r\n\tif (this == null || typeof this != 'object') return;\r\n\r\n\r\n\tvar hash = this instanceof Bb.Model ? this.attributes : this;\r\n\tvar props = Object.getOwnPropertyNames(hash);\r\n\tfor (var x = 0; x < props.length; x++) {\r\n\t\tvar name = props[x];\r\n\t\tvar prop = this[name];\r\n\r\n\t\tif (prop == null || typeof prop != 'object' || (prop instanceof Date || prop instanceof Array))\r\n\t\t\tfields[root + name] = prop;\r\n\t\telse if (typeof prop == 'object')\r\n\t\t\ttraverse.call(prop, fields, root + name + '.');\r\n\r\n\t}\r\n\t\t\r\n}\r\n\r\nfunction flattenObject(obj) {\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\ttraverse.call(obj, res);\r\n\treturn res;\r\n};\r\n\r\nexport default flattenObject;\r\n","import _ from 'underscore';\r\nimport setByPath from '../set-get-by-path/set-by-path';\r\n\r\nfunction unFlattenObject(obj) {\r\n\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\tfor (var e in obj) {\r\n\t\tsetByPath(res, e, obj[e], true);\r\n\t}\r\n\treturn res;\r\n\r\n}\r\n\r\nexport default unFlattenObject;\r\n","import Bb from 'backbone'\r\nexport default (arg) => arg instanceof Bb.View;\r\n","import getLabel from './get-label';\r\nimport getName from './get-name';\r\nimport getValue from './get-value';\r\nimport wrap from './wrap';\r\nimport unwrap from './unwrap';\r\nimport setByPath from './set-get-by-path/set-by-path'\r\nimport getByPath from './set-get-by-path/get-by-path'\r\nimport flattenObject from './flatten-unflatten/flatten-object';\r\nimport unFlattenObject from './flatten-unflatten/unflatten-object';\r\nimport isView from './is-view';\r\nexport default {\r\n\tgetLabel, getName, getValue, wrap, unwrap, setByPath, getByPath, flattenObject, unFlattenObject, isView\r\n}\r\n","import view from './view/view';\r\nimport common from './common/common';\r\nexport default { view, common };\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\n\r\nconst knownCtors = [\r\n\tBb.Model,\r\n\tBb.Collection,\r\n\tBb.View,\r\n\tBb.Router,\r\n\tMn.Object\r\n];\r\n\r\nfunction isKnownCtor(arg) {\r\n\tlet isFn = _.isFunction(arg);\r\n\tlet result = _(knownCtors).some((ctor) => arg === ctor || arg.prototype instanceof ctor);\r\n\treturn isFn && result;\r\n}\r\n\r\nexport default isKnownCtor;\r\n","import Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\n\r\n\r\nlet YatError = Mn.Error.extend({},{\r\n\tHttp400(message){\r\n\t\treturn this.Http(400,message);\r\n\t},\r\n\tHttp401(message){\r\n\t\treturn this.Http(401,message);\r\n\t},\r\n\tHttp403(message){\r\n\t\treturn this.Http(403,message);\r\n\t},\r\n\tHttp404(message){\r\n\t\treturn this.Http(404, message);\r\n\t},\r\n\tHttp500(message){\r\n\t\treturn this.Http(500, message);\r\n\t},\r\n\tHttp(status, message){\r\n\t\tlet error = new this({message:message, name:\"HttpError\"});\r\n\t\terror.status = status;\r\n\t\treturn error;\r\n\t},\r\n\tHttpRedirect(message){\r\n\t\treturn this.Http(301, message);\r\n\t},\r\n\tNotFound(message){\r\n\t\treturn this.Http404(message);\r\n\t},\r\n\tNotAuthorized(message){\r\n\t\treturn this.Http401(message);\r\n\t},\r\n\tForbidden(message){\r\n\t\treturn this.Http403(message);\r\n\t},\r\n});\r\n\r\nexport default YatError;\r\n","import _ from 'underscore'\r\nimport Mn from 'backbone.marionette';\r\nimport YatError from '../YatError';\r\n\r\nfunction smartExtend(Src, Dst){\r\n\tif(_.isFunction(Dst)){\r\n\t\treturn Dst(Src);\r\n\t}\r\n\telse if(_.isObject(Dst)){\r\n\t\treturn Src.extend(Dst);\r\n\t}\r\n\telse throw new YatError('Mixin fail, argument should be an object hash or mixin function')\r\n}\r\n\r\nfunction mix(BaseClass){\r\n\tlet Mixed = null;\r\n\tif(_.isFunction(BaseClass)){\r\n\t\tMixed = BaseClass;\r\n\t}\r\n\telse if(_.isObject(BaseClass) && BaseClass !== null){\r\n\t\tlet tmp = function(){};\r\n\t\ttmp.extend = Mn.extend;\r\n\t\tMixed = tmp.extend(BaseClass);\r\n\t}\r\n\telse {\r\n\t\tthrow new Error('argument should be an object or class definition')\r\n\t}\r\n\tif(!Mixed.extend) {\r\n\t\tMixed = Mn.extend.call(BaseClass, {});\r\n\t\tMixed.extend = Mn.extend;\r\n\t}\r\n\tlet fake = {\r\n\t\twith: (...args) => _.reduce(args, (memo, arg) => smartExtend(memo, arg), Mixed),\r\n\t\tclass: Mixed,\t\r\n\t}\r\n\treturn fake;\r\n}\r\n\r\nexport default mix;\r\n","import isKnownCtor from './isKnownCtor';\r\nimport mix from './mix';\r\nexport default {\r\n\tisKnownCtor,\r\n\tmix,\r\n}\r\n","import _ from 'underscore';\r\nimport common from '../functions/common/common';\r\nexport default function (Base) {\r\n\treturn Base.extend({\r\n\t\tgetName(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getName';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getName(this, options);\r\n\t\t},\r\n\t\tgetLabel(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getLabel';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getLabel(this, options);\r\n\t\t},\r\n\t\tgetValue(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getValue';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getValue(this, options);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n","import _ from 'underscore';\r\nimport isKnownCtor from '../helpers/isKnownCtor.js';\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\t//property first approach\r\n\t\tgetProperty(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this, key, options, this.getOption);\r\n\t\t},\r\n\t\t//options first approach\r\n\t\tgetOption(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this.getProperty('options',{deep:false}), key, options, this.getProperty);\r\n\t\t},\r\n\t\t_getOptionOrProperty(valueContext, key, options = {}, fallback)\r\n\t\t{\r\n\t\t\toptions.deep !== undefined || (options.deep = true);\r\n\t\t\toptions.force !== undefined || (options.force = true);\r\n\t\t\toptions.args || (options.args = []);\r\n\r\n\t\t\t//key and valueContext should be passed\r\n\t\t\tif(key == null || valueContext == null) return;\r\n\t\t\t\r\n\t\t\t//getting raw value\r\n\t\t\tlet value = valueContext[key];\r\n\r\n\t\t\t//if there is no raw value and deep option is true then getting value from fallback\r\n\t\t\tif(value === undefined && options.deep && _.isFunction(fallback)){\r\n\t\t\t\tlet fallbackOptions = _.extend({}, options, {deep:false, force: false});\r\n\t\t\t\tvalue = fallback.call(this, key, fallbackOptions); \r\n\t\t\t}\r\n\r\n\t\t\t//if returned value is function and is not any of known constructors and options property force set to true \r\n\t\t\t//we should return value of that function\r\n\t\t\t//options.args will be passed as arguments\r\n\t\t\tif(_.isFunction(value) && options.force && !isKnownCtor(value))\r\n\t\t\t\tvalue = value.apply(this, options.args || []);\r\n\r\n\t\t\t//console.log('key', key, value);\r\n\t\t\t\r\n\t\t\t//if value is still undefined we will return default option value\r\n\t\t\treturn value === undefined ? options.default : value;\r\n\t\t}\r\n\t});\r\n\treturn Mixin;\r\n}\r\n","import Mn from 'backbone.marionette';\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tlet initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);\r\n\t\t\tthis._initRadio({skip: initRadioOnInitialize});\r\n\t\t},\r\n\t\tgetChannel () {\r\n\t\t\tif(!this._channel) this._initRadio({skip:false});\r\n\t\t\treturn this._channel;\r\n\t\t},\r\n\t\t_initRadio(opts = {skip:true}){\r\n\t\t\tif(opts.skip == true) return;\r\n\r\n\t\t\tlet channelName = this.getProperty('channelName');\r\n\t\t\tif(!channelName){\r\n\t\t\t\tlet channel = this.getProperty('channel');\r\n\t\t\t\tif(channel)\r\n\t\t\t\t\tthis.channelName = channel.channelName;\r\n\t\t\t}\r\n\t\t\tMn.Object.prototype._initRadio.call(this);\r\n\t\t},\r\n\t\tradioRequest(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.request(...args);\r\n\t\t},\r\n\t\tradioTrigger(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.trigger(...args);\r\n\t\t},\r\n\t});\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (BaseClass) => {\r\n\tlet Mixin = BaseClass.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBaseClass.apply(this, args);\r\n\t\t\tthis.initializeStateable();\r\n\t\t},\r\n\t\tinitializeStateable(){\r\n\t\t\tthis._state = {};\r\n\t\t},\r\n\r\n\t\tgetState(key){\r\n\t\t\tconst state = this._state;\r\n\t\t\tif(!key) return state\r\n\t\t\telse return state[key];\r\n\t\t},\r\n\t\tsetState(key, value, options){\r\n\t\t\t\r\n\t\t\tif(key == null) return;\r\n\r\n\t\t\tif(_.isObject(key)){\r\n\t\t\t\tconst _this = this;\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\t_(value).each((propertyValue, propertyName) => _this.setState(propertyName, propertyValue, _.extend({},options,{doNotTriggerFullState: true})));\r\n\t\t\t\tthis._triggerStateChange(value, options);\r\n\t\t\t}else{\r\n\t\t\t\tconst state = this.getState();\r\n\t\t\t\tstate[key] = value;\r\n\t\t\t\tthis._triggerStateChange(key, value, options);\r\n\t\t\t}\r\n\t\t},\r\n\t\tclearState(opts = {}){\r\n\t\t\tlet state = this.getState();\r\n\t\t\tlet broadcast = _.extend({}, state);\r\n\t\t\t_(state).each((s,key) => {\r\n\t\t\t\tbroadcast[key] = undefined;\r\n\t\t\t\tdelete state[key];\r\n\t\t\t});\r\n\t\t\tthis._triggerStateChange(broadcast);\r\n\t\t},\r\n\t\t_triggerStateChange(key, value, options){\r\n\r\n\t\t\tif(!_.isFunction(this.triggerMethod)) return;\r\n\r\n\t\t\tif(!_.isObject(key)){\r\n\t\t\t\tthis.triggerMethod('state:' + key, value, options);\r\n\t\t\t\tif(value === true || value === false || (!!value && typeof value === 'string'))\r\n\t\t\t\t\tthis.triggerMethod('state:' + key + ':' + value.toString(), options);\r\n\t\t\t\tif(!options || (options && !options.doNotTriggerFullState)){\r\n\t\t\t\t\tthis.triggerMethod('state', {[key]:value}, options);\t\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t//key is a hash of states\r\n\t\t\t\t//value is options\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\tthis.triggerMethod('state', value, options);\r\n\t\t\t}\r\n\t\t},\t\t\r\n\t});\r\n\tMixin.Stateable = true;\r\n\r\n\treturn Mixin;\r\n\r\n}\r\n","import _ from 'underscore';\r\nimport mix from '../helpers/mix.js';\r\nimport State from './stateable.js';\r\nimport YatError from '../YatError.js';\r\n\r\nconst STATES = {\r\n\tINITIALIZED: 'initialized',\r\n\tSTARTING: 'starting',\r\n\tRUNNING: 'running',\r\n\tSTOPPING: 'stopping',\r\n\tWAITING: 'waiting',\r\n\tDESTROYED: 'destroyed'\r\n}\r\n\r\nconst STATE_KEY = 'life';\r\n\r\n\r\nfunction getPropertyPromise(context, propertyName){\r\n\r\n\tif(context == null || propertyName == null)\r\n\t\treturn Promise.resolve();\r\n\r\n\tlet _promises1 = context['_'+propertyName] || [];\r\n\tlet _promises2 = _.result(context, propertyName) || [];\r\n\r\n\tlet rawPromises = _promises1.concat(_promises2);\r\n\t\t//context[propertyName] || [];\r\n\r\n\tlet promises = [];\r\n\t_(rawPromises).each((promiseArg) => {\r\n\t\tif(_.isFunction(promiseArg))\r\n\t\t\tpromises.push(promiseArg.call(this));\r\n\t\telse if(promiseArg != null)\r\n\t\t\tpromises.push(promiseArg);\r\n\t});\r\n\treturn Promise.all(promises);\r\n}\r\n\r\nfunction addPropertyPromise(context, propertyName, promise){\r\n\tcontext[propertyName] || (context[propertyName] = []);\r\n\tlet promises = context[propertyName];\r\n\tpromises.push(promise);\r\n}\r\n\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Middle = mix(Base).with(State);\r\n\tlet Mixin = Middle.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tMiddle.apply(this,args);\r\n\t\t\tthis.initializeStartable();\r\n\t\t},\r\n\r\n\t\tfreezeWhileStarting: false,\r\n\t\tfreezeUI(){ },\r\n\t\tunFreezeUI(){ },\r\n\t\tisStartNotAllowed(){ },\r\n\t\tisStopNotAllowed(){ },\r\n\r\n\t\taddStartPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_startRuntimePromises', promise);\r\n\t\t},\r\n\r\n\t\taddStopPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_stopPromises', promise);\r\n\t\t},\t\t\r\n\r\n\t\tinitializeStartable(){\r\n\t\t\t\r\n\t\t\tif(!(this.constructor.Startable && this.constructor.Stateable)) return;\r\n\r\n\t\t\tthis._registerStartableLifecycleListeners();\r\n\t\t\tthis._setLifeState(STATES.INITIALIZED);\r\n\t\t\tthis._startRuntimePromises = [];\r\n\t\t\tthis._startPromises = [];\r\n\t\t\tthis._stopPromises = [];\r\n\t\t},\t\r\n\r\n\t\tstart(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStarted = this._ensureStartableCanBeStarted();\r\n\t\t\tlet resultPromise = null;\r\n\t\t\tlet catchMethod = null;\r\n\r\n\t\t\tif(canNotBeStarted){\r\n\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t//resultPromise = Promise.reject(canNotBeStarted);\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tlet declineReason = this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\tresultPromise = Promise.reject(declineReason);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tvar currentState = this._getLifeState();\r\n\t\t\t\tthis._tryMergeStartOptions(options);\t\t\r\n\t\t\t\tthis.triggerMethod('before:start', ...args);\r\n\r\n\t\t\t\tresultPromise = this._getStartPromise();\r\n\t\t\t}\r\n\t\t\t*/\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// return resultPromise.then(() => {\r\n\t\t\t// \tthis.triggerStart(options)\r\n\t\t\t// }, (error) => {\t\t\t\t\r\n\t\t\t// \tthis._setLifeState(currentState);\r\n\t\t\t// \tif(catchMethod) catchMethod();\r\n\t\t\t// \treturn Promise.reject(error);\r\n\t\t\t// });\t\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStarted = _this._ensureStartableCanBeStarted();\r\n\r\n\t\t\t\tif(canNotBeStarted){\r\n\t\t\t\t\t_this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t\treject(canNotBeStarted)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\t_this.triggerMethod('before:start', ...args);\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStartPromise();\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStartOptions(options);\t\t\r\n\t\t\t\t\t_this.once('start', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStart(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\t\t},\r\n\r\n\t\ttriggerStart(options) {\r\n\t\t\tthis.triggerMethod('start', options);\r\n\t\t},\r\n\r\n\t\tstop(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStopped = this._ensureStartableCanBeStopped();\r\n\t\t\tif(canNotBeStopped){\r\n\t\t\t\tthis.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\treturn Promise.reject(canNotBeStopped);\t\t\t\t\r\n\t\t\t}\r\n\t\t\tlet declineReason = this.isStopNotAllowed(options);\r\n\t\t\tif(declineReason){\r\n\t\t\t\tthis.triggerMethod('stop:decline', declineReason);\r\n\t\t\t\treturn Promise.reject(declineReason);\r\n\t\t\t}\r\n\t\t\t\r\n\r\n\t\t\tvar currentState = this._getLifeState();\r\n\r\n\t\t\tthis._tryMergeStopOptions(options);\r\n\t\t\tthis.triggerMethod('before:stop', this, options);\r\n\r\n\t\t\tlet promise = this._getStopPromise();\r\n\r\n\t\t\treturn promise.then(() => {\r\n\t\t\t\tthis.triggerStop(options)\r\n\t\t\t}, () => {\r\n\t\t\t\tthis._setLifeState(currentState);\r\n\t\t\t});\t\r\n\t\t\t*/\r\n\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStopped = _this._ensureStartableCanBeStopped();\r\n\r\n\t\t\t\tif(canNotBeStopped){\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\t\treject(canNotBeStopped)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStopNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStopPromise();\r\n\t\t\t\t_this.triggerMethod('before:stop', ...args);\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStopOptions(options);\t\t\r\n\t\t\t\t\t_this.once('stop', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStop(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\r\n\t\t},\r\n\r\n\t\ttriggerStop(options) {\r\n\t\t\tthis.triggerMethod('stop', options);\r\n\t\t},\r\n\r\n\r\n\r\n\r\n\r\n\t\t//lifecycle state helpers\r\n\t\t_setLifeState(newstate){\r\n\t\t\tthis.setState(STATE_KEY, newstate);\r\n\t\t},\r\n\r\n\t\t_getLifeState(){\r\n\t\t\treturn this.getState(STATE_KEY);\r\n\t\t},\r\n\r\n\t\t_isLifeState(state){\r\n\t\t\treturn this._getLifeState() === state;\r\n\t\t},\r\n\r\n\t\t_isLifeStateIn(...states){\r\n\t\t\treturn _(states).some((state) => this._isLifeState(state));\r\n\t\t},\r\n\r\n\t\t_isInProcess(){\r\n\t\t\treturn this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);\r\n\t\t},\r\n\r\n\r\n\t\t_registerStartableLifecycleListeners(){\r\n\t\t\tlet freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.freezeUI))\r\n\t\t\t\tthis.on(`state:${STATE_KEY}:${STATES.STARTING}`,() => {\r\n\t\t\t\t\tthis.freezeUI();\r\n\t\t\t\t});\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.unFreezeUI))\r\n\t\t\t\tthis.on('start',() => {\r\n\t\t\t\t\tthis.unFreezeUI();\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\tthis.on('before:start', () => this._setLifeState(STATES.STARTING));\r\n\t\t\tthis.on('start', () => this._setLifeState(STATES.RUNNING));\r\n\t\t\tthis.on('before:stop',() => this._setLifeState(STATES.STOPPING));\r\n\t\t\tthis.on('stop',() => this._setLifeState(STATES.WAITING));\r\n\t\t\tthis.on('destroy',() => this._setLifeState(STATES.DESTROYED));\r\n\r\n\t\t},\t\r\n\r\n\t\t_tryMergeStartOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStartOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_tryMergeStopOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStopOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIntact(opts = {throwError: false}) {\r\n\t\t\tlet message = 'Startable has already been destroyed and cannot be used.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\r\n\t\t\tlet destroyed = this._isLifeState(STATES.DESTROYED);\r\n\t\t\tif(opts.throwError && destroyed){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(destroyed){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIdle(opts = {throwError:false}){\r\n\t\t\tlet message = 'Startable is not idle. current state: ' + this._getLifeState();\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet isNotIntact = this._ensureStartableIsIntact(opts);\r\n\t\t\tlet notIdle = this._isInProcess();\r\n\t\t\tif(opts.throwError && notIdle){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(isNotIntact){\r\n\t\t\t\treturn isNotIntact;\r\n\t\t\t}\r\n\t\t\telse if(notIdle){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableCanBeStarted(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable has already been started.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\t\t\tlet allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;\r\n\r\n\t\t\tif(!notIdle && allowStartWithoutStop) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\t\t\tif(opts.throwError && running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t_ensureStartableCanBeStopped(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable should be in `running` state.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\r\n\t\t\tlet allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;\r\n\t\t\tif(!notIdle && allowStopWithoutStart) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\r\n\t\t\tif(opts.throwError && !running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(!running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\r\n\t\t},\t\r\n\t\t\r\n\t\t_getStartPromise(options = {}){\r\n\t\t\treturn Promise.all(this._getStartPromises(options));\r\n\t\t},\r\n\r\n\t\t_getStartPromises(options = {}){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStartParentPromise());\r\n\t\t\tpromises.push(this._getStartPagePromise());\r\n\t\t\tif(options.noruntime !== true)\r\n\t\t\t\tpromises.push(this._getStartRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStartRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startRuntimePromises');\r\n\t\t},\r\n\t\t_getStartPagePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startPromises');\r\n\t\t},\r\n\t\t_getStartParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStartPromise))\r\n\t\t\t\treturn parent._getStartPromise({noruntime: true});\r\n\t\t},\r\n\r\n\t\t_getStopPromise(){\r\n\t\t\treturn Promise.all(this._getStopPromises());\r\n\t\t},\r\n\t\t\r\n\t\t_getStopPromises(){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStopRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStopRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'stopPromises');\r\n\t\t},\r\n\r\n\t\t_getStopParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStopPromise))\r\n\t\t\t\treturn parent._getStopPromise();\r\n\t\t},\r\n\r\n\r\n\t});\r\n\r\n\tMixin.Startable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (Base) => {\r\n\t\r\n\tconst CHILDREN_FIELD = '_children';\r\n\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args) {\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tthis.initializeChildrenable(...args);\r\n\t\t},\r\n\r\n\t\tinitializeChildrenable(options = {}){\r\n\t\t\tthis._initializeParrent(options);\r\n\t\t\tthis._initializeChildren(options);\r\n\t\t},\r\n\r\n\t\thasChildren(){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\treturn this[CHILDREN_FIELD].length > 0;\r\n\t\t},\r\n\r\n\t\tgetChildren(opts = {startable:true}){\r\n\t\t\tlet all = this[CHILDREN_FIELD] || [];\r\n\t\t\tif(!opts.startable){\r\n\t\t\t\treturn all;\r\n\t\t\t}else{\r\n\t\t\t\treturn all.filter((c) => !c.getProperty('isStartNotAllowed'));\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thasParent(){\r\n\t\t\tlet parent = this.getParent();\r\n\t\t\treturn _.isObject(parent);\r\n\t\t},\r\n\r\n\t\tgetParent(){\r\n\t\t\treturn this.getProperty('parent', {deep:false});\r\n\t\t},\r\n\r\n\t\t_initializeChildren(){\r\n\t\t\tlet _children = this.getProperty('children');\r\n\t\t\tlet children = [];\r\n\t\t\t_(_children).each((child) => {\r\n\r\n\t\t\t\tlet childContext = this._normalizeChildContext(child);\r\n\t\t\t\tlet initialized = this._initializeChild(childContext);\r\n\t\t\t\tif(initialized) children.push(initialized);\r\n\r\n\t\t\t});\r\n\t\t\tthis[CHILDREN_FIELD] = children;\r\n\t\t},\r\n\t\t_initializeChild(childContext)\r\n\t\t{\r\n\t\t\tif(childContext == null || !_.isFunction(childContext.Child)) return;\r\n\r\n\t\t\tlet Child = childContext.Child;\r\n\t\t\tlet opts = this._normalizeChildOptions(childContext);\r\n\t\t\treturn this.buildChild(Child, opts);\r\n\t\t},\r\n\r\n\t\t_normalizeChildContext(child){\r\n\t\t\tlet childContext = {};\r\n\r\n\t\t\tif(_.isFunction(child) && child.Childrenable){\r\n\t\t\t\t_.extend(childContext, { Child: child });\r\n\t\t\t}else if(_.isFunction(child)){\r\n\t\t\t\tchildContext = this._normalizeChildContext(child.call(this));\r\n\t\t\t}\r\n\t\t\telse if(_.isObject(child)){\r\n\t\t\t\tchildContext = child;\r\n\t\t\t}\r\n\t\t\treturn childContext;\r\n\t\t},\r\n\r\n\t\t_normalizeChildOptions(options){\r\n\t\t\tlet opts = _.extend({}, options);\r\n\t\t\tif(this.getOption('passToChildren') === true){\r\n\t\t\t\t_.extend(opts, this.options);\r\n\t\t\t}\r\n\t\t\topts.parent = this;\r\n\t\t\tdelete opts.Child;\r\n\t\t\treturn this._buildChildOptions(opts);\r\n\t\t},\r\n\r\n\t\t_buildChildOptions: function(def){\r\n\t\t\treturn _.extend(def, this.getProperty('childOptions'));\r\n\t\t},\r\n\r\n\t\tbuildChild(ChildClass, options){\r\n\t\t\treturn new ChildClass(options);\r\n\t\t},\r\n\r\n\t\t_initializeParrent(opts){\r\n\t\t\tif(this.parent == null && opts.parent != null)\r\n\t\t\t\tthis.parent = opts.parent;\r\n\t\t},\r\n\r\n\t});\r\n\r\n\tMixin.Childrenable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\nimport cid from '../functions/common/wrap';\r\nlet templateContextStore = [(view) => {\r\n\treturn {\r\n\t\t_v: view,\r\n\t\t_m: view.model || {},\r\n\t\t_cid: (arg) => cid(view.cid, arg)\r\n\t}\r\n}];\r\nlet compiledContext = {}; //rethink how it can be used\r\nlet hasChanges = false;\r\n\r\nfunction normalizeValue(value, ...args){\r\n\tif(_.isFunction(value))\r\n\t\treturn value(...args);\r\n\telse if(_.isObject(value))\r\n\t\treturn value;\r\n\telse\r\n\t\treturn {};\r\n}\r\n\r\nconst GlobalTemplateContext = {\r\n\tmix(viewTemplateContext, ...args){\r\n\t\tlet global = this.get(...args);\r\n\t\treturn _.extend(global, viewTemplateContext);\r\n\t},\r\n\tget(...args){\r\n\t\treturn this.compile(...args);\r\n\t},\t\r\n\tadd(...args){\r\n\t\t_(args).each((item) => this.push(item));\r\n\t},\r\n\r\n\tcompile(...args){ \r\n\r\n\t\tif(hasChanges)\r\n\t\t\tcompiledContext = {};\r\n\r\n\t\tlet newcontext = {};\r\n\r\n\t\t_(templateContextStore).each((cntx) => {\r\n\t\t\tif(_.isFunction(cntx))\r\n\t\t\t\t_.extend(newcontext, normalizeValue(cntx, ...args));\r\n\t\t\telse if(hasChanges){\r\n\t\t\t\t_.extend(compiledContext, cntx);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(!hasChanges)\r\n\t\t\t_.extend(newcontext, compiledContext);\r\n\t\t\r\n\t\thasChanges = false;\r\n\t\treturn newcontext;\r\n\t},\r\n\tpop(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.pop();\r\n\t},\r\n\tshift(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.shift();\r\n\t},\r\n\tpush(item){ \r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.push(item); \r\n\t},\r\n\tunshift(item){\r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.unshift(item);\r\n\t},\r\n\tclear(){\r\n\t\thasChanges = false;\r\n\t\tcompiledContext = {};\r\n\t\ttemplateContextStore = [];\r\n\t},\r\n}\r\n\r\nexport default GlobalTemplateContext;\r\n","import _ from 'underscore';\r\nimport TemplateContext from '../singletons/template-context';\r\n\r\nexport default (Base) => Base.extend({\r\n\tmixinTemplateContext(target = {}) {\r\n\t\t\r\n\t\tvar templateContext = TemplateContext.mix(_.result(this, 'templateContext'), this);\r\n\t\t\r\n\t\treturn _.extend(target, templateContext);\r\n\t},\r\n})\r\n","import GetNameLabel from './get-name-label';\r\nimport GetOptionProperty from './get-option-property';\r\nimport Radioable from './radioable.js';\r\nimport Stateable from './stateable';\r\nimport Startable from './startable';\r\nimport Childrenable from './childrenable';\r\nimport GlobalTemplateContext from './global-template-context';\r\n\r\nexport default {\r\n\tGetNameLabel,\r\n\tGetOptionProperty,\r\n\tRadioable,\r\n\tStateable,\r\n\tStartable,\r\n\tChildrenable,\r\n\tGlobalTemplateContext,\r\n}\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from '../helpers/mix';\r\nimport GetOptionProperty from '../mixins/get-option-property';\r\nimport fns from '../functions/common/common';\r\nconst BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);\r\nexport default BaseBehavior.extend({\r\n\r\n\tlistenViewInitialize: true,\r\n\r\n\tconstructor(){\r\n\r\n\t\tif(this.getProperty('listenViewInitialize') === true)\r\n\t\t\tthis.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));\r\n\r\n\t\tBaseBehavior.apply(this, arguments);\r\n\t},\r\n\r\n\tgetModel: function () {\r\n\t\treturn this.view.model;\r\n\t},\t\r\n\tcidle(name){\r\n\t\treturn fns.wrap(this.view.cid, name);\r\n\t},\r\n\tunCidle(name){\r\n\t\treturn fns.unwrap(name, this.view.cid); \r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst BaseDraggable = Behavior.extend({\r\n\r\n\ttriggerEl: undefined, //drag initialization element, if not set equal to view.$el\r\n\tmoveBeforeStart: 10,\r\n\tscope: 'drag',\r\n\r\n\tgetDragEventsContext(){\r\n\t\treturn this.$doc;\r\n\t},\r\n\tgetDragEventsElementSelector(){\r\n\t\treturn '*';\r\n\t},\r\n\tgetTriggerEl(){\r\n\t\tif(this._$el) return this._$el;\r\n\r\n\t\tlet el = this.getOption('triggerEl');\r\n\t\tif(el == null && this.view.$el)\r\n\t\t\tthis._$el = this.view.$el;\r\n\t\telse if(el && el.jquery) this._$el = el\r\n\t\telse if(el instanceof HTMLElement) this._$el = $(el)\r\n\t\telse if(typeof el === 'string' && el.length)\r\n\t\t\tthis._$el = this.view.$(el);\r\n\t\telse\r\n\t\t\tthrow new Error('trigger element should be a DOM or jQuery object or string selector.', el);\r\n\r\n\t\treturn this._$el;\r\n\t},\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\r\n\tshouldHandleDomEvents(dragging){\r\n\t\treturn this.isSameScope(dragging) && this !== dragging;\r\n\t},\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tthis._clearDragData();\r\n\t\t\r\n\t\tthis.$doc = $(document);\r\n\r\n\t\tBehavior.apply(this, args);\r\n\r\n\t\tthis._defineDocumentBindings();\r\n\r\n\t},\r\n\t_clearDragData(){\r\n\t\tthis._dragData = {};\r\n\t},\r\n\t_defineDocumentBindings(){\r\n\t\tthis.__b = {};\r\n\t\tthis.__b.setupDragDetection = _.bind(this._setupDragDetection, this);\r\n\t\tthis.__b.handleMouseUp = _.bind(this._handleMouseUp, this);\r\n\t\tthis.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);\r\n\t\tthis.__b.handleDragMove = _.bind(this._handleDragMove, this);\r\n\t\tthis.__b.handleElementEnter = _.bind(this._handleElementEnter, this);\r\n\t\tthis.__b.handleElementLeave = _.bind(this._handleElementLeave, this);\r\n\t\tthis.__b.handleElementOver = _.bind(this._handleElementOver, this);\r\n\t},\r\n\r\n\tonInitialize(){\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\r\n\r\n\t_initializeDragListener(){\r\n\t\tlet $el = this.getTriggerEl();\r\n\t\t$el.one('mousedown', this.__b.setupDragDetection);\r\n\t},\r\n\t_setupDragDetection(e){\r\n\t\tif(this.view.dragDisabled === true){ \r\n\t\t\tthis._initializeDragListener();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\te.stopPropagation();\r\n\r\n\t\tthis.$doc.one('mouseup', this.__b.handleMouseUp);\r\n\r\n\t\tthis._dragData.startX = e.pageX;\r\n\t\tthis._dragData.startY = e.pageY;\r\n\t\tthis.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t},\r\n\t_handleMouseUp(e){\r\n\t\tif(this._dragData.dragging)\r\n\t\t\tthis._handleDragEnd(e);\r\n\t\telse\r\n\t\t\tthis._handleEndWithoutDrag(e);\r\n\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\t_handleEndWithoutDrag(e){\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\t},\r\n\t_handleDragEnd(e){\r\n\t\tthis._dragData.dragging = false;\r\n\r\n\t\tthis.$doc.off('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\t$context.off('mouseenter', this.__b.handleElementEnter);\r\n\t\t$context.off('mousemove', this.__b.handleElementOver);\r\n\r\n\t\tif(this._dragData.drop && this._dragData.drop.context){\r\n\t\t\tthis._dragData.drop.context.catchDraggable(this, this._dragData.drop);\r\n\t\t\tthis.triggerMethod('drag:drop', this._dragData.drop);\r\n\t\t}\r\n\r\n\t\tthis.triggerMethod('drag:end');\r\n\r\n\t},\r\n\r\n\t_handleMoveAfterMouseDown(e){\r\n\t\te.stopPropagation();\r\n\r\n\t\tlet distance = this._getStartPositionPixelOffset(e);\r\n\t\tlet startIfMoreThan = this.getOption('moveBeforeStart');\r\n\t\tif(distance >= startIfMoreThan)\r\n\t\t\tthis._startDragSession();\r\n\t},\r\n\t_getStartPositionPixelOffset(e){\r\n\t\tlet x = Math.abs(e.pageX - this._dragData.startX);\r\n\t\tlet y = Math.abs(e.pageY - this._dragData.startY);\r\n\t\treturn x > y ? x : y;\r\n\t},\r\n\t_startDragSession(){\r\n\t\tthis._dragData.dragging = true;\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t\tthis.$doc.on('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\tlet selector = this.getDragEventsElementSelector();\r\n\r\n\t\t$context.on('mouseenter', selector, this.__b.handleElementEnter);\r\n\r\n\t\t$context.on('mousemove', selector, this.__b.handleElementOver);\r\n\r\n\r\n\t\tthis.view.triggerMethod('drag:start');\r\n\t},\r\n\t_handleDragMove(ev){\r\n\t\tev.stopPropagation();\r\n\r\n\t\tthis.triggerMethod('drag', ev);\r\n\r\n\t},\r\n\t_handleElementEnter(e){\r\n\t\tlet $over = $(e.target);\r\n\r\n\r\n\t\tif(this._dragData.over != $over){\r\n\t\t\tthis._dragData.over = $over;\r\n\t\t\t$over.trigger('drag:enter', this);\r\n\t\t\t$over.one('mouseleave', () => this.trigger('drag:leave', this));\r\n\r\n\t\t}\r\n\t},\r\n\t_handleElementLeave(e){\r\n\t\tlet $over = $(e.target);\r\n\t\t$over.trigger('drag:leave', this);\r\n\t},\r\n\t_handleElementOver(e){\r\n\t\tlet $over = $(e.target);\r\n\t\tlet event = this._createCustomDomEvent('drag:over', e);\r\n\t\t$over.trigger(event, this);\r\n\t},\r\n\t_createCustomDomEvent: function (name, event, merge) {\r\n\t\tif (!merge)\r\n\t\t\tmerge = [\"pageX\", \"pageY\", \"clientX\", \"clientY\", \"offsetX\", \"offsetY\", \"target\"];\r\n\r\n\t\tvar customEvent = jQuery.Event(name);\r\n\t\t_(merge).each((prop) => customEvent[prop] = event[prop]);\r\n\r\n\t\treturn customEvent;\r\n\t},\t\r\n});\r\n\r\nexport default BaseDraggable;\r\n","import _ from 'underscore';\r\nimport BaseDraggable from './_base-draggable';\r\n\r\nconst DraggableBehavior = BaseDraggable.extend({\r\n\r\n\tuseGhost: true,\r\n\tviewCssClass: 'dragging',\r\n\tghostCssClass: 'ghost',\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tBaseDraggable.apply(this, args);\r\n\r\n\t\tthis.on('drag', this._onDrag);\r\n\t\tthis.on('drag:start', this._onDragStart);\r\n\t\tthis.on('drag:end', this._onDragEnd);\r\n\r\n\t},\r\n\r\n\tevents:{\r\n\t\t'drag:enter'(e, dragging){\r\n\t\t\tif(!this.shouldHandleDomEvents(dragging)) return;\r\n\t\t},\r\n\t\t'drag:over'(e, dragging){\r\n\t\t\tif(!this.isSameScope(dragging)) return;\r\n\t\t\te.stopPropagation();\r\n\r\n\t\t\tlet newEvent = this._createCustomDomEvent('drag:over', e);\r\n\r\n\t\t\tlet parent = this.$el.parent();\r\n\t\t\tif(parent)\r\n\t\t\t\tparent.trigger(newEvent, [dragging, this]);\t\t\t\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_onDragEnd(ev){\r\n\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._removeGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.removeClass(this.getOption('viewCssClass'));\r\n\r\n\t\tthis._clearDragData();\r\n\t},\r\n\t_onDragStart(ev){\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._createGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.addClass(this.getOption('viewCssClass'));\r\n\t},\r\n\t_onDrag(ev){\r\n\t\tthis.setGhostPosition(ev.pageY, ev.pageX);\r\n\t},\r\n\t_removeGhost(){\r\n\t\tthis.$ghost.remove();\r\n\t\tdelete this.$ghost;\r\n\t},\r\n\tcreateGhost(){\r\n\t\tlet $g = this.$el.clone();\r\n\t\tlet {top,left} = this.$el.offset();\r\n\t\t$g.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t\twidth: this.$el.outerWidth(),\r\n\t\t\theight: this.$el.outerHeight(),\r\n\t\t});\r\n\t\treturn $g;\r\n\t},\r\n\t_createGhost(){\r\n\t\tvar $g = this.createGhost();\r\n\t\tif($g.css('position') != 'absolute')\r\n\t\t\t$g.css('position','absolute');\r\n\r\n\t\tlet addClasses = this.getOption('ghostCssClass');\r\n\t\tif(addClasses)\r\n\t\t\t$g.addClass(addClasses);\r\n\r\n\t\t$g.appendTo($('body'));\r\n\t\tthis._setGhost($g);\r\n\t},\r\n\t_setGhost($g){\r\n\t\tthis.$ghost = $g;\r\n\t},\r\n\tgetGhost(){\r\n\t\treturn this.$ghost;\t\r\n\t},\r\n\tsetGhostPosition(top, left){\r\n\t\t\r\n\t\tlet $ghost = this.getGhost();\r\n\t\tif (!$ghost) return;\r\n\r\n\t\t$ghost.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t});\t\t\r\n\r\n\t}\r\n\r\n});\r\n\r\n\r\nexport default DraggableBehavior;\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst DroppableBehavior = Behavior.extend({\r\n\tscope:'drag',\r\n\tevents:{\r\n\t\t'drag:over':'_onDomDragOver'\r\n\t},\r\n\r\n\t//because of mn 3.5.1 bug of first render isAtached flag\r\n\t_skipFirstAttach: true,\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\tgetEventXY(e){\r\n\t\treturn {x: e.pageX, y: e.pageY};\r\n\t},\r\n\tgetChildren(){\r\n\t\treturn _(this.view.children._views).filter((v) => v.model && v.isRendered() && v.isAttached());\r\n\t},\r\n\tcatchDraggable(draggable, dropContext){\r\n\t\tthis._onDrop(draggable, dropContext);\r\n\t},\r\n\t\r\n\t\r\n\tconstructor: function(...args){\r\n\t\tBehavior.apply(this, args);\r\n\t\tthis._initReorderBehavior();\r\n\t},\r\n\t_initReorderBehavior(){\r\n\t\tthis.listenToOnce(this.view, 'render', () => {\r\n\t\t\tthis.reOrder({ silent: true })\r\n\t\t\tthis.listenTo(this.view.collection, 'update', function (collection, options) {\r\n\t\t\t\tlet changes = (options || {}).changes || {};\r\n\t\t\t\tthis.reOrder();\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\treOrder(options = {}){\r\n\t\t\r\n\t\tthis.view.sort();\r\n\r\n\t\tvar children = this.children = [];\r\n\t\tvar skipAttach = this._skipFirstAttach\r\n\t\t_(this.view.children._views).each((view, index) => {\r\n\t\t\tif (!view.model) return;\r\n\t\t\tview.model.set('order', index);\r\n\t\t\tif (view.isRendered() && (skipAttach || view.isAttached()))\r\n\t\t\t\tchildren.push(view);\r\n\t\t});\r\n\r\n\t\tthis.hasChildren = this.children.length > 0;\r\n\r\n\t\tif (options.silent != true && this.view.collection)\r\n\t\t\tthis.view.collection.trigger('reordered');\r\n\r\n\t\tthis._skipFirstAttach = false;\r\n\r\n\t},\r\n\r\n\t// _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },\r\n\t// _onChildrenReady(){\r\n\t// \tthis._refreshChildren();\r\n\t// },\r\n\t// _refreshChildren(){\r\n\t\t\r\n\t// \tthis.children = this.getChildren();\r\n\t// \tthis.hasChildren = this.children.length > 0;\r\n\r\n\t// \tthis.view.collection.trigger('reordered', this.view.collection.cid);\r\n\t// },\r\n\r\n\r\n\t_onDomDragOver(e, dragging, child){\r\n\t\tif(!this.isSameScope(dragging)) return;\r\n\t\te.stopPropagation();\r\n\t\t\r\n\r\n\t\tif(dragging === child || (this.hasChildren && !child)) return;\r\n\r\n\t\tdragging._dragData.drop || (dragging._dragData.drop = {});\r\n\t\tlet storedDrop = dragging._dragData.drop;\r\n\r\n\t\tlet xy = this.getEventXY(e);\r\n\r\n\t\tlet drop = this._getDropContext(xy, child);\r\n\t\tdrop.context = this;\r\n\r\n\t\tlet mixedDrop = _.extend({}, storedDrop, drop);\r\n\t\tlet keys = _.keys(mixedDrop);\r\n\t\tlet hasChanges = _(keys).some((k) => storedDrop[k] !== drop[k]);\r\n\t\tif(hasChanges){\r\n\t\t\tdragging._dragData.drop = drop;\r\n\t\t\tthis._onDropContextChange(dragging, drop);\r\n\t\t}\r\n\r\n\t},\r\n\t_getDropContext(xy, child){\r\n\r\n\t\tlet children = this.children || [];\r\n\t\tif(!children.length) return {insert:'before'};\r\n\r\n\t\tlet $el = child ? child.$el : this.$el;\r\n\t\tlet position = this._getPositionByEventXY(xy, $el);\r\n\t\treturn this._getDropContextByPosisiton(position, child);\r\n\r\n\t},\r\n\t_getPositionByEventXY(xy, $el){\r\n\r\n\t\tlet elOffset = $el.offset();\r\n\t\tlet elDimension = {width: $el.outerWidth(), height: $el.outerHeight()};\r\n\t\tlet xHalf = elOffset.left + elDimension.width / 2;\r\n\t\tlet yHalf = elOffset.top + elDimension.height / 2;\r\n\t\tlet r = {x:undefined, y:undefined};\r\n\r\n\t\tr.x = xy.x <= xHalf ? 'left' : 'right'\r\n\t\tr.y = xy.y <= yHalf ? 'top' : 'bottom';\r\n\r\n\t\treturn r;\r\n\t},\r\n\t_getDropContextByPosisiton(position, child){\r\n\r\n\t\tlet direction = this.getOption('direction') || 'vertical';\r\n\r\n\t\tlet insert = direction == 'horizontal' \r\n\t\t\t? position.x == 'left' ? 'before' : 'after'\r\n\t\t\t: position.y == 'top' ? 'before' : 'after';\r\n\r\n\t\tvar childView = undefined;\r\n\r\n\t\tif(child){\r\n\t\t\tchildView = child.view;\r\n\t\t}else{\r\n\t\t\tchildView = insert == 'before' ? this.children[0] : (this.children.length && _(this.children).last());\r\n\t\t}\r\n\r\n\t\tlet index = this.view.children._views.indexOf(childView);\r\n\r\n\t\treturn {\r\n\t\t\tinsert,\r\n\t\t\tchildView,\r\n\t\t\tindex,\r\n\t\t\tnoChild: !child,\r\n\t\t}\r\n\r\n\t},\r\n\t_onDropContextChange(dragging, context){\r\n\t\tthis.triggerMethod('drop:context:change', dragging, context);\r\n\t},\r\n\t_onDrop(draggable, dropContext){\r\n\t\tthis.triggerMethod('drop', draggable, dropContext);\r\n\t},\r\n});\r\n\r\n\r\n\r\nexport default DroppableBehavior;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\n\r\nconst DynamicClass = Behavior.extend({\t\r\n\tupdateElementClass(changeSource){\r\n\t\tlet viewCls = _.result(this.view, 'className') || '';\r\n\t\tlet addCls = _.result(this.view, 'dynamicClassName') || '';\r\n\t\tthis.$el.attr({\r\n\t\t\tclass: (viewCls + ' ' + addCls).trim()\r\n\t\t});\r\n\r\n\t},\r\n\r\n\trefreshOnModelChange: true,\r\n\trefreshOnDomChange: false,\r\n\trefreshOnViewRefresh: true,\r\n\trefreshOnViewBeforeRender: true,\r\n\trefreshOnViewRender: false,\r\n\r\n\tmodelEvents:{\r\n\t\t'change'(){ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change'); }\r\n\t},\r\n\tevents:{\r\n\t\t'change'(){ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change'); }\r\n\t},\r\n\tonRefresh(){\r\n\t\tthis.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh'); \r\n\t},\r\n\tonRender(){\r\n\t\tthis.getProperty('refreshOnViewRender') && this.updateElementClass('view:render'); \r\n\t},\r\n\tonBeforeRender(){\r\n\t\tthis.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render'); \r\n\t},\r\n\tonRefreshCssClass(){\r\n\t\tthis.updateElementClass();\r\n\t},\r\n\tonSetupRefreshCssClass(setup){\r\n\t\tif(setup == null || !_.isObject(setup)) return;\r\n\t\tlet properties = ['refreshOnModelChange','refreshOnDomChange','refreshOnViewRefresh','refreshOnViewBeforeRender','refreshOnViewRender'];\r\n\t\t_(setup).each((value, property) => {\r\n\t\t\tthis[property] = value === true;\r\n\t\t});\r\n\t},\r\n});\r\n\r\nexport default DynamicClass;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport flattenObject from '../functions/common/flatten-unflatten/flatten-object';\r\nimport unFlattenObject from '../functions/common/flatten-unflatten/unflatten-object';\r\n\r\nexport default mix(Behavior).with(Stateable).extend({\r\n\tapplyDelay: 1, //in ms\r\n\tautoApplyToModel: false, //finalize\r\n\tautoChangeModel: false, //on every change\r\n\t\r\n\tfillFormFromModel: true,\r\n\r\n\tapplySelector: '.apply',\r\n\tcancelSelector: '.cancel',\r\n\tresetSelector: '.reset',\r\n\r\n\tinitialize(opts){\r\n\r\n\t\tthis.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));\r\n\t\tthis.mergeOptions(opts,['values']);\r\n\r\n\t\tthis.extendDefaultValues({});\r\n\r\n\t},\r\n\r\n\textendDefaultValues(hash){\r\n\r\n\t\tthis._values = _.extend(this._values || {}, hash);\r\n\r\n\t},\t\r\n\r\n\tonViewInitialize(){\r\n\r\n\t\t//this.extendDefaultValues(this.getProperty('values'));\r\n\r\n\t\tlet model = this.getModel();\r\n\t\tif(model){\r\n\t\t\tthis.extendDefaultValues(model.toJSON());\r\n\t\t}\r\n\t},\r\n\r\n\tonRender(){\r\n\r\n\t\tif(!this.firstRender){\r\n\t\t\tthis.buildFormBindings();\r\n\t\t\tthis.setState(this._tryFlatValues(this._values));\r\n\t\t\tthis.setValuesToForm(this.getValues({raw:true}));\t\t\t\r\n\t\t}\r\n\t\tthis.firstRender = true;\r\n\t},\r\n\r\n\r\n\t//finallizing\r\n\ttriggers(){\r\n\t\treturn {\r\n\t\t\t['click ' + this.getProperty('applySelector')]:'trigger:apply',\r\n\t\t\t['click ' + this.getProperty('cancelSelector')]:'trigger:cancel',\r\n\t\t\t['click ' + this.getProperty('resetSelector')]:'trigger:reset',\r\n\t\t}\r\n\t},\r\n\r\n\t_tryFlatValues(raw){\r\n\t\treturn flattenObject(raw);\r\n\t},\r\n\t_tryUnFlatValues(raw){\r\n\t\treturn unFlattenObject(raw);\r\n\t},\r\n\trollbackToDefaultValues(){\r\n\t\tthis.clearState();\r\n\t\tlet rawvalues = this._values;\r\n\t\tlet values = this._tryFlatValues(rawvalues);\r\n\t\tthis.setState(values);\r\n\t},\r\n\tgetValues(options = {}){\r\n\t\tlet raw = this.getState();\r\n\t\tif(options.raw) return raw;\r\n\t\tlet values = this._tryUnFlatValues(raw);\r\n\t\treturn values;\r\n\t},\r\n\tonTriggerApply(){ this._apply(); },\r\n\tonTriggerCancel(){ this._cancel(); },\r\n\tonTriggerReset(){ this._reset(); },\r\n\t_apply(){\r\n\t\tlet values = this.getValues();\r\n\t\tthis.view.triggerMethod('values:apply', values);\r\n\t\tthis._tryChangeModel(values);\r\n\t},\r\n\t_cancel(){\r\n\t\tthis.rollbackToDefaultValues();\r\n\t\tlet values = this._getFullHash(this._values);\r\n\t\tthis.view.triggerMethod('values:cancel', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\t_reset(){\r\n\t\tthis.clearState();\r\n\t\tlet values = this._getFullHash({});\r\n\t\tthis.view.triggerMethod('values:reset', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\tonState(state){\r\n\t\tthis._tryChangeModel(state, {type:'property'})\r\n\t},\r\n\t_tryChangeModel(hash, options = {}){\r\n\t\tlet canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';\r\n\t\tlet canChange = this.getProperty(canChangeProp) === true;\r\n\r\n\t\tif(!canChange) return;\r\n\t\tlet model = this.getModel();\r\n\t\tif(!model) return;\r\n\r\n\t\thash = this._tryUnFlatValues(hash);\r\n\t\tif(options.clear === true)\r\n\t\t\tmodel.clear();\r\n\t\tmodel.set(hash);\r\n\r\n\t},\r\n\t_getFullHash(values = {}){\r\n\t\tlet modelHash = this.getModel() && this.getModel().toJSON();\r\n\t\tlet full = _.extend({}, this.values, this.mappings, modelHash);\r\n\t\tlet res = {};\r\n\t\t_(full).each((v,key) => res[key] = undefined);\r\n\t\treturn _.extend(res, values);\r\n\t},\r\n\r\n\r\n\t//dom manipulations\r\n\tbuildFormBindings(){\r\n\t\tthis.mappings = {};\r\n\t\tlet tags = [\"input\",\"textarea\",\"select\"];\r\n\t\tthis.$(\"[name]\").each((i, el) => {\r\n\t\t\tif(tags.indexOf(el.tagName.toLowerCase()) == -1) return;\r\n\r\n\t\t\tlet property = this.unCidle(el.name);\r\n\t\t\tif(property in this.mappings) return;\r\n\r\n\t\t\tlet info = this._getElementInfo(el, tags);\r\n\t\t\tif(info)\r\n\t\t\t\tthis.mappings[property] = info;\r\n\t\t});\r\n\t\tlet ext = {};\r\n\t\t_(this.mappings).each((context, name) => { context.values && (ext[name] = context.values); });\r\n\r\n\t\tthis.extendDefaultValues(ext);\r\n\t},\r\n\t_getElementInfo(el, tags){\r\n\t\tlet context = {\r\n\t\t\tname: el.name\r\n\t\t};\r\n\t\tlet values;\r\n\t\tlet selector = `[name=\"${el.name}\"]`;\r\n\t\tlet $found = this.$(selector);\r\n\t\tif(!$found.length) return;\r\n\r\n\t\tif($found.length > 1){\r\n\t\t\tlet foundValues = [];\r\n\t\t\tlet isArray = false;\r\n\t\t\t$found.each((i, found) => {\r\n\t\t\t\tif(tags.indexOf(found.tagName.toLowerCase()) == -1) return;\r\n\t\t\t\tlet $el = $(found);\r\n\t\t\t\tif((found.type != 'checkbox' && found.type != 'radio') || $el.prop('checked')){\r\n\t\t\t\t\tlet val = $el.val();\r\n\t\t\t\t\tisArray || (isArray = found.type === 'checkbox' || val instanceof Array);\r\n\t\t\t\t\tif(val instanceof Array)\r\n\t\t\t\t\t\tfoundValues = foundValues.concat(val);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfoundValues.push($el.val());\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tvalues = (!foundValues.length || (foundValues.length === 1 && !isArray)) \r\n\t\t\t\t\t? foundValues[0]\r\n\t\t\t\t\t: foundValues;\r\n\t\t} else {\r\n\t\t\tvalues = $found.get(0).type === 'checkbox' \r\n\t\t\t\t\t\t? ($found.prop('checked') ? [$found.val()] : [])\r\n\t\t\t\t\t\t: $found.val();\t\t\t\t\r\n\t\t}\r\n\t\tcontext.values = values;\r\n\t\tcontext.isArray = values instanceof Array;\r\n\t\tcontext.$elements = $found;\r\n\t\treturn context;\r\n\t},\r\n\tsetValuesToForm(values, options = {}){\r\n\r\n\t\t_(values).each((propertyValues, propertyName) => {\r\n\t\t\tlet property = this.mappings[propertyName];\r\n\t\t\tlet $els = property.$elements;\r\n\t\t\tlet arr = propertyValues instanceof Array ? propertyValues : [propertyValues];\r\n\t\t\t$els.each((i, el) => {\r\n\r\n\t\t\t\tthis._setValueToElement(el, i, arr);\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\t_setValueToElement(el, index, values){\r\n\t\tlet value = index < values.length && values[index];\r\n\t\tlet $el = el.jquery ? el : $(el);\r\n\t\tel = $el.get(0);\r\n\t\tif(el.type === 'checkbox' || el.type === 'radio'){\r\n\t\t\t$el.prop('checked', values.indexOf($el.val()) >= 0);\r\n\t\t}else{\r\n\t\t\t$el.val(value);\r\n\t\t}\r\n\t},\r\n\r\n\t// dom listeners\r\n\tevents:{\r\n\t\t'change':'domChange',\r\n\t\t'input':'domInput'\r\n\t},\t\r\n\tdomChange(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\tdomInput(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\t_applyValue(name, el, event){\r\n\t\tif(el.type == 'checkbox')\r\n\t\t\tthis._applyCheckboxValue(name, el, event);\r\n\t\telse\r\n\t\t\tthis._applySimpleValue(name, el, event);\r\n\t},\r\n\t_applySimpleValue(name,el,event){\r\n\t\tname = this.unCidle(name);\r\n\t\tlet $el = $(el);\r\n\t\tthis.setState(name, $el.val());\r\n\t},\r\n\t_applyCheckboxValue(name, el, event){\r\n\t\tlet selector = `input[type=checkbox][name=\"${name}\"]:checked`;\r\n\t\tlet values = this.$(selector).map((i, el) => el.value).toArray();\r\n\t\tname = this.unCidle(name);\r\n\t\tthis.setState(name, values);\r\n\t},\t\r\n\r\n});\r\n","import Behavior from './behavior';\r\nimport Draggable from './draggable';\r\nimport Droppable from './droppable';\r\nimport DynamicClass from './dynamic-class';\r\nimport FormToHash from './form-to-hash';\r\nexport default { Behavior, Draggable, Droppable, DynamicClass, FormToHash };\r\n","import Mn from 'backbone.marionette';\r\nimport mixin from './helpers/mix.js';\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport Radioable from './mixins/radioable.js';\r\n\r\nexport default mixin(Mn.Object).with(GetOptionProperty, Radioable);\r\n","\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport YatObject from '../YatObject';\r\nimport Bb from 'backbone';\r\nimport _ from 'underscore';\r\nimport YatError from '../YatError';\r\n\r\nconst IDENTITY_CHANNEL = 'identity';\r\n\r\nlet Base = mix(YatObject).with(Stateable);\r\n\r\nlet nativeAjax = $ && $.ajax;\r\n\r\nlet Identity = Base.extend({\t\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatUser();\r\n\t},\r\n\t_initializeYatUser(){},\t\r\n\tchannelName: IDENTITY_CHANNEL,\r\n\ttokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires \r\n\tisAnonym(){\r\n\t\treturn !this.getState('id');\r\n\t},\r\n\tisUser(){\r\n\t\treturn !this.isAnonym();\r\n\t},\r\n\tisMe(id){\r\n\t\treturn id && this.getState('id') === id;\r\n\t},\r\n\tupdate(hash){\r\n\t\tthis.setState(hash);\r\n\t\tthis.trigger('change');\r\n\t},\r\n\tlogIn(hash){\r\n\t\tif(!hash.id) return;\r\n\t\tthis.update(hash);\r\n\t\tthis.trigger('log:in');\r\n\t},\r\n\tlogOut(){\r\n\t\tthis.clearState();\r\n\t\tthis.trigger('change');\r\n\t\tthis.trigger('log:out');\r\n\t},\r\n\tgetBearerToken(data){\r\n\t\tlet url = this.getOption('bearerTokenUrl');\r\n\t\tlet promise = new Promise((resolve, reject) => {\r\n\t\t\tnativeAjax({url, data, method:'POST'})\r\n\t\t\t\t.then(\r\n\t\t\t\t\t(token) => { \r\n\t\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\t\tresolve(token);\r\n\t\t\t\t\t\tthis.triggerMethod('token', token);\r\n\t\t\t\t\t},\r\n\t\t\t\t\t(error) => reject(error)\r\n\t\t\t\t);\r\n\t\r\n\t\t});\r\n\t\treturn promise;\r\n\t},\r\n\r\n\tajax(...args){\r\n\t\tlet options = args[0];\r\n\t\toptions.headers = _.extend({}, options.headers, this.getAjaxHeaders());\r\n\t\tlet needRefresh = this.isTokenRefreshNeeded();\r\n\t\tif(!needRefresh){\r\n\t\t\treturn $.ajax(...args); //nativeAjax.apply($, args);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.refreshBearerToken()\r\n\t\t\t\t.then(() => nativeAjax.apply($, args))\r\n\t\t\t\t.catch((error) =>{ \r\n\t\t\t\t\tlet promise = $.Deferred();\r\n\t\t\t\t\tpromise.reject(error);\r\n\t\t\t\t\treturn promise;\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\tgetAjaxHeaders(){\r\n\t\tthis._ajaxHeaders || (this._ajaxHeaders = {});\r\n\t\treturn this._ajaxHeaders;\r\n\t},\r\n\t_updateHeaders(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tlet headers = this.getAjaxHeaders();\r\n\t\r\n\t\tif(token){\r\n\t\t\theaders.Authorization = 'Bearer ' + token;\r\n\t\t\theaders.Accept = 'application/json';\r\n\t\t}else{\r\n\t\t\tdelete headers.Authorization;\r\n\t\t}\r\n\t},\t\r\n\tsetTokenObject(token){\r\n\r\n\t\tif(token != null && _.isObject(token))\r\n\t\t\ttoken.expires = new Date(Date.now() + (token.expires_in * 1000));\r\n\r\n\t\tthis._token = token;\r\n\t\tthis._updateHeaders();\r\n\t\tthis._replaceBackboneAjax();\r\n\r\n\t\tthis.triggerMethod('tocken:change');\r\n\t},\r\n\tgetTokenObject(){\r\n\t\treturn this._token;\r\n\t},\r\n\t_replaceBackboneAjax(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token)\r\n\t\t\tBb.ajax = $.ajax;//$.ajax = nativeAjax;\r\n\t\telse\r\n\t\t\tBb.ajax = (...args) => this.ajax(...args); //$.ajax = (...args) => Yat.identity.ajax(...args);\r\n\t},\r\n\tgetTokenValue(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.access_token;\r\n\t},\r\n\tgetRefreshToken(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.refresh_token;\r\n\t},\r\n\tgetTokenExpires(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn (token || {}).expires;\r\n\t},\r\n\tgetTokenSeconds(){\r\n\t\tlet expires = this.getTokenExpires();\r\n\t\r\n\t\tif(expires == null || isNaN(expires.valueOf())) {\r\n\t\t\tconsole.warn('expires is null or wrong');\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\r\n\t\tlet offset = this.getProperty('tokenExpireOffset');\r\n\t\tif(offset == null) offset = 30000; //30 sec\r\n\t\r\n\t\tvar deadline = expires.valueOf() - offset;\r\n\t\tvar deadlineMs = deadline - Date.now();\r\n\t\treturn deadlineMs > 0 ? deadlineMs / 1000 : 0;\r\n\t},\r\n\tisTokenRefreshNeeded(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token) return false;\t\r\n\t\treturn !this.getTokenSeconds();\r\n\t},\r\n\trefreshBearerToken(){\r\n\t\tlet bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');\r\n\t\tlet doRefresh = this.isTokenRefreshNeeded();\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tif(!doRefresh){\r\n\t\t\t\tresolve();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\r\n\t\t\tif(bearerTokenRenewUrl == null){\r\n\t\t\t\treject(new Error('Token expired and `bearerTokenRenewUrl` not set'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet data = {\r\n\t\t\t\t'grant_type':'refresh_token',\r\n\t\t\t\t'refresh_token': this.getRefreshToken()\r\n\t\t\t};\r\n\t\t\tnativeAjax({\r\n\t\t\t\turl:bearerTokenRenewUrl, \r\n\t\t\t\tdata,\r\n\t\t\t\tmethod:'POST'\r\n\t\t\t})\r\n\t\t\t\t.then((token) => {\r\n\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}, () => {\r\n\t\t\t\t\tthis.triggerMethod('refresh:token:expired');\r\n\t\t\t\t\treject(YatError.Http401());\r\n\t\t\t\t});\r\n\t\r\n\t\t});\r\n\t}\r\n});\r\n\r\nlet identity = new Identity();\r\nexport default identity;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nimport GetOptionProperty from './mixins/get-option-property';\r\nexport default mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({\r\n\t\r\n\tinstantRender: false,\r\n\trenderOnReady: false,\r\n\ttriggerReady: false,\r\n\r\n\tmanualAfterInitialize: true,\r\n\r\n\tconstructor(...args){\r\n\t\t\r\n\t\tMn.View.apply(this, args);\r\n\t\t\r\n\t\tlet options = args[0];\r\n\t\tthis.mergeOptions(options, ['instantRender','renderOnReady', 'triggerReady', 'manualAfterInitialize']);\r\n\r\n\t\tif(this.manualAfterInitialize === true)\r\n\t\t\tthis._afterInitialize();\r\n\r\n\t},\r\n\t_afterInitialize(){\r\n\r\n\t\tif(this.instantRender === true)\r\n\t\t\tthis.render();\r\n\r\n\t\tif(this.renderOnReady === true)\r\n\t\t\tthis.once('ready',this.render);\r\n\r\n\t\tif(this.renderOnReady === true || this.triggerReady === true)\r\n\t\t\tthis.trigger('ready', this);\r\n\t\t\t\r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport flat from './functions/common/flatten-unflatten/flatten-object';\r\nimport unflat from './functions/common/flatten-unflatten/unflatten-object';\r\nimport getByPath from './functions/common/set-get-by-path/get-by-path';\r\nimport setByPath from './functions/common/set-get-by-path/set-by-path';\r\nimport YatObject from './YatObject';\r\n\r\nconst YatConfig = YatObject.extend({\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['name', 'channelName', 'noRadio']);\r\n\t\tif(this.noRadio !== true && this.channelName == null)\r\n\t\t\tthis.channelName = name;\r\n\t},\r\n\tgetStore(){\r\n\t\tthis.store || (this.store = {});\r\n\t\treturn this.store;\r\n\t},\r\n\tradioRequest: {\r\n\t\tget(...args){ this.get(...args); },\r\n\t\tset(path, value){ this.set(path,value); }\r\n\t},\r\n\tget(path, ...args){\r\n\t\tlet store = this.getStore();\r\n\t\tlet value = getByPath(store, path);\r\n\t\tif(_.isFunction(value)){\r\n\t\t\tvalue = value.apply(this, args);\r\n\t\t}\r\n\t\t\r\n\t\treturn value;\r\n\t},\r\n\tset(path, value){\r\n\t\tlet store = this.getStore();\r\n\t\tlet result = setByPath(store, path, value);\r\n\t\tthis.triggerSet(path, value);\r\n\t},\r\n\ttriggerSet(path, value){\r\n\t\tif(!path) return;\r\n\t\tlet arr = path.split('/');\r\n\t\tlet radio = this.getChannel();\r\n\t\tdo{\r\n\t\t\tlet event = arr.join(':');\r\n\t\t\tthis.triggerMethod(event, value);\r\n\t\t\tradio && radio.trigger(event, value);\r\n\t\t\tarr.pop();\r\n\t\t}while(arr.length > 0)\r\n\t}\r\n});\r\n\r\nexport default function(name, options = {}){\r\n\toptions.name = name;\t\r\n\treturn new YatConfig(options);\r\n}\r\n","import Config from './../../YatConfig';\r\n\r\nconst config = new Config('yat:modals:singleton',{ noRadio: true });\r\n\r\nlet modalsShowFull = {\r\n\tbg: true,\r\n\tclose:true,\r\n}\r\n\r\nlet modalsShowSimple = {\r\n\tbg:false,\r\n\tclose:false,\r\n}\r\n\r\nlet modalOptionsDefault = {\r\n\tcloseOnClickOutside: true,\r\n\tcloseOnPromise: true,\r\n\tpreventClose: false,\r\n\tasPromise: false,\r\n};\r\n\r\nlet modalsCssDefaults = {\r\n\twrapper:'yat-modal-wrapper',\r\n\tbg:'yat-modal-bg',\r\n\tcontentWrapper:'yat-modal-content-wrapper',\r\n\tclose: 'yat-modal-close',\r\n\theader: 'yat-modal-header',\r\n\tcontent: 'yat-modal-content',\r\n\tactions: 'yat-modal-actions',\r\n\tresolve: 'yat-modal-resolve',\r\n\treject: 'yat-modal-reject',\r\n}\r\n\r\nlet modalsLabelsDefaults = {\r\n\tclose: '×',\r\n\tresolve: 'ok',\r\n\treject: 'cancel'\r\n}\r\n\r\nlet modalsTypes = {\r\n\tfull: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tsimple: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowSimple,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tconfirm: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: {\r\n\t\t\tcloseOnClickOutside: true,\r\n\t\t\tcloseOnPromise: true,\r\n\t\t\tpreventClose: false,\r\n\t\t\tasPromise: true,\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\nconfig.set('types.full', modalsTypes.full);\r\nconfig.set('types.simple', modalsTypes.simple);\r\nconfig.set('types.confirm', modalsTypes.confirm);\r\n\r\nconfig.set('defaultShow', modalsShowFull);\r\nconfig.set('defaultCss', modalsCssDefaults);\r\nconfig.set('defaultLabels', modalsLabelsDefaults);\r\n\r\nexport default config;\r\n","import _ from 'underscore';\r\nimport config from './config';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\nimport YatView from './../../YatView.js';\r\nimport mix from './../../helpers/mix';\r\nimport OptionProperty from './../../mixins/get-option-property';\r\nlet template = _.template(\r\n`<% if(show.bg) {%> data-role=\"modal-bg\">
<% } %>\r\n data-role=\"modal-content-wrapper\">\r\n\t<% if(show.close) {%>
<% } %>\r\n\t<% if(show.header) {%>
data-role=\"modal-header\"><%= header %><% } %>\r\n\t
data-role=\"modal-content\"><%= text %>
\r\n\t<% if(show.actions) {%>\r\n\t
data-role=\"modal-actions\">\r\n\t\t<% if(show.resolve) {%><% } %>\r\n\t\t<% if(show.reject) {%><% } %>\r\n\t
\r\n\t<% } %>\r\n
\r\n`);\r\n\r\n\r\n\r\nconst ModalView = mix(YatView).with(OptionProperty).extend({\r\n\r\n\trenderOnReady: true,\r\n\ttemplate: template,\r\n\r\n\tattributes(){\r\n\t\treturn {'data-role':'modal-wrapper'};\r\n\t},\r\n\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['content', 'header', 'text']);\r\n\t\t\r\n\t\tlet _this = this;\r\n\r\n\t\tif(this.getOption('asPromise') === true){\r\n\t\t\tthis.promise = new Promise(function(resolve, reject){\r\n\t\t\t\t_this.once('resolve',(arg) => resolve(arg));\r\n\t\t\t\t_this.once('reject',(arg) => reject(arg));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.once('resolve reject',(arg, destroying) => {\r\n\t\t\tthis.preventClose = false;\r\n\t\t\t\r\n\t\t\tif(this.getConfigValue('options','closeOnPromise') && !destroying){\r\n\t\t\t\tthis.destroy();\r\n\t\t\t}\t\t\t\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tcanBeClosed(){\r\n\t\treturn this.getConfigValue('options','preventClose') !== true;\r\n\t},\r\n\tdestroy(opts = {}){\r\n\t\t\r\n\t\tif(!this.canBeClosed() && opts.force !== true) return;\r\n\r\n\t\treturn YatView.prototype.destroy.apply(this, arguments);\r\n\r\n\t},\r\n\tui:{\r\n\t\t'bg': '[data-role=\"modal-bg\"]',\r\n\t\t'contentWrapper': '[data-role=\"modal-content-wrapper\"]',\t\t\r\n\t\t'text':'[data-role=\"modal-content\"]',\r\n\t\t'header':'[data-role=\"modal-header\"]',\r\n\t\t'close':'[data-role=\"modal-close\"]',\r\n\t\t'resolve':'[data-role=\"modal-resolve\"]',\r\n\t\t'reject':'[data-role=\"modal-reject\"]',\r\n\t},\r\n\ttriggers:{\r\n\t\t'click @ui.close':{ event: 'click:close', stopPropagation: true },\r\n\t\t'click @ui.reject':{ event: 'click:reject', stopPropagation: true },\r\n\t\t'click @ui.resolve':{ event: 'click:resolve', stopPropagation: true },\r\n\t\t'click @ui.text':{ event: 'click:content', stopPropagation: true },\r\n\t\t'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },\r\n\t\t'click @ui.bg':{ event: 'click:bg', stopPropagation: true },\r\n\t\t'click': { event: 'click:wrapper', stopPropagation: true },\r\n\t},\r\n\tregions:{\r\n\t\t'content':'[data-role=\"modal-content\"]'\r\n\t},\r\n\tonBeforeDestroy(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'), true);\r\n\t},\r\n\r\n\tonClickClose(){ this.destroy(); },\r\n\r\n\tonClickResolve(){ \r\n\t\tthis.trigger('resolve', this.getProperty('resolve'));\r\n\t},\r\n\tonClickReject(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'));\r\n\t},\r\n\r\n\tonClickBg(){ this.clickedOutsideOfModal(); },\r\n\tonClickWrapper(){ this.clickedOutsideOfModal(); },\r\n\r\n\tclickedOutsideOfModal(){\r\n\t\tif(this.getConfigValue('options','closeOnClickOutside') === true)\r\n\t\t\tthis.destroy();\r\n\r\n\t},\r\n\r\n\r\n\tonBeforeRender(){\r\n\t\t//apply wrapper class here;\r\n\t\tlet cfg = this.getConfig();\r\n\t\tcfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);\r\n\t\t\r\n\t\tthis.$el.appendTo($('body'));\r\n\t},\r\n\tonRender(){\r\n\t\tif(this.content instanceof Bb.View){\r\n\t\t\tthis.showChildView('content', this.content);\r\n\t\t\tthis.content.inModal = this;\r\n\t\t}\r\n\t},\r\n\t\r\n\t_getModalOptions(){\r\n\t\tlet h = {};\r\n\t\tif(this.getOption('closeOnClickOutside') != null)\r\n\t\t\th.closeOnClickOutside = this.getOption('closeOnClickOutside');\r\n\t\tif(this.getOption('closeOnPromise') != null)\r\n\t\t\th.closeOnPromise = this.getOption('closeOnPromise');\r\n\t\tif(this.getOption('preventClose') != null)\r\n\t\t\th.preventClose = this.getOption('preventClose');\r\n\t\tif(this.getOption('asPromise') != null)\r\n\t\t\th.asPromise = this.getOption('asPromise');\r\n\r\n\t\treturn h;\r\n\t},\r\n\tgetConfigValue(section, name){\r\n\t\tlet cfg = this.getConfig() || {};\r\n\t\treturn (cfg[section] || {})[name];\r\n\t},\r\n\tgetConfig(key){\t\t\r\n\t\tif(this.config) return this.config;\r\n\r\n\t\tlet typeName = this.getOption('type') || 'simple';\r\n\t\tlet type = _.extend({},config.get('types.' + typeName) || {});\r\n\r\n\t\ttype.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));\r\n\t\ttype.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));\r\n\t\ttype.css= _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));\r\n\t\t\r\n\t\ttype.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());\r\n\r\n\t\tif(type.show.header == null && this.getOption('header'))\r\n\t\t\ttype.show.header = true;\r\n\t\t\r\n\t\tif(type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise))\r\n\t\t\ttype.show.resolve = true;\r\n\t\tif(type.show.reject == null && this.getOption('reject'))\r\n\t\t\ttype.show.reject = true;\r\n\r\n\t\tif(type.show.actions == null && (type.show.resolve || type.show.reject))\r\n\t\t\ttype.show.actions = true;\r\n\r\n\t\treturn this.config = type;\r\n\t},\r\n\r\n\ttemplateContext(){\r\n\t\tlet cfg = this.getConfig();\r\n\t\treturn {\r\n\t\t\tcss(name){\r\n\t\t\t\treturn cfg.css[name] ? ` class=\"${cfg.css[name]}\"` : '';\r\n\t\t\t},\r\n\t\t\tlabel(name){\r\n\t\t\t\treturn cfg.labels[name] || '';\r\n\t\t\t},\r\n\t\t\tshow : cfg.show,\r\n\t\t\ttext: this.getOption('text'),\r\n\t\t\theader: this.getOption('header'),\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport default ModalView;\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport mixin from './../../helpers/mix.js';\r\nimport YatObject from './../../YatObject.js';\r\nimport Stateable from './../../mixins/stateable.js';\r\nimport YatError from './../../YatError.js';\r\nimport View from './../../YatView.js';\r\nimport __ from './../../functions/common/common.js';\r\nimport ModalView from './modalView';\r\nimport config from './config';\r\n\r\nlet ModalEngine = mixin(YatObject).with(Stateable).extend({\r\n\tconstructor(...args){\r\n\t\tthis.modals = [];\r\n\t\tYatObject.apply(this, args);\r\n\t\tthis.listenForEsc = _.bind(this._listenForEsc, this);\r\n\t\t$(() => {\r\n\t\t\tthis.doc = $(document);\r\n\t\t\tthis.doc.on('keyup', this.listenForEsc);\r\n\t\t});\r\n\t},\r\n\tchannelName:'modals',\r\n\t\r\n\tshow(...args){\r\n\t\tlet options = this._normalizeArguments(...args);\r\n\t\treturn this._create(options);\r\n\t},\r\n\tremove(modal){\r\n\r\n\t\tif(!modal)\r\n\t\t\tmodal = _.last(this.modals);\r\n\r\n\t\tmodal && modal.destroy();\r\n\t},\r\n\r\n\t_listenForEsc(e){\r\n\t\tif(e.keyCode !== 27) return;\r\n\t\t\r\n\t\tif(this.modals.length)\r\n\t\t\tthis.remove();\r\n\t},\r\n\t_create(options){\r\n\t\tlet modal = new ModalView(options);\r\n\t\tlet _this = this;\r\n\t\tthis.listenToOnce(modal, 'destroy', function(){ _this._remove(modal); })\r\n\t\tthis.modals.push(modal);\r\n\t\treturn modal;\r\n\t},\r\n\t_remove(modal){\r\n\r\n\t\tif(!modal) return;\r\n\r\n\t\tlet ind = this.modals.indexOf(modal);\r\n\t\tif(ind > -1) this.modals.splice(ind, 1);\r\n\r\n\t\tthis.stopListening(modal);\r\n\r\n\t},\r\n\t_normalizeArguments(...args){\r\n\t\t\r\n\t\tlet options = {};\r\n\t\tlet len = args.length;\r\n\t\tif(!len)\r\n\t\t\treturn;\r\n\r\n\t\tif(len === 1){\r\n\t\t\tif(__.isView(args[0]))\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\telse if(_.isString(args[0]))\r\n\t\t\t\toptions.text = args[0];\r\n\t\t\telse if(_.isObject(args[0]))\r\n\t\t\t\t_.extend(options, args[0]);\r\n\t\t} else if (len === 2){\r\n\t\t\tif(_.isString(args[0]) && _.isString(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.text = args[1];\r\n\t\t\t}else if(_.isString(args[0]) && __.isView(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.content = args[1];\r\n\t\t\t}else if(_.isString(args[1]) && __.isView(args[0])){\r\n\t\t\t\toptions.header = args[1];\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}else if(_.isString(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\tif(__.isView(options.content))\r\n\t\t\t\t\toptions.header = args[0];\r\n\t\t\t\telse\r\n\t\t\t\t\toptions.text = args[0];\r\n\t\t\t}else if(__.isView(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif(_.isObject(args[3]))\r\n\t\t\t\t_.extend(options, args[3]);\r\n\t\t\tif(_.isObject(args[2]))\r\n\t\t\t\t_.extend(options, args[2]);\r\n\t\t\telse if(_.isString(args[2]))\r\n\t\t\t\toptions.type = args[2];\r\n\r\n\t\t\tlet two = this._normalizeArguments(args[0], args[1]);\r\n\t\t\t_.extend(options, two);\r\n\t\t}\r\n\r\n\t\treturn options;\r\n\t},\r\n\tonBeforeDestroy(){\r\n\t\tif(this.doc)\r\n\t\t\tthis.doc.off('keyup',this.listenForEsc);\r\n\t}\r\n});\r\n\r\nconst modalEngine = new ModalEngine();\r\n\r\n\r\nexport default {\r\n\tshow(...args){\r\n\t\treturn modalEngine.show(...args);\r\n\t},\r\n\taddTypeConfig(name, cfg){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\tconfig.set('types.'+name,cfg);\r\n\t},\r\n\tgetTypeConfig(name){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\treturn config.get('types.'+name);\r\n\t},\r\n};\r\n","import TemplateContext from './template-context';\r\nimport identity from './identity';\r\nimport modals from './modals/modals';\r\nexport default { TemplateContext, identity, modals };\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Bb from 'backbone';\r\nimport mixin from './helpers/mix.js';\r\n\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport RadioMixin from './mixins/radioable.js';\r\nimport Startable from './mixins/startable.js';\r\nimport Childrenable from './mixins/childrenable.js';\r\n\r\nlet Base = mixin(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);\r\n\r\nexport default Base.extend({\r\n\r\n\tinitRadioOnInitialize: true,\r\n\t_initRegion(opts = {skip:true}){\r\n\t\tif(opts.skip) return;\r\n\t\tvar region = this.getProperty('region');\r\n\t\tthis.region = region;\r\n\t\tBase.prototype._initRegion();\r\n\t}, \r\n\r\n\tgetRegion() {\r\n\t\tif(!this._region) this._initRegion({skip:false});\r\n\t\treturn this._region;\r\n\t},\r\n\r\n\taddPageManager(pageManager){\r\n\t\tthis._pageManagers || (this._pageManagers = []);\r\n\t\tthis._pageManagers.push(pageManager);\r\n\r\n\t\tlet prefix = pageManager.getName();\r\n\t\tif(!prefix){\r\n\t\t\tconsole.warn('pageManager prefix not defined');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.listenTo(pageManager, 'all', (eventName, ...args) => {\r\n\t\t\tlet prefixedEventName = prefix + ':' + eventName;\r\n\t\t\tthis.triggerMethod(prefixedEventName, ...args);\r\n\t\t});\r\n\t\tthis.listenTo(pageManager, 'state:currentPage',(...args) => this.triggerMethod('page:swapped',...args));\r\n\t\t\r\n\t},\r\n\r\n\thasPageManagers(){\r\n\t\treturn this._pageManagers && this._pageManagers.length > 0;\r\n\t},\r\n\r\n\tgetMenuTree(opts = {rebuild:false}){\r\n\t\tif(this._menuTree && !opts.rebuild) return this._menuTree;\r\n\t\tlet managers = this._pageManagers || [];\r\n\t\tlet links = _(managers).chain().map((manager) => manager.getLinks()).flatten().value();\r\n\t\tthis._menuTree = new Bb.Collection(links);\r\n\t\treturn this._menuTree;\r\n\t},\r\n\r\n\tgetPage(key){\r\n\t\tif(!this.hasPageManagers()) return;\r\n\t\treturn _(this._pageManagers).find((mngr) => mngr.getPage(key));\r\n\t},\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nexport default Mn.AppRouter.extend({},{\r\n\tcreate(hash, context){\r\n\t\tlet appRoutes = {};\r\n\t\tlet controller = {};\r\n\t\tlet _this = this;\r\n\t\t_(hash).each((handlerContext, key) => {\r\n\t\t\tappRoutes[key] = key;\r\n\t\t\tcontroller[key] = (...args) => {\r\n\t\t\t\thandlerContext\r\n\t\t\t\t.action(...args)\r\n\t\t\t\t.catch((error) => {\r\n\t\t\t\t\t_this._catchError(error, context);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn new this({controller, appRoutes});\r\n\t},\r\n\t_catchError(error, context){\r\n\t\tif(!context || context.getProperty('throwChildErrors') === true){\r\n\t\t\tthrow error;\r\n\t\t}else{\r\n\t\t\tlet postfix = error.status ? \":\" + error.status.toString() : '';\r\n\t\t\tlet commonEvent = 'error';\r\n\t\t\tlet event = commonEvent + postfix;\r\n\r\n\t\t\tcontext.triggerMethod(commonEvent, error, this);\r\n\r\n\t\t\tif(event != commonEvent) \r\n\t\t\t\tcontext.triggerMethod(event, error, this);\r\n\r\n\t\t}\r\n\r\n\t}\r\n});\r\n","import Bb from 'backbone';\r\nexport default Bb.Model.extend({});\r\n\r\n","import Model from './model'\r\nexport default Model.extend({\r\n\tdefaults:{\r\n\t\turl: undefined,\r\n\t\tlabel: undefined,\r\n\t\ttarget: '_self',\r\n\t\tlevel: 0,\r\n\t},\r\n\tdestroy(){\r\n\t\tthis.id = null;\r\n\t\tModel.prototype.destroy.apply(this, arguments);\r\n\t}\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp.js';\r\nimport mixin from './helpers/mix';\r\nimport Startable from './mixins/startable';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter.js';\r\nimport LinkModel from './models/link';\r\nimport Bb from 'backbone';\r\nimport identity from './singletons/identity';\r\n\r\n/* \r\n\tYatPage\r\n*/\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nexport default Base.extend({\r\n\r\n\tconstructor(...args){\r\n\t\tBase.apply(this,args);\r\n\t\tthis.initializeYatPage();\r\n\t},\r\n\r\n\tallowStopWithoutStart: true,\r\n\tallowStartWithoutStop: true,\r\n\r\n\tinitializeYatPage(opts){\r\n\t\tthis.mergeOptions(opts, [\"manager\"]);\r\n\t\tthis._initializeModels(opts);\r\n\t\tthis._initializeRoute(opts);\r\n\t\tthis._proxyEvents();\r\n\t\tthis._tryCreateRouter();\r\n\t\tthis._registerIdentityHandlers();\t\t\r\n\t},\r\n\r\n\tgetLayout(opts = {rebuild: false}){\r\n\t\tif(!this._layoutView || opts.rebuild || (this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed())){\r\n\t\t\tthis.buildLayout();\r\n\t\t}\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayout(){\r\n\t\tlet Layout = this.getProperty('Layout');\r\n\t\tif(Layout == null) return;\r\n\t\tlet opts = _.extend({},this.getProperty('layoutOptions'));\r\n\r\n\t\tif(this.model && !opts.model)\r\n\t\t\t_.extend(opts,{model: this.model});\r\n\r\n\t\tif(this.collection && !opts.collection)\r\n\t\t\t_.extend(opts,{collection: this.collection});\r\n\t\t\t\r\n\t\tlet options = this.buildLayoutOptions(opts);\r\n\t\toptions.page = this;\r\n\t\tthis._layoutView = new Layout(options);\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayoutOptions(rawOptions){\r\n\t\treturn rawOptions;\r\n\t},\r\n\r\n\taddModel(model, opts = {}){\t\t\t\t\r\n\t\tif(!model) return;\r\n\t\tthis.model = model;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchModelOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(model.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\taddCollection(collection, opts = {}){\r\n\t\tif(!collection) return;\r\n\t\tthis.collection = collection;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(collection.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\tfreezeWhileStarting: true,\r\n\tfreezeUI(){ },\r\n\tunFreezeUI(){ },\r\n\r\n\tgetRouteHash(){\r\n\r\n\t\tlet hashes = [{},this._routeHandler].concat(this.getChildren({startable:false}).map((children) => children.getRouteHash()))\r\n\t\treturn _.extend(...hashes);\r\n\r\n\t},\r\n\r\n\thasRouteHash(){\r\n\t\treturn _.isObject(this.getRouteHash())\r\n\t},\r\n\r\n\tgetLinkModel(level = 0){\r\n\t\tif(!this._canHaveLinkModel()) return;\t\t\r\n\t\tif(this._linkModel) return this._linkModel;\r\n\r\n\t\tlet url = this.getRoute();\r\n\t\tlet label = this.getLabel();\r\n\t\tlet children = this._getSublinks(level);\r\n\t\tthis._linkModel = new LinkModel({ url, label, level, children });\r\n\r\n\t\treturn this._linkModel;\r\n\t},\r\n\t_canHaveLinkModel(){\r\n\t\treturn !((this.getProperty('skipMenu') === true) || (!!this.getProperty('isStartNotAllowed')));\r\n\t},\r\n\t_destroyLinkModel(){\r\n\t\tif(!this._linkModel) return;\r\n\t\tthis._linkModel.destroy();\r\n\t\tdelete this._linkModel;\r\n\t},\r\n\r\n\tgetParentLinkModel(){\r\n\t\tlet parent = this.getParent();\r\n\t\tif(!parent || !parent.getLinkModel) return;\r\n\t\tlet model = parent.getLinkModel();\r\n\t\treturn model;\r\n\t},\r\n\r\n\tgetNeighbourLinks(){\r\n\t\tlet link = this.getLinkModel();\r\n\t\tif(link && link.collection) return link.collection;\r\n\t},\r\n\r\n\tgetChildrenLinks(){\r\n\t\tlet model = this.getLinkModel();\r\n\t\tif(!model) return;\r\n\t\treturn model.get('children');\r\n\t},\r\n\r\n\t_getSublinks(level){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children || !children.length) return;\r\n\t\tlet sublinks = _(children).chain()\r\n\t\t\t.filter((child) => child.getProperty(\"skipMenu\") !== true)\r\n\t\t\t.map((child) => child.getLinkModel(level + 1))\r\n\t\t\t.value();\r\n\t\tif(!sublinks.length) return;\r\n\t\tlet col = new Bb.Collection(sublinks);\r\n\t\treturn col;\r\n\t},\r\n\r\n\t_initializeModels(opts = {}){\r\n\t\tthis.addModel(opts.model, opts);\r\n\t\tthis.addCollection(opts.collection, opts);\r\n\t},\r\n\r\n\t_initializeRoute(){\r\n\t\tlet route = this.getRoute({asPattern:true});\r\n\t\tif(route == null) return;\r\n\t\tlet page = this;\r\n\t\tthis._routeHandler = {\r\n\t\t\t[route]:{context: page, action: (...args) => page.start(...args) }\r\n\t\t};\r\n\t},\r\n\r\n\tgetRoute(opts = {asPattern:false}){\r\n\t\tlet relative = this.getProperty('relativeRoute');\r\n\t\tlet route = this.getProperty('route');\r\n\t\tlet parent = this.getParent();\r\n\t\tif(route == null) return;\r\n\t\t\r\n\t\tlet result = route;\r\n\r\n\t\tif(relative && parent && parent.getRoute){\r\n\t\t\tlet parentRoute = parent.getRoute();\r\n\t\t\tresult = parentRoute + '/' + route;\t\t\t\r\n\t\t}\r\n\r\n\t\treturn this._normalizeRoute(result, opts);\r\n\t},\r\n\t_normalizeRoute(route, opts){\t\t\r\n\t\troute = route.replace(/\\/+/gmi,'/').replace(/^\\//,'');\r\n\t\tif(opts.asPattern){\r\n\t\t\treturn route;\r\n\t\t}\r\n\t\telse{\r\n\t\t\tlet res = route.replace(/\\(\\/\\)/gmi,'/').replace(/\\/+/gmi,'/');\r\n\t\t\treturn res;\r\n\t\t}\r\n\t},\r\n\t_tryCreateRouter(){\r\n\t\tlet create = this.getProperty('createRouter') === true;\r\n\t\tif(create){\r\n\t\t\tthis.router = this._createAppRouter();\r\n\t\t}\r\n\t},\r\n\r\n\t_createAppRouter(){\r\n\t\tlet hash = this.getRouteHash();\r\n\t\tif(!_.size(hash)) return;\r\n\t\treturn new Router(hash);\r\n\t},\r\n\r\n\t_proxyEvents(){\r\n\t\tlet proxyContexts = this._getProxyContexts();\r\n\t\tthis._proxyEventsTo(proxyContexts);\r\n\t},\r\n\t_getProxyContexts(){\r\n\t\tlet rdy = [];\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager){\r\n\t\t\trdy.push({context:manager})\r\n\t\t}\r\n\t\tlet radio = this.getChannel();\r\n\t\tif(radio){\r\n\t\t\tlet allowed = this.getProperty('proxyEventsToRadio');\r\n\t\t\trdy.push({context:radio, allowed });\r\n\t\t}\r\n\t\treturn rdy;\r\n\t},\r\n\t_proxyEventsTo(contexts){\r\n\t\tlet all = [];\r\n\t\tlet eventsHash = {};\r\n\r\n\t\t_(contexts).each((context) => {\r\n\t\t\tlet events = [];\r\n\t\t\tif(!context.allowed)\r\n\t\t\t\tall.push(context.context);\r\n\t\t\telse {\r\n\t\t\t\t_(context.allowed).each(function(allowed){\r\n\t\t\t\t\teventsHash[allowed] || (eventsHash[allowed] = []);\r\n\t\t\t\t\teventsHash[allowed].push(context.context)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet page = this;\r\n\t\tpage.on('all', (eventName, ...args) => {\r\n\t\t\tlet contexts = (eventName in eventsHash) ? eventsHash[eventName] : all;\r\n\t\t\tlet triggerArguments = [page].concat(args);\r\n\t\t\t_(contexts).each((context) => context.triggerMethod(`page:${eventName}`, ...triggerArguments))\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\tlet add = {};\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager) add.manager = manager;\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), add);\r\n\t},\t\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis._destroyLinkModel();\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t});\r\n\t}\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter';\r\nimport mixin from './helpers/mix';\r\nimport identity from './singletons/identity';\r\nimport YatError from './YatError';\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nlet YatPageManager = Base.extend({\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatPageManager(...args);\r\n\t},\r\n\tthrowChildErrors:true,\r\n\tcreateRouter(){\r\n\t\tlet children = this.getChildren({startable:false});\r\n\t\tlet hash = {};\r\n\t\t_(children).each(function(page){\r\n\t\t\tif(_.isFunction(page.getRouteHash)){\r\n\t\t\t\t_.extend(hash, page.getRouteHash());\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._routesHash = hash;\t\t\r\n\t\tthis.setRouter(Router.create(hash, this));\r\n\t},\r\n\tsetRouter(router){\r\n\t\tthis.router = router;\r\n\t},\r\n\tgetRouter(){\r\n\t\treturn this.router;\r\n\t},\r\n\tgetLinks(){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children) return;\r\n\t\treturn _(children).chain()\t\t\t\r\n\t\t\t.map((child) => child.getLinkModel())\r\n\t\t\t.filter((child) => !!child)\r\n\t\t\t.value();\r\n\t},\r\n\texecute(route){\r\n\t\tlet page = this.getPage(route);\r\n\t\tif(!!page) \r\n\t\t\tpage.start({text: error.message});\r\n\t\telse if(route === '*NotFound')\r\n\t\t\tthrow new YatError.NotFound('*NotFound handler is missing');\r\n\t\telse\r\n\t\t\tthis.execute('*NotFound');\r\n\t},\r\n\tnavigate(url, opts = {trigger:true}){\r\n\r\n\t\tlet router = this.getRouter();\r\n\t\tif(router)\r\n\t\t\trouter.navigate(url, opts);\r\n\t\telse\r\n\t\t\tconsole.warn('router not found');\r\n\t},\r\n\r\n\tgetPage(key){\r\n\r\n\t\tlet found = _(this._routesHash)\r\n\t\t\t.find((pageContext, route) => {\r\n\t\t\t\tif(route === key) return true;\r\n\t\t\t\tif(pageContext.context.getName() === key) return true;\r\n\t\t\t});\r\n\t\treturn found && found.context;\r\n\r\n\t},\r\n\r\n\r\n\tnavigateToRoot(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tlet rootUrl = this.getProperty('rootUrl');\r\n\t\tif(!rootUrl){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\tif(children && children.length) {\r\n\t\t\t\tlet root = children.find((child) => child != current);\r\n\t\t\t\trootUrl = root && root.getRoute()\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(rootUrl != null)\r\n\t\t\tthis.navigate(rootUrl);\r\n\t\telse\r\n\t\t\tconsole.warn('root page not found');\r\n\t},\r\n\r\n\t_initializeYatPageManager(opts = {}){\r\n\t\tthis.mergeOptions(opts, ['id','name','label']);\r\n\t\tthis._registerPageHandlers(opts);\r\n\t\tthis._registerIdentityHandlers();\r\n\t\tthis.createRouter();\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), {\r\n\t\t\tmanager: this\r\n\t\t});\r\n\t},\t\r\n\r\n\t_registerPageHandlers(){\r\n\t\tthis.on('page:before:start', this._pageBeforeStart);\r\n\t\tthis.on('page:start', this._pageStart);\r\n\t\tthis.on('page:start:decline', this._pageDecline);\r\n\t},\r\n\r\n\t_pageBeforeStart(page){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(current && current != page){\r\n\t\t\tcurrent.stop();\r\n\t\t}\r\n\t},\r\n\r\n\t_pageStart(page){\r\n\t\tthis.setState('currentPage', page);\r\n\t},\r\n\r\n\t_pageDecline(...args){\r\n\t\t//console.log(\"decline\", args)\r\n\t},\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t\tthis._moveToRootIfCurrentPageNotAllowed();\r\n\t\t});\r\n\t},\r\n\t\r\n\t_moveToRootIfCurrentPageNotAllowed(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(!current || !current.isStartNotAllowed()) return;\r\n\t\t\r\n\t\tthis.navigateToRoot();\r\n\t}\r\n\r\n});\r\n\r\nexport default YatPageManager;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nexport default mix(Mn.NextCollectionView).with(GlobalTemplateContext);\r\n","import Bb from 'backbone';\r\nexport default Bb.Collection.extend({});\r\n","import _ from 'underscore';\r\nimport YatObject from './YatObject';\r\nimport Collection from './models/collection';\r\n\r\nvar CollectionGroups = YatObject.extend({\r\n\r\n\tcollection: undefined,\r\n\tgroupBy: undefined,\r\n\r\n\tgetGroups(){ return this.groups; },\r\n\tgetGroup(name){\r\n\t\tlet groups = this.getGroups();\r\n\t\treturn groups[name];\r\n\t},\r\n\tisGroupExists(name){ return name in this.getGroups(); },\r\n\taddGroup(name, models) {\r\n\t\tif(this.isGroupExists(name)) return;\r\n\t\tlet groups = this.getGroups();\r\n\t\tgroups[name] = this._createGroup(name, models);\r\n\t\treturn groups[name];\r\n\t},\r\n\tremoveGroup(name){\r\n\t\tlet group = this.getGroup(name);\r\n\t\t\r\n\t\tif(!group) return;\r\n\r\n\t\tif(_.isFunction(group.destroy))\r\n\t\t\tgroup.destroy();\r\n\t\telse if(_.isFunction(group.stopListening))\r\n\t\t\tgroup.stopListening();\r\n\r\n\t\tdelete this.groups[name];\r\n\t},\t\r\n\r\n\r\n\tgroup() {\r\n\t\tlet result = {};\r\n\t\tlet colGroups = this.collection.groupBy(this.groupBy);\r\n\t\tlet optionGroups = this.getOption('groups');\r\n\t\t_(optionGroups).each((name) => {\r\n\t\t\tif (name in colGroups){\r\n\t\t\t\tresult[name] = colGroups[name];\r\n\t\t\t\tdelete colGroups[name];\r\n\t\t\t}\r\n\t\t\telse result[name] = [];\r\n\t\t});\r\n\t\t_(colGroups).each((models, name) => result[name] = models);\r\n\t\treturn result;\r\n\t},\r\n\r\n\tconstructor: function(options) {\r\n\t\tYatObject.apply(this, arguments);\r\n\t\tthis._initializeGrouppedCollection(options);\r\n\t},\r\n\t_initializeGrouppedCollection(options) {\r\n\t\tif (this._initializedGC == true) return;\r\n\r\n\t\toptions || {};\r\n\t\tthis.mergeOptions(options, ['collection', 'groupBy']);\r\n\t\tthis._ensureOptions();\r\n\t\tthis._initializeGroups();\r\n\t\tthis._initializeEventHandlers();\r\n\r\n\t\tthis._initializedGC == true\r\n\t},\r\n\t_ensureOptions() {\r\n\t\tif (!this.collection)\r\n\t\t\tthrow new Error('collection must be set');\r\n\r\n\t\tif (!this.groupBy)\r\n\t\t\tthrow new Error('groupBy must be set');\r\n\r\n\t\tif (typeof this.groupBy === 'string') {\r\n\t\t\tvar propertyName = this.getOption('groupBy');\r\n\t\t\tthis.groupBy = (model) => model.get(propertyName);\r\n\t\t}\r\n\r\n\t},\r\n\t_initializeGroups() {\r\n\t\tthis.groups = {};\r\n\t\tvar groups = this.group();\r\n\t\t_(groups).each((models, name) => this.addGroup(name, models));\r\n\t},\r\n\t_getCollectionClass(){\r\n\t\treturn this.getOption('CollectionClass') || Collection;\r\n\t},\r\n\t_createGroup(name,models){\r\n\t\tlet groupBy = this.groupBy;\r\n\t\tlet Collection = this._getCollectionClass();\r\n\t\tlet groupCol = new Collection(models);\r\n\t\tgroupCol.on('change', (model) => {\r\n\t\t\tif (groupBy(model) !== name)\r\n\t\t\t\tgroupCol.remove(model);\r\n\t\t});\r\n\t\tgroupCol.name = name;\r\n\t\treturn groupCol;\r\n\t},\r\n\r\n\t_initializeEventHandlers() {\r\n\t\tthis.listenTo(this.collection, 'update', this._onCollectionUpdate);\r\n\t},\r\n\t_onCollectionUpdate(col, opts) {\r\n\t\t\r\n\t\tvar data = (opts.changes.added || []).concat(opts.changes.merged || []);\r\n\r\n\t\tvar toAdd = _(data).groupBy(this.groupBy);\r\n\t\tvar toRemove = _(opts.changes.removed).groupBy(this.groupBy);\r\n\r\n\t\tvar groups = this.groups;\r\n\t\tvar addOutOfGroup = {};\r\n\t\t_(toAdd).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].add(models);\r\n\t\t\telse if(this.getOption('autoCreateNewGroups'))\r\n\t\t\t\tthis.addGroup(groupName, models);\r\n\t\t});\r\n\t\t\r\n\t\t_(toRemove).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].remove(models);\r\n\t\t});\r\n\t},\r\n\t_onModelChange(model) {\r\n\t\tvar groupName = this.groupBy(model);\r\n\t\tif (this.groups[groupName])\r\n\t\t\tthis.groups[groupName].add(model);\r\n\t\telse {\r\n\t\t\tconsole.warn('model is out of groupping', model, groupName);\r\n\t\t}\r\n\t},\r\n\tdestroy() {\r\n\r\n\t\t_(this.groups).each((group) => {\r\n\t\t\tgroup.stopListening();\r\n\t\t\tif (_.isFunction(group.destroy))\r\n\t\t\t\tgroup.destroy();\r\n\t\t});\r\n\t\tdelete this.groups;\r\n\r\n\t\tif(_.isFunction(YatObject.prototype.destroy))\r\n\t\t\tYatObject.prototype.destroy.apply(this, arguments);\r\n\r\n\r\n\t\tif (_.isFunction(this.collection.destroy))\r\n\t\t\tthis.collection.destroy();\r\n\r\n\t\tdelete this.collection;\r\n\r\n\t}\r\n});\r\n\r\nexport default CollectionGroups;\r\n","import {version} from '../package.json';\nimport Functions from './functions/functions';\nimport Helpers from './helpers/Helpers';\nimport Mixins from './mixins/Mixins';\nimport Behaviors from './behaviors/behaviors';\nimport Singletons from './singletons/singletons';\nimport TemplateContext from './singletons/template-context';\nimport modals from './singletons/modals/modals';\nimport identity from './singletons/identity';\nimport yatConfig from './YatConfig';\nimport YatObject from './YatObject';\nimport YatError from './YatError';\nimport YatApp from './YatApp';\nimport YatRouter from './YatRouter';\nimport YatPage from './YatPage';\nimport YatPageManager from './YatPageManager';\nimport YatView from './YatView';\nimport YatCollectionView from './YatCollectionView';\n\nimport YatModel from './models/model';\nimport YatCollection from './models/collection';\n\nimport CollectionGroups from './YatCollectionGroups';\n\n\nconst marionetteYat = {\n\tVERSION: version,\n\tFunctions: Functions,\n\tHelpers: Helpers,\n\tMixins: Mixins,\n\tBehaviors: Behaviors,\n\tSingletons: Singletons,\n\tTemplateContext: TemplateContext,\n\tmodals: modals,\n\tidentity: identity,\n\tcreateConfig: yatConfig,\n\tObject: YatObject,\n\tError: YatError,\n\tApp: YatApp,\n\tPage : YatPage,\n\tRouter: YatRouter,\n\tPageManager: YatPageManager,\n\tView: YatView,\n\tCollectionView: YatCollectionView,\n\tModel: YatModel,\n\tCollection: YatCollection,\n\tCollectionGroups, \n};\n\nexport default marionetteYat;\n"],"names":["getCompareABModel","arg","Bb","Model","Mn","View","model","getCompareABView","compareAB","a","b","func","call","viewComparator","args","compareArray","result","length","apply","Array","every","singleCompare","normalizeValue","context","value","_","isFunction","smartGet","opts","fields","fileds","Error","checked","isModel","hasOptions","isObject","options","exclude","some","fieldName","indexOf","get","default","concat","prefix","delimeter","toString","pattern","RegExp","replace","getProperty","name","setProperty","set","silent","models","push","passPath","join","setByPathArr","propertyName","pathArray","prop","force","nextName","shift","setByPath","path","extend","split","slice","chunksCount","setByPathArray","undefined","originPath","modelContext","pop","propertyEventName","substring","trigger","getByPathArray","getByPath","obj","traverse","root","hash","attributes","props","Object","getOwnPropertyNames","x","Date","flattenObject","res","unFlattenObject","e","getName","getValue","wrap","unwrap","isView","view","common","knownCtors","Collection","Router","isKnownCtor","isFn","ctor","prototype","YatError","message","Http","status","error","Http404","Http401","Http403","smartExtend","Src","Dst","mix","BaseClass","Mixed","tmp","fake","reduce","memo","Base","getLabel","Mixin","key","_getOptionOrProperty","getOption","deep","valueContext","fallback","fallbackOptions","initRadioOnInitialize","_initRadio","skip","_channel","channelName","channel","getChannel","request","initializeStateable","_state","state","_this","each","propertyValue","setState","doNotTriggerFullState","_triggerStateChange","getState","broadcast","s","triggerMethod","Stateable","STATES","STATE_KEY","getPropertyPromise","Promise","resolve","_promises1","_promises2","rawPromises","promises","promiseArg","all","addPropertyPromise","promise","Middle","with","State","initializeStartable","constructor","Startable","_registerStartableLifecycleListeners","_setLifeState","INITIALIZED","_startRuntimePromises","_startPromises","_stopPromises","reject","canNotBeStarted","_ensureStartableCanBeStarted","declineReason","isStartNotAllowed","currentState","_getLifeState","dependedOn","_getStartPromise","then","_tryMergeStartOptions","once","triggerStart","canNotBeStopped","_ensureStartableCanBeStopped","isStopNotAllowed","_getStopPromise","_tryMergeStopOptions","triggerStop","newstate","states","_isLifeState","_isLifeStateIn","STARTING","STOPPING","freezeWhileStarting","freezeUI","on","unFreezeUI","RUNNING","WAITING","DESTROYED","mergeOptions","mergeoptions","throwError","destroyed","isNotIntact","_ensureStartableIsIntact","notIdle","_isInProcess","_ensureStartableIsIdle","allowStartWithoutStop","running","allowStopWithoutStart","_getStartPromises","_getStartParentPromise","_getStartPagePromise","noruntime","_getStartRuntimePromise","parent","_getStopPromises","_getStopRuntimePromise","CHILDREN_FIELD","initializeChildrenable","_initializeParrent","_initializeChildren","children","getChildren","startable","filter","c","getParent","_children","child","childContext","_normalizeChildContext","initialized","_initializeChild","Child","_normalizeChildOptions","buildChild","Childrenable","_buildChildOptions","def","ChildClass","templateContextStore","cid","compiledContext","hasChanges","GlobalTemplateContext","viewTemplateContext","global","compile","item","newcontext","cntx","unshift","target","templateContext","TemplateContext","BaseBehavior","Behavior","GetOptionProperty","partial","arguments","fns","BaseDraggable","$doc","_$el","el","$el","jquery","HTMLElement","$","dragging","scope","isSameScope","_clearDragData","document","_defineDocumentBindings","_dragData","__b","setupDragDetection","bind","_setupDragDetection","handleMouseUp","_handleMouseUp","handleMoveAfterMouseDown","_handleMoveAfterMouseDown","handleDragMove","_handleDragMove","handleElementEnter","_handleElementEnter","handleElementLeave","_handleElementLeave","handleElementOver","_handleElementOver","_initializeDragListener","getTriggerEl","one","dragDisabled","stopPropagation","startX","pageX","startY","pageY","_handleDragEnd","_handleEndWithoutDrag","off","$context","getDragEventsContext","drop","catchDraggable","distance","_getStartPositionPixelOffset","startIfMoreThan","_startDragSession","Math","abs","y","selector","getDragEventsElementSelector","ev","$over","over","event","_createCustomDomEvent","merge","customEvent","jQuery","Event","DraggableBehavior","_onDrag","_onDragStart","_onDragEnd","shouldHandleDomEvents","newEvent","_removeGhost","removeClass","_createGhost","addClass","setGhostPosition","$ghost","remove","$g","clone","offset","top","left","css","outerWidth","outerHeight","createGhost","addClasses","appendTo","_setGhost","getGhost","DroppableBehavior","_views","v","isRendered","isAttached","draggable","dropContext","_onDrop","_initReorderBehavior","listenToOnce","reOrder","listenTo","collection","changes","sort","skipAttach","_skipFirstAttach","index","hasChildren","storedDrop","xy","getEventXY","_getDropContext","mixedDrop","keys","k","_onDropContextChange","insert","position","_getPositionByEventXY","_getDropContextByPosisiton","elOffset","elDimension","width","height","xHalf","yHalf","r","direction","childView","last","DynamicClass","changeSource","viewCls","addCls","attr","trim","updateElementClass","setup","property","applyValue","debounce","_applyValue","extendDefaultValues","_values","getModel","toJSON","firstRender","buildFormBindings","_tryFlatValues","setValuesToForm","getValues","raw","clearState","rawvalues","values","_tryUnFlatValues","_apply","_cancel","_reset","_tryChangeModel","rollbackToDefaultValues","_getFullHash","clear","type","canChangeProp","canChange","modelHash","full","mappings","tags","i","tagName","toLowerCase","unCidle","info","_getElementInfo","ext","$found","foundValues","isArray","found","val","$elements","propertyValues","$els","arr","_setValueToElement","_applyCheckboxValue","_applySimpleValue","map","toArray","Draggable","Droppable","FormToHash","mixin","Radioable","IDENTITY_CHANNEL","YatObject","nativeAjax","ajax","Identity","_initializeYatUser","isAnonym","id","update","data","url","method","token","setTokenObject","headers","getAjaxHeaders","needRefresh","isTokenRefreshNeeded","refreshBearerToken","catch","Deferred","_ajaxHeaders","getTokenValue","Authorization","Accept","expires","now","expires_in","_token","_updateHeaders","_replaceBackboneAjax","getTokenObject","access_token","refresh_token","getTokenExpires","isNaN","valueOf","warn","deadline","deadlineMs","getTokenSeconds","bearerTokenRenewUrl","doRefresh","getRefreshToken","identity","manualAfterInitialize","_afterInitialize","instantRender","render","renderOnReady","triggerReady","YatConfig","noRadio","store","getStore","triggerSet","radio","config","Config","modalsShowFull","modalsShowSimple","modalOptionsDefault","modalsCssDefaults","modalsLabelsDefaults","modalsTypes","simple","confirm","template","ModalView","YatView","OptionProperty","destroying","preventClose","getConfigValue","destroy","canBeClosed","clickedOutsideOfModal","cfg","getConfig","wrapper","content","showChildView","inModal","h","closeOnClickOutside","closeOnPromise","asPromise","section","typeName","show","labels","_getModalOptions","header","actions","ModalEngine","modals","listenForEsc","_listenForEsc","doc","_normalizeArguments","_create","modal","keyCode","_remove","ind","splice","stopListening","len","__","isString","text","two","modalEngine","Application","RadioMixin","region","_initRegion","_region","pageManager","_pageManagers","eventName","prefixedEventName","rebuild","_menuTree","managers","links","chain","manager","getLinks","flatten","hasPageManagers","find","mngr","getPage","AppRouter","appRoutes","controller","handlerContext","action","_catchError","postfix","commonEvent","App","GetNameLabel","initializeYatPage","_initializeModels","_initializeRoute","_proxyEvents","_tryCreateRouter","_registerIdentityHandlers","_layoutView","isDestroyed","buildLayout","Layout","buildLayoutOptions","page","rawOptions","fetch","addStartPromise","hashes","_routeHandler","getRouteHash","level","_canHaveLinkModel","_linkModel","getRoute","label","_getSublinks","LinkModel","getLinkModel","link","sublinks","col","addModel","addCollection","route","asPattern","start","relative","parentRoute","_normalizeRoute","create","router","_createAppRouter","size","proxyContexts","_getProxyContexts","_proxyEventsTo","rdy","allowed","contexts","eventsHash","triggerArguments","add","_destroyLinkModel","YatPageManager","_initializeYatPageManager","_routesHash","setRouter","NotFound","execute","getRouter","navigate","console","pageContext","current","rootUrl","_registerPageHandlers","createRouter","_pageBeforeStart","_pageStart","_pageDecline","stop","_moveToRootIfCurrentPageNotAllowed","navigateToRoot","NextCollectionView","CollectionGroups","groups","getGroups","isGroupExists","_createGroup","group","getGroup","colGroups","groupBy","optionGroups","_initializeGrouppedCollection","_initializedGC","_ensureOptions","_initializeGroups","_initializeEventHandlers","addGroup","_getCollectionClass","groupCol","_onCollectionUpdate","added","merged","toAdd","toRemove","removed","groupName","marionetteYat","version","Functions","Helpers","Mixins","Behaviors","Singletons","yatConfig","YatApp","YatPage","YatRouter","YatCollectionView","YatModel","YatCollection"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/marionette.yat.js b/dist/marionette.yat.js
new file mode 100644
index 0000000..12d94f8
--- /dev/null
+++ b/dist/marionette.yat.js
@@ -0,0 +1,3202 @@
+/**
+* @license
+* Marionette.Yat extension for Backbone.Marionette
+* Yet Another Toolkit
+* ----------------------------------
+* v0.0.32
+*
+* Distributed under MIT license
+* author: dimtabu
+*/
+
+
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('backbone'), require('backbone.marionette'), require('underscore'), require('jquery')) :
+ typeof define === 'function' && define.amd ? define(['backbone', 'backbone.marionette', 'underscore', 'jquery'], factory) :
+ (global.MarionetteYat = factory(global.Backbone,global.Marionette,global._,global.jQuery));
+}(this, (function (Bb,Mn,_,$$1) { 'use strict';
+
+Bb = Bb && Bb.hasOwnProperty('default') ? Bb['default'] : Bb;
+Mn = Mn && Mn.hasOwnProperty('default') ? Mn['default'] : Mn;
+_ = _ && _.hasOwnProperty('default') ? _['default'] : _;
+$$1 = $$1 && $$1.hasOwnProperty('default') ? $$1['default'] : $$1;
+
+var version = "0.0.32";
+
+var getCompareABModel = function getCompareABModel(arg) {
+ if (arg instanceof Bb.Model) return arg;else if (arg instanceof Mn.View) return arg.model;else return;
+};
+var getCompareABView = function getCompareABView(arg) {
+ if (arg instanceof Bb.View) return arg;else return;
+};
+
+var compareAB = function compareAB(a, b, func) {
+ if (typeof func === 'function') {
+ a = func.call(a, getCompareABModel(a), getCompareABView(a));
+ b = func.call(b, getCompareABModel(b), getCompareABView(b));
+ }
+ return a < b ? -1 : a > b ? 1 : 0;
+};
+
+/*
+* accepts:
+* variant #1: a, b, function
+* variant #2: [[a,b,function], [a,b,function]]
+* function can be undefined
+* example:
+* ascending : return viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });
+* descending : return viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });
+ multiple compares: return viewComparator([[viewB, viewA, func], [viewB, viewA, func]])
+*/
+var viewComparator = function viewComparator() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var compareArray = [];
+ var result = 0;
+
+ if (args.length >= 2) // single compare
+ return compareAB.apply(null, args);else if (args.length === 1 && args[0] instanceof Array) // array of compare
+ compareArray = args[0];
+
+ _(compareArray).every(function (singleCompare) {
+ result = compareAB.apply(null, singleCompare);
+ return result === 0;
+ });
+
+ return result;
+};
+
+var view = { compareAB: compareAB, viewComparator: viewComparator };
+
+function normalizeValue(context, value, args) {
+ if (_.isFunction(value)) value = value.apply(context, args || []);
+ return value;
+}
+
+function smartGet(context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (opts.fields == null || opts.fileds && !opts.fileds.length) throw new Error('fields option missing');
+
+ opts.checked || (opts.checked = {});
+
+ if (context == null) return;
+
+ var value = void 0;
+ var isModel = context instanceof Bb.Model;
+ var hasOptions = _.isObject(context.options);
+ var exclude = opts.exclude instanceof Array ? opts.exclude : typeof opts.exclude === 'string' ? [opts.exclude] : [];
+
+ _(opts.fields).some(function (fieldName) {
+ if (fieldName in opts.checked) return;
+ opts.checked[fieldName] = true;
+
+ if (exclude.indexOf(fieldName) >= 0) {
+ return;
+ }
+
+ if (isModel && value == null) value = normalizeValue(context, context.get(fieldName), opts.args);
+
+ if (value == null) value = normalizeValue(context, context[fieldName], opts.args);
+
+ if (value == null && hasOptions) value = normalizeValue(context, context.options[fieldName], opts.args);
+
+ return value != null;
+ });
+
+ return value == null ? opts.default : value;
+}
+
+var getLabel = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+var getName = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+var getValue = (function (context) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];
+ opts.fields = fields.concat(opts.fields || []);
+ return smartGet(context, opts);
+});
+
+function cid (prefix, value) {
+ var delimeter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ':';
+
+ prefix || (prefix = '');
+ value = value == null ? '' : value.toString();
+ return prefix + delimeter + value;
+}
+
+function unwrap (value, prefix) {
+ var delimeter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ":";
+
+
+ if (value == null) return;
+ value = value.toString();
+ prefix || (prefix = '');
+ if (!value.length) return value;
+
+ var pattern = new RegExp('^' + prefix + delimeter);
+ return value.replace(pattern, '');
+}
+
+function getProperty(context, name) {
+ if (context == null || !_.isObject(context) || name == null || name == '') return;
+ if (context instanceof Bb.Model) return context.get(name);else return context[name];
+}
+
+function setProperty(context, name, value, options) {
+ if (context instanceof Bb.Model) {
+ context.set(name, value, { silent: true });
+ } else {
+ context[name] = value;
+ }
+
+ if (value instanceof Bb.Model) {
+ options.models.push({
+ path: options.passPath.join(':'),
+ property: name,
+ model: value
+ });
+ }
+
+ options.passPath.push(name);
+
+ return getProperty(context, name);
+}
+
+function setByPathArr(context, propertyName, pathArray, value, options) {
+
+ if (context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;
+
+ if (!pathArray.length) return setProperty(context, propertyName, value, options);
+
+ var prop = getProperty(context, propertyName);
+
+ if (!_.isObject(prop) && !options.force) return;else if (!_.isObject(prop) && options.force) prop = setProperty(context, propertyName, {}, options);
+
+ var nextName = pathArray.shift();
+
+ return setByPathArr(prop, nextName, pathArray, value, options);
+}
+
+var setByPath = function setByPath(context, path, value, opts) {
+
+ if (context == null || !_.isObject(context) || path == null || path == '') return;
+
+ var options = _.extend({}, opts);
+ options.silent = options.silent === true;
+ options.force = options.force !== false;
+
+ if (_.isObject(path) && !(path instanceof Array)) {
+ value = path.value;
+ options.force = path.force !== false;
+ options.silent = path.silent === true;
+ path = path.path;
+ }
+
+ options.path = path;
+ options.passPath = [];
+ options.models = [];
+
+ if (path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.') : path instanceof Array ? [].slice.call(path) : [path];
+
+ options.pathArray = [].slice.call(pathArray);
+
+ if (!pathArray.length) return;
+
+ var chunksCount = pathArray.length;
+ var prop = pathArray.shift();
+
+ if (context instanceof Bb.Model) {
+ options.models.push({
+ path: '',
+ property: prop,
+ model: context
+ });
+ }
+
+ var result = setByPathArr(context, prop, pathArray, value, options);
+
+ if (result === undefined && value !== undefined) return result;
+
+ //triggering change event on all met models
+ if (!options.silent) {
+ var originPath = options.pathArray.join(':');
+ while (options.models.length) {
+ var modelContext = options.models.pop();
+ var propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);
+ if (propertyEventName) {
+ modelContext.model.trigger('change:' + propertyEventName, value);
+ }
+ modelContext.model.trigger('change', modelContext.model);
+ }
+ }
+
+ return result;
+};
+
+function getByPathArray(context, propertyName, pathArray) {
+
+ if (context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;
+
+ var prop = getProperty(context, propertyName);
+
+ if (!pathArray.length || pathArray.length && prop == null) return prop;
+
+ var nextName = pathArray.shift();
+
+ return getByPathArray(prop, nextName, pathArray);
+}
+
+function getByPath(obj, path) {
+
+ if (obj == null || !_.isObject(obj) || path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.') : path instanceof Array ? [].slice.call(path) : [path];
+
+ var prop = pathArray.shift();
+
+ return getByPathArray(obj, prop, pathArray);
+}
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+function traverse(fields, root) {
+ root = root || '';
+ if (this == null || _typeof(this) != 'object') return;
+
+ var hash = this instanceof Bb.Model ? this.attributes : this;
+ var props = Object.getOwnPropertyNames(hash);
+ for (var x = 0; x < props.length; x++) {
+ var name = props[x];
+ var prop = this[name];
+
+ if (prop == null || (typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) != 'object' || prop instanceof Date || prop instanceof Array) fields[root + name] = prop;else if ((typeof prop === 'undefined' ? 'undefined' : _typeof(prop)) == 'object') traverse.call(prop, fields, root + name + '.');
+ }
+}
+
+function flattenObject(obj) {
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ traverse.call(obj, res);
+ return res;
+}
+
+function unFlattenObject(obj) {
+
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ for (var e in obj) {
+ setByPath(res, e, obj[e], true);
+ }
+ return res;
+}
+
+var isView = (function (arg) {
+ return arg instanceof Bb.View;
+});
+
+var __ = {
+ getLabel: getLabel, getName: getName, getValue: getValue, wrap: cid, unwrap: unwrap, setByPath: setByPath, getByPath: getByPath, flattenObject: flattenObject, unFlattenObject: unFlattenObject, isView: isView
+};
+
+var Functions = { view: view, common: __ };
+
+var knownCtors = [Bb.Model, Bb.Collection, Bb.View, Bb.Router, Mn.Object];
+
+function isKnownCtor(arg) {
+ var isFn = _.isFunction(arg);
+ var result = _(knownCtors).some(function (ctor) {
+ return arg === ctor || arg.prototype instanceof ctor;
+ });
+ return isFn && result;
+}
+
+var YatError = Mn.Error.extend({}, {
+ Http400: function Http400(message) {
+ return this.Http(400, message);
+ },
+ Http401: function Http401(message) {
+ return this.Http(401, message);
+ },
+ Http403: function Http403(message) {
+ return this.Http(403, message);
+ },
+ Http404: function Http404(message) {
+ return this.Http(404, message);
+ },
+ Http500: function Http500(message) {
+ return this.Http(500, message);
+ },
+ Http: function Http(status, message) {
+ var error = new this({ message: message, name: "HttpError" });
+ error.status = status;
+ return error;
+ },
+ HttpRedirect: function HttpRedirect(message) {
+ return this.Http(301, message);
+ },
+ NotFound: function NotFound(message) {
+ return this.Http404(message);
+ },
+ NotAuthorized: function NotAuthorized(message) {
+ return this.Http401(message);
+ },
+ Forbidden: function Forbidden(message) {
+ return this.Http403(message);
+ }
+});
+
+function smartExtend(Src, Dst) {
+ if (_.isFunction(Dst)) {
+ return Dst(Src);
+ } else if (_.isObject(Dst)) {
+ return Src.extend(Dst);
+ } else throw new YatError('Mixin fail, argument should be an object hash or mixin function');
+}
+
+function mix(BaseClass) {
+ var Mixed = null;
+ if (_.isFunction(BaseClass)) {
+ Mixed = BaseClass;
+ } else if (_.isObject(BaseClass) && BaseClass !== null) {
+ var tmp = function tmp() {};
+ tmp.extend = Mn.extend;
+ Mixed = tmp.extend(BaseClass);
+ } else {
+ throw new Error('argument should be an object or class definition');
+ }
+ if (!Mixed.extend) {
+ Mixed = Mn.extend.call(BaseClass, {});
+ Mixed.extend = Mn.extend;
+ }
+ var fake = {
+ with: function _with() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return _.reduce(args, function (memo, arg) {
+ return smartExtend(memo, arg);
+ }, Mixed);
+ },
+ class: Mixed
+ };
+ return fake;
+}
+
+var Helpers = {
+ isKnownCtor: isKnownCtor,
+ mix: mix
+};
+
+function GetNameLabel (Base) {
+ return Base.extend({
+ getName: function getName() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getName';
+ options.args = [options];
+ return __.getName(this, options);
+ },
+ getLabel: function getLabel() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getLabel';
+ options.args = [options];
+ return __.getLabel(this, options);
+ },
+ getValue: function getValue() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var options = _.extend({}, opts);
+ options.exclude = 'getValue';
+ options.args = [options];
+ return __.getValue(this, options);
+ }
+ });
+}
+
+var GetOptionProperty = (function (Base) {
+ var Mixin = Base.extend({
+ //property first approach
+ getProperty: function getProperty(key, options) {
+ return this._getOptionOrProperty(this, key, options, this.getOption);
+ },
+
+ //options first approach
+ getOption: function getOption(key, options) {
+ return this._getOptionOrProperty(this.getProperty('options', { deep: false }), key, options, this.getProperty);
+ },
+ _getOptionOrProperty: function _getOptionOrProperty(valueContext, key) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var fallback = arguments[3];
+
+ options.deep !== undefined || (options.deep = true);
+ options.force !== undefined || (options.force = true);
+ options.args || (options.args = []);
+
+ //key and valueContext should be passed
+ if (key == null || valueContext == null) return;
+
+ //getting raw value
+ var value = valueContext[key];
+
+ //if there is no raw value and deep option is true then getting value from fallback
+ if (value === undefined && options.deep && _.isFunction(fallback)) {
+ var fallbackOptions = _.extend({}, options, { deep: false, force: false });
+ value = fallback.call(this, key, fallbackOptions);
+ }
+
+ //if returned value is function and is not any of known constructors and options property force set to true
+ //we should return value of that function
+ //options.args will be passed as arguments
+ if (_.isFunction(value) && options.force && !isKnownCtor(value)) value = value.apply(this, options.args || []);
+
+ //console.log('key', key, value);
+
+ //if value is still undefined we will return default option value
+ return value === undefined ? options.default : value;
+ }
+ });
+ return Mixin;
+});
+
+var RadioMixin = (function (Base) {
+ var Mixin = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ var initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);
+ this._initRadio({ skip: initRadioOnInitialize });
+ },
+ getChannel: function getChannel() {
+ if (!this._channel) this._initRadio({ skip: false });
+ return this._channel;
+ },
+ _initRadio: function _initRadio() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { skip: true };
+
+ if (opts.skip == true) return;
+
+ var channelName = this.getProperty('channelName');
+ if (!channelName) {
+ var channel = this.getProperty('channel');
+ if (channel) this.channelName = channel.channelName;
+ }
+ Mn.Object.prototype._initRadio.call(this);
+ },
+ radioRequest: function radioRequest() {
+ var channel = this.getChannel();
+ if (channel) channel.request.apply(channel, arguments);
+ },
+ radioTrigger: function radioTrigger() {
+ var channel = this.getChannel();
+ if (channel) channel.trigger.apply(channel, arguments);
+ }
+ });
+
+ return Mixin;
+});
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var Stateable = (function (BaseClass) {
+ var Mixin = BaseClass.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ BaseClass.apply(this, args);
+ this.initializeStateable();
+ },
+ initializeStateable: function initializeStateable() {
+ this._state = {};
+ },
+ getState: function getState(key) {
+ var state = this._state;
+ if (!key) return state;else return state[key];
+ },
+ setState: function setState(key, value, options) {
+
+ if (key == null) return;
+
+ if (_.isObject(key)) {
+ var _this = this;
+ options = value;
+ value = key;
+ _(value).each(function (propertyValue, propertyName) {
+ return _this.setState(propertyName, propertyValue, _.extend({}, options, { doNotTriggerFullState: true }));
+ });
+ this._triggerStateChange(value, options);
+ } else {
+ var state = this.getState();
+ state[key] = value;
+ this._triggerStateChange(key, value, options);
+ }
+ },
+ clearState: function clearState() {
+ var state = this.getState();
+ var broadcast = _.extend({}, state);
+ _(state).each(function (s, key) {
+ broadcast[key] = undefined;
+ delete state[key];
+ });
+ this._triggerStateChange(broadcast);
+ },
+ _triggerStateChange: function _triggerStateChange(key, value, options) {
+
+ if (!_.isFunction(this.triggerMethod)) return;
+
+ if (!_.isObject(key)) {
+ this.triggerMethod('state:' + key, value, options);
+ if (value === true || value === false || !!value && typeof value === 'string') this.triggerMethod('state:' + key + ':' + value.toString(), options);
+ if (!options || options && !options.doNotTriggerFullState) {
+ this.triggerMethod('state', _defineProperty({}, key, value), options);
+ }
+ } else {
+ //key is a hash of states
+ //value is options
+ options = value;
+ value = key;
+ this.triggerMethod('state', value, options);
+ }
+ }
+ });
+ Mixin.Stateable = true;
+
+ return Mixin;
+});
+
+var STATES = {
+ INITIALIZED: 'initialized',
+ STARTING: 'starting',
+ RUNNING: 'running',
+ STOPPING: 'stopping',
+ WAITING: 'waiting',
+ DESTROYED: 'destroyed'
+};
+
+var STATE_KEY = 'life';
+
+function getPropertyPromise(context, propertyName) {
+ var _this2 = this;
+
+ if (context == null || propertyName == null) return Promise.resolve();
+
+ var _promises1 = context['_' + propertyName] || [];
+ var _promises2 = _.result(context, propertyName) || [];
+
+ var rawPromises = _promises1.concat(_promises2);
+ //context[propertyName] || [];
+
+ var promises = [];
+ _(rawPromises).each(function (promiseArg) {
+ if (_.isFunction(promiseArg)) promises.push(promiseArg.call(_this2));else if (promiseArg != null) promises.push(promiseArg);
+ });
+ return Promise.all(promises);
+}
+
+function addPropertyPromise(context, propertyName, promise) {
+ context[propertyName] || (context[propertyName] = []);
+ var promises = context[propertyName];
+ promises.push(promise);
+}
+
+var Startable = (function (Base) {
+ var Middle = mix(Base).with(Stateable);
+ var Mixin = Middle.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Middle.apply(this, args);
+ this.initializeStartable();
+ },
+
+
+ freezeWhileStarting: false,
+ freezeUI: function freezeUI() {},
+ unFreezeUI: function unFreezeUI() {},
+ isStartNotAllowed: function isStartNotAllowed() {},
+ isStopNotAllowed: function isStopNotAllowed() {},
+ addStartPromise: function addStartPromise(promise) {
+ addPropertyPromise(this, '_startRuntimePromises', promise);
+ },
+ addStopPromise: function addStopPromise(promise) {
+ addPropertyPromise(this, '_stopPromises', promise);
+ },
+ initializeStartable: function initializeStartable() {
+
+ if (!(this.constructor.Startable && this.constructor.Stateable)) return;
+
+ this._registerStartableLifecycleListeners();
+ this._setLifeState(STATES.INITIALIZED);
+ this._startRuntimePromises = [];
+ this._startPromises = [];
+ this._stopPromises = [];
+ },
+ start: function start() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ var options = args[0];
+ /*
+ let canNotBeStarted = this._ensureStartableCanBeStarted();
+ let resultPromise = null;
+ let catchMethod = null;
+ if(canNotBeStarted){
+ catchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);
+ //resultPromise = Promise.reject(canNotBeStarted);
+ }
+ if(resultPromise == null){
+ let declineReason = this.isStartNotAllowed(options);
+ if(declineReason) {
+ catchMethod = () => this.triggerMethod('start:decline',declineReason);
+ resultPromise = Promise.reject(declineReason);
+ }
+ }
+ if(resultPromise == null){
+ var currentState = this._getLifeState();
+ this._tryMergeStartOptions(options);
+ this.triggerMethod('before:start', ...args);
+ resultPromise = this._getStartPromise();
+ }
+ */
+
+ // return resultPromise.then(() => {
+ // this.triggerStart(options)
+ // }, (error) => {
+ // this._setLifeState(currentState);
+ // if(catchMethod) catchMethod();
+ // return Promise.reject(error);
+ // });
+ var _this = this;
+ var promise = new Promise(function (resolve, reject) {
+ var canNotBeStarted = _this._ensureStartableCanBeStarted();
+
+ if (canNotBeStarted) {
+ _this.triggerMethod('start:decline', canNotBeStarted);
+ reject(canNotBeStarted);
+ return;
+ }
+
+ var declineReason = _this.isStartNotAllowed(options);
+ if (declineReason) {
+ _this.triggerMethod('start:decline', declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ _this.triggerMethod.apply(_this, ['before:start'].concat(args));
+ var currentState = _this._getLifeState();
+ var dependedOn = _this._getStartPromise();
+ dependedOn.then(function () {
+ _this._tryMergeStartOptions(options);
+ _this.once('start', function () {
+ return resolve.apply(undefined, arguments);
+ });
+ _this.triggerStart(options);
+ }, function () {
+ _this._setLifeState(currentState);
+ reject.apply(undefined, arguments);
+ });
+ });
+ return promise;
+ },
+ triggerStart: function triggerStart(options) {
+ this.triggerMethod('start', options);
+ },
+ stop: function stop() {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ var options = args[0];
+ /*
+ let canNotBeStopped = this._ensureStartableCanBeStopped();
+ if(canNotBeStopped){
+ this.triggerMethod('stop:decline',canNotBeStopped);
+ return Promise.reject(canNotBeStopped);
+ }
+ let declineReason = this.isStopNotAllowed(options);
+ if(declineReason){
+ this.triggerMethod('stop:decline', declineReason);
+ return Promise.reject(declineReason);
+ }
+
+ var currentState = this._getLifeState();
+ this._tryMergeStopOptions(options);
+ this.triggerMethod('before:stop', this, options);
+ let promise = this._getStopPromise();
+ return promise.then(() => {
+ this.triggerStop(options)
+ }, () => {
+ this._setLifeState(currentState);
+ });
+ */
+
+ var _this = this;
+ var promise = new Promise(function (resolve, reject) {
+ var canNotBeStopped = _this._ensureStartableCanBeStopped();
+
+ if (canNotBeStopped) {
+ _this.triggerMethod('stop:decline', canNotBeStopped);
+ reject(canNotBeStopped);
+ return;
+ }
+
+ var declineReason = _this.isStopNotAllowed(options);
+ if (declineReason) {
+ _this.triggerMethod('stop:decline', declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ var currentState = _this._getLifeState();
+ var dependedOn = _this._getStopPromise();
+ _this.triggerMethod.apply(_this, ['before:stop'].concat(args));
+ dependedOn.then(function () {
+ _this._tryMergeStopOptions(options);
+ _this.once('stop', function () {
+ return resolve.apply(undefined, arguments);
+ });
+ _this.triggerStop(options);
+ }, function () {
+ _this._setLifeState(currentState);
+ reject.apply(undefined, arguments);
+ });
+ });
+ return promise;
+ },
+ triggerStop: function triggerStop(options) {
+ this.triggerMethod('stop', options);
+ },
+
+
+ //lifecycle state helpers
+ _setLifeState: function _setLifeState(newstate) {
+ this.setState(STATE_KEY, newstate);
+ },
+ _getLifeState: function _getLifeState() {
+ return this.getState(STATE_KEY);
+ },
+ _isLifeState: function _isLifeState(state) {
+ return this._getLifeState() === state;
+ },
+ _isLifeStateIn: function _isLifeStateIn() {
+ var _this3 = this;
+
+ for (var _len4 = arguments.length, states = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ states[_key4] = arguments[_key4];
+ }
+
+ return _(states).some(function (state) {
+ return _this3._isLifeState(state);
+ });
+ },
+ _isInProcess: function _isInProcess() {
+ return this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);
+ },
+ _registerStartableLifecycleListeners: function _registerStartableLifecycleListeners() {
+ var _this4 = this;
+
+ var freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;
+ if (freezeWhileStarting && _.isFunction(this.freezeUI)) this.on('state:' + STATE_KEY + ':' + STATES.STARTING, function () {
+ _this4.freezeUI();
+ });
+ if (freezeWhileStarting && _.isFunction(this.unFreezeUI)) this.on('start', function () {
+ _this4.unFreezeUI();
+ });
+
+ this.on('before:start', function () {
+ return _this4._setLifeState(STATES.STARTING);
+ });
+ this.on('start', function () {
+ return _this4._setLifeState(STATES.RUNNING);
+ });
+ this.on('before:stop', function () {
+ return _this4._setLifeState(STATES.STOPPING);
+ });
+ this.on('stop', function () {
+ return _this4._setLifeState(STATES.WAITING);
+ });
+ this.on('destroy', function () {
+ return _this4._setLifeState(STATES.DESTROYED);
+ });
+ },
+ _tryMergeStartOptions: function _tryMergeStartOptions(options) {
+ if (!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStartOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+ _tryMergeStopOptions: function _tryMergeStopOptions(options) {
+ if (!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStopOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+ _ensureStartableIsIntact: function _ensureStartableIsIntact() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+ var message = 'Startable has already been destroyed and cannot be used.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var destroyed = this._isLifeState(STATES.DESTROYED);
+ if (opts.throwError && destroyed) {
+ throw error;
+ } else if (destroyed) {
+ return error;
+ }
+ },
+ _ensureStartableIsIdle: function _ensureStartableIsIdle() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+ var message = 'Startable is not idle. current state: ' + this._getLifeState();
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var isNotIntact = this._ensureStartableIsIntact(opts);
+ var notIdle = this._isInProcess();
+ if (opts.throwError && notIdle) {
+ throw error;
+ } else if (isNotIntact) {
+ return isNotIntact;
+ } else if (notIdle) {
+ return error;
+ }
+ },
+ _ensureStartableCanBeStarted: function _ensureStartableCanBeStarted() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+
+ var message = 'Startable has already been started.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var notIdle = this._ensureStartableIsIdle(opts);
+ var allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;
+
+ if (!notIdle && allowStartWithoutStop) return;
+
+ var running = this._isLifeState(STATES.RUNNING);
+ if (opts.throwError && running) {
+ throw error;
+ } else if (notIdle) {
+ return notIdle;
+ } else if (running) {
+ return error;
+ }
+ },
+ _ensureStartableCanBeStopped: function _ensureStartableCanBeStopped() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { throwError: false };
+
+
+ var message = 'Startable should be in `running` state.';
+ var error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ var notIdle = this._ensureStartableIsIdle(opts);
+
+ var allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;
+ if (!notIdle && allowStopWithoutStart) return;
+
+ var running = this._isLifeState(STATES.RUNNING);
+
+ if (opts.throwError && !running) {
+ throw error;
+ } else if (notIdle) {
+ return notIdle;
+ } else if (!running) {
+ return error;
+ }
+ },
+ _getStartPromise: function _getStartPromise() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ return Promise.all(this._getStartPromises(options));
+ },
+ _getStartPromises: function _getStartPromises() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var promises = [];
+ promises.push(this._getStartParentPromise());
+ promises.push(this._getStartPagePromise());
+ if (options.noruntime !== true) promises.push(this._getStartRuntimePromise());
+ return promises;
+ },
+ _getStartRuntimePromise: function _getStartRuntimePromise() {
+ return getPropertyPromise(this, 'startRuntimePromises');
+ },
+ _getStartPagePromise: function _getStartPagePromise() {
+ return getPropertyPromise(this, 'startPromises');
+ },
+ _getStartParentPromise: function _getStartParentPromise() {
+ var parent = _.result(this, 'getParent');
+ if (_.isObject(parent) && _.isFunction(parent._getStartPromise)) return parent._getStartPromise({ noruntime: true });
+ },
+ _getStopPromise: function _getStopPromise() {
+ return Promise.all(this._getStopPromises());
+ },
+ _getStopPromises: function _getStopPromises() {
+ var promises = [];
+ promises.push(this._getStopRuntimePromise());
+ return promises;
+ },
+ _getStopRuntimePromise: function _getStopRuntimePromise() {
+ return getPropertyPromise(this, 'stopPromises');
+ },
+ _getStopParentPromise: function _getStopParentPromise() {
+ var parent = _.result(this, 'getParent');
+ if (_.isObject(parent) && _.isFunction(parent._getStopPromise)) return parent._getStopPromise();
+ }
+ });
+
+ Mixin.Startable = true;
+
+ return Mixin;
+});
+
+var Childrenable = (function (Base) {
+
+ var CHILDREN_FIELD = '_children';
+
+ var Mixin = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ this.initializeChildrenable.apply(this, args);
+ },
+ initializeChildrenable: function initializeChildrenable() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this._initializeParrent(options);
+ this._initializeChildren(options);
+ },
+ hasChildren: function hasChildren() {
+ var children = this.getChildren();
+ return this[CHILDREN_FIELD].length > 0;
+ },
+ getChildren: function getChildren() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { startable: true };
+
+ var all = this[CHILDREN_FIELD] || [];
+ if (!opts.startable) {
+ return all;
+ } else {
+ return all.filter(function (c) {
+ return !c.getProperty('isStartNotAllowed');
+ });
+ }
+ },
+ hasParent: function hasParent() {
+ var parent = this.getParent();
+ return _.isObject(parent);
+ },
+ getParent: function getParent() {
+ return this.getProperty('parent', { deep: false });
+ },
+ _initializeChildren: function _initializeChildren() {
+ var _this = this;
+
+ var _children = this.getProperty('children');
+ var children = [];
+ _(_children).each(function (child) {
+
+ var childContext = _this._normalizeChildContext(child);
+ var initialized = _this._initializeChild(childContext);
+ if (initialized) children.push(initialized);
+ });
+ this[CHILDREN_FIELD] = children;
+ },
+ _initializeChild: function _initializeChild(childContext) {
+ if (childContext == null || !_.isFunction(childContext.Child)) return;
+
+ var Child = childContext.Child;
+ var opts = this._normalizeChildOptions(childContext);
+ return this.buildChild(Child, opts);
+ },
+ _normalizeChildContext: function _normalizeChildContext(child) {
+ var childContext = {};
+
+ if (_.isFunction(child) && child.Childrenable) {
+ _.extend(childContext, { Child: child });
+ } else if (_.isFunction(child)) {
+ childContext = this._normalizeChildContext(child.call(this));
+ } else if (_.isObject(child)) {
+ childContext = child;
+ }
+ return childContext;
+ },
+ _normalizeChildOptions: function _normalizeChildOptions(options) {
+ var opts = _.extend({}, options);
+ if (this.getOption('passToChildren') === true) {
+ _.extend(opts, this.options);
+ }
+ opts.parent = this;
+ delete opts.Child;
+ return this._buildChildOptions(opts);
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ return _.extend(def, this.getProperty('childOptions'));
+ },
+
+ buildChild: function buildChild(ChildClass, options) {
+ return new ChildClass(options);
+ },
+ _initializeParrent: function _initializeParrent(opts) {
+ if (this.parent == null && opts.parent != null) this.parent = opts.parent;
+ }
+ });
+
+ Mixin.Childrenable = true;
+
+ return Mixin;
+});
+
+var templateContextStore = [function (view) {
+ return {
+ _v: view,
+ _m: view.model || {},
+ _cid: function _cid(arg) {
+ return cid(view.cid, arg);
+ }
+ };
+}];
+var compiledContext = {}; //rethink how it can be used
+var hasChanges = false;
+
+function normalizeValue$1(value) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (_.isFunction(value)) return value.apply(undefined, args);else if (_.isObject(value)) return value;else return {};
+}
+
+var GlobalTemplateContext$1 = {
+ mix: function mix(viewTemplateContext) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ var global = this.get.apply(this, args);
+ return _.extend(global, viewTemplateContext);
+ },
+ get: function get() {
+ return this.compile.apply(this, arguments);
+ },
+ add: function add() {
+ var _this = this;
+
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ _(args).each(function (item) {
+ return _this.push(item);
+ });
+ },
+ compile: function compile() {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ if (hasChanges) compiledContext = {};
+
+ var newcontext = {};
+
+ _(templateContextStore).each(function (cntx) {
+ if (_.isFunction(cntx)) _.extend(newcontext, normalizeValue$1.apply(undefined, [cntx].concat(args)));else if (hasChanges) {
+ _.extend(compiledContext, cntx);
+ }
+ });
+ if (!hasChanges) _.extend(newcontext, compiledContext);
+
+ hasChanges = false;
+ return newcontext;
+ },
+ pop: function pop() {
+ hasChanges = true;
+ return templateContextStore.pop();
+ },
+ shift: function shift() {
+ hasChanges = true;
+ return templateContextStore.shift();
+ },
+ push: function push(item) {
+ hasChanges = true;
+ templateContextStore.push(item);
+ },
+ unshift: function unshift(item) {
+ hasChanges = true;
+ templateContextStore.unshift(item);
+ },
+ clear: function clear() {
+ hasChanges = false;
+ compiledContext = {};
+ templateContextStore = [];
+ }
+};
+
+var GlobalTemplateContext = (function (Base) {
+ return Base.extend({
+ mixinTemplateContext: function mixinTemplateContext() {
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ var templateContext = GlobalTemplateContext$1.mix(_.result(this, 'templateContext'), this);
+
+ return _.extend(target, templateContext);
+ }
+ });
+});
+
+var Mixins = {
+ GetNameLabel: GetNameLabel,
+ GetOptionProperty: GetOptionProperty,
+ Radioable: RadioMixin,
+ Stateable: Stateable,
+ Startable: Startable,
+ Childrenable: Childrenable,
+ GlobalTemplateContext: GlobalTemplateContext
+};
+
+var BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);
+var Behavior = BaseBehavior.extend({
+
+ listenViewInitialize: true,
+
+ constructor: function constructor() {
+
+ if (this.getProperty('listenViewInitialize') === true) this.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));
+
+ BaseBehavior.apply(this, arguments);
+ },
+
+
+ getModel: function getModel() {
+ return this.view.model;
+ },
+ cidle: function cidle(name) {
+ return __.wrap(this.view.cid, name);
+ },
+ unCidle: function unCidle(name) {
+ return __.unwrap(name, this.view.cid);
+ }
+});
+
+var BaseDraggable = Behavior.extend({
+
+ triggerEl: undefined, //drag initialization element, if not set equal to view.$el
+ moveBeforeStart: 10,
+ scope: 'drag',
+
+ getDragEventsContext: function getDragEventsContext() {
+ return this.$doc;
+ },
+ getDragEventsElementSelector: function getDragEventsElementSelector() {
+ return '*';
+ },
+ getTriggerEl: function getTriggerEl() {
+ if (this._$el) return this._$el;
+
+ var el = this.getOption('triggerEl');
+ if (el == null && this.view.$el) this._$el = this.view.$el;else if (el && el.jquery) this._$el = el;else if (el instanceof HTMLElement) this._$el = $(el);else if (typeof el === 'string' && el.length) this._$el = this.view.$(el);else throw new Error('trigger element should be a DOM or jQuery object or string selector.', el);
+
+ return this._$el;
+ },
+ isSameScope: function isSameScope(dragging) {
+ return dragging.scope === this.scope;
+ },
+ shouldHandleDomEvents: function shouldHandleDomEvents(dragging) {
+ return this.isSameScope(dragging) && this !== dragging;
+ },
+
+
+ constructor: function constructor() {
+
+ this._clearDragData();
+
+ this.$doc = $(document);
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Behavior.apply(this, args);
+
+ this._defineDocumentBindings();
+ },
+ _clearDragData: function _clearDragData() {
+ this._dragData = {};
+ },
+ _defineDocumentBindings: function _defineDocumentBindings() {
+ this.__b = {};
+ this.__b.setupDragDetection = _.bind(this._setupDragDetection, this);
+ this.__b.handleMouseUp = _.bind(this._handleMouseUp, this);
+ this.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);
+ this.__b.handleDragMove = _.bind(this._handleDragMove, this);
+ this.__b.handleElementEnter = _.bind(this._handleElementEnter, this);
+ this.__b.handleElementLeave = _.bind(this._handleElementLeave, this);
+ this.__b.handleElementOver = _.bind(this._handleElementOver, this);
+ },
+ onInitialize: function onInitialize() {
+ this._initializeDragListener();
+ },
+ _initializeDragListener: function _initializeDragListener() {
+ var $el = this.getTriggerEl();
+ $el.one('mousedown', this.__b.setupDragDetection);
+ },
+ _setupDragDetection: function _setupDragDetection(e) {
+ if (this.view.dragDisabled === true) {
+ this._initializeDragListener();
+ return;
+ }
+
+ e.stopPropagation();
+
+ this.$doc.one('mouseup', this.__b.handleMouseUp);
+
+ this._dragData.startX = e.pageX;
+ this._dragData.startY = e.pageY;
+ this.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);
+ },
+ _handleMouseUp: function _handleMouseUp(e) {
+ if (this._dragData.dragging) this._handleDragEnd(e);else this._handleEndWithoutDrag(e);
+
+ this._initializeDragListener();
+ },
+ _handleEndWithoutDrag: function _handleEndWithoutDrag(e) {
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+ },
+ _handleDragEnd: function _handleDragEnd(e) {
+ this._dragData.dragging = false;
+
+ this.$doc.off('mousemove', this.__b.handleDragMove);
+
+ var $context = this.getDragEventsContext();
+ $context.off('mouseenter', this.__b.handleElementEnter);
+ $context.off('mousemove', this.__b.handleElementOver);
+
+ if (this._dragData.drop && this._dragData.drop.context) {
+ this._dragData.drop.context.catchDraggable(this, this._dragData.drop);
+ this.triggerMethod('drag:drop', this._dragData.drop);
+ }
+
+ this.triggerMethod('drag:end');
+ },
+ _handleMoveAfterMouseDown: function _handleMoveAfterMouseDown(e) {
+ e.stopPropagation();
+
+ var distance = this._getStartPositionPixelOffset(e);
+ var startIfMoreThan = this.getOption('moveBeforeStart');
+ if (distance >= startIfMoreThan) this._startDragSession();
+ },
+ _getStartPositionPixelOffset: function _getStartPositionPixelOffset(e) {
+ var x = Math.abs(e.pageX - this._dragData.startX);
+ var y = Math.abs(e.pageY - this._dragData.startY);
+ return x > y ? x : y;
+ },
+ _startDragSession: function _startDragSession() {
+ this._dragData.dragging = true;
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+
+ this.$doc.on('mousemove', this.__b.handleDragMove);
+
+ var $context = this.getDragEventsContext();
+ var selector = this.getDragEventsElementSelector();
+
+ $context.on('mouseenter', selector, this.__b.handleElementEnter);
+
+ $context.on('mousemove', selector, this.__b.handleElementOver);
+
+ this.view.triggerMethod('drag:start');
+ },
+ _handleDragMove: function _handleDragMove(ev) {
+ ev.stopPropagation();
+
+ this.triggerMethod('drag', ev);
+ },
+ _handleElementEnter: function _handleElementEnter(e) {
+ var _this = this;
+
+ var $over = $(e.target);
+
+ if (this._dragData.over != $over) {
+ this._dragData.over = $over;
+ $over.trigger('drag:enter', this);
+ $over.one('mouseleave', function () {
+ return _this.trigger('drag:leave', _this);
+ });
+ }
+ },
+ _handleElementLeave: function _handleElementLeave(e) {
+ var $over = $(e.target);
+ $over.trigger('drag:leave', this);
+ },
+ _handleElementOver: function _handleElementOver(e) {
+ var $over = $(e.target);
+ var event = this._createCustomDomEvent('drag:over', e);
+ $over.trigger(event, this);
+ },
+
+ _createCustomDomEvent: function _createCustomDomEvent(name, event, merge) {
+ if (!merge) merge = ["pageX", "pageY", "clientX", "clientY", "offsetX", "offsetY", "target"];
+
+ var customEvent = jQuery.Event(name);
+ _(merge).each(function (prop) {
+ return customEvent[prop] = event[prop];
+ });
+
+ return customEvent;
+ }
+});
+
+var DraggableBehavior = BaseDraggable.extend({
+
+ useGhost: true,
+ viewCssClass: 'dragging',
+ ghostCssClass: 'ghost',
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ BaseDraggable.apply(this, args);
+
+ this.on('drag', this._onDrag);
+ this.on('drag:start', this._onDragStart);
+ this.on('drag:end', this._onDragEnd);
+ },
+
+ events: {
+ 'drag:enter': function dragEnter(e, dragging) {
+ if (!this.shouldHandleDomEvents(dragging)) return;
+ },
+ 'drag:over': function dragOver(e, dragging) {
+ if (!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+ var newEvent = this._createCustomDomEvent('drag:over', e);
+
+ var parent = this.$el.parent();
+ if (parent) parent.trigger(newEvent, [dragging, this]);
+ }
+ },
+
+ _onDragEnd: function _onDragEnd(ev) {
+
+ if (this.getOption('useGhost')) this._removeGhost();
+ if (this.getOption('viewCssClass')) this.view.$el.removeClass(this.getOption('viewCssClass'));
+
+ this._clearDragData();
+ },
+ _onDragStart: function _onDragStart(ev) {
+ if (this.getOption('useGhost')) this._createGhost();
+ if (this.getOption('viewCssClass')) this.view.$el.addClass(this.getOption('viewCssClass'));
+ },
+ _onDrag: function _onDrag(ev) {
+ this.setGhostPosition(ev.pageY, ev.pageX);
+ },
+ _removeGhost: function _removeGhost() {
+ this.$ghost.remove();
+ delete this.$ghost;
+ },
+ createGhost: function createGhost() {
+ var $g = this.$el.clone();
+
+ var _$el$offset = this.$el.offset(),
+ top = _$el$offset.top,
+ left = _$el$offset.left;
+
+ $g.css({
+ top: top + 'px',
+ left: left + 'px',
+ width: this.$el.outerWidth(),
+ height: this.$el.outerHeight()
+ });
+ return $g;
+ },
+ _createGhost: function _createGhost() {
+ var $g = this.createGhost();
+ if ($g.css('position') != 'absolute') $g.css('position', 'absolute');
+
+ var addClasses = this.getOption('ghostCssClass');
+ if (addClasses) $g.addClass(addClasses);
+
+ $g.appendTo($('body'));
+ this._setGhost($g);
+ },
+ _setGhost: function _setGhost($g) {
+ this.$ghost = $g;
+ },
+ getGhost: function getGhost() {
+ return this.$ghost;
+ },
+ setGhostPosition: function setGhostPosition(top, left) {
+
+ var $ghost = this.getGhost();
+ if (!$ghost) return;
+
+ $ghost.css({
+ top: top + 'px',
+ left: left + 'px'
+ });
+ }
+});
+
+var DroppableBehavior = Behavior.extend({
+ scope: 'drag',
+ events: {
+ 'drag:over': '_onDomDragOver'
+ },
+
+ //because of mn 3.5.1 bug of first render isAtached flag
+ _skipFirstAttach: true,
+
+ isSameScope: function isSameScope(dragging) {
+ return dragging.scope === this.scope;
+ },
+ getEventXY: function getEventXY(e) {
+ return { x: e.pageX, y: e.pageY };
+ },
+ getChildren: function getChildren() {
+ return _(this.view.children._views).filter(function (v) {
+ return v.model && v.isRendered() && v.isAttached();
+ });
+ },
+ catchDraggable: function catchDraggable(draggable, dropContext) {
+ this._onDrop(draggable, dropContext);
+ },
+
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Behavior.apply(this, args);
+ this._initReorderBehavior();
+ },
+ _initReorderBehavior: function _initReorderBehavior() {
+ var _this = this;
+
+ this.listenToOnce(this.view, 'render', function () {
+ _this.reOrder({ silent: true });
+ _this.listenTo(_this.view.collection, 'update', function (collection, options) {
+ var changes = (options || {}).changes || {};
+ this.reOrder();
+ });
+ });
+ },
+ reOrder: function reOrder() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ this.view.sort();
+
+ var children = this.children = [];
+ var skipAttach = this._skipFirstAttach;
+ _(this.view.children._views).each(function (view, index) {
+ if (!view.model) return;
+ view.model.set('order', index);
+ if (view.isRendered() && (skipAttach || view.isAttached())) children.push(view);
+ });
+
+ this.hasChildren = this.children.length > 0;
+
+ if (options.silent != true && this.view.collection) this.view.collection.trigger('reordered');
+
+ this._skipFirstAttach = false;
+ },
+
+
+ // _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },
+ // _onChildrenReady(){
+ // this._refreshChildren();
+ // },
+ // _refreshChildren(){
+
+ // this.children = this.getChildren();
+ // this.hasChildren = this.children.length > 0;
+
+ // this.view.collection.trigger('reordered', this.view.collection.cid);
+ // },
+
+
+ _onDomDragOver: function _onDomDragOver(e, dragging, child) {
+ if (!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+ if (dragging === child || this.hasChildren && !child) return;
+
+ dragging._dragData.drop || (dragging._dragData.drop = {});
+ var storedDrop = dragging._dragData.drop;
+
+ var xy = this.getEventXY(e);
+
+ var drop = this._getDropContext(xy, child);
+ drop.context = this;
+
+ var mixedDrop = _.extend({}, storedDrop, drop);
+ var keys = _.keys(mixedDrop);
+ var hasChanges = _(keys).some(function (k) {
+ return storedDrop[k] !== drop[k];
+ });
+ if (hasChanges) {
+ dragging._dragData.drop = drop;
+ this._onDropContextChange(dragging, drop);
+ }
+ },
+ _getDropContext: function _getDropContext(xy, child) {
+
+ var children = this.children || [];
+ if (!children.length) return { insert: 'before' };
+
+ var $el = child ? child.$el : this.$el;
+ var position = this._getPositionByEventXY(xy, $el);
+ return this._getDropContextByPosisiton(position, child);
+ },
+ _getPositionByEventXY: function _getPositionByEventXY(xy, $el) {
+
+ var elOffset = $el.offset();
+ var elDimension = { width: $el.outerWidth(), height: $el.outerHeight() };
+ var xHalf = elOffset.left + elDimension.width / 2;
+ var yHalf = elOffset.top + elDimension.height / 2;
+ var r = { x: undefined, y: undefined };
+
+ r.x = xy.x <= xHalf ? 'left' : 'right';
+ r.y = xy.y <= yHalf ? 'top' : 'bottom';
+
+ return r;
+ },
+ _getDropContextByPosisiton: function _getDropContextByPosisiton(position, child) {
+
+ var direction = this.getOption('direction') || 'vertical';
+
+ var insert = direction == 'horizontal' ? position.x == 'left' ? 'before' : 'after' : position.y == 'top' ? 'before' : 'after';
+
+ var childView = undefined;
+
+ if (child) {
+ childView = child.view;
+ } else {
+ childView = insert == 'before' ? this.children[0] : this.children.length && _(this.children).last();
+ }
+
+ var index = this.view.children._views.indexOf(childView);
+
+ return {
+ insert: insert,
+ childView: childView,
+ index: index,
+ noChild: !child
+ };
+ },
+ _onDropContextChange: function _onDropContextChange(dragging, context) {
+ this.triggerMethod('drop:context:change', dragging, context);
+ },
+ _onDrop: function _onDrop(draggable, dropContext) {
+ this.triggerMethod('drop', draggable, dropContext);
+ }
+});
+
+var DynamicClass = Behavior.extend({
+ updateElementClass: function updateElementClass(changeSource) {
+ var viewCls = _.result(this.view, 'className') || '';
+ var addCls = _.result(this.view, 'dynamicClassName') || '';
+ this.$el.attr({
+ class: (viewCls + ' ' + addCls).trim()
+ });
+ },
+
+
+ refreshOnModelChange: true,
+ refreshOnDomChange: false,
+ refreshOnViewRefresh: true,
+ refreshOnViewBeforeRender: true,
+ refreshOnViewRender: false,
+
+ modelEvents: {
+ 'change': function change() {
+ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change');
+ }
+ },
+ events: {
+ 'change': function change() {
+ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change');
+ }
+ },
+ onRefresh: function onRefresh() {
+ this.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh');
+ },
+ onRender: function onRender() {
+ this.getProperty('refreshOnViewRender') && this.updateElementClass('view:render');
+ },
+ onBeforeRender: function onBeforeRender() {
+ this.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render');
+ },
+ onRefreshCssClass: function onRefreshCssClass() {
+ this.updateElementClass();
+ },
+ onSetupRefreshCssClass: function onSetupRefreshCssClass(setup) {
+ var _this = this;
+
+ if (setup == null || !_.isObject(setup)) return;
+ _(setup).each(function (value, property) {
+ _this[property] = value === true;
+ });
+ }
+});
+
+function _defineProperty$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+var FormToHash = mix(Behavior).with(Stateable).extend({
+ applyDelay: 1, //in ms
+ autoApplyToModel: false, //finalize
+ autoChangeModel: false, //on every change
+
+ fillFormFromModel: true,
+
+ applySelector: '.apply',
+ cancelSelector: '.cancel',
+ resetSelector: '.reset',
+
+ initialize: function initialize(opts) {
+
+ this.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));
+ this.mergeOptions(opts, ['values']);
+
+ this.extendDefaultValues({});
+ },
+ extendDefaultValues: function extendDefaultValues(hash) {
+
+ this._values = _.extend(this._values || {}, hash);
+ },
+ onViewInitialize: function onViewInitialize() {
+
+ //this.extendDefaultValues(this.getProperty('values'));
+
+ var model = this.getModel();
+ if (model) {
+ this.extendDefaultValues(model.toJSON());
+ }
+ },
+ onRender: function onRender() {
+
+ if (!this.firstRender) {
+ this.buildFormBindings();
+ this.setState(this._tryFlatValues(this._values));
+ this.setValuesToForm(this.getValues({ raw: true }));
+ }
+ this.firstRender = true;
+ },
+
+
+ //finallizing
+ triggers: function triggers() {
+ var _ref;
+
+ return _ref = {}, _defineProperty$1(_ref, 'click ' + this.getProperty('applySelector'), 'trigger:apply'), _defineProperty$1(_ref, 'click ' + this.getProperty('cancelSelector'), 'trigger:cancel'), _defineProperty$1(_ref, 'click ' + this.getProperty('resetSelector'), 'trigger:reset'), _ref;
+ },
+ _tryFlatValues: function _tryFlatValues(raw) {
+ return flattenObject(raw);
+ },
+ _tryUnFlatValues: function _tryUnFlatValues(raw) {
+ return unFlattenObject(raw);
+ },
+ rollbackToDefaultValues: function rollbackToDefaultValues() {
+ this.clearState();
+ var rawvalues = this._values;
+ var values = this._tryFlatValues(rawvalues);
+ this.setState(values);
+ },
+ getValues: function getValues() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var raw = this.getState();
+ if (options.raw) return raw;
+ var values = this._tryUnFlatValues(raw);
+ return values;
+ },
+ onTriggerApply: function onTriggerApply() {
+ this._apply();
+ },
+ onTriggerCancel: function onTriggerCancel() {
+ this._cancel();
+ },
+ onTriggerReset: function onTriggerReset() {
+ this._reset();
+ },
+ _apply: function _apply() {
+ var values = this.getValues();
+ this.view.triggerMethod('values:apply', values);
+ this._tryChangeModel(values);
+ },
+ _cancel: function _cancel() {
+ this.rollbackToDefaultValues();
+ var values = this._getFullHash(this._values);
+ this.view.triggerMethod('values:cancel', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, { clear: true });
+ },
+ _reset: function _reset() {
+ this.clearState();
+ var values = this._getFullHash({});
+ this.view.triggerMethod('values:reset', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, { clear: true });
+ },
+ onState: function onState(state) {
+ this._tryChangeModel(state, { type: 'property' });
+ },
+ _tryChangeModel: function _tryChangeModel(hash) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';
+ var canChange = this.getProperty(canChangeProp) === true;
+
+ if (!canChange) return;
+ var model = this.getModel();
+ if (!model) return;
+
+ hash = this._tryUnFlatValues(hash);
+ if (options.clear === true) model.clear();
+ model.set(hash);
+ },
+ _getFullHash: function _getFullHash() {
+ var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var modelHash = this.getModel() && this.getModel().toJSON();
+ var full = _.extend({}, this.values, this.mappings, modelHash);
+ var res = {};
+ _(full).each(function (v, key) {
+ return res[key] = undefined;
+ });
+ return _.extend(res, values);
+ },
+
+
+ //dom manipulations
+ buildFormBindings: function buildFormBindings() {
+ var _this = this;
+
+ this.mappings = {};
+ var tags = ["input", "textarea", "select"];
+ this.$("[name]").each(function (i, el) {
+ if (tags.indexOf(el.tagName.toLowerCase()) == -1) return;
+
+ var property = _this.unCidle(el.name);
+ if (property in _this.mappings) return;
+
+ var info = _this._getElementInfo(el, tags);
+ if (info) _this.mappings[property] = info;
+ });
+ var ext = {};
+ _(this.mappings).each(function (context, name) {
+ context.values && (ext[name] = context.values);
+ });
+
+ this.extendDefaultValues(ext);
+ },
+ _getElementInfo: function _getElementInfo(el, tags) {
+ var context = {
+ name: el.name
+ };
+ var values = void 0;
+ var selector = '[name="' + el.name + '"]';
+ var $found = this.$(selector);
+ if (!$found.length) return;
+
+ if ($found.length > 1) {
+ var foundValues = [];
+ var isArray = false;
+ $found.each(function (i, found) {
+ if (tags.indexOf(found.tagName.toLowerCase()) == -1) return;
+ var $el = $(found);
+ if (found.type != 'checkbox' && found.type != 'radio' || $el.prop('checked')) {
+ var val = $el.val();
+ isArray || (isArray = found.type === 'checkbox' || val instanceof Array);
+ if (val instanceof Array) foundValues = foundValues.concat(val);else foundValues.push($el.val());
+ }
+ });
+ values = !foundValues.length || foundValues.length === 1 && !isArray ? foundValues[0] : foundValues;
+ } else {
+ values = $found.get(0).type === 'checkbox' ? $found.prop('checked') ? [$found.val()] : [] : $found.val();
+ }
+ context.values = values;
+ context.isArray = values instanceof Array;
+ context.$elements = $found;
+ return context;
+ },
+ setValuesToForm: function setValuesToForm(values) {
+ var _this2 = this;
+
+ _(values).each(function (propertyValues, propertyName) {
+ var property = _this2.mappings[propertyName];
+ var $els = property.$elements;
+ var arr = propertyValues instanceof Array ? propertyValues : [propertyValues];
+ $els.each(function (i, el) {
+
+ _this2._setValueToElement(el, i, arr);
+ });
+ });
+ },
+ _setValueToElement: function _setValueToElement(el, index, values) {
+ var value = index < values.length && values[index];
+ var $el = el.jquery ? el : $(el);
+ el = $el.get(0);
+ if (el.type === 'checkbox' || el.type === 'radio') {
+ $el.prop('checked', values.indexOf($el.val()) >= 0);
+ } else {
+ $el.val(value);
+ }
+ },
+
+
+ // dom listeners
+ events: {
+ 'change': 'domChange',
+ 'input': 'domInput'
+ },
+ domChange: function domChange(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ domInput: function domInput(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ _applyValue: function _applyValue(name, el, event) {
+ if (el.type == 'checkbox') this._applyCheckboxValue(name, el, event);else this._applySimpleValue(name, el, event);
+ },
+ _applySimpleValue: function _applySimpleValue(name, el, event) {
+ name = this.unCidle(name);
+ var $el = $(el);
+ this.setState(name, $el.val());
+ },
+ _applyCheckboxValue: function _applyCheckboxValue(name, el, event) {
+ var selector = 'input[type=checkbox][name="' + name + '"]:checked';
+ var values = this.$(selector).map(function (i, el) {
+ return el.value;
+ }).toArray();
+ name = this.unCidle(name);
+ this.setState(name, values);
+ }
+});
+
+var Behaviors = { Behavior: Behavior, Draggable: DraggableBehavior, Droppable: DroppableBehavior, DynamicClass: DynamicClass, FormToHash: FormToHash };
+
+var YatObject = mix(Mn.Object).with(GetOptionProperty, RadioMixin);
+
+var IDENTITY_CHANNEL = 'identity';
+
+var Base = mix(YatObject).with(Stateable);
+
+var nativeAjax = $ && $.ajax;
+
+var Identity = Base.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base.apply(this, args);
+ this._initializeYatUser();
+ },
+ _initializeYatUser: function _initializeYatUser() {},
+
+ channelName: IDENTITY_CHANNEL,
+ tokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires
+ isAnonym: function isAnonym() {
+ return !this.getState('id');
+ },
+ isUser: function isUser() {
+ return !this.isAnonym();
+ },
+ isMe: function isMe(id) {
+ return id && this.getState('id') === id;
+ },
+ update: function update(hash) {
+ this.setState(hash);
+ this.trigger('change');
+ },
+ logIn: function logIn(hash) {
+ if (!hash.id) return;
+ this.update(hash);
+ this.trigger('log:in');
+ },
+ logOut: function logOut() {
+ this.clearState();
+ this.trigger('change');
+ this.trigger('log:out');
+ },
+ getBearerToken: function getBearerToken(data) {
+ var _this = this;
+
+ var url = this.getOption('bearerTokenUrl');
+ var promise = new Promise(function (resolve, reject) {
+ nativeAjax({ url: url, data: data, method: 'POST' }).then(function (token) {
+ _this.setTokenObject(token);
+ resolve(token);
+ _this.triggerMethod('token', token);
+ }, function (error) {
+ return reject(error);
+ });
+ });
+ return promise;
+ },
+ ajax: function ajax() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ var options = args[0];
+ options.headers = _.extend({}, options.headers, this.getAjaxHeaders());
+ var needRefresh = this.isTokenRefreshNeeded();
+ if (!needRefresh) {
+ var _$;
+
+ return (_$ = $).ajax.apply(_$, args); //nativeAjax.apply($, args);
+ } else {
+ return this.refreshBearerToken().then(function () {
+ return nativeAjax.apply($, args);
+ }).catch(function (error) {
+ var promise = $.Deferred();
+ promise.reject(error);
+ return promise;
+ });
+ }
+ },
+ getAjaxHeaders: function getAjaxHeaders() {
+ this._ajaxHeaders || (this._ajaxHeaders = {});
+ return this._ajaxHeaders;
+ },
+ _updateHeaders: function _updateHeaders() {
+ var token = this.getTokenValue();
+ var headers = this.getAjaxHeaders();
+
+ if (token) {
+ headers.Authorization = 'Bearer ' + token;
+ headers.Accept = 'application/json';
+ } else {
+ delete headers.Authorization;
+ }
+ },
+ setTokenObject: function setTokenObject(token) {
+
+ if (token != null && _.isObject(token)) token.expires = new Date(Date.now() + token.expires_in * 1000);
+
+ this._token = token;
+ this._updateHeaders();
+ this._replaceBackboneAjax();
+
+ this.triggerMethod('tocken:change');
+ },
+ getTokenObject: function getTokenObject() {
+ return this._token;
+ },
+ _replaceBackboneAjax: function _replaceBackboneAjax() {
+ var _this2 = this;
+
+ var token = this.getTokenValue();
+ if (!token) Bb.ajax = $.ajax; //$.ajax = nativeAjax;
+ else Bb.ajax = function () {
+ return _this2.ajax.apply(_this2, arguments);
+ }; //$.ajax = (...args) => Yat.identity.ajax(...args);
+ },
+ getTokenValue: function getTokenValue() {
+ var token = this.getTokenObject();
+ return token.access_token;
+ },
+ getRefreshToken: function getRefreshToken() {
+ var token = this.getTokenObject();
+ return token.refresh_token;
+ },
+ getTokenExpires: function getTokenExpires() {
+ var token = this.getTokenObject();
+ return (token || {}).expires;
+ },
+ getTokenSeconds: function getTokenSeconds() {
+ var expires = this.getTokenExpires();
+
+ if (expires == null || isNaN(expires.valueOf())) {
+ console.warn('expires is null or wrong');
+ return 0;
+ }
+
+ var offset = this.getProperty('tokenExpireOffset');
+ if (offset == null) offset = 30000; //30 sec
+
+ var deadline = expires.valueOf() - offset;
+ var deadlineMs = deadline - Date.now();
+ return deadlineMs > 0 ? deadlineMs / 1000 : 0;
+ },
+ isTokenRefreshNeeded: function isTokenRefreshNeeded() {
+ var token = this.getTokenValue();
+ if (!token) return false;
+ return !this.getTokenSeconds();
+ },
+ refreshBearerToken: function refreshBearerToken() {
+ var _this3 = this;
+
+ var bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');
+ var doRefresh = this.isTokenRefreshNeeded();
+ return new Promise(function (resolve, reject) {
+ if (!doRefresh) {
+ resolve();
+ return;
+ }
+
+ if (bearerTokenRenewUrl == null) {
+ reject(new Error('Token expired and `bearerTokenRenewUrl` not set'));
+ return;
+ }
+ var data = {
+ 'grant_type': 'refresh_token',
+ 'refresh_token': _this3.getRefreshToken()
+ };
+ nativeAjax({
+ url: bearerTokenRenewUrl,
+ data: data,
+ method: 'POST'
+ }).then(function (token) {
+ _this3.setTokenObject(token);
+ resolve();
+ }, function () {
+ _this3.triggerMethod('refresh:token:expired');
+ reject(YatError.Http401());
+ });
+ });
+ }
+});
+
+var identity = new Identity();
+
+var YatView = mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({
+
+ instantRender: false,
+ renderOnReady: false,
+ triggerReady: false,
+
+ manualAfterInitialize: true,
+
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Mn.View.apply(this, args);
+
+ var options = args[0];
+ this.mergeOptions(options, ['instantRender', 'renderOnReady', 'triggerReady', 'manualAfterInitialize']);
+
+ if (this.manualAfterInitialize === true) this._afterInitialize();
+ },
+ _afterInitialize: function _afterInitialize() {
+
+ if (this.instantRender === true) this.render();
+
+ if (this.renderOnReady === true) this.once('ready', this.render);
+
+ if (this.renderOnReady === true || this.triggerReady === true) this.trigger('ready', this);
+ }
+});
+
+var YatConfig = YatObject.extend({
+ initialize: function initialize(options) {
+ this.mergeOptions(options, ['name', 'channelName', 'noRadio']);
+ if (this.noRadio !== true && this.channelName == null) this.channelName = name;
+ },
+ getStore: function getStore() {
+ this.store || (this.store = {});
+ return this.store;
+ },
+
+ radioRequest: {
+ get: function get() {
+ this.get.apply(this, arguments);
+ },
+ set: function set(path, value) {
+ this.set(path, value);
+ }
+ },
+ get: function get(path) {
+ var store = this.getStore();
+ var value = getByPath(store, path);
+ if (_.isFunction(value)) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ value = value.apply(this, args);
+ }
+
+ return value;
+ },
+ set: function set(path, value) {
+ var store = this.getStore();
+ var result = setByPath(store, path, value);
+ this.triggerSet(path, value);
+ },
+ triggerSet: function triggerSet(path, value) {
+ if (!path) return;
+ var arr = path.split('/');
+ var radio = this.getChannel();
+ do {
+ var event = arr.join(':');
+ this.triggerMethod(event, value);
+ radio && radio.trigger(event, value);
+ arr.pop();
+ } while (arr.length > 0);
+ }
+});
+
+function Config (name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ options.name = name;
+ return new YatConfig(options);
+}
+
+var config = new Config('yat:modals:singleton', { noRadio: true });
+
+var modalsShowFull = {
+ bg: true,
+ close: true
+};
+
+var modalsShowSimple = {
+ bg: false,
+ close: false
+};
+
+var modalOptionsDefault = {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: false
+};
+
+var modalsCssDefaults = {
+ wrapper: 'yat-modal-wrapper',
+ bg: 'yat-modal-bg',
+ contentWrapper: 'yat-modal-content-wrapper',
+ close: 'yat-modal-close',
+ header: 'yat-modal-header',
+ content: 'yat-modal-content',
+ actions: 'yat-modal-actions',
+ resolve: 'yat-modal-resolve',
+ reject: 'yat-modal-reject'
+};
+
+var modalsLabelsDefaults = {
+ close: '×',
+ resolve: 'ok',
+ reject: 'cancel'
+};
+
+var modalsTypes = {
+ full: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault
+ },
+ simple: {
+ css: modalsCssDefaults,
+ show: modalsShowSimple,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault
+ },
+ confirm: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: true
+ }
+ }
+};
+
+config.set('types.full', modalsTypes.full);
+config.set('types.simple', modalsTypes.simple);
+config.set('types.confirm', modalsTypes.confirm);
+
+config.set('defaultShow', modalsShowFull);
+config.set('defaultCss', modalsCssDefaults);
+config.set('defaultLabels', modalsLabelsDefaults);
+
+var template = _.template('<% if(show.bg) {%> data-role="modal-bg">
<% } %>\n data-role="modal-content-wrapper">\n\t<% if(show.close) {%>
<% } %>\n\t<% if(show.header) {%>
data-role="modal-header"><%= header %><% } %>\n\t
data-role="modal-content"><%= text %>
\n\t<% if(show.actions) {%>\n\t
data-role="modal-actions">\n\t\t<% if(show.resolve) {%><% } %>\n\t\t<% if(show.reject) {%><% } %>\n\t
\n\t<% } %>\n
\n');
+
+var ModalView = mix(YatView).with(GetOptionProperty).extend({
+
+ renderOnReady: true,
+ template: template,
+
+ attributes: function attributes() {
+ return { 'data-role': 'modal-wrapper' };
+ },
+ initialize: function initialize(options) {
+ var _this2 = this;
+
+ this.mergeOptions(options, ['content', 'header', 'text']);
+
+ var _this = this;
+
+ if (this.getOption('asPromise') === true) {
+ this.promise = new Promise(function (resolve, reject) {
+ _this.once('resolve', function (arg) {
+ return resolve(arg);
+ });
+ _this.once('reject', function (arg) {
+ return reject(arg);
+ });
+ });
+ }
+
+ this.once('resolve reject', function (arg, destroying) {
+ _this2.preventClose = false;
+
+ if (_this2.getConfigValue('options', 'closeOnPromise') && !destroying) {
+ _this2.destroy();
+ }
+ });
+ },
+ canBeClosed: function canBeClosed() {
+ return this.getConfigValue('options', 'preventClose') !== true;
+ },
+ destroy: function destroy() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+
+ if (!this.canBeClosed() && opts.force !== true) return;
+
+ return YatView.prototype.destroy.apply(this, arguments);
+ },
+
+ ui: {
+ 'bg': '[data-role="modal-bg"]',
+ 'contentWrapper': '[data-role="modal-content-wrapper"]',
+ 'text': '[data-role="modal-content"]',
+ 'header': '[data-role="modal-header"]',
+ 'close': '[data-role="modal-close"]',
+ 'resolve': '[data-role="modal-resolve"]',
+ 'reject': '[data-role="modal-reject"]'
+ },
+ triggers: {
+ 'click @ui.close': { event: 'click:close', stopPropagation: true },
+ 'click @ui.reject': { event: 'click:reject', stopPropagation: true },
+ 'click @ui.resolve': { event: 'click:resolve', stopPropagation: true },
+ 'click @ui.text': { event: 'click:content', stopPropagation: true },
+ 'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },
+ 'click @ui.bg': { event: 'click:bg', stopPropagation: true },
+ 'click': { event: 'click:wrapper', stopPropagation: true }
+ },
+ regions: {
+ 'content': '[data-role="modal-content"]'
+ },
+ onBeforeDestroy: function onBeforeDestroy() {
+ this.trigger('reject', this.getProperty('reject'), true);
+ },
+ onClickClose: function onClickClose() {
+ this.destroy();
+ },
+ onClickResolve: function onClickResolve() {
+ this.trigger('resolve', this.getProperty('resolve'));
+ },
+ onClickReject: function onClickReject() {
+ this.trigger('reject', this.getProperty('reject'));
+ },
+ onClickBg: function onClickBg() {
+ this.clickedOutsideOfModal();
+ },
+ onClickWrapper: function onClickWrapper() {
+ this.clickedOutsideOfModal();
+ },
+ clickedOutsideOfModal: function clickedOutsideOfModal() {
+ if (this.getConfigValue('options', 'closeOnClickOutside') === true) this.destroy();
+ },
+ onBeforeRender: function onBeforeRender() {
+ //apply wrapper class here;
+ var cfg = this.getConfig();
+ cfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);
+
+ this.$el.appendTo($('body'));
+ },
+ onRender: function onRender() {
+ if (this.content instanceof Bb.View) {
+ this.showChildView('content', this.content);
+ this.content.inModal = this;
+ }
+ },
+ _getModalOptions: function _getModalOptions() {
+ var h = {};
+ if (this.getOption('closeOnClickOutside') != null) h.closeOnClickOutside = this.getOption('closeOnClickOutside');
+ if (this.getOption('closeOnPromise') != null) h.closeOnPromise = this.getOption('closeOnPromise');
+ if (this.getOption('preventClose') != null) h.preventClose = this.getOption('preventClose');
+ if (this.getOption('asPromise') != null) h.asPromise = this.getOption('asPromise');
+
+ return h;
+ },
+ getConfigValue: function getConfigValue(section, name) {
+ var cfg = this.getConfig() || {};
+ return (cfg[section] || {})[name];
+ },
+ getConfig: function getConfig(key) {
+ if (this.config) return this.config;
+
+ var typeName = this.getOption('type') || 'simple';
+ var type = _.extend({}, config.get('types.' + typeName) || {});
+
+ type.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));
+ type.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));
+ type.css = _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));
+
+ type.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());
+
+ if (type.show.header == null && this.getOption('header')) type.show.header = true;
+
+ if (type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise)) type.show.resolve = true;
+ if (type.show.reject == null && this.getOption('reject')) type.show.reject = true;
+
+ if (type.show.actions == null && (type.show.resolve || type.show.reject)) type.show.actions = true;
+
+ return this.config = type;
+ },
+ templateContext: function templateContext() {
+ var cfg = this.getConfig();
+ return {
+ css: function css(name) {
+ return cfg.css[name] ? ' class="' + cfg.css[name] + '"' : '';
+ },
+ label: function label(name) {
+ return cfg.labels[name] || '';
+ },
+
+ show: cfg.show,
+ text: this.getOption('text'),
+ header: this.getOption('header')
+ };
+ }
+});
+
+var ModalEngine = mix(YatObject).with(Stateable).extend({
+ constructor: function constructor() {
+ var _this2 = this;
+
+ this.modals = [];
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ YatObject.apply(this, args);
+ this.listenForEsc = _.bind(this._listenForEsc, this);
+ $$1(function () {
+ _this2.doc = $$1(document);
+ _this2.doc.on('keyup', _this2.listenForEsc);
+ });
+ },
+
+ channelName: 'modals',
+
+ show: function show() {
+ var options = this._normalizeArguments.apply(this, arguments);
+ return this._create(options);
+ },
+ remove: function remove(modal) {
+
+ if (!modal) modal = _.last(this.modals);
+
+ modal && modal.destroy();
+ },
+ _listenForEsc: function _listenForEsc(e) {
+ if (e.keyCode !== 27) return;
+
+ if (this.modals.length) this.remove();
+ },
+ _create: function _create(options) {
+ var modal = new ModalView(options);
+ var _this = this;
+ this.listenToOnce(modal, 'destroy', function () {
+ _this._remove(modal);
+ });
+ this.modals.push(modal);
+ return modal;
+ },
+ _remove: function _remove(modal) {
+
+ if (!modal) return;
+
+ var ind = this.modals.indexOf(modal);
+ if (ind > -1) this.modals.splice(ind, 1);
+
+ this.stopListening(modal);
+ },
+ _normalizeArguments: function _normalizeArguments() {
+
+ var options = {};
+ var len = arguments.length;
+ if (!len) return;
+
+ if (len === 1) {
+ if (__.isView(arguments.length <= 0 ? undefined : arguments[0])) options.content = arguments.length <= 0 ? undefined : arguments[0];else if (_.isString(arguments.length <= 0 ? undefined : arguments[0])) options.text = arguments.length <= 0 ? undefined : arguments[0];else if (_.isObject(arguments.length <= 0 ? undefined : arguments[0])) _.extend(options, arguments.length <= 0 ? undefined : arguments[0]);
+ } else if (len === 2) {
+ if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && _.isString(arguments.length <= 1 ? undefined : arguments[1])) {
+ options.header = arguments.length <= 0 ? undefined : arguments[0];
+ options.text = arguments.length <= 1 ? undefined : arguments[1];
+ } else if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && __.isView(arguments.length <= 1 ? undefined : arguments[1])) {
+ options.header = arguments.length <= 0 ? undefined : arguments[0];
+ options.content = arguments.length <= 1 ? undefined : arguments[1];
+ } else if (_.isString(arguments.length <= 1 ? undefined : arguments[1]) && __.isView(arguments.length <= 0 ? undefined : arguments[0])) {
+ options.header = arguments.length <= 1 ? undefined : arguments[1];
+ options.content = arguments.length <= 0 ? undefined : arguments[0];
+ } else if (_.isString(arguments.length <= 0 ? undefined : arguments[0]) && _.isObject(arguments.length <= 1 ? undefined : arguments[1])) {
+ _.extend(options, arguments.length <= 1 ? undefined : arguments[1]);
+ if (__.isView(options.content)) options.header = arguments.length <= 0 ? undefined : arguments[0];else options.text = arguments.length <= 0 ? undefined : arguments[0];
+ } else if (__.isView(arguments.length <= 0 ? undefined : arguments[0]) && _.isObject(arguments.length <= 1 ? undefined : arguments[1])) {
+ _.extend(options, arguments.length <= 1 ? undefined : arguments[1]);
+ options.content = arguments.length <= 0 ? undefined : arguments[0];
+ }
+ } else {
+ if (_.isObject(arguments.length <= 3 ? undefined : arguments[3])) _.extend(options, arguments.length <= 3 ? undefined : arguments[3]);
+ if (_.isObject(arguments.length <= 2 ? undefined : arguments[2])) _.extend(options, arguments.length <= 2 ? undefined : arguments[2]);else if (_.isString(arguments.length <= 2 ? undefined : arguments[2])) options.type = arguments.length <= 2 ? undefined : arguments[2];
+
+ var two = this._normalizeArguments(arguments.length <= 0 ? undefined : arguments[0], arguments.length <= 1 ? undefined : arguments[1]);
+ _.extend(options, two);
+ }
+
+ return options;
+ },
+ onBeforeDestroy: function onBeforeDestroy() {
+ if (this.doc) this.doc.off('keyup', this.listenForEsc);
+ }
+});
+
+var modalEngine = new ModalEngine();
+
+var modals = {
+ show: function show() {
+ return modalEngine.show.apply(modalEngine, arguments);
+ },
+ addTypeConfig: function addTypeConfig(name, cfg) {
+ if (!name || !_.isString(name)) return;
+ config.set('types.' + name, cfg);
+ },
+ getTypeConfig: function getTypeConfig(name) {
+ if (!name || !_.isString(name)) return;
+ return config.get('types.' + name);
+ }
+};
+
+var Singletons = { TemplateContext: GlobalTemplateContext$1, identity: identity, modals: modals };
+
+var Base$1 = mix(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);
+
+var App = Base$1.extend({
+
+ initRadioOnInitialize: true,
+ _initRegion: function _initRegion() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { skip: true };
+
+ if (opts.skip) return;
+ var region = this.getProperty('region');
+ this.region = region;
+ Base$1.prototype._initRegion();
+ },
+ getRegion: function getRegion() {
+ if (!this._region) this._initRegion({ skip: false });
+ return this._region;
+ },
+ addPageManager: function addPageManager(pageManager) {
+ var _this = this;
+
+ this._pageManagers || (this._pageManagers = []);
+ this._pageManagers.push(pageManager);
+
+ var prefix = pageManager.getName();
+ if (!prefix) {
+ console.warn('pageManager prefix not defined');
+ return;
+ }
+
+ this.listenTo(pageManager, 'all', function (eventName) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var prefixedEventName = prefix + ':' + eventName;
+ _this.triggerMethod.apply(_this, [prefixedEventName].concat(args));
+ });
+ this.listenTo(pageManager, 'state:currentPage', function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return _this.triggerMethod.apply(_this, ['page:swapped'].concat(args));
+ });
+ },
+ hasPageManagers: function hasPageManagers() {
+ return this._pageManagers && this._pageManagers.length > 0;
+ },
+ getMenuTree: function getMenuTree() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { rebuild: false };
+
+ if (this._menuTree && !opts.rebuild) return this._menuTree;
+ var managers = this._pageManagers || [];
+ var links = _(managers).chain().map(function (manager) {
+ return manager.getLinks();
+ }).flatten().value();
+ this._menuTree = new Bb.Collection(links);
+ return this._menuTree;
+ },
+ getPage: function getPage(key) {
+ if (!this.hasPageManagers()) return;
+ return _(this._pageManagers).find(function (mngr) {
+ return mngr.getPage(key);
+ });
+ }
+});
+
+var Router = Mn.AppRouter.extend({}, {
+ create: function create(hash, context) {
+ var appRoutes = {};
+ var controller = {};
+ var _this = this;
+ _(hash).each(function (handlerContext, key) {
+ appRoutes[key] = key;
+ controller[key] = function () {
+ handlerContext.action.apply(handlerContext, arguments).catch(function (error) {
+ _this._catchError(error, context);
+ });
+ };
+ });
+ return new this({ controller: controller, appRoutes: appRoutes });
+ },
+ _catchError: function _catchError(error, context) {
+ if (!context || context.getProperty('throwChildErrors') === true) {
+ throw error;
+ } else {
+ var postfix = error.status ? ":" + error.status.toString() : '';
+ var commonEvent = 'error';
+ var event = commonEvent + postfix;
+
+ context.triggerMethod(commonEvent, error, this);
+
+ if (event != commonEvent) context.triggerMethod(event, error, this);
+ }
+ }
+});
+
+var Model = Bb.Model.extend({});
+
+var LinkModel = Model.extend({
+ defaults: {
+ url: undefined,
+ label: undefined,
+ target: '_self',
+ level: 0
+ },
+ destroy: function destroy() {
+ this.id = null;
+ Model.prototype.destroy.apply(this, arguments);
+ }
+});
+
+function _defineProperty$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+/*
+ YatPage
+*/
+
+var Base$2 = mix(App).with(GetNameLabel);
+
+var YatPage = Base$2.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base$2.apply(this, args);
+ this.initializeYatPage();
+ },
+
+
+ allowStopWithoutStart: true,
+ allowStartWithoutStop: true,
+
+ initializeYatPage: function initializeYatPage(opts) {
+ this.mergeOptions(opts, ["manager"]);
+ this._initializeModels(opts);
+ this._initializeRoute(opts);
+ this._proxyEvents();
+ this._tryCreateRouter();
+ this._registerIdentityHandlers();
+ },
+ getLayout: function getLayout() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { rebuild: false };
+
+ if (!this._layoutView || opts.rebuild || this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed()) {
+ this.buildLayout();
+ }
+ return this._layoutView;
+ },
+ buildLayout: function buildLayout() {
+ var Layout = this.getProperty('Layout');
+ if (Layout == null) return;
+ var opts = _.extend({}, this.getProperty('layoutOptions'));
+
+ if (this.model && !opts.model) _.extend(opts, { model: this.model });
+
+ if (this.collection && !opts.collection) _.extend(opts, { collection: this.collection });
+
+ var options = this.buildLayoutOptions(opts);
+ options.page = this;
+ this._layoutView = new Layout(options);
+ return this._layoutView;
+ },
+ buildLayoutOptions: function buildLayoutOptions(rawOptions) {
+ return rawOptions;
+ },
+ addModel: function addModel(model) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (!model) return;
+ this.model = model;
+ var fetch = opts.fetch || this.getOption('fetchModelOnAdd');
+ if (fetch === undefined) {
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if (fetch === true) {
+ this.addStartPromise(model.fetch(opts));
+ }
+ },
+ addCollection: function addCollection(collection) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (!collection) return;
+ this.collection = collection;
+ var fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');
+ if (fetch === undefined) {
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if (fetch === true) {
+ this.addStartPromise(collection.fetch(opts));
+ }
+ },
+
+
+ freezeWhileStarting: true,
+ freezeUI: function freezeUI() {},
+ unFreezeUI: function unFreezeUI() {},
+ getRouteHash: function getRouteHash() {
+
+ var hashes = [{}, this._routeHandler].concat(this.getChildren({ startable: false }).map(function (children) {
+ return children.getRouteHash();
+ }));
+ return _.extend.apply(_, _toConsumableArray(hashes));
+ },
+ hasRouteHash: function hasRouteHash() {
+ return _.isObject(this.getRouteHash());
+ },
+ getLinkModel: function getLinkModel() {
+ var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ if (!this._canHaveLinkModel()) return;
+ if (this._linkModel) return this._linkModel;
+
+ var url = this.getRoute();
+ var label = this.getLabel();
+ var children = this._getSublinks(level);
+ this._linkModel = new LinkModel({ url: url, label: label, level: level, children: children });
+
+ return this._linkModel;
+ },
+ _canHaveLinkModel: function _canHaveLinkModel() {
+ return !(this.getProperty('skipMenu') === true || !!this.getProperty('isStartNotAllowed'));
+ },
+ _destroyLinkModel: function _destroyLinkModel() {
+ if (!this._linkModel) return;
+ this._linkModel.destroy();
+ delete this._linkModel;
+ },
+ getParentLinkModel: function getParentLinkModel() {
+ var parent = this.getParent();
+ if (!parent || !parent.getLinkModel) return;
+ var model = parent.getLinkModel();
+ return model;
+ },
+ getNeighbourLinks: function getNeighbourLinks() {
+ var link = this.getLinkModel();
+ if (link && link.collection) return link.collection;
+ },
+ getChildrenLinks: function getChildrenLinks() {
+ var model = this.getLinkModel();
+ if (!model) return;
+ return model.get('children');
+ },
+ _getSublinks: function _getSublinks(level) {
+ var children = this.getChildren();
+ if (!children || !children.length) return;
+ var sublinks = _(children).chain().filter(function (child) {
+ return child.getProperty("skipMenu") !== true;
+ }).map(function (child) {
+ return child.getLinkModel(level + 1);
+ }).value();
+ if (!sublinks.length) return;
+ var col = new Bb.Collection(sublinks);
+ return col;
+ },
+ _initializeModels: function _initializeModels() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.addModel(opts.model, opts);
+ this.addCollection(opts.collection, opts);
+ },
+ _initializeRoute: function _initializeRoute() {
+ var route = this.getRoute({ asPattern: true });
+ if (route == null) return;
+ var page = this;
+ this._routeHandler = _defineProperty$2({}, route, { context: page, action: function action() {
+ return page.start.apply(page, arguments);
+ } });
+ },
+ getRoute: function getRoute() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { asPattern: false };
+
+ var relative = this.getProperty('relativeRoute');
+ var route = this.getProperty('route');
+ var parent = this.getParent();
+ if (route == null) return;
+
+ var result = route;
+
+ if (relative && parent && parent.getRoute) {
+ var parentRoute = parent.getRoute();
+ result = parentRoute + '/' + route;
+ }
+
+ return this._normalizeRoute(result, opts);
+ },
+ _normalizeRoute: function _normalizeRoute(route, opts) {
+ route = route.replace(/\/+/gmi, '/').replace(/^\//, '');
+ if (opts.asPattern) {
+ return route;
+ } else {
+ var res = route.replace(/\(\/\)/gmi, '/').replace(/\/+/gmi, '/');
+ return res;
+ }
+ },
+ _tryCreateRouter: function _tryCreateRouter() {
+ var create = this.getProperty('createRouter') === true;
+ if (create) {
+ this.router = this._createAppRouter();
+ }
+ },
+ _createAppRouter: function _createAppRouter() {
+ var hash = this.getRouteHash();
+ if (!_.size(hash)) return;
+ return new Router(hash);
+ },
+ _proxyEvents: function _proxyEvents() {
+ var proxyContexts = this._getProxyContexts();
+ this._proxyEventsTo(proxyContexts);
+ },
+ _getProxyContexts: function _getProxyContexts() {
+ var rdy = [];
+ var manager = this.getProperty('manager');
+ if (manager) {
+ rdy.push({ context: manager });
+ }
+ var radio = this.getChannel();
+ if (radio) {
+ var allowed = this.getProperty('proxyEventsToRadio');
+ rdy.push({ context: radio, allowed: allowed });
+ }
+ return rdy;
+ },
+ _proxyEventsTo: function _proxyEventsTo(contexts) {
+ var all = [];
+ var eventsHash = {};
+
+ _(contexts).each(function (context) {
+ if (!context.allowed) all.push(context.context);else {
+ _(context.allowed).each(function (allowed) {
+ eventsHash[allowed] || (eventsHash[allowed] = []);
+ eventsHash[allowed].push(context.context);
+ });
+ }
+ });
+ var page = this;
+ page.on('all', function (eventName) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ var contexts = eventName in eventsHash ? eventsHash[eventName] : all;
+ var triggerArguments = [page].concat(args);
+ _(contexts).each(function (context) {
+ return context.triggerMethod.apply(context, ['page:' + eventName].concat(_toConsumableArray(triggerArguments)));
+ });
+ });
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ var add = {};
+ var manager = this.getProperty('manager');
+ if (manager) add.manager = manager;
+ return _.extend(def, this.getProperty('childOptions'), add);
+ },
+
+ _registerIdentityHandlers: function _registerIdentityHandlers() {
+ var _this = this;
+
+ this.listenTo(identity, 'change', function () {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ _this._destroyLinkModel();
+ _this.triggerMethod.apply(_this, ['identity:change'].concat(args));
+ });
+ }
+});
+
+var Base$3 = mix(App).with(GetNameLabel);
+
+var YatPageManager = Base$3.extend({
+ constructor: function constructor() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ Base$3.apply(this, args);
+ this._initializeYatPageManager.apply(this, args);
+ },
+
+ throwChildErrors: true,
+ createRouter: function createRouter() {
+ var children = this.getChildren({ startable: false });
+ var hash = {};
+ _(children).each(function (page) {
+ if (_.isFunction(page.getRouteHash)) {
+ _.extend(hash, page.getRouteHash());
+ }
+ });
+ this._routesHash = hash;
+ this.setRouter(Router.create(hash, this));
+ },
+ setRouter: function setRouter(router) {
+ this.router = router;
+ },
+ getRouter: function getRouter() {
+ return this.router;
+ },
+ getLinks: function getLinks() {
+ var children = this.getChildren();
+ if (!children) return;
+ return _(children).chain().map(function (child) {
+ return child.getLinkModel();
+ }).filter(function (child) {
+ return !!child;
+ }).value();
+ },
+ execute: function execute(route) {
+ var page = this.getPage(route);
+ if (!!page) page.start({ text: error.message });else if (route === '*NotFound') throw new YatError.NotFound('*NotFound handler is missing');else this.execute('*NotFound');
+ },
+ navigate: function navigate(url) {
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { trigger: true };
+
+
+ var router = this.getRouter();
+ if (router) router.navigate(url, opts);else console.warn('router not found');
+ },
+ getPage: function getPage(key) {
+
+ var found = _(this._routesHash).find(function (pageContext, route) {
+ if (route === key) return true;
+ if (pageContext.context.getName() === key) return true;
+ });
+ return found && found.context;
+ },
+ navigateToRoot: function navigateToRoot() {
+ var current = this.getState('currentPage');
+ var rootUrl = this.getProperty('rootUrl');
+ if (!rootUrl) {
+ var children = this.getChildren();
+ if (children && children.length) {
+ var root = children.find(function (child) {
+ return child != current;
+ });
+ rootUrl = root && root.getRoute();
+ }
+ }
+ if (rootUrl != null) this.navigate(rootUrl);else console.warn('root page not found');
+ },
+ _initializeYatPageManager: function _initializeYatPageManager() {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.mergeOptions(opts, ['id', 'name', 'label']);
+ this._registerPageHandlers(opts);
+ this._registerIdentityHandlers();
+ this.createRouter();
+ },
+
+
+ _buildChildOptions: function _buildChildOptions(def) {
+ return _.extend(def, this.getProperty('childOptions'), {
+ manager: this
+ });
+ },
+
+ _registerPageHandlers: function _registerPageHandlers() {
+ this.on('page:before:start', this._pageBeforeStart);
+ this.on('page:start', this._pageStart);
+ this.on('page:start:decline', this._pageDecline);
+ },
+ _pageBeforeStart: function _pageBeforeStart(page) {
+ var current = this.getState('currentPage');
+ if (current && current != page) {
+ current.stop();
+ }
+ },
+ _pageStart: function _pageStart(page) {
+ this.setState('currentPage', page);
+ },
+ _pageDecline: function _pageDecline() {
+ //console.log("decline", args)
+ },
+ _registerIdentityHandlers: function _registerIdentityHandlers() {
+ var _this = this;
+
+ this.listenTo(identity, 'change', function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ _this.triggerMethod.apply(_this, ['identity:change'].concat(args));
+ _this._moveToRootIfCurrentPageNotAllowed();
+ });
+ },
+ _moveToRootIfCurrentPageNotAllowed: function _moveToRootIfCurrentPageNotAllowed() {
+ var current = this.getState('currentPage');
+ if (!current || !current.isStartNotAllowed()) return;
+
+ this.navigateToRoot();
+ }
+});
+
+var YatCollectionView = mix(Mn.NextCollectionView).with(GlobalTemplateContext);
+
+var Collection = Bb.Collection.extend({});
+
+var CollectionGroups = YatObject.extend({
+
+ collection: undefined,
+ groupBy: undefined,
+
+ getGroups: function getGroups() {
+ return this.groups;
+ },
+ getGroup: function getGroup(name) {
+ var groups = this.getGroups();
+ return groups[name];
+ },
+ isGroupExists: function isGroupExists(name) {
+ return name in this.getGroups();
+ },
+ addGroup: function addGroup(name, models) {
+ if (this.isGroupExists(name)) return;
+ var groups = this.getGroups();
+ groups[name] = this._createGroup(name, models);
+ return groups[name];
+ },
+ removeGroup: function removeGroup(name) {
+ var group = this.getGroup(name);
+
+ if (!group) return;
+
+ if (_.isFunction(group.destroy)) group.destroy();else if (_.isFunction(group.stopListening)) group.stopListening();
+
+ delete this.groups[name];
+ },
+ group: function group() {
+ var result = {};
+ var colGroups = this.collection.groupBy(this.groupBy);
+ var optionGroups = this.getOption('groups');
+ _(optionGroups).each(function (name) {
+ if (name in colGroups) {
+ result[name] = colGroups[name];
+ delete colGroups[name];
+ } else result[name] = [];
+ });
+ _(colGroups).each(function (models, name) {
+ return result[name] = models;
+ });
+ return result;
+ },
+
+
+ constructor: function constructor(options) {
+ YatObject.apply(this, arguments);
+ this._initializeGrouppedCollection(options);
+ },
+ _initializeGrouppedCollection: function _initializeGrouppedCollection(options) {
+ if (this._initializedGC == true) return;
+
+ this.mergeOptions(options, ['collection', 'groupBy']);
+ this._ensureOptions();
+ this._initializeGroups();
+ this._initializeEventHandlers();
+
+ this._initializedGC == true;
+ },
+ _ensureOptions: function _ensureOptions() {
+ if (!this.collection) throw new Error('collection must be set');
+
+ if (!this.groupBy) throw new Error('groupBy must be set');
+
+ if (typeof this.groupBy === 'string') {
+ var propertyName = this.getOption('groupBy');
+ this.groupBy = function (model) {
+ return model.get(propertyName);
+ };
+ }
+ },
+ _initializeGroups: function _initializeGroups() {
+ var _this = this;
+
+ this.groups = {};
+ var groups = this.group();
+ _(groups).each(function (models, name) {
+ return _this.addGroup(name, models);
+ });
+ },
+ _getCollectionClass: function _getCollectionClass() {
+ return this.getOption('CollectionClass') || Collection;
+ },
+ _createGroup: function _createGroup(name, models) {
+ var groupBy = this.groupBy;
+ var Collection$$1 = this._getCollectionClass();
+ var groupCol = new Collection$$1(models);
+ groupCol.on('change', function (model) {
+ if (groupBy(model) !== name) groupCol.remove(model);
+ });
+ groupCol.name = name;
+ return groupCol;
+ },
+ _initializeEventHandlers: function _initializeEventHandlers() {
+ this.listenTo(this.collection, 'update', this._onCollectionUpdate);
+ },
+ _onCollectionUpdate: function _onCollectionUpdate(col, opts) {
+ var _this2 = this;
+
+ var data = (opts.changes.added || []).concat(opts.changes.merged || []);
+
+ var toAdd = _(data).groupBy(this.groupBy);
+ var toRemove = _(opts.changes.removed).groupBy(this.groupBy);
+
+ var groups = this.groups;
+ _(toAdd).each(function (models, groupName) {
+ if (groupName in groups) groups[groupName].add(models);else if (_this2.getOption('autoCreateNewGroups')) _this2.addGroup(groupName, models);
+ });
+
+ _(toRemove).each(function (models, groupName) {
+ if (groupName in groups) groups[groupName].remove(models);
+ });
+ },
+ _onModelChange: function _onModelChange(model) {
+ var groupName = this.groupBy(model);
+ if (this.groups[groupName]) this.groups[groupName].add(model);else {
+ console.warn('model is out of groupping', model, groupName);
+ }
+ },
+ destroy: function destroy() {
+
+ _(this.groups).each(function (group) {
+ group.stopListening();
+ if (_.isFunction(group.destroy)) group.destroy();
+ });
+ delete this.groups;
+
+ if (_.isFunction(YatObject.prototype.destroy)) YatObject.prototype.destroy.apply(this, arguments);
+
+ if (_.isFunction(this.collection.destroy)) this.collection.destroy();
+
+ delete this.collection;
+ }
+});
+
+var marionetteYat = {
+ VERSION: version,
+ Functions: Functions,
+ Helpers: Helpers,
+ Mixins: Mixins,
+ Behaviors: Behaviors,
+ Singletons: Singletons,
+ TemplateContext: GlobalTemplateContext$1,
+ modals: modals,
+ identity: identity,
+ createConfig: Config,
+ Object: YatObject,
+ Error: YatError,
+ App: App,
+ Page: YatPage,
+ Router: Router,
+ PageManager: YatPageManager,
+ View: YatView,
+ CollectionView: YatCollectionView,
+ Model: Model,
+ Collection: Collection,
+ CollectionGroups: CollectionGroups
+};
+
+return marionetteYat;
+
+})));
+this && this.Marionette && (this.Marionette.Yat = this.MarionetteYat);
+//# sourceMappingURL=marionette.yat.js.map
diff --git a/dist/marionette.yat.js.map b/dist/marionette.yat.js.map
new file mode 100644
index 0000000..1102d41
--- /dev/null
+++ b/dist/marionette.yat.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"marionette.yat.js","sources":["src/functions/view/compare-ab.js","src/functions/view/view-comparator.js","src/functions/view/view.js","src/functions/common/_smart-get.js","src/functions/common/get-label.js","src/functions/common/get-name.js","src/functions/common/get-value.js","src/functions/common/wrap.js","src/functions/common/unwrap.js","src/functions/common/set-get-by-path/_get-property.js","src/functions/common/set-get-by-path/_set-property.js","src/functions/common/set-get-by-path/_set-by-path-array.js","src/functions/common/set-get-by-path/set-by-path.js","src/functions/common/set-get-by-path/_get-by-path-array.js","src/functions/common/set-get-by-path/get-by-path.js","src/functions/common/flatten-unflatten/flatten-object.js","src/functions/common/flatten-unflatten/unflatten-object.js","src/functions/common/is-view.js","src/functions/common/common.js","src/functions/functions.js","src/helpers/isKnownCtor.js","src/YatError.js","src/helpers/mix.js","src/helpers/Helpers.js","src/mixins/get-name-label.js","src/mixins/get-option-property.js","src/mixins/radioable.js","src/mixins/stateable.js","src/mixins/startable.js","src/mixins/childrenable.js","src/singletons/template-context.js","src/mixins/global-template-context.js","src/mixins/Mixins.js","src/behaviors/behavior.js","src/behaviors/_base-draggable.js","src/behaviors/draggable.js","src/behaviors/droppable.js","src/behaviors/dynamic-class.js","src/behaviors/form-to-hash.js","src/behaviors/behaviors.js","src/YatObject.js","src/singletons/identity.js","src/YatView.js","src/YatConfig.js","src/singletons/modals/config.js","src/singletons/modals/modalView.js","src/singletons/modals/modals.js","src/singletons/singletons.js","src/YatApp.js","src/YatRouter.js","src/models/model.js","src/models/link.js","src/YatPage.js","src/YatPageManager.js","src/YatCollectionView.js","src/models/collection.js","src/YatCollectionGroups.js","src/marionette.yat.js"],"sourcesContent":["import Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\n\r\nlet getCompareABModel = (arg) => {\r\n\tif (arg instanceof Bb.Model)\r\n\t\treturn arg;\r\n\telse if (arg instanceof Mn.View)\r\n\t\treturn arg.model;\r\n\telse\r\n\t\treturn;\r\n}\r\nlet getCompareABView = (arg) => {\r\n\tif (arg instanceof Bb.View)\r\n\t\treturn arg;\r\n\telse\r\n\t\treturn;\r\n}\r\n\r\nlet compareAB = (a, b, func) => {\r\n\tif (typeof func === 'function') {\r\n\t\ta = func.call(a, getCompareABModel(a), getCompareABView(a));\r\n\t\tb = func.call(b, getCompareABModel(b), getCompareABView(b));\r\n\t}\r\n\treturn a < b ? -1\r\n\t\t: a > b ? 1\r\n\t\t\t: 0;\r\n};\r\n\r\nexport default compareAB;\r\n","import _ from 'underscore';\r\nimport compareAB from './compare-ab';\r\n\r\n/*\r\n*\taccepts:\r\n*\t\tvariant #1: a, b, function\r\n*\t\tvariant #2: [[a,b,function], [a,b,function]]\r\n*\t\tfunction can be undefined\r\n*\t\texample:\r\n*\t\t\tascending\t:\t\treturn viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });\r\n*\t\t\tdescending\t:\t\treturn viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });\r\n\t\t\tmultiple compares: \treturn viewComparator([[viewB, viewA, func], [viewB, viewA, func]])\r\n*/\r\nlet viewComparator = (...args) => {\r\n\tvar compareArray = [];\r\n\tvar result = 0;\r\n\r\n\tif (args.length >= 2)\t// single compare\r\n\t\treturn compareAB.apply(null, args);\r\n\telse if (args.length === 1 && args[0] instanceof Array)\t// array of compare\r\n\t\tcompareArray = args[0];\r\n\r\n\t_(compareArray).every(function (singleCompare) {\r\n\t\tresult = compareAB.apply(null, singleCompare);\r\n\t\treturn result === 0;\r\n\t});\r\n\t\r\n\treturn result;\r\n}\r\n\r\nexport default viewComparator;\r\n","import compareAB from './compare-ab';\r\nimport viewComparator from './view-comparator';\r\nexport default { compareAB, viewComparator };\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction normalizeValue(context, value, args){\r\n\tif(_.isFunction(value))\r\n\t\tvalue = value.apply(context, args || []);\r\n\treturn value;\r\n}\r\n\r\nfunction smartGet(context, opts = {}){\r\n\tif(opts.fields == null || (opts.fileds && !opts.fileds.length))\r\n\t\tthrow new Error('fields option missing');\r\n\r\n\topts.checked || (opts.checked = {});\r\n\t\r\n\tif(context == null) return;\r\n\r\n\tlet value;\r\n\tlet isModel = context instanceof Bb.Model;\r\n\tlet hasOptions = _.isObject(context.options);\r\n\tlet exclude = opts.exclude instanceof Array ? opts.exclude \r\n\t\t\t\t: typeof opts.exclude === 'string' ? [opts.exclude]\r\n\t\t\t\t: [];\r\n\r\n\r\n\t_(opts.fields).some((fieldName) => {\r\n\t\tif(fieldName in opts.checked) return;\r\n\t\topts.checked[fieldName] = true;\r\n\t\t\r\n\t\tif(exclude.indexOf(fieldName)>=0){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(isModel && value == null)\r\n\t\t\tvalue = normalizeValue(context, context.get(fieldName), opts.args);\r\n\r\n\t\tif(value == null)\r\n\t\t\tvalue = normalizeValue(context, context[fieldName], opts.args);\r\n\r\n\t\tif(value == null && hasOptions)\r\n\t\t\tvalue = normalizeValue(context, context.options[fieldName], opts.args);\r\n\r\n\t\treturn value != null;\r\n\t});\r\n\r\n\treturn value == null ? opts.default : value;\r\n\r\n}\r\n\r\n\r\nexport default smartGet;\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import _ from 'underscore';\r\nexport default function(prefix, value, delimeter = ':'){\r\n\tprefix || (prefix = '');\t\r\n\tvalue = value == null ? '' : value.toString();\r\n\treturn prefix + delimeter + value;\r\n}\r\n","import _ from 'underscore';\r\nexport default function(value, prefix, delimeter = \":\"){\r\n\r\n\tif(value == null) return;\r\n\tvalue = value.toString();\r\n\tprefix || (prefix = '');\r\n\tif(!value.length) return value;\r\n\r\n\tlet pattern = new RegExp(`^${prefix}${delimeter}`);\r\n\treturn value.replace(pattern, '');\r\n\r\n}\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nfunction getProperty(context, name)\r\n{\r\n\tif(context == null || !_.isObject(context) || name == null || name == '') return;\r\n\tif (context instanceof Bb.Model)\r\n\t\treturn context.get(name);\r\n\telse\r\n\t\treturn context[name];\r\n}\r\nexport default getProperty;\t\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property';\r\n\r\nfunction setProperty(context, name, value, options) {\r\n\tif (context instanceof Bb.Model) {\r\n\t\tcontext.set(name, value, { silent: true });\r\n\t}\r\n\telse {\r\n\t\tcontext[name] = value;\r\n\t}\r\n\r\n\tif(value instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: options.passPath.join(':'),\r\n\t\t\tproperty: name,\r\n\t\t\tmodel: value\r\n\t\t});\t\t\r\n\t}\r\n\r\n\toptions.passPath.push(name);\r\n\r\n\treturn getProperty(context, name);\r\n}\r\n\r\nexport default setProperty;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property'\r\nimport setProperty from './_set-property';\r\n\r\nfunction setByPathArr(context, propertyName, pathArray, value, options) {\r\n\r\n\tif(context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;\r\n\t\r\n\r\n\tif (!pathArray.length)\r\n\t\treturn setProperty(context, propertyName, value, options);\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!_.isObject(prop) && !options.force)\r\n\t\treturn;\r\n\telse if (!_.isObject(prop) && options.force)\r\n\t\tprop = setProperty(context, propertyName, {}, options);\r\n\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn setByPathArr(prop, nextName, pathArray, value, options);\r\n}\r\n\r\nexport default setByPathArr;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport setByPathArray from './_set-by-path-array';\r\n\r\nconst setByPath = function (context, path, value, opts) {\r\n\t\r\n\t\r\n\tif(context == null || !_.isObject(context) || path == null || path == '') return;\r\n\t\r\n\tlet options = _.extend({}, opts);\r\n\toptions.silent = options.silent === true;\r\n\toptions.force = options.force !== false;\r\n\t\r\n\t\r\n\tif (_.isObject(path) && !(path instanceof Array)) {\r\n\t\tvalue = path.value;\r\n\t\toptions.force = path.force !== false;\r\n\t\toptions.silent = path.silent === true;\r\n\t\tpath = path.path;\r\n\t}\r\n\t\r\n\toptions.path = path;\r\n\toptions.passPath = [];\r\n\toptions.models = [];\r\n\r\n\r\n\tif (path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\t\r\n\toptions.pathArray = [].slice.call(pathArray);\r\n\r\n\tif(!pathArray.length) return;\r\n\r\n\tlet chunksCount = pathArray.length;\r\n\tvar prop = pathArray.shift();\r\n\r\n\tif(context instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: '',\r\n\t\t\tproperty: prop,\r\n\t\t\tmodel: context\r\n\t\t});\r\n\t}\r\n\r\n\tlet result = setByPathArray(context, prop, pathArray, value, options);\r\n\r\n\tif(result === undefined && value !== undefined)\r\n\t\treturn result;\r\n\r\n\t//triggering change event on all met models\r\n\tif(!options.silent){\r\n\t\tlet originPath = options.pathArray.join(':');\r\n\t\twhile(options.models.length){\r\n\t\t\tlet modelContext = options.models.pop();\r\n\t\t\tlet propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);\r\n\t\t\tif(propertyEventName){\r\n\t\t\t\tmodelContext.model.trigger('change:' + propertyEventName, value);\r\n\t\t\t}\r\n\t\t\tmodelContext.model.trigger('change', modelContext.model);\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\treturn result;\r\n};\r\n\r\nexport default setByPath;\r\n","import _ from 'underscore';\r\nimport getProperty from './_get-property';\r\n\r\nfunction getByPathArray(context, propertyName, pathArray) {\r\n\t\r\n\tif (context == null || !_.isObject(context) || propertyName == null || propertyName == '')\r\n\t\treturn;\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!pathArray.length || (pathArray.length && prop == null))\r\n\t\treturn prop;\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn getByPathArray(prop, nextName, pathArray);\r\n\r\n}\r\n\r\nexport default getByPathArray;\r\n","import _ from 'underscore';\r\nimport getByPathArray from './_get-by-path-array';\r\n\r\nfunction getByPath (obj, path) {\r\n\r\n\tif(obj == null || !_.isObject(obj) || path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\r\n\tvar prop = pathArray.shift();\r\n\r\n\treturn getByPathArray(obj, prop, pathArray);\r\n}\r\n\r\nexport default getByPath;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction traverse(fields, root)\r\n{\r\n\troot = root || '';\r\n\tif (this == null || typeof this != 'object') return;\r\n\r\n\r\n\tvar hash = this instanceof Bb.Model ? this.attributes : this;\r\n\tvar props = Object.getOwnPropertyNames(hash);\r\n\tfor (var x = 0; x < props.length; x++) {\r\n\t\tvar name = props[x];\r\n\t\tvar prop = this[name];\r\n\r\n\t\tif (prop == null || typeof prop != 'object' || (prop instanceof Date || prop instanceof Array))\r\n\t\t\tfields[root + name] = prop;\r\n\t\telse if (typeof prop == 'object')\r\n\t\t\ttraverse.call(prop, fields, root + name + '.');\r\n\r\n\t}\r\n\t\t\r\n}\r\n\r\nfunction flattenObject(obj) {\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\ttraverse.call(obj, res);\r\n\treturn res;\r\n};\r\n\r\nexport default flattenObject;\r\n","import _ from 'underscore';\r\nimport setByPath from '../set-get-by-path/set-by-path';\r\n\r\nfunction unFlattenObject(obj) {\r\n\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\tfor (var e in obj) {\r\n\t\tsetByPath(res, e, obj[e], true);\r\n\t}\r\n\treturn res;\r\n\r\n}\r\n\r\nexport default unFlattenObject;\r\n","import Bb from 'backbone'\r\nexport default (arg) => arg instanceof Bb.View;\r\n","import getLabel from './get-label';\r\nimport getName from './get-name';\r\nimport getValue from './get-value';\r\nimport wrap from './wrap';\r\nimport unwrap from './unwrap';\r\nimport setByPath from './set-get-by-path/set-by-path'\r\nimport getByPath from './set-get-by-path/get-by-path'\r\nimport flattenObject from './flatten-unflatten/flatten-object';\r\nimport unFlattenObject from './flatten-unflatten/unflatten-object';\r\nimport isView from './is-view';\r\nexport default {\r\n\tgetLabel, getName, getValue, wrap, unwrap, setByPath, getByPath, flattenObject, unFlattenObject, isView\r\n}\r\n","import view from './view/view';\r\nimport common from './common/common';\r\nexport default { view, common };\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\n\r\nconst knownCtors = [\r\n\tBb.Model,\r\n\tBb.Collection,\r\n\tBb.View,\r\n\tBb.Router,\r\n\tMn.Object\r\n];\r\n\r\nfunction isKnownCtor(arg) {\r\n\tlet isFn = _.isFunction(arg);\r\n\tlet result = _(knownCtors).some((ctor) => arg === ctor || arg.prototype instanceof ctor);\r\n\treturn isFn && result;\r\n}\r\n\r\nexport default isKnownCtor;\r\n","import Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\n\r\n\r\nlet YatError = Mn.Error.extend({},{\r\n\tHttp400(message){\r\n\t\treturn this.Http(400,message);\r\n\t},\r\n\tHttp401(message){\r\n\t\treturn this.Http(401,message);\r\n\t},\r\n\tHttp403(message){\r\n\t\treturn this.Http(403,message);\r\n\t},\r\n\tHttp404(message){\r\n\t\treturn this.Http(404, message);\r\n\t},\r\n\tHttp500(message){\r\n\t\treturn this.Http(500, message);\r\n\t},\r\n\tHttp(status, message){\r\n\t\tlet error = new this({message:message, name:\"HttpError\"});\r\n\t\terror.status = status;\r\n\t\treturn error;\r\n\t},\r\n\tHttpRedirect(message){\r\n\t\treturn this.Http(301, message);\r\n\t},\r\n\tNotFound(message){\r\n\t\treturn this.Http404(message);\r\n\t},\r\n\tNotAuthorized(message){\r\n\t\treturn this.Http401(message);\r\n\t},\r\n\tForbidden(message){\r\n\t\treturn this.Http403(message);\r\n\t},\r\n});\r\n\r\nexport default YatError;\r\n","import _ from 'underscore'\r\nimport Mn from 'backbone.marionette';\r\nimport YatError from '../YatError';\r\n\r\nfunction smartExtend(Src, Dst){\r\n\tif(_.isFunction(Dst)){\r\n\t\treturn Dst(Src);\r\n\t}\r\n\telse if(_.isObject(Dst)){\r\n\t\treturn Src.extend(Dst);\r\n\t}\r\n\telse throw new YatError('Mixin fail, argument should be an object hash or mixin function')\r\n}\r\n\r\nfunction mix(BaseClass){\r\n\tlet Mixed = null;\r\n\tif(_.isFunction(BaseClass)){\r\n\t\tMixed = BaseClass;\r\n\t}\r\n\telse if(_.isObject(BaseClass) && BaseClass !== null){\r\n\t\tlet tmp = function(){};\r\n\t\ttmp.extend = Mn.extend;\r\n\t\tMixed = tmp.extend(BaseClass);\r\n\t}\r\n\telse {\r\n\t\tthrow new Error('argument should be an object or class definition')\r\n\t}\r\n\tif(!Mixed.extend) {\r\n\t\tMixed = Mn.extend.call(BaseClass, {});\r\n\t\tMixed.extend = Mn.extend;\r\n\t}\r\n\tlet fake = {\r\n\t\twith: (...args) => _.reduce(args, (memo, arg) => smartExtend(memo, arg), Mixed),\r\n\t\tclass: Mixed,\t\r\n\t}\r\n\treturn fake;\r\n}\r\n\r\nexport default mix;\r\n","import isKnownCtor from './isKnownCtor';\r\nimport mix from './mix';\r\nexport default {\r\n\tisKnownCtor,\r\n\tmix,\r\n}\r\n","import _ from 'underscore';\r\nimport common from '../functions/common/common';\r\nexport default function (Base) {\r\n\treturn Base.extend({\r\n\t\tgetName(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getName';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getName(this, options);\r\n\t\t},\r\n\t\tgetLabel(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getLabel';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getLabel(this, options);\r\n\t\t},\r\n\t\tgetValue(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getValue';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getValue(this, options);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n","import _ from 'underscore';\r\nimport isKnownCtor from '../helpers/isKnownCtor.js';\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\t//property first approach\r\n\t\tgetProperty(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this, key, options, this.getOption);\r\n\t\t},\r\n\t\t//options first approach\r\n\t\tgetOption(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this.getProperty('options',{deep:false}), key, options, this.getProperty);\r\n\t\t},\r\n\t\t_getOptionOrProperty(valueContext, key, options = {}, fallback)\r\n\t\t{\r\n\t\t\toptions.deep !== undefined || (options.deep = true);\r\n\t\t\toptions.force !== undefined || (options.force = true);\r\n\t\t\toptions.args || (options.args = []);\r\n\r\n\t\t\t//key and valueContext should be passed\r\n\t\t\tif(key == null || valueContext == null) return;\r\n\t\t\t\r\n\t\t\t//getting raw value\r\n\t\t\tlet value = valueContext[key];\r\n\r\n\t\t\t//if there is no raw value and deep option is true then getting value from fallback\r\n\t\t\tif(value === undefined && options.deep && _.isFunction(fallback)){\r\n\t\t\t\tlet fallbackOptions = _.extend({}, options, {deep:false, force: false});\r\n\t\t\t\tvalue = fallback.call(this, key, fallbackOptions); \r\n\t\t\t}\r\n\r\n\t\t\t//if returned value is function and is not any of known constructors and options property force set to true \r\n\t\t\t//we should return value of that function\r\n\t\t\t//options.args will be passed as arguments\r\n\t\t\tif(_.isFunction(value) && options.force && !isKnownCtor(value))\r\n\t\t\t\tvalue = value.apply(this, options.args || []);\r\n\r\n\t\t\t//console.log('key', key, value);\r\n\t\t\t\r\n\t\t\t//if value is still undefined we will return default option value\r\n\t\t\treturn value === undefined ? options.default : value;\r\n\t\t}\r\n\t});\r\n\treturn Mixin;\r\n}\r\n","import Mn from 'backbone.marionette';\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tlet initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);\r\n\t\t\tthis._initRadio({skip: initRadioOnInitialize});\r\n\t\t},\r\n\t\tgetChannel () {\r\n\t\t\tif(!this._channel) this._initRadio({skip:false});\r\n\t\t\treturn this._channel;\r\n\t\t},\r\n\t\t_initRadio(opts = {skip:true}){\r\n\t\t\tif(opts.skip == true) return;\r\n\r\n\t\t\tlet channelName = this.getProperty('channelName');\r\n\t\t\tif(!channelName){\r\n\t\t\t\tlet channel = this.getProperty('channel');\r\n\t\t\t\tif(channel)\r\n\t\t\t\t\tthis.channelName = channel.channelName;\r\n\t\t\t}\r\n\t\t\tMn.Object.prototype._initRadio.call(this);\r\n\t\t},\r\n\t\tradioRequest(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.request(...args);\r\n\t\t},\r\n\t\tradioTrigger(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.trigger(...args);\r\n\t\t},\r\n\t});\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (BaseClass) => {\r\n\tlet Mixin = BaseClass.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBaseClass.apply(this, args);\r\n\t\t\tthis.initializeStateable();\r\n\t\t},\r\n\t\tinitializeStateable(){\r\n\t\t\tthis._state = {};\r\n\t\t},\r\n\r\n\t\tgetState(key){\r\n\t\t\tconst state = this._state;\r\n\t\t\tif(!key) return state\r\n\t\t\telse return state[key];\r\n\t\t},\r\n\t\tsetState(key, value, options){\r\n\t\t\t\r\n\t\t\tif(key == null) return;\r\n\r\n\t\t\tif(_.isObject(key)){\r\n\t\t\t\tconst _this = this;\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\t_(value).each((propertyValue, propertyName) => _this.setState(propertyName, propertyValue, _.extend({},options,{doNotTriggerFullState: true})));\r\n\t\t\t\tthis._triggerStateChange(value, options);\r\n\t\t\t}else{\r\n\t\t\t\tconst state = this.getState();\r\n\t\t\t\tstate[key] = value;\r\n\t\t\t\tthis._triggerStateChange(key, value, options);\r\n\t\t\t}\r\n\t\t},\r\n\t\tclearState(opts = {}){\r\n\t\t\tlet state = this.getState();\r\n\t\t\tlet broadcast = _.extend({}, state);\r\n\t\t\t_(state).each((s,key) => {\r\n\t\t\t\tbroadcast[key] = undefined;\r\n\t\t\t\tdelete state[key];\r\n\t\t\t});\r\n\t\t\tthis._triggerStateChange(broadcast);\r\n\t\t},\r\n\t\t_triggerStateChange(key, value, options){\r\n\r\n\t\t\tif(!_.isFunction(this.triggerMethod)) return;\r\n\r\n\t\t\tif(!_.isObject(key)){\r\n\t\t\t\tthis.triggerMethod('state:' + key, value, options);\r\n\t\t\t\tif(value === true || value === false || (!!value && typeof value === 'string'))\r\n\t\t\t\t\tthis.triggerMethod('state:' + key + ':' + value.toString(), options);\r\n\t\t\t\tif(!options || (options && !options.doNotTriggerFullState)){\r\n\t\t\t\t\tthis.triggerMethod('state', {[key]:value}, options);\t\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t//key is a hash of states\r\n\t\t\t\t//value is options\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\tthis.triggerMethod('state', value, options);\r\n\t\t\t}\r\n\t\t},\t\t\r\n\t});\r\n\tMixin.Stateable = true;\r\n\r\n\treturn Mixin;\r\n\r\n}\r\n","import _ from 'underscore';\r\nimport mix from '../helpers/mix.js';\r\nimport State from './stateable.js';\r\nimport YatError from '../YatError.js';\r\n\r\nconst STATES = {\r\n\tINITIALIZED: 'initialized',\r\n\tSTARTING: 'starting',\r\n\tRUNNING: 'running',\r\n\tSTOPPING: 'stopping',\r\n\tWAITING: 'waiting',\r\n\tDESTROYED: 'destroyed'\r\n}\r\n\r\nconst STATE_KEY = 'life';\r\n\r\n\r\nfunction getPropertyPromise(context, propertyName){\r\n\r\n\tif(context == null || propertyName == null)\r\n\t\treturn Promise.resolve();\r\n\r\n\tlet _promises1 = context['_'+propertyName] || [];\r\n\tlet _promises2 = _.result(context, propertyName) || [];\r\n\r\n\tlet rawPromises = _promises1.concat(_promises2);\r\n\t\t//context[propertyName] || [];\r\n\r\n\tlet promises = [];\r\n\t_(rawPromises).each((promiseArg) => {\r\n\t\tif(_.isFunction(promiseArg))\r\n\t\t\tpromises.push(promiseArg.call(this));\r\n\t\telse if(promiseArg != null)\r\n\t\t\tpromises.push(promiseArg);\r\n\t});\r\n\treturn Promise.all(promises);\r\n}\r\n\r\nfunction addPropertyPromise(context, propertyName, promise){\r\n\tcontext[propertyName] || (context[propertyName] = []);\r\n\tlet promises = context[propertyName];\r\n\tpromises.push(promise);\r\n}\r\n\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Middle = mix(Base).with(State);\r\n\tlet Mixin = Middle.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tMiddle.apply(this,args);\r\n\t\t\tthis.initializeStartable();\r\n\t\t},\r\n\r\n\t\tfreezeWhileStarting: false,\r\n\t\tfreezeUI(){ },\r\n\t\tunFreezeUI(){ },\r\n\t\tisStartNotAllowed(){ },\r\n\t\tisStopNotAllowed(){ },\r\n\r\n\t\taddStartPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_startRuntimePromises', promise);\r\n\t\t},\r\n\r\n\t\taddStopPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_stopPromises', promise);\r\n\t\t},\t\t\r\n\r\n\t\tinitializeStartable(){\r\n\t\t\t\r\n\t\t\tif(!(this.constructor.Startable && this.constructor.Stateable)) return;\r\n\r\n\t\t\tthis._registerStartableLifecycleListeners();\r\n\t\t\tthis._setLifeState(STATES.INITIALIZED);\r\n\t\t\tthis._startRuntimePromises = [];\r\n\t\t\tthis._startPromises = [];\r\n\t\t\tthis._stopPromises = [];\r\n\t\t},\t\r\n\r\n\t\tstart(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStarted = this._ensureStartableCanBeStarted();\r\n\t\t\tlet resultPromise = null;\r\n\t\t\tlet catchMethod = null;\r\n\r\n\t\t\tif(canNotBeStarted){\r\n\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t//resultPromise = Promise.reject(canNotBeStarted);\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tlet declineReason = this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\tresultPromise = Promise.reject(declineReason);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tvar currentState = this._getLifeState();\r\n\t\t\t\tthis._tryMergeStartOptions(options);\t\t\r\n\t\t\t\tthis.triggerMethod('before:start', ...args);\r\n\r\n\t\t\t\tresultPromise = this._getStartPromise();\r\n\t\t\t}\r\n\t\t\t*/\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// return resultPromise.then(() => {\r\n\t\t\t// \tthis.triggerStart(options)\r\n\t\t\t// }, (error) => {\t\t\t\t\r\n\t\t\t// \tthis._setLifeState(currentState);\r\n\t\t\t// \tif(catchMethod) catchMethod();\r\n\t\t\t// \treturn Promise.reject(error);\r\n\t\t\t// });\t\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStarted = _this._ensureStartableCanBeStarted();\r\n\r\n\t\t\t\tif(canNotBeStarted){\r\n\t\t\t\t\t_this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t\treject(canNotBeStarted)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\t_this.triggerMethod('before:start', ...args);\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStartPromise();\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStartOptions(options);\t\t\r\n\t\t\t\t\t_this.once('start', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStart(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\t\t},\r\n\r\n\t\ttriggerStart(options) {\r\n\t\t\tthis.triggerMethod('start', options);\r\n\t\t},\r\n\r\n\t\tstop(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStopped = this._ensureStartableCanBeStopped();\r\n\t\t\tif(canNotBeStopped){\r\n\t\t\t\tthis.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\treturn Promise.reject(canNotBeStopped);\t\t\t\t\r\n\t\t\t}\r\n\t\t\tlet declineReason = this.isStopNotAllowed(options);\r\n\t\t\tif(declineReason){\r\n\t\t\t\tthis.triggerMethod('stop:decline', declineReason);\r\n\t\t\t\treturn Promise.reject(declineReason);\r\n\t\t\t}\r\n\t\t\t\r\n\r\n\t\t\tvar currentState = this._getLifeState();\r\n\r\n\t\t\tthis._tryMergeStopOptions(options);\r\n\t\t\tthis.triggerMethod('before:stop', this, options);\r\n\r\n\t\t\tlet promise = this._getStopPromise();\r\n\r\n\t\t\treturn promise.then(() => {\r\n\t\t\t\tthis.triggerStop(options)\r\n\t\t\t}, () => {\r\n\t\t\t\tthis._setLifeState(currentState);\r\n\t\t\t});\t\r\n\t\t\t*/\r\n\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStopped = _this._ensureStartableCanBeStopped();\r\n\r\n\t\t\t\tif(canNotBeStopped){\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\t\treject(canNotBeStopped)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStopNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStopPromise();\r\n\t\t\t\t_this.triggerMethod('before:stop', ...args);\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStopOptions(options);\t\t\r\n\t\t\t\t\t_this.once('stop', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStop(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\r\n\t\t},\r\n\r\n\t\ttriggerStop(options) {\r\n\t\t\tthis.triggerMethod('stop', options);\r\n\t\t},\r\n\r\n\r\n\r\n\r\n\r\n\t\t//lifecycle state helpers\r\n\t\t_setLifeState(newstate){\r\n\t\t\tthis.setState(STATE_KEY, newstate);\r\n\t\t},\r\n\r\n\t\t_getLifeState(){\r\n\t\t\treturn this.getState(STATE_KEY);\r\n\t\t},\r\n\r\n\t\t_isLifeState(state){\r\n\t\t\treturn this._getLifeState() === state;\r\n\t\t},\r\n\r\n\t\t_isLifeStateIn(...states){\r\n\t\t\treturn _(states).some((state) => this._isLifeState(state));\r\n\t\t},\r\n\r\n\t\t_isInProcess(){\r\n\t\t\treturn this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);\r\n\t\t},\r\n\r\n\r\n\t\t_registerStartableLifecycleListeners(){\r\n\t\t\tlet freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.freezeUI))\r\n\t\t\t\tthis.on(`state:${STATE_KEY}:${STATES.STARTING}`,() => {\r\n\t\t\t\t\tthis.freezeUI();\r\n\t\t\t\t});\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.unFreezeUI))\r\n\t\t\t\tthis.on('start',() => {\r\n\t\t\t\t\tthis.unFreezeUI();\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\tthis.on('before:start', () => this._setLifeState(STATES.STARTING));\r\n\t\t\tthis.on('start', () => this._setLifeState(STATES.RUNNING));\r\n\t\t\tthis.on('before:stop',() => this._setLifeState(STATES.STOPPING));\r\n\t\t\tthis.on('stop',() => this._setLifeState(STATES.WAITING));\r\n\t\t\tthis.on('destroy',() => this._setLifeState(STATES.DESTROYED));\r\n\r\n\t\t},\t\r\n\r\n\t\t_tryMergeStartOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStartOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_tryMergeStopOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStopOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIntact(opts = {throwError: false}) {\r\n\t\t\tlet message = 'Startable has already been destroyed and cannot be used.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\r\n\t\t\tlet destroyed = this._isLifeState(STATES.DESTROYED);\r\n\t\t\tif(opts.throwError && destroyed){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(destroyed){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIdle(opts = {throwError:false}){\r\n\t\t\tlet message = 'Startable is not idle. current state: ' + this._getLifeState();\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet isNotIntact = this._ensureStartableIsIntact(opts);\r\n\t\t\tlet notIdle = this._isInProcess();\r\n\t\t\tif(opts.throwError && notIdle){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(isNotIntact){\r\n\t\t\t\treturn isNotIntact;\r\n\t\t\t}\r\n\t\t\telse if(notIdle){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableCanBeStarted(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable has already been started.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\t\t\tlet allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;\r\n\r\n\t\t\tif(!notIdle && allowStartWithoutStop) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\t\t\tif(opts.throwError && running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t_ensureStartableCanBeStopped(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable should be in `running` state.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\r\n\t\t\tlet allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;\r\n\t\t\tif(!notIdle && allowStopWithoutStart) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\r\n\t\t\tif(opts.throwError && !running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(!running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\r\n\t\t},\t\r\n\t\t\r\n\t\t_getStartPromise(options = {}){\r\n\t\t\treturn Promise.all(this._getStartPromises(options));\r\n\t\t},\r\n\r\n\t\t_getStartPromises(options = {}){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStartParentPromise());\r\n\t\t\tpromises.push(this._getStartPagePromise());\r\n\t\t\tif(options.noruntime !== true)\r\n\t\t\t\tpromises.push(this._getStartRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStartRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startRuntimePromises');\r\n\t\t},\r\n\t\t_getStartPagePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startPromises');\r\n\t\t},\r\n\t\t_getStartParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStartPromise))\r\n\t\t\t\treturn parent._getStartPromise({noruntime: true});\r\n\t\t},\r\n\r\n\t\t_getStopPromise(){\r\n\t\t\treturn Promise.all(this._getStopPromises());\r\n\t\t},\r\n\t\t\r\n\t\t_getStopPromises(){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStopRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStopRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'stopPromises');\r\n\t\t},\r\n\r\n\t\t_getStopParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStopPromise))\r\n\t\t\t\treturn parent._getStopPromise();\r\n\t\t},\r\n\r\n\r\n\t});\r\n\r\n\tMixin.Startable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (Base) => {\r\n\t\r\n\tconst CHILDREN_FIELD = '_children';\r\n\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args) {\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tthis.initializeChildrenable(...args);\r\n\t\t},\r\n\r\n\t\tinitializeChildrenable(options = {}){\r\n\t\t\tthis._initializeParrent(options);\r\n\t\t\tthis._initializeChildren(options);\r\n\t\t},\r\n\r\n\t\thasChildren(){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\treturn this[CHILDREN_FIELD].length > 0;\r\n\t\t},\r\n\r\n\t\tgetChildren(opts = {startable:true}){\r\n\t\t\tlet all = this[CHILDREN_FIELD] || [];\r\n\t\t\tif(!opts.startable){\r\n\t\t\t\treturn all;\r\n\t\t\t}else{\r\n\t\t\t\treturn all.filter((c) => !c.getProperty('isStartNotAllowed'));\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thasParent(){\r\n\t\t\tlet parent = this.getParent();\r\n\t\t\treturn _.isObject(parent);\r\n\t\t},\r\n\r\n\t\tgetParent(){\r\n\t\t\treturn this.getProperty('parent', {deep:false});\r\n\t\t},\r\n\r\n\t\t_initializeChildren(){\r\n\t\t\tlet _children = this.getProperty('children');\r\n\t\t\tlet children = [];\r\n\t\t\t_(_children).each((child) => {\r\n\r\n\t\t\t\tlet childContext = this._normalizeChildContext(child);\r\n\t\t\t\tlet initialized = this._initializeChild(childContext);\r\n\t\t\t\tif(initialized) children.push(initialized);\r\n\r\n\t\t\t});\r\n\t\t\tthis[CHILDREN_FIELD] = children;\r\n\t\t},\r\n\t\t_initializeChild(childContext)\r\n\t\t{\r\n\t\t\tif(childContext == null || !_.isFunction(childContext.Child)) return;\r\n\r\n\t\t\tlet Child = childContext.Child;\r\n\t\t\tlet opts = this._normalizeChildOptions(childContext);\r\n\t\t\treturn this.buildChild(Child, opts);\r\n\t\t},\r\n\r\n\t\t_normalizeChildContext(child){\r\n\t\t\tlet childContext = {};\r\n\r\n\t\t\tif(_.isFunction(child) && child.Childrenable){\r\n\t\t\t\t_.extend(childContext, { Child: child });\r\n\t\t\t}else if(_.isFunction(child)){\r\n\t\t\t\tchildContext = this._normalizeChildContext(child.call(this));\r\n\t\t\t}\r\n\t\t\telse if(_.isObject(child)){\r\n\t\t\t\tchildContext = child;\r\n\t\t\t}\r\n\t\t\treturn childContext;\r\n\t\t},\r\n\r\n\t\t_normalizeChildOptions(options){\r\n\t\t\tlet opts = _.extend({}, options);\r\n\t\t\tif(this.getOption('passToChildren') === true){\r\n\t\t\t\t_.extend(opts, this.options);\r\n\t\t\t}\r\n\t\t\topts.parent = this;\r\n\t\t\tdelete opts.Child;\r\n\t\t\treturn this._buildChildOptions(opts);\r\n\t\t},\r\n\r\n\t\t_buildChildOptions: function(def){\r\n\t\t\treturn _.extend(def, this.getProperty('childOptions'));\r\n\t\t},\r\n\r\n\t\tbuildChild(ChildClass, options){\r\n\t\t\treturn new ChildClass(options);\r\n\t\t},\r\n\r\n\t\t_initializeParrent(opts){\r\n\t\t\tif(this.parent == null && opts.parent != null)\r\n\t\t\t\tthis.parent = opts.parent;\r\n\t\t},\r\n\r\n\t});\r\n\r\n\tMixin.Childrenable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\nimport cid from '../functions/common/wrap';\r\nlet templateContextStore = [(view) => {\r\n\treturn {\r\n\t\t_v: view,\r\n\t\t_m: view.model || {},\r\n\t\t_cid: (arg) => cid(view.cid, arg)\r\n\t}\r\n}];\r\nlet compiledContext = {}; //rethink how it can be used\r\nlet hasChanges = false;\r\n\r\nfunction normalizeValue(value, ...args){\r\n\tif(_.isFunction(value))\r\n\t\treturn value(...args);\r\n\telse if(_.isObject(value))\r\n\t\treturn value;\r\n\telse\r\n\t\treturn {};\r\n}\r\n\r\nconst GlobalTemplateContext = {\r\n\tmix(viewTemplateContext, ...args){\r\n\t\tlet global = this.get(...args);\r\n\t\treturn _.extend(global, viewTemplateContext);\r\n\t},\r\n\tget(...args){\r\n\t\treturn this.compile(...args);\r\n\t},\t\r\n\tadd(...args){\r\n\t\t_(args).each((item) => this.push(item));\r\n\t},\r\n\r\n\tcompile(...args){ \r\n\r\n\t\tif(hasChanges)\r\n\t\t\tcompiledContext = {};\r\n\r\n\t\tlet newcontext = {};\r\n\r\n\t\t_(templateContextStore).each((cntx) => {\r\n\t\t\tif(_.isFunction(cntx))\r\n\t\t\t\t_.extend(newcontext, normalizeValue(cntx, ...args));\r\n\t\t\telse if(hasChanges){\r\n\t\t\t\t_.extend(compiledContext, cntx);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(!hasChanges)\r\n\t\t\t_.extend(newcontext, compiledContext);\r\n\t\t\r\n\t\thasChanges = false;\r\n\t\treturn newcontext;\r\n\t},\r\n\tpop(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.pop();\r\n\t},\r\n\tshift(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.shift();\r\n\t},\r\n\tpush(item){ \r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.push(item); \r\n\t},\r\n\tunshift(item){\r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.unshift(item);\r\n\t},\r\n\tclear(){\r\n\t\thasChanges = false;\r\n\t\tcompiledContext = {};\r\n\t\ttemplateContextStore = [];\r\n\t},\r\n}\r\n\r\nexport default GlobalTemplateContext;\r\n","import _ from 'underscore';\r\nimport TemplateContext from '../singletons/template-context';\r\n\r\nexport default (Base) => Base.extend({\r\n\tmixinTemplateContext(target = {}) {\r\n\t\t\r\n\t\tvar templateContext = TemplateContext.mix(_.result(this, 'templateContext'), this);\r\n\t\t\r\n\t\treturn _.extend(target, templateContext);\r\n\t},\r\n})\r\n","import GetNameLabel from './get-name-label';\r\nimport GetOptionProperty from './get-option-property';\r\nimport Radioable from './radioable.js';\r\nimport Stateable from './stateable';\r\nimport Startable from './startable';\r\nimport Childrenable from './childrenable';\r\nimport GlobalTemplateContext from './global-template-context';\r\n\r\nexport default {\r\n\tGetNameLabel,\r\n\tGetOptionProperty,\r\n\tRadioable,\r\n\tStateable,\r\n\tStartable,\r\n\tChildrenable,\r\n\tGlobalTemplateContext,\r\n}\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from '../helpers/mix';\r\nimport GetOptionProperty from '../mixins/get-option-property';\r\nimport fns from '../functions/common/common';\r\nconst BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);\r\nexport default BaseBehavior.extend({\r\n\r\n\tlistenViewInitialize: true,\r\n\r\n\tconstructor(){\r\n\r\n\t\tif(this.getProperty('listenViewInitialize') === true)\r\n\t\t\tthis.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));\r\n\r\n\t\tBaseBehavior.apply(this, arguments);\r\n\t},\r\n\r\n\tgetModel: function () {\r\n\t\treturn this.view.model;\r\n\t},\t\r\n\tcidle(name){\r\n\t\treturn fns.wrap(this.view.cid, name);\r\n\t},\r\n\tunCidle(name){\r\n\t\treturn fns.unwrap(name, this.view.cid); \r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst BaseDraggable = Behavior.extend({\r\n\r\n\ttriggerEl: undefined, //drag initialization element, if not set equal to view.$el\r\n\tmoveBeforeStart: 10,\r\n\tscope: 'drag',\r\n\r\n\tgetDragEventsContext(){\r\n\t\treturn this.$doc;\r\n\t},\r\n\tgetDragEventsElementSelector(){\r\n\t\treturn '*';\r\n\t},\r\n\tgetTriggerEl(){\r\n\t\tif(this._$el) return this._$el;\r\n\r\n\t\tlet el = this.getOption('triggerEl');\r\n\t\tif(el == null && this.view.$el)\r\n\t\t\tthis._$el = this.view.$el;\r\n\t\telse if(el && el.jquery) this._$el = el\r\n\t\telse if(el instanceof HTMLElement) this._$el = $(el)\r\n\t\telse if(typeof el === 'string' && el.length)\r\n\t\t\tthis._$el = this.view.$(el);\r\n\t\telse\r\n\t\t\tthrow new Error('trigger element should be a DOM or jQuery object or string selector.', el);\r\n\r\n\t\treturn this._$el;\r\n\t},\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\r\n\tshouldHandleDomEvents(dragging){\r\n\t\treturn this.isSameScope(dragging) && this !== dragging;\r\n\t},\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tthis._clearDragData();\r\n\t\t\r\n\t\tthis.$doc = $(document);\r\n\r\n\t\tBehavior.apply(this, args);\r\n\r\n\t\tthis._defineDocumentBindings();\r\n\r\n\t},\r\n\t_clearDragData(){\r\n\t\tthis._dragData = {};\r\n\t},\r\n\t_defineDocumentBindings(){\r\n\t\tthis.__b = {};\r\n\t\tthis.__b.setupDragDetection = _.bind(this._setupDragDetection, this);\r\n\t\tthis.__b.handleMouseUp = _.bind(this._handleMouseUp, this);\r\n\t\tthis.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);\r\n\t\tthis.__b.handleDragMove = _.bind(this._handleDragMove, this);\r\n\t\tthis.__b.handleElementEnter = _.bind(this._handleElementEnter, this);\r\n\t\tthis.__b.handleElementLeave = _.bind(this._handleElementLeave, this);\r\n\t\tthis.__b.handleElementOver = _.bind(this._handleElementOver, this);\r\n\t},\r\n\r\n\tonInitialize(){\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\r\n\r\n\t_initializeDragListener(){\r\n\t\tlet $el = this.getTriggerEl();\r\n\t\t$el.one('mousedown', this.__b.setupDragDetection);\r\n\t},\r\n\t_setupDragDetection(e){\r\n\t\tif(this.view.dragDisabled === true){ \r\n\t\t\tthis._initializeDragListener();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\te.stopPropagation();\r\n\r\n\t\tthis.$doc.one('mouseup', this.__b.handleMouseUp);\r\n\r\n\t\tthis._dragData.startX = e.pageX;\r\n\t\tthis._dragData.startY = e.pageY;\r\n\t\tthis.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t},\r\n\t_handleMouseUp(e){\r\n\t\tif(this._dragData.dragging)\r\n\t\t\tthis._handleDragEnd(e);\r\n\t\telse\r\n\t\t\tthis._handleEndWithoutDrag(e);\r\n\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\t_handleEndWithoutDrag(e){\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\t},\r\n\t_handleDragEnd(e){\r\n\t\tthis._dragData.dragging = false;\r\n\r\n\t\tthis.$doc.off('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\t$context.off('mouseenter', this.__b.handleElementEnter);\r\n\t\t$context.off('mousemove', this.__b.handleElementOver);\r\n\r\n\t\tif(this._dragData.drop && this._dragData.drop.context){\r\n\t\t\tthis._dragData.drop.context.catchDraggable(this, this._dragData.drop);\r\n\t\t\tthis.triggerMethod('drag:drop', this._dragData.drop);\r\n\t\t}\r\n\r\n\t\tthis.triggerMethod('drag:end');\r\n\r\n\t},\r\n\r\n\t_handleMoveAfterMouseDown(e){\r\n\t\te.stopPropagation();\r\n\r\n\t\tlet distance = this._getStartPositionPixelOffset(e);\r\n\t\tlet startIfMoreThan = this.getOption('moveBeforeStart');\r\n\t\tif(distance >= startIfMoreThan)\r\n\t\t\tthis._startDragSession();\r\n\t},\r\n\t_getStartPositionPixelOffset(e){\r\n\t\tlet x = Math.abs(e.pageX - this._dragData.startX);\r\n\t\tlet y = Math.abs(e.pageY - this._dragData.startY);\r\n\t\treturn x > y ? x : y;\r\n\t},\r\n\t_startDragSession(){\r\n\t\tthis._dragData.dragging = true;\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t\tthis.$doc.on('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\tlet selector = this.getDragEventsElementSelector();\r\n\r\n\t\t$context.on('mouseenter', selector, this.__b.handleElementEnter);\r\n\r\n\t\t$context.on('mousemove', selector, this.__b.handleElementOver);\r\n\r\n\r\n\t\tthis.view.triggerMethod('drag:start');\r\n\t},\r\n\t_handleDragMove(ev){\r\n\t\tev.stopPropagation();\r\n\r\n\t\tthis.triggerMethod('drag', ev);\r\n\r\n\t},\r\n\t_handleElementEnter(e){\r\n\t\tlet $over = $(e.target);\r\n\r\n\r\n\t\tif(this._dragData.over != $over){\r\n\t\t\tthis._dragData.over = $over;\r\n\t\t\t$over.trigger('drag:enter', this);\r\n\t\t\t$over.one('mouseleave', () => this.trigger('drag:leave', this));\r\n\r\n\t\t}\r\n\t},\r\n\t_handleElementLeave(e){\r\n\t\tlet $over = $(e.target);\r\n\t\t$over.trigger('drag:leave', this);\r\n\t},\r\n\t_handleElementOver(e){\r\n\t\tlet $over = $(e.target);\r\n\t\tlet event = this._createCustomDomEvent('drag:over', e);\r\n\t\t$over.trigger(event, this);\r\n\t},\r\n\t_createCustomDomEvent: function (name, event, merge) {\r\n\t\tif (!merge)\r\n\t\t\tmerge = [\"pageX\", \"pageY\", \"clientX\", \"clientY\", \"offsetX\", \"offsetY\", \"target\"];\r\n\r\n\t\tvar customEvent = jQuery.Event(name);\r\n\t\t_(merge).each((prop) => customEvent[prop] = event[prop]);\r\n\r\n\t\treturn customEvent;\r\n\t},\t\r\n});\r\n\r\nexport default BaseDraggable;\r\n","import _ from 'underscore';\r\nimport BaseDraggable from './_base-draggable';\r\n\r\nconst DraggableBehavior = BaseDraggable.extend({\r\n\r\n\tuseGhost: true,\r\n\tviewCssClass: 'dragging',\r\n\tghostCssClass: 'ghost',\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tBaseDraggable.apply(this, args);\r\n\r\n\t\tthis.on('drag', this._onDrag);\r\n\t\tthis.on('drag:start', this._onDragStart);\r\n\t\tthis.on('drag:end', this._onDragEnd);\r\n\r\n\t},\r\n\r\n\tevents:{\r\n\t\t'drag:enter'(e, dragging){\r\n\t\t\tif(!this.shouldHandleDomEvents(dragging)) return;\r\n\t\t},\r\n\t\t'drag:over'(e, dragging){\r\n\t\t\tif(!this.isSameScope(dragging)) return;\r\n\t\t\te.stopPropagation();\r\n\r\n\t\t\tlet newEvent = this._createCustomDomEvent('drag:over', e);\r\n\r\n\t\t\tlet parent = this.$el.parent();\r\n\t\t\tif(parent)\r\n\t\t\t\tparent.trigger(newEvent, [dragging, this]);\t\t\t\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_onDragEnd(ev){\r\n\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._removeGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.removeClass(this.getOption('viewCssClass'));\r\n\r\n\t\tthis._clearDragData();\r\n\t},\r\n\t_onDragStart(ev){\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._createGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.addClass(this.getOption('viewCssClass'));\r\n\t},\r\n\t_onDrag(ev){\r\n\t\tthis.setGhostPosition(ev.pageY, ev.pageX);\r\n\t},\r\n\t_removeGhost(){\r\n\t\tthis.$ghost.remove();\r\n\t\tdelete this.$ghost;\r\n\t},\r\n\tcreateGhost(){\r\n\t\tlet $g = this.$el.clone();\r\n\t\tlet {top,left} = this.$el.offset();\r\n\t\t$g.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t\twidth: this.$el.outerWidth(),\r\n\t\t\theight: this.$el.outerHeight(),\r\n\t\t});\r\n\t\treturn $g;\r\n\t},\r\n\t_createGhost(){\r\n\t\tvar $g = this.createGhost();\r\n\t\tif($g.css('position') != 'absolute')\r\n\t\t\t$g.css('position','absolute');\r\n\r\n\t\tlet addClasses = this.getOption('ghostCssClass');\r\n\t\tif(addClasses)\r\n\t\t\t$g.addClass(addClasses);\r\n\r\n\t\t$g.appendTo($('body'));\r\n\t\tthis._setGhost($g);\r\n\t},\r\n\t_setGhost($g){\r\n\t\tthis.$ghost = $g;\r\n\t},\r\n\tgetGhost(){\r\n\t\treturn this.$ghost;\t\r\n\t},\r\n\tsetGhostPosition(top, left){\r\n\t\t\r\n\t\tlet $ghost = this.getGhost();\r\n\t\tif (!$ghost) return;\r\n\r\n\t\t$ghost.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t});\t\t\r\n\r\n\t}\r\n\r\n});\r\n\r\n\r\nexport default DraggableBehavior;\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst DroppableBehavior = Behavior.extend({\r\n\tscope:'drag',\r\n\tevents:{\r\n\t\t'drag:over':'_onDomDragOver'\r\n\t},\r\n\r\n\t//because of mn 3.5.1 bug of first render isAtached flag\r\n\t_skipFirstAttach: true,\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\tgetEventXY(e){\r\n\t\treturn {x: e.pageX, y: e.pageY};\r\n\t},\r\n\tgetChildren(){\r\n\t\treturn _(this.view.children._views).filter((v) => v.model && v.isRendered() && v.isAttached());\r\n\t},\r\n\tcatchDraggable(draggable, dropContext){\r\n\t\tthis._onDrop(draggable, dropContext);\r\n\t},\r\n\t\r\n\t\r\n\tconstructor: function(...args){\r\n\t\tBehavior.apply(this, args);\r\n\t\tthis._initReorderBehavior();\r\n\t},\r\n\t_initReorderBehavior(){\r\n\t\tthis.listenToOnce(this.view, 'render', () => {\r\n\t\t\tthis.reOrder({ silent: true })\r\n\t\t\tthis.listenTo(this.view.collection, 'update', function (collection, options) {\r\n\t\t\t\tlet changes = (options || {}).changes || {};\r\n\t\t\t\tthis.reOrder();\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\treOrder(options = {}){\r\n\t\t\r\n\t\tthis.view.sort();\r\n\r\n\t\tvar children = this.children = [];\r\n\t\tvar skipAttach = this._skipFirstAttach\r\n\t\t_(this.view.children._views).each((view, index) => {\r\n\t\t\tif (!view.model) return;\r\n\t\t\tview.model.set('order', index);\r\n\t\t\tif (view.isRendered() && (skipAttach || view.isAttached()))\r\n\t\t\t\tchildren.push(view);\r\n\t\t});\r\n\r\n\t\tthis.hasChildren = this.children.length > 0;\r\n\r\n\t\tif (options.silent != true && this.view.collection)\r\n\t\t\tthis.view.collection.trigger('reordered');\r\n\r\n\t\tthis._skipFirstAttach = false;\r\n\r\n\t},\r\n\r\n\t// _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },\r\n\t// _onChildrenReady(){\r\n\t// \tthis._refreshChildren();\r\n\t// },\r\n\t// _refreshChildren(){\r\n\t\t\r\n\t// \tthis.children = this.getChildren();\r\n\t// \tthis.hasChildren = this.children.length > 0;\r\n\r\n\t// \tthis.view.collection.trigger('reordered', this.view.collection.cid);\r\n\t// },\r\n\r\n\r\n\t_onDomDragOver(e, dragging, child){\r\n\t\tif(!this.isSameScope(dragging)) return;\r\n\t\te.stopPropagation();\r\n\t\t\r\n\r\n\t\tif(dragging === child || (this.hasChildren && !child)) return;\r\n\r\n\t\tdragging._dragData.drop || (dragging._dragData.drop = {});\r\n\t\tlet storedDrop = dragging._dragData.drop;\r\n\r\n\t\tlet xy = this.getEventXY(e);\r\n\r\n\t\tlet drop = this._getDropContext(xy, child);\r\n\t\tdrop.context = this;\r\n\r\n\t\tlet mixedDrop = _.extend({}, storedDrop, drop);\r\n\t\tlet keys = _.keys(mixedDrop);\r\n\t\tlet hasChanges = _(keys).some((k) => storedDrop[k] !== drop[k]);\r\n\t\tif(hasChanges){\r\n\t\t\tdragging._dragData.drop = drop;\r\n\t\t\tthis._onDropContextChange(dragging, drop);\r\n\t\t}\r\n\r\n\t},\r\n\t_getDropContext(xy, child){\r\n\r\n\t\tlet children = this.children || [];\r\n\t\tif(!children.length) return {insert:'before'};\r\n\r\n\t\tlet $el = child ? child.$el : this.$el;\r\n\t\tlet position = this._getPositionByEventXY(xy, $el);\r\n\t\treturn this._getDropContextByPosisiton(position, child);\r\n\r\n\t},\r\n\t_getPositionByEventXY(xy, $el){\r\n\r\n\t\tlet elOffset = $el.offset();\r\n\t\tlet elDimension = {width: $el.outerWidth(), height: $el.outerHeight()};\r\n\t\tlet xHalf = elOffset.left + elDimension.width / 2;\r\n\t\tlet yHalf = elOffset.top + elDimension.height / 2;\r\n\t\tlet r = {x:undefined, y:undefined};\r\n\r\n\t\tr.x = xy.x <= xHalf ? 'left' : 'right'\r\n\t\tr.y = xy.y <= yHalf ? 'top' : 'bottom';\r\n\r\n\t\treturn r;\r\n\t},\r\n\t_getDropContextByPosisiton(position, child){\r\n\r\n\t\tlet direction = this.getOption('direction') || 'vertical';\r\n\r\n\t\tlet insert = direction == 'horizontal' \r\n\t\t\t? position.x == 'left' ? 'before' : 'after'\r\n\t\t\t: position.y == 'top' ? 'before' : 'after';\r\n\r\n\t\tvar childView = undefined;\r\n\r\n\t\tif(child){\r\n\t\t\tchildView = child.view;\r\n\t\t}else{\r\n\t\t\tchildView = insert == 'before' ? this.children[0] : (this.children.length && _(this.children).last());\r\n\t\t}\r\n\r\n\t\tlet index = this.view.children._views.indexOf(childView);\r\n\r\n\t\treturn {\r\n\t\t\tinsert,\r\n\t\t\tchildView,\r\n\t\t\tindex,\r\n\t\t\tnoChild: !child,\r\n\t\t}\r\n\r\n\t},\r\n\t_onDropContextChange(dragging, context){\r\n\t\tthis.triggerMethod('drop:context:change', dragging, context);\r\n\t},\r\n\t_onDrop(draggable, dropContext){\r\n\t\tthis.triggerMethod('drop', draggable, dropContext);\r\n\t},\r\n});\r\n\r\n\r\n\r\nexport default DroppableBehavior;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\n\r\nconst DynamicClass = Behavior.extend({\t\r\n\tupdateElementClass(changeSource){\r\n\t\tlet viewCls = _.result(this.view, 'className') || '';\r\n\t\tlet addCls = _.result(this.view, 'dynamicClassName') || '';\r\n\t\tthis.$el.attr({\r\n\t\t\tclass: (viewCls + ' ' + addCls).trim()\r\n\t\t});\r\n\r\n\t},\r\n\r\n\trefreshOnModelChange: true,\r\n\trefreshOnDomChange: false,\r\n\trefreshOnViewRefresh: true,\r\n\trefreshOnViewBeforeRender: true,\r\n\trefreshOnViewRender: false,\r\n\r\n\tmodelEvents:{\r\n\t\t'change'(){ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change'); }\r\n\t},\r\n\tevents:{\r\n\t\t'change'(){ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change'); }\r\n\t},\r\n\tonRefresh(){\r\n\t\tthis.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh'); \r\n\t},\r\n\tonRender(){\r\n\t\tthis.getProperty('refreshOnViewRender') && this.updateElementClass('view:render'); \r\n\t},\r\n\tonBeforeRender(){\r\n\t\tthis.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render'); \r\n\t},\r\n\tonRefreshCssClass(){\r\n\t\tthis.updateElementClass();\r\n\t},\r\n\tonSetupRefreshCssClass(setup){\r\n\t\tif(setup == null || !_.isObject(setup)) return;\r\n\t\tlet properties = ['refreshOnModelChange','refreshOnDomChange','refreshOnViewRefresh','refreshOnViewBeforeRender','refreshOnViewRender'];\r\n\t\t_(setup).each((value, property) => {\r\n\t\t\tthis[property] = value === true;\r\n\t\t});\r\n\t},\r\n});\r\n\r\nexport default DynamicClass;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport flattenObject from '../functions/common/flatten-unflatten/flatten-object';\r\nimport unFlattenObject from '../functions/common/flatten-unflatten/unflatten-object';\r\n\r\nexport default mix(Behavior).with(Stateable).extend({\r\n\tapplyDelay: 1, //in ms\r\n\tautoApplyToModel: false, //finalize\r\n\tautoChangeModel: false, //on every change\r\n\t\r\n\tfillFormFromModel: true,\r\n\r\n\tapplySelector: '.apply',\r\n\tcancelSelector: '.cancel',\r\n\tresetSelector: '.reset',\r\n\r\n\tinitialize(opts){\r\n\r\n\t\tthis.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));\r\n\t\tthis.mergeOptions(opts,['values']);\r\n\r\n\t\tthis.extendDefaultValues({});\r\n\r\n\t},\r\n\r\n\textendDefaultValues(hash){\r\n\r\n\t\tthis._values = _.extend(this._values || {}, hash);\r\n\r\n\t},\t\r\n\r\n\tonViewInitialize(){\r\n\r\n\t\t//this.extendDefaultValues(this.getProperty('values'));\r\n\r\n\t\tlet model = this.getModel();\r\n\t\tif(model){\r\n\t\t\tthis.extendDefaultValues(model.toJSON());\r\n\t\t}\r\n\t},\r\n\r\n\tonRender(){\r\n\r\n\t\tif(!this.firstRender){\r\n\t\t\tthis.buildFormBindings();\r\n\t\t\tthis.setState(this._tryFlatValues(this._values));\r\n\t\t\tthis.setValuesToForm(this.getValues({raw:true}));\t\t\t\r\n\t\t}\r\n\t\tthis.firstRender = true;\r\n\t},\r\n\r\n\r\n\t//finallizing\r\n\ttriggers(){\r\n\t\treturn {\r\n\t\t\t['click ' + this.getProperty('applySelector')]:'trigger:apply',\r\n\t\t\t['click ' + this.getProperty('cancelSelector')]:'trigger:cancel',\r\n\t\t\t['click ' + this.getProperty('resetSelector')]:'trigger:reset',\r\n\t\t}\r\n\t},\r\n\r\n\t_tryFlatValues(raw){\r\n\t\treturn flattenObject(raw);\r\n\t},\r\n\t_tryUnFlatValues(raw){\r\n\t\treturn unFlattenObject(raw);\r\n\t},\r\n\trollbackToDefaultValues(){\r\n\t\tthis.clearState();\r\n\t\tlet rawvalues = this._values;\r\n\t\tlet values = this._tryFlatValues(rawvalues);\r\n\t\tthis.setState(values);\r\n\t},\r\n\tgetValues(options = {}){\r\n\t\tlet raw = this.getState();\r\n\t\tif(options.raw) return raw;\r\n\t\tlet values = this._tryUnFlatValues(raw);\r\n\t\treturn values;\r\n\t},\r\n\tonTriggerApply(){ this._apply(); },\r\n\tonTriggerCancel(){ this._cancel(); },\r\n\tonTriggerReset(){ this._reset(); },\r\n\t_apply(){\r\n\t\tlet values = this.getValues();\r\n\t\tthis.view.triggerMethod('values:apply', values);\r\n\t\tthis._tryChangeModel(values);\r\n\t},\r\n\t_cancel(){\r\n\t\tthis.rollbackToDefaultValues();\r\n\t\tlet values = this._getFullHash(this._values);\r\n\t\tthis.view.triggerMethod('values:cancel', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\t_reset(){\r\n\t\tthis.clearState();\r\n\t\tlet values = this._getFullHash({});\r\n\t\tthis.view.triggerMethod('values:reset', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\tonState(state){\r\n\t\tthis._tryChangeModel(state, {type:'property'})\r\n\t},\r\n\t_tryChangeModel(hash, options = {}){\r\n\t\tlet canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';\r\n\t\tlet canChange = this.getProperty(canChangeProp) === true;\r\n\r\n\t\tif(!canChange) return;\r\n\t\tlet model = this.getModel();\r\n\t\tif(!model) return;\r\n\r\n\t\thash = this._tryUnFlatValues(hash);\r\n\t\tif(options.clear === true)\r\n\t\t\tmodel.clear();\r\n\t\tmodel.set(hash);\r\n\r\n\t},\r\n\t_getFullHash(values = {}){\r\n\t\tlet modelHash = this.getModel() && this.getModel().toJSON();\r\n\t\tlet full = _.extend({}, this.values, this.mappings, modelHash);\r\n\t\tlet res = {};\r\n\t\t_(full).each((v,key) => res[key] = undefined);\r\n\t\treturn _.extend(res, values);\r\n\t},\r\n\r\n\r\n\t//dom manipulations\r\n\tbuildFormBindings(){\r\n\t\tthis.mappings = {};\r\n\t\tlet tags = [\"input\",\"textarea\",\"select\"];\r\n\t\tthis.$(\"[name]\").each((i, el) => {\r\n\t\t\tif(tags.indexOf(el.tagName.toLowerCase()) == -1) return;\r\n\r\n\t\t\tlet property = this.unCidle(el.name);\r\n\t\t\tif(property in this.mappings) return;\r\n\r\n\t\t\tlet info = this._getElementInfo(el, tags);\r\n\t\t\tif(info)\r\n\t\t\t\tthis.mappings[property] = info;\r\n\t\t});\r\n\t\tlet ext = {};\r\n\t\t_(this.mappings).each((context, name) => { context.values && (ext[name] = context.values); });\r\n\r\n\t\tthis.extendDefaultValues(ext);\r\n\t},\r\n\t_getElementInfo(el, tags){\r\n\t\tlet context = {\r\n\t\t\tname: el.name\r\n\t\t};\r\n\t\tlet values;\r\n\t\tlet selector = `[name=\"${el.name}\"]`;\r\n\t\tlet $found = this.$(selector);\r\n\t\tif(!$found.length) return;\r\n\r\n\t\tif($found.length > 1){\r\n\t\t\tlet foundValues = [];\r\n\t\t\tlet isArray = false;\r\n\t\t\t$found.each((i, found) => {\r\n\t\t\t\tif(tags.indexOf(found.tagName.toLowerCase()) == -1) return;\r\n\t\t\t\tlet $el = $(found);\r\n\t\t\t\tif((found.type != 'checkbox' && found.type != 'radio') || $el.prop('checked')){\r\n\t\t\t\t\tlet val = $el.val();\r\n\t\t\t\t\tisArray || (isArray = found.type === 'checkbox' || val instanceof Array);\r\n\t\t\t\t\tif(val instanceof Array)\r\n\t\t\t\t\t\tfoundValues = foundValues.concat(val);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfoundValues.push($el.val());\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tvalues = (!foundValues.length || (foundValues.length === 1 && !isArray)) \r\n\t\t\t\t\t? foundValues[0]\r\n\t\t\t\t\t: foundValues;\r\n\t\t} else {\r\n\t\t\tvalues = $found.get(0).type === 'checkbox' \r\n\t\t\t\t\t\t? ($found.prop('checked') ? [$found.val()] : [])\r\n\t\t\t\t\t\t: $found.val();\t\t\t\t\r\n\t\t}\r\n\t\tcontext.values = values;\r\n\t\tcontext.isArray = values instanceof Array;\r\n\t\tcontext.$elements = $found;\r\n\t\treturn context;\r\n\t},\r\n\tsetValuesToForm(values, options = {}){\r\n\r\n\t\t_(values).each((propertyValues, propertyName) => {\r\n\t\t\tlet property = this.mappings[propertyName];\r\n\t\t\tlet $els = property.$elements;\r\n\t\t\tlet arr = propertyValues instanceof Array ? propertyValues : [propertyValues];\r\n\t\t\t$els.each((i, el) => {\r\n\r\n\t\t\t\tthis._setValueToElement(el, i, arr);\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\t_setValueToElement(el, index, values){\r\n\t\tlet value = index < values.length && values[index];\r\n\t\tlet $el = el.jquery ? el : $(el);\r\n\t\tel = $el.get(0);\r\n\t\tif(el.type === 'checkbox' || el.type === 'radio'){\r\n\t\t\t$el.prop('checked', values.indexOf($el.val()) >= 0);\r\n\t\t}else{\r\n\t\t\t$el.val(value);\r\n\t\t}\r\n\t},\r\n\r\n\t// dom listeners\r\n\tevents:{\r\n\t\t'change':'domChange',\r\n\t\t'input':'domInput'\r\n\t},\t\r\n\tdomChange(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\tdomInput(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\t_applyValue(name, el, event){\r\n\t\tif(el.type == 'checkbox')\r\n\t\t\tthis._applyCheckboxValue(name, el, event);\r\n\t\telse\r\n\t\t\tthis._applySimpleValue(name, el, event);\r\n\t},\r\n\t_applySimpleValue(name,el,event){\r\n\t\tname = this.unCidle(name);\r\n\t\tlet $el = $(el);\r\n\t\tthis.setState(name, $el.val());\r\n\t},\r\n\t_applyCheckboxValue(name, el, event){\r\n\t\tlet selector = `input[type=checkbox][name=\"${name}\"]:checked`;\r\n\t\tlet values = this.$(selector).map((i, el) => el.value).toArray();\r\n\t\tname = this.unCidle(name);\r\n\t\tthis.setState(name, values);\r\n\t},\t\r\n\r\n});\r\n","import Behavior from './behavior';\r\nimport Draggable from './draggable';\r\nimport Droppable from './droppable';\r\nimport DynamicClass from './dynamic-class';\r\nimport FormToHash from './form-to-hash';\r\nexport default { Behavior, Draggable, Droppable, DynamicClass, FormToHash };\r\n","import Mn from 'backbone.marionette';\r\nimport mixin from './helpers/mix.js';\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport Radioable from './mixins/radioable.js';\r\n\r\nexport default mixin(Mn.Object).with(GetOptionProperty, Radioable);\r\n","\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport YatObject from '../YatObject';\r\nimport Bb from 'backbone';\r\nimport _ from 'underscore';\r\nimport YatError from '../YatError';\r\n\r\nconst IDENTITY_CHANNEL = 'identity';\r\n\r\nlet Base = mix(YatObject).with(Stateable);\r\n\r\nlet nativeAjax = $ && $.ajax;\r\n\r\nlet Identity = Base.extend({\t\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatUser();\r\n\t},\r\n\t_initializeYatUser(){},\t\r\n\tchannelName: IDENTITY_CHANNEL,\r\n\ttokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires \r\n\tisAnonym(){\r\n\t\treturn !this.getState('id');\r\n\t},\r\n\tisUser(){\r\n\t\treturn !this.isAnonym();\r\n\t},\r\n\tisMe(id){\r\n\t\treturn id && this.getState('id') === id;\r\n\t},\r\n\tupdate(hash){\r\n\t\tthis.setState(hash);\r\n\t\tthis.trigger('change');\r\n\t},\r\n\tlogIn(hash){\r\n\t\tif(!hash.id) return;\r\n\t\tthis.update(hash);\r\n\t\tthis.trigger('log:in');\r\n\t},\r\n\tlogOut(){\r\n\t\tthis.clearState();\r\n\t\tthis.trigger('change');\r\n\t\tthis.trigger('log:out');\r\n\t},\r\n\tgetBearerToken(data){\r\n\t\tlet url = this.getOption('bearerTokenUrl');\r\n\t\tlet promise = new Promise((resolve, reject) => {\r\n\t\t\tnativeAjax({url, data, method:'POST'})\r\n\t\t\t\t.then(\r\n\t\t\t\t\t(token) => { \r\n\t\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\t\tresolve(token);\r\n\t\t\t\t\t\tthis.triggerMethod('token', token);\r\n\t\t\t\t\t},\r\n\t\t\t\t\t(error) => reject(error)\r\n\t\t\t\t);\r\n\t\r\n\t\t});\r\n\t\treturn promise;\r\n\t},\r\n\r\n\tajax(...args){\r\n\t\tlet options = args[0];\r\n\t\toptions.headers = _.extend({}, options.headers, this.getAjaxHeaders());\r\n\t\tlet needRefresh = this.isTokenRefreshNeeded();\r\n\t\tif(!needRefresh){\r\n\t\t\treturn $.ajax(...args); //nativeAjax.apply($, args);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.refreshBearerToken()\r\n\t\t\t\t.then(() => nativeAjax.apply($, args))\r\n\t\t\t\t.catch((error) =>{ \r\n\t\t\t\t\tlet promise = $.Deferred();\r\n\t\t\t\t\tpromise.reject(error);\r\n\t\t\t\t\treturn promise;\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\tgetAjaxHeaders(){\r\n\t\tthis._ajaxHeaders || (this._ajaxHeaders = {});\r\n\t\treturn this._ajaxHeaders;\r\n\t},\r\n\t_updateHeaders(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tlet headers = this.getAjaxHeaders();\r\n\t\r\n\t\tif(token){\r\n\t\t\theaders.Authorization = 'Bearer ' + token;\r\n\t\t\theaders.Accept = 'application/json';\r\n\t\t}else{\r\n\t\t\tdelete headers.Authorization;\r\n\t\t}\r\n\t},\t\r\n\tsetTokenObject(token){\r\n\r\n\t\tif(token != null && _.isObject(token))\r\n\t\t\ttoken.expires = new Date(Date.now() + (token.expires_in * 1000));\r\n\r\n\t\tthis._token = token;\r\n\t\tthis._updateHeaders();\r\n\t\tthis._replaceBackboneAjax();\r\n\r\n\t\tthis.triggerMethod('tocken:change');\r\n\t},\r\n\tgetTokenObject(){\r\n\t\treturn this._token;\r\n\t},\r\n\t_replaceBackboneAjax(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token)\r\n\t\t\tBb.ajax = $.ajax;//$.ajax = nativeAjax;\r\n\t\telse\r\n\t\t\tBb.ajax = (...args) => this.ajax(...args); //$.ajax = (...args) => Yat.identity.ajax(...args);\r\n\t},\r\n\tgetTokenValue(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.access_token;\r\n\t},\r\n\tgetRefreshToken(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.refresh_token;\r\n\t},\r\n\tgetTokenExpires(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn (token || {}).expires;\r\n\t},\r\n\tgetTokenSeconds(){\r\n\t\tlet expires = this.getTokenExpires();\r\n\t\r\n\t\tif(expires == null || isNaN(expires.valueOf())) {\r\n\t\t\tconsole.warn('expires is null or wrong');\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\r\n\t\tlet offset = this.getProperty('tokenExpireOffset');\r\n\t\tif(offset == null) offset = 30000; //30 sec\r\n\t\r\n\t\tvar deadline = expires.valueOf() - offset;\r\n\t\tvar deadlineMs = deadline - Date.now();\r\n\t\treturn deadlineMs > 0 ? deadlineMs / 1000 : 0;\r\n\t},\r\n\tisTokenRefreshNeeded(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token) return false;\t\r\n\t\treturn !this.getTokenSeconds();\r\n\t},\r\n\trefreshBearerToken(){\r\n\t\tlet bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');\r\n\t\tlet doRefresh = this.isTokenRefreshNeeded();\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tif(!doRefresh){\r\n\t\t\t\tresolve();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\r\n\t\t\tif(bearerTokenRenewUrl == null){\r\n\t\t\t\treject(new Error('Token expired and `bearerTokenRenewUrl` not set'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet data = {\r\n\t\t\t\t'grant_type':'refresh_token',\r\n\t\t\t\t'refresh_token': this.getRefreshToken()\r\n\t\t\t};\r\n\t\t\tnativeAjax({\r\n\t\t\t\turl:bearerTokenRenewUrl, \r\n\t\t\t\tdata,\r\n\t\t\t\tmethod:'POST'\r\n\t\t\t})\r\n\t\t\t\t.then((token) => {\r\n\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}, () => {\r\n\t\t\t\t\tthis.triggerMethod('refresh:token:expired');\r\n\t\t\t\t\treject(YatError.Http401());\r\n\t\t\t\t});\r\n\t\r\n\t\t});\r\n\t}\r\n});\r\n\r\nlet identity = new Identity();\r\nexport default identity;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nimport GetOptionProperty from './mixins/get-option-property';\r\nexport default mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({\r\n\t\r\n\tinstantRender: false,\r\n\trenderOnReady: false,\r\n\ttriggerReady: false,\r\n\r\n\tmanualAfterInitialize: true,\r\n\r\n\tconstructor(...args){\r\n\t\t\r\n\t\tMn.View.apply(this, args);\r\n\t\t\r\n\t\tlet options = args[0];\r\n\t\tthis.mergeOptions(options, ['instantRender','renderOnReady', 'triggerReady', 'manualAfterInitialize']);\r\n\r\n\t\tif(this.manualAfterInitialize === true)\r\n\t\t\tthis._afterInitialize();\r\n\r\n\t},\r\n\t_afterInitialize(){\r\n\r\n\t\tif(this.instantRender === true)\r\n\t\t\tthis.render();\r\n\r\n\t\tif(this.renderOnReady === true)\r\n\t\t\tthis.once('ready',this.render);\r\n\r\n\t\tif(this.renderOnReady === true || this.triggerReady === true)\r\n\t\t\tthis.trigger('ready', this);\r\n\t\t\t\r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport flat from './functions/common/flatten-unflatten/flatten-object';\r\nimport unflat from './functions/common/flatten-unflatten/unflatten-object';\r\nimport getByPath from './functions/common/set-get-by-path/get-by-path';\r\nimport setByPath from './functions/common/set-get-by-path/set-by-path';\r\nimport YatObject from './YatObject';\r\n\r\nconst YatConfig = YatObject.extend({\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['name', 'channelName', 'noRadio']);\r\n\t\tif(this.noRadio !== true && this.channelName == null)\r\n\t\t\tthis.channelName = name;\r\n\t},\r\n\tgetStore(){\r\n\t\tthis.store || (this.store = {});\r\n\t\treturn this.store;\r\n\t},\r\n\tradioRequest: {\r\n\t\tget(...args){ this.get(...args); },\r\n\t\tset(path, value){ this.set(path,value); }\r\n\t},\r\n\tget(path, ...args){\r\n\t\tlet store = this.getStore();\r\n\t\tlet value = getByPath(store, path);\r\n\t\tif(_.isFunction(value)){\r\n\t\t\tvalue = value.apply(this, args);\r\n\t\t}\r\n\t\t\r\n\t\treturn value;\r\n\t},\r\n\tset(path, value){\r\n\t\tlet store = this.getStore();\r\n\t\tlet result = setByPath(store, path, value);\r\n\t\tthis.triggerSet(path, value);\r\n\t},\r\n\ttriggerSet(path, value){\r\n\t\tif(!path) return;\r\n\t\tlet arr = path.split('/');\r\n\t\tlet radio = this.getChannel();\r\n\t\tdo{\r\n\t\t\tlet event = arr.join(':');\r\n\t\t\tthis.triggerMethod(event, value);\r\n\t\t\tradio && radio.trigger(event, value);\r\n\t\t\tarr.pop();\r\n\t\t}while(arr.length > 0)\r\n\t}\r\n});\r\n\r\nexport default function(name, options = {}){\r\n\toptions.name = name;\t\r\n\treturn new YatConfig(options);\r\n}\r\n","import Config from './../../YatConfig';\r\n\r\nconst config = new Config('yat:modals:singleton',{ noRadio: true });\r\n\r\nlet modalsShowFull = {\r\n\tbg: true,\r\n\tclose:true,\r\n}\r\n\r\nlet modalsShowSimple = {\r\n\tbg:false,\r\n\tclose:false,\r\n}\r\n\r\nlet modalOptionsDefault = {\r\n\tcloseOnClickOutside: true,\r\n\tcloseOnPromise: true,\r\n\tpreventClose: false,\r\n\tasPromise: false,\r\n};\r\n\r\nlet modalsCssDefaults = {\r\n\twrapper:'yat-modal-wrapper',\r\n\tbg:'yat-modal-bg',\r\n\tcontentWrapper:'yat-modal-content-wrapper',\r\n\tclose: 'yat-modal-close',\r\n\theader: 'yat-modal-header',\r\n\tcontent: 'yat-modal-content',\r\n\tactions: 'yat-modal-actions',\r\n\tresolve: 'yat-modal-resolve',\r\n\treject: 'yat-modal-reject',\r\n}\r\n\r\nlet modalsLabelsDefaults = {\r\n\tclose: '×',\r\n\tresolve: 'ok',\r\n\treject: 'cancel'\r\n}\r\n\r\nlet modalsTypes = {\r\n\tfull: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tsimple: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowSimple,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tconfirm: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: {\r\n\t\t\tcloseOnClickOutside: true,\r\n\t\t\tcloseOnPromise: true,\r\n\t\t\tpreventClose: false,\r\n\t\t\tasPromise: true,\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\nconfig.set('types.full', modalsTypes.full);\r\nconfig.set('types.simple', modalsTypes.simple);\r\nconfig.set('types.confirm', modalsTypes.confirm);\r\n\r\nconfig.set('defaultShow', modalsShowFull);\r\nconfig.set('defaultCss', modalsCssDefaults);\r\nconfig.set('defaultLabels', modalsLabelsDefaults);\r\n\r\nexport default config;\r\n","import _ from 'underscore';\r\nimport config from './config';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\nimport YatView from './../../YatView.js';\r\nimport mix from './../../helpers/mix';\r\nimport OptionProperty from './../../mixins/get-option-property';\r\nlet template = _.template(\r\n`<% if(show.bg) {%> data-role=\"modal-bg\">
<% } %>\r\n data-role=\"modal-content-wrapper\">\r\n\t<% if(show.close) {%>
<% } %>\r\n\t<% if(show.header) {%>
data-role=\"modal-header\"><%= header %><% } %>\r\n\t
data-role=\"modal-content\"><%= text %>
\r\n\t<% if(show.actions) {%>\r\n\t
data-role=\"modal-actions\">\r\n\t\t<% if(show.resolve) {%><% } %>\r\n\t\t<% if(show.reject) {%><% } %>\r\n\t
\r\n\t<% } %>\r\n
\r\n`);\r\n\r\n\r\n\r\nconst ModalView = mix(YatView).with(OptionProperty).extend({\r\n\r\n\trenderOnReady: true,\r\n\ttemplate: template,\r\n\r\n\tattributes(){\r\n\t\treturn {'data-role':'modal-wrapper'};\r\n\t},\r\n\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['content', 'header', 'text']);\r\n\t\t\r\n\t\tlet _this = this;\r\n\r\n\t\tif(this.getOption('asPromise') === true){\r\n\t\t\tthis.promise = new Promise(function(resolve, reject){\r\n\t\t\t\t_this.once('resolve',(arg) => resolve(arg));\r\n\t\t\t\t_this.once('reject',(arg) => reject(arg));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.once('resolve reject',(arg, destroying) => {\r\n\t\t\tthis.preventClose = false;\r\n\t\t\t\r\n\t\t\tif(this.getConfigValue('options','closeOnPromise') && !destroying){\r\n\t\t\t\tthis.destroy();\r\n\t\t\t}\t\t\t\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tcanBeClosed(){\r\n\t\treturn this.getConfigValue('options','preventClose') !== true;\r\n\t},\r\n\tdestroy(opts = {}){\r\n\t\t\r\n\t\tif(!this.canBeClosed() && opts.force !== true) return;\r\n\r\n\t\treturn YatView.prototype.destroy.apply(this, arguments);\r\n\r\n\t},\r\n\tui:{\r\n\t\t'bg': '[data-role=\"modal-bg\"]',\r\n\t\t'contentWrapper': '[data-role=\"modal-content-wrapper\"]',\t\t\r\n\t\t'text':'[data-role=\"modal-content\"]',\r\n\t\t'header':'[data-role=\"modal-header\"]',\r\n\t\t'close':'[data-role=\"modal-close\"]',\r\n\t\t'resolve':'[data-role=\"modal-resolve\"]',\r\n\t\t'reject':'[data-role=\"modal-reject\"]',\r\n\t},\r\n\ttriggers:{\r\n\t\t'click @ui.close':{ event: 'click:close', stopPropagation: true },\r\n\t\t'click @ui.reject':{ event: 'click:reject', stopPropagation: true },\r\n\t\t'click @ui.resolve':{ event: 'click:resolve', stopPropagation: true },\r\n\t\t'click @ui.text':{ event: 'click:content', stopPropagation: true },\r\n\t\t'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },\r\n\t\t'click @ui.bg':{ event: 'click:bg', stopPropagation: true },\r\n\t\t'click': { event: 'click:wrapper', stopPropagation: true },\r\n\t},\r\n\tregions:{\r\n\t\t'content':'[data-role=\"modal-content\"]'\r\n\t},\r\n\tonBeforeDestroy(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'), true);\r\n\t},\r\n\r\n\tonClickClose(){ this.destroy(); },\r\n\r\n\tonClickResolve(){ \r\n\t\tthis.trigger('resolve', this.getProperty('resolve'));\r\n\t},\r\n\tonClickReject(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'));\r\n\t},\r\n\r\n\tonClickBg(){ this.clickedOutsideOfModal(); },\r\n\tonClickWrapper(){ this.clickedOutsideOfModal(); },\r\n\r\n\tclickedOutsideOfModal(){\r\n\t\tif(this.getConfigValue('options','closeOnClickOutside') === true)\r\n\t\t\tthis.destroy();\r\n\r\n\t},\r\n\r\n\r\n\tonBeforeRender(){\r\n\t\t//apply wrapper class here;\r\n\t\tlet cfg = this.getConfig();\r\n\t\tcfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);\r\n\t\t\r\n\t\tthis.$el.appendTo($('body'));\r\n\t},\r\n\tonRender(){\r\n\t\tif(this.content instanceof Bb.View){\r\n\t\t\tthis.showChildView('content', this.content);\r\n\t\t\tthis.content.inModal = this;\r\n\t\t}\r\n\t},\r\n\t\r\n\t_getModalOptions(){\r\n\t\tlet h = {};\r\n\t\tif(this.getOption('closeOnClickOutside') != null)\r\n\t\t\th.closeOnClickOutside = this.getOption('closeOnClickOutside');\r\n\t\tif(this.getOption('closeOnPromise') != null)\r\n\t\t\th.closeOnPromise = this.getOption('closeOnPromise');\r\n\t\tif(this.getOption('preventClose') != null)\r\n\t\t\th.preventClose = this.getOption('preventClose');\r\n\t\tif(this.getOption('asPromise') != null)\r\n\t\t\th.asPromise = this.getOption('asPromise');\r\n\r\n\t\treturn h;\r\n\t},\r\n\tgetConfigValue(section, name){\r\n\t\tlet cfg = this.getConfig() || {};\r\n\t\treturn (cfg[section] || {})[name];\r\n\t},\r\n\tgetConfig(key){\t\t\r\n\t\tif(this.config) return this.config;\r\n\r\n\t\tlet typeName = this.getOption('type') || 'simple';\r\n\t\tlet type = _.extend({},config.get('types.' + typeName) || {});\r\n\r\n\t\ttype.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));\r\n\t\ttype.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));\r\n\t\ttype.css= _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));\r\n\t\t\r\n\t\ttype.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());\r\n\r\n\t\tif(type.show.header == null && this.getOption('header'))\r\n\t\t\ttype.show.header = true;\r\n\t\t\r\n\t\tif(type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise))\r\n\t\t\ttype.show.resolve = true;\r\n\t\tif(type.show.reject == null && this.getOption('reject'))\r\n\t\t\ttype.show.reject = true;\r\n\r\n\t\tif(type.show.actions == null && (type.show.resolve || type.show.reject))\r\n\t\t\ttype.show.actions = true;\r\n\r\n\t\treturn this.config = type;\r\n\t},\r\n\r\n\ttemplateContext(){\r\n\t\tlet cfg = this.getConfig();\r\n\t\treturn {\r\n\t\t\tcss(name){\r\n\t\t\t\treturn cfg.css[name] ? ` class=\"${cfg.css[name]}\"` : '';\r\n\t\t\t},\r\n\t\t\tlabel(name){\r\n\t\t\t\treturn cfg.labels[name] || '';\r\n\t\t\t},\r\n\t\t\tshow : cfg.show,\r\n\t\t\ttext: this.getOption('text'),\r\n\t\t\theader: this.getOption('header'),\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport default ModalView;\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport mixin from './../../helpers/mix.js';\r\nimport YatObject from './../../YatObject.js';\r\nimport Stateable from './../../mixins/stateable.js';\r\nimport YatError from './../../YatError.js';\r\nimport View from './../../YatView.js';\r\nimport __ from './../../functions/common/common.js';\r\nimport ModalView from './modalView';\r\nimport config from './config';\r\n\r\nlet ModalEngine = mixin(YatObject).with(Stateable).extend({\r\n\tconstructor(...args){\r\n\t\tthis.modals = [];\r\n\t\tYatObject.apply(this, args);\r\n\t\tthis.listenForEsc = _.bind(this._listenForEsc, this);\r\n\t\t$(() => {\r\n\t\t\tthis.doc = $(document);\r\n\t\t\tthis.doc.on('keyup', this.listenForEsc);\r\n\t\t});\r\n\t},\r\n\tchannelName:'modals',\r\n\t\r\n\tshow(...args){\r\n\t\tlet options = this._normalizeArguments(...args);\r\n\t\treturn this._create(options);\r\n\t},\r\n\tremove(modal){\r\n\r\n\t\tif(!modal)\r\n\t\t\tmodal = _.last(this.modals);\r\n\r\n\t\tmodal && modal.destroy();\r\n\t},\r\n\r\n\t_listenForEsc(e){\r\n\t\tif(e.keyCode !== 27) return;\r\n\t\t\r\n\t\tif(this.modals.length)\r\n\t\t\tthis.remove();\r\n\t},\r\n\t_create(options){\r\n\t\tlet modal = new ModalView(options);\r\n\t\tlet _this = this;\r\n\t\tthis.listenToOnce(modal, 'destroy', function(){ _this._remove(modal); })\r\n\t\tthis.modals.push(modal);\r\n\t\treturn modal;\r\n\t},\r\n\t_remove(modal){\r\n\r\n\t\tif(!modal) return;\r\n\r\n\t\tlet ind = this.modals.indexOf(modal);\r\n\t\tif(ind > -1) this.modals.splice(ind, 1);\r\n\r\n\t\tthis.stopListening(modal);\r\n\r\n\t},\r\n\t_normalizeArguments(...args){\r\n\t\t\r\n\t\tlet options = {};\r\n\t\tlet len = args.length;\r\n\t\tif(!len)\r\n\t\t\treturn;\r\n\r\n\t\tif(len === 1){\r\n\t\t\tif(__.isView(args[0]))\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\telse if(_.isString(args[0]))\r\n\t\t\t\toptions.text = args[0];\r\n\t\t\telse if(_.isObject(args[0]))\r\n\t\t\t\t_.extend(options, args[0]);\r\n\t\t} else if (len === 2){\r\n\t\t\tif(_.isString(args[0]) && _.isString(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.text = args[1];\r\n\t\t\t}else if(_.isString(args[0]) && __.isView(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.content = args[1];\r\n\t\t\t}else if(_.isString(args[1]) && __.isView(args[0])){\r\n\t\t\t\toptions.header = args[1];\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}else if(_.isString(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\tif(__.isView(options.content))\r\n\t\t\t\t\toptions.header = args[0];\r\n\t\t\t\telse\r\n\t\t\t\t\toptions.text = args[0];\r\n\t\t\t}else if(__.isView(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif(_.isObject(args[3]))\r\n\t\t\t\t_.extend(options, args[3]);\r\n\t\t\tif(_.isObject(args[2]))\r\n\t\t\t\t_.extend(options, args[2]);\r\n\t\t\telse if(_.isString(args[2]))\r\n\t\t\t\toptions.type = args[2];\r\n\r\n\t\t\tlet two = this._normalizeArguments(args[0], args[1]);\r\n\t\t\t_.extend(options, two);\r\n\t\t}\r\n\r\n\t\treturn options;\r\n\t},\r\n\tonBeforeDestroy(){\r\n\t\tif(this.doc)\r\n\t\t\tthis.doc.off('keyup',this.listenForEsc);\r\n\t}\r\n});\r\n\r\nconst modalEngine = new ModalEngine();\r\n\r\n\r\nexport default {\r\n\tshow(...args){\r\n\t\treturn modalEngine.show(...args);\r\n\t},\r\n\taddTypeConfig(name, cfg){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\tconfig.set('types.'+name,cfg);\r\n\t},\r\n\tgetTypeConfig(name){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\treturn config.get('types.'+name);\r\n\t},\r\n};\r\n","import TemplateContext from './template-context';\r\nimport identity from './identity';\r\nimport modals from './modals/modals';\r\nexport default { TemplateContext, identity, modals };\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Bb from 'backbone';\r\nimport mixin from './helpers/mix.js';\r\n\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport RadioMixin from './mixins/radioable.js';\r\nimport Startable from './mixins/startable.js';\r\nimport Childrenable from './mixins/childrenable.js';\r\n\r\nlet Base = mixin(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);\r\n\r\nexport default Base.extend({\r\n\r\n\tinitRadioOnInitialize: true,\r\n\t_initRegion(opts = {skip:true}){\r\n\t\tif(opts.skip) return;\r\n\t\tvar region = this.getProperty('region');\r\n\t\tthis.region = region;\r\n\t\tBase.prototype._initRegion();\r\n\t}, \r\n\r\n\tgetRegion() {\r\n\t\tif(!this._region) this._initRegion({skip:false});\r\n\t\treturn this._region;\r\n\t},\r\n\r\n\taddPageManager(pageManager){\r\n\t\tthis._pageManagers || (this._pageManagers = []);\r\n\t\tthis._pageManagers.push(pageManager);\r\n\r\n\t\tlet prefix = pageManager.getName();\r\n\t\tif(!prefix){\r\n\t\t\tconsole.warn('pageManager prefix not defined');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.listenTo(pageManager, 'all', (eventName, ...args) => {\r\n\t\t\tlet prefixedEventName = prefix + ':' + eventName;\r\n\t\t\tthis.triggerMethod(prefixedEventName, ...args);\r\n\t\t});\r\n\t\tthis.listenTo(pageManager, 'state:currentPage',(...args) => this.triggerMethod('page:swapped',...args));\r\n\t\t\r\n\t},\r\n\r\n\thasPageManagers(){\r\n\t\treturn this._pageManagers && this._pageManagers.length > 0;\r\n\t},\r\n\r\n\tgetMenuTree(opts = {rebuild:false}){\r\n\t\tif(this._menuTree && !opts.rebuild) return this._menuTree;\r\n\t\tlet managers = this._pageManagers || [];\r\n\t\tlet links = _(managers).chain().map((manager) => manager.getLinks()).flatten().value();\r\n\t\tthis._menuTree = new Bb.Collection(links);\r\n\t\treturn this._menuTree;\r\n\t},\r\n\r\n\tgetPage(key){\r\n\t\tif(!this.hasPageManagers()) return;\r\n\t\treturn _(this._pageManagers).find((mngr) => mngr.getPage(key));\r\n\t},\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nexport default Mn.AppRouter.extend({},{\r\n\tcreate(hash, context){\r\n\t\tlet appRoutes = {};\r\n\t\tlet controller = {};\r\n\t\tlet _this = this;\r\n\t\t_(hash).each((handlerContext, key) => {\r\n\t\t\tappRoutes[key] = key;\r\n\t\t\tcontroller[key] = (...args) => {\r\n\t\t\t\thandlerContext\r\n\t\t\t\t.action(...args)\r\n\t\t\t\t.catch((error) => {\r\n\t\t\t\t\t_this._catchError(error, context);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn new this({controller, appRoutes});\r\n\t},\r\n\t_catchError(error, context){\r\n\t\tif(!context || context.getProperty('throwChildErrors') === true){\r\n\t\t\tthrow error;\r\n\t\t}else{\r\n\t\t\tlet postfix = error.status ? \":\" + error.status.toString() : '';\r\n\t\t\tlet commonEvent = 'error';\r\n\t\t\tlet event = commonEvent + postfix;\r\n\r\n\t\t\tcontext.triggerMethod(commonEvent, error, this);\r\n\r\n\t\t\tif(event != commonEvent) \r\n\t\t\t\tcontext.triggerMethod(event, error, this);\r\n\r\n\t\t}\r\n\r\n\t}\r\n});\r\n","import Bb from 'backbone';\r\nexport default Bb.Model.extend({});\r\n\r\n","import Model from './model'\r\nexport default Model.extend({\r\n\tdefaults:{\r\n\t\turl: undefined,\r\n\t\tlabel: undefined,\r\n\t\ttarget: '_self',\r\n\t\tlevel: 0,\r\n\t},\r\n\tdestroy(){\r\n\t\tthis.id = null;\r\n\t\tModel.prototype.destroy.apply(this, arguments);\r\n\t}\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp.js';\r\nimport mixin from './helpers/mix';\r\nimport Startable from './mixins/startable';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter.js';\r\nimport LinkModel from './models/link';\r\nimport Bb from 'backbone';\r\nimport identity from './singletons/identity';\r\n\r\n/* \r\n\tYatPage\r\n*/\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nexport default Base.extend({\r\n\r\n\tconstructor(...args){\r\n\t\tBase.apply(this,args);\r\n\t\tthis.initializeYatPage();\r\n\t},\r\n\r\n\tallowStopWithoutStart: true,\r\n\tallowStartWithoutStop: true,\r\n\r\n\tinitializeYatPage(opts){\r\n\t\tthis.mergeOptions(opts, [\"manager\"]);\r\n\t\tthis._initializeModels(opts);\r\n\t\tthis._initializeRoute(opts);\r\n\t\tthis._proxyEvents();\r\n\t\tthis._tryCreateRouter();\r\n\t\tthis._registerIdentityHandlers();\t\t\r\n\t},\r\n\r\n\tgetLayout(opts = {rebuild: false}){\r\n\t\tif(!this._layoutView || opts.rebuild || (this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed())){\r\n\t\t\tthis.buildLayout();\r\n\t\t}\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayout(){\r\n\t\tlet Layout = this.getProperty('Layout');\r\n\t\tif(Layout == null) return;\r\n\t\tlet opts = _.extend({},this.getProperty('layoutOptions'));\r\n\r\n\t\tif(this.model && !opts.model)\r\n\t\t\t_.extend(opts,{model: this.model});\r\n\r\n\t\tif(this.collection && !opts.collection)\r\n\t\t\t_.extend(opts,{collection: this.collection});\r\n\t\t\t\r\n\t\tlet options = this.buildLayoutOptions(opts);\r\n\t\toptions.page = this;\r\n\t\tthis._layoutView = new Layout(options);\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayoutOptions(rawOptions){\r\n\t\treturn rawOptions;\r\n\t},\r\n\r\n\taddModel(model, opts = {}){\t\t\t\t\r\n\t\tif(!model) return;\r\n\t\tthis.model = model;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchModelOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(model.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\taddCollection(collection, opts = {}){\r\n\t\tif(!collection) return;\r\n\t\tthis.collection = collection;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(collection.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\tfreezeWhileStarting: true,\r\n\tfreezeUI(){ },\r\n\tunFreezeUI(){ },\r\n\r\n\tgetRouteHash(){\r\n\r\n\t\tlet hashes = [{},this._routeHandler].concat(this.getChildren({startable:false}).map((children) => children.getRouteHash()))\r\n\t\treturn _.extend(...hashes);\r\n\r\n\t},\r\n\r\n\thasRouteHash(){\r\n\t\treturn _.isObject(this.getRouteHash())\r\n\t},\r\n\r\n\tgetLinkModel(level = 0){\r\n\t\tif(!this._canHaveLinkModel()) return;\t\t\r\n\t\tif(this._linkModel) return this._linkModel;\r\n\r\n\t\tlet url = this.getRoute();\r\n\t\tlet label = this.getLabel();\r\n\t\tlet children = this._getSublinks(level);\r\n\t\tthis._linkModel = new LinkModel({ url, label, level, children });\r\n\r\n\t\treturn this._linkModel;\r\n\t},\r\n\t_canHaveLinkModel(){\r\n\t\treturn !((this.getProperty('skipMenu') === true) || (!!this.getProperty('isStartNotAllowed')));\r\n\t},\r\n\t_destroyLinkModel(){\r\n\t\tif(!this._linkModel) return;\r\n\t\tthis._linkModel.destroy();\r\n\t\tdelete this._linkModel;\r\n\t},\r\n\r\n\tgetParentLinkModel(){\r\n\t\tlet parent = this.getParent();\r\n\t\tif(!parent || !parent.getLinkModel) return;\r\n\t\tlet model = parent.getLinkModel();\r\n\t\treturn model;\r\n\t},\r\n\r\n\tgetNeighbourLinks(){\r\n\t\tlet link = this.getLinkModel();\r\n\t\tif(link && link.collection) return link.collection;\r\n\t},\r\n\r\n\tgetChildrenLinks(){\r\n\t\tlet model = this.getLinkModel();\r\n\t\tif(!model) return;\r\n\t\treturn model.get('children');\r\n\t},\r\n\r\n\t_getSublinks(level){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children || !children.length) return;\r\n\t\tlet sublinks = _(children).chain()\r\n\t\t\t.filter((child) => child.getProperty(\"skipMenu\") !== true)\r\n\t\t\t.map((child) => child.getLinkModel(level + 1))\r\n\t\t\t.value();\r\n\t\tif(!sublinks.length) return;\r\n\t\tlet col = new Bb.Collection(sublinks);\r\n\t\treturn col;\r\n\t},\r\n\r\n\t_initializeModels(opts = {}){\r\n\t\tthis.addModel(opts.model, opts);\r\n\t\tthis.addCollection(opts.collection, opts);\r\n\t},\r\n\r\n\t_initializeRoute(){\r\n\t\tlet route = this.getRoute({asPattern:true});\r\n\t\tif(route == null) return;\r\n\t\tlet page = this;\r\n\t\tthis._routeHandler = {\r\n\t\t\t[route]:{context: page, action: (...args) => page.start(...args) }\r\n\t\t};\r\n\t},\r\n\r\n\tgetRoute(opts = {asPattern:false}){\r\n\t\tlet relative = this.getProperty('relativeRoute');\r\n\t\tlet route = this.getProperty('route');\r\n\t\tlet parent = this.getParent();\r\n\t\tif(route == null) return;\r\n\t\t\r\n\t\tlet result = route;\r\n\r\n\t\tif(relative && parent && parent.getRoute){\r\n\t\t\tlet parentRoute = parent.getRoute();\r\n\t\t\tresult = parentRoute + '/' + route;\t\t\t\r\n\t\t}\r\n\r\n\t\treturn this._normalizeRoute(result, opts);\r\n\t},\r\n\t_normalizeRoute(route, opts){\t\t\r\n\t\troute = route.replace(/\\/+/gmi,'/').replace(/^\\//,'');\r\n\t\tif(opts.asPattern){\r\n\t\t\treturn route;\r\n\t\t}\r\n\t\telse{\r\n\t\t\tlet res = route.replace(/\\(\\/\\)/gmi,'/').replace(/\\/+/gmi,'/');\r\n\t\t\treturn res;\r\n\t\t}\r\n\t},\r\n\t_tryCreateRouter(){\r\n\t\tlet create = this.getProperty('createRouter') === true;\r\n\t\tif(create){\r\n\t\t\tthis.router = this._createAppRouter();\r\n\t\t}\r\n\t},\r\n\r\n\t_createAppRouter(){\r\n\t\tlet hash = this.getRouteHash();\r\n\t\tif(!_.size(hash)) return;\r\n\t\treturn new Router(hash);\r\n\t},\r\n\r\n\t_proxyEvents(){\r\n\t\tlet proxyContexts = this._getProxyContexts();\r\n\t\tthis._proxyEventsTo(proxyContexts);\r\n\t},\r\n\t_getProxyContexts(){\r\n\t\tlet rdy = [];\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager){\r\n\t\t\trdy.push({context:manager})\r\n\t\t}\r\n\t\tlet radio = this.getChannel();\r\n\t\tif(radio){\r\n\t\t\tlet allowed = this.getProperty('proxyEventsToRadio');\r\n\t\t\trdy.push({context:radio, allowed });\r\n\t\t}\r\n\t\treturn rdy;\r\n\t},\r\n\t_proxyEventsTo(contexts){\r\n\t\tlet all = [];\r\n\t\tlet eventsHash = {};\r\n\r\n\t\t_(contexts).each((context) => {\r\n\t\t\tlet events = [];\r\n\t\t\tif(!context.allowed)\r\n\t\t\t\tall.push(context.context);\r\n\t\t\telse {\r\n\t\t\t\t_(context.allowed).each(function(allowed){\r\n\t\t\t\t\teventsHash[allowed] || (eventsHash[allowed] = []);\r\n\t\t\t\t\teventsHash[allowed].push(context.context)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet page = this;\r\n\t\tpage.on('all', (eventName, ...args) => {\r\n\t\t\tlet contexts = (eventName in eventsHash) ? eventsHash[eventName] : all;\r\n\t\t\tlet triggerArguments = [page].concat(args);\r\n\t\t\t_(contexts).each((context) => context.triggerMethod(`page:${eventName}`, ...triggerArguments))\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\tlet add = {};\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager) add.manager = manager;\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), add);\r\n\t},\t\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis._destroyLinkModel();\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t});\r\n\t}\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter';\r\nimport mixin from './helpers/mix';\r\nimport identity from './singletons/identity';\r\nimport YatError from './YatError';\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nlet YatPageManager = Base.extend({\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatPageManager(...args);\r\n\t},\r\n\tthrowChildErrors:true,\r\n\tcreateRouter(){\r\n\t\tlet children = this.getChildren({startable:false});\r\n\t\tlet hash = {};\r\n\t\t_(children).each(function(page){\r\n\t\t\tif(_.isFunction(page.getRouteHash)){\r\n\t\t\t\t_.extend(hash, page.getRouteHash());\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._routesHash = hash;\t\t\r\n\t\tthis.setRouter(Router.create(hash, this));\r\n\t},\r\n\tsetRouter(router){\r\n\t\tthis.router = router;\r\n\t},\r\n\tgetRouter(){\r\n\t\treturn this.router;\r\n\t},\r\n\tgetLinks(){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children) return;\r\n\t\treturn _(children).chain()\t\t\t\r\n\t\t\t.map((child) => child.getLinkModel())\r\n\t\t\t.filter((child) => !!child)\r\n\t\t\t.value();\r\n\t},\r\n\texecute(route){\r\n\t\tlet page = this.getPage(route);\r\n\t\tif(!!page) \r\n\t\t\tpage.start({text: error.message});\r\n\t\telse if(route === '*NotFound')\r\n\t\t\tthrow new YatError.NotFound('*NotFound handler is missing');\r\n\t\telse\r\n\t\t\tthis.execute('*NotFound');\r\n\t},\r\n\tnavigate(url, opts = {trigger:true}){\r\n\r\n\t\tlet router = this.getRouter();\r\n\t\tif(router)\r\n\t\t\trouter.navigate(url, opts);\r\n\t\telse\r\n\t\t\tconsole.warn('router not found');\r\n\t},\r\n\r\n\tgetPage(key){\r\n\r\n\t\tlet found = _(this._routesHash)\r\n\t\t\t.find((pageContext, route) => {\r\n\t\t\t\tif(route === key) return true;\r\n\t\t\t\tif(pageContext.context.getName() === key) return true;\r\n\t\t\t});\r\n\t\treturn found && found.context;\r\n\r\n\t},\r\n\r\n\r\n\tnavigateToRoot(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tlet rootUrl = this.getProperty('rootUrl');\r\n\t\tif(!rootUrl){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\tif(children && children.length) {\r\n\t\t\t\tlet root = children.find((child) => child != current);\r\n\t\t\t\trootUrl = root && root.getRoute()\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(rootUrl != null)\r\n\t\t\tthis.navigate(rootUrl);\r\n\t\telse\r\n\t\t\tconsole.warn('root page not found');\r\n\t},\r\n\r\n\t_initializeYatPageManager(opts = {}){\r\n\t\tthis.mergeOptions(opts, ['id','name','label']);\r\n\t\tthis._registerPageHandlers(opts);\r\n\t\tthis._registerIdentityHandlers();\r\n\t\tthis.createRouter();\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), {\r\n\t\t\tmanager: this\r\n\t\t});\r\n\t},\t\r\n\r\n\t_registerPageHandlers(){\r\n\t\tthis.on('page:before:start', this._pageBeforeStart);\r\n\t\tthis.on('page:start', this._pageStart);\r\n\t\tthis.on('page:start:decline', this._pageDecline);\r\n\t},\r\n\r\n\t_pageBeforeStart(page){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(current && current != page){\r\n\t\t\tcurrent.stop();\r\n\t\t}\r\n\t},\r\n\r\n\t_pageStart(page){\r\n\t\tthis.setState('currentPage', page);\r\n\t},\r\n\r\n\t_pageDecline(...args){\r\n\t\t//console.log(\"decline\", args)\r\n\t},\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t\tthis._moveToRootIfCurrentPageNotAllowed();\r\n\t\t});\r\n\t},\r\n\t\r\n\t_moveToRootIfCurrentPageNotAllowed(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(!current || !current.isStartNotAllowed()) return;\r\n\t\t\r\n\t\tthis.navigateToRoot();\r\n\t}\r\n\r\n});\r\n\r\nexport default YatPageManager;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nexport default mix(Mn.NextCollectionView).with(GlobalTemplateContext);\r\n","import Bb from 'backbone';\r\nexport default Bb.Collection.extend({});\r\n","import _ from 'underscore';\r\nimport YatObject from './YatObject';\r\nimport Collection from './models/collection';\r\n\r\nvar CollectionGroups = YatObject.extend({\r\n\r\n\tcollection: undefined,\r\n\tgroupBy: undefined,\r\n\r\n\tgetGroups(){ return this.groups; },\r\n\tgetGroup(name){\r\n\t\tlet groups = this.getGroups();\r\n\t\treturn groups[name];\r\n\t},\r\n\tisGroupExists(name){ return name in this.getGroups(); },\r\n\taddGroup(name, models) {\r\n\t\tif(this.isGroupExists(name)) return;\r\n\t\tlet groups = this.getGroups();\r\n\t\tgroups[name] = this._createGroup(name, models);\r\n\t\treturn groups[name];\r\n\t},\r\n\tremoveGroup(name){\r\n\t\tlet group = this.getGroup(name);\r\n\t\t\r\n\t\tif(!group) return;\r\n\r\n\t\tif(_.isFunction(group.destroy))\r\n\t\t\tgroup.destroy();\r\n\t\telse if(_.isFunction(group.stopListening))\r\n\t\t\tgroup.stopListening();\r\n\r\n\t\tdelete this.groups[name];\r\n\t},\t\r\n\r\n\r\n\tgroup() {\r\n\t\tlet result = {};\r\n\t\tlet colGroups = this.collection.groupBy(this.groupBy);\r\n\t\tlet optionGroups = this.getOption('groups');\r\n\t\t_(optionGroups).each((name) => {\r\n\t\t\tif (name in colGroups){\r\n\t\t\t\tresult[name] = colGroups[name];\r\n\t\t\t\tdelete colGroups[name];\r\n\t\t\t}\r\n\t\t\telse result[name] = [];\r\n\t\t});\r\n\t\t_(colGroups).each((models, name) => result[name] = models);\r\n\t\treturn result;\r\n\t},\r\n\r\n\tconstructor: function(options) {\r\n\t\tYatObject.apply(this, arguments);\r\n\t\tthis._initializeGrouppedCollection(options);\r\n\t},\r\n\t_initializeGrouppedCollection(options) {\r\n\t\tif (this._initializedGC == true) return;\r\n\r\n\t\toptions || {};\r\n\t\tthis.mergeOptions(options, ['collection', 'groupBy']);\r\n\t\tthis._ensureOptions();\r\n\t\tthis._initializeGroups();\r\n\t\tthis._initializeEventHandlers();\r\n\r\n\t\tthis._initializedGC == true\r\n\t},\r\n\t_ensureOptions() {\r\n\t\tif (!this.collection)\r\n\t\t\tthrow new Error('collection must be set');\r\n\r\n\t\tif (!this.groupBy)\r\n\t\t\tthrow new Error('groupBy must be set');\r\n\r\n\t\tif (typeof this.groupBy === 'string') {\r\n\t\t\tvar propertyName = this.getOption('groupBy');\r\n\t\t\tthis.groupBy = (model) => model.get(propertyName);\r\n\t\t}\r\n\r\n\t},\r\n\t_initializeGroups() {\r\n\t\tthis.groups = {};\r\n\t\tvar groups = this.group();\r\n\t\t_(groups).each((models, name) => this.addGroup(name, models));\r\n\t},\r\n\t_getCollectionClass(){\r\n\t\treturn this.getOption('CollectionClass') || Collection;\r\n\t},\r\n\t_createGroup(name,models){\r\n\t\tlet groupBy = this.groupBy;\r\n\t\tlet Collection = this._getCollectionClass();\r\n\t\tlet groupCol = new Collection(models);\r\n\t\tgroupCol.on('change', (model) => {\r\n\t\t\tif (groupBy(model) !== name)\r\n\t\t\t\tgroupCol.remove(model);\r\n\t\t});\r\n\t\tgroupCol.name = name;\r\n\t\treturn groupCol;\r\n\t},\r\n\r\n\t_initializeEventHandlers() {\r\n\t\tthis.listenTo(this.collection, 'update', this._onCollectionUpdate);\r\n\t},\r\n\t_onCollectionUpdate(col, opts) {\r\n\t\t\r\n\t\tvar data = (opts.changes.added || []).concat(opts.changes.merged || []);\r\n\r\n\t\tvar toAdd = _(data).groupBy(this.groupBy);\r\n\t\tvar toRemove = _(opts.changes.removed).groupBy(this.groupBy);\r\n\r\n\t\tvar groups = this.groups;\r\n\t\tvar addOutOfGroup = {};\r\n\t\t_(toAdd).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].add(models);\r\n\t\t\telse if(this.getOption('autoCreateNewGroups'))\r\n\t\t\t\tthis.addGroup(groupName, models);\r\n\t\t});\r\n\t\t\r\n\t\t_(toRemove).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].remove(models);\r\n\t\t});\r\n\t},\r\n\t_onModelChange(model) {\r\n\t\tvar groupName = this.groupBy(model);\r\n\t\tif (this.groups[groupName])\r\n\t\t\tthis.groups[groupName].add(model);\r\n\t\telse {\r\n\t\t\tconsole.warn('model is out of groupping', model, groupName);\r\n\t\t}\r\n\t},\r\n\tdestroy() {\r\n\r\n\t\t_(this.groups).each((group) => {\r\n\t\t\tgroup.stopListening();\r\n\t\t\tif (_.isFunction(group.destroy))\r\n\t\t\t\tgroup.destroy();\r\n\t\t});\r\n\t\tdelete this.groups;\r\n\r\n\t\tif(_.isFunction(YatObject.prototype.destroy))\r\n\t\t\tYatObject.prototype.destroy.apply(this, arguments);\r\n\r\n\r\n\t\tif (_.isFunction(this.collection.destroy))\r\n\t\t\tthis.collection.destroy();\r\n\r\n\t\tdelete this.collection;\r\n\r\n\t}\r\n});\r\n\r\nexport default CollectionGroups;\r\n","import {version} from '../package.json';\nimport Functions from './functions/functions';\nimport Helpers from './helpers/Helpers';\nimport Mixins from './mixins/Mixins';\nimport Behaviors from './behaviors/behaviors';\nimport Singletons from './singletons/singletons';\nimport TemplateContext from './singletons/template-context';\nimport modals from './singletons/modals/modals';\nimport identity from './singletons/identity';\nimport yatConfig from './YatConfig';\nimport YatObject from './YatObject';\nimport YatError from './YatError';\nimport YatApp from './YatApp';\nimport YatRouter from './YatRouter';\nimport YatPage from './YatPage';\nimport YatPageManager from './YatPageManager';\nimport YatView from './YatView';\nimport YatCollectionView from './YatCollectionView';\n\nimport YatModel from './models/model';\nimport YatCollection from './models/collection';\n\nimport CollectionGroups from './YatCollectionGroups';\n\n\nconst marionetteYat = {\n\tVERSION: version,\n\tFunctions: Functions,\n\tHelpers: Helpers,\n\tMixins: Mixins,\n\tBehaviors: Behaviors,\n\tSingletons: Singletons,\n\tTemplateContext: TemplateContext,\n\tmodals: modals,\n\tidentity: identity,\n\tcreateConfig: yatConfig,\n\tObject: YatObject,\n\tError: YatError,\n\tApp: YatApp,\n\tPage : YatPage,\n\tRouter: YatRouter,\n\tPageManager: YatPageManager,\n\tView: YatView,\n\tCollectionView: YatCollectionView,\n\tModel: YatModel,\n\tCollection: YatCollection,\n\tCollectionGroups, \n};\n\nexport default marionetteYat;\n"],"names":["getCompareABModel","arg","Bb","Model","Mn","View","model","getCompareABView","compareAB","a","b","func","call","viewComparator","args","compareArray","result","length","apply","Array","every","singleCompare","normalizeValue","context","value","_","isFunction","smartGet","opts","fields","fileds","Error","checked","isModel","hasOptions","isObject","options","exclude","some","fieldName","indexOf","get","default","concat","prefix","delimeter","toString","pattern","RegExp","replace","getProperty","name","setProperty","set","silent","models","push","passPath","join","setByPathArr","propertyName","pathArray","prop","force","nextName","shift","setByPath","path","extend","split","slice","chunksCount","setByPathArray","undefined","originPath","modelContext","pop","propertyEventName","substring","trigger","getByPathArray","getByPath","obj","traverse","root","hash","attributes","props","Object","getOwnPropertyNames","x","Date","flattenObject","res","unFlattenObject","e","getName","getValue","wrap","unwrap","isView","view","common","knownCtors","Collection","Router","isKnownCtor","isFn","ctor","prototype","YatError","message","Http","status","error","Http404","Http401","Http403","smartExtend","Src","Dst","mix","BaseClass","Mixed","tmp","fake","reduce","memo","Base","getLabel","Mixin","key","_getOptionOrProperty","getOption","deep","valueContext","fallback","fallbackOptions","initRadioOnInitialize","_initRadio","skip","_channel","channelName","channel","getChannel","request","initializeStateable","_state","state","_this","each","propertyValue","setState","doNotTriggerFullState","_triggerStateChange","getState","broadcast","s","triggerMethod","Stateable","STATES","STATE_KEY","getPropertyPromise","Promise","resolve","_promises1","_promises2","rawPromises","promises","promiseArg","all","addPropertyPromise","promise","Middle","with","State","initializeStartable","constructor","Startable","_registerStartableLifecycleListeners","_setLifeState","INITIALIZED","_startRuntimePromises","_startPromises","_stopPromises","reject","canNotBeStarted","_ensureStartableCanBeStarted","declineReason","isStartNotAllowed","currentState","_getLifeState","dependedOn","_getStartPromise","then","_tryMergeStartOptions","once","triggerStart","canNotBeStopped","_ensureStartableCanBeStopped","isStopNotAllowed","_getStopPromise","_tryMergeStopOptions","triggerStop","newstate","states","_isLifeState","_isLifeStateIn","STARTING","STOPPING","freezeWhileStarting","freezeUI","on","unFreezeUI","RUNNING","WAITING","DESTROYED","mergeOptions","mergeoptions","throwError","destroyed","isNotIntact","_ensureStartableIsIntact","notIdle","_isInProcess","_ensureStartableIsIdle","allowStartWithoutStop","running","allowStopWithoutStart","_getStartPromises","_getStartParentPromise","_getStartPagePromise","noruntime","_getStartRuntimePromise","parent","_getStopPromises","_getStopRuntimePromise","CHILDREN_FIELD","initializeChildrenable","_initializeParrent","_initializeChildren","children","getChildren","startable","filter","c","getParent","_children","child","childContext","_normalizeChildContext","initialized","_initializeChild","Child","_normalizeChildOptions","buildChild","Childrenable","_buildChildOptions","def","ChildClass","templateContextStore","cid","compiledContext","hasChanges","GlobalTemplateContext","viewTemplateContext","global","compile","item","newcontext","cntx","unshift","target","templateContext","TemplateContext","BaseBehavior","Behavior","GetOptionProperty","partial","arguments","fns","BaseDraggable","$doc","_$el","el","$el","jquery","HTMLElement","$","dragging","scope","isSameScope","_clearDragData","document","_defineDocumentBindings","_dragData","__b","setupDragDetection","bind","_setupDragDetection","handleMouseUp","_handleMouseUp","handleMoveAfterMouseDown","_handleMoveAfterMouseDown","handleDragMove","_handleDragMove","handleElementEnter","_handleElementEnter","handleElementLeave","_handleElementLeave","handleElementOver","_handleElementOver","_initializeDragListener","getTriggerEl","one","dragDisabled","stopPropagation","startX","pageX","startY","pageY","_handleDragEnd","_handleEndWithoutDrag","off","$context","getDragEventsContext","drop","catchDraggable","distance","_getStartPositionPixelOffset","startIfMoreThan","_startDragSession","Math","abs","y","selector","getDragEventsElementSelector","ev","$over","over","event","_createCustomDomEvent","merge","customEvent","jQuery","Event","DraggableBehavior","_onDrag","_onDragStart","_onDragEnd","shouldHandleDomEvents","newEvent","_removeGhost","removeClass","_createGhost","addClass","setGhostPosition","$ghost","remove","$g","clone","offset","top","left","css","outerWidth","outerHeight","createGhost","addClasses","appendTo","_setGhost","getGhost","DroppableBehavior","_views","v","isRendered","isAttached","draggable","dropContext","_onDrop","_initReorderBehavior","listenToOnce","reOrder","listenTo","collection","changes","sort","skipAttach","_skipFirstAttach","index","hasChildren","storedDrop","xy","getEventXY","_getDropContext","mixedDrop","keys","k","_onDropContextChange","insert","position","_getPositionByEventXY","_getDropContextByPosisiton","elOffset","elDimension","width","height","xHalf","yHalf","r","direction","childView","last","DynamicClass","changeSource","viewCls","addCls","attr","trim","updateElementClass","setup","property","applyValue","debounce","_applyValue","extendDefaultValues","_values","getModel","toJSON","firstRender","buildFormBindings","_tryFlatValues","setValuesToForm","getValues","raw","clearState","rawvalues","values","_tryUnFlatValues","_apply","_cancel","_reset","_tryChangeModel","rollbackToDefaultValues","_getFullHash","clear","type","canChangeProp","canChange","modelHash","full","mappings","tags","i","tagName","toLowerCase","unCidle","info","_getElementInfo","ext","$found","foundValues","isArray","found","val","$elements","propertyValues","$els","arr","_setValueToElement","_applyCheckboxValue","_applySimpleValue","map","toArray","Draggable","Droppable","FormToHash","mixin","Radioable","IDENTITY_CHANNEL","YatObject","nativeAjax","ajax","Identity","_initializeYatUser","isAnonym","id","update","data","url","method","token","setTokenObject","headers","getAjaxHeaders","needRefresh","isTokenRefreshNeeded","refreshBearerToken","catch","Deferred","_ajaxHeaders","getTokenValue","Authorization","Accept","expires","now","expires_in","_token","_updateHeaders","_replaceBackboneAjax","getTokenObject","access_token","refresh_token","getTokenExpires","isNaN","valueOf","warn","deadline","deadlineMs","getTokenSeconds","bearerTokenRenewUrl","doRefresh","getRefreshToken","identity","manualAfterInitialize","_afterInitialize","instantRender","render","renderOnReady","triggerReady","YatConfig","noRadio","store","getStore","triggerSet","radio","config","Config","modalsShowFull","modalsShowSimple","modalOptionsDefault","modalsCssDefaults","modalsLabelsDefaults","modalsTypes","simple","confirm","template","ModalView","YatView","OptionProperty","destroying","preventClose","getConfigValue","destroy","canBeClosed","clickedOutsideOfModal","cfg","getConfig","wrapper","content","showChildView","inModal","h","closeOnClickOutside","closeOnPromise","asPromise","section","typeName","show","labels","_getModalOptions","header","actions","ModalEngine","modals","listenForEsc","_listenForEsc","doc","_normalizeArguments","_create","modal","keyCode","_remove","ind","splice","stopListening","len","__","isString","text","two","modalEngine","Application","RadioMixin","region","_initRegion","_region","pageManager","_pageManagers","eventName","prefixedEventName","rebuild","_menuTree","managers","links","chain","manager","getLinks","flatten","hasPageManagers","find","mngr","getPage","AppRouter","appRoutes","controller","handlerContext","action","_catchError","postfix","commonEvent","App","GetNameLabel","initializeYatPage","_initializeModels","_initializeRoute","_proxyEvents","_tryCreateRouter","_registerIdentityHandlers","_layoutView","isDestroyed","buildLayout","Layout","buildLayoutOptions","page","rawOptions","fetch","addStartPromise","hashes","_routeHandler","getRouteHash","level","_canHaveLinkModel","_linkModel","getRoute","label","_getSublinks","LinkModel","getLinkModel","link","sublinks","col","addModel","addCollection","route","asPattern","start","relative","parentRoute","_normalizeRoute","create","router","_createAppRouter","size","proxyContexts","_getProxyContexts","_proxyEventsTo","rdy","allowed","contexts","eventsHash","triggerArguments","add","_destroyLinkModel","YatPageManager","_initializeYatPageManager","_routesHash","setRouter","NotFound","execute","getRouter","navigate","console","pageContext","current","rootUrl","_registerPageHandlers","createRouter","_pageBeforeStart","_pageStart","_pageDecline","stop","_moveToRootIfCurrentPageNotAllowed","navigateToRoot","NextCollectionView","CollectionGroups","groups","getGroups","isGroupExists","_createGroup","group","getGroup","colGroups","groupBy","optionGroups","_initializeGrouppedCollection","_initializedGC","_ensureOptions","_initializeGroups","_initializeEventHandlers","addGroup","_getCollectionClass","groupCol","_onCollectionUpdate","added","merged","toAdd","toRemove","removed","groupName","marionetteYat","version","Functions","Helpers","Mixins","Behaviors","Singletons","yatConfig","YatApp","YatPage","YatRouter","YatCollectionView","YatModel","YatCollection"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/marionette.yat.min.js b/dist/marionette.yat.min.js
new file mode 100644
index 0000000..65d4bc4
--- /dev/null
+++ b/dist/marionette.yat.min.js
@@ -0,0 +1,12 @@
+/**
+* @license
+* Marionette.Yat extension for Backbone.Marionette
+* Yet Another Toolkit
+* ----------------------------------
+* v0.0.32
+*
+* Distributed under MIT license
+* author: dimtabu
+*/
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("backbone"),require("backbone.marionette"),require("underscore"),require("jquery")):"function"==typeof define&&define.amd?define(["backbone","backbone.marionette","underscore","jquery"],e):t.MarionetteYat=e(t.Backbone,t.Marionette,t._,t.jQuery)}(this,function(t,e,n,i){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t,e=e&&e.hasOwnProperty("default")?e.default:e,n=n&&n.hasOwnProperty("default")?n.default:n,i=i&&i.hasOwnProperty("default")?i.default:i;var r=function(n){return n instanceof t.Model?n:n instanceof e.View?n.model:void 0},o=function(e){return e instanceof t.View?e:void 0},s=function(t,e,n){return"function"==typeof n&&(t=n.call(t,r(t),o(t)),e=n.call(e,r(e),o(e))),te?1:0},a={compareAB:s,viewComparator:function(){for(var t=arguments.length,e=Array(t),i=0;i=2?s.apply(null,e):(1===e.length&&e[0]instanceof Array&&(r=e[0]),n(r).every(function(t){return 0===(o=s.apply(null,t))}),o)}};function l(t,e,i){return n.isFunction(e)&&(e=e.apply(t,i||[])),e}function h(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null==i.fields||i.fileds&&!i.fileds.length)throw new Error("fields option missing");if(i.checked||(i.checked={}),null!=e){var r=void 0,o=e instanceof t.Model,s=n.isObject(e.options),a=i.exclude instanceof Array?i.exclude:"string"==typeof i.exclude?[i.exclude]:[];return n(i.fields).some(function(t){if(!(t in i.checked||(i.checked[t]=!0,a.indexOf(t)>=0)))return o&&null==r&&(r=l(e,e.get(t),i.args)),null==r&&(r=l(e,e[t],i.args)),null==r&&s&&(r=l(e,e.options[t],i.args)),null!=r}),null==r?i.default:r}}function u(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:":";return t||(t=""),t+n+(e=null==e?"":e.toString())}function c(e,i){if(null!=e&&n.isObject(e)&&null!=i&&""!=i)return e instanceof t.Model?e.get(i):e[i]}function g(e,n,i,r){return e instanceof t.Model?e.set(n,i,{silent:!0}):e[n]=i,i instanceof t.Model&&r.models.push({path:r.passPath.join(":"),property:n,model:i}),r.passPath.push(n),c(e,n)}var d=function(e,i,r,o){if(null!=e&&n.isObject(e)&&null!=i&&""!=i){var s=n.extend({},o);if(s.silent=!0===s.silent,s.force=!1!==s.force,!n.isObject(i)||i instanceof Array||(r=i.value,s.force=!1!==i.force,s.silent=!0===i.silent,i=i.path),s.path=i,s.passPath=[],s.models=[],null!=i&&""!=i){var a="string"==typeof i?i.split("."):i instanceof Array?[].slice.call(i):[i];if(s.pathArray=[].slice.call(a),a.length){a.length;var l=a.shift();e instanceof t.Model&&s.models.push({path:"",property:l,model:e});var h=function t(e,i,r,o,s){if(null!=e&&n.isObject(e)&&null!=i&&""!=i){if(!r.length)return g(e,i,o,s);var a=c(e,i);if(n.isObject(a)||s.force)return!n.isObject(a)&&s.force&&(a=g(e,i,{},s)),t(a,r.shift(),r,o,s)}}(e,l,a,r,s);if(void 0===h&&void 0!==r)return h;if(!s.silent)for(var u=s.pathArray.join(":");s.models.length;){var d=s.models.pop(),f=""==d.path?u:u.substring(d.path.length+1);f&&d.model.trigger("change:"+f,r),d.model.trigger("change",d.model)}return h}}}};function f(t,e){if(null!=t&&n.isObject(t)&&null!=e&&""!=e){var i="string"==typeof e?e.split("."):e instanceof Array?[].slice.call(e):[e];return function t(e,i,r){if(null!=e&&n.isObject(e)&&null!=i&&""!=i){var o=c(e,i);return!r.length||r.length&&null==o?o:t(o,r.shift(),r)}}(t,i.shift(),i)}}var p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function v(e){if(null!=e&&n.isObject(e)){var i={};return function e(n,i){if(i=i||"",null!=this&&"object"==p(this))for(var r=this instanceof t.Model?this.attributes:this,o=Object.getOwnPropertyNames(r),s=0;s1&&void 0!==arguments[1]?arguments[1]:{};return e.fields=["getLabel","label","getName","name","getValue","value"].concat(e.fields||[]),h(t,e)},getName:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.fields=["getName","name","getLabel","label","getValue","value"].concat(e.fields||[]),h(t,e)},getValue:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.fields=["getValue","value","getId","id","getName","name","getLabel","label","cid"].concat(e.fields||[]),h(t,e)},wrap:u,unwrap:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:":";if(null!=t){if(t=t.toString(),e||(e=""),!t.length)return t;var i=new RegExp("^"+e+n);return t.replace(i,"")}},setByPath:d,getByPath:f,flattenObject:v,unFlattenObject:m,isView:function(e){return e instanceof t.View}},y={view:a,common:_},b=[t.Model,t.Collection,t.View,t.Router,e.Object];function w(t){var e=n.isFunction(t),i=n(b).some(function(e){return t===e||t.prototype instanceof e});return e&&i}var O=e.Error.extend({},{Http400:function(t){return this.Http(400,t)},Http401:function(t){return this.Http(401,t)},Http403:function(t){return this.Http(403,t)},Http404:function(t){return this.Http(404,t)},Http500:function(t){return this.Http(500,t)},Http:function(t,e){var n=new this({message:e,name:"HttpError"});return n.status=t,n},HttpRedirect:function(t){return this.Http(301,t)},NotFound:function(t){return this.Http404(t)},NotAuthorized:function(t){return this.Http401(t)},Forbidden:function(t){return this.Http403(t)}});function S(t){var i=null;if(n.isFunction(t))i=t;else{if(!n.isObject(t)||null===t)throw new Error("argument should be an object or class definition");var r=function(){};r.extend=e.extend,i=r.extend(t)}i.extend||((i=e.extend.call(t,{})).extend=e.extend);return{with:function(){for(var t=arguments.length,e=Array(t),r=0;r0&&void 0!==arguments[0]?arguments[0]:{},e=n.extend({},t);return e.exclude="getName",e.args=[e],_.getName(this,e)},getLabel:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=n.extend({},t);return e.exclude="getLabel",e.args=[e],_.getLabel(this,e)},getValue:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=n.extend({},t);return e.exclude="getValue",e.args=[e],_.getValue(this,e)}})}var P=function(t){return t.extend({getProperty:function(t,e){return this._getOptionOrProperty(this,t,e,this.getOption)},getOption:function(t,e){return this._getOptionOrProperty(this.getProperty("options",{deep:!1}),t,e,this.getProperty)},_getOptionOrProperty:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments[3];if(void 0!==i.deep||(i.deep=!0),void 0!==i.force||(i.force=!0),i.args||(i.args=[]),null!=e&&null!=t){var o=t[e];if(void 0===o&&i.deep&&n.isFunction(r)){var s=n.extend({},i,{deep:!1,force:!1});o=r.call(this,e,s)}return n.isFunction(o)&&i.force&&!w(o)&&(o=o.apply(this,i.args||[])),void 0===o?i.default:o}}})},M=function(t){return t.extend({constructor:function(){for(var e=arguments.length,n=Array(e),i=0;i0&&void 0!==arguments[0]?arguments[0]:{skip:!0}).skip){if(!this.getProperty("channelName")){var t=this.getProperty("channel");t&&(this.channelName=t.channelName)}e.Object.prototype._initRadio.call(this)}},radioRequest:function(){var t=this.getChannel();t&&t.request.apply(t,arguments)},radioTrigger:function(){var t=this.getChannel();t&&t.trigger.apply(t,arguments)}})};var k=function(t){var e=t.extend({constructor:function(){for(var e=arguments.length,n=Array(e),i=0;i0&&void 0!==arguments[0]?arguments[0]:{throwError:!1},e=new O({name:"StartableLifecycleError",message:"Startable has already been destroyed and cannot be used."}),n=this._isLifeState(V);if(t.throwError&&n)throw e;if(n)return e},_ensureStartableIsIdle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{throwError:!1},e="Startable is not idle. current state: "+this._getLifeState(),n=new O({name:"StartableLifecycleError",message:e}),i=this._ensureStartableIsIntact(t),r=this._isInProcess();if(t.throwError&&r)throw n;return i||(r?n:void 0)},_ensureStartableCanBeStarted:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{throwError:!1},e=new O({name:"StartableLifecycleError",message:"Startable has already been started."}),n=this._ensureStartableIsIdle(t),i=!0===this.getProperty("allowStartWithoutStop");if(n||!i){var r=this._isLifeState(E);if(t.throwError&&r)throw e;return n||(r?e:void 0)}},_ensureStartableCanBeStopped:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{throwError:!1},e=new O({name:"StartableLifecycleError",message:"Startable should be in `running` state."}),n=this._ensureStartableIsIdle(t),i=!0===this.getProperty("allowStopWithoutStart");if(n||!i){var r=this._isLifeState(E);if(t.throwError&&!r)throw e;return n||(r?void 0:e)}},_getStartPromise:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Promise.all(this._getStartPromises(t))},_getStartPromises:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=[];return e.push(this._getStartParentPromise()),e.push(this._getStartPagePromise()),!0!==t.noruntime&&e.push(this._getStartRuntimePromise()),e},_getStartRuntimePromise:function(){return T(this,"startRuntimePromises")},_getStartPagePromise:function(){return T(this,"startPromises")},_getStartParentPromise:function(){var t=n.result(this,"getParent");if(n.isObject(t)&&n.isFunction(t._getStartPromise))return t._getStartPromise({noruntime:!0})},_getStopPromise:function(){return Promise.all(this._getStopPromises())},_getStopPromises:function(){var t=[];return t.push(this._getStopRuntimePromise()),t},_getStopRuntimePromise:function(){return T(this,"stopPromises")},_getStopParentPromise:function(){var t=n.result(this,"getParent");if(n.isObject(t)&&n.isFunction(t._getStopPromise))return t._getStopPromise()}});return i.Startable=!0,i},F=function(t){var e="_children",i=t.extend({constructor:function(){for(var e=arguments.length,n=Array(e),i=0;i0&&void 0!==arguments[0]?arguments[0]:{};this._initializeParrent(t),this._initializeChildren(t)},hasChildren:function(){this.getChildren();return this[e].length>0},getChildren:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{startable:!0},n=this[e]||[];return t.startable?n.filter(function(t){return!t.getProperty("isStartNotAllowed")}):n},hasParent:function(){var t=this.getParent();return n.isObject(t)},getParent:function(){return this.getProperty("parent",{deep:!1})},_initializeChildren:function(){var t=this,i=this.getProperty("children"),r=[];n(i).each(function(e){var n=t._normalizeChildContext(e),i=t._initializeChild(n);i&&r.push(i)}),this[e]=r},_initializeChild:function(t){if(null!=t&&n.isFunction(t.Child)){var e=t.Child,i=this._normalizeChildOptions(t);return this.buildChild(e,i)}},_normalizeChildContext:function(t){var e={};return n.isFunction(t)&&t.Childrenable?n.extend(e,{Child:t}):n.isFunction(t)?e=this._normalizeChildContext(t.call(this)):n.isObject(t)&&(e=t),e},_normalizeChildOptions:function(t){var e=n.extend({},t);return!0===this.getOption("passToChildren")&&n.extend(e,this.options),e.parent=this,delete e.Child,this._buildChildOptions(e)},_buildChildOptions:function(t){return n.extend(t,this.getProperty("childOptions"))},buildChild:function(t,e){return new t(e)},_initializeParrent:function(t){null==this.parent&&null!=t.parent&&(this.parent=t.parent)}});return i.Childrenable=!0,i},H=[function(t){return{_v:t,_m:t.model||{},_cid:function(e){return u(t.cid,e)}}}],B={},N=!1;var I={mix:function(t){for(var e=arguments.length,i=Array(e>1?e-1:0),r=1;r1?e-1:0),r=1;r0&&void 0!==arguments[0]?arguments[0]:{},e=I.mix(n.result(this,"templateContext"),this);return n.extend(t,e)}})},U={GetNameLabel:C,GetOptionProperty:P,Radioable:M,Stateable:k,Startable:L,Childrenable:F,GlobalTemplateContext:G},Y=S(e.Behavior).with(P),W=Y.extend({listenViewInitialize:!0,constructor:function(){!0===this.getProperty("listenViewInitialize")&&this.on("before:render initialize",n.once(n.partial(this.triggerMethod,"view:initialize"))),Y.apply(this,arguments)},getModel:function(){return this.view.model},cidle:function(t){return _.wrap(this.view.cid,t)},unCidle:function(t){return _.unwrap(t,this.view.cid)}}),X=W.extend({triggerEl:void 0,moveBeforeStart:10,scope:"drag",getDragEventsContext:function(){return this.$doc},getDragEventsElementSelector:function(){return"*"},getTriggerEl:function(){if(this._$el)return this._$el;var t=this.getOption("triggerEl");if(null==t&&this.view.$el)this._$el=this.view.$el;else if(t&&t.jquery)this._$el=t;else if(t instanceof HTMLElement)this._$el=$(t);else{if("string"!=typeof t||!t.length)throw new Error("trigger element should be a DOM or jQuery object or string selector.",t);this._$el=this.view.$(t)}return this._$el},isSameScope:function(t){return t.scope===this.scope},shouldHandleDomEvents:function(t){return this.isSameScope(t)&&this!==t},constructor:function(){this._clearDragData(),this.$doc=$(document);for(var t=arguments.length,e=Array(t),n=0;n=this.getOption("moveBeforeStart")&&this._startDragSession()},_getStartPositionPixelOffset:function(t){var e=Math.abs(t.pageX-this._dragData.startX),n=Math.abs(t.pageY-this._dragData.startY);return e>n?e:n},_startDragSession:function(){this._dragData.dragging=!0,this.$doc.off("mousemove",this.__b.handleMoveAfterMouseDown),this.$doc.on("mousemove",this.__b.handleDragMove);var t=this.getDragEventsContext(),e=this.getDragEventsElementSelector();t.on("mouseenter",e,this.__b.handleElementEnter),t.on("mousemove",e,this.__b.handleElementOver),this.view.triggerMethod("drag:start")},_handleDragMove:function(t){t.stopPropagation(),this.triggerMethod("drag",t)},_handleElementEnter:function(t){var e=this,n=$(t.target);this._dragData.over!=n&&(this._dragData.over=n,n.trigger("drag:enter",this),n.one("mouseleave",function(){return e.trigger("drag:leave",e)}))},_handleElementLeave:function(t){$(t.target).trigger("drag:leave",this)},_handleElementOver:function(t){var e=$(t.target),n=this._createCustomDomEvent("drag:over",t);e.trigger(n,this)},_createCustomDomEvent:function(t,e,i){i||(i=["pageX","pageY","clientX","clientY","offsetX","offsetY","target"]);var r=jQuery.Event(t);return n(i).each(function(t){return r[t]=e[t]}),r}}),q=X.extend({useGhost:!0,viewCssClass:"dragging",ghostCssClass:"ghost",constructor:function(){for(var t=arguments.length,e=Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.view.sort();var e=this.children=[],i=this._skipFirstAttach;n(this.view.children._views).each(function(t,n){t.model&&(t.model.set("order",n),t.isRendered()&&(i||t.isAttached())&&e.push(t))}),this.hasChildren=this.children.length>0,1!=t.silent&&this.view.collection&&this.view.collection.trigger("reordered"),this._skipFirstAttach=!1},_onDomDragOver:function(t,e,i){if(this.isSameScope(e)&&(t.stopPropagation(),e!==i&&(!this.hasChildren||i))){e._dragData.drop||(e._dragData.drop={});var r=e._dragData.drop,o=this.getEventXY(t),s=this._getDropContext(o,i);s.context=this;var a=n.extend({},r,s),l=n.keys(a);n(l).some(function(t){return r[t]!==s[t]})&&(e._dragData.drop=s,this._onDropContextChange(e,s))}},_getDropContext:function(t,e){if(!(this.children||[]).length)return{insert:"before"};var n=e?e.$el:this.$el,i=this._getPositionByEventXY(t,n);return this._getDropContextByPosisiton(i,e)},_getPositionByEventXY:function(t,e){var n=e.offset(),i=e.outerWidth(),r=e.outerHeight(),o=n.left+i/2,s=n.top+r/2,a={x:void 0,y:void 0};return a.x=t.x<=o?"left":"right",a.y=t.y<=s?"top":"bottom",a},_getDropContextByPosisiton:function(t,e){var i="horizontal"==(this.getOption("direction")||"vertical")?"left"==t.x?"before":"after":"top"==t.y?"before":"after",r=void 0;return{insert:i,childView:r=e?e.view:"before"==i?this.children[0]:this.children.length&&n(this.children).last(),index:this.view.children._views.indexOf(r),noChild:!e}},_onDropContextChange:function(t,e){this.triggerMethod("drop:context:change",t,e)},_onDrop:function(t,e){this.triggerMethod("drop",t,e)}}),J=W.extend({updateElementClass:function(t){var e=n.result(this.view,"className")||"",i=n.result(this.view,"dynamicClassName")||"";this.$el.attr({class:(e+" "+i).trim()})},refreshOnModelChange:!0,refreshOnDomChange:!1,refreshOnViewRefresh:!0,refreshOnViewBeforeRender:!0,refreshOnViewRender:!1,modelEvents:{change:function(){this.getProperty("refreshOnModelChange")&&this.updateElementClass("model:change")}},events:{change:function(){this.getProperty("refreshOnDomChange")&&this.updateElementClass("dom:change")}},onRefresh:function(){this.getProperty("refreshOnViewRefresh")&&this.updateElementClass("view:refresh")},onRender:function(){this.getProperty("refreshOnViewRender")&&this.updateElementClass("view:render")},onBeforeRender:function(){this.getProperty("refreshOnViewBeforeRender")&&this.updateElementClass("view:before:render")},onRefreshCssClass:function(){this.updateElementClass()},onSetupRefreshCssClass:function(t){var e=this;null!=t&&n.isObject(t)&&n(t).each(function(t,n){e[n]=!0===t})}});function K(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var Z=S(W).with(k).extend({applyDelay:1,autoApplyToModel:!1,autoChangeModel:!1,fillFormFromModel:!0,applySelector:".apply",cancelSelector:".cancel",resetSelector:".reset",initialize:function(t){this.applyValue=n.debounce(this._applyValue,this.getProperty("applyDelay")),this.mergeOptions(t,["values"]),this.extendDefaultValues({})},extendDefaultValues:function(t){this._values=n.extend(this._values||{},t)},onViewInitialize:function(){var t=this.getModel();t&&this.extendDefaultValues(t.toJSON())},onRender:function(){this.firstRender||(this.buildFormBindings(),this.setState(this._tryFlatValues(this._values)),this.setValuesToForm(this.getValues({raw:!0}))),this.firstRender=!0},triggers:function(){var t;return K(t={},"click "+this.getProperty("applySelector"),"trigger:apply"),K(t,"click "+this.getProperty("cancelSelector"),"trigger:cancel"),K(t,"click "+this.getProperty("resetSelector"),"trigger:reset"),t},_tryFlatValues:function(t){return v(t)},_tryUnFlatValues:function(t){return m(t)},rollbackToDefaultValues:function(){this.clearState();var t=this._values,e=this._tryFlatValues(t);this.setState(e)},getValues:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this.getState();if(t.raw)return e;return this._tryUnFlatValues(e)},onTriggerApply:function(){this._apply()},onTriggerCancel:function(){this._cancel()},onTriggerReset:function(){this._reset()},_apply:function(){var t=this.getValues();this.view.triggerMethod("values:apply",t),this._tryChangeModel(t)},_cancel:function(){this.rollbackToDefaultValues();var t=this._getFullHash(this._values);this.view.triggerMethod("values:cancel",t),this.setValuesToForm(t),this._tryChangeModel(t,{clear:!0})},_reset:function(){this.clearState();var t=this._getFullHash({});this.view.triggerMethod("values:reset",t),this.setValuesToForm(t),this._tryChangeModel(t,{clear:!0})},onState:function(t){this._tryChangeModel(t,{type:"property"})},_tryChangeModel:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="property"===e.type?"autoChangeModel":"autoApplyToModel";if(!0===this.getProperty(n)){var i=this.getModel();i&&(t=this._tryUnFlatValues(t),!0===e.clear&&i.clear(),i.set(t))}},_getFullHash:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=this.getModel()&&this.getModel().toJSON(),i=n.extend({},this.values,this.mappings,e),r={};return n(i).each(function(t,e){return r[e]=void 0}),n.extend(r,t)},buildFormBindings:function(){var t=this;this.mappings={};var e=["input","textarea","select"];this.$("[name]").each(function(n,i){if(-1!=e.indexOf(i.tagName.toLowerCase())){var r=t.unCidle(i.name);if(!(r in t.mappings)){var o=t._getElementInfo(i,e);o&&(t.mappings[r]=o)}}});var i={};n(this.mappings).each(function(t,e){t.values&&(i[e]=t.values)}),this.extendDefaultValues(i)},_getElementInfo:function(t,e){var n={name:t.name},i=void 0,r='[name="'+t.name+'"]',o=this.$(r);if(o.length){if(o.length>1){var s=[],a=!1;o.each(function(t,n){if(-1!=e.indexOf(n.tagName.toLowerCase())){var i=$(n);if("checkbox"!=n.type&&"radio"!=n.type||i.prop("checked")){var r=i.val();a||(a="checkbox"===n.type||r instanceof Array),r instanceof Array?s=s.concat(r):s.push(i.val())}}}),i=!s.length||1===s.length&&!a?s[0]:s}else i="checkbox"===o.get(0).type?o.prop("checked")?[o.val()]:[]:o.val();return n.values=i,n.isArray=i instanceof Array,n.$elements=o,n}},setValuesToForm:function(t){var e=this;n(t).each(function(t,n){var i=e.mappings[n].$elements,r=t instanceof Array?t:[t];i.each(function(t,n){e._setValueToElement(n,t,r)})})},_setValueToElement:function(t,e,n){var i=e=0):r.val(i)},events:{change:"domChange",input:"domInput"},domChange:function(t){this.applyValue(t.target.name,t.target,t)},domInput:function(t){this.applyValue(t.target.name,t.target,t)},_applyValue:function(t,e,n){"checkbox"==e.type?this._applyCheckboxValue(t,e,n):this._applySimpleValue(t,e,n)},_applySimpleValue:function(t,e,n){t=this.unCidle(t);var i=$(e);this.setState(t,i.val())},_applyCheckboxValue:function(t,e,n){var i='input[type=checkbox][name="'+t+'"]:checked',r=this.$(i).map(function(t,e){return e.value}).toArray();t=this.unCidle(t),this.setState(t,r)}}),tt={Behavior:W,Draggable:q,Droppable:Q,DynamicClass:J,FormToHash:Z},et=S(e.Object).with(P,M),nt=S(et).with(k),it=$&&$.ajax,rt=new(nt.extend({constructor:function(){for(var t=arguments.length,e=Array(t),n=0;n0?n/1e3:0},isTokenRefreshNeeded:function(){return!!this.getTokenValue()&&!this.getTokenSeconds()},refreshBearerToken:function(){var t=this,e=this.getProperty("bearerTokenRenewUrl")||this.getProperty("bearerTokenUrl"),n=this.isTokenRefreshNeeded();return new Promise(function(i,r){if(n)if(null!=e){var o={grant_type:"refresh_token",refresh_token:t.getRefreshToken()};it({url:e,data:o,method:"POST"}).then(function(e){t.setTokenObject(e),i()},function(){t.triggerMethod("refresh:token:expired"),r(O.Http401())})}else r(new Error("Token expired and `bearerTokenRenewUrl` not set"));else i()})}})),ot=S(e.View).with(G,P).extend({instantRender:!1,renderOnReady:!1,triggerReady:!1,manualAfterInitialize:!0,constructor:function(){for(var t=arguments.length,n=Array(t),i=0;i1?i-1:0),o=1;o0)}}});function at(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.name=t,new st(e)}var lt=new at("yat:modals:singleton",{noRadio:!0}),ht={bg:!0,close:!0},ut={closeOnClickOutside:!0,closeOnPromise:!0,preventClose:!1,asPromise:!1},ct={wrapper:"yat-modal-wrapper",bg:"yat-modal-bg",contentWrapper:"yat-modal-content-wrapper",close:"yat-modal-close",header:"yat-modal-header",content:"yat-modal-content",actions:"yat-modal-actions",resolve:"yat-modal-resolve",reject:"yat-modal-reject"},gt={close:"×",resolve:"ok",reject:"cancel"},dt={full:{css:ct,show:ht,labels:gt,options:ut},simple:{css:ct,show:{bg:!1,close:!1},labels:gt,options:ut},confirm:{css:ct,show:ht,labels:gt,options:{closeOnClickOutside:!0,closeOnPromise:!0,preventClose:!1,asPromise:!0}}};lt.set("types.full",dt.full),lt.set("types.simple",dt.simple),lt.set("types.confirm",dt.confirm),lt.set("defaultShow",ht),lt.set("defaultCss",ct),lt.set("defaultLabels",gt);var ft=n.template("<% if(show.bg) {%> data-role=\"modal-bg\">
<% } %>\n data-role=\"modal-content-wrapper\">\n\t<% if(show.close) {%>
<% } %>\n\t<% if(show.header) {%>
data-role=\"modal-header\"><%= header %><% } %>\n\t
data-role=\"modal-content\"><%= text %>
\n\t<% if(show.actions) {%>\n\t
data-role=\"modal-actions\">\n\t\t<% if(show.resolve) {%><% } %>\n\t\t<% if(show.reject) {%><% } %>\n\t
\n\t<% } %>\n
\n"),pt=S(ot).with(P).extend({renderOnReady:!0,template:ft,attributes:function(){return{"data-role":"modal-wrapper"}},initialize:function(t){var e=this;this.mergeOptions(t,["content","header","text"]);var n=this;!0===this.getOption("asPromise")&&(this.promise=new Promise(function(t,e){n.once("resolve",function(e){return t(e)}),n.once("reject",function(t){return e(t)})})),this.once("resolve reject",function(t,n){e.preventClose=!1,e.getConfigValue("options","closeOnPromise")&&!n&&e.destroy()})},canBeClosed:function(){return!0!==this.getConfigValue("options","preventClose")},destroy:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(this.canBeClosed()||!0===t.force)return ot.prototype.destroy.apply(this,arguments)},ui:{bg:'[data-role="modal-bg"]',contentWrapper:'[data-role="modal-content-wrapper"]',text:'[data-role="modal-content"]',header:'[data-role="modal-header"]',close:'[data-role="modal-close"]',resolve:'[data-role="modal-resolve"]',reject:'[data-role="modal-reject"]'},triggers:{"click @ui.close":{event:"click:close",stopPropagation:!0},"click @ui.reject":{event:"click:reject",stopPropagation:!0},"click @ui.resolve":{event:"click:resolve",stopPropagation:!0},"click @ui.text":{event:"click:content",stopPropagation:!0},"click @ui.contentWrapper":{event:"click:content:wrapper",stopPropagation:!0},"click @ui.bg":{event:"click:bg",stopPropagation:!0},click:{event:"click:wrapper",stopPropagation:!0}},regions:{content:'[data-role="modal-content"]'},onBeforeDestroy:function(){this.trigger("reject",this.getProperty("reject"),!0)},onClickClose:function(){this.destroy()},onClickResolve:function(){this.trigger("resolve",this.getProperty("resolve"))},onClickReject:function(){this.trigger("reject",this.getProperty("reject"))},onClickBg:function(){this.clickedOutsideOfModal()},onClickWrapper:function(){this.clickedOutsideOfModal()},clickedOutsideOfModal:function(){!0===this.getConfigValue("options","closeOnClickOutside")&&this.destroy()},onBeforeRender:function(){var t=this.getConfig();t.css.wrapper&&this.$el.addClass(t.css.wrapper),this.$el.appendTo($("body"))},onRender:function(){this.content instanceof t.View&&(this.showChildView("content",this.content),this.content.inModal=this)},_getModalOptions:function(){var t={};return null!=this.getOption("closeOnClickOutside")&&(t.closeOnClickOutside=this.getOption("closeOnClickOutside")),null!=this.getOption("closeOnPromise")&&(t.closeOnPromise=this.getOption("closeOnPromise")),null!=this.getOption("preventClose")&&(t.preventClose=this.getOption("preventClose")),null!=this.getOption("asPromise")&&(t.asPromise=this.getOption("asPromise")),t},getConfigValue:function(t,e){return((this.getConfig()||{})[t]||{})[e]},getConfig:function(t){if(this.config)return this.config;var e=this.getOption("type")||"simple",i=n.extend({},lt.get("types."+e)||{});return i.show=n.extend({},lt.get("dafaultShow"),i.show,this.getOption("show")),i.labels=n.extend({},lt.get("defaultLabels"),i.labels,this.getOption("labels")),i.css=n.extend({},lt.get("defaultCss"),i.css,this.getOption("css")),i.options=n.extend({},lt.get("defaultOptions"),i.options,this._getModalOptions()),null==i.show.header&&this.getOption("header")&&(i.show.header=!0),null==i.show.resolve&&(this.getOption("resolve")||i.options.asPromise)&&(i.show.resolve=!0),null==i.show.reject&&this.getOption("reject")&&(i.show.reject=!0),null==i.show.actions&&(i.show.resolve||i.show.reject)&&(i.show.actions=!0),this.config=i},templateContext:function(){var t=this.getConfig();return{css:function(e){return t.css[e]?' class="'+t.css[e]+'"':""},label:function(e){return t.labels[e]||""},show:t.show,text:this.getOption("text"),header:this.getOption("header")}}}),vt=new(S(et).with(k).extend({constructor:function(){var t=this;this.modals=[];for(var e=arguments.length,r=Array(e),o=0;o-1&&this.modals.splice(e,1),this.stopListening(t)}},_normalizeArguments:function(){var t={},e=arguments.length;if(e){if(1===e)_.isView(arguments.length<=0?void 0:arguments[0])?t.content=arguments.length<=0?void 0:arguments[0]:n.isString(arguments.length<=0?void 0:arguments[0])?t.text=arguments.length<=0?void 0:arguments[0]:n.isObject(arguments.length<=0?void 0:arguments[0])&&n.extend(t,arguments.length<=0?void 0:arguments[0]);else if(2===e)n.isString(arguments.length<=0?void 0:arguments[0])&&n.isString(arguments.length<=1?void 0:arguments[1])?(t.header=arguments.length<=0?void 0:arguments[0],t.text=arguments.length<=1?void 0:arguments[1]):n.isString(arguments.length<=0?void 0:arguments[0])&&_.isView(arguments.length<=1?void 0:arguments[1])?(t.header=arguments.length<=0?void 0:arguments[0],t.content=arguments.length<=1?void 0:arguments[1]):n.isString(arguments.length<=1?void 0:arguments[1])&&_.isView(arguments.length<=0?void 0:arguments[0])?(t.header=arguments.length<=1?void 0:arguments[1],t.content=arguments.length<=0?void 0:arguments[0]):n.isString(arguments.length<=0?void 0:arguments[0])&&n.isObject(arguments.length<=1?void 0:arguments[1])?(n.extend(t,arguments.length<=1?void 0:arguments[1]),_.isView(t.content)?t.header=arguments.length<=0?void 0:arguments[0]:t.text=arguments.length<=0?void 0:arguments[0]):_.isView(arguments.length<=0?void 0:arguments[0])&&n.isObject(arguments.length<=1?void 0:arguments[1])&&(n.extend(t,arguments.length<=1?void 0:arguments[1]),t.content=arguments.length<=0?void 0:arguments[0]);else{n.isObject(arguments.length<=3?void 0:arguments[3])&&n.extend(t,arguments.length<=3?void 0:arguments[3]),n.isObject(arguments.length<=2?void 0:arguments[2])?n.extend(t,arguments.length<=2?void 0:arguments[2]):n.isString(arguments.length<=2?void 0:arguments[2])&&(t.type=arguments.length<=2?void 0:arguments[2]);var i=this._normalizeArguments(arguments.length<=0?void 0:arguments[0],arguments.length<=1?void 0:arguments[1]);n.extend(t,i)}return t}},onBeforeDestroy:function(){this.doc&&this.doc.off("keyup",this.listenForEsc)}})),mt={show:function(){return vt.show.apply(vt,arguments)},addTypeConfig:function(t,e){t&&n.isString(t)&<.set("types."+t,e)},getTypeConfig:function(t){if(t&&n.isString(t))return lt.get("types."+t)}},_t={TemplateContext:I,identity:rt,modals:mt},yt=S(e.Application).with(P,M,F,L),bt=yt.extend({initRadioOnInitialize:!0,_initRegion:function(){if(!(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{skip:!0}).skip){var t=this.getProperty("region");this.region=t,yt.prototype._initRegion()}},getRegion:function(){return this._region||this._initRegion({skip:!1}),this._region},addPageManager:function(t){var e=this;this._pageManagers||(this._pageManagers=[]),this._pageManagers.push(t);var n=t.getName();n?(this.listenTo(t,"all",function(t){for(var i=arguments.length,r=Array(i>1?i-1:0),o=1;o0},getMenuTree:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{rebuild:!1};if(this._menuTree&&!e.rebuild)return this._menuTree;var i=this._pageManagers||[],r=n(i).chain().map(function(t){return t.getLinks()}).flatten().value();return this._menuTree=new t.Collection(r),this._menuTree},getPage:function(t){if(this.hasPageManagers())return n(this._pageManagers).find(function(e){return e.getPage(t)})}}),wt=e.AppRouter.extend({},{create:function(t,e){var i={},r={},o=this;return n(t).each(function(t,n){i[n]=n,r[n]=function(){t.action.apply(t,arguments).catch(function(t){o._catchError(t,e)})}}),new this({controller:r,appRoutes:i})},_catchError:function(t,e){if(!e||!0===e.getProperty("throwChildErrors"))throw t;var n="error"+(t.status?":"+t.status.toString():"");e.triggerMethod("error",t,this),"error"!=n&&e.triggerMethod(n,t,this)}}),Ot=t.Model.extend({}),St=Ot.extend({defaults:{url:void 0,label:void 0,target:"_self",level:0},destroy:function(){this.id=null,Ot.prototype.destroy.apply(this,arguments)}});function xt(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e0&&void 0!==arguments[0]?arguments[0]:{rebuild:!1};return(!this._layoutView||t.rebuild||this._layoutView&&this._layoutView.isDestroyed&&this._layoutView.isDestroyed())&&this.buildLayout(),this._layoutView},buildLayout:function(){var t=this.getProperty("Layout");if(null!=t){var e=n.extend({},this.getProperty("layoutOptions"));this.model&&!e.model&&n.extend(e,{model:this.model}),this.collection&&!e.collection&&n.extend(e,{collection:this.collection});var i=this.buildLayoutOptions(e);return i.page=this,this._layoutView=new t(i),this._layoutView}},buildLayoutOptions:function(t){return t},addModel:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t){this.model=t;var n=e.fetch||this.getOption("fetchModelOnAdd");void 0===n&&(n=this.getProperty("fetchDataOnAdd")),!0===n&&this.addStartPromise(t.fetch(e))}},addCollection:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(t){this.collection=t;var n=e.fetch||this.getOption("fetchCollectionOnAdd");void 0===n&&(n=this.getProperty("fetchDataOnAdd")),!0===n&&this.addStartPromise(t.fetch(e))}},freezeWhileStarting:!0,freezeUI:function(){},unFreezeUI:function(){},getRouteHash:function(){var t=[{},this._routeHandler].concat(this.getChildren({startable:!1}).map(function(t){return t.getRouteHash()}));return n.extend.apply(n,xt(t))},hasRouteHash:function(){return n.isObject(this.getRouteHash())},getLinkModel:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;if(this._canHaveLinkModel()){if(this._linkModel)return this._linkModel;var e=this.getRoute(),n=this.getLabel(),i=this._getSublinks(t);return this._linkModel=new St({url:e,label:n,level:t,children:i}),this._linkModel}},_canHaveLinkModel:function(){return!(!0===this.getProperty("skipMenu")||this.getProperty("isStartNotAllowed"))},_destroyLinkModel:function(){this._linkModel&&(this._linkModel.destroy(),delete this._linkModel)},getParentLinkModel:function(){var t=this.getParent();if(t&&t.getLinkModel){return t.getLinkModel()}},getNeighbourLinks:function(){var t=this.getLinkModel();if(t&&t.collection)return t.collection},getChildrenLinks:function(){var t=this.getLinkModel();if(t)return t.get("children")},_getSublinks:function(e){var i=this.getChildren();if(i&&i.length){var r=n(i).chain().filter(function(t){return!0!==t.getProperty("skipMenu")}).map(function(t){return t.getLinkModel(e+1)}).value();if(r.length){return new t.Collection(r)}}},_initializeModels:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.addModel(t.model,t),this.addCollection(t.collection,t)},_initializeRoute:function(){var t=this.getRoute({asPattern:!0});if(null!=t){var e=this;this._routeHandler=(n={},i=t,r={context:e,action:function(){return e.start.apply(e,arguments)}},i in n?Object.defineProperty(n,i,{value:r,enumerable:!0,configurable:!0,writable:!0}):n[i]=r,n);var n,i,r}},getRoute:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{asPattern:!1},e=this.getProperty("relativeRoute"),n=this.getProperty("route"),i=this.getParent();if(null!=n){var r=n;if(e&&i&&i.getRoute){r=i.getRoute()+"/"+n}return this._normalizeRoute(r,t)}},_normalizeRoute:function(t,e){if(t=t.replace(/\/+/gim,"/").replace(/^\//,""),e.asPattern)return t;return t.replace(/\(\/\)/gim,"/").replace(/\/+/gim,"/")},_tryCreateRouter:function(){!0===this.getProperty("createRouter")&&(this.router=this._createAppRouter())},_createAppRouter:function(){var t=this.getRouteHash();if(n.size(t))return new wt(t)},_proxyEvents:function(){var t=this._getProxyContexts();this._proxyEventsTo(t)},_getProxyContexts:function(){var t=[],e=this.getProperty("manager");e&&t.push({context:e});var n=this.getChannel();if(n){var i=this.getProperty("proxyEventsToRadio");t.push({context:n,allowed:i})}return t},_proxyEventsTo:function(t){var e=[],i={};n(t).each(function(t){t.allowed?n(t.allowed).each(function(e){i[e]||(i[e]=[]),i[e].push(t.context)}):e.push(t.context)});var r=this;r.on("all",function(t){for(var o=arguments.length,s=Array(o>1?o-1:0),a=1;a1&&void 0!==arguments[1]?arguments[1]:{trigger:!0},n=this.getRouter();n?n.navigate(t,e):console.warn("router not found")},getPage:function(t){var e=n(this._routesHash).find(function(e,n){return n===t||(e.context.getName()===t||void 0)});return e&&e.context},navigateToRoot:function(){var t=this.getState("currentPage"),e=this.getProperty("rootUrl");if(!e){var n=this.getChildren();if(n&&n.length){var i=n.find(function(e){return e!=t});e=i&&i.getRoute()}}null!=e?this.navigate(e):console.warn("root page not found")},_initializeYatPageManager:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.mergeOptions(t,["id","name","label"]),this._registerPageHandlers(t),this._registerIdentityHandlers(),this.createRouter()},_buildChildOptions:function(t){return n.extend(t,this.getProperty("childOptions"),{manager:this})},_registerPageHandlers:function(){this.on("page:before:start",this._pageBeforeStart),this.on("page:start",this._pageStart),this.on("page:start:decline",this._pageDecline)},_pageBeforeStart:function(t){var e=this.getState("currentPage");e&&e!=t&&e.stop()},_pageStart:function(t){this.setState("currentPage",t)},_pageDecline:function(){},_registerIdentityHandlers:function(){var t=this;this.listenTo(rt,"change",function(){for(var e=arguments.length,n=Array(e),i=0;i {\r\n\tif (arg instanceof Bb.Model)\r\n\t\treturn arg;\r\n\telse if (arg instanceof Mn.View)\r\n\t\treturn arg.model;\r\n\telse\r\n\t\treturn;\r\n}\r\nlet getCompareABView = (arg) => {\r\n\tif (arg instanceof Bb.View)\r\n\t\treturn arg;\r\n\telse\r\n\t\treturn;\r\n}\r\n\r\nlet compareAB = (a, b, func) => {\r\n\tif (typeof func === 'function') {\r\n\t\ta = func.call(a, getCompareABModel(a), getCompareABView(a));\r\n\t\tb = func.call(b, getCompareABModel(b), getCompareABView(b));\r\n\t}\r\n\treturn a < b ? -1\r\n\t\t: a > b ? 1\r\n\t\t\t: 0;\r\n};\r\n\r\nexport default compareAB;\r\n","import compareAB from './compare-ab';\r\nimport viewComparator from './view-comparator';\r\nexport default { compareAB, viewComparator };\r\n","import _ from 'underscore';\r\nimport compareAB from './compare-ab';\r\n\r\n/*\r\n*\taccepts:\r\n*\t\tvariant #1: a, b, function\r\n*\t\tvariant #2: [[a,b,function], [a,b,function]]\r\n*\t\tfunction can be undefined\r\n*\t\texample:\r\n*\t\t\tascending\t:\t\treturn viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });\r\n*\t\t\tdescending\t:\t\treturn viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });\r\n\t\t\tmultiple compares: \treturn viewComparator([[viewB, viewA, func], [viewB, viewA, func]])\r\n*/\r\nlet viewComparator = (...args) => {\r\n\tvar compareArray = [];\r\n\tvar result = 0;\r\n\r\n\tif (args.length >= 2)\t// single compare\r\n\t\treturn compareAB.apply(null, args);\r\n\telse if (args.length === 1 && args[0] instanceof Array)\t// array of compare\r\n\t\tcompareArray = args[0];\r\n\r\n\t_(compareArray).every(function (singleCompare) {\r\n\t\tresult = compareAB.apply(null, singleCompare);\r\n\t\treturn result === 0;\r\n\t});\r\n\t\r\n\treturn result;\r\n}\r\n\r\nexport default viewComparator;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction normalizeValue(context, value, args){\r\n\tif(_.isFunction(value))\r\n\t\tvalue = value.apply(context, args || []);\r\n\treturn value;\r\n}\r\n\r\nfunction smartGet(context, opts = {}){\r\n\tif(opts.fields == null || (opts.fileds && !opts.fileds.length))\r\n\t\tthrow new Error('fields option missing');\r\n\r\n\topts.checked || (opts.checked = {});\r\n\t\r\n\tif(context == null) return;\r\n\r\n\tlet value;\r\n\tlet isModel = context instanceof Bb.Model;\r\n\tlet hasOptions = _.isObject(context.options);\r\n\tlet exclude = opts.exclude instanceof Array ? opts.exclude \r\n\t\t\t\t: typeof opts.exclude === 'string' ? [opts.exclude]\r\n\t\t\t\t: [];\r\n\r\n\r\n\t_(opts.fields).some((fieldName) => {\r\n\t\tif(fieldName in opts.checked) return;\r\n\t\topts.checked[fieldName] = true;\r\n\t\t\r\n\t\tif(exclude.indexOf(fieldName)>=0){\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif(isModel && value == null)\r\n\t\t\tvalue = normalizeValue(context, context.get(fieldName), opts.args);\r\n\r\n\t\tif(value == null)\r\n\t\t\tvalue = normalizeValue(context, context[fieldName], opts.args);\r\n\r\n\t\tif(value == null && hasOptions)\r\n\t\t\tvalue = normalizeValue(context, context.options[fieldName], opts.args);\r\n\r\n\t\treturn value != null;\r\n\t});\r\n\r\n\treturn value == null ? opts.default : value;\r\n\r\n}\r\n\r\n\r\nexport default smartGet;\r\n","import _ from 'underscore';\r\nexport default function(prefix, value, delimeter = ':'){\r\n\tprefix || (prefix = '');\t\r\n\tvalue = value == null ? '' : value.toString();\r\n\treturn prefix + delimeter + value;\r\n}\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nfunction getProperty(context, name)\r\n{\r\n\tif(context == null || !_.isObject(context) || name == null || name == '') return;\r\n\tif (context instanceof Bb.Model)\r\n\t\treturn context.get(name);\r\n\telse\r\n\t\treturn context[name];\r\n}\r\nexport default getProperty;\t\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property';\r\n\r\nfunction setProperty(context, name, value, options) {\r\n\tif (context instanceof Bb.Model) {\r\n\t\tcontext.set(name, value, { silent: true });\r\n\t}\r\n\telse {\r\n\t\tcontext[name] = value;\r\n\t}\r\n\r\n\tif(value instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: options.passPath.join(':'),\r\n\t\t\tproperty: name,\r\n\t\t\tmodel: value\r\n\t\t});\t\t\r\n\t}\r\n\r\n\toptions.passPath.push(name);\r\n\r\n\treturn getProperty(context, name);\r\n}\r\n\r\nexport default setProperty;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport setByPathArray from './_set-by-path-array';\r\n\r\nconst setByPath = function (context, path, value, opts) {\r\n\t\r\n\t\r\n\tif(context == null || !_.isObject(context) || path == null || path == '') return;\r\n\t\r\n\tlet options = _.extend({}, opts);\r\n\toptions.silent = options.silent === true;\r\n\toptions.force = options.force !== false;\r\n\t\r\n\t\r\n\tif (_.isObject(path) && !(path instanceof Array)) {\r\n\t\tvalue = path.value;\r\n\t\toptions.force = path.force !== false;\r\n\t\toptions.silent = path.silent === true;\r\n\t\tpath = path.path;\r\n\t}\r\n\t\r\n\toptions.path = path;\r\n\toptions.passPath = [];\r\n\toptions.models = [];\r\n\r\n\r\n\tif (path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\t\r\n\toptions.pathArray = [].slice.call(pathArray);\r\n\r\n\tif(!pathArray.length) return;\r\n\r\n\tlet chunksCount = pathArray.length;\r\n\tvar prop = pathArray.shift();\r\n\r\n\tif(context instanceof Bb.Model){\r\n\t\toptions.models.push({\r\n\t\t\tpath: '',\r\n\t\t\tproperty: prop,\r\n\t\t\tmodel: context\r\n\t\t});\r\n\t}\r\n\r\n\tlet result = setByPathArray(context, prop, pathArray, value, options);\r\n\r\n\tif(result === undefined && value !== undefined)\r\n\t\treturn result;\r\n\r\n\t//triggering change event on all met models\r\n\tif(!options.silent){\r\n\t\tlet originPath = options.pathArray.join(':');\r\n\t\twhile(options.models.length){\r\n\t\t\tlet modelContext = options.models.pop();\r\n\t\t\tlet propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);\r\n\t\t\tif(propertyEventName){\r\n\t\t\t\tmodelContext.model.trigger('change:' + propertyEventName, value);\r\n\t\t\t}\r\n\t\t\tmodelContext.model.trigger('change', modelContext.model);\r\n\t\t}\r\n\t}\r\n\t\r\n\r\n\treturn result;\r\n};\r\n\r\nexport default setByPath;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport getProperty from './_get-property'\r\nimport setProperty from './_set-property';\r\n\r\nfunction setByPathArr(context, propertyName, pathArray, value, options) {\r\n\r\n\tif(context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;\r\n\t\r\n\r\n\tif (!pathArray.length)\r\n\t\treturn setProperty(context, propertyName, value, options);\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!_.isObject(prop) && !options.force)\r\n\t\treturn;\r\n\telse if (!_.isObject(prop) && options.force)\r\n\t\tprop = setProperty(context, propertyName, {}, options);\r\n\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn setByPathArr(prop, nextName, pathArray, value, options);\r\n}\r\n\r\nexport default setByPathArr;\r\n","import _ from 'underscore';\r\nimport getByPathArray from './_get-by-path-array';\r\n\r\nfunction getByPath (obj, path) {\r\n\r\n\tif(obj == null || !_.isObject(obj) || path == null || path == '') return;\r\n\r\n\tvar pathArray = typeof path === 'string' ? path.split('.') \r\n\t\t\t\t\t: path instanceof Array ? [].slice.call(path)\r\n\t\t\t\t\t: [path];\r\n\r\n\tvar prop = pathArray.shift();\r\n\r\n\treturn getByPathArray(obj, prop, pathArray);\r\n}\r\n\r\nexport default getByPath;\r\n","import _ from 'underscore';\r\nimport getProperty from './_get-property';\r\n\r\nfunction getByPathArray(context, propertyName, pathArray) {\r\n\t\r\n\tif (context == null || !_.isObject(context) || propertyName == null || propertyName == '')\r\n\t\treturn;\r\n\r\n\tvar prop = getProperty(context, propertyName);\r\n\r\n\tif (!pathArray.length || (pathArray.length && prop == null))\r\n\t\treturn prop;\r\n\r\n\tvar nextName = pathArray.shift();\r\n\r\n\treturn getByPathArray(prop, nextName, pathArray);\r\n\r\n}\r\n\r\nexport default getByPathArray;\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\n\r\nfunction traverse(fields, root)\r\n{\r\n\troot = root || '';\r\n\tif (this == null || typeof this != 'object') return;\r\n\r\n\r\n\tvar hash = this instanceof Bb.Model ? this.attributes : this;\r\n\tvar props = Object.getOwnPropertyNames(hash);\r\n\tfor (var x = 0; x < props.length; x++) {\r\n\t\tvar name = props[x];\r\n\t\tvar prop = this[name];\r\n\r\n\t\tif (prop == null || typeof prop != 'object' || (prop instanceof Date || prop instanceof Array))\r\n\t\t\tfields[root + name] = prop;\r\n\t\telse if (typeof prop == 'object')\r\n\t\t\ttraverse.call(prop, fields, root + name + '.');\r\n\r\n\t}\r\n\t\t\r\n}\r\n\r\nfunction flattenObject(obj) {\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\ttraverse.call(obj, res);\r\n\treturn res;\r\n};\r\n\r\nexport default flattenObject;\r\n","import _ from 'underscore';\r\nimport setByPath from '../set-get-by-path/set-by-path';\r\n\r\nfunction unFlattenObject(obj) {\r\n\r\n\tif (obj == null || !_.isObject(obj)) return;\r\n\tvar res = {};\r\n\tfor (var e in obj) {\r\n\t\tsetByPath(res, e, obj[e], true);\r\n\t}\r\n\treturn res;\r\n\r\n}\r\n\r\nexport default unFlattenObject;\r\n","import Bb from 'backbone'\r\nexport default (arg) => arg instanceof Bb.View;\r\n","import getLabel from './get-label';\r\nimport getName from './get-name';\r\nimport getValue from './get-value';\r\nimport wrap from './wrap';\r\nimport unwrap from './unwrap';\r\nimport setByPath from './set-get-by-path/set-by-path'\r\nimport getByPath from './set-get-by-path/get-by-path'\r\nimport flattenObject from './flatten-unflatten/flatten-object';\r\nimport unFlattenObject from './flatten-unflatten/unflatten-object';\r\nimport isView from './is-view';\r\nexport default {\r\n\tgetLabel, getName, getValue, wrap, unwrap, setByPath, getByPath, flattenObject, unFlattenObject, isView\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import get from './_smart-get';\r\nexport default (context, opts = {}) => {\r\n\tlet fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];\r\n\topts.fields = fields.concat(opts.fields || []);\r\n\treturn get(context, opts);\r\n}\r\n","import _ from 'underscore';\r\nexport default function(value, prefix, delimeter = \":\"){\r\n\r\n\tif(value == null) return;\r\n\tvalue = value.toString();\r\n\tprefix || (prefix = '');\r\n\tif(!value.length) return value;\r\n\r\n\tlet pattern = new RegExp(`^${prefix}${delimeter}`);\r\n\treturn value.replace(pattern, '');\r\n\r\n}\r\n","import view from './view/view';\r\nimport common from './common/common';\r\nexport default { view, common };\r\n","import _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\n\r\nconst knownCtors = [\r\n\tBb.Model,\r\n\tBb.Collection,\r\n\tBb.View,\r\n\tBb.Router,\r\n\tMn.Object\r\n];\r\n\r\nfunction isKnownCtor(arg) {\r\n\tlet isFn = _.isFunction(arg);\r\n\tlet result = _(knownCtors).some((ctor) => arg === ctor || arg.prototype instanceof ctor);\r\n\treturn isFn && result;\r\n}\r\n\r\nexport default isKnownCtor;\r\n","import Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\n\r\n\r\nlet YatError = Mn.Error.extend({},{\r\n\tHttp400(message){\r\n\t\treturn this.Http(400,message);\r\n\t},\r\n\tHttp401(message){\r\n\t\treturn this.Http(401,message);\r\n\t},\r\n\tHttp403(message){\r\n\t\treturn this.Http(403,message);\r\n\t},\r\n\tHttp404(message){\r\n\t\treturn this.Http(404, message);\r\n\t},\r\n\tHttp500(message){\r\n\t\treturn this.Http(500, message);\r\n\t},\r\n\tHttp(status, message){\r\n\t\tlet error = new this({message:message, name:\"HttpError\"});\r\n\t\terror.status = status;\r\n\t\treturn error;\r\n\t},\r\n\tHttpRedirect(message){\r\n\t\treturn this.Http(301, message);\r\n\t},\r\n\tNotFound(message){\r\n\t\treturn this.Http404(message);\r\n\t},\r\n\tNotAuthorized(message){\r\n\t\treturn this.Http401(message);\r\n\t},\r\n\tForbidden(message){\r\n\t\treturn this.Http403(message);\r\n\t},\r\n});\r\n\r\nexport default YatError;\r\n","import _ from 'underscore'\r\nimport Mn from 'backbone.marionette';\r\nimport YatError from '../YatError';\r\n\r\nfunction smartExtend(Src, Dst){\r\n\tif(_.isFunction(Dst)){\r\n\t\treturn Dst(Src);\r\n\t}\r\n\telse if(_.isObject(Dst)){\r\n\t\treturn Src.extend(Dst);\r\n\t}\r\n\telse throw new YatError('Mixin fail, argument should be an object hash or mixin function')\r\n}\r\n\r\nfunction mix(BaseClass){\r\n\tlet Mixed = null;\r\n\tif(_.isFunction(BaseClass)){\r\n\t\tMixed = BaseClass;\r\n\t}\r\n\telse if(_.isObject(BaseClass) && BaseClass !== null){\r\n\t\tlet tmp = function(){};\r\n\t\ttmp.extend = Mn.extend;\r\n\t\tMixed = tmp.extend(BaseClass);\r\n\t}\r\n\telse {\r\n\t\tthrow new Error('argument should be an object or class definition')\r\n\t}\r\n\tif(!Mixed.extend) {\r\n\t\tMixed = Mn.extend.call(BaseClass, {});\r\n\t\tMixed.extend = Mn.extend;\r\n\t}\r\n\tlet fake = {\r\n\t\twith: (...args) => _.reduce(args, (memo, arg) => smartExtend(memo, arg), Mixed),\r\n\t\tclass: Mixed,\t\r\n\t}\r\n\treturn fake;\r\n}\r\n\r\nexport default mix;\r\n","import isKnownCtor from './isKnownCtor';\r\nimport mix from './mix';\r\nexport default {\r\n\tisKnownCtor,\r\n\tmix,\r\n}\r\n","import _ from 'underscore';\r\nimport common from '../functions/common/common';\r\nexport default function (Base) {\r\n\treturn Base.extend({\r\n\t\tgetName(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getName';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getName(this, options);\r\n\t\t},\r\n\t\tgetLabel(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getLabel';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getLabel(this, options);\r\n\t\t},\r\n\t\tgetValue(opts = {}){\r\n\t\t\tlet options = _.extend({}, opts);\r\n\t\t\toptions.exclude = 'getValue';\r\n\t\t\toptions.args = [options];\r\n\t\t\treturn common.getValue(this, options);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n","import _ from 'underscore';\r\nimport isKnownCtor from '../helpers/isKnownCtor.js';\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\t//property first approach\r\n\t\tgetProperty(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this, key, options, this.getOption);\r\n\t\t},\r\n\t\t//options first approach\r\n\t\tgetOption(key, options){\r\n\t\t\treturn this._getOptionOrProperty(this.getProperty('options',{deep:false}), key, options, this.getProperty);\r\n\t\t},\r\n\t\t_getOptionOrProperty(valueContext, key, options = {}, fallback)\r\n\t\t{\r\n\t\t\toptions.deep !== undefined || (options.deep = true);\r\n\t\t\toptions.force !== undefined || (options.force = true);\r\n\t\t\toptions.args || (options.args = []);\r\n\r\n\t\t\t//key and valueContext should be passed\r\n\t\t\tif(key == null || valueContext == null) return;\r\n\t\t\t\r\n\t\t\t//getting raw value\r\n\t\t\tlet value = valueContext[key];\r\n\r\n\t\t\t//if there is no raw value and deep option is true then getting value from fallback\r\n\t\t\tif(value === undefined && options.deep && _.isFunction(fallback)){\r\n\t\t\t\tlet fallbackOptions = _.extend({}, options, {deep:false, force: false});\r\n\t\t\t\tvalue = fallback.call(this, key, fallbackOptions); \r\n\t\t\t}\r\n\r\n\t\t\t//if returned value is function and is not any of known constructors and options property force set to true \r\n\t\t\t//we should return value of that function\r\n\t\t\t//options.args will be passed as arguments\r\n\t\t\tif(_.isFunction(value) && options.force && !isKnownCtor(value))\r\n\t\t\t\tvalue = value.apply(this, options.args || []);\r\n\r\n\t\t\t//console.log('key', key, value);\r\n\t\t\t\r\n\t\t\t//if value is still undefined we will return default option value\r\n\t\t\treturn value === undefined ? options.default : value;\r\n\t\t}\r\n\t});\r\n\treturn Mixin;\r\n}\r\n","import Mn from 'backbone.marionette';\r\n\r\nexport default (Base) => {\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tlet initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);\r\n\t\t\tthis._initRadio({skip: initRadioOnInitialize});\r\n\t\t},\r\n\t\tgetChannel () {\r\n\t\t\tif(!this._channel) this._initRadio({skip:false});\r\n\t\t\treturn this._channel;\r\n\t\t},\r\n\t\t_initRadio(opts = {skip:true}){\r\n\t\t\tif(opts.skip == true) return;\r\n\r\n\t\t\tlet channelName = this.getProperty('channelName');\r\n\t\t\tif(!channelName){\r\n\t\t\t\tlet channel = this.getProperty('channel');\r\n\t\t\t\tif(channel)\r\n\t\t\t\t\tthis.channelName = channel.channelName;\r\n\t\t\t}\r\n\t\t\tMn.Object.prototype._initRadio.call(this);\r\n\t\t},\r\n\t\tradioRequest(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.request(...args);\r\n\t\t},\r\n\t\tradioTrigger(...args){\r\n\t\t\tlet channel = this.getChannel();\r\n\t\t\tif(channel) channel.trigger(...args);\r\n\t\t},\r\n\t});\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (BaseClass) => {\r\n\tlet Mixin = BaseClass.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tBaseClass.apply(this, args);\r\n\t\t\tthis.initializeStateable();\r\n\t\t},\r\n\t\tinitializeStateable(){\r\n\t\t\tthis._state = {};\r\n\t\t},\r\n\r\n\t\tgetState(key){\r\n\t\t\tconst state = this._state;\r\n\t\t\tif(!key) return state\r\n\t\t\telse return state[key];\r\n\t\t},\r\n\t\tsetState(key, value, options){\r\n\t\t\t\r\n\t\t\tif(key == null) return;\r\n\r\n\t\t\tif(_.isObject(key)){\r\n\t\t\t\tconst _this = this;\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\t_(value).each((propertyValue, propertyName) => _this.setState(propertyName, propertyValue, _.extend({},options,{doNotTriggerFullState: true})));\r\n\t\t\t\tthis._triggerStateChange(value, options);\r\n\t\t\t}else{\r\n\t\t\t\tconst state = this.getState();\r\n\t\t\t\tstate[key] = value;\r\n\t\t\t\tthis._triggerStateChange(key, value, options);\r\n\t\t\t}\r\n\t\t},\r\n\t\tclearState(opts = {}){\r\n\t\t\tlet state = this.getState();\r\n\t\t\tlet broadcast = _.extend({}, state);\r\n\t\t\t_(state).each((s,key) => {\r\n\t\t\t\tbroadcast[key] = undefined;\r\n\t\t\t\tdelete state[key];\r\n\t\t\t});\r\n\t\t\tthis._triggerStateChange(broadcast);\r\n\t\t},\r\n\t\t_triggerStateChange(key, value, options){\r\n\r\n\t\t\tif(!_.isFunction(this.triggerMethod)) return;\r\n\r\n\t\t\tif(!_.isObject(key)){\r\n\t\t\t\tthis.triggerMethod('state:' + key, value, options);\r\n\t\t\t\tif(value === true || value === false || (!!value && typeof value === 'string'))\r\n\t\t\t\t\tthis.triggerMethod('state:' + key + ':' + value.toString(), options);\r\n\t\t\t\tif(!options || (options && !options.doNotTriggerFullState)){\r\n\t\t\t\t\tthis.triggerMethod('state', {[key]:value}, options);\t\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\t//key is a hash of states\r\n\t\t\t\t//value is options\r\n\t\t\t\toptions = value;\r\n\t\t\t\tvalue = key;\r\n\t\t\t\tthis.triggerMethod('state', value, options);\r\n\t\t\t}\r\n\t\t},\t\t\r\n\t});\r\n\tMixin.Stateable = true;\r\n\r\n\treturn Mixin;\r\n\r\n}\r\n","import _ from 'underscore';\r\nimport mix from '../helpers/mix.js';\r\nimport State from './stateable.js';\r\nimport YatError from '../YatError.js';\r\n\r\nconst STATES = {\r\n\tINITIALIZED: 'initialized',\r\n\tSTARTING: 'starting',\r\n\tRUNNING: 'running',\r\n\tSTOPPING: 'stopping',\r\n\tWAITING: 'waiting',\r\n\tDESTROYED: 'destroyed'\r\n}\r\n\r\nconst STATE_KEY = 'life';\r\n\r\n\r\nfunction getPropertyPromise(context, propertyName){\r\n\r\n\tif(context == null || propertyName == null)\r\n\t\treturn Promise.resolve();\r\n\r\n\tlet _promises1 = context['_'+propertyName] || [];\r\n\tlet _promises2 = _.result(context, propertyName) || [];\r\n\r\n\tlet rawPromises = _promises1.concat(_promises2);\r\n\t\t//context[propertyName] || [];\r\n\r\n\tlet promises = [];\r\n\t_(rawPromises).each((promiseArg) => {\r\n\t\tif(_.isFunction(promiseArg))\r\n\t\t\tpromises.push(promiseArg.call(this));\r\n\t\telse if(promiseArg != null)\r\n\t\t\tpromises.push(promiseArg);\r\n\t});\r\n\treturn Promise.all(promises);\r\n}\r\n\r\nfunction addPropertyPromise(context, propertyName, promise){\r\n\tcontext[propertyName] || (context[propertyName] = []);\r\n\tlet promises = context[propertyName];\r\n\tpromises.push(promise);\r\n}\r\n\r\n\r\n\r\nexport default (Base) => {\r\n\tlet Middle = mix(Base).with(State);\r\n\tlet Mixin = Middle.extend({\r\n\t\tconstructor(...args){\r\n\t\t\tMiddle.apply(this,args);\r\n\t\t\tthis.initializeStartable();\r\n\t\t},\r\n\r\n\t\tfreezeWhileStarting: false,\r\n\t\tfreezeUI(){ },\r\n\t\tunFreezeUI(){ },\r\n\t\tisStartNotAllowed(){ },\r\n\t\tisStopNotAllowed(){ },\r\n\r\n\t\taddStartPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_startRuntimePromises', promise);\r\n\t\t},\r\n\r\n\t\taddStopPromise(promise){\r\n\t\t\taddPropertyPromise(this,'_stopPromises', promise);\r\n\t\t},\t\t\r\n\r\n\t\tinitializeStartable(){\r\n\t\t\t\r\n\t\t\tif(!(this.constructor.Startable && this.constructor.Stateable)) return;\r\n\r\n\t\t\tthis._registerStartableLifecycleListeners();\r\n\t\t\tthis._setLifeState(STATES.INITIALIZED);\r\n\t\t\tthis._startRuntimePromises = [];\r\n\t\t\tthis._startPromises = [];\r\n\t\t\tthis._stopPromises = [];\r\n\t\t},\t\r\n\r\n\t\tstart(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStarted = this._ensureStartableCanBeStarted();\r\n\t\t\tlet resultPromise = null;\r\n\t\t\tlet catchMethod = null;\r\n\r\n\t\t\tif(canNotBeStarted){\r\n\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t//resultPromise = Promise.reject(canNotBeStarted);\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tlet declineReason = this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\tcatchMethod = () => this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\tresultPromise = Promise.reject(declineReason);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(resultPromise == null){\r\n\t\t\t\tvar currentState = this._getLifeState();\r\n\t\t\t\tthis._tryMergeStartOptions(options);\t\t\r\n\t\t\t\tthis.triggerMethod('before:start', ...args);\r\n\r\n\t\t\t\tresultPromise = this._getStartPromise();\r\n\t\t\t}\r\n\t\t\t*/\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// return resultPromise.then(() => {\r\n\t\t\t// \tthis.triggerStart(options)\r\n\t\t\t// }, (error) => {\t\t\t\t\r\n\t\t\t// \tthis._setLifeState(currentState);\r\n\t\t\t// \tif(catchMethod) catchMethod();\r\n\t\t\t// \treturn Promise.reject(error);\r\n\t\t\t// });\t\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStarted = _this._ensureStartableCanBeStarted();\r\n\r\n\t\t\t\tif(canNotBeStarted){\r\n\t\t\t\t\t_this.triggerMethod('start:decline',canNotBeStarted);\r\n\t\t\t\t\treject(canNotBeStarted)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStartNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('start:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\t_this.triggerMethod('before:start', ...args);\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStartPromise();\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStartOptions(options);\t\t\r\n\t\t\t\t\t_this.once('start', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStart(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\t\t},\r\n\r\n\t\ttriggerStart(options) {\r\n\t\t\tthis.triggerMethod('start', options);\r\n\t\t},\r\n\r\n\t\tstop(...args){\r\n\t\t\tlet options = args[0];\r\n\t\t\t/*\r\n\t\t\tlet canNotBeStopped = this._ensureStartableCanBeStopped();\r\n\t\t\tif(canNotBeStopped){\r\n\t\t\t\tthis.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\treturn Promise.reject(canNotBeStopped);\t\t\t\t\r\n\t\t\t}\r\n\t\t\tlet declineReason = this.isStopNotAllowed(options);\r\n\t\t\tif(declineReason){\r\n\t\t\t\tthis.triggerMethod('stop:decline', declineReason);\r\n\t\t\t\treturn Promise.reject(declineReason);\r\n\t\t\t}\r\n\t\t\t\r\n\r\n\t\t\tvar currentState = this._getLifeState();\r\n\r\n\t\t\tthis._tryMergeStopOptions(options);\r\n\t\t\tthis.triggerMethod('before:stop', this, options);\r\n\r\n\t\t\tlet promise = this._getStopPromise();\r\n\r\n\t\t\treturn promise.then(() => {\r\n\t\t\t\tthis.triggerStop(options)\r\n\t\t\t}, () => {\r\n\t\t\t\tthis._setLifeState(currentState);\r\n\t\t\t});\t\r\n\t\t\t*/\r\n\r\n\t\t\tlet _this = this;\r\n\t\t\tlet promise = new Promise(function(resolve, reject){\r\n\t\t\t\tlet canNotBeStopped = _this._ensureStartableCanBeStopped();\r\n\r\n\t\t\t\tif(canNotBeStopped){\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',canNotBeStopped);\r\n\t\t\t\t\treject(canNotBeStopped)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet declineReason = _this.isStopNotAllowed(options);\r\n\t\t\t\tif(declineReason) {\r\n\t\t\t\t\t_this.triggerMethod('stop:decline',declineReason);\r\n\t\t\t\t\treject(declineReason);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\t\t\t\t\r\n\r\n\t\t\t\tlet currentState = _this._getLifeState();\r\n\t\t\t\tlet dependedOn = _this._getStopPromise();\r\n\t\t\t\t_this.triggerMethod('before:stop', ...args);\r\n\t\t\t\tdependedOn.then(() => {\r\n\t\t\t\t\t_this._tryMergeStopOptions(options);\t\t\r\n\t\t\t\t\t_this.once('stop', (...args) => resolve(...args));\r\n\t\t\t\t\t_this.triggerStop(options);\r\n\t\t\t\t},(...args) => {\r\n\t\t\t\t\t_this._setLifeState(currentState);\r\n\t\t\t\t\treject(...args);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn promise;\r\n\r\n\t\t},\r\n\r\n\t\ttriggerStop(options) {\r\n\t\t\tthis.triggerMethod('stop', options);\r\n\t\t},\r\n\r\n\r\n\r\n\r\n\r\n\t\t//lifecycle state helpers\r\n\t\t_setLifeState(newstate){\r\n\t\t\tthis.setState(STATE_KEY, newstate);\r\n\t\t},\r\n\r\n\t\t_getLifeState(){\r\n\t\t\treturn this.getState(STATE_KEY);\r\n\t\t},\r\n\r\n\t\t_isLifeState(state){\r\n\t\t\treturn this._getLifeState() === state;\r\n\t\t},\r\n\r\n\t\t_isLifeStateIn(...states){\r\n\t\t\treturn _(states).some((state) => this._isLifeState(state));\r\n\t\t},\r\n\r\n\t\t_isInProcess(){\r\n\t\t\treturn this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);\r\n\t\t},\r\n\r\n\r\n\t\t_registerStartableLifecycleListeners(){\r\n\t\t\tlet freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.freezeUI))\r\n\t\t\t\tthis.on(`state:${STATE_KEY}:${STATES.STARTING}`,() => {\r\n\t\t\t\t\tthis.freezeUI();\r\n\t\t\t\t});\r\n\t\t\tif(freezeWhileStarting && _.isFunction(this.unFreezeUI))\r\n\t\t\t\tthis.on('start',() => {\r\n\t\t\t\t\tthis.unFreezeUI();\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\tthis.on('before:start', () => this._setLifeState(STATES.STARTING));\r\n\t\t\tthis.on('start', () => this._setLifeState(STATES.RUNNING));\r\n\t\t\tthis.on('before:stop',() => this._setLifeState(STATES.STOPPING));\r\n\t\t\tthis.on('stop',() => this._setLifeState(STATES.WAITING));\r\n\t\t\tthis.on('destroy',() => this._setLifeState(STATES.DESTROYED));\r\n\r\n\t\t},\t\r\n\r\n\t\t_tryMergeStartOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStartOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_tryMergeStopOptions(options){\r\n\t\t\tif(!this.mergeOptions) return;\r\n\t\t\tvar mergeoptions = this.getProperty('mergeStopOptions') || [];\r\n\t\t\tthis.mergeOptions(options, mergeoptions);\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIntact(opts = {throwError: false}) {\r\n\t\t\tlet message = 'Startable has already been destroyed and cannot be used.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\r\n\t\t\tlet destroyed = this._isLifeState(STATES.DESTROYED);\r\n\t\t\tif(opts.throwError && destroyed){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(destroyed){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableIsIdle(opts = {throwError:false}){\r\n\t\t\tlet message = 'Startable is not idle. current state: ' + this._getLifeState();\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet isNotIntact = this._ensureStartableIsIntact(opts);\r\n\t\t\tlet notIdle = this._isInProcess();\r\n\t\t\tif(opts.throwError && notIdle){\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\telse if(isNotIntact){\r\n\t\t\t\treturn isNotIntact;\r\n\t\t\t}\r\n\t\t\telse if(notIdle){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t_ensureStartableCanBeStarted(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable has already been started.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\t\t\tlet allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;\r\n\r\n\t\t\tif(!notIdle && allowStartWithoutStop) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\t\t\tif(opts.throwError && running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t\r\n\t\t_ensureStartableCanBeStopped(opts = {throwError:false}){\r\n\t\t\t\r\n\t\t\tlet message = 'Startable should be in `running` state.';\r\n\t\t\tlet error = new YatError({\r\n\t\t\t\tname: 'StartableLifecycleError',\r\n\t\t\t\tmessage: message\r\n\t\t\t});\t\t\t\t\r\n\t\t\tlet notIdle = this._ensureStartableIsIdle(opts);\r\n\r\n\t\t\tlet allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;\r\n\t\t\tif(!notIdle && allowStopWithoutStart) return;\r\n\r\n\t\t\tlet running = this._isLifeState(STATES.RUNNING);\r\n\r\n\t\t\tif(opts.throwError && !running){\r\n\t\t\t\tthrow error;\r\n\t\t\t}else if(notIdle){\r\n\t\t\t\treturn notIdle;\r\n\t\t\t}else if(!running){\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\r\n\t\t},\t\r\n\t\t\r\n\t\t_getStartPromise(options = {}){\r\n\t\t\treturn Promise.all(this._getStartPromises(options));\r\n\t\t},\r\n\r\n\t\t_getStartPromises(options = {}){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStartParentPromise());\r\n\t\t\tpromises.push(this._getStartPagePromise());\r\n\t\t\tif(options.noruntime !== true)\r\n\t\t\t\tpromises.push(this._getStartRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStartRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startRuntimePromises');\r\n\t\t},\r\n\t\t_getStartPagePromise(){\r\n\t\t\treturn getPropertyPromise(this,'startPromises');\r\n\t\t},\r\n\t\t_getStartParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStartPromise))\r\n\t\t\t\treturn parent._getStartPromise({noruntime: true});\r\n\t\t},\r\n\r\n\t\t_getStopPromise(){\r\n\t\t\treturn Promise.all(this._getStopPromises());\r\n\t\t},\r\n\t\t\r\n\t\t_getStopPromises(){\r\n\t\t\tlet promises = [];\r\n\t\t\tpromises.push(this._getStopRuntimePromise());\r\n\t\t\treturn promises;\r\n\t\t},\r\n\r\n\t\t_getStopRuntimePromise(){\r\n\t\t\treturn getPropertyPromise(this,'stopPromises');\r\n\t\t},\r\n\r\n\t\t_getStopParentPromise(){\r\n\t\t\tvar parent = _.result(this, 'getParent');\r\n\t\t\tif(_.isObject(parent) && _.isFunction(parent._getStopPromise))\r\n\t\t\t\treturn parent._getStopPromise();\r\n\t\t},\r\n\r\n\r\n\t});\r\n\r\n\tMixin.Startable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\n\r\nexport default (Base) => {\r\n\t\r\n\tconst CHILDREN_FIELD = '_children';\r\n\r\n\tlet Mixin = Base.extend({\r\n\t\tconstructor(...args) {\r\n\t\t\tBase.apply(this, args);\r\n\t\t\tthis.initializeChildrenable(...args);\r\n\t\t},\r\n\r\n\t\tinitializeChildrenable(options = {}){\r\n\t\t\tthis._initializeParrent(options);\r\n\t\t\tthis._initializeChildren(options);\r\n\t\t},\r\n\r\n\t\thasChildren(){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\treturn this[CHILDREN_FIELD].length > 0;\r\n\t\t},\r\n\r\n\t\tgetChildren(opts = {startable:true}){\r\n\t\t\tlet all = this[CHILDREN_FIELD] || [];\r\n\t\t\tif(!opts.startable){\r\n\t\t\t\treturn all;\r\n\t\t\t}else{\r\n\t\t\t\treturn all.filter((c) => !c.getProperty('isStartNotAllowed'));\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thasParent(){\r\n\t\t\tlet parent = this.getParent();\r\n\t\t\treturn _.isObject(parent);\r\n\t\t},\r\n\r\n\t\tgetParent(){\r\n\t\t\treturn this.getProperty('parent', {deep:false});\r\n\t\t},\r\n\r\n\t\t_initializeChildren(){\r\n\t\t\tlet _children = this.getProperty('children');\r\n\t\t\tlet children = [];\r\n\t\t\t_(_children).each((child) => {\r\n\r\n\t\t\t\tlet childContext = this._normalizeChildContext(child);\r\n\t\t\t\tlet initialized = this._initializeChild(childContext);\r\n\t\t\t\tif(initialized) children.push(initialized);\r\n\r\n\t\t\t});\r\n\t\t\tthis[CHILDREN_FIELD] = children;\r\n\t\t},\r\n\t\t_initializeChild(childContext)\r\n\t\t{\r\n\t\t\tif(childContext == null || !_.isFunction(childContext.Child)) return;\r\n\r\n\t\t\tlet Child = childContext.Child;\r\n\t\t\tlet opts = this._normalizeChildOptions(childContext);\r\n\t\t\treturn this.buildChild(Child, opts);\r\n\t\t},\r\n\r\n\t\t_normalizeChildContext(child){\r\n\t\t\tlet childContext = {};\r\n\r\n\t\t\tif(_.isFunction(child) && child.Childrenable){\r\n\t\t\t\t_.extend(childContext, { Child: child });\r\n\t\t\t}else if(_.isFunction(child)){\r\n\t\t\t\tchildContext = this._normalizeChildContext(child.call(this));\r\n\t\t\t}\r\n\t\t\telse if(_.isObject(child)){\r\n\t\t\t\tchildContext = child;\r\n\t\t\t}\r\n\t\t\treturn childContext;\r\n\t\t},\r\n\r\n\t\t_normalizeChildOptions(options){\r\n\t\t\tlet opts = _.extend({}, options);\r\n\t\t\tif(this.getOption('passToChildren') === true){\r\n\t\t\t\t_.extend(opts, this.options);\r\n\t\t\t}\r\n\t\t\topts.parent = this;\r\n\t\t\tdelete opts.Child;\r\n\t\t\treturn this._buildChildOptions(opts);\r\n\t\t},\r\n\r\n\t\t_buildChildOptions: function(def){\r\n\t\t\treturn _.extend(def, this.getProperty('childOptions'));\r\n\t\t},\r\n\r\n\t\tbuildChild(ChildClass, options){\r\n\t\t\treturn new ChildClass(options);\r\n\t\t},\r\n\r\n\t\t_initializeParrent(opts){\r\n\t\t\tif(this.parent == null && opts.parent != null)\r\n\t\t\t\tthis.parent = opts.parent;\r\n\t\t},\r\n\r\n\t});\r\n\r\n\tMixin.Childrenable = true;\r\n\r\n\treturn Mixin;\r\n}\r\n","import _ from 'underscore';\r\nimport cid from '../functions/common/wrap';\r\nlet templateContextStore = [(view) => {\r\n\treturn {\r\n\t\t_v: view,\r\n\t\t_m: view.model || {},\r\n\t\t_cid: (arg) => cid(view.cid, arg)\r\n\t}\r\n}];\r\nlet compiledContext = {}; //rethink how it can be used\r\nlet hasChanges = false;\r\n\r\nfunction normalizeValue(value, ...args){\r\n\tif(_.isFunction(value))\r\n\t\treturn value(...args);\r\n\telse if(_.isObject(value))\r\n\t\treturn value;\r\n\telse\r\n\t\treturn {};\r\n}\r\n\r\nconst GlobalTemplateContext = {\r\n\tmix(viewTemplateContext, ...args){\r\n\t\tlet global = this.get(...args);\r\n\t\treturn _.extend(global, viewTemplateContext);\r\n\t},\r\n\tget(...args){\r\n\t\treturn this.compile(...args);\r\n\t},\t\r\n\tadd(...args){\r\n\t\t_(args).each((item) => this.push(item));\r\n\t},\r\n\r\n\tcompile(...args){ \r\n\r\n\t\tif(hasChanges)\r\n\t\t\tcompiledContext = {};\r\n\r\n\t\tlet newcontext = {};\r\n\r\n\t\t_(templateContextStore).each((cntx) => {\r\n\t\t\tif(_.isFunction(cntx))\r\n\t\t\t\t_.extend(newcontext, normalizeValue(cntx, ...args));\r\n\t\t\telse if(hasChanges){\r\n\t\t\t\t_.extend(compiledContext, cntx);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif(!hasChanges)\r\n\t\t\t_.extend(newcontext, compiledContext);\r\n\t\t\r\n\t\thasChanges = false;\r\n\t\treturn newcontext;\r\n\t},\r\n\tpop(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.pop();\r\n\t},\r\n\tshift(){\r\n\t\thasChanges = true;\r\n\t\treturn templateContextStore.shift();\r\n\t},\r\n\tpush(item){ \r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.push(item); \r\n\t},\r\n\tunshift(item){\r\n\t\thasChanges = true;\r\n\t\ttemplateContextStore.unshift(item);\r\n\t},\r\n\tclear(){\r\n\t\thasChanges = false;\r\n\t\tcompiledContext = {};\r\n\t\ttemplateContextStore = [];\r\n\t},\r\n}\r\n\r\nexport default GlobalTemplateContext;\r\n","import _ from 'underscore';\r\nimport TemplateContext from '../singletons/template-context';\r\n\r\nexport default (Base) => Base.extend({\r\n\tmixinTemplateContext(target = {}) {\r\n\t\t\r\n\t\tvar templateContext = TemplateContext.mix(_.result(this, 'templateContext'), this);\r\n\t\t\r\n\t\treturn _.extend(target, templateContext);\r\n\t},\r\n})\r\n","import GetNameLabel from './get-name-label';\r\nimport GetOptionProperty from './get-option-property';\r\nimport Radioable from './radioable.js';\r\nimport Stateable from './stateable';\r\nimport Startable from './startable';\r\nimport Childrenable from './childrenable';\r\nimport GlobalTemplateContext from './global-template-context';\r\n\r\nexport default {\r\n\tGetNameLabel,\r\n\tGetOptionProperty,\r\n\tRadioable,\r\n\tStateable,\r\n\tStartable,\r\n\tChildrenable,\r\n\tGlobalTemplateContext,\r\n}\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from '../helpers/mix';\r\nimport GetOptionProperty from '../mixins/get-option-property';\r\nimport fns from '../functions/common/common';\r\nconst BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);\r\nexport default BaseBehavior.extend({\r\n\r\n\tlistenViewInitialize: true,\r\n\r\n\tconstructor(){\r\n\r\n\t\tif(this.getProperty('listenViewInitialize') === true)\r\n\t\t\tthis.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));\r\n\r\n\t\tBaseBehavior.apply(this, arguments);\r\n\t},\r\n\r\n\tgetModel: function () {\r\n\t\treturn this.view.model;\r\n\t},\t\r\n\tcidle(name){\r\n\t\treturn fns.wrap(this.view.cid, name);\r\n\t},\r\n\tunCidle(name){\r\n\t\treturn fns.unwrap(name, this.view.cid); \r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst BaseDraggable = Behavior.extend({\r\n\r\n\ttriggerEl: undefined, //drag initialization element, if not set equal to view.$el\r\n\tmoveBeforeStart: 10,\r\n\tscope: 'drag',\r\n\r\n\tgetDragEventsContext(){\r\n\t\treturn this.$doc;\r\n\t},\r\n\tgetDragEventsElementSelector(){\r\n\t\treturn '*';\r\n\t},\r\n\tgetTriggerEl(){\r\n\t\tif(this._$el) return this._$el;\r\n\r\n\t\tlet el = this.getOption('triggerEl');\r\n\t\tif(el == null && this.view.$el)\r\n\t\t\tthis._$el = this.view.$el;\r\n\t\telse if(el && el.jquery) this._$el = el\r\n\t\telse if(el instanceof HTMLElement) this._$el = $(el)\r\n\t\telse if(typeof el === 'string' && el.length)\r\n\t\t\tthis._$el = this.view.$(el);\r\n\t\telse\r\n\t\t\tthrow new Error('trigger element should be a DOM or jQuery object or string selector.', el);\r\n\r\n\t\treturn this._$el;\r\n\t},\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\r\n\tshouldHandleDomEvents(dragging){\r\n\t\treturn this.isSameScope(dragging) && this !== dragging;\r\n\t},\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tthis._clearDragData();\r\n\t\t\r\n\t\tthis.$doc = $(document);\r\n\r\n\t\tBehavior.apply(this, args);\r\n\r\n\t\tthis._defineDocumentBindings();\r\n\r\n\t},\r\n\t_clearDragData(){\r\n\t\tthis._dragData = {};\r\n\t},\r\n\t_defineDocumentBindings(){\r\n\t\tthis.__b = {};\r\n\t\tthis.__b.setupDragDetection = _.bind(this._setupDragDetection, this);\r\n\t\tthis.__b.handleMouseUp = _.bind(this._handleMouseUp, this);\r\n\t\tthis.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);\r\n\t\tthis.__b.handleDragMove = _.bind(this._handleDragMove, this);\r\n\t\tthis.__b.handleElementEnter = _.bind(this._handleElementEnter, this);\r\n\t\tthis.__b.handleElementLeave = _.bind(this._handleElementLeave, this);\r\n\t\tthis.__b.handleElementOver = _.bind(this._handleElementOver, this);\r\n\t},\r\n\r\n\tonInitialize(){\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\r\n\r\n\t_initializeDragListener(){\r\n\t\tlet $el = this.getTriggerEl();\r\n\t\t$el.one('mousedown', this.__b.setupDragDetection);\r\n\t},\r\n\t_setupDragDetection(e){\r\n\t\tif(this.view.dragDisabled === true){ \r\n\t\t\tthis._initializeDragListener();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\te.stopPropagation();\r\n\r\n\t\tthis.$doc.one('mouseup', this.__b.handleMouseUp);\r\n\r\n\t\tthis._dragData.startX = e.pageX;\r\n\t\tthis._dragData.startY = e.pageY;\r\n\t\tthis.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t},\r\n\t_handleMouseUp(e){\r\n\t\tif(this._dragData.dragging)\r\n\t\t\tthis._handleDragEnd(e);\r\n\t\telse\r\n\t\t\tthis._handleEndWithoutDrag(e);\r\n\r\n\t\tthis._initializeDragListener();\r\n\t},\r\n\t_handleEndWithoutDrag(e){\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\t},\r\n\t_handleDragEnd(e){\r\n\t\tthis._dragData.dragging = false;\r\n\r\n\t\tthis.$doc.off('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\t$context.off('mouseenter', this.__b.handleElementEnter);\r\n\t\t$context.off('mousemove', this.__b.handleElementOver);\r\n\r\n\t\tif(this._dragData.drop && this._dragData.drop.context){\r\n\t\t\tthis._dragData.drop.context.catchDraggable(this, this._dragData.drop);\r\n\t\t\tthis.triggerMethod('drag:drop', this._dragData.drop);\r\n\t\t}\r\n\r\n\t\tthis.triggerMethod('drag:end');\r\n\r\n\t},\r\n\r\n\t_handleMoveAfterMouseDown(e){\r\n\t\te.stopPropagation();\r\n\r\n\t\tlet distance = this._getStartPositionPixelOffset(e);\r\n\t\tlet startIfMoreThan = this.getOption('moveBeforeStart');\r\n\t\tif(distance >= startIfMoreThan)\r\n\t\t\tthis._startDragSession();\r\n\t},\r\n\t_getStartPositionPixelOffset(e){\r\n\t\tlet x = Math.abs(e.pageX - this._dragData.startX);\r\n\t\tlet y = Math.abs(e.pageY - this._dragData.startY);\r\n\t\treturn x > y ? x : y;\r\n\t},\r\n\t_startDragSession(){\r\n\t\tthis._dragData.dragging = true;\r\n\t\tthis.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);\r\n\r\n\t\tthis.$doc.on('mousemove', this.__b.handleDragMove);\r\n\r\n\t\tlet $context = this.getDragEventsContext();\r\n\t\tlet selector = this.getDragEventsElementSelector();\r\n\r\n\t\t$context.on('mouseenter', selector, this.__b.handleElementEnter);\r\n\r\n\t\t$context.on('mousemove', selector, this.__b.handleElementOver);\r\n\r\n\r\n\t\tthis.view.triggerMethod('drag:start');\r\n\t},\r\n\t_handleDragMove(ev){\r\n\t\tev.stopPropagation();\r\n\r\n\t\tthis.triggerMethod('drag', ev);\r\n\r\n\t},\r\n\t_handleElementEnter(e){\r\n\t\tlet $over = $(e.target);\r\n\r\n\r\n\t\tif(this._dragData.over != $over){\r\n\t\t\tthis._dragData.over = $over;\r\n\t\t\t$over.trigger('drag:enter', this);\r\n\t\t\t$over.one('mouseleave', () => this.trigger('drag:leave', this));\r\n\r\n\t\t}\r\n\t},\r\n\t_handleElementLeave(e){\r\n\t\tlet $over = $(e.target);\r\n\t\t$over.trigger('drag:leave', this);\r\n\t},\r\n\t_handleElementOver(e){\r\n\t\tlet $over = $(e.target);\r\n\t\tlet event = this._createCustomDomEvent('drag:over', e);\r\n\t\t$over.trigger(event, this);\r\n\t},\r\n\t_createCustomDomEvent: function (name, event, merge) {\r\n\t\tif (!merge)\r\n\t\t\tmerge = [\"pageX\", \"pageY\", \"clientX\", \"clientY\", \"offsetX\", \"offsetY\", \"target\"];\r\n\r\n\t\tvar customEvent = jQuery.Event(name);\r\n\t\t_(merge).each((prop) => customEvent[prop] = event[prop]);\r\n\r\n\t\treturn customEvent;\r\n\t},\t\r\n});\r\n\r\nexport default BaseDraggable;\r\n","import _ from 'underscore';\r\nimport BaseDraggable from './_base-draggable';\r\n\r\nconst DraggableBehavior = BaseDraggable.extend({\r\n\r\n\tuseGhost: true,\r\n\tviewCssClass: 'dragging',\r\n\tghostCssClass: 'ghost',\r\n\r\n\tconstructor: function(...args){\r\n\t\t\r\n\t\tBaseDraggable.apply(this, args);\r\n\r\n\t\tthis.on('drag', this._onDrag);\r\n\t\tthis.on('drag:start', this._onDragStart);\r\n\t\tthis.on('drag:end', this._onDragEnd);\r\n\r\n\t},\r\n\r\n\tevents:{\r\n\t\t'drag:enter'(e, dragging){\r\n\t\t\tif(!this.shouldHandleDomEvents(dragging)) return;\r\n\t\t},\r\n\t\t'drag:over'(e, dragging){\r\n\t\t\tif(!this.isSameScope(dragging)) return;\r\n\t\t\te.stopPropagation();\r\n\r\n\t\t\tlet newEvent = this._createCustomDomEvent('drag:over', e);\r\n\r\n\t\t\tlet parent = this.$el.parent();\r\n\t\t\tif(parent)\r\n\t\t\t\tparent.trigger(newEvent, [dragging, this]);\t\t\t\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t_onDragEnd(ev){\r\n\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._removeGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.removeClass(this.getOption('viewCssClass'));\r\n\r\n\t\tthis._clearDragData();\r\n\t},\r\n\t_onDragStart(ev){\r\n\t\tif(this.getOption('useGhost'))\r\n\t\t\tthis._createGhost();\r\n\t\tif(this.getOption('viewCssClass'))\r\n\t\t\tthis.view.$el.addClass(this.getOption('viewCssClass'));\r\n\t},\r\n\t_onDrag(ev){\r\n\t\tthis.setGhostPosition(ev.pageY, ev.pageX);\r\n\t},\r\n\t_removeGhost(){\r\n\t\tthis.$ghost.remove();\r\n\t\tdelete this.$ghost;\r\n\t},\r\n\tcreateGhost(){\r\n\t\tlet $g = this.$el.clone();\r\n\t\tlet {top,left} = this.$el.offset();\r\n\t\t$g.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t\twidth: this.$el.outerWidth(),\r\n\t\t\theight: this.$el.outerHeight(),\r\n\t\t});\r\n\t\treturn $g;\r\n\t},\r\n\t_createGhost(){\r\n\t\tvar $g = this.createGhost();\r\n\t\tif($g.css('position') != 'absolute')\r\n\t\t\t$g.css('position','absolute');\r\n\r\n\t\tlet addClasses = this.getOption('ghostCssClass');\r\n\t\tif(addClasses)\r\n\t\t\t$g.addClass(addClasses);\r\n\r\n\t\t$g.appendTo($('body'));\r\n\t\tthis._setGhost($g);\r\n\t},\r\n\t_setGhost($g){\r\n\t\tthis.$ghost = $g;\r\n\t},\r\n\tgetGhost(){\r\n\t\treturn this.$ghost;\t\r\n\t},\r\n\tsetGhostPosition(top, left){\r\n\t\t\r\n\t\tlet $ghost = this.getGhost();\r\n\t\tif (!$ghost) return;\r\n\r\n\t\t$ghost.css({\r\n\t\t\ttop: top + 'px',\r\n\t\t\tleft: left + 'px',\r\n\t\t});\t\t\r\n\r\n\t}\r\n\r\n});\r\n\r\n\r\nexport default DraggableBehavior;\r\n","import _ from 'underscore';\r\nimport Behavior from './behavior';\r\n\r\nconst DroppableBehavior = Behavior.extend({\r\n\tscope:'drag',\r\n\tevents:{\r\n\t\t'drag:over':'_onDomDragOver'\r\n\t},\r\n\r\n\t//because of mn 3.5.1 bug of first render isAtached flag\r\n\t_skipFirstAttach: true,\r\n\r\n\tisSameScope(dragging){\r\n\t\treturn dragging.scope === this.scope;\r\n\t},\r\n\tgetEventXY(e){\r\n\t\treturn {x: e.pageX, y: e.pageY};\r\n\t},\r\n\tgetChildren(){\r\n\t\treturn _(this.view.children._views).filter((v) => v.model && v.isRendered() && v.isAttached());\r\n\t},\r\n\tcatchDraggable(draggable, dropContext){\r\n\t\tthis._onDrop(draggable, dropContext);\r\n\t},\r\n\t\r\n\t\r\n\tconstructor: function(...args){\r\n\t\tBehavior.apply(this, args);\r\n\t\tthis._initReorderBehavior();\r\n\t},\r\n\t_initReorderBehavior(){\r\n\t\tthis.listenToOnce(this.view, 'render', () => {\r\n\t\t\tthis.reOrder({ silent: true })\r\n\t\t\tthis.listenTo(this.view.collection, 'update', function (collection, options) {\r\n\t\t\t\tlet changes = (options || {}).changes || {};\r\n\t\t\t\tthis.reOrder();\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\treOrder(options = {}){\r\n\t\t\r\n\t\tthis.view.sort();\r\n\r\n\t\tvar children = this.children = [];\r\n\t\tvar skipAttach = this._skipFirstAttach\r\n\t\t_(this.view.children._views).each((view, index) => {\r\n\t\t\tif (!view.model) return;\r\n\t\t\tview.model.set('order', index);\r\n\t\t\tif (view.isRendered() && (skipAttach || view.isAttached()))\r\n\t\t\t\tchildren.push(view);\r\n\t\t});\r\n\r\n\t\tthis.hasChildren = this.children.length > 0;\r\n\r\n\t\tif (options.silent != true && this.view.collection)\r\n\t\t\tthis.view.collection.trigger('reordered');\r\n\r\n\t\tthis._skipFirstAttach = false;\r\n\r\n\t},\r\n\r\n\t// _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },\r\n\t// _onChildrenReady(){\r\n\t// \tthis._refreshChildren();\r\n\t// },\r\n\t// _refreshChildren(){\r\n\t\t\r\n\t// \tthis.children = this.getChildren();\r\n\t// \tthis.hasChildren = this.children.length > 0;\r\n\r\n\t// \tthis.view.collection.trigger('reordered', this.view.collection.cid);\r\n\t// },\r\n\r\n\r\n\t_onDomDragOver(e, dragging, child){\r\n\t\tif(!this.isSameScope(dragging)) return;\r\n\t\te.stopPropagation();\r\n\t\t\r\n\r\n\t\tif(dragging === child || (this.hasChildren && !child)) return;\r\n\r\n\t\tdragging._dragData.drop || (dragging._dragData.drop = {});\r\n\t\tlet storedDrop = dragging._dragData.drop;\r\n\r\n\t\tlet xy = this.getEventXY(e);\r\n\r\n\t\tlet drop = this._getDropContext(xy, child);\r\n\t\tdrop.context = this;\r\n\r\n\t\tlet mixedDrop = _.extend({}, storedDrop, drop);\r\n\t\tlet keys = _.keys(mixedDrop);\r\n\t\tlet hasChanges = _(keys).some((k) => storedDrop[k] !== drop[k]);\r\n\t\tif(hasChanges){\r\n\t\t\tdragging._dragData.drop = drop;\r\n\t\t\tthis._onDropContextChange(dragging, drop);\r\n\t\t}\r\n\r\n\t},\r\n\t_getDropContext(xy, child){\r\n\r\n\t\tlet children = this.children || [];\r\n\t\tif(!children.length) return {insert:'before'};\r\n\r\n\t\tlet $el = child ? child.$el : this.$el;\r\n\t\tlet position = this._getPositionByEventXY(xy, $el);\r\n\t\treturn this._getDropContextByPosisiton(position, child);\r\n\r\n\t},\r\n\t_getPositionByEventXY(xy, $el){\r\n\r\n\t\tlet elOffset = $el.offset();\r\n\t\tlet elDimension = {width: $el.outerWidth(), height: $el.outerHeight()};\r\n\t\tlet xHalf = elOffset.left + elDimension.width / 2;\r\n\t\tlet yHalf = elOffset.top + elDimension.height / 2;\r\n\t\tlet r = {x:undefined, y:undefined};\r\n\r\n\t\tr.x = xy.x <= xHalf ? 'left' : 'right'\r\n\t\tr.y = xy.y <= yHalf ? 'top' : 'bottom';\r\n\r\n\t\treturn r;\r\n\t},\r\n\t_getDropContextByPosisiton(position, child){\r\n\r\n\t\tlet direction = this.getOption('direction') || 'vertical';\r\n\r\n\t\tlet insert = direction == 'horizontal' \r\n\t\t\t? position.x == 'left' ? 'before' : 'after'\r\n\t\t\t: position.y == 'top' ? 'before' : 'after';\r\n\r\n\t\tvar childView = undefined;\r\n\r\n\t\tif(child){\r\n\t\t\tchildView = child.view;\r\n\t\t}else{\r\n\t\t\tchildView = insert == 'before' ? this.children[0] : (this.children.length && _(this.children).last());\r\n\t\t}\r\n\r\n\t\tlet index = this.view.children._views.indexOf(childView);\r\n\r\n\t\treturn {\r\n\t\t\tinsert,\r\n\t\t\tchildView,\r\n\t\t\tindex,\r\n\t\t\tnoChild: !child,\r\n\t\t}\r\n\r\n\t},\r\n\t_onDropContextChange(dragging, context){\r\n\t\tthis.triggerMethod('drop:context:change', dragging, context);\r\n\t},\r\n\t_onDrop(draggable, dropContext){\r\n\t\tthis.triggerMethod('drop', draggable, dropContext);\r\n\t},\r\n});\r\n\r\n\r\n\r\nexport default DroppableBehavior;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\n\r\nconst DynamicClass = Behavior.extend({\t\r\n\tupdateElementClass(changeSource){\r\n\t\tlet viewCls = _.result(this.view, 'className') || '';\r\n\t\tlet addCls = _.result(this.view, 'dynamicClassName') || '';\r\n\t\tthis.$el.attr({\r\n\t\t\tclass: (viewCls + ' ' + addCls).trim()\r\n\t\t});\r\n\r\n\t},\r\n\r\n\trefreshOnModelChange: true,\r\n\trefreshOnDomChange: false,\r\n\trefreshOnViewRefresh: true,\r\n\trefreshOnViewBeforeRender: true,\r\n\trefreshOnViewRender: false,\r\n\r\n\tmodelEvents:{\r\n\t\t'change'(){ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change'); }\r\n\t},\r\n\tevents:{\r\n\t\t'change'(){ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change'); }\r\n\t},\r\n\tonRefresh(){\r\n\t\tthis.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh'); \r\n\t},\r\n\tonRender(){\r\n\t\tthis.getProperty('refreshOnViewRender') && this.updateElementClass('view:render'); \r\n\t},\r\n\tonBeforeRender(){\r\n\t\tthis.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render'); \r\n\t},\r\n\tonRefreshCssClass(){\r\n\t\tthis.updateElementClass();\r\n\t},\r\n\tonSetupRefreshCssClass(setup){\r\n\t\tif(setup == null || !_.isObject(setup)) return;\r\n\t\tlet properties = ['refreshOnModelChange','refreshOnDomChange','refreshOnViewRefresh','refreshOnViewBeforeRender','refreshOnViewRender'];\r\n\t\t_(setup).each((value, property) => {\r\n\t\t\tthis[property] = value === true;\r\n\t\t});\r\n\t},\r\n});\r\n\r\nexport default DynamicClass;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Behavior from './behavior';\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport flattenObject from '../functions/common/flatten-unflatten/flatten-object';\r\nimport unFlattenObject from '../functions/common/flatten-unflatten/unflatten-object';\r\n\r\nexport default mix(Behavior).with(Stateable).extend({\r\n\tapplyDelay: 1, //in ms\r\n\tautoApplyToModel: false, //finalize\r\n\tautoChangeModel: false, //on every change\r\n\t\r\n\tfillFormFromModel: true,\r\n\r\n\tapplySelector: '.apply',\r\n\tcancelSelector: '.cancel',\r\n\tresetSelector: '.reset',\r\n\r\n\tinitialize(opts){\r\n\r\n\t\tthis.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));\r\n\t\tthis.mergeOptions(opts,['values']);\r\n\r\n\t\tthis.extendDefaultValues({});\r\n\r\n\t},\r\n\r\n\textendDefaultValues(hash){\r\n\r\n\t\tthis._values = _.extend(this._values || {}, hash);\r\n\r\n\t},\t\r\n\r\n\tonViewInitialize(){\r\n\r\n\t\t//this.extendDefaultValues(this.getProperty('values'));\r\n\r\n\t\tlet model = this.getModel();\r\n\t\tif(model){\r\n\t\t\tthis.extendDefaultValues(model.toJSON());\r\n\t\t}\r\n\t},\r\n\r\n\tonRender(){\r\n\r\n\t\tif(!this.firstRender){\r\n\t\t\tthis.buildFormBindings();\r\n\t\t\tthis.setState(this._tryFlatValues(this._values));\r\n\t\t\tthis.setValuesToForm(this.getValues({raw:true}));\t\t\t\r\n\t\t}\r\n\t\tthis.firstRender = true;\r\n\t},\r\n\r\n\r\n\t//finallizing\r\n\ttriggers(){\r\n\t\treturn {\r\n\t\t\t['click ' + this.getProperty('applySelector')]:'trigger:apply',\r\n\t\t\t['click ' + this.getProperty('cancelSelector')]:'trigger:cancel',\r\n\t\t\t['click ' + this.getProperty('resetSelector')]:'trigger:reset',\r\n\t\t}\r\n\t},\r\n\r\n\t_tryFlatValues(raw){\r\n\t\treturn flattenObject(raw);\r\n\t},\r\n\t_tryUnFlatValues(raw){\r\n\t\treturn unFlattenObject(raw);\r\n\t},\r\n\trollbackToDefaultValues(){\r\n\t\tthis.clearState();\r\n\t\tlet rawvalues = this._values;\r\n\t\tlet values = this._tryFlatValues(rawvalues);\r\n\t\tthis.setState(values);\r\n\t},\r\n\tgetValues(options = {}){\r\n\t\tlet raw = this.getState();\r\n\t\tif(options.raw) return raw;\r\n\t\tlet values = this._tryUnFlatValues(raw);\r\n\t\treturn values;\r\n\t},\r\n\tonTriggerApply(){ this._apply(); },\r\n\tonTriggerCancel(){ this._cancel(); },\r\n\tonTriggerReset(){ this._reset(); },\r\n\t_apply(){\r\n\t\tlet values = this.getValues();\r\n\t\tthis.view.triggerMethod('values:apply', values);\r\n\t\tthis._tryChangeModel(values);\r\n\t},\r\n\t_cancel(){\r\n\t\tthis.rollbackToDefaultValues();\r\n\t\tlet values = this._getFullHash(this._values);\r\n\t\tthis.view.triggerMethod('values:cancel', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\t_reset(){\r\n\t\tthis.clearState();\r\n\t\tlet values = this._getFullHash({});\r\n\t\tthis.view.triggerMethod('values:reset', values);\r\n\r\n\t\tthis.setValuesToForm(values);\r\n\t\tthis._tryChangeModel(values, {clear: true});\r\n\t},\r\n\tonState(state){\r\n\t\tthis._tryChangeModel(state, {type:'property'})\r\n\t},\r\n\t_tryChangeModel(hash, options = {}){\r\n\t\tlet canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';\r\n\t\tlet canChange = this.getProperty(canChangeProp) === true;\r\n\r\n\t\tif(!canChange) return;\r\n\t\tlet model = this.getModel();\r\n\t\tif(!model) return;\r\n\r\n\t\thash = this._tryUnFlatValues(hash);\r\n\t\tif(options.clear === true)\r\n\t\t\tmodel.clear();\r\n\t\tmodel.set(hash);\r\n\r\n\t},\r\n\t_getFullHash(values = {}){\r\n\t\tlet modelHash = this.getModel() && this.getModel().toJSON();\r\n\t\tlet full = _.extend({}, this.values, this.mappings, modelHash);\r\n\t\tlet res = {};\r\n\t\t_(full).each((v,key) => res[key] = undefined);\r\n\t\treturn _.extend(res, values);\r\n\t},\r\n\r\n\r\n\t//dom manipulations\r\n\tbuildFormBindings(){\r\n\t\tthis.mappings = {};\r\n\t\tlet tags = [\"input\",\"textarea\",\"select\"];\r\n\t\tthis.$(\"[name]\").each((i, el) => {\r\n\t\t\tif(tags.indexOf(el.tagName.toLowerCase()) == -1) return;\r\n\r\n\t\t\tlet property = this.unCidle(el.name);\r\n\t\t\tif(property in this.mappings) return;\r\n\r\n\t\t\tlet info = this._getElementInfo(el, tags);\r\n\t\t\tif(info)\r\n\t\t\t\tthis.mappings[property] = info;\r\n\t\t});\r\n\t\tlet ext = {};\r\n\t\t_(this.mappings).each((context, name) => { context.values && (ext[name] = context.values); });\r\n\r\n\t\tthis.extendDefaultValues(ext);\r\n\t},\r\n\t_getElementInfo(el, tags){\r\n\t\tlet context = {\r\n\t\t\tname: el.name\r\n\t\t};\r\n\t\tlet values;\r\n\t\tlet selector = `[name=\"${el.name}\"]`;\r\n\t\tlet $found = this.$(selector);\r\n\t\tif(!$found.length) return;\r\n\r\n\t\tif($found.length > 1){\r\n\t\t\tlet foundValues = [];\r\n\t\t\tlet isArray = false;\r\n\t\t\t$found.each((i, found) => {\r\n\t\t\t\tif(tags.indexOf(found.tagName.toLowerCase()) == -1) return;\r\n\t\t\t\tlet $el = $(found);\r\n\t\t\t\tif((found.type != 'checkbox' && found.type != 'radio') || $el.prop('checked')){\r\n\t\t\t\t\tlet val = $el.val();\r\n\t\t\t\t\tisArray || (isArray = found.type === 'checkbox' || val instanceof Array);\r\n\t\t\t\t\tif(val instanceof Array)\r\n\t\t\t\t\t\tfoundValues = foundValues.concat(val);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tfoundValues.push($el.val());\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tvalues = (!foundValues.length || (foundValues.length === 1 && !isArray)) \r\n\t\t\t\t\t? foundValues[0]\r\n\t\t\t\t\t: foundValues;\r\n\t\t} else {\r\n\t\t\tvalues = $found.get(0).type === 'checkbox' \r\n\t\t\t\t\t\t? ($found.prop('checked') ? [$found.val()] : [])\r\n\t\t\t\t\t\t: $found.val();\t\t\t\t\r\n\t\t}\r\n\t\tcontext.values = values;\r\n\t\tcontext.isArray = values instanceof Array;\r\n\t\tcontext.$elements = $found;\r\n\t\treturn context;\r\n\t},\r\n\tsetValuesToForm(values, options = {}){\r\n\r\n\t\t_(values).each((propertyValues, propertyName) => {\r\n\t\t\tlet property = this.mappings[propertyName];\r\n\t\t\tlet $els = property.$elements;\r\n\t\t\tlet arr = propertyValues instanceof Array ? propertyValues : [propertyValues];\r\n\t\t\t$els.each((i, el) => {\r\n\r\n\t\t\t\tthis._setValueToElement(el, i, arr);\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\t_setValueToElement(el, index, values){\r\n\t\tlet value = index < values.length && values[index];\r\n\t\tlet $el = el.jquery ? el : $(el);\r\n\t\tel = $el.get(0);\r\n\t\tif(el.type === 'checkbox' || el.type === 'radio'){\r\n\t\t\t$el.prop('checked', values.indexOf($el.val()) >= 0);\r\n\t\t}else{\r\n\t\t\t$el.val(value);\r\n\t\t}\r\n\t},\r\n\r\n\t// dom listeners\r\n\tevents:{\r\n\t\t'change':'domChange',\r\n\t\t'input':'domInput'\r\n\t},\t\r\n\tdomChange(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\tdomInput(e) {\r\n\t\tthis.applyValue(e.target.name, e.target, e);\r\n\t},\r\n\t_applyValue(name, el, event){\r\n\t\tif(el.type == 'checkbox')\r\n\t\t\tthis._applyCheckboxValue(name, el, event);\r\n\t\telse\r\n\t\t\tthis._applySimpleValue(name, el, event);\r\n\t},\r\n\t_applySimpleValue(name,el,event){\r\n\t\tname = this.unCidle(name);\r\n\t\tlet $el = $(el);\r\n\t\tthis.setState(name, $el.val());\r\n\t},\r\n\t_applyCheckboxValue(name, el, event){\r\n\t\tlet selector = `input[type=checkbox][name=\"${name}\"]:checked`;\r\n\t\tlet values = this.$(selector).map((i, el) => el.value).toArray();\r\n\t\tname = this.unCidle(name);\r\n\t\tthis.setState(name, values);\r\n\t},\t\r\n\r\n});\r\n","import Behavior from './behavior';\r\nimport Draggable from './draggable';\r\nimport Droppable from './droppable';\r\nimport DynamicClass from './dynamic-class';\r\nimport FormToHash from './form-to-hash';\r\nexport default { Behavior, Draggable, Droppable, DynamicClass, FormToHash };\r\n","import Mn from 'backbone.marionette';\r\nimport mixin from './helpers/mix.js';\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport Radioable from './mixins/radioable.js';\r\n\r\nexport default mixin(Mn.Object).with(GetOptionProperty, Radioable);\r\n","\r\nimport mix from '../helpers/mix';\r\nimport Stateable from '../mixins/stateable';\r\nimport YatObject from '../YatObject';\r\nimport Bb from 'backbone';\r\nimport _ from 'underscore';\r\nimport YatError from '../YatError';\r\n\r\nconst IDENTITY_CHANNEL = 'identity';\r\n\r\nlet Base = mix(YatObject).with(Stateable);\r\n\r\nlet nativeAjax = $ && $.ajax;\r\n\r\nlet Identity = Base.extend({\t\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatUser();\r\n\t},\r\n\t_initializeYatUser(){},\t\r\n\tchannelName: IDENTITY_CHANNEL,\r\n\ttokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires \r\n\tisAnonym(){\r\n\t\treturn !this.getState('id');\r\n\t},\r\n\tisUser(){\r\n\t\treturn !this.isAnonym();\r\n\t},\r\n\tisMe(id){\r\n\t\treturn id && this.getState('id') === id;\r\n\t},\r\n\tupdate(hash){\r\n\t\tthis.setState(hash);\r\n\t\tthis.trigger('change');\r\n\t},\r\n\tlogIn(hash){\r\n\t\tif(!hash.id) return;\r\n\t\tthis.update(hash);\r\n\t\tthis.trigger('log:in');\r\n\t},\r\n\tlogOut(){\r\n\t\tthis.clearState();\r\n\t\tthis.trigger('change');\r\n\t\tthis.trigger('log:out');\r\n\t},\r\n\tgetBearerToken(data){\r\n\t\tlet url = this.getOption('bearerTokenUrl');\r\n\t\tlet promise = new Promise((resolve, reject) => {\r\n\t\t\tnativeAjax({url, data, method:'POST'})\r\n\t\t\t\t.then(\r\n\t\t\t\t\t(token) => { \r\n\t\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\t\tresolve(token);\r\n\t\t\t\t\t\tthis.triggerMethod('token', token);\r\n\t\t\t\t\t},\r\n\t\t\t\t\t(error) => reject(error)\r\n\t\t\t\t);\r\n\t\r\n\t\t});\r\n\t\treturn promise;\r\n\t},\r\n\r\n\tajax(...args){\r\n\t\tlet options = args[0];\r\n\t\toptions.headers = _.extend({}, options.headers, this.getAjaxHeaders());\r\n\t\tlet needRefresh = this.isTokenRefreshNeeded();\r\n\t\tif(!needRefresh){\r\n\t\t\treturn $.ajax(...args); //nativeAjax.apply($, args);\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn this.refreshBearerToken()\r\n\t\t\t\t.then(() => nativeAjax.apply($, args))\r\n\t\t\t\t.catch((error) =>{ \r\n\t\t\t\t\tlet promise = $.Deferred();\r\n\t\t\t\t\tpromise.reject(error);\r\n\t\t\t\t\treturn promise;\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\tgetAjaxHeaders(){\r\n\t\tthis._ajaxHeaders || (this._ajaxHeaders = {});\r\n\t\treturn this._ajaxHeaders;\r\n\t},\r\n\t_updateHeaders(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tlet headers = this.getAjaxHeaders();\r\n\t\r\n\t\tif(token){\r\n\t\t\theaders.Authorization = 'Bearer ' + token;\r\n\t\t\theaders.Accept = 'application/json';\r\n\t\t}else{\r\n\t\t\tdelete headers.Authorization;\r\n\t\t}\r\n\t},\t\r\n\tsetTokenObject(token){\r\n\r\n\t\tif(token != null && _.isObject(token))\r\n\t\t\ttoken.expires = new Date(Date.now() + (token.expires_in * 1000));\r\n\r\n\t\tthis._token = token;\r\n\t\tthis._updateHeaders();\r\n\t\tthis._replaceBackboneAjax();\r\n\r\n\t\tthis.triggerMethod('tocken:change');\r\n\t},\r\n\tgetTokenObject(){\r\n\t\treturn this._token;\r\n\t},\r\n\t_replaceBackboneAjax(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token)\r\n\t\t\tBb.ajax = $.ajax;//$.ajax = nativeAjax;\r\n\t\telse\r\n\t\t\tBb.ajax = (...args) => this.ajax(...args); //$.ajax = (...args) => Yat.identity.ajax(...args);\r\n\t},\r\n\tgetTokenValue(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.access_token;\r\n\t},\r\n\tgetRefreshToken(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn token.refresh_token;\r\n\t},\r\n\tgetTokenExpires(){\r\n\t\tlet token = this.getTokenObject();\r\n\t\treturn (token || {}).expires;\r\n\t},\r\n\tgetTokenSeconds(){\r\n\t\tlet expires = this.getTokenExpires();\r\n\t\r\n\t\tif(expires == null || isNaN(expires.valueOf())) {\r\n\t\t\tconsole.warn('expires is null or wrong');\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\r\n\t\tlet offset = this.getProperty('tokenExpireOffset');\r\n\t\tif(offset == null) offset = 30000; //30 sec\r\n\t\r\n\t\tvar deadline = expires.valueOf() - offset;\r\n\t\tvar deadlineMs = deadline - Date.now();\r\n\t\treturn deadlineMs > 0 ? deadlineMs / 1000 : 0;\r\n\t},\r\n\tisTokenRefreshNeeded(){\r\n\t\tlet token = this.getTokenValue();\r\n\t\tif(!token) return false;\t\r\n\t\treturn !this.getTokenSeconds();\r\n\t},\r\n\trefreshBearerToken(){\r\n\t\tlet bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');\r\n\t\tlet doRefresh = this.isTokenRefreshNeeded();\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tif(!doRefresh){\r\n\t\t\t\tresolve();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\r\n\t\t\tif(bearerTokenRenewUrl == null){\r\n\t\t\t\treject(new Error('Token expired and `bearerTokenRenewUrl` not set'));\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tlet data = {\r\n\t\t\t\t'grant_type':'refresh_token',\r\n\t\t\t\t'refresh_token': this.getRefreshToken()\r\n\t\t\t};\r\n\t\t\tnativeAjax({\r\n\t\t\t\turl:bearerTokenRenewUrl, \r\n\t\t\t\tdata,\r\n\t\t\t\tmethod:'POST'\r\n\t\t\t})\r\n\t\t\t\t.then((token) => {\r\n\t\t\t\t\tthis.setTokenObject(token);\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t}, () => {\r\n\t\t\t\t\tthis.triggerMethod('refresh:token:expired');\r\n\t\t\t\t\treject(YatError.Http401());\r\n\t\t\t\t});\r\n\t\r\n\t\t});\r\n\t}\r\n});\r\n\r\nlet identity = new Identity();\r\nexport default identity;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nimport GetOptionProperty from './mixins/get-option-property';\r\nexport default mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({\r\n\t\r\n\tinstantRender: false,\r\n\trenderOnReady: false,\r\n\ttriggerReady: false,\r\n\r\n\tmanualAfterInitialize: true,\r\n\r\n\tconstructor(...args){\r\n\t\t\r\n\t\tMn.View.apply(this, args);\r\n\t\t\r\n\t\tlet options = args[0];\r\n\t\tthis.mergeOptions(options, ['instantRender','renderOnReady', 'triggerReady', 'manualAfterInitialize']);\r\n\r\n\t\tif(this.manualAfterInitialize === true)\r\n\t\t\tthis._afterInitialize();\r\n\r\n\t},\r\n\t_afterInitialize(){\r\n\r\n\t\tif(this.instantRender === true)\r\n\t\t\tthis.render();\r\n\r\n\t\tif(this.renderOnReady === true)\r\n\t\t\tthis.once('ready',this.render);\r\n\r\n\t\tif(this.renderOnReady === true || this.triggerReady === true)\r\n\t\t\tthis.trigger('ready', this);\r\n\t\t\t\r\n\t},\r\n});\r\n","import _ from 'underscore';\r\nimport flat from './functions/common/flatten-unflatten/flatten-object';\r\nimport unflat from './functions/common/flatten-unflatten/unflatten-object';\r\nimport getByPath from './functions/common/set-get-by-path/get-by-path';\r\nimport setByPath from './functions/common/set-get-by-path/set-by-path';\r\nimport YatObject from './YatObject';\r\n\r\nconst YatConfig = YatObject.extend({\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['name', 'channelName', 'noRadio']);\r\n\t\tif(this.noRadio !== true && this.channelName == null)\r\n\t\t\tthis.channelName = name;\r\n\t},\r\n\tgetStore(){\r\n\t\tthis.store || (this.store = {});\r\n\t\treturn this.store;\r\n\t},\r\n\tradioRequest: {\r\n\t\tget(...args){ this.get(...args); },\r\n\t\tset(path, value){ this.set(path,value); }\r\n\t},\r\n\tget(path, ...args){\r\n\t\tlet store = this.getStore();\r\n\t\tlet value = getByPath(store, path);\r\n\t\tif(_.isFunction(value)){\r\n\t\t\tvalue = value.apply(this, args);\r\n\t\t}\r\n\t\t\r\n\t\treturn value;\r\n\t},\r\n\tset(path, value){\r\n\t\tlet store = this.getStore();\r\n\t\tlet result = setByPath(store, path, value);\r\n\t\tthis.triggerSet(path, value);\r\n\t},\r\n\ttriggerSet(path, value){\r\n\t\tif(!path) return;\r\n\t\tlet arr = path.split('/');\r\n\t\tlet radio = this.getChannel();\r\n\t\tdo{\r\n\t\t\tlet event = arr.join(':');\r\n\t\t\tthis.triggerMethod(event, value);\r\n\t\t\tradio && radio.trigger(event, value);\r\n\t\t\tarr.pop();\r\n\t\t}while(arr.length > 0)\r\n\t}\r\n});\r\n\r\nexport default function(name, options = {}){\r\n\toptions.name = name;\t\r\n\treturn new YatConfig(options);\r\n}\r\n","import Config from './../../YatConfig';\r\n\r\nconst config = new Config('yat:modals:singleton',{ noRadio: true });\r\n\r\nlet modalsShowFull = {\r\n\tbg: true,\r\n\tclose:true,\r\n}\r\n\r\nlet modalsShowSimple = {\r\n\tbg:false,\r\n\tclose:false,\r\n}\r\n\r\nlet modalOptionsDefault = {\r\n\tcloseOnClickOutside: true,\r\n\tcloseOnPromise: true,\r\n\tpreventClose: false,\r\n\tasPromise: false,\r\n};\r\n\r\nlet modalsCssDefaults = {\r\n\twrapper:'yat-modal-wrapper',\r\n\tbg:'yat-modal-bg',\r\n\tcontentWrapper:'yat-modal-content-wrapper',\r\n\tclose: 'yat-modal-close',\r\n\theader: 'yat-modal-header',\r\n\tcontent: 'yat-modal-content',\r\n\tactions: 'yat-modal-actions',\r\n\tresolve: 'yat-modal-resolve',\r\n\treject: 'yat-modal-reject',\r\n}\r\n\r\nlet modalsLabelsDefaults = {\r\n\tclose: '×',\r\n\tresolve: 'ok',\r\n\treject: 'cancel'\r\n}\r\n\r\nlet modalsTypes = {\r\n\tfull: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tsimple: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowSimple,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: modalOptionsDefault,\r\n\t},\r\n\tconfirm: {\r\n\t\tcss: modalsCssDefaults,\r\n\t\tshow: modalsShowFull,\r\n\t\tlabels: modalsLabelsDefaults,\r\n\t\toptions: {\r\n\t\t\tcloseOnClickOutside: true,\r\n\t\t\tcloseOnPromise: true,\r\n\t\t\tpreventClose: false,\r\n\t\t\tasPromise: true,\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\n\r\n\r\nconfig.set('types.full', modalsTypes.full);\r\nconfig.set('types.simple', modalsTypes.simple);\r\nconfig.set('types.confirm', modalsTypes.confirm);\r\n\r\nconfig.set('defaultShow', modalsShowFull);\r\nconfig.set('defaultCss', modalsCssDefaults);\r\nconfig.set('defaultLabels', modalsLabelsDefaults);\r\n\r\nexport default config;\r\n","import _ from 'underscore';\r\nimport config from './config';\r\nimport Bb from 'backbone';\r\nimport Mn from 'backbone.marionette';\r\nimport YatView from './../../YatView.js';\r\nimport mix from './../../helpers/mix';\r\nimport OptionProperty from './../../mixins/get-option-property';\r\nlet template = _.template(\r\n`<% if(show.bg) {%> data-role=\"modal-bg\">
<% } %>\r\n data-role=\"modal-content-wrapper\">\r\n\t<% if(show.close) {%>
<% } %>\r\n\t<% if(show.header) {%>
data-role=\"modal-header\"><%= header %><% } %>\r\n\t
data-role=\"modal-content\"><%= text %>
\r\n\t<% if(show.actions) {%>\r\n\t
data-role=\"modal-actions\">\r\n\t\t<% if(show.resolve) {%><% } %>\r\n\t\t<% if(show.reject) {%><% } %>\r\n\t
\r\n\t<% } %>\r\n
\r\n`);\r\n\r\n\r\n\r\nconst ModalView = mix(YatView).with(OptionProperty).extend({\r\n\r\n\trenderOnReady: true,\r\n\ttemplate: template,\r\n\r\n\tattributes(){\r\n\t\treturn {'data-role':'modal-wrapper'};\r\n\t},\r\n\r\n\tinitialize(options){\r\n\t\tthis.mergeOptions(options, ['content', 'header', 'text']);\r\n\t\t\r\n\t\tlet _this = this;\r\n\r\n\t\tif(this.getOption('asPromise') === true){\r\n\t\t\tthis.promise = new Promise(function(resolve, reject){\r\n\t\t\t\t_this.once('resolve',(arg) => resolve(arg));\r\n\t\t\t\t_this.once('reject',(arg) => reject(arg));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.once('resolve reject',(arg, destroying) => {\r\n\t\t\tthis.preventClose = false;\r\n\t\t\t\r\n\t\t\tif(this.getConfigValue('options','closeOnPromise') && !destroying){\r\n\t\t\t\tthis.destroy();\r\n\t\t\t}\t\t\t\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tcanBeClosed(){\r\n\t\treturn this.getConfigValue('options','preventClose') !== true;\r\n\t},\r\n\tdestroy(opts = {}){\r\n\t\t\r\n\t\tif(!this.canBeClosed() && opts.force !== true) return;\r\n\r\n\t\treturn YatView.prototype.destroy.apply(this, arguments);\r\n\r\n\t},\r\n\tui:{\r\n\t\t'bg': '[data-role=\"modal-bg\"]',\r\n\t\t'contentWrapper': '[data-role=\"modal-content-wrapper\"]',\t\t\r\n\t\t'text':'[data-role=\"modal-content\"]',\r\n\t\t'header':'[data-role=\"modal-header\"]',\r\n\t\t'close':'[data-role=\"modal-close\"]',\r\n\t\t'resolve':'[data-role=\"modal-resolve\"]',\r\n\t\t'reject':'[data-role=\"modal-reject\"]',\r\n\t},\r\n\ttriggers:{\r\n\t\t'click @ui.close':{ event: 'click:close', stopPropagation: true },\r\n\t\t'click @ui.reject':{ event: 'click:reject', stopPropagation: true },\r\n\t\t'click @ui.resolve':{ event: 'click:resolve', stopPropagation: true },\r\n\t\t'click @ui.text':{ event: 'click:content', stopPropagation: true },\r\n\t\t'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },\r\n\t\t'click @ui.bg':{ event: 'click:bg', stopPropagation: true },\r\n\t\t'click': { event: 'click:wrapper', stopPropagation: true },\r\n\t},\r\n\tregions:{\r\n\t\t'content':'[data-role=\"modal-content\"]'\r\n\t},\r\n\tonBeforeDestroy(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'), true);\r\n\t},\r\n\r\n\tonClickClose(){ this.destroy(); },\r\n\r\n\tonClickResolve(){ \r\n\t\tthis.trigger('resolve', this.getProperty('resolve'));\r\n\t},\r\n\tonClickReject(){ \r\n\t\tthis.trigger('reject', this.getProperty('reject'));\r\n\t},\r\n\r\n\tonClickBg(){ this.clickedOutsideOfModal(); },\r\n\tonClickWrapper(){ this.clickedOutsideOfModal(); },\r\n\r\n\tclickedOutsideOfModal(){\r\n\t\tif(this.getConfigValue('options','closeOnClickOutside') === true)\r\n\t\t\tthis.destroy();\r\n\r\n\t},\r\n\r\n\r\n\tonBeforeRender(){\r\n\t\t//apply wrapper class here;\r\n\t\tlet cfg = this.getConfig();\r\n\t\tcfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);\r\n\t\t\r\n\t\tthis.$el.appendTo($('body'));\r\n\t},\r\n\tonRender(){\r\n\t\tif(this.content instanceof Bb.View){\r\n\t\t\tthis.showChildView('content', this.content);\r\n\t\t\tthis.content.inModal = this;\r\n\t\t}\r\n\t},\r\n\t\r\n\t_getModalOptions(){\r\n\t\tlet h = {};\r\n\t\tif(this.getOption('closeOnClickOutside') != null)\r\n\t\t\th.closeOnClickOutside = this.getOption('closeOnClickOutside');\r\n\t\tif(this.getOption('closeOnPromise') != null)\r\n\t\t\th.closeOnPromise = this.getOption('closeOnPromise');\r\n\t\tif(this.getOption('preventClose') != null)\r\n\t\t\th.preventClose = this.getOption('preventClose');\r\n\t\tif(this.getOption('asPromise') != null)\r\n\t\t\th.asPromise = this.getOption('asPromise');\r\n\r\n\t\treturn h;\r\n\t},\r\n\tgetConfigValue(section, name){\r\n\t\tlet cfg = this.getConfig() || {};\r\n\t\treturn (cfg[section] || {})[name];\r\n\t},\r\n\tgetConfig(key){\t\t\r\n\t\tif(this.config) return this.config;\r\n\r\n\t\tlet typeName = this.getOption('type') || 'simple';\r\n\t\tlet type = _.extend({},config.get('types.' + typeName) || {});\r\n\r\n\t\ttype.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));\r\n\t\ttype.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));\r\n\t\ttype.css= _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));\r\n\t\t\r\n\t\ttype.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());\r\n\r\n\t\tif(type.show.header == null && this.getOption('header'))\r\n\t\t\ttype.show.header = true;\r\n\t\t\r\n\t\tif(type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise))\r\n\t\t\ttype.show.resolve = true;\r\n\t\tif(type.show.reject == null && this.getOption('reject'))\r\n\t\t\ttype.show.reject = true;\r\n\r\n\t\tif(type.show.actions == null && (type.show.resolve || type.show.reject))\r\n\t\t\ttype.show.actions = true;\r\n\r\n\t\treturn this.config = type;\r\n\t},\r\n\r\n\ttemplateContext(){\r\n\t\tlet cfg = this.getConfig();\r\n\t\treturn {\r\n\t\t\tcss(name){\r\n\t\t\t\treturn cfg.css[name] ? ` class=\"${cfg.css[name]}\"` : '';\r\n\t\t\t},\r\n\t\t\tlabel(name){\r\n\t\t\t\treturn cfg.labels[name] || '';\r\n\t\t\t},\r\n\t\t\tshow : cfg.show,\r\n\t\t\ttext: this.getOption('text'),\r\n\t\t\theader: this.getOption('header'),\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport default ModalView;\r\n","import $ from 'jquery';\r\nimport _ from 'underscore';\r\nimport Bb from 'backbone';\r\nimport mixin from './../../helpers/mix.js';\r\nimport YatObject from './../../YatObject.js';\r\nimport Stateable from './../../mixins/stateable.js';\r\nimport YatError from './../../YatError.js';\r\nimport View from './../../YatView.js';\r\nimport __ from './../../functions/common/common.js';\r\nimport ModalView from './modalView';\r\nimport config from './config';\r\n\r\nlet ModalEngine = mixin(YatObject).with(Stateable).extend({\r\n\tconstructor(...args){\r\n\t\tthis.modals = [];\r\n\t\tYatObject.apply(this, args);\r\n\t\tthis.listenForEsc = _.bind(this._listenForEsc, this);\r\n\t\t$(() => {\r\n\t\t\tthis.doc = $(document);\r\n\t\t\tthis.doc.on('keyup', this.listenForEsc);\r\n\t\t});\r\n\t},\r\n\tchannelName:'modals',\r\n\t\r\n\tshow(...args){\r\n\t\tlet options = this._normalizeArguments(...args);\r\n\t\treturn this._create(options);\r\n\t},\r\n\tremove(modal){\r\n\r\n\t\tif(!modal)\r\n\t\t\tmodal = _.last(this.modals);\r\n\r\n\t\tmodal && modal.destroy();\r\n\t},\r\n\r\n\t_listenForEsc(e){\r\n\t\tif(e.keyCode !== 27) return;\r\n\t\t\r\n\t\tif(this.modals.length)\r\n\t\t\tthis.remove();\r\n\t},\r\n\t_create(options){\r\n\t\tlet modal = new ModalView(options);\r\n\t\tlet _this = this;\r\n\t\tthis.listenToOnce(modal, 'destroy', function(){ _this._remove(modal); })\r\n\t\tthis.modals.push(modal);\r\n\t\treturn modal;\r\n\t},\r\n\t_remove(modal){\r\n\r\n\t\tif(!modal) return;\r\n\r\n\t\tlet ind = this.modals.indexOf(modal);\r\n\t\tif(ind > -1) this.modals.splice(ind, 1);\r\n\r\n\t\tthis.stopListening(modal);\r\n\r\n\t},\r\n\t_normalizeArguments(...args){\r\n\t\t\r\n\t\tlet options = {};\r\n\t\tlet len = args.length;\r\n\t\tif(!len)\r\n\t\t\treturn;\r\n\r\n\t\tif(len === 1){\r\n\t\t\tif(__.isView(args[0]))\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\telse if(_.isString(args[0]))\r\n\t\t\t\toptions.text = args[0];\r\n\t\t\telse if(_.isObject(args[0]))\r\n\t\t\t\t_.extend(options, args[0]);\r\n\t\t} else if (len === 2){\r\n\t\t\tif(_.isString(args[0]) && _.isString(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.text = args[1];\r\n\t\t\t}else if(_.isString(args[0]) && __.isView(args[1])){\r\n\t\t\t\toptions.header = args[0];\r\n\t\t\t\toptions.content = args[1];\r\n\t\t\t}else if(_.isString(args[1]) && __.isView(args[0])){\r\n\t\t\t\toptions.header = args[1];\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}else if(_.isString(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\tif(__.isView(options.content))\r\n\t\t\t\t\toptions.header = args[0];\r\n\t\t\t\telse\r\n\t\t\t\t\toptions.text = args[0];\r\n\t\t\t}else if(__.isView(args[0]) && _.isObject(args[1])){\r\n\t\t\t\t_.extend(options, args[1]);\r\n\t\t\t\toptions.content = args[0];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif(_.isObject(args[3]))\r\n\t\t\t\t_.extend(options, args[3]);\r\n\t\t\tif(_.isObject(args[2]))\r\n\t\t\t\t_.extend(options, args[2]);\r\n\t\t\telse if(_.isString(args[2]))\r\n\t\t\t\toptions.type = args[2];\r\n\r\n\t\t\tlet two = this._normalizeArguments(args[0], args[1]);\r\n\t\t\t_.extend(options, two);\r\n\t\t}\r\n\r\n\t\treturn options;\r\n\t},\r\n\tonBeforeDestroy(){\r\n\t\tif(this.doc)\r\n\t\t\tthis.doc.off('keyup',this.listenForEsc);\r\n\t}\r\n});\r\n\r\nconst modalEngine = new ModalEngine();\r\n\r\n\r\nexport default {\r\n\tshow(...args){\r\n\t\treturn modalEngine.show(...args);\r\n\t},\r\n\taddTypeConfig(name, cfg){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\tconfig.set('types.'+name,cfg);\r\n\t},\r\n\tgetTypeConfig(name){\r\n\t\tif(!name || !_.isString(name)) return;\r\n\t\treturn config.get('types.'+name);\r\n\t},\r\n};\r\n","import TemplateContext from './template-context';\r\nimport identity from './identity';\r\nimport modals from './modals/modals';\r\nexport default { TemplateContext, identity, modals };\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport Bb from 'backbone';\r\nimport mixin from './helpers/mix.js';\r\n\r\nimport GetOptionProperty from './mixins/get-option-property.js';\r\nimport RadioMixin from './mixins/radioable.js';\r\nimport Startable from './mixins/startable.js';\r\nimport Childrenable from './mixins/childrenable.js';\r\n\r\nlet Base = mixin(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);\r\n\r\nexport default Base.extend({\r\n\r\n\tinitRadioOnInitialize: true,\r\n\t_initRegion(opts = {skip:true}){\r\n\t\tif(opts.skip) return;\r\n\t\tvar region = this.getProperty('region');\r\n\t\tthis.region = region;\r\n\t\tBase.prototype._initRegion();\r\n\t}, \r\n\r\n\tgetRegion() {\r\n\t\tif(!this._region) this._initRegion({skip:false});\r\n\t\treturn this._region;\r\n\t},\r\n\r\n\taddPageManager(pageManager){\r\n\t\tthis._pageManagers || (this._pageManagers = []);\r\n\t\tthis._pageManagers.push(pageManager);\r\n\r\n\t\tlet prefix = pageManager.getName();\r\n\t\tif(!prefix){\r\n\t\t\tconsole.warn('pageManager prefix not defined');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.listenTo(pageManager, 'all', (eventName, ...args) => {\r\n\t\t\tlet prefixedEventName = prefix + ':' + eventName;\r\n\t\t\tthis.triggerMethod(prefixedEventName, ...args);\r\n\t\t});\r\n\t\tthis.listenTo(pageManager, 'state:currentPage',(...args) => this.triggerMethod('page:swapped',...args));\r\n\t\t\r\n\t},\r\n\r\n\thasPageManagers(){\r\n\t\treturn this._pageManagers && this._pageManagers.length > 0;\r\n\t},\r\n\r\n\tgetMenuTree(opts = {rebuild:false}){\r\n\t\tif(this._menuTree && !opts.rebuild) return this._menuTree;\r\n\t\tlet managers = this._pageManagers || [];\r\n\t\tlet links = _(managers).chain().map((manager) => manager.getLinks()).flatten().value();\r\n\t\tthis._menuTree = new Bb.Collection(links);\r\n\t\treturn this._menuTree;\r\n\t},\r\n\r\n\tgetPage(key){\r\n\t\tif(!this.hasPageManagers()) return;\r\n\t\treturn _(this._pageManagers).find((mngr) => mngr.getPage(key));\r\n\t},\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nexport default Mn.AppRouter.extend({},{\r\n\tcreate(hash, context){\r\n\t\tlet appRoutes = {};\r\n\t\tlet controller = {};\r\n\t\tlet _this = this;\r\n\t\t_(hash).each((handlerContext, key) => {\r\n\t\t\tappRoutes[key] = key;\r\n\t\t\tcontroller[key] = (...args) => {\r\n\t\t\t\thandlerContext\r\n\t\t\t\t.action(...args)\r\n\t\t\t\t.catch((error) => {\r\n\t\t\t\t\t_this._catchError(error, context);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn new this({controller, appRoutes});\r\n\t},\r\n\t_catchError(error, context){\r\n\t\tif(!context || context.getProperty('throwChildErrors') === true){\r\n\t\t\tthrow error;\r\n\t\t}else{\r\n\t\t\tlet postfix = error.status ? \":\" + error.status.toString() : '';\r\n\t\t\tlet commonEvent = 'error';\r\n\t\t\tlet event = commonEvent + postfix;\r\n\r\n\t\t\tcontext.triggerMethod(commonEvent, error, this);\r\n\r\n\t\t\tif(event != commonEvent) \r\n\t\t\t\tcontext.triggerMethod(event, error, this);\r\n\r\n\t\t}\r\n\r\n\t}\r\n});\r\n","import Bb from 'backbone';\r\nexport default Bb.Model.extend({});\r\n\r\n","import Model from './model'\r\nexport default Model.extend({\r\n\tdefaults:{\r\n\t\turl: undefined,\r\n\t\tlabel: undefined,\r\n\t\ttarget: '_self',\r\n\t\tlevel: 0,\r\n\t},\r\n\tdestroy(){\r\n\t\tthis.id = null;\r\n\t\tModel.prototype.destroy.apply(this, arguments);\r\n\t}\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp.js';\r\nimport mixin from './helpers/mix';\r\nimport Startable from './mixins/startable';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter.js';\r\nimport LinkModel from './models/link';\r\nimport Bb from 'backbone';\r\nimport identity from './singletons/identity';\r\n\r\n/* \r\n\tYatPage\r\n*/\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nexport default Base.extend({\r\n\r\n\tconstructor(...args){\r\n\t\tBase.apply(this,args);\r\n\t\tthis.initializeYatPage();\r\n\t},\r\n\r\n\tallowStopWithoutStart: true,\r\n\tallowStartWithoutStop: true,\r\n\r\n\tinitializeYatPage(opts){\r\n\t\tthis.mergeOptions(opts, [\"manager\"]);\r\n\t\tthis._initializeModels(opts);\r\n\t\tthis._initializeRoute(opts);\r\n\t\tthis._proxyEvents();\r\n\t\tthis._tryCreateRouter();\r\n\t\tthis._registerIdentityHandlers();\t\t\r\n\t},\r\n\r\n\tgetLayout(opts = {rebuild: false}){\r\n\t\tif(!this._layoutView || opts.rebuild || (this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed())){\r\n\t\t\tthis.buildLayout();\r\n\t\t}\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayout(){\r\n\t\tlet Layout = this.getProperty('Layout');\r\n\t\tif(Layout == null) return;\r\n\t\tlet opts = _.extend({},this.getProperty('layoutOptions'));\r\n\r\n\t\tif(this.model && !opts.model)\r\n\t\t\t_.extend(opts,{model: this.model});\r\n\r\n\t\tif(this.collection && !opts.collection)\r\n\t\t\t_.extend(opts,{collection: this.collection});\r\n\t\t\t\r\n\t\tlet options = this.buildLayoutOptions(opts);\r\n\t\toptions.page = this;\r\n\t\tthis._layoutView = new Layout(options);\r\n\t\treturn this._layoutView;\r\n\t},\r\n\r\n\tbuildLayoutOptions(rawOptions){\r\n\t\treturn rawOptions;\r\n\t},\r\n\r\n\taddModel(model, opts = {}){\t\t\t\t\r\n\t\tif(!model) return;\r\n\t\tthis.model = model;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchModelOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(model.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\taddCollection(collection, opts = {}){\r\n\t\tif(!collection) return;\r\n\t\tthis.collection = collection;\r\n\t\tlet fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');\r\n\t\tif(fetch === undefined){\r\n\t\t\tfetch = this.getProperty('fetchDataOnAdd');\r\n\t\t}\r\n\t\tif(fetch === true){\r\n\t\t\tthis.addStartPromise(collection.fetch(opts));\r\n\t\t}\r\n\t},\r\n\r\n\tfreezeWhileStarting: true,\r\n\tfreezeUI(){ },\r\n\tunFreezeUI(){ },\r\n\r\n\tgetRouteHash(){\r\n\r\n\t\tlet hashes = [{},this._routeHandler].concat(this.getChildren({startable:false}).map((children) => children.getRouteHash()))\r\n\t\treturn _.extend(...hashes);\r\n\r\n\t},\r\n\r\n\thasRouteHash(){\r\n\t\treturn _.isObject(this.getRouteHash())\r\n\t},\r\n\r\n\tgetLinkModel(level = 0){\r\n\t\tif(!this._canHaveLinkModel()) return;\t\t\r\n\t\tif(this._linkModel) return this._linkModel;\r\n\r\n\t\tlet url = this.getRoute();\r\n\t\tlet label = this.getLabel();\r\n\t\tlet children = this._getSublinks(level);\r\n\t\tthis._linkModel = new LinkModel({ url, label, level, children });\r\n\r\n\t\treturn this._linkModel;\r\n\t},\r\n\t_canHaveLinkModel(){\r\n\t\treturn !((this.getProperty('skipMenu') === true) || (!!this.getProperty('isStartNotAllowed')));\r\n\t},\r\n\t_destroyLinkModel(){\r\n\t\tif(!this._linkModel) return;\r\n\t\tthis._linkModel.destroy();\r\n\t\tdelete this._linkModel;\r\n\t},\r\n\r\n\tgetParentLinkModel(){\r\n\t\tlet parent = this.getParent();\r\n\t\tif(!parent || !parent.getLinkModel) return;\r\n\t\tlet model = parent.getLinkModel();\r\n\t\treturn model;\r\n\t},\r\n\r\n\tgetNeighbourLinks(){\r\n\t\tlet link = this.getLinkModel();\r\n\t\tif(link && link.collection) return link.collection;\r\n\t},\r\n\r\n\tgetChildrenLinks(){\r\n\t\tlet model = this.getLinkModel();\r\n\t\tif(!model) return;\r\n\t\treturn model.get('children');\r\n\t},\r\n\r\n\t_getSublinks(level){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children || !children.length) return;\r\n\t\tlet sublinks = _(children).chain()\r\n\t\t\t.filter((child) => child.getProperty(\"skipMenu\") !== true)\r\n\t\t\t.map((child) => child.getLinkModel(level + 1))\r\n\t\t\t.value();\r\n\t\tif(!sublinks.length) return;\r\n\t\tlet col = new Bb.Collection(sublinks);\r\n\t\treturn col;\r\n\t},\r\n\r\n\t_initializeModels(opts = {}){\r\n\t\tthis.addModel(opts.model, opts);\r\n\t\tthis.addCollection(opts.collection, opts);\r\n\t},\r\n\r\n\t_initializeRoute(){\r\n\t\tlet route = this.getRoute({asPattern:true});\r\n\t\tif(route == null) return;\r\n\t\tlet page = this;\r\n\t\tthis._routeHandler = {\r\n\t\t\t[route]:{context: page, action: (...args) => page.start(...args) }\r\n\t\t};\r\n\t},\r\n\r\n\tgetRoute(opts = {asPattern:false}){\r\n\t\tlet relative = this.getProperty('relativeRoute');\r\n\t\tlet route = this.getProperty('route');\r\n\t\tlet parent = this.getParent();\r\n\t\tif(route == null) return;\r\n\t\t\r\n\t\tlet result = route;\r\n\r\n\t\tif(relative && parent && parent.getRoute){\r\n\t\t\tlet parentRoute = parent.getRoute();\r\n\t\t\tresult = parentRoute + '/' + route;\t\t\t\r\n\t\t}\r\n\r\n\t\treturn this._normalizeRoute(result, opts);\r\n\t},\r\n\t_normalizeRoute(route, opts){\t\t\r\n\t\troute = route.replace(/\\/+/gmi,'/').replace(/^\\//,'');\r\n\t\tif(opts.asPattern){\r\n\t\t\treturn route;\r\n\t\t}\r\n\t\telse{\r\n\t\t\tlet res = route.replace(/\\(\\/\\)/gmi,'/').replace(/\\/+/gmi,'/');\r\n\t\t\treturn res;\r\n\t\t}\r\n\t},\r\n\t_tryCreateRouter(){\r\n\t\tlet create = this.getProperty('createRouter') === true;\r\n\t\tif(create){\r\n\t\t\tthis.router = this._createAppRouter();\r\n\t\t}\r\n\t},\r\n\r\n\t_createAppRouter(){\r\n\t\tlet hash = this.getRouteHash();\r\n\t\tif(!_.size(hash)) return;\r\n\t\treturn new Router(hash);\r\n\t},\r\n\r\n\t_proxyEvents(){\r\n\t\tlet proxyContexts = this._getProxyContexts();\r\n\t\tthis._proxyEventsTo(proxyContexts);\r\n\t},\r\n\t_getProxyContexts(){\r\n\t\tlet rdy = [];\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager){\r\n\t\t\trdy.push({context:manager})\r\n\t\t}\r\n\t\tlet radio = this.getChannel();\r\n\t\tif(radio){\r\n\t\t\tlet allowed = this.getProperty('proxyEventsToRadio');\r\n\t\t\trdy.push({context:radio, allowed });\r\n\t\t}\r\n\t\treturn rdy;\r\n\t},\r\n\t_proxyEventsTo(contexts){\r\n\t\tlet all = [];\r\n\t\tlet eventsHash = {};\r\n\r\n\t\t_(contexts).each((context) => {\r\n\t\t\tlet events = [];\r\n\t\t\tif(!context.allowed)\r\n\t\t\t\tall.push(context.context);\r\n\t\t\telse {\r\n\t\t\t\t_(context.allowed).each(function(allowed){\r\n\t\t\t\t\teventsHash[allowed] || (eventsHash[allowed] = []);\r\n\t\t\t\t\teventsHash[allowed].push(context.context)\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet page = this;\r\n\t\tpage.on('all', (eventName, ...args) => {\r\n\t\t\tlet contexts = (eventName in eventsHash) ? eventsHash[eventName] : all;\r\n\t\t\tlet triggerArguments = [page].concat(args);\r\n\t\t\t_(contexts).each((context) => context.triggerMethod(`page:${eventName}`, ...triggerArguments))\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\tlet add = {};\r\n\t\tlet manager = this.getProperty('manager');\r\n\t\tif(manager) add.manager = manager;\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), add);\r\n\t},\t\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis._destroyLinkModel();\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t});\r\n\t}\r\n\r\n});\r\n","import _ from 'underscore';\r\nimport App from './YatApp';\r\nimport GetNameLabel from './mixins/get-name-label';\r\nimport Router from './YatRouter';\r\nimport mixin from './helpers/mix';\r\nimport identity from './singletons/identity';\r\nimport YatError from './YatError';\r\n\r\nlet Base = mixin(App).with(GetNameLabel);\r\n\r\nlet YatPageManager = Base.extend({\r\n\tconstructor(...args){\r\n\t\tBase.apply(this, args);\r\n\t\tthis._initializeYatPageManager(...args);\r\n\t},\r\n\tthrowChildErrors:true,\r\n\tcreateRouter(){\r\n\t\tlet children = this.getChildren({startable:false});\r\n\t\tlet hash = {};\r\n\t\t_(children).each(function(page){\r\n\t\t\tif(_.isFunction(page.getRouteHash)){\r\n\t\t\t\t_.extend(hash, page.getRouteHash());\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._routesHash = hash;\t\t\r\n\t\tthis.setRouter(Router.create(hash, this));\r\n\t},\r\n\tsetRouter(router){\r\n\t\tthis.router = router;\r\n\t},\r\n\tgetRouter(){\r\n\t\treturn this.router;\r\n\t},\r\n\tgetLinks(){\r\n\t\tlet children = this.getChildren();\r\n\t\tif(!children) return;\r\n\t\treturn _(children).chain()\t\t\t\r\n\t\t\t.map((child) => child.getLinkModel())\r\n\t\t\t.filter((child) => !!child)\r\n\t\t\t.value();\r\n\t},\r\n\texecute(route){\r\n\t\tlet page = this.getPage(route);\r\n\t\tif(!!page) \r\n\t\t\tpage.start({text: error.message});\r\n\t\telse if(route === '*NotFound')\r\n\t\t\tthrow new YatError.NotFound('*NotFound handler is missing');\r\n\t\telse\r\n\t\t\tthis.execute('*NotFound');\r\n\t},\r\n\tnavigate(url, opts = {trigger:true}){\r\n\r\n\t\tlet router = this.getRouter();\r\n\t\tif(router)\r\n\t\t\trouter.navigate(url, opts);\r\n\t\telse\r\n\t\t\tconsole.warn('router not found');\r\n\t},\r\n\r\n\tgetPage(key){\r\n\r\n\t\tlet found = _(this._routesHash)\r\n\t\t\t.find((pageContext, route) => {\r\n\t\t\t\tif(route === key) return true;\r\n\t\t\t\tif(pageContext.context.getName() === key) return true;\r\n\t\t\t});\r\n\t\treturn found && found.context;\r\n\r\n\t},\r\n\r\n\r\n\tnavigateToRoot(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tlet rootUrl = this.getProperty('rootUrl');\r\n\t\tif(!rootUrl){\r\n\t\t\tlet children = this.getChildren();\r\n\t\t\tif(children && children.length) {\r\n\t\t\t\tlet root = children.find((child) => child != current);\r\n\t\t\t\trootUrl = root && root.getRoute()\r\n\t\t\t}\r\n\t\t}\r\n\t\tif(rootUrl != null)\r\n\t\t\tthis.navigate(rootUrl);\r\n\t\telse\r\n\t\t\tconsole.warn('root page not found');\r\n\t},\r\n\r\n\t_initializeYatPageManager(opts = {}){\r\n\t\tthis.mergeOptions(opts, ['id','name','label']);\r\n\t\tthis._registerPageHandlers(opts);\r\n\t\tthis._registerIdentityHandlers();\r\n\t\tthis.createRouter();\r\n\t},\r\n\r\n\t_buildChildOptions: function(def){\r\n\t\treturn _.extend(def, this.getProperty('childOptions'), {\r\n\t\t\tmanager: this\r\n\t\t});\r\n\t},\t\r\n\r\n\t_registerPageHandlers(){\r\n\t\tthis.on('page:before:start', this._pageBeforeStart);\r\n\t\tthis.on('page:start', this._pageStart);\r\n\t\tthis.on('page:start:decline', this._pageDecline);\r\n\t},\r\n\r\n\t_pageBeforeStart(page){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(current && current != page){\r\n\t\t\tcurrent.stop();\r\n\t\t}\r\n\t},\r\n\r\n\t_pageStart(page){\r\n\t\tthis.setState('currentPage', page);\r\n\t},\r\n\r\n\t_pageDecline(...args){\r\n\t\t//console.log(\"decline\", args)\r\n\t},\r\n\r\n\t_registerIdentityHandlers(){\r\n\t\tthis.listenTo(identity, 'change', (...args) => {\r\n\t\t\tthis.triggerMethod('identity:change', ...args);\r\n\t\t\tthis._moveToRootIfCurrentPageNotAllowed();\r\n\t\t});\r\n\t},\r\n\t\r\n\t_moveToRootIfCurrentPageNotAllowed(){\r\n\t\tlet current = this.getState('currentPage');\r\n\t\tif(!current || !current.isStartNotAllowed()) return;\r\n\t\t\r\n\t\tthis.navigateToRoot();\r\n\t}\r\n\r\n});\r\n\r\nexport default YatPageManager;\r\n","import _ from 'underscore';\r\nimport Mn from 'backbone.marionette';\r\nimport mix from './helpers/mix';\r\nimport GlobalTemplateContext from './mixins/global-template-context';\r\nexport default mix(Mn.NextCollectionView).with(GlobalTemplateContext);\r\n","import Bb from 'backbone';\r\nexport default Bb.Collection.extend({});\r\n","import _ from 'underscore';\r\nimport YatObject from './YatObject';\r\nimport Collection from './models/collection';\r\n\r\nvar CollectionGroups = YatObject.extend({\r\n\r\n\tcollection: undefined,\r\n\tgroupBy: undefined,\r\n\r\n\tgetGroups(){ return this.groups; },\r\n\tgetGroup(name){\r\n\t\tlet groups = this.getGroups();\r\n\t\treturn groups[name];\r\n\t},\r\n\tisGroupExists(name){ return name in this.getGroups(); },\r\n\taddGroup(name, models) {\r\n\t\tif(this.isGroupExists(name)) return;\r\n\t\tlet groups = this.getGroups();\r\n\t\tgroups[name] = this._createGroup(name, models);\r\n\t\treturn groups[name];\r\n\t},\r\n\tremoveGroup(name){\r\n\t\tlet group = this.getGroup(name);\r\n\t\t\r\n\t\tif(!group) return;\r\n\r\n\t\tif(_.isFunction(group.destroy))\r\n\t\t\tgroup.destroy();\r\n\t\telse if(_.isFunction(group.stopListening))\r\n\t\t\tgroup.stopListening();\r\n\r\n\t\tdelete this.groups[name];\r\n\t},\t\r\n\r\n\r\n\tgroup() {\r\n\t\tlet result = {};\r\n\t\tlet colGroups = this.collection.groupBy(this.groupBy);\r\n\t\tlet optionGroups = this.getOption('groups');\r\n\t\t_(optionGroups).each((name) => {\r\n\t\t\tif (name in colGroups){\r\n\t\t\t\tresult[name] = colGroups[name];\r\n\t\t\t\tdelete colGroups[name];\r\n\t\t\t}\r\n\t\t\telse result[name] = [];\r\n\t\t});\r\n\t\t_(colGroups).each((models, name) => result[name] = models);\r\n\t\treturn result;\r\n\t},\r\n\r\n\tconstructor: function(options) {\r\n\t\tYatObject.apply(this, arguments);\r\n\t\tthis._initializeGrouppedCollection(options);\r\n\t},\r\n\t_initializeGrouppedCollection(options) {\r\n\t\tif (this._initializedGC == true) return;\r\n\r\n\t\toptions || {};\r\n\t\tthis.mergeOptions(options, ['collection', 'groupBy']);\r\n\t\tthis._ensureOptions();\r\n\t\tthis._initializeGroups();\r\n\t\tthis._initializeEventHandlers();\r\n\r\n\t\tthis._initializedGC == true\r\n\t},\r\n\t_ensureOptions() {\r\n\t\tif (!this.collection)\r\n\t\t\tthrow new Error('collection must be set');\r\n\r\n\t\tif (!this.groupBy)\r\n\t\t\tthrow new Error('groupBy must be set');\r\n\r\n\t\tif (typeof this.groupBy === 'string') {\r\n\t\t\tvar propertyName = this.getOption('groupBy');\r\n\t\t\tthis.groupBy = (model) => model.get(propertyName);\r\n\t\t}\r\n\r\n\t},\r\n\t_initializeGroups() {\r\n\t\tthis.groups = {};\r\n\t\tvar groups = this.group();\r\n\t\t_(groups).each((models, name) => this.addGroup(name, models));\r\n\t},\r\n\t_getCollectionClass(){\r\n\t\treturn this.getOption('CollectionClass') || Collection;\r\n\t},\r\n\t_createGroup(name,models){\r\n\t\tlet groupBy = this.groupBy;\r\n\t\tlet Collection = this._getCollectionClass();\r\n\t\tlet groupCol = new Collection(models);\r\n\t\tgroupCol.on('change', (model) => {\r\n\t\t\tif (groupBy(model) !== name)\r\n\t\t\t\tgroupCol.remove(model);\r\n\t\t});\r\n\t\tgroupCol.name = name;\r\n\t\treturn groupCol;\r\n\t},\r\n\r\n\t_initializeEventHandlers() {\r\n\t\tthis.listenTo(this.collection, 'update', this._onCollectionUpdate);\r\n\t},\r\n\t_onCollectionUpdate(col, opts) {\r\n\t\t\r\n\t\tvar data = (opts.changes.added || []).concat(opts.changes.merged || []);\r\n\r\n\t\tvar toAdd = _(data).groupBy(this.groupBy);\r\n\t\tvar toRemove = _(opts.changes.removed).groupBy(this.groupBy);\r\n\r\n\t\tvar groups = this.groups;\r\n\t\tvar addOutOfGroup = {};\r\n\t\t_(toAdd).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].add(models);\r\n\t\t\telse if(this.getOption('autoCreateNewGroups'))\r\n\t\t\t\tthis.addGroup(groupName, models);\r\n\t\t});\r\n\t\t\r\n\t\t_(toRemove).each((models, groupName) => {\r\n\t\t\tif (groupName in groups)\r\n\t\t\t\tgroups[groupName].remove(models);\r\n\t\t});\r\n\t},\r\n\t_onModelChange(model) {\r\n\t\tvar groupName = this.groupBy(model);\r\n\t\tif (this.groups[groupName])\r\n\t\t\tthis.groups[groupName].add(model);\r\n\t\telse {\r\n\t\t\tconsole.warn('model is out of groupping', model, groupName);\r\n\t\t}\r\n\t},\r\n\tdestroy() {\r\n\r\n\t\t_(this.groups).each((group) => {\r\n\t\t\tgroup.stopListening();\r\n\t\t\tif (_.isFunction(group.destroy))\r\n\t\t\t\tgroup.destroy();\r\n\t\t});\r\n\t\tdelete this.groups;\r\n\r\n\t\tif(_.isFunction(YatObject.prototype.destroy))\r\n\t\t\tYatObject.prototype.destroy.apply(this, arguments);\r\n\r\n\r\n\t\tif (_.isFunction(this.collection.destroy))\r\n\t\t\tthis.collection.destroy();\r\n\r\n\t\tdelete this.collection;\r\n\r\n\t}\r\n});\r\n\r\nexport default CollectionGroups;\r\n","import {version} from '../package.json';\nimport Functions from './functions/functions';\nimport Helpers from './helpers/Helpers';\nimport Mixins from './mixins/Mixins';\nimport Behaviors from './behaviors/behaviors';\nimport Singletons from './singletons/singletons';\nimport TemplateContext from './singletons/template-context';\nimport modals from './singletons/modals/modals';\nimport identity from './singletons/identity';\nimport yatConfig from './YatConfig';\nimport YatObject from './YatObject';\nimport YatError from './YatError';\nimport YatApp from './YatApp';\nimport YatRouter from './YatRouter';\nimport YatPage from './YatPage';\nimport YatPageManager from './YatPageManager';\nimport YatView from './YatView';\nimport YatCollectionView from './YatCollectionView';\n\nimport YatModel from './models/model';\nimport YatCollection from './models/collection';\n\nimport CollectionGroups from './YatCollectionGroups';\n\n\nconst marionetteYat = {\n\tVERSION: version,\n\tFunctions: Functions,\n\tHelpers: Helpers,\n\tMixins: Mixins,\n\tBehaviors: Behaviors,\n\tSingletons: Singletons,\n\tTemplateContext: TemplateContext,\n\tmodals: modals,\n\tidentity: identity,\n\tcreateConfig: yatConfig,\n\tObject: YatObject,\n\tError: YatError,\n\tApp: YatApp,\n\tPage : YatPage,\n\tRouter: YatRouter,\n\tPageManager: YatPageManager,\n\tView: YatView,\n\tCollectionView: YatCollectionView,\n\tModel: YatModel,\n\tCollection: YatCollection,\n\tCollectionGroups, \n};\n\nexport default marionetteYat;\n"]}
\ No newline at end of file
diff --git a/docs/YatApp.md b/docs/YatApp.md
new file mode 100644
index 0000000..7c42cb6
--- /dev/null
+++ b/docs/YatApp.md
@@ -0,0 +1,17 @@
+# YatApp
+`Marionette.Application` mixed with [GetOptionProperty](mixins/get-option-property.md), [Radioable](mixins/radioable.md), [Childrenable](mixins/childrenable.md), [Startable](mixins/startable.md)
+
+also has
+* [`PageManger`](YatPageManager.md) support
+* more smart region, it will not initialize with instance and support definition as function.
+
+## Smart region
+You can define region via options or property and it can be a function.
+Initialization occurs only when `getRegion` called.
+
+## PageManger support
+
+* `addPageManager(pageManager)` - accepts instance of PageManager and store it in internal pagemanagers store.
+pageManager events will be proxied to application with pageManager name as prefix.
+* `hasPageManagers()` - returns true if application has added pageManagers.
+* `getMenuTree()` - returns collection of pageManagers root links.
diff --git a/docs/YatError.md b/docs/YatError.md
new file mode 100644
index 0000000..b67a0be
--- /dev/null
+++ b/docs/YatError.md
@@ -0,0 +1,4 @@
+# YatError
+extends Marionette.Error
+
+for future use.
diff --git a/docs/YatObject.md b/docs/YatObject.md
new file mode 100644
index 0000000..f9a717a
--- /dev/null
+++ b/docs/YatObject.md
@@ -0,0 +1,2 @@
+# YatObject
+`Marionette.Object` mixed with [GetOptionProperty](mixins/get-option-property.md) and [Radioable](mixins/radioable.md)
diff --git a/docs/YatPage.md b/docs/YatPage.md
new file mode 100644
index 0000000..0b98895
--- /dev/null
+++ b/docs/YatPage.md
@@ -0,0 +1,28 @@
+# YatPage
+by default is an entry point to the application.
+
+## properties
+* `Layout` - Marionette.View class or function returning Marionette.View class, can be passed via options
+* `layoutOptions` - options object or function returned options object, can be passed via options
+* `allowStopWithoutStart` - if true, skips idle check on stop
+* `allowStartWithoutStop` - if true, skips idle check on start
+* `relativeRoute` - if true, adds parent route
+* `route` - route for Marionette.AppRouter. can be function
+
+## functional
+[YatApp](YatApp.md) mixed with [GetNameLabel](mixins/get-name-label.md)
+
+also
+* `hasRouteHash()` - returns true if a page has route hash.
+* `getRouteHash()` - returns route hash.
+* `getRoute()` - returns string route.
+* `getNeighbourLinks()` - returns links to neighbour pages
+* `getParentLinkModel()` - returns parent link if parent exists
+* `getLinkModel()` - returns link to this page.
+
+
+* `addCollection(collection, options)` - adds collection to the page. if options has `fetch`:`true` will also fetch collection and add fetch promise to start promises.
+* `addModel(model, options)` - adds model to the page. if options has `fetch`:`true` will also fetch model and add fetch promise to start promises.
+* `buildLayoutOptions(options)` - override this for defining own layout options.
+* `buildLayout()` - builds instance of layout view, mix options with model and/or collection if they are defined.
+* `getLayout(options)` - return instance of layout view if its already build or options has no `rebuild` property
diff --git a/docs/YatPageManager.md b/docs/YatPageManager.md
new file mode 100644
index 0000000..8f43b62
--- /dev/null
+++ b/docs/YatPageManager.md
@@ -0,0 +1,8 @@
+# YatPageManager
+
+* Initializes pages
+* Creates router for registered initialized pages on intialize.
+* Builds links tree
+
+## functional
+[YatApp](YatApp.md) mixed with [GetNameLabel](mixins/get-name-label.md)
diff --git a/docs/YatRouter.md b/docs/YatRouter.md
new file mode 100644
index 0000000..30d4be3
--- /dev/null
+++ b/docs/YatRouter.md
@@ -0,0 +1,4 @@
+# YatRouter
+Its just `Marionette.AppRouter` adapted for use with `YatPageManager`.
+
+Do not use it without YatPageManager.
diff --git a/docs/behaviors/behavior.md b/docs/behaviors/behavior.md
new file mode 100644
index 0000000..e2c4d29
--- /dev/null
+++ b/docs/behaviors/behavior.md
@@ -0,0 +1,8 @@
+## Behavior
+* `listenViewInitialize` - if true, triggers `view:initialize` on the behavior. Main goal to fix order of `onInitialize` and `onRender` calls when view rendered inside initialize method. `view:initialize` will be executed before view renders in any case.
+
+Can be a function. Default value is set to `false`.
+
+* `getModel()` - returns view model.
+* `cidle(argument)` - wraps argument with view cid. `let name = this.cidle('userName'); // "view123:userName"`,
+* `unCidle(argument)` - unwraps cidled argument. `let rawname = this.unCidle(name); // "userName"`
diff --git a/docs/behaviors/behaviors.md b/docs/behaviors/behaviors.md
new file mode 100644
index 0000000..98afede
--- /dev/null
+++ b/docs/behaviors/behaviors.md
@@ -0,0 +1,6 @@
+# Behaviors
+There are some behaviors shipped with Yat.
+
+All of them are extending base [`Behavior`](/src/behaviors/behavior.js)
+
+Behaviors can be accessed like this `Yat.Behaviors.[BehaviorName]`.
diff --git a/docs/behaviors/draggable.md b/docs/behaviors/draggable.md
new file mode 100644
index 0000000..e95b83b
--- /dev/null
+++ b/docs/behaviors/draggable.md
@@ -0,0 +1,27 @@
+## Draggable behavior
+Makes view draggable.
+
+
+### options
+* `dragTrigger` (default: view.$el) - listens for click event on this element for starting the drag session
+* `scope` (default: default) - scope is for handling certain drag sessions
+* `elementClass` - adds this css class to the view.$el on drag:start and removes it on drag:end
+* `ghostClass` - adds this css class to the ghost element
+* `startDragOnDistance` - distance in pixels for starting the drag session
+
+### example
+```js
+
+let MyDraggable = Yat.Behaviors.Draggable.extend({
+ startDragOnDistance: 1, //immediatelly
+ elementClass: 'dragging',
+ ghostClass: 'ghost',
+ scope:'my-things',
+});
+
+let View = Mn.View.extend({
+ className:'my-element', // on drag will became `my-element dragging`
+ behaviors:[MyDraggable]
+});
+
+```
diff --git a/docs/behaviors/dynamic-class.md b/docs/behaviors/dynamic-class.md
new file mode 100644
index 0000000..bcb48e3
--- /dev/null
+++ b/docs/behaviors/dynamic-class.md
@@ -0,0 +1,72 @@
+## DynamicClass
+Takes view `className` result, mix it with view `dynamicClassName` and set it to the view $el as class.
+
+### default values
+* `refreshOnModelChange` (default: `true`) - if `true` upplies dynamic style on **model** `change` event.
+
+* `refreshOnDomChange` (default: `false`) - if `true` upplies dynamic style on **$el** `change` event.
+
+* `refreshOnViewRefresh` (default: `true`) - if `true` upplies dynamic style on **view** `refresh` event.
+
+* `refreshOnViewBeforeRender` (default: `true`) - if `true` upplies dynamic style on **view** `before:render` event.
+
+* `refreshOnViewRender` (default: `false`) - if `true` upplies dynamic style on **view** `render` event.
+
+### example
+```js
+
+let DynamicClass = Yat.Behaviors.DynamicClass;
+let model = new Backbone.Model({active:false});
+let View = Mn.View.extend({
+ behaviors:[DynamicClass],
+ className: 'base-class',
+ dynamicClass: function(){
+ let cls = '';
+
+ if(this.model.get('active') === true)
+ cls += ' model-active'
+
+ if(this.isActive === true)
+ cls += ' view-active'
+
+ },
+ setActive(value){
+ this.isActive = value === true;
+ this.trigger('refresh');
+ },
+});
+
+let view = new View({model:model});
+view.render(); // view $el is `base-class`
+model.set('active',true) // view $el is `base-class model-active`
+view.toggleActive(true); // view $el is `base-class model-active view-active`
+view.toggleActive(false); // view $el is `base-class model-active`
+
+
+// setting options
+// as object hash
+let View2 = Mn.View.extend({
+ behaviors:[{
+ behaviorClass: DynamicClass,
+ refreshOnModelChange: true,
+ refreshOnDomChange: false,
+ refreshOnViewRefresh: true,
+ refreshOnViewBeforeRender: true,
+ refreshOnViewRender: false,
+ }]
+})
+
+// setting options
+// as extend
+let MyDynamicClass = DynamicClass.extend({
+ refreshOnModelChange: true,
+ refreshOnDomChange: false,
+ refreshOnViewRefresh: true,
+ refreshOnViewBeforeRender: true,
+ refreshOnViewRender: false,
+});
+let View2 = Mn.View.extend({
+ behaviors:[MyDynamicClass]
+});
+
+```
diff --git a/docs/behaviors/form-to-hash.md b/docs/behaviors/form-to-hash.md
new file mode 100644
index 0000000..0c67cb4
--- /dev/null
+++ b/docs/behaviors/form-to-hash.md
@@ -0,0 +1,2 @@
+## FormToHash
+builds hash object from view form elements.
diff --git a/docs/behaviors/sort-by-drag.md b/docs/behaviors/sort-by-drag.md
new file mode 100644
index 0000000..b9dda92
--- /dev/null
+++ b/docs/behaviors/sort-by-drag.md
@@ -0,0 +1,5 @@
+## SortByDrag
+Makes collection view able to sort items by drag and drop.
+
+child views should have `Draggable` behavior.
+
diff --git a/docs/functions/common/common.md b/docs/functions/common/common.md
new file mode 100644
index 0000000..3441078
--- /dev/null
+++ b/docs/functions/common/common.md
@@ -0,0 +1,2 @@
+# common functions
+holds some common functions. can be accessed view [`Yat.Functions.common`](/src/functions/common)
diff --git a/docs/functions/common/flatten-unflatten/flatten-object.md b/docs/functions/common/flatten-unflatten/flatten-object.md
new file mode 100644
index 0000000..1c028ce
--- /dev/null
+++ b/docs/functions/common/flatten-unflatten/flatten-object.md
@@ -0,0 +1,24 @@
+## flattenObject(obj)
+returns flat version of a given object.
+
+
+### example
+```js
+
+let obj = {
+ level1:{
+ level2:{
+ name:'deep name'
+ }
+ }
+}
+
+let result = flattenObject(obj);
+/*
+{
+ 'level1.level2.name':'deep name'
+}
+*/
+
+
+```
diff --git a/docs/functions/common/flatten-unflatten/unflatten-object.md b/docs/functions/common/flatten-unflatten/unflatten-object.md
new file mode 100644
index 0000000..25b26e6
--- /dev/null
+++ b/docs/functions/common/flatten-unflatten/unflatten-object.md
@@ -0,0 +1,25 @@
+## unFlattenObject(obj)
+returns unflatten version of a given object.
+
+
+### example
+```js
+
+let obj = {
+ 'level1.level2.name':'deep name'
+}
+
+
+let result = unFlattenObject(obj);
+/*
+{
+ level1:{
+ level2:{
+ name:'deep name'
+ }
+ }
+}
+*/
+
+
+```
diff --git a/docs/functions/common/get-label.md b/docs/functions/common/get-label.md
new file mode 100644
index 0000000..0791313
--- /dev/null
+++ b/docs/functions/common/get-label.md
@@ -0,0 +1,10 @@
+## getLabel(context, options[optional])
+Tries to get label of a given context.
+
+Checks for value this fields in exact order: 'getLabel', 'label', 'getName', 'name', 'getValue', 'value'
+
+### options
+
+* `default`: if no values found return this one.
+* `exclude`: skip this fields from process. `exclude:'id'` will not check `id` and `exclude:['getName', 'getLabel']` will not check `getName` and `getLabel`
+* `args`: tries to pass this array if met property is a function.
diff --git a/docs/functions/common/get-name.md b/docs/functions/common/get-name.md
new file mode 100644
index 0000000..4320a0b
--- /dev/null
+++ b/docs/functions/common/get-name.md
@@ -0,0 +1,10 @@
+## getName(context, options[optional])
+Tries to get name of a given context.
+
+Checks for value this fields in exact order: 'getName', 'name', 'getLabel', 'label', 'getValue', 'value'
+
+### options
+
+* `default`: if no values found return this one.
+* `exclude`: skip this fields from process. `exclude:'id'` will not check `id` and `exclude:['getName', 'getLabel']` will not check `getName` and `getLabel`
+* `args`: tries to pass this array if met property is a function.
diff --git a/docs/functions/common/get-value.md b/docs/functions/common/get-value.md
new file mode 100644
index 0000000..f8e274a
--- /dev/null
+++ b/docs/functions/common/get-value.md
@@ -0,0 +1,10 @@
+## getValue(context, options[optional])
+Tries to get value of a given context.
+
+Checks for value this fields in exact order: 'getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'
+
+### options
+
+* `default`: if no values found return this one.
+* `exclude`: skip this fields from process. `exclude:'id'` will not check `id` and `exclude:['getName', 'getLabel']` will not check `getName` and `getLabel`
+* `args`: tries to pass this array if met property is a function.
diff --git a/docs/functions/common/set-get-by-path/get-by-path.md b/docs/functions/common/set-get-by-path/get-by-path.md
new file mode 100644
index 0000000..2216c8d
--- /dev/null
+++ b/docs/functions/common/set-get-by-path/get-by-path.md
@@ -0,0 +1,20 @@
+## getByPath(obj, pathString)
+return value of `obj` property by path.
+
+
+### example
+```js
+
+let obj = {
+ level1:{
+ level2:{
+ name:'deep name'
+ }
+ }
+}
+
+let result = getByPath(obj,'level1.level2.name');
+// 'deep name';
+
+
+```
diff --git a/docs/functions/common/set-get-by-path/set-by-path.md b/docs/functions/common/set-get-by-path/set-by-path.md
new file mode 100644
index 0000000..eb072ed
--- /dev/null
+++ b/docs/functions/common/set-get-by-path/set-by-path.md
@@ -0,0 +1,22 @@
+## setByPath(obj, pathString, value)
+sets value to `obj` by path.
+
+
+### example
+```js
+
+let obj = {}
+
+let result = setByPath(obj,'level1.level2.name', 'deep name');
+/*
+{
+ level1:{
+ level2:{
+ name:'deep name'
+ }
+ }
+}
+*/
+
+
+```
diff --git a/docs/functions/common/unwrap.md b/docs/functions/common/unwrap.md
new file mode 100644
index 0000000..55e0e0f
--- /dev/null
+++ b/docs/functions/common/unwrap.md
@@ -0,0 +1,14 @@
+## unwrap(value, prefix, delimeter[optional])
+Tries to unwrap value.
+
+Default delimeter value is `:`.
+
+### example
+```js
+
+
+let result = unwrap('view123:userName','view123');
+// 'userName';
+
+
+```
diff --git a/docs/functions/common/wrap.md b/docs/functions/common/wrap.md
new file mode 100644
index 0000000..99de787
--- /dev/null
+++ b/docs/functions/common/wrap.md
@@ -0,0 +1,14 @@
+## wrap(prefix, value, delimeter[optional])
+wraps value with prefix with delimeter.
+
+Default delimeter value is `:`.
+
+### example
+```js
+
+
+let result = wrap('view123','userName');
+// 'view123:userName';
+
+
+```
diff --git a/docs/functions/view/compare-ab.md b/docs/functions/view/compare-ab.md
new file mode 100644
index 0000000..3bd5916
--- /dev/null
+++ b/docs/functions/view/compare-ab.md
@@ -0,0 +1,16 @@
+## compareAB(a, b, func[optional])
+does ab compare and return -1|0|1 as compare result
+
+### func
+func is optional argument that should be a function, invokes with `a` and `b` as context.
+
+### example
+```js
+
+let example1 = compareAB(1, 2); // -1
+let example2 = compareAB(2, 1); // 1
+
+let example2 = compareAB(-2, 1, () => Maths.abs(this)); // 1
+
+
+```
diff --git a/docs/functions/view/view-comparator.md b/docs/functions/view/view-comparator.md
new file mode 100644
index 0000000..ed1def3
--- /dev/null
+++ b/docs/functions/view/view-comparator.md
@@ -0,0 +1,37 @@
+## viewComparator
+helper function for using inside marionette collection view comparator
+
+### single compare
+viewComparator can accept three arguments. In that case it will threat them as a single compare: `[a,b,method]`
+
+`viewComparator(viewA, viewB, method)`
+
+method signature is `(model, view) => {}`. this is points to the pass argument. model and view arguments are normalized and can be undefined.
+
+```js
+
+let View = Mn.NextCollectionView.extend({
+ viewComparator(viewA, viewB){
+ return viewComparator(viewA, viewB, (model,view) => model.get('text') ); // this will sort views by alphabet order of model text property.
+ }
+});
+
+```
+
+### multiple compare
+viewComparator can accept array of `single compare`. In that case it will calculates the order by multiple parameters.
+
+`viewComparator([[a,b,method],[a,b,method], ... [a,b,method]])`
+
+```js
+
+let View = Mn.NextCollectionView.extend({
+ viewComparator(viewA, viewB){
+ return viewComparator([
+ [viewA, viewB, (model,view) => model.get('text')], //in first sorts by text asc
+ [viewB, viewA, (model,view) => model.get('order')], //than by order desc. check the order of first two arguments
+ ]);
+ }
+});
+
+```
diff --git a/docs/functions/view/view.md b/docs/functions/view/view.md
new file mode 100644
index 0000000..f8087bc
--- /dev/null
+++ b/docs/functions/view/view.md
@@ -0,0 +1,2 @@
+# view functions
+holds some useful view functions. can be accessed view [`Yat.Functions.view`](/src/functions/view)
diff --git a/docs/helpers/helpers.md b/docs/helpers/helpers.md
new file mode 100644
index 0000000..74bbf36
--- /dev/null
+++ b/docs/helpers/helpers.md
@@ -0,0 +1,2 @@
+# helpers
+a pack of usefull helpers
diff --git a/docs/helpers/isKnownCtor.md b/docs/helpers/isKnownCtor.md
new file mode 100644
index 0000000..c6d4e11
--- /dev/null
+++ b/docs/helpers/isKnownCtor.md
@@ -0,0 +1,10 @@
+## isKnownCtor helper
+check argument against known constructors and returns `true` if argument is one of it.
+the main use in `getProperty` and `getOption`
+
+### known constructors
+* `Backbone.Model`
+* `Backbone.Collection`
+* `Backbone.View`
+* `Backbone.Router`
+* `Marionette.Object`
diff --git a/docs/helpers/mix.md b/docs/helpers/mix.md
new file mode 100644
index 0000000..9b349a5
--- /dev/null
+++ b/docs/helpers/mix.md
@@ -0,0 +1,44 @@
+## mix helper
+Extends a Class or object with mixins and hashes and do not pollute prototypes.
+
+### primary use case
+`let NewClass = mix(BaseClass).with(Mixin1, Mixin2);`
+
+### mix(argument)
+returns a special `wrapper` object with `class` property and `with` method.
+`argument` can be a class definition or simple object.
+```js
+let wrapper = mix({example:true}); //OK
+let wrapper = mix(MyClass); //OK
+let wrapper = mix([1,2,3]); //ERROR
+
+let NewClass = mix({prop1:1, prop2:2}).class;
+let instance = new NewClass();
+```
+
+### mix(BaseClass).with(mixin1, mixin2, mixin3)
+`mixin` argument could be an `object` or a `mixin function`. The apply order is left to right, so properties of mixin3 will be the last
+
+### mixin function
+Its a function that takes as argument Base class and returns extended Base class
+```js
+
+let myMixin = (BaseClass) => BaseClass.extends({prop:'abc'},{staticProp:'zxc'});
+
+let MyClass = mix({somedata:123}).with(myMixin);
+
+```
+
+### resulted class
+`mix` helper will settle to resulting class static `extend` method, so you can do like that
+```js
+
+let MyClass = mix(BaseClass).with(mixin1, mixin2, {abc:123, zxc:321}).extend({
+ abc:'my abc is better',
+ greet(){
+ console.log('abc', this.abc); // logs "my abc is better"
+ console.log('zxc', this.zxc); // logs "321"
+ }
+});
+
+```
diff --git a/docs/mixins/childrenable.md b/docs/mixins/childrenable.md
new file mode 100644
index 0000000..63a8c44
--- /dev/null
+++ b/docs/mixins/childrenable.md
@@ -0,0 +1,29 @@
+## Childrenable mixin
+On initialize instantiate all children.
+
+
+### properties
+* `children` - array of Child classes or classContexts
+* `childOptions` - can be hash or a function returning a hash. this will pass to the child initialize.
+has static field `Childrenable` equal to `true`.
+
+### methods
+* `hasChildren()` - returns true if there are children
+* `hasParent()` - returns true if there is a parent
+* `getParent()` - returns parent if its defined.
+* `getChildren()` - returns children in array.
+* `getChildOptions()` - override this if you need special logic.
+
+### options
+* `passToChildren` - if set to true options will be added to childOptions. can be defined as instance property.
+
+### classContext
+class context is an object with defined Child class and additional properties.
+```
+{
+ Child: ChildClass
+ //set of options
+}
+```
+
+additional properties will be passed as options on instance initialize.
diff --git a/docs/mixins/get-name-label.md b/docs/mixins/get-name-label.md
new file mode 100644
index 0000000..154e972
--- /dev/null
+++ b/docs/mixins/get-name-label.md
@@ -0,0 +1,7 @@
+## GetNameLabel mixin
+extends a class with three get methos:
+
+* `getName` - Tries to return a name. Borrowed from [`Yat.Functions.common.getName`](/src/functions/common)
+* `getLabel` - Tries to return a label. Borrowed from [`Yat.Functions.common.getLabel`](/src/functions/common)
+* `getValue` - Tries to return a vale. Borrowed from [`Yat.Functions.common.getValue`](/src/functions/common)
+
diff --git a/docs/mixins/get-option-property.md b/docs/mixins/get-option-property.md
new file mode 100644
index 0000000..f2b48d7
--- /dev/null
+++ b/docs/mixins/get-option-property.md
@@ -0,0 +1,71 @@
+## GetOptionProperty mixin
+see [mixin](../helpers/mix.md)
+
+### public methods
+* `getOption(key, options[optional])`
+* `getProperty(key, options[optional])`
+
+### getOption(key, options[optional])
+returns value from options if options is present on instance.
+
+if returned value is undefined then it returns value from instance property.
+
+### getProperty(key, options[optional])
+returns value from instance property.
+
+if returned value is undefined then it returns value from options of the instance.
+
+### options
+* `deep` - default value `true`.
+ forces to check falback value if primary value is undefined.
+* `force` - default value `true`.
+ forces to return function value if primary value is a function. Do not executes known constructors (see [isKnowCtor](../helpers/isKnownCtor.md))
+* `args` - default value is [].
+ if returned value is function and `force` == true then this property will be passed as arguments
+* `default` - returns as value if resulting value is undefined.
+
+### examples
+
+```js
+
+import {GetOptionProperty} from 'marionette.yat';
+import {Application} from 'backbone.marionette';
+
+// direct use
+// let App = GetOptionProperty(Application);
+
+// also you can use it through mix
+// let App = mix(Application).with(GetOptionProperty, anotherMixin, yetanothermixin, ...)
+
+//YatApp has mixed it by default
+let App = Mn.Yat.App.extend({
+ propertyValue: 'instance',
+ propertyFunction: () => 'from function',
+ propertyClass: Mn.Object
+ propertyFunction2: (a,b) => 'from function' + a + '-' + b,
+});
+
+let app = new Mn.Yat.App({
+ propertyValue: 'options',
+ propertyFunction: () => 'from function in options',
+ additional:'additional'
+});
+
+app.getProperty('propertyValue'); // returns "instance"
+app.getOption('propertyValue'); // returns "options"
+app.getProperty('additional'); // returns "additional"
+
+app.getProperty('propertyFunction'); //returns "from function"
+app.getProperty('propertyClass'); //returns Mn.Object
+
+
+//options
+app.getProperty('propertyFunction',{force:false}); // returns () => 'from function'
+
+app.getProperty('additional',{deep:false}); //returns undefined
+
+app.getProperty('propertyFunction2',{args:['a','b']}); //returns 'from functiona-b'
+
+app.getProperty('not-exists-property',{default:'ooops'}); //returns 'ooops'
+
+```
diff --git a/docs/mixins/mixins.md b/docs/mixins/mixins.md
new file mode 100644
index 0000000..bfb2e48
--- /dev/null
+++ b/docs/mixins/mixins.md
@@ -0,0 +1,45 @@
+#mixins
+Mixins is a extended functionality.
+Mixin can be an object or a function which returns extended base class.
+
+## example
+```js
+
+//old fashion way
+let mymixin = {
+ methodA(){}
+ methodB(){}
+}
+
+let MyView = Mn.View.extend(mymixin).extend({
+ methodC(){}
+});
+
+
+
+```
+
+with `mix` helper you can define mixins as a functions
+
+```js
+//the old one
+let oldmixin = {
+ methodA(){}
+ methodB(){}
+}
+
+//function mixin
+let mymixin1 = (Base) => Base.extend({
+ methodC(){},
+});
+
+//direct use
+let View1 = mymixin1(Mn.View).extend({})
+
+//through mix helper
+let View2 = mix(Mn.View).with(mymixin1, oldmixin).extend({
+ anotherMethod(){},
+});
+
+
+```
diff --git a/docs/mixins/radioable.md b/docs/mixins/radioable.md
new file mode 100644
index 0000000..80e6ef2
--- /dev/null
+++ b/docs/mixins/radioable.md
@@ -0,0 +1,12 @@
+## Radioable mixin
+extends marionette radio functionality.
+
+### differences from marionette functionality
+* radio functionality is not initialized by default.
+* understand `channel` option. You can pass `channelName` as usual or a `channel` with radio channel
+* has method `radioTrigger`
+* has method `radioRequest`
+
+`radioTrigger`, `radioRequest` or `getChannel` will initialize radio if it not initialized.
+
+you can set instance property `initRadioOnInitialize` to `true` for initializing radio at the instance initialize.
diff --git a/docs/mixins/startable.md b/docs/mixins/startable.md
new file mode 100644
index 0000000..033b02f
--- /dev/null
+++ b/docs/mixins/startable.md
@@ -0,0 +1,170 @@
+## Startable mixin
+Promiseable start and stop behavior for an instance.
+
+
+* derived from [Stateable](./stateable.md)
+* has special `life` state lifecycle
+* has static field `Startable` equal to `true`
+
+### properties
+* `allowStartWithoutStop` (default: unset) - if true do not check current life state, by default startable can not be started if its already started or starting
+* `allowStopWithoutStart` (default: unset) - if true do not check current life state, by default startable can not be stopped if its already stopped or stopping
+* `freezeWhileStarting` (default: false) - if true, invokes `freezeUI` while in start process and `unFreezeUI` at the end.
+* `startPromises` (default: unset) - can be a property or a function, should return nothing or an array of promises for start process
+* `stopPromises` (default: unset) - can be a property or a function, should return nothing or an array of promises for stop process
+
+### methods
+* `start` - call it when you need to start
+* `triggerStart` - invokes at the end of start process, triggers `start` event on an instance
+* `stop`- call it when you need to stop
+* `triggerStop` - invokes at the end of stop process, triggers `stop` event on an instance
+* `isStartNotAllowed` - if you need special logic to determine is it possible to start, override it. should return undefined to allow or `YatError` if start is not allowed
+* `isStopNotAllowed` - if you need special logic to determine is it possible to stop, override it. should return undefined to allow or `YatError` if stop is not allowed
+* `addStartPromise` - use this for adding own start promisses at runtime
+* `addStopPromise` - use this for adding own stop promisses at runtime
+* `freezeUI` - invokes in beginning of start process. by default is empty, put your own logic here
+* `unFreezeUI` - invokes at the end of start process. by default is empty, put your own logic here
+
+### state lifecycle
+* `initialized` (idle)
+ * `starting` (process)
+ * `running` (idle)
+ * `stopping` (process)
+* `waiting` (idle)
+
+also there is a `destroyed` state. Instance get this state after `destroy()`.
+
+By default instance can not start if its not in idle or already started
+
+Instance can not stop if its not `running`.
+
+This behavior can be changed via properties `allowStartWithoutStop` and `allowStopWithoutStart`
+
+### examples
+
+#### start/stop promises
+
+you can set start or stop promises array by property
+
+promise should be any promisable object or a function returning promiseable object
+
+```js
+let Page1 = Yat.Page.extend({
+ startPromises:[Promise1, () => { return promise2 }],
+ stopPromises:[Promise3, () => { return promise4 }]
+});
+
+
+let Page2 = Yat.Page.extend({
+ startPromises(){
+ return [Promise1, () => { return promise2 }];
+ },
+ stopPromises(){
+ return [Promise3, () => { return promise4 }];
+ },
+});
+
+
+```
+
+You can also add promises at runtime
+
+```js
+let Page1 = Yat.Page.extend({
+ onBeforeStart(){
+ this.addStartPromise(startPromise1);
+ this.addStartPromise(() => {
+ return startPromise2;
+ });
+
+ this.addStopPromise(stopPromise1);
+ this.addStopPromise(() => {
+ return stopPromise2;
+ });
+
+ }
+});
+
+```
+
+Runtime promisess are checked only on start process, while permanent promisess checks always
+
+```js
+
+const ContactsPage = Yat.Page.extend({
+ route:'contacts',
+ onBeforeStart(){
+ this.addStartPromise(specialContactsPromise);
+ },
+});
+
+const RootPage = Yat.Page.extend({
+ route:'',
+ startPromises:[globalPromise1],
+ onBeforeStart(){
+ this.addStartPromise(specialRootPagePromise);
+ },
+ children:[ContactsPage]
+});
+
+const PageManager = Yat.PageManager.extend({
+ id: 'allpages',
+ children:[RootPage],
+});
+
+const manager = new PageManager();
+
+manager.navigate('contacts');
+
+/*
+
+on navigating to `contacts` page the ContactPage will start after resolving this promises:
+
+• globalPromise1
+• specialContactsPromise
+
+and specialRootPagePromise will be ignored because its a runtime rpomise for starting root page only
+
+
+
+*/
+
+
+```
+
+#### isStartNotAllowed / isStopNotAllowed
+
+this method invokes inside start and stop process for check is operation allowed or not
+
+```js
+
+const ContactsPage = Yat.Page.extend({
+ route:'contacts',
+ isStartNotAllowed(){
+ if(identity.isLoged() && identity.hasNoRightsFor('contacts'))
+ return YatError.Forbidden('you are not allowed to see this page');
+ else if(identity.isLoged() === false && ShouldNotRedirectToLoginPage === true)
+ return YatError.NotAuthorized('you are not logged');
+ else if(identity.isLoged() === false)
+ return YatError.HttpRedirect('login');
+
+ //if start is allowed return undefined.
+
+ }
+});
+
+const PageManager = Yat.PageManager.extend({
+ id: 'allpages',
+ children:[RootPage],
+ onError401(error){
+ this.execute('*NotAuthorized'); // will execute *NotAuthorized page without changing the url
+ },
+ onError403(error){
+ this.execute('*Forbidden'); // will execute *Forbidden page without changing the url
+ },
+ onError301(error){
+ this.navigate(error.message);
+ }
+});
+
+```
diff --git a/docs/mixins/stateable.md b/docs/mixins/stateable.md
new file mode 100644
index 0000000..92aaeff
--- /dev/null
+++ b/docs/mixins/stateable.md
@@ -0,0 +1,47 @@
+## Stateable mixin
+Main goal to store and get state of an instance and trigger apropriate events on state change.
+
+### methods
+* `getState(key[optional])`
+* `setState(key, value[optional])`
+* `clearState()`
+
+has static field `Stateable` equal to `true`
+
+### getState
+`getState()` will return state object itself
+`getState(key)` will return value of stored state
+
+### setState
+`setState(key,value)` will store value in state object by key.
+
+`key` can be a hash of state fields, in that case second argument is ignored.
+
+also triggers:
+
+`state:[keyValue]` with value as argument
+
+`state` with hash of changed state fields
+
+### clearState
+Clears all states fields.
+
+### example
+
+```js
+
+let instance = new Mn.Yat.App();
+
+instance.setState('pulled',true);
+
+instance.setState({
+ state2: 'value of state2',
+ state3: 'value of state3',
+ pulled: false,
+});
+
+instance.getState('pulled'); //returns false
+instance.getState('state2'); //returns 'value of state2'
+instance.getState(); //returns { pulled: false, state2: 'value of state2', state3: 'value of state3' }
+
+```
diff --git a/footer.md b/footer.md
new file mode 100644
index 0000000..2e5eb2f
--- /dev/null
+++ b/footer.md
@@ -0,0 +1,5 @@
+[![Travis build status](http://img.shields.io/travis/taburetkin/marionette.yat.svg?style=flat)](https://travis-ci.org/taburetkin/marionette.yat)
+[![Code Climate](https://codeclimate.com/github/taburetkin/marionette.yat/badges/gpa.svg)](https://codeclimate.com/github/taburetkin/marionette.yat)
+[![Test Coverage](https://codeclimate.com/github/taburetkin/marionette.yat/badges/coverage.svg)](https://codeclimate.com/github/taburetkin/marionette.yat)
+[![Dependency Status](https://david-dm.org/taburetkin/marionette.yat.svg)](https://david-dm.org/taburetkin/marionette.yat)
+[![devDependency Status](https://david-dm.org/taburetkin/marionette.yat/dev-status.svg)](https://david-dm.org/taburetkin/marionette.yat#info=devDependencies)
diff --git a/gulp/_banner.js b/gulp/_banner.js
new file mode 100644
index 0000000..2157847
--- /dev/null
+++ b/gulp/_banner.js
@@ -0,0 +1,15 @@
+import {version} from '../package.json';
+
+const now = new Date();
+const year = now.getFullYear();
+
+export default `/**
+* @license
+* Marionette.Yat extension for Backbone.Marionette
+* Yet Another Toolkit
+* ----------------------------------
+* v${version}
+*
+* Distributed under MIT license
+* author: dimtabu
+*/\n\n`;
\ No newline at end of file
diff --git a/gulp/build.js b/gulp/build.js
new file mode 100644
index 0000000..84b3463
--- /dev/null
+++ b/gulp/build.js
@@ -0,0 +1,124 @@
+import gulp from 'gulp';
+import clean from 'gulp-clean';
+
+import uglifyjs from 'uglify-es';
+import runSequence from 'run-sequence';
+import fs from 'fs';
+
+import { rollup } from 'rollup';
+import babel from 'rollup-plugin-babel';
+import json from 'rollup-plugin-json';
+import rollupClean from 'rollup-plugin-clean';
+
+import banner from './_banner';
+import pkg from '../package.json';
+
+const srcPath = 'src/';
+const distPath = './dist/**/*';
+
+const rollupGlobals = {
+ 'jquery':'jQuery',
+ 'underscore': '_',
+ 'backbone': 'Backbone',
+ 'backbone.radio': 'Backbone.Radio',
+ 'backbone.marionette': 'Marionette'
+};
+
+function makeESModule(bundle) {
+ bundle.write({
+ format: 'es',
+ name: 'MarionetteYat',
+ file: 'dist/marionette.yat.esm.js',
+ sourcemap: true,
+ sourcemapFile: 'marionette.yat.esm.js',
+ banner: banner,
+ globals: rollupGlobals
+ });
+}
+
+function generateBundle(bundle) {
+ return bundle.generate({
+ format: 'umd',
+ name: 'MarionetteYat',
+ sourcemap: true,
+ sourcemapFile: 'marionette.yat.js',
+ banner: banner,
+ footer: 'this && this.Marionette && (this.Marionette.Yat = this.MarionetteYat);',
+ globals: rollupGlobals
+ });
+}
+
+function makeBundle(buildPath, entry) {
+ const buildFile = buildPath + pkg.name + '.js';
+ entry || (entry = srcPath + pkg.name + '.js');
+ return rollup({
+ input: entry,
+ external: ['jquery', 'underscore', 'backbone', 'backbone.radio','backbone.marionette'],
+ plugins: [
+ rollupClean(),
+ json(),
+ babel({
+ sourceMaps: true,
+ presets: [['es2015', {modules: false}]],
+ babelrc: false
+ })
+ ]
+ }).then(bundle => {
+ // Only build the ES6 module if this is the main build
+ if (buildFile === pkg.main) {
+ makeESModule(bundle);
+ }
+ return generateBundle(bundle);
+ });
+}
+
+function build(buildPath, entry, output, doMinify) {
+ // gulp.src(distPath, {read: false})
+ // .pipe(clean());
+ //if(doMinify == null) doMinify = true;
+
+ return makeBundle(buildPath, entry).then(gen => {
+ output || (output = pkg.name);
+ fs.writeFileSync(buildPath + output + '.js', gen.code +
+ '//# sourceMappingURL=' + output + '.js.map\n' );
+ fs.writeFileSync(buildPath + output + '.js.map', gen.map.toString());
+
+ if(doMinify != false){
+
+ var minified = uglifyjs.minify(gen.code, {
+ sourceMap: {
+ content: gen.map,
+ filename: output + '.min.js',
+ url: output + '.min.js.map'
+ },
+ output: {
+ comments: 'some'
+ }
+ });
+
+ if (minified.error) {
+ throw 'uglify-js error: ' + minified.error
+ }
+ fs.writeFileSync(buildPath + output + '.min.js', minified.code);
+ fs.writeFileSync(buildPath + output + '.min.js.map', minified.map);
+ }
+
+ });
+}
+
+gulp.task('build-test', ['lint-test'], function() {
+ return build('tmp/lib/');
+});
+
+gulp.task('build-lib', ['lint-src'], function() {
+ return build('dist/');
+});
+
+gulp.task('build', function(done) {
+ runSequence('build-lib', done);
+});
+
+
+gulp.task('build-board', function() {
+ return build('demo/kb/','demo/kb/index.js','kanban-board');
+});
diff --git a/index.js b/gulp/demo-board.js
similarity index 100%
rename from index.js
rename to gulp/demo-board.js
diff --git a/gulp/docs.js b/gulp/docs.js
new file mode 100644
index 0000000..a1bc58c
--- /dev/null
+++ b/gulp/docs.js
@@ -0,0 +1,328 @@
+import gulp from 'gulp';
+import concat from 'gulp-concat-util';
+import sort from 'gulp-sort';
+import _ from 'underscore';
+import fs from 'fs';
+import path from 'path';
+import merge from 'merge-stream';
+import gulpSequence from 'gulp-sequence';
+import glob from 'glob';
+import clean from 'gulp-clean';
+import str from 'string-to-stream';
+import source from 'vinyl-source-stream';
+
+import wait from 'gulp-wait';
+
+
+
+
+function getLast(txt, splitBy){
+ var res = {};
+ var arr = txt.split(splitBy);
+ if(arr.length > 1)
+ res.last = arr.pop();
+ res.rest = arr.join(splitBy);
+ return res;
+}
+function parsePath(path){
+ if(path == null) return;
+ var res = { path };
+ var ext = getLast(path, '.');
+ res.ext = ext.last;
+ var name = getLast(ext.rest, '/');
+ res.name = name.last;
+ res.folderPath = name.rest;
+ var folder = getLast(name.rest, '/');
+ res.folder = folder.last;
+ var tmp = res.folderPath.split('/');
+ res.level = tmp.length - 1;
+ res.pathArray = path.split('/');
+ res.pathArray.pop();
+ return res;
+}
+
+function forceFolder(hash, arr, parent = {level:-2, path:''}){
+ if(!arr.length) return;
+ let chunk = arr.shift();
+ var folder = hash[chunk];
+ if(!folder){
+ folder = hash[chunk] = {
+ name: chunk,
+ level: parent.level + 1,
+ files:{},
+ folders:{},
+ path: parent.path + '/' + chunk
+ };
+ folder.md = (folder.level > 0 ? "\t".repeat(folder.level) : "") + '* [`'+chunk+'`]('+folder.path+')\r\n';
+ }
+ if(!arr.length)
+ return folder;
+ else
+ return forceFolder(folder.folders, arr, folder);
+}
+
+function createMdHash2(hash, path){
+ function nu(url){
+ if(url.startsWith('.'))
+ return url.substring(1);
+ return url;
+ }
+
+
+ var objpath = nu(path.folderPath).substring(1);
+ var arrobjpath = objpath.split('/');
+ var folderObject = forceFolder(hash, arrobjpath);
+
+ if(path.name.toLowerCase() == path.folder.toLowerCase()) return;
+
+ folderObject.files[path.name] = {
+ name: path.name,
+ path: path.path,
+ md: '\t'.repeat(folderObject.level + 1) + '* `'+ path.name + '`\r\n'
+ }
+}
+
+function getJsTree()
+{
+ let files = [];
+ let hash = {};
+ let exclude = ['marionette.yat','mixin'];
+
+ glob.sync('./src/**/*.js').forEach(function(filePath) {
+ if (fs.statSync(filePath).isFile()) {
+ var res = parsePath(filePath);
+ if(res.name.startsWith('_') || exclude.indexOf(res.name)>=0) return
+ createMdHash2(hash, res);
+ }
+ });
+
+ return hash;
+}
+
+
+
+gulp.task('docs3', gulpSequence('docsClean','createDocsInFolders', 'mainReadMeContent', 'mainReadMe', 'docscopy2src' ))
+
+gulp.task('docsClean',() =>{
+ gulp.src('./docs/**/README.md', {read: false})
+ .pipe(clean());
+ gulp.src('./src/**/README.md', {read: false})
+ .pipe(clean());
+
+});
+
+gulp.task('createDocsInFolders',() => {
+
+ let folders = [];
+ glob.sync('./docs/**/*').forEach(function(filePath) {
+ if (fs.statSync(filePath).isDirectory()) {
+ folders.push(filePath);
+ }
+ });
+
+
+
+ var folderTasks = folders.map((folder) => {
+ let pattern = path.join(folder, '/*.md');
+ let antipattern = "!" + path.join(folder, '/README.md');
+ return gulp.src([antipattern, pattern])
+ .pipe(sort())
+ .pipe(concat('README.md'))
+ .pipe(gulp.dest(folder));
+ });
+
+ return folderTasks;
+});
+
+gulp.task('mainReadMeContent', function(cb){
+
+
+
+ function getOldFilesTree()
+ {
+ let files = [];
+ let hash = {};
+ let exclude = ['marionette.yat','mixin'];
+
+ glob.sync('./src/**/*.js').forEach(function(filePath) {
+ if (fs.statSync(filePath).isFile()) {
+ var res = parsePath(filePath);
+ if(res.name.startsWith('_') || exclude.indexOf(res.name)>=0) return
+ createMdHash2(hash, res);
+ }
+ });
+ var text = '';
+
+
+ function buildMd(obj){
+ if(obj.name != 'src') text += obj.md;
+ _(obj.folders).each((folder) => buildMd(folder));
+ _(obj.files).each((file) => { text += file.md });
+ }
+
+ buildMd(hash.src)
+ return text;
+ }
+
+
+
+ let content = getOldFilesTree();
+ content = "## table of contents \r\n\r\n" + content;
+ fs.writeFile('./middle.md', content, cb);
+});
+
+gulp.task('mainReadMe',() => {
+ return gulp.src(['./banner.md','./middle.md','./footer.md'])
+ .pipe(concat('README.md'))
+ .pipe(gulp.dest('./'));
+});
+
+gulp.task('docscopy2src',() => {
+ return gulp.src('./docs/**/README.md')
+ .pipe(gulp.dest('./src'));
+});
+
+
+
+
+gulp.task('createDocsInFolders2',() => {
+ let docsFiles = getJsToDocs();
+ let docsFolders = getDocsFolders();
+ let res = getJsTree();
+ let hash = {};
+ _(res).each((value, name) => {
+ traverseFolders(value, docsFolders, docsFiles, hash);
+ });
+ let files = _(hash).map((content, path) => {
+ let ps = parsePath(path);
+ return str(content).pipe(source(ps.name + '.md')).pipe(gulp.dest(ps.folderPath));
+ })
+
+ let full = createFullTree(res, docsFolders, docsFiles);
+
+ let merged = merge(files, full);
+ //let wait = [gulp.src('./LICENSE').pipe(wait(2000))];
+ return merged;
+ //str('1.4.27').pipe(source('version.txt')).pipe(gulp.dest('dist'));
+
+ //console.log(hash);
+});
+
+gulp.task('mainReadMe2',() => {
+ return gulp.src(['./banner.md','./src/README.md','./footer.md'])
+ .pipe(concat('README.md'))
+ .pipe(gulp.dest('./'));
+});
+
+gulp.task('docs', gulpSequence('docsClean','wait1000','createDocsInFolders2', 'wait1000', 'mainReadMe2' ))
+
+gulp.task('wait1000', () => {
+
+ return gulp.src('./LICENSE')
+ .pipe(wait(500));
+
+});
+
+function getJsToDocs(){
+ let docs = {};
+ glob.sync('./docs/**/*').forEach(function(filePath) {
+ if (fs.statSync(filePath).isFile()) {
+ let parsed = parsePath(filePath);
+ if(parsed.name.toLowerCase() === parsed.folder.toLowerCase()) return;
+ let js = filePath.replace(/^.\/docs/,'./src').replace(/\.md$/,'.js');
+ docs[js] = filePath.substring(1);
+ }
+ });
+ return docs;
+}
+
+function getDocsFolders(){
+ let docs = {};
+ glob.sync('./docs/**/*').forEach(function(filePath) {
+ if (fs.statSync(filePath).isDirectory()) {
+ //let parsed = parsePath(filePath);
+ //if(parsed.name.toLowerCase() === parsed.folder.toLowerCase()) return;
+ let js = filePath.replace(/^.\/docs/,'/src').replace(/\.md$/,'.js');
+ docs[js] = filePath.substring(1);
+ }
+ });
+ return docs;
+}
+
+function createFolderReadme(root, docsFolders, docsFiles, level){
+ //console.log('>', `.${root.path}/README.md`);
+ let separate = level == null;
+ if(level == null)
+ level = root.level;
+
+ let text = '';
+ let name = root.name == 'src' ? 'marionette.yat' : root.name;
+ text += tab(`# ${root.name}\r\n`);
+ _(root.folders).each((folder) => {
+ text += tab(`* [${folder.name}](${folder.path})\r\n`);
+ });
+ if(_.size(root.files)){
+ if(separate)
+ text += '\r\n' + tab(`## content\r\n`);
+ _(root.files).each((file) => {
+ if(file.path in docsFiles){
+ text += tab(`* [${file.name}](${docsFiles[file.path]})\r\n`);
+ } else {
+ text += tab(`* ${file.name}\r\n`);
+ }
+ });
+ }
+ if(separate){
+ return { path:`.${root.path}/README.md`, content: text };
+ } else {
+ return text;
+ }
+}
+
+function createFullTree(res, docsFolders, docsFiles){
+ let result = '## marionette.yat content \r\n';
+ _(res).each((value, name) => {
+ result += createFullFolderText(value, docsFolders, docsFiles);
+ });
+ return str(result).pipe(source('README.md')).pipe(gulp.dest('./src'));
+}
+
+function createFullFolderText(root, docsFolders, docsFiles){
+ let text = '';
+ let name = root.name == 'src' ? 'marionette.yat' : root.name;
+ name = `* [${name}](.${root.path})`;
+ if(root.level >= 0)
+ text += tab(`${name}\r\n`, root.level);
+ _(root.folders).each((folder) => {
+ text += createFullFolderText(folder, docsFolders, docsFiles)
+ });
+ _(root.files).each((file) => {
+ let filename = '';
+ if(file.path in docsFiles){
+ filename = `[${file.name}](${docsFiles[file.path]})`;
+ } else {
+ filename = file.name;
+ }
+ text += tab(`* ${filename}\r\n`, root.level + 1)
+ });
+ return text;
+}
+
+
+function traverseFolders(root, docsFolders, docsFiles, hash){
+
+ if(root.path !== '/src'){
+ let result = createFolderReadme(root, docsFolders, docsFiles);
+ hash[result.path] = result.content;
+ }
+
+ _(root.folders).each((folder) => traverseFolders(folder, docsFolders, docsFiles, hash));
+ return hash;
+}
+
+function tab(text, level){
+ if(level > 0)
+ text = '\t'.repeat(level) + text;
+ return text;
+}
+
diff --git a/gulp/linting.js b/gulp/linting.js
new file mode 100644
index 0000000..b0afcc7
--- /dev/null
+++ b/gulp/linting.js
@@ -0,0 +1,72 @@
+import gulp from 'gulp';
+import eslint from 'gulp-eslint';
+import lintspaces from 'gulp-lintspaces';
+import plumber from 'gulp-plumber';
+import util from 'gulp-util';
+import gulpIf from 'gulp-if';
+
+function onError() {
+ util.beep();
+}
+
+function lint(files) {
+ return gulp.src(files)
+ .pipe(plumber())
+ .pipe(lintspaces({editorconfig: '.editorconfig'}))
+ .pipe(lintspaces.reporter())
+ .pipe(eslint())
+ .pipe(eslint.format())
+ .pipe(eslint.failOnError())
+ .on('error', onError);
+}
+
+function isFixed(file) {
+ return file.eslint && file.eslint.fixed;
+}
+
+function lintFix(folder) {
+ return gulp.src(folder + '/**/*.js')
+ .pipe(eslint({ fix: true }))
+ .pipe(eslint.format())
+ .pipe(gulpIf(isFixed, gulp.dest(folder)));
+}
+
+function lintSrc() {
+ return lint(['src/**/*.js']);
+}
+
+function lintSrcFix() {
+ return lintFix('src');
+}
+
+function lintTest() {
+ return lint(['test/**/*.js']);
+}
+
+function lintTestFix() {
+ return lintFix('test');
+}
+
+function lintMd() {
+ return gulp.src('docs/*.md')
+ .pipe(plumber())
+ .pipe(lintspaces({editorconfig: '.editorconfig'}))
+ .pipe(lintspaces.reporter())
+ .on('error', onError);
+}
+
+gulp.task('lint-src', lintSrc);
+
+gulp.task('lint-src-fix', lintSrcFix);
+
+gulp.task('lint-test', lintTest);
+
+gulp.task('lint-test-fix', lintTestFix);
+
+gulp.task('lint-code', ['lint-src', 'lint-test']);
+
+gulp.task('lint-docs', lintMd);
+
+gulp.task('lint', ['lint-code', 'lint-docs']);
+
+gulp.task('esfix', ['lint-src-fix', 'lint-test-fix']);
diff --git a/gulp/test-browser.js b/gulp/test-browser.js
new file mode 100644
index 0000000..33422bf
--- /dev/null
+++ b/gulp/test-browser.js
@@ -0,0 +1,93 @@
+import gulp from 'gulp';
+import util from 'gulp-util';
+import livereload from 'gulp-livereload';
+import easySauce from 'easy-sauce';
+
+import { rollup } from 'rollup';
+import babel from 'rollup-plugin-babel';
+import multiEntry from 'rollup-plugin-multi-entry';
+import nodeResolve from 'rollup-plugin-node-resolve';
+import nodeGlobals from 'rollup-plugin-node-globals';
+import commonjs from 'rollup-plugin-commonjs';
+import json from 'rollup-plugin-json';
+import opn from 'opn';
+
+const sauceConf = {
+ name: 'Marionette.Yat.js',
+ username: process.env.SAUCE_USERNAME,
+ key: process.env.SAUCE_ACCESS_KEY,
+ testPath: '/test/runner.html',
+ port: process.env.SAUCE_PORT || '8080',
+ framework: 'mocha',
+ platforms: [
+ ['Windows 10', 'internet explorer', 'latest'],
+ ['Windows 10', 'MicrosoftEdge', 'latest'],
+ ['Windows 10', 'chrome', 'latest'],
+ ['OS X 10.11', 'chrome', 'latest'],
+ ['OS X 10.11', 'firefox', "latest"],
+ ['OS X 10.11', 'safari', '9.0']
+ ],
+ service: 'sauce-connect'
+};
+
+function bundle() {
+ return rollup({
+ entry: ['./test/setup/browser.js', './test/unit/**/*.js'],
+ plugins: [
+ multiEntry(),
+ nodeResolve({ main: true }),
+ commonjs(),
+ nodeGlobals(),
+ json(),
+ babel({
+ sourceMaps: true,
+ presets: [ ['es2015', {modules: false}] ],
+ babelrc: false,
+ exclude: 'node_modules/**'
+ })
+ ]
+ }).then(bundle => bundle.write({
+ format: 'iife',
+ sourceMap: true,
+ moduleName: 'MnTests',
+ dest: './tmp/__spec-build.js'
+ }).then(livereload.reload('./tmp/__spec-build.js')));
+}
+
+function browserWatch() {
+ livereload.listen({port: 35729, host: 'localhost', start: true});
+ opn('./test/runner.html');
+ gulp.watch(['src/**/*.js', 'test/**/*.js'], ['browser-bundle']);
+}
+
+function sauceRunner() {
+ easySauce(sauceConf)
+ .on('message', message => {
+ // A message has been emitted, inform the user.
+ console.log(message);
+ })
+ .on('update', job => {
+ // A job's status has been updated
+ console.log(job.status);
+ })
+ .on('done', (passed, jobs) => {
+ // All tests have completed!
+ if (passed) {
+ console.log('All tests passed!');
+ } else {
+ util.log(util.colors.red('Failures: ' + JSON.stringify(jobs, false, 2)));
+ process.exit(1);
+ }
+ })
+ .on('error', error => {
+ // An error occurred at some point running the tests.
+ util.log(util.colors.red((error.message)));
+ process.exit(1);
+ });
+}
+
+gulp.task('browser-bundle', ['lint-src', 'lint-test'], bundle);
+
+gulp.task('test-browser', ['browser-bundle'], browserWatch);
+
+gulp.task('test-cross-browser', ['browser-bundle'], sauceRunner);
\ No newline at end of file
diff --git a/gulp/test.js b/gulp/test.js
new file mode 100644
index 0000000..01df656
--- /dev/null
+++ b/gulp/test.js
@@ -0,0 +1,50 @@
+import gulp from 'gulp';
+import mocha from 'gulp-mocha';
+import istanbul from 'gulp-istanbul';
+import { Instrumenter } from 'isparta';
+import coveralls from 'gulp-coveralls';
+import runSequence from 'run-sequence';
+
+const mochaGlobals = ['stub', 'spy', 'expect', 'Mn'];
+
+function _registerBabel() {
+ require('babel-register');
+}
+
+function _mocha(setupFile) {
+ return gulp.src(
+ [setupFile, 'test/unit/**/*.js'],
+ {read: false}
+ )
+ .pipe(mocha({
+ reporter: 'dot',
+ globals: mochaGlobals,
+ ignoreLeaks: false
+ }));
+}
+
+function test() {
+ _registerBabel();
+ return _mocha('test/setup/node.js');
+}
+
+function coverage(done) {
+ _registerBabel();
+ gulp.src(['src/**/*.js'])
+ .pipe(istanbul({ instrumenter: Instrumenter }))
+ .pipe(istanbul.hookRequire())
+ .on('finish', function() {
+ return test()
+ .pipe(istanbul.writeReports())
+ .on('end', done);
+ });
+}
+
+gulp.task('coveralls', ['coverage'], function(){
+ return gulp.src('coverage/lcov.info')
+ .pipe(coveralls());
+});
+
+gulp.task('coverage', ['lint-code'], coverage);
+
+gulp.task('test', test);
diff --git a/gulpfile.babel.js b/gulpfile.babel.js
new file mode 100644
index 0000000..436420a
--- /dev/null
+++ b/gulpfile.babel.js
@@ -0,0 +1,23 @@
+import gulp from 'gulp';
+import './gulp/build';
+import './gulp/linting';
+import './gulp/test';
+import './gulp/test-browser';
+
+import './gulp/docs';
+
+//import './gulp/test-cypress';
+
+gulp.task('watch-code', function() {
+ gulp.watch(['src/**/*', 'test/**/*'], ['lint-code', 'test']);
+});
+
+gulp.task('watch-docs', function() {
+ gulp.watch(['api/**/*', 'docs/**/*'], ['lint-docs']);
+});
+
+// Run the linter and headless unit tests as you make changes.
+gulp.task('watch', ['watch-code','watch-docs']);
+
+// Run linter, tests
+gulp.task('default', ['lint', 'test']);
diff --git a/middle.md b/middle.md
new file mode 100644
index 0000000..1eec7f8
--- /dev/null
+++ b/middle.md
@@ -0,0 +1,51 @@
+## table of contents
+
+* [`behaviors`](/src/behaviors)
+ * `behavior`
+ * `draggable`
+ * `dynamic-class`
+ * `form-to-hash`
+ * `sort-by-drag`
+* [`functions`](/src/functions)
+ * [`common`](/src/functions/common)
+ * [`flatten-unflatten`](/src/functions/common/flatten-unflatten)
+ * `flatten-object`
+ * `unflatten-object`
+ * [`set-get-by-path`](/src/functions/common/set-get-by-path)
+ * `get-by-path`
+ * `set-by-path`
+ * `get-label`
+ * `get-name`
+ * `get-value`
+ * `unwrap`
+ * `wrap`
+ * [`view`](/src/functions/view)
+ * `compare-ab`
+ * `view-comparator`
+* [`helpers`](/src/helpers)
+ * `isKnownCtor`
+ * `mix`
+* [`mixins`](/src/mixins)
+ * `childrenable`
+ * `get-name-label`
+ * `get-option-property`
+ * `global-template-context`
+ * `radioable`
+ * `startable`
+ * `stateable`
+* [`models`](/src/models)
+ * `link`
+ * `model`
+* [`singletons`](/src/singletons)
+ * `drag-and-drop`
+ * `identity`
+ * `template-context`
+* `YatApp`
+* `YatCollectionView`
+* `YatError`
+* `YatModal`
+* `YatObject`
+* `YatPage`
+* `YatPageManager`
+* `YatRouter`
+* `YatView`
diff --git a/mixins/asyncTriggerMixin.js b/mixins/asyncTriggerMixin.js
deleted file mode 100644
index 5296353..0000000
--- a/mixins/asyncTriggerMixin.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { awaiter } from '../utils/async-utils';
-
-export default {
- triggerMethodAsync() {
- return awaiter(this.triggerMethod(...arguments));
- }
-};
diff --git a/mixins/collectionCustomViewsMixin.js b/mixins/collectionCustomViewsMixin.js
deleted file mode 100644
index 0c2c871..0000000
--- a/mixins/collectionCustomViewsMixin.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import _ from 'underscore';
-export default Base => Base.extend({
-
- shouldRenderCollection: true,
- shouldRenderCustomViews: false,
-
- constructor() {
- Base.apply(this, arguments);
- if (this.getOption('shouldRenderCollection') === false) {
- this._hideCollection();
- }
- if (this.getOption('shouldRenderCustomViews') === true) {
- this.on('ready', this.renderCustomViews);
- }
- },
-
- _hideCollection() {
- this._collection = this.collection;
- delete this.collection;
- },
-
- getCustomViews() {
- return this.getOption('customViews') || [];
- },
- renderCustomViews() {
- this.triggerMethod('before:customs:render');
-
- let customs = this.getCustomViews();
- let added = this.addChildViews(customs);
-
- this.triggerMethod('customs:render', added);
- },
- addChildViews(views = []) {
- views = _.filter(views, view => view != null);
- let last = views.pop();
- let added = _.map(views, arg => this._addCustomView(arg, { preventRender: true }));
- added.push(this._addCustomView(last));
- return added;
- },
- _addCustomView(arg, defOptions = {}) {
- if (arg == null) return;
-
- let view, options;
- if (_.isArray(arg)) {
- view = arg[0];
- options = arg[1] || {};
- } else {
- view = arg;
- options = {};
- }
- options = _.extend(defOptions, options);
- return this.addCustomView(view, options);
- },
- addCustomView(view, options) {
- if (view == null) return;
- view._isCustomView = true;
- view._index = options.index;
- let res = this.addChildView(view, undefined, options);
- return res;
- }
-});
diff --git a/mixins/commonMixin.js b/mixins/commonMixin.js
deleted file mode 100644
index 6684b7c..0000000
--- a/mixins/commonMixin.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import mix from '../utils/mix';
-import getOption from './getOptionMixin';
-import ready from './readyMixin';
-import asyncTrigger from './asyncTriggerMixin';
-
-const commonMixin = Base => mix(Base).with(getOption, ready, asyncTrigger);
-
-export default commonMixin;
diff --git a/mixins/getOptionMixin.js b/mixins/getOptionMixin.js
deleted file mode 100644
index d578c1c..0000000
--- a/mixins/getOptionMixin.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import _ from 'underscore';
-import getOption from '../utils/getOption';
-import { isView } from '../utils/is-utils';
-
-export default {
-
- getOption(key, options = {}) {
- let args = options.args;
- if (!args && isView(this)) {
- args = [];
- if (this.model) {
- args.push(this.model);
- }
- args.push(this);
- }
- return getOption(this, key, options);
- },
- getOptions(...args) {
- let options;
- let keys;
- if (_.isObject(_.last(args))) {
- options = args.pop();
- }
- if (args.length == 1 && !_.isArray(args)) {
- keys = [args]
- } else {
- keys = args;
- }
-
- return _.reduce(keys, (memo, key) => {
- memo[key] = this.getOption(key, options);
- return memo;
- }, {});
- }
-}
diff --git a/mixins/readyMixin.js b/mixins/readyMixin.js
deleted file mode 100644
index 7a35fff..0000000
--- a/mixins/readyMixin.js
+++ /dev/null
@@ -1,19 +0,0 @@
-export default Base => Base.extend({
- multipleReadyAllowed: true,
- _supportsReady: true,
- render({ triggerReady } = {}) {
- if (this.getOption('multipleReadyAllowed') == true) {
- this._isReady = false;
- }
- let result = Base.prototype.render.apply(this, arguments);
- if (triggerReady) {
- this.ready();
- }
- return result;
- },
- ready() {
- if (this._isReady) { return; }
- this._isReady = true;
- this.triggerMethod('ready', ...arguments);
- }
-});
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..9168346
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,10176 @@
+{
+ "name": "marionette.yat",
+ "version": "0.0.32",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz",
+ "integrity": "sha512-yd7CkUughvHQoEahQqcMdrZw6o/6PwUxiRkfZuVDVHCDe77mysD/suoNyk5mK6phTnRW1kyIbPHyCJgxw++LXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.0",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz",
+ "integrity": "sha512-c+DAyp8LMm2nzSs2uXEuxp4LYGSUYEyHtU3fU57avFChjsnTmmpWmXj2dv0yUxHTEydgVAv5fIzA+4KJwoqWDA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "7.0.0-beta.31",
+ "@babel/template": "7.0.0-beta.31",
+ "@babel/traverse": "7.0.0-beta.31",
+ "@babel/types": "7.0.0-beta.31"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz",
+ "integrity": "sha512-m7rVVX/dMLbbB9NCzKYRrrFb0qZxgpmQ4Wv6y7zEsB6skoJHRuXVeb/hAFze79vXBbuD63ci7AVHXzAdZSk9KQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "7.0.0-beta.31"
+ }
+ },
+ "@babel/template": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.31.tgz",
+ "integrity": "sha512-97IRmLvoDhIDSQkqklVt3UCxJsv0LUEVb/0DzXWtc8Lgiyxj567qZkmTG9aR21CmcJVVIvq2Y/moZj4oEpl5AA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.31",
+ "@babel/types": "7.0.0-beta.31",
+ "babylon": "7.0.0-beta.31",
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz",
+ "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.31.tgz",
+ "integrity": "sha512-3N+VJW+KlezEjFBG7WSYeMyC5kIqVLPb/PGSzCDPFcJrnArluD1GIl7Y3xC7cjKiTq2/JohaLWHVPjJWHlo9Gg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.31",
+ "@babel/helper-function-name": "7.0.0-beta.31",
+ "@babel/types": "7.0.0-beta.31",
+ "babylon": "7.0.0-beta.31",
+ "debug": "3.1.0",
+ "globals": "10.4.0",
+ "invariant": "2.2.2",
+ "lodash": "4.17.4"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz",
+ "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-10.4.0.tgz",
+ "integrity": "sha512-uNUtxIZpGyuaq+5BqGGQHsL4wUlJAXRqOm6g3Y48/CWNGTLONgBibI0lh6lGxjR2HljFYUfszb+mk4WkgMntsA==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.31.tgz",
+ "integrity": "sha512-exAHB+NeFGxkfQ5dSUD03xl3zYGneeSk2Mw2ldTt/nTvYxuDiuSp3DlxgUBgzbdTFG4fbwPk0WtKWOoTXCmNGg==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2",
+ "lodash": "4.17.4",
+ "to-fast-properties": "2.0.0"
+ },
+ "dependencies": {
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
+ }
+ },
+ "@cypress/coffee-script": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@cypress/coffee-script/-/coffee-script-0.1.2.tgz",
+ "integrity": "sha1-JyHPYO9lzkeziVqguOhHcYaLwBE=",
+ "dev": true,
+ "requires": {
+ "coffee-script": "1.12.5"
+ }
+ },
+ "@types/node": {
+ "version": "8.5.7",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.7.tgz",
+ "integrity": "sha512-+1ZfzGIq8Y3EV7hPF7bs3i+Gi2mqYOiEGGRxGYPrn+hTYLMmzg+/5TkMkCHiRtLB38XSNvr/43aQ9+cUq4BbBg==",
+ "dev": true
+ },
+ "abab": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
+ "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
+ "integrity": "sha512-Yej+zOJ1Dm/IMZzzj78OntP/r3zHEaKcyNoU2lAaxPtrseM6rF0xwqoz5Q5ysAiED9hTjI2hgtvLXitlCN1/Ug==",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
+ "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0"
+ }
+ },
+ "acorn-jsx": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+ "dev": true,
+ "requires": {
+ "acorn": "3.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+ "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+ "dev": true
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.7",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz",
+ "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz",
+ "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "semver": "5.0.3"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
+ "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-align": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==",
+ "dev": true
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "app-root-path": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-1.4.0.tgz",
+ "integrity": "sha1-YzXYZclkDQ+tmQBOWnkjIjjpLfo=",
+ "dev": true
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-differ": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
+ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
+ "dev": true
+ },
+ "array-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
+ "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "dev": true
+ },
+ "array-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+ "dev": true,
+ "optional": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
+ "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
+ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-array-reduce": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/async-array-reduce/-/async-array-reduce-0.2.1.tgz",
+ "integrity": "sha1-yL4BCitc0A3qlsgRFgNGk9/dgtE=",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz",
+ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz",
+ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=",
+ "dev": true,
+ "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"
+ }
+ },
+ "babel-eslint": {
+ "version": "8.1.2",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.1.2.tgz",
+ "integrity": "sha512-IE+glF8t0lLoldylN7JyR8gT7e3jwyuNH2ds8g3UVUwGob/U4iT7Xpsiq2kQ8QGLb0eX4RcQXNqeW6mgPysu9A==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "7.0.0-beta.31",
+ "@babel/traverse": "7.0.0-beta.31",
+ "@babel/types": "7.0.0-beta.31",
+ "babylon": "7.0.0-beta.31",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0"
+ },
+ "dependencies": {
+ "babylon": {
+ "version": "7.0.0-beta.31",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.31.tgz",
+ "integrity": "sha512-6lm2mV3S51yEnKmQQNnswoABL1U1H1KHoCCVwdwI3hvIv+W7ya4ki7Aw4o4KxtUHjNKkK5WpZb22rrMMOcJXJQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
+ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "dev": true,
+ "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"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "6.24.1",
+ "babel-messages": "6.23.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0"
+ }
+ },
+ "babel-plugin-root-import": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-root-import/-/babel-plugin-root-import-5.1.0.tgz",
+ "integrity": "sha1-gOoc1ZRbRjpeP34gSmlHjFc+Mow=",
+ "dev": true,
+ "requires": {
+ "slash": "1.0.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "6.26.0",
+ "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.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz",
+ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "6.24.1",
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "6.24.1",
+ "babel-helper-get-function-arity": "6.24.1",
+ "babel-runtime": "6.26.0",
+ "babel-template": "6.26.0",
+ "babel-traverse": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.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=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "regexpu-core": "2.0.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=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "0.10.1"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "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.26.0",
+ "babel-plugin-transform-es2015-classes": "6.24.1",
+ "babel-plugin-transform-es2015-computed-properties": "6.24.1",
+ "babel-plugin-transform-es2015-destructuring": "6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
+ "babel-plugin-transform-es2015-for-of": "6.23.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.26.0",
+ "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.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "6.24.1",
+ "babel-plugin-transform-regenerator": "6.26.0"
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "babel-runtime": "6.26.0",
+ "core-js": "2.5.3",
+ "home-or-tmp": "2.0.0",
+ "lodash": "4.17.4",
+ "mkdirp": "0.5.1",
+ "source-map-support": "0.4.18"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "core-js": "2.5.3",
+ "regenerator-runtime": "0.11.1"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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.9",
+ "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=",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "backbone": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz",
+ "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=",
+ "dev": true,
+ "requires": {
+ "underscore": "1.8.3"
+ },
+ "dependencies": {
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true
+ }
+ }
+ },
+ "backbone.marionette": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/backbone.marionette/-/backbone.marionette-3.5.1.tgz",
+ "integrity": "sha1-yyLKaM+YbLzan9tUT7eF3Wb48kg=",
+ "dev": true,
+ "requires": {
+ "backbone.radio": "2.0.0"
+ }
+ },
+ "backbone.radio": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/backbone.radio/-/backbone.radio-2.0.0.tgz",
+ "integrity": "sha1-u+hnKzc+MT+Z820vvPWD/nfQT0I=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "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.3.0",
+ "pascalcase": "0.1.1"
+ }
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "dev": true
+ },
+ "binary": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz",
+ "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=",
+ "dev": true,
+ "requires": {
+ "buffers": "0.1.1",
+ "chainsaw": "0.1.0"
+ }
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz",
+ "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=",
+ "dev": true,
+ "requires": {
+ "bytes": "2.2.0",
+ "content-type": "1.0.4",
+ "debug": "2.2.0",
+ "depd": "1.1.1",
+ "http-errors": "1.3.1",
+ "iconv-lite": "0.4.13",
+ "on-finished": "2.3.0",
+ "qs": "5.2.0",
+ "raw-body": "2.1.7",
+ "type-is": "1.6.15"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ }
+ },
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ },
+ "qs": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz",
+ "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=",
+ "dev": true
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "boxen": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz",
+ "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=",
+ "dev": true,
+ "requires": {
+ "ansi-align": "1.1.0",
+ "camelcase": "2.1.1",
+ "chalk": "1.1.3",
+ "cli-boxes": "1.0.0",
+ "filled-array": "1.1.0",
+ "object-assign": "4.1.1",
+ "repeating": "2.0.1",
+ "string-width": "1.0.2",
+ "widest-line": "1.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz",
+ "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "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.1.1",
+ "split-string": "3.1.0",
+ "to-regex": "3.0.1"
+ }
+ },
+ "browser-process-hrtime": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz",
+ "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=",
+ "dev": true
+ },
+ "browser-resolve": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
+ "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.1.7"
+ },
+ "dependencies": {
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ }
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
+ "dev": true
+ },
+ "buffer-es6": {
+ "version": "4.9.3",
+ "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz",
+ "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=",
+ "dev": true
+ },
+ "buffers": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz",
+ "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "bytes": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
+ "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "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"
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "dev": true,
+ "requires": {
+ "callsites": "0.2.0"
+ }
+ },
+ "callsites": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "requires": {
+ "camelcase": "2.1.1",
+ "map-obj": "1.0.1"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true
+ }
+ }
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ },
+ "dependencies": {
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "chai": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
+ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.0.2",
+ "check-error": "1.0.2",
+ "deep-eql": "3.0.1",
+ "get-func-name": "2.0.0",
+ "pathval": "1.1.0",
+ "type-detect": "4.0.5"
+ }
+ },
+ "chai-jq": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/chai-jq/-/chai-jq-0.0.9.tgz",
+ "integrity": "sha1-bfavOpQM+rr7HtUYTsenNNglKII=",
+ "dev": true
+ },
+ "chainsaw": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz",
+ "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=",
+ "dev": true,
+ "requires": {
+ "traverse": "0.3.9"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "chardet": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
+ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=",
+ "dev": true
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "circular-json": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+ "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "dev": true
+ },
+ "class-utils": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz",
+ "integrity": "sha1-F+eTEDdQ+WJ7IXbqNM/RtWWQPIA=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "lazy-cache": "2.0.2",
+ "static-extend": "0.1.2"
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
+ "dev": true
+ },
+ "clone-stats": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
+ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
+ "dev": true
+ },
+ "cloneable-readable": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz",
+ "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "1.0.7",
+ "through2": "2.0.3"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "coffee-script": {
+ "version": "1.12.5",
+ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.5.tgz",
+ "integrity": "sha1-gJ9FhUGRErv+RqBzrXVDrxjCc0Y=",
+ "dev": true
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "1.0.0",
+ "object-visit": "1.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
+ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
+ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "typedarray": "0.0.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.5.tgz",
+ "integrity": "sha512-YtnS0VEY+e2Khzsey/6mra9EoM6h/5gxaC0e3mcHpA5yfDxafhygytNmcJWodvUgyXzSiL5MSkPO6bQGgfliHw==",
+ "dev": true,
+ "requires": {
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "configstore": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz",
+ "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "3.0.0",
+ "graceful-fs": "4.1.11",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "os-tmpdir": "1.0.2",
+ "osenv": "0.1.4",
+ "uuid": "2.0.3",
+ "write-file-atomic": "1.3.4",
+ "xdg-basedir": "2.0.0"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz",
+ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=",
+ "dev": true
+ }
+ }
+ },
+ "connect": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz",
+ "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.0.6",
+ "parseurl": "1.3.2",
+ "utils-merge": "1.0.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "content-type-parser": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
+ "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "dev": true
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
+ "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "coveralls": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.3.tgz",
+ "integrity": "sha512-iiAmn+l1XqRwNLXhW8Rs5qHZRFMYp9ZIPjEOVRpC/c4so6Y/f4/lFi0FfR5B9cCqgyhkJ5cZmbvcVRfP8MHchw==",
+ "dev": true,
+ "requires": {
+ "js-yaml": "3.6.1",
+ "lcov-parse": "0.0.10",
+ "log-driver": "1.2.5",
+ "minimist": "1.2.0",
+ "request": "2.79.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz",
+ "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "2.7.3"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "1.0.0"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ }
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "cssom": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz",
+ "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=",
+ "dev": true
+ },
+ "cssstyle": {
+ "version": "0.2.37",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
+ "dev": true,
+ "requires": {
+ "cssom": "0.3.2"
+ }
+ },
+ "currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "requires": {
+ "array-find-index": "1.0.2"
+ }
+ },
+ "cypress-cli": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/cypress-cli/-/cypress-cli-0.14.0.tgz",
+ "integrity": "sha1-AIFjtFOtuC9XmW5RPJ5tYu4jTx8=",
+ "dev": true,
+ "requires": {
+ "@cypress/coffee-script": "0.1.2",
+ "bluebird": "3.3.4",
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "extract-zip": "1.5.0",
+ "fs-extra": "0.22.1",
+ "home-or-tmp": "2.0.0",
+ "human-interval": "0.1.6",
+ "lodash": "3.10.1",
+ "progress": "1.1.8",
+ "request": "2.79.0",
+ "request-progress": "0.3.1",
+ "semver": "5.4.1",
+ "through2": "2.0.3",
+ "update-notifier": "1.0.3",
+ "xvfb": "github:cypress-io/node-xvfb#22e3783c31d81ebe64d8c0df491ea00cdc74726a",
+ "yauzl": "2.9.1"
+ },
+ "dependencies": {
+ "bluebird": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.4.tgz",
+ "integrity": "sha1-94D+Q+GnplEPZ6vX0NeVM6QN3eY=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "0.22.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.22.1.tgz",
+ "integrity": "sha1-X9b4BJ3JdsoZ6yNV1lgXPKvM4FY=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "2.4.0",
+ "rimraf": "2.6.2"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "progress": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ }
+ }
+ },
+ "dargs": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz",
+ "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "decompress-zip": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz",
+ "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=",
+ "dev": true,
+ "requires": {
+ "binary": "0.3.0",
+ "graceful-fs": "4.1.11",
+ "mkpath": "0.1.0",
+ "nopt": "3.0.6",
+ "q": "1.5.1",
+ "readable-stream": "1.1.14",
+ "touch": "0.0.3"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ }
+ }
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.5"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz",
+ "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=",
+ "dev": true
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3"
+ }
+ },
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "1.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=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
+ "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
+ "dev": true
+ },
+ "deprecated": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
+ "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "doctrine": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.2.tgz",
+ "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==",
+ "dev": true,
+ "requires": {
+ "esutils": "2.0.2"
+ }
+ },
+ "domexception": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
+ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+ "dev": true,
+ "requires": {
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "dot-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz",
+ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=",
+ "dev": true,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "duplexer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+ "dev": true
+ },
+ "duplexer2": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
+ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14"
+ }
+ },
+ "duplexify": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz",
+ "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "stream-shift": "1.0.0"
+ },
+ "dependencies": {
+ "end-of-stream": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz",
+ "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "easy-sauce": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/easy-sauce/-/easy-sauce-0.4.1.tgz",
+ "integrity": "sha1-9wSt4N4YtrdwCZilKw1NjIqdVGI=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "connect": "3.6.5",
+ "fs-extra": "0.28.0",
+ "localtunnel": "1.8.3",
+ "minimist": "1.2.0",
+ "ngrok": "2.2.24",
+ "request": "2.79.0",
+ "sauce-connect-launcher": "0.16.0",
+ "serve-static": "1.13.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "editorconfig": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.2.tgz",
+ "integrity": "sha1-jleSbZ7mmrbLmZ8CfCFxRnrM6zU=",
+ "dev": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "commander": "2.9.0",
+ "lru-cache": "3.2.0",
+ "sigmund": "1.0.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
+ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2"
+ }
+ }
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz",
+ "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
+ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
+ "dev": true,
+ "requires": {
+ "once": "1.3.3"
+ },
+ "dependencies": {
+ "once": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
+ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ }
+ }
+ },
+ "errno": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
+ "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "prr": "1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz",
+ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=",
+ "dev": true,
+ "requires": {
+ "esprima": "2.7.3",
+ "estraverse": "1.9.3",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.2.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz",
+ "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz",
+ "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ }
+ }
+ },
+ "eslint": {
+ "version": "4.14.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.14.0.tgz",
+ "integrity": "sha512-Ul6CSGRjKscEyg0X/EeNs7o2XdnbTEOD1OM8cTjmx85RPcBJQrEhZLevhuJZNAE/vS2iVl5Uhgiqf3h5uLMCJQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "babel-code-frame": "6.26.0",
+ "chalk": "2.3.0",
+ "concat-stream": "1.6.0",
+ "cross-spawn": "5.1.0",
+ "debug": "3.1.0",
+ "doctrine": "2.0.2",
+ "eslint-scope": "3.7.1",
+ "eslint-visitor-keys": "1.0.0",
+ "espree": "3.5.2",
+ "esquery": "1.0.0",
+ "esutils": "2.0.2",
+ "file-entry-cache": "2.0.0",
+ "functional-red-black-tree": "1.0.1",
+ "glob": "7.1.2",
+ "globals": "11.1.0",
+ "ignore": "3.3.7",
+ "imurmurhash": "0.1.4",
+ "inquirer": "3.3.0",
+ "is-resolvable": "1.0.1",
+ "js-yaml": "3.10.0",
+ "json-stable-stringify-without-jsonify": "1.0.1",
+ "levn": "0.3.0",
+ "lodash": "4.17.4",
+ "minimatch": "3.0.4",
+ "mkdirp": "0.5.1",
+ "natural-compare": "1.4.0",
+ "optionator": "0.8.2",
+ "path-is-inside": "1.0.2",
+ "pluralize": "7.0.0",
+ "progress": "2.0.0",
+ "require-uncached": "1.0.3",
+ "semver": "5.4.1",
+ "strip-ansi": "4.0.0",
+ "strip-json-comments": "2.0.1",
+ "table": "4.0.2",
+ "text-table": "0.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "globals": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.1.0.tgz",
+ "integrity": "sha512-uEuWt9mqTlPDwSqi+sHjD4nWU/1N+q0fiWI9T1mZpD2UENqX20CFD5T/ziLZvztPaBKl7ZylUi1q6Qfm7E2CiQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
+ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
+ "dev": true,
+ "requires": {
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+ "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz",
+ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-jsx": "3.0.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz",
+ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0"
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.2.1.tgz",
+ "integrity": "sha1-va/oCVOD2EFNXcLs9MkXO225QS4=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true
+ },
+ "event-stream": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "from": "0.1.7",
+ "map-stream": "0.1.0",
+ "pause-stream": "0.0.11",
+ "split": "0.3.3",
+ "stream-combiner": "0.0.4",
+ "through": "2.3.8"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "posix-character-classes": "0.1.1",
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ },
+ "dependencies": {
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ },
+ "external-editor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz",
+ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==",
+ "dev": true,
+ "requires": {
+ "chardet": "0.4.2",
+ "iconv-lite": "0.4.19",
+ "tmp": "0.0.33"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.3.tgz",
+ "integrity": "sha512-AyptZexgu7qppEPq59DtN/XJGZDrLcVxSHai+4hdgMMS9EpF4GBvygcWWApno8lL9qSjVpYt7Raao28qzJX1ww==",
+ "dev": true,
+ "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"
+ }
+ },
+ "extract-zip": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz",
+ "integrity": "sha1-ksz22B73Cp+kwXRxFMzvbYaIpsQ=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.5.0",
+ "debug": "0.7.4",
+ "mkdirp": "0.5.0",
+ "yauzl": "2.4.1"
+ },
+ "dependencies": {
+ "concat-stream": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz",
+ "integrity": "sha1-U/fUPFHF5D+ByP3QMyHGMb5o1hE=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.0.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "debug": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz",
+ "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz",
+ "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "0.10.31",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "dev": true,
+ "requires": {
+ "fd-slicer": "1.0.1"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "faye-websocket": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz",
+ "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=",
+ "dev": true,
+ "requires": {
+ "websocket-driver": "0.7.0"
+ }
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+ "dev": true,
+ "requires": {
+ "flat-cache": "1.3.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1",
+ "to-regex-range": "2.1.1"
+ }
+ },
+ "filled-array": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz",
+ "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=",
+ "dev": true
+ },
+ "finalhandler": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz",
+ "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "find-index": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
+ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
+ "dev": true
+ },
+ "findup-sync": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
+ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
+ "dev": true,
+ "requires": {
+ "detect-file": "1.0.0",
+ "is-glob": "3.1.0",
+ "micromatch": "3.1.4",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "fined": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz",
+ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "is-plain-object": "2.0.4",
+ "object.defaults": "1.1.0",
+ "object.pick": "1.3.0",
+ "parse-filepath": "1.0.2"
+ }
+ },
+ "first-chunk-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
+ "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
+ "dev": true
+ },
+ "flagged-respawn": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz",
+ "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "dev": true,
+ "requires": {
+ "circular-json": "0.3.3",
+ "del": "2.2.2",
+ "graceful-fs": "4.1.11",
+ "write": "0.2.1"
+ },
+ "dependencies": {
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "dev": true,
+ "requires": {
+ "globby": "5.0.0",
+ "is-path-cwd": "1.0.0",
+ "is-path-in-cwd": "1.0.0",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "rimraf": "2.6.2"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "dev": true,
+ "requires": {
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "glob": "7.1.2",
+ "object-assign": "4.1.1",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
+ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.3.0"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "0.2.2"
+ }
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true
+ },
+ "from": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+ "dev": true
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.28.0.tgz",
+ "integrity": "sha1-mhwHCOqMUWkperBv2MuRT1ZHsnI=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "2.4.0",
+ "klaw": "1.3.1",
+ "path-is-absolute": "1.0.1",
+ "rimraf": "2.6.2"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ }
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "gaze": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
+ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
+ "dev": true,
+ "requires": {
+ "globule": "0.1.0"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "get-func-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
+ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
+ "dev": true
+ },
+ "get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-stream": {
+ "version": "3.1.18",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
+ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
+ "dev": true,
+ "requires": {
+ "glob": "4.5.3",
+ "glob2base": "0.0.12",
+ "minimatch": "2.0.10",
+ "ordered-read-streams": "0.1.0",
+ "through2": "0.6.5",
+ "unique-stream": "1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
+ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "2.0.10",
+ "once": "1.4.0"
+ }
+ },
+ "minimatch": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
+ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glob-watcher": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
+ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
+ "dev": true,
+ "requires": {
+ "gaze": "0.5.2"
+ }
+ },
+ "glob2base": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
+ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
+ "dev": true,
+ "requires": {
+ "find-index": "0.1.1"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "1.0.2",
+ "is-windows": "1.0.1",
+ "resolve-dir": "1.0.1"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "1.0.1",
+ "which": "1.3.0"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "globule": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
+ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
+ "dev": true,
+ "requires": {
+ "glob": "3.1.21",
+ "lodash": "1.0.2",
+ "minimatch": "0.2.14"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "3.1.21",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
+ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "1.2.3",
+ "inherits": "1.0.2",
+ "minimatch": "0.2.14"
+ }
+ },
+ "graceful-fs": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
+ "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
+ "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
+ "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
+ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "2.7.3",
+ "sigmund": "1.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz",
+ "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "got": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz",
+ "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=",
+ "dev": true,
+ "requires": {
+ "create-error-class": "3.0.2",
+ "duplexer2": "0.1.4",
+ "is-redirect": "1.0.0",
+ "is-retry-allowed": "1.1.0",
+ "is-stream": "1.1.0",
+ "lowercase-keys": "1.0.0",
+ "node-status-codes": "1.0.0",
+ "object-assign": "4.1.1",
+ "parse-json": "2.2.0",
+ "pinkie-promise": "2.0.1",
+ "read-all-stream": "3.1.0",
+ "readable-stream": "2.3.3",
+ "timed-out": "3.1.3",
+ "unzip-response": "1.0.2",
+ "url-parse-lax": "1.0.0"
+ },
+ "dependencies": {
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
+ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
+ "dev": true,
+ "requires": {
+ "natives": "1.1.1"
+ }
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "gulp": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
+ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
+ "dev": true,
+ "requires": {
+ "archy": "1.0.0",
+ "chalk": "1.1.3",
+ "deprecated": "0.0.1",
+ "gulp-util": "3.0.8",
+ "interpret": "1.1.0",
+ "liftoff": "2.5.0",
+ "minimist": "1.2.0",
+ "orchestrator": "0.3.8",
+ "pretty-hrtime": "1.0.3",
+ "semver": "4.3.6",
+ "tildify": "1.2.0",
+ "v8flags": "2.1.1",
+ "vinyl-fs": "0.3.14"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-clean": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/gulp-clean/-/gulp-clean-0.3.2.tgz",
+ "integrity": "sha1-o0fUc6zqQBgvk1WHpFGUFnGSgQI=",
+ "dev": true,
+ "requires": {
+ "gulp-util": "2.2.20",
+ "rimraf": "2.6.2",
+ "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=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "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=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "gulp-util": {
+ "version": "2.2.20",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz",
+ "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.5.1",
+ "dateformat": "1.0.12",
+ "lodash._reinterpolate": "2.4.1",
+ "lodash.template": "2.4.1",
+ "minimist": "0.2.0",
+ "multipipe": "0.1.2",
+ "through2": "0.5.1",
+ "vinyl": "0.2.3"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz",
+ "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "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=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "lodash._reinterpolate": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz",
+ "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz",
+ "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
+ "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "2.1.2"
+ },
+ "dependencies": {
+ "xtend": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
+ "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-concat-util": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/gulp-concat-util/-/gulp-concat-util-0.5.5.tgz",
+ "integrity": "sha1-yPBjO05ulQ/5PEdbPI07hL4Dt9w=",
+ "dev": true,
+ "requires": {
+ "concat-with-sourcemaps": "1.0.5",
+ "gulp-if": "2.0.2",
+ "gulp-util": "3.0.8",
+ "lodash.assign": "3.2.0",
+ "stream-combiner2": "1.1.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-coveralls": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/gulp-coveralls/-/gulp-coveralls-0.1.4.tgz",
+ "integrity": "sha1-L2IKyN9i0LhrS73mTaNnzEGhkMk=",
+ "dev": true,
+ "requires": {
+ "coveralls": "2.13.3",
+ "gulp-util": "3.0.8",
+ "through2": "1.1.1"
+ },
+ "dependencies": {
+ "through2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz",
+ "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.1.14",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "gulp-eslint": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-4.0.1.tgz",
+ "integrity": "sha512-MPafTtjHqV03g+ElSqvVXPjWQJafmBtSitF3dbTSD5ObcPjz353TGcR0LfCM0tqpBAQCywDL2siYKetnrxkjvg==",
+ "dev": true,
+ "requires": {
+ "eslint": "4.14.0",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ }
+ },
+ "gulp-if": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
+ "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
+ "dev": true,
+ "requires": {
+ "gulp-match": "1.0.3",
+ "ternary-stream": "2.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-istanbul": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gulp-istanbul/-/gulp-istanbul-1.1.3.tgz",
+ "integrity": "sha512-uMLSdqPDnBAV/B9rNyOgVMgrVC1tPbe+5GH6P13UOyxbRDT/w4sKYHWftPMA8j9om+NFvfeRlqpDXL2fixFWNA==",
+ "dev": true,
+ "requires": {
+ "istanbul": "0.4.5",
+ "istanbul-threshold-checker": "0.2.1",
+ "lodash": "4.17.4",
+ "plugin-error": "0.1.2",
+ "through2": "2.0.3",
+ "vinyl-sourcemaps-apply": "0.2.1"
+ }
+ },
+ "gulp-lintspaces": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/gulp-lintspaces/-/gulp-lintspaces-0.5.0.tgz",
+ "integrity": "sha1-mAXdePthWmHDOxGtN2cYqUR2PDk=",
+ "dev": true,
+ "requires": {
+ "app-root-path": "1.4.0",
+ "colors": "1.1.2",
+ "event-stream": "3.3.4",
+ "gulp-util": "2.2.20",
+ "lintspaces": "0.5.1",
+ "log-symbols": "1.0.2",
+ "path": "0.11.14"
+ },
+ "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=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "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=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1",
+ "meow": "3.7.0"
+ }
+ },
+ "gulp-util": {
+ "version": "2.2.20",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz",
+ "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.5.1",
+ "dateformat": "1.0.12",
+ "lodash._reinterpolate": "2.4.1",
+ "lodash.template": "2.4.1",
+ "minimist": "0.2.0",
+ "multipipe": "0.1.2",
+ "through2": "0.5.1",
+ "vinyl": "0.2.3"
+ }
+ },
+ "has-ansi": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "lodash._reinterpolate": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz",
+ "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz",
+ "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "through2": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz",
+ "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "3.0.0"
+ }
+ },
+ "vinyl": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz",
+ "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-livereload": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/gulp-livereload/-/gulp-livereload-3.8.1.tgz",
+ "integrity": "sha1-APdEstdJ0+njdGWJyKRKysd5tQ8=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.5.1",
+ "debug": "2.6.9",
+ "event-stream": "3.3.4",
+ "gulp-util": "3.0.8",
+ "lodash.assign": "3.2.0",
+ "mini-lr": "0.1.9"
+ },
+ "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=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
+ "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
+ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.1.0",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "0.1.0",
+ "strip-ansi": "0.3.0",
+ "supports-color": "0.2.0"
+ }
+ },
+ "has-ansi": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
+ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "0.2.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
+ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-match": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
+ "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
+ "dev": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "gulp-mocha": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-5.0.0.tgz",
+ "integrity": "sha512-NIjXZLqqcw9DXIEBcfm0sP1AUDlUJJeaK9EGCH2s6lSwo5NK/cEat0Vm7XelOkxZnWl0O5Za+aM6E4jyxWxTlw==",
+ "dev": true,
+ "requires": {
+ "dargs": "5.1.0",
+ "execa": "0.8.0",
+ "mocha": "4.1.0",
+ "npm-run-path": "2.0.2",
+ "plugin-error": "0.1.2",
+ "through2": "2.0.3"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz",
+ "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ }
+ }
+ },
+ "gulp-plumber": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.1.0.tgz",
+ "integrity": "sha1-8SF2wtBCL2AwbCQv/2oBo5T6ugk=",
+ "dev": true,
+ "requires": {
+ "gulp-util": "3.0.8",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-sequence": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-sequence/-/gulp-sequence-1.0.0.tgz",
+ "integrity": "sha512-c+p+EcyBl1UCpbfFA/vUD6MuC7uxoY6Y4g2lq9lLtzOHh9o1wijAQ4o0TIRQ14C7cG6zR6Zi+bpA0cW78CFt6g==",
+ "dev": true,
+ "requires": {
+ "thunks": "4.9.0"
+ }
+ },
+ "gulp-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz",
+ "integrity": "sha1-xnYqLx8N4KP8WVohWZ0/rI26Gso=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "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.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "gulp-wait": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/gulp-wait/-/gulp-wait-0.0.2.tgz",
+ "integrity": "sha1-7Ov/REbhoNU3yx3Hc9vUWB0X+y0=",
+ "dev": true,
+ "requires": {
+ "map-stream": "0.0.4"
+ },
+ "dependencies": {
+ "map-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.4.tgz",
+ "integrity": "sha1-XsbekCE+9sey65Nn6a3o2k79tos=",
+ "dev": true
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.0"
+ }
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ }
+ }
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
+ "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.9.0",
+ "is-my-json-valid": "2.17.1",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-color": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
+ "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "has-glob": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-0.1.1.tgz",
+ "integrity": "sha1-omHEwqbGZ+DHe3AKfyl8Oe86pYk=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-gulplog": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
+ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
+ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "1.0.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+ "dev": true
+ },
+ "html-encoding-sniffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+ "dev": true,
+ "requires": {
+ "whatwg-encoding": "1.0.3"
+ }
+ },
+ "http-errors": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz",
+ "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "statuses": "1.4.0"
+ }
+ },
+ "http-parser-js": {
+ "version": "0.4.9",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz",
+ "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
+ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz",
+ "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=",
+ "dev": true,
+ "requires": {
+ "agent-base": "2.1.1",
+ "debug": "2.6.9",
+ "extend": "3.0.1"
+ }
+ },
+ "human-interval": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-0.1.6.tgz",
+ "integrity": "sha1-AFeXNFR2TDq8vrKu1hL8lkTmhIg=",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz",
+ "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=",
+ "dev": true
+ },
+ "ignore": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
+ "dev": true
+ },
+ "image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
+ "dev": true,
+ "optional": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "requires": {
+ "repeating": "2.0.1"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
+ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "3.0.0",
+ "chalk": "2.3.0",
+ "cli-cursor": "2.1.0",
+ "cli-width": "2.2.0",
+ "external-editor": "2.1.0",
+ "figures": "2.0.0",
+ "lodash": "4.17.4",
+ "mute-stream": "0.0.7",
+ "run-async": "2.3.0",
+ "rx-lite": "4.0.8",
+ "rx-lite-aggregates": "4.0.8",
+ "string-width": "2.1.1",
+ "strip-ansi": "4.0.0",
+ "through": "2.3.8"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "1.3.1"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-relative": "1.0.0",
+ "is-windows": "1.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "1.0.0",
+ "is-data-descriptor": "1.0.0",
+ "kind-of": "6.0.2"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+ "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
+ "dev": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz",
+ "integrity": "sha512-Q2khNw+oBlWuaYvEEHtKSw/pCxD2L5Rc1C+UQme9X6JdRDh7m5D7HkozA0qa3DUkQ6VzCnEm8mVIQPyIRkI5sQ==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-odd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz",
+ "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0"
+ }
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
+ "dev": true
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "dev": true,
+ "requires": {
+ "is-path-inside": "1.0.1"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
+ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
+ "dev": true,
+ "requires": {
+ "path-is-inside": "1.0.2"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-unc-path": "1.0.0"
+ }
+ },
+ "is-resolvable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.1.tgz",
+ "integrity": "sha512-y5CXYbzvB3jTnWAZH1Nl7ykUWb6T3BcTs56HUruwBf8MhF56n1HWqhDWnVFo8GHrUPDgvUUNVhrc2U8W7iqz5g==",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "is-valid-glob": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
+ "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
+ "dev": true
+ },
+ "is-windows": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
+ "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=",
+ "dev": true
+ },
+ "is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "isparta": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isparta/-/isparta-4.0.0.tgz",
+ "integrity": "sha1-HekZlvSAsi3LGsqFECVbrhV0RG4=",
+ "dev": true,
+ "requires": {
+ "babel-core": "6.26.0",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "istanbul": "0.4.5",
+ "mkdirp": "0.5.1",
+ "nomnomnomnom": "2.0.1",
+ "object-assign": "4.1.1",
+ "source-map": "0.5.7",
+ "which": "1.3.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ }
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "istanbul": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz",
+ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.9",
+ "async": "1.5.2",
+ "escodegen": "1.8.1",
+ "esprima": "2.7.3",
+ "glob": "5.0.15",
+ "handlebars": "4.0.11",
+ "js-yaml": "3.10.0",
+ "mkdirp": "0.5.1",
+ "nopt": "3.0.6",
+ "once": "1.4.0",
+ "resolve": "1.1.7",
+ "supports-color": "3.2.3",
+ "which": "1.3.0",
+ "wordwrap": "1.0.0"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-threshold-checker": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-threshold-checker/-/istanbul-threshold-checker-0.2.1.tgz",
+ "integrity": "sha1-xdyU6PLMXNP/0zVFL4S1U8QkgzE=",
+ "dev": true,
+ "requires": {
+ "istanbul": "0.4.5",
+ "lodash": "4.17.4"
+ }
+ },
+ "jquery": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz",
+ "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "jsdom": {
+ "version": "11.6.2",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.6.2.tgz",
+ "integrity": "sha512-pAeZhpbSlUp5yQcS6cBQJwkbzmv4tWFaYxHbFVSxzXefqjvtRA851Z5N2P+TguVG9YeUDcgb8pdeVQRJh0XR3Q==",
+ "dev": true,
+ "requires": {
+ "abab": "1.0.4",
+ "acorn": "5.3.0",
+ "acorn-globals": "4.1.0",
+ "array-equal": "1.0.0",
+ "browser-process-hrtime": "0.1.2",
+ "content-type-parser": "1.0.2",
+ "cssom": "0.3.2",
+ "cssstyle": "0.2.37",
+ "domexception": "1.0.1",
+ "escodegen": "1.9.0",
+ "html-encoding-sniffer": "1.0.2",
+ "left-pad": "1.2.0",
+ "nwmatcher": "1.4.3",
+ "parse5": "4.0.0",
+ "pn": "1.1.0",
+ "request": "2.83.0",
+ "request-promise-native": "1.0.5",
+ "sax": "1.2.4",
+ "symbol-tree": "3.2.2",
+ "tough-cookie": "2.3.3",
+ "w3c-hr-time": "1.0.1",
+ "webidl-conversions": "4.0.2",
+ "whatwg-encoding": "1.0.3",
+ "whatwg-url": "6.4.0",
+ "ws": "4.0.0",
+ "xml-name-validator": "3.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=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "dev": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ }
+ }
+ },
+ "escodegen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz",
+ "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==",
+ "dev": true,
+ "requires": {
+ "esprima": "3.1.3",
+ "estraverse": "4.2.0",
+ "esutils": "2.0.2",
+ "optionator": "0.8.2",
+ "source-map": "0.5.7"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz",
+ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.17"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "dev": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.0",
+ "sntp": "2.1.0"
+ }
+ },
+ "hoek": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz",
+ "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.13.1"
+ }
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.83.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz",
+ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.1",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.1",
+ "safe-buffer": "5.1.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.1.0"
+ }
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.0"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "just-extend": {
+ "version": "1.1.27",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz",
+ "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "latest-version": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz",
+ "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=",
+ "dev": true,
+ "requires": {
+ "package-json": "2.4.0"
+ }
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "dev": true,
+ "requires": {
+ "set-getter": "0.1.0"
+ }
+ },
+ "lazy-req": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz",
+ "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "lcov-parse": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
+ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=",
+ "dev": true
+ },
+ "left-pad": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.2.0.tgz",
+ "integrity": "sha1-0wpzxrggHY99jnlWupYWCHpo4O4=",
+ "dev": true
+ },
+ "less": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz",
+ "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
+ "dev": true,
+ "requires": {
+ "errno": "0.1.6",
+ "graceful-fs": "4.1.11",
+ "image-size": "0.5.5",
+ "mime": "1.4.1",
+ "mkdirp": "0.5.1",
+ "promise": "7.3.1",
+ "request": "2.81.0",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true,
+ "optional": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+ "dev": true,
+ "optional": true
+ },
+ "request": {
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.1.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.1.0"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2"
+ }
+ },
+ "liftoff": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
+ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "findup-sync": "2.0.0",
+ "fined": "1.1.0",
+ "flagged-respawn": "1.0.0",
+ "is-plain-object": "2.0.4",
+ "object.map": "1.0.1",
+ "rechoir": "0.6.2",
+ "resolve": "1.5.0"
+ }
+ },
+ "lintspaces": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/lintspaces/-/lintspaces-0.5.1.tgz",
+ "integrity": "sha1-ctbUm7IxYCO7Y9mYTD2U9aDdBCM=",
+ "dev": true,
+ "requires": {
+ "editorconfig": "0.13.2",
+ "merge": "1.2.0",
+ "rc": "1.1.6"
+ }
+ },
+ "livereload-js": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.2.2.tgz",
+ "integrity": "sha1-bIclfmSKtHW8JOoldFftzB+NC8I=",
+ "dev": true
+ },
+ "localtunnel": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.3.tgz",
+ "integrity": "sha1-3MWSL9hWUQN9S94k/ZMkjQsk6wU=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.8",
+ "openurl": "1.1.1",
+ "request": "2.81.0",
+ "yargs": "3.29.0"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
+ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
+ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
+ "dev": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "1.0.0"
+ }
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.81.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
+ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.1.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.1.0"
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "window-size": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
+ "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.29.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz",
+ "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=",
+ "dev": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "os-locale": "1.4.0",
+ "window-size": "0.1.4",
+ "y18n": "3.2.1"
+ }
+ }
+ }
+ },
+ "lock": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/lock/-/lock-0.1.4.tgz",
+ "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basetostring": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
+ "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "dev": true
+ },
+ "lodash._basevalues": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
+ "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
+ "dev": true
+ },
+ "lodash._bindcallback": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz",
+ "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=",
+ "dev": true
+ },
+ "lodash._createassigner": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz",
+ "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=",
+ "dev": true,
+ "requires": {
+ "lodash._bindcallback": "3.0.1",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash.restparam": "3.6.1"
+ }
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._htmlescapes": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz",
+ "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash._isnative": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz",
+ "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=",
+ "dev": true
+ },
+ "lodash._objecttypes": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz",
+ "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=",
+ "dev": true
+ },
+ "lodash._reescape": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
+ "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
+ "dev": true
+ },
+ "lodash._reevaluate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
+ "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
+ "dev": true
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+ "dev": true
+ },
+ "lodash._reunescapedhtml": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz",
+ "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "lodash._shimkeys": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz",
+ "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._createassigner": "3.1.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash.defaults": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz",
+ "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
+ "dev": true
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isobject": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz",
+ "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "lodash.restparam": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
+ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.template": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
+ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "lodash.values": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz",
+ "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "lodash._isnative": "2.4.1",
+ "lodash._shimkeys": "2.4.1",
+ "lodash.isobject": "2.4.1"
+ }
+ }
+ }
+ },
+ "log-driver": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
+ "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
+ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3"
+ }
+ },
+ "lolex": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz",
+ "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "3.0.2"
+ }
+ },
+ "loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "requires": {
+ "currently-unhandled": "0.4.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
+ "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
+ "dev": true
+ },
+ "magic-string": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.16.0.tgz",
+ "integrity": "sha1-lw67DacZMwEoX7GqZQ85vdgetFo=",
+ "dev": true,
+ "requires": {
+ "vlq": "0.2.3"
+ }
+ },
+ "make-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz",
+ "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "1.0.1"
+ }
+ },
+ "matched": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/matched/-/matched-0.4.4.tgz",
+ "integrity": "sha1-Vte36xgDPwz5vFLrIJD6x9weifo=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "async-array-reduce": "0.2.1",
+ "extend-shallow": "2.0.1",
+ "fs-exists-sync": "0.1.0",
+ "glob": "7.1.2",
+ "has-glob": "0.1.1",
+ "is-valid-glob": "0.3.0",
+ "lazy-cache": "2.0.2",
+ "resolve-dir": "0.1.1"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=",
+ "dev": true,
+ "requires": {
+ "global-prefix": "0.1.5",
+ "is-windows": "0.2.0"
+ }
+ },
+ "global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "1.0.1",
+ "ini": "1.3.5",
+ "is-windows": "0.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha1-3hqm1j6indJIc3tp8f+LgALSEIw=",
+ "dev": true
+ },
+ "resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "1.2.2",
+ "global-modules": "0.2.3"
+ }
+ }
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "requires": {
+ "camelcase-keys": "2.1.0",
+ "decamelize": "1.2.0",
+ "loud-rejection": "1.6.0",
+ "map-obj": "1.0.1",
+ "minimist": "1.2.0",
+ "normalize-package-data": "2.4.0",
+ "object-assign": "4.1.1",
+ "read-pkg-up": "1.0.1",
+ "redent": "1.0.0",
+ "trim-newlines": "1.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "requires": {
+ "path-exists": "2.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "pify": "2.3.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "1.1.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "1.1.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=",
+ "dev": true,
+ "requires": {
+ "find-up": "1.1.2",
+ "read-pkg": "1.1.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ }
+ }
+ },
+ "merge": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
+ "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "micromatch": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.4.tgz",
+ "integrity": "sha512-kFRtviKYoAJT+t7HggMl0tBFGNAKLw/S7N+CO9qfEQyisob1Oy4pao+geRbkyeEd+V9aOkvZ4mhuyPvI/q9Sfg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "braces": "2.3.0",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "extglob": "2.0.3",
+ "fragment-cache": "0.2.1",
+ "kind-of": "6.0.2",
+ "nanomatch": "1.2.6",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ }
+ },
+ "mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
+ "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.17",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
+ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.30.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
+ "dev": true
+ },
+ "mini-lr": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/mini-lr/-/mini-lr-0.1.9.tgz",
+ "integrity": "sha1-AhmdJzR5U9H9HW297UJh8Yey0PY=",
+ "dev": true,
+ "requires": {
+ "body-parser": "1.14.2",
+ "debug": "2.6.9",
+ "faye-websocket": "0.7.3",
+ "livereload-js": "2.2.2",
+ "parseurl": "1.3.2",
+ "qs": "2.2.5"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mixin-deep": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz",
+ "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mkpath": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz",
+ "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=",
+ "dev": true
+ },
+ "mocha": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
+ "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.11.0",
+ "debug": "3.1.0",
+ "diff": "3.3.1",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.2",
+ "growl": "1.10.3",
+ "he": "1.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "4.4.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
+ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
+ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.6.tgz",
+ "integrity": "sha512-WJ6XTCbvWXUFPbi/bDwKcYkCeOGUHzaJj72KbuPqGn78Ba/F5Vu26Zlo6SuMQbCIst1RGKL1zfWBCOGAlbRLAg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "4.0.0",
+ "array-unique": "0.3.2",
+ "define-property": "1.0.0",
+ "extend-shallow": "2.0.1",
+ "fragment-cache": "0.2.1",
+ "is-odd": "1.0.0",
+ "kind-of": "5.1.0",
+ "object.pick": "1.3.0",
+ "regex-not": "1.0.0",
+ "snapdragon": "0.8.1",
+ "to-regex": "3.0.1"
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "natives": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz",
+ "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "ngrok": {
+ "version": "2.2.24",
+ "resolved": "https://registry.npmjs.org/ngrok/-/ngrok-2.2.24.tgz",
+ "integrity": "sha512-tz1X/yS3PD5N+Cwijn+bwSrDGNRNPpQPM0TEHtaT8K4sMpFUHFBhRJLlFyoGQyfmSML7Tdq9Fq17AKoEtGaJzw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "8.5.7",
+ "async": "2.6.0",
+ "decompress-zip": "0.3.0",
+ "lock": "0.1.4",
+ "request": "2.79.0",
+ "uuid": "3.1.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ }
+ }
+ },
+ "nise": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz",
+ "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==",
+ "dev": true,
+ "requires": {
+ "formatio": "1.2.0",
+ "just-extend": "1.1.27",
+ "lolex": "1.6.0",
+ "path-to-regexp": "1.7.0",
+ "text-encoding": "0.6.4"
+ },
+ "dependencies": {
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ }
+ }
+ },
+ "node-status-codes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz",
+ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=",
+ "dev": true
+ },
+ "nomnomnomnom": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nomnomnomnom/-/nomnomnomnom-2.0.1.tgz",
+ "integrity": "sha1-siOfAxyNBNpn4yg24eMZnhL3qOI=",
+ "dev": true,
+ "requires": {
+ "chalk": "0.4.0",
+ "underscore": "1.6.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz",
+ "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz",
+ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "1.0.0",
+ "has-color": "0.1.7",
+ "strip-ansi": "0.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz",
+ "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz",
+ "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.9"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "4.3.6",
+ "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=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.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=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "nwmatcher": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz",
+ "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "0.1.1",
+ "define-property": "0.2.5",
+ "kind-of": "3.2.2"
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.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==",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "object-keys": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
+ "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "object.defaults": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
+ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "dev": true,
+ "requires": {
+ "array-each": "1.0.1",
+ "array-slice": "1.1.0",
+ "for-own": "1.0.0",
+ "isobject": "3.0.1"
+ }
+ },
+ "object.map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
+ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "dev": true,
+ "requires": {
+ "for-own": "1.0.0",
+ "make-iterator": "1.0.0"
+ }
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ },
+ "dependencies": {
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ }
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "3.0.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "openurl": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
+ "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=",
+ "dev": true
+ },
+ "opn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
+ "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "1.1.0"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8",
+ "wordwrap": "0.0.3"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ }
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "0.1.3",
+ "fast-levenshtein": "2.0.6",
+ "levn": "0.3.0",
+ "prelude-ls": "1.1.2",
+ "type-check": "0.3.2",
+ "wordwrap": "1.0.0"
+ }
+ },
+ "orchestrator": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
+ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "0.1.5",
+ "sequencify": "0.0.7",
+ "stream-consume": "0.1.0"
+ }
+ },
+ "ordered-read-streams": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
+ "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz",
+ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "package-json": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz",
+ "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=",
+ "dev": true,
+ "requires": {
+ "got": "5.7.1",
+ "registry-auth-token": "3.3.1",
+ "registry-url": "3.1.0",
+ "semver": "5.4.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ }
+ }
+ },
+ "parse-filepath": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
+ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "1.0.0",
+ "map-cache": "0.2.2",
+ "path-root": "0.1.1"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz",
+ "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "0.1.2"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
+ "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
+ "pathval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
+ "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "dev": true
+ },
+ "pause-stream": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
+ "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "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=",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "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=",
+ "dev": true
+ }
+ }
+ },
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
+ "pn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pretty-hrtime": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+ "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-es6": {
+ "version": "0.11.6",
+ "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz",
+ "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
+ "dev": true
+ },
+ "promise": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asap": "2.0.6"
+ }
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true,
+ "optional": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
+ "qs": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz",
+ "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz",
+ "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=",
+ "dev": true,
+ "requires": {
+ "bytes": "2.4.0",
+ "iconv-lite": "0.4.13",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz",
+ "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=",
+ "dev": true
+ }
+ }
+ },
+ "rc": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz",
+ "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "1.0.4"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
+ "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
+ "dev": true
+ }
+ }
+ },
+ "read-all-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz",
+ "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "2.0.1",
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "rechoir": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
+ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "dev": true,
+ "requires": {
+ "resolve": "1.5.0"
+ }
+ },
+ "redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "requires": {
+ "indent-string": "2.1.0",
+ "strip-indent": "1.0.1"
+ }
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "6.26.0",
+ "babel-types": "6.26.0",
+ "private": "0.1.8"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz",
+ "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz",
+ "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=",
+ "dev": true,
+ "requires": {
+ "rc": "1.1.6",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "1.1.6"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "1.0.2"
+ }
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.17",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.3",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.1.0"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ }
+ }
+ },
+ "request-progress": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz",
+ "integrity": "sha1-ByHBBdipasayzossia4tXs/Pazo=",
+ "dev": true,
+ "requires": {
+ "throttleit": "0.0.2"
+ }
+ },
+ "request-promise-core": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
+ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "request-promise-native": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz",
+ "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=",
+ "dev": true,
+ "requires": {
+ "request-promise-core": "1.1.1",
+ "stealthy-require": "1.1.1",
+ "tough-cookie": "2.3.3"
+ }
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "dev": true,
+ "requires": {
+ "caller-path": "0.1.0",
+ "resolve-from": "1.0.1"
+ }
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "2.0.2",
+ "global-modules": "1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+ "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "2.0.1",
+ "signal-exit": "3.0.2"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "rollup": {
+ "version": "0.53.3",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.53.3.tgz",
+ "integrity": "sha512-MADFV0jpoh1QDB6U0U6YamGihGetxHEYgwTcGsc7map6JFIydPEfGNshK+ozxv1RKeUOQKn1vRb85IAcdjL22Q==",
+ "dev": true
+ },
+ "rollup-plugin-babel": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-3.0.3.tgz",
+ "integrity": "sha512-5kzM/Rr4jQSRPLc2eN5NuD+CI/6AAy7S1O18Ogu4U3nq1Q42VJn0C9EMtqnvxtfwf1XrezOtdA9ro1VZI5B0mA==",
+ "dev": true,
+ "requires": {
+ "rollup-pluginutils": "1.5.2"
+ }
+ },
+ "rollup-plugin-clean": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-clean/-/rollup-plugin-clean-1.0.0.tgz",
+ "integrity": "sha512-om3+UsHOFMsB/StS2vxZcwq0Poqcx6SP7Aw/AtXXPr7yEybC6GW6IUHQANWOEop0fiuVteq2goxeC5UPRASFGg==",
+ "dev": true,
+ "requires": {
+ "rimraf": "2.6.2"
+ }
+ },
+ "rollup-plugin-commonjs": {
+ "version": "8.2.6",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz",
+ "integrity": "sha512-qK0+uhktmnAgZkHkqFuajNmPw93fjrO7+CysDaxWE5jrUR9XSlSvuao5ZJP+XizxA8weakhgYYBtbVz9SGBpjA==",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "estree-walker": "0.5.1",
+ "magic-string": "0.22.4",
+ "resolve": "1.5.0",
+ "rollup-pluginutils": "2.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "estree-walker": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.1.tgz",
+ "integrity": "sha512-7HgCgz1axW7w5aOvgOQkoR1RMBkllygJrssU3BvymKQ95lxXYv6Pon17fBRDm9qhkvXZGijOULoSF9ShOk/ZLg==",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "magic-string": {
+ "version": "0.22.4",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz",
+ "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==",
+ "dev": true,
+ "requires": {
+ "vlq": "0.2.3"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz",
+ "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=",
+ "dev": true,
+ "requires": {
+ "estree-walker": "0.3.1",
+ "micromatch": "2.3.11"
+ },
+ "dependencies": {
+ "estree-walker": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz",
+ "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "rollup-plugin-json": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-2.3.0.tgz",
+ "integrity": "sha512-W45nZH7lmXgkSR/DkeyF4ks0YWFrMysdjUT049gTuAg+lwUEDBKI2+PztqW8UDSMlXCAeEONsLzpDDyBy9m+9A==",
+ "dev": true,
+ "requires": {
+ "rollup-pluginutils": "2.0.1"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "estree-walker": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.3.1.tgz",
+ "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz",
+ "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=",
+ "dev": true,
+ "requires": {
+ "estree-walker": "0.3.1",
+ "micromatch": "2.3.11"
+ }
+ }
+ }
+ },
+ "rollup-plugin-multi-entry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-multi-entry/-/rollup-plugin-multi-entry-2.0.2.tgz",
+ "integrity": "sha512-TY72fCVJvcEAQBpBzkXykoYQx2fz0B20EVtcbh0WZaYr5eBu3U1dRPzgMt6aO8MePWWOdcmgoBtG6PhmYJr4Ew==",
+ "dev": true,
+ "requires": {
+ "matched": "0.4.4"
+ }
+ },
+ "rollup-plugin-node-globals": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.1.0.tgz",
+ "integrity": "sha1-fv2NYR0TJzeCnoBOn1H1CWKvRR8=",
+ "dev": true,
+ "requires": {
+ "acorn": "4.0.13",
+ "buffer-es6": "4.9.3",
+ "estree-walker": "0.2.1",
+ "magic-string": "0.16.0",
+ "process-es6": "0.11.6",
+ "rollup-pluginutils": "1.5.2"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ },
+ "rollup-plugin-node-resolve": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz",
+ "integrity": "sha1-i4l8TDAw1QASd7BRSyXSygloPuA=",
+ "dev": true,
+ "requires": {
+ "browser-resolve": "1.11.2",
+ "builtin-modules": "1.1.1",
+ "is-module": "1.0.0",
+ "resolve": "1.5.0"
+ }
+ },
+ "rollup-pluginutils": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz",
+ "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=",
+ "dev": true,
+ "requires": {
+ "estree-walker": "0.2.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "2.1.0"
+ }
+ },
+ "run-sequence": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz",
+ "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "fancy-log": "1.3.2",
+ "plugin-error": "0.1.2"
+ }
+ },
+ "rx-lite": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
+ "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=",
+ "dev": true
+ },
+ "rx-lite-aggregates": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
+ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
+ "dev": true,
+ "requires": {
+ "rx-lite": "4.0.8"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "sauce-connect-launcher": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-0.16.0.tgz",
+ "integrity": "sha1-AOea7M9RPxlJ4tRXM86A/trcWgU=",
+ "dev": true,
+ "requires": {
+ "adm-zip": "0.4.7",
+ "async": "1.4.0",
+ "https-proxy-agent": "1.0.0",
+ "lodash": "3.10.1",
+ "rimraf": "2.4.3"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.4.0.tgz",
+ "integrity": "sha1-Nfhvg8WeBCHQmc2akdgnj7V4wA0=",
+ "dev": true
+ },
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz",
+ "integrity": "sha1-5bUclDekxYKtuVXp8oz42UXicq8=",
+ "dev": true,
+ "requires": {
+ "glob": "5.0.15"
+ }
+ }
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "5.4.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ }
+ }
+ },
+ "send": {
+ "version": "0.16.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz",
+ "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "1.1.1",
+ "destroy": "1.0.4",
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "etag": "1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "2.3.0",
+ "range-parser": "1.2.0",
+ "statuses": "1.3.1"
+ },
+ "dependencies": {
+ "http-errors": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
+ "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.1",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.0.3",
+ "statuses": "1.3.1"
+ }
+ },
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "sequencify": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
+ "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "dev": true
+ },
+ "serve-static": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz",
+ "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==",
+ "dev": true,
+ "requires": {
+ "encodeurl": "1.0.1",
+ "escape-html": "1.0.3",
+ "parseurl": "1.3.2",
+ "send": "0.16.1"
+ }
+ },
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "dev": true,
+ "requires": {
+ "to-object-path": "0.3.0"
+ }
+ },
+ "set-value": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "split-string": "3.1.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
+ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "simple-jsdom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/simple-jsdom/-/simple-jsdom-3.0.0.tgz",
+ "integrity": "sha1-Y65SzGgu5Co6mVUlYZDBE65X6a4=",
+ "dev": true
+ },
+ "sinon": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.3.tgz",
+ "integrity": "sha512-c7u0ZuvBRX1eXuB4jN3BRCAOGiUTlM8SE3TxbJHrNiHUKL7wonujMOB6Fi1gQc00U91IscFORQHDga/eccqpbw==",
+ "dev": true,
+ "requires": {
+ "diff": "3.2.0",
+ "formatio": "1.2.0",
+ "lodash.get": "4.4.2",
+ "lolex": "2.3.1",
+ "nise": "1.2.0",
+ "supports-color": "4.5.0",
+ "type-detect": "4.0.5"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "sinon-chai": {
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz",
+ "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.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=",
+ "dev": true
+ }
+ }
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "snapdragon": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz",
+ "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=",
+ "dev": true,
+ "requires": {
+ "base": "0.11.2",
+ "debug": "2.6.9",
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "map-cache": "0.2.2",
+ "source-map": "0.5.7",
+ "source-map-resolve": "0.5.1",
+ "use": "2.0.2"
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "define-property": "1.0.0",
+ "isobject": "3.0.1",
+ "snapdragon-util": "3.0.1"
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz",
+ "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==",
+ "dev": true,
+ "requires": {
+ "atob": "2.0.3",
+ "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==",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "split": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "3.0.2"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "1.0.0",
+ "is-extendable": "1.0.1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "2.0.4"
+ }
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
+ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "dev": true
+ },
+ "stealthy-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+ "dev": true
+ },
+ "stream-combiner": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1"
+ }
+ },
+ "stream-combiner2": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+ "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.1.4",
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "stream-consume": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz",
+ "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=",
+ "dev": true
+ },
+ "stream-shift": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
+ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
+ "dev": true
+ },
+ "string-to-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.0.tgz",
+ "integrity": "sha1-rPLJ6tHEGOFIUJoS0su0afMzohg=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "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=",
+ "dev": true
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
+ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "is-utf8": "0.2.1"
+ }
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "requires": {
+ "get-stdin": "4.0.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "symbol-tree": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
+ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
+ "dev": true
+ },
+ "table": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
+ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "chalk": "2.3.0",
+ "lodash": "4.17.4",
+ "slice-ansi": "1.0.0",
+ "string-width": "2.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "ternary-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
+ "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
+ "dev": true,
+ "requires": {
+ "duplexify": "3.5.1",
+ "fork-stream": "0.0.4",
+ "merge-stream": "1.0.1",
+ "through2": "2.0.3"
+ }
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "throttleit": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz",
+ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.3",
+ "xtend": "4.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "thunks": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/thunks/-/thunks-4.9.0.tgz",
+ "integrity": "sha512-Bp4sGtcf8/SAgX2XBXYH2Crc7ESL7xuTuQ5kx84Tvz7VSkLFg6bfjFBpRmX2DLAWaLeK6q32ogqAnXcr5NAQtw==",
+ "dev": true
+ },
+ "tildify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
+ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "dev": true
+ },
+ "timed-out": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz",
+ "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "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=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz",
+ "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "extend-shallow": "2.0.1",
+ "regex-not": "1.0.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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "touch": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz",
+ "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=",
+ "dev": true,
+ "requires": {
+ "nopt": "1.0.10"
+ },
+ "dependencies": {
+ "nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+ "dev": true,
+ "requires": {
+ "abbrev": "1.0.9"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
+ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "requires": {
+ "punycode": "2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
+ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=",
+ "dev": true
+ }
+ }
+ },
+ "traverse": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=",
+ "dev": true
+ },
+ "trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz",
+ "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.15",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz",
+ "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.17"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "uglify-es": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.4.tgz",
+ "integrity": "sha512-vDOyDaf7LcABZI5oJt8bin5FD8kYONux5jd8FY6SsV2SfD+MMXaPeGUotysbycSxdu170y5IQ8FvlKzU/TUryw==",
+ "dev": true,
+ "requires": {
+ "commander": "2.12.2",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "uglify-js": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.4.tgz",
+ "integrity": "sha512-hfIwuAQI5dlXP30UtdmWoYF9k+ypVqBXIdmd6ZKBiaNHHvA8ty7ZloMe3+7S5AEKVkxHbjByl4DfRHQ7QpZquw==",
+ "dev": true,
+ "requires": {
+ "commander": "2.12.2",
+ "source-map": "0.6.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "optional": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "underscore": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
+ "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+ "dev": true,
+ "requires": {
+ "arr-union": "3.1.0",
+ "get-value": "2.0.6",
+ "is-extendable": "0.1.1",
+ "set-value": "0.4.3"
+ },
+ "dependencies": {
+ "set-value": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "2.0.1",
+ "is-extendable": "0.1.1",
+ "is-plain-object": "2.0.4",
+ "to-object-path": "0.3.0"
+ }
+ }
+ }
+ },
+ "unique-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
+ "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "0.3.1",
+ "isobject": "3.0.1"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "2.0.6",
+ "has-values": "0.1.4",
+ "isobject": "2.1.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "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=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ }
+ }
+ },
+ "unzip-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz",
+ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz",
+ "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=",
+ "dev": true,
+ "requires": {
+ "boxen": "0.6.0",
+ "chalk": "1.1.3",
+ "configstore": "2.1.0",
+ "is-npm": "1.0.0",
+ "latest-version": "2.0.0",
+ "lazy-req": "1.1.0",
+ "semver-diff": "2.1.0",
+ "xdg-basedir": "2.0.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "1.0.4"
+ }
+ },
+ "use": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz",
+ "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=",
+ "dev": true,
+ "requires": {
+ "define-property": "0.2.5",
+ "isobject": "3.0.1",
+ "lazy-cache": "2.0.2"
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "0.1.6"
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "0.1.6",
+ "is-data-descriptor": "0.1.4",
+ "kind-of": "5.1.0"
+ }
+ },
+ "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==",
+ "dev": true
+ }
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
+ "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
+ "dev": true
+ },
+ "v8flags": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
+ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "dev": true,
+ "requires": {
+ "user-home": "1.1.1"
+ }
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ }
+ }
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ },
+ "vinyl-fs": {
+ "version": "0.3.14",
+ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
+ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "dev": true,
+ "requires": {
+ "defaults": "1.0.3",
+ "glob-stream": "3.1.18",
+ "glob-watcher": "0.0.6",
+ "graceful-fs": "3.0.11",
+ "mkdirp": "0.5.1",
+ "strip-bom": "1.0.0",
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-source-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz",
+ "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "2.1.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "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=",
+ "dev": true
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.0.0",
+ "remove-trailing-separator": "1.1.0",
+ "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=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7"
+ }
+ },
+ "vlq": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
+ "dev": true
+ },
+ "w3c-hr-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
+ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
+ "dev": true,
+ "requires": {
+ "browser-process-hrtime": "0.1.2"
+ }
+ },
+ "webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "websocket-driver": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz",
+ "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=",
+ "dev": true,
+ "requires": {
+ "http-parser-js": "0.4.9",
+ "websocket-extensions": "0.1.3"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
+ "dev": true
+ },
+ "whatwg-encoding": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz",
+ "integrity": "sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.4.19"
+ },
+ "dependencies": {
+ "iconv-lite": {
+ "version": "0.4.19",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
+ "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
+ "dev": true
+ }
+ }
+ },
+ "whatwg-url": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz",
+ "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "4.7.0",
+ "tr46": "1.0.1",
+ "webidl-conversions": "4.0.2"
+ }
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "dev": true,
+ "requires": {
+ "mkdirp": "0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz",
+ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "imurmurhash": "0.1.4",
+ "slide": "1.1.6"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ }
+ }
+ },
+ "ws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-4.0.0.tgz",
+ "integrity": "sha512-QYslsH44bH8O7/W2815u5DpnCpXWpEK44FmaHffNwgJI4JMaSZONgPBTOfrxJ29mXKbXak+LsJ2uAkDTYq2ptQ==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "1.0.0",
+ "safe-buffer": "5.1.1",
+ "ultron": "1.1.1"
+ }
+ },
+ "xdg-basedir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz",
+ "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "1.0.2"
+ }
+ },
+ "xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "xvfb": {
+ "version": "github:cypress-io/node-xvfb#22e3783c31d81ebe64d8c0df491ea00cdc74726a",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 3f27d6c..b5c1d29 100644
--- a/package.json
+++ b/package.json
@@ -1,44 +1,96 @@
{
"name": "marionette.yat",
- "version": "2.0.0",
- "description": "Marionette Yet Another Toolkit is a set of mixins, components and utils for backbone.marionette",
- "main": "index.js",
+ "version": "0.0.32",
+ "description": "Marionette Yet Another Toolkit",
+ "main": "dist/marionette.yat.js",
"scripts": {
+ "build": "gulp build",
+ "esfix": "gulp esfix",
+ "coverage": "gulp coverage",
+ "coveralls": "gulp coveralls",
+ "test": "gulp",
+ "test-browser": "gulp test-browser",
+ "test-cross-browser": "gulp test-cross-browser",
+ "test-cypress": "gulp cypress-run",
+ "test-cypress-ci": "gulp cypress-ci",
+ "test-lodash": "USE_LODASH=1 gulp"
},
"repository": {
"type": "git",
"url": "https://github.com/taburetkin/marionette.yat.git"
},
- "keywords": ["backbone", "backbone.marionette", "components", "utils", "mixins"],
- "author": "dimtabu ",
+ "keywords": [],
+ "author": "dimtabu",
"license": "MIT",
"bugs": {
"url": "https://github.com/taburetkin/marionette.yat/issues"
},
"homepage": "https://github.com/taburetkin/marionette.yat",
"devDependencies": {
- "@babel/core": "^7.4.4",
- "@babel/plugin-transform-runtime": "^7.4.4",
- "@babel/preset-env": "^7.4.4",
- "@babel/register": "^7.4.4",
- "@babel/runtime": "^7.4.4",
- "backbone": "^1.4.0",
- "backbone.marionette": "^4.1.2",
- "chai": "^4.2.0",
- "chai-as-promised": "^7.1.1",
- "cross-env": "^5.2.0",
- "eslint": "^5.16.0",
- "jsdom": "^15.0.0",
- "mocha": "^6.1.4",
- "nyc": "^14.1.0",
- "sinon": "^7.3.2",
- "sinon-chai": "^3.3.0",
- "underscore": "^1.9.1"
+ "babel-core": "^6.26.0",
+ "babel-eslint": "^8.1.2",
+ "babel-plugin-root-import": "^5.1.0",
+ "babel-preset-es2015": "^6.24.1",
+ "babel-register": "^6.26.0",
+ "backbone": "^1.3.3",
+ "backbone.marionette": "^3.5.1",
+ "backbone.radio": "^2.0.0",
+ "chai": "^4.1.2",
+ "chai-jq": "^0.0.9",
+ "cypress-cli": "^0.14.0",
+ "easy-sauce": "^0.4.1",
+ "eslint": "^4.14.0",
+ "gulp": "^3.9.1",
+ "gulp-clean": "^0.3.2",
+ "gulp-concat-util": "^0.5.5",
+ "gulp-coveralls": "^0.1.4",
+ "gulp-eslint": "^4.0.1",
+ "gulp-if": "^2.0.2",
+ "gulp-istanbul": "^1.1.3",
+ "gulp-lintspaces": "^0.5.0",
+ "gulp-livereload": "^3.8.1",
+ "gulp-mocha": "^5.0.0",
+ "gulp-plumber": "^1.1.0",
+ "gulp-sequence": "^1.0.0",
+ "gulp-sort": "^2.0.0",
+ "gulp-util": "^3.0.8",
+ "gulp-wait": "0.0.2",
+ "isparta": "^4.0.0",
+ "jquery": "^3.2.1",
+ "jsdom": "^11.6.2",
+ "less": "^2.7.3",
+ "merge-stream": "^1.0.1",
+ "mocha": "^4.1.0",
+ "opn": "^5.1.0",
+ "rollup": "^0.53.3",
+ "rollup-plugin-babel": "^3.0.3",
+ "rollup-plugin-clean": "^1.0.0",
+ "rollup-plugin-commonjs": "^8.2.6",
+ "rollup-plugin-json": "^2.3.0",
+ "rollup-plugin-multi-entry": "^2.0.2",
+ "rollup-plugin-node-globals": "^1.1.0",
+ "rollup-plugin-node-resolve": "^3.0.0",
+ "run-sequence": "^2.2.1",
+ "simple-jsdom": "^3.0.0",
+ "sinon": "^4.1.3",
+ "sinon-chai": "^2.14.0",
+ "string-to-stream": "^1.1.0",
+ "uglify-es": "^3.3.4",
+ "uglify-js": "^3.3.4",
+ "underscore": "^1.8.3",
+ "vinyl-source-stream": "^2.0.0"
},
"peerDependencies": {
- "backbone": "^1.4.0",
- "backbone.marionette": "^4.1.2",
- "underscore": "^1.9.1"
+ "jquery": "^3.2.1",
+ "underscore": "^1.8.3",
+ "backbone": "^1.3.3",
+ "backbone.radio": "^2.0.0",
+ "backbone.marionette": "^3.5.1"
+ },
+ "babelBoilerplateOptions": {
+ "entryFileName": "marionette.yat.js",
+ "mainVarName": "marionetteYat",
+ "exportVarName": "Marionette.Yat"
},
"dependencies": {}
}
diff --git a/routing/config.js b/routing/config.js
deleted file mode 100644
index fa67503..0000000
--- a/routing/config.js
+++ /dev/null
@@ -1,4 +0,0 @@
-const config = {
- history: null,
-};
-export default config;
diff --git a/routing/history.js b/routing/history.js
deleted file mode 100644
index b666f2c..0000000
--- a/routing/history.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { History } from '../vendors';
-
-export default History.extend({
- isStarted() {
- return History.started;
- },
-});
diff --git a/routing/page/basePage.js b/routing/page/basePage.js
deleted file mode 100644
index 8e8a0af..0000000
--- a/routing/page/basePage.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import YatObject from '../../coms/yatObject';
-import routesMixin from './routes-mixin';
-import childrenMixin from './children-mixin';
-import urlMixin from './url-mixin';
-import viewMixin from './view-mixin';
-
-import { startableMixin } from '../../coms/startable';
-import mix from '../../utils/mix';
-
-const BasePage = mix(YatObject).with(startableMixin, routesMixin, childrenMixin, urlMixin, viewMixin);
-export default BasePage;
diff --git a/routing/page/children-mixin.js b/routing/page/children-mixin.js
deleted file mode 100644
index 8936dcf..0000000
--- a/routing/page/children-mixin.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import _ from 'underscore';
-import BasePage from './basePage';
-import { buildItem } from '../../utils/build-utils';
-import { isInstance } from '../../utils';
-export default {
- getParent() {
- return this.parent;
- },
- getRoot() {
- let parent = this.getParent();
- if (!parent || !parent.getRoot) return this;
- return parent.getRoot();
- },
- getChildren(options = {}) {
- if (!options.predicate) {
- return this._children;
- } else {
- return _.filter(this._children, options.predicate);
- }
- },
- getSiblings() {
- let parent = this.getParent();
- if (!parent) return;
- let predicate = page => page != this;
- return parent.getChildren({ predicate });
- },
- hasChildren() {
- let children = this.getChildren();
- return children && !!children.length;
- },
- //#region Initialize
- _initializeChildrenMixin() {
- let onready = this.getOption('initializeChildrenOnReady');
- if (!onready) {
- this._createChildren();
- } else {
- this.once('ready', this._createChildren);
- }
- },
- _createChildren() {
- if (this._children) return;
- let children = this.getOption('children') || [];
-
- let options = this.getOption('childrenOptions') || {};
-
- this._children = _.reduce(children, (memo, arg) => {
- let child = this._buildChild(arg, options);
- if (child) {
- memo.push(child);
- child.ready();
- }
- return memo;
- }, []);
- },
- getChildOptions(options = {}) {
- _.defaults(options, {
- app: this.app,
- router: this.getRouter(),
- parent: this,
- childPage: this.childPage,
- });
- return options;
- },
- _buildChild(arg, opts = {}) {
- opts = this.getChildOptions(opts);
- if (isInstance(arg, BasePage)) {
- return arg;
- } else if (!_.isFunction(arg) && _.isObject(arg)) {
- let item = {
- class: this.childPage
- }
- let pageOptions = {
- BaseClass: BasePage,
- ctorArgs: _.extend({}, opts, arg)
- }
- return buildItem(this, item, pageOptions);
- }
- return buildItem(this, arg, {
- BaseClass: BasePage,
- ctorArgs: opts
- });
- },
- //#endregion
-};
diff --git a/routing/page/index.js b/routing/page/index.js
deleted file mode 100644
index 6aab842..0000000
--- a/routing/page/index.js
+++ /dev/null
@@ -1,74 +0,0 @@
-import BasePage from './basePage';
-import { awaiter } from '../../utils/async-utils';
-
-const errHelper = (result, onFalse = false) => {
- if (result === false) {
- return onFalse;
- } else if (result !== true && result) {
- return result;
- }
-}
-
-const Page = BasePage.extend({
-
- initializeRoutesOnReady: true,
- initializeChildrenOnReady: true,
- immediatelyReady: true,
- relativeRoutes: true,
-
- constructor(options) {
- BasePage.apply(this, arguments);
- this.mergeOptions(options, ['parent','router', 'app']);
- if (!this.childPage) {
- this.childPage = this.getOption('childPage');
- }
- this._initializeRoutesMixin();
- this._initializeChildrenMixin();
- if (this.getOption('immediatelyReady')) {
- this.ready();
- }
- },
-
-
- // start lifecycle:
- // isNotAvailable: null || error
- // validate beforeRoute: null || error, accepts request
- // validate beforeStart: null || error, accepts request
-
- //#region Helpers
-
- getOption(key, options = {}) {
- if (options.args == null) {
- options.args = [this];
- }
- if (this.model) {
- options.args.push(this.model);
- }
- return BasePage.prototype.getOption.call(this, key, options);
- },
- getHeader() {
- return this.getOption('header');
- },
-
- // all validators should return: true | null | undefined - for available page, other values will be treaten as error
- _isNotAvailable(...args) {
-
- let result = errHelper(this.checkAuth(), 'not:authorized');
- if (result) return result;
-
- result = errHelper(this.getOption('isNotAvailable', { args }), 'not:allowed');
- if (result) return result;
-
- },
- _isNotAvailableAsync() {
- return awaiter(this._isNotAvailable(...arguments));
- },
- // you have to write this by your own
- // return true | null | undefined - for passed check, other return values treated as check fail
- checkAuth() { },
-
- //#endregion
-});
-
-
-export default Page;
diff --git a/routing/page/routes-mixin.js b/routing/page/routes-mixin.js
deleted file mode 100644
index 130d27c..0000000
--- a/routing/page/routes-mixin.js
+++ /dev/null
@@ -1,182 +0,0 @@
-import _ from 'underscore';
-import config from '../config';
-import Router from '../router';
-
-const routeToRegExp = Router.prototype._routeToRegExp;
-
-export default {
- _initializeRoutesMixin() {
- let onready = this.getOption('initializeRoutesOnReady');
- if (!onready) {
- this._createRoutes();
- } else {
- this.once('ready', this._createRoutes);
- }
- },
-
- _createRoutes() {
- if (this._routes) return;
- let routes = this.getOption('routes');
- if (routes == null) return;
- if (_.isString(routes)) {
- routes = [routes];
- }
- let defaultRoute;
- this._routes = _.reduce(routes, (memo, arg, key) => {
- let route = this._buildRoute(key, arg);
- if (route != null) {
- memo.push(route);
- if (route.isDefault || !defaultRoute) {
- defaultRoute = route;
- }
- }
- return memo;
- }, []);
- if (defaultRoute && !defaultRoute.isDefault) {
- defaultRoute.isDefault = true;
- this.hasRouteParameters = defaultRoute.hasParameters;
- }
- this._registerRoutes(this._routes);
- },
-
- _buildRoute(routeKey, arg) {
- if (_.isString(arg)) {
- return this._buildRoute(routeKey, { route: arg })
- } else if (_.isFunction(arg)) {
- return this._buildRoute(routeKey, arg.call(this, routeKey));
- } else if (!_.isObject(arg) || arg.route == null) {
- return;
- }
- if (arg.name == null) {
- arg.name = routeKey;
- }
- arg.routeRegExp = routeToRegExp(arg.route);
- arg.hasParameters = /:\w+/g.test(arg.route);
- if (this.getOption('relativeRoutes')) {
- let parent = this.getParent();
- let parentRoute = parent && parent.getDefaultRoute && parent.getDefaultRoute();
- if (parentRoute != null && parentRoute.route) {
- arg.route = parentRoute.route + '/' + arg.route;
- }
- }
- return arg;
- },
-
- getDefaultRoute() {
- return this.getRoute();
- },
- // arg should be a string, or predicate. if its null then defaultRoute returned
- getRoute(arg) {
- let predicate;
- if (_.isObject(predicate)) {
- arg = predicate;
- } else if (_.isString(arg)) {
- predicate = { name: arg }
- } else {
- predicate = { isDefault: true };
- }
- return _.findWhere(this._routes || [], predicate);
- },
-
- // adds routes to router
- _registerRoutes(routes) {
- let router = this.getRouter();
- if (!router || !routes || !routes.length) return;
- _.each(routes, route => {
- let rawroute = route.route;
- let handler = this.createRouteHandler(route, router);
- router.route(rawroute, handler);
- });
- },
-
- createRouteHandler(route, router) {
- const handler = async(...args) => {
- let request = this.createRequest(route, args);
- return await request.calledMethod();
- }
- return handler;
- },
-
- createRequest(route, args) {
- let requestUrl = window.location.pathname + window.location.search + window.location.hash;
- let request = _.extend({ page: this, requestUrl }, route);
- if (args != null) {
- request.rawQs = args.pop();
- request.rawArgs = args;
- if (typeof (URLSearchParams) != 'undefined') {
- request.qs = new URLSearchParams(request.rawQs || '');
- }
- if (_.isArray(request.rawArgs)) {
- let matches = request.route.match(/:\w+/g);
- request.args = _.reduce(matches, (memo, match, index) => {
- memo[match.substring(1)] = request.rawArgs[index];
- return memo;
- }, {});
- }
- }
-
- request.calledMethod = async() => await this.route(request);
- return request;
- },
-
- _onRouteError(err, req) {
- this.triggerMethod('route:error', err, req);
- if (!config.history) return;
- config.history.trigger('page:route:error', err, req);
- config.history.trigger('after:page:route', req);
- },
-
- async route(request) {
- let history = config.history;
- history && history.trigger('before:page:route', request);
-
- let error = await this._routeCheckIsNotValid(request);
- if (error) return error;
-
- error = await this._routeCheckBeforeRoute(request);
- if (error) return error;
-
- error = await this._routeCheckStart(request);
- if (error) return error;
-
- this.triggerMethod('route', request);
- if (history) {
- history.trigger('page:route', request);
- history.trigger('after:page:route', request);
- }
- },
-
- async _routeCheckIsNotValid(request) {
- let validateResult = await this._isNotAvailableAsync({ for: 'route', request });
- let validateError = validateResult.errOrVal();
- if (validateError) {
- this._onRouteError(validateError, request);
- return validateError;
- }
- },
-
- async _routeCheckBeforeRoute(request) {
- let res = await this.triggerMethodAsync('before:route', request);
- if (res.isError()) {
- let err = res.err();
- this._onRouteError(err, request);
- return err;
- }
- },
-
- async _routeCheckStart(request) {
- let pageResult = await this.startAsync(request);
- if (pageResult.isError()) {
- let err = pageResult.err();
- this._onRouteError(err, request);
- return err;
- }
- },
-
- getRouter() {
- return this.router;
- },
- getApp() {
- return this.app;
- }
-};
diff --git a/routing/page/url-mixin.js b/routing/page/url-mixin.js
deleted file mode 100644
index 28fc68d..0000000
--- a/routing/page/url-mixin.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import _ from 'underscore';
-import buildRouteUrl from '../../utils/buildRouteUrl';
-
-export default {
- getUrl(options = {}) {
- let routeContext = this.getRoute(options.routeName);
- if (!routeContext) return;
- return this._buildUrl(routeContext, options);
- },
- _buildUrl(routeContext, options = {}) {
- let { data, search, hash } = options;
- let url = buildRouteUrl(routeContext.route, data, search, hash);
- return url;
- },
-
-
- getMenuIcon() {
- return this.getOption('menuIcon');
- },
- getMenuLabel(options) {
- return this.getOption('menuLabel') || this.getHeader(options) || this.getOption('name') || this.cid;
- },
-
-
- createMenu(options) {
- return {
- id: this.cid,
- name: this.getOption('name'),
- label: this.getMenuLabel(options),
- icon: this.getMenuIcon(options),
- url: this.getUrl(options),
- }
- },
- _getPagesMenu(pages, options) {
- if (!pages) return;
- let menus = _.reduce(pages, (memo, page) => {
- let menu = page.getMenu(options);
- menu && memo.push(menu);
- return memo;
- }, []);
- if (menus.length) {
- return menus;
- }
- },
- isAvailableForMenu(options = {}) {
- let notInMenu = this.getOption('notInMenu');
- let available = !notInMenu && (options.data || !this.hasRouteParameters);
- let na = this._isNotAvailable({ for: 'menu' });
- return available && (na == null || na === true);
- },
- getMenu(options = {}) {
- if (!this.isAvailableForMenu(options)) return;
-
- let menu = this.createMenu(options);
- let childOptions = _.extend({}, options, { parent: false, children: false, siblings: false });
- let apply = (menuKey, value) => {
- if (!value) return;
- menu[menuKey] = value;
- }
- if (options.siblings !== false) {
- apply('siblings', this._getPagesMenu(this.getSiblings(options), childOptions));
- }
-
- if (options.children !== false) {
- let children = this.getChildren() || [];
- childOptions.children = options.fullTree === true;
- apply('children', this._getPagesMenu(children, childOptions));
- }
-
- if (options.parent !== false) {
- let parent = this.getParent();
- let parentMenu = parent && parent.getMenu(_.extend({}, options, { siblings: false, children: false, parent: true }));
- apply('parent', parentMenu);
- }
-
- return menu;
- }
-}
diff --git a/routing/page/view-mixin.js b/routing/page/view-mixin.js
deleted file mode 100644
index 7b5ab98..0000000
--- a/routing/page/view-mixin.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { isView } from '../../utils/is-utils';
-import { buildViewByKey } from '../../utils/build-utils';
-export default {
- getView(req) {
- if (isView(this._view) && !this._view.isDestroyed()) {
- return this._view;
- }
- let view = this._view = this.buildView(req);
- this.listenTo(view, 'destroy', () => this.stopListening(view));
- return view;
- },
- buildView(req) {
- let defaultOptions = {
- app: this.app,
- page: this,
- req
- };
- return buildViewByKey(this, 'view', { defaultOptions });
- },
-}
diff --git a/routing/router.js b/routing/router.js
deleted file mode 100644
index 632362e..0000000
--- a/routing/router.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import { Router } from '../vendors';
-export default Router.extend({
-
-});
diff --git a/src/README.md b/src/README.md
new file mode 100644
index 0000000..a392ac1
--- /dev/null
+++ b/src/README.md
@@ -0,0 +1,55 @@
+## marionette.yat content
+* [behaviors](./src/behaviors)
+ * [behavior](/docs/behaviors/behavior.md)
+ * [draggable](/docs/behaviors/draggable.md)
+ * droppable
+ * [dynamic-class](/docs/behaviors/dynamic-class.md)
+ * [form-to-hash](/docs/behaviors/form-to-hash.md)
+* [functions](./src/functions)
+ * [common](./src/functions/common)
+ * [flatten-unflatten](./src/functions/common/flatten-unflatten)
+ * [flatten-object](/docs/functions/common/flatten-unflatten/flatten-object.md)
+ * [unflatten-object](/docs/functions/common/flatten-unflatten/unflatten-object.md)
+ * [set-get-by-path](./src/functions/common/set-get-by-path)
+ * [get-by-path](/docs/functions/common/set-get-by-path/get-by-path.md)
+ * [set-by-path](/docs/functions/common/set-get-by-path/set-by-path.md)
+ * [get-label](/docs/functions/common/get-label.md)
+ * [get-name](/docs/functions/common/get-name.md)
+ * [get-value](/docs/functions/common/get-value.md)
+ * is-view
+ * [unwrap](/docs/functions/common/unwrap.md)
+ * [wrap](/docs/functions/common/wrap.md)
+ * [view](./src/functions/view)
+ * [compare-ab](/docs/functions/view/compare-ab.md)
+ * [view-comparator](/docs/functions/view/view-comparator.md)
+* [helpers](./src/helpers)
+ * [isKnownCtor](/docs/helpers/isKnownCtor.md)
+ * [mix](/docs/helpers/mix.md)
+* [mixins](./src/mixins)
+ * [childrenable](/docs/mixins/childrenable.md)
+ * [get-name-label](/docs/mixins/get-name-label.md)
+ * [get-option-property](/docs/mixins/get-option-property.md)
+ * global-template-context
+ * [radioable](/docs/mixins/radioable.md)
+ * [startable](/docs/mixins/startable.md)
+ * [stateable](/docs/mixins/stateable.md)
+* [models](./src/models)
+ * collection
+ * link
+ * model
+* [singletons](./src/singletons)
+ * [modals](./src/singletons/modals)
+ * config
+ * modalView
+ * identity
+ * template-context
+* [YatApp](/docs/YatApp.md)
+* YatCollectionGroups
+* YatCollectionView
+* YatConfig
+* [YatError](/docs/YatError.md)
+* [YatObject](/docs/YatObject.md)
+* [YatPage](/docs/YatPage.md)
+* [YatPageManager](/docs/YatPageManager.md)
+* [YatRouter](/docs/YatRouter.md)
+* YatView
diff --git a/src/YatApp.js b/src/YatApp.js
new file mode 100644
index 0000000..5ab0893
--- /dev/null
+++ b/src/YatApp.js
@@ -0,0 +1,63 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import Bb from 'backbone';
+import mixin from './helpers/mix.js';
+
+import GetOptionProperty from './mixins/get-option-property.js';
+import RadioMixin from './mixins/radioable.js';
+import Startable from './mixins/startable.js';
+import Childrenable from './mixins/childrenable.js';
+
+let Base = mixin(Mn.Application).with(GetOptionProperty, RadioMixin, Childrenable, Startable);
+
+export default Base.extend({
+
+ initRadioOnInitialize: true,
+ _initRegion(opts = {skip:true}){
+ if(opts.skip) return;
+ var region = this.getProperty('region');
+ this.region = region;
+ Base.prototype._initRegion();
+ },
+
+ getRegion() {
+ if(!this._region) this._initRegion({skip:false});
+ return this._region;
+ },
+
+ addPageManager(pageManager){
+ this._pageManagers || (this._pageManagers = []);
+ this._pageManagers.push(pageManager);
+
+ let prefix = pageManager.getName();
+ if(!prefix){
+ console.warn('pageManager prefix not defined');
+ return;
+ }
+
+ this.listenTo(pageManager, 'all', (eventName, ...args) => {
+ let prefixedEventName = prefix + ':' + eventName;
+ this.triggerMethod(prefixedEventName, ...args);
+ });
+ this.listenTo(pageManager, 'state:currentPage',(...args) => this.triggerMethod('page:swapped',...args));
+
+ },
+
+ hasPageManagers(){
+ return this._pageManagers && this._pageManagers.length > 0;
+ },
+
+ getMenuTree(opts = {rebuild:false}){
+ if(this._menuTree && !opts.rebuild) return this._menuTree;
+ let managers = this._pageManagers || [];
+ let links = _(managers).chain().map((manager) => manager.getLinks()).flatten().value();
+ this._menuTree = new Bb.Collection(links);
+ return this._menuTree;
+ },
+
+ getPage(key){
+ if(!this.hasPageManagers()) return;
+ return _(this._pageManagers).find((mngr) => mngr.getPage(key));
+ },
+
+});
diff --git a/src/YatCollectionGroups.js b/src/YatCollectionGroups.js
new file mode 100644
index 0000000..6c61c29
--- /dev/null
+++ b/src/YatCollectionGroups.js
@@ -0,0 +1,152 @@
+import _ from 'underscore';
+import YatObject from './YatObject';
+import Collection from './models/collection';
+
+var CollectionGroups = YatObject.extend({
+
+ collection: undefined,
+ groupBy: undefined,
+
+ getGroups(){ return this.groups; },
+ getGroup(name){
+ let groups = this.getGroups();
+ return groups[name];
+ },
+ isGroupExists(name){ return name in this.getGroups(); },
+ addGroup(name, models) {
+ if(this.isGroupExists(name)) return;
+ let groups = this.getGroups();
+ groups[name] = this._createGroup(name, models);
+ return groups[name];
+ },
+ removeGroup(name){
+ let group = this.getGroup(name);
+
+ if(!group) return;
+
+ if(_.isFunction(group.destroy))
+ group.destroy();
+ else if(_.isFunction(group.stopListening))
+ group.stopListening();
+
+ delete this.groups[name];
+ },
+
+
+ group() {
+ let result = {};
+ let colGroups = this.collection.groupBy(this.groupBy);
+ let optionGroups = this.getOption('groups');
+ _(optionGroups).each((name) => {
+ if (name in colGroups){
+ result[name] = colGroups[name];
+ delete colGroups[name];
+ }
+ else result[name] = [];
+ });
+ _(colGroups).each((models, name) => result[name] = models);
+ return result;
+ },
+
+ constructor: function(options) {
+ YatObject.apply(this, arguments);
+ this._initializeGrouppedCollection(options);
+ },
+ _initializeGrouppedCollection(options) {
+ if (this._initializedGC == true) return;
+
+ options || {};
+ this.mergeOptions(options, ['collection', 'groupBy']);
+ this._ensureOptions();
+ this._initializeGroups();
+ this._initializeEventHandlers();
+
+ this._initializedGC == true
+ },
+ _ensureOptions() {
+ if (!this.collection)
+ throw new Error('collection must be set');
+
+ if (!this.groupBy)
+ throw new Error('groupBy must be set');
+
+ if (typeof this.groupBy === 'string') {
+ var propertyName = this.getOption('groupBy');
+ this.groupBy = (model) => model.get(propertyName);
+ }
+
+ },
+ _initializeGroups() {
+ this.groups = {};
+ var groups = this.group();
+ _(groups).each((models, name) => this.addGroup(name, models));
+ },
+ _getCollectionClass(){
+ return this.getOption('CollectionClass') || Collection;
+ },
+ _createGroup(name,models){
+ let groupBy = this.groupBy;
+ let Collection = this._getCollectionClass();
+ let groupCol = new Collection(models);
+ groupCol.on('change', (model) => {
+ if (groupBy(model) !== name)
+ groupCol.remove(model);
+ });
+ groupCol.name = name;
+ return groupCol;
+ },
+
+ _initializeEventHandlers() {
+ this.listenTo(this.collection, 'update', this._onCollectionUpdate);
+ },
+ _onCollectionUpdate(col, opts) {
+
+ var data = (opts.changes.added || []).concat(opts.changes.merged || []);
+
+ var toAdd = _(data).groupBy(this.groupBy);
+ var toRemove = _(opts.changes.removed).groupBy(this.groupBy);
+
+ var groups = this.groups;
+ var addOutOfGroup = {};
+ _(toAdd).each((models, groupName) => {
+ if (groupName in groups)
+ groups[groupName].add(models);
+ else if(this.getOption('autoCreateNewGroups'))
+ this.addGroup(groupName, models);
+ });
+
+ _(toRemove).each((models, groupName) => {
+ if (groupName in groups)
+ groups[groupName].remove(models);
+ });
+ },
+ _onModelChange(model) {
+ var groupName = this.groupBy(model);
+ if (this.groups[groupName])
+ this.groups[groupName].add(model);
+ else {
+ console.warn('model is out of groupping', model, groupName);
+ }
+ },
+ destroy() {
+
+ _(this.groups).each((group) => {
+ group.stopListening();
+ if (_.isFunction(group.destroy))
+ group.destroy();
+ });
+ delete this.groups;
+
+ if(_.isFunction(YatObject.prototype.destroy))
+ YatObject.prototype.destroy.apply(this, arguments);
+
+
+ if (_.isFunction(this.collection.destroy))
+ this.collection.destroy();
+
+ delete this.collection;
+
+ }
+});
+
+export default CollectionGroups;
diff --git a/src/YatCollectionView.js b/src/YatCollectionView.js
new file mode 100644
index 0000000..1261989
--- /dev/null
+++ b/src/YatCollectionView.js
@@ -0,0 +1,5 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import mix from './helpers/mix';
+import GlobalTemplateContext from './mixins/global-template-context';
+export default mix(Mn.NextCollectionView).with(GlobalTemplateContext);
diff --git a/src/YatConfig.js b/src/YatConfig.js
new file mode 100644
index 0000000..d7f4119
--- /dev/null
+++ b/src/YatConfig.js
@@ -0,0 +1,52 @@
+import _ from 'underscore';
+import flat from './functions/common/flatten-unflatten/flatten-object';
+import unflat from './functions/common/flatten-unflatten/unflatten-object';
+import getByPath from './functions/common/set-get-by-path/get-by-path';
+import setByPath from './functions/common/set-get-by-path/set-by-path';
+import YatObject from './YatObject';
+
+const YatConfig = YatObject.extend({
+ initialize(options){
+ this.mergeOptions(options, ['name', 'channelName', 'noRadio']);
+ if(this.noRadio !== true && this.channelName == null)
+ this.channelName = name;
+ },
+ getStore(){
+ this.store || (this.store = {});
+ return this.store;
+ },
+ radioRequest: {
+ get(...args){ this.get(...args); },
+ set(path, value){ this.set(path,value); }
+ },
+ get(path, ...args){
+ let store = this.getStore();
+ let value = getByPath(store, path);
+ if(_.isFunction(value)){
+ value = value.apply(this, args);
+ }
+
+ return value;
+ },
+ set(path, value){
+ let store = this.getStore();
+ let result = setByPath(store, path, value);
+ this.triggerSet(path, value);
+ },
+ triggerSet(path, value){
+ if(!path) return;
+ let arr = path.split('/');
+ let radio = this.getChannel();
+ do{
+ let event = arr.join(':');
+ this.triggerMethod(event, value);
+ radio && radio.trigger(event, value);
+ arr.pop();
+ }while(arr.length > 0)
+ }
+});
+
+export default function(name, options = {}){
+ options.name = name;
+ return new YatConfig(options);
+}
diff --git a/src/YatError.js b/src/YatError.js
new file mode 100644
index 0000000..a4bda94
--- /dev/null
+++ b/src/YatError.js
@@ -0,0 +1,40 @@
+import Mn from 'backbone.marionette';
+import mix from './helpers/mix';
+
+
+let YatError = Mn.Error.extend({},{
+ Http400(message){
+ return this.Http(400,message);
+ },
+ Http401(message){
+ return this.Http(401,message);
+ },
+ Http403(message){
+ return this.Http(403,message);
+ },
+ Http404(message){
+ return this.Http(404, message);
+ },
+ Http500(message){
+ return this.Http(500, message);
+ },
+ Http(status, message){
+ let error = new this({message:message, name:"HttpError"});
+ error.status = status;
+ return error;
+ },
+ HttpRedirect(message){
+ return this.Http(301, message);
+ },
+ NotFound(message){
+ return this.Http404(message);
+ },
+ NotAuthorized(message){
+ return this.Http401(message);
+ },
+ Forbidden(message){
+ return this.Http403(message);
+ },
+});
+
+export default YatError;
diff --git a/src/YatObject.js b/src/YatObject.js
new file mode 100644
index 0000000..59dac99
--- /dev/null
+++ b/src/YatObject.js
@@ -0,0 +1,6 @@
+import Mn from 'backbone.marionette';
+import mixin from './helpers/mix.js';
+import GetOptionProperty from './mixins/get-option-property.js';
+import Radioable from './mixins/radioable.js';
+
+export default mixin(Mn.Object).with(GetOptionProperty, Radioable);
diff --git a/src/YatPage.js b/src/YatPage.js
new file mode 100644
index 0000000..8cf3565
--- /dev/null
+++ b/src/YatPage.js
@@ -0,0 +1,260 @@
+import _ from 'underscore';
+import App from './YatApp.js';
+import mixin from './helpers/mix';
+import Startable from './mixins/startable';
+import GetNameLabel from './mixins/get-name-label';
+import Router from './YatRouter.js';
+import LinkModel from './models/link';
+import Bb from 'backbone';
+import identity from './singletons/identity';
+
+/*
+ YatPage
+*/
+
+let Base = mixin(App).with(GetNameLabel);
+
+export default Base.extend({
+
+ constructor(...args){
+ Base.apply(this,args);
+ this.initializeYatPage();
+ },
+
+ allowStopWithoutStart: true,
+ allowStartWithoutStop: true,
+
+ initializeYatPage(opts){
+ this.mergeOptions(opts, ["manager"]);
+ this._initializeModels(opts);
+ this._initializeRoute(opts);
+ this._proxyEvents();
+ this._tryCreateRouter();
+ this._registerIdentityHandlers();
+ },
+
+ getLayout(opts = {rebuild: false}){
+ if(!this._layoutView || opts.rebuild || (this._layoutView && this._layoutView.isDestroyed && this._layoutView.isDestroyed())){
+ this.buildLayout();
+ }
+ return this._layoutView;
+ },
+
+ buildLayout(){
+ let Layout = this.getProperty('Layout');
+ if(Layout == null) return;
+ let opts = _.extend({},this.getProperty('layoutOptions'));
+
+ if(this.model && !opts.model)
+ _.extend(opts,{model: this.model});
+
+ if(this.collection && !opts.collection)
+ _.extend(opts,{collection: this.collection});
+
+ let options = this.buildLayoutOptions(opts);
+ options.page = this;
+ this._layoutView = new Layout(options);
+ return this._layoutView;
+ },
+
+ buildLayoutOptions(rawOptions){
+ return rawOptions;
+ },
+
+ addModel(model, opts = {}){
+ if(!model) return;
+ this.model = model;
+ let fetch = opts.fetch || this.getOption('fetchModelOnAdd');
+ if(fetch === undefined){
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if(fetch === true){
+ this.addStartPromise(model.fetch(opts));
+ }
+ },
+
+ addCollection(collection, opts = {}){
+ if(!collection) return;
+ this.collection = collection;
+ let fetch = opts.fetch || this.getOption('fetchCollectionOnAdd');
+ if(fetch === undefined){
+ fetch = this.getProperty('fetchDataOnAdd');
+ }
+ if(fetch === true){
+ this.addStartPromise(collection.fetch(opts));
+ }
+ },
+
+ freezeWhileStarting: true,
+ freezeUI(){ },
+ unFreezeUI(){ },
+
+ getRouteHash(){
+
+ let hashes = [{},this._routeHandler].concat(this.getChildren({startable:false}).map((children) => children.getRouteHash()))
+ return _.extend(...hashes);
+
+ },
+
+ hasRouteHash(){
+ return _.isObject(this.getRouteHash())
+ },
+
+ getLinkModel(level = 0){
+ if(!this._canHaveLinkModel()) return;
+ if(this._linkModel) return this._linkModel;
+
+ let url = this.getRoute();
+ let label = this.getLabel();
+ let children = this._getSublinks(level);
+ this._linkModel = new LinkModel({ url, label, level, children });
+
+ return this._linkModel;
+ },
+ _canHaveLinkModel(){
+ return !((this.getProperty('skipMenu') === true) || (!!this.getProperty('isStartNotAllowed')));
+ },
+ _destroyLinkModel(){
+ if(!this._linkModel) return;
+ this._linkModel.destroy();
+ delete this._linkModel;
+ },
+
+ getParentLinkModel(){
+ let parent = this.getParent();
+ if(!parent || !parent.getLinkModel) return;
+ let model = parent.getLinkModel();
+ return model;
+ },
+
+ getNeighbourLinks(){
+ let link = this.getLinkModel();
+ if(link && link.collection) return link.collection;
+ },
+
+ getChildrenLinks(){
+ let model = this.getLinkModel();
+ if(!model) return;
+ return model.get('children');
+ },
+
+ _getSublinks(level){
+ let children = this.getChildren();
+ if(!children || !children.length) return;
+ let sublinks = _(children).chain()
+ .filter((child) => child.getProperty("skipMenu") !== true)
+ .map((child) => child.getLinkModel(level + 1))
+ .value();
+ if(!sublinks.length) return;
+ let col = new Bb.Collection(sublinks);
+ return col;
+ },
+
+ _initializeModels(opts = {}){
+ this.addModel(opts.model, opts);
+ this.addCollection(opts.collection, opts);
+ },
+
+ _initializeRoute(){
+ let route = this.getRoute({asPattern:true});
+ if(route == null) return;
+ let page = this;
+ this._routeHandler = {
+ [route]:{context: page, action: (...args) => page.start(...args) }
+ };
+ },
+
+ getRoute(opts = {asPattern:false}){
+ let relative = this.getProperty('relativeRoute');
+ let route = this.getProperty('route');
+ let parent = this.getParent();
+ if(route == null) return;
+
+ let result = route;
+
+ if(relative && parent && parent.getRoute){
+ let parentRoute = parent.getRoute();
+ result = parentRoute + '/' + route;
+ }
+
+ return this._normalizeRoute(result, opts);
+ },
+ _normalizeRoute(route, opts){
+ route = route.replace(/\/+/gmi,'/').replace(/^\//,'');
+ if(opts.asPattern){
+ return route;
+ }
+ else{
+ let res = route.replace(/\(\/\)/gmi,'/').replace(/\/+/gmi,'/');
+ return res;
+ }
+ },
+ _tryCreateRouter(){
+ let create = this.getProperty('createRouter') === true;
+ if(create){
+ this.router = this._createAppRouter();
+ }
+ },
+
+ _createAppRouter(){
+ let hash = this.getRouteHash();
+ if(!_.size(hash)) return;
+ return new Router(hash);
+ },
+
+ _proxyEvents(){
+ let proxyContexts = this._getProxyContexts();
+ this._proxyEventsTo(proxyContexts);
+ },
+ _getProxyContexts(){
+ let rdy = [];
+ let manager = this.getProperty('manager');
+ if(manager){
+ rdy.push({context:manager})
+ }
+ let radio = this.getChannel();
+ if(radio){
+ let allowed = this.getProperty('proxyEventsToRadio');
+ rdy.push({context:radio, allowed });
+ }
+ return rdy;
+ },
+ _proxyEventsTo(contexts){
+ let all = [];
+ let eventsHash = {};
+
+ _(contexts).each((context) => {
+ let events = [];
+ if(!context.allowed)
+ all.push(context.context);
+ else {
+ _(context.allowed).each(function(allowed){
+ eventsHash[allowed] || (eventsHash[allowed] = []);
+ eventsHash[allowed].push(context.context)
+ });
+ }
+ });
+ let page = this;
+ page.on('all', (eventName, ...args) => {
+ let contexts = (eventName in eventsHash) ? eventsHash[eventName] : all;
+ let triggerArguments = [page].concat(args);
+ _(contexts).each((context) => context.triggerMethod(`page:${eventName}`, ...triggerArguments))
+ });
+
+ },
+
+ _buildChildOptions: function(def){
+ let add = {};
+ let manager = this.getProperty('manager');
+ if(manager) add.manager = manager;
+ return _.extend(def, this.getProperty('childOptions'), add);
+ },
+
+ _registerIdentityHandlers(){
+ this.listenTo(identity, 'change', (...args) => {
+ this._destroyLinkModel();
+ this.triggerMethod('identity:change', ...args);
+ });
+ }
+
+});
diff --git a/src/YatPageManager.js b/src/YatPageManager.js
new file mode 100644
index 0000000..77f5302
--- /dev/null
+++ b/src/YatPageManager.js
@@ -0,0 +1,138 @@
+import _ from 'underscore';
+import App from './YatApp';
+import GetNameLabel from './mixins/get-name-label';
+import Router from './YatRouter';
+import mixin from './helpers/mix';
+import identity from './singletons/identity';
+import YatError from './YatError';
+
+let Base = mixin(App).with(GetNameLabel);
+
+let YatPageManager = Base.extend({
+ constructor(...args){
+ Base.apply(this, args);
+ this._initializeYatPageManager(...args);
+ },
+ throwChildErrors:true,
+ createRouter(){
+ let children = this.getChildren({startable:false});
+ let hash = {};
+ _(children).each(function(page){
+ if(_.isFunction(page.getRouteHash)){
+ _.extend(hash, page.getRouteHash());
+ }
+ });
+ this._routesHash = hash;
+ this.setRouter(Router.create(hash, this));
+ },
+ setRouter(router){
+ this.router = router;
+ },
+ getRouter(){
+ return this.router;
+ },
+ getLinks(){
+ let children = this.getChildren();
+ if(!children) return;
+ return _(children).chain()
+ .map((child) => child.getLinkModel())
+ .filter((child) => !!child)
+ .value();
+ },
+ execute(route){
+ let page = this.getPage(route);
+ if(!!page)
+ page.start({text: error.message});
+ else if(route === '*NotFound')
+ throw new YatError.NotFound('*NotFound handler is missing');
+ else
+ this.execute('*NotFound');
+ },
+ navigate(url, opts = {trigger:true}){
+
+ let router = this.getRouter();
+ if(router)
+ router.navigate(url, opts);
+ else
+ console.warn('router not found');
+ },
+
+ getPage(key){
+
+ let found = _(this._routesHash)
+ .find((pageContext, route) => {
+ if(route === key) return true;
+ if(pageContext.context.getName() === key) return true;
+ });
+ return found && found.context;
+
+ },
+
+
+ navigateToRoot(){
+ let current = this.getState('currentPage');
+ let rootUrl = this.getProperty('rootUrl');
+ if(!rootUrl){
+ let children = this.getChildren();
+ if(children && children.length) {
+ let root = children.find((child) => child != current);
+ rootUrl = root && root.getRoute()
+ }
+ }
+ if(rootUrl != null)
+ this.navigate(rootUrl);
+ else
+ console.warn('root page not found');
+ },
+
+ _initializeYatPageManager(opts = {}){
+ this.mergeOptions(opts, ['id','name','label']);
+ this._registerPageHandlers(opts);
+ this._registerIdentityHandlers();
+ this.createRouter();
+ },
+
+ _buildChildOptions: function(def){
+ return _.extend(def, this.getProperty('childOptions'), {
+ manager: this
+ });
+ },
+
+ _registerPageHandlers(){
+ this.on('page:before:start', this._pageBeforeStart);
+ this.on('page:start', this._pageStart);
+ this.on('page:start:decline', this._pageDecline);
+ },
+
+ _pageBeforeStart(page){
+ let current = this.getState('currentPage');
+ if(current && current != page){
+ current.stop();
+ }
+ },
+
+ _pageStart(page){
+ this.setState('currentPage', page);
+ },
+
+ _pageDecline(...args){
+ //console.log("decline", args)
+ },
+
+ _registerIdentityHandlers(){
+ this.listenTo(identity, 'change', (...args) => {
+ this.triggerMethod('identity:change', ...args);
+ this._moveToRootIfCurrentPageNotAllowed();
+ });
+ },
+
+ _moveToRootIfCurrentPageNotAllowed(){
+ let current = this.getState('currentPage');
+ if(!current || !current.isStartNotAllowed()) return;
+
+ this.navigateToRoot();
+ }
+
+});
+
+export default YatPageManager;
diff --git a/src/YatRouter.js b/src/YatRouter.js
new file mode 100644
index 0000000..43c65ff
--- /dev/null
+++ b/src/YatRouter.js
@@ -0,0 +1,36 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+export default Mn.AppRouter.extend({},{
+ create(hash, context){
+ let appRoutes = {};
+ let controller = {};
+ let _this = this;
+ _(hash).each((handlerContext, key) => {
+ appRoutes[key] = key;
+ controller[key] = (...args) => {
+ handlerContext
+ .action(...args)
+ .catch((error) => {
+ _this._catchError(error, context);
+ });
+ }
+ });
+ return new this({controller, appRoutes});
+ },
+ _catchError(error, context){
+ if(!context || context.getProperty('throwChildErrors') === true){
+ throw error;
+ }else{
+ let postfix = error.status ? ":" + error.status.toString() : '';
+ let commonEvent = 'error';
+ let event = commonEvent + postfix;
+
+ context.triggerMethod(commonEvent, error, this);
+
+ if(event != commonEvent)
+ context.triggerMethod(event, error, this);
+
+ }
+
+ }
+});
diff --git a/src/YatView.js b/src/YatView.js
new file mode 100644
index 0000000..d075a64
--- /dev/null
+++ b/src/YatView.js
@@ -0,0 +1,37 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import mix from './helpers/mix';
+import GlobalTemplateContext from './mixins/global-template-context';
+import GetOptionProperty from './mixins/get-option-property';
+export default mix(Mn.View).with(GlobalTemplateContext, GetOptionProperty).extend({
+
+ instantRender: false,
+ renderOnReady: false,
+ triggerReady: false,
+
+ manualAfterInitialize: true,
+
+ constructor(...args){
+
+ Mn.View.apply(this, args);
+
+ let options = args[0];
+ this.mergeOptions(options, ['instantRender','renderOnReady', 'triggerReady', 'manualAfterInitialize']);
+
+ if(this.manualAfterInitialize === true)
+ this._afterInitialize();
+
+ },
+ _afterInitialize(){
+
+ if(this.instantRender === true)
+ this.render();
+
+ if(this.renderOnReady === true)
+ this.once('ready',this.render);
+
+ if(this.renderOnReady === true || this.triggerReady === true)
+ this.trigger('ready', this);
+
+ },
+});
diff --git a/src/behaviors/README.md b/src/behaviors/README.md
new file mode 100644
index 0000000..a18b2e4
--- /dev/null
+++ b/src/behaviors/README.md
@@ -0,0 +1,8 @@
+# behaviors
+
+## content
+* [behavior](/docs/behaviors/behavior.md)
+* [draggable](/docs/behaviors/draggable.md)
+* droppable
+* [dynamic-class](/docs/behaviors/dynamic-class.md)
+* [form-to-hash](/docs/behaviors/form-to-hash.md)
diff --git a/src/behaviors/_base-draggable.js b/src/behaviors/_base-draggable.js
new file mode 100644
index 0000000..bfc2c5f
--- /dev/null
+++ b/src/behaviors/_base-draggable.js
@@ -0,0 +1,184 @@
+import _ from 'underscore';
+import Behavior from './behavior';
+
+const BaseDraggable = Behavior.extend({
+
+ triggerEl: undefined, //drag initialization element, if not set equal to view.$el
+ moveBeforeStart: 10,
+ scope: 'drag',
+
+ getDragEventsContext(){
+ return this.$doc;
+ },
+ getDragEventsElementSelector(){
+ return '*';
+ },
+ getTriggerEl(){
+ if(this._$el) return this._$el;
+
+ let el = this.getOption('triggerEl');
+ if(el == null && this.view.$el)
+ this._$el = this.view.$el;
+ else if(el && el.jquery) this._$el = el
+ else if(el instanceof HTMLElement) this._$el = $(el)
+ else if(typeof el === 'string' && el.length)
+ this._$el = this.view.$(el);
+ else
+ throw new Error('trigger element should be a DOM or jQuery object or string selector.', el);
+
+ return this._$el;
+ },
+
+ isSameScope(dragging){
+ return dragging.scope === this.scope;
+ },
+
+ shouldHandleDomEvents(dragging){
+ return this.isSameScope(dragging) && this !== dragging;
+ },
+
+ constructor: function(...args){
+
+ this._clearDragData();
+
+ this.$doc = $(document);
+
+ Behavior.apply(this, args);
+
+ this._defineDocumentBindings();
+
+ },
+ _clearDragData(){
+ this._dragData = {};
+ },
+ _defineDocumentBindings(){
+ this.__b = {};
+ this.__b.setupDragDetection = _.bind(this._setupDragDetection, this);
+ this.__b.handleMouseUp = _.bind(this._handleMouseUp, this);
+ this.__b.handleMoveAfterMouseDown = _.bind(this._handleMoveAfterMouseDown, this);
+ this.__b.handleDragMove = _.bind(this._handleDragMove, this);
+ this.__b.handleElementEnter = _.bind(this._handleElementEnter, this);
+ this.__b.handleElementLeave = _.bind(this._handleElementLeave, this);
+ this.__b.handleElementOver = _.bind(this._handleElementOver, this);
+ },
+
+ onInitialize(){
+ this._initializeDragListener();
+ },
+
+
+ _initializeDragListener(){
+ let $el = this.getTriggerEl();
+ $el.one('mousedown', this.__b.setupDragDetection);
+ },
+ _setupDragDetection(e){
+ if(this.view.dragDisabled === true){
+ this._initializeDragListener();
+ return;
+ }
+
+ e.stopPropagation();
+
+ this.$doc.one('mouseup', this.__b.handleMouseUp);
+
+ this._dragData.startX = e.pageX;
+ this._dragData.startY = e.pageY;
+ this.$doc.on('mousemove', this.__b.handleMoveAfterMouseDown);
+
+ },
+ _handleMouseUp(e){
+ if(this._dragData.dragging)
+ this._handleDragEnd(e);
+ else
+ this._handleEndWithoutDrag(e);
+
+ this._initializeDragListener();
+ },
+ _handleEndWithoutDrag(e){
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+ },
+ _handleDragEnd(e){
+ this._dragData.dragging = false;
+
+ this.$doc.off('mousemove', this.__b.handleDragMove);
+
+ let $context = this.getDragEventsContext();
+ $context.off('mouseenter', this.__b.handleElementEnter);
+ $context.off('mousemove', this.__b.handleElementOver);
+
+ if(this._dragData.drop && this._dragData.drop.context){
+ this._dragData.drop.context.catchDraggable(this, this._dragData.drop);
+ this.triggerMethod('drag:drop', this._dragData.drop);
+ }
+
+ this.triggerMethod('drag:end');
+
+ },
+
+ _handleMoveAfterMouseDown(e){
+ e.stopPropagation();
+
+ let distance = this._getStartPositionPixelOffset(e);
+ let startIfMoreThan = this.getOption('moveBeforeStart');
+ if(distance >= startIfMoreThan)
+ this._startDragSession();
+ },
+ _getStartPositionPixelOffset(e){
+ let x = Math.abs(e.pageX - this._dragData.startX);
+ let y = Math.abs(e.pageY - this._dragData.startY);
+ return x > y ? x : y;
+ },
+ _startDragSession(){
+ this._dragData.dragging = true;
+ this.$doc.off('mousemove', this.__b.handleMoveAfterMouseDown);
+
+ this.$doc.on('mousemove', this.__b.handleDragMove);
+
+ let $context = this.getDragEventsContext();
+ let selector = this.getDragEventsElementSelector();
+
+ $context.on('mouseenter', selector, this.__b.handleElementEnter);
+
+ $context.on('mousemove', selector, this.__b.handleElementOver);
+
+
+ this.view.triggerMethod('drag:start');
+ },
+ _handleDragMove(ev){
+ ev.stopPropagation();
+
+ this.triggerMethod('drag', ev);
+
+ },
+ _handleElementEnter(e){
+ let $over = $(e.target);
+
+
+ if(this._dragData.over != $over){
+ this._dragData.over = $over;
+ $over.trigger('drag:enter', this);
+ $over.one('mouseleave', () => this.trigger('drag:leave', this));
+
+ }
+ },
+ _handleElementLeave(e){
+ let $over = $(e.target);
+ $over.trigger('drag:leave', this);
+ },
+ _handleElementOver(e){
+ let $over = $(e.target);
+ let event = this._createCustomDomEvent('drag:over', e);
+ $over.trigger(event, this);
+ },
+ _createCustomDomEvent: function (name, event, merge) {
+ if (!merge)
+ merge = ["pageX", "pageY", "clientX", "clientY", "offsetX", "offsetY", "target"];
+
+ var customEvent = jQuery.Event(name);
+ _(merge).each((prop) => customEvent[prop] = event[prop]);
+
+ return customEvent;
+ },
+});
+
+export default BaseDraggable;
diff --git a/src/behaviors/behavior.js b/src/behaviors/behavior.js
new file mode 100644
index 0000000..e3e5102
--- /dev/null
+++ b/src/behaviors/behavior.js
@@ -0,0 +1,28 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import mix from '../helpers/mix';
+import GetOptionProperty from '../mixins/get-option-property';
+import fns from '../functions/common/common';
+const BaseBehavior = mix(Mn.Behavior).with(GetOptionProperty);
+export default BaseBehavior.extend({
+
+ listenViewInitialize: true,
+
+ constructor(){
+
+ if(this.getProperty('listenViewInitialize') === true)
+ this.on('before:render initialize', _.once(_.partial(this.triggerMethod, 'view:initialize')));
+
+ BaseBehavior.apply(this, arguments);
+ },
+
+ getModel: function () {
+ return this.view.model;
+ },
+ cidle(name){
+ return fns.wrap(this.view.cid, name);
+ },
+ unCidle(name){
+ return fns.unwrap(name, this.view.cid);
+ },
+});
diff --git a/src/behaviors/behaviors.js b/src/behaviors/behaviors.js
new file mode 100644
index 0000000..fb0697a
--- /dev/null
+++ b/src/behaviors/behaviors.js
@@ -0,0 +1,6 @@
+import Behavior from './behavior';
+import Draggable from './draggable';
+import Droppable from './droppable';
+import DynamicClass from './dynamic-class';
+import FormToHash from './form-to-hash';
+export default { Behavior, Draggable, Droppable, DynamicClass, FormToHash };
diff --git a/src/behaviors/draggable.js b/src/behaviors/draggable.js
new file mode 100644
index 0000000..90bab72
--- /dev/null
+++ b/src/behaviors/draggable.js
@@ -0,0 +1,103 @@
+import _ from 'underscore';
+import BaseDraggable from './_base-draggable';
+
+const DraggableBehavior = BaseDraggable.extend({
+
+ useGhost: true,
+ viewCssClass: 'dragging',
+ ghostCssClass: 'ghost',
+
+ constructor: function(...args){
+
+ BaseDraggable.apply(this, args);
+
+ this.on('drag', this._onDrag);
+ this.on('drag:start', this._onDragStart);
+ this.on('drag:end', this._onDragEnd);
+
+ },
+
+ events:{
+ 'drag:enter'(e, dragging){
+ if(!this.shouldHandleDomEvents(dragging)) return;
+ },
+ 'drag:over'(e, dragging){
+ if(!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+ let newEvent = this._createCustomDomEvent('drag:over', e);
+
+ let parent = this.$el.parent();
+ if(parent)
+ parent.trigger(newEvent, [dragging, this]);
+ }
+ },
+
+
+ _onDragEnd(ev){
+
+ if(this.getOption('useGhost'))
+ this._removeGhost();
+ if(this.getOption('viewCssClass'))
+ this.view.$el.removeClass(this.getOption('viewCssClass'));
+
+ this._clearDragData();
+ },
+ _onDragStart(ev){
+ if(this.getOption('useGhost'))
+ this._createGhost();
+ if(this.getOption('viewCssClass'))
+ this.view.$el.addClass(this.getOption('viewCssClass'));
+ },
+ _onDrag(ev){
+ this.setGhostPosition(ev.pageY, ev.pageX);
+ },
+ _removeGhost(){
+ this.$ghost.remove();
+ delete this.$ghost;
+ },
+ createGhost(){
+ let $g = this.$el.clone();
+ let {top,left} = this.$el.offset();
+ $g.css({
+ top: top + 'px',
+ left: left + 'px',
+ width: this.$el.outerWidth(),
+ height: this.$el.outerHeight(),
+ });
+ return $g;
+ },
+ _createGhost(){
+ var $g = this.createGhost();
+ if($g.css('position') != 'absolute')
+ $g.css('position','absolute');
+
+ let addClasses = this.getOption('ghostCssClass');
+ if(addClasses)
+ $g.addClass(addClasses);
+
+ $g.appendTo($('body'));
+ this._setGhost($g);
+ },
+ _setGhost($g){
+ this.$ghost = $g;
+ },
+ getGhost(){
+ return this.$ghost;
+ },
+ setGhostPosition(top, left){
+
+ let $ghost = this.getGhost();
+ if (!$ghost) return;
+
+ $ghost.css({
+ top: top + 'px',
+ left: left + 'px',
+ });
+
+ }
+
+});
+
+
+export default DraggableBehavior;
diff --git a/src/behaviors/droppable.js b/src/behaviors/droppable.js
new file mode 100644
index 0000000..bd011f9
--- /dev/null
+++ b/src/behaviors/droppable.js
@@ -0,0 +1,158 @@
+import _ from 'underscore';
+import Behavior from './behavior';
+
+const DroppableBehavior = Behavior.extend({
+ scope:'drag',
+ events:{
+ 'drag:over':'_onDomDragOver'
+ },
+
+ //because of mn 3.5.1 bug of first render isAtached flag
+ _skipFirstAttach: true,
+
+ isSameScope(dragging){
+ return dragging.scope === this.scope;
+ },
+ getEventXY(e){
+ return {x: e.pageX, y: e.pageY};
+ },
+ getChildren(){
+ return _(this.view.children._views).filter((v) => v.model && v.isRendered() && v.isAttached());
+ },
+ catchDraggable(draggable, dropContext){
+ this._onDrop(draggable, dropContext);
+ },
+
+
+ constructor: function(...args){
+ Behavior.apply(this, args);
+ this._initReorderBehavior();
+ },
+ _initReorderBehavior(){
+ this.listenToOnce(this.view, 'render', () => {
+ this.reOrder({ silent: true })
+ this.listenTo(this.view.collection, 'update', function (collection, options) {
+ let changes = (options || {}).changes || {};
+ this.reOrder();
+ });
+ });
+ },
+ reOrder(options = {}){
+
+ this.view.sort();
+
+ var children = this.children = [];
+ var skipAttach = this._skipFirstAttach
+ _(this.view.children._views).each((view, index) => {
+ if (!view.model) return;
+ view.model.set('order', index);
+ if (view.isRendered() && (skipAttach || view.isAttached()))
+ children.push(view);
+ });
+
+ this.hasChildren = this.children.length > 0;
+
+ if (options.silent != true && this.view.collection)
+ this.view.collection.trigger('reordered');
+
+ this._skipFirstAttach = false;
+
+ },
+
+ // _triggerChildrenReady(){ this.triggerMethod('children:ready',this); },
+ // _onChildrenReady(){
+ // this._refreshChildren();
+ // },
+ // _refreshChildren(){
+
+ // this.children = this.getChildren();
+ // this.hasChildren = this.children.length > 0;
+
+ // this.view.collection.trigger('reordered', this.view.collection.cid);
+ // },
+
+
+ _onDomDragOver(e, dragging, child){
+ if(!this.isSameScope(dragging)) return;
+ e.stopPropagation();
+
+
+ if(dragging === child || (this.hasChildren && !child)) return;
+
+ dragging._dragData.drop || (dragging._dragData.drop = {});
+ let storedDrop = dragging._dragData.drop;
+
+ let xy = this.getEventXY(e);
+
+ let drop = this._getDropContext(xy, child);
+ drop.context = this;
+
+ let mixedDrop = _.extend({}, storedDrop, drop);
+ let keys = _.keys(mixedDrop);
+ let hasChanges = _(keys).some((k) => storedDrop[k] !== drop[k]);
+ if(hasChanges){
+ dragging._dragData.drop = drop;
+ this._onDropContextChange(dragging, drop);
+ }
+
+ },
+ _getDropContext(xy, child){
+
+ let children = this.children || [];
+ if(!children.length) return {insert:'before'};
+
+ let $el = child ? child.$el : this.$el;
+ let position = this._getPositionByEventXY(xy, $el);
+ return this._getDropContextByPosisiton(position, child);
+
+ },
+ _getPositionByEventXY(xy, $el){
+
+ let elOffset = $el.offset();
+ let elDimension = {width: $el.outerWidth(), height: $el.outerHeight()};
+ let xHalf = elOffset.left + elDimension.width / 2;
+ let yHalf = elOffset.top + elDimension.height / 2;
+ let r = {x:undefined, y:undefined};
+
+ r.x = xy.x <= xHalf ? 'left' : 'right'
+ r.y = xy.y <= yHalf ? 'top' : 'bottom';
+
+ return r;
+ },
+ _getDropContextByPosisiton(position, child){
+
+ let direction = this.getOption('direction') || 'vertical';
+
+ let insert = direction == 'horizontal'
+ ? position.x == 'left' ? 'before' : 'after'
+ : position.y == 'top' ? 'before' : 'after';
+
+ var childView = undefined;
+
+ if(child){
+ childView = child.view;
+ }else{
+ childView = insert == 'before' ? this.children[0] : (this.children.length && _(this.children).last());
+ }
+
+ let index = this.view.children._views.indexOf(childView);
+
+ return {
+ insert,
+ childView,
+ index,
+ noChild: !child,
+ }
+
+ },
+ _onDropContextChange(dragging, context){
+ this.triggerMethod('drop:context:change', dragging, context);
+ },
+ _onDrop(draggable, dropContext){
+ this.triggerMethod('drop', draggable, dropContext);
+ },
+});
+
+
+
+export default DroppableBehavior;
diff --git a/src/behaviors/dynamic-class.js b/src/behaviors/dynamic-class.js
new file mode 100644
index 0000000..0353798
--- /dev/null
+++ b/src/behaviors/dynamic-class.js
@@ -0,0 +1,48 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import Behavior from './behavior';
+
+const DynamicClass = Behavior.extend({
+ updateElementClass(changeSource){
+ let viewCls = _.result(this.view, 'className') || '';
+ let addCls = _.result(this.view, 'dynamicClassName') || '';
+ this.$el.attr({
+ class: (viewCls + ' ' + addCls).trim()
+ });
+
+ },
+
+ refreshOnModelChange: true,
+ refreshOnDomChange: false,
+ refreshOnViewRefresh: true,
+ refreshOnViewBeforeRender: true,
+ refreshOnViewRender: false,
+
+ modelEvents:{
+ 'change'(){ this.getProperty('refreshOnModelChange') && this.updateElementClass('model:change'); }
+ },
+ events:{
+ 'change'(){ this.getProperty('refreshOnDomChange') && this.updateElementClass('dom:change'); }
+ },
+ onRefresh(){
+ this.getProperty('refreshOnViewRefresh') && this.updateElementClass('view:refresh');
+ },
+ onRender(){
+ this.getProperty('refreshOnViewRender') && this.updateElementClass('view:render');
+ },
+ onBeforeRender(){
+ this.getProperty('refreshOnViewBeforeRender') && this.updateElementClass('view:before:render');
+ },
+ onRefreshCssClass(){
+ this.updateElementClass();
+ },
+ onSetupRefreshCssClass(setup){
+ if(setup == null || !_.isObject(setup)) return;
+ let properties = ['refreshOnModelChange','refreshOnDomChange','refreshOnViewRefresh','refreshOnViewBeforeRender','refreshOnViewRender'];
+ _(setup).each((value, property) => {
+ this[property] = value === true;
+ });
+ },
+});
+
+export default DynamicClass;
diff --git a/src/behaviors/form-to-hash.js b/src/behaviors/form-to-hash.js
new file mode 100644
index 0000000..a5bfd33
--- /dev/null
+++ b/src/behaviors/form-to-hash.js
@@ -0,0 +1,241 @@
+import _ from 'underscore';
+import Mn from 'backbone.marionette';
+import Behavior from './behavior';
+import mix from '../helpers/mix';
+import Stateable from '../mixins/stateable';
+import flattenObject from '../functions/common/flatten-unflatten/flatten-object';
+import unFlattenObject from '../functions/common/flatten-unflatten/unflatten-object';
+
+export default mix(Behavior).with(Stateable).extend({
+ applyDelay: 1, //in ms
+ autoApplyToModel: false, //finalize
+ autoChangeModel: false, //on every change
+
+ fillFormFromModel: true,
+
+ applySelector: '.apply',
+ cancelSelector: '.cancel',
+ resetSelector: '.reset',
+
+ initialize(opts){
+
+ this.applyValue = _.debounce(this._applyValue, this.getProperty('applyDelay'));
+ this.mergeOptions(opts,['values']);
+
+ this.extendDefaultValues({});
+
+ },
+
+ extendDefaultValues(hash){
+
+ this._values = _.extend(this._values || {}, hash);
+
+ },
+
+ onViewInitialize(){
+
+ //this.extendDefaultValues(this.getProperty('values'));
+
+ let model = this.getModel();
+ if(model){
+ this.extendDefaultValues(model.toJSON());
+ }
+ },
+
+ onRender(){
+
+ if(!this.firstRender){
+ this.buildFormBindings();
+ this.setState(this._tryFlatValues(this._values));
+ this.setValuesToForm(this.getValues({raw:true}));
+ }
+ this.firstRender = true;
+ },
+
+
+ //finallizing
+ triggers(){
+ return {
+ ['click ' + this.getProperty('applySelector')]:'trigger:apply',
+ ['click ' + this.getProperty('cancelSelector')]:'trigger:cancel',
+ ['click ' + this.getProperty('resetSelector')]:'trigger:reset',
+ }
+ },
+
+ _tryFlatValues(raw){
+ return flattenObject(raw);
+ },
+ _tryUnFlatValues(raw){
+ return unFlattenObject(raw);
+ },
+ rollbackToDefaultValues(){
+ this.clearState();
+ let rawvalues = this._values;
+ let values = this._tryFlatValues(rawvalues);
+ this.setState(values);
+ },
+ getValues(options = {}){
+ let raw = this.getState();
+ if(options.raw) return raw;
+ let values = this._tryUnFlatValues(raw);
+ return values;
+ },
+ onTriggerApply(){ this._apply(); },
+ onTriggerCancel(){ this._cancel(); },
+ onTriggerReset(){ this._reset(); },
+ _apply(){
+ let values = this.getValues();
+ this.view.triggerMethod('values:apply', values);
+ this._tryChangeModel(values);
+ },
+ _cancel(){
+ this.rollbackToDefaultValues();
+ let values = this._getFullHash(this._values);
+ this.view.triggerMethod('values:cancel', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, {clear: true});
+ },
+ _reset(){
+ this.clearState();
+ let values = this._getFullHash({});
+ this.view.triggerMethod('values:reset', values);
+
+ this.setValuesToForm(values);
+ this._tryChangeModel(values, {clear: true});
+ },
+ onState(state){
+ this._tryChangeModel(state, {type:'property'})
+ },
+ _tryChangeModel(hash, options = {}){
+ let canChangeProp = options.type === 'property' ? 'autoChangeModel' : 'autoApplyToModel';
+ let canChange = this.getProperty(canChangeProp) === true;
+
+ if(!canChange) return;
+ let model = this.getModel();
+ if(!model) return;
+
+ hash = this._tryUnFlatValues(hash);
+ if(options.clear === true)
+ model.clear();
+ model.set(hash);
+
+ },
+ _getFullHash(values = {}){
+ let modelHash = this.getModel() && this.getModel().toJSON();
+ let full = _.extend({}, this.values, this.mappings, modelHash);
+ let res = {};
+ _(full).each((v,key) => res[key] = undefined);
+ return _.extend(res, values);
+ },
+
+
+ //dom manipulations
+ buildFormBindings(){
+ this.mappings = {};
+ let tags = ["input","textarea","select"];
+ this.$("[name]").each((i, el) => {
+ if(tags.indexOf(el.tagName.toLowerCase()) == -1) return;
+
+ let property = this.unCidle(el.name);
+ if(property in this.mappings) return;
+
+ let info = this._getElementInfo(el, tags);
+ if(info)
+ this.mappings[property] = info;
+ });
+ let ext = {};
+ _(this.mappings).each((context, name) => { context.values && (ext[name] = context.values); });
+
+ this.extendDefaultValues(ext);
+ },
+ _getElementInfo(el, tags){
+ let context = {
+ name: el.name
+ };
+ let values;
+ let selector = `[name="${el.name}"]`;
+ let $found = this.$(selector);
+ if(!$found.length) return;
+
+ if($found.length > 1){
+ let foundValues = [];
+ let isArray = false;
+ $found.each((i, found) => {
+ if(tags.indexOf(found.tagName.toLowerCase()) == -1) return;
+ let $el = $(found);
+ if((found.type != 'checkbox' && found.type != 'radio') || $el.prop('checked')){
+ let val = $el.val();
+ isArray || (isArray = found.type === 'checkbox' || val instanceof Array);
+ if(val instanceof Array)
+ foundValues = foundValues.concat(val);
+ else
+ foundValues.push($el.val());
+ }
+ });
+ values = (!foundValues.length || (foundValues.length === 1 && !isArray))
+ ? foundValues[0]
+ : foundValues;
+ } else {
+ values = $found.get(0).type === 'checkbox'
+ ? ($found.prop('checked') ? [$found.val()] : [])
+ : $found.val();
+ }
+ context.values = values;
+ context.isArray = values instanceof Array;
+ context.$elements = $found;
+ return context;
+ },
+ setValuesToForm(values, options = {}){
+
+ _(values).each((propertyValues, propertyName) => {
+ let property = this.mappings[propertyName];
+ let $els = property.$elements;
+ let arr = propertyValues instanceof Array ? propertyValues : [propertyValues];
+ $els.each((i, el) => {
+
+ this._setValueToElement(el, i, arr);
+ });
+ });
+ },
+ _setValueToElement(el, index, values){
+ let value = index < values.length && values[index];
+ let $el = el.jquery ? el : $(el);
+ el = $el.get(0);
+ if(el.type === 'checkbox' || el.type === 'radio'){
+ $el.prop('checked', values.indexOf($el.val()) >= 0);
+ }else{
+ $el.val(value);
+ }
+ },
+
+ // dom listeners
+ events:{
+ 'change':'domChange',
+ 'input':'domInput'
+ },
+ domChange(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ domInput(e) {
+ this.applyValue(e.target.name, e.target, e);
+ },
+ _applyValue(name, el, event){
+ if(el.type == 'checkbox')
+ this._applyCheckboxValue(name, el, event);
+ else
+ this._applySimpleValue(name, el, event);
+ },
+ _applySimpleValue(name,el,event){
+ name = this.unCidle(name);
+ let $el = $(el);
+ this.setState(name, $el.val());
+ },
+ _applyCheckboxValue(name, el, event){
+ let selector = `input[type=checkbox][name="${name}"]:checked`;
+ let values = this.$(selector).map((i, el) => el.value).toArray();
+ name = this.unCidle(name);
+ this.setState(name, values);
+ },
+
+});
diff --git a/src/functions/README.md b/src/functions/README.md
new file mode 100644
index 0000000..36c80e3
--- /dev/null
+++ b/src/functions/README.md
@@ -0,0 +1,3 @@
+# functions
+* [common](/src/functions/common)
+* [view](/src/functions/view)
diff --git a/src/functions/common/README.md b/src/functions/common/README.md
new file mode 100644
index 0000000..b35fde8
--- /dev/null
+++ b/src/functions/common/README.md
@@ -0,0 +1,11 @@
+# common
+* [flatten-unflatten](/src/functions/common/flatten-unflatten)
+* [set-get-by-path](/src/functions/common/set-get-by-path)
+
+## content
+* [get-label](/docs/functions/common/get-label.md)
+* [get-name](/docs/functions/common/get-name.md)
+* [get-value](/docs/functions/common/get-value.md)
+* is-view
+* [unwrap](/docs/functions/common/unwrap.md)
+* [wrap](/docs/functions/common/wrap.md)
diff --git a/src/functions/common/_smart-get.js b/src/functions/common/_smart-get.js
new file mode 100644
index 0000000..6dfa2f6
--- /dev/null
+++ b/src/functions/common/_smart-get.js
@@ -0,0 +1,51 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+
+function normalizeValue(context, value, args){
+ if(_.isFunction(value))
+ value = value.apply(context, args || []);
+ return value;
+}
+
+function smartGet(context, opts = {}){
+ if(opts.fields == null || (opts.fileds && !opts.fileds.length))
+ throw new Error('fields option missing');
+
+ opts.checked || (opts.checked = {});
+
+ if(context == null) return;
+
+ let value;
+ let isModel = context instanceof Bb.Model;
+ let hasOptions = _.isObject(context.options);
+ let exclude = opts.exclude instanceof Array ? opts.exclude
+ : typeof opts.exclude === 'string' ? [opts.exclude]
+ : [];
+
+
+ _(opts.fields).some((fieldName) => {
+ if(fieldName in opts.checked) return;
+ opts.checked[fieldName] = true;
+
+ if(exclude.indexOf(fieldName)>=0){
+ return;
+ }
+
+ if(isModel && value == null)
+ value = normalizeValue(context, context.get(fieldName), opts.args);
+
+ if(value == null)
+ value = normalizeValue(context, context[fieldName], opts.args);
+
+ if(value == null && hasOptions)
+ value = normalizeValue(context, context.options[fieldName], opts.args);
+
+ return value != null;
+ });
+
+ return value == null ? opts.default : value;
+
+}
+
+
+export default smartGet;
diff --git a/src/functions/common/common.js b/src/functions/common/common.js
new file mode 100644
index 0000000..ba7d991
--- /dev/null
+++ b/src/functions/common/common.js
@@ -0,0 +1,13 @@
+import getLabel from './get-label';
+import getName from './get-name';
+import getValue from './get-value';
+import wrap from './wrap';
+import unwrap from './unwrap';
+import setByPath from './set-get-by-path/set-by-path'
+import getByPath from './set-get-by-path/get-by-path'
+import flattenObject from './flatten-unflatten/flatten-object';
+import unFlattenObject from './flatten-unflatten/unflatten-object';
+import isView from './is-view';
+export default {
+ getLabel, getName, getValue, wrap, unwrap, setByPath, getByPath, flattenObject, unFlattenObject, isView
+}
diff --git a/src/functions/common/flatten-unflatten/README.md b/src/functions/common/flatten-unflatten/README.md
new file mode 100644
index 0000000..4f60999
--- /dev/null
+++ b/src/functions/common/flatten-unflatten/README.md
@@ -0,0 +1,5 @@
+# flatten-unflatten
+
+## content
+* [flatten-object](/docs/functions/common/flatten-unflatten/flatten-object.md)
+* [unflatten-object](/docs/functions/common/flatten-unflatten/unflatten-object.md)
diff --git a/src/functions/common/flatten-unflatten/flatten-object.js b/src/functions/common/flatten-unflatten/flatten-object.js
new file mode 100644
index 0000000..cdf033a
--- /dev/null
+++ b/src/functions/common/flatten-unflatten/flatten-object.js
@@ -0,0 +1,32 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+
+function traverse(fields, root)
+{
+ root = root || '';
+ if (this == null || typeof this != 'object') return;
+
+
+ var hash = this instanceof Bb.Model ? this.attributes : this;
+ var props = Object.getOwnPropertyNames(hash);
+ for (var x = 0; x < props.length; x++) {
+ var name = props[x];
+ var prop = this[name];
+
+ if (prop == null || typeof prop != 'object' || (prop instanceof Date || prop instanceof Array))
+ fields[root + name] = prop;
+ else if (typeof prop == 'object')
+ traverse.call(prop, fields, root + name + '.');
+
+ }
+
+}
+
+function flattenObject(obj) {
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ traverse.call(obj, res);
+ return res;
+};
+
+export default flattenObject;
diff --git a/src/functions/common/flatten-unflatten/unflatten-object.js b/src/functions/common/flatten-unflatten/unflatten-object.js
new file mode 100644
index 0000000..1894565
--- /dev/null
+++ b/src/functions/common/flatten-unflatten/unflatten-object.js
@@ -0,0 +1,15 @@
+import _ from 'underscore';
+import setByPath from '../set-get-by-path/set-by-path';
+
+function unFlattenObject(obj) {
+
+ if (obj == null || !_.isObject(obj)) return;
+ var res = {};
+ for (var e in obj) {
+ setByPath(res, e, obj[e], true);
+ }
+ return res;
+
+}
+
+export default unFlattenObject;
diff --git a/src/functions/common/get-label.js b/src/functions/common/get-label.js
new file mode 100644
index 0000000..2c11207
--- /dev/null
+++ b/src/functions/common/get-label.js
@@ -0,0 +1,6 @@
+import get from './_smart-get';
+export default (context, opts = {}) => {
+ let fields = ['getLabel', 'label', 'getName', 'name', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return get(context, opts);
+}
diff --git a/src/functions/common/get-name.js b/src/functions/common/get-name.js
new file mode 100644
index 0000000..20bc784
--- /dev/null
+++ b/src/functions/common/get-name.js
@@ -0,0 +1,6 @@
+import get from './_smart-get';
+export default (context, opts = {}) => {
+ let fields = ['getName', 'name', 'getLabel', 'label', 'getValue', 'value'];
+ opts.fields = fields.concat(opts.fields || []);
+ return get(context, opts);
+}
diff --git a/src/functions/common/get-value.js b/src/functions/common/get-value.js
new file mode 100644
index 0000000..50c5798
--- /dev/null
+++ b/src/functions/common/get-value.js
@@ -0,0 +1,6 @@
+import get from './_smart-get';
+export default (context, opts = {}) => {
+ let fields = ['getValue', 'value', 'getId', 'id', 'getName', 'name', 'getLabel', 'label', 'cid'];
+ opts.fields = fields.concat(opts.fields || []);
+ return get(context, opts);
+}
diff --git a/src/functions/common/is-view.js b/src/functions/common/is-view.js
new file mode 100644
index 0000000..0c0f5db
--- /dev/null
+++ b/src/functions/common/is-view.js
@@ -0,0 +1,2 @@
+import Bb from 'backbone'
+export default (arg) => arg instanceof Bb.View;
diff --git a/src/functions/common/set-get-by-path/README.md b/src/functions/common/set-get-by-path/README.md
new file mode 100644
index 0000000..c1e1e2e
--- /dev/null
+++ b/src/functions/common/set-get-by-path/README.md
@@ -0,0 +1,5 @@
+# set-get-by-path
+
+## content
+* [get-by-path](/docs/functions/common/set-get-by-path/get-by-path.md)
+* [set-by-path](/docs/functions/common/set-get-by-path/set-by-path.md)
diff --git a/src/functions/common/set-get-by-path/_get-by-path-array.js b/src/functions/common/set-get-by-path/_get-by-path-array.js
new file mode 100644
index 0000000..393f29a
--- /dev/null
+++ b/src/functions/common/set-get-by-path/_get-by-path-array.js
@@ -0,0 +1,20 @@
+import _ from 'underscore';
+import getProperty from './_get-property';
+
+function getByPathArray(context, propertyName, pathArray) {
+
+ if (context == null || !_.isObject(context) || propertyName == null || propertyName == '')
+ return;
+
+ var prop = getProperty(context, propertyName);
+
+ if (!pathArray.length || (pathArray.length && prop == null))
+ return prop;
+
+ var nextName = pathArray.shift();
+
+ return getByPathArray(prop, nextName, pathArray);
+
+}
+
+export default getByPathArray;
diff --git a/src/functions/common/set-get-by-path/_get-property.js b/src/functions/common/set-get-by-path/_get-property.js
new file mode 100644
index 0000000..0f0b7ce
--- /dev/null
+++ b/src/functions/common/set-get-by-path/_get-property.js
@@ -0,0 +1,11 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+function getProperty(context, name)
+{
+ if(context == null || !_.isObject(context) || name == null || name == '') return;
+ if (context instanceof Bb.Model)
+ return context.get(name);
+ else
+ return context[name];
+}
+export default getProperty;
diff --git a/src/functions/common/set-get-by-path/_set-by-path-array.js b/src/functions/common/set-get-by-path/_set-by-path-array.js
new file mode 100644
index 0000000..3cbaee1
--- /dev/null
+++ b/src/functions/common/set-get-by-path/_set-by-path-array.js
@@ -0,0 +1,27 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+import getProperty from './_get-property'
+import setProperty from './_set-property';
+
+function setByPathArr(context, propertyName, pathArray, value, options) {
+
+ if(context == null || !_.isObject(context) || propertyName == null || propertyName == '') return;
+
+
+ if (!pathArray.length)
+ return setProperty(context, propertyName, value, options);
+
+ var prop = getProperty(context, propertyName);
+
+ if (!_.isObject(prop) && !options.force)
+ return;
+ else if (!_.isObject(prop) && options.force)
+ prop = setProperty(context, propertyName, {}, options);
+
+
+ var nextName = pathArray.shift();
+
+ return setByPathArr(prop, nextName, pathArray, value, options);
+}
+
+export default setByPathArr;
diff --git a/src/functions/common/set-get-by-path/_set-property.js b/src/functions/common/set-get-by-path/_set-property.js
new file mode 100644
index 0000000..77f57b9
--- /dev/null
+++ b/src/functions/common/set-get-by-path/_set-property.js
@@ -0,0 +1,26 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+import getProperty from './_get-property';
+
+function setProperty(context, name, value, options) {
+ if (context instanceof Bb.Model) {
+ context.set(name, value, { silent: true });
+ }
+ else {
+ context[name] = value;
+ }
+
+ if(value instanceof Bb.Model){
+ options.models.push({
+ path: options.passPath.join(':'),
+ property: name,
+ model: value
+ });
+ }
+
+ options.passPath.push(name);
+
+ return getProperty(context, name);
+}
+
+export default setProperty;
diff --git a/src/functions/common/set-get-by-path/get-by-path.js b/src/functions/common/set-get-by-path/get-by-path.js
new file mode 100644
index 0000000..423f6bb
--- /dev/null
+++ b/src/functions/common/set-get-by-path/get-by-path.js
@@ -0,0 +1,17 @@
+import _ from 'underscore';
+import getByPathArray from './_get-by-path-array';
+
+function getByPath (obj, path) {
+
+ if(obj == null || !_.isObject(obj) || path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.')
+ : path instanceof Array ? [].slice.call(path)
+ : [path];
+
+ var prop = pathArray.shift();
+
+ return getByPathArray(obj, prop, pathArray);
+}
+
+export default getByPath;
diff --git a/src/functions/common/set-get-by-path/set-by-path.js b/src/functions/common/set-get-by-path/set-by-path.js
new file mode 100644
index 0000000..e53ed24
--- /dev/null
+++ b/src/functions/common/set-get-by-path/set-by-path.js
@@ -0,0 +1,70 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+import setByPathArray from './_set-by-path-array';
+
+const setByPath = function (context, path, value, opts) {
+
+
+ if(context == null || !_.isObject(context) || path == null || path == '') return;
+
+ let options = _.extend({}, opts);
+ options.silent = options.silent === true;
+ options.force = options.force !== false;
+
+
+ if (_.isObject(path) && !(path instanceof Array)) {
+ value = path.value;
+ options.force = path.force !== false;
+ options.silent = path.silent === true;
+ path = path.path;
+ }
+
+ options.path = path;
+ options.passPath = [];
+ options.models = [];
+
+
+ if (path == null || path == '') return;
+
+ var pathArray = typeof path === 'string' ? path.split('.')
+ : path instanceof Array ? [].slice.call(path)
+ : [path];
+
+ options.pathArray = [].slice.call(pathArray);
+
+ if(!pathArray.length) return;
+
+ let chunksCount = pathArray.length;
+ var prop = pathArray.shift();
+
+ if(context instanceof Bb.Model){
+ options.models.push({
+ path: '',
+ property: prop,
+ model: context
+ });
+ }
+
+ let result = setByPathArray(context, prop, pathArray, value, options);
+
+ if(result === undefined && value !== undefined)
+ return result;
+
+ //triggering change event on all met models
+ if(!options.silent){
+ let originPath = options.pathArray.join(':');
+ while(options.models.length){
+ let modelContext = options.models.pop();
+ let propertyEventName = modelContext.path == '' ? originPath : originPath.substring(modelContext.path.length + 1);
+ if(propertyEventName){
+ modelContext.model.trigger('change:' + propertyEventName, value);
+ }
+ modelContext.model.trigger('change', modelContext.model);
+ }
+ }
+
+
+ return result;
+};
+
+export default setByPath;
diff --git a/src/functions/common/unwrap.js b/src/functions/common/unwrap.js
new file mode 100644
index 0000000..da95698
--- /dev/null
+++ b/src/functions/common/unwrap.js
@@ -0,0 +1,12 @@
+import _ from 'underscore';
+export default function(value, prefix, delimeter = ":"){
+
+ if(value == null) return;
+ value = value.toString();
+ prefix || (prefix = '');
+ if(!value.length) return value;
+
+ let pattern = new RegExp(`^${prefix}${delimeter}`);
+ return value.replace(pattern, '');
+
+}
diff --git a/src/functions/common/wrap.js b/src/functions/common/wrap.js
new file mode 100644
index 0000000..a9cdd5a
--- /dev/null
+++ b/src/functions/common/wrap.js
@@ -0,0 +1,6 @@
+import _ from 'underscore';
+export default function(prefix, value, delimeter = ':'){
+ prefix || (prefix = '');
+ value = value == null ? '' : value.toString();
+ return prefix + delimeter + value;
+}
diff --git a/src/functions/functions.js b/src/functions/functions.js
new file mode 100644
index 0000000..d522392
--- /dev/null
+++ b/src/functions/functions.js
@@ -0,0 +1,3 @@
+import view from './view/view';
+import common from './common/common';
+export default { view, common };
diff --git a/src/functions/view/README.md b/src/functions/view/README.md
new file mode 100644
index 0000000..b5ce980
--- /dev/null
+++ b/src/functions/view/README.md
@@ -0,0 +1,5 @@
+# view
+
+## content
+* [compare-ab](/docs/functions/view/compare-ab.md)
+* [view-comparator](/docs/functions/view/view-comparator.md)
diff --git a/src/functions/view/compare-ab.js b/src/functions/view/compare-ab.js
new file mode 100644
index 0000000..8811842
--- /dev/null
+++ b/src/functions/view/compare-ab.js
@@ -0,0 +1,29 @@
+import Bb from 'backbone';
+import Mn from 'backbone.marionette';
+
+let getCompareABModel = (arg) => {
+ if (arg instanceof Bb.Model)
+ return arg;
+ else if (arg instanceof Mn.View)
+ return arg.model;
+ else
+ return;
+}
+let getCompareABView = (arg) => {
+ if (arg instanceof Bb.View)
+ return arg;
+ else
+ return;
+}
+
+let compareAB = (a, b, func) => {
+ if (typeof func === 'function') {
+ a = func.call(a, getCompareABModel(a), getCompareABView(a));
+ b = func.call(b, getCompareABModel(b), getCompareABView(b));
+ }
+ return a < b ? -1
+ : a > b ? 1
+ : 0;
+};
+
+export default compareAB;
diff --git a/src/functions/view/view-comparator.js b/src/functions/view/view-comparator.js
new file mode 100644
index 0000000..eee184e
--- /dev/null
+++ b/src/functions/view/view-comparator.js
@@ -0,0 +1,31 @@
+import _ from 'underscore';
+import compareAB from './compare-ab';
+
+/*
+* accepts:
+* variant #1: a, b, function
+* variant #2: [[a,b,function], [a,b,function]]
+* function can be undefined
+* example:
+* ascending : return viewComparator(viewA, viewB, function(model, view){ return model && model.get('someTextField') });
+* descending : return viewComparator(viewB, viewA, function(model, view){ return model && model.get('someTextField') });
+ multiple compares: return viewComparator([[viewB, viewA, func], [viewB, viewA, func]])
+*/
+let viewComparator = (...args) => {
+ var compareArray = [];
+ var result = 0;
+
+ if (args.length >= 2) // single compare
+ return compareAB.apply(null, args);
+ else if (args.length === 1 && args[0] instanceof Array) // array of compare
+ compareArray = args[0];
+
+ _(compareArray).every(function (singleCompare) {
+ result = compareAB.apply(null, singleCompare);
+ return result === 0;
+ });
+
+ return result;
+}
+
+export default viewComparator;
diff --git a/src/functions/view/view.js b/src/functions/view/view.js
new file mode 100644
index 0000000..0857eff
--- /dev/null
+++ b/src/functions/view/view.js
@@ -0,0 +1,3 @@
+import compareAB from './compare-ab';
+import viewComparator from './view-comparator';
+export default { compareAB, viewComparator };
diff --git a/src/helpers/Helpers.js b/src/helpers/Helpers.js
new file mode 100644
index 0000000..86dd67b
--- /dev/null
+++ b/src/helpers/Helpers.js
@@ -0,0 +1,6 @@
+import isKnownCtor from './isKnownCtor';
+import mix from './mix';
+export default {
+ isKnownCtor,
+ mix,
+}
diff --git a/src/helpers/README.md b/src/helpers/README.md
new file mode 100644
index 0000000..9d43f16
--- /dev/null
+++ b/src/helpers/README.md
@@ -0,0 +1,5 @@
+# helpers
+
+## content
+* [isKnownCtor](/docs/helpers/isKnownCtor.md)
+* [mix](/docs/helpers/mix.md)
diff --git a/src/helpers/isKnownCtor.js b/src/helpers/isKnownCtor.js
new file mode 100644
index 0000000..0404f01
--- /dev/null
+++ b/src/helpers/isKnownCtor.js
@@ -0,0 +1,19 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+import Mn from 'backbone.marionette';
+
+const knownCtors = [
+ Bb.Model,
+ Bb.Collection,
+ Bb.View,
+ Bb.Router,
+ Mn.Object
+];
+
+function isKnownCtor(arg) {
+ let isFn = _.isFunction(arg);
+ let result = _(knownCtors).some((ctor) => arg === ctor || arg.prototype instanceof ctor);
+ return isFn && result;
+}
+
+export default isKnownCtor;
diff --git a/src/helpers/mix.js b/src/helpers/mix.js
new file mode 100644
index 0000000..137c1a5
--- /dev/null
+++ b/src/helpers/mix.js
@@ -0,0 +1,39 @@
+import _ from 'underscore'
+import Mn from 'backbone.marionette';
+import YatError from '../YatError';
+
+function smartExtend(Src, Dst){
+ if(_.isFunction(Dst)){
+ return Dst(Src);
+ }
+ else if(_.isObject(Dst)){
+ return Src.extend(Dst);
+ }
+ else throw new YatError('Mixin fail, argument should be an object hash or mixin function')
+}
+
+function mix(BaseClass){
+ let Mixed = null;
+ if(_.isFunction(BaseClass)){
+ Mixed = BaseClass;
+ }
+ else if(_.isObject(BaseClass) && BaseClass !== null){
+ let tmp = function(){};
+ tmp.extend = Mn.extend;
+ Mixed = tmp.extend(BaseClass);
+ }
+ else {
+ throw new Error('argument should be an object or class definition')
+ }
+ if(!Mixed.extend) {
+ Mixed = Mn.extend.call(BaseClass, {});
+ Mixed.extend = Mn.extend;
+ }
+ let fake = {
+ with: (...args) => _.reduce(args, (memo, arg) => smartExtend(memo, arg), Mixed),
+ class: Mixed,
+ }
+ return fake;
+}
+
+export default mix;
diff --git a/src/helpers/mixin.js b/src/helpers/mixin.js
new file mode 100644
index 0000000..c232d3f
--- /dev/null
+++ b/src/helpers/mixin.js
@@ -0,0 +1,54 @@
+import _ from 'underscore';
+
+function mixWithObject(ClassDefinition, mixin){
+ let MixedClass = class extends ClassDefinition{
+ constructor(...args){
+ super(...args);
+ }
+ };
+ _.extend(MixedClass.prototype, mixin);
+ return MixedClass;
+}
+
+function mixWithOne(ClassDefinition, mixin)
+{
+ if(typeof mixin === 'function')
+ return mixin(ClassDefinition);
+ else if(typeof mixin === 'object')
+ return mixWithObject(ClassDefinition, mixin);
+ else
+ return ClassDefinition;
+}
+
+
+function mixWith(...mixins){
+
+ let MixedClass = this;
+
+ if(!mixins || !mixins.length) return this;
+
+
+ while(mixins.length){
+ let mixin = mixins.shift();
+ MixedClass = mixWithOne(MixedClass, mixin);
+ }
+
+ delete this.with;
+
+ return MixedClass;
+}
+
+function mixin(Base){
+ return class extends Base {
+ constructor(...args){
+ super(...args);
+ }
+ static with(...mixins){
+ return mixWith.apply(this, mixins);
+ }
+ };
+}
+
+
+
+export default mixin;
diff --git a/src/marionette.yat.js b/src/marionette.yat.js
new file mode 100644
index 0000000..cfd754b
--- /dev/null
+++ b/src/marionette.yat.js
@@ -0,0 +1,50 @@
+import {version} from '../package.json';
+import Functions from './functions/functions';
+import Helpers from './helpers/Helpers';
+import Mixins from './mixins/Mixins';
+import Behaviors from './behaviors/behaviors';
+import Singletons from './singletons/singletons';
+import TemplateContext from './singletons/template-context';
+import modals from './singletons/modals/modals';
+import identity from './singletons/identity';
+import yatConfig from './YatConfig';
+import YatObject from './YatObject';
+import YatError from './YatError';
+import YatApp from './YatApp';
+import YatRouter from './YatRouter';
+import YatPage from './YatPage';
+import YatPageManager from './YatPageManager';
+import YatView from './YatView';
+import YatCollectionView from './YatCollectionView';
+
+import YatModel from './models/model';
+import YatCollection from './models/collection';
+
+import CollectionGroups from './YatCollectionGroups';
+
+
+const marionetteYat = {
+ VERSION: version,
+ Functions: Functions,
+ Helpers: Helpers,
+ Mixins: Mixins,
+ Behaviors: Behaviors,
+ Singletons: Singletons,
+ TemplateContext: TemplateContext,
+ modals: modals,
+ identity: identity,
+ createConfig: yatConfig,
+ Object: YatObject,
+ Error: YatError,
+ App: YatApp,
+ Page : YatPage,
+ Router: YatRouter,
+ PageManager: YatPageManager,
+ View: YatView,
+ CollectionView: YatCollectionView,
+ Model: YatModel,
+ Collection: YatCollection,
+ CollectionGroups,
+};
+
+export default marionetteYat;
diff --git a/src/mixins/Mixins.js b/src/mixins/Mixins.js
new file mode 100644
index 0000000..c5e0b1c
--- /dev/null
+++ b/src/mixins/Mixins.js
@@ -0,0 +1,17 @@
+import GetNameLabel from './get-name-label';
+import GetOptionProperty from './get-option-property';
+import Radioable from './radioable.js';
+import Stateable from './stateable';
+import Startable from './startable';
+import Childrenable from './childrenable';
+import GlobalTemplateContext from './global-template-context';
+
+export default {
+ GetNameLabel,
+ GetOptionProperty,
+ Radioable,
+ Stateable,
+ Startable,
+ Childrenable,
+ GlobalTemplateContext,
+}
diff --git a/src/mixins/README.md b/src/mixins/README.md
new file mode 100644
index 0000000..daffa68
--- /dev/null
+++ b/src/mixins/README.md
@@ -0,0 +1,10 @@
+# mixins
+
+## content
+* [childrenable](/docs/mixins/childrenable.md)
+* [get-name-label](/docs/mixins/get-name-label.md)
+* [get-option-property](/docs/mixins/get-option-property.md)
+* global-template-context
+* [radioable](/docs/mixins/radioable.md)
+* [startable](/docs/mixins/startable.md)
+* [stateable](/docs/mixins/stateable.md)
diff --git a/src/mixins/childrenable.js b/src/mixins/childrenable.js
new file mode 100644
index 0000000..3adfd34
--- /dev/null
+++ b/src/mixins/childrenable.js
@@ -0,0 +1,104 @@
+import _ from 'underscore';
+
+export default (Base) => {
+
+ const CHILDREN_FIELD = '_children';
+
+ let Mixin = Base.extend({
+ constructor(...args) {
+ Base.apply(this, args);
+ this.initializeChildrenable(...args);
+ },
+
+ initializeChildrenable(options = {}){
+ this._initializeParrent(options);
+ this._initializeChildren(options);
+ },
+
+ hasChildren(){
+ let children = this.getChildren();
+ return this[CHILDREN_FIELD].length > 0;
+ },
+
+ getChildren(opts = {startable:true}){
+ let all = this[CHILDREN_FIELD] || [];
+ if(!opts.startable){
+ return all;
+ }else{
+ return all.filter((c) => !c.getProperty('isStartNotAllowed'));
+ }
+ },
+
+ hasParent(){
+ let parent = this.getParent();
+ return _.isObject(parent);
+ },
+
+ getParent(){
+ return this.getProperty('parent', {deep:false});
+ },
+
+ _initializeChildren(){
+ let _children = this.getProperty('children');
+ let children = [];
+ _(_children).each((child) => {
+
+ let childContext = this._normalizeChildContext(child);
+ let initialized = this._initializeChild(childContext);
+ if(initialized) children.push(initialized);
+
+ });
+ this[CHILDREN_FIELD] = children;
+ },
+ _initializeChild(childContext)
+ {
+ if(childContext == null || !_.isFunction(childContext.Child)) return;
+
+ let Child = childContext.Child;
+ let opts = this._normalizeChildOptions(childContext);
+ return this.buildChild(Child, opts);
+ },
+
+ _normalizeChildContext(child){
+ let childContext = {};
+
+ if(_.isFunction(child) && child.Childrenable){
+ _.extend(childContext, { Child: child });
+ }else if(_.isFunction(child)){
+ childContext = this._normalizeChildContext(child.call(this));
+ }
+ else if(_.isObject(child)){
+ childContext = child;
+ }
+ return childContext;
+ },
+
+ _normalizeChildOptions(options){
+ let opts = _.extend({}, options);
+ if(this.getOption('passToChildren') === true){
+ _.extend(opts, this.options);
+ }
+ opts.parent = this;
+ delete opts.Child;
+ return this._buildChildOptions(opts);
+ },
+
+ _buildChildOptions: function(def){
+ return _.extend(def, this.getProperty('childOptions'));
+ },
+
+ buildChild(ChildClass, options){
+ return new ChildClass(options);
+ },
+
+ _initializeParrent(opts){
+ if(this.parent == null && opts.parent != null)
+ this.parent = opts.parent;
+ },
+
+ });
+
+ Mixin.Childrenable = true;
+
+ return Mixin;
+}
diff --git a/src/mixins/get-name-label.js b/src/mixins/get-name-label.js
new file mode 100644
index 0000000..e3019ad
--- /dev/null
+++ b/src/mixins/get-name-label.js
@@ -0,0 +1,25 @@
+import _ from 'underscore';
+import common from '../functions/common/common';
+export default function (Base) {
+ return Base.extend({
+ getName(opts = {}){
+ let options = _.extend({}, opts);
+ options.exclude = 'getName';
+ options.args = [options];
+ return common.getName(this, options);
+ },
+ getLabel(opts = {}){
+ let options = _.extend({}, opts);
+ options.exclude = 'getLabel';
+ options.args = [options];
+ return common.getLabel(this, options);
+ },
+ getValue(opts = {}){
+ let options = _.extend({}, opts);
+ options.exclude = 'getValue';
+ options.args = [options];
+ return common.getValue(this, options);
+ }
+ });
+}
+
diff --git a/src/mixins/get-option-property.js b/src/mixins/get-option-property.js
new file mode 100644
index 0000000..1c5c9c2
--- /dev/null
+++ b/src/mixins/get-option-property.js
@@ -0,0 +1,46 @@
+import _ from 'underscore';
+import isKnownCtor from '../helpers/isKnownCtor.js';
+
+
+export default (Base) => {
+ let Mixin = Base.extend({
+ //property first approach
+ getProperty(key, options){
+ return this._getOptionOrProperty(this, key, options, this.getOption);
+ },
+ //options first approach
+ getOption(key, options){
+ return this._getOptionOrProperty(this.getProperty('options',{deep:false}), key, options, this.getProperty);
+ },
+ _getOptionOrProperty(valueContext, key, options = {}, fallback)
+ {
+ options.deep !== undefined || (options.deep = true);
+ options.force !== undefined || (options.force = true);
+ options.args || (options.args = []);
+
+ //key and valueContext should be passed
+ if(key == null || valueContext == null) return;
+
+ //getting raw value
+ let value = valueContext[key];
+
+ //if there is no raw value and deep option is true then getting value from fallback
+ if(value === undefined && options.deep && _.isFunction(fallback)){
+ let fallbackOptions = _.extend({}, options, {deep:false, force: false});
+ value = fallback.call(this, key, fallbackOptions);
+ }
+
+ //if returned value is function and is not any of known constructors and options property force set to true
+ //we should return value of that function
+ //options.args will be passed as arguments
+ if(_.isFunction(value) && options.force && !isKnownCtor(value))
+ value = value.apply(this, options.args || []);
+
+ //console.log('key', key, value);
+
+ //if value is still undefined we will return default option value
+ return value === undefined ? options.default : value;
+ }
+ });
+ return Mixin;
+}
diff --git a/src/mixins/global-template-context.js b/src/mixins/global-template-context.js
new file mode 100644
index 0000000..a66a38d
--- /dev/null
+++ b/src/mixins/global-template-context.js
@@ -0,0 +1,11 @@
+import _ from 'underscore';
+import TemplateContext from '../singletons/template-context';
+
+export default (Base) => Base.extend({
+ mixinTemplateContext(target = {}) {
+
+ var templateContext = TemplateContext.mix(_.result(this, 'templateContext'), this);
+
+ return _.extend(target, templateContext);
+ },
+})
diff --git a/src/mixins/radioable.js b/src/mixins/radioable.js
new file mode 100644
index 0000000..4b099e3
--- /dev/null
+++ b/src/mixins/radioable.js
@@ -0,0 +1,36 @@
+import Mn from 'backbone.marionette';
+
+export default (Base) => {
+ let Mixin = Base.extend({
+ constructor(...args){
+ Base.apply(this, args);
+ let initRadioOnInitialize = !(this.getProperty('initRadioOnInitialize') === true);
+ this._initRadio({skip: initRadioOnInitialize});
+ },
+ getChannel () {
+ if(!this._channel) this._initRadio({skip:false});
+ return this._channel;
+ },
+ _initRadio(opts = {skip:true}){
+ if(opts.skip == true) return;
+
+ let channelName = this.getProperty('channelName');
+ if(!channelName){
+ let channel = this.getProperty('channel');
+ if(channel)
+ this.channelName = channel.channelName;
+ }
+ Mn.Object.prototype._initRadio.call(this);
+ },
+ radioRequest(...args){
+ let channel = this.getChannel();
+ if(channel) channel.request(...args);
+ },
+ radioTrigger(...args){
+ let channel = this.getChannel();
+ if(channel) channel.trigger(...args);
+ },
+ });
+
+ return Mixin;
+}
diff --git a/src/mixins/startable.js b/src/mixins/startable.js
new file mode 100644
index 0000000..33766cb
--- /dev/null
+++ b/src/mixins/startable.js
@@ -0,0 +1,409 @@
+import _ from 'underscore';
+import mix from '../helpers/mix.js';
+import State from './stateable.js';
+import YatError from '../YatError.js';
+
+const STATES = {
+ INITIALIZED: 'initialized',
+ STARTING: 'starting',
+ RUNNING: 'running',
+ STOPPING: 'stopping',
+ WAITING: 'waiting',
+ DESTROYED: 'destroyed'
+}
+
+const STATE_KEY = 'life';
+
+
+function getPropertyPromise(context, propertyName){
+
+ if(context == null || propertyName == null)
+ return Promise.resolve();
+
+ let _promises1 = context['_'+propertyName] || [];
+ let _promises2 = _.result(context, propertyName) || [];
+
+ let rawPromises = _promises1.concat(_promises2);
+ //context[propertyName] || [];
+
+ let promises = [];
+ _(rawPromises).each((promiseArg) => {
+ if(_.isFunction(promiseArg))
+ promises.push(promiseArg.call(this));
+ else if(promiseArg != null)
+ promises.push(promiseArg);
+ });
+ return Promise.all(promises);
+}
+
+function addPropertyPromise(context, propertyName, promise){
+ context[propertyName] || (context[propertyName] = []);
+ let promises = context[propertyName];
+ promises.push(promise);
+}
+
+
+
+export default (Base) => {
+ let Middle = mix(Base).with(State);
+ let Mixin = Middle.extend({
+ constructor(...args){
+ Middle.apply(this,args);
+ this.initializeStartable();
+ },
+
+ freezeWhileStarting: false,
+ freezeUI(){ },
+ unFreezeUI(){ },
+ isStartNotAllowed(){ },
+ isStopNotAllowed(){ },
+
+ addStartPromise(promise){
+ addPropertyPromise(this,'_startRuntimePromises', promise);
+ },
+
+ addStopPromise(promise){
+ addPropertyPromise(this,'_stopPromises', promise);
+ },
+
+ initializeStartable(){
+
+ if(!(this.constructor.Startable && this.constructor.Stateable)) return;
+
+ this._registerStartableLifecycleListeners();
+ this._setLifeState(STATES.INITIALIZED);
+ this._startRuntimePromises = [];
+ this._startPromises = [];
+ this._stopPromises = [];
+ },
+
+ start(...args){
+ let options = args[0];
+ /*
+ let canNotBeStarted = this._ensureStartableCanBeStarted();
+ let resultPromise = null;
+ let catchMethod = null;
+
+ if(canNotBeStarted){
+ catchMethod = () => this.triggerMethod('start:decline',canNotBeStarted);
+ //resultPromise = Promise.reject(canNotBeStarted);
+ }
+
+ if(resultPromise == null){
+ let declineReason = this.isStartNotAllowed(options);
+ if(declineReason) {
+ catchMethod = () => this.triggerMethod('start:decline',declineReason);
+ resultPromise = Promise.reject(declineReason);
+ }
+ }
+
+ if(resultPromise == null){
+ var currentState = this._getLifeState();
+ this._tryMergeStartOptions(options);
+ this.triggerMethod('before:start', ...args);
+
+ resultPromise = this._getStartPromise();
+ }
+ */
+
+
+ // return resultPromise.then(() => {
+ // this.triggerStart(options)
+ // }, (error) => {
+ // this._setLifeState(currentState);
+ // if(catchMethod) catchMethod();
+ // return Promise.reject(error);
+ // });
+ let _this = this;
+ let promise = new Promise(function(resolve, reject){
+ let canNotBeStarted = _this._ensureStartableCanBeStarted();
+
+ if(canNotBeStarted){
+ _this.triggerMethod('start:decline',canNotBeStarted);
+ reject(canNotBeStarted)
+ return;
+ }
+
+ let declineReason = _this.isStartNotAllowed(options);
+ if(declineReason) {
+ _this.triggerMethod('start:decline',declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ _this.triggerMethod('before:start', ...args);
+ let currentState = _this._getLifeState();
+ let dependedOn = _this._getStartPromise();
+ dependedOn.then(() => {
+ _this._tryMergeStartOptions(options);
+ _this.once('start', (...args) => resolve(...args));
+ _this.triggerStart(options);
+ },(...args) => {
+ _this._setLifeState(currentState);
+ reject(...args);
+ });
+ });
+ return promise;
+ },
+
+ triggerStart(options) {
+ this.triggerMethod('start', options);
+ },
+
+ stop(...args){
+ let options = args[0];
+ /*
+ let canNotBeStopped = this._ensureStartableCanBeStopped();
+ if(canNotBeStopped){
+ this.triggerMethod('stop:decline',canNotBeStopped);
+ return Promise.reject(canNotBeStopped);
+ }
+ let declineReason = this.isStopNotAllowed(options);
+ if(declineReason){
+ this.triggerMethod('stop:decline', declineReason);
+ return Promise.reject(declineReason);
+ }
+
+
+ var currentState = this._getLifeState();
+
+ this._tryMergeStopOptions(options);
+ this.triggerMethod('before:stop', this, options);
+
+ let promise = this._getStopPromise();
+
+ return promise.then(() => {
+ this.triggerStop(options)
+ }, () => {
+ this._setLifeState(currentState);
+ });
+ */
+
+ let _this = this;
+ let promise = new Promise(function(resolve, reject){
+ let canNotBeStopped = _this._ensureStartableCanBeStopped();
+
+ if(canNotBeStopped){
+ _this.triggerMethod('stop:decline',canNotBeStopped);
+ reject(canNotBeStopped)
+ return;
+ }
+
+ let declineReason = _this.isStopNotAllowed(options);
+ if(declineReason) {
+ _this.triggerMethod('stop:decline',declineReason);
+ reject(declineReason);
+ return;
+ }
+
+ let currentState = _this._getLifeState();
+ let dependedOn = _this._getStopPromise();
+ _this.triggerMethod('before:stop', ...args);
+ dependedOn.then(() => {
+ _this._tryMergeStopOptions(options);
+ _this.once('stop', (...args) => resolve(...args));
+ _this.triggerStop(options);
+ },(...args) => {
+ _this._setLifeState(currentState);
+ reject(...args);
+ });
+ });
+ return promise;
+
+ },
+
+ triggerStop(options) {
+ this.triggerMethod('stop', options);
+ },
+
+
+
+
+
+ //lifecycle state helpers
+ _setLifeState(newstate){
+ this.setState(STATE_KEY, newstate);
+ },
+
+ _getLifeState(){
+ return this.getState(STATE_KEY);
+ },
+
+ _isLifeState(state){
+ return this._getLifeState() === state;
+ },
+
+ _isLifeStateIn(...states){
+ return _(states).some((state) => this._isLifeState(state));
+ },
+
+ _isInProcess(){
+ return this._isLifeStateIn(STATES.STARTING, STATES.STOPPING);
+ },
+
+
+ _registerStartableLifecycleListeners(){
+ let freezeWhileStarting = this.getProperty('freezeWhileStarting') === true;
+ if(freezeWhileStarting && _.isFunction(this.freezeUI))
+ this.on(`state:${STATE_KEY}:${STATES.STARTING}`,() => {
+ this.freezeUI();
+ });
+ if(freezeWhileStarting && _.isFunction(this.unFreezeUI))
+ this.on('start',() => {
+ this.unFreezeUI();
+ });
+
+
+ this.on('before:start', () => this._setLifeState(STATES.STARTING));
+ this.on('start', () => this._setLifeState(STATES.RUNNING));
+ this.on('before:stop',() => this._setLifeState(STATES.STOPPING));
+ this.on('stop',() => this._setLifeState(STATES.WAITING));
+ this.on('destroy',() => this._setLifeState(STATES.DESTROYED));
+
+ },
+
+ _tryMergeStartOptions(options){
+ if(!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStartOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+
+ _tryMergeStopOptions(options){
+ if(!this.mergeOptions) return;
+ var mergeoptions = this.getProperty('mergeStopOptions') || [];
+ this.mergeOptions(options, mergeoptions);
+ },
+
+ _ensureStartableIsIntact(opts = {throwError: false}) {
+ let message = 'Startable has already been destroyed and cannot be used.';
+ let error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ let destroyed = this._isLifeState(STATES.DESTROYED);
+ if(opts.throwError && destroyed){
+ throw error;
+ }
+ else if(destroyed){
+ return error;
+ }
+ },
+
+ _ensureStartableIsIdle(opts = {throwError:false}){
+ let message = 'Startable is not idle. current state: ' + this._getLifeState();
+ let error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ let isNotIntact = this._ensureStartableIsIntact(opts);
+ let notIdle = this._isInProcess();
+ if(opts.throwError && notIdle){
+ throw error;
+ }
+ else if(isNotIntact){
+ return isNotIntact;
+ }
+ else if(notIdle){
+ return error;
+ }
+ },
+
+ _ensureStartableCanBeStarted(opts = {throwError:false}){
+
+ let message = 'Startable has already been started.';
+ let error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ let notIdle = this._ensureStartableIsIdle(opts);
+ let allowStartWithoutStop = this.getProperty('allowStartWithoutStop') === true;
+
+ if(!notIdle && allowStartWithoutStop) return;
+
+ let running = this._isLifeState(STATES.RUNNING);
+ if(opts.throwError && running){
+ throw error;
+ }else if(notIdle){
+ return notIdle;
+ }else if(running){
+ return error;
+ }
+ },
+
+
+ _ensureStartableCanBeStopped(opts = {throwError:false}){
+
+ let message = 'Startable should be in `running` state.';
+ let error = new YatError({
+ name: 'StartableLifecycleError',
+ message: message
+ });
+ let notIdle = this._ensureStartableIsIdle(opts);
+
+ let allowStopWithoutStart = this.getProperty('allowStopWithoutStart') === true;
+ if(!notIdle && allowStopWithoutStart) return;
+
+ let running = this._isLifeState(STATES.RUNNING);
+
+ if(opts.throwError && !running){
+ throw error;
+ }else if(notIdle){
+ return notIdle;
+ }else if(!running){
+ return error;
+ }
+
+ },
+
+ _getStartPromise(options = {}){
+ return Promise.all(this._getStartPromises(options));
+ },
+
+ _getStartPromises(options = {}){
+ let promises = [];
+ promises.push(this._getStartParentPromise());
+ promises.push(this._getStartPagePromise());
+ if(options.noruntime !== true)
+ promises.push(this._getStartRuntimePromise());
+ return promises;
+ },
+
+ _getStartRuntimePromise(){
+ return getPropertyPromise(this,'startRuntimePromises');
+ },
+ _getStartPagePromise(){
+ return getPropertyPromise(this,'startPromises');
+ },
+ _getStartParentPromise(){
+ var parent = _.result(this, 'getParent');
+ if(_.isObject(parent) && _.isFunction(parent._getStartPromise))
+ return parent._getStartPromise({noruntime: true});
+ },
+
+ _getStopPromise(){
+ return Promise.all(this._getStopPromises());
+ },
+
+ _getStopPromises(){
+ let promises = [];
+ promises.push(this._getStopRuntimePromise());
+ return promises;
+ },
+
+ _getStopRuntimePromise(){
+ return getPropertyPromise(this,'stopPromises');
+ },
+
+ _getStopParentPromise(){
+ var parent = _.result(this, 'getParent');
+ if(_.isObject(parent) && _.isFunction(parent._getStopPromise))
+ return parent._getStopPromise();
+ },
+
+
+ });
+
+ Mixin.Startable = true;
+
+ return Mixin;
+}
diff --git a/src/mixins/stateable.js b/src/mixins/stateable.js
new file mode 100644
index 0000000..0b0577a
--- /dev/null
+++ b/src/mixins/stateable.js
@@ -0,0 +1,67 @@
+import _ from 'underscore';
+
+export default (BaseClass) => {
+ let Mixin = BaseClass.extend({
+ constructor(...args){
+ BaseClass.apply(this, args);
+ this.initializeStateable();
+ },
+ initializeStateable(){
+ this._state = {};
+ },
+
+ getState(key){
+ const state = this._state;
+ if(!key) return state
+ else return state[key];
+ },
+ setState(key, value, options){
+
+ if(key == null) return;
+
+ if(_.isObject(key)){
+ const _this = this;
+ options = value;
+ value = key;
+ _(value).each((propertyValue, propertyName) => _this.setState(propertyName, propertyValue, _.extend({},options,{doNotTriggerFullState: true})));
+ this._triggerStateChange(value, options);
+ }else{
+ const state = this.getState();
+ state[key] = value;
+ this._triggerStateChange(key, value, options);
+ }
+ },
+ clearState(opts = {}){
+ let state = this.getState();
+ let broadcast = _.extend({}, state);
+ _(state).each((s,key) => {
+ broadcast[key] = undefined;
+ delete state[key];
+ });
+ this._triggerStateChange(broadcast);
+ },
+ _triggerStateChange(key, value, options){
+
+ if(!_.isFunction(this.triggerMethod)) return;
+
+ if(!_.isObject(key)){
+ this.triggerMethod('state:' + key, value, options);
+ if(value === true || value === false || (!!value && typeof value === 'string'))
+ this.triggerMethod('state:' + key + ':' + value.toString(), options);
+ if(!options || (options && !options.doNotTriggerFullState)){
+ this.triggerMethod('state', {[key]:value}, options);
+ }
+ }else{
+ //key is a hash of states
+ //value is options
+ options = value;
+ value = key;
+ this.triggerMethod('state', value, options);
+ }
+ },
+ });
+ Mixin.Stateable = true;
+
+ return Mixin;
+
+}
diff --git a/src/models/README.md b/src/models/README.md
new file mode 100644
index 0000000..ce239f6
--- /dev/null
+++ b/src/models/README.md
@@ -0,0 +1,6 @@
+# models
+
+## content
+* collection
+* link
+* model
diff --git a/src/models/collection.js b/src/models/collection.js
new file mode 100644
index 0000000..ab9a8f9
--- /dev/null
+++ b/src/models/collection.js
@@ -0,0 +1,2 @@
+import Bb from 'backbone';
+export default Bb.Collection.extend({});
diff --git a/src/models/link.js b/src/models/link.js
new file mode 100644
index 0000000..3bbcc76
--- /dev/null
+++ b/src/models/link.js
@@ -0,0 +1,13 @@
+import Model from './model'
+export default Model.extend({
+ defaults:{
+ url: undefined,
+ label: undefined,
+ target: '_self',
+ level: 0,
+ },
+ destroy(){
+ this.id = null;
+ Model.prototype.destroy.apply(this, arguments);
+ }
+});
diff --git a/src/models/model.js b/src/models/model.js
new file mode 100644
index 0000000..e2d8b53
--- /dev/null
+++ b/src/models/model.js
@@ -0,0 +1,3 @@
+import Bb from 'backbone';
+export default Bb.Model.extend({});
+
diff --git a/src/singletons/README.md b/src/singletons/README.md
new file mode 100644
index 0000000..6d50458
--- /dev/null
+++ b/src/singletons/README.md
@@ -0,0 +1,6 @@
+# singletons
+* [modals](/src/singletons/modals)
+
+## content
+* identity
+* template-context
diff --git a/src/singletons/identity.js b/src/singletons/identity.js
new file mode 100644
index 0000000..634b129
--- /dev/null
+++ b/src/singletons/identity.js
@@ -0,0 +1,183 @@
+
+import mix from '../helpers/mix';
+import Stateable from '../mixins/stateable';
+import YatObject from '../YatObject';
+import Bb from 'backbone';
+import _ from 'underscore';
+import YatError from '../YatError';
+
+const IDENTITY_CHANNEL = 'identity';
+
+let Base = mix(YatObject).with(Stateable);
+
+let nativeAjax = $ && $.ajax;
+
+let Identity = Base.extend({
+ constructor(...args){
+ Base.apply(this, args);
+ this._initializeYatUser();
+ },
+ _initializeYatUser(){},
+ channelName: IDENTITY_CHANNEL,
+ tokenExpireOffset: 120000, // try to renew token on 2 minutes before access token expires
+ isAnonym(){
+ return !this.getState('id');
+ },
+ isUser(){
+ return !this.isAnonym();
+ },
+ isMe(id){
+ return id && this.getState('id') === id;
+ },
+ update(hash){
+ this.setState(hash);
+ this.trigger('change');
+ },
+ logIn(hash){
+ if(!hash.id) return;
+ this.update(hash);
+ this.trigger('log:in');
+ },
+ logOut(){
+ this.clearState();
+ this.trigger('change');
+ this.trigger('log:out');
+ },
+ getBearerToken(data){
+ let url = this.getOption('bearerTokenUrl');
+ let promise = new Promise((resolve, reject) => {
+ nativeAjax({url, data, method:'POST'})
+ .then(
+ (token) => {
+ this.setTokenObject(token);
+ resolve(token);
+ this.triggerMethod('token', token);
+ },
+ (error) => reject(error)
+ );
+
+ });
+ return promise;
+ },
+
+ ajax(...args){
+ let options = args[0];
+ options.headers = _.extend({}, options.headers, this.getAjaxHeaders());
+ let needRefresh = this.isTokenRefreshNeeded();
+ if(!needRefresh){
+ return $.ajax(...args); //nativeAjax.apply($, args);
+ }
+ else {
+ return this.refreshBearerToken()
+ .then(() => nativeAjax.apply($, args))
+ .catch((error) =>{
+ let promise = $.Deferred();
+ promise.reject(error);
+ return promise;
+ });
+ }
+ },
+ getAjaxHeaders(){
+ this._ajaxHeaders || (this._ajaxHeaders = {});
+ return this._ajaxHeaders;
+ },
+ _updateHeaders(){
+ let token = this.getTokenValue();
+ let headers = this.getAjaxHeaders();
+
+ if(token){
+ headers.Authorization = 'Bearer ' + token;
+ headers.Accept = 'application/json';
+ }else{
+ delete headers.Authorization;
+ }
+ },
+ setTokenObject(token){
+
+ if(token != null && _.isObject(token))
+ token.expires = new Date(Date.now() + (token.expires_in * 1000));
+
+ this._token = token;
+ this._updateHeaders();
+ this._replaceBackboneAjax();
+
+ this.triggerMethod('tocken:change');
+ },
+ getTokenObject(){
+ return this._token;
+ },
+ _replaceBackboneAjax(){
+ let token = this.getTokenValue();
+ if(!token)
+ Bb.ajax = $.ajax;//$.ajax = nativeAjax;
+ else
+ Bb.ajax = (...args) => this.ajax(...args); //$.ajax = (...args) => Yat.identity.ajax(...args);
+ },
+ getTokenValue(){
+ let token = this.getTokenObject();
+ return token.access_token;
+ },
+ getRefreshToken(){
+ let token = this.getTokenObject();
+ return token.refresh_token;
+ },
+ getTokenExpires(){
+ let token = this.getTokenObject();
+ return (token || {}).expires;
+ },
+ getTokenSeconds(){
+ let expires = this.getTokenExpires();
+
+ if(expires == null || isNaN(expires.valueOf())) {
+ console.warn('expires is null or wrong');
+ return 0;
+ }
+
+ let offset = this.getProperty('tokenExpireOffset');
+ if(offset == null) offset = 30000; //30 sec
+
+ var deadline = expires.valueOf() - offset;
+ var deadlineMs = deadline - Date.now();
+ return deadlineMs > 0 ? deadlineMs / 1000 : 0;
+ },
+ isTokenRefreshNeeded(){
+ let token = this.getTokenValue();
+ if(!token) return false;
+ return !this.getTokenSeconds();
+ },
+ refreshBearerToken(){
+ let bearerTokenRenewUrl = this.getProperty('bearerTokenRenewUrl') || this.getProperty('bearerTokenUrl');
+ let doRefresh = this.isTokenRefreshNeeded();
+ return new Promise((resolve, reject) => {
+ if(!doRefresh){
+ resolve();
+ return;
+ }
+
+ if(bearerTokenRenewUrl == null){
+ reject(new Error('Token expired and `bearerTokenRenewUrl` not set'));
+ return;
+ }
+ let data = {
+ 'grant_type':'refresh_token',
+ 'refresh_token': this.getRefreshToken()
+ };
+ nativeAjax({
+ url:bearerTokenRenewUrl,
+ data,
+ method:'POST'
+ })
+ .then((token) => {
+ this.setTokenObject(token);
+ resolve();
+ }, () => {
+ this.triggerMethod('refresh:token:expired');
+ reject(YatError.Http401());
+ });
+
+ });
+ }
+});
+
+let identity = new Identity();
+export default identity;
diff --git a/src/singletons/modals/README.md b/src/singletons/modals/README.md
new file mode 100644
index 0000000..e03f580
--- /dev/null
+++ b/src/singletons/modals/README.md
@@ -0,0 +1,5 @@
+# modals
+
+## content
+* config
+* modalView
diff --git a/src/singletons/modals/config.js b/src/singletons/modals/config.js
new file mode 100644
index 0000000..77286cf
--- /dev/null
+++ b/src/singletons/modals/config.js
@@ -0,0 +1,77 @@
+import Config from './../../YatConfig';
+
+const config = new Config('yat:modals:singleton',{ noRadio: true });
+
+let modalsShowFull = {
+ bg: true,
+ close:true,
+}
+
+let modalsShowSimple = {
+ bg:false,
+ close:false,
+}
+
+let modalOptionsDefault = {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: false,
+};
+
+let modalsCssDefaults = {
+ wrapper:'yat-modal-wrapper',
+ bg:'yat-modal-bg',
+ contentWrapper:'yat-modal-content-wrapper',
+ close: 'yat-modal-close',
+ header: 'yat-modal-header',
+ content: 'yat-modal-content',
+ actions: 'yat-modal-actions',
+ resolve: 'yat-modal-resolve',
+ reject: 'yat-modal-reject',
+}
+
+let modalsLabelsDefaults = {
+ close: '×',
+ resolve: 'ok',
+ reject: 'cancel'
+}
+
+let modalsTypes = {
+ full: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault,
+ },
+ simple: {
+ css: modalsCssDefaults,
+ show: modalsShowSimple,
+ labels: modalsLabelsDefaults,
+ options: modalOptionsDefault,
+ },
+ confirm: {
+ css: modalsCssDefaults,
+ show: modalsShowFull,
+ labels: modalsLabelsDefaults,
+ options: {
+ closeOnClickOutside: true,
+ closeOnPromise: true,
+ preventClose: false,
+ asPromise: true,
+ }
+ }
+}
+
+
+
+
+config.set('types.full', modalsTypes.full);
+config.set('types.simple', modalsTypes.simple);
+config.set('types.confirm', modalsTypes.confirm);
+
+config.set('defaultShow', modalsShowFull);
+config.set('defaultCss', modalsCssDefaults);
+config.set('defaultLabels', modalsLabelsDefaults);
+
+export default config;
diff --git a/src/singletons/modals/modalView.js b/src/singletons/modals/modalView.js
new file mode 100644
index 0000000..cf23257
--- /dev/null
+++ b/src/singletons/modals/modalView.js
@@ -0,0 +1,183 @@
+import _ from 'underscore';
+import config from './config';
+import Bb from 'backbone';
+import Mn from 'backbone.marionette';
+import YatView from './../../YatView.js';
+import mix from './../../helpers/mix';
+import OptionProperty from './../../mixins/get-option-property';
+let template = _.template(
+`<% if(show.bg) {%> data-role="modal-bg">
<% } %>
+ data-role="modal-content-wrapper">
+ <% if(show.close) {%>
<% } %>
+ <% if(show.header) {%>
data-role="modal-header"><%= header %><% } %>
+
data-role="modal-content"><%= text %>
+ <% if(show.actions) {%>
+
data-role="modal-actions">
+ <% if(show.resolve) {%><% } %>
+ <% if(show.reject) {%><% } %>
+
+ <% } %>
+
+`);
+
+
+
+const ModalView = mix(YatView).with(OptionProperty).extend({
+
+ renderOnReady: true,
+ template: template,
+
+ attributes(){
+ return {'data-role':'modal-wrapper'};
+ },
+
+ initialize(options){
+ this.mergeOptions(options, ['content', 'header', 'text']);
+
+ let _this = this;
+
+ if(this.getOption('asPromise') === true){
+ this.promise = new Promise(function(resolve, reject){
+ _this.once('resolve',(arg) => resolve(arg));
+ _this.once('reject',(arg) => reject(arg));
+ });
+ }
+
+ this.once('resolve reject',(arg, destroying) => {
+ this.preventClose = false;
+
+ if(this.getConfigValue('options','closeOnPromise') && !destroying){
+ this.destroy();
+ }
+ });
+
+ },
+
+ canBeClosed(){
+ return this.getConfigValue('options','preventClose') !== true;
+ },
+ destroy(opts = {}){
+
+ if(!this.canBeClosed() && opts.force !== true) return;
+
+ return YatView.prototype.destroy.apply(this, arguments);
+
+ },
+ ui:{
+ 'bg': '[data-role="modal-bg"]',
+ 'contentWrapper': '[data-role="modal-content-wrapper"]',
+ 'text':'[data-role="modal-content"]',
+ 'header':'[data-role="modal-header"]',
+ 'close':'[data-role="modal-close"]',
+ 'resolve':'[data-role="modal-resolve"]',
+ 'reject':'[data-role="modal-reject"]',
+ },
+ triggers:{
+ 'click @ui.close':{ event: 'click:close', stopPropagation: true },
+ 'click @ui.reject':{ event: 'click:reject', stopPropagation: true },
+ 'click @ui.resolve':{ event: 'click:resolve', stopPropagation: true },
+ 'click @ui.text':{ event: 'click:content', stopPropagation: true },
+ 'click @ui.contentWrapper': { event: 'click:content:wrapper', stopPropagation: true },
+ 'click @ui.bg':{ event: 'click:bg', stopPropagation: true },
+ 'click': { event: 'click:wrapper', stopPropagation: true },
+ },
+ regions:{
+ 'content':'[data-role="modal-content"]'
+ },
+ onBeforeDestroy(){
+ this.trigger('reject', this.getProperty('reject'), true);
+ },
+
+ onClickClose(){ this.destroy(); },
+
+ onClickResolve(){
+ this.trigger('resolve', this.getProperty('resolve'));
+ },
+ onClickReject(){
+ this.trigger('reject', this.getProperty('reject'));
+ },
+
+ onClickBg(){ this.clickedOutsideOfModal(); },
+ onClickWrapper(){ this.clickedOutsideOfModal(); },
+
+ clickedOutsideOfModal(){
+ if(this.getConfigValue('options','closeOnClickOutside') === true)
+ this.destroy();
+
+ },
+
+
+ onBeforeRender(){
+ //apply wrapper class here;
+ let cfg = this.getConfig();
+ cfg.css.wrapper && this.$el.addClass(cfg.css.wrapper);
+
+ this.$el.appendTo($('body'));
+ },
+ onRender(){
+ if(this.content instanceof Bb.View){
+ this.showChildView('content', this.content);
+ this.content.inModal = this;
+ }
+ },
+
+ _getModalOptions(){
+ let h = {};
+ if(this.getOption('closeOnClickOutside') != null)
+ h.closeOnClickOutside = this.getOption('closeOnClickOutside');
+ if(this.getOption('closeOnPromise') != null)
+ h.closeOnPromise = this.getOption('closeOnPromise');
+ if(this.getOption('preventClose') != null)
+ h.preventClose = this.getOption('preventClose');
+ if(this.getOption('asPromise') != null)
+ h.asPromise = this.getOption('asPromise');
+
+ return h;
+ },
+ getConfigValue(section, name){
+ let cfg = this.getConfig() || {};
+ return (cfg[section] || {})[name];
+ },
+ getConfig(key){
+ if(this.config) return this.config;
+
+ let typeName = this.getOption('type') || 'simple';
+ let type = _.extend({},config.get('types.' + typeName) || {});
+
+ type.show = _.extend({}, config.get('dafaultShow'), type.show, this.getOption('show'));
+ type.labels = _.extend({}, config.get('defaultLabels'), type.labels, this.getOption('labels'));
+ type.css= _.extend({}, config.get('defaultCss'), type.css, this.getOption('css'));
+
+ type.options = _.extend({}, config.get('defaultOptions'), type.options, this._getModalOptions());
+
+ if(type.show.header == null && this.getOption('header'))
+ type.show.header = true;
+
+ if(type.show.resolve == null && (this.getOption('resolve') || type.options.asPromise))
+ type.show.resolve = true;
+ if(type.show.reject == null && this.getOption('reject'))
+ type.show.reject = true;
+
+ if(type.show.actions == null && (type.show.resolve || type.show.reject))
+ type.show.actions = true;
+
+ return this.config = type;
+ },
+
+ templateContext(){
+ let cfg = this.getConfig();
+ return {
+ css(name){
+ return cfg.css[name] ? ` class="${cfg.css[name]}"` : '';
+ },
+ label(name){
+ return cfg.labels[name] || '';
+ },
+ show : cfg.show,
+ text: this.getOption('text'),
+ header: this.getOption('header'),
+ }
+ }
+});
+
+export default ModalView;
diff --git a/src/singletons/modals/modals.js b/src/singletons/modals/modals.js
new file mode 100644
index 0000000..2056fc9
--- /dev/null
+++ b/src/singletons/modals/modals.js
@@ -0,0 +1,129 @@
+import $ from 'jquery';
+import _ from 'underscore';
+import Bb from 'backbone';
+import mixin from './../../helpers/mix.js';
+import YatObject from './../../YatObject.js';
+import Stateable from './../../mixins/stateable.js';
+import YatError from './../../YatError.js';
+import View from './../../YatView.js';
+import __ from './../../functions/common/common.js';
+import ModalView from './modalView';
+import config from './config';
+
+let ModalEngine = mixin(YatObject).with(Stateable).extend({
+ constructor(...args){
+ this.modals = [];
+ YatObject.apply(this, args);
+ this.listenForEsc = _.bind(this._listenForEsc, this);
+ $(() => {
+ this.doc = $(document);
+ this.doc.on('keyup', this.listenForEsc);
+ });
+ },
+ channelName:'modals',
+
+ show(...args){
+ let options = this._normalizeArguments(...args);
+ return this._create(options);
+ },
+ remove(modal){
+
+ if(!modal)
+ modal = _.last(this.modals);
+
+ modal && modal.destroy();
+ },
+
+ _listenForEsc(e){
+ if(e.keyCode !== 27) return;
+
+ if(this.modals.length)
+ this.remove();
+ },
+ _create(options){
+ let modal = new ModalView(options);
+ let _this = this;
+ this.listenToOnce(modal, 'destroy', function(){ _this._remove(modal); })
+ this.modals.push(modal);
+ return modal;
+ },
+ _remove(modal){
+
+ if(!modal) return;
+
+ let ind = this.modals.indexOf(modal);
+ if(ind > -1) this.modals.splice(ind, 1);
+
+ this.stopListening(modal);
+
+ },
+ _normalizeArguments(...args){
+
+ let options = {};
+ let len = args.length;
+ if(!len)
+ return;
+
+ if(len === 1){
+ if(__.isView(args[0]))
+ options.content = args[0];
+ else if(_.isString(args[0]))
+ options.text = args[0];
+ else if(_.isObject(args[0]))
+ _.extend(options, args[0]);
+ } else if (len === 2){
+ if(_.isString(args[0]) && _.isString(args[1])){
+ options.header = args[0];
+ options.text = args[1];
+ }else if(_.isString(args[0]) && __.isView(args[1])){
+ options.header = args[0];
+ options.content = args[1];
+ }else if(_.isString(args[1]) && __.isView(args[0])){
+ options.header = args[1];
+ options.content = args[0];
+ }else if(_.isString(args[0]) && _.isObject(args[1])){
+ _.extend(options, args[1]);
+ if(__.isView(options.content))
+ options.header = args[0];
+ else
+ options.text = args[0];
+ }else if(__.isView(args[0]) && _.isObject(args[1])){
+ _.extend(options, args[1]);
+ options.content = args[0];
+ }
+ } else {
+ if(_.isObject(args[3]))
+ _.extend(options, args[3]);
+ if(_.isObject(args[2]))
+ _.extend(options, args[2]);
+ else if(_.isString(args[2]))
+ options.type = args[2];
+
+ let two = this._normalizeArguments(args[0], args[1]);
+ _.extend(options, two);
+ }
+
+ return options;
+ },
+ onBeforeDestroy(){
+ if(this.doc)
+ this.doc.off('keyup',this.listenForEsc);
+ }
+});
+
+const modalEngine = new ModalEngine();
+
+
+export default {
+ show(...args){
+ return modalEngine.show(...args);
+ },
+ addTypeConfig(name, cfg){
+ if(!name || !_.isString(name)) return;
+ config.set('types.'+name,cfg);
+ },
+ getTypeConfig(name){
+ if(!name || !_.isString(name)) return;
+ return config.get('types.'+name);
+ },
+};
diff --git a/src/singletons/singletons.js b/src/singletons/singletons.js
new file mode 100644
index 0000000..ada962a
--- /dev/null
+++ b/src/singletons/singletons.js
@@ -0,0 +1,4 @@
+import TemplateContext from './template-context';
+import identity from './identity';
+import modals from './modals/modals';
+export default { TemplateContext, identity, modals };
diff --git a/src/singletons/template-context.js b/src/singletons/template-context.js
new file mode 100644
index 0000000..b2a4f5b
--- /dev/null
+++ b/src/singletons/template-context.js
@@ -0,0 +1,77 @@
+import _ from 'underscore';
+import cid from '../functions/common/wrap';
+let templateContextStore = [(view) => {
+ return {
+ _v: view,
+ _m: view.model || {},
+ _cid: (arg) => cid(view.cid, arg)
+ }
+}];
+let compiledContext = {}; //rethink how it can be used
+let hasChanges = false;
+
+function normalizeValue(value, ...args){
+ if(_.isFunction(value))
+ return value(...args);
+ else if(_.isObject(value))
+ return value;
+ else
+ return {};
+}
+
+const GlobalTemplateContext = {
+ mix(viewTemplateContext, ...args){
+ let global = this.get(...args);
+ return _.extend(global, viewTemplateContext);
+ },
+ get(...args){
+ return this.compile(...args);
+ },
+ add(...args){
+ _(args).each((item) => this.push(item));
+ },
+
+ compile(...args){
+
+ if(hasChanges)
+ compiledContext = {};
+
+ let newcontext = {};
+
+ _(templateContextStore).each((cntx) => {
+ if(_.isFunction(cntx))
+ _.extend(newcontext, normalizeValue(cntx, ...args));
+ else if(hasChanges){
+ _.extend(compiledContext, cntx);
+ }
+ });
+ if(!hasChanges)
+ _.extend(newcontext, compiledContext);
+
+ hasChanges = false;
+ return newcontext;
+ },
+ pop(){
+ hasChanges = true;
+ return templateContextStore.pop();
+ },
+ shift(){
+ hasChanges = true;
+ return templateContextStore.shift();
+ },
+ push(item){
+ hasChanges = true;
+ templateContextStore.push(item);
+ },
+ unshift(item){
+ hasChanges = true;
+ templateContextStore.unshift(item);
+ },
+ clear(){
+ hasChanges = false;
+ compiledContext = {};
+ templateContextStore = [];
+ },
+}
+
+export default GlobalTemplateContext;
diff --git a/test/.eslintrc b/test/.eslintrc
index 6f58cb0..09e0892 100644
--- a/test/.eslintrc
+++ b/test/.eslintrc
@@ -1,13 +1,17 @@
{
- "extends": ["../.eslintrc", "./.globals.json"],
- "env": {
- "mocha": true
+ "extends": "./setup/.globals.json",
+ "parserOptions": {
+ "ecmaVersion": 6,
+ "sourceType": "module"
},
"rules": {
- "object-shorthand": 0,
- "one-var": [ 2, "never" ],
- "new-cap": 0,
- "no-new": 0,
- "no-console": 0
+ "strict": 0,
+ "quotes": [2, "single"],
+ "no-unused-expressions": 0
+ },
+ "env": {
+ "browser": true,
+ "node": true,
+ "mocha": true
}
}
diff --git a/test/.globals.json b/test/.globals.json
deleted file mode 100644
index a8d74df..0000000
--- a/test/.globals.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "globals": {
- "chai": true,
- "sinon": true,
- "spy": true,
- "expect": true,
- "_": true
- }
-}
diff --git a/test/.mocharc.json b/test/.mocharc.json
deleted file mode 100644
index baa1317..0000000
--- a/test/.mocharc.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "checkLeaks": true,
- "file": "./test/setup.node.js",
- "recursive": true,
- "reporter": "dot",
- "require": "@babel/register",
- "spec": "./test/unit/",
- "ui": "bdd"
-}
diff --git a/test/runner.html b/test/runner.html
new file mode 100644
index 0000000..371619b
--- /dev/null
+++ b/test/runner.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/setup.node.js b/test/setup.node.js
deleted file mode 100644
index 491342d..0000000
--- a/test/setup.node.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const _ = require('underscore');
-const chai = require('chai');
-const sinon = require('sinon');
-const sinonChai = require('sinon-chai');
-const chaiPromise = require('chai-as-promised');
-const jsdom = require('jsdom');
-const { JSDOM } = jsdom;
-const dom = new JSDOM(' ');
-global.window = dom.window;
-global.document = dom.window.document;
-
-chai.use(chaiPromise);
-chai.use(sinonChai);
-
-global.chai = chai;
-global.sinon = sinon;
-
-global._ = _;
-
-global.expect = global.chai.expect;
-
-beforeEach(function() {
- this.sinon = global.sinon.createSandbox();
-});
-
-afterEach(function() {
- this.sinon.restore();
-});
diff --git a/test/setup/.globals.json b/test/setup/.globals.json
new file mode 100644
index 0000000..437436b
--- /dev/null
+++ b/test/setup/.globals.json
@@ -0,0 +1,12 @@
+{
+ "globals": {
+ "expect": true,
+ "mock": true,
+ "sandbox": true,
+ "spy": true,
+ "stub": true,
+ "useFakeServer": true,
+ "useFakeTimers": true,
+ "useFakeXMLHttpRequest": true
+ }
+}
diff --git a/test/setup/browser.js b/test/setup/browser.js
new file mode 100644
index 0000000..4d55281
--- /dev/null
+++ b/test/setup/browser.js
@@ -0,0 +1,9 @@
+var mochaGlobals = require('./.globals.json').globals;
+
+window.mocha.setup('bdd');
+window.onload = function() {
+ window.mocha.checkLeaks();
+ window.mocha.globals(Object.keys(mochaGlobals));
+ window.mocha.run();
+ require('./setup')(window);
+};
diff --git a/test/setup/node.js b/test/setup/node.js
new file mode 100644
index 0000000..309818d
--- /dev/null
+++ b/test/setup/node.js
@@ -0,0 +1,24 @@
+global.chai = require('chai');
+global.sinon = require('sinon');
+global.chai.use(require('sinon-chai'));
+
+require('babel-core/register');
+require('./setup')();
+
+/*
+ Uncomment the following if your library uses features of the DOM,
+ for example if writing a jQuery extension, and
+ add 'simple-jsdom' to the `devDependencies` of your package.json
+
+ Note that JSDom doesn't implement the entire DOM API. If you're using
+ more advanced or experimental features, you may need to switch to
+ PhantomJS. Setting that up is currently outside of the scope of this
+ boilerplate.
+*/
+// var simpleJSDom = require('simple-jsdom');
+// simpleJSDom.install();
+const jsdom = require('jsdom');
+const { JSDOM } = jsdom;
+const { window } = new JSDOM('');
+global.window = window;
+global.document = window.document;
diff --git a/test/setup/setup.js b/test/setup/setup.js
new file mode 100644
index 0000000..df276cb
--- /dev/null
+++ b/test/setup/setup.js
@@ -0,0 +1,22 @@
+module.exports = function(root) {
+ root = root ? root : global;
+ root.expect = root.chai.expect;
+
+ beforeEach(() => {
+ // Using these globally-available Sinon features is preferrable, as they're
+ // automatically restored for you in the subsequent `afterEach`
+ root.sandbox = root.sinon.sandbox.create();
+ root.stub = root.sandbox.stub.bind(root.sandbox);
+ root.spy = root.sandbox.spy.bind(root.sandbox);
+ root.mock = root.sandbox.mock.bind(root.sandbox);
+ root.useFakeTimers = root.sandbox.useFakeTimers.bind(root.sandbox);
+ root.useFakeXMLHttpRequest = root.sandbox.useFakeXMLHttpRequest.bind(root.sandbox);
+ root.useFakeServer = root.sandbox.useFakeServer.bind(root.sandbox);
+ });
+
+ afterEach(() => {
+ delete root.stub;
+ delete root.spy;
+ root.sandbox.restore();
+ });
+};
diff --git a/test/unit/YatApp.js b/test/unit/YatApp.js
new file mode 100644
index 0000000..1c0d7d8
--- /dev/null
+++ b/test/unit/YatApp.js
@@ -0,0 +1,7 @@
+import YatApp from '../../src/YatApp';
+
+describe('YatApp', () => {
+
+
+
+});
\ No newline at end of file
diff --git a/test/unit/coms/control.js b/test/unit/coms/control.js
deleted file mode 100644
index 6198781..0000000
--- a/test/unit/coms/control.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import Control from '../../../coms/controls/control';
-
-describe('Control', function() {
- describe('when initialized', function() {
- let control;
- beforeEach(function() {
- control = new Control({ value: 'initial' });
- });
- it('should fill value when initialized with value', async function() {
- expect(control.getValue()).be.equal('initial');
- });
- it('should fill initialValue when initialized with value', async function() {
- expect(control.getValue({ type: 'initial' })).be.equal('initial');
- });
- it('should fill initialValue when initialized with initialValue', async function() {
- control = new Control({ initialValue: 'annushka'})
- expect(control.getValue({ type: 'initial' })).be.equal('annushka');
- });
- it('should fill resetValue when initialized with resetValue', async function() {
- control = new Control({ resetValue: 'gorbun'})
- expect(control.getValue({ type: 'reset' })).be.equal('gorbun');
- });
- });
- describe('when value setted', function() {
- let control;
- let onChange;
- let onValid;
- let onInvalid;
- let onDone;
- beforeEach(function() {
- onChange = this.sinon.stub();
- onValid = this.sinon.stub();
- onDone = this.sinon.stub();
- onInvalid = this.sinon.stub();
- control = new Control({ onChange, onValid, onInvalid, onDone });
- });
- it('should fill value with a given value', async function() {
- await control.setValue('krokodil');
- expect(control.getValue()).be.equal('krokodil');
- });
- it('should set ket value with a given key value', async function() {
- await control.setKeyValue('foo','krokodil');
- expect(control.getValue()).be.an('object').and.have.property('foo', 'krokodil');
- });
- it('should merge value with a given object value', async function() {
- await control.mergeValue({ foo: 'krokodil', bar: 'panda' });
- expect(control.getValue()).to.have.property('foo', 'krokodil');
- expect(control.getValue()).to.have.property('bar', 'panda');
- });
- it('should trigger valid and change by default', async function() {
- await control.setValue('krokodil');
- expect(onValid).calledOnce;
- expect(onChange).calledOnce.and.calledAfter(onValid);
- });
- it('should trigger valid and done if changeEvent is done', async function() {
- await control.setValue('krokodil', { changeEvent: 'done' });
- expect(onValid).calledOnce;
- expect(onDone).calledOnce.and.calledAfter(onValid);
- });
- });
- describe('with children', function() {
- let control;
- let childOne;
- let childTwo;
- let onChange;
- beforeEach(function() {
- onChange = this.sinon.stub();
- control = new Control({ onChange });
- childOne = new Control();
- childTwo = new Control();
- control.addChildControl(childOne, { key: 'foo' });
- control.addChildControl(childTwo, { wrapper: true });
- });
-
- it('should return true in hasChildren', function() {
- expect(control.hasChildren()).to.be.true;
- });
-
- it('should update key value when child control changes', async function() {
- await childOne.setValue('baraban');
- expect(control.getValue()).to.have.property('foo', 'baraban');
- });
-
- it('should update properties when wrapped child changes', async function() {
- await childTwo.mergeValue({ bar: 'triangle', baz: 'plate' });
- let value = control.getValue();
- expect(value).to.have.property('bar', 'triangle');
- expect(value).to.have.property('baz', 'plate');
- });
-
- it('should trigger change when child control changes', async function() {
- await childTwo.mergeValue({ bar: 'triangle', baz: 'plate' });
- expect(onChange).to.be.calledOnce;
- });
-
- });
-});
diff --git a/test/unit/coms/lifecycle.spec.js b/test/unit/coms/lifecycle.spec.js
deleted file mode 100644
index 68e3da6..0000000
--- a/test/unit/coms/lifecycle.spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import { Lifecycle } from '../../../coms/lifecycle';
-import { startableMixin } from '../../../coms/startable';
-import { MnObject } from 'backbone.marionette';
-
-describe('lifecycle', function() {
- it('test', function() {
- const context = new MnObject({
- async onBeforeStart() {
- return new Promise((res, rej) => {
- rej('joppa');
- });
- }
- });
- context.on('all', c => console.log(' ', c));
- let isNotAvailable = () => {
- new Promise((res, rej) => {
- setTimeout(() => { res('no!'); }, 500)
- });
- //return 'something';
- }
- let onBeforeStart = () => {
- let p = new Promise((res, rej) => {
- setTimeout(() => {
- res('achtung');
- }, 500);
- });
- return p;
- }
- let lf = new Lifecycle({ name: 'start', context, isNotAvailable, onBefore: onBeforeStart });
- lf.on('all', console.log);
- //let res = lf.start();
-
- expect(1).to.be.equal(1);
- //return expect(res).to.eventually.be.true;
-
- });
-});
-
-describe('startable', function() {
- const App = startableMixin(MnObject);
- it('test', async function() {
- let app = new App();
- // app.on('all', console.log);
- // let r = await app.start();
- // console.log('**',app.stateModel.state('start-state'));
- // expect(app.isStarted()).to.be.true;
- })
-});
diff --git a/test/unit/functions/common/get-set-by-path.js b/test/unit/functions/common/get-set-by-path.js
new file mode 100644
index 0000000..dae3aef
--- /dev/null
+++ b/test/unit/functions/common/get-set-by-path.js
@@ -0,0 +1,164 @@
+import _ from 'underscore';
+import Bb from 'backbone';
+import YatObject from '~/src/YatObject';
+import mix from '~/src/helpers/mix.js';
+import cmn from '~/src/functions/common/common';
+import getProperty from '~/src/functions/common/set-get-by-path/_get-property';
+import getByPathArray from '~/src/functions/common/set-get-by-path/_get-by-path-array';
+
+let getByPath = cmn.getByPath;
+let setByPath = cmn.setByPath;
+
+let Obj = YatObject.extend({
+ initialize(){
+ //console.log(this.getName());
+ }
+});
+
+describe('common functions getByPath and setByPath', function(){
+ describe('getByPath',() =>{
+ let test = {
+ '123':123,
+ 234:234,
+ path1:{
+ inside: 'i am inside',
+ 345:'hello'
+ },
+ 2:{
+ 3:'nice try'
+ }
+ }
+ it('should return undefined if context is not an object',()=>{
+ expect(getByPath(undefined,'test')).to.be.equal(undefined);
+ expect(getByPath(null,'test')).to.be.equal(undefined);
+ expect(getByPath(123,'test')).to.be.equal(undefined);
+ expect(getByPath('asd','test')).to.be.equal(undefined);
+ });
+ it('should return undefined if path is empty or undefined',()=>{
+ expect(getByPath(test, '')).to.be.equal(undefined);
+ expect(getByPath(test, undefined)).to.be.equal(undefined);
+ expect(getByPath(test, null)).to.be.equal(undefined);
+ expect(getByPath(test, 'path1.')).to.be.equal(undefined);
+ });
+ it('should return undefined if path is not found',()=>{
+ expect(getByPath(test, 'abc')).to.be.equal(undefined);
+ expect(getByPath(test, 'path1.shminside')).to.be.equal(undefined);
+ expect(getByPath(test, [])).to.be.equal(undefined);
+ expect(getByPath(test, [4,5])).to.be.equal(undefined);
+ });
+ it('should return context value if path is found',()=>{
+ expect(getByPath(test, '123')).to.be.equal(123);
+ expect(getByPath(test, 234)).to.be.equal(234);
+ expect(getByPath(test, 'path1.inside')).to.be.equal('i am inside');
+ expect(getByPath(test, [2,3])).to.be.equal('nice try');
+ });
+
+ });
+ describe('setByPath',() =>{
+ let test = {};
+ let model = new Bb.Model();
+ let model2 = new Bb.Model();
+ model.on('all',(name) => {
+ console.log('\r===');
+ console.log(name)
+ console.log('---');
+ });
+ it('should return undefined if context is not an object',()=>{
+ expect(setByPath(undefined,'test')).to.be.equal(undefined);
+ expect(setByPath(null,'test')).to.be.equal(undefined);
+ expect(setByPath(123,'test')).to.be.equal(undefined);
+ expect(setByPath('asd','test')).to.be.equal(undefined);
+ });
+ it('should return undefined if path is empty or undefined',()=>{
+ expect(setByPath(test, '')).to.be.equal(undefined);
+ expect(setByPath(test, undefined)).to.be.equal(undefined);
+ expect(setByPath(test, null)).to.be.equal(undefined);
+ expect(setByPath(test, 'path1.')).to.be.equal(undefined);
+ });
+ it('should return settled value', () => {
+ //setByPath(test, 'test', model);
+ //setByPath(test, 'test.shmest.brest', model2);
+ expect(setByPath(test, 'path1.asd', 'yes')).to.be.equal('yes');
+ });
+
+
+ describe('setByPath with backbone models', () => {
+ const Model = Bb.Model.extend({
+ initialize(attr, opts){
+ this.on('change', function(){ this.onChange(); }, this);
+ this.on('change:test', function(){ this.onChangeTest(); }, this);
+ this.on('change:test:test', function(){ this.onChangeTestTest(); }, this);
+ this.on('change:test:test:test', function(){ this.onChangeTestTestTest(); }, this);
+ },
+ onChange: function(){ },
+ onChangeTest: function(){ },
+ onChangeTestTest: function(){ },
+ onChangeTestTestTest: function(){ },
+ });
+ beforeEach(function() {
+ let model = this.model = new Model();
+ spy(model,'onChange');
+ spy(model,'onChangeTest');
+ spy(model,'onChangeTestTest');
+ spy(model,'onChangeTestTestTest');
+
+ let model2 = this.model2 = new Model();
+ spy(model2,'onChange');
+ spy(model2,'onChangeTest');
+ spy(model2,'onChangeTestTest');
+ spy(model2,'onChangeTestTestTest');
+ });
+ it('should trigger change, change:[attribute] event if a context is backbone model',function(){
+
+ setByPath(this.model,'test','test value');
+ expect(this.model.onChange).to.have.been.calledOnce;
+ expect(this.model.onChangeTest).to.have.been.calledOnce;
+ });
+ it('should trigger change, change:[attribute:attribute] event if a context is backbone model',function(){
+
+ setByPath(this.model,'test.test','test value');
+ expect(this.model.onChange).to.have.been.calledOnce;
+ expect(this.model.onChangeTestTest).to.have.been.calledOnce;
+ });
+ it('should trigger change, change:[attribute] event on a nested model if it is backbone model',function(){
+
+ let test = {};
+ setByPath(test,'test',this.model);
+ setByPath(test,'test.test','new value');
+ expect(this.model.onChange).to.have.been.calledOnce;
+ expect(this.model.onChangeTest).to.have.been.calledOnce;
+ });
+ it('should trigger change, change:[attribute] event on all nested models',function(){
+
+ let test = {};
+ setByPath(this.model,'test.test',this.model2);
+ setByPath(this.model,'test.test.test','new value');
+ expect(this.model.onChange).to.have.been.calledTwice;
+ expect(this.model.onChangeTestTest).to.have.been.calledOnce;
+ expect(this.model.onChangeTestTestTest).to.have.been.calledOnce;
+ expect(this.model2.onChange).to.have.been.calledOnce;
+ expect(this.model2.onChangeTest).to.have.been.calledOnce;
+ });
+ it('should create normal backbone model property',() => {
+ let obj = {};
+ let model = new Model();
+ let model2 = new Model();
+ setByPath(model, 'textfield','text value');
+ setByPath(model, 'nested.value',123);
+ setByPath(model, 'another',model2);
+ setByPath(obj, 'm', model);
+ setByPath(obj,'m.another.deep.num',100);
+
+ expect(model.get('textfield')).to.be.equal('text value');
+ expect(model.get('nested').value).to.be.equal(123);
+ expect(model.get('another')).to.be.equal(model2);
+ expect(obj.m).to.be.equal(model);
+ expect(obj.m.get('another').get('deep').num).to.be.equal(100);
+
+ });
+ });
+
+
+ });
+
+});
diff --git a/test/unit/helpers/mix.js b/test/unit/helpers/mix.js
new file mode 100644
index 0000000..beb02d4
--- /dev/null
+++ b/test/unit/helpers/mix.js
@@ -0,0 +1,78 @@
+import mix from '../../../src/helpers/mix.js';
+import _ from 'underscore'
+
+describe('mix', function(){
+ describe('mix(something)',() => {
+ let hashA = {a:1};
+ let hashB = {b:2};
+ let classA = function(){ this.c = 3 };
+
+ let mixResult = mix(hashA);
+ let mixResultCls = mix(classA);
+
+ it('should return wrapper object',() => {
+ expect(mixResult).to.be.an('object');
+ });
+ it('should has `class` property',() => {
+ expect(mixResult).to.have.property('class');
+ });
+ it('should has `with` method',() => {
+ expect(mixResult.with).to.be.a('function');
+ });
+
+ it('if `something` is object then `class` property should be a class extended by `something`',() => {
+ expect(mixResult.class).to.be.a('function');
+ expect(mixResult.class.prototype).to.have.property('a');
+ });
+
+ it('Class definition returned by `class` should have static extend method if `something` is an object', () => {
+ expect(mixResult.class).to.have.property('extend');
+ expect(mixResult.class.extend).to.be.a('function');
+ });
+
+ it('if `something` is a class then `class` property should be a class derived from something',() => {
+ expect(mixResultCls.class).to.be.a('function');
+ expect(mixResultCls.class.prototype).to.be.instanceof(classA);
+ });
+
+ });
+ describe('mix(something).with(object, object)',() => {
+ let hashA = {a:1, b:1, c:1, d:1};
+ let hashB = {b:2};
+ let hashC = {c:3, d:3};
+ let Test = mix(hashA).with(hashB, hashC).extend({
+ d:4
+ });
+ let test = new Test();
+ it('should mix all properites in left to right order', () => {
+ expect(test).to.have.property('a',1);
+ expect(test).to.have.property('b',2);
+ expect(test).to.have.property('c',3);
+ expect(test).to.have.property('d',4);
+ });
+ });
+ describe('mix(Class).with(mixinFunc1, mixinFunc2)',() => {
+ let hashA = {a:5};
+ let mixin1 = (Base) => Base.extend({m1:1, m2:1},{staticM1:1, staticM2:1});
+ let mixin2 = (Base) => Base.extend({m2:2},{staticM2:2});
+ let Class = function(){this.m0 = 0};
+ Class.staticM0 = 0;
+ let Test = mix(Class).with(mixin1, hashA, mixin2);
+ let test = new Test();
+ it('should mix all properites in left to right order from mixins', () => {
+ expect(test).to.have.property('m1',1);
+ expect(test).to.have.property('m2',2);
+ });
+ it('should mix object properties too', () => {
+ expect(test).to.have.property('a',5);
+ });
+ it('should mix static fields', () => {
+ expect(Test).to.have.property('staticM0',0);
+ expect(Test).to.have.property('staticM1',1);
+ expect(Test).to.have.property('staticM2',2);
+ });
+ it('should be instance of Base class',() => {
+ expect(test).to.be.instanceof(Class);
+ });
+ });
+});
diff --git a/test/unit/helpers/mixin.js b/test/unit/helpers/mixin.js
new file mode 100644
index 0000000..e438670
--- /dev/null
+++ b/test/unit/helpers/mixin.js
@@ -0,0 +1,77 @@
+import mixin from '../../../src/helpers/mixin.js';
+
+const hashMixin = {
+ test(){
+ return 'hashMixin:test';
+ }
+}
+const hashMixin2 = {
+ test2(){
+ return 'hashMixin2:test';
+ }
+}
+const classMixin = (Base) => class extends Base {
+ constructor(){
+ super();
+ this.mixinInitialized = true;
+ }
+ test(){
+ return 'classMixin:test';
+ }
+ test2(){
+ return 'classMixin:test2';
+ }
+ test3(){
+ return 'classMixin:test3';
+ }
+}
+
+class BaseClass {
+ test() {
+ return 'baseClass:test'
+ }
+}
+
+
+describe('mixin', function(){
+ beforeEach(() => {
+ this.TestClass = class extends mixin(BaseClass).with(hashMixin, hashMixin2, classMixin){
+ test(){
+ return 'testClass:test';
+ }
+ }
+ });
+ describe('Mixined Class definition', () => {
+ it('should return class after mixins', () => {
+ expect(this.TestClass).to.be.a('function');
+ });
+ it('instance should be an instance of BaseClass', () => {
+ expect(new this.TestClass() instanceof BaseClass).to.be.equal(true);
+ });
+ });
+
+ describe('Mixined instance', () => {
+ beforeEach(() => {
+ this.myTestObject = new this.TestClass();
+ });
+
+ it('own properties should override mixins ones', () => {
+ expect(this.myTestObject.test()).to.be.equal('testClass:test');
+ });
+
+ it('should have mixins properties', () => {
+ expect(this.myTestObject.test2).to.be.a('function');
+ });
+
+ it('check for function mixin', () => {
+ expect(this.myTestObject.mixinInitialized).to.be.equal(true);
+ });
+
+ it('last mixin in chain should override previous', () => {
+ expect(this.myTestObject.test2()).to.be.equal('classMixin:test2');
+ });
+
+ });
+
+
+});
diff --git a/test/unit/marionette.yat.js b/test/unit/marionette.yat.js
new file mode 100644
index 0000000..d7cbef9
--- /dev/null
+++ b/test/unit/marionette.yat.js
@@ -0,0 +1,18 @@
+import marionetteYat from '../../src/marionette.yat';
+
+// describe('marionetteYat', () => {
+// describe('Greet function', () => {
+// beforeEach(() => {
+// spy(marionetteYat, 'greet');
+// marionetteYat.greet();
+// });
+
+// it('should have been run once', () => {
+// expect(marionetteYat.greet).to.have.been.calledOnce;
+// });
+
+// it('should have always returned hello', () => {
+// expect(marionetteYat.greet).to.have.always.returned('hello');
+// });
+// });
+// });
diff --git a/test/unit/mixins/childrenable.js b/test/unit/mixins/childrenable.js
new file mode 100644
index 0000000..88533d4
--- /dev/null
+++ b/test/unit/mixins/childrenable.js
@@ -0,0 +1,52 @@
+import _ from 'underscore';
+import YatObject from '../../../src/YatObject';
+import mixin from '../../../src/helpers/mixin.js';
+import Childrenable from '../../../src/mixins/childrenable.js';
+
+let Obj = YatObject.extend({
+ initialize(){
+ //console.log(this.getName());
+ }
+});
+
+class BaseTestClass extends mixin(Obj).with(Childrenable){
+ constructor(...args){ super(...args); }
+}
+
+const ChildClass$1 = BaseTestClass.extend({
+ name:'child $1',
+});
+
+const ChildClass$2 = BaseTestClass.extend({
+ name:'child $2',
+ children(){
+ return [ChildClass$1.extend({name:undefined}),ChildClass$1.extend({name:undefined})]
+ }
+});
+
+
+const RootClass = BaseTestClass.extend({
+ name:'root',
+ children(){
+ return [ChildClass$1, ChildClass$2, () => { return BaseTestClass.extend({name:'child $3'}) }];
+ }
+});
+
+describe('Childrenable mixin', function(){
+ describe('Childrenable class',() =>{
+ it('extended Childrenable should have static Childrenable field equal to true',()=>{
+ expect(ChildClass$1.Childrenable).to.be.equal(true);
+ });
+ });
+ describe('Childrenable instance',() =>{
+
+ const root = new RootClass();
+
+ it('on initialize should initialize childrens and `hasChildren` should return true', () => {
+ expect(root.hasChildren()).to.be.equal(true);
+ });
+
+
+ });
+
+});
\ No newline at end of file
diff --git a/test/unit/mixins/get-name-label.js b/test/unit/mixins/get-name-label.js
new file mode 100644
index 0000000..59ed265
--- /dev/null
+++ b/test/unit/mixins/get-name-label.js
@@ -0,0 +1,22 @@
+import Mn from 'backbone.marionette';
+import mixin from '../../../src/helpers/mix.js';
+import GetNameLabel from '../../../src/mixins/get-name-label.js';
+
+
+
+describe('get-name-label mixin', function(){
+
+
+
+ describe('exclude', () => {
+ let TestClass = mixin(Mn.Object).with(GetNameLabel).extend({
+ });
+ let test = new TestClass({});
+ it('should return cid if there is nothing to return', () => {
+ expect(test.getLabel()).to.be.equal(test.cid);
+ });
+
+ });
+
+
+});
diff --git a/test/unit/mixins/get-option-property.js b/test/unit/mixins/get-option-property.js
new file mode 100644
index 0000000..850b640
--- /dev/null
+++ b/test/unit/mixins/get-option-property.js
@@ -0,0 +1,109 @@
+import Mn from 'backbone.marionette';
+import mixin from '../../../src/helpers/mix.js';
+import GetOptionProperty from '../../../src/mixins/get-option-property.js';
+
+// class TestClass extends mixin(Mn.Object).with(GetOptionProperty){
+// constructor(...args){
+// super(...args);
+// this.prop0 = 111;
+// this.prop1 = 12;
+// this.prop3 = 'instance';
+// }
+// prop2(){
+// return this.getProperty('prop0') + this.getProperty('prop1');
+// }
+// }
+let testFunc1 = () => 'from function';
+let testFunc2 = () => 'from function in options';
+let TestClass = mixin(Mn.Object).with(GetOptionProperty).extend({
+ propertyValue: 'instance',
+ propertyFunction: testFunc1,
+ propertyClass: Mn.Object,
+ propertyFunction2: (a,b) => 'from function' + a + '-' + b,
+});
+
+
+describe('get-option-property mixin', function(){
+
+
+ let test = new TestClass({
+ propertyValue: 'options',
+ propertyFunction: testFunc2,
+ optionsFunction: testFunc2,
+ additional:'additional'
+ });
+
+ describe('getProperty', () => {
+ it('should return instance property if its exists', () => {
+ expect(test.getProperty('propertyValue')).to.be.equal('instance');
+ });
+ it('should return options property if instance property is not exists', () => {
+ expect(test.getProperty('additional')).to.be.equal('additional');
+ });
+
+ it('should return function value if instance property is a function', () => {
+ expect(test.getProperty('propertyFunction')).to.be.equal('from function');
+ });
+ it('should return function value if instance property is undefined and options value is a function', () => {
+ expect(test.getProperty('optionsFunction')).to.be.equal('from function in options');
+ });
+
+ it('should return class definition if instance property is a class definition', () => {
+ expect(test.getProperty('propertyClass')).to.be.equal(Mn.Object);
+ });
+
+
+ it('should return function if instance property is a function and force option is false', () => {
+ expect(test.getProperty('propertyFunction',{force:false})).to.be.equal(testFunc1);
+ });
+ it('should return undefined if instance property is not set and deep option is false', () => {
+ expect(test.getProperty('additional',{deep:false})).to.be.equal(undefined);
+ });
+ it('should pass arguments if property is a function and args option is set', () => {
+ expect(test.getProperty('propertyFunction2',{args:['a','b']})).to.be.equal('from functiona-b');
+ });
+ it('should return default value if properties values undefined and default option is set', () => {
+ expect(test.getProperty('not-exists-property',{default:'default value'})).to.be.equal('default value');
+ });
+
+
+ });
+
+ describe('getOption', () => {
+ it('should return options property if its exists', () => {
+ expect(test.getOption('propertyValue')).to.be.equal('options');
+ });
+ it('should return instance property if options property is not exists', () => {
+ expect(test.getOption('propertyFunction2',{args:['','']})).to.be.equal('from function-');
+ });
+
+ it('should return function value if options property is a function', () => {
+ expect(test.getOption('optionsFunction')).to.be.equal('from function in options');
+ });
+
+ it('should return function value if options property is undefined and instance property value is a function', () => {
+ expect(test.getOption('propertyFunction2',{args:['','']})).to.be.equal('from function-');
+ });
+
+ it('should return class definition if options property is a class definition', () => {
+ expect(test.getOption('propertyClass')).to.be.equal(Mn.Object);
+ });
+
+
+ it('should return function if options property is a function and force option is false', () => {
+ expect(test.getOption('optionsFunction',{force:false})).to.be.equal(testFunc2);
+ });
+ it('should return undefined if options property is not set and deep option is false', () => {
+ expect(test.getOption('go-go-go',{deep:false})).to.be.equal(undefined);
+ });
+ it('should pass arguments if property is a function and args option is set', () => {
+ expect(test.getOption('propertyFunction2',{args:['','']})).to.be.equal('from function-');
+ });
+ it('should return default value if properties values undefined and default option is set', () => {
+ expect(test.getOption('not-exists-property',{default:'default value'})).to.be.equal('default value');
+ });
+
+
+ });
+
+});
diff --git a/test/unit/mixins/startable.js b/test/unit/mixins/startable.js
new file mode 100644
index 0000000..e2fde44
--- /dev/null
+++ b/test/unit/mixins/startable.js
@@ -0,0 +1,61 @@
+import YatObject from '../../../src/YatObject';
+import mixin from '../../../src/helpers/mixin.js';
+import Startable from '../../../src/mixins/startable.js';
+
+class TestClass extends mixin(YatObject).with(Startable){
+ constructor(...args){ super(...args); }
+}
+
+
+describe('Startable mixin', function(){
+
+ // beforeEach(() => {
+ // this.testObject = new TestClass();
+ // });
+
+ describe('Startable Class', () => {
+ it('should be Stateable', () => {
+ expect(TestClass.Stateable).to.be.equal(true);
+ });
+ it('should have static Startable property equal to true', () => {
+ expect(TestClass.Startable).to.be.equal(true);
+ });
+ });
+
+ describe('Startable Instance', () => {
+ let testObject = null;
+ beforeEach(() => {
+ testObject = new TestClass()
+ spy(testObject, '_getStartPromise');
+ spy(testObject, 'triggerStart');
+ spy(testObject, 'triggerStop');
+ });
+
+ it('should switch life state to starting in `start` process', () => {
+ testObject.start();
+ expect(testObject._getLifeState()).to.be.equal('starting');
+ });
+
+ it('should switch life state to running after `start` process', () => {
+ return testObject.start().then(() => {
+ expect(testObject._getLifeState()).to.be.equal('running');
+ });
+ });
+
+ it('should successfully call `_getStartPromise` on `start`', () => {
+ testObject.start();
+ expect(testObject._getStartPromise).to.have.been.calledOnce;
+ });
+ it('should successfully call `triggerStart` on `start`', () => {
+ return testObject.start().then(() => {
+ expect(testObject.triggerStart).to.have.been.calledOnce
+ });
+ });
+ it('should successfully call `triggerStop` on `stop`', () => {
+ return testObject.start().then(() => testObject.stop()).then(() => {
+ expect(testObject.triggerStop).to.have.been.calledOnce
+ });
+ });
+ });
+
+});
diff --git a/test/unit/mixins/stateable.js b/test/unit/mixins/stateable.js
new file mode 100644
index 0000000..a6a9ce3
--- /dev/null
+++ b/test/unit/mixins/stateable.js
@@ -0,0 +1,32 @@
+import YatObject from '../../../src/YatObject.js';
+import mixin from '../../../src/helpers/mixin.js';
+import Stateable from '../../../src/mixins/stateable.js';
+
+class TestClass extends mixin(YatObject).with(Stateable){
+
+}
+
+
+describe('Stateable mixin', function(){
+
+ let testObject = new TestClass();
+
+ describe('Stateable Class', () => {
+ it('should have static Stateable property equal to true', () => {
+ expect(TestClass.Stateable).to.be.equal(true);
+ });
+ });
+ describe('Stateable Instance', () => {
+ it('should return state hash if `getState` called without arguments', () => {
+ expect(testObject.getState()).to.be.equal(testObject._state);
+ });
+ it('should set state property into state hash object if `setState` called with arguments', () => {
+ testObject.setState('test',123);
+ expect(testObject.getState('test')).to.be.equal(testObject.getState().test);
+ });
+ it('should set state properties into state hash object if `setState` called with object argument', () => {
+ testObject.setState({'test':1,'test2':2});
+ expect(testObject.getState('test') + testObject.getState('test2')).to.be.equal(3);
+ });
+ });
+});
diff --git a/test/unit/routing/history.spec.js b/test/unit/routing/history.spec.js
deleted file mode 100644
index a3c07b2..0000000
--- a/test/unit/routing/history.spec.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import _ from 'underscore';
-import History from '../../../routing/history';
-import Router from '../../../routing/router';
-import config from '../../../routing/config';
-import Location from './location';
-
-describe('History', function() {
- const location = new Location('http://example.com');
- const history = config.history = new History();
- const router = new Router();
- history.localtion = location;
- beforeEach(function() {
- //router.route('', () => console.log('in root'));
- history.start();
- });
- afterEach(function() {
- history.stop();
- });
- it('test', function() {
- // console.log('+++', history.isStarted());
- });
-});
diff --git a/test/unit/routing/location.js b/test/unit/routing/location.js
deleted file mode 100644
index ec3326f..0000000
--- a/test/unit/routing/location.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-let Location = function(href) {
- this.replace(href);
-};
-
-_.extend(Location.prototype, {
- parser: document.createElement('a'),
-
- replace: function(href) {
- this.parser.href = href;
- _.extend(
- this,
- _.pick(
- this.parser,
- 'href',
- 'hash',
- 'host',
- 'search',
- 'fragment',
- 'pathname',
- 'protocol'
- )
- );
-
- // In IE, anchor.pathname does not contain a leading slash though
- // window.location.pathname does.
- if (!/^\//.test(this.pathname)) this.pathname = '/' + this.pathname;
- },
-
- toString: function() {
- return this.href;
- }
-});
-
-export default Location;
diff --git a/test/unit/routing/page.spec.js b/test/unit/routing/page.spec.js
deleted file mode 100644
index aa8bb1c..0000000
--- a/test/unit/routing/page.spec.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import _ from 'underscore';
-import History from '../../../routing/history';
-import Router from '../../../routing/router';
-import Page from '../../../routing/page';
-import config from '../../../routing/config';
-import Location from './location';
-
-const ChildPage = Page.extend({
- onStart() {
- console.log(this.getOption('name') || this.getDefaultRoute().route, 'routed.');
- }
-});
-const RootPage = Page.extend({
- routes: '',
- childPage: ChildPage,
- onStart() {
- console.log('root routed');
- },
- children: [
- {
- routes: 'articles',
- children: [
- {
- onBeforeRoute() {
- return Promise.reject('not:allowed');
- },
- routes: ['cats', 'cats/:id/:name'],
- },
- {
- routes: 'dogs',
- },
- ]
- },
- {
- routes: 'accs',
- },
- ]
-});
-
-describe('Page', function() {
- const location = new Location('http://example.com/#asd');
- const history = config.history = new History();
- history.location = location;
- //console.log('frag', history.getFragment());
- const router = new Router();
- router.on('all', (c,e,d) => console.log(' r->', c,e,d));
- beforeEach(function() {
- let root = new RootPage({ router });
- root.ready();
- history.start();
- });
- afterEach(function() {
- history.stop();
- });
- it('test', function() {
- // location.replace('http://example.com/#articles/cats/orange/manyu?qwe=asd&foo=bar&foo=baz');
- // history.checkUrl();
- });
-});
diff --git a/utils/async-utils.js b/utils/async-utils.js
deleted file mode 100644
index 986a578..0000000
--- a/utils/async-utils.js
+++ /dev/null
@@ -1,80 +0,0 @@
-import _ from 'underscore';
-import AsyncAwaiter from '../coms/asyncAwaiter';
-import { isInstance } from '../utils/is-utils';
-
-export const awaiter = function awaiter(promise) {
- const newPromise = new Promise((resolve) => {
-
- if (isInstance(promise, AsyncAwaiter)) {
-
- resolve(promise);
-
- } else if (isInstance(promise, Error)) {
-
- resolve(AsyncAwaiter.fail(promise));
-
- } else if (!promise || !promise.then) {
-
- resolve(AsyncAwaiter.success(promise));
- }
-
- promise
- .then((data) => {
- let resolvingWith = isInstance(data, AsyncAwaiter)
- ? data
- : AsyncAwaiter.success(data);
- resolve(resolvingWith);
- })
- .catch((error) => {
- let resolvingWith = isInstance(error, AsyncAwaiter)
- ? error
- : AsyncAwaiter.fail(error);
- resolve(resolvingWith);
- });
- });
- return newPromise;
-}
-
-export function wrapWithAwaiter(method, context) {
-
- let asyncMethod = async function() {
- return awaiter(method.apply(this, arguments));
- }
- if (context) {
- asyncMethod.bind(context);
- }
- return asyncMethod;
-}
-
-export function toAsync(ns, ...methodsNames) {
- if (!_.isObject(ns)) return ns;
- let context = ns;
- let anotherContext = _.last(methodsNames);
- if (_.isObject(anotherContext)) {
- methodsNames.pop();
- context = anotherContext;
- }
- _.each(methodsNames, name => {
- let method = ns[name];
- if (_.isFunction(method)) {
- ns[name + 'Async'] = wrapWithAwaiter(method, context);
- }
- })
-}
-
-export function namespaceToAsync(ns, { exclude = [], excludeAsynced = true, context } = {}) {
- if (!_.isObject(ns)) return;
- !context && (context = ns);
- let keys = _.reduce(ns, (memo, method, key) => {
- if (
- !_.isFunction(method)
- ||
- (excludeAsynced && key.endsWith('Async'))
- ||
- (exclude.indexOf(key) > -1)
- ) return memo;
- memo.push(key);
- return memo;
- }, []);
- return toAsync(ns, ...keys, context);
-}
diff --git a/utils/build-utils.js b/utils/build-utils.js
deleted file mode 100644
index 3099522..0000000
--- a/utils/build-utils.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import { isClass, isInstance, isViewClass } from './is-utils';
-import camelCase from './camelCase';
-import { BackboneView } from '../vendors';
-import _ from 'underscore';
-
-//#region helpers
-
-function create(InstanceClass, args) {
- if (args == null) {
- return new InstanceClass();
- } else if (_.isArray(args)) {
- return new InstanceClass(...args);
- } else {
- return new InstanceClass(args);
- }
-}
-
-function merge(v1, v2) {
- if (v1 != null && v2 != null) {
- if (_.isObject(v1) && _.isObject(v2)) {
- return _.extend({}, v1, v2);
- } else {
- return v2;
- }
- }
- return v2 || v1;
-}
-
-function normalizeArgs(ownArgs, cmnArgs, cmnArgsIndex = 0, ownArgsIndex = 0) {
- if (cmnArgs == null && ownArgs == null) {
-
- return;
-
- } else if (cmnArgs != null && ownArgs != null) {
-
- if (_.isArray(ownArgs) && _.isArray(cmnArgs)) {
- let len = _.max([ownArgs.length, cmnArgs.length]);
- let args = [];
- for (let x = 0; x < len; x++) {
- args[x] = merge(ownArgs[x], cmnArgs[x]);
- }
- return args;
-
- } else if (_.isArray(ownArgs) && !_.isArray(cmnArgs)) {
- let arr = [];
- arr[cmnArgsIndex] = cmnArgs;
- return normalizeArgs(ownArgs, arr);
-
- } else if (!_.isArray(ownArgs) && _.isArray(cmnArgs)) {
- let arr = [];
- arr[ownArgsIndex] = ownArgs;
- return normalizeArgs(arr, cmnArgs);
-
- } else {
- return merge(ownArgs, cmnArgs);
- }
-
- } else {
-
- return ownArgs || cmnArgs;
-
- }
-}
-
-//#endregion
-
-export function buildItem(context, arg, buildOptions = {}) {
- if (arg == null) return;
-
- let { BaseClass, ctorArgs, ctorArgsIndex } = buildOptions;
-
- if (_.isFunction(arg) && !isClass(arg, BaseClass)) {
-
- return buildItem(arg.call(context, context, ctorArgs), buildOptions);
-
- } else if (isClass(arg, BaseClass)) {
-
- return create(arg, ctorArgs);
-
- } else if (isInstance(arg, BaseClass)) {
-
- return arg;
-
- } else if (_.isObject(arg) && arg.class) {
- let args = normalizeArgs(arg.ctorArgs, ctorArgs, ctorArgsIndex, arg.ctorArgsIndex);
- return create(arg.class, args);
-
- } else if (_.isFunction(arg.build)) {
- return arg.buid.call(context, arg, ctorArgs, context);
- }
-}
-
-
-export function buildView(context, arg, { BaseClass, options } = {}) {
- const buildOptions = {
- BaseClass: BaseClass || BackboneView
- }
- if (isViewClass(arg)) {
- buildOptions.BaseClass = arg;
- }
- if (options != null) {
- buildOptions.ctorArgs = [options];
- }
- return buildItem(context, arg, buildOptions);
-}
-
-export function buildViewByKey(context, key, { defaultOptions, options, keyToCamelCase = true } = {}) {
- let arg = context.getOption(key);
- let optionsKey = keyToCamelCase ? camelCase(key, 'options') : key + 'Options';
- let viewOptions = _.extend({}, defaultOptions, context.getOption(optionsKey), options);
- return buildView(context, arg, { options: viewOptions});
-}
diff --git a/utils/buildRouteUrl.js b/utils/buildRouteUrl.js
deleted file mode 100644
index 47416ed..0000000
--- a/utils/buildRouteUrl.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import _ from 'underscore';
-
-function replaceKeys(text, data) {
- let result = text.replace(/:(\w+)/g, (founded, dataKey) => {
- return data[dataKey];
- });
- return result;
-}
-
-export default function buildRouteUrl(route, data = {}, search = '', hash = '') {
-
- // normalizing search and hash;
- search = search && search.toString() || ''; // if its a URLSearchParams
- if (search && search[0] !== '?') {
- search = '?' + search;
- }
-
- if (hash && hash[0] !== '#') {
- hash = '#' + hash;
- }
-
-
- // in-first: look up for temporary chunks
- let replaced = route.replace(/\([^:)]*(:[^:)]+)+\)/g, (match) => {
- let keys = match.match(/:\w+/g);
- if (!keys || !keys.length) return '';
- keys = _.map(keys, key => key.substring(1));
- let present = _.every(keys, key => data[key] != null);
-
- // all keys should present in hash, otherwise remove whole temporary block
- if (!present) return '';
-
- let result = replaceKeys(match, data);
-
- return result.substring(1, result.length - 1);
- });
-
- //in-seconde: replace required parameters
- replaced = replaceKeys(replaced, data);
-
- replaced = replaced.replace(/\*(.+$)/g,(found, key) => data[key] || '');
-
- return replaced + search + hash;
-
-}
diff --git a/utils/camelCase.js b/utils/camelCase.js
deleted file mode 100644
index 37cd2f3..0000000
--- a/utils/camelCase.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import _ from 'underscore';
-// camelCase('asd:qwe:zxc') -> asdQweZxc
-// camelCase('asd:qwe:zxc', true) -> AsdQweZxc
-export default function camelCase(...args) {
-
- let text;
- let first;
-
- if (!args || !args.length) return;
- else if (args.length == 1) {
- text = args[0];
- } else {
- if (_.isBoolean(_.last(args))) {
- first = args.pop();
- }
- text = _.filter(args, chunk => chunk != null).join(':');
- }
-
- if (!text) return text;
-
- if (!_.isString(text)) return text.toString();
-
- text = text.replace(/:{2,}/gmi,':');
-
- let splitter = first === true ? /(^|:)(\w)/gi : /(:)(\w)/gi;
-
- text = text.replace(splitter, (match, prefix, rtext) => rtext.toUpperCase());
-
- if (!first) {
- text = text.replace(/(^)(\w)/gi, (match, prefix, rtext) => rtext.toLowerCase());
- }
-
- return text;
-
-}
diff --git a/utils/config.js b/utils/config.js
deleted file mode 100644
index 403961c..0000000
--- a/utils/config.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _ from 'underscore';
-import BaseClass from '../coms/baseClass';
-import * as ctorsNs from '../vendors';
-
-let ctors = _.map(ctorsNs, ctor => ctor);
-ctors.unshift(BaseClass);
-
-const config = {
- // for isKnownCtor, user should supply the array of known ctors
- knownCtors: ctors,
-
- // for mix utility
- mixOptions: {
- mergeObjects: true,
- wrapObjectWithConstructor: true,
- }
-};
-export default config;
diff --git a/utils/events-utils.js b/utils/events-utils.js
deleted file mode 100644
index 4c17d24..0000000
--- a/utils/events-utils.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export function triggerMethodOn(context, ...args) {
- if (context.triggerMethod) {
- return context.triggerMethod(...args);
- } else {
- return context.trigger(...args);
- }
-}
-
-export async function triggerMethodOnAsync(context, ...args) {
- if (context.triggerMethodAsync) {
- return await context.triggerMethodAsync(...args);
- } else {
- return await context.triggerAsync(...args);
- }
-}
diff --git a/utils/extend.js b/utils/extend.js
deleted file mode 100644
index 1a8b34f..0000000
--- a/utils/extend.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import _ from 'underscore';
-// Borrowed from backbone lib
-// original name: extend
-
-export default function extend(protoProps, staticProps) {
- let parent = this;
- let child;
-
- // The constructor function for the new subclass is either defined by you
- // (the "constructor" property in your `extend` definition), or defaulted
- // by us to simply call the parent constructor.
- if (protoProps && _.has(protoProps, 'constructor')) {
- child = protoProps.constructor;
- } else {
- child = function() { return parent.apply(this, arguments); };
- }
-
- // Add static properties to the constructor function, if supplied.
- _.extend(child, parent, staticProps);
-
- // Set the prototype chain to inherit from `parent`, without calling
- // `parent`'s constructor function and add the prototype properties.
- child.prototype = _.create(parent.prototype, protoProps);
- child.prototype.constructor = child;
-
- // Set a convenience property in case the parent's prototype is needed
- // later.
- child.__super__ = parent.prototype;
-
- return child;
-}
diff --git a/utils/getOption.js b/utils/getOption.js
deleted file mode 100644
index a953dc5..0000000
--- a/utils/getOption.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import _ from 'underscore';
-import result from './result';
-import { isKnownCtor } from './is-utils';
-
-export default function getOption(instance, key, options = {}) {
-
- if (!_.isObject(instance)) return options.default;
-
- let shouldInvoke = options.force !== false ? arg => !isKnownCtor(arg) : false;
- let context = options.context || instance;
- let args = options.args;
- let value = result(instance.options, key, { shouldInvoke, args, context });
- if (value != null || options.deep === false) {
- return value != null ? value : options.default;
- }
- value = result(instance, key, { shouldInvoke, args });
- return value != null ? value : options.default;
-}
diff --git a/utils/index.js b/utils/index.js
deleted file mode 100644
index 4f5f427..0000000
--- a/utils/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-export * from './async-utils';
-export * from './build-utils';
-export {default as buildRouteUrl} from './buildRouteUrl';
-export {default as camelCase} from './camelCase';
-export {default as config} from './config';
-export {default as extend} from './extend';
-export {default as getOption} from './getOption';
-export * from './events-utils';
-export * from './is-utils';
-export {default as makeReady} from './makeReady';
-export {default as mix} from './mix';
-export {default as result} from './result';
diff --git a/utils/is-utils.js b/utils/is-utils.js
deleted file mode 100644
index 0da342f..0000000
--- a/utils/is-utils.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import config from './config';
-import { Model, Collection, BackboneView } from '../vendors';
-
-export function isInstance(arg, cls) {
- return arg instanceof cls;
-}
-
-export function isClass(arg, cls) {
- if (cls && cls.constructor && arg && arg.constructor) {
- return arg === cls || isInstance(arg.prototype, cls);
- } else {
- return false;
- }
-}
-
-export function isCtor(arg, ctors) {
-
- if (!Array.isArray(ctors)) {
-
- return isClass(arg, ctors);
-
- } else if (typeof (arg) === 'function') {
-
- return ctors.some(ctor => isClass(arg, ctor));
-
- } else {
-
- return false;
-
- }
-
-}
-
-export function isKnownCtor(arg) {
- return isCtor(arg, config.knownCtors);
-}
-
-
-export function isCollection(arg) {
- return isInstance(arg, Collection);
-}
-
-export function isCollectionClass(arg) {
- return isClass(arg, Collection);
-}
-
-export function isModel(arg) {
- return isInstance(arg, Model);
-}
-
-export function isModelClass(arg) {
- return isClass(arg, Model);
-}
-
-export function isView(arg) {
- return isInstance(arg, BackboneView);
-}
-
-export function isViewClass(arg) {
- return isClass(arg, BackboneView);
-}
-
-export function isModelOrCollection(arg) {
- return isModel(arg) || isCollection(arg);
-}
-
-export function isModelOrCollectionClass(arg) {
- return isModelClass(arg) || isCollectionClass(arg);
-}
diff --git a/utils/makeReady.js b/utils/makeReady.js
deleted file mode 100644
index 2acebbd..0000000
--- a/utils/makeReady.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import config from './config';
-function makeReady(view) {
- if (view._supportsReady) {
- view.ready();
- } else {
- let multipleReady = view.getOption('multipleReadyAllowed');
- if (view._isReady && !multipleReady) return;
- view._isReady = true;
- view.triggerMethod
- ? view.triggerMethod('ready')
- : view.trigger('ready')
- }
-}
-config.makeReadyUtil = makeReady;
-export default makeReady;
diff --git a/utils/mix.js b/utils/mix.js
deleted file mode 100644
index 948ff08..0000000
--- a/utils/mix.js
+++ /dev/null
@@ -1,105 +0,0 @@
-import _ from 'underscore';
-import config from './config';
-import extend from './extend';
-
-function createMixinFromObject(arg) {
-
- let mixedObj = _.clone(arg);
- let ctor = mixedObj.hasOwnProperty('constructor') && _.isFunction(mixedObj.constructor) && mixedObj.constructor;
- let hasConstructor = _.isFunction(ctor);
-
- return Base => {
- if (hasConstructor) {
- mixedObj.constructor = function mx() {
- Base.apply(this, arguments);
- ctor.apply(this, arguments);
- };
- }
- return Base.extend(mixedObj);
- };
-}
-
-function normalizeArguments(args, opts) {
- let raw = {};
- let wrap = opts.wrapObjectWithConstructor == true;
- let merge = opts.mergeObjects == true;
- let mixins = [];
- _(args).each(arg => {
-
- //if argument is function just put it to mixins array
- //and continue;
- if (_.isFunction(arg)) {
- mixins.push(arg);
- return;
- }
-
- //if argument is not an object just skip it
- if (!_.isObject(arg)) return;
-
- //if mergeObjects == false or wrapObjectWithConstructor == true
- //and there is a constructor function
- //converting to a mixin function
- //otherwise extend rawObject
- if (!merge || (wrap && _.has(arg.constructor) && _.isFunction(arg.constructor))) {
- mixins.push(createMixinFromObject(arg));
- } else {
- _.extend(raw, arg);
- }
-
- });
-
- //if rawObject is not empty
- //convert it to a mixin function
- //and put it to the begin of mixins array
- if (_.size(raw)) {
- mixins.unshift(createMixinFromObject(raw));
- }
-
- return mixins;
-}
-
-function withMethod(...args) {
-
- let mixins = normalizeArguments(args, this.options);
- let Mixed = this.class;
- if (!mixins.length) {
- return Mixed;
- } else {
- return _.reduce(mixins, (Memo, ctorMixin) => {
- let mixed = ctorMixin(Memo);
- return mixed;
- }, Mixed);
- }
-}
-
-
-export default function mix(_ctor, options) {
-
- let opts = _.extend({}, config.mixOptions, options);
-
- let ctor;
-
- if (_.isFunction(_ctor)) {
-
- ctor = _ctor;
-
- } else if (_.isObject(_ctor)) {
- let b = _.isFunction(_ctor.constructor) && _ctor.constructor;
- ctor = function mx() { b.apply(this, arguments); };
- _.extend(ctor.prototype, _.omit(_ctor,'constructor'));
-
- } else {
-
- throw new Error('Mix argument should be a class or a plain object');
- }
-
- if (!_.isFunction(ctor.extend)) {
- ctor.extend = extend;
- }
-
- return {
- options: opts,
- with: withMethod,
- class: ctor,
- };
-}
diff --git a/utils/result.js b/utils/result.js
deleted file mode 100644
index d06299d..0000000
--- a/utils/result.js
+++ /dev/null
@@ -1,21 +0,0 @@
-export default function result(instance, key, { shouldInvoke, args, context }) {
-
- if (!instance || key == null || !(key in instance)) return;
-
- let value = instance[key];
-
- if (typeof (value) !== 'function' || !shouldInvoke) {
- return value;
- }
-
- if (typeof (shouldInvoke) === 'function' && !shouldInvoke(value)) {
- return value;
- }
-
- !context && (context = instance);
- // for supporting arrow functions: context => ...
- !args && (args = [context]);
-
- return value.apply(context, args);
-
-}
diff --git a/vendors/index.js b/vendors/index.js
deleted file mode 100644
index e11ad89..0000000
--- a/vendors/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Model, Collection, View as BackboneView, Router, History } from 'backbone';
-import { MnObject, Application } from 'backbone.marionette'
-export {
- Model,
- Collection,
- BackboneView,
- Router,
- History,
- MnObject,
- Application
-}