synstate 6.2.1 → 7.0.1

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.
Files changed (109) hide show
  1. package/dist/core/class/child-observable-class.d.mts +16 -14
  2. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  3. package/dist/core/class/child-observable-class.mjs +39 -12
  4. package/dist/core/class/child-observable-class.mjs.map +1 -1
  5. package/dist/core/class/create-child-observable.d.mts +1 -1
  6. package/dist/core/class/create-child-observable.d.mts.map +1 -1
  7. package/dist/core/class/create-child-observable.mjs +6 -8
  8. package/dist/core/class/create-child-observable.mjs.map +1 -1
  9. package/dist/core/class/create-root-observable.d.mts +1 -1
  10. package/dist/core/class/create-root-observable.d.mts.map +1 -1
  11. package/dist/core/class/create-root-observable.mjs +1 -5
  12. package/dist/core/class/create-root-observable.mjs.map +1 -1
  13. package/dist/core/class/propagation-state.mjs +1 -1
  14. package/dist/core/class/propagation-state.mjs.map +1 -1
  15. package/dist/core/combine/derive.d.mts.map +1 -1
  16. package/dist/core/combine/derive.mjs +2 -1
  17. package/dist/core/combine/derive.mjs.map +1 -1
  18. package/dist/core/combine/zip.d.mts.map +1 -1
  19. package/dist/core/combine/zip.mjs +5 -2
  20. package/dist/core/combine/zip.mjs.map +1 -1
  21. package/dist/core/create/counter.mjs +2 -2
  22. package/dist/core/create/counter.mjs.map +1 -1
  23. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  24. package/dist/core/create/from-abortable-promise.mjs +10 -3
  25. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  26. package/dist/core/create/from-promise.d.mts.map +1 -1
  27. package/dist/core/create/from-promise.mjs +10 -3
  28. package/dist/core/create/from-promise.mjs.map +1 -1
  29. package/dist/core/create/source.d.mts.map +1 -1
  30. package/dist/core/create/source.mjs +2 -1
  31. package/dist/core/create/source.mjs.map +1 -1
  32. package/dist/core/operators/filter.d.mts +1 -1
  33. package/dist/core/operators/filter.d.mts.map +1 -1
  34. package/dist/core/operators/filter.mjs +2 -3
  35. package/dist/core/operators/filter.mjs.map +1 -1
  36. package/dist/core/operators/merge-map.d.mts +6 -2
  37. package/dist/core/operators/merge-map.d.mts.map +1 -1
  38. package/dist/core/operators/merge-map.mjs +47 -16
  39. package/dist/core/operators/merge-map.mjs.map +1 -1
  40. package/dist/core/operators/skip-while.d.mts +1 -1
  41. package/dist/core/operators/skip-while.d.mts.map +1 -1
  42. package/dist/core/operators/skip-while.mjs +9 -6
  43. package/dist/core/operators/skip-while.mjs.map +1 -1
  44. package/dist/core/operators/switch-map.d.mts +4 -0
  45. package/dist/core/operators/switch-map.d.mts.map +1 -1
  46. package/dist/core/operators/switch-map.mjs +16 -6
  47. package/dist/core/operators/switch-map.mjs.map +1 -1
  48. package/dist/core/operators/take-while.d.mts +2 -2
  49. package/dist/core/operators/take-while.d.mts.map +1 -1
  50. package/dist/core/operators/take-while.mjs +10 -8
  51. package/dist/core/operators/take-while.mjs.map +1 -1
  52. package/dist/core/operators/throttle.mjs +3 -2
  53. package/dist/core/operators/throttle.mjs.map +1 -1
  54. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  55. package/dist/core/operators/with-buffered-from.mjs +13 -3
  56. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  57. package/dist/core/predefined/operators/attach-index.d.mts +1 -1
  58. package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
  59. package/dist/core/predefined/operators/attach-index.mjs +2 -3
  60. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  61. package/dist/core/predefined/operators/skip.d.mts.map +1 -1
  62. package/dist/core/predefined/operators/skip.mjs +2 -2
  63. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  64. package/dist/core/utils/index.d.mts +2 -0
  65. package/dist/core/utils/index.d.mts.map +1 -1
  66. package/dist/core/utils/index.mjs +2 -0
  67. package/dist/core/utils/index.mjs.map +1 -1
  68. package/dist/core/utils/is-development-build.d.mts +15 -0
  69. package/dist/core/utils/is-development-build.d.mts.map +1 -0
  70. package/dist/core/utils/is-development-build.mjs +23 -0
  71. package/dist/core/utils/is-development-build.mjs.map +1 -0
  72. package/dist/core/utils/rethrow-out-of-promise.d.mts +10 -0
  73. package/dist/core/utils/rethrow-out-of-promise.d.mts.map +1 -0
  74. package/dist/core/utils/rethrow-out-of-promise.mjs +17 -0
  75. package/dist/core/utils/rethrow-out-of-promise.mjs.map +1 -0
  76. package/package.json +12 -11
  77. package/src/core/class/child-observable-class.mts +53 -17
  78. package/src/core/class/circular-dependency-comparison.test.mts +36 -40
  79. package/src/core/class/circular-dependency.test.mts +6 -37
  80. package/src/core/class/create-child-observable.mts +8 -5
  81. package/src/core/class/create-root-observable.mts +2 -1
  82. package/src/core/class/propagation-state.mts +1 -1
  83. package/src/core/class/write-during-propagation.test.mts +75 -4
  84. package/src/core/combine/derive.mts +2 -1
  85. package/src/core/combine/zip.mts +5 -2
  86. package/src/core/create/counter.mts +2 -2
  87. package/src/core/create/from-abortable-promise.mts +33 -23
  88. package/src/core/create/from-promise.mts +28 -18
  89. package/src/core/create/from-promise.test.mts +97 -0
  90. package/src/core/create/source.mts +2 -1
  91. package/src/core/operators/filter.mts +2 -3
  92. package/src/core/operators/flat-map-initial-value.test.mts +269 -0
  93. package/src/core/operators/flat-map-sync-inner.test.mts +4 -2
  94. package/src/core/operators/inner-ownership.test.mts +145 -2
  95. package/src/core/operators/merge-map.mts +56 -26
  96. package/src/core/operators/skip-while.mts +12 -8
  97. package/src/core/operators/skip-while.test.mts +59 -0
  98. package/src/core/operators/switch-map.mts +21 -10
  99. package/src/core/operators/take-while.mts +15 -17
  100. package/src/core/operators/take-while.test.mts +51 -0
  101. package/src/core/operators/throttle.mts +4 -3
  102. package/src/core/operators/with-buffered-from.mts +16 -3
  103. package/src/core/operators/with-buffered-from.test.mts +27 -0
  104. package/src/core/predefined/operators/attach-index.mts +2 -3
  105. package/src/core/predefined/operators/skip.mts +2 -2
  106. package/src/core/utils/index.mts +2 -0
  107. package/src/core/utils/is-development-build.mts +32 -0
  108. package/src/core/utils/is-development-build.test.mts +44 -0
  109. package/src/core/utils/rethrow-out-of-promise.mts +16 -0
