Skip to content

Commit 3ea7924

Browse files
committed
wip
1 parent 2fb4ea8 commit 3ea7924

File tree

3 files changed

+27
-19
lines changed

3 files changed

+27
-19
lines changed

packages/svelte/src/index-client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,4 @@ export { getContext, getAllContexts, hasContext, setContext } from './internal/c
219219
export { hydrate, mount, unmount } from './internal/client/render.js';
220220
export { tick, untrack } from './internal/client/runtime.js';
221221
export { createRawSnippet } from './internal/client/dom/blocks/snippet.js';
222-
export { Resource, getResource, deferPending } from './internal/client/reactivity/resources.js';
222+
export { Resource, createResourceContext, deferPending } from './internal/client/reactivity/resources.js';

packages/svelte/src/internal/client/reactivity/resources.js

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,14 @@ export class Resource {
2424

2525
/**
2626
* @param {() => Promise<T>} fn
27-
* @param {symbol} [symbol]
2827
*/
29-
constructor(fn, symbol) {
28+
constructor(fn) {
3029
let parent = /** @type {Effect | null} */ (active_effect);
3130

3231
if (parent === null) {
3332
throw new Error('TODO cannot create resources outside of an effect');
3433
}
3534

36-
if (typeof symbol === 'symbol') {
37-
let resources = getContext(resource_symbol);
38-
39-
if (resources === undefined) {
40-
resources = new Map();
41-
setContext(resource_symbol, resources);
42-
}
43-
resources.set(symbol, this);
44-
}
45-
4635
/** @type {{}} */
4736
var current_token;
4837

@@ -108,11 +97,30 @@ export class Resource {
10897

10998
/**
11099
* @template T
111-
* @param {symbol} symbol
112-
* @returns {Resource<T> | null}
100+
* @returns {[set_resource: (resource: Resource<T>) => void, get_resource: () => Resource<T>]}
113101
*/
114-
export function getResource(symbol) {
115-
return getContext(resource_symbol)?.get(symbol) ?? null;
102+
export function createResourceContext() {
103+
const key = {};
104+
105+
const set_resource = (/** @type {Resource<T>} */ resource) => {
106+
let resources = getContext(resource_symbol);
107+
108+
if (resources === undefined) {
109+
resources = new Map();
110+
setContext(resource_symbol, resources);
111+
}
112+
resources.set(key, resource);
113+
};
114+
115+
const get_resource = () => {
116+
var resource = getContext(resource_symbol)?.get(key);
117+
if (resource === undefined) {
118+
throw new Error('TODO: No resource found');
119+
}
120+
return resource;
121+
};
122+
123+
return [set_resource, get_resource];
116124
}
117125

118126
/**

packages/svelte/types/index.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,13 +512,13 @@ declare module 'svelte' {
512512
* ```
513513
* */
514514
export function untrack<T>(fn: () => T): T;
515-
export function getResource<T>(symbol: symbol): Resource<T> | null;
515+
export function createResourceContext<T>(): [set_resource: (resource: Resource<T>) => void, get_resource: () => Resource<T>];
516516

517517
export function deferPending<T, V>(resources: Resource<T> | Resource<T>[], fn: () => V): V;
518518

519519
export class Resource<T> {
520520

521-
constructor(fn: () => Promise<T>, symbol?: symbol | undefined);
521+
constructor(fn: () => Promise<T>);
522522
get pending(): boolean;
523523
get current(): T;
524524

0 commit comments

Comments
 (0)