ember-source 4.1.0-alpha.4 → 4.1.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -56
- package/blueprints/acceptance-test/qunit-files/tests/acceptance/__name__-test.js +1 -1
- package/blueprints/acceptance-test/qunit-rfc-232-files/tests/acceptance/__name__-test.js +1 -1
- package/blueprints/component-test/qunit-files/__root__/__testType__/__path__/__test__.js +3 -3
- package/blueprints/helper-test/index.js +4 -22
- package/blueprints/helper-test/mocha-0.12-files/__root__/__testType__/__collection__/__name__-test.js +1 -13
- package/blueprints/helper-test/mocha-files/__root__/__testType__/__collection__/__name__-test.js +0 -13
- package/blueprints/helper-test/mocha-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +2 -12
- package/blueprints/helper-test/qunit-files/__root__/__testType__/__collection__/__name__-test.js +2 -13
- package/blueprints/helper-test/qunit-rfc-232-files/__root__/__testType__/__collection__/__name__-test.js +2 -14
- package/build-metadata.json +3 -3
- package/dist/dependencies/@glimmer/manager.js +19 -98
- package/dist/dependencies/@glimmer/opcode-compiler.js +9 -146
- package/dist/dependencies/@glimmer/validator.js +19 -51
- package/dist/ember-template-compiler.js +378 -696
- package/dist/ember-template-compiler.map +1 -1
- package/dist/ember-testing.js +1 -1
- package/dist/ember-testing.map +1 -1
- package/dist/ember.debug.js +3299 -6328
- package/dist/ember.debug.map +1 -1
- package/dist/header/license.js +1 -1
- package/dist/packages/@ember/-internals/container/index.js +1 -1
- package/dist/packages/@ember/-internals/environment/index.js +0 -15
- package/dist/packages/@ember/-internals/glimmer/index.js +4824 -6772
- package/dist/packages/@ember/-internals/metal/index.js +57 -103
- package/dist/packages/@ember/-internals/routing/lib/ext/controller.js +1 -0
- package/dist/packages/@ember/-internals/routing/lib/location/api.js +10 -1
- package/dist/packages/@ember/-internals/routing/lib/location/none_location.js +7 -2
- package/dist/packages/@ember/-internals/routing/lib/services/router.js +8 -8
- package/dist/packages/@ember/-internals/routing/lib/services/routing.js +1 -1
- package/dist/packages/@ember/-internals/routing/lib/system/route.js +5 -43
- package/dist/packages/@ember/-internals/routing/lib/system/router.js +36 -46
- package/dist/packages/@ember/-internals/runtime/lib/mixins/array.js +2 -173
- package/dist/packages/@ember/-internals/runtime/lib/mixins/target_action_support.js +3 -43
- package/dist/packages/@ember/-internals/runtime/lib/system/array_proxy.js +8 -15
- package/dist/packages/@ember/-internals/utils/index.js +0 -3
- package/dist/packages/@ember/-internals/views/index.js +0 -1
- package/dist/packages/@ember/-internals/views/lib/mixins/view_support.js +4 -4
- package/dist/packages/@ember/application/lib/application.js +8 -9
- package/dist/packages/@ember/canary-features/index.js +1 -3
- package/dist/packages/@ember/component/index.js +1 -1
- package/dist/packages/@ember/deprecated-features/index.js +0 -1
- package/dist/packages/@ember/destroyable/index.js +15 -4
- package/dist/packages/@ember/engine/index.js +1 -2
- package/dist/packages/@ember/routing/index.js +1 -1
- package/dist/packages/@ember/service/index.js +19 -5
- package/dist/packages/@glimmer/tracking/index.js +203 -1
- package/dist/packages/ember/index.js +11 -63
- package/dist/packages/ember/version.js +1 -1
- package/docs/data.json +459 -1384
- package/lib/index.js +13 -76
- package/package.json +19 -20
- package/dist/packages/@ember/-internals/views/lib/mixins/text_support.js +0 -345
- package/dist/packages/@ember/component/checkbox.js +0 -17
- package/dist/packages/@ember/component/text-area.js +0 -17
- package/dist/packages/@ember/component/text-field.js +0 -17
- package/dist/packages/@ember/routing/link-component.js +0 -17
- package/dist/packages/jquery/index.js +0 -2
|
@@ -1 +1,203 @@
|
|
|
1
|
-
export { tracked, cached } from '@ember/-internals/metal';
|
|
1
|
+
export { tracked, cached } from '@ember/-internals/metal';
|
|
2
|
+
/**
|
|
3
|
+
In order to tell Ember a value might change, we need to mark it as trackable.
|
|
4
|
+
Trackable values are values that:
|
|
5
|
+
|
|
6
|
+
- Can change over their component’s lifetime and
|
|
7
|
+
- Should cause Ember to rerender if and when they change
|
|
8
|
+
|
|
9
|
+
We can do this by marking the field with the `@tracked` decorator.
|
|
10
|
+
|
|
11
|
+
@module @glimmer/tracking
|
|
12
|
+
@public
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
Marks a property as tracked. By default, values that are rendered in Ember app
|
|
17
|
+
templates are _static_, meaning that updates to them won't cause the
|
|
18
|
+
application to rerender. Marking a property as tracked means that when that
|
|
19
|
+
property changes, any templates that used that property, directly or
|
|
20
|
+
indirectly, will rerender. For instance, consider this component:
|
|
21
|
+
|
|
22
|
+
```handlebars
|
|
23
|
+
<div>Count: {{this.count}}</div>
|
|
24
|
+
<div>Times Ten: {{this.timesTen}}</div>
|
|
25
|
+
<div>
|
|
26
|
+
<button {{on "click" this.plusOne}}>
|
|
27
|
+
Plus One
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
import Component from '@glimmer/component';
|
|
34
|
+
import { tracked } from '@glimmer/tracking';
|
|
35
|
+
import { action } from '@ember/object';
|
|
36
|
+
|
|
37
|
+
export default class CounterComponent extends Component {
|
|
38
|
+
@tracked count = 0;
|
|
39
|
+
|
|
40
|
+
get timesTen() {
|
|
41
|
+
return this.count * 10;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@action
|
|
45
|
+
plusOne() {
|
|
46
|
+
this.count += 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Both the `{{this.count}}` and the `{{this.timesTen}}` properties in the
|
|
52
|
+
template will update whenever the button is clicked. Any tracked properties
|
|
53
|
+
that are used in any way to calculate a value that is used in the template
|
|
54
|
+
will cause a rerender when updated - this includes through method calls and
|
|
55
|
+
other means:
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
import Component from '@glimmer/component';
|
|
59
|
+
import { tracked } from '@glimmer/tracking';
|
|
60
|
+
|
|
61
|
+
class Entry {
|
|
62
|
+
@tracked name;
|
|
63
|
+
@tracked phoneNumber;
|
|
64
|
+
|
|
65
|
+
constructor(name, phoneNumber) {
|
|
66
|
+
this.name = name;
|
|
67
|
+
this.phoneNumber = phoneNumber;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default class PhoneBookComponent extends Component {
|
|
72
|
+
entries = [
|
|
73
|
+
new Entry('Pizza Palace', 5551234),
|
|
74
|
+
new Entry('1st Street Cleaners', 5554321),
|
|
75
|
+
new Entry('Plants R Us', 5552468),
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
// Any usage of this property will update whenever any of the names in the
|
|
79
|
+
// entries arrays are updated
|
|
80
|
+
get names() {
|
|
81
|
+
return this.entries.map(e => e.name);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Any usage of this property will update whenever any of the numbers in the
|
|
85
|
+
// entries arrays are updated
|
|
86
|
+
get numbers() {
|
|
87
|
+
return this.getFormattedNumbers();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
getFormattedNumbers() {
|
|
91
|
+
return this.entries
|
|
92
|
+
.map(e => e.phoneNumber)
|
|
93
|
+
.map(number => {
|
|
94
|
+
let numberString = '' + number;
|
|
95
|
+
|
|
96
|
+
return numberString.slice(0, 3) + '-' + numberString.slice(3);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
It's important to note that setting tracked properties will always trigger an
|
|
103
|
+
update, even if the property is set to the same value as it was before.
|
|
104
|
+
|
|
105
|
+
```js
|
|
106
|
+
let entry = new Entry('Pizza Palace', 5551234);
|
|
107
|
+
// if entry was used when rendering, this would cause a rerender, even though
|
|
108
|
+
// the name is being set to the same value as it was before
|
|
109
|
+
entry.name = entry.name;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`tracked` can also be used with the classic Ember object model in a similar
|
|
113
|
+
manner to classic computed properties:
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
import EmberObject from '@ember/object';
|
|
117
|
+
import { tracked } from '@glimmer/tracking';
|
|
118
|
+
|
|
119
|
+
const Entry = EmberObject.extend({
|
|
120
|
+
name: tracked(),
|
|
121
|
+
phoneNumber: tracked()
|
|
122
|
+
});
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Often this is unnecessary, but to ensure robust auto-tracking behavior it is
|
|
126
|
+
advisable to mark tracked state appropriately wherever possible.
|
|
127
|
+
This form of `tracked` also accepts an optional configuration object
|
|
128
|
+
containing either an initial `value` or an `initializer` function (but not
|
|
129
|
+
both).
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
import EmberObject from '@ember/object';
|
|
133
|
+
import { tracked } from '@glimmer/tracking';
|
|
134
|
+
|
|
135
|
+
const Entry = EmberObject.extend({
|
|
136
|
+
name: tracked({ value: 'Zoey' }),
|
|
137
|
+
favoriteSongs: tracked({
|
|
138
|
+
initializer: () => ['Raspberry Beret', 'Time After Time']
|
|
139
|
+
})
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
@method tracked
|
|
144
|
+
@static
|
|
145
|
+
@for @glimmer/tracking
|
|
146
|
+
@public
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
The `@cached` decorator can be used on getters in order to cache the return
|
|
151
|
+
value of the getter. This is useful when a getter is expensive and used very
|
|
152
|
+
often. For instance, in this guest list class, we have the `sortedGuests`
|
|
153
|
+
getter that sorts the guests alphabetically:
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
import { tracked } from '@glimmer/tracking';
|
|
157
|
+
|
|
158
|
+
class GuestList {
|
|
159
|
+
@tracked guests = ['Zoey', 'Tomster'];
|
|
160
|
+
|
|
161
|
+
get sortedGuests() {
|
|
162
|
+
return this.guests.slice().sort()
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Every time `sortedGuests` is accessed, a new array will be created and sorted,
|
|
168
|
+
because JavaScript getters do not cache by default. When the guest list is
|
|
169
|
+
small, like the one in the example, this is not a problem. However, if the guest
|
|
170
|
+
list were to grow very large, it would mean that we would be doing a large
|
|
171
|
+
amount of work each time we accessed `sortedGetters`. With `@cached`, we can
|
|
172
|
+
cache the value instead:
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
import { tracked, cached } from '@glimmer/tracking';
|
|
176
|
+
|
|
177
|
+
class GuestList {
|
|
178
|
+
@tracked guests = ['Zoey', 'Tomster'];
|
|
179
|
+
|
|
180
|
+
@cached
|
|
181
|
+
get sortedGuests() {
|
|
182
|
+
return this.guests.slice().sort()
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Now the `sortedGuests` getter will be cached based on _autotracking_. It will
|
|
188
|
+
only rerun and create a new sorted array when the `guests` tracked property is
|
|
189
|
+
updated.
|
|
190
|
+
|
|
191
|
+
In general, you should avoid using `@cached` unless you have confirmed that the
|
|
192
|
+
getter you are decorating is computationally expensive. `@cached` adds a small
|
|
193
|
+
amount of overhead to the getter, making it more expensive. While this overhead
|
|
194
|
+
is small, if `@cached` is overused it can add up to a large impact overall in
|
|
195
|
+
your app. Many getters and tracked properties are only accessed once, rendered,
|
|
196
|
+
and then never rerendered, so adding `@cached` when it is unnecessary can
|
|
197
|
+
negatively impact performance.
|
|
198
|
+
|
|
199
|
+
@method cached
|
|
200
|
+
@static
|
|
201
|
+
@for @glimmer/tracking
|
|
202
|
+
@public
|
|
203
|
+
*/
|
|
@@ -12,11 +12,11 @@ import Backburner from 'backburner';
|
|
|
12
12
|
import Controller, { inject as injectController } from '@ember/controller';
|
|
13
13
|
import ControllerMixin from '@ember/controller/lib/controller_mixin';
|
|
14
14
|
import { _getStrings, _setStrings, dasherize, camelize, capitalize, classify, decamelize, loc, underscore, w } from '@ember/string';
|
|
15
|
-
import Service, {
|
|
15
|
+
import Service, { service } from '@ember/service';
|
|
16
16
|
import { action, computed } from '@ember/object';
|
|
17
17
|
import { dependentKeyCompat } from '@ember/object/compat';
|
|
18
|
-
import { Object as EmberObject, RegistryProxyMixin, ContainerProxyMixin, compare, isEqual, Array as EmberArray, MutableEnumerable, MutableArray,
|
|
19
|
-
import {
|
|
18
|
+
import { Object as EmberObject, RegistryProxyMixin, ContainerProxyMixin, compare, isEqual, Array as EmberArray, MutableEnumerable, MutableArray, Evented, PromiseProxyMixin, Observable, typeOf, isArray, _ProxyMixin, RSVP, Comparable, Namespace, Enumerable, ArrayProxy, ObjectProxy, ActionHandler, CoreObject, NativeArray, A } from '@ember/-internals/runtime';
|
|
19
|
+
import { Component, componentCapabilities, modifierCapabilities, setComponentManager, escapeExpression, getTemplates, Helper, helper, htmlSafe, isHTMLSafe, setTemplates, template, Input, isSerializationFirstNode } from '@ember/-internals/glimmer'; // eslint-disable-next-line import/no-unresolved
|
|
20
20
|
|
|
21
21
|
import VERSION from './version';
|
|
22
22
|
import * as views from '@ember/-internals/views';
|
|
@@ -164,12 +164,16 @@ Ember._isDestroyed = isDestroyed;
|
|
|
164
164
|
and reporting code.
|
|
165
165
|
|
|
166
166
|
```javascript
|
|
167
|
-
import $ from 'jquery';
|
|
168
167
|
|
|
169
168
|
Ember.onerror = function(error) {
|
|
170
|
-
|
|
169
|
+
const payload = {
|
|
171
170
|
stack: error.stack,
|
|
172
171
|
otherInformation: 'whatever app state you want to provide'
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
fetch('/report-error', {
|
|
175
|
+
method: 'POST',
|
|
176
|
+
body: JSON.stringify(payload)
|
|
173
177
|
});
|
|
174
178
|
};
|
|
175
179
|
```
|
|
@@ -227,7 +231,7 @@ Ember.inject = function inject() {
|
|
|
227
231
|
assert(`Injected properties must be created through helpers, see '${Object.keys(inject).map(k => `'inject.${k}'`).join(' or ')}'`);
|
|
228
232
|
};
|
|
229
233
|
|
|
230
|
-
Ember.inject.service =
|
|
234
|
+
Ember.inject.service = service;
|
|
231
235
|
Ember.inject.controller = injectController;
|
|
232
236
|
Ember.Array = EmberArray;
|
|
233
237
|
Ember.Comparable = Comparable;
|
|
@@ -296,52 +300,6 @@ Object.defineProperty(Ember, 'BOOTED', {
|
|
|
296
300
|
Ember.Component = Component;
|
|
297
301
|
Helper.helper = helper;
|
|
298
302
|
Ember.Helper = Helper;
|
|
299
|
-
|
|
300
|
-
if (true
|
|
301
|
-
/* EMBER_MODERNIZED_BUILT_IN_COMPONENTS */
|
|
302
|
-
) {
|
|
303
|
-
[['Checkbox', '@ember/component/checkbox', Checkbox, true], ['TextField', '@ember/component/text-field', TextField, true], ['TextArea', '@ember/component/text-area', TextArea, true], ['LinkComponent', '@ember/routing/link-component', LinkComponent, true], ['TextSupport', null, views.TextSupport, false], ['TargetActionSupport', null, TargetActionSupport, false]].forEach(([name, path, value, availableInLegacyAddon]) => {
|
|
304
|
-
Object.defineProperty(Ember, name, {
|
|
305
|
-
get() {
|
|
306
|
-
let message = `Using Ember.${name}`;
|
|
307
|
-
|
|
308
|
-
if (path !== null) {
|
|
309
|
-
message += ` or importing from '${path}'`;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
message += ` is deprecated.`;
|
|
313
|
-
|
|
314
|
-
if (availableInLegacyAddon) {
|
|
315
|
-
message += ` Install the \`@ember/legacy-built-in-components\` addon and use ` + `\`import { ${name} } from '@ember/legacy-built-in-components';\` instead.`;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
deprecate(message, false, {
|
|
319
|
-
id: 'ember.built-in-components.import',
|
|
320
|
-
until: '4.0.0',
|
|
321
|
-
for: 'ember-source',
|
|
322
|
-
since: {
|
|
323
|
-
enabled: '3.27.0'
|
|
324
|
-
},
|
|
325
|
-
url: 'https://deprecations.emberjs.com/v3.x#toc_ember-built-in-components-import'
|
|
326
|
-
});
|
|
327
|
-
return value;
|
|
328
|
-
},
|
|
329
|
-
|
|
330
|
-
configurable: true,
|
|
331
|
-
enumerable: true
|
|
332
|
-
}); // Expose a non-deprecated version for tests and the @ember/legacy-built-in-components addon
|
|
333
|
-
|
|
334
|
-
Ember[`_Legacy${name}`] = value;
|
|
335
|
-
});
|
|
336
|
-
} else {
|
|
337
|
-
Ember.Checkbox = Checkbox;
|
|
338
|
-
Ember.TextField = TextField;
|
|
339
|
-
Ember.TextArea = TextArea;
|
|
340
|
-
Ember.LinkComponent = LinkComponent;
|
|
341
|
-
Ember.TextSupport = views.TextSupport;
|
|
342
|
-
Ember.TargetActionSupport = TargetActionSupport;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
303
|
Ember._setComponentManager = setComponentManager;
|
|
346
304
|
Ember._componentManagerCapabilities = componentCapabilities;
|
|
347
305
|
Ember._setModifierManager = setModifierManager;
|
|
@@ -553,14 +511,4 @@ Ember.__loader = {
|
|
|
553
511
|
// eslint-disable-next-line no-undef
|
|
554
512
|
registry: typeof requirejs !== 'undefined' ? requirejs.entries : require.entries
|
|
555
513
|
};
|
|
556
|
-
export default Ember;
|
|
557
|
-
/**
|
|
558
|
-
@module jquery
|
|
559
|
-
@public
|
|
560
|
-
*/
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
@class jquery
|
|
564
|
-
@public
|
|
565
|
-
@static
|
|
566
|
-
*/
|
|
514
|
+
export default Ember;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export default "4.1.0-alpha.
|
|
1
|
+
export default "4.1.0-alpha.8";
|