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
JavaScript
"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;