@signaltree/core 3.1.0 → 4.0.2

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 (101) hide show
  1. package/package.json +7 -2
  2. package/src/enhancers/batching/index.d.ts +0 -1
  3. package/src/enhancers/batching/index.js +0 -1
  4. package/src/enhancers/batching/jest.config.d.ts +0 -15
  5. package/src/enhancers/batching/jest.config.js +0 -21
  6. package/src/enhancers/batching/lib/batching.d.ts +0 -16
  7. package/src/enhancers/batching/lib/batching.js +0 -155
  8. package/src/enhancers/batching/test-setup.d.ts +0 -1
  9. package/src/enhancers/batching/test-setup.js +0 -5
  10. package/src/enhancers/computed/index.d.ts +0 -1
  11. package/src/enhancers/computed/index.js +0 -1
  12. package/src/enhancers/computed/jest.config.d.ts +0 -15
  13. package/src/enhancers/computed/jest.config.js +0 -21
  14. package/src/enhancers/computed/lib/computed.d.ts +0 -12
  15. package/src/enhancers/computed/lib/computed.js +0 -18
  16. package/src/enhancers/devtools/index.d.ts +0 -1
  17. package/src/enhancers/devtools/index.js +0 -1
  18. package/src/enhancers/devtools/jest.config.d.ts +0 -15
  19. package/src/enhancers/devtools/jest.config.js +0 -21
  20. package/src/enhancers/devtools/lib/devtools.d.ts +0 -77
  21. package/src/enhancers/devtools/lib/devtools.js +0 -278
  22. package/src/enhancers/devtools/test-setup.d.ts +0 -1
  23. package/src/enhancers/devtools/test-setup.js +0 -5
  24. package/src/enhancers/entities/index.d.ts +0 -1
  25. package/src/enhancers/entities/index.js +0 -1
  26. package/src/enhancers/entities/jest.config.d.ts +0 -15
  27. package/src/enhancers/entities/jest.config.js +0 -21
  28. package/src/enhancers/entities/lib/entities.d.ts +0 -22
  29. package/src/enhancers/entities/lib/entities.js +0 -110
  30. package/src/enhancers/entities/test-setup.d.ts +0 -1
  31. package/src/enhancers/entities/test-setup.js +0 -5
  32. package/src/enhancers/index.d.ts +0 -3
  33. package/src/enhancers/index.js +0 -84
  34. package/src/enhancers/memoization/index.d.ts +0 -1
  35. package/src/enhancers/memoization/index.js +0 -1
  36. package/src/enhancers/memoization/jest.config.d.ts +0 -15
  37. package/src/enhancers/memoization/jest.config.js +0 -21
  38. package/src/enhancers/memoization/lib/memoization.d.ts +0 -65
  39. package/src/enhancers/memoization/lib/memoization.js +0 -391
  40. package/src/enhancers/memoization/test-setup.d.ts +0 -1
  41. package/src/enhancers/memoization/test-setup.js +0 -5
  42. package/src/enhancers/middleware/index.d.ts +0 -2
  43. package/src/enhancers/middleware/index.js +0 -2
  44. package/src/enhancers/middleware/jest.config.d.ts +0 -15
  45. package/src/enhancers/middleware/jest.config.js +0 -21
  46. package/src/enhancers/middleware/lib/async-helpers.d.ts +0 -8
  47. package/src/enhancers/middleware/lib/async-helpers.js +0 -85
  48. package/src/enhancers/middleware/lib/middleware.d.ts +0 -11
  49. package/src/enhancers/middleware/lib/middleware.js +0 -179
  50. package/src/enhancers/middleware/test-setup.d.ts +0 -1
  51. package/src/enhancers/middleware/test-setup.js +0 -5
  52. package/src/enhancers/presets/index.d.ts +0 -1
  53. package/src/enhancers/presets/index.js +0 -1
  54. package/src/enhancers/presets/jest.config.d.ts +0 -15
  55. package/src/enhancers/presets/jest.config.js +0 -21
  56. package/src/enhancers/presets/lib/presets.d.ts +0 -11
  57. package/src/enhancers/presets/lib/presets.js +0 -102
  58. package/src/enhancers/presets/test-setup.d.ts +0 -1
  59. package/src/enhancers/presets/test-setup.js +0 -5
  60. package/src/enhancers/serialization/constants.d.ts +0 -14
  61. package/src/enhancers/serialization/constants.js +0 -14
  62. package/src/enhancers/serialization/index.d.ts +0 -2
  63. package/src/enhancers/serialization/index.js +0 -2
  64. package/src/enhancers/serialization/jest.config.d.ts +0 -15
  65. package/src/enhancers/serialization/jest.config.js +0 -21
  66. package/src/enhancers/serialization/lib/serialization.d.ts +0 -59
  67. package/src/enhancers/serialization/lib/serialization.js +0 -668
  68. package/src/enhancers/serialization/test-setup.d.ts +0 -1
  69. package/src/enhancers/serialization/test-setup.js +0 -5
  70. package/src/enhancers/time-travel/index.d.ts +0 -1
  71. package/src/enhancers/time-travel/index.js +0 -1
  72. package/src/enhancers/time-travel/jest.config.d.ts +0 -15
  73. package/src/enhancers/time-travel/jest.config.js +0 -21
  74. package/src/enhancers/time-travel/lib/time-travel.d.ts +0 -36
  75. package/src/enhancers/time-travel/lib/time-travel.js +0 -192
  76. package/src/enhancers/time-travel/lib/utils.d.ts +0 -1
  77. package/src/enhancers/time-travel/lib/utils.js +0 -1
  78. package/src/enhancers/time-travel/test-setup.d.ts +0 -1
  79. package/src/enhancers/time-travel/test-setup.js +0 -5
  80. package/src/enhancers/types.d.ts +0 -105
  81. package/src/enhancers/types.js +0 -0
  82. package/src/index.d.ts +0 -16
  83. package/src/index.js +0 -15
  84. package/src/lib/constants.d.ts +0 -42
  85. package/src/lib/constants.js +0 -61
  86. package/src/lib/memory/memory-manager.d.ts +0 -30
  87. package/src/lib/memory/memory-manager.js +0 -166
  88. package/src/lib/performance/diff-engine.d.ts +0 -33
  89. package/src/lib/performance/diff-engine.js +0 -156
  90. package/src/lib/performance/path-index.d.ts +0 -25
  91. package/src/lib/performance/path-index.js +0 -154
  92. package/src/lib/performance/update-engine.d.ts +0 -32
  93. package/src/lib/performance/update-engine.js +0 -193
  94. package/src/lib/security/security-validator.d.ts +0 -33
  95. package/src/lib/security/security-validator.js +0 -139
  96. package/src/lib/signal-tree.d.ts +0 -8
  97. package/src/lib/signal-tree.js +0 -665
  98. package/src/lib/types.d.ts +0 -164
  99. package/src/lib/types.js +0 -9
  100. package/src/lib/utils.d.ts +0 -27
  101. package/src/lib/utils.js +0 -286
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaltree/core",
3
- "version": "3.1.0",
3
+ "version": "4.0.2",
4
4
  "description": "Lightweight, type-safe signal-based state management for Angular. Core package providing hierarchical signal trees, basic entity management, and async actions.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -66,5 +66,10 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@signaltree/shared": "workspace:*"
