Skip to content

Commit 592e9cf

Browse files
committed
provide debug utlities for inspector via event communication
1 parent 12106b7 commit 592e9cf

File tree

8 files changed

+146
-3
lines changed

8 files changed

+146
-3
lines changed

packages/@ember/-internals/metal/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ export {
7070
} from './lib/observer';
7171
export { default as inject, DEBUG_INJECTION_FUNCTIONS } from './lib/injected_property';
7272
export { tagForProperty, tagForObject, markObjectAsDirty } from './lib/tags';
73-
export { tracked, TrackedDescriptor } from './lib/tracked';
74-
export { cached } from './lib/cached';
73+
export { tracked, TrackedDescriptor, isTrackedProperty } from './lib/tracked';
74+
export { cached, isCachedProperty } from './lib/cached';
7575
export { createCache, getValue, isConst } from './lib/cache';
7676

7777
export {

packages/@ember/-internals/metal/lib/cached.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import { DEBUG } from '@glimmer/env';
55
import { createCache, getValue } from '@glimmer/validator';
66

7+
const CacheMap = new WeakMap();
8+
79
/**
810
* @decorator
911
*
@@ -84,7 +86,7 @@ import { createCache, getValue } from '@glimmer/validator';
8486
the subsequent cache invalidations of the `@cached` properties who were
8587
using this `trackedProp`.
8688
87-
Remember that setting tracked data should only be done during initialization,
89+
Remember that setting tracked data should only be done during initialization,
8890
or as the result of a user action. Setting tracked data during render
8991
(such as in a getter), is not supported.
9092
@@ -111,6 +113,8 @@ export const cached: MethodDecorator = (...args: any[]) => {
111113
throwCachedGetterOnlyError(key);
112114
}
113115

116+
CacheMap.set(target, [...CacheMap.get(target)||[], key]);
117+
114118
const caches = new WeakMap();
115119
const getter = descriptor.get;
116120

@@ -144,3 +148,8 @@ function throwCachedInvalidArgsError(args: unknown[] = []): never {
144148
)}), which is not supported. Dependencies are automatically tracked, so you can just use ${'`@cached`'}`
145149
);
146150
}
151+
152+
153+
export function isCachedProperty(object: object, prop: string) {
154+
return (CacheMap.get(object) || []).includes(prop);
155+
}

packages/@ember/-internals/metal/lib/tracked.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,8 @@ export class TrackedDescriptor {
200200
this._set.call(obj, value);
201201
}
202202
}
203+
204+
205+
export function isTrackedProperty(object: object, prop: string): boolean {
206+
return metaFor(object).peekDescriptors(prop) instanceof TrackedDescriptor;
207+
}

packages/@ember/-internals/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ export {
3232
setupMandatorySetter,
3333
teardownMandatorySetter,
3434
setWithMandatorySetter,
35+
isMandatorySetter
3536
} from './lib/mandatory-setter';

packages/@ember/-internals/utils/lib/mandatory-setter.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export let setupMandatorySetter:
99
export let teardownMandatorySetter: ((obj: object, keyName: string | symbol) => void) | undefined;
1010
export let setWithMandatorySetter: ((obj: object, keyName: string, value: any) => void) | undefined;
1111

12+
export let isMandatorySetter: ((obj: object, keyName: string) => boolean) | undefined;
13+
1214
type PropertyDescriptorWithMeta = PropertyDescriptor & { hadOwnProperty?: boolean };
1315

1416
function isElementKey(key: string | number | symbol) {
@@ -24,6 +26,7 @@ function isPositiveInt(num: number) {
2426
return num >= 0 && num % 1 === 0;
2527
}
2628

29+
2730
if (DEBUG) {
2831
let SEEN_TAGS = new WeakSet();
2932

@@ -93,6 +96,11 @@ if (DEBUG) {
9396
});
9497
};
9598

99+
isMandatorySetter = function (obj: object, keyName: string) {
100+
let setters = MANDATORY_SETTERS.get(obj);
101+
return setters !== undefined && setters[keyName] !== undefined;
102+
}
103+
96104
teardownMandatorySetter = function (obj: object, keyName: string | symbol) {
97105
let setters = MANDATORY_SETTERS.get(obj);
98106

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
2+
// required for inspector
3+
import { isTesting } from './lib/testing';
4+
import { _backburner, cancel, debounce, join, later, scheduleOnce } from '@ember/runloop';
5+
import { cacheFor, guidFor } from '@ember/object/internals';
6+
import { default as MutableArray } from '@ember/array/mutable';
7+
import { default as Namespace } from '@ember/application/namespace';
8+
import { default as MutableEnumerable } from'@ember/enumerable/mutable';
9+
import { NativeArray } from '@ember/array';
10+
import { ControllerMixin } from '@ember/controller';
11+
import { default as CoreObject } from '@ember/object/core';
12+
import { default as Application } from '@ember/application';
13+
import { default as EmberComponent } from '@ember/component';
14+
import { default as Observable } from '@ember/object/observable';
15+
import { default as Evented } from '@ember/object/evented';
16+
import { default as PromiseProxyMixin } from '@ember/object/promise-proxy-mixin';
17+
import { default as EmberObject } from '@ember/object';
18+
import { default as VERSION } from 'ember/version';
19+
import { ComputedProperty, isComputed, descriptorForProperty, descriptorForDecorator, tagForProperty } from '@ember/-internals/metal';
20+
import { isMandatorySetter } from '@ember/-internals/utils'
21+
import { meta } from '@ember/-internals/meta';
22+
import { TargetActionSupport } from '@ember/-internals/runtime';
23+
import {
24+
ViewStateSupport,
25+
ViewMixin,
26+
ActionSupport,
27+
ClassNamesSupport,
28+
ChildViewsSupport,
29+
CoreView
30+
} from '@ember/-internals/views';
31+
import { set, get } from '@ember/object';
32+
import { isTrackedProperty } from '@ember/-internals/metal';
33+
import { isCachedProperty } from '@ember/-internals/metal';
34+
import { default as inspect } from './lib/inspect';
35+
import { subscribe } from '../instrumentation';
36+
import { default as captureRenderTree } from './lib/capture-render-tree';
37+
import { registerHandler as registerDeprecationHandler } from './lib/deprecate';
38+
import * as GlimmerValidator from '@glimmer/validator';
39+
import * as GlimmerRuntime from '@glimmer/runtime';
40+
import { getOwner } from '@ember/owner';
41+
import RSVP from 'rsvp';
42+
43+
export function setupInspectorSupport() {
44+
if (typeof window !== 'undefined' && window.addEventListener) {
45+
window.addEventListener(
46+
'ember-inspector-debug-request',
47+
() => {
48+
const event = new CustomEvent("ember-inspector-debug-response", { detail: {
49+
runloop: {
50+
_backburner,
51+
cancel,
52+
debounce,
53+
join,
54+
later,
55+
scheduleOnce,
56+
},
57+
object: {
58+
cacheFor,
59+
guidFor,
60+
getOwner,
61+
set,
62+
get,
63+
meta
64+
},
65+
debug: {
66+
isComputed,
67+
isTrackedProperty,
68+
isCachedProperty,
69+
descriptorForProperty,
70+
descriptorForDecorator,
71+
isMandatorySetter,
72+
meta,
73+
captureRenderTree,
74+
isTesting,
75+
inspect,
76+
registerDeprecationHandler,
77+
tagForProperty,
78+
ComputedProperty,
79+
},
80+
classes: {
81+
EmberObject,
82+
MutableArray,
83+
Namespace,
84+
MutableEnumerable,
85+
NativeArray,
86+
TargetActionSupport,
87+
ControllerMixin,
88+
CoreObject,
89+
Application,
90+
EmberComponent,
91+
Observable,
92+
Evented,
93+
PromiseProxyMixin,
94+
},
95+
VERSION,
96+
instrumentation: {
97+
subscribe
98+
},
99+
Views: {
100+
ViewStateSupport,
101+
ViewMixin,
102+
ActionSupport,
103+
ClassNamesSupport,
104+
ChildViewsSupport,
105+
CoreView
106+
},
107+
GlimmerValidator,
108+
GlimmerRuntime,
109+
RSVP
110+
}
111+
});
112+
globalThis.dispatchEvent(event);
113+
},
114+
false
115+
);
116+
}
117+
}

packages/@ember/debug/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"exports": {
66
".": "./index.ts",
77
"./container-debug-adapter": "./container-debug-adapter.ts",
8+
"./ember-inspector": "./ember-inspector.ts",
89
"./data-adapter": "./data-adapter.ts"
910
},
1011
"dependencies": {

packages/ember/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { meta as internalMeta } from '@ember/-internals/meta';
1313
import * as metal from '@ember/-internals/metal';
1414
import { FEATURES as EmberFEATURES, isEnabled } from '@ember/canary-features';
1515
import * as EmberDebug from '@ember/debug';
16+
import { setupInspectorSupport } from '@ember/debug/ember-inspector';
1617
import { assert as emberAssert, captureRenderTree } from '@ember/debug';
1718
import Backburner from 'backburner.js';
1819
import EmberController, {
@@ -745,6 +746,7 @@ function defineEmberTestingLazyLoad(key: 'Test' | 'setupForTesting') {
745746
defineEmberTestingLazyLoad('Test');
746747
defineEmberTestingLazyLoad('setupForTesting');
747748

749+
setupInspectorSupport();
748750
// @ts-expect-error Per types, runLoadHooks requires a second parameter. Should we loosen types?
749751
applicationRunLoadHooks('Ember');
750752

0 commit comments

Comments
 (0)