Skip to content

Commit

Permalink
Merge pull request #20018 from NullVoxPopuli/remove-flags-for-shipped…
Browse files Browse the repository at this point in the history
…-features
  • Loading branch information
kategengler committed Mar 15, 2022
2 parents f0b49d8 + 6076d2f commit d8f8266
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 208 deletions.
51 changes: 24 additions & 27 deletions packages/@ember/-internals/metal/lib/cached.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,38 @@
// NOTE: copied from: https://github.com/glimmerjs/glimmer.js/pull/358
// Both glimmerjs/glimmer.js and emberjs/ember.js have the exact same implementation
// of @cached, so any changes made to one should also be made to the other
import { EMBER_CACHED } from '@ember/canary-features';
import { DEBUG } from '@glimmer/env';
import { createCache, getValue } from '@glimmer/validator';

// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const cached: PropertyDecorator = (...args: any[]) => {
if (EMBER_CACHED) {
const [target, key, descriptor] = args;

// Error on `@cached()`, `@cached(...args)`, and `@cached propName = value;`
if (DEBUG && target === undefined) throwCachedExtraneousParens();
if (
DEBUG &&
(typeof target !== 'object' ||
typeof key !== 'string' ||
typeof descriptor !== 'object' ||
args.length !== 3)
) {
throwCachedInvalidArgsError(args);
}
if (DEBUG && (!('get' in descriptor) || typeof descriptor.get !== 'function')) {
throwCachedGetterOnlyError(key);
}
const [target, key, descriptor] = args;

// Error on `@cached()`, `@cached(...args)`, and `@cached propName = value;`
if (DEBUG && target === undefined) throwCachedExtraneousParens();
if (
DEBUG &&
(typeof target !== 'object' ||
typeof key !== 'string' ||
typeof descriptor !== 'object' ||
args.length !== 3)
) {
throwCachedInvalidArgsError(args);
}
if (DEBUG && (!('get' in descriptor) || typeof descriptor.get !== 'function')) {
throwCachedGetterOnlyError(key);
}

const caches = new WeakMap();
const getter = descriptor.get;
const caches = new WeakMap();
const getter = descriptor.get;

descriptor.get = function (): unknown {
if (!caches.has(this)) {
caches.set(this, createCache(getter.bind(this)));
}
descriptor.get = function (): unknown {
if (!caches.has(this)) {
caches.set(this, createCache(getter.bind(this)));
}

return getValue(caches.get(this));
};
}
return getValue(caches.get(this));
};
};