69
- }
69
+ },
70
+ "files": [
71
+ "dist",
72
+ "README.md",
73
+ "package.json"
74
+ ]
70
75
  }
@@ -1 +0,0 @@
1
- export * from './lib/batching';
@@ -1 +0,0 @@
1
- export * from './lib/batching';
@@ -1,15 +0,0 @@
1
- declare const _default: {
2
- displayName: string;
3
- preset: string;
4
- setupFilesAfterEnv: string[];
5
- coverageDirectory: string;
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': (string | {
8
- tsconfig: string;
9
- stringifyContentPathRegex: string;
10
- })[];
11
- };
12
- transformIgnorePatterns: string[];
13
- snapshotSerializers: string[];
14
- };
15
- export default _default;
@@ -1,21 +0,0 @@
1
- export default {
2
- displayName: 'batching',
3
- preset: '../../../../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/test-setup.ts'],
5
- coverageDirectory: '../../../../../coverage/packages/core/enhancers/batching',
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': [
8
- 'jest-preset-angular',
9
- {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
11
- stringifyContentPathRegex: '\\.(html|svg)$',
12
- },
13
- ],
14
- },
15
- transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
- snapshotSerializers: [
17
- 'jest-preset-angular/build/serializers/no-ng-attributes',
18
- 'jest-preset-angular/build/serializers/ng-snapshot',
19
- 'jest-preset-angular/build/serializers/html-comment',
20
- ],
21
- };
@@ -1,16 +0,0 @@
1
- import type { SignalTree } from '../../../lib/types';
2
- interface BatchingConfig {
3
- enabled?: boolean;
4
- maxBatchSize?: number;
5
- autoFlushDelay?: number;
6
- batchTimeoutMs?: number;
7
- }
8
- interface BatchingSignalTree<T> extends SignalTree<T> {
9
- batchUpdate(updater: (current: T) => Partial<T>): void;
10
- }
11
- export declare function withBatching<T>(config?: BatchingConfig): (tree: SignalTree<T>) => BatchingSignalTree<T>;
12
- export declare function withHighPerformanceBatching<T>(): (tree: SignalTree<T>) => BatchingSignalTree<T>;
13
- export declare function flushBatchedUpdates(): void;
14
- export declare function hasPendingUpdates(): boolean;
15
- export declare function getBatchQueueSize(): number;
16
- export {};
@@ -1,155 +0,0 @@
1
- import { parsePath } from '@signaltree/shared';
2
- import { isNodeAccessor } from '../../../lib/utils';
3
- let updateQueue = [];
4
- let isUpdating = false;
5
- let flushTimeoutId;
6
- let currentBatchingConfig = {};
7
- function addToQueue(update, config = currentBatchingConfig) {
8
- const maxSize = config.maxBatchSize ?? 100;
9
- if (update.path) {
10
- updateQueue = updateQueue.filter((existing) => existing.path !== update.path);
11
- }
12
- updateQueue.push(update);
13
- if (updateQueue.length > maxSize) {
14
- flushUpdates();
15
- return true;
16
- }
17
- scheduleFlush(config);
18
- return false;
19
- }
20
- function scheduleFlush(config) {
21
- if (flushTimeoutId !== undefined) {
22
- clearTimeout(flushTimeoutId);
23
- }
24
- const delay = config.autoFlushDelay ?? 16;
25
- flushTimeoutId = setTimeout(() => {
26
- flushUpdates();
27
- }, delay);
28
- }
29
- function flushUpdates() {
30
- if (isUpdating)
31
- return;
32
- let queue;
33
- do {
34
- if (updateQueue.length === 0)
35
- return;
36
- isUpdating = true;
37
- queue = updateQueue;
38
- updateQueue = [];
39
- if (flushTimeoutId !== undefined) {
40
- clearTimeout(flushTimeoutId);
41
- flushTimeoutId = undefined;
42
- }
43
- queue.sort((a, b) => (b.depth ?? 0) - (a.depth ?? 0));
44
- try {
45
- queue.forEach(({ fn }) => fn());
46
- }
47
- finally {
48
- isUpdating = false;
49
- }
50
- } while (updateQueue.length > 0);
51
- }
52
- function batchUpdates(fn, path) {
53
- const startTime = performance.now();
54
- const depth = path ? parsePath(path).length : 0;
55
- const update = { fn, startTime, depth, path };
56
- const wasFlushed = addToQueue(update, currentBatchingConfig);
57
- if (!wasFlushed) {
58
- const isTimedOut = currentBatchingConfig.batchTimeoutMs &&
59
- updateQueue.length > 0 &&
60
- startTime - updateQueue[0].startTime >=
61
- currentBatchingConfig.batchTimeoutMs;
62
- if (isTimedOut) {
63
- flushUpdates();
64
- }
65
- else if (!isUpdating && updateQueue.length > 0) {
66
- queueMicrotask(() => {
67
- flushUpdates();
68
- });
69
- }
70
- }
71
- }
72
- export function withBatching(config = {}) {
73
- const { enabled = true } = config;
74
- currentBatchingConfig = { ...currentBatchingConfig, ...config };
75
- return (tree) => {
76
- if (!enabled) {
77
- return tree;
78
- }
79
- const originalTreeCall = tree.bind(tree);
80
- const enhancedTree = function (...args) {
81
- if (args.length === 0) {
82
- return originalTreeCall();
83
- }
84
- else {
85
- batchUpdates(() => {
86
- if (args.length === 1) {
87
- const arg = args[0];
88
- if (typeof arg === 'function') {
89
- originalTreeCall(arg);
90
- }
91
- else {
92
- originalTreeCall(arg);
93
- }
94
- }
95
- });
96
- }
97
- };
98
- Object.setPrototypeOf(enhancedTree, Object.getPrototypeOf(tree));
99
- Object.assign(enhancedTree, tree);
100
- if ('state' in tree) {
101
- Object.defineProperty(enhancedTree, 'state', {
102
- value: tree.state,
103
- enumerable: false,
104
- configurable: true,
105
- });
106
- }
107
- if ('$' in tree) {
108
- Object.defineProperty(enhancedTree, '$', {
109
- value: tree['$'],
110
- enumerable: false,
111
- configurable: true,
112
- });
113
- }
114
- enhancedTree.batchUpdate = (updater) => {
115
- batchUpdates(() => {
116
- const current = originalTreeCall();
117
- const updates = updater(current);
118
- Object.entries(updates).forEach(([key, value]) => {
119
- const property = enhancedTree.state[key];
120
- if (property && 'set' in property) {
121
- property.set(value);
122
- }
123
- else if (isNodeAccessor(property)) {
124
- property(value);
125
- }
126
- });
127
- });
128
- };
129
- return enhancedTree;
130
- };
131
- }
132
- export function withHighPerformanceBatching() {
133
- return withBatching({
134
- enabled: true,
135
- maxBatchSize: 200,
136
- batchTimeoutMs: 0,
137
- });
138
- }
139
- export function flushBatchedUpdates() {
140
- if (updateQueue.length > 0) {
141
- const queue = updateQueue.slice();
142
- updateQueue = [];
143
- isUpdating = false;
144
- queue.sort((a, b) => (b.depth ?? 0) - (a.depth ?? 0));
145
- queue.forEach(({ fn }) => {
146
- fn();
147
- });
148
- }
149
- }
150
- export function hasPendingUpdates() {
151
- return updateQueue.length > 0;
152
- }
153
- export function getBatchQueueSize() {
154
- return updateQueue.length;
155
- }
@@ -1 +0,0 @@
1
- export {};
@@ -1,5 +0,0 @@
1
- import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone';
2
- setupZoneTestEnv({
3
- errorOnUnknownElements: true,
4
- errorOnUnknownProperties: true,
5
- });
@@ -1 +0,0 @@
1
- export * from './lib/computed';
@@ -1 +0,0 @@
1
- export * from './lib/computed';
@@ -1,15 +0,0 @@
1
- declare const _default: {
2
- displayName: string;
3
- preset: string;
4
- setupFilesAfterEnv: string[];
5
- coverageDirectory: string;
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': (string | {
8
- tsconfig: string;
9
- stringifyContentPathRegex: string;
10
- })[];
11
- };
12
- transformIgnorePatterns: string[];
13
- snapshotSerializers: string[];
14
- };
15
- export default _default;
@@ -1,21 +0,0 @@
1
- export default {
2
- displayName: 'computed',
3
- preset: '../../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
- coverageDirectory: '../../../coverage/packages/core/enhancers/computed',
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': [
8
- 'jest-preset-angular',
9
- {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
11
- stringifyContentPathRegex: '\\.(html|svg)$',
12
- },
13
- ],
14
- },
15
- transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
- snapshotSerializers: [
17
- 'jest-preset-angular/build/serializers/no-ng-attributes',
18
- 'jest-preset-angular/build/serializers/ng-snapshot',
19
- 'jest-preset-angular/build/serializers/html-comment',
20
- ],
21
- };
@@ -1,12 +0,0 @@
1
- import { Signal } from '@angular/core';
2
- import type { TreeNode, SignalTree } from '../../../lib/types';
3
- export interface ComputedConfig {
4
- lazy?: boolean;
5
- memoize?: boolean;
6
- }
7
- export type ComputedSignal<T> = Signal<T>;
8
- export interface ComputedSignalTree<T extends Record<string, unknown>> extends SignalTree<T> {
9
- computed<U>(computeFn: (tree: TreeNode<T>) => U): ComputedSignal<U>;
10
- }
11
- export declare function computedEnhancer(config?: ComputedConfig): import("../../../lib/types").EnhancerWithMeta<SignalTree<Record<string, unknown>>, ComputedSignalTree<Record<string, unknown>>>;
12
- export declare function createComputed<T>(dependencies: readonly Signal<unknown>[], computeFn: () => T): ComputedSignal<T>;
@@ -1,18 +0,0 @@
1
- import { computed } from '@angular/core';
2
- import { createEnhancer } from '../..';
3
- export function computedEnhancer(config = {}) {
4
- return createEnhancer({
5
- name: 'computed',
6
- provides: ['computed'],
7
- requires: [],
8
- }, (tree) => {
9
- const computedTree = tree;
10
- computedTree.computed = function (computeFn) {
11
- return computed(() => computeFn(tree.state));
12
- };
13
- return computedTree;
14
- });
15
- }
16
- export function createComputed(dependencies, computeFn) {
17
- return computed(computeFn);
18
- }
@@ -1 +0,0 @@
1
- export * from './lib/devtools';
@@ -1 +0,0 @@
1
- export * from './lib/devtools';
@@ -1,15 +0,0 @@
1
- declare const _default: {
2
- displayName: string;
3
- preset: string;
4
- setupFilesAfterEnv: string[];
5
- coverageDirectory: string;
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': (string | {
8
- tsconfig: string;
9
- stringifyContentPathRegex: string;
10
- })[];
11
- };
12
- transformIgnorePatterns: string[];
13
- snapshotSerializers: string[];
14
- };
15
- export default _default;
@@ -1,21 +0,0 @@
1
- export default {
2
- displayName: 'devtools',
3
- preset: '../../../jest.preset.js',
4
- setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
5
- coverageDirectory: '../../../coverage/packages/core/enhancers/devtools',
6
- transform: {
7
- '^.+\\.(ts|mjs|js|html)$': [
8
- 'jest-preset-angular',
9
- {
10
- tsconfig: '<rootDir>/tsconfig.spec.json',
11
- stringifyContentPathRegex: '\\.(html|svg)$',
12
- },
13
- ],
14
- },
15
- transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
16
- snapshotSerializers: [
17
- 'jest-preset-angular/build/serializers/no-ng-attributes',
18
- 'jest-preset-angular/build/serializers/ng-snapshot',
19
- 'jest-preset-angular/build/serializers/html-comment',
20
- ],
21
- };
@@ -1,77 +0,0 @@
1
- import { Signal } from '@angular/core';
2
- import type { SignalTree } from '../../../lib/types';
3
- export interface ModuleMetadata {
4
- name: string;
5
- methods: string[];
6
- addedAt: Date;
7
- lastActivity: Date;
8
- operationCount: number;
9
- averageExecutionTime: number;
10
- errorCount: number;
11
- }
12
- export interface ModularPerformanceMetrics {
13
- totalUpdates: number;
14
- moduleUpdates: Record<string, number>;
15
- modulePerformance: Record<string, number>;
16
- compositionChain: string[];
17
- signalGrowth: Record<string, number>;
18
- memoryDelta: Record<string, number>;
19
- moduleCacheStats: Record<string, {
20
- hits: number;
21
- misses: number;
22
- }>;
23
- }
24
- export interface ModuleActivityTracker {
25
- trackMethodCall: (module: string, method: string, duration: number) => void;
26
- trackError: (module: string, error: Error, context?: string) => void;
27
- getModuleActivity: (module: string) => ModuleMetadata | undefined;
28
- getAllModules: () => ModuleMetadata[];
29
- }
30
- export interface CompositionLogger {
31
- logComposition: (modules: string[], action: 'with' | 'enhance') => void;
32
- logMethodExecution: (module: string, method: string, args: unknown[], result: unknown) => void;
33
- logStateChange: (module: string, path: string, oldValue: unknown, newValue: unknown) => void;
34
- logPerformanceWarning: (module: string, operation: string, duration: number, threshold: number) => void;
35
- exportLogs: () => Array<{
36
- timestamp: Date;
37
- module: string;
38
- type: 'composition' | 'method' | 'state' | 'performance';
39
- data: unknown;
40
- }>;
41
- }
42
- export interface ModularDevToolsInterface<T = unknown> {
43
- activityTracker: ModuleActivityTracker;
44
- logger: CompositionLogger;
45
- metrics: Signal<ModularPerformanceMetrics>;
46
- trackComposition: (modules: string[]) => void;
47
- startModuleProfiling: (module: string) => string;
48
- endModuleProfiling: (profileId: string) => void;
49
- connectDevTools: (treeName: string) => void;
50
- exportDebugSession: () => {
51
- metrics: ModularPerformanceMetrics;
52
- modules: ModuleMetadata[];
53
- logs: Array<unknown>;
54
- compositionHistory: Array<{
55
- timestamp: Date;
56
- chain: string[];
57
- }>;
58
- };
59
- }
60
- export declare function withDevTools<T>(config?: {
61
- enabled?: boolean;
62
- treeName?: string;
63
- enableBrowserDevTools?: boolean;
64
- enableLogging?: boolean;
65
- performanceThreshold?: number;
66
- }): (tree: SignalTree<T>) => SignalTree<T> & {
67
- __devTools: ModularDevToolsInterface<T>;
68
- };
69
- export declare function enableDevTools<T>(treeName?: string): (tree: SignalTree<T>) => SignalTree<T> & {
70
- __devTools: ModularDevToolsInterface<T>;
71
- };
72
- export declare function withFullDevTools<T>(treeName?: string): (tree: SignalTree<T>) => SignalTree<T> & {
73
- __devTools: ModularDevToolsInterface<T>;
74
- };
75
- export declare function withProductionDevTools<T>(): (tree: SignalTree<T>) => SignalTree<T> & {
76
- __devTools: ModularDevToolsInterface<T>;
77
- };