Skip to content

Commit c7e2bab

Browse files
committed
provide debug utlities for inspector via event communication
1 parent e5e561f commit c7e2bab

File tree

5 files changed

+137
-1
lines changed

5 files changed

+137
-1
lines changed

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: PropertyDecorator = (...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
@@ -10,6 +10,8 @@ export let setupMandatorySetter:
1010
export let teardownMandatorySetter: ((obj: object, keyName: string | symbol) => void) | undefined;
1111
export let setWithMandatorySetter: ((obj: object, keyName: string, value: any) => void) | undefined;
1212

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

1517
function isElementKey(key: string | number | symbol) {
@@ -25,6 +27,7 @@ function isPositiveInt(num: number) {
2527
return num >= 0 && num % 1 === 0;
2628
}
2729

30+
2831
if (DEBUG) {
2932
let SEEN_TAGS = new WeakSet();
3033

@@ -94,6 +97,11 @@ if (DEBUG) {
9497
});
9598
};
9699

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

packages/@ember/debug/index.ts

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,47 @@ export { default as inspect } from './lib/inspect';
1313
export { isTesting, setTesting } from './lib/testing';
1414
export { default as captureRenderTree } from './lib/capture-render-tree';
1515

16+
// required for inspector
17+
import { _backburner, cancel, debounce, join, later, scheduleOnce } from '@ember/runloop';
18+
import { cacheFor, guidFor } from '@ember/object/internals';
19+
import { default as MutableArray } from '@ember/array/mutable';
20+
import { default as Namespace } from '@ember/application/namespace';
21+
import { default as MutableEnumerable } from'@ember/enumerable/mutable';
22+
import { NativeArray } from '@ember/array';
23+
import { ControllerMixin } from '@ember/controller';
24+
import { default as CoreObject } from '@ember/object/core';
25+
import { default as Application } from '@ember/application';
26+
import { default as EmberComponent } from '@ember/component';
27+
import { default as Observable } from '@ember/object/observable';
28+
import { default as Evented } from '@ember/object/evented';
29+
import { default as PromiseProxyMixin } from '@ember/object/promise-proxy-mixin';
30+
import { default as EmberObject } from '@ember/object';
31+
import { default as VERSION } from 'ember/version';
32+
import { ComputedProperty, isComputed, descriptorForProperty, descriptorForDecorator, tagForProperty } from '@ember/-internals/metal';
33+
import { isMandatorySetter } from '@ember/-internals/utils'
34+
import { meta } from '@ember/-internals/meta';
35+
import { TargetActionSupport } from '@ember/-internals/runtime';
36+
import {
37+
ViewStateSupport,
38+
ViewMixin,
39+
ActionSupport,
40+
ClassNamesSupport,
41+
ChildViewsSupport,
42+
CoreView
43+
} from '@ember/-internals/views';
44+
import { set, get } from '@ember/object';
45+
import { isTrackedProperty } from '@ember/-internals/metal/lib/tracked';
46+
import { isCachedProperty } from '@ember/-internals/metal/lib/cached';
47+
import { default as inspect } from './lib/inspect';
48+
import { subscribe } from '../instrumentation';
49+
import { default as captureRenderTree } from './lib/capture-render-tree';
50+
import { registerHandler as registerDeprecationHandler } from './lib/deprecate';
51+
import * as GlimmerValidator from '@glimmer/validator';
52+
import * as GlimmerRuntime from '@glimmer/runtime';
53+
import { getOwner } from '@glimmer/owner';
54+
import RSVP from 'rsvp';
55+
56+
1657
export type DebugFunctionType =
1758
| 'assert'
1859
| 'info'
@@ -342,6 +383,78 @@ if (DEBUG && !isTesting()) {
342383
},
343384
false
344385
);
386+
window.addEventListener(
387+
'ember-inspector-debug-request',
388+
() => {
389+
const event = new CustomEvent("ember-inspector-debug-response", { detail: {
390+
runloop: {
391+
_backburner,
392+
cancel,
393+
debounce,
394+
join,
395+
later,
396+
scheduleOnce,
397+
},
398+
object: {
399+
cacheFor,
400+
guidFor,
401+
getOwner,
402+
set,
403+
get,
404+
meta
405+
},
406+
debug: {
407+
isComputed,
408+
isTrackedProperty,
409+
isCachedProperty,
410+
descriptorForProperty,
411+
descriptorForDecorator,
412+
isMandatorySetter,
413+
meta,
414+
captureRenderTree,
415+
isTesting,
416+
inspect,
417+
registerDeprecationHandler,
418+
tagForProperty,
419+
ComputedProperty,
420+
infoForTag: GlimmerValidator.infoForTag
421+
},
422+
classes: {
423+
EmberObject,
424+
MutableArray,
425+
Namespace,
426+
MutableEnumerable,
427+
NativeArray,
428+
TargetActionSupport,
429+
ControllerMixin,
430+
CoreObject,
431+
Application,
432+
EmberComponent,
433+
Observable,
434+
Evented,
435+
PromiseProxyMixin,
436+
},
437+
VERSION,
438+
instrumentation: {
439+
subscribe
440+
},
441+
Views: {
442+
ViewStateSupport,
443+
ViewMixin,
444+
ActionSupport,
445+
ClassNamesSupport,
446+
ChildViewsSupport,
447+
CoreView
448+
},
449+
GlimmerValidator,
450+
GlimmerRuntime,
451+
RSVP
452+
}
453+
});
454+
window.dispatchEvent(event);
455+
},
456+
false
457+
);
345458
}
346459
}
347460

0 commit comments

Comments
 (0)