From 7c647ffc784c5612e6d6b526359c2e77f5ecd945 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli Date: Fri, 29 Jul 2022 19:13:15 -0400 Subject: [PATCH] fix(resourceFactory): reactivity now works when args to a resource change --- .../function-based/immediate-invocation.ts | 52 ++++++++++++++----- pnpm-lock.yaml | 3 +- .../utils/function-resource/clock-test.ts | 7 +-- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/ember-resources/src/core/function-based/immediate-invocation.ts b/ember-resources/src/core/function-based/immediate-invocation.ts index 7cec3681b..aae70dcdb 100644 --- a/ember-resources/src/core/function-based/immediate-invocation.ts +++ b/ember-resources/src/core/function-based/immediate-invocation.ts @@ -8,6 +8,13 @@ import type { Cache } from './types'; type ResourceFactory = (...args: any[]) => ReturnType; +interface State { + cache?: Cache; + fn: any; + args: any; + _?: any; +} + class ResourceInvokerManager { capabilities = helperCapabilities('3.23', { hasValue: true, @@ -16,9 +23,7 @@ class ResourceInvokerManager { constructor(protected owner: unknown) {} - createHelper(fn: ResourceFactory, args: any) { - let helper: object; - + createHelper(fn: ResourceFactory, args: any): State { /** * This cache is for args passed to the ResourceInvoker/Factory * @@ -26,25 +31,48 @@ class ResourceInvokerManager { * change. */ let cache = createCache(() => { - if (helper === undefined) { - let resource = fn(...args.positional) as object; + let resource = fn(...args.positional) as object; - helper = invokeHelper(cache, resource); - } - - return helper; + return invokeHelper(cache, resource); }); - return { fn, args, cache: getValue(cache) }; + return { fn, args, cache, _: getValue(cache) }; } - getValue({ cache }: { cache: Cache }) { - return getValue(cache); + /** + * getValue is re-called when args change + */ + getValue({ cache }: State) { + let resource = getValue(cache); + + return getValue(resource); } getDestroyable({ fn }: { fn: ResourceFactory }) { return fn; } + + // createHelper(fn: AnyFunction, args: Arguments): State { + // return { fn, args }; + // } + + // getValue({ fn, args }: State): unknown { + // if (Object.keys(args.named).length > 0) { + // let argsForFn: FnArgs = [...args.positional, args.named]; + + // return fn(...argsForFn); + // } + + // return fn(...args.positional); + // } + + // getDebugName(fn: AnyFunction): string { + // if (fn.name) { + // return `(helper function ${fn.name})`; + // } + + // return '(anonymous helper function)'; + // } } /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d606d3700..b80b41a4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3215,7 +3215,7 @@ packages: peerDependencies: '@glimmer/component': ^1.1.2 dependencies: - '@glimmer/component': 1.1.2_@babel+core@7.18.9 + '@glimmer/component': 1.1.2_@babel+core@7.18.5 dev: true /@glint/transform/0.8.3: @@ -8086,7 +8086,6 @@ packages: transitivePeerDependencies: - '@babel/core' - supports-color - dev: false /ember-async-data/0.6.0_@babel+core@7.18.9: resolution: {integrity: sha512-zgE5N4DVHr9b6Hlnev6Z8zMyD7mII/ewE/6t+7eHTrshe9vwSTA6eiT5fCKmHeSob5ThU51J+Alwl2QACtsL/A==} diff --git a/testing/ember-app/tests/utils/function-resource/clock-test.ts b/testing/ember-app/tests/utils/function-resource/clock-test.ts index 08b440bba..506f9b6e5 100644 --- a/testing/ember-app/tests/utils/function-resource/clock-test.ts +++ b/testing/ember-app/tests/utils/function-resource/clock-test.ts @@ -12,9 +12,6 @@ module('Examples | resource | Clock', function (hooks) { let wait = (ms = 1_100) => new Promise((resolve) => setTimeout(resolve, ms)); hooks.beforeEach(function (assert) { - // timeout is too new for the types to know about - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore assert.timeout(3000); }); @@ -162,14 +159,14 @@ module('Examples | resource | Clock', function (hooks) { let textD = find('time')?.innerText; - assert.strictEqual(textA, textD, 'Time is reset'); + assert.strictEqual(textD, textA, 'Time is reset'); this.setProperties({ date: new Date() }); await settled(); let textE = find('time')?.innerText; - assert.notStrictEqual(textD, textE, 'Time has changed'); + assert.notStrictEqual(textE, textD, 'Time has changed'); }); }); });