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.
Files changed (77) hide show
  1. package/app/components/component-tree-arg.js +9 -0
  2. package/app/components/component-tree-item.hbs +18 -2
  3. package/app/components/object-inspector/properties-all.hbs +1 -0
  4. package/app/components/object-inspector/properties-base.js +10 -0
  5. package/app/components/object-inspector/properties-grouped.hbs +1 -0
  6. package/app/components/object-inspector/property.hbs +12 -1
  7. package/app/components/object-inspector/property.ts +4 -2
  8. package/app/components/object-inspector.hbs +16 -2
  9. package/app/components/object-inspector.js +14 -0
  10. package/app/controllers/component-tree.js +54 -3
  11. package/app/routes/component-tree.js +0 -6
  12. package/app/services/adapters/web-extension.js +3 -3
  13. package/app/services/port.js +4 -0
  14. package/app/styles/component_tree.scss +13 -0
  15. package/app/utils/parse-text.ts +1 -0
  16. package/dist/bookmarklet/panes-3-16-0/assets/{chunk.143.65e8b782428715aeb6e2.js → chunk.143.87087d5ea474913fabca.js} +4 -4
  17. package/dist/{firefox/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → bookmarklet/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
  18. package/dist/bookmarklet/panes-3-16-0/assets/ember-inspector.css +13 -0
  19. package/dist/bookmarklet/panes-3-16-0/assets/ember-inspector.js +27 -23
  20. package/dist/bookmarklet/panes-3-16-0/assets/svg/code-source.svg +9 -0
  21. package/dist/bookmarklet/panes-3-16-0/assets/vendor.css +33 -0
  22. package/dist/bookmarklet/panes-3-16-0/assets/vendor.js +12 -10
  23. package/dist/bookmarklet/panes-3-16-0/ember_debug.js +408 -538
  24. package/dist/bookmarklet/panes-3-16-0/index.html +2 -2
  25. package/dist/chrome/manifest.json +2 -2
  26. package/dist/{firefox/panes-3-16-0/assets/chunk.143.65e8b782428715aeb6e2.js → chrome/panes-3-16-0/assets/chunk.143.87087d5ea474913fabca.js} +4 -4
  27. package/dist/{bookmarklet/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → chrome/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
  28. package/dist/chrome/panes-3-16-0/assets/ember-inspector.css +13 -0
  29. package/dist/chrome/panes-3-16-0/assets/ember-inspector.js +27 -23
  30. package/dist/chrome/panes-3-16-0/assets/svg/code-source.svg +9 -0
  31. package/dist/chrome/panes-3-16-0/assets/vendor.css +33 -0
  32. package/dist/chrome/panes-3-16-0/assets/vendor.js +12 -10
  33. package/dist/chrome/panes-3-16-0/ember_debug.js +408 -538
  34. package/dist/chrome/panes-3-16-0/index.html +2 -2
  35. package/dist/firefox/manifest.json +2 -2
  36. package/dist/{chrome/panes-3-16-0/assets/chunk.143.65e8b782428715aeb6e2.js → firefox/panes-3-16-0/assets/chunk.143.87087d5ea474913fabca.js} +4 -4
  37. package/dist/{websocket/assets/chunk.178.b3278ef5f9ba6c444877.js → firefox/panes-3-16-0/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
  38. package/dist/firefox/panes-3-16-0/assets/ember-inspector.css +13 -0
  39. package/dist/firefox/panes-3-16-0/assets/ember-inspector.js +27 -23
  40. package/dist/firefox/panes-3-16-0/assets/svg/code-source.svg +9 -0
  41. package/dist/firefox/panes-3-16-0/assets/vendor.css +33 -0
  42. package/dist/firefox/panes-3-16-0/assets/vendor.js +12 -10
  43. package/dist/firefox/panes-3-16-0/ember_debug.js +408 -538
  44. package/dist/firefox/panes-3-16-0/index.html +2 -2
  45. package/dist/websocket/assets/{chunk.143.65e8b782428715aeb6e2.js → chunk.143.87087d5ea474913fabca.js} +4 -4
  46. package/dist/{chrome/panes-3-16-0/assets/chunk.178.b3278ef5f9ba6c444877.js → websocket/assets/chunk.178.99371fccdb5c663d4a27.js} +3 -3
  47. package/dist/websocket/assets/ember-inspector.css +13 -0
  48. package/dist/websocket/assets/ember-inspector.js +27 -23
  49. package/dist/websocket/assets/svg/code-source.svg +9 -0
  50. package/dist/websocket/assets/vendor.css +33 -0
  51. package/dist/websocket/assets/vendor.js +12 -10
  52. package/dist/websocket/ember_debug.js +408 -538
  53. package/dist/websocket/index.html +2 -2
  54. package/ember-cli-build.js +3 -4
  55. package/ember_debug/adapters/basic.js +4 -4
  56. package/ember_debug/adapters/web-extension.js +9 -5
  57. package/ember_debug/general-debug.js +3 -1
  58. package/ember_debug/libs/capture-render-tree.js +7 -426
  59. package/ember_debug/libs/render-tree.js +210 -31
  60. package/ember_debug/libs/view-inspection.js +28 -0
  61. package/ember_debug/object-inspector.js +49 -88
  62. package/ember_debug/route-debug.js +2 -3
  63. package/ember_debug/utils/ember.js +16 -0
  64. package/ember_debug/utils/get-object-name.js +4 -0
  65. package/ember_debug/utils/name-functions.js +1 -1
  66. package/ember_debug/utils/type-check.js +82 -12
  67. package/ember_debug/utils/version.js +37 -0
  68. package/ember_debug/view-debug.js +1 -1
  69. package/lib/ui/addon/styles/_goto-source.scss +30 -0
  70. package/lib/ui/addon/styles/addon.scss +1 -0
  71. package/lib/ui/addon/styles/toolbar/_index.scss +4 -0
  72. package/package.json +1 -1
  73. package/public/assets/svg/code-source.svg +9 -0
  74. package/skeletons/web-extension/manifest.json +2 -2
  75. package/tests/acceptance/object-inspector-test.js +68 -0
  76. package/tests/ember_debug/view-debug-test.js +211 -69
  77. 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;
@@ -12,7 +12,7 @@ export function modelName(model) {
12
12
  }
13
13
 
14
14
  if (name.length > 50) {
15
- name = `${name.substr(0, 50)}...`;
15
+ name = `${name.slice(0, 50)}...`;
16
16
  }
17
17
  return name;
18
18
  }
@@ -1,5 +1,9 @@
1
- import Debug from 'ember-debug/utils/ember/debug';
2
- import { ComputedProperty, meta as emberMeta } from 'ember-debug/utils/ember';
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 (isDescriptor(object[key])) {
37
+ if (object[key]?.isDescriptor) {
42
38
  return object[key];
43
39
  }
44
40
 
45
- // exists longeer than ember 3.10
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
  *
@@ -132,7 +132,7 @@ export default class extends DebugPort {
132
132
  * @param {Node} node The DOM node to inspect
133
133
  */
134
134
  inspectNode(node) {
135
- this.adapter.inspectNode(node);
135
+ this.adapter.inspectValue(node);
136
136
  }
137
137
 
138
138
  sendTree(immediate = false) {
@@ -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
+ }
@@ -6,6 +6,7 @@
6
6
  @import 'nav';
7
7
  @import 'pill';
8
8
  @import 'send-to-console';
9
+ @import 'goto-source';
9
10
  @import 'object-inspector-toggle';
10
11
  @import 'split';
11
12
  @import 'toolbar/index';
@@ -17,6 +17,10 @@
17
17
  margin-left: 5px;
18
18
  margin-right: 5px;
19
19
  }
20
+ .toolbar .goto-source {
21
+ margin-left: 5px;
22
+ margin-right: 5px;
23
+ }
20
24
 
21
25
  @import 'checkbox';
22
26
  @import 'divider';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-inspector",
3
- "version": "4.11.0-alpha.2024.3.3+56575c0",
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.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.3 / 56575c0)"
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