@dxos/app-framework 0.3.11-main.c8e9429 → 0.3.11-main.cb8120f
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/lib/browser/{chunk-QYIBDGYI.mjs → chunk-7MQ2DVDI.mjs} +2 -3
- package/dist/lib/browser/{chunk-QYIBDGYI.mjs.map → chunk-7MQ2DVDI.mjs.map} +2 -2
- package/dist/lib/browser/index.mjs +2 -2
- package/dist/lib/browser/index.mjs.map +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{plugin-YLDDUID4.mjs → plugin-KC4DT4AJ.mjs} +34 -13
- package/dist/lib/browser/plugin-KC4DT4AJ.mjs.map +7 -0
- package/dist/lib/node/{chunk-YWRBMGDT.cjs → chunk-FETX4EGX.cjs} +5 -6
- package/dist/lib/node/{chunk-YWRBMGDT.cjs.map → chunk-FETX4EGX.cjs.map} +2 -2
- package/dist/lib/node/index.cjs +10 -10
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{plugin-NP3IH5Q3.cjs → plugin-RDMDEGRT.cjs} +40 -19
- package/dist/lib/node/plugin-RDMDEGRT.cjs.map +7 -0
- package/dist/types/src/plugins/IntentPlugin/intent.d.ts +33 -2
- package/dist/types/src/plugins/IntentPlugin/intent.d.ts.map +1 -1
- package/dist/types/src/plugins/IntentPlugin/plugin.d.ts.map +1 -1
- package/dist/types/src/plugins/common/layout.d.ts +15 -14
- package/dist/types/src/plugins/common/layout.d.ts.map +1 -1
- package/package.json +8 -7
- package/src/plugins/IntentPlugin/IntentContext.tsx +1 -1
- package/src/plugins/IntentPlugin/intent.ts +38 -2
- package/src/plugins/IntentPlugin/plugin.tsx +34 -9
- package/src/plugins/common/layout.ts +15 -14
- package/tsconfig.json +3 -0
- package/dist/lib/browser/plugin-YLDDUID4.mjs.map +0 -7
- package/dist/lib/node/plugin-NP3IH5Q3.cjs.map +0 -7
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { type IntentData } from '../IntentPlugin';
|
|
2
3
|
import type { Plugin } from '../PluginHost';
|
|
3
4
|
/**
|
|
4
5
|
* Basic state provided by a layout plugin.
|
|
@@ -63,28 +64,28 @@ export declare enum LayoutAction {
|
|
|
63
64
|
* Expected payload for layout actions.
|
|
64
65
|
*/
|
|
65
66
|
export declare namespace LayoutAction {
|
|
66
|
-
type ToggleFullscreen = {
|
|
67
|
+
type ToggleFullscreen = IntentData<{
|
|
67
68
|
state?: boolean;
|
|
68
|
-
}
|
|
69
|
-
type ToggleSidebar = {
|
|
69
|
+
}>;
|
|
70
|
+
type ToggleSidebar = IntentData<{
|
|
70
71
|
state?: boolean;
|
|
71
|
-
}
|
|
72
|
-
type ToggleComplementarySidebar = {
|
|
72
|
+
}>;
|
|
73
|
+
type ToggleComplementarySidebar = IntentData<{
|
|
73
74
|
state?: boolean;
|
|
74
|
-
}
|
|
75
|
-
type OpenDialog = {
|
|
75
|
+
}>;
|
|
76
|
+
type OpenDialog = IntentData<{
|
|
76
77
|
component: string;
|
|
77
78
|
subject: any;
|
|
78
|
-
}
|
|
79
|
-
type CloseDialog = {}
|
|
80
|
-
type OpenPopover = {
|
|
79
|
+
}>;
|
|
80
|
+
type CloseDialog = IntentData<{}>;
|
|
81
|
+
type OpenPopover = IntentData<{
|
|
81
82
|
anchorId: string;
|
|
82
83
|
component: string;
|
|
83
84
|
subject: any;
|
|
84
|
-
}
|
|
85
|
-
type ClosePopover = {}
|
|
86
|
-
type Activate = {
|
|
85
|
+
}>;
|
|
86
|
+
type ClosePopover = IntentData<{}>;
|
|
87
|
+
type Activate = IntentData<{
|
|
87
88
|
id: string;
|
|
88
|
-
}
|
|
89
|
+
}>;
|
|
89
90
|
}
|
|
90
91
|
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/layout.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAM5C;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBjB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,WAAY,MAAM,uCAG/C,CAAC;AAQF,oBAAY,YAAY;IACtB,iBAAiB,6CAAuC;IACxD,cAAc,0CAAoC;IAClD,4BAA4B,wDAAkD;IAC9E,WAAW,uCAAiC;IAC5C,YAAY,wCAAkC;IAC9C,YAAY,wCAAkC;IAC9C,aAAa,yCAAmC;IAChD,QAAQ,oCAA8B;IACtC,KAAK,iCAA2B;CACjC;AAED;;GAEG;AACH,yBAAiB,YAAY,CAAC;IAC5B,KAAY,gBAAgB,GAAG;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/common/layout.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAM5C;;GAEG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBjB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAC1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,WAAY,MAAM,uCAG/C,CAAC;AAQF,oBAAY,YAAY;IACtB,iBAAiB,6CAAuC;IACxD,cAAc,0CAAoC;IAClD,4BAA4B,wDAAkD;IAC9E,WAAW,uCAAiC;IAC5C,YAAY,wCAAkC;IAC9C,YAAY,wCAAkC;IAC9C,aAAa,yCAAmC;IAChD,QAAQ,oCAA8B;IACtC,KAAK,iCAA2B;CACjC;AAED;;GAEG;AACH,yBAAiB,YAAY,CAAC;IAC5B,KAAY,gBAAgB,GAAG,UAAU,CAAC;QACxC,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IAEH,KAAY,aAAa,GAAG,UAAU,CAAC;QACrC,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IAEH,KAAY,0BAA0B,GAAG,UAAU,CAAC;QAClD,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IAEH,KAAY,UAAU,GAAG,UAAU,CAAC;QAClC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;IAEH,KAAY,WAAW,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAEzC,KAAY,WAAW,GAAG,UAAU,CAAC;QACnC,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,GAAG,CAAC;KACd,CAAC,CAAC;IAEH,KAAY,YAAY,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAE1C,KAAY,QAAQ,GAAG,UAAU,CAAC;QAChC,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/app-framework",
|
|
3
|
-
"version": "0.3.11-main.
|
|
3
|
+
"version": "0.3.11-main.cb8120f",
|
|
4
4
|
"description": "A framework for building applications from composible plugins.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,12 +16,13 @@
|
|
|
16
16
|
"@preact/signals-react": "^1.3.6",
|
|
17
17
|
"deepsignal": "1.4.0-shallow.0",
|
|
18
18
|
"zod": "^3.22.4",
|
|
19
|
-
"@dxos/
|
|
20
|
-
"@dxos/app-graph": "0.3.11-main.
|
|
21
|
-
"@dxos/
|
|
22
|
-
"@dxos/
|
|
23
|
-
"@dxos/
|
|
24
|
-
"@dxos/
|
|
19
|
+
"@dxos/async": "0.3.11-main.cb8120f",
|
|
20
|
+
"@dxos/app-graph": "0.3.11-main.cb8120f",
|
|
21
|
+
"@dxos/debug": "0.3.11-main.cb8120f",
|
|
22
|
+
"@dxos/invariant": "0.3.11-main.cb8120f",
|
|
23
|
+
"@dxos/local-storage": "0.3.11-main.cb8120f",
|
|
24
|
+
"@dxos/log": "0.3.11-main.cb8120f",
|
|
25
|
+
"@dxos/util": "0.3.11-main.cb8120f"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
28
|
"@types/react": "^18.0.21",
|
|
@@ -2,8 +2,17 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import type { MaybePromise } from '@dxos/util';
|
|
6
|
+
|
|
5
7
|
import type { Plugin } from '../PluginHost';
|
|
6
8
|
|
|
9
|
+
export type IntentData<T extends Record<string, any> = Record<string, any>> = T & {
|
|
10
|
+
/**
|
|
11
|
+
* The data from the result of the previous intent.
|
|
12
|
+
*/
|
|
13
|
+
result?: any;
|
|
14
|
+
};
|
|
15
|
+
|
|
7
16
|
/**
|
|
8
17
|
* An intent is an abstract description of an operation to be performed.
|
|
9
18
|
* Intents allow actions to be performed across plugins.
|
|
@@ -24,7 +33,28 @@ export type Intent = {
|
|
|
24
33
|
/**
|
|
25
34
|
* Any data needed to perform the desired action.
|
|
26
35
|
*/
|
|
36
|
+
data?: IntentData;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type IntentResult = {
|
|
40
|
+
/**
|
|
41
|
+
* The output of the action that was performed.
|
|
42
|
+
*
|
|
43
|
+
* If the intent is apart of a chain of intents, the data will be passed to the next intent.
|
|
44
|
+
*/
|
|
27
45
|
data?: any;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* An error that occurred while performing the action.
|
|
49
|
+
*
|
|
50
|
+
* If the intent is apart of a chain of intents and an error occurs, the chain will be aborted.
|
|
51
|
+
*/
|
|
52
|
+
error?: Error;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Other intent chains to be triggered.
|
|
56
|
+
*/
|
|
57
|
+
intents?: Intent[][];
|
|
28
58
|
};
|
|
29
59
|
|
|
30
60
|
/**
|
|
@@ -33,6 +63,12 @@ export type Intent = {
|
|
|
33
63
|
*
|
|
34
64
|
* @returns The result of the last intent.
|
|
35
65
|
*/
|
|
36
|
-
export type IntentDispatcher = (intent: Intent | Intent[]) => Promise<
|
|
66
|
+
export type IntentDispatcher = (intent: Intent | Intent[]) => Promise<IntentResult | void>;
|
|
37
67
|
|
|
38
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Resolves an intent that was dispatched.
|
|
70
|
+
* If the intent is not handled, nothing should be returned.
|
|
71
|
+
*
|
|
72
|
+
* @returns The result of the intent.
|
|
73
|
+
*/
|
|
74
|
+
export type IntentResolver = (intent: Intent, plugins: Plugin[]) => MaybePromise<IntentResult | void>;
|
|
@@ -5,19 +5,23 @@
|
|
|
5
5
|
import { deepSignal } from 'deepsignal/react';
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
8
|
+
import { log } from '@dxos/log';
|
|
9
|
+
|
|
8
10
|
import { type IntentContext, IntentProvider } from './IntentContext';
|
|
9
|
-
import type { Intent, IntentResolver } from './intent';
|
|
11
|
+
import type { Intent, IntentResolver, IntentResult } from './intent';
|
|
10
12
|
import IntentMeta from './meta';
|
|
11
13
|
import { type IntentPluginProvides, type IntentResolverProvides, parseIntentResolverPlugin } from './provides';
|
|
12
14
|
import type { PluginDefinition } from '../PluginHost';
|
|
13
15
|
import { filterPlugins, findPlugin } from '../helpers';
|
|
14
16
|
|
|
17
|
+
const EXECUTION_LIMIT = 1000;
|
|
18
|
+
|
|
15
19
|
/**
|
|
16
20
|
* Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.
|
|
17
21
|
* Inspired by https://developer.android.com/reference/android/content/Intent.
|
|
18
22
|
*/
|
|
19
23
|
const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
|
|
20
|
-
const state = deepSignal<IntentContext>({ dispatch: async () => {}, registerResolver: () => () => {} });
|
|
24
|
+
const state = deepSignal<IntentContext>({ dispatch: async () => ({}), registerResolver: () => () => {} });
|
|
21
25
|
|
|
22
26
|
const dynamicResolvers = new Set<{ plugin: string; resolver: IntentResolver }>();
|
|
23
27
|
|
|
@@ -29,7 +33,7 @@ const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
|
|
|
29
33
|
if (intent.plugin) {
|
|
30
34
|
for (const entry of dynamicResolvers) {
|
|
31
35
|
if (entry.plugin === intent.plugin) {
|
|
32
|
-
const result = entry.resolver(intent, plugins);
|
|
36
|
+
const result = await entry.resolver(intent, plugins);
|
|
33
37
|
if (result) {
|
|
34
38
|
return result;
|
|
35
39
|
}
|
|
@@ -37,11 +41,12 @@ const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
|
|
|
37
41
|
}
|
|
38
42
|
|
|
39
43
|
const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);
|
|
40
|
-
|
|
44
|
+
const result = plugin?.provides.intent.resolver(intent, plugins);
|
|
45
|
+
return result;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
for (const entry of dynamicResolvers) {
|
|
44
|
-
const result = entry.resolver(intent, plugins);
|
|
49
|
+
const result = await entry.resolver(intent, plugins);
|
|
45
50
|
if (result) {
|
|
46
51
|
return result;
|
|
47
52
|
}
|
|
@@ -54,18 +59,38 @@ const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
|
|
|
54
59
|
return result;
|
|
55
60
|
}
|
|
56
61
|
}
|
|
62
|
+
|
|
63
|
+
log.warn('No plugin found to handle intent', intent);
|
|
57
64
|
};
|
|
58
65
|
|
|
59
66
|
// Sequentially dispatch array of invents.
|
|
60
|
-
|
|
61
|
-
|
|
67
|
+
const dispatchChain = async (intentOrArray: Intent | Intent[], depth = 0) => {
|
|
68
|
+
if (depth > EXECUTION_LIMIT) {
|
|
69
|
+
return {
|
|
70
|
+
error: new Error(
|
|
71
|
+
`Intent execution limit exceeded (${EXECUTION_LIMIT} iterations). This is likely due to an infinite loop within intent resolvers.`,
|
|
72
|
+
),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
let result: IntentResult | undefined;
|
|
62
77
|
for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {
|
|
63
|
-
const data = intent.data ? {
|
|
64
|
-
result = await dispatch({ ...intent, data });
|
|
78
|
+
const data = intent.data ? { result: result?.data, ...intent.data } : result?.data;
|
|
79
|
+
result = (await dispatch({ ...intent, data })) ?? undefined;
|
|
80
|
+
|
|
81
|
+
if (result?.error) {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
result?.intents?.forEach((intents) => {
|
|
86
|
+
void dispatchChain(intents, depth + 1);
|
|
87
|
+
});
|
|
65
88
|
}
|
|
89
|
+
|
|
66
90
|
return result;
|
|
67
91
|
};
|
|
68
92
|
|
|
93
|
+
state.dispatch = dispatchChain;
|
|
69
94
|
state.registerResolver = (plugin, resolver) => {
|
|
70
95
|
const entry = { plugin, resolver };
|
|
71
96
|
dynamicResolvers.add(entry);
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
|
|
7
|
+
import { type IntentData } from '../IntentPlugin';
|
|
7
8
|
import type { Plugin } from '../PluginHost';
|
|
8
9
|
|
|
9
10
|
//
|
|
@@ -72,34 +73,34 @@ export enum LayoutAction {
|
|
|
72
73
|
* Expected payload for layout actions.
|
|
73
74
|
*/
|
|
74
75
|
export namespace LayoutAction {
|
|
75
|
-
export type ToggleFullscreen = {
|
|
76
|
+
export type ToggleFullscreen = IntentData<{
|
|
76
77
|
state?: boolean;
|
|
77
|
-
}
|
|
78
|
+
}>;
|
|
78
79
|
|
|
79
|
-
export type ToggleSidebar = {
|
|
80
|
+
export type ToggleSidebar = IntentData<{
|
|
80
81
|
state?: boolean;
|
|
81
|
-
}
|
|
82
|
+
}>;
|
|
82
83
|
|
|
83
|
-
export type ToggleComplementarySidebar = {
|
|
84
|
+
export type ToggleComplementarySidebar = IntentData<{
|
|
84
85
|
state?: boolean;
|
|
85
|
-
}
|
|
86
|
+
}>;
|
|
86
87
|
|
|
87
|
-
export type OpenDialog = {
|
|
88
|
+
export type OpenDialog = IntentData<{
|
|
88
89
|
component: string;
|
|
89
90
|
subject: any;
|
|
90
|
-
}
|
|
91
|
+
}>;
|
|
91
92
|
|
|
92
|
-
export type CloseDialog = {}
|
|
93
|
+
export type CloseDialog = IntentData<{}>;
|
|
93
94
|
|
|
94
|
-
export type OpenPopover = {
|
|
95
|
+
export type OpenPopover = IntentData<{
|
|
95
96
|
anchorId: string;
|
|
96
97
|
component: string;
|
|
97
98
|
subject: any;
|
|
98
|
-
}
|
|
99
|
+
}>;
|
|
99
100
|
|
|
100
|
-
export type ClosePopover = {}
|
|
101
|
+
export type ClosePopover = IntentData<{}>;
|
|
101
102
|
|
|
102
|
-
export type Activate = {
|
|
103
|
+
export type Activate = IntentData<{
|
|
103
104
|
id: string;
|
|
104
|
-
}
|
|
105
|
+
}>;
|
|
105
106
|
}
|
package/tsconfig.json
CHANGED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/plugins/IntentPlugin/plugin.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport type { Intent, IntentResolver } from './intent';\nimport IntentMeta from './meta';\nimport { type IntentPluginProvides, type IntentResolverProvides, parseIntentResolverPlugin } from './provides';\nimport type { PluginDefinition } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\n/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nconst IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {}, registerResolver: () => () => {} });\n\n const dynamicResolvers = new Set<{ plugin: string; resolver: IntentResolver }>();\n\n return {\n meta: IntentMeta,\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = async (intent: Intent) => {\n if (intent.plugin) {\n for (const entry of dynamicResolvers) {\n if (entry.plugin === intent.plugin) {\n const result = entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n }\n\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n for (const entry of dynamicResolvers) {\n const result = entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n\n // Return resolved value from first plugin that handles the intent.\n for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {\n const result = await plugin.provides.intent.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n\n state.registerResolver = (plugin, resolver) => {\n const entry = { plugin, resolver };\n dynamicResolvers.add(entry);\n return () => dynamicResolvers.delete(entry);\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n\nexport default IntentPlugin;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;AAIA,SAASA,kBAAkB;AAC3B,OAAOC,WAAW;AAalB,IAAMC,eAAe,MAAA;AACnB,QAAMC,QAAQC,WAA0B;IAAEC,UAAU,YAAA;IAAa;IAAGC,kBAAkB,MAAM,MAAA;IAAO;EAAE,CAAA;AAErG,QAAMC,mBAAmB,oBAAIC,IAAAA;AAE7B,SAAO;IACLC,MAAMC;IACNC,OAAO,OAAOC,YAAAA;AAEZ,YAAMP,WAAW,OAAOQ,WAAAA;AACtB,YAAIA,OAAOC,QAAQ;AACjB,qBAAWC,SAASR,kBAAkB;AACpC,gBAAIQ,MAAMD,WAAWD,OAAOC,QAAQ;AAClC,oBAAME,SAASD,MAAME,SAASJ,QAAQD,OAAAA;AACtC,kBAAII,QAAQ;AACV,uBAAOA;cACT;YACF;UACF;AAEA,gBAAMF,SAASI,WAAmCN,SAASC,OAAOC,MAAM;AACxE,iBAAOA,QAAQK,SAASN,OAAOI,SAASJ,QAAQD,OAAAA;QAClD;AAEA,mBAAWG,SAASR,kBAAkB;AACpC,gBAAMS,SAASD,MAAME,SAASJ,QAAQD,OAAAA;AACtC,cAAII,QAAQ;AACV,mBAAOA;UACT;QACF;AAGA,mBAAWF,UAAUM,cAAcR,SAASS,yBAAAA,GAA4B;AACtE,gBAAML,SAAS,MAAMF,OAAOK,SAASN,OAAOI,SAASJ,QAAQD,OAAAA;AAC7D,cAAII,QAAQ;AACV,mBAAOA;UACT;QACF;MACF;AAGAb,YAAME,WAAW,OAAOiB,kBAAAA;AACtB,YAAIN,SAAc;AAClB,mBAAWH,UAAUU,MAAMC,QAAQF,aAAAA,IAAiBA,gBAAgB;UAACA;WAAgB;AACnF,gBAAMG,OAAOZ,OAAOY,OAAO;YAAE,GAAGT;YAAQ,GAAGH,OAAOY;UAAK,IAAIT;AAC3DA,mBAAS,MAAMX,SAAS;YAAE,GAAGQ;YAAQY;UAAK,CAAA;QAC5C;AACA,eAAOT;MACT;AAEAb,YAAMG,mBAAmB,CAACQ,QAAQG,aAAAA;AAChC,cAAMF,QAAQ;UAAED;UAAQG;QAAS;AACjCV,yBAAiBmB,IAAIX,KAAAA;AACrB,eAAO,MAAMR,iBAAiBoB,OAAOZ,KAAAA;MACvC;IACF;IACAI,UAAU;MACRN,QAAQV;MACRyB,SAAS,CAAC,EAAEC,SAAQ,MAAO,sBAAA,cAACC,gBAAAA;QAAeC,OAAO5B;SAAQ0B,QAAAA;IAC5D;EACF;AACF;AAEA,IAAA,iBAAe3B;",
|
|
6
|
-
"names": ["deepSignal", "React", "IntentPlugin", "state", "deepSignal", "dispatch", "registerResolver", "dynamicResolvers", "Set", "meta", "IntentMeta", "ready", "plugins", "intent", "plugin", "entry", "result", "resolver", "findPlugin", "provides", "filterPlugins", "parseIntentResolverPlugin", "intentOrArray", "Array", "isArray", "data", "add", "delete", "context", "children", "IntentProvider", "value"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/plugins/IntentPlugin/plugin.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { type IntentContext, IntentProvider } from './IntentContext';\nimport type { Intent, IntentResolver } from './intent';\nimport IntentMeta from './meta';\nimport { type IntentPluginProvides, type IntentResolverProvides, parseIntentResolverPlugin } from './provides';\nimport type { PluginDefinition } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\n/**\n * Allows plugins to register intent handlers and routes sent intents to the appropriate plugin.\n * Inspired by https://developer.android.com/reference/android/content/Intent.\n */\nconst IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {\n const state = deepSignal<IntentContext>({ dispatch: async () => {}, registerResolver: () => () => {} });\n\n const dynamicResolvers = new Set<{ plugin: string; resolver: IntentResolver }>();\n\n return {\n meta: IntentMeta,\n ready: async (plugins) => {\n // Dispatch intent to associated plugin.\n const dispatch = async (intent: Intent) => {\n if (intent.plugin) {\n for (const entry of dynamicResolvers) {\n if (entry.plugin === intent.plugin) {\n const result = entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n }\n\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n return plugin?.provides.intent.resolver(intent, plugins);\n }\n\n for (const entry of dynamicResolvers) {\n const result = entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n\n // Return resolved value from first plugin that handles the intent.\n for (const plugin of filterPlugins(plugins, parseIntentResolverPlugin)) {\n const result = await plugin.provides.intent.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n };\n\n // Sequentially dispatch array of invents.\n state.dispatch = async (intentOrArray) => {\n let result: any = null;\n for (const intent of Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray]) {\n const data = intent.data ? { ...result, ...intent.data } : result;\n result = await dispatch({ ...intent, data });\n }\n return result;\n };\n\n state.registerResolver = (plugin, resolver) => {\n const entry = { plugin, resolver };\n dynamicResolvers.add(entry);\n return () => dynamicResolvers.delete(entry);\n };\n },\n provides: {\n intent: state,\n context: ({ children }) => <IntentProvider value={state}>{children}</IntentProvider>,\n },\n };\n};\n\nexport default IntentPlugin;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAA2B;AAC3B,IAAAA,gBAAkB;AAalB,IAAMC,eAAe,MAAA;AACnB,QAAMC,YAAQC,yBAA0B;IAAEC,UAAU,YAAA;IAAa;IAAGC,kBAAkB,MAAM,MAAA;IAAO;EAAE,CAAA;AAErG,QAAMC,mBAAmB,oBAAIC,IAAAA;AAE7B,SAAO;IACLC,MAAMC;IACNC,OAAO,OAAOC,YAAAA;AAEZ,YAAMP,WAAW,OAAOQ,WAAAA;AACtB,YAAIA,OAAOC,QAAQ;AACjB,qBAAWC,SAASR,kBAAkB;AACpC,gBAAIQ,MAAMD,WAAWD,OAAOC,QAAQ;AAClC,oBAAME,SAASD,MAAME,SAASJ,QAAQD,OAAAA;AACtC,kBAAII,QAAQ;AACV,uBAAOA;cACT;YACF;UACF;AAEA,gBAAMF,aAASI,kCAAmCN,SAASC,OAAOC,MAAM;AACxE,iBAAOA,QAAQK,SAASN,OAAOI,SAASJ,QAAQD,OAAAA;QAClD;AAEA,mBAAWG,SAASR,kBAAkB;AACpC,gBAAMS,SAASD,MAAME,SAASJ,QAAQD,OAAAA;AACtC,cAAII,QAAQ;AACV,mBAAOA;UACT;QACF;AAGA,mBAAWF,cAAUM,qCAAcR,SAASS,+CAAAA,GAA4B;AACtE,gBAAML,SAAS,MAAMF,OAAOK,SAASN,OAAOI,SAASJ,QAAQD,OAAAA;AAC7D,cAAII,QAAQ;AACV,mBAAOA;UACT;QACF;MACF;AAGAb,YAAME,WAAW,OAAOiB,kBAAAA;AACtB,YAAIN,SAAc;AAClB,mBAAWH,UAAUU,MAAMC,QAAQF,aAAAA,IAAiBA,gBAAgB;UAACA;WAAgB;AACnF,gBAAMG,OAAOZ,OAAOY,OAAO;YAAE,GAAGT;YAAQ,GAAGH,OAAOY;UAAK,IAAIT;AAC3DA,mBAAS,MAAMX,SAAS;YAAE,GAAGQ;YAAQY;UAAK,CAAA;QAC5C;AACA,eAAOT;MACT;AAEAb,YAAMG,mBAAmB,CAACQ,QAAQG,aAAAA;AAChC,cAAMF,QAAQ;UAAED;UAAQG;QAAS;AACjCV,yBAAiBmB,IAAIX,KAAAA;AACrB,eAAO,MAAMR,iBAAiBoB,OAAOZ,KAAAA;MACvC;IACF;IACAI,UAAU;MACRN,QAAQV;MACRyB,SAAS,CAAC,EAAEC,SAAQ,MAAO,8BAAAC,QAAA,cAACC,sCAAAA;QAAeC,OAAO7B;SAAQ0B,QAAAA;IAC5D;EACF;AACF;AAEA,IAAA,iBAAe3B;",
|
|
6
|
-
"names": ["import_react", "IntentPlugin", "state", "deepSignal", "dispatch", "registerResolver", "dynamicResolvers", "Set", "meta", "IntentMeta", "ready", "plugins", "intent", "plugin", "entry", "result", "resolver", "findPlugin", "provides", "filterPlugins", "parseIntentResolverPlugin", "intentOrArray", "Array", "isArray", "data", "add", "delete", "context", "children", "React", "IntentProvider", "value"]
|
|
7
|
-
}
|