UNPKG

ember-inspector-prebuilt

Version:

A pre-built set of distributable assets from the ember.js ember-inspector project.

1,580 lines (1,365 loc) 591 kB
"use strict"; define('ember-inspector/adapters/basic', ['exports', 'ember', 'ember-inspector/config/environment'], function (exports, _ember, _emberInspectorConfigEnvironment) { var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })(); var computed = _ember['default'].computed; var K = _ember['default'].K; exports['default'] = _ember['default'].Object.extend({ /** * Called when the adapter is created (when * the inspector app boots). * * @method init */ init: function init() { this._super.apply(this, arguments); this._checkVersion(); }, /** * Listens to `EmberInspectorDebugger` message about * Ember version mismatch. If a mismatch message is received * it means the current inspector app does not support the current * Ember version and needs to switch to an inspector version * that does. * * @method _checkVersion * @private */ _checkVersion: function _checkVersion() { var _this = this; this.onMessageReceived(function (message) { var name = message.name; var version = message.version; if (name === 'version-mismatch') { var previousVersions = _emberInspectorConfigEnvironment['default'].previousEmberVersionsSupported; var _config$emberVersionsSupported = _slicedToArray(_emberInspectorConfigEnvironment['default'].emberVersionsSupported, 2); var fromVersion = _config$emberVersionsSupported[0]; var tillVersion = _config$emberVersionsSupported[1]; var neededVersion = undefined; if (compareVersion(version, fromVersion) === -1) { neededVersion = previousVersions[previousVersions.length - 1]; } else if (tillVersion && compareVersion(version, tillVersion) !== -1) { neededVersion = tillVersion; } else { return; } _this.onVersionMismatch(neededVersion); } }); this.sendMessage({ type: 'check-version', from: 'devtools' }); }, /** * Hook called when the Ember version is not * supported by the current inspector version. * * Each adapter should implement this hook * to switch to an older/new inspector version * that supports this Ember version. * * @method onVersionMismatch * @param {String} neededVersion (The version to go to) */ onVersionMismatch: K, name: 'basic', /** Used to send messages to EmberDebug @param type {Object} the message to the send **/ sendMessage: function sendMessage() {}, /** Register functions to be called when a message from EmberDebug is received **/ onMessageReceived: function onMessageReceived(callback) { this.get('_messageCallbacks').pushObject(callback); }, _messageCallbacks: computed(function () { return []; }), _messageReceived: function _messageReceived(message) { this.get('_messageCallbacks').forEach(function (callback) { callback(message); }); }, // Called when the "Reload" is clicked by the user willReload: K, canOpenResource: false, openResource: function openResource() /* file, line */{} }); /** * Compares two Ember versions. * * Returns: * `-1` if version < version * 0 if version1 == version2 * 1 if version1 > version2 * * @param {String} version1 * @param {String} version2 * @return {Boolean} result of the comparison */ function compareVersion(version1, version2) { version1 = cleanupVersion(version1).split('.'); version2 = cleanupVersion(version2).split('.'); for (var i = 0; i < 3; i++) { var compared = compare(+version1[i], +version2[i]); if (compared !== 0) { return compared; } } return 0; } /* Remove -alpha, -beta, etc from versions */ function cleanupVersion(version) { return version.replace(/-.*/g, ''); } function compare(val, number) { if (val === number) { return 0; } else if (val < number) { return -1; } else if (val > number) { return 1; } } }); /** * The adapter stores logic specific to each environment. * Extend this object with env specific code (such as chrome/firefox/test), * then set the application's `adapter` property to the name of this adapter. * * example: * * ```javascript * const EmberInspector = App.Create({ * adapter: 'chrome' * }); * ``` */ define('ember-inspector/adapters/bookmarklet', ['exports', 'ember-inspector/adapters/basic', 'ember'], function (exports, _emberInspectorAdaptersBasic, _ember) { var computed = _ember['default'].computed; exports['default'] = _emberInspectorAdaptersBasic['default'].extend({ name: 'bookmarklet', /** * Called when the adapter is created. * * @method init */ init: function init() { this._connect(); return this._super.apply(this, arguments); }, inspectedWindow: computed(function () { return window.opener || window.parent; }), inspectedWindowURL: computed(function () { return loadPageVar('inspectedWindowURL'); }), sendMessage: function sendMessage(options) { options = options || {}; this.get('inspectedWindow').postMessage(options, this.get('inspectedWindowURL')); }, /** * Redirect to the correct inspector version. * * @method onVersionMismatch * @param {String} goToVersion */ onVersionMismatch: function onVersionMismatch(goToVersion) { this.sendMessage({ name: 'version-mismatch', version: goToVersion }); window.location.href = '../panes-' + goToVersion.replace(/\./g, '-') + '/index.html' + window.location.search; }, _connect: function _connect() { var _this = this; window.addEventListener('message', function (e) { var message = e.data; if (e.origin !== _this.get('inspectedWindowURL')) { return; } // close inspector if inspected window is unloading if (message && message.unloading) { window.close(); } if (message.from === 'inspectedWindow') { _this._messageReceived(message); } }); } }); function loadPageVar(sVar) { return decodeURI(window.location.search.replace(new RegExp('^(?:.*[&\\?]' + encodeURI(sVar).replace(/[\.\+\*]/g, "\\$&") + '(?:\\=([^&]*))?)?.*$', "i"), "$1")); } }); define('ember-inspector/adapters/chrome', ['exports', 'ember-inspector/adapters/basic', 'ember', 'ember-inspector/config/environment'], function (exports, _emberInspectorAdaptersBasic, _ember, _emberInspectorConfigEnvironment) { var computed = _ember['default'].computed; var emberDebug = null; exports['default'] = _emberInspectorAdaptersBasic['default'].extend({ /** * Called when the adapter is created. * * @method init */ init: function init() { this._connect(); this._handleReload(); this._injectDebugger(); return this._super.apply(this, arguments); }, name: 'chrome', sendMessage: function sendMessage(options) { options = options || {}; this.get('_chromePort').postMessage(options); }, _chromePort: computed(function () { return chrome.extension.connect(); }), _connect: function _connect() { var _this = this; var chromePort = this.get('_chromePort'); chromePort.postMessage({ appId: chrome.devtools.inspectedWindow.tabId }); chromePort.onMessage.addListener(function (message) { if (typeof message.type === 'string' && message.type === 'iframes') { sendIframes(message.urls); } _this._messageReceived(message); }); }, _handleReload: function _handleReload() { var self = this; chrome.devtools.network.onNavigated.addListener(function () { self._injectDebugger(); location.reload(true); }); }, _injectDebugger: function _injectDebugger() { chrome.devtools.inspectedWindow.eval(loadEmberDebug()); chrome.devtools.inspectedWindow.onResourceAdded.addListener(function (opts) { if (opts.type === 'document') { sendIframes([opts.url]); } }); }, willReload: function willReload() { this._injectDebugger(); }, /** * Open the devtools "Elements" tab and select a specific DOM element. * * @method inspectDOMElement * @param {String} selector jQuery selector */ inspectDOMElement: function inspectDOMElement(selector) { chrome.devtools.inspectedWindow.eval('inspect($(\'' + selector + '\')[0])'); }, /** * Redirect to the correct inspector version. * * @method onVersionMismatch * @param {String} goToVersion */ onVersionMismatch: function onVersionMismatch(goToVersion) { window.location.href = '../panes-' + goToVersion.replace(/\./g, '-') + '/index.html'; }, /** We handle the reload here so we can inject scripts as soon as possible into the new page. */ reloadTab: function reloadTab() { chrome.devtools.inspectedWindow.reload({ injectedScript: loadEmberDebug() }); }, canOpenResource: true, openResource: function openResource(file, line) { /*global chrome */ // For some reason it opens the line after the one specified chrome.devtools.panels.openResource(file, line - 1); } }); function sendIframes(urls) { urls.forEach(function (url) { chrome.devtools.inspectedWindow.eval(loadEmberDebug(), { frameURL: url }); }); } function loadEmberDebug() { var minimumVersion = _emberInspectorConfigEnvironment['default'].emberVersionsSupported[0].replace(/\./g, '-'); var xhr = undefined; if (!emberDebug) { xhr = new XMLHttpRequest(); xhr.open("GET", chrome.extension.getURL('/panes-' + minimumVersion + '/ember_debug.js'), false); xhr.send(); emberDebug = xhr.responseText; } return emberDebug; } }); /* globals chrome */ define("ember-inspector/adapters/firefox", ["exports", "ember", "ember-inspector/adapters/basic"], function (exports, _ember, _emberInspectorAdaptersBasic) { exports["default"] = _emberInspectorAdaptersBasic["default"].extend({ name: 'firefox', /** * Called when the adapter is created. * * @method init */ init: function init() { this._connect(); return this._super.apply(this, arguments); }, sendMessage: function sendMessage(options) { options = options || {}; window.parent.postMessage(options, "*"); }, /** * Redirects to the correct inspector version. * Also re-injects the correct EmberDebug version. * * @method onVersionMismatch * @param {String} goToVersion */ onVersionMismatch: function onVersionMismatch(version) { this.sendMessage({ type: "injectEmberDebug", version: version }); window.location.href = "../panes-" + version.replace(/\./g, '-') + "/index.html"; }, _connect: function _connect() { // NOTE: chrome adapter sends a appId message on connect (not needed on firefox) //this.sendMessage({ appId: "test" }); this._onMessage = this._onMessage.bind(this); window.addEventListener("message", this._onMessage, false); }, _onMessage: function _onMessage(evt) { if (this.isDestroyed || this.isDestroying) { window.removeEventListener("message", this._onMessage, false); return; } var message = evt.data; // check if the event is originated by our privileged ember inspector code if (evt.isTrusted) { if (typeof message.type === 'string' && message.type === 'iframes') { this._sendIframes(message.urls); } else { // We clone the object so that Ember prototype extensions // are applied. this._messageReceived(_ember["default"].$.extend(true, {}, message)); } } else { console.log("EMBER INSPECTOR: ignored post message", evt); } }, _sendIframes: function _sendIframes(urls) { var _this = this; urls.forEach(function (url) { _this.sendMessage({ type: 'injectEmberDebug', frameURL: url }); }); }, canOpenResource: true, openResource: function openResource(file, line) { this.sendMessage({ type: 'devtools:openSource', url: file, line: line }); } }); }); define("ember-inspector/adapters/websocket", ["exports", "ember", "ember-inspector/adapters/basic"], function (exports, _ember, _emberInspectorAdaptersBasic) { var computed = _ember["default"].computed; exports["default"] = _emberInspectorAdaptersBasic["default"].extend({ init: function init() { this._super(); this._connect(); }, sendMessage: function sendMessage(options) { options = options || {}; this.get('socket').emit('emberInspectorMessage', options); }, socket: computed(function () { return window.EMBER_INSPECTOR_CONFIG.remoteDebugSocket; }), _connect: function _connect() { var _this = this; this.get('socket').on('emberInspectorMessage', function (message) { _ember["default"].run(function () { _this._messageReceived(message); }); }); }, _disconnect: function _disconnect() { this.get('socket').removeAllListeners("emberInspectorMessage"); }, willDestroy: function willDestroy() { this._disconnect(); } }); }); define('ember-inspector/app', ['exports', 'ember', 'ember-inspector/resolver', 'ember-load-initializers', 'ember-inspector/config/environment', 'ember-inspector/port', 'ember-inspector/libs/promise-assembler'], function (exports, _ember, _emberInspectorResolver, _emberLoadInitializers, _emberInspectorConfigEnvironment, _emberInspectorPort, _emberInspectorLibsPromiseAssembler) { _ember['default'].MODEL_FACTORY_INJECTIONS = true; var version = '2.0.5'; var App = _ember['default'].Application.extend({ modulePrefix: _emberInspectorConfigEnvironment['default'].modulePrefix, podModulePrefix: _emberInspectorConfigEnvironment['default'].podModulePrefix, Resolver: _emberInspectorResolver['default'] }); // TODO: remove this when fixed // problem description: registry classes being registered // again on app reset. this will clear the registry. // long term solution: make registry initializers run once on app // creation. // issue: https://github.com/emberjs/ember.js/issues/10310 // pr: https://github.com/emberjs/ember.js/pull/10597 App.reopen({ buildInstance: function buildInstance() { this.buildRegistry(); return this._super.apply(this, arguments); } }); _emberInspectorConfigEnvironment['default'].VERSION = version; // Inject adapter App.initializer({ name: "extension-init", initialize: function initialize(instance) { // websocket is replaced by the build process. instance.adapter = 'websocket'; // register and inject adapter var Adapter = undefined; if (_ember['default'].typeOf(instance.adapter) === 'string') { Adapter = instance.resolveRegistration('adapter:' + instance.adapter); } else { Adapter = instance.adapter; } instance.register('adapter:main', Adapter); instance.inject('port', 'adapter', 'adapter:main'); instance.inject('route:application', 'adapter', 'adapter:main'); instance.inject('route:deprecations', 'adapter', 'adapter:main'); instance.inject('controller:deprecations', 'adapter', 'adapter:main'); // register config instance.register('config:main', _emberInspectorConfigEnvironment['default'], { instantiate: false }); instance.inject('route', 'config', 'config:main'); // inject port instance.register('port:main', instance.Port || _emberInspectorPort['default']); instance.inject('controller', 'port', 'port:main'); instance.inject('route', 'port', 'port:main'); instance.inject('component', 'port', 'port:main'); instance.inject('promise-assembler', 'port', 'port:main'); // register and inject promise assembler instance.register('promise-assembler:main', _emberInspectorLibsPromiseAssembler['default']); instance.inject('route:promiseTree', 'assembler', 'promise-assembler:main'); } }); (0, _emberLoadInitializers['default'])(App, _emberInspectorConfigEnvironment['default'].modulePrefix); exports['default'] = App; }); define('ember-inspector/components/action-checkbox', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; exports['default'] = Component.extend({ tagName: 'input', attributeBindings: ['type', 'checked'], type: 'checkbox', checked: false, change: function change() { this._updateElementValue(); }, _updateElementValue: function _updateElementValue() { this.set('checked', this.$().prop('checked')); this.sendAction('on-update', this.get('checked')); } }); }); define('ember-inspector/components/app-version', ['exports', 'ember-cli-app-version/components/app-version', 'ember-inspector/config/environment'], function (exports, _emberCliAppVersionComponentsAppVersion, _emberInspectorConfigEnvironment) { var name = _emberInspectorConfigEnvironment['default'].APP.name; var version = _emberInspectorConfigEnvironment['default'].APP.version; exports['default'] = _emberCliAppVersionComponentsAppVersion['default'].extend({ version: version, name: name }); }); define('ember-inspector/components/async-image', ['exports', 'ember-async-image/components/async-image'], function (exports, _emberAsyncImageComponentsAsyncImage) { Object.defineProperty(exports, 'default', { enumerable: true, get: function get() { return _emberAsyncImageComponentsAsyncImage['default']; } }); }); define('ember-inspector/components/clear-button', ['exports', 'ember-inspector/components/icon-button'], function (exports, _emberInspectorComponentsIconButton) { exports['default'] = _emberInspectorComponentsIconButton['default'].extend({ title: 'Clear' }); }); define('ember-inspector/components/container-instance', ['exports', 'ember', 'ember-inspector/mixins/row-events'], function (exports, _ember, _emberInspectorMixinsRowEvents) { var Component = _ember['default'].Component; exports['default'] = Component.extend(_emberInspectorMixinsRowEvents['default'], { /** * No tag * * @property tagName * @type {String} */ tagName: '' }); }); /** * This component is used to wrap every row in the container * instances template. * * The main purpose for this component is to use the `RowEvents` * mixin so we can send `on-click` events when a row is clicked. * * Since it has no tag it has no effect on the DOM hierarchy. */ define("ember-inspector/components/date-property-field", ["exports", "ember", "ember-inspector/components/pikaday-input"], function (exports, _ember, _emberInspectorComponentsPikadayInput) { var on = _ember["default"].on; var once = _ember["default"].run.once; var KEY_EVENTS = { escape: 27 }; exports["default"] = _emberInspectorComponentsPikadayInput["default"].extend({ /** * Workaround bug of `onPikadayClose` being called * on a destroyed component. */ onPikadayClose: function onPikadayClose() { if (!this.$()) { return; } return this._super.apply(this, arguments); }, openDatePicker: on('didInsertElement', function () { once(this.$(), 'click'); }), keyUp: function keyUp(e) { if (e.keyCode === KEY_EVENTS.escape) { this.sendAction('cancel'); } return this._super.apply(this, arguments); } }); }); define('ember-inspector/components/deprecation-item-source', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var bool = computed.bool; var readOnly = computed.readOnly; var and = computed.and; exports['default'] = Component.extend({ /** * No tag. * * @property tagName * @type {String} */ tagName: '', known: bool('model.map.source'), url: computed('model.map.source', 'model.map.line', 'known', function () { var source = this.get('model.map.source'); if (this.get('known')) { return source + ':' + this.get('model.map.line'); } else { return 'Unkown source'; } }), adapter: readOnly('port.adapter'), isClickable: and('known', 'adapter.canOpenResource') }); }); define('ember-inspector/components/deprecation-item', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var notEmpty = computed.notEmpty; exports['default'] = Component.extend({ isExpanded: true, tagName: '', hasMap: notEmpty('model.hasSourceMap'), actions: { toggleExpand: function toggleExpand() { this.toggleProperty('isExpanded'); } } }); }); define('ember-inspector/components/drag-handle', ['exports', 'ember'], function (exports, _ember) { var computed = _ember['default'].computed; var htmlSafe = _ember['default'].String.htmlSafe; exports['default'] = _ember['default'].Component.extend({ classNames: ['drag-handle'], classNameBindings: ['isLeft:drag-handle--left', 'isRight:drag-handle--right', 'faded:drag-handle--faded'], attributeBindings: ['style'], position: 0, side: '', isRight: _ember['default'].computed.equal('side', 'right'), isLeft: _ember['default'].computed.equal('side', 'left'), minWidth: 60, /** * The maximum width this handle can be dragged to. * * @property maxWidth * @type {Number} * @default Infinity */ maxWidth: Infinity, /** * The left offset to add to the initial position. * * @property left * @type {Number} * @default 0 */ left: 0, /** * Modifier added to the class to fade the drag handle. * * @property faded * @type {Boolean} * @default false */ faded: false, /** * Action to trigger whenever the drag handle is moved. * Pass this action through the template. * * @property on-drag * @type {Function} */ 'on-drag': function onDrag() {}, startDragging: function startDragging() { var _this = this; var $container = this.$().parent(); var $containerOffsetLeft = $container.offset().left; var $containerOffsetRight = $containerOffsetLeft + $container.width(); var namespace = 'drag-' + this.get('elementId'); this.sendAction('action', true); _ember['default'].$('body').on('mousemove.' + namespace, function (e) { var position = _this.get('isLeft') ? e.pageX - $containerOffsetLeft : $containerOffsetRight - e.pageX; position -= _this.get('left'); if (position >= _this.get('minWidth') && position <= _this.get('maxWidth')) { _this.set('position', position); _this.get('on-drag')(position); } }).on('mouseup.' + namespace + ' mouseleave.' + namespace, function () { _this.stopDragging(); }); }, stopDragging: function stopDragging() { this.sendAction('action', false); _ember['default'].$('body').off('.drag-' + this.get('elementId')); }, willDestroyElement: function willDestroyElement() { this._super(); this.stopDragging(); }, mouseDown: function mouseDown() { this.startDragging(); return false; }, style: computed('side', 'position', 'left', function () { var string = undefined; if (this.get('side')) { string = this.get('side') + ': ' + (this.get('position') + this.get('left')) + 'px;'; } else { string = ''; } return htmlSafe(string); }) }); }); define('ember-inspector/components/draggable-column', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var inject = _ember['default'].inject; var service = inject.service; exports['default'] = Component.extend({ tagName: '', // Prevent wrapping in a div side: 'left', minWidth: 60, setIsDragging: 'setIsDragging', /** * Injected `layout` service. Used to broadcast * changes the layout of the app. * * @property layout * @type {Service} */ layout: service(), /** * Trigger that the application dimensions have changed due to * something being dragged/resized such as the main nav or the * object inspector. * * @method triggerResize */ triggerResize: function triggerResize() { this.get('layout').trigger('resize', { source: 'draggable-column' }); }, actions: { setIsDragging: function setIsDragging(isDragging) { this.sendAction('setIsDragging', isDragging); }, /** * Action called whenever the draggable column has been * resized. * * @method didDrag */ didDrag: function didDrag() { this.triggerResize(); } } }); }); // DraggableColumn // =============== // A wrapper for a resizable-column and a drag-handle component define('ember-inspector/components/icon-button', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; exports['default'] = Component.extend({ attributeBindings: ['title'], tagName: 'button', title: null, click: function click() { this.sendAction(); } }); }); define('ember-inspector/components/iframe-picker', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var run = _ember['default'].run; var observer = _ember['default'].observer; var getOwner = _ember['default'].getOwner; var alias = computed.alias; exports['default'] = Component.extend({ model: computed('port.detectedApplications.[]', function () { return this.get('port.detectedApplications').map(function (val) { var name = val.split('__')[1]; return { name: name, val: val }; }); }), selectedApp: alias('port.applicationId'), selectedDidChange: observer('selectedApp', function () { // Change iframe being debugged var url = '/'; var applicationId = this.get('selectedApp'); var list = this.get('port').get('detectedApplications'); var app = getOwner(this).lookup('application:main'); run(app, app.reset); var router = app.__container__.lookup('router:main'); var port = app.__container__.lookup('port:main'); port.set('applicationId', applicationId); port.set('detectedApplications', list); // start app.boot().then(function () { router.location.setURL(url); run(app.__deprecatedInstance__, 'handleURL', url); }); }), actions: { selectIframe: function selectIframe(applicationId) { this.set('selectedApp', applicationId); } } }); }); define('ember-inspector/components/in-viewport', ['exports', 'smoke-and-mirrors/components/in-viewport'], function (exports, _smokeAndMirrorsComponentsInViewport) { Object.defineProperty(exports, 'default', { enumerable: true, get: function get() { return _smokeAndMirrorsComponentsInViewport['default']; } }); }); define('ember-inspector/components/main-content', ['exports', 'ember', 'ember-concurrency'], function (exports, _ember, _emberConcurrency) { var Component = _ember['default'].Component; var schedule = _ember['default'].run.schedule; var $ = _ember['default'].$; var service = _ember['default'].inject.service; // Currently used to determine the height of list-views exports['default'] = Component.extend({ /** * Layout service. We inject it to keep its `contentHeight` property * up-to-date. * * @property layoutService * @type {Service} layout */ layoutService: service('layout'), didInsertElement: function didInsertElement() { var _this = this; $(window).on('resize.view-' + this.get('elementId'), function () { _this.get('updateHeightDebounce').perform(); }); schedule('afterRender', this, this.updateHeight); return this._super.apply(this, arguments); }, /** * Restartable Ember Concurrency task that triggers * `updateHeight` after 100ms. * * @property updateHeightDebounce * @type {Object} Ember Concurrency task */ updateHeightDebounce: (0, _emberConcurrency.task)(regeneratorRuntime.mark(function callee$0$0() { return regeneratorRuntime.wrap(function callee$0$0$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: context$1$0.next = 2; return (0, _emberConcurrency.timeout)(100); case 2: this.updateHeight(); case 3: case 'end': return context$1$0.stop(); } }, callee$0$0, this); })).restartable(), /** * Update the layout's `contentHeight` property. * This will cause the layout service to trigger * the `content-height-update` event which will update * list heights. * * This is called initially when this component is inserted * and whenever the window is resized. * * @method updateHeight */ updateHeight: function updateHeight() { this.get('layoutService').updateContentHeight(this.$().height()); }, willDestroyElement: function willDestroyElement() { $(window).off('.view-' + this.get('elementId')); return this._super.apply(this, arguments); } }); }); define('ember-inspector/components/mixin-detail', ['exports', 'ember'], function (exports, _ember) { var computed = _ember['default'].computed; var Component = _ember['default'].Component; var readOnly = computed.readOnly; exports['default'] = Component.extend({ /** * mixinDetails controller passed through the template * * @property mixinDetails * @type {Ember.Controller} */ mixinDetails: null, objectId: readOnly('mixinDetails.model.objectId'), isExpanded: computed('model.expand', 'model.properties.length', function () { return this.get('model.expand') && this.get('model.properties.length') > 0; }), actions: { calculate: function calculate(_ref) { var name = _ref.name; var objectId = this.get('objectId'); var mixinIndex = this.get('mixinDetails.model.mixins').indexOf(this.get('model')); this.get('port').send('objectInspector:calculate', { objectId: objectId, mixinIndex: mixinIndex, property: name }); }, sendToConsole: function sendToConsole(_ref2) { var name = _ref2.name; var objectId = this.get('objectId'); this.get('port').send('objectInspector:sendToConsole', { objectId: objectId, property: name }); }, toggleExpanded: function toggleExpanded() { this.toggleProperty('isExpanded'); }, digDeeper: function digDeeper(_ref3) { var name = _ref3.name; var objectId = this.get('objectId'); this.get('port').send('objectInspector:digDeeper', { objectId: objectId, property: name }); }, saveProperty: function saveProperty(property, value, dataType) { var mixinIndex = this.get('mixinDetails.model.mixins').indexOf(this.get('model')); this.get('port').send('objectInspector:saveProperty', { objectId: this.get('objectId'), property: property, value: value, mixinIndex: mixinIndex, dataType: dataType }); } } }); }); define('ember-inspector/components/mixin-details', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; exports['default'] = Component.extend({ actions: { traceErrors: function traceErrors() { this.get('port').send('objectInspector:traceErrors', { objectId: this.get('model.objectId') }); } } }); }); define('ember-inspector/components/mixin-property', ['exports', 'ember'], function (exports, _ember) { var computed = _ember['default'].computed; var Component = _ember['default'].Component; var equal = computed.equal; var alias = computed.alias; exports['default'] = Component.extend({ isEdit: false, /** * Passed through the template. * * The mixin-detail component * @type {Ember.Component} */ mixin: null, // Bound to editing textbox txtValue: null, dateValue: null, isCalculated: computed('model.value.type', function () { return this.get('model.value.type') !== 'type-descriptor'; }), isEmberObject: equal('model.value.type', 'type-ember-object'), isComputedProperty: alias('model.value.computed'), isFunction: equal('model.value.type', 'type-function'), isArray: equal('model.value.type', 'type-array'), isDate: equal('model.value.type', 'type-date'), _parseTextValue: function _parseTextValue(value) { var parsedValue = undefined; try { parsedValue = JSON.parse(value); } catch (e) { // if surrounded by quotes, remove quotes var match = value.match(/^"(.*)"$/); if (match && match.length > 1) { parsedValue = match[1]; } else { parsedValue = value; } } return parsedValue; }, actions: { valueClick: function valueClick() { if (this.get('isEmberObject') || this.get('isArray')) { this.get('mixin').send('digDeeper', this.get('model')); return; } if (this.get('isComputedProperty') && !this.get('isCalculated')) { this.get('mixin').send('calculate', this.get('model')); return; } if (this.get('isFunction') || this.get('model.overridden') || this.get('model.readOnly')) { return; } var value = this.get('model.value.inspect'); var type = this.get('model.value.type'); if (type === 'type-string') { value = '"' + value + '"'; } if (!this.get('isDate')) { this.set('txtValue', value); } else { this.set('dateValue', new Date(value)); } this.set('isEdit', true); }, saveProperty: function saveProperty() { var realValue = undefined, dataType = undefined; if (!this.get('isDate')) { realValue = this._parseTextValue(this.get('txtValue')); } else { realValue = this.get('dateValue').getTime(); dataType = 'date'; } this.get('mixin').send('saveProperty', this.get('model.name'), realValue, dataType); }, finishedEditing: function finishedEditing() { this.set('isEdit', false); }, dateSelected: function dateSelected(val) { this.set('dateValue', val); this.send('saveProperty'); this.send('finishedEditing'); } } }); }); define('ember-inspector/components/object-inspector', ['exports', 'ember'], function (exports, _ember) { var _slice = Array.prototype.slice; var Component = _ember['default'].Component; var computed = _ember['default'].computed; var get = _ember['default'].get; exports['default'] = Component.extend({ tagName: '', /** * Application Controller passed * through the template * * @property application * @type {Controller} */ application: null, trail: computed('model.[]', function () { var nested = this.get('model').slice(1); if (nested.length === 0) { return ""; } return '.' + nested.mapBy('property').join("."); }), isNested: computed('model.[]', function () { return this.get('model.length') > 1; }), actions: { popStack: function popStack() { if (this.get('isNested')) { this.get('application').popMixinDetails(); } }, sendObjectToConsole: function sendObjectToConsole(obj) { var objectId = get(obj, 'objectId'); this.get('port').send('objectInspector:sendToConsole', { objectId: objectId }); }, toggleInspector: function toggleInspector() { this.sendAction.apply(this, ['toggleInspector'].concat(_slice.call(arguments))); } } }); }); define('ember-inspector/components/occludable-area', ['exports', 'smoke-and-mirrors/components/occludable-area'], function (exports, _smokeAndMirrorsComponentsOccludableArea) { Object.defineProperty(exports, 'default', { enumerable: true, get: function get() { return _smokeAndMirrorsComponentsOccludableArea['default']; } }); }); define('ember-inspector/components/pikaday-input', ['exports', 'ember', 'ember-pikaday/components/pikaday-input'], function (exports, _ember, _emberPikadayComponentsPikadayInput) { exports['default'] = _emberPikadayComponentsPikadayInput['default']; }); define('ember-inspector/components/pre-render', ['exports', 'smoke-and-mirrors/components/pre-render'], function (exports, _smokeAndMirrorsComponentsPreRender) { Object.defineProperty(exports, 'default', { enumerable: true, get: function get() { return _smokeAndMirrorsComponentsPreRender['default']; } }); }); define('ember-inspector/components/promise-item', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var htmlSafe = _ember['default'].String.htmlSafe; var isEmpty = _ember['default'].isEmpty; var notEmpty = computed.notEmpty; var gt = computed.gt; var equal = computed.equal; var COLOR_MAP = { red: '#ff2717', blue: '#174fff', green: '#006400' }; exports['default'] = Component.extend({ tagName: '', filter: null, effectiveSearch: null, isError: equal('model.reason.type', 'type-error'), style: computed('model.state', function () { var color = ''; if (this.get('model.isFulfilled')) { color = 'green'; } else if (this.get('model.isRejected')) { color = 'red'; } else { color = 'blue'; } return htmlSafe('background-color: ' + COLOR_MAP[color] + '; color: white;'); }), nodeStyle: computed('model.state', 'filter', 'effectiveSearch', function () { var relevant = undefined; switch (this.get('filter')) { case 'pending': relevant = this.get('model.isPending'); break; case 'rejected': relevant = this.get('model.isRejected'); break; case 'fulfilled': relevant = this.get('model.isFulfilled'); break; default: relevant = true; } if (relevant && !isEmpty(this.get('effectiveSearch'))) { relevant = this.get('model').matchesExactly(this.get('effectiveSearch')); } if (!relevant) { return 'opacity: 0.3;'; } else { return ''; } }), labelStyle: computed('model.level', 'nodeStyle', function () { return htmlSafe('padding-left: ' + (+this.get('model.level') * 20 + 5) + 'px;' + this.get('nodeStyle')); }), expandedClass: computed('hasChildren', 'model.isExpanded', function () { if (!this.get('hasChildren')) { return; } if (this.get('model.isExpanded')) { return 'list__cell_arrow_expanded'; } else { return 'list__cell_arrow_collapsed'; } }), hasChildren: gt('model.children.length', 0), settledValue: computed('model.value', function () { if (this.get('model.isFulfilled')) { return this.get('model.value'); } else if (this.get('model.isRejected')) { return this.get('model.reason'); } else { return '--'; } }), isValueInspectable: notEmpty('settledValue.objectId'), hasValue: computed('settledValue', 'model.isSettled', function () { return this.get('model.isSettled') && this.get('settledValue.type') !== 'type-undefined'; }), label: computed('model.label', function () { return this.get('model.label') || !!this.get('model.parent') && 'Then' || '<Unknown Promise>'; }), state: computed('model.state', function () { if (this.get('model.isFulfilled')) { return 'Fulfilled'; } else if (this.get('model.isRejected')) { return 'Rejected'; } else if (this.get('model.parent') && !this.get('model.parent.isSettled')) { return 'Waiting for parent'; } else { return 'Pending'; } }), timeToSettle: computed('model.createdAt', 'model.settledAt', 'model.parent.settledAt', function () { if (!this.get('model.createdAt') || !this.get('model.settledAt')) { return ' -- '; } var startedAt = this.get('model.parent.settledAt') || this.get('model.createdAt'); var remaining = this.get('model.settledAt').getTime() - startedAt.getTime(); return remaining; }) }); }); define('ember-inspector/components/property-field', ['exports', 'ember'], function (exports, _ember) { exports['default'] = _ember['default'].TextField.extend({ attributeBindings: ['label:data-label'], /** * The property-component instance. * Passed through the template. * * @property propertyComponent * @type {Ember.Component} */ properyComponent: null, didInsertElement: function didInsertElement() { this.$().select(); return this._super.apply(this, arguments); }, insertNewline: function insertNewline() { this.get('propertyComponent').send(this.get('save-property')); this.get('propertyComponent').send(this.get('finished-editing')); }, cancel: function cancel() { this.get('propertyComponent').send(this.get('finished-editing')); }, focusOut: function focusOut() { this.get('propertyComponent').send(this.get('finished-editing')); } }); }); define('ember-inspector/components/record-filter', ['exports', 'ember'], function (exports, _ember) { var computed = _ember['default'].computed; var Component = _ember['default'].Component; exports['default'] = Component.extend({ filterValue: null, checked: computed('filterValue', 'model.name', function () { return this.get('filterValue') === this.get('model.name'); }) }); }); define('ember-inspector/components/record-item', ['exports', 'ember', 'ember-inspector/mixins/row-events'], function (exports, _ember, _emberInspectorMixinsRowEvents) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var htmlSafe = _ember['default'].String.htmlSafe; var isEmpty = _ember['default'].isEmpty; var COLOR_MAP = { red: '#ff2717', blue: '#174fff', green: '#006400' }; exports['default'] = Component.extend(_emberInspectorMixinsRowEvents['default'], { /** * No tag. This component should not affect * the DOM. * * @property tagName * @type {String} * @default '' */ tagName: '', modelTypeColumns: null, /** * The index of the current row. Currently used for the * `RowEvents` mixin. This property is passed through * the template. * * @property index * @type {Number} * @default null */ index: null, // TODO: Color record based on `color` property. style: computed('model.color', function () { var string = ''; var colorName = this.get('model.color'); if (!isEmpty(colorName)) { var color = COLOR_MAP[colorName]; if (color) { string = 'color: ' + color + ';'; } } return htmlSafe(string); }), columns: computed('modelTypeColumns.[]', 'model.columnValues', function () { var _this = this; var columns = this.get('modelTypeColumns') || []; return columns.map(function (col) { return { name: col.name, value: _this.get('model.columnValues.' + col.name) }; }); }) }); }); define('ember-inspector/components/reload-button', ['exports', 'ember-inspector/components/icon-button'], function (exports, _emberInspectorComponentsIconButton) { exports['default'] = _emberInspectorComponentsIconButton['default'].extend({ title: 'Reload' }); }); define('ember-inspector/components/render-item', ['exports', 'ember', 'ember-inspector/utils/escape-reg-exp'], function (exports, _ember, _emberInspectorUtilsEscapeRegExp) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var isEmpty = _ember['default'].isEmpty; var isNone = _ember['default'].isNone; var run = _ember['default'].run; var on = _ember['default'].on; var observer = _ember['default'].observer; var htmlSafe = _ember['default'].String.htmlSafe; var gt = computed.gt; var once = run.once; exports['default'] = Component.extend({ tagName: '', search: null, isExpanded: false, expand: function expand() { this.set('isExpanded', true); }, searchChanged: on('init', observer('search', function () { var search = this.get('search'); if (!isEmpty(search)) { once(this, 'expand'); } })), searchMatch: computed('search', 'name', function () { var search = this.get('search'); if (isEmpty(search)) { return true; } var name = this.get('model.name'); var regExp = new RegExp((0, _emberInspectorUtilsEscapeRegExp['default'])(search.toLowerCase())); return !!name.toLowerCase().match(regExp); }), nodeStyle: computed('searchMatch', function () { var style = ''; if (!this.get('searchMatch')) { style = 'opacity: 0.5;'; } return htmlSafe(style); }), level: computed('target.level', function () { var parentLevel = this.get('target.level'); if (isNone(parentLevel)) { parentLevel = -1; } return parentLevel + 1; }), nameStyle: computed('level', function () { return htmlSafe('padding-left: ' + (+this.get('level') * 20 + 5) + 'px;'); }), hasChildren: gt('model.children.length', 0), expandedClass: computed('hasChildren', 'isExpanded', function () { if (!this.get('hasChildren')) { return; } if (this.get('isExpanded')) { return 'list__cell_arrow_expanded'; } else { return 'list__cell_arrow_collapsed'; } }), readableTime: computed('model.timestamp', function () { var d = new Date(this.get('model.timestamp')); var ms = d.getMilliseconds(); var seconds = d.getSeconds(); var minutes = d.getMinutes().toString().length === 1 ? '0' + d.getMinutes() : d.getMinutes(); var hours = d.getHours().toString().length === 1 ? '0' + d.getHours() : d.getHours(); return hours + ':' + minutes + ':' + seconds + ':' + ms; }), actions: { toggleExpand: function toggleExpand() { this.toggleProperty('isExpanded'); } } }); }); define('ember-inspector/components/resizable-column', ['exports', 'ember'], function (exports, _ember) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var htmlSafe = _ember['default'].String.htmlSafe; exports['default'] = Component.extend({ width: null, attributeBindings: ['style'], style: computed('width', function () { return htmlSafe('-webkit-flex: none; flex: none; width: ' + this.get('width') + 'px;'); }), didInsertElement: function didInsertElement() { if (!this.get('width')) { this.set('width', this.$().width()); } } }); }); define('ember-inspector/components/route-item', ['exports', 'ember', 'ember-inspector/utils/check-current-route'], function (exports, _ember, _emberInspectorUtilsCheckCurrentRoute) { var Component = _ember['default'].Component; var computed = _ember['default'].computed; var htmlSafe = _ember['default'].String.htmlSafe; exports['default'] = Component.extend({ // passed as an attribute to the component currentRoute: null, /** * No tag. This component should not affect * the DOM. * * @property tagName * @type {String} * @default '' */ tagName: '', labelStyle: computed('model.parentCount', function () { return htmlSafe('padding-left: ' + (+this.get('model.parentCount') * 20 + 5) + 'px;'); }), isCurrent: computed('currentRoute', 'model.value.name', function () { var currentRoute = this.get('currentRoute'); if (!currentRoute) { return false;