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 CHANGED
@@ -235,14 +235,7 @@ var findClosestStoreWithAtomInitialized = (atom, data) => {
235
235
  return findClosestStoreWithAtomInitialized(atom, data.parent);
236
236
  };
237
237
 
238
- // src/lib/initSelector.ts
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
- class CircularDependencyError extends Error {
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 CircularDependencyError;
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 CircularDependencyError)
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, parentGet) => {
635
+ var captureScopedTransaction = (scopedData, parentGetFromTxnOrData) => {
618
636
  let txn;
619
637
  transaction((scopedTxn) => {
620
638
  txn = scopedTxn;
621
- }, scopedData, false, parentGet);
639
+ }, scopedData, false, parentGetFromTxnOrData);
622
640
  return txn;
623
641
  };
624
- var transaction = (callback, data, autoCommit = true, parentScopeGet) => {
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
- if (txnAtomMap.has(state)) {
633
- return txnAtomMap.get(state);
634
- } else if (parentScopeGet) {
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, txnGet);
739
+ scopedTransactions[scopeId] = captureScopedTransaction(scopedData, getFromTxnOrData);
713
740
  }
714
741
  return callback2(scopedTransactions[scopeId]);
715
742
  } else {
@@ -0,0 +1,5 @@
1
+ import { SelectorEvaluationError } from "./SelectorEvaluationError";
2
+ export declare class SelectorCircularDependencyError extends SelectorEvaluationError {
3
+ constructor();
4
+ get message(): string;
5
+ }
@@ -0,0 +1,7 @@
1
+ import type { Selector } from "../types/Selector";
2
+ export declare class SelectorEvaluationError extends Error {
3
+ selectors: any[];
4
+ constructor(cause?: any);
5
+ track(selector: Selector<any>): void;
6
+ get message(): string;
7
+ }
@@ -0,0 +1,2 @@
1
+ import type { Selector } from "../../types/Selector";
2
+ export declare const generateSelectorTrace: (selectors: Selector[]) => string;
@@ -1,4 +1,8 @@
1
- import type { GetValue } from "../types/GetValue";
1
+ import type { Atom } from "../types/Atom";
2
2
  import type { StoreData } from "../types/StoreData";
3
3
  import type { TransactionFn } from "../types/TransactionFn";
4
- export declare const transaction: (callback: TransactionFn, data: StoreData, autoCommit?: boolean, parentScopeGet?: GetValue) => any;
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.60",
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": "68285bc25279979283ccf0e75e91248a15445dca"
39
+ "gitHead": "c7bbe5a9bad35399cce7fd9da5d1935d3be29ce8"
40
40
  }