dirvi-lib 0.8.1 → 0.9.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/dist/app/app-api.d.ts +74 -0
- package/dist/app/app-api.d.ts.map +1 -0
- package/dist/app/app-api.js +11 -0
- package/dist/app/effect-to-action.d.ts +6 -0
- package/dist/app/effect-to-action.d.ts.map +1 -0
- package/dist/app/effect-to-action.js +120 -0
- package/dist/app/index.d.ts +6 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +5 -0
- package/dist/app/reducer-action.d.ts +40 -0
- package/dist/app/reducer-action.d.ts.map +1 -0
- package/dist/app/reducer.d.ts +5 -0
- package/dist/app/reducer.d.ts.map +1 -0
- package/dist/app/reducer.js +115 -0
- package/dist/app/view-api.d.ts +11 -0
- package/dist/app/view-api.d.ts.map +1 -0
- package/dist/feedback/feedback.impl.d.ts +9 -0
- package/dist/feedback/feedback.impl.d.ts.map +1 -0
- package/dist/feedback/feedback.impl.js +34 -0
- package/dist/feedback/feedback.types.d.ts +24 -0
- package/dist/feedback/feedback.types.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +3 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/index.js +1 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -7
- package/dist/input/application/index.d.ts.map +1 -0
- package/dist/input/application/intent-to-effect-no-state.test.d.ts.map +1 -0
- package/dist/input/application/intent-to-effect.d.ts +14 -0
- package/dist/input/application/intent-to-effect.d.ts.map +1 -0
- package/dist/{tree-surfer-ui → input}/application/intent-to-effect.js +66 -42
- package/dist/input/application/parse-command.d.ts +14 -0
- package/dist/input/application/parse-command.d.ts.map +1 -0
- package/dist/input/application/parse-command.js +92 -0
- package/dist/input/application/parse-normal-command.d.ts +12 -0
- package/dist/input/application/parse-normal-command.d.ts.map +1 -0
- package/dist/input/application/parse-normal-command.js +89 -0
- package/dist/input/application/tokenize-normal-command.d.ts +24 -0
- package/dist/input/application/tokenize-normal-command.d.ts.map +1 -0
- package/dist/input/application/tokenize-normal-command.js +110 -0
- package/dist/{tree-surfer-ui → input}/application/user-input-to-intent.d.ts +4 -2
- package/dist/input/application/user-input-to-intent.d.ts.map +1 -0
- package/dist/{tree-surfer-ui → input}/application/user-input-to-intent.js +9 -6
- package/dist/input/application/user-input-to-intent.test.d.ts.map +1 -0
- package/dist/input/domain/effect.d.ts +84 -0
- package/dist/input/domain/effect.d.ts.map +1 -0
- package/dist/input/domain/index.d.ts.map +1 -0
- package/dist/input/domain/input-mode-state.d.ts.map +1 -0
- package/dist/input/domain/intent.d.ts.map +1 -0
- package/dist/input/domain/user-input.d.ts.map +1 -0
- package/dist/trees/cursor.d.ts.map +1 -0
- package/dist/trees/fold-node/deprecated/fold-node.impl.d.ts +10 -0
- package/dist/trees/fold-node/deprecated/fold-node.impl.d.ts.map +1 -0
- package/dist/trees/fold-node/deprecated/fold-node.impl.js +248 -0
- package/dist/trees/fold-node/deprecated/fold-node.test.d.ts +2 -0
- package/dist/trees/fold-node/deprecated/fold-node.test.d.ts.map +1 -0
- package/dist/trees/fold-node/deprecated/fold-node.test.js +130 -0
- package/dist/{tree-surfer/fold-node → trees/fold-node/deprecated}/fold-node.types.d.ts +15 -76
- package/dist/trees/fold-node/deprecated/fold-node.types.d.ts.map +1 -0
- package/dist/trees/fold-node/fold-node.impl.d.ts +16 -0
- package/dist/trees/fold-node/fold-node.impl.d.ts.map +1 -0
- package/dist/trees/fold-node/fold-node.impl.js +472 -0
- package/dist/trees/fold-node/fold-node.model.d.ts +120 -0
- package/dist/trees/fold-node/fold-node.model.d.ts.map +1 -0
- package/dist/trees/fold-node/fold-node.model.js +80 -0
- package/dist/trees/fold-node/fold-node.types.d.ts +214 -0
- package/dist/trees/fold-node/fold-node.types.d.ts.map +1 -0
- package/dist/trees/fold-node/index.d.ts +4 -0
- package/dist/trees/fold-node/index.d.ts.map +1 -0
- package/dist/trees/fold-node/index.js +3 -0
- package/dist/trees/index.d.ts +9 -0
- package/dist/trees/index.d.ts.map +1 -0
- package/dist/trees/index.js +8 -0
- package/dist/trees/nav-node/nav-node.impl.d.ts +29 -0
- package/dist/trees/nav-node/nav-node.impl.d.ts.map +1 -0
- package/dist/{tree-surfer → trees}/nav-node/nav-node.impl.js +89 -42
- package/dist/trees/nav-node/nav-node.types.d.ts +103 -0
- package/dist/trees/nav-node/nav-node.types.d.ts.map +1 -0
- package/dist/trees/nav-node/nav-node.types.js +1 -0
- package/dist/trees/state/state.impl.d.ts +8 -0
- package/dist/trees/state/state.impl.d.ts.map +1 -0
- package/dist/trees/state/state.impl.js +128 -0
- package/dist/trees/state/state.schemas.d.ts +25 -0
- package/dist/trees/state/state.schemas.d.ts.map +1 -0
- package/dist/trees/state/state.schemas.js +17 -0
- package/dist/trees/state/state.types.d.ts +36 -0
- package/dist/trees/state/state.types.d.ts.map +1 -0
- package/dist/trees/state/state.types.js +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.arb.d.ts.map +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.arb.debug.test.d.ts.map +1 -0
- package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.arb.debug.test.js +1 -1
- package/dist/trees/tree-node/deprecated/tree-node.impl.d.ts.map +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.schemas.d.ts.map +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.test.d.ts.map +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.types.d.ts.map +1 -0
- package/dist/trees/tree-node/deprecated/tree-node.types.js +1 -0
- package/dist/trees/tree-node/index.d.ts +5 -0
- package/dist/trees/tree-node/index.d.ts.map +1 -0
- package/dist/trees/tree-node/index.js +2 -0
- package/dist/trees/tree-node/tree-node.arb.d.ts +104 -0
- package/dist/trees/tree-node/tree-node.arb.d.ts.map +1 -0
- package/dist/trees/tree-node/tree-node.arb.js +191 -0
- package/dist/trees/tree-node/tree-node.impl.d.ts +15 -0
- package/dist/trees/tree-node/tree-node.impl.d.ts.map +1 -0
- package/dist/trees/tree-node/tree-node.impl.js +286 -0
- package/dist/trees/tree-node/tree-node.model.d.ts +78 -0
- package/dist/trees/tree-node/tree-node.model.d.ts.map +1 -0
- package/dist/trees/tree-node/tree-node.model.js +37 -0
- package/dist/trees/tree-node/tree-node.types.d.ts +419 -0
- package/dist/trees/tree-node/tree-node.types.d.ts.map +1 -0
- package/dist/trees/tree-node/tree-node.types.js +1 -0
- package/package.json +1 -1
- package/dist/tree-surfer/cursor.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/fold-node.arb.d.ts +0 -2
- package/dist/tree-surfer/fold-node/fold-node.arb.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/fold-node.impl.d.ts +0 -4
- package/dist/tree-surfer/fold-node/fold-node.impl.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/fold-node.impl.js +0 -149
- package/dist/tree-surfer/fold-node/fold-node.schema.d.ts +0 -5
- package/dist/tree-surfer/fold-node/fold-node.schema.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/fold-node.schema.js +0 -9
- package/dist/tree-surfer/fold-node/fold-node.types.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/tree-node.test.d.ts.map +0 -1
- package/dist/tree-surfer/fold-node/tree-node.test.js +0 -90
- package/dist/tree-surfer/index.d.ts +0 -13
- package/dist/tree-surfer/index.d.ts.map +0 -1
- package/dist/tree-surfer/index.js +0 -12
- package/dist/tree-surfer/nav-node/nav-node.impl.d.ts +0 -6
- package/dist/tree-surfer/nav-node/nav-node.impl.d.ts.map +0 -1
- package/dist/tree-surfer/nav-node/nav-node.types.d.ts +0 -70
- package/dist/tree-surfer/nav-node/nav-node.types.d.ts.map +0 -1
- package/dist/tree-surfer/state/state.impl.d.ts +0 -7
- package/dist/tree-surfer/state/state.impl.d.ts.map +0 -1
- package/dist/tree-surfer/state/state.impl.js +0 -89
- package/dist/tree-surfer/state/state.schemas.d.ts +0 -9
- package/dist/tree-surfer/state/state.schemas.d.ts.map +0 -1
- package/dist/tree-surfer/state/state.schemas.js +0 -8
- package/dist/tree-surfer/state/state.types.d.ts +0 -21
- package/dist/tree-surfer/state/state.types.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.arb.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.arb.debug.test.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.impl.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.schemas.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.test.d.ts +0 -2
- package/dist/tree-surfer/tree-node/tree-node.test.d.ts.map +0 -1
- package/dist/tree-surfer/tree-node/tree-node.types.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/index.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/intent-to-effect-no-state.test.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/intent-to-effect.d.ts +0 -10
- package/dist/tree-surfer-ui/application/intent-to-effect.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/parse-command.d.ts +0 -4
- package/dist/tree-surfer-ui/application/parse-command.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/parse-command.js +0 -48
- package/dist/tree-surfer-ui/application/user-input-to-intent.d.ts.map +0 -1
- package/dist/tree-surfer-ui/application/user-input-to-intent.test.d.ts.map +0 -1
- package/dist/tree-surfer-ui/domain/effect.d.ts +0 -43
- package/dist/tree-surfer-ui/domain/effect.d.ts.map +0 -1
- package/dist/tree-surfer-ui/domain/index.d.ts.map +0 -1
- package/dist/tree-surfer-ui/domain/input-mode-state.d.ts.map +0 -1
- package/dist/tree-surfer-ui/domain/intent.d.ts.map +0 -1
- package/dist/tree-surfer-ui/domain/user-input.d.ts.map +0 -1
- /package/dist/{tree-surfer-ui/domain/effect.js → app/reducer-action.js} +0 -0
- /package/dist/{tree-surfer-ui/domain/input-mode-state.js → app/view-api.js} +0 -0
- /package/dist/{tree-surfer-ui/domain/intent.js → feedback/feedback.types.js} +0 -0
- /package/dist/{tree-surfer-ui → input}/application/index.d.ts +0 -0
- /package/dist/{tree-surfer-ui → input}/application/index.js +0 -0
- /package/dist/{tree-surfer-ui → input}/application/intent-to-effect-no-state.test.d.ts +0 -0
- /package/dist/{tree-surfer-ui → input}/application/intent-to-effect-no-state.test.js +0 -0
- /package/dist/{tree-surfer-ui → input}/application/user-input-to-intent.test.d.ts +0 -0
- /package/dist/{tree-surfer-ui → input}/application/user-input-to-intent.test.js +0 -0
- /package/dist/{tree-surfer-ui/domain/user-input.js → input/domain/effect.js} +0 -0
- /package/dist/{tree-surfer-ui → input}/domain/index.d.ts +0 -0
- /package/dist/{tree-surfer-ui → input}/domain/index.js +0 -0
- /package/dist/{tree-surfer-ui → input}/domain/input-mode-state.d.ts +0 -0
- /package/dist/{tree-surfer/fold-node/fold-node.arb.js → input/domain/input-mode-state.js} +0 -0
- /package/dist/{tree-surfer-ui → input}/domain/intent.d.ts +0 -0
- /package/dist/{tree-surfer/fold-node/fold-node.types.js → input/domain/intent.js} +0 -0
- /package/dist/{tree-surfer-ui → input}/domain/user-input.d.ts +0 -0
- /package/dist/{tree-surfer/nav-node/nav-node.types.js → input/domain/user-input.js} +0 -0
- /package/dist/{tree-surfer → trees}/cursor.d.ts +0 -0
- /package/dist/{tree-surfer → trees}/cursor.js +0 -0
- /package/dist/{tree-surfer/state/state.types.js → trees/fold-node/deprecated/fold-node.types.js} +0 -0
- /package/dist/{tree-surfer/tree-node/tree-node.types.js → trees/fold-node/fold-node.types.js} +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.arb.d.ts +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.arb.debug.test.d.ts +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.arb.js +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.impl.d.ts +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.impl.js +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.schemas.d.ts +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.schemas.js +0 -0
- /package/dist/{tree-surfer/fold-node → trees/tree-node/deprecated}/tree-node.test.d.ts +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.test.js +0 -0
- /package/dist/{tree-surfer/tree-node → trees/tree-node/deprecated}/tree-node.types.d.ts +0 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ViewApi } from './view-api.js';
|
|
2
|
+
import type { CursorApi, FoldsApi, NavNodeApi, SerializableKey, State, StateApi, TreeNode, TreeNodeApi } from '../trees/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Application-specific tree dependencies and operations.
|
|
5
|
+
*
|
|
6
|
+
* This is currently migrated through the generic TreeNode and State APIs.
|
|
7
|
+
* Navigation-specific APIs remain outside this type until NavNodeApi has been
|
|
8
|
+
* migrated from the old structural TreeNode API.
|
|
9
|
+
*
|
|
10
|
+
* @typeParam Id - The sibling-unique tree-node ID type.
|
|
11
|
+
* @typeParam Value - Application-owned data stored in each tree node.
|
|
12
|
+
* @typeParam ViewKey - The key used to identify view implementations.
|
|
13
|
+
*/
|
|
14
|
+
export type AppApi<Id extends SerializableKey, Value, ViewKey = string> = Readonly<{
|
|
15
|
+
/**
|
|
16
|
+
* Name used to distinguish the application, for example `posix` for a
|
|
17
|
+
* POSIX-directory application.
|
|
18
|
+
*/
|
|
19
|
+
appId: string;
|
|
20
|
+
/**
|
|
21
|
+
* Name used to distinguish a particular application instance.
|
|
22
|
+
*/
|
|
23
|
+
name: string;
|
|
24
|
+
/**
|
|
25
|
+
* ID used for the application's root node.
|
|
26
|
+
*/
|
|
27
|
+
rootId: Id;
|
|
28
|
+
/**
|
|
29
|
+
* Loads direct children for the branch addressed by `path`.
|
|
30
|
+
*
|
|
31
|
+
* Returned nodes must be opaque tree values created or decoded through this
|
|
32
|
+
* application's TreeNodeApi specialization.
|
|
33
|
+
*/
|
|
34
|
+
loadBranches: (path: readonly Id[]) => Promise<readonly TreeNode<Id, Value>[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Creates the application's root node.
|
|
37
|
+
*
|
|
38
|
+
* Invariant: the returned node is an open branch. That invariant is checked
|
|
39
|
+
* when an initial State is created.
|
|
40
|
+
*/
|
|
41
|
+
createRoot: () => Promise<TreeNode<Id, Value>>;
|
|
42
|
+
/**
|
|
43
|
+
* Subscribes to external data changes that require tree state to be loaded
|
|
44
|
+
* again.
|
|
45
|
+
*
|
|
46
|
+
* Returns an unsubscribe function.
|
|
47
|
+
*/
|
|
48
|
+
subscribeToResync: (listener: () => void) => () => void;
|
|
49
|
+
/**
|
|
50
|
+
* Generic structural operations for this application's buffer tree.
|
|
51
|
+
*/
|
|
52
|
+
treeNodeApi: TreeNodeApi<Id, Value>;
|
|
53
|
+
/**
|
|
54
|
+
* Semantic fold-state operations.
|
|
55
|
+
*
|
|
56
|
+
* This remains temporarily available while FoldNode itself is migrated.
|
|
57
|
+
*/
|
|
58
|
+
foldsApi: FoldsApi<Id>;
|
|
59
|
+
cursorApi: CursorApi<Id>;
|
|
60
|
+
stateApi: StateApi<Id, Value>;
|
|
61
|
+
/**
|
|
62
|
+
* UI navigation projection and cursor-navigation operations.
|
|
63
|
+
*/
|
|
64
|
+
navNodeApi: NavNodeApi<Id, Value>;
|
|
65
|
+
viewKey: ViewKey;
|
|
66
|
+
viewApi: ViewApi<State<Id, Value>, ViewKey>;
|
|
67
|
+
}>;
|
|
68
|
+
export type AppStateApis<Id extends SerializableKey, Value> = Readonly<{
|
|
69
|
+
treeNodeApi: TreeNodeApi<Id, Value>;
|
|
70
|
+
cursorApi: CursorApi<Id>;
|
|
71
|
+
stateApi: StateApi<Id, Value>;
|
|
72
|
+
}>;
|
|
73
|
+
export declare function createAppStateApis<Id extends SerializableKey, Value>(): AppStateApis<Id, Value>;
|
|
74
|
+
//# sourceMappingURL=app-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-api.d.ts","sourceRoot":"","sources":["../../src/app/app-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EACV,SAAS,EAAE,QAAQ,EAAE,UAAU,EAC/B,eAAe,EACf,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAO3B;;;;;;;;;;GAUG;AACH,MAAM,MAAM,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,IAAI,QAAQ,CAAC;IACjF;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,EAAE,CAAC;IAEX;;;;;OAKG;IACH,YAAY,EAAE,CACZ,IAAI,EAAE,SAAS,EAAE,EAAE,KAChB,OAAO,CAAC,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/C;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAExD;;OAEG;IACH,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAEpC;;;;OAIG;IACH,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvB,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IAEzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAE9B;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAElC,OAAO,EAAE,OAAO,CAAC;IAEjB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;CAC7C,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,QAAQ,CAAC;IACrE,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;CAC/B,CAAC,CAAC;AAEH,wBAAgB,kBAAkB,CAChC,EAAE,SAAS,eAAe,EAC1B,KAAK,KACF,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,CAU3B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createCursorApi, createStateApi, createTreeNodeApi, } from '../trees/index.js';
|
|
2
|
+
export function createAppStateApis() {
|
|
3
|
+
const treeNodeApi = createTreeNodeApi();
|
|
4
|
+
const cursorApi = createCursorApi();
|
|
5
|
+
const stateApi = createStateApi(treeNodeApi, cursorApi);
|
|
6
|
+
return {
|
|
7
|
+
treeNodeApi,
|
|
8
|
+
cursorApi,
|
|
9
|
+
stateApi,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CursorApi, FoldsApi, NavBranch, NavNodeApi, SerializableKey, State } from '../trees/index.js';
|
|
2
|
+
import type { EffectAction } from '../input/domain/index.js';
|
|
3
|
+
import type { ReducerAction } from './reducer-action.js';
|
|
4
|
+
export type EffectToAction<Id extends SerializableKey, Value> = (effectAction: EffectAction<Id, Value>, navigation: NavBranch<Id>, state: State<Id, Value>) => ReducerAction<Id, Value> | undefined;
|
|
5
|
+
export declare function createEffectToAction<Id extends SerializableKey, Value>(foldsApi: FoldsApi<Id>, cursorApi: CursorApi<Id>, navNodeApi: NavNodeApi<Id, Value>): EffectToAction<Id, Value>;
|
|
6
|
+
//# sourceMappingURL=effect-to-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effect-to-action.d.ts","sourceRoot":"","sources":["../../src/app/effect-to-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,QAAQ,EACR,SAAS,EACT,UAAU,EACV,eAAe,EACf,KAAK,EACN,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,0BAA0B,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,CAC9D,YAAY,EAAE,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,EACrC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,EACzB,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KACpB,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;AAkB1C,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EACpE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,EACtB,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,EACxB,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,GAChC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CA4J3B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
function resolveFoldTreeIndex(foldsApi, folds, foldTree) {
|
|
2
|
+
switch (foldTree.foldTreeReferenceType) {
|
|
3
|
+
case 'index':
|
|
4
|
+
return foldsApi.hasAtIndex(folds, foldTree.index)
|
|
5
|
+
? foldTree.index
|
|
6
|
+
: undefined;
|
|
7
|
+
case 'name':
|
|
8
|
+
return foldsApi.getIndexByName(folds, foldTree.name);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function createEffectToAction(foldsApi, cursorApi, navNodeApi) {
|
|
12
|
+
function effectToAction(effectAction, navigation, state) {
|
|
13
|
+
switch (effectAction.effectActionType) {
|
|
14
|
+
case 'nextEntry': {
|
|
15
|
+
const cursor = navNodeApi.nextCursor(navigation, state.cursor);
|
|
16
|
+
return cursor === undefined
|
|
17
|
+
? undefined
|
|
18
|
+
: {
|
|
19
|
+
kind: 'changeCursor',
|
|
20
|
+
cursor,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
case 'prevEntry': {
|
|
24
|
+
const cursor = navNodeApi.previousCursor(navigation, state.cursor);
|
|
25
|
+
return cursor === undefined
|
|
26
|
+
? undefined
|
|
27
|
+
: {
|
|
28
|
+
kind: 'changeCursor',
|
|
29
|
+
cursor,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
case 'setBranchEntries':
|
|
33
|
+
return {
|
|
34
|
+
kind: 'updateBranch',
|
|
35
|
+
path: effectAction.path,
|
|
36
|
+
entries: effectAction.entries,
|
|
37
|
+
};
|
|
38
|
+
case 'navigateToParent': {
|
|
39
|
+
const navNode = navigation.children;
|
|
40
|
+
if (navNode === null) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const cursor = navNodeApi.parentCursor(navNode, state.cursor);
|
|
44
|
+
return cursor === undefined
|
|
45
|
+
? undefined
|
|
46
|
+
: {
|
|
47
|
+
kind: 'changeCursor',
|
|
48
|
+
cursor,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
case 'addToFoldTree': {
|
|
52
|
+
if (state.cursor.length === 0) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const cursor = navNodeApi.cursorAfterFold(navigation, state.cursor);
|
|
56
|
+
if (cursor === undefined) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const foldTreeIndex = resolveFoldTreeIndex(foldsApi, state.folds, effectAction.foldTree);
|
|
60
|
+
if (foldTreeIndex === undefined) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
kind: 'addToFoldTree',
|
|
65
|
+
path: state.cursor,
|
|
66
|
+
cursor,
|
|
67
|
+
foldTreeIndex,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
case 'removeFromFoldTree': {
|
|
71
|
+
const currentPath = cursorApi.getPath(state.cursor);
|
|
72
|
+
const navNode = navigation.children;
|
|
73
|
+
if (navNode === null) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const node = navNodeApi.getNodeAtPath(navNode, currentPath);
|
|
77
|
+
if (node === undefined || node.folded?.entries.length === 0) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
const foldTreeIndex = resolveFoldTreeIndex(foldsApi, state.folds, effectAction.foldTree);
|
|
81
|
+
if (foldTreeIndex === undefined) {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
kind: 'removeFromFoldTree',
|
|
86
|
+
path: currentPath,
|
|
87
|
+
cursor: state.cursor,
|
|
88
|
+
foldTreeIndex,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
case 'fold': {
|
|
92
|
+
const foldTreeIndex = resolveFoldTreeIndex(foldsApi, state.folds, effectAction.foldTree);
|
|
93
|
+
return foldTreeIndex === undefined
|
|
94
|
+
? undefined
|
|
95
|
+
: {
|
|
96
|
+
kind: 'fold',
|
|
97
|
+
foldTreeIndex,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
case 'unfold': {
|
|
101
|
+
const foldTreeIndex = resolveFoldTreeIndex(foldsApi, state.folds, effectAction.foldTree);
|
|
102
|
+
return foldTreeIndex === undefined
|
|
103
|
+
? undefined
|
|
104
|
+
: {
|
|
105
|
+
kind: 'unfold',
|
|
106
|
+
foldTreeIndex,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
case 'createFoldTree':
|
|
110
|
+
return foldsApi.getIndexByName(state.folds, effectAction.name) ===
|
|
111
|
+
undefined
|
|
112
|
+
? {
|
|
113
|
+
kind: 'createFoldTree',
|
|
114
|
+
name: effectAction.name,
|
|
115
|
+
}
|
|
116
|
+
: undefined;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return effectToAction;
|
|
120
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Cursor, SerializableKey, State, TreeNode } from '../trees/index.js';
|
|
2
|
+
export type ReducerAction<Id extends SerializableKey, Value> = {
|
|
3
|
+
kind: 'changeCursor';
|
|
4
|
+
cursor: Cursor<Id>;
|
|
5
|
+
} | {
|
|
6
|
+
kind: 'updateBranch';
|
|
7
|
+
path: readonly Id[];
|
|
8
|
+
entries: readonly TreeNode<Id, Value>[] | null;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'setState';
|
|
11
|
+
oldState: State<Id, Value>;
|
|
12
|
+
newState: State<Id, Value>;
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'addToFoldTree';
|
|
15
|
+
path: readonly Id[];
|
|
16
|
+
cursor: Cursor<Id>;
|
|
17
|
+
foldTreeIndex: number;
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'removeFromFoldTree';
|
|
20
|
+
path: readonly Id[];
|
|
21
|
+
cursor: Cursor<Id>;
|
|
22
|
+
foldTreeIndex: number;
|
|
23
|
+
} | {
|
|
24
|
+
/**
|
|
25
|
+
* Activates a fold tree, making its hidden entries contribute to the
|
|
26
|
+
* visible navigation projection.
|
|
27
|
+
*/
|
|
28
|
+
kind: 'fold';
|
|
29
|
+
foldTreeIndex: number;
|
|
30
|
+
} | {
|
|
31
|
+
/**
|
|
32
|
+
* Deactivates a fold tree while preserving its fold definition.
|
|
33
|
+
*/
|
|
34
|
+
kind: 'unfold';
|
|
35
|
+
foldTreeIndex: number;
|
|
36
|
+
} | {
|
|
37
|
+
kind: 'createFoldTree';
|
|
38
|
+
name: string;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=reducer-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer-action.d.ts","sourceRoot":"","sources":["../../src/app/reducer-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElF,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IACvD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;CACpB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACpB,OAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;CAChD,GACD;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;CAC5B,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IACE,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IACE;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IACE;;OAEG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FoldsApi, SerializableKey, State, TreeNodeApi } from '../trees/index.js';
|
|
2
|
+
import type { ReducerAction } from './reducer-action.js';
|
|
3
|
+
export type Reducer<Id extends SerializableKey, Value> = (state: State<Id, Value>, action: ReducerAction<Id, Value>) => State<Id, Value>;
|
|
4
|
+
export declare function createReducer<Id extends SerializableKey, Value>(treeNodeApi: TreeNodeApi<Id, Value>, foldsApi: FoldsApi<Id>): Reducer<Id, Value>;
|
|
5
|
+
//# sourceMappingURL=reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/app/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,KAAK,EACL,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,CACvD,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EACvB,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,KAC7B,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAEtB,wBAAgB,aAAa,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EAC7D,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,EACnC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,GACrB,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAwJpB"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
function firstAvailableAdditionalFoldIndex(foldsApi, state) {
|
|
2
|
+
let index = 1;
|
|
3
|
+
while (foldsApi.hasAtIndex(state.folds, index)) {
|
|
4
|
+
index += 1;
|
|
5
|
+
}
|
|
6
|
+
return index;
|
|
7
|
+
}
|
|
8
|
+
export function createReducer(treeNodeApi, foldsApi) {
|
|
9
|
+
return (state, action) => {
|
|
10
|
+
switch (action.kind) {
|
|
11
|
+
case 'changeCursor':
|
|
12
|
+
return {
|
|
13
|
+
...state,
|
|
14
|
+
cursor: action.cursor,
|
|
15
|
+
};
|
|
16
|
+
case 'updateBranch': {
|
|
17
|
+
const root = treeNodeApi.updateAtPath(state.root, action.path, (node) => {
|
|
18
|
+
/*
|
|
19
|
+
* Loading/unloading is a branch-only operation. TreeNodeApi can
|
|
20
|
+
* structurally convert any node, but the application reducer must
|
|
21
|
+
* not turn a leaf into a branch.
|
|
22
|
+
*/
|
|
23
|
+
if (treeNodeApi.kind(node) === 'leaf') {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
if (action.entries === null) {
|
|
27
|
+
return treeNodeApi.toUnloadedBranch(node);
|
|
28
|
+
}
|
|
29
|
+
return treeNodeApi.withLoadedChildren(node, action.entries);
|
|
30
|
+
});
|
|
31
|
+
/*
|
|
32
|
+
* State requires its root to remain a loaded branch. In particular,
|
|
33
|
+
* refuse an accidental updateBranch with path [] and entries null.
|
|
34
|
+
*/
|
|
35
|
+
if (root === undefined || treeNodeApi.kind(root) !== 'loaded-branch') {
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
...state,
|
|
40
|
+
root,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
case 'setState': {
|
|
44
|
+
// A newer update has already been applied.
|
|
45
|
+
if (state !== action.oldState) {
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
...action.newState,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
case 'addToFoldTree': {
|
|
53
|
+
const entryId = action.path.at(-1);
|
|
54
|
+
if (entryId === undefined) {
|
|
55
|
+
return state;
|
|
56
|
+
}
|
|
57
|
+
const parentPath = action.path.slice(0, -1);
|
|
58
|
+
const folds = foldsApi.hideEntryAtPath(state.folds, action.foldTreeIndex, parentPath, entryId);
|
|
59
|
+
if (folds === undefined) {
|
|
60
|
+
return state;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...state,
|
|
64
|
+
folds,
|
|
65
|
+
cursor: action.cursor,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
case 'removeFromFoldTree': {
|
|
69
|
+
// TODO: Change to show only entry at cursor. mirroring addToFoldTree
|
|
70
|
+
const folds = foldsApi.showAllHiddenEntriesAtPath(state.folds, action.foldTreeIndex, action.path);
|
|
71
|
+
if (folds === undefined) {
|
|
72
|
+
return state;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
...state,
|
|
76
|
+
folds,
|
|
77
|
+
cursor: action.cursor,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
case 'fold': {
|
|
81
|
+
const folds = foldsApi.activateAtIndex(state.folds, action.foldTreeIndex);
|
|
82
|
+
return folds === undefined
|
|
83
|
+
? state
|
|
84
|
+
: {
|
|
85
|
+
...state,
|
|
86
|
+
folds,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
case 'unfold': {
|
|
90
|
+
const folds = foldsApi.deactivateAtIndex(state.folds, action.foldTreeIndex);
|
|
91
|
+
return folds === undefined
|
|
92
|
+
? state
|
|
93
|
+
: {
|
|
94
|
+
...state,
|
|
95
|
+
folds,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
case 'createFoldTree': {
|
|
99
|
+
const index = firstAvailableAdditionalFoldIndex(foldsApi, state);
|
|
100
|
+
const folds = foldsApi.setAdditionalFoldAtIndex(state.folds, index,
|
|
101
|
+
// Obtain this through the actual TreeNodeApi root-ID operation.
|
|
102
|
+
treeNodeApi.id(state.root), {
|
|
103
|
+
name: action.name,
|
|
104
|
+
description: null,
|
|
105
|
+
});
|
|
106
|
+
return folds === undefined
|
|
107
|
+
? state
|
|
108
|
+
: {
|
|
109
|
+
...state,
|
|
110
|
+
folds,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ViewSummary = {
|
|
2
|
+
name: string;
|
|
3
|
+
updatedAt: string;
|
|
4
|
+
};
|
|
5
|
+
export type ViewApi<State, Key> = {
|
|
6
|
+
save: (key: Key, name: string, state: State) => Promise<void>;
|
|
7
|
+
load: (key: Key, name: string) => Promise<State | undefined>;
|
|
8
|
+
list: (key: Key) => Promise<readonly ViewSummary[]>;
|
|
9
|
+
remove: (key: Key, name: string) => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=view-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-api.d.ts","sourceRoot":"","sources":["../../src/app/view-api.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI;IAChC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Feedback, FeedbackApi } from './feedback.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Creates the feedback algebra.
|
|
4
|
+
*
|
|
5
|
+
* `onMessageAdded` is an application/UI hook. It is called after a new
|
|
6
|
+
* feedback value has been created, allowing an outer layer to render it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createFeedbackApi(onMessageAdded?: (feedback: Feedback, message: string) => void): FeedbackApi;
|
|
9
|
+
//# sourceMappingURL=feedback.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.impl.d.ts","sourceRoot":"","sources":["../../src/feedback/feedback.impl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AA2B7B;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAC7D,WAAW,CAkBb"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const values = new WeakMap();
|
|
2
|
+
function createFeedback(message, type) {
|
|
3
|
+
const feedback = Object.freeze({});
|
|
4
|
+
values.set(feedback, { message, type });
|
|
5
|
+
return feedback;
|
|
6
|
+
}
|
|
7
|
+
function getValue(feedback) {
|
|
8
|
+
const value = values.get(feedback);
|
|
9
|
+
if (value === undefined) {
|
|
10
|
+
throw new Error('Invalid Feedback value');
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Creates the feedback algebra.
|
|
16
|
+
*
|
|
17
|
+
* `onMessageAdded` is an application/UI hook. It is called after a new
|
|
18
|
+
* feedback value has been created, allowing an outer layer to render it.
|
|
19
|
+
*/
|
|
20
|
+
export function createFeedbackApi(onMessageAdded) {
|
|
21
|
+
return {
|
|
22
|
+
addMessage(message, type = 'message') {
|
|
23
|
+
const feedback = createFeedback(message, type);
|
|
24
|
+
onMessageAdded?.(feedback, message);
|
|
25
|
+
return feedback;
|
|
26
|
+
},
|
|
27
|
+
getMessage(feedback) {
|
|
28
|
+
return getValue(feedback).message;
|
|
29
|
+
},
|
|
30
|
+
getType(feedback) {
|
|
31
|
+
return getValue(feedback).type;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type FeedbackType = 'success' | 'message' | 'error';
|
|
2
|
+
declare const feedbackBrand: unique symbol;
|
|
3
|
+
/**
|
|
4
|
+
* Opaque runtime feedback message.
|
|
5
|
+
*
|
|
6
|
+
* Its representation is private to the feedback module. Consumers must use
|
|
7
|
+
* FeedbackApi operations to create, update, and inspect it.
|
|
8
|
+
*/
|
|
9
|
+
export type Feedback = Readonly<{
|
|
10
|
+
readonly [feedbackBrand]: typeof feedbackBrand;
|
|
11
|
+
}>;
|
|
12
|
+
export type FeedbackApi = Readonly<{
|
|
13
|
+
/**
|
|
14
|
+
* Creates feedback for a new message and notifies the configured hook.
|
|
15
|
+
* Defaults to a standard message.
|
|
16
|
+
*/
|
|
17
|
+
addMessage: (message: string, type?: FeedbackType) => Feedback;
|
|
18
|
+
/** Returns the message represented by feedback. */
|
|
19
|
+
getMessage: (feedback: Feedback) => string;
|
|
20
|
+
/** Returns the display type represented by feedback. */
|
|
21
|
+
getType: (feedback: Feedback) => FeedbackType;
|
|
22
|
+
}>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=feedback.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.types.d.ts","sourceRoot":"","sources":["../../src/feedback/feedback.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3D,OAAO,CAAC,MAAM,aAAa,EAAE,OAAO,MAAM,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC9B,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,aAAa,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC;;;OAGG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,KAAK,QAAQ,CAAC;IAE/D,mDAAmD;IACnD,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC;IAE3C,wDAAwD;IACxD,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,YAAY,CAAC;CAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feedback/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,qBAAqB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createFeedbackApi } from './feedback.impl.js';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './tree-surfer-ui/domain/user-input.js';
|
|
7
|
-
export * from './tree-surfer/index.js';
|
|
1
|
+
export * from './trees/index.js';
|
|
2
|
+
export * from './feedback/index.js';
|
|
3
|
+
export * from './app/index.js';
|
|
4
|
+
export * from './input/application/index.js';
|
|
5
|
+
export * from './input/domain/index.js';
|
|
8
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAEjC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,8BAA8B,CAAC;AAE7C,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './tree-surfer-ui/domain/user-input.js';
|
|
7
|
-
export * from './tree-surfer/index.js';
|
|
1
|
+
export * from './trees/index.js';
|
|
2
|
+
export * from './feedback/index.js';
|
|
3
|
+
export * from './app/index.js';
|
|
4
|
+
export * from './input/application/index.js';
|
|
5
|
+
export * from './input/domain/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/input/application/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-to-effect-no-state.test.d.ts","sourceRoot":"","sources":["../../../src/input/application/intent-to-effect-no-state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CursorApi, SerializableKey, State, StateApi, TreeNodeApi } from '../../trees/index.js';
|
|
2
|
+
import type { Effect, Intent } from '../domain/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Converts a user intent and the current tree state into an effect.
|
|
5
|
+
*
|
|
6
|
+
* By design, "effect = intent + state": whether an effect should be executed
|
|
7
|
+
* depends on both the received intent and the current state.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam Id - The sibling-unique tree-node ID type.
|
|
10
|
+
* @typeParam Value - Application-owned data stored in each tree node.
|
|
11
|
+
*/
|
|
12
|
+
export type IntentToEffect<Id extends SerializableKey, Value> = (intent: Intent, state: State<Id, Value>) => Effect<Id, Value> | undefined;
|
|
13
|
+
export declare function createIntentToEffect<Id extends SerializableKey, Value>(stateApi: StateApi<Id, Value>, cursorApi: CursorApi<Id>, treeNodeApi: TreeNodeApi<Id, Value>): IntentToEffect<Id, Value>;
|
|
14
|
+
//# sourceMappingURL=intent-to-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-to-effect.d.ts","sourceRoot":"","sources":["../../../src/input/application/intent-to-effect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,KAAK,EACL,QAAQ,EACR,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKvE;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,IAAI,CAC9D,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,KACpB,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC;AAEnC,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,eAAe,EAAE,KAAK,EACpE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAC7B,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,EACxB,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,GAClC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAkE3B"}
|