Skip to content

Commit 6408d35

Browse files
More progress removing prototype extensions (#2601)
1 parent 4fe0424 commit 6408d35

File tree

7 files changed

+146
-121
lines changed

7 files changed

+146
-121
lines changed

app/controllers/application.js

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { equal } from '@ember/object/computed';
55
import { debounce, schedule } from '@ember/runloop';
66
import { inject as service } from '@ember/service';
77

8+
import { TrackedArray } from 'tracked-built-ins';
9+
810
export default class ApplicationController extends Controller {
911
/**
1012
* Service used to broadcast changes to the application's layout
@@ -49,7 +51,7 @@ export default class ApplicationController extends Controller {
4951
constructor() {
5052
super(...arguments);
5153

52-
this.mixinStack = [];
54+
this.mixinStack = new TrackedArray([]);
5355
this.mixinDetails = [];
5456
}
5557

@@ -67,15 +69,14 @@ export default class ApplicationController extends Controller {
6769
errors,
6870
};
6971

70-
this.mixinStack.pushObject(details);
72+
this.mixinStack.push(details);
7173
this.set('mixinDetails', details);
7274
}
7375

7476
@action
7577
popMixinDetails() {
76-
let mixinStack = this.mixinStack;
77-
let item = mixinStack.popObject();
78-
this.set('mixinDetails', mixinStack.get('lastObject'));
78+
const item = this.mixinStack.pop();
79+
this.set('mixinDetails', this.mixinStack.at(-1));
7980
this.port.send('objectInspector:releaseObject', {
8081
objectId: item.objectId,
8182
});
@@ -166,26 +167,28 @@ export default class ApplicationController extends Controller {
166167
});
167168
});
168169

169-
this.set('mixinStack', []);
170+
this.set('mixinStack', new TrackedArray([]));
170171
this.pushMixinDetails(name, undefined, objectId, details, errors);
171172
}
172173

173174
@action
174175
droppedObject(objectId) {
175-
let mixinStack = this.mixinStack;
176-
let obj = mixinStack.find((x) => x.objectId === objectId);
176+
let obj = this.mixinStack.find((mixin) => mixin.objectId === objectId);
177177
if (obj) {
178-
let index = mixinStack.indexOf(obj);
179-
let objectsToRemove = [];
178+
let index = this.mixinStack.indexOf(obj);
179+
let objectsToRemove = new TrackedArray([]);
180180
for (let i = index; i >= 0; i--) {
181-
objectsToRemove.pushObject(mixinStack.objectAt(i));
181+
objectsToRemove.push(this.mixinStack.at(i));
182182
}
183183
objectsToRemove.forEach((item) => {
184-
mixinStack.removeObject(item);
184+
const index = this.mixinStack.indexOf(item);
185+
if (index !== -1) {
186+
this.mixinStack.splice(index, 1);
187+
}
185188
});
186189
}
187-
if (mixinStack.get('length') > 0) {
188-
this.set('mixinDetails', mixinStack.get('lastObject'));
190+
if (this.mixinStack.get('length') > 0) {
191+
this.set('mixinDetails', this.mixinStack.at(-1));
189192
} else {
190193
this.set('mixinDetails', null);
191194
}

app/controllers/deprecations.js

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,44 @@
1-
import { action, computed, set } from '@ember/object';
1+
import { action } from '@ember/object';
22
import { inject as service } from '@ember/service';
33
import Controller from '@ember/controller';
4+
import { tracked } from '@glimmer/tracking';
5+
6+
import { TrackedArray } from 'tracked-built-ins';
7+
48
import debounceComputed from 'ember-inspector/computed/debounce';
59
import searchMatch from 'ember-inspector/utils/search-match';
610

711
export default class DeprecationsController extends Controller {
812
@service adapter;
913
@service port;
1014

11-
search = null;
12-
toggleDeprecationWorkflow = false;
15+
deprecations = new TrackedArray([]);
16+
@tracked search = null;
17+
@tracked toggleDeprecationWorkflow = false;
1318

1419
@debounceComputed('search', 300) searchValue;
1520

16-
constructor() {
17-
super(...arguments);
18-
set(this, 'deprecations', []);
19-
}
20-
2121
@action
2222
changeDeprecationWorkflow(e) {
23-
this.set('toggleDeprecationWorkflow', e.target.checked);
23+
this.toggleDeprecationWorkflow = e.target.checked;
2424

2525
this.port.send('deprecation:setOptions', {
2626
options: { toggleDeprecationWorkflow: this.toggleDeprecationWorkflow },
2727
});
2828
}
2929

30-
@computed('[email protected]', 'search')
3130
get filtered() {
3231
return this.deprecations.filter((item) =>
3332
searchMatch(item.message, this.search),
3433
);
3534
}
3635

36+
@action
37+
clear() {
38+
this.port.send('deprecation:clear');
39+
this.deprecations.splice(0, this.deprecations.length);
40+
}
41+
3742
@action
3843
openResource(item) {
3944
this.adapter.openResource(item.fullSource, item.line);

app/controllers/promise-tree.js

Lines changed: 60 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,44 @@
1-
// eslint-disable-next-line ember/no-observers
2-
import { action, observer } from '@ember/object';
1+
import { action } from '@ember/object';
32
import Controller from '@ember/controller';
43
import { inject as service } from '@ember/service';
54
import { isEmpty } from '@ember/utils';
6-
import { equal, bool, and, not, filter } from '@ember/object/computed';
75
import { debounce, next, once } from '@ember/runloop';
6+
import { tracked } from '@glimmer/tracking';
7+
8+
// eslint-disable-next-line ember/no-observers
9+
import { observes } from '@ember-decorators/object';
810

9-
export default Controller.extend({
10-
queryParams: ['filter'],
11+
export default class PromiseTreeController extends Controller {
12+
queryParams = ['filter'];
1113

12-
adapter: service(),
13-
port: service(),
14+
@service adapter;
15+
@service port;
1416

15-
createdAfter: null,
17+
@tracked createdAfter = null;
18+
@tracked filter = 'all';
19+
@tracked searchValue = null;
20+
@tracked effectiveSearch = null;
1621

1722
// below used to show the "refresh" message
18-
isEmpty: equal('model.length', 0),
19-
wasCleared: bool('createdAfter'),
20-
neverCleared: not('wasCleared'),
21-
shouldRefresh: and('isEmpty', 'neverCleared'),
23+
get isEmpty() {
24+
return this.model.length === 0;
25+
}
26+
get wasCleared() {
27+
return Boolean(this.createdAfter);
28+
}
29+
get neverCleared() {
30+
return !this.wasCleared;
31+
}
32+
get shouldRefresh() {
33+
return this.isEmpty && this.neverCleared;
34+
}
2235

2336
// Keep track of promise stack traces.
2437
// It is opt-in due to performance reasons.
25-
instrumentWithStack: false,
38+
@tracked instrumentWithStack = false;
2639

27-
/* jscs:disable validateIndentation */
28-
filtered: filter(
29-
'model.@each.{createdAt,fulfilledBranch,rejectedBranch,pendingBranch,isVisible}',
30-
function (item) {
40+
get filtered() {
41+
return this.model.filter((item) => {
3142
// exclude cleared promises
3243
if (this.createdAfter && item.get('createdAt') < this.createdAfter) {
3344
return false;
@@ -60,27 +71,25 @@ export default Controller.extend({
6071
return item.matches(search);
6172
}
6273
return true;
63-
},
64-
),
65-
/* jscs:enable validateIndentation */
66-
67-
filter: 'all',
68-
searchValue: null,
69-
effectiveSearch: null,
74+
});
75+
}
7076

7177
// eslint-disable-next-line ember/no-observers
72-
searchChanged: observer('searchValue', function () {
78+
@observes('searchValue')
79+
searchChanged() {
7380
debounce(this, this.notifyChange, 500);
74-
}),
81+
}
7582

83+
@action
7684
notifyChange() {
77-
this.set('effectiveSearch', this.searchValue);
85+
this.effectiveSearch = this.searchValue;
7886
next(() => {
7987
this.notifyPropertyChange('model');
8088
});
81-
},
89+
}
8290

83-
toggleExpand: action(function (promise) {
91+
@action
92+
toggleExpand(promise) {
8493
let isExpanded = !promise.get('isExpanded');
8594
promise.set('isManuallyExpanded', isExpanded);
8695
promise.recalculateExpanded();
@@ -94,37 +103,43 @@ export default Controller.extend({
94103
}
95104
});
96105
}
97-
}),
106+
}
98107

99-
tracePromise: action(function (promise) {
108+
@action
109+
tracePromise(promise) {
100110
this.port.send('promise:tracePromise', { promiseId: promise.get('guid') });
101-
}),
111+
}
102112

103-
inspectObject: action(function () {
113+
@action
114+
inspectObject() {
104115
this.target.send('inspectObject', ...arguments);
105-
}),
116+
}
106117

107-
sendValueToConsole: action(function (promise) {
118+
@action
119+
sendValueToConsole(promise) {
108120
this.port.send('promise:sendValueToConsole', {
109121
promiseId: promise.get('guid'),
110122
});
111-
}),
123+
}
112124

113-
setFilter: action(function (filter) {
114-
this.set('filter', filter);
125+
@action
126+
setFilter(filter) {
127+
this.filter = filter;
115128
next(() => {
116129
this.notifyPropertyChange('filtered');
117130
});
118-
}),
131+
}
119132

120-
updateInstrumentWithStack: action(function (bool) {
133+
@action
134+
updateInstrumentWithStack(bool) {
121135
this.port.send('promise:setInstrumentWithStack', {
122136
instrumentWithStack: bool,
123137
});
124-
}),
138+
}
125139

126-
clear: action(function () {
127-
this.set('createdAfter', new Date());
140+
@action
141+
clear() {
142+
this.createdAfter = new Date();
128143
once(this, this.notifyChange);
129-
}),
130-
});
144+
}
145+
}

