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 -}