@dxos/app-framework 0.4.4-main.3a00f69 → 0.4.4-main.4dba395

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/lib/browser/{chunk-MNFAM2GF.mjs → chunk-7TTLFUDC.mjs} +3 -3
  2. package/dist/lib/browser/{chunk-MNFAM2GF.mjs.map → chunk-7TTLFUDC.mjs.map} +3 -3
  3. package/dist/lib/browser/index.mjs +9 -6
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/{plugin-B5OKJ2C3.mjs → plugin-ABX2AJYN.mjs} +2 -2
  7. package/dist/lib/browser/plugin-ABX2AJYN.mjs.map +7 -0
  8. package/dist/lib/browser/{plugin-JDIMDLDU.mjs → plugin-OEWT2YOH.mjs} +2 -2
  9. package/dist/lib/node/{chunk-DC3GU6QR.cjs → chunk-BTZLKXA2.cjs} +7 -7
  10. package/dist/lib/node/{chunk-DC3GU6QR.cjs.map → chunk-BTZLKXA2.cjs.map} +3 -3
  11. package/dist/lib/node/index.cjs +15 -11
  12. package/dist/lib/node/index.cjs.map +3 -3
  13. package/dist/lib/node/meta.json +1 -1
  14. package/dist/lib/node/{plugin-JGSJGRMS.cjs → plugin-D3VWRWFN.cjs} +8 -8
  15. package/dist/lib/node/{plugin-KAN7BNOZ.cjs → plugin-J7A2JHKR.cjs} +5 -5
  16. package/dist/lib/node/plugin-J7A2JHKR.cjs.map +7 -0
  17. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts +1 -0
  18. package/dist/types/src/plugins/SurfacePlugin/Surface.d.ts.map +1 -1
  19. package/dist/types/src/plugins/SurfacePlugin/SurfaceRootContext.d.ts +1 -1
  20. package/dist/types/src/plugins/SurfacePlugin/SurfaceRootContext.d.ts.map +1 -1
  21. package/package.json +8 -8
  22. package/src/plugins/IntentPlugin/plugin.tsx +1 -1
  23. package/src/plugins/SurfacePlugin/Surface.tsx +7 -2
  24. package/src/plugins/SurfacePlugin/SurfaceRootContext.tsx +1 -1
  25. package/dist/lib/browser/plugin-B5OKJ2C3.mjs.map +0 -7
  26. package/dist/lib/node/plugin-KAN7BNOZ.cjs.map +0 -7
  27. /package/dist/lib/browser/{plugin-JDIMDLDU.mjs.map → plugin-OEWT2YOH.mjs.map} +0 -0
  28. /package/dist/lib/node/{plugin-JGSJGRMS.cjs.map → plugin-D3VWRWFN.cjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/Surface.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAGd,KAAK,iBAAiB,EAGvB,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,GAAG,eAAe,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAEnE;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO,yGAiBnB,CAAC"}
1
+ {"version":3,"file":"Surface.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/Surface.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,EAEZ,KAAK,SAAS,EAGd,KAAK,iBAAiB,EAGvB,MAAM,OAAO,CAAC;AAKf,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,gBAAgB,GAAG,OAAO,GAAG,eAAe,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,iBAAiB,CAAC;IAC3C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE/B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAEnE;;;OAGG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC;IAE9C;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;OAGG;IACH,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO,yGAiBnB,CAAC;AAIF,eAAO,MAAM,UAAU,QAAO,YAC+C,CAAC"}
@@ -21,7 +21,7 @@ export type SurfaceComponent = (props: SurfaceComponentProps, forwardedRef: Forw
21
21
  export type SurfaceRootContext = {
22
22
  components: Record<string, SurfaceComponent>;
23
23
  };
24
- export declare const useSurface: () => SurfaceRootContext;
24
+ export declare const useSurfaceRoot: () => SurfaceRootContext;
25
25
  export declare const SurfaceProvider: Provider<SurfaceRootContext>;
26
26
  export {};
27
27
  //# sourceMappingURL=SurfaceRootContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SurfaceRootContext.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAElG,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,KAAK,oBAAoB,CAAC,IAAI,EAAE,GAAG,SAAS,MAAM,IAAI,IAAI,IAAI,GAAG;KAC9D,QAAQ,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;CACpC,CAAC;AAEF,KAAK,qBAAqB,GAAG,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,qBAAqB,EAC5B,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,KACpC,GAAG,CAAC,OAAO,GAAG,aAAa,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC9C,CAAC;AAIF,eAAO,MAAM,UAAU,0BAAuC,CAAC;AAE/D,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,kBAAkB,CAA+B,CAAC"}
1
+ {"version":3,"file":"SurfaceRootContext.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/SurfacePlugin/SurfaceRootContext.tsx"],"names":[],"mappings":"AAIA,OAAO,EAA2C,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAElG,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAG9C,KAAK,oBAAoB,CAAC,IAAI,EAAE,GAAG,SAAS,MAAM,IAAI,IAAI,IAAI,GAAG;KAC9D,QAAQ,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;CACpC,CAAC;AAEF,KAAK,qBAAqB,GAAG,oBAAoB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,KAAK,EAAE,qBAAqB,EAC5B,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,KACpC,GAAG,CAAC,OAAO,GAAG,aAAa,GAAG,IAAI,CAAC;AAExC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC9C,CAAC;AAIF,eAAO,MAAM,cAAc,0BAAuC,CAAC;AAEnE,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,kBAAkB,CAA+B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/app-framework",
3
- "version": "0.4.4-main.3a00f69",
3
+ "version": "0.4.4-main.4dba395",
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,13 +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/async": "0.4.4-main.3a00f69",
20
- "@dxos/debug": "0.4.4-main.3a00f69",
21
- "@dxos/invariant": "0.4.4-main.3a00f69",
22
- "@dxos/app-graph": "0.4.4-main.3a00f69",
23
- "@dxos/local-storage": "0.4.4-main.3a00f69",
24
- "@dxos/log": "0.4.4-main.3a00f69",
25
- "@dxos/util": "0.4.4-main.3a00f69"
19
+ "@dxos/app-graph": "0.4.4-main.4dba395",
20
+ "@dxos/async": "0.4.4-main.4dba395",
21
+ "@dxos/debug": "0.4.4-main.4dba395",
22
+ "@dxos/invariant": "0.4.4-main.4dba395",
23
+ "@dxos/local-storage": "0.4.4-main.4dba395",
24
+ "@dxos/util": "0.4.4-main.4dba395",
25
+ "@dxos/log": "0.4.4-main.4dba395"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/react": "^18.0.21",
@@ -42,7 +42,7 @@ const IntentPlugin = (): PluginDefinition<IntentPluginProvides> => {
42
42
  ready: async (plugins) => {
43
43
  // Dispatch intent to associated plugin.
44
44
  const dispatch = async (intent: Intent) => {
45
- log.info('dispatch', { action: intent.action, intent });
45
+ log('dispatch', { action: intent.action, intent });
46
46
  if (intent.plugin) {
47
47
  for (const entry of dynamicResolvers) {
48
48
  if (entry.plugin === intent.plugin) {
@@ -13,8 +13,10 @@ import React, {
13
13
  } from 'react';
14
14
  import { createContext, useContext } from 'react';
15
15
 
16
+ import { raise } from '@dxos/debug';
17
+
16
18
  import { ErrorBoundary } from './ErrorBoundary';
17
- import { type SurfaceComponent, useSurface, type SurfaceResult } from './SurfaceRootContext';
19
+ import { type SurfaceComponent, type SurfaceResult, useSurfaceRoot } from './SurfaceRootContext';
18
20
 
19
21
  /**
20
22
  * Direction determines how multiple components are laid out.
@@ -97,8 +99,11 @@ export const Surface = forwardRef<HTMLElement, SurfaceProps>(
97
99
 
98
100
  const SurfaceContext = createContext<SurfaceProps | null>(null);
99
101
 
102
+ export const useSurface = (): SurfaceProps =>
103
+ useContext(SurfaceContext) ?? raise(new Error('Surface context not found'));
104
+
100
105
  const SurfaceResolver = forwardRef<HTMLElement, SurfaceProps>((props, forwardedRef) => {
101
- const { components } = useSurface();
106
+ const { components } = useSurfaceRoot();
102
107
  const parent = useContext(SurfaceContext);
103
108
  const nodes = resolveNodes(components, props, parent, forwardedRef);
104
109
  const currentContext: SurfaceProps = {
@@ -39,6 +39,6 @@ export type SurfaceRootContext = {
39
39
 
40
40
  const SurfaceRootContext: Context<SurfaceRootContext> = createContext<SurfaceRootContext>({ components: {} });
41
41
 
42
- export const useSurface = () => useContext(SurfaceRootContext);
42
+ export const useSurfaceRoot = () => useContext(SurfaceRootContext);
43
43
 
44
44
  export const SurfaceProvider: Provider<SurfaceRootContext> = SurfaceRootContext.Provider;
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugins/IntentPlugin/plugin.tsx", "../../../src/plugins/IntentPlugin/helpers.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type IntentContext, IntentProvider, type IntentExecution } from './IntentContext';\nimport { isUndoable } from './helpers';\nimport type { Intent, IntentResolver } from './intent';\nimport IntentMeta from './meta';\nimport {\n type IntentPluginProvides,\n type IntentResolverProvides,\n parseIntentResolverPlugin,\n IntentAction,\n} from './provides';\nimport type { PluginDefinition } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nconst EXECUTION_LIMIT = 1000;\nconst HISTORY_LIMIT = 100;\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>({\n dispatch: async () => ({}),\n undo: async () => ({}),\n history: [],\n registerResolver: () => () => {},\n });\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 log.info('dispatch', { action: intent.action, intent });\n if (intent.plugin) {\n for (const entry of dynamicResolvers) {\n if (entry.plugin === intent.plugin) {\n const result = await entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n }\n\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n const result = plugin?.provides.intent.resolver(intent, plugins);\n return result;\n }\n\n for (const entry of dynamicResolvers) {\n const result = await 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 // https://vitejs.dev/guide/env-and-mode#env-variables\n // TODO(wittjosiah): How to handle this more generically?\n if (import.meta?.env?.DEV) {\n log.warn('No plugin found to handle intent', intent);\n }\n };\n\n // Sequentially dispatch array of invents.\n const dispatchChain = async (intentOrArray: Intent | Intent[], depth = 0) => {\n if (depth > EXECUTION_LIMIT) {\n return {\n error: new Error(\n `Intent execution limit exceeded (${EXECUTION_LIMIT} iterations). This is likely due to an infinite loop within intent resolvers.`,\n ),\n };\n }\n\n const executionResults: IntentExecution[] = [];\n const chain = Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray];\n for (const intent of chain) {\n const { result: prevResult } = executionResults.at(-1) ?? {};\n const data = intent.data ? { result: prevResult?.data, ...intent.data } : prevResult?.data;\n const result = await dispatch({ ...intent, data });\n\n if (!result || result?.error) {\n break;\n }\n\n executionResults.push({ intent, result });\n\n // TODO(wittjosiah): How does undo work with returned intents?\n result?.intents?.forEach((intents) => {\n void dispatchChain(intents, depth + 1);\n });\n }\n\n state.history = [...state.history.slice(0, HISTORY_LIMIT - 2), executionResults];\n\n if (isUndoable(executionResults)) {\n void dispatch({ action: IntentAction.SHOW_UNDO, data: { results: executionResults } });\n }\n\n return executionResults.at(-1)?.result;\n };\n\n const undo = async () => {\n const last = state.history.findLastIndex(isUndoable);\n const chain =\n last !== -1 &&\n state.history[last]?.map(({ intent, result }): Intent => {\n const data = result.undoable?.data ? { ...intent.data, ...result.undoable.data } : intent.data;\n return { ...intent, data, undo: true };\n });\n if (chain) {\n const result = await dispatchChain(chain);\n state.history = state.history.filter((_, index) => index !== last);\n return result;\n }\n };\n\n state.dispatch = dispatchChain;\n state.undo = undo;\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", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type IntentExecution } from './IntentContext';\n\n/**\n * Check if the chain of intents is undoable.\n */\nexport const isUndoable = (chain: IntentExecution[]): boolean =>\n chain.length > 0 && chain.every(({ result }) => result.undoable);\n"],
5
- "mappings": "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",
6
- "names": ["deepSignal", "React", "log", "isUndoable", "chain", "length", "every", "result", "undoable", "EXECUTION_LIMIT", "HISTORY_LIMIT", "IntentPlugin", "state", "deepSignal", "dispatch", "undo", "history", "registerResolver", "dynamicResolvers", "Set", "meta", "IntentMeta", "ready", "plugins", "intent", "log", "info", "action", "plugin", "entry", "result", "resolver", "findPlugin", "provides", "filterPlugins", "parseIntentResolverPlugin", "env", "DEV", "warn", "dispatchChain", "intentOrArray", "depth", "error", "Error", "executionResults", "chain", "Array", "isArray", "prevResult", "at", "data", "push", "intents", "forEach", "slice", "isUndoable", "IntentAction", "SHOW_UNDO", "results", "last", "findLastIndex", "map", "undoable", "filter", "_", "index", "add", "delete", "context", "children", "IntentProvider", "value"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/plugins/IntentPlugin/plugin.tsx", "../../../src/plugins/IntentPlugin/helpers.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { deepSignal } from 'deepsignal/react';\nimport React from 'react';\n\nimport { log } from '@dxos/log';\n\nimport { type IntentContext, IntentProvider, type IntentExecution } from './IntentContext';\nimport { isUndoable } from './helpers';\nimport type { Intent, IntentResolver } from './intent';\nimport IntentMeta from './meta';\nimport {\n type IntentPluginProvides,\n type IntentResolverProvides,\n parseIntentResolverPlugin,\n IntentAction,\n} from './provides';\nimport type { PluginDefinition } from '../PluginHost';\nimport { filterPlugins, findPlugin } from '../helpers';\n\nconst EXECUTION_LIMIT = 1000;\nconst HISTORY_LIMIT = 100;\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>({\n dispatch: async () => ({}),\n undo: async () => ({}),\n history: [],\n registerResolver: () => () => {},\n });\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 log.info('dispatch', { action: intent.action, intent });\n if (intent.plugin) {\n for (const entry of dynamicResolvers) {\n if (entry.plugin === intent.plugin) {\n const result = await entry.resolver(intent, plugins);\n if (result) {\n return result;\n }\n }\n }\n\n const plugin = findPlugin<IntentResolverProvides>(plugins, intent.plugin);\n const result = plugin?.provides.intent.resolver(intent, plugins);\n return result;\n }\n\n for (const entry of dynamicResolvers) {\n const result = await 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 // https://vitejs.dev/guide/env-and-mode#env-variables\n // TODO(wittjosiah): How to handle this more generically?\n if (import.meta?.env?.DEV) {\n log.warn('No plugin found to handle intent', intent);\n }\n };\n\n // Sequentially dispatch array of invents.\n const dispatchChain = async (intentOrArray: Intent | Intent[], depth = 0) => {\n if (depth > EXECUTION_LIMIT) {\n return {\n error: new Error(\n `Intent execution limit exceeded (${EXECUTION_LIMIT} iterations). This is likely due to an infinite loop within intent resolvers.`,\n ),\n };\n }\n\n const executionResults: IntentExecution[] = [];\n const chain = Array.isArray(intentOrArray) ? intentOrArray : [intentOrArray];\n for (const intent of chain) {\n const { result: prevResult } = executionResults.at(-1) ?? {};\n const data = intent.data ? { result: prevResult?.data, ...intent.data } : prevResult?.data;\n const result = await dispatch({ ...intent, data });\n\n if (!result || result?.error) {\n break;\n }\n\n executionResults.push({ intent, result });\n\n // TODO(wittjosiah): How does undo work with returned intents?\n result?.intents?.forEach((intents) => {\n void dispatchChain(intents, depth + 1);\n });\n }\n\n state.history = [...state.history.slice(0, HISTORY_LIMIT - 2), executionResults];\n\n if (isUndoable(executionResults)) {\n void dispatch({ action: IntentAction.SHOW_UNDO, data: { results: executionResults } });\n }\n\n return executionResults.at(-1)?.result;\n };\n\n const undo = async () => {\n const last = state.history.findLastIndex(isUndoable);\n const chain =\n last !== -1 &&\n state.history[last]?.map(({ intent, result }): Intent => {\n const data = result.undoable?.data ? { ...intent.data, ...result.undoable.data } : intent.data;\n return { ...intent, data, undo: true };\n });\n if (chain) {\n const result = await dispatchChain(chain);\n state.history = state.history.filter((_, index) => index !== last);\n return result;\n }\n };\n\n state.dispatch = dispatchChain;\n state.undo = undo;\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", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type IntentExecution } from './IntentContext';\n\n/**\n * Check if the chain of intents is undoable.\n */\nexport const isUndoable = (chain: IntentExecution[]): boolean =>\n chain.length > 0 && chain.every(({ result }) => result.undoable);\n"],
5
- "mappings": "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",
6
- "names": ["import_react", "isUndoable", "chain", "length", "every", "result", "undoable", "EXECUTION_LIMIT", "HISTORY_LIMIT", "IntentPlugin", "state", "deepSignal", "dispatch", "undo", "history", "registerResolver", "dynamicResolvers", "Set", "meta", "IntentMeta", "ready", "plugins", "intent", "log", "info", "action", "plugin", "entry", "resolver", "findPlugin", "provides", "filterPlugins", "parseIntentResolverPlugin", "env", "DEV", "warn", "dispatchChain", "intentOrArray", "depth", "error", "Error", "executionResults", "Array", "isArray", "prevResult", "at", "data", "push", "intents", "forEach", "slice", "IntentAction", "SHOW_UNDO", "results", "last", "findLastIndex", "map", "filter", "_", "index", "add", "delete", "context", "children", "React", "IntentProvider", "value"]
7
- }