diff --git a/broccoli/amd-compat-entrypoints/ember.debug.js b/broccoli/amd-compat-entrypoints/ember.debug.js
index bff6dbceb67..d7bad5dfa06 100644
--- a/broccoli/amd-compat-entrypoints/ember.debug.js
+++ b/broccoli/amd-compat-entrypoints/ember.debug.js
@@ -56,9 +56,6 @@ d('@ember/-internals/runtime/index', emberinternalsRuntimeIndex);
import * as emberinternalsRuntimeLibExtRsvp from '@ember/-internals/runtime/lib/ext/rsvp';
d('@ember/-internals/runtime/lib/ext/rsvp', emberinternalsRuntimeLibExtRsvp);
-import * as emberinternalsRuntimeLibMixinsproxy from '@ember/-internals/runtime/lib/mixins/-proxy';
-d('@ember/-internals/runtime/lib/mixins/-proxy', emberinternalsRuntimeLibMixinsproxy);
-
import * as emberinternalsRuntimeLibMixinsActionHandler from '@ember/-internals/runtime/lib/mixins/action_handler';
d(
'@ember/-internals/runtime/lib/mixins/action_handler',
@@ -176,9 +173,6 @@ d('@ember/array/lib/make-array', emberArrayLibMakeArray);
import * as emberArrayMutable from '@ember/array/mutable';
d('@ember/array/mutable', emberArrayMutable);
-import * as emberArrayProxy from '@ember/array/proxy';
-d('@ember/array/proxy', emberArrayProxy);
-
import * as emberCanaryFeaturesIndex from '@ember/canary-features/index';
d('@ember/canary-features/index', emberCanaryFeaturesIndex);
@@ -287,12 +281,6 @@ d('@ember/object/observable', emberObjectObservable);
import * as emberObjectObservers from '@ember/object/observers';
d('@ember/object/observers', emberObjectObservers);
-import * as emberObjectPromiseProxyMixin from '@ember/object/promise-proxy-mixin';
-d('@ember/object/promise-proxy-mixin', emberObjectPromiseProxyMixin);
-
-import * as emberObjectProxy from '@ember/object/proxy';
-d('@ember/object/proxy', emberObjectProxy);
-
import * as emberOwnerIndex from '@ember/owner/index';
d('@ember/owner/index', emberOwnerIndex);
diff --git a/package.json b/package.json
index 8a4945e7559..a6b748a6cfe 100644
--- a/package.json
+++ b/package.json
@@ -203,7 +203,6 @@
"@ember/-internals/routing/index.js": "ember-source/@ember/-internals/routing/index.js",
"@ember/-internals/runtime/index.js": "ember-source/@ember/-internals/runtime/index.js",
"@ember/-internals/runtime/lib/ext/rsvp.js": "ember-source/@ember/-internals/runtime/lib/ext/rsvp.js",
- "@ember/-internals/runtime/lib/mixins/-proxy.js": "ember-source/@ember/-internals/runtime/lib/mixins/-proxy.js",
"@ember/-internals/runtime/lib/mixins/action_handler.js": "ember-source/@ember/-internals/runtime/lib/mixins/action_handler.js",
"@ember/-internals/runtime/lib/mixins/comparable.js": "ember-source/@ember/-internals/runtime/lib/mixins/comparable.js",
"@ember/-internals/runtime/lib/mixins/container_proxy.js": "ember-source/@ember/-internals/runtime/lib/mixins/container_proxy.js",
@@ -235,7 +234,6 @@
"@ember/array/lib/make-array.js": "ember-source/@ember/array/lib/make-array.js",
"@ember/array/make.js": "ember-source/@ember/array/make.js",
"@ember/array/mutable.js": "ember-source/@ember/array/mutable.js",
- "@ember/array/proxy.js": "ember-source/@ember/array/proxy.js",
"@ember/canary-features/index.js": "ember-source/@ember/canary-features/index.js",
"@ember/component/helper.js": "ember-source/@ember/component/helper.js",
"@ember/component/index.js": "ember-source/@ember/component/index.js",
@@ -275,8 +273,6 @@
"@ember/object/mixin.js": "ember-source/@ember/object/mixin.js",
"@ember/object/observable.js": "ember-source/@ember/object/observable.js",
"@ember/object/observers.js": "ember-source/@ember/object/observers.js",
- "@ember/object/promise-proxy-mixin.js": "ember-source/@ember/object/promise-proxy-mixin.js",
- "@ember/object/proxy.js": "ember-source/@ember/object/proxy.js",
"@ember/owner/index.js": "ember-source/@ember/owner/index.js",
"@ember/renderer/index.js": "ember-source/@ember/renderer/index.js",
"@ember/routing/-internals.js": "ember-source/@ember/routing/-internals.js",
diff --git a/packages/@ember/-internals/glimmer/lib/helpers/each-in.ts b/packages/@ember/-internals/glimmer/lib/helpers/each-in.ts
index 682d71b7c8a..c43a9072b3c 100644
--- a/packages/@ember/-internals/glimmer/lib/helpers/each-in.ts
+++ b/packages/@ember/-internals/glimmer/lib/helpers/each-in.ts
@@ -2,8 +2,6 @@
@module ember
*/
import { tagForObject } from '@ember/-internals/metal';
-import { _contentFor } from '@ember/-internals/runtime';
-import { isProxy } from '@ember/-internals/utils';
import { assert } from '@ember/debug';
import type { CapturedArguments } from '@glimmer/interfaces';
import { createComputeRef, valueForRef } from '@glimmer/reference';
@@ -176,12 +174,6 @@ export default internalHelper(({ positional }: CapturedArguments) => {
consumeTag(tagForObject(iterable));
- if (isProxy(iterable)) {
- // this is because the each-in doesn't actually get(proxy, 'key') but bypasses it
- // and the proxy's tag is lazy updated on access
- iterable = _contentFor(iterable);
- }
-
return new EachInWrapper(iterable);
});
});
diff --git a/packages/@ember/-internals/glimmer/lib/utils/to-bool.ts b/packages/@ember/-internals/glimmer/lib/utils/to-bool.ts
index a17bdd505f7..0078aac18dd 100644
--- a/packages/@ember/-internals/glimmer/lib/utils/to-bool.ts
+++ b/packages/@ember/-internals/glimmer/lib/utils/to-bool.ts
@@ -1,15 +1,10 @@
import { isHTMLSafe } from './string';
-import { get, tagForProperty } from '@ember/-internals/metal';
+import { tagForProperty } from '@ember/-internals/metal';
import { isArray } from '@ember/array';
-import { isProxy } from '@ember/-internals/utils';
import { consumeTag } from '@glimmer/validator';
export default function toBool(predicate: unknown): boolean {
- if (isProxy(predicate)) {
- consumeTag(tagForProperty(predicate, 'content'));
-
- return Boolean(get(predicate, 'isTruthy'));
- } else if (isArray(predicate)) {
+ if (isArray(predicate)) {
consumeTag(tagForProperty(predicate as object, '[]'));
return (predicate as { length: number }).length !== 0;
diff --git a/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js b/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js
index 72f12a716fe..66ba8102321 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/components/tracked-test.js
@@ -1,10 +1,7 @@
import EmberObject from '@ember/object';
import { A } from '@ember/array';
-import ArrayProxy from '@ember/array/proxy';
-import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
import { tracked } from '@ember/-internals/metal';
import { computed, get, set } from '@ember/object';
-import { Promise } from 'rsvp';
import { moduleFor, RenderingTestCase, strip, runTask } from 'internal-test-helpers';
import GlimmerishComponent from '../../utils/glimmerish-component';
import { Component } from '../../utils/helpers';
@@ -85,56 +82,6 @@ moduleFor(
this.assertText('max jackson | max jackson');
}
- '@test creating an array proxy inside a tracking context does not trigger backtracking assertion'() {
- let PromiseArray = ArrayProxy.extend(PromiseProxyMixin);
-
- class LoaderComponent extends GlimmerishComponent {
- get data() {
- if (!this._data) {
- this._data = PromiseArray.create({
- promise: Promise.resolve([1, 2, 3]),
- });
- }
-
- return this._data;
- }
- }
-
- this.registerComponent('loader', {
- ComponentClass: LoaderComponent,
- template: '{{#each this.data as |item|}}{{item}}{{/each}}',
- });
-
- this.render('');
-
- this.assertText('123');
- }
-
- '@test creating an array proxy inside a tracking context and immediately updating its content before usage does not trigger backtracking assertion'() {
- class LoaderComponent extends GlimmerishComponent {
- get data() {
- if (!this._data) {
- this._data = ArrayProxy.create({
- content: A(),
- });
-
- this._data.content.pushObjects([1, 2, 3]);
- }
-
- return this._data;
- }
- }
-
- this.registerComponent('loader', {
- ComponentClass: LoaderComponent,
- template: '{{#each this.data as |item|}}{{item}}{{/each}}',
- });
-
- this.render('');
-
- this.assertText('123');
- }
-
'@test tracked properties that are uninitialized do not throw an error'() {
class CountComponent extends Component {
@tracked count;
diff --git a/packages/@ember/-internals/glimmer/tests/integration/content-test.js b/packages/@ember/-internals/glimmer/tests/integration/content-test.js
index 2e3c96609f8..3ac98e4b61b 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/content-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/content-test.js
@@ -6,7 +6,6 @@ import { set, computed } from '@ember/object';
import { getDebugFunction, setDebugFunction } from '@ember/debug';
import EmberObject from '@ember/object';
import { readOnly } from '@ember/object/computed';
-import ObjectProxy from '@ember/object/proxy';
import { constructStyleDeprecationMessage } from '@ember/-internals/views';
import { Component, SafeString, htmlSafe } from '../utils/helpers';
@@ -344,249 +343,6 @@ class DynamicContentTest extends RenderingTestCase {
this.assertInvariants();
}
- ['@test it can read from a proxy object']() {
- this.renderPath('this.proxy.name', {
- proxy: ObjectProxy.create({ content: { name: 'Tom Dale' } }),
- });
-
- this.assertContent('Tom Dale');
-
- this.assertStableRerender();
-
- runTask(() => set(this.context, 'proxy.content.name', 'Yehuda Katz'));
-
- this.assertContent('Yehuda Katz');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy.content', { name: 'Godfrey Chan' }));
-
- this.assertContent('Godfrey Chan');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy.name', 'Stefan Penner'));
-
- this.assertContent('Stefan Penner');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy.content', null));
-
- this.assertIsEmpty();
-
- runTask(() =>
- set(this.context, 'proxy', ObjectProxy.create({ content: { name: 'Tom Dale' } }))
- );
-
- this.assertContent('Tom Dale');
- this.assertInvariants();
- }
-
- ['@test it can read from a nested path in a proxy object']() {
- this.renderPath('this.proxy.name.last', {
- proxy: ObjectProxy.create({
- content: { name: { first: 'Tom', last: 'Dale' } },
- }),
- });
-
- this.assertContent('Dale');
-
- this.assertStableRerender();
-
- runTask(() => set(this.context, 'proxy.content.name.last', 'Cruise'));
-
- this.assertContent('Cruise');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy.content.name.first', 'Suri'));
-
- this.assertStableRerender();
-
- runTask(() => set(this.context, 'proxy.content.name', { first: 'Yehuda', last: 'Katz' }));
-
- this.assertContent('Katz');
- this.assertInvariants();
-
- runTask(() =>
- set(this.context, 'proxy.content', {
- name: { first: 'Godfrey', last: 'Chan' },
- })
- );
-
- this.assertContent('Chan');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy.name', { first: 'Stefan', last: 'Penner' }));
-
- this.assertContent('Penner');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxy', null));
-
- this.assertIsEmpty();
-
- runTask(() =>
- set(
- this.context,
- 'proxy',
- ObjectProxy.create({
- content: { name: { first: 'Tom', last: 'Dale' } },
- })
- )
- );
-
- this.assertContent('Dale');
- this.assertInvariants();
- }
-
- ['@test it can read from a path flipping between a proxy and a real object']() {
- this.renderPath('this.proxyOrObject.name.last', {
- proxyOrObject: ObjectProxy.create({
- content: { name: { first: 'Tom', last: 'Dale' } },
- }),
- });
-
- this.assertContent('Dale');
-
- this.assertStableRerender();
-
- runTask(() =>
- set(this.context, 'proxyOrObject', {
- name: { first: 'Tom', last: 'Dale' },
- })
- );
-
- this.assertStableRerender();
-
- runTask(() => set(this.context, 'proxyOrObject.name.last', 'Cruise'));
-
- this.assertContent('Cruise');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxyOrObject.name.first', 'Suri'));
-
- this.assertStableRerender();
-
- runTask(() =>
- set(this.context, 'proxyOrObject', {
- name: { first: 'Yehuda', last: 'Katz' },
- })
- );
-
- this.assertContent('Katz');
- this.assertInvariants();
-
- runTask(() =>
- set(
- this.context,
- 'proxyOrObject',
- ObjectProxy.create({
- content: { name: { first: 'Godfrey', last: 'Chan' } },
- })
- )
- );
-
- this.assertContent('Chan');
- this.assertInvariants();
-
- runTask(() =>
- set(this.context, 'proxyOrObject.content.name', {
- first: 'Stefan',
- last: 'Penner',
- })
- );
-
- this.assertContent('Penner');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'proxyOrObject', null));
-
- this.assertIsEmpty();
-
- runTask(() =>
- set(
- this.context,
- 'proxyOrObject',
- ObjectProxy.create({
- content: { name: { first: 'Tom', last: 'Dale' } },
- })
- )
- );
-
- this.assertContent('Dale');
- this.assertInvariants();
- }
-
- ['@test it can read from a path flipping between a real object and a proxy']() {
- this.renderPath('this.objectOrProxy.name.last', {
- objectOrProxy: { name: { first: 'Tom', last: 'Dale' } },
- });
-
- this.assertContent('Dale');
-
- this.assertStableRerender();
-
- runTask(() =>
- set(
- this.context,
- 'objectOrProxy',
- ObjectProxy.create({
- content: { name: { first: 'Tom', last: 'Dale' } },
- })
- )
- );
-
- this.assertStableRerender();
-
- runTask(() => set(this.context, 'objectOrProxy.content.name.last', 'Cruise'));
-
- this.assertContent('Cruise');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'objectOrProxy.content.name.first', 'Suri'));
-
- this.assertStableRerender();
-
- runTask(() =>
- set(this.context, 'objectOrProxy.content', {
- name: { first: 'Yehuda', last: 'Katz' },
- })
- );
-
- this.assertContent('Katz');
- this.assertInvariants();
-
- runTask(() =>
- set(this.context, 'objectOrProxy', {
- name: { first: 'Godfrey', last: 'Chan' },
- })
- );
-
- this.assertContent('Chan');
- this.assertInvariants();
-
- runTask(() =>
- set(this.context, 'objectOrProxy.name', {
- first: 'Stefan',
- last: 'Penner',
- })
- );
-
- this.assertContent('Penner');
- this.assertInvariants();
-
- runTask(() => set(this.context, 'objectOrProxy', null));
-
- this.assertIsEmpty();
-
- runTask(() =>
- set(this.context, 'objectOrProxy', {
- name: { first: 'Tom', last: 'Dale' },
- })
- );
-
- this.assertContent('Dale');
- this.assertInvariants();
- }
-
['@test it can read from a null object']() {
let nullObject = Object.create(null);
nullObject['message'] = 'hello';
diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js
index 25d6dd32c20..a68ac9529b9 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-in-test.js
@@ -2,7 +2,6 @@ import { applyMixins, moduleFor, RenderingTestCase, runTask, strip } from 'inter
import { get, set } from '@ember/object';
import EmberObject from '@ember/object';
-import ObjectProxy from '@ember/object/proxy';
import {
FalsyGenerator,
@@ -63,35 +62,7 @@ applyMixins(
])
);
-applyMixins(
- EachInProxyTest,
-
- new TruthyGenerator([ObjectProxy.create({ content: { 'Not empty': 1 } })]),
-
- new FalsyGenerator([
- ObjectProxy.create(),
- ObjectProxy.create({ content: null }),
- ObjectProxy.create({ content: {} }),
- ObjectProxy.create({ content: Object.create(null) }),
- ObjectProxy.create({ content: Object.create({}) }),
- ObjectProxy.create({ content: Object.create({ 'Not Empty': 1 }) }),
- ObjectProxy.create({ content: EmberObject.create() }),
- ])
-);
-
-// Truthy/Falsy tests
-moduleFor(
- 'Syntax test: {{#each-in}} with `ObjectProxy`',
- class extends EachInProxyTest {
- get truthyValue() {
- return ObjectProxy.create({ content: { 'Not Empty': 1 } });
- }
-
- get falsyValue() {
- return ObjectProxy.create({ content: null });
- }
- }
-);
+applyMixins(EachInProxyTest);
moduleFor('Syntax test: {{#each-in}}', BasicSyntaxTest);
@@ -515,110 +486,6 @@ moduleFor(
}
);
-moduleFor(
- 'Syntax test: {{#each-in}} with object proxies',
- class extends EachInTest {
- constructor() {
- super(...arguments);
- this.allowsSetProp = true;
- }
- createHash(pojo) {
- let hash = ObjectProxy.create({ content: pojo });
- return {
- hash,
- delegate: {
- setProp(context, key, value) {
- set(context, `hash.${key}`, value);
- },
- updateNestedValue(context, key, innerKey, value) {
- let target = get(context.hash, key);
- set(target, innerKey, value);
- },
- },
- };
- }
-
- ['@test it iterates over the content, not the proxy']() {
- let content = {
- Smartphones: 8203,
- 'JavaScript Frameworks': Infinity,
- };
-
- let proxy = ObjectProxy.create({
- content,
- foo: 'bar',
- });
-
- this.render(
- strip`
-
- {{#each-in this.categories as |category count|}}
- - {{category}}: {{count}}
- {{/each-in}}
-
- `,
- { categories: proxy }
- );
-
- this.assertHTML(strip`
-
- - Smartphones: 8203
- - JavaScript Frameworks: Infinity
-
- `);
-
- this.assertStableRerender();
-
- runTask(() => {
- set(proxy, 'content.Smartphones', 100);
- set(proxy, 'content.Tweets', 443115);
- });
-
- this.assertHTML(strip`
-
- - Smartphones: 100
- - JavaScript Frameworks: Infinity
- - Tweets: 443115
-
- `);
-
- runTask(() => {
- set(proxy, 'content', {
- Smartphones: 100,
- Tablets: 20,
- });
- });
-
- this.assertHTML(strip`
-
- - Smartphones: 100
- - Tablets: 20
-
- `);
-
- runTask(() =>
- set(
- this.context,
- 'categories',
- ObjectProxy.create({
- content: {
- Smartphones: 8203,
- 'JavaScript Frameworks': Infinity,
- },
- })
- )
- );
-
- this.assertHTML(strip`
-
- - Smartphones: 8203
- - JavaScript Frameworks: Infinity
-
- `);
- }
- }
-);
-
moduleFor(
'Syntax test: {{#each-in}} with ES6 Maps',
class extends EachInTest {
diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
index 8753cb255d5..5ef803325fc 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/each-test.js
@@ -1,9 +1,8 @@
import { moduleFor, RenderingTestCase, applyMixins, strip, runTask } from 'internal-test-helpers';
import { notifyPropertyChange } from '@ember/-internals/metal';
-import { get, set, computed } from '@ember/object';
+import { get, set } from '@ember/object';
import { A as emberA } from '@ember/array';
-import ArrayProxy from '@ember/array/proxy';
import { RSVP } from '@ember/-internals/runtime';
import { Component, htmlSafe } from '../../utils/helpers';
@@ -160,8 +159,6 @@ const TRUTHY_CASES = [
emberA(['hello']),
makeSet(['hello']),
new ForEachable(['hello']),
- ArrayProxy.create({ content: ['hello'] }),
- ArrayProxy.create({ content: emberA(['hello']) }),
new ArrayIterable(['hello']),
];
@@ -175,8 +172,6 @@ const FALSY_CASES = [
emberA([]),
makeSet([]),
new ForEachable([]),
- ArrayProxy.create({ content: [] }),
- ArrayProxy.create({ content: emberA([]) }),
new ArrayIterable([]),
];
@@ -1073,49 +1068,6 @@ moduleFor(
}
);
-moduleFor(
- 'Syntax test: {{#each}} with array proxies, modifying itself',
- class extends EachTest {
- createList(items) {
- let proxty = ArrayProxy.create({ content: emberA(items) });
- return { list: proxty, delegate: proxty };
- }
- }
-);
-
-moduleFor(
- 'Syntax test: {{#each}} with array proxies, replacing its content',
- class extends EachTest {
- createList(items) {
- let wrapped = emberA(items);
- return {
- list: wrapped,
- delegate: ArrayProxy.create({ content: wrapped }),
- };
- }
- }
-);
-
-moduleFor(
- 'Syntax test: {{#each}} with array proxies, arrangedContent depends on external content',
- class extends EachTest {
- createList(items) {
- let wrapped = emberA(items);
- let proxy = class extends ArrayProxy {
- @computed('wrappedItems.[]')
- get arrangedContent() {
- // Slice the items to ensure that updates must be propogated
- return this.wrappedItems.slice();
- }
- }.create({
- wrappedItems: wrapped,
- });
-
- return { list: proxy, delegate: wrapped };
- }
- }
-);
-
moduleFor(
'Syntax test: {{#each as}} undefined path',
class extends RenderingTestCase {
diff --git a/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js b/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
index f2516061932..ea3c43ab322 100644
--- a/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
+++ b/packages/@ember/-internals/glimmer/tests/integration/syntax/let-test.js
@@ -2,7 +2,6 @@ import { moduleFor, RenderingTestCase, strip, runTask } from 'internal-test-help
import { get, set } from '@ember/object';
import { A as emberA, removeAt } from '@ember/array';
-import ObjectProxy from '@ember/object/proxy';
moduleFor(
'Syntax test: {{#let as}}',
@@ -122,40 +121,6 @@ moduleFor(
this.assertText('-Yehuda-');
}
- ['@test can access alias of a proxy']() {
- this.render(`{{#let this.proxy as |person|}}{{person.name}}{{/let}}`, {
- proxy: ObjectProxy.create({ content: { name: 'Tom Dale' } }),
- });
-
- this.assertText('Tom Dale');
-
- runTask(() => this.rerender());
-
- this.assertText('Tom Dale');
-
- runTask(() => set(this.context, 'proxy.name', 'Yehuda Katz'));
-
- this.assertText('Yehuda Katz');
-
- runTask(() => set(this.context, 'proxy.content', { name: 'Godfrey Chan' }));
-
- this.assertText('Godfrey Chan');
-
- runTask(() => set(this.context, 'proxy.content.name', 'Stefan Penner'));
-
- this.assertText('Stefan Penner');
-
- runTask(() => set(this.context, 'proxy.content', null));
-
- this.assertText('');
-
- runTask(() =>
- set(this.context, 'proxy', ObjectProxy.create({ content: { name: 'Tom Dale' } }))
- );
-
- this.assertText('Tom Dale');
- }
-
['@test can access alias of an array']() {
this.render(
`{{#let this.arrayThing as |words|}}{{#each words as |word|}}{{word}}{{/each}}{{/let}}`,
diff --git a/packages/@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js b/packages/@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js
index bf725ea1634..4228d0e351f 100644
--- a/packages/@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js
+++ b/packages/@ember/-internals/glimmer/tests/utils/shared-conditional-tests.js
@@ -5,9 +5,7 @@ import { RenderingTestCase, applyMixins, runTask } from 'internal-test-helpers';
import { htmlSafe } from '@ember/-internals/glimmer';
import { get, set } from '@ember/object';
import EmberObject from '@ember/object';
-import ObjectProxy from '@ember/object/proxy';
import { A as emberA, removeAt } from '@ember/array';
-import ArrayProxy from '@ember/array/proxy';
import { Component } from './helpers';
@@ -161,58 +159,6 @@ export class StableFalsyGenerator extends FalsyGenerator {
}
}
-class ObjectProxyGenerator extends AbstractGenerator {
- generate(value, idx) {
- // This is inconsistent with our usual to-bool policy, but the current proxy implementation
- // simply uses !!content to determine truthiness
- if (value) {
- return {
- [`@test it should consider an object proxy with \`${JSON.stringify(
- value
- )}\` truthy [${idx}]`]() {
- this.renderValues(ObjectProxy.create({ content: value }));
-
- this.assertText('T1');
-
- runTask(() => this.rerender());
-
- this.assertText('T1');
-
- runTask(() => set(this.context, 'cond1.content', this.falsyValue));
-
- this.assertText('F1');
-
- runTask(() => set(this.context, 'cond1', ObjectProxy.create({ content: value })));
-
- this.assertText('T1');
- },
- };
- } else {
- return {
- [`@test it should consider an object proxy with \`${JSON.stringify(
- value
- )}\` falsy [${idx}]`]() {
- this.renderValues(ObjectProxy.create({ content: value }));
-
- this.assertText('F1');
-
- runTask(() => this.rerender());
-
- this.assertText('F1');
-
- runTask(() => set(this.context, 'cond1.content', this.truthyValue));
-
- this.assertText('T1');
-
- runTask(() => set(this.context, 'cond1', ObjectProxy.create({ content: value })));
-
- this.assertText('F1');
- },
- };
- }
- }
-}
-
// Testing behaviors shared across all conditionals, i.e. {{#if}}, {{#unless}},
// {{#each}}, {{#each-in}}, (if) and (unless)
export class BasicConditionalsTest extends AbstractConditionalsTest {
@@ -245,46 +191,6 @@ export class BasicConditionalsTest extends AbstractConditionalsTest {
}
}
-// Testing behaviors related to ember objects, object proxies, etc
-export const ObjectTestCases = {
- ['@test it considers object proxies without content falsy']() {
- this.renderValues(
- ObjectProxy.create({ content: {} }),
- ObjectProxy.create({ content: EmberObject.create() }),
- ObjectProxy.create({ content: null })
- );
-
- this.assertText('T1T2F3');
-
- runTask(() => this.rerender());
-
- this.assertText('T1T2F3');
-
- runTask(() => {
- set(this.context, 'cond1.content', null);
- set(this.context, 'cond2.content', null);
- });
-
- this.assertText('F1F2F3');
-
- runTask(() => {
- set(this.context, 'cond1.content', EmberObject.create());
- set(this.context, 'cond2.content', {});
- set(this.context, 'cond3.content', { foo: 'bar' });
- });
-
- this.assertText('T1T2T3');
-
- runTask(() => {
- set(this.context, 'cond1', ObjectProxy.create({ content: {} }));
- set(this.context, 'cond2', ObjectProxy.create({ content: EmberObject.create() }));
- set(this.context, 'cond3', ObjectProxy.create({ content: null }));
- });
-
- this.assertText('T1T2F3');
- },
-};
-
// Testing behaviors related to arrays and array proxies
export const ArrayTestCases = {
['@test it considers empty arrays falsy']() {
@@ -314,71 +220,6 @@ export const ArrayTestCases = {
this.assertText('T1F2');
},
-
- ['@test it considers array proxies without content falsy']() {
- this.renderValues(
- ArrayProxy.create({ content: emberA(['hello']) }),
- ArrayProxy.create({ content: null })
- );
-
- this.assertText('T1F2');
-
- runTask(() => this.rerender());
-
- this.assertText('T1F2');
-
- runTask(() => {
- set(this.context, 'cond1.content', null);
- set(this.context, 'cond2.content', null);
- });
-
- this.assertText('F1F2');
-
- runTask(() => {
- set(this.context, 'cond1.content', emberA(['hello']));
- set(this.context, 'cond2.content', emberA([1]));
- });
-
- this.assertText('T1T2');
-
- runTask(() => {
- set(this.context, 'cond1', ArrayProxy.create({ content: emberA(['hello']) }));
- set(this.context, 'cond2', ArrayProxy.create({ content: null }));
- });
-
- this.assertText('T1F2');
- },
-
- ['@test it considers array proxies with empty arrays falsy']() {
- this.renderValues(
- ArrayProxy.create({ content: emberA(['hello']) }),
- ArrayProxy.create({ content: emberA() })
- );
-
- this.assertText('T1F2');
-
- runTask(() => this.rerender());
-
- this.assertText('T1F2');
-
- runTask(() => removeAt(get(this.context, 'cond1.content'), 0));
-
- this.assertText('F1F2');
-
- runTask(() => {
- get(this.context, 'cond1.content').pushObject('hello');
- get(this.context, 'cond2.content').pushObjects([1]);
- });
-
- this.assertText('T1T2');
-
- runTask(() => {
- set(this.context, 'cond1', ArrayProxy.create({ content: emberA(['hello']) }));
- set(this.context, 'cond2', ArrayProxy.create({ content: emberA() }));
- });
-
- this.assertText('T1F2');
- },
};
const IfUnlessWithTestCases = [
@@ -396,7 +237,6 @@ const IfUnlessWithTestCases = [
{ foo: 'bar' },
EmberObject.create(),
EmberObject.create({ foo: 'bar' }),
- ObjectProxy.create({ content: true }),
Object,
function () {},
async function () {},
@@ -408,51 +248,7 @@ const IfUnlessWithTestCases = [
htmlSafe(' '),
]),
- new StableFalsyGenerator([
- false,
- null,
- undefined,
- '',
- 0,
- [],
- emberA(),
- ObjectProxy.create({ content: undefined }),
- htmlSafe(''),
- ]),
-
- new ObjectProxyGenerator([
- true,
- ' ',
- 'hello',
- 'false',
- 'null',
- 'undefined',
- 1,
- ['hello'],
- emberA(['hello']),
- ArrayProxy.create({ content: ['hello'] }),
- ArrayProxy.create({ content: [] }),
- {},
- { foo: 'bar' },
- EmberObject.create(),
- EmberObject.create({ foo: 'bar' }),
- ObjectProxy.create({ content: true }),
- ObjectProxy.create({ content: undefined }),
- new String('hello'),
- new String(''),
- new Boolean(true),
- new Boolean(false),
- new Date(),
- false,
- null,
- undefined,
- '',
- 0,
- [],
- emberA(),
- ]),
-
- ObjectTestCases,
+ new StableFalsyGenerator([false, null, undefined, '', 0, [], emberA(), htmlSafe('')]),
ArrayTestCases,
];
diff --git a/packages/@ember/-internals/metal/lib/property_get.ts b/packages/@ember/-internals/metal/lib/property_get.ts
index 8f2e28a82d0..bba99e5f2e0 100644
--- a/packages/@ember/-internals/metal/lib/property_get.ts
+++ b/packages/@ember/-internals/metal/lib/property_get.ts
@@ -1,8 +1,7 @@
/**
@module @ember/object
*/
-import type ProxyMixin from '@ember/-internals/runtime/lib/mixins/-proxy';
-import { setProxy, symbol } from '@ember/-internals/utils';
+import { symbol } from '@ember/-internals/utils';
import { isEmberArray } from '@ember/array/-internals';
import { assert } from '@ember/debug';
import { DEBUG } from '@glimmer/env';
@@ -173,10 +172,6 @@ _getProp({ unknownProperty() {} }, 1 as any);
get({}, 'foo');
get({}, 'foo.bar');
-let fakeProxy = {} as ProxyMixin;
-setProxy(fakeProxy);
-
track(() => _getProp({}, 'a'));
track(() => _getProp({}, 1 as any));
track(() => _getProp({ a: [] }, 'a'));
-track(() => _getProp({ a: fakeProxy }, 'a'));
diff --git a/packages/@ember/-internals/runtime/index.ts b/packages/@ember/-internals/runtime/index.ts
index ec028a7a2da..ed6b65848e1 100644
--- a/packages/@ember/-internals/runtime/index.ts
+++ b/packages/@ember/-internals/runtime/index.ts
@@ -2,7 +2,6 @@ export { default as RegistryProxyMixin } from './lib/mixins/registry_proxy';
export { default as ContainerProxyMixin } from './lib/mixins/container_proxy';
export { default as Comparable } from './lib/mixins/comparable';
export { default as ActionHandler } from './lib/mixins/action_handler';
-export { default as _ProxyMixin, contentFor as _contentFor } from './lib/mixins/-proxy';
export { default as MutableEnumerable } from '@ember/enumerable/mutable';
export { default as TargetActionSupport } from './lib/mixins/target_action_support';
diff --git a/packages/@ember/-internals/runtime/lib/mixins/-proxy.ts b/packages/@ember/-internals/runtime/lib/mixins/-proxy.ts
deleted file mode 100644
index f45c14a2855..00000000000
--- a/packages/@ember/-internals/runtime/lib/mixins/-proxy.ts
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
-@module ember
-*/
-
-import { meta } from '@ember/-internals/meta';
-import Mixin from '@ember/object/mixin';
-import {
- get,
- set,
- defineProperty,
- tagForObject,
- computed,
- tagForProperty,
-} from '@ember/-internals/metal';
-import { setProxy, setupMandatorySetter, isObject, isProxy } from '@ember/-internals/utils';
-import { assert } from '@ember/debug';
-import { DEBUG } from '@glimmer/env';
-import { setCustomTagFor } from '@glimmer/manager';
-import type { UpdatableTag, Tag } from '@glimmer/validator';
-import { combine, updateTag, tagFor, tagMetaFor } from '@glimmer/validator';
-
-export function contentFor(proxy: ProxyMixin): T | null {
- let content = get(proxy, 'content');
- // SAFETY: Ideally we'd assert instead of casting, but @glimmer/validator doesn't give us
- // sufficient public types for this. Previously this code was .js and worked correctly so
- // hopefully this is sufficiently reliable.
- updateTag(tagForObject(proxy) as UpdatableTag, tagForObject(content));
- return content;
-}
-
-function customTagForProxy(proxy: object, key: string, addMandatorySetter?: boolean): Tag {
- assert('Expected a proxy', isProxy(proxy));
-
- let meta = tagMetaFor(proxy);
- let tag = tagFor(proxy, key, meta);
-
- if (DEBUG) {
- // TODO: Replace this with something more first class for tracking tags in DEBUG
- // SAFETY: This is not an officially supported property but setting shouldn't cause issues.
- (tag as any)._propertyKey = key;
- }
-
- if (key in proxy) {
- if (DEBUG && addMandatorySetter) {
- assert('[BUG] setupMandatorySetter should be set when debugging', setupMandatorySetter);
- setupMandatorySetter(tag, proxy, key);
- }
-
- return tag;
- } else {
- let tags: Tag[] = [tag, tagFor(proxy, 'content', meta)];
-
- let content = contentFor(proxy);
-
- if (isObject(content)) {
- tags.push(tagForProperty(content, key, addMandatorySetter));
- }
-
- return combine(tags);
- }
-}
-
-/**
- `Ember.ProxyMixin` forwards all properties not defined by the proxy itself
- to a proxied `content` object. See ObjectProxy for more details.
-
- @class ProxyMixin
- @namespace Ember
- @private
-*/
-interface ProxyMixin {
- /**
- The object whose properties will be forwarded.
-
- @property content
- @type {unknown}
- @default null
- @public
- */
- content: T | null;
-
- willDestroy(): void;
-
- isTruthy: boolean;
-
- unknownProperty(key: K): T[K] | undefined;
- unknownProperty(key: string): unknown;
-
- setUnknownProperty(key: K, value: T[K]): T[K];
- setUnknownProperty(key: string, value: V): V;
-}
-
-const ProxyMixin = Mixin.create({
- /**
- The object whose properties will be forwarded.
-
- @property content
- @type {unknown}
- @default null
- @public
- */
- content: null,
-
- init() {
- this._super(...arguments);
- setProxy(this);
- tagForObject(this);
- setCustomTagFor(this, customTagForProxy);
- },
-
- willDestroy() {
- this.set('content', null);
- this._super(...arguments);
- },
-
- isTruthy: computed('content', function () {
- return Boolean(get(this, 'content'));
- }),
-
- unknownProperty(key: string) {
- let content = contentFor(this);
- return content ? get(content, key) : undefined;
- },
-
- setUnknownProperty(key: string, value: unknown) {
- let m = meta(this);
-
- if (m.isInitializing() || m.isPrototypeMeta(this)) {
- // if marked as prototype or object is initializing then just
- // defineProperty rather than delegate
- defineProperty(this, key, null, value);
- return value;
- }
-
- let content = contentFor(this);
-
- assert(
- `Cannot delegate set('${key}', ${value}) to the 'content' property of object proxy ${this}: its 'content' is undefined.`,
- content
- );
-
- // SAFETY: We don't actually guarantee that this is an object, so this isn't necessarily safe :(
- return set(content as object, key, value);
- },
-});
-
-export default ProxyMixin;
diff --git a/packages/@ember/-internals/runtime/tests/core/is_array_test.js b/packages/@ember/-internals/runtime/tests/core/is_array_test.js
index 6416fa4d421..e2a98670353 100644
--- a/packages/@ember/-internals/runtime/tests/core/is_array_test.js
+++ b/packages/@ember/-internals/runtime/tests/core/is_array_test.js
@@ -1,5 +1,4 @@
-import { A as emberA, isArray } from '@ember/array';
-import ArrayProxy from '@ember/array/proxy';
+import { isArray } from '@ember/array';
import EmberObject from '@ember/object';
import { window } from '@ember/-internals/browser-environment';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
@@ -19,7 +18,6 @@ moduleFor(
let strangeLength = { length: 'yes' };
let fn = function () {};
let asyncFn = async function () {};
- let arrayProxy = ArrayProxy.create({ content: emberA() });
assert.equal(isArray(numarray), true, '[1,2,3]');
assert.equal(isArray(number), false, '23');
@@ -31,7 +29,6 @@ moduleFor(
assert.equal(isArray(global), false, 'global');
assert.equal(isArray(fn), false, 'function() {}');
assert.equal(isArray(asyncFn), false, 'async function() {}');
- assert.equal(isArray(arrayProxy), true, '[]');
}
'@test Ember.isArray does not trigger proxy assertion when probing for length GH#16495'(
diff --git a/packages/@ember/-internals/runtime/tests/core/is_empty_test.js b/packages/@ember/-internals/runtime/tests/core/is_empty_test.js
index cb8108de479..0e9cbfa7116 100644
--- a/packages/@ember/-internals/runtime/tests/core/is_empty_test.js
+++ b/packages/@ember/-internals/runtime/tests/core/is_empty_test.js
@@ -1,27 +1,9 @@
-import { isEmpty } from '@ember/utils';
-import ArrayProxy from '@ember/array/proxy';
-import ObjectProxy from '@ember/object/proxy';
-import { A as emberA } from '@ember/array';
+// import { isEmpty } from '@ember/utils';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
moduleFor(
'Ember.isEmpty',
class extends AbstractTestCase {
- ['@test Ember.isEmpty ArrayProxy'](assert) {
- let arrayProxy = ArrayProxy.create({ content: emberA() });
-
- assert.equal(true, isEmpty(arrayProxy), 'for an ArrayProxy that has empty content');
- }
-
- ['@test Ember.isEmpty ObjectProxy ArrayProxy'](assert) {
- let arrayProxy = ArrayProxy.create({ content: emberA([]) });
- let objectProxy = ObjectProxy.create({ content: arrayProxy });
-
- assert.equal(
- true,
- isEmpty(objectProxy),
- 'for an ArrayProxy inside ObjectProxy that has empty content'
- );
- }
+ // TODO: Add real tests here
}
);
diff --git a/packages/@ember/-internals/runtime/tests/helpers/array.js b/packages/@ember/-internals/runtime/tests/helpers/array.js
index 68e4aa22fad..09edd3f6551 100644
--- a/packages/@ember/-internals/runtime/tests/helpers/array.js
+++ b/packages/@ember/-internals/runtime/tests/helpers/array.js
@@ -1,4 +1,3 @@
-import ArrayProxy from '@ember/array/proxy';
import EmberArray, { A as emberA } from '@ember/array';
import MutableArray from '@ember/array/mutable';
import { generateGuid, guidFor } from '@ember/-internals/utils';
@@ -8,7 +7,7 @@ import {
arrayContentWillChange,
arrayContentDidChange,
} from '@ember/-internals/metal';
-import EmberObject, { get, computed } from '@ember/object';
+import EmberObject, { computed } from '@ember/object';
import { moduleFor } from 'internal-test-helpers';
export function newFixture(cnt) {
@@ -150,20 +149,6 @@ class NativeArrayHelpers extends AbstractArrayHelper {
}
}
-class ArrayProxyHelpers extends AbstractArrayHelper {
- newObject(ary) {
- return ArrayProxy.create({ content: emberA(super.newObject(ary)) });
- }
-
- mutate(obj) {
- obj.pushObject(get(obj, 'length') + 1);
- }
-
- toArray(obj) {
- return obj.toArray ? obj.toArray() : obj.slice();
- }
-}
-
/*
Implement a basic fake mutable array. This validates that any non-native
enumerable can impl this API.
@@ -259,9 +244,6 @@ export function runArrayTests(name, Tests, ...types) {
if (types.length > 0) {
types.forEach((type) => {
switch (type) {
- case 'ArrayProxy':
- moduleFor(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);
- break;
case 'EmberArray':
moduleFor(`EmberArray: ${name}`, Tests, EmberArrayHelpers);
break;
@@ -276,7 +258,6 @@ export function runArrayTests(name, Tests, ...types) {
}
});
} else {
- moduleFor(`ArrayProxy: ${name}`, Tests, ArrayProxyHelpers);
moduleFor(`EmberArray: ${name}`, Tests, EmberArrayHelpers);
moduleFor(`MutableArray: ${name}`, Tests, MutableArrayHelpers);
moduleFor(`NativeArray: ${name}`, Tests, NativeArrayHelpers);
diff --git a/packages/@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js b/packages/@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js
index 0a8af297f24..c4c1388dc13 100644
--- a/packages/@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js
+++ b/packages/@ember/-internals/runtime/tests/mixins/mutable_enumerable_test.js
@@ -1,5 +1,4 @@
import MutableEnumerable from '@ember/enumerable/mutable';
-import ArrayProxy from '@ember/array/proxy';
import { A } from '@ember/array';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
@@ -9,9 +8,5 @@ moduleFor(
['@test should be mixed into A()'](assert) {
assert.ok(MutableEnumerable.detect(A()));
}
-
- ['@test should be mixed into ArrayProxy'](assert) {
- assert.ok(MutableEnumerable.detect(ArrayProxy.create()));
- }
}
);
diff --git a/packages/@ember/-internals/runtime/tests/mixins/promise_proxy_test.js b/packages/@ember/-internals/runtime/tests/mixins/promise_proxy_test.js
deleted file mode 100644
index 99822d559fd..00000000000
--- a/packages/@ember/-internals/runtime/tests/mixins/promise_proxy_test.js
+++ /dev/null
@@ -1,610 +0,0 @@
-import { run } from '@ember/runloop';
-import { get } from '@ember/object';
-import ObjectProxy from '@ember/object/proxy';
-import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
-import EmberRSVP from '../../lib/ext/rsvp';
-import { onerrorDefault } from '../../lib/ext/rsvp';
-import * as RSVP from 'rsvp';
-import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-
-let ObjectPromiseProxy, proxy;
-
-moduleFor(
- 'Ember.PromiseProxy - ObjectProxy',
- class extends AbstractTestCase {
- beforeEach() {
- ObjectPromiseProxy = ObjectProxy.extend(PromiseProxyMixin);
- }
-
- afterEach() {
- RSVP.on('error', onerrorDefault);
- if (proxy) proxy.destroy();
- proxy = undefined;
- }
-
- ['@test present on ember namespace'](assert) {
- assert.ok(PromiseProxyMixin, 'expected PromiseProxyMixin to exist');
- }
-
- ['@test no promise, invoking then should raise'](assert) {
- proxy = ObjectPromiseProxy.create();
-
- assert.throws(function () {
- proxy.then(
- function () {
- return this;
- },
- function () {
- return this;
- }
- );
- }, new RegExp("PromiseProxy's promise must be set"));
- }
-
- ['@test fulfillment'](assert) {
- let value = {
- firstName: 'stef',
- lastName: 'penner',
- };
-
- let deferred = RSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- let didFulfillCount = 0;
- let didRejectCount = 0;
-
- proxy.then(
- () => didFulfillCount++,
- () => didRejectCount++
- );
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy to have no reason');
- assert.equal(
- get(proxy, 'isPending'),
- true,
- 'expects the proxy to indicate that it is loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- false,
- 'expects the proxy to indicate that it is not settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');
- assert.equal(didRejectCount, 0, 'should not yet have been rejected');
-
- run(deferred, 'resolve', value);
-
- assert.equal(didFulfillCount, 1, 'should have been fulfilled');
- assert.equal(didRejectCount, 0, 'should not have been rejected');
-
- assert.equal(get(proxy, 'content'), value, 'expects the proxy to have content');
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy to still have no reason');
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is no longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- true,
- 'expects the proxy to indicate that it is fulfilled'
- );
-
- run(deferred, 'resolve', value);
-
- assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');
- assert.equal(didRejectCount, 0, 'should still not have been rejected');
-
- run(deferred, 'reject', value);
-
- assert.equal(didFulfillCount, 1, 'should still have been only fulfilled once');
- assert.equal(didRejectCount, 0, 'should still not have been rejected');
-
- assert.equal(
- get(proxy, 'content'),
- value,
- 'expects the proxy to have still have same content'
- );
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy still to have no reason');
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is no longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- true,
- 'expects the proxy to indicate that it is fulfilled'
- );
-
- // rest of the promise semantics are tested in directly in RSVP
- }
-
- ['@test rejection'](assert) {
- let reason = new Error('failure');
- let deferred = RSVP.defer();
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- let didFulfillCount = 0;
- let didRejectCount = 0;
-
- proxy.then(
- () => didFulfillCount++,
- () => didRejectCount++
- );
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy to have no reason');
- assert.equal(
- get(proxy, 'isPending'),
- true,
- 'expects the proxy to indicate that it is loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- false,
- 'expects the proxy to indicate that it is not settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');
- assert.equal(didRejectCount, 0, 'should not yet have been rejected');
-
- run(deferred, 'reject', reason);
-
- assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');
- assert.equal(didRejectCount, 1, 'should have been rejected');
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), reason, 'expects the proxy to have a reason');
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is not longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- true,
- 'expects the proxy to indicate that it is rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- run(deferred, 'reject', reason);
-
- assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');
- assert.equal(didRejectCount, 1, 'should still remain rejected');
-
- run(deferred, 'resolve', 1);
-
- assert.equal(didFulfillCount, 0, 'should stll not yet have been fulfilled');
- assert.equal(didRejectCount, 1, 'should still remain rejected');
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), reason, 'expects the proxy to have a reason');
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is not longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- true,
- 'expects the proxy to indicate that it is rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
- }
-
- // https://github.com/emberjs/ember.js/issues/15694
- ['@test rejection without specifying reason'](assert) {
- let deferred = RSVP.defer();
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- let didFulfillCount = 0;
- let didRejectCount = 0;
-
- proxy.then(
- () => didFulfillCount++,
- () => didRejectCount++
- );
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy to have no reason');
- assert.equal(
- get(proxy, 'isPending'),
- true,
- 'expects the proxy to indicate that it is loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- false,
- 'expects the proxy to indicate that it is not settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');
- assert.equal(didRejectCount, 0, 'should not yet have been rejected');
-
- run(deferred, 'reject');
-
- assert.equal(didFulfillCount, 0, 'should not yet have been fulfilled');
- assert.equal(didRejectCount, 1, 'should have been rejected');
-
- assert.equal(get(proxy, 'content'), undefined, 'expects the proxy to have no content');
- assert.equal(get(proxy, 'reason'), undefined, 'expects the proxy to have a reason');
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is not longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- true,
- 'expects the proxy to indicate that it is rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
- }
-
- ["@test unhandled rejects still propagate to RSVP.on('error', ...) "](assert) {
- assert.expect(1);
-
- RSVP.on('error', onerror);
- RSVP.off('error', onerrorDefault);
-
- let expectedReason = new Error('failure');
- let deferred = RSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.get('promise');
-
- function onerror(reason) {
- assert.equal(reason, expectedReason, 'expected reason');
- }
-
- RSVP.on('error', onerror);
- RSVP.off('error', onerrorDefault);
-
- run(deferred, 'reject', expectedReason);
-
- RSVP.on('error', onerrorDefault);
- RSVP.off('error', onerror);
-
- run(deferred, 'reject', expectedReason);
-
- RSVP.on('error', onerrorDefault);
- RSVP.off('error', onerror);
- }
-
- ['@test should work with promise inheritance'](assert) {
- class PromiseSubclass extends RSVP.Promise {}
-
- proxy = ObjectPromiseProxy.create({
- promise: new PromiseSubclass(() => {}),
- });
-
- assert.ok(proxy.then() instanceof PromiseSubclass, 'promise proxy respected inheritance');
- }
-
- ['@test should reset isFulfilled and isRejected when promise is reset'](assert) {
- let deferred = EmberRSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- assert.equal(
- get(proxy, 'isPending'),
- true,
- 'expects the proxy to indicate that it is loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- false,
- 'expects the proxy to indicate that it is not settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- run(deferred, 'resolve');
-
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is no longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- true,
- 'expects the proxy to indicate that it is fulfilled'
- );
-
- let anotherDeferred = EmberRSVP.defer();
- proxy.set('promise', anotherDeferred.promise);
-
- assert.equal(
- get(proxy, 'isPending'),
- true,
- 'expects the proxy to indicate that it is loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- false,
- 'expects the proxy to indicate that it is not settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- false,
- 'expects the proxy to indicate that it is not rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
-
- run(anotherDeferred, 'reject');
-
- assert.equal(
- get(proxy, 'isPending'),
- false,
- 'expects the proxy to indicate that it is not longer loading'
- );
- assert.equal(
- get(proxy, 'isSettled'),
- true,
- 'expects the proxy to indicate that it is settled'
- );
- assert.equal(
- get(proxy, 'isRejected'),
- true,
- 'expects the proxy to indicate that it is rejected'
- );
- assert.equal(
- get(proxy, 'isFulfilled'),
- false,
- 'expects the proxy to indicate that it is not fulfilled'
- );
- }
-
- ['@test should have content when isFulfilled is set'](assert) {
- let deferred = EmberRSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.addObserver('isFulfilled', () => assert.equal(get(proxy, 'content'), true));
-
- run(deferred, 'resolve', true);
- }
-
- ['@test should have reason when isRejected is set'](assert) {
- let error = new Error('Y U REJECT?!?');
- let deferred = EmberRSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.addObserver('isRejected', () => assert.equal(get(proxy, 'reason'), error));
-
- try {
- run(deferred, 'reject', error);
- } catch (e) {
- assert.equal(e, error);
- }
- }
-
- ['@test should not error if promise is resolved after proxy has been destroyed'](assert) {
- let deferred = EmberRSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.then(
- () => {},
- () => {}
- );
-
- run(proxy, 'destroy');
-
- run(deferred, 'resolve', true);
-
- assert.ok(
- true,
- 'resolving the promise after the proxy has been destroyed does not raise an error'
- );
- }
-
- ['@test should not error if promise is rejected after proxy has been destroyed'](assert) {
- let deferred = EmberRSVP.defer();
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.then(
- () => {},
- () => {}
- );
-
- run(proxy, 'destroy');
-
- run(deferred, 'reject', 'some reason');
-
- assert.ok(
- true,
- 'rejecting the promise after the proxy has been destroyed does not raise an error'
- );
- }
-
- ['@test promise chain is not broken if promised is resolved after proxy has been destroyed'](
- assert
- ) {
- let deferred = EmberRSVP.defer();
- let expectedValue = {};
- let receivedValue;
- let didResolveCount = 0;
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.then(
- (value) => {
- receivedValue = value;
- didResolveCount++;
- },
- () => {}
- );
-
- run(proxy, 'destroy');
-
- run(deferred, 'resolve', expectedValue);
-
- assert.equal(didResolveCount, 1, 'callback called');
- assert.equal(
- receivedValue,
- expectedValue,
- 'passed value is the value the promise was resolved with'
- );
- }
-
- ['@test promise chain is not broken if promised is rejected after proxy has been destroyed'](
- assert
- ) {
- let deferred = EmberRSVP.defer();
- let expectedReason = 'some reason';
- let receivedReason;
- let didRejectCount = 0;
-
- proxy = ObjectPromiseProxy.create({
- promise: deferred.promise,
- });
-
- proxy.then(
- () => {},
- (reason) => {
- receivedReason = reason;
- didRejectCount++;
- }
- );
-
- run(proxy, 'destroy');
-
- run(deferred, 'reject', expectedReason);
-
- assert.equal(didRejectCount, 1, 'callback called');
- assert.equal(
- receivedReason,
- expectedReason,
- 'passed reason is the reason the promise was rejected for'
- );
- }
- }
-);
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/addObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/addObject-test.js
index 383e15d654b..7f72f61a957 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/addObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/addObject-test.js
@@ -83,4 +83,4 @@ class AddObjectTest extends AbstractTestCase {
}
}
-runArrayTests('addObject', AddObjectTest, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('addObject', AddObjectTest, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/clear-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/clear-test.js
index 3b9726d8b00..8a6a2005466 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/clear-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/clear-test.js
@@ -71,4 +71,4 @@ class ClearTests extends AbstractTestCase {
}
}
-runArrayTests('clear', ClearTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('clear', ClearTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/insertAt-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/insertAt-test.js
index 1182812c2ab..c6a901e7069 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/insertAt-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/insertAt-test.js
@@ -242,4 +242,4 @@ class InsertAtTests extends AbstractTestCase {
}
}
-runArrayTests('instertAt', InsertAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('instertAt', InsertAtTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/popObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/popObject-test.js
index c5d463b6ff0..64e7e577426 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/popObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/popObject-test.js
@@ -103,4 +103,4 @@ class PopObjectTests extends AbstractTestCase {
}
}
-runArrayTests('popObject', PopObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('popObject', PopObjectTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/pushObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/pushObject-test.js
index b8b55554ff0..cc66f5df7f4 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/pushObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/pushObject-test.js
@@ -110,4 +110,4 @@ class PushObjectTests extends AbstractTestCase {
}
}
-runArrayTests('pushObject', PushObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('pushObject', PushObjectTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js
index 55a67b4139e..61e62dfb12f 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/pushObjects-test.js
@@ -9,4 +9,4 @@ class PushObjectsTests extends AbstractTestCase {
}
}
-runArrayTests('pushObjects', PushObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('pushObjects', PushObjectsTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/removeAt-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/removeAt-test.js
index fedf2195d05..d85acb01fbb 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/removeAt-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/removeAt-test.js
@@ -214,4 +214,4 @@ class RemoveAtTests extends AbstractTestCase {
}
}
-runArrayTests('removeAt', RemoveAtTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('removeAt', RemoveAtTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/removeObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/removeObject-test.js
index 86e828e2b09..fe26e1fad15 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/removeObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/removeObject-test.js
@@ -86,4 +86,4 @@ class RemoveObjectTests extends AbstractTestCase {
}
}
-runArrayTests('removeObject', RemoveObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('removeObject', RemoveObjectTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js
index 13d71267781..9d320f974d3 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/removeObjects-test.js
@@ -235,4 +235,4 @@ class RemoveObjectsTests extends AbstractTestCase {
}
}
-runArrayTests('removeObjects', RemoveObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('removeObjects', RemoveObjectsTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/replace-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/replace-test.js
index 7b72f9591ba..a683cffe202 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/replace-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/replace-test.js
@@ -258,4 +258,4 @@ class ReplaceTests extends AbstractTestCase {
}
}
-runArrayTests('replace', ReplaceTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('replace', ReplaceTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js
index ee16585bd5b..cf330dc436a 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/reverseObjects-test.js
@@ -37,4 +37,4 @@ class ReverseObjectsTests extends AbstractTestCase {
}
}
-runArrayTests('reverseObjects', ReverseObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('reverseObjects', ReverseObjectsTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/setObjects-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/setObjects-test.js
index 91385a04737..861c9b54db2 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/setObjects-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/setObjects-test.js
@@ -70,4 +70,4 @@ class SetObjectsTests extends AbstractTestCase {
}
}
-runArrayTests('setObjects', SetObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('setObjects', SetObjectsTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js
index 39217ecae91..4cbd3f87959 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/shiftObject-test.js
@@ -117,4 +117,4 @@ class ShiftObjectTests extends AbstractTestCase {
}
}
-runArrayTests('shiftObject', ShiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('shiftObject', ShiftObjectTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js
index 2e94387e2b5..8c7c0c5b3fb 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObject-test.js
@@ -111,4 +111,4 @@ class UnshiftObjectTests extends AbstractTestCase {
}
}
-runArrayTests('unshiftObject', UnshiftObjectTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('unshiftObject', UnshiftObjectTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js b/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js
index 44b92473ad3..c82e7cc5526 100644
--- a/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js
+++ b/packages/@ember/-internals/runtime/tests/mutable-array/unshiftObjects-test.js
@@ -114,4 +114,4 @@ class UnshiftObjectsTests extends AbstractTestCase {
}
}
-runArrayTests('unshiftObjects', UnshiftObjectsTests, 'MutableArray', 'NativeArray', 'ArrayProxy');
+runArrayTests('unshiftObjects', UnshiftObjectsTests, 'MutableArray', 'NativeArray');
diff --git a/packages/@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test.js b/packages/@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test.js
deleted file mode 100644
index fbdfefb902f..00000000000
--- a/packages/@ember/-internals/runtime/tests/system/array_proxy/arranged_content_test.js
+++ /dev/null
@@ -1,278 +0,0 @@
-import { run } from '@ember/runloop';
-import { objectAt } from '@ember/-internals/metal';
-import { computed } from '@ember/object';
-import ArrayProxy from '@ember/array/proxy';
-import { A as emberA } from '@ember/array';
-import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-
-let array;
-
-moduleFor(
- 'ArrayProxy - arrangedContent',
- class extends AbstractTestCase {
- beforeEach() {
- run(() => {
- array = class extends ArrayProxy {
- @computed('content.[]')
- get arrangedContent() {
- let content = this.get('content');
- return (
- content &&
- emberA(
- content.slice().sort((a, b) => {
- if (a == null) {
- a = -1;
- }
- if (b == null) {
- b = -1;
- }
- return b - a;
- })
- )
- );
- }
- }.create({
- content: emberA([1, 2, 4, 5]),
- });
- });
- }
-
- afterEach() {
- run(() => array.destroy());
- }
-
- ['@test compact - returns arrangedContent without nulls and undefined'](assert) {
- run(() => array.set('content', emberA([1, 3, null, 2, undefined])));
-
- assert.deepEqual(array.compact(), [3, 2, 1]);
- }
-
- ['@test indexOf - returns index of object in arrangedContent'](assert) {
- assert.equal(array.indexOf(4), 1, 'returns arranged index');
- }
-
- ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {
- array.get('content').pushObject(4);
- assert.equal(array.lastIndexOf(4), 2, 'returns last arranged index');
- }
-
- ['@test objectAt - returns object at index in arrangedContent'](assert) {
- assert.equal(objectAt(array, 1), 4, 'returns object at index');
- }
-
- // Not sure if we need a specific test for it, since it's internal
- ['@test objectAtContent - returns object at index in arrangedContent'](assert) {
- assert.equal(array.objectAtContent(1), 4, 'returns object at index');
- }
-
- ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {
- assert.deepEqual(array.objectsAt([0, 2, 4]), [5, 2, undefined], 'returns objects at indices');
- }
-
- ['@test replace - mutating an arranged ArrayProxy is not allowed']() {
- expectAssertion(() => {
- array.replace(0, 0, [3]);
- }, /Mutating an arranged ArrayProxy is not allowed/);
- }
-
- ['@test replaceContent - does a standard array replace on content'](assert) {
- run(() => array.replaceContent(1, 2, [3]));
- assert.deepEqual(array.get('content'), [1, 3, 5]);
- }
-
- ['@test slice - returns a slice of the arrangedContent'](assert) {
- assert.deepEqual(array.slice(1, 3), [4, 2], 'returns sliced arrangedContent');
- }
-
- ['@test toArray - returns copy of arrangedContent'](assert) {
- assert.deepEqual(array.toArray(), [5, 4, 2, 1]);
- }
-
- ['@test without - returns arrangedContent without object'](assert) {
- assert.deepEqual(array.without(2), [5, 4, 1], 'returns arranged without object');
- }
-
- ['@test lastObject - returns last arranged object'](assert) {
- assert.equal(array.get('lastObject'), 1, 'returns last arranged object');
- }
-
- ['@test firstObject - returns first arranged object'](assert) {
- assert.equal(array.get('firstObject'), 5, 'returns first arranged object');
- }
- }
-);
-
-moduleFor(
- 'ArrayProxy - arrangedContent matching content',
- class extends AbstractTestCase {
- beforeEach() {
- run(function () {
- array = ArrayProxy.create({
- content: emberA([1, 2, 4, 5]),
- });
- });
- }
-
- afterEach() {
- run(function () {
- array.destroy();
- });
- }
-
- ['@test insertAt - inserts object at specified index'](assert) {
- run(function () {
- array.insertAt(2, 3);
- });
- assert.deepEqual(array.get('content'), [1, 2, 3, 4, 5]);
- }
-
- ['@test replace - does a standard array replace'](assert) {
- run(function () {
- array.replace(1, 2, [3]);
- });
- assert.deepEqual(array.get('content'), [1, 3, 5]);
- }
-
- ['@test reverseObjects - reverses content'](assert) {
- run(function () {
- array.reverseObjects();
- });
- assert.deepEqual(array.get('content'), [5, 4, 2, 1]);
- }
- }
-);
-
-moduleFor(
- 'ArrayProxy - arrangedContent with transforms',
- class extends AbstractTestCase {
- beforeEach() {
- run(function () {
- array = class extends ArrayProxy {
- @computed('content.[]')
- get arrangedContent() {
- let content = this.get('content');
- return (
- content &&
- emberA(
- content.slice().sort(function (a, b) {
- if (a == null) {
- a = -1;
- }
- if (b == null) {
- b = -1;
- }
- return b - a;
- })
- )
- );
- }
-
- objectAtContent(idx) {
- let obj = objectAt(this.get('arrangedContent'), idx);
- return obj && obj.toString();
- }
- }.create({
- content: emberA([1, 2, 4, 5]),
- });
- });
- }
-
- afterEach() {
- run(function () {
- array.destroy();
- });
- }
-
- ['@test indexOf - returns index of object in arrangedContent'](assert) {
- assert.equal(array.indexOf('4'), 1, 'returns arranged index');
- }
-
- ['@test lastIndexOf - returns last index of object in arrangedContent'](assert) {
- array.get('content').pushObject(4);
- assert.equal(array.lastIndexOf('4'), 2, 'returns last arranged index');
- }
-
- ['@test objectAt - returns object at index in arrangedContent'](assert) {
- assert.equal(objectAt(array, 1), '4', 'returns object at index');
- }
-
- // Not sure if we need a specific test for it, since it's internal
- ['@test objectAtContent - returns object at index in arrangedContent'](assert) {
- assert.equal(array.objectAtContent(1), '4', 'returns object at index');
- }
-
- ['@test objectsAt - returns objects at indices in arrangedContent'](assert) {
- assert.deepEqual(
- array.objectsAt([0, 2, 4]),
- ['5', '2', undefined],
- 'returns objects at indices'
- );
- }
-
- ['@test slice - returns a slice of the arrangedContent'](assert) {
- assert.deepEqual(array.slice(1, 3), ['4', '2'], 'returns sliced arrangedContent');
- }
-
- ['@test toArray - returns copy of arrangedContent'](assert) {
- assert.deepEqual(array.toArray(), ['5', '4', '2', '1']);
- }
-
- ['@test without - returns arrangedContent without object'](assert) {
- assert.deepEqual(array.without('2'), ['5', '4', '1'], 'returns arranged without object');
- }
-
- ['@test lastObject - returns last arranged object'](assert) {
- assert.equal(array.get('lastObject'), '1', 'returns last arranged object');
- }
-
- ['@test firstObject - returns first arranged object'](assert) {
- assert.equal(array.get('firstObject'), '5', 'returns first arranged object');
- }
- }
-);
-
-moduleFor(
- 'ArrayProxy - with transforms',
- class extends AbstractTestCase {
- beforeEach() {
- run(function () {
- array = class extends ArrayProxy {
- objectAtContent(idx) {
- let obj = objectAt(this.get('arrangedContent'), idx);
- return obj && obj.toString();
- }
- }.create({
- content: emberA([1, 2, 4, 5]),
- });
- });
- }
-
- afterEach() {
- run(function () {
- array.destroy();
- });
- }
-
- ['@test popObject - removes last object in arrangedContent'](assert) {
- let popped = array.popObject();
- assert.equal(popped, '5', 'returns last object');
- assert.deepEqual(array.toArray(), ['1', '2', '4'], 'removes from content');
- }
-
- ['@test removeObject - removes object from content'](assert) {
- array.removeObject('2');
- assert.deepEqual(array.toArray(), ['1', '4', '5']);
- }
-
- ['@test removeObjects - removes objects from content'](assert) {
- array.removeObjects(['2', '4', '6']);
- assert.deepEqual(array.toArray(), ['1', '5']);
- }
-
- ['@test shiftObject - removes from start of arrangedContent'](assert) {
- let shifted = array.shiftObject();
- assert.equal(shifted, '1', 'returns first object');
- assert.deepEqual(array.toArray(), ['2', '4', '5'], 'removes object from content');
- }
- }
-);
diff --git a/packages/@ember/-internals/runtime/tests/system/array_proxy/content_change_test.js b/packages/@ember/-internals/runtime/tests/system/array_proxy/content_change_test.js
deleted file mode 100644
index e3af74e2cfb..00000000000
--- a/packages/@ember/-internals/runtime/tests/system/array_proxy/content_change_test.js
+++ /dev/null
@@ -1,86 +0,0 @@
-import { run } from '@ember/runloop';
-import { changeProperties } from '@ember/-internals/metal';
-import { set } from '@ember/object';
-import ArrayProxy from '@ember/array/proxy';
-import { A as emberA } from '@ember/array';
-import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-
-moduleFor(
- 'ArrayProxy - content change',
- class extends AbstractTestCase {
- ["@test The ArrayProxy doesn't explode when assigned a destroyed object"](assert) {
- let proxy1 = ArrayProxy.create();
- let proxy2 = ArrayProxy.create();
-
- run(() => proxy1.destroy());
-
- set(proxy2, 'content', proxy1);
-
- assert.ok(true, 'No exception was raised');
- }
-
- ['@test should update if content changes while change events are deferred'](assert) {
- let proxy = ArrayProxy.create();
-
- assert.deepEqual(proxy.toArray(), []);
-
- changeProperties(() => {
- proxy.set('content', emberA([1, 2, 3]));
- assert.deepEqual(proxy.toArray(), [1, 2, 3]);
- });
- }
-
- ['@test objectAt recomputes the object cache correctly'](assert) {
- let indexes = [];
-
- let proxy = class extends ArrayProxy {
- objectAtContent(index) {
- indexes.push(index);
- return this.content[index];
- }
- }.create({
- content: emberA([1, 2, 3, 4, 5]),
- });
-
- assert.deepEqual(indexes, []);
- assert.deepEqual(proxy.objectAt(0), 1);
- assert.deepEqual(indexes, [0, 1, 2, 3, 4]);
-
- indexes.length = 0;
- proxy.set('content', emberA([1, 2, 3]));
- assert.deepEqual(proxy.objectAt(0), 1);
- assert.deepEqual(indexes, [0, 1, 2]);
-
- indexes.length = 0;
- proxy.content.replace(2, 0, [4, 5]);
- assert.deepEqual(proxy.objectAt(0), 1);
- assert.deepEqual(proxy.objectAt(1), 2);
- assert.deepEqual(indexes, []);
- assert.deepEqual(proxy.objectAt(2), 4);
- assert.deepEqual(indexes, [2, 3, 4]);
- }
-
- ['@test negative indexes are handled correctly'](assert) {
- let indexes = [];
-
- let proxy = class extends ArrayProxy {
- objectAtContent(index) {
- indexes.push(index);
- return this.content[index];
- }
- }.create({
- content: emberA([1, 2, 3, 4, 5]),
- });
-
- assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 5]);
-
- indexes.length = 0;
-
- proxy.content.replace(-1, 0, [7]);
- proxy.content.replace(-2, 0, [6]);
-
- assert.deepEqual(proxy.toArray(), [1, 2, 3, 4, 6, 7, 5]);
- assert.deepEqual(indexes, [4, 5, 6]);
- }
- }
-);
diff --git a/packages/@ember/-internals/runtime/tests/system/array_proxy/length_test.js b/packages/@ember/-internals/runtime/tests/system/array_proxy/length_test.js
deleted file mode 100644
index 41ce4894f9e..00000000000
--- a/packages/@ember/-internals/runtime/tests/system/array_proxy/length_test.js
+++ /dev/null
@@ -1,254 +0,0 @@
-import ArrayProxy from '@ember/array/proxy';
-import EmberObject, { observer } from '@ember/object';
-import { oneWay as reads, not } from '@ember/object/computed';
-import { A as a } from '@ember/array';
-import { moduleFor, AbstractTestCase, runTask, runLoopSettled } from 'internal-test-helpers';
-import { set, get } from '@ember/object';
-import { createCache, getValue } from '@glimmer/validator';
-
-moduleFor(
- 'Ember.ArrayProxy - content change (length)',
- class extends AbstractTestCase {
- ['@test should update length for null content'](assert) {
- let proxy = ArrayProxy.create({
- content: a([1, 2, 3]),
- });
-
- assert.equal(proxy.get('length'), 3, 'precond - length is 3');
-
- proxy.set('content', null);
-
- assert.equal(proxy.get('length'), 0, 'length updates');
- }
-
- ['@test should update length for null content when there is a computed property watching length'](
- assert
- ) {
- let proxy = class extends ArrayProxy {
- @not('length')
- isEmpty;
- }.create({
- content: a([1, 2, 3]),
- });
-
- assert.equal(proxy.get('length'), 3, 'precond - length is 3');
-
- // Consume computed property that depends on length
- proxy.get('isEmpty');
-
- // update content
- proxy.set('content', null);
-
- assert.equal(proxy.get('length'), 0, 'length updates');
- }
-
- ['@test getting length does not recompute the object cache'](assert) {
- let indexes = [];
-
- let proxy = class extends ArrayProxy {
- objectAtContent(index) {
- indexes.push(index);
- return this.content[index];
- }
- }.create({
- content: a([1, 2, 3, 4, 5]),
- });
-
- assert.equal(get(proxy, 'length'), 5);
- assert.deepEqual(indexes, []);
-
- indexes.length = 0;
- proxy.set('content', a([6, 7, 8]));
- assert.equal(get(proxy, 'length'), 3);
- assert.deepEqual(indexes, []);
-
- indexes.length = 0;
- proxy.content.replace(1, 0, [1, 2, 3]);
- assert.equal(get(proxy, 'length'), 6);
- assert.deepEqual(indexes, []);
- }
-
- '@test accessing length after content set to null'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'content', null);
-
- assert.equal(obj.length, 0, 'length is 0 without content');
- assert.deepEqual(obj.content, null, 'content was updated');
- }
-
- '@test accessing length after content set to null in willDestroy'(assert) {
- let obj = class extends ArrayProxy {
- willDestroy() {
- this.set('content', null);
- this._super(...arguments);
- }
- }.create({
- content: ['foo', 'bar'],
- });
-
- assert.equal(obj.length, 2, 'precond');
-
- runTask(() => obj.destroy());
-
- assert.equal(obj.length, 0, 'length is 0 without content');
- assert.deepEqual(obj.content, null, 'content was updated');
- }
-
- '@test setting length to 0'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'length', 0);
-
- assert.equal(obj.length, 0, 'length was updated');
- assert.deepEqual(obj.content, [], 'content length was truncated');
- }
-
- '@test setting length to smaller value'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'length', 1);
-
- assert.equal(obj.length, 1, 'length was updated');
- assert.deepEqual(obj.content, ['foo'], 'content length was truncated');
- }
-
- '@test setting length to larger value'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'length', 3);
-
- assert.equal(obj.length, 3, 'length was updated');
- assert.deepEqual(obj.content, ['foo', 'bar', undefined], 'content length was updated');
- }
-
- '@test setting length after content set to null'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'content', null);
- assert.equal(obj.length, 0, 'length was updated');
-
- set(obj, 'length', 0);
- assert.equal(obj.length, 0, 'length is still updated');
- }
-
- '@test setting length to greater than zero'(assert) {
- let obj = ArrayProxy.create({ content: ['foo', 'bar'] });
-
- assert.equal(obj.length, 2, 'precond');
-
- set(obj, 'length', 1);
-
- assert.equal(obj.length, 1, 'length was updated');
- assert.deepEqual(obj.content, ['foo'], 'content length was truncated');
- }
-
- async ['@test array proxy + aliasedProperty complex test'](assert) {
- let aCalled, bCalled, cCalled, dCalled, eCalled;
-
- aCalled = bCalled = cCalled = dCalled = eCalled = 0;
-
- let obj = EmberObject.extend({
- colors: reads('model'),
- length: reads('colors.length'),
-
- a: observer('length', () => aCalled++),
- b: observer('colors.length', () => bCalled++),
- c: observer('colors.content.length', () => cCalled++),
- d: observer('colors.[]', () => dCalled++),
- e: observer('colors.content.[]', () => eCalled++),
- }).create();
-
- // bootstrap aliases
- obj.length;
-
- obj.set(
- 'model',
- ArrayProxy.create({
- content: a(['red', 'yellow', 'blue']),
- })
- );
-
- await runLoopSettled();
-
- assert.equal(obj.get('colors.content.length'), 3);
- assert.equal(obj.get('colors.length'), 3);
- assert.equal(obj.get('length'), 3);
-
- assert.equal(aCalled, 1, 'expected observer `length` to be called ONCE');
- assert.equal(bCalled, 1, 'expected observer `colors.length` to be called ONCE');
- assert.equal(cCalled, 1, 'expected observer `colors.content.length` to be called ONCE');
- assert.equal(dCalled, 1, 'expected observer `colors.[]` to be called ONCE');
- assert.equal(eCalled, 1, 'expected observer `colors.content.[]` to be called ONCE');
-
- obj.get('colors').pushObjects(['green', 'red']);
- await runLoopSettled();
-
- assert.equal(obj.get('colors.content.length'), 5);
- assert.equal(obj.get('colors.length'), 5);
- assert.equal(obj.get('length'), 5);
-
- assert.equal(aCalled, 2, 'expected observer `length` to be called TWICE');
- assert.equal(bCalled, 2, 'expected observer `colors.length` to be called TWICE');
- assert.equal(cCalled, 2, 'expected observer `colors.content.length` to be called TWICE');
- assert.equal(dCalled, 2, 'expected observer `colors.[]` to be called TWICE');
- assert.equal(eCalled, 2, 'expected observer `colors.content.[]` to be called TWICE');
-
- obj.destroy();
- }
-
- async ['@test array proxy length is reactive when accessed normally'](assert) {
- let proxy = ArrayProxy.create({
- content: a([1, 2, 3]),
- });
-
- let lengthCache = createCache(() => proxy.length);
-
- assert.equal(getValue(lengthCache), 3, 'length is correct');
-
- proxy.pushObject(4);
-
- assert.equal(getValue(lengthCache), 4, 'length is correct');
-
- proxy.removeObject(1);
-
- assert.equal(getValue(lengthCache), 3, 'length is correct');
-
- proxy.set('content', []);
-
- assert.equal(getValue(lengthCache), 0, 'length is correct');
- }
-
- async ['@test array proxy length is reactive when accessed using get'](assert) {
- let proxy = ArrayProxy.create({
- content: a([1, 2, 3]),
- });
-
- let lengthCache = createCache(() => get(proxy, 'length'));
-
- assert.equal(getValue(lengthCache), 3, 'length is correct');
-
- proxy.pushObject(4);
-
- assert.equal(getValue(lengthCache), 4, 'length is correct');
-
- proxy.removeObject(1);
-
- assert.equal(getValue(lengthCache), 3, 'length is correct');
-
- proxy.set('content', []);
-
- assert.equal(getValue(lengthCache), 0, 'length is correct');
- }
- }
-);
diff --git a/packages/@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test.js b/packages/@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test.js
deleted file mode 100644
index 8ff87454e2b..00000000000
--- a/packages/@ember/-internals/runtime/tests/system/array_proxy/watching_and_listening_test.js
+++ /dev/null
@@ -1,66 +0,0 @@
-import { peekMeta } from '@ember/-internals/meta';
-import ArrayProxy from '@ember/array/proxy';
-import { A } from '@ember/array';
-import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-
-function sortedListenersFor(obj, eventName) {
- let listeners = peekMeta(obj).matchingListeners(eventName) || [];
-
- let keys = [];
- for (let i = 0; i < listeners.length; i += 3) {
- keys.push(listeners[i + 1]);
- }
- return keys.sort();
-}
-
-moduleFor(
- 'ArrayProxy - watching and listening',
- class extends AbstractTestCase {
- [`@test setting 'content' adds listeners correctly`](assert) {
- let content = A();
- let proxy = ArrayProxy.create();
-
- assert.deepEqual(sortedListenersFor(content, '@array:before'), []);
- assert.deepEqual(sortedListenersFor(content, '@array:change'), []);
-
- proxy.set('content', content);
-
- assert.deepEqual(sortedListenersFor(content, '@array:before'), [
- '_arrangedContentArrayWillChange',
- ]);
- assert.deepEqual(sortedListenersFor(content, '@array:change'), [
- '_arrangedContentArrayDidChange',
- ]);
- }
-
- [`@test changing 'content' adds and removes listeners correctly`](assert) {
- let content1 = A();
- let content2 = A();
- let proxy = ArrayProxy.create({ content: content1 });
-
- assert.deepEqual(sortedListenersFor(content1, '@array:before'), []);
- assert.deepEqual(sortedListenersFor(content1, '@array:change'), []);
-
- // setup proxy
- proxy.length;
-
- assert.deepEqual(sortedListenersFor(content1, '@array:before'), [
- '_arrangedContentArrayWillChange',
- ]);
- assert.deepEqual(sortedListenersFor(content1, '@array:change'), [
- '_arrangedContentArrayDidChange',
- ]);
-
- proxy.set('content', content2);
-
- assert.deepEqual(sortedListenersFor(content1, '@array:before'), []);
- assert.deepEqual(sortedListenersFor(content1, '@array:change'), []);
- assert.deepEqual(sortedListenersFor(content2, '@array:before'), [
- '_arrangedContentArrayWillChange',
- ]);
- assert.deepEqual(sortedListenersFor(content2, '@array:change'), [
- '_arrangedContentArrayDidChange',
- ]);
- }
- }
-);
diff --git a/packages/@ember/-internals/runtime/tests/system/object_proxy_test.js b/packages/@ember/-internals/runtime/tests/system/object_proxy_test.js
deleted file mode 100644
index c5279308e64..00000000000
--- a/packages/@ember/-internals/runtime/tests/system/object_proxy_test.js
+++ /dev/null
@@ -1,377 +0,0 @@
-import { DEBUG } from '@glimmer/env';
-import { addObserver, removeObserver } from '@ember/-internals/metal';
-import { computed, get, set, observer } from '@ember/object';
-import ObjectProxy from '@ember/object/proxy';
-import { moduleFor, AbstractTestCase, runLoopSettled } from 'internal-test-helpers';
-
-moduleFor(
- 'ObjectProxy',
- class extends AbstractTestCase {
- ['@test should not proxy properties passed to create'](assert) {
- let Proxy = class extends ObjectProxy {
- get cp() {
- return this._cp;
- }
- set cp(value) {
- this._cp = value;
- }
- };
- let proxy = Proxy.create({
- prop: 'Foo',
- cp: 'Bar',
- });
-
- assert.equal(get(proxy, 'prop'), 'Foo', 'should not have tried to proxy set');
- assert.equal(proxy._cp, 'Bar', 'should use CP setter');
- }
-
- ['@test should proxy properties to content'](assert) {
- let content = {
- firstName: 'Tom',
- lastName: 'Dale',
- unknownProperty(key) {
- return key + ' unknown';
- },
- };
- let proxy = ObjectProxy.create();
-
- assert.equal(
- get(proxy, 'firstName'),
- undefined,
- 'get on proxy without content should return undefined'
- );
- expectAssertion(() => {
- set(proxy, 'firstName', 'Foo');
- }, /Cannot delegate set\('firstName', Foo\) to the 'content'/i);
-
- set(proxy, 'content', content);
-
- assert.equal(
- get(proxy, 'firstName'),
- 'Tom',
- 'get on proxy with content should forward to content'
- );
- assert.equal(
- get(proxy, 'lastName'),
- 'Dale',
- 'get on proxy with content should forward to content'
- );
- assert.equal(
- get(proxy, 'foo'),
- 'foo unknown',
- 'get on proxy with content should forward to content'
- );
-
- set(proxy, 'lastName', 'Huda');
-
- assert.equal(
- get(content, 'lastName'),
- 'Huda',
- 'content should have new value from set on proxy'
- );
- assert.equal(get(proxy, 'lastName'), 'Huda', 'proxy should have new value from set on proxy');
-
- set(proxy, 'content', { firstName: 'Yehuda', lastName: 'Katz' });
-
- assert.equal(get(proxy, 'firstName'), 'Yehuda', 'proxy should reflect updated content');
- assert.equal(get(proxy, 'lastName'), 'Katz', 'proxy should reflect updated content');
- }
-
- ['@test getting proxied properties with Ember.get should work'](assert) {
- let proxy = ObjectProxy.create({
- content: {
- foo: 'FOO',
- },
- });
-
- assert.equal(get(proxy, 'foo'), 'FOO');
- }
-
- [`@test JSON.stringify doens't assert`](assert) {
- let proxy = ObjectProxy.create({
- content: {
- foo: 'FOO',
- },
- });
-
- assert.equal(JSON.stringify(proxy), JSON.stringify({ content: { foo: 'FOO' } }));
- }
-
- ['@test calling a function on the proxy avoids the assertion'](assert) {
- if (DEBUG) {
- let proxy = class extends ObjectProxy {
- init() {
- super.init();
- if (!this.foobar) {
- this.foobar = function () {
- let content = get(this, 'content');
- return content.foobar.apply(content, []);
- };
- }
- }
- }.create({
- content: {
- foobar() {
- return 'xoxo';
- },
- },
- });
-
- assert.equal(proxy.foobar(), 'xoxo', 'should be able to use a function from a proxy');
- } else {
- assert.expect(0);
- }
- }
-
- [`@test setting a property on the proxy avoids the assertion`](assert) {
- let proxy = ObjectProxy.create({
- toJSON: undefined,
- content: {
- toJSON() {
- return 'hello';
- },
- },
- });
-
- assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));
- }
-
- [`@test setting a property on the proxy's prototype avoids the assertion`](assert) {
- let proxy = ObjectProxy.extend({
- toJSON: null,
- }).create({
- content: {
- toJSON() {
- return 'hello';
- },
- },
- });
-
- assert.equal(JSON.stringify(proxy), JSON.stringify({ content: 'hello' }));
- }
-
- ['@test getting proxied properties with [] should be an error'](assert) {
- if (DEBUG) {
- let proxy = ObjectProxy.create({
- content: {
- foo: 'FOO',
- },
- });
-
- expectAssertion(() => proxy.foo, /\.get\('foo'\)/);
- } else {
- assert.expect(0);
- }
- }
-
- async ['@test should work with watched properties'](assert) {
- let content1 = { firstName: 'Tom', lastName: 'Dale' };
- let content2 = { firstName: 'Yehuda', lastName: 'Katz' };
- let count = 0;
- let last;
-
- let Proxy = class extends ObjectProxy {
- @computed('firstName', 'lastName')
- get fullName() {
- let firstName = this.get('firstName');
- let lastName = this.get('lastName');
-
- if (firstName && lastName) {
- return firstName + ' ' + lastName;
- }
- return firstName || lastName;
- }
- };
-
- let proxy = Proxy.create();
-
- addObserver(proxy, 'fullName', () => {
- last = get(proxy, 'fullName');
- });
-
- // We need separate observers for each property for async observers
- addObserver(proxy, 'firstName', function () {
- count++;
- });
-
- addObserver(proxy, 'lastName', function () {
- count++;
- });
-
- // proxy without content returns undefined
- assert.equal(get(proxy, 'fullName'), undefined);
-
- // setting content causes all watched properties to change
- set(proxy, 'content', content1);
- await runLoopSettled();
-
- // both dependent keys changed
- assert.equal(count, 2);
- assert.equal(last, 'Tom Dale');
-
- // setting property in content causes proxy property to change
- set(content1, 'lastName', 'Huda');
- await runLoopSettled();
-
- assert.equal(count, 3);
- assert.equal(last, 'Tom Huda');
-
- // replacing content causes all watched properties to change
- set(proxy, 'content', content2);
- await runLoopSettled();
-
- // both dependent keys changed
- assert.equal(count, 5);
- assert.equal(last, 'Yehuda Katz');
-
- // setting property in new content
- set(content2, 'firstName', 'Tomhuda');
- await runLoopSettled();
-
- assert.equal(last, 'Tomhuda Katz');
- assert.equal(count, 6);
-
- // setting property in proxy syncs with new content
- set(proxy, 'lastName', 'Katzdale');
- await runLoopSettled();
-
- assert.equal(count, 7);
- assert.equal(last, 'Tomhuda Katzdale');
- assert.equal(get(content2, 'firstName'), 'Tomhuda');
- assert.equal(get(content2, 'lastName'), 'Katzdale');
-
- proxy.destroy();
- }
-
- async ['@test set and get should work with paths'](assert) {
- let content = { foo: { bar: 'baz' } };
- let proxy = ObjectProxy.create({ content });
- let count = 0;
-
- proxy.set('foo.bar', 'hello');
- assert.equal(proxy.get('foo.bar'), 'hello');
- assert.equal(proxy.get('content.foo.bar'), 'hello');
-
- proxy.addObserver('foo.bar', function () {
- count++;
- });
-
- proxy.set('foo.bar', 'bye');
- await runLoopSettled();
-
- assert.equal(count, 1);
- assert.equal(proxy.get('foo.bar'), 'bye');
- assert.equal(proxy.get('content.foo.bar'), 'bye');
-
- proxy.destroy();
- }
-
- async ['@test should transition between watched and unwatched strategies'](assert) {
- let content = { foo: 'foo' };
- let proxy = ObjectProxy.create({ content: content });
- let count = 0;
-
- function observer() {
- count++;
- }
-
- assert.equal(get(proxy, 'foo'), 'foo');
-
- set(content, 'foo', 'bar');
-
- assert.equal(get(proxy, 'foo'), 'bar');
-
- set(proxy, 'foo', 'foo');
-
- assert.equal(get(content, 'foo'), 'foo');
- assert.equal(get(proxy, 'foo'), 'foo');
-
- addObserver(proxy, 'foo', observer);
-
- assert.equal(count, 0);
- assert.equal(get(proxy, 'foo'), 'foo');
-
- set(content, 'foo', 'bar');
- await runLoopSettled();
-
- assert.equal(count, 1);
- assert.equal(get(proxy, 'foo'), 'bar');
-
- set(proxy, 'foo', 'foo');
- await runLoopSettled();
-
- assert.equal(count, 2);
- assert.equal(get(content, 'foo'), 'foo');
- assert.equal(get(proxy, 'foo'), 'foo');
-
- removeObserver(proxy, 'foo', observer);
-
- set(content, 'foo', 'bar');
-
- assert.equal(get(proxy, 'foo'), 'bar');
-
- set(proxy, 'foo', 'foo');
-
- assert.equal(get(content, 'foo'), 'foo');
- assert.equal(get(proxy, 'foo'), 'foo');
- }
-
- ['@test setting `undefined` to a proxied content property should override its existing value'](
- assert
- ) {
- let proxyObject = ObjectProxy.create({
- content: {
- prop: 'emberjs',
- },
- });
- set(proxyObject, 'prop', undefined);
- assert.equal(
- get(proxyObject, 'prop'),
- undefined,
- 'sets the `undefined` value to the proxied content'
- );
- }
-
- ['@test should not throw or deprecate when adding an observer to an ObjectProxy based class'](
- assert
- ) {
- assert.expect(0);
-
- let obj = ObjectProxy.extend({
- observe: observer('foo', function () {}),
- }).create();
-
- obj.destroy();
- }
-
- async '@test custom proxies should be able to notify property changes manually'(assert) {
- let proxy = class extends ObjectProxy {
- locals = { foo: 123 };
-
- unknownProperty(key) {
- return this.locals[key];
- }
-
- setUnknownProperty(key, value) {
- this.locals[key] = value;
- this.notifyPropertyChange(key);
- }
- }.create();
-
- let count = 0;
-
- proxy.addObserver('foo', function () {
- count++;
- });
-
- proxy.set('foo', 456);
- await runLoopSettled();
-
- assert.equal(count, 1);
- assert.equal(proxy.get('foo'), 456);
- assert.equal(proxy.get('locals.foo'), 456);
-
- proxy.destroy();
- }
- }
-);
diff --git a/packages/@ember/-internals/utils/index.ts b/packages/@ember/-internals/utils/index.ts
index 329a6f7e793..54ad627b32c 100644
--- a/packages/@ember/-internals/utils/index.ts
+++ b/packages/@ember/-internals/utils/index.ts
@@ -26,7 +26,6 @@ export { canInvoke } from './lib/invoke';
export { getName, setName } from './lib/name';
export { default as toString } from './lib/to-string';
export { isObject } from './lib/spec';
-export { isProxy, setProxy } from './lib/is_proxy';
export { default as Cache } from './lib/cache';
export {
setupMandatorySetter,
diff --git a/packages/@ember/-internals/utils/lib/is_proxy.ts b/packages/@ember/-internals/utils/lib/is_proxy.ts
deleted file mode 100644
index 443e4c805b0..00000000000
--- a/packages/@ember/-internals/utils/lib/is_proxy.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import type ProxyMixin from '@ember/-internals/runtime/lib/mixins/-proxy';
-import { isObject } from './spec';
-
-const PROXIES = new WeakSet();
-
-export function isProxy(value: unknown): value is ProxyMixin {
- if (isObject(value)) {
- return PROXIES.has(value);
- }
- return false;
-}
-
-export function setProxy(object: ProxyMixin): void {
- if (isObject(object)) {
- PROXIES.add(object);
- }
-}
diff --git a/packages/@ember/-internals/utils/tests/is_proxy_test.js b/packages/@ember/-internals/utils/tests/is_proxy_test.js
deleted file mode 100644
index b367b418ec3..00000000000
--- a/packages/@ember/-internals/utils/tests/is_proxy_test.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import { isProxy, setProxy } from '..';
-import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-
-moduleFor(
- '@ember/-internals/utils isProxy',
- class extends AbstractTestCase {
- ['@test basic'](assert) {
- let proxy = {};
- setProxy(proxy);
-
- assert.equal(isProxy(proxy), true);
-
- assert.equal(isProxy({}), false);
- assert.equal(isProxy(undefined), false);
- assert.equal(isProxy(null), false);
- }
- }
-);
diff --git a/packages/@ember/array/index.ts b/packages/@ember/array/index.ts
index 80e6acda66a..c15161ec9cb 100644
--- a/packages/@ember/array/index.ts
+++ b/packages/@ember/array/index.ts
@@ -21,6 +21,7 @@ import Observable from '@ember/object/observable';
import type { MethodNamesOf, MethodParams, MethodReturns } from '@ember/-internals/utility-types';
import type { ComputedPropertyCallback } from '@ember/-internals/metal';
import { isEmberArray, setEmberArray } from '@ember/array/-internals';
+import { destroyObservers } from '@ember/-internals/metal/lib/observer';
export { default as makeArray } from './make';
@@ -150,11 +151,9 @@ function insertAt(array: MutableArray, index: number, item: T) {
```javascript
import { isArray } from '@ember/array';
- import ArrayProxy from '@ember/array/proxy';
isArray(); // false
isArray([]); // true
- isArray(ArrayProxy.create({ content: [] })); // true
```
@method isArray
@@ -220,11 +219,6 @@ function mapBy(this: EmberArray, key: string) {
concrete implementation, but it can be used up by other classes that want
to appear like arrays.
- For example, ArrayProxy is a concrete class that can be instantiated to
- implement array-like behavior. This class uses the Array Mixin by way of
- the MutableArray mixin, which allows observable changes to be made to the
- underlying array.
-
This mixin defines methods specifically for collections that provide
index-ordered access to their contents. When you are designing code that
needs to accept any kind of Array-like object, you should use these methods
@@ -1463,7 +1457,6 @@ const EmberArray = Mixin.create(Enumerable, {
This mixin defines the API for modifying array-like objects. These methods
can be applied only to a collection that keeps its items in an ordered set.
It builds upon the Array mixin and adds methods to modify the array.
- One concrete implementations of this class include ArrayProxy.
It is important to use the methods in this class to modify arrays so that
changes are observable. This allows the binding system in Ember to function
@@ -1853,6 +1846,10 @@ const MutableArray = Mixin.create(EmberArray, MutableEnumerable, {
endPropertyChanges();
return this;
},
+
+ destroy() {
+ destroyObservers(this);
+ },
});
/**
diff --git a/packages/@ember/array/lib/make-array.ts b/packages/@ember/array/lib/make-array.ts
index 12f628eed78..b4c1093fa51 100644
--- a/packages/@ember/array/lib/make-array.ts
+++ b/packages/@ember/array/lib/make-array.ts
@@ -9,17 +9,12 @@ const { isArray } = Array;
```javascript
import { makeArray } from '@ember/array';
- import ArrayProxy from '@ember/array/proxy';
makeArray(); // []
makeArray(null); // []
makeArray(undefined); // []
makeArray('lindsay'); // ['lindsay']
makeArray([1, 2, 42]); // [1, 2, 42]
-
- let proxy = ArrayProxy.create({ content: [] });
-
- makeArray(proxy) === proxy; // false
```
@method makeArray
diff --git a/packages/@ember/array/package.json b/packages/@ember/array/package.json
index 49adb707a77..40ae1570bf6 100644
--- a/packages/@ember/array/package.json
+++ b/packages/@ember/array/package.json
@@ -5,7 +5,6 @@
"exports": {
".": "./index.ts",
"./-internals": "./-internals.ts",
- "./proxy": "./proxy.ts",
"./make": "./make.ts",
"./mutable": "./mutable.ts"
},
diff --git a/packages/@ember/array/proxy.ts b/packages/@ember/array/proxy.ts
deleted file mode 100644
index ff72f1990ac..00000000000
--- a/packages/@ember/array/proxy.ts
+++ /dev/null
@@ -1,414 +0,0 @@
-/**
-@module @ember/array/proxy
-*/
-
-import {
- objectAt,
- alias,
- PROPERTY_DID_CHANGE,
- addArrayObserver,
- removeArrayObserver,
- replace,
- arrayContentDidChange,
- arrayContentWillChange,
- tagForProperty,
-} from '@ember/-internals/metal';
-import { get } from '@ember/object';
-import type { PropertyDidChange } from '@ember/-internals/metal';
-import { isObject } from '@ember/-internals/utils';
-import EmberObject from '@ember/object';
-import EmberArray, { type NativeArray } from '@ember/array';
-import MutableArray from '@ember/array/mutable';
-import { assert } from '@ember/debug';
-import { setCustomTagFor } from '@glimmer/manager';
-import {
- combine,
- consumeTag,
- validateTag,
- valueForTag,
- tagFor,
- type Tag,
- type Revision,
-} from '@glimmer/validator';
-
-function isMutable(obj: T[] | EmberArray): obj is T[] | MutableArray {
- return Array.isArray(obj) || typeof (obj as MutableArray).replace === 'function';
-}
-
-const ARRAY_OBSERVER_MAPPING = {
- willChange: '_arrangedContentArrayWillChange',
- didChange: '_arrangedContentArrayDidChange',
-};
-
-function customTagForArrayProxy(proxy: object, key: string) {
- assert('[BUG] Expected a proxy', proxy instanceof ArrayProxy);
-
- if (key === '[]') {
- proxy._revalidate();
-
- return proxy._arrTag!;
- } else if (key === 'length') {
- proxy._revalidate();
-
- return proxy._lengthTag!;
- }
-
- return tagFor(proxy, key);
-}
-
-/**
- An ArrayProxy wraps any other object that implements `Array` and/or
- `MutableArray,` forwarding all requests. This makes it very useful for
- a number of binding use cases or other cases where being able to swap
- out the underlying array is useful.
-
- A simple example of usage:
-
- ```javascript
- import { A } from '@ember/array';
- import ArrayProxy from '@ember/array/proxy';
-
- let pets = ['dog', 'cat', 'fish'];
- let ap = ArrayProxy.create({ content: A(pets) });
-
- ap.get('firstObject'); // 'dog'
- ap.set('content', ['amoeba', 'paramecium']);
- ap.get('firstObject'); // 'amoeba'
- ```
-
- This class can also be useful as a layer to transform the contents of
- an array, as they are accessed. This can be done by overriding
- `objectAtContent`:
-
- ```javascript
- import { A } from '@ember/array';
- import ArrayProxy from '@ember/array/proxy';
-
- let pets = ['dog', 'cat', 'fish'];
- let ap = ArrayProxy.create({
- content: A(pets),
- objectAtContent: function(idx) {
- return this.get('content').objectAt(idx).toUpperCase();
- }
- });
-
- ap.get('firstObject'); // . 'DOG'
- ```
-
- When overriding this class, it is important to place the call to
- `_super` *after* setting `content` so the internal observers have
- a chance to fire properly:
-
- ```javascript
- import { A } from '@ember/array';
- import ArrayProxy from '@ember/array/proxy';
-
- export default ArrayProxy.extend({
- init() {
- this.set('content', A(['dog', 'cat', 'fish']));
- this._super(...arguments);
- }
- });
- ```
-
- @class ArrayProxy
- @extends EmberObject
- @uses MutableArray
- @public
-*/
-interface ArrayProxy extends MutableArray {
- /**
- The content array. Must be an object that implements `Array` and/or
- `MutableArray.`
-
- @property content
- @type EmberArray
- @public
- */
- content: T[] | EmberArray | NativeArray | null;
- /**
- The array that the proxy pretends to be. In the default `ArrayProxy`
- implementation, this and `content` are the same. Subclasses of `ArrayProxy`
- can override this property to provide things like sorting and filtering.
-
- @property arrangedContent
- @public
- */
- arrangedContent: EmberArray | null;
- /**
- Should actually retrieve the object at the specified index from the
- content. You can override this method in subclasses to transform the
- content item to something new.
-
- This method will only be called if content is non-`null`.
-
- @method objectAtContent
- @param {Number} idx The index to retrieve.
- @return {Object} the value or undefined if none found
- @public
- */
- objectAtContent(idx: number): T | undefined;
- /**
- Should actually replace the specified objects on the content array.
- You can override this method in subclasses to transform the content item
- into something new.
-
- This method will only be called if content is non-`null`.
-
- @method replaceContent
- @param {Number} idx The starting index
- @param {Number} amt The number of items to remove from the content.
- @param {Array} objects Optional array of objects to insert.
- @return {void}
- @public
- */
- replaceContent(idx: number, amt: number, objects?: T[]): void;
-
- create(init: { content: Array }): ArrayProxy;
-}
-class ArrayProxy extends EmberObject implements PropertyDidChange {
- /*
- `this._objectsDirtyIndex` determines which indexes in the `this._objects`
- cache are dirty.
-
- If `this._objectsDirtyIndex === -1` then no indexes are dirty.
- Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.
-
- Calling `objectAt` with a dirty index will cause the `this._objects`
- cache to be recomputed.
- */
- /** @internal */
- _objectsDirtyIndex = 0;
- /** @internal */
- _objects: null | T[] = null;
-
- /** @internal */
- _lengthDirty = true;
- /** @internal */
- _length = 0;
-
- /** @internal */
- _arrangedContent: EmberArray | null = null;
- /** @internal */
- _arrangedContentIsUpdating = false;
- /** @internal */
- _arrangedContentTag: Tag | null = null;
- /** @internal */
- _arrangedContentRevision: Revision | null = null;
- /** @internal */
- _lengthTag: Tag | null = null;
- /** @internal */
- _arrTag: Tag | null = null;
-
- init(props: object | undefined) {
- super.init(props);
-
- setCustomTagFor(this, customTagForArrayProxy);
- }
-
- [PROPERTY_DID_CHANGE]() {
- this._revalidate();
- }
-
- willDestroy() {
- this._removeArrangedContentArrayObserver();
- }
-
- declare content: T[] | EmberArray | NativeArray | null;
-
- declare arrangedContent: EmberArray | null;
-
- objectAtContent(idx: number) {
- let arrangedContent = get(this, 'arrangedContent');
- assert('[BUG] Called objectAtContent without content', arrangedContent);
- return objectAt(arrangedContent, idx);
- }
-
- // See additional docs for `replace` from `MutableArray`:
- // https://api.emberjs.com/ember/release/classes/MutableArray/methods/replace?anchor=replace
- replace(idx: number, amt: number, objects?: T[]) {
- assert(
- 'Mutating an arranged ArrayProxy is not allowed',
- get(this, 'arrangedContent') === get(this, 'content')
- );
- this.replaceContent(idx, amt, objects);
- }
-
- replaceContent(idx: number, amt: number, objects?: T[]) {
- let content = get(this, 'content');
- assert('[BUG] Called replaceContent without content', content);
- assert('Mutating a non-mutable array is not allowed', isMutable(content));
- replace(content, idx, amt, objects);
- }
-
- // Overriding objectAt is not supported.
- objectAt(idx: number) {
- this._revalidate();
-
- if (this._objects === null) {
- this._objects = [];
- }
-
- if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {
- let arrangedContent = get(this, 'arrangedContent');
- if (arrangedContent) {
- let length = (this._objects.length = get(arrangedContent, 'length'));
-
- for (let i = this._objectsDirtyIndex; i < length; i++) {
- // SAFETY: This is expected to only ever return an instance of T. In other words, there should
- // be no gaps in the array. Unfortunately, we can't actually assert for it since T could include
- // any types, including null or undefined.
- this._objects[i] = this.objectAtContent(i)!;
- }
- } else {
- this._objects.length = 0;
- }
- this._objectsDirtyIndex = -1;
- }
-
- return this._objects[idx];
- }
-
- // Overriding length is not supported.
- get length() {
- this._revalidate();
-
- if (this._lengthDirty) {
- let arrangedContent = get(this, 'arrangedContent');
- this._length = arrangedContent ? get(arrangedContent, 'length') : 0;
- this._lengthDirty = false;
- }
-
- assert('[BUG] _lengthTag is not set', this._lengthTag);
- consumeTag(this._lengthTag);
-
- return this._length;
- }
-
- set length(value) {
- let length = this.length;
- let removedCount = length - value;
- let added: T[] | undefined;
-
- if (removedCount === 0) {
- return;
- } else if (removedCount < 0) {
- added = new Array(-removedCount);
- removedCount = 0;
- }
-
- let content = get(this, 'content');
- if (content) {
- assert('Mutating a non-mutable array is not allowed', isMutable(content));
- replace(content, value, removedCount, added);
-
- this._invalidate();
- }
- }
-
- _updateArrangedContentArray(arrangedContent: EmberArray | null) {
- let oldLength = this._objects === null ? 0 : this._objects.length;
- let newLength = arrangedContent ? get(arrangedContent, 'length') : 0;
-
- this._removeArrangedContentArrayObserver();
- arrayContentWillChange(this, 0, oldLength, newLength);
-
- this._invalidate();
-
- arrayContentDidChange(this, 0, oldLength, newLength, false);
- this._addArrangedContentArrayObserver(arrangedContent);
- }
-
- _addArrangedContentArrayObserver(arrangedContent: EmberArray | null) {
- if (arrangedContent && !(arrangedContent as any).isDestroyed) {
- assert("Can't set ArrayProxy's content to itself", arrangedContent !== this);
- assert(
- `ArrayProxy expects a native Array, EmberArray, or ArrayProxy, but you passed ${typeof arrangedContent}`,
- (function (arr: unknown): arr is EmberArray {
- return Array.isArray(arr) || EmberArray.detect(arr);
- })(arrangedContent)
- );
- assert(
- 'ArrayProxy expected its contents to not be destroyed',
- !(arrangedContent as any).isDestroyed
- );
-
- addArrayObserver(arrangedContent, this, ARRAY_OBSERVER_MAPPING);
-
- this._arrangedContent = arrangedContent;
- }
- }
-
- _removeArrangedContentArrayObserver() {
- if (this._arrangedContent) {
- removeArrayObserver(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);
- }
- }
-
- _arrangedContentArrayWillChange() {}
-
- _arrangedContentArrayDidChange(
- _proxy: unknown,
- idx: number,
- removedCnt: number,
- addedCnt: number
- ) {
- arrayContentWillChange(this, idx, removedCnt, addedCnt);
-
- let dirtyIndex = idx;
- if (dirtyIndex < 0) {
- let length = get(this._arrangedContent!, 'length');
- dirtyIndex += length + removedCnt - addedCnt;
- }
-
- if (this._objectsDirtyIndex === -1 || this._objectsDirtyIndex > dirtyIndex) {
- this._objectsDirtyIndex = dirtyIndex;
- }
-
- this._lengthDirty = true;
-
- arrayContentDidChange(this, idx, removedCnt, addedCnt, false);
- }
-
- _invalidate() {
- this._objectsDirtyIndex = 0;
- this._lengthDirty = true;
- }
-
- _revalidate() {
- if (this._arrangedContentIsUpdating === true) return;
-
- if (
- this._arrangedContentTag === null ||
- !validateTag(this._arrangedContentTag, this._arrangedContentRevision!)
- ) {
- let arrangedContent = this.get('arrangedContent');
-
- if (this._arrangedContentTag === null) {
- // This is the first time the proxy has been setup, only add the observer
- // don't trigger any events
- this._addArrangedContentArrayObserver(arrangedContent);
- } else {
- this._arrangedContentIsUpdating = true;
- this._updateArrangedContentArray(arrangedContent);
- this._arrangedContentIsUpdating = false;
- }
-
- let arrangedContentTag = (this._arrangedContentTag = tagFor(this, 'arrangedContent'));
- this._arrangedContentRevision = valueForTag(this._arrangedContentTag);
-
- if (isObject(arrangedContent)) {
- this._lengthTag = combine([arrangedContentTag, tagForProperty(arrangedContent, 'length')]);
- this._arrTag = combine([arrangedContentTag, tagForProperty(arrangedContent, '[]')]);
- } else {
- this._lengthTag = this._arrTag = arrangedContentTag;
- }
- }
- }
-}
-
-ArrayProxy.reopen(MutableArray, {
- arrangedContent: alias('content'),
-});
-
-export default ArrayProxy;
diff --git a/packages/@ember/array/type-tests/proxy.test.ts b/packages/@ember/array/type-tests/proxy.test.ts
deleted file mode 100644
index e10b7d22582..00000000000
--- a/packages/@ember/array/type-tests/proxy.test.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import type EmberArray from '@ember/array';
-import { A, NativeArray } from '@ember/array';
-import ArrayProxy from '@ember/array/proxy';
-import type MutableArray from '@ember/array/mutable';
-
-import { expectTypeOf } from 'expect-type';
-
-class Foo {}
-
-let foo = new Foo();
-
-let content = A([foo]);
-
-// We can't infer the correct type through `create`;
-let proxy = ArrayProxy.create({ content }) as ArrayProxy;
-
-expectTypeOf(proxy).toMatchTypeOf>();
-expectTypeOf(proxy).toMatchTypeOf>();
-
-expectTypeOf(proxy.content).toEqualTypeOf | NativeArray | null>();
-expectTypeOf(proxy.arrangedContent).toEqualTypeOf | null>();
diff --git a/packages/@ember/enumerable/tests/enumerable_test.js b/packages/@ember/enumerable/tests/enumerable_test.js
index caf4e226f29..67fb4eccfd7 100644
--- a/packages/@ember/enumerable/tests/enumerable_test.js
+++ b/packages/@ember/enumerable/tests/enumerable_test.js
@@ -1,5 +1,4 @@
import Enumerable from '@ember/enumerable';
-import ArrayProxy from '@ember/array/proxy';
import { A } from '@ember/array';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
@@ -9,9 +8,5 @@ moduleFor(
['@test should be mixed into A()'](assert) {
assert.ok(Enumerable.detect(A()));
}
-
- ['@test should be mixed into ArrayProxy'](assert) {
- assert.ok(Enumerable.detect(ArrayProxy.create()));
- }
}
);
diff --git a/packages/@ember/object/package.json b/packages/@ember/object/package.json
index 8530e0ad184..188478c3d89 100644
--- a/packages/@ember/object/package.json
+++ b/packages/@ember/object/package.json
@@ -13,8 +13,6 @@
"./events": "./events.ts",
"./computed": "./computed.ts",
"./compat": "./compat.ts",
- "./proxy": "./proxy.ts",
- "./promise-proxy-mixin": "./promise-proxy-mixin",
"./observers": "./observers.ts"
},
"dependencies": {
diff --git a/packages/@ember/object/promise-proxy-mixin.ts b/packages/@ember/object/promise-proxy-mixin.ts
deleted file mode 100644
index eafe2a9522d..00000000000
--- a/packages/@ember/object/promise-proxy-mixin.ts
+++ /dev/null
@@ -1,255 +0,0 @@
-import { get, setProperties, computed } from '@ember/object';
-import Mixin from '@ember/object/mixin';
-import type { AnyFn, MethodNamesOf } from '@ember/-internals/utility-types';
-import type RSVP from 'rsvp';
-import type CoreObject from '@ember/object/core';
-
-/**
- @module @ember/object/promise-proxy-mixin
-*/
-
-function tap(proxy: PromiseProxyMixin, promise: RSVP.Promise) {
- setProperties(proxy, {
- isFulfilled: false,
- isRejected: false,
- });
-
- return promise.then(
- (value) => {
- if (
- !(proxy as unknown as CoreObject).isDestroyed &&
- !(proxy as unknown as CoreObject).isDestroying
- ) {
- setProperties(proxy, {
- content: value,
- isFulfilled: true,
- });
- }
- return value;
- },
- (reason) => {
- if (
- !(proxy as unknown as CoreObject).isDestroyed &&
- !(proxy as unknown as CoreObject).isDestroying
- ) {
- setProperties(proxy, {
- reason,
- isRejected: true,
- });
- }
- throw reason;
- },
- 'Ember: PromiseProxy'
- );
-}
-
-/**
- A low level mixin making ObjectProxy promise-aware.
-
- ```javascript
- import { resolve } from 'rsvp';
- import $ from 'jquery';
- import ObjectProxy from '@ember/object/proxy';
- import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
-
- let ObjectPromiseProxy = ObjectProxy.extend(PromiseProxyMixin);
-
- let proxy = ObjectPromiseProxy.create({
- promise: resolve($.getJSON('/some/remote/data.json'))
- });
-
- proxy.then(function(json){
- // the json
- }, function(reason) {
- // the reason why you have no json
- });
- ```
-
- the proxy has bindable attributes which
- track the promises life cycle
-
- ```javascript
- proxy.get('isPending') //=> true
- proxy.get('isSettled') //=> false
- proxy.get('isRejected') //=> false
- proxy.get('isFulfilled') //=> false
- ```
-
- When the $.getJSON completes, and the promise is fulfilled
- with json, the life cycle attributes will update accordingly.
- Note that $.getJSON doesn't return an ECMA specified promise,
- it is useful to wrap this with an `RSVP.resolve` so that it behaves
- as a spec compliant promise.
-
- ```javascript
- proxy.get('isPending') //=> false
- proxy.get('isSettled') //=> true
- proxy.get('isRejected') //=> false
- proxy.get('isFulfilled') //=> true
- ```
-
- As the proxy is an ObjectProxy, and the json now its content,
- all the json properties will be available directly from the proxy.
-
- ```javascript
- // Assuming the following json:
- {
- firstName: 'Stefan',
- lastName: 'Penner'
- }
-
- // both properties will accessible on the proxy
- proxy.get('firstName') //=> 'Stefan'
- proxy.get('lastName') //=> 'Penner'
- ```
-
- @class PromiseProxyMixin
- @public
-*/
-interface PromiseProxyMixin {
- /**
- If the proxied promise is rejected this will contain the reason
- provided.
-
- @property reason
- @default null
- @public
- */
- reason: unknown;
-
- /**
- Once the proxied promise has settled this will become `false`.
-
- @property isPending
- @default true
- @public
- */
- readonly isPending: boolean;
- /**
- Once the proxied promise has settled this will become `true`.
-
- @property isSettled
- @default false
- @public
- */
- readonly isSettled: boolean;
-
- /**
- Will become `true` if the proxied promise is rejected.
-
- @property isRejected
- @default false
- @public
- */
- isRejected: boolean;
- /**
- Will become `true` if the proxied promise is fulfilled.
-
- @property isFulfilled
- @default false
- @public
- */
- isFulfilled: boolean;
-
- /**
- The promise whose fulfillment value is being proxied by this object.
-
- This property must be specified upon creation, and should not be
- changed once created.
-
- Example:
-
- ```javascript
- import ObjectProxy from '@ember/object/proxy';
- import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
-
- ObjectProxy.extend(PromiseProxyMixin).create({
- promise:
- });
- ```
-
- @property promise
- @public
- */
- promise: Promise;
-
- /**
- An alias to the proxied promise's `then`.
-
- See RSVP.Promise.then.
-
- @method then
- @param {Function} callback
- @return {RSVP.Promise}
- @public
- */
- then: this['promise']['then'];
- /**
- An alias to the proxied promise's `catch`.
-
- See RSVP.Promise.catch.
-
- @method catch
- @param {Function} callback
- @return {RSVP.Promise}
- @since 1.3.0
- @public
- */
- catch: this['promise']['catch'];
- /**
- An alias to the proxied promise's `finally`.
-
- See RSVP.Promise.finally.
-
- @method finally
- @param {Function} callback
- @return {RSVP.Promise}
- @since 1.3.0
- @public
- */
- finally: this['promise']['finally'];
-}
-const PromiseProxyMixin = Mixin.create({
- reason: null,
-
- isPending: computed('isSettled', function () {
- return !get(this, 'isSettled');
- }).readOnly(),
-
- isSettled: computed('isRejected', 'isFulfilled', function () {
- return get(this, 'isRejected') || get(this, 'isFulfilled');
- }).readOnly(),
-
- isRejected: false,
-
- isFulfilled: false,
-
- promise: computed({
- get() {
- throw new Error("PromiseProxy's promise must be set");
- },
- set(_key, promise: RSVP.Promise) {
- return tap(this, promise);
- },
- }),
-
- then: promiseAlias('then'),
-
- catch: promiseAlias('catch'),
-
- finally: promiseAlias('finally'),
-});
-
-function promiseAlias>>(name: N) {
- return function (this: PromiseProxyMixin, ...args: Parameters[N]>) {
- let promise = get(this, 'promise');
-
- // We need this cast because `Parameters` is deferred so that it is not
- // possible for TS to see it will always produce the right type. However,
- // since `AnyFn` has a rest type, it is allowed. See discussion on [this
- // issue](https://github.com/microsoft/TypeScript/issues/47615).
- return (promise[name] as AnyFn)(...args);
- };
-}
-
-export default PromiseProxyMixin;
diff --git a/packages/@ember/object/proxy.ts b/packages/@ember/object/proxy.ts
deleted file mode 100644
index 57b162b8924..00000000000
--- a/packages/@ember/object/proxy.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-/**
-@module @ember/object/proxy
-*/
-
-import { FrameworkObject } from '@ember/object/-internals';
-import { _ProxyMixin } from '@ember/-internals/runtime';
-
-/**
- `ObjectProxy` forwards all properties not defined by the proxy itself
- to a proxied `content` object.
-
- ```javascript
- import EmberObject from '@ember/object';
- import ObjectProxy from '@ember/object/proxy';
-
- let exampleObject = EmberObject.create({
- name: 'Foo'
- });
-
- let exampleProxy = ObjectProxy.create({
- content: exampleObject
- });
-
- // Access and change existing properties
- exampleProxy.get('name'); // 'Foo'
- exampleProxy.set('name', 'Bar');
- exampleObject.get('name'); // 'Bar'
-
- // Create new 'description' property on `exampleObject`
- exampleProxy.set('description', 'Foo is a whizboo baz');
- exampleObject.get('description'); // 'Foo is a whizboo baz'
- ```
-
- While `content` is unset, setting a property to be delegated will throw an
- Error.
-
- ```javascript
- import ObjectProxy from '@ember/object/proxy';
-
- let exampleProxy = ObjectProxy.create({
- content: null,
- flag: null
- });
- exampleProxy.set('flag', true);
- exampleProxy.get('flag'); // true
- exampleProxy.get('foo'); // undefined
- exampleProxy.set('foo', 'data'); // throws Error
- ```
-
- Delegated properties can be bound to and will change when content is updated.
-
- Computed properties on the proxy itself can depend on delegated properties.
-
- ```javascript
- import { computed } from '@ember/object';
- import ObjectProxy from '@ember/object/proxy';
-
- class ProxyWithComputedProperty extends ObjectProxy {
- @computed('firstName', 'lastName')
- get fullName() {
- var firstName = this.get('firstName'),
- lastName = this.get('lastName');
- if (firstName && lastName) {
- return firstName + ' ' + lastName;
- }
- return firstName || lastName;
- }
- }
-
- let exampleProxy = ProxyWithComputedProperty.create();
-
- exampleProxy.get('fullName'); // undefined
- exampleProxy.set('content', {
- firstName: 'Tom', lastName: 'Dale'
- }); // triggers property change for fullName on proxy
-
- exampleProxy.get('fullName'); // 'Tom Dale'
- ```
-
- @class ObjectProxy
- @extends EmberObject
- @uses Ember.ProxyMixin
- @public
-*/
-interface ObjectProxy extends _ProxyMixin {
- // Proxies forward to their content. This behavior *actually* comes from the
- // ProxyMixin type itself, via its `unknownProperty` implementation, but if we
- // try to apply it there, `ObjectProxy` does not correctly extend both the
- // `EmberObject` and `ProxyMixin` types. Instead, we apply it here, and that
- // gives us the desired behavior for this which actually *use* `ObjectProxy`.
- get(keyName: K): Content[K];
- get(keyname: K): this[K];
- get(keyName: string): unknown;
-
- set(keyName: K, value: Content[K]): Content[K];
- set(keyName: K, value: this[K]): this[K];
- set(keyName: string): unknown;
-
- // These types for `getProperties` and `setProperties` properly merge the
- // Content and `this` type for the proxy so callers actually get the safe
- // result.
- getProperties(
- list: K[]
- ): Pick> & Pick>;
- getProperties(
- ...list: K[]
- ): Pick> & Pick>;
- getProperties(list: K[]): Record;
- getProperties(...list: K[]): Record;
-
- setProperties<
- K extends keyof Content | keyof this,
- Hash extends Partial<
- Pick> & Pick>
- >,
- >(
- hash: Hash
- ): Hash;
- setProperties>(hash: T): T;
-}
-
-// eslint-disable-next-line @typescript-eslint/no-unused-vars
-class ObjectProxy extends FrameworkObject {}
-ObjectProxy.PrototypeMixin.reopen(_ProxyMixin);
-
-export default ObjectProxy;
diff --git a/packages/@ember/object/tests/computed/reduce_computed_macros_test.js b/packages/@ember/object/tests/computed/reduce_computed_macros_test.js
index 0a64fa17130..efe74957ec1 100644
--- a/packages/@ember/object/tests/computed/reduce_computed_macros_test.js
+++ b/packages/@ember/object/tests/computed/reduce_computed_macros_test.js
@@ -8,7 +8,6 @@ import EmberObject, {
computed,
observer,
} from '@ember/object';
-import ObjectProxy from '@ember/object/proxy';
import { isArray, A as emberA, removeAt } from '@ember/array';
import {
sum,
@@ -1168,44 +1167,6 @@ class SortWithSortPropertiesTestCase extends AbstractTestCase {
);
}
- ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](
- assert
- ) {
- let tyrion = {
- fname: 'Tyrion',
- lname: 'Lannister',
- };
-
- let tyrionInDisguise = ObjectProxy.create({
- fname: 'Yollo',
- lname: '',
- content: tyrion,
- });
-
- let items = this.obj.items;
-
- items.pushObject(tyrion);
-
- assert.deepEqual(this.obj.sortedItems.mapBy('fname'), [
- 'Cersei',
- 'Jaime',
- 'Tyrion',
- 'Bran',
- 'Robb',
- ]);
-
- items.pushObject(tyrionInDisguise);
-
- assert.deepEqual(this.obj.sortedItems.mapBy('fname'), [
- 'Yollo',
- 'Cersei',
- 'Jaime',
- 'Tyrion',
- 'Bran',
- 'Robb',
- ]);
- }
-
['@test updating sort properties detaches observers for old sort properties'](assert) {
let objectToRemove = this.obj.items[3];
@@ -1773,44 +1734,6 @@ moduleFor(
);
}
- ['@test guid sort-order fallback with a search proxy is not confused by non-search ObjectProxys'](
- assert
- ) {
- let tyrion = {
- fname: 'Tyrion',
- lname: 'Lannister',
- };
-
- let tyrionInDisguise = ObjectProxy.create({
- fname: 'Yollo',
- lname: '',
- content: tyrion,
- });
-
- let items = obj.get('items');
-
- items.pushObject(tyrion);
-
- assert.deepEqual(obj.get('sortedItems').mapBy('fname'), [
- 'Cersei',
- 'Jaime',
- 'Tyrion',
- 'Bran',
- 'Robb',
- ]);
-
- items.pushObject(tyrionInDisguise);
-
- assert.deepEqual(obj.get('sortedItems').mapBy('fname'), [
- 'Yollo',
- 'Cersei',
- 'Jaime',
- 'Tyrion',
- 'Bran',
- 'Robb',
- ]);
- }
-
['@test changing item properties specified via @each triggers a resort of the modified item'](
assert
) {
diff --git a/packages/@ember/routing/route.ts b/packages/@ember/routing/route.ts
index 8a0df029ac7..d3ba373508f 100644
--- a/packages/@ember/routing/route.ts
+++ b/packages/@ember/routing/route.ts
@@ -12,7 +12,7 @@ import EmberObject, { computed, get, set, getProperties, setProperties } from '@
import { A as emberA } from '@ember/array';
import { ActionHandler } from '@ember/-internals/runtime';
import { typeOf } from '@ember/utils';
-import { isProxy, lookupDescriptor } from '@ember/-internals/utils';
+import { lookupDescriptor } from '@ember/-internals/utils';
import type { AnyFn } from '@ember/-internals/utility-types';
import Controller from '@ember/controller';
import type { ControllerQueryParamType } from '@ember/controller';
@@ -344,8 +344,6 @@ class Route extends EmberObject.extend(ActionHandler) implement
object[name] = get(model, name);
} else if (/_id$/.test(name)) {
object[name] = get(model, 'id');
- } else if (isProxy(model)) {
- object[name] = get(model, name);
}
} else {
object = getProperties(model, params);
diff --git a/packages/@ember/routing/tests/system/route_test.js b/packages/@ember/routing/tests/system/route_test.js
index a4a20cf17a8..d0f4cc31175 100644
--- a/packages/@ember/routing/tests/system/route_test.js
+++ b/packages/@ember/routing/tests/system/route_test.js
@@ -2,7 +2,6 @@ import { setOwner } from '@ember/-internals/owner';
import { runDestroy, buildOwner, moduleFor, AbstractTestCase } from 'internal-test-helpers';
import Service, { service } from '@ember/service';
import EmberRoute from '@ember/routing/route';
-import ObjectProxy from '@ember/object/proxy';
import { getDebugFunction, setDebugFunction } from '@ember/debug';
let route, routeOne, routeTwo, lookupHash;
@@ -202,12 +201,6 @@ moduleFor(
assert.deepEqual(route.serialize(model, ['post_id']), { post_id: 3 }, 'serialized correctly');
}
- ['@test returns model.id if model is a Proxy'](assert) {
- let model = ObjectProxy.create({ content: { id: 3 } });
-
- assert.deepEqual(route.serialize(model, ['id']), { id: 3 }, 'serialized Proxy correctly');
- }
-
['@test returns undefined if model is not set'](assert) {
assert.equal(route.serialize(undefined, ['post_id']), undefined, 'serialized correctly');
}
diff --git a/packages/@ember/utils/tests/is_empty_test.js b/packages/@ember/utils/tests/is_empty_test.js
index d937a09fe0f..fc6c8106d71 100644
--- a/packages/@ember/utils/tests/is_empty_test.js
+++ b/packages/@ember/utils/tests/is_empty_test.js
@@ -1,6 +1,5 @@
import { isEmpty } from '..';
import { moduleFor, AbstractTestCase } from 'internal-test-helpers';
-import ObjectProxy from '@ember/object/proxy';
moduleFor(
'isEmpty',
@@ -9,7 +8,6 @@ moduleFor(
let string = 'string';
let fn = function () {};
let object = { length: 0 };
- let proxy = ObjectProxy.create({ content: { size: 0 } });
assert.equal(true, isEmpty(null), 'for null');
assert.equal(true, isEmpty(undefined), 'for undefined');
@@ -24,7 +22,6 @@ moduleFor(
assert.equal(true, isEmpty([]), 'for an empty Array');
assert.equal(false, isEmpty({}), 'for an empty Object');
assert.equal(true, isEmpty(object), "for an Object that has zero 'length'");
- assert.equal(true, isEmpty(proxy), "for a proxy that has zero 'size'");
}
}
);
diff --git a/packages/ember/barrel.ts b/packages/ember/barrel.ts
index 857a5d758fa..6774486294d 100644
--- a/packages/ember/barrel.ts
+++ b/packages/ember/barrel.ts
@@ -47,7 +47,6 @@ import {
import {
RegistryProxyMixin,
ContainerProxyMixin,
- _ProxyMixin as internalProxyMixin,
RSVP as _RSVP,
Comparable as InternalComparable,
ActionHandler as InternalActionHandler,
@@ -75,7 +74,6 @@ import EmberArray, {
makeArray as emberMakeArray,
} from '@ember/array';
import EmberMutableArray from '@ember/array/mutable';
-import EmberArrayProxy from '@ember/array/proxy';
import EmberApplication, {
getOwner as applicationGetOwner,
setOwner as applicationSetOwner,
@@ -97,8 +95,6 @@ import {
addObserver as emberAddObserver,
removeObserver as emberRemoveObserver,
} from '@ember/object/observers';
-import EmberObjectProxy from '@ember/object/proxy';
-import EmberPromiseProxyMixin from '@ember/object/promise-proxy-mixin';
import EmberHashLocation from '@ember/routing/hash-location';
import EmberHistoryLocation from '@ember/routing/history-location';
import EmberNoneLocation from '@ember/routing/none-location';
@@ -184,7 +180,6 @@ namespace Ember {
// ****@ember/-internals/runtime****
export const _ContainerProxyMixin = ContainerProxyMixin;
- export const _ProxyMixin = internalProxyMixin;
export const _RegistryProxyMixin = RegistryProxyMixin;
export const ActionHandler = InternalActionHandler;
export type ActionHandler = InternalActionHandler;
@@ -233,10 +228,6 @@ namespace Ember {
export const MutableArray = EmberMutableArray;
export type MutableArray = EmberMutableArray;
- // ****@ember/array/proxy****
- export const ArrayProxy = EmberArrayProxy;
- export type ArrayProxy = EmberArrayProxy;
-
// ****@ember/canary-features****
export const FEATURES = { isEnabled, ...EmberFEATURES };
@@ -367,14 +358,6 @@ namespace Ember {
export const addObserver = emberAddObserver;
export const removeObserver = emberRemoveObserver;
- // ****@ember/object/promise-proxy-mixin****
- export const PromiseProxyMixin = EmberPromiseProxyMixin;
- export type PromiseProxyMixin = EmberPromiseProxyMixin;
-
- // ****@ember/object/proxy****
- export const ObjectProxy = EmberObjectProxy;
- export type ObjectProxy = EmberObjectProxy;
-
// ****@ember/routing/-internals****
export const RouterDSL = EmberRouterDSL;
export type RouterDSL = EmberRouterDSL;
diff --git a/packages/ember/tests/reexports_test.js b/packages/ember/tests/reexports_test.js
index 444ae2c3364..96342f12c93 100644
--- a/packages/ember/tests/reexports_test.js
+++ b/packages/ember/tests/reexports_test.js
@@ -60,7 +60,6 @@ import * as test1 from '@ember/application/instance';
import * as test2 from '@ember/application/namespace';
import * as test3 from '@ember/array';
import * as test4 from '@ember/array/mutable';
-import * as test5 from '@ember/array/proxy';
import * as test6 from '@ember/canary-features';
import * as test7 from '@ember/component';
import * as test8 from '@ember/component/helper';
@@ -85,8 +84,6 @@ import * as test27 from '@ember/object/internals';
import * as test28 from '@ember/object/mixin';
import * as test29 from '@ember/object/observable';
import * as test30 from '@ember/object/observers';
-import * as test31 from '@ember/object/promise-proxy-mixin';
-import * as test32 from '@ember/object/proxy';
import * as test33 from '@ember/routing/hash-location';
import * as test34 from '@ember/routing/history-location';
import * as test35 from '@ember/routing/none-location';
@@ -131,7 +128,6 @@ let allExports = [
['isArray', '@ember/array', 'isArray', test3],
['makeArray', '@ember/array', 'makeArray', test3],
['MutableArray', '@ember/array/mutable', 'default', test4],
- ['ArrayProxy', '@ember/array/proxy', 'default', test5],
['FEATURES.isEnabled', '@ember/canary-features', 'isEnabled', test6],
['Component', '@ember/component', 'default', test7],
['_componentManagerCapabilities', '@ember/component', 'capabilities', test7],
@@ -221,8 +217,6 @@ let allExports = [
['Observable', '@ember/object/observable', 'default', test29],
['addObserver', '@ember/object/observers', 'addObserver', test30],
['removeObserver', '@ember/object/observers', 'removeObserver', test30],
- ['PromiseProxyMixin', '@ember/object/promise-proxy-mixin', 'default', test31],
- ['ObjectProxy', '@ember/object/proxy', 'default', test32],
['HashLocation', '@ember/routing/hash-location', 'default', test33],
['HistoryLocation', '@ember/routing/history-location', 'default', test34],
['NoneLocation', '@ember/routing/none-location', 'default', test35],
@@ -342,7 +336,6 @@ let allExports = [
['Comparable', '@ember/-internals/runtime', null, test57],
['ActionHandler', '@ember/-internals/runtime', null, test57],
['MutableEnumerable', '@ember/-internals/runtime', null, test57],
- ['_ProxyMixin', '@ember/-internals/runtime', null, test57],
['controllerFor', '@ember/-internals/routing', null, test58],
['generateControllerFactory', '@ember/-internals/routing', null, test58],
['generateController', '@ember/-internals/routing', null, test58],
diff --git a/packages/ember/tests/service_injection_test.js b/packages/ember/tests/service_injection_test.js
index b089347a2cf..c3906044995 100644
--- a/packages/ember/tests/service_injection_test.js
+++ b/packages/ember/tests/service_injection_test.js
@@ -1,7 +1,5 @@
-import { getOwner } from '@ember/-internals/owner';
import Controller from '@ember/controller';
import Service, { service } from '@ember/service';
-import { _ProxyMixin } from '@ember/-internals/runtime';
import { moduleFor, ApplicationTestCase } from 'internal-test-helpers';
import { computed } from '@ember/object';
@@ -25,33 +23,6 @@ moduleFor(
let controller = this.applicationInstance.lookup('controller:application');
assert.ok(controller.get('myService') instanceof MyService);
}
-
- async ['@test Service can be an object proxy and access owner in init GH#16484'](assert) {
- let serviceOwner;
-
- this.add(
- 'controller:application',
- class extends Controller {
- @service('my-service')
- myService;
- }
- );
- let MyService = class extends Service.extend(_ProxyMixin) {
- init() {
- super.init(...arguments);
-
- serviceOwner = getOwner(this);
- }
- };
- this.add('service:my-service', MyService);
- this.addTemplate('application', '');
-
- let instance = await this.visit('/');
-
- let controller = this.applicationInstance.lookup('controller:application');
- assert.ok(controller.get('myService') instanceof MyService);
- assert.equal(serviceOwner, instance, 'should be able to `getOwner` in init');
- }
}
);
diff --git a/tests/docs/expected.js b/tests/docs/expected.js
index fe8facb1739..a004e98b951 100644
--- a/tests/docs/expected.js
+++ b/tests/docs/expected.js
@@ -73,7 +73,6 @@ module.exports = {
'application',
'apply',
'ariaRole',
- 'arrangedContent',
'array',
'assert',
'assertDestroyablesDestroyed',
@@ -126,7 +125,6 @@ module.exports = {
'concatenatedProperties',
'container',
'containerDebugAdapter',
- 'content',
'contextDidChange',
'controller',
'controllerFor',
@@ -290,15 +288,11 @@ module.exports = {
'isEqual',
'isEvery',
'isFactory',
- 'isFulfilled',
'isHTMLSafe',
'isInteractive',
'isNone',
'isObject',
- 'isPending',
'isPresent',
- 'isRejected',
- 'isSettled',
'join',
'knownForType',
'lastIndexOf',
@@ -348,7 +342,6 @@ module.exports = {
'notEmpty',
'notifyPropertyChange',
'objectAt',
- 'objectAtContent',
'objectsAt',
'observeModelType',
'observer',
@@ -388,7 +381,6 @@ module.exports = {
'readOnly',
'reads',
'ready',
- 'reason',
'recognize',
'recognizeAndLoad',
'recompute',
@@ -424,7 +416,6 @@ module.exports = {
'reopen',
'reopenClass',
'replace',
- 'replaceContent',
'replaceRoute',
'replaceState',
'replaceURL',
@@ -549,7 +540,6 @@ module.exports = {
'Application',
'ApplicationInstance',
'ApplicationInstance.BootOptions',
- 'ArrayProxy',
'Component',
'ComputedProperty',
'ContainerDebugAdapter',
@@ -581,11 +571,9 @@ module.exports = {
'MutableArray',
'Namespace',
'NoneLocation',
- 'ObjectProxy',
'Observable',
'Owner',
'Promise',
- 'PromiseProxyMixin',
'RegisterOptions',
'Renderer',
'Resolver',
@@ -603,7 +591,6 @@ module.exports = {
'@ember/application',
'@ember/application/namespace',
'@ember/array',
- '@ember/array/proxy',
'@ember/canary-features',
'@ember/component',
'@ember/component/template-only',
@@ -618,8 +605,6 @@ module.exports = {
'@ember/object/core',
'@ember/object/mixin',
'@ember/object/observable',
- '@ember/object/promise-proxy-mixin',
- '@ember/object/proxy',
'@ember/owner',
'@ember/renderer',
'@ember/routing',
diff --git a/type-tests/@ember/array-test/array-proxy.ts b/type-tests/@ember/array-test/array-proxy.ts
deleted file mode 100644
index fe5bf70973e..00000000000
--- a/type-tests/@ember/array-test/array-proxy.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import ArrayProxy from '@ember/array/proxy';
-import EmberArray, { A } from '@ember/array';
-import EmberObject from '@ember/object';
-import { expectTypeOf } from 'expect-type';
-
-const pets = ['dog', 'cat', 'fish'];
-const proxy = ArrayProxy.create({ content: A(pets) });
-
-proxy.get('firstObject'); // 'dog'
-proxy.set('content', A(['amoeba', 'paramecium']));
-proxy.get('firstObject'); // 'amoeba'
-
-const overridden = ArrayProxy.create({
- content: A(pets),
- objectAtContent(this: ArrayProxy, idx: number): string | undefined {
- // NOTE: cast is necessary because `this` is not managed correctly in the
- // `.create()` body anymore.
- return (this.get('content') as unknown as EmberArray).objectAt(idx)?.toUpperCase();
- },
-});
-
-overridden.get('firstObject'); // 'DOG'
-
-class MyNewProxy extends ArrayProxy {
- isNew = true;
-}
-
-const x = MyNewProxy.create({ content: A([1, 2, 3]) });
-expectTypeOf(x.get('firstObject')).toBeUnknown();
-expectTypeOf(x.isNew).toBeBoolean();
-
-// Custom EmberArray
-interface MyArray extends EmberObject, EmberArray {}
-class MyArray extends EmberObject.extend(EmberArray) {
- constructor(content: ArrayLike) {
- super();
- this._content = content;
- }
-
- _content: ArrayLike;
-
- get length() {
- return this._content.length;
- }
-
- objectAt(idx: number) {
- return this._content[idx];
- }
-}
-
-const customArrayProxy = ArrayProxy.create({ content: new MyArray(pets) });
-customArrayProxy.get('firstObject'); // 'dog'
-
-// Vanilla array
-const vanillaArrayProxy = ArrayProxy.create({ content: pets });
-vanillaArrayProxy.get('firstObject'); // 'dog'
-
-// Nested ArrayProxy
-const nestedArrayProxy = ArrayProxy.create({ content: proxy });
-nestedArrayProxy.get('firstObject'); // 'amoeba'
diff --git a/type-tests/@ember/object-test/proxy.ts b/type-tests/@ember/object-test/proxy.ts
deleted file mode 100644
index ebebf9a6ffe..00000000000
--- a/type-tests/@ember/object-test/proxy.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-import Ember from 'ember';
-import ObjectProxy from '@ember/object/proxy';
-import { expectTypeOf } from 'expect-type';
-
-declare class X extends Ember.Object {
- foo: string;
- bar: number;
-}
-
-declare let x: X;
-x.getProperties('foo', 'bar');
-
-interface Book {
- title: string;
- subtitle: string;
- chapters: Array<{ title: string }>;
-}
-
-class DefaultProxy extends ObjectProxy {}
-expectTypeOf(DefaultProxy.create().content).toBeUnknown();
-
-class BookProxy extends ObjectProxy {
- private readonly baz = 'baz';
-
- altTitle = 'Alt';
-
- getTitle() {
- return this.get('title');
- }
-
- getPropertiesTitleSubtitle() {
- return this.getProperties('title', 'subtitle');
- }
-}
-
-const book = BookProxy.create();
-expectTypeOf(book.content).toEqualTypeOf();
-
-expectTypeOf(book.get('some-nonsense-property')).toBeUnknown();
-expectTypeOf(book.get('title')).toBeString();
-expectTypeOf(book.get('altTitle')).toBeString();
-expectTypeOf(book.getTitle()).toBeString();
-
-book.getProperties('title', 'some-nonsense-property');
-expectTypeOf(book.getProperties('title', 'subtitle')).toEqualTypeOf<
- Pick
->();
-expectTypeOf(book.getPropertiesTitleSubtitle()).toEqualTypeOf>();
-expectTypeOf(book.getProperties(['subtitle', 'chapters'])).toEqualTypeOf<
- Pick
->();
-expectTypeOf(book.getProperties(['title', 'some-nonsense-property'])).toEqualTypeOf<
- Record<'title' | 'some-nonsense-property', unknown>
->;
-expectTypeOf(book.getProperties('title', 'altTitle')).toEqualTypeOf<{
- title: string;
- altTitle: string;
-}>;
-
-expectTypeOf(book.get('baz')).toBeUnknown();
-
-book.set('title', 'New');
-// @ts-expect-error
-book.set('title', 1);
-book.set('altTitle', 'Alternate');
-// @ts-expect-error
-book.set('altTitle', 1);
-book.setProperties({
- title: 'new',
- subtitle: 'and improved',
- altTitle: 'Alternate2',
-});
-book.setProperties({ title: 1 });
-book.setProperties({ altTitle: 1 });
-book.setProperties({ invalid: true });
-
-class Person extends Ember.Object {
- firstName = 'Peter';
-
- lastName = 'Wagenet';
-
- @Ember.computed('firstName', 'lastName')
- get fullName() {
- return `${this.firstName} ${this.lastName}`;
- }
-
- set fullName(value: string) {
- const [firstName, lastName] = value.split(' ');
-
- Ember.set(this, 'firstName', firstName ?? '');
- Ember.set(this, 'lastName', lastName ?? '');
- }
-}
-
-class PersonProxy extends ObjectProxy {}
-
-const person = PersonProxy.create();
-
-expectTypeOf(person.get('firstName')).toBeString();
-expectTypeOf(person.get('fullName')).toBeString();
-expectTypeOf(person.set('fullName', 'John Doe')).toBeString();
-// @ts-expect-error
-person.set('fullName', 1);
-// @ts-expect-error
-person.set('invalid', true);
-expectTypeOf(person.setProperties({ fullName: 'John Doe' })).toEqualTypeOf<{
- fullName: 'John Doe';
-}>();
-expectTypeOf(person.setProperties({ fullName: 'John Doe' }).fullName).toBeString();
-person.setProperties({ fullName: 1 });
-person.setProperties({ fullName: 'John Doe', invalid: true });
diff --git a/type-tests/ember/array-proxy.ts b/type-tests/ember/array-proxy.ts
deleted file mode 100644
index d88fe73fff8..00000000000
--- a/type-tests/ember/array-proxy.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import type Array from '@ember/array';
-import Ember from 'ember';
-import { expectTypeOf } from 'expect-type';
-
-const pets = ['dog', 'cat', 'fish'];
-const proxy = Ember.ArrayProxy.create({ content: Ember.A(pets) });
-
-proxy.get('firstObject'); // 'dog'
-proxy.set('content', Ember.A(['amoeba', 'paramecium']));
-proxy.get('firstObject'); // 'amoeba'
-
-const overridden = Ember.ArrayProxy.create({
- content: Ember.A(pets),
- objectAtContent(this: Ember.ArrayProxy, idx: number): string | undefined {
- return (this.get('content') as Array).objectAt(idx)?.toUpperCase();
- },
-});
-
-overridden.get('firstObject'); // 'DOG'
-
-class MyNewProxy extends Ember.ArrayProxy {
- isNew = true;
-}
-
-const x = MyNewProxy.create({ content: Ember.A([1, 2, 3]) }) as MyNewProxy;
-expectTypeOf(x.get('firstObject')).toEqualTypeOf();
-expectTypeOf(x.isNew).toBeBoolean();
diff --git a/type-tests/ember/ember-module-tests.ts b/type-tests/ember/ember-module-tests.ts
index 7a6f1105452..61af4a5f8cb 100644
--- a/type-tests/ember/ember-module-tests.ts
+++ b/type-tests/ember/ember-module-tests.ts
@@ -132,10 +132,6 @@ expectTypeOf(Ember.ApplicationInstance.create()).toEqualTypeOf = Ember.A([]);
// @ts-expect-error
const a2: Ember.Array = {};
-// Ember.ArrayProxy -- we cannot make this type safe with our limited types.
-expectTypeOf(Ember.ArrayProxy.create({ content: [3, 3, 2] })).toMatchTypeOf<
- Ember.ArrayProxy
->();
// Ember.Component
const C1 = Ember.Component.extend({ classNames: ['foo'] });
class C2 extends Ember.Component {
@@ -228,18 +224,8 @@ expectTypeOf(na.clear()).toEqualTypeOf>();
expectTypeOf(new Ember.NoneLocation()).toEqualTypeOf();
// Ember.Object
new Ember.Object();
-// Ember.ObjectProxy
-expectTypeOf(new Ember.ObjectProxy()).toEqualTypeOf();
// Ember.Observable
Ember.Object.extend(Ember.Observable, {});
-// Ember.PromiseProxyMixin
-interface PPM extends Ember.PromiseProxyMixin {}
-class PPM extends Ember.Object.extend(Ember.PromiseProxyMixin) {
- foo() {
- expectTypeOf(this.reason).toEqualTypeOf();
- expectTypeOf(this.isPending).toEqualTypeOf();
- }
-}
// Ember.Route
new Ember.Route(owner);
// Ember.Router