@ibyar/expressions 2.2.1 → 2.4.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibyar/expressions",
3
- "version": "2.2.1",
3
+ "version": "2.4.0",
4
4
  "description": "Aurora expression, an template expression and evaluation, An 100% spec compliant ES2022 JavaScript toolchain,",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/ibyar/aurora/tree/dev/packages/expressions",
@@ -36,11 +36,11 @@
36
36
  "access": "public"
37
37
  },
38
38
  "dependencies": {
39
- "@ibyar/decorators": "^2.2.1",
40
- "tslib": "^2.6.3"
39
+ "@ibyar/decorators": "^2.4.0",
40
+ "tslib": "^2.7.0"
41
41
  },
42
42
  "devDependencies": {
43
- "typescript": "^5.5.2"
43
+ "typescript": "^5.6.2"
44
44
  },
45
45
  "scripts": {
46
46
  "build": "tsc --build --verbose",
@@ -65,5 +65,5 @@
65
65
  "backend",
66
66
  "front-end"
67
67
  ],
68
- "gitHead": "6c3b1c8d19faf00022c58ba2b893f4bb56147600"
68
+ "gitHead": "53497612809ca931456ce404746d2fea7ff92b84"
69
69
  }
@@ -1 +0,0 @@
1
- //# sourceMappingURL=variable.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variable.d.ts","sourceRoot":"","sources":["../../../src/expressions/scope/variable.ts"],"names":[],"mappings":""}
package/scope/variable.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=variable.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variable.js","sourceRoot":"","sources":["../../../src/expressions/scope/variable.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -1,66 +0,0 @@
1
- import { ReactiveScope } from './scope.js';
2
- type CleanupFn = () => void;
3
- export declare class SignalScope extends ReactiveScope<Array<any>> {
4
- private state;
5
- private watch;
6
- constructor();
7
- createSignal<T>(initValue: T): Signal<T>;
8
- createSignalFn<T>(initValue: T): {
9
- (): T;
10
- set(value: T): void;
11
- update(updateFn: (value: T) => T): void;
12
- };
13
- createLazy<T>(updateFn: () => T): Lazy<T>;
14
- createLazyFn<T>(updateFn: () => T): () => T;
15
- createComputed<T>(updateFn: () => T): Computed<T>;
16
- createComputedFn<T>(updateFn: () => T): () => T;
17
- createEffect(effectFn: (onCleanup?: CleanupFn) => void): {
18
- destroy(): void;
19
- };
20
- watchState(): void;
21
- untrack(): void;
22
- observeIndex(index: number): void;
23
- track(): void;
24
- readState(): number[];
25
- observeState(updateFn: () => void): {
26
- [k: string]: import("./scope.js").ScopeSubscription<any[]>;
27
- };
28
- restoreState(): void;
29
- }
30
- export declare abstract class ReactiveNode<T> {
31
- abstract get(): T;
32
- }
33
- declare const SIGNAL: unique symbol;
34
- export interface Reactive<T> {
35
- [SIGNAL]: ReactiveNode<T>;
36
- }
37
- export declare function isReactive<T = any>(value: unknown): value is Reactive<T>;
38
- export declare class Computed<T> extends ReactiveNode<T> {
39
- #private;
40
- static bindFn<T>(instance: Computed<T>): void;
41
- static computed<T>(instance: Computed<T>): () => T;
42
- constructor(scope: SignalScope, index: number, initValue: T);
43
- get(): T;
44
- }
45
- export declare class Lazy<T> extends ReactiveNode<T> {
46
- #private;
47
- static bindFn<T>(instance: Lazy<T>): void;
48
- static lazy<T>(instance: Lazy<T>): () => T;
49
- constructor(scope: SignalScope, index: number, updateFn: () => T);
50
- get(): T;
51
- }
52
- export declare class Signal<T> extends ReactiveNode<T> {
53
- #private;
54
- static bindFn<T>(instance: Signal<T>): void;
55
- static writable<T>(instance: Signal<T>): {
56
- (): T;
57
- set(value: T): void;
58
- update(updateFn: (value: T) => T): void;
59
- };
60
- constructor(scope: SignalScope, index: number, initValue: T);
61
- get(): T;
62
- set(value: T): void;
63
- update(updateFn: (value: T) => T): void;
64
- }
65
- export {};
66
- //# sourceMappingURL=variables.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../../src/expressions/scope/variables.ts"],"names":[],"mappings":"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"}
@@ -1,214 +0,0 @@
1
- import { ReactiveScope } from './scope.js';
2
- function compute(updateFn) {
3
- try {
4
- return updateFn();
5
- }
6
- catch (error) {
7
- return error;
8
- }
9
- }
10
- export class SignalScope extends ReactiveScope {
11
- state = [];
12
- watch = true;
13
- constructor() {
14
- super([]);
15
- }
16
- createSignal(initValue) {
17
- const signal = new Signal(this, this.getContext().length, initValue);
18
- Signal.bindFn(signal);
19
- return signal;
20
- }
21
- createSignalFn(initValue) {
22
- const signal = new Signal(this, this.getContext().length, initValue);
23
- return Signal.writable(signal);
24
- }
25
- createLazy(updateFn) {
26
- const lazy = new Lazy(this, this.getContext().length, updateFn);
27
- Lazy.bindFn(lazy);
28
- return lazy;
29
- }
30
- createLazyFn(updateFn) {
31
- const lazy = new Lazy(this, this.getContext().length, updateFn);
32
- return Lazy.lazy(lazy);
33
- }
34
- createComputed(updateFn) {
35
- const index = this.getContext().length;
36
- this.watchState();
37
- const value = compute(updateFn);
38
- const computed = new Computed(this, index, value);
39
- Computed.bindFn(computed);
40
- const observeComputed = () => {
41
- this.watchState();
42
- const value = compute(updateFn);
43
- const state = this.readState();
44
- this.restoreState();
45
- Object.keys(subscriptions)
46
- .filter(index => !state.includes(+index))
47
- .forEach(index => subscriptions[index].pause());
48
- state.forEach(index => {
49
- subscriptions[index]?.resume();
50
- subscriptions[index] ??= this.subscribe(index, observeComputed);
51
- });
52
- this.set(index, value);
53
- };
54
- const subscriptions = this.observeState(observeComputed);
55
- this.restoreState();
56
- return computed;
57
- }
58
- createComputedFn(updateFn) {
59
- const computed = this.createComputed(updateFn);
60
- return Computed.computed(computed);
61
- }
62
- createEffect(effectFn) {
63
- let cleanupFn;
64
- let isCleanupRegistered = false;
65
- const cleanupRegister = onClean => {
66
- cleanupFn = onClean;
67
- isCleanupRegistered = true;
68
- };
69
- const callback = () => {
70
- isCleanupRegistered = false;
71
- const error = compute(() => effectFn(cleanupRegister));
72
- if (error instanceof Error) {
73
- console.error(error);
74
- }
75
- if (!isCleanupRegistered) {
76
- cleanupFn = undefined;
77
- }
78
- };
79
- this.watchState();
80
- callback();
81
- const observeComputed = () => {
82
- cleanupFn?.();
83
- this.watchState();
84
- callback();
85
- const state = this.readState();
86
- this.restoreState();
87
- Object.keys(subscriptions)
88
- .filter(index => !state.includes(+index))
89
- .forEach(index => subscriptions[index].pause());
90
- state.forEach(index => {
91
- subscriptions[index]?.resume();
92
- subscriptions[index] ??= this.subscribe(index, observeComputed);
93
- });
94
- };
95
- const subscriptions = this.observeState(observeComputed);
96
- this.restoreState();
97
- return {
98
- destroy: () => {
99
- Object.values(subscriptions).forEach(sub => sub.unsubscribe());
100
- cleanupFn?.();
101
- },
102
- };
103
- }
104
- watchState() {
105
- this.state.push([]);
106
- }
107
- untrack() {
108
- this.watch = false;
109
- }
110
- observeIndex(index) {
111
- if (this.watch) {
112
- this.state.at(-1)?.push(index);
113
- }
114
- }
115
- track() {
116
- this.watch = true;
117
- }
118
- readState() {
119
- return this.state.at(-1) ?? [];
120
- }
121
- observeState(updateFn) {
122
- return Object.fromEntries(this.readState().map(index => [index, this.subscribe(index, updateFn)]));
123
- }
124
- restoreState() {
125
- this.state.pop();
126
- }
127
- }
128
- export class ReactiveNode {
129
- }
130
- const SIGNAL = Symbol('Signal');
131
- export function isReactive(value) {
132
- return value[SIGNAL] !== undefined;
133
- }
134
- export class Computed extends ReactiveNode {
135
- static bindFn(instance) {
136
- instance.get = instance.get.bind(instance);
137
- }
138
- static computed(instance) {
139
- const fn = () => instance.get();
140
- fn[SIGNAL] = instance;
141
- return fn;
142
- }
143
- #index;
144
- #scope;
145
- constructor(scope, index, initValue) {
146
- super();
147
- this.#scope = scope;
148
- this.#index = index;
149
- scope.set(index, initValue);
150
- }
151
- get() {
152
- this.#scope.observeIndex(this.#index);
153
- return this.#scope.get(this.#index);
154
- }
155
- }
156
- export class Lazy extends ReactiveNode {
157
- static bindFn(instance) {
158
- instance.get = instance.get.bind(instance);
159
- }
160
- static lazy(instance) {
161
- const fn = () => instance.get();
162
- fn[SIGNAL] = instance;
163
- return fn;
164
- }
165
- #index;
166
- #scope;
167
- #updateFn;
168
- constructor(scope, index, updateFn) {
169
- super();
170
- this.#scope = scope;
171
- this.#index = index;
172
- this.#updateFn = updateFn;
173
- scope.set(index, compute(updateFn));
174
- }
175
- get() {
176
- const value = compute(this.#updateFn);
177
- this.#scope.set(this.#index, value);
178
- this.#scope.observeIndex(this.#index);
179
- return this.#scope.get(this.#index);
180
- }
181
- }
182
- export class Signal extends ReactiveNode {
183
- static bindFn(instance) {
184
- instance.get = instance.get.bind(instance);
185
- instance.set = instance.set.bind(instance);
186
- instance.update = instance.update.bind(instance);
187
- }
188
- static writable(instance) {
189
- const fn = () => instance.get();
190
- fn.set = (value) => instance.set(value);
191
- fn.update = (updateFn) => instance.update(updateFn);
192
- fn[SIGNAL] = instance;
193
- return fn;
194
- }
195
- #index;
196
- #scope;
197
- constructor(scope, index, initValue) {
198
- super();
199
- this.#scope = scope;
200
- this.#index = index;
201
- scope.set(index, initValue);
202
- }
203
- get() {
204
- this.#scope.observeIndex(this.#index);
205
- return this.#scope.get(this.#index);
206
- }
207
- set(value) {
208
- this.#scope.set(this.#index, value);
209
- }
210
- update(updateFn) {
211
- this.set(updateFn(this.get()));
212
- }
213
- }
214
- //# sourceMappingURL=variables.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../../src/expressions/scope/variables.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReactiveScope } from './scope.js';\n\ntype CleanupFn = () => void;\ntype CleanupRegister = (cleanupFn?: CleanupFn) => void;\n\nfunction compute<T>(updateFn: () => T): T | unknown {\n\ttry {\n\t\treturn updateFn();\n\t} catch (error) {\n\t\treturn error;\n\t}\n}\n\nexport class SignalScope extends ReactiveScope<Array<any>> {\n\n\tprivate state: number[][] = [];\n\tprivate watch = true;\n\n\tconstructor() {\n\t\tsuper([]);\n\t}\n\n\tcreateSignal<T>(initValue: T): Signal<T> {\n\t\tconst signal = new Signal<T>(this, this.getContext().length, initValue);\n\t\tSignal.bindFn(signal);\n\t\treturn signal;\n\t}\n\tcreateSignalFn<T>(initValue: T) {\n\t\tconst signal = new Signal<T>(this, this.getContext().length, initValue);\n\t\treturn Signal.writable(signal);\n\t}\n\n\tcreateLazy<T>(updateFn: () => T): Lazy<T> {\n\t\tconst lazy = new Lazy<T>(this, this.getContext().length, updateFn);\n\t\tLazy.bindFn(lazy);\n\t\treturn lazy;\n\t}\n\n\tcreateLazyFn<T>(updateFn: () => T) {\n\t\tconst lazy = new Lazy<T>(this, this.getContext().length, updateFn);\n\t\treturn Lazy.lazy(lazy);\n\t}\n\n\tcreateComputed<T>(updateFn: () => T): Computed<T> {\n\t\tconst index = this.getContext().length;\n\t\tthis.watchState();\n\t\tconst value = compute(updateFn);\n\t\tconst computed = new Computed<T>(this, index, value as T);\n\t\tComputed.bindFn(computed);\n\t\tconst observeComputed = () => {\n\t\t\tthis.watchState();\n\t\t\tconst value = compute(updateFn);\n\t\t\tconst state = this.readState();\n\t\t\tthis.restoreState();\n\t\t\tObject.keys(subscriptions)\n\t\t\t\t.filter(index => !state.includes(+index))\n\t\t\t\t.forEach(index => subscriptions[index].pause());\n\t\t\tstate.forEach(index => {\n\t\t\t\tsubscriptions[index]?.resume();\n\t\t\t\tsubscriptions[index] ??= this.subscribe(index, observeComputed);\n\t\t\t});\n\t\t\tthis.set(index, value);\n\t\t};\n\t\tconst subscriptions = this.observeState(observeComputed);\n\t\tthis.restoreState();\n\t\treturn computed;\n\t}\n\n\tcreateComputedFn<T>(updateFn: () => T) {\n\t\tconst computed = this.createComputed(updateFn);\n\t\treturn Computed.computed(computed);\n\t}\n\n\tcreateEffect(effectFn: (onCleanup?: CleanupFn) => void): { destroy(): void } {\n\t\tlet cleanupFn: (() => void) | undefined;\n\t\tlet isCleanupRegistered = false;\n\t\tconst cleanupRegister: CleanupRegister = onClean => {\n\t\t\tcleanupFn = onClean;\n\t\t\tisCleanupRegistered = true;\n\t\t};\n\t\tconst callback = () => {\n\t\t\tisCleanupRegistered = false;\n\t\t\tconst error = compute(() => effectFn(cleanupRegister)) as any;\n\t\t\tif (error instanceof Error) {\n\t\t\t\tconsole.error(error);\n\t\t\t}\n\t\t\tif (!isCleanupRegistered) {\n\t\t\t\tcleanupFn = undefined;\n\t\t\t}\n\t\t};\n\t\tthis.watchState();\n\t\tcallback();\n\t\tconst observeComputed = () => {\n\t\t\tcleanupFn?.();\n\t\t\tthis.watchState();\n\t\t\tcallback();\n\t\t\tconst state = this.readState();\n\t\t\tthis.restoreState();\n\t\t\tObject.keys(subscriptions)\n\t\t\t\t.filter(index => !state.includes(+index))\n\t\t\t\t.forEach(index => subscriptions[index].pause());\n\t\t\tstate.forEach(index => {\n\t\t\t\tsubscriptions[index]?.resume();\n\t\t\t\tsubscriptions[index] ??= this.subscribe(index, observeComputed);\n\t\t\t});\n\t\t};\n\t\tconst subscriptions = this.observeState(observeComputed);\n\t\tthis.restoreState();\n\t\treturn {\n\t\t\tdestroy: () => {\n\t\t\t\tObject.values(subscriptions).forEach(sub => sub.unsubscribe());\n\t\t\t\tcleanupFn?.();\n\t\t\t},\n\t\t};\n\t}\n\n\twatchState() {\n\t\tthis.state.push([]);\n\t}\n\n\tuntrack() {\n\t\tthis.watch = false;\n\t}\n\n\tobserveIndex(index: number) {\n\t\tif (this.watch) {\n\t\t\tthis.state.at(-1)?.push(index);\n\t\t}\n\t}\n\n\ttrack() {\n\t\tthis.watch = true;\n\t}\n\n\treadState() {\n\t\treturn this.state.at(-1) ?? [];\n\t}\n\n\tobserveState(updateFn: () => void) {\n\t\treturn Object.fromEntries(this.readState().map(index => [index, this.subscribe(index, updateFn)]));\n\t}\n\n\trestoreState() {\n\t\tthis.state.pop();\n\t}\n\n}\n\nexport abstract class ReactiveNode<T> {\n\tabstract get(): T;\n}\n\nconst SIGNAL = Symbol('Signal');\n\nexport interface Reactive<T> {\n\t[SIGNAL]: ReactiveNode<T>;\n}\n\nexport function isReactive<T = any>(value: unknown): value is Reactive<T> {\n\treturn (value as Partial<Reactive<T>>)[SIGNAL] !== undefined;\n}\n\n\nexport class Computed<T> extends ReactiveNode<T> {\n\n\tstatic bindFn<T>(instance: Computed<T>) {\n\t\tinstance.get = instance.get.bind(instance);\n\t}\n\n\tstatic computed<T>(instance: Computed<T>) {\n\t\tconst fn = () => instance.get();\n\t\t(fn as any)[SIGNAL] = instance;\n\t\treturn fn;\n\t}\n\n\t#index: number;\n\t#scope: SignalScope;\n\n\tconstructor(scope: SignalScope, index: number, initValue: T) {\n\t\tsuper();\n\t\tthis.#scope = scope;\n\t\tthis.#index = index;\n\t\tscope.set(index, initValue);\n\t}\n\n\tget(): T {\n\t\tthis.#scope.observeIndex(this.#index);\n\t\treturn this.#scope.get(this.#index);\n\t}\n\n}\n\nexport class Lazy<T> extends ReactiveNode<T> {\n\n\tstatic bindFn<T>(instance: Lazy<T>) {\n\t\tinstance.get = instance.get.bind(instance);\n\t}\n\n\tstatic lazy<T>(instance: Lazy<T>) {\n\t\tconst fn = () => instance.get();\n\t\t(fn as any)[SIGNAL] = instance;\n\t\treturn fn;\n\t}\n\n\t#index: number;\n\t#scope: SignalScope;\n\t#updateFn: () => T;\n\n\tconstructor(scope: SignalScope, index: number, updateFn: () => T) {\n\t\tsuper();\n\t\tthis.#scope = scope;\n\t\tthis.#index = index;\n\t\tthis.#updateFn = updateFn;\n\t\tscope.set(index, compute(updateFn) as T);\n\t}\n\n\toverride get(): T {\n\t\tconst value = compute(this.#updateFn);\n\t\tthis.#scope.set(this.#index, value);\n\t\tthis.#scope.observeIndex(this.#index);\n\t\treturn this.#scope.get(this.#index);\n\t}\n\n}\n\nexport class Signal<T> extends ReactiveNode<T> {\n\n\tstatic bindFn<T>(instance: Signal<T>) {\n\t\tinstance.get = instance.get.bind(instance);\n\t\tinstance.set = instance.set.bind(instance);\n\t\tinstance.update = instance.update.bind(instance);\n\t}\n\n\tstatic writable<T>(instance: Signal<T>) {\n\t\tconst fn = () => instance.get();\n\t\tfn.set = (value: T) => instance.set(value);\n\t\tfn.update = (updateFn: (value: T) => T) => instance.update(updateFn);\n\t\t(fn as any)[SIGNAL] = instance;\n\t\treturn fn;\n\t}\n\n\t#index: number;\n\t#scope: SignalScope;\n\n\tconstructor(scope: SignalScope, index: number, initValue: T) {\n\t\tsuper();\n\t\tthis.#scope = scope;\n\t\tthis.#index = index;\n\t\tscope.set(index, initValue);\n\t}\n\n\tget(): T {\n\t\tthis.#scope.observeIndex(this.#index);\n\t\treturn this.#scope.get(this.#index);\n\t}\n\n\tset(value: T) {\n\t\tthis.#scope.set(this.#index, value);\n\t}\n\n\tupdate(updateFn: (value: T) => T): void {\n\t\tthis.set(updateFn(this.get()));\n\t}\n\n}\n"]}