function throwCachedExtraneousParens(): never {
Expand Down
145 changes: 71 additions & 74 deletions packages/@ember/-internals/metal/tests/cached/get_test.js
Original file line number Diff line number Diff line change
@@ -1,102 +1,99 @@
import { AbstractTestCase, moduleFor } from 'internal-test-helpers';
import { cached, tracked } from '../..';
import { EMBER_CACHED } from '@ember/canary-features';

if (EMBER_CACHED) {
moduleFor(
'@cached decorator: get',
class extends AbstractTestCase {
'@test it works'() {
let assert = this.assert;

class Person {
@tracked firstName = 'Jen';
@tracked lastName = 'Weber';

@cached
get fullName() {
let fullName = `${this.firstName} ${this.lastName}`;

assert.step(fullName);
return fullName;
}

moduleFor(
'@cached decorator: get',
class extends AbstractTestCase {
'@test it works'() {
let assert = this.assert;

class Person {
@tracked firstName = 'Jen';
@tracked lastName = 'Weber';

@cached
get fullName() {
let fullName = `${this.firstName} ${this.lastName}`;

assert.step(fullName);
return fullName;
}
}

let person = new Person();
let person = new Person();

assert.verifySteps([], 'getter is not called after class initialization');
assert.verifySteps([], 'getter is not called after class initialization');

assert.strictEqual(person.fullName, 'Jen Weber');
assert.verifySteps(['Jen Weber'], 'getter was called after property access');
assert.strictEqual(person.fullName, 'Jen Weber');
assert.verifySteps(['Jen Weber'], 'getter was called after property access');

assert.strictEqual(person.fullName, 'Jen Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');
assert.strictEqual(person.fullName, 'Jen Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');

person.firstName = 'Kenneth';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');
person.firstName = 'Kenneth';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');

assert.strictEqual(person.fullName, 'Kenneth Weber');
assert.verifySteps(['Kenneth Weber'], 'accessing the property triggers a re-computation');
assert.strictEqual(person.fullName, 'Kenneth Weber');
assert.verifySteps(['Kenneth Weber'], 'accessing the property triggers a re-computation');

assert.strictEqual(person.fullName, 'Kenneth Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');
assert.strictEqual(person.fullName, 'Kenneth Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');

person.lastName = 'Larsen';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');
person.lastName = 'Larsen';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');

assert.strictEqual(person.fullName, 'Kenneth Larsen');
assert.verifySteps(['Kenneth Larsen'], 'accessing the property triggers a re-computation');
}
assert.strictEqual(person.fullName, 'Kenneth Larsen');
assert.verifySteps(['Kenneth Larsen'], 'accessing the property triggers a re-computation');
}

'@test it has a separate cache per class instance'() {
let assert = this.assert;
'@test it has a separate cache per class instance'() {
let assert = this.assert;

class Person {
@tracked firstName;
@tracked lastName;
class Person {
@tracked firstName;
@tracked lastName;

constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}

@cached
get fullName() {
let fullName = `${this.firstName} ${this.lastName}`;
assert.step(fullName);
return fullName;
}
@cached
get fullName() {
let fullName = `${this.firstName} ${this.lastName}`;
assert.step(fullName);
return fullName;
}
}

let jen = new Person('Jen', 'Weber');
let chris = new Person('Chris', 'Garrett');
let jen = new Person('Jen', 'Weber');
let chris = new Person('Chris', 'Garrett');

assert.verifySteps([], 'getter is not called after class initialization');
assert.verifySteps([], 'getter is not called after class initialization');

assert.strictEqual(jen.fullName, 'Jen Weber');
assert.verifySteps(['Jen Weber'], 'getter was called after property access');
assert.strictEqual(jen.fullName, 'Jen Weber');
assert.verifySteps(['Jen Weber'], 'getter was called after property access');

assert.strictEqual(jen.fullName, 'Jen Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');
assert.strictEqual(jen.fullName, 'Jen Weber');
assert.verifySteps([], 'getter was not called again after repeated property access');

assert.strictEqual(chris.fullName, 'Chris Garrett', 'other instance has a different value');
assert.verifySteps(['Chris Garrett'], 'getter was called after property access');
assert.strictEqual(chris.fullName, 'Chris Garrett', 'other instance has a different value');
assert.verifySteps(['Chris Garrett'], 'getter was called after property access');

assert.strictEqual(chris.fullName, 'Chris Garrett');
assert.verifySteps([], 'getter was not called again after repeated property access');
assert.strictEqual(chris.fullName, 'Chris Garrett');
assert.verifySteps([], 'getter was not called again after repeated property access');

chris.lastName = 'Manson';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');
chris.lastName = 'Manson';
assert.verifySteps([], 'changing a property does not trigger an eager re-computation');

assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');
assert.verifySteps([], 'getter was not called again after repeated property access');
assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');
assert.verifySteps([], 'getter was not called again after repeated property access');

assert.strictEqual(chris.fullName, 'Chris Manson');
assert.verifySteps(['Chris Manson'], 'getter was called after property access');
assert.strictEqual(chris.fullName, 'Chris Manson');
assert.verifySteps(['Chris Manson'], 'getter was called after property access');

assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');
assert.verifySteps([], 'getter was not called again after repeated property access');
}
assert.strictEqual(jen.fullName, 'Jen Weber', 'other instance is unaffected');
assert.verifySteps([], 'getter was not called again after repeated property access');
}
);
}
}
);
35 changes: 13 additions & 22 deletions packages/@ember/-internals/routing/lib/services/router.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { getOwner } from '@ember/-internals/owner';
import { Evented } from '@ember/-internals/runtime';
import { symbol } from '@ember/-internals/utils';
import { EMBER_ROUTING_ROUTER_SERVICE_REFRESH } from '@ember/canary-features';
import { assert } from '@ember/debug';
import { readOnly } from '@ember/object/computed';
import Service from '@ember/service';
Expand Down Expand Up @@ -549,7 +548,6 @@ class RouterService<R extends Route> extends Service.extend(Evented) {
@public
*/

// Canary features
/**
* Refreshes all currently active routes, doing a full transition.
* If a route name is provided and refers to a currently active route,
Expand All @@ -561,31 +559,24 @@ class RouterService<R extends Route> extends Service.extend(Evented) {
* @method refresh
* @param {String} [routeName] the route to refresh (along with all child routes)
* @return Transition
* @category EMBER_ROUTING_ROUTER_SERVICE_REFRESH
* @public
*/
refresh = EMBER_ROUTING_ROUTER_SERVICE_REFRESH
? function (this: RouterService<Route>, pivotRouteName?: string): Transition {
if (!pivotRouteName) {
return this._router._routerMicrolib.refresh();
}
refresh(pivotRouteName?: string): Transition {
if (!pivotRouteName) {
return this._router._routerMicrolib.refresh();
}

assert(
`The route "${pivotRouteName}" was not found`,
this._router.hasRoute(pivotRouteName)
);
assert(
`The route "${pivotRouteName}" is currently not active`,
this.isActive(pivotRouteName)
);
assert(`The route "${pivotRouteName}" was not found`, this._router.hasRoute(pivotRouteName));
assert(`The route "${pivotRouteName}" is currently not active`, this.isActive(pivotRouteName));

let owner = getOwner(this);
assert('RouterService is unexpectedly missing an owner', owner);
let pivotRoute = owner.lookup(`route:${pivotRouteName}`) as Route;
let owner = getOwner(this);
assert('RouterService is unexpectedly missing an owner', owner);
let pivotRoute = owner.lookup(`route:${pivotRouteName}`) as Route;

return this._router._routerMicrolib.refresh(pivotRoute);
}
: undefined;
// R could be instantiated with a different sub-type
// @ts-ignore
return this._router._routerMicrolib.refresh(pivotRoute);
}

/**
Name of the current route.
Expand Down
6 changes: 0 additions & 6 deletions packages/@ember/canary-features/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ import { ENV } from '@ember/-internals/environment';
export const DEFAULT_FEATURES = {
EMBER_LIBRARIES_ISREGISTERED: null,
EMBER_IMPROVED_INSTRUMENTATION: null,
EMBER_ROUTING_ROUTER_SERVICE_REFRESH: true,
EMBER_CACHED: true,
EMBER_UNIQUE_ID_HELPER: true,
};

Expand Down Expand Up @@ -67,8 +65,4 @@ function featureValue(value: null | boolean) {

export const EMBER_LIBRARIES_ISREGISTERED = featureValue(FEATURES.EMBER_LIBRARIES_ISREGISTERED);
export const EMBER_IMPROVED_INSTRUMENTATION = featureValue(FEATURES.EMBER_IMPROVED_INSTRUMENTATION);
export const EMBER_ROUTING_ROUTER_SERVICE_REFRESH = featureValue(
FEATURES.EMBER_ROUTING_ROUTER_SERVICE_REFRESH
);
export const EMBER_CACHED = featureValue(FEATURES.EMBER_CACHED);
export const EMBER_UNIQUE_ID_HELPER = featureValue(FEATURES.EMBER_UNIQUE_ID_HELPER);

0 comments on commit d8f8266

Please sign in to comment.