valdres 0.2.0-alpha.60 → 0.2.0-alpha.62
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +49 -22
- package/dist/types/src/errors/SelectorCircularDependencyError.d.ts +5 -0
- package/dist/types/src/errors/SelectorEvaluationError.d.ts +7 -0
- package/dist/types/src/errors/lib/generateSelectorTrace.d.ts +2 -0
- package/dist/types/src/lib/transaction.d.ts +6 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -235,14 +235,7 @@ var findClosestStoreWithAtomInitialized = (atom, data) => {
|
|
|
235
235
|
return findClosestStoreWithAtomInitialized(atom, data.parent);
|
|
236
236
|
};
|
|
237
237
|
|
|
238
|
-
// src/lib/
|
|
239
|
-
class SuspendAndWaitForResolveError extends Error {
|
|
240
|
-
promise;
|
|
241
|
-
constructor(promise) {
|
|
242
|
-
super();
|
|
243
|
-
this.promise = promise;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
238
|
+
// src/errors/lib/generateSelectorTrace.ts
|
|
246
239
|
var generateSelectorTrace = (selectors) => {
|
|
247
240
|
const lastIndex = selectors.length - 1;
|
|
248
241
|
return [...selectors].reverse().map((selector, index) => {
|
|
@@ -258,21 +251,44 @@ var generateSelectorTrace = (selectors) => {
|
|
|
258
251
|
`);
|
|
259
252
|
};
|
|
260
253
|
|
|
261
|
-
|
|
254
|
+
// src/errors/SelectorEvaluationError.ts
|
|
255
|
+
class SelectorEvaluationError extends Error {
|
|
262
256
|
selectors;
|
|
263
|
-
constructor() {
|
|
257
|
+
constructor(cause) {
|
|
264
258
|
super();
|
|
259
|
+
this.cause = cause;
|
|
265
260
|
this.selectors = [];
|
|
266
261
|
}
|
|
267
262
|
track(selector) {
|
|
268
263
|
this.selectors.push(selector);
|
|
269
264
|
}
|
|
265
|
+
get message() {
|
|
266
|
+
const firstSelectorName = this.selectors[0].name ?? "Anonymous Selector";
|
|
267
|
+
return `Selector eval crashed in '${firstSelectorName}'
|
|
268
|
+
${generateSelectorTrace(this.selectors)}`;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// src/errors/SelectorCircularDependencyError.ts
|
|
273
|
+
class SelectorCircularDependencyError extends SelectorEvaluationError {
|
|
274
|
+
constructor() {
|
|
275
|
+
super();
|
|
276
|
+
}
|
|
270
277
|
get message() {
|
|
271
278
|
const firstSelectorName = this.selectors[0].name ?? "Anonymous Selector";
|
|
272
279
|
return `Circular dependency detected in '${firstSelectorName}'
|
|
273
280
|
${generateSelectorTrace(this.selectors)}`;
|
|
274
281
|
}
|
|
275
282
|
}
|
|
283
|
+
|
|
284
|
+
// src/lib/initSelector.ts
|
|
285
|
+
class SuspendAndWaitForResolveError extends Error {
|
|
286
|
+
promise;
|
|
287
|
+
constructor(promise) {
|
|
288
|
+
super();
|
|
289
|
+
this.promise = promise;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
276
292
|
var getOrInitConsumersSet = (state, data) => {
|
|
277
293
|
const set = data.stateConsumers.get(state);
|
|
278
294
|
if (set)
|
|
@@ -284,7 +300,7 @@ var getOrInitConsumersSet = (state, data) => {
|
|
|
284
300
|
var evaluateSelector = (selector, data, circularDependencyMap = new WeakSet) => {
|
|
285
301
|
const updatedDependencies = new Set;
|
|
286
302
|
if (circularDependencyMap.has(selector)) {
|
|
287
|
-
throw new
|
|
303
|
+
throw new SelectorCircularDependencyError;
|
|
288
304
|
}
|
|
289
305
|
circularDependencyMap.add(selector);
|
|
290
306
|
let result;
|
|
@@ -299,8 +315,10 @@ var evaluateSelector = (selector, data, circularDependencyMap = new WeakSet) =>
|
|
|
299
315
|
} catch (error) {
|
|
300
316
|
if (error instanceof SuspendAndWaitForResolveError) {
|
|
301
317
|
result = error;
|
|
302
|
-
} else {
|
|
318
|
+
} else if (error instanceof SelectorEvaluationError) {
|
|
303
319
|
throw error;
|
|
320
|
+
} else {
|
|
321
|
+
throw new SelectorEvaluationError(error);
|
|
304
322
|
}
|
|
305
323
|
}
|
|
306
324
|
const currentDependencies = data.stateDependencies.get(selector) ?? new Set;
|
|
@@ -337,7 +355,7 @@ var initSelector = (selector, data, circularDependencySet = new WeakSet) => {
|
|
|
337
355
|
try {
|
|
338
356
|
tmpValue = evaluateSelector(selector, data, circularDependencySet);
|
|
339
357
|
} catch (e) {
|
|
340
|
-
if (e instanceof
|
|
358
|
+
if (e instanceof SelectorEvaluationError)
|
|
341
359
|
e.track(selector);
|
|
342
360
|
throw e;
|
|
343
361
|
}
|
|
@@ -614,26 +632,35 @@ var recursivlyResetTxnSelectorCache = (state, txnSubscribers, txnSelectorCache)
|
|
|
614
632
|
}
|
|
615
633
|
}
|
|
616
634
|
};
|
|
617
|
-
var captureScopedTransaction = (scopedData,
|
|
635
|
+
var captureScopedTransaction = (scopedData, parentGetFromTxnOrData) => {
|
|
618
636
|
let txn;
|
|
619
637
|
transaction((scopedTxn) => {
|
|
620
638
|
txn = scopedTxn;
|
|
621
|
-
}, scopedData, false,
|
|
639
|
+
}, scopedData, false, parentGetFromTxnOrData);
|
|
622
640
|
return txn;
|
|
623
641
|
};
|
|
624
|
-
var transaction = (callback, data, autoCommit = true,
|
|
642
|
+
var transaction = (callback, data, autoCommit = true, parentGetFromTxnOrData) => {
|
|
625
643
|
const txnAtomMap = new Map;
|
|
626
644
|
const txnSelectorCache = new Map;
|
|
627
645
|
const txnSubscribers = new Map;
|
|
628
646
|
const dirtySelectors = new Set;
|
|
629
647
|
let scopedTransactions;
|
|
648
|
+
const getFromTxnOrData = (state) => {
|
|
649
|
+
if (txnAtomMap.has(state)) {
|
|
650
|
+
return txnAtomMap.get(state);
|
|
651
|
+
}
|
|
652
|
+
if (data.values.has(state)) {
|
|
653
|
+
return data.values.get(state);
|
|
654
|
+
}
|
|
655
|
+
if (parentGetFromTxnOrData) {
|
|
656
|
+
return parentGetFromTxnOrData(state);
|
|
657
|
+
}
|
|
658
|
+
};
|
|
630
659
|
const txnGet = (state) => {
|
|
631
660
|
if (isAtom(state)) {
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
return parentScopeGet(state);
|
|
636
|
-
}
|
|
661
|
+
const value = getFromTxnOrData(state);
|
|
662
|
+
if (value)
|
|
663
|
+
return value;
|
|
637
664
|
return getState(state, data);
|
|
638
665
|
} else if (isSelector(state)) {
|
|
639
666
|
if (txnSelectorCache.has(state)) {
|
|
@@ -709,7 +736,7 @@ var transaction = (callback, data, autoCommit = true, parentScopeGet) => {
|
|
|
709
736
|
scopedTransactions = {};
|
|
710
737
|
}
|
|
711
738
|
if (scopedTransactions[scopeId] === undefined) {
|
|
712
|
-
scopedTransactions[scopeId] = captureScopedTransaction(scopedData,
|
|
739
|
+
scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getFromTxnOrData);
|
|
713
740
|
}
|
|
714
741
|
return callback2(scopedTransactions[scopeId]);
|
|
715
742
|
} else {
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Atom } from "../types/Atom";
|
|
2
2
|
import type { StoreData } from "../types/StoreData";
|
|
3
3
|
import type { TransactionFn } from "../types/TransactionFn";
|
|
4
|
-
|
|
4
|
+
type GetAtomValue = {
|
|
5
|
+
<V>(atom: Atom<V>): V;
|
|
6
|
+
};
|
|
7
|
+
export declare const transaction: (callback: TransactionFn, data: StoreData, autoCommit?: boolean, parentGetFromTxnOrData?: GetAtomValue) => any;
|
|
8
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "valdres",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.62",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Eigil Sagafos"
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"access": "public",
|
|
37
37
|
"registry": "https://registry.npmjs.org/"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "c7bbe5a9bad35399cce7fd9da5d1935d3be29ce8"
|
|
40
40
|
}
|