Skip to content

Commit 410bbf4

Browse files
feat: owner is now available to function-based resources
when using function-based resources, the owner will be provided in the arg to `resource` ```js const myResource = resource(({ on, owner }) => { let foo = owner.lookup('service:foo'); return () => foo.someValue; }); ```
2 parents d4743cc + 4dbc8e9 commit 410bbf4

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

ember-resources/src/core/function-based/manager.ts

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class FunctionResourceManager {
5151
registerDestructor(currentFn, destroyer);
5252
},
5353
},
54+
owner: this.owner,
5455
});
5556

5657
return maybeValue;

ember-resources/src/core/function-based/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import type Owner from '@ember/owner';
2+
13
export const INTERMEDIATE_VALUE = '__Intermediate_Value__';
24
export const INTERNAL = '__INTERNAL__';
35

@@ -32,6 +34,7 @@ export type Hooks = {
3234
*/
3335
cleanup: (destroyer: Destructor) => void;
3436
};
37+
owner: Owner;
3538
};
3639

3740
/**

testing/ember-app/tests/utils/function-resource/js-test.ts

+35
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { tracked } from '@glimmer/tracking';
2+
import { setOwner } from '@ember/application';
23
import { destroy } from '@ember/destroyable';
4+
import Service from '@ember/service';
35
import { settled } from '@ember/test-helpers';
46
import { module, test } from 'qunit';
57
import { setupTest } from 'ember-qunit';
@@ -256,4 +258,37 @@ module('Utils | resource | js', function (hooks) {
256258
assert.verifySteps(['resolved 1', 'resolved 2', 'resolved 3']);
257259
});
258260
});
261+
262+
module('with owner', function (hooks) {
263+
class TestService extends Service {
264+
@tracked count = 1;
265+
}
266+
267+
class Test {
268+
// @use is required if a primitive is returned
269+
@use data = resource(({ owner }) => {
270+
const test = owner.lookup('service:test') as TestService;
271+
272+
return test.count;
273+
});
274+
}
275+
276+
hooks.beforeEach(function () {
277+
this.owner.register('service:test', TestService);
278+
});
279+
280+
test('basics', function (assert) {
281+
const testService = this.owner.lookup('service:test') as TestService;
282+
283+
let test = new Test();
284+
285+
setOwner(test, this.owner);
286+
287+
assert.strictEqual(test.data, 1);
288+
289+
testService.count = 2;
290+
291+
assert.strictEqual(test.data, 2);
292+
});
293+
});
259294
});

testing/ember-app/tests/utils/function-resource/rendering-test.ts

+42
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { tracked } from '@glimmer/tracking';
2+
import { setOwner } from '@ember/application';
23
import { destroy } from '@ember/destroyable';
4+
import Service from '@ember/service';
35
import { clearRender, render, settled } from '@ember/test-helpers';
46
import { hbs } from 'ember-cli-htmlbars';
57
import { module, test } from 'qunit';
@@ -488,4 +490,44 @@ module('Utils | resource | rendering', function (hooks) {
488490
]);
489491
});
490492
});
493+
494+
module('with owner', function (hooks) {
495+
class TestService extends Service {
496+
@tracked count = 1;
497+
}
498+
499+
class Test {
500+
// @use is required if a primitive is returned
501+
@use data = resource(({ owner }) => {
502+
const test = owner.lookup('service:test') as TestService;
503+
504+
return test.count;
505+
});
506+
}
507+
508+
hooks.beforeEach(function () {
509+
this.owner.register('service:test', TestService);
510+
});
511+
512+
test('basics', async function (assert) {
513+
const testService = this.owner.lookup('service:test') as TestService;
514+
515+
let test = new Test();
516+
517+
setOwner(test, this.owner);
518+
519+
this.set('test', test);
520+
521+
await render(hbs`
522+
<out>{{this.test.data}}</out>
523+
`);
524+
525+
assert.dom('out').containsText('1');
526+
527+
testService.count = 2;
528+
await settled();
529+
530+
assert.dom('out').containsText('2');
531+
});
532+
});
491533
});

0 commit comments

Comments
 (0)