@@ -1,4 +1,4 @@
1
- import { PositiveSafeInt } from 'ts-data-forge';
1
+ import { isPositiveSafeInt } from 'ts-data-forge';
2
2
  import type { PositiveSafeIntWithSmallInt } from 'ts-type-forge';
3
3
  import { skipWhile } from '../../operators/index.mjs';
4
4
  import type { DropInitialValueOperator } from '../../types/index.mjs';
@@ -53,6 +53,6 @@ import type { DropInitialValueOperator } from '../../types/index.mjs';
53
53
  export const skip = <A,>(
54
54
  n: PositiveSafeIntWithSmallInt,
55
55
  ): DropInitialValueOperator<A, A> =>
56
- !PositiveSafeInt.is(n) ? idFn : skipWhile((_, index) => index + 1 <= n);
56
+ !isPositiveSafeInt(n) ? idFn : skipWhile((_, index) => index + 1 <= n);
57
57
 
58
58
  const idFn = <T,>(value: T): T => value;
@@ -1,5 +1,7 @@
1
1
  export * from './current-scope.mjs';
2
2
  export * from './id-maker.mjs';
3
+ export * from './is-development-build.mjs';
3
4
  export * from './max-depth.mjs';
4
5
  export * from './observable-brand.mjs';
5
6
  export * from './observable-utils.mjs';
