reactronic 0.94.25032 → 0.94.25034
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.
|
@@ -21,5 +21,5 @@ export { Journal } from "./core/Journal.js";
|
|
|
21
21
|
export { runAtomically, runNonReactively, runSensitively, runContextually, manageReactiveOperation, configureCurrentReactiveOperation, disposeObservableObject } from "./System.js";
|
|
22
22
|
export { ReactiveSystem, observable, atomic, reactive, cached, options } from "./System.js";
|
|
23
23
|
export { ReactiveOperationEx } from "./OperationEx.js";
|
|
24
|
-
export { launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
24
|
+
export { declare, derivative, launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
25
25
|
export type { Script, ScriptAsync, Handler, ReactiveTreeNodeDecl, ReactiveTreeNodeDriver, ReactiveTreeNodeContext } from "./core/TreeNode.js";
|
package/build/dist/source/api.js
CHANGED
|
@@ -17,4 +17,4 @@ export { Journal } from "./core/Journal.js";
|
|
|
17
17
|
export { runAtomically, runNonReactively, runSensitively, runContextually, manageReactiveOperation, configureCurrentReactiveOperation, disposeObservableObject } from "./System.js";
|
|
18
18
|
export { ReactiveSystem, observable, atomic, reactive, cached, options } from "./System.js";
|
|
19
19
|
export { ReactiveOperationEx } from "./OperationEx.js";
|
|
20
|
-
export { launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
20
|
+
export { declare, derivative, launch, ReactiveTreeNode, BaseDriver, ReactiveTreeVariable } from "./core/TreeNode.js";
|
|
@@ -6,6 +6,10 @@ import { ObservableObject } from "../core/Mvcc.js";
|
|
|
6
6
|
export type Script<E> = (el: E, basis: () => void) => void;
|
|
7
7
|
export type ScriptAsync<E> = (el: E, basis: () => Promise<void>) => Promise<void>;
|
|
8
8
|
export type Handler<E = unknown, R = void> = (el: E) => R;
|
|
9
|
+
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, script?: Script<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
10
|
+
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
11
|
+
export declare function declare<E = void>(driver: ReactiveTreeNodeDriver<E>, scriptOrDeclaration?: Script<E> | ReactiveTreeNodeDecl<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
12
|
+
export declare function derivative<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
|
|
9
13
|
export declare function launch<T>(node: ReactiveTreeNode<T>, triggers?: unknown): ReactiveTreeNode<T>;
|
|
10
14
|
export declare abstract class ReactiveTreeNode<E = unknown> {
|
|
11
15
|
static readonly shortFrameDuration = 16;
|
|
@@ -32,13 +36,9 @@ export declare abstract class ReactiveTreeNode<E = unknown> {
|
|
|
32
36
|
abstract configureReactivity(options: Partial<ReactivityOptions>): ReactivityOptions;
|
|
33
37
|
static get current(): ReactiveTreeNode;
|
|
34
38
|
static get isFirstScriptRun(): boolean;
|
|
35
|
-
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, script?: Script<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
36
|
-
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, declaration?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
37
|
-
static declare<E = void>(driver: ReactiveTreeNodeDriver<E>, scriptOrDeclaration?: Script<E> | ReactiveTreeNodeDecl<E>, scriptAsync?: ScriptAsync<E>, key?: string, mode?: Mode, preparation?: Script<E>, preparationAsync?: ScriptAsync<E>, finalization?: Script<E>, triggers?: unknown, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNode<E>;
|
|
38
|
-
static withBasis<E = void>(declaration?: ReactiveTreeNodeDecl<E>, basis?: ReactiveTreeNodeDecl<E>): ReactiveTreeNodeDecl<E>;
|
|
39
39
|
static launchScript(node: ReactiveTreeNode<any>, triggers: unknown): void;
|
|
40
40
|
static launchFinalization(node: ReactiveTreeNode<any>): void;
|
|
41
|
-
static
|
|
41
|
+
static launchNestedNodesThenDo(action: (error: unknown) => void): void;
|
|
42
42
|
static markAsMounted(node: ReactiveTreeNode<any>, yes: boolean): void;
|
|
43
43
|
lookupTreeNodeByUri<E = unknown>(uri: string): ReactiveTreeNode<E> | undefined;
|
|
44
44
|
static findMatchingHost<E = unknown, R = unknown>(node: ReactiveTreeNode<E>, match: Handler<ReactiveTreeNode<E>, boolean>): ReactiveTreeNode<R> | undefined;
|
|
@@ -24,6 +24,50 @@ import { Priority, Mode, Isolation, Reentrance } from "../Enums.js";
|
|
|
24
24
|
import { ObservableObject } from "../core/Mvcc.js";
|
|
25
25
|
import { Transaction } from "../core/Transaction.js";
|
|
26
26
|
import { ReactiveSystem, options, observable, reactive, runAtomically, runNonReactively, manageReactiveOperation, disposeObservableObject } from "../System.js";
|
|
27
|
+
export function declare(driver, scriptOrDeclaration, scriptAsync, key, mode, preparation, preparationAsync, finalization, triggers, basis) {
|
|
28
|
+
let result;
|
|
29
|
+
let declaration;
|
|
30
|
+
if (scriptOrDeclaration instanceof Function) {
|
|
31
|
+
declaration = {
|
|
32
|
+
script: scriptOrDeclaration, scriptAsync, key, mode,
|
|
33
|
+
preparation, preparationAsync, finalization, triggers, basis,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
else
|
|
37
|
+
declaration = scriptOrDeclaration !== null && scriptOrDeclaration !== void 0 ? scriptOrDeclaration : {};
|
|
38
|
+
let effectiveKey = declaration.key;
|
|
39
|
+
const owner = gNodeSlot === null || gNodeSlot === void 0 ? void 0 : gNodeSlot.instance;
|
|
40
|
+
if (owner) {
|
|
41
|
+
let existing = owner.driver.declareChild(owner, driver, declaration, declaration.basis);
|
|
42
|
+
const children = owner.children;
|
|
43
|
+
existing !== null && existing !== void 0 ? existing : (existing = children.tryMergeAsExisting(effectiveKey = effectiveKey || generateKey(owner), undefined, "nested elements can be declared inside 'script' only"));
|
|
44
|
+
if (existing) {
|
|
45
|
+
result = existing.instance;
|
|
46
|
+
if (result.driver !== driver && driver !== undefined)
|
|
47
|
+
throw misuse(`changing element driver is not yet supported: "${result.driver.name}" -> "${driver === null || driver === void 0 ? void 0 : driver.name}"`);
|
|
48
|
+
const exTriggers = result.declaration.triggers;
|
|
49
|
+
if (observablesAreEqual(declaration.triggers, exTriggers))
|
|
50
|
+
declaration.triggers = exTriggers;
|
|
51
|
+
result.declaration = declaration;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
55
|
+
result.slot = children.mergeAsAdded(result);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
60
|
+
result.slot = MergeList.createItem(result);
|
|
61
|
+
}
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
export function derivative(declaration, basis) {
|
|
65
|
+
if (declaration)
|
|
66
|
+
declaration.basis = basis;
|
|
67
|
+
else
|
|
68
|
+
declaration = basis !== null && basis !== void 0 ? basis : {};
|
|
69
|
+
return declaration;
|
|
70
|
+
}
|
|
27
71
|
export function launch(node, triggers) {
|
|
28
72
|
ReactiveTreeNode.launchScript(node, triggers);
|
|
29
73
|
return node;
|
|
@@ -35,50 +79,6 @@ export class ReactiveTreeNode {
|
|
|
35
79
|
static get isFirstScriptRun() {
|
|
36
80
|
return ReactiveTreeNode.current.stamp === 1;
|
|
37
81
|
}
|
|
38
|
-
static declare(driver, scriptOrDeclaration, scriptAsync, key, mode, preparation, preparationAsync, finalization, triggers, basis) {
|
|
39
|
-
let result;
|
|
40
|
-
let declaration;
|
|
41
|
-
if (scriptOrDeclaration instanceof Function) {
|
|
42
|
-
declaration = {
|
|
43
|
-
script: scriptOrDeclaration, scriptAsync, key, mode,
|
|
44
|
-
preparation, preparationAsync, finalization, triggers, basis,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
else
|
|
48
|
-
declaration = scriptOrDeclaration !== null && scriptOrDeclaration !== void 0 ? scriptOrDeclaration : {};
|
|
49
|
-
let effectiveKey = declaration.key;
|
|
50
|
-
const owner = gNodeSlot === null || gNodeSlot === void 0 ? void 0 : gNodeSlot.instance;
|
|
51
|
-
if (owner) {
|
|
52
|
-
let existing = owner.driver.declareChild(owner, driver, declaration, declaration.basis);
|
|
53
|
-
const children = owner.children;
|
|
54
|
-
existing !== null && existing !== void 0 ? existing : (existing = children.tryMergeAsExisting(effectiveKey = effectiveKey || generateKey(owner), undefined, "nested elements can be declared inside 'script' only"));
|
|
55
|
-
if (existing) {
|
|
56
|
-
result = existing.instance;
|
|
57
|
-
if (result.driver !== driver && driver !== undefined)
|
|
58
|
-
throw misuse(`changing element driver is not yet supported: "${result.driver.name}" -> "${driver === null || driver === void 0 ? void 0 : driver.name}"`);
|
|
59
|
-
const exTriggers = result.declaration.triggers;
|
|
60
|
-
if (observablesAreEqual(declaration.triggers, exTriggers))
|
|
61
|
-
declaration.triggers = exTriggers;
|
|
62
|
-
result.declaration = declaration;
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
66
|
-
result.slot = children.mergeAsAdded(result);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
result = new ReactiveTreeNodeImpl(effectiveKey || generateKey(owner), driver, declaration, owner);
|
|
71
|
-
result.slot = MergeList.createItem(result);
|
|
72
|
-
}
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
static withBasis(declaration, basis) {
|
|
76
|
-
if (declaration)
|
|
77
|
-
declaration.basis = basis;
|
|
78
|
-
else
|
|
79
|
-
declaration = basis !== null && basis !== void 0 ? basis : {};
|
|
80
|
-
return declaration;
|
|
81
|
-
}
|
|
82
82
|
static launchScript(node, triggers) {
|
|
83
83
|
const impl = node;
|
|
84
84
|
const declaration = impl.declaration;
|
|
@@ -91,8 +91,8 @@ export class ReactiveTreeNode {
|
|
|
91
91
|
const impl = node;
|
|
92
92
|
launchFinalization(impl.slot, true, true);
|
|
93
93
|
}
|
|
94
|
-
static
|
|
95
|
-
|
|
94
|
+
static launchNestedNodesThenDo(action) {
|
|
95
|
+
launchNestedNodesThenDoImpl(ReactiveTreeNodeImpl.nodeSlot, undefined, action);
|
|
96
96
|
}
|
|
97
97
|
static markAsMounted(node, yes) {
|
|
98
98
|
const n = node;
|
|
@@ -383,7 +383,7 @@ function gatherAuthorityAndPath(node, path, relativeTo) {
|
|
|
383
383
|
function getNodeKey(node) {
|
|
384
384
|
return node.stamp >= 0 ? node.key : undefined;
|
|
385
385
|
}
|
|
386
|
-
function
|
|
386
|
+
function launchNestedNodesThenDoImpl(nodeSlot, error, action) {
|
|
387
387
|
runInsideContextOfNode(nodeSlot, () => {
|
|
388
388
|
var _a;
|
|
389
389
|
const owner = nodeSlot.instance;
|
|
@@ -531,10 +531,10 @@ function runScriptNow(nodeSlot) {
|
|
|
531
531
|
node.children.beginMerge();
|
|
532
532
|
const driver = node.driver;
|
|
533
533
|
result = driver.runScript(node);
|
|
534
|
-
result = proceedSyncOrAsync(result, v => {
|
|
534
|
+
result = proceedSyncOrAsync(result, v => { launchNestedNodesThenDoImpl(nodeSlot, undefined, NOP); return v; }, e => { console.log(e); launchNestedNodesThenDoImpl(nodeSlot, e !== null && e !== void 0 ? e : new Error("unknown error"), NOP); });
|
|
535
535
|
}
|
|
536
536
|
catch (e) {
|
|
537
|
-
|
|
537
|
+
launchNestedNodesThenDoImpl(nodeSlot, e, NOP);
|
|
538
538
|
console.log(`Reactive node script failed: ${node.key}`);
|
|
539
539
|
console.log(`${e}`);
|
|
540
540
|
}
|