app/libs/promise-assembler.js

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@ import EmberObject from '@ember/object';
44
import EventedMixin from '@ember/object/evented';
55
import Promise from 'ember-inspector/models/promise';
66

7+
import { TrackedArray } from 'tracked-built-ins';
8+
import { tracked } from '@glimmer/tracking';
9+
710
export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
811
// Used to track whether current message received
912
// is the first in the request
1013
// Mainly helps in triggering 'firstMessageReceived' event
11-
firstMessageReceived = false;
14+
@tracked firstMessageReceived = false;
15+
16+
all = new TrackedArray([]);
17+
topSort = new TrackedArray([]);
1218

1319
init() {
1420
super.init(...arguments);
1521

16-
this.all = [];
17-
this.topSort = [];
1822
this.topSortMeta = {};
1923
this.promiseIndex = {};
2024
}
@@ -33,9 +37,9 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
3337
reset() {
3438
this.set('topSortMeta', {});
3539
this.set('promiseIndex', {});
36-
this.topSort.clear();
40+
this.topSort.splice(0, this.topSort.length);
3741

38-
this.set('firstMessageReceived', false);
42+
this.firstMessageReceived = false;
3943
let all = this.all;
4044
// Lazily destroy promises
4145
// Allows for a smooth transition on deactivate,
@@ -47,7 +51,7 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
4751
},
4852
500,
4953
);
50-
this.set('all', []);
54+
this.set('all', new TrackedArray([]));
5155
}
5256

