ember-inspector 4.11.0-alpha.2024.3.3 → 4.11.0-alpha.2024.3.30
Sign up to get free protection for your applications and to get access to all the features.
- package/app/components/component-tree-arg.js +9 -0
- package/app/components/component-tree-item.hbs +18 -2
- package/app/components/object-inspector/properties-all.hbs +1 -0
- package/app/components/object-inspector/properties-base.js +10 -0
- package/app/components/object-inspector/properties-grouped.hbs +1 -0
- package/app/components/object-inspector/property.hbs +12 -1
- package/app/components/object-inspector/property.ts +4 -2
- package/app/components/object-inspector.hbs +16 -2
- package/app/components/object-inspector.js +14 -0
- package/app/controllers/component-tree.js +54 -3
- package/app/routes/component-tree.js +0 -6
- package/app/services/adapters/web-extension.js +3 -3
- package/app/services/port.js +4 -0
- package/app/styles/component_tree.scss +13 -0
- package/app/utils/parse-text.ts +1 -0
- package/dist/bookmarklet/panes-3-16-0/assets/{chunk.143.65e8b782428715aeb6e2.js → chunk.143.87087d5ea474913fabca.js} +4 -4
- package/dist/{firefox/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → bookmarklet/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
- package/dist/bookmarklet/panes-3-16-0/assets/ember-inspector.css +13 -0
- package/dist/bookmarklet/panes-3-16-0/assets/ember-inspector.js +27 -23
- package/dist/bookmarklet/panes-3-16-0/assets/svg/code-source.svg +9 -0
- package/dist/bookmarklet/panes-3-16-0/assets/vendor.css +33 -0
- package/dist/bookmarklet/panes-3-16-0/assets/vendor.js +12 -10
- package/dist/bookmarklet/panes-3-16-0/ember_debug.js +408 -538
- package/dist/bookmarklet/panes-3-16-0/index.html +2 -2
- package/dist/chrome/manifest.json +2 -2
- package/dist/{firefox/panes-3-16-0/assets/chunk.143.65e8b782428715aeb6e2.js → chrome/panes-3-16-0/assets/chunk.143.87087d5ea474913fabca.js} +4 -4
- package/dist/{bookmarklet/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → chrome/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
- package/dist/chrome/panes-3-16-0/assets/ember-inspector.css +13 -0
- package/dist/chrome/panes-3-16-0/assets/ember-inspector.js +27 -23
- package/dist/chrome/panes-3-16-0/assets/svg/code-source.svg +9 -0
- package/dist/chrome/panes-3-16-0/assets/vendor.css +33 -0
- package/dist/chrome/panes-3-16-0/assets/vendor.js +12 -10
- package/dist/chrome/panes-3-16-0/ember_debug.js +408 -538
- package/dist/chrome/panes-3-16-0/index.html +2 -2
- package/dist/firefox/manifest.json +2 -2
- package/dist/{chrome/panes-3-16-0/assets/chunk.143.65e8b782428715aeb6e2.js → firefox/panes-3-16-0/assets/chunk.143.87087d5ea474913fabca.js} +4 -4
- package/dist/{websocket/assets/chunk.178.b3278ef5f9ba6c444877.js → firefox/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
- package/dist/firefox/panes-3-16-0/assets/ember-inspector.css +13 -0
- package/dist/firefox/panes-3-16-0/assets/ember-inspector.js +27 -23
- package/dist/firefox/panes-3-16-0/assets/svg/code-source.svg +9 -0
- package/dist/firefox/panes-3-16-0/assets/vendor.css +33 -0
- package/dist/firefox/panes-3-16-0/assets/vendor.js +12 -10
- package/dist/firefox/panes-3-16-0/ember_debug.js +408 -538
- package/dist/firefox/panes-3-16-0/index.html +2 -2
- package/dist/websocket/assets/{chunk.143.65e8b782428715aeb6e2.js → chunk.143.87087d5ea474913fabca.js} +4 -4
- package/dist/{chrome/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → websocket/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
- package/dist/websocket/assets/ember-inspector.css +13 -0
- package/dist/websocket/assets/ember-inspector.js +27 -23
- package/dist/websocket/assets/svg/code-source.svg +9 -0
- package/dist/websocket/assets/vendor.css +33 -0
- package/dist/websocket/assets/vendor.js +12 -10
- package/dist/websocket/ember_debug.js +408 -538
- package/dist/websocket/index.html +2 -2
- package/ember-cli-build.js +3 -4
- package/ember_debug/adapters/basic.js +4 -4
- package/ember_debug/adapters/web-extension.js +9 -5
- package/ember_debug/general-debug.js +3 -1
- package/ember_debug/libs/capture-render-tree.js +7 -426
- package/ember_debug/libs/render-tree.js +210 -31
- package/ember_debug/libs/view-inspection.js +28 -0
- package/ember_debug/object-inspector.js +49 -88
- package/ember_debug/route-debug.js +2 -3
- package/ember_debug/utils/ember.js +16 -0
- package/ember_debug/utils/get-object-name.js +4 -0
- package/ember_debug/utils/name-functions.js +1 -1
- package/ember_debug/utils/type-check.js +82 -12
- package/ember_debug/utils/version.js +37 -0
- package/ember_debug/view-debug.js +1 -1
- package/lib/ui/addon/styles/_goto-source.scss +30 -0
- package/lib/ui/addon/styles/addon.scss +1 -0
- package/lib/ui/addon/styles/toolbar/_index.scss +4 -0
- package/package.json +1 -1
- package/public/assets/svg/code-source.svg +9 -0
- package/skeletons/web-extension/manifest.json +2 -2
- package/tests/acceptance/object-inspector-test.js +68 -0
- package/tests/ember_debug/view-debug-test.js +211 -69
- package/tests/index.html +1 -0
@@ -9,6 +9,7 @@ try {
|
|
9
9
|
}
|
10
10
|
|
11
11
|
let {
|
12
|
+
ArrayProxy,
|
12
13
|
Namespace,
|
13
14
|
ActionHandler,
|
14
15
|
ControllerMixin,
|
@@ -21,16 +22,25 @@ let {
|
|
21
22
|
Observable,
|
22
23
|
Evented,
|
23
24
|
PromiseProxyMixin,
|
25
|
+
Service,
|
24
26
|
Object: EmberObject,
|
27
|
+
ObjectProxy,
|
25
28
|
VERSION,
|
26
29
|
ComputedProperty,
|
27
30
|
meta,
|
28
31
|
get,
|
29
32
|
set,
|
30
33
|
computed,
|
34
|
+
_captureRenderTree: captureRenderTree,
|
31
35
|
} = Ember || {};
|
32
36
|
|
37
|
+
let getEnv = () => Ember.ENV;
|
38
|
+
|
33
39
|
if (!Ember) {
|
40
|
+
captureRenderTree = emberSafeRequire('@ember/debug')?.captureRenderTree;
|
41
|
+
getEnv = emberSafeRequire('@ember/-internals/environment')?.getENV;
|
42
|
+
ArrayProxy = emberSafeRequire('@ember/array/proxy')?.default;
|
43
|
+
ObjectProxy = emberSafeRequire('@ember/object/proxy')?.default;
|
34
44
|
MutableArray = emberSafeRequire('@ember/array/mutable')?.default;
|
35
45
|
Namespace = emberSafeRequire('@ember/application/namespace')?.default;
|
36
46
|
MutableEnumerable = emberSafeRequire('@ember/enumerable/mutable')?.default;
|
@@ -44,6 +54,7 @@ if (!Ember) {
|
|
44
54
|
PromiseProxyMixin = emberSafeRequire(
|
45
55
|
'@ember/object/promise-proxy-mixin'
|
46
56
|
)?.default;
|
57
|
+
Service = emberSafeRequire('@ember/service')?.default;
|
47
58
|
EmberObject = emberSafeRequire('@ember/object')?.default;
|
48
59
|
VERSION = emberSafeRequire('ember/version')?.default;
|
49
60
|
ComputedProperty = emberSafeRequire(
|
@@ -55,6 +66,7 @@ if (!Ember) {
|
|
55
66
|
}
|
56
67
|
|
57
68
|
export {
|
69
|
+
ArrayProxy,
|
58
70
|
Namespace,
|
59
71
|
ActionHandler,
|
60
72
|
Application,
|
@@ -63,9 +75,11 @@ export {
|
|
63
75
|
MutableEnumerable,
|
64
76
|
NativeArray,
|
65
77
|
CoreObject,
|
78
|
+
ObjectProxy,
|
66
79
|
Component,
|
67
80
|
Observable,
|
68
81
|
Evented,
|
82
|
+
Service,
|
69
83
|
PromiseProxyMixin,
|
70
84
|
EmberObject,
|
71
85
|
VERSION,
|
@@ -74,6 +88,8 @@ export {
|
|
74
88
|
computed,
|
75
89
|
get,
|
76
90
|
set,
|
91
|
+
captureRenderTree,
|
92
|
+
getEnv,
|
77
93
|
};
|
78
94
|
|
79
95
|
export default Ember;
|
@@ -7,6 +7,10 @@ export default function getObjectName(object) {
|
|
7
7
|
(emberNames.get(object.constructor) || object.constructor.name)) ||
|
8
8
|
'';
|
9
9
|
|
10
|
+
if (object instanceof Function) {
|
11
|
+
return 'Function ' + object.name;
|
12
|
+
}
|
13
|
+
|
10
14
|
// check if object is a primitive value
|
11
15
|
if (object !== Object(object)) {
|
12
16
|
return typeof object;
|
@@ -1,5 +1,9 @@
|
|
1
|
-
import Debug from 'ember-debug/utils/ember/debug';
|
2
|
-
import {
|
1
|
+
import Debug, { inspect as emberInspect } from 'ember-debug/utils/ember/debug';
|
2
|
+
import {
|
3
|
+
ComputedProperty,
|
4
|
+
EmberObject,
|
5
|
+
meta as emberMeta,
|
6
|
+
} from 'ember-debug/utils/ember';
|
3
7
|
import { emberSafeRequire } from 'ember-debug/utils/ember/loader';
|
4
8
|
|
5
9
|
/**
|
@@ -21,14 +25,6 @@ export function isComputed(object, key) {
|
|
21
25
|
if (getDescriptorFor(object, key) instanceof ComputedProperty) {
|
22
26
|
return true;
|
23
27
|
}
|
24
|
-
|
25
|
-
// Ember < 3.10
|
26
|
-
return object[key] instanceof ComputedProperty;
|
27
|
-
}
|
28
|
-
|
29
|
-
export function isDescriptor(value) {
|
30
|
-
// Ember >= 1.11
|
31
|
-
return value && typeof value === 'object' && value.isDescriptor;
|
32
28
|
}
|
33
29
|
|
34
30
|
/**
|
@@ -38,11 +34,11 @@ export function isDescriptor(value) {
|
|
38
34
|
* @param {String} key The key for the property on the object
|
39
35
|
*/
|
40
36
|
export function getDescriptorFor(object, key) {
|
41
|
-
if (
|
37
|
+
if (object[key]?.isDescriptor) {
|
42
38
|
return object[key];
|
43
39
|
}
|
44
40
|
|
45
|
-
// exists
|
41
|
+
// exists longer than ember 3.10
|
46
42
|
if (Debug.isComputed) {
|
47
43
|
const { descriptorForDecorator, descriptorForProperty } =
|
48
44
|
emberSafeRequire('@ember/-internals/metal') || {};
|
@@ -61,3 +57,77 @@ export function typeOf(obj) {
|
|
61
57
|
.match(/\s([a-zA-Z]+)/)[1]
|
62
58
|
.toLowerCase();
|
63
59
|
}
|
60
|
+
|
61
|
+
export function inspect(value) {
|
62
|
+
if (typeof value === 'function') {
|
63
|
+
return `${value.name || 'function'}() { ... }`;
|
64
|
+
} else if (value instanceof EmberObject) {
|
65
|
+
return value.toString();
|
66
|
+
} else if (value instanceof HTMLElement) {
|
67
|
+
return `<${value.tagName.toLowerCase()}>`;
|
68
|
+
} else if (typeOf(value) === 'array') {
|
69
|
+
if (value.length === 0) {
|
70
|
+
return '[]';
|
71
|
+
} else if (value.length === 1) {
|
72
|
+
return `[ ${inspect(value[0])} ]`;
|
73
|
+
} else {
|
74
|
+
return `[ ${inspect(value[0])}, ... ]`;
|
75
|
+
}
|
76
|
+
} else if (value instanceof Error) {
|
77
|
+
return `Error: ${value.message}`;
|
78
|
+
} else if (value === null) {
|
79
|
+
return 'null';
|
80
|
+
} else if (typeOf(value) === 'date') {
|
81
|
+
return value.toString();
|
82
|
+
} else if (typeof value === 'object') {
|
83
|
+
// `Ember.inspect` is able to handle this use case,
|
84
|
+
// but it is very slow as it loops over all props,
|
85
|
+
// so summarize to just first 2 props
|
86
|
+
// if it defines a toString, we use that instead
|
87
|
+
if (
|
88
|
+
typeof value.toString === 'function' &&
|
89
|
+
value.toString !== Object.prototype.toString &&
|
90
|
+
value.toString !== Function.prototype.toString
|
91
|
+
) {
|
92
|
+
try {
|
93
|
+
return `<Object:${value.toString()}>`;
|
94
|
+
} catch (e) {
|
95
|
+
//
|
96
|
+
}
|
97
|
+
}
|
98
|
+
let ret = [];
|
99
|
+
let v;
|
100
|
+
let count = 0;
|
101
|
+
let broken = false;
|
102
|
+
|
103
|
+
for (let key in value) {
|
104
|
+
if (!('hasOwnProperty' in value) || value.hasOwnProperty(key)) {
|
105
|
+
if (count++ > 1) {
|
106
|
+
broken = true;
|
107
|
+
break;
|
108
|
+
}
|
109
|
+
v = value[key];
|
110
|
+
if (v === 'toString') {
|
111
|
+
continue;
|
112
|
+
} // ignore useless items
|
113
|
+
if (typeOf(v).includes('function')) {
|
114
|
+
v = `function ${v.name}() { ... }`;
|
115
|
+
}
|
116
|
+
if (typeOf(v) === 'array') {
|
117
|
+
v = `[Array : ${v.length}]`;
|
118
|
+
}
|
119
|
+
if (typeOf(v) === 'object') {
|
120
|
+
v = '[Object]';
|
121
|
+
}
|
122
|
+
ret.push(`${key}: ${v}`);
|
123
|
+
}
|
124
|
+
}
|
125
|
+
let suffix = ' }';
|
126
|
+
if (broken) {
|
127
|
+
suffix = ' ...}';
|
128
|
+
}
|
129
|
+
return `{ ${ret.join(', ')}${suffix}`;
|
130
|
+
} else {
|
131
|
+
return emberInspect(value);
|
132
|
+
}
|
133
|
+
}
|
@@ -23,6 +23,43 @@ export function compareVersion(version1, version2) {
|
|
23
23
|
return 0;
|
24
24
|
}
|
25
25
|
|
26
|
+
/**
|
27
|
+
*
|
28
|
+
* @param specifier e.g. ^5.12.0
|
29
|
+
* @param version 5.13
|
30
|
+
* @return {boolean}
|
31
|
+
*/
|
32
|
+
export function isInVersionSpecifier(specifier, version) {
|
33
|
+
let compared, i, version2;
|
34
|
+
let operator = specifier[0];
|
35
|
+
if (Number.isNaN(+operator)) {
|
36
|
+
specifier = specifier.slice(1);
|
37
|
+
}
|
38
|
+
specifier = cleanupVersion(specifier).split('.');
|
39
|
+
version2 = cleanupVersion(version).split('.');
|
40
|
+
if (operator === '~' && specifier[1] !== version2[1]) {
|
41
|
+
return false;
|
42
|
+
}
|
43
|
+
if (operator === '^' && specifier[0] !== version2[0]) {
|
44
|
+
return false;
|
45
|
+
}
|
46
|
+
|
47
|
+
if (operator === '>' && specifier[0] > version2[0]) {
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
|
51
|
+
for (i = 0; i < 3; i++) {
|
52
|
+
compared = compare(+specifier[i], +version2[i]);
|
53
|
+
if (compared < 0) {
|
54
|
+
return true;
|
55
|
+
}
|
56
|
+
if (compared > 0) {
|
57
|
+
return false;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
return true;
|
61
|
+
}
|
62
|
+
|
26
63
|
/**
|
27
64
|
* Remove -alpha, -beta, etc from versions
|
28
65
|
*
|
@@ -0,0 +1,30 @@
|
|
1
|
+
.goto-source {
|
2
|
+
background: none;
|
3
|
+
border: none;
|
4
|
+
border-bottom: 1px solid transparent;
|
5
|
+
color: var(--base15);
|
6
|
+
cursor: pointer;
|
7
|
+
margin: 0;
|
8
|
+
outline: none;
|
9
|
+
padding: 0;
|
10
|
+
|
11
|
+
svg {
|
12
|
+
vertical-align: middle;
|
13
|
+
}
|
14
|
+
|
15
|
+
.send-chevron {
|
16
|
+
fill: var(--focus);
|
17
|
+
}
|
18
|
+
|
19
|
+
.send-text {
|
20
|
+
fill: var(--base12);
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
.goto-source:hover {
|
25
|
+
border-bottom-color: var(--focus);
|
26
|
+
}
|
27
|
+
|
28
|
+
.goto-source:active {
|
29
|
+
transform: translateY(1px);
|
30
|
+
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "ember-inspector",
|
3
|
-
"version": "4.11.0-alpha.2024.3.
|
3
|
+
"version": "4.11.0-alpha.2024.3.30+cfff718",
|
4
4
|
"description": "Extends developer tools to allow you to better inspect your Ember.js apps.",
|
5
5
|
"repository": "https://github.com/emberjs/ember-inspector",
|
6
6
|
"license": "MIT",
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<svg fill="#000000" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="64px" height="64px" viewBox="0 0 446.381 446.381" xml:space="preserve">
|
2
|
+
|
3
|
+
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
4
|
+
|
5
|
+
<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
|
6
|
+
|
7
|
+
<g id="SVGRepo_iconCarrier"> <g> <g> <circle cx="223.19" cy="223.19" r="50.998"/> <path d="M441.381,193.19h-39.666c-12.701-75.828-72.697-135.823-148.525-148.524V5c0-2.761-2.238-5-5-5h-50c-2.761,0-5,2.239-5,5 v39.666C117.362,57.367,57.367,117.362,44.666,193.19H5c-2.761,0-5,2.239-5,5v50c0,2.762,2.239,5,5,5h39.666 c12.701,75.828,72.696,135.824,148.524,148.525v39.666c0,2.76,2.239,5,5,5h50c2.762,0,5-2.24,5-5v-39.666 c75.828-12.701,135.824-72.697,148.525-148.525h39.666c2.76,0,5-2.238,5-5v-50C446.381,195.429,444.143,193.19,441.381,193.19z M223.19,354.214c-72.247,0-131.024-58.776-131.024-131.024c0-72.247,58.777-131.024,131.024-131.024 c72.248,0,131.025,58.777,131.025,131.024C354.215,295.438,295.438,354.214,223.19,354.214z"/> </g> </g> </g>
|
8
|
+
|
9
|
+
</svg>
|
@@ -2,7 +2,7 @@
|
|
2
2
|
"manifest_version": 3,
|
3
3
|
"name": "Ember Inspector (Nightly)",
|
4
4
|
"description": "Tool for debugging Ember applications.",
|
5
|
-
"version": "2024.3.
|
5
|
+
"version": "2024.3.30",
|
6
6
|
"icons": {
|
7
7
|
"16": "{{PANE_ROOT}}/assets/images/icon16.png",
|
8
8
|
"38": "{{PANE_ROOT}}/assets/images/icon38.png",
|
@@ -74,5 +74,5 @@
|
|
74
74
|
]
|
75
75
|
}
|
76
76
|
],
|
77
|
-
"version_name": "4.11.0 (nightly build 2024.3.
|
77
|
+
"version_name": "4.11.0 (nightly build 2024.3.30 / cfff718)"
|
78
78
|
}
|
@@ -785,6 +785,74 @@ module('Object Inspector', function (hooks) {
|
|
785
785
|
await click('[data-test-send-object-to-console-btn]');
|
786
786
|
});
|
787
787
|
|
788
|
+
test('Goto Source', async function (assert) {
|
789
|
+
assert.expect(6);
|
790
|
+
|
791
|
+
await visit('/');
|
792
|
+
|
793
|
+
await sendMessage({
|
794
|
+
type: 'objectInspector:updateObject',
|
795
|
+
name: 'My Object',
|
796
|
+
objectId: 'object-id',
|
797
|
+
details: [
|
798
|
+
{
|
799
|
+
name: 'Own Properties',
|
800
|
+
expand: true,
|
801
|
+
properties: [
|
802
|
+
{
|
803
|
+
name: 'myProp',
|
804
|
+
value: {
|
805
|
+
inspect: 'func',
|
806
|
+
type: 'type-function',
|
807
|
+
},
|
808
|
+
},
|
809
|
+
],
|
810
|
+
},
|
811
|
+
{
|
812
|
+
name: 'prototype',
|
813
|
+
expand: true,
|
814
|
+
properties: [
|
815
|
+
{
|
816
|
+
name: 'abc',
|
817
|
+
value: {
|
818
|
+
inspect: 'Teddy',
|
819
|
+
type: 'type-string',
|
820
|
+
},
|
821
|
+
},
|
822
|
+
],
|
823
|
+
},
|
824
|
+
],
|
825
|
+
});
|
826
|
+
|
827
|
+
respondWith('objectInspector:gotoSource', ({ objectId, property }) => {
|
828
|
+
assert.strictEqual(objectId, 'object-id');
|
829
|
+
assert.strictEqual(property, undefined);
|
830
|
+
return false;
|
831
|
+
});
|
832
|
+
|
833
|
+
// Grouped View
|
834
|
+
await click('[data-test-goto-class-source-btn]');
|
835
|
+
|
836
|
+
respondWith('objectInspector:gotoSource', ({ objectId, property }) => {
|
837
|
+
assert.strictEqual(objectId, 'object-id');
|
838
|
+
assert.strictEqual(property, 'myProp');
|
839
|
+
return false;
|
840
|
+
});
|
841
|
+
|
842
|
+
await click('[data-test-goto-source-btn]');
|
843
|
+
|
844
|
+
// All View
|
845
|
+
await click('[data-test-object-display-type-all]');
|
846
|
+
|
847
|
+
respondWith('objectInspector:gotoSource', ({ objectId, property }) => {
|
848
|
+
assert.strictEqual(objectId, 'object-id');
|
849
|
+
assert.strictEqual(property, 'myProp');
|
850
|
+
return false;
|
851
|
+
});
|
852
|
+
|
853
|
+
await click('[data-test-goto-source-btn]');
|
854
|
+
});
|
855
|
+
|
788
856
|
test('Read only CPs cannot be edited', async function (assert) {
|
789
857
|
await visit('/');
|
790
858
|
|