7
+ export * from './rethrow-out-of-promise.mjs';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Whether this is a development build: `NODE_ENV` is not `production`.
3
+ *
4
+ * `process.env.NODE_ENV` is written out in full because that is the expression
5
+ * bundlers (Vite, webpack, esbuild) replace, in the application's build and in
6
+ * a pre-bundled dependency alike: with the string `"development"` in a
7
+ * development build and `"production"` in a production one. Where nothing
8
+ * replaces it and there is no `process` (an unbundled module in a browser),
9
+ * reading it throws and the answer is `false`.
10
+ *
11
+ * synstate-router reads it the same way
12
+ * (`libs/synstate-router/src/internal/is-development.mts`).
13
+ */
14
+ export const isDevelopmentBuild = (): boolean => {
15
+ // @sumi-expect-error exceptions/no-try
16
+ try {
17
+ return process.env.NODE_ENV !== 'production';
18
+ } catch {
19
+ return false;
20
+ }
21
+ };
22
+
23
+ /**
24
+ * The one part of Node.js's `process` read here, declared in this module so
25
+ * that the dot form type-checks without the Node.js types (which this package's
26
+ * Sumi check does not load) and without the bracket form their index signature
27
+ * asks for, which bundlers do not replace. `declare` emits nothing:
28
+ * the emitted code reads the global `process`.
29
+ */
30
+ declare const process: Readonly<{
31
+ env: Readonly<{ NODE_ENV?: string | undefined }>;
32
+ }>;
@@ -0,0 +1,44 @@
1
+ // cspell:ignore unstub
2
+ import { isDevelopmentBuild } from './is-development-build.mjs';
3
+
4
+ describe(isDevelopmentBuild, () => {
5
+ test('is true when NODE_ENV is development', () => {
6
+ restoreAfterTest();
7
+
8
+ vi.stubEnv('NODE_ENV', 'development');
9
+
10
+ assert.isTrue(isDevelopmentBuild());
11
+ });
12
+
13
+ test('is true when NODE_ENV is not set', () => {
14
+ restoreAfterTest();
15
+
16
+ vi.stubEnv('NODE_ENV', undefined);
17
+
18
+ assert.isTrue(isDevelopmentBuild());
19
+ });
20
+
21
+ test('is false when NODE_ENV is production', () => {
22
+ restoreAfterTest();
23
+
24
+ vi.stubEnv('NODE_ENV', 'production');
25
+
26
+ assert.isFalse(isDevelopmentBuild());
27
+ });
28
+
29
+ test('is false where there is no process and nothing replaced the expression', () => {
30
+ restoreAfterTest();
31
+
32
+ vi.stubGlobal('process', undefined);
33
+
34
+ assert.isFalse(isDevelopmentBuild());
35
+ });
36
+ });
37
+
38
+ const restoreAfterTest = (): void => {
39
+ onTestFinished(() => {
40
+ vi.unstubAllEnvs();
41
+
42
+ vi.unstubAllGlobals();
43
+ });
44
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Throws `error` again from a task of its own, for a `.catch` after each step
3
+ * of a promise chain that runs subscribers (`fromPromise`): after the step that
4
+ * emits and after the one that completes, so that neither exception replaces
5
+ * the other. A subscriber's exception then surfaces as an uncaught error, as
6
+ * one thrown during an update a timer started does (`debounce`, `timer`),
7
+ * rather than as a rejection or not at all.
8
+ */
9
+ export const rethrowOutOfPromise = (error: unknown): void => {
10
+ setTimeout(() => {
11
+ // The subscriber's own exception, passed on unchanged.
12
+ // @sumi-expect-error exceptions/no-throw
13
+ // eslint-disable-next-line @typescript-eslint/only-throw-error -- the subscriber's own exception, passed on unchanged
14
+ throw error;
15
+ }, 0);
16
+ };