5357
destroyPromises(promises) {
@@ -60,7 +64,7 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
6064
this.rebuildPromises(message.promises);
6165

6266
if (!this.firstMessageReceived) {
63-
this.set('firstMessageReceived', true);
67+
this.firstMessageReceived = true;
6468
this.trigger('firstMessageReceived');
6569
}
6670
}
@@ -106,7 +110,10 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
106110
}
107111
if (!isNew && hasParent !== hadParent) {
108112
// todo: implement recursion to reposition children
109-
topSort.removeObject(promise);
113+
const index = topSort.indexOf(promise);
114+
if (index !== -1) {
115+
topSort.splice(index, 1);
116+
}
110117
parentChanged = true;
111118
}
112119
meta.hasParent = hasParent;
@@ -119,12 +126,15 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
119126
let topSort = this.topSort;
120127
if (promise.get('parent')) {
121128
let parentIndex = topSort.indexOf(promise.get('parent'));
122-
topSort.insertAt(parentIndex + 1, promise);
129+
topSort.splice(parentIndex + 1, 0, promise);
123130
} else {
124-
topSort.pushObject(promise);
131+
this.topSort.push(promise);
125132
}
126133
promise.get('children').forEach((child) => {
127-
topSort.removeObject(child);
134+
const index = topSort.indexOf(child);
135+
if (index !== -1) {
136+
topSort.splice(index, 1);
137+
}
128138
this.insertInTopSort(child);
129139
});
130140
}
@@ -144,7 +154,7 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
144154
let promise = Promise.create(props);
145155
let index = this.get('all.length');
146156

147-
this.all.pushObject(promise);
157+
this.all.push(promise);
148158
this.promiseIndex[promise.get('guid')] = index;
149159
return promise;
150160
}
@@ -153,7 +163,7 @@ export default class PromiseAssembler extends EmberObject.extend(EventedMixin) {
153163
if (guid) {
154164
let index = this.promiseIndex[guid];
155165
if (index !== undefined) {
156-
return this.all.objectAt(index);
166+
return this.all.at(index);
157167
}
158168
} else {
159169
return this.all;

0 commit comments

Comments
 (0)