@xyo-network/react-node 4.3.10 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/hooks/useModulesFromNode.d.ts +3 -3
- package/dist/browser/hooks/useModulesFromNode.d.ts.map +1 -1
- package/dist/browser/hooks/useNodesFromNode.d.ts +2 -2
- package/dist/browser/hooks/useNodesFromNode.d.ts.map +1 -1
- package/dist/browser/hooks/useWeakModulesFromNode.d.ts +2 -2
- package/dist/browser/hooks/useWeakModulesFromNode.d.ts.map +1 -1
- package/dist/browser/hooks/useWeakNodesFromNode.d.ts +2 -2
- package/dist/browser/hooks/useWeakNodesFromNode.d.ts.map +1 -1
- package/dist/browser/index.mjs +24 -22
- package/dist/browser/index.mjs.map +1 -1
- package/package.json +16 -16
- package/src/hooks/useModulesFromNode.ts +15 -11
- package/src/hooks/useNodesFromNode.tsx +3 -3
- package/src/hooks/useWeakModulesFromNode.ts +14 -12
- package/src/hooks/useWeakNodesFromNode.tsx +3 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model';
|
|
2
2
|
import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts';
|
|
3
|
-
/** @deprecated use
|
|
4
|
-
export declare const useModulesFromNode: (
|
|
3
|
+
/** @deprecated use useWeakModulesFromNode */
|
|
4
|
+
export declare const useModulesFromNode: (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig) => [ModuleInstance[] | undefined, Error | undefined];
|
|
5
5
|
//# sourceMappingURL=useModulesFromNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useModulesFromNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGrE,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,SAAU,gBAAgB,EAAE,WAAW,oBAAoB,KAAG,CAAC,cAAc,EAAE,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CA6B5I,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModuleIdentifier } from '@xyo-network/module-model';
|
|
2
2
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
3
3
|
import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts';
|
|
4
4
|
/** @deprecated use useWeakNodesFromNode */
|
|
5
|
-
export declare const useNodesFromNode: (
|
|
5
|
+
export declare const useNodesFromNode: (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig) => [NodeInstance[] | null | undefined, Error | undefined];
|
|
6
6
|
//# sourceMappingURL=useNodesFromNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNodesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useNodesFromNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useNodesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useNodesFromNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGrE,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,SAAU,gBAAgB,EAAE,WAAW,oBAAoB,KAAG,CAAC,YAAY,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAiB/I,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model';
|
|
2
2
|
import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts';
|
|
3
|
-
export declare const useWeakModulesFromNode: (
|
|
3
|
+
export declare const useWeakModulesFromNode: (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig) => [WeakRef<ModuleInstance>[] | undefined, Error | undefined];
|
|
4
4
|
//# sourceMappingURL=useWeakModulesFromNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWeakModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWeakModulesFromNode.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useWeakModulesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWeakModulesFromNode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAIjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGrE,eAAO,MAAM,sBAAsB,SAC3B,gBAAgB,EAAE,WACf,oBAAoB,KAC5B,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CA8B3D,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModuleIdentifier } from '@xyo-network/module-model';
|
|
2
2
|
import type { NodeInstance } from '@xyo-network/node-model';
|
|
3
3
|
import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts';
|
|
4
|
-
export declare const useWeakNodesFromNode: (
|
|
4
|
+
export declare const useWeakNodesFromNode: (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig) => [WeakRef<NodeInstance>[] | null | undefined, Error | undefined];
|
|
5
5
|
//# sourceMappingURL=useWeakNodesFromNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useWeakNodesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWeakNodesFromNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useWeakNodesFromNode.d.ts","sourceRoot":"","sources":["../../../src/hooks/useWeakNodesFromNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAG3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGrE,eAAO,MAAM,oBAAoB,SACzB,gBAAgB,EAAE,WACf,oBAAoB,KAC5B,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAchE,CAAA"}
|
package/dist/browser/index.mjs
CHANGED
|
@@ -142,9 +142,10 @@ var useModuleFromNode = /* @__PURE__ */ __name((nameOrAddressOrInstance = void 0
|
|
|
142
142
|
}, "useModuleFromNode");
|
|
143
143
|
|
|
144
144
|
// src/hooks/useModulesFromNode.ts
|
|
145
|
+
import { exists } from "@xylabs/exists";
|
|
145
146
|
import { usePromise as usePromise3 } from "@xylabs/react-promise";
|
|
146
147
|
import { useState as useState2 } from "react";
|
|
147
|
-
var useModulesFromNode = /* @__PURE__ */ __name((
|
|
148
|
+
var useModulesFromNode = /* @__PURE__ */ __name((ids, config) => {
|
|
148
149
|
const [node, nodeError] = useNode(config);
|
|
149
150
|
const logger = config?.logger;
|
|
150
151
|
const filterOptions = getModuleFilterOptions();
|
|
@@ -152,25 +153,26 @@ var useModulesFromNode = /* @__PURE__ */ __name((filter, config) => {
|
|
|
152
153
|
const [, error] = usePromise3(async () => {
|
|
153
154
|
logger?.debug("useModuleFromNode: resolving");
|
|
154
155
|
if (node) {
|
|
156
|
+
const refreshModules = /* @__PURE__ */ __name(async () => {
|
|
157
|
+
const moduleInstances = ids ? (await Promise.all(ids.map((id) => node.resolve(id, filterOptions)))).filter(exists) : await node.resolve("*", filterOptions);
|
|
158
|
+
setResult(moduleInstances);
|
|
159
|
+
return moduleInstances;
|
|
160
|
+
}, "refreshModules");
|
|
155
161
|
node.on("moduleAttached", async ({ mod }) => {
|
|
156
162
|
logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`);
|
|
157
|
-
|
|
158
|
-
setResult(moduleInstances2);
|
|
163
|
+
await refreshModules();
|
|
159
164
|
});
|
|
160
165
|
node.on("moduleDetached", async ({ mod }) => {
|
|
161
166
|
logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`);
|
|
162
|
-
|
|
163
|
-
setResult(moduleInstances2);
|
|
167
|
+
await refreshModules();
|
|
164
168
|
});
|
|
165
|
-
|
|
166
|
-
setResult(moduleInstances);
|
|
167
|
-
return moduleInstances;
|
|
169
|
+
return await refreshModules();
|
|
168
170
|
}
|
|
169
171
|
console.log("Result: No Node");
|
|
170
172
|
return;
|
|
171
173
|
}, [
|
|
172
174
|
node,
|
|
173
|
-
|
|
175
|
+
ids
|
|
174
176
|
]);
|
|
175
177
|
return [
|
|
176
178
|
result,
|
|
@@ -217,8 +219,8 @@ var useNodeFromNode = /* @__PURE__ */ __name((nameOrAddressOrInstance, config) =
|
|
|
217
219
|
|
|
218
220
|
// src/hooks/useNodesFromNode.tsx
|
|
219
221
|
import { isNodeInstance } from "@xyo-network/node-model";
|
|
220
|
-
var useNodesFromNode = /* @__PURE__ */ __name((
|
|
221
|
-
const [modules, error] = useModulesFromNode(
|
|
222
|
+
var useNodesFromNode = /* @__PURE__ */ __name((ids, config) => {
|
|
223
|
+
const [modules, error] = useModulesFromNode(ids, config);
|
|
222
224
|
if (error) {
|
|
223
225
|
return [
|
|
224
226
|
null,
|
|
@@ -333,9 +335,10 @@ var useWeakModuleFromNode = /* @__PURE__ */ __name((nameOrAddressOrInstance = vo
|
|
|
333
335
|
}, "useWeakModuleFromNode");
|
|
334
336
|
|
|
335
337
|
// src/hooks/useWeakModulesFromNode.ts
|
|
338
|
+
import { exists as exists2 } from "@xylabs/exists";
|
|
336
339
|
import { usePromise as usePromise7 } from "@xylabs/react-promise";
|
|
337
340
|
import { useState as useState4 } from "react";
|
|
338
|
-
var useWeakModulesFromNode = /* @__PURE__ */ __name((
|
|
341
|
+
var useWeakModulesFromNode = /* @__PURE__ */ __name((ids, config) => {
|
|
339
342
|
const [node, nodeError] = useNode(config);
|
|
340
343
|
const logger = config?.logger;
|
|
341
344
|
const filterOptions = getModuleFilterOptions();
|
|
@@ -344,27 +347,26 @@ var useWeakModulesFromNode = /* @__PURE__ */ __name((filter, config) => {
|
|
|
344
347
|
logger?.debug("useModuleFromNode: resolving");
|
|
345
348
|
const nodeInstance = node;
|
|
346
349
|
if (nodeInstance) {
|
|
350
|
+
const refreshModules = /* @__PURE__ */ __name(async () => {
|
|
351
|
+
const moduleInstances = ids ? (await Promise.all(ids.map((id) => node.resolve(id, filterOptions)))).filter(exists2) : await node.resolve("*", filterOptions);
|
|
352
|
+
setResult(moduleInstances.map((mod) => new WeakRef(mod)));
|
|
353
|
+
return moduleInstances;
|
|
354
|
+
}, "refreshModules");
|
|
347
355
|
nodeInstance.on("moduleAttached", async ({ mod }) => {
|
|
348
|
-
const nodeInstance2 = node;
|
|
349
356
|
logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`);
|
|
350
|
-
|
|
351
|
-
setResult(moduleInstances2?.map((mod2) => new WeakRef(mod2)));
|
|
357
|
+
await refreshModules();
|
|
352
358
|
});
|
|
353
359
|
nodeInstance.on("moduleDetached", async ({ mod }) => {
|
|
354
|
-
const nodeInstance2 = node;
|
|
355
360
|
logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`);
|
|
356
|
-
|
|
357
|
-
setResult(moduleInstances2?.map((mod2) => new WeakRef(mod2)));
|
|
361
|
+
await refreshModules();
|
|
358
362
|
});
|
|
359
|
-
|
|
360
|
-
setResult(moduleInstances?.map((mod) => new WeakRef(mod)));
|
|
361
|
-
return moduleInstances;
|
|
363
|
+
return await refreshModules();
|
|
362
364
|
}
|
|
363
365
|
console.log("Result: No Node");
|
|
364
366
|
return;
|
|
365
367
|
}, [
|
|
366
368
|
node,
|
|
367
|
-
|
|
369
|
+
ids
|
|
368
370
|
]);
|
|
369
371
|
return [
|
|
370
372
|
result,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/Node.tsx","../../src/components/NodeDescriptionBox.tsx","../../src/hooks/getModuleFilterOptions.ts","../../src/hooks/getWeakModuleFilterOptions.ts","../../src/hooks/ModuleFromNodeConfig.ts","../../src/hooks/provided/useProvidedNode.tsx","../../src/hooks/provided/useWeakProvidedNode.tsx","../../src/hooks/useModuleFromNode.ts","../../src/hooks/useNode.ts","../../src/hooks/useNodeConfigNodeField.ts","../../src/hooks/useModulesFromNode.ts","../../src/hooks/useNodeDescription.ts","../../src/hooks/useNodeFromNode.tsx","../../src/hooks/useNodesFromNode.tsx","../../src/hooks/useWeakModuleFromNode.ts","../../src/hooks/useWeakNode.ts","../../src/hooks/useWeakNodeConfigNodeField.ts","../../src/hooks/WeakModuleFromNodeConfig.ts","../../src/hooks/useWeakModulesFromNode.ts","../../src/hooks/useWeakNodeDescription.ts","../../src/hooks/useWeakNodeFromNode.tsx","../../src/components/NodeDrawer.tsx","../../src/components/render/ModuleDescriptionBox.tsx","../../src/components/render/RenderModule.tsx","../../src/index.ts"],"sourcesContent":["import type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport React from 'react'\n\nimport { NodeDescriptionBox } from './NodeDescriptionBox.tsx'\n\nexport interface NodeBoxProps extends FlexBoxProps {\n node?: string | WeakRef<NodeInstance>\n variant?: 'description'\n}\n\nexport const NodeBox: React.FC<NodeBoxProps> = ({ variant, ...props }) => {\n switch (variant) {\n // eslint-disable-next-line unicorn/no-useless-switch-case\n case 'description':\n default: {\n return <NodeDescriptionBox {...props} />\n }\n }\n}\n","import type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport React from 'react'\n\nimport { useWeakNodeDescription } from '../hooks/index.ts'\n\nexport interface NodeDescriptionBoxProps extends FlexBoxProps {\n node?: string | WeakRef<NodeInstance>\n}\n\nexport const NodeDescriptionBox: React.FC<NodeDescriptionBoxProps> = ({ node, ...props }) => {\n const [description, error] = useWeakNodeDescription({ node })\n\n return (\n <FlexCol {...props}>\n <code color={error ? 'red' : undefined}>{error ? error.message : JSON.stringify(description, null, 2)}</code>\n </FlexCol>\n )\n}\n","import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\n\nexport const getModuleFilterOptions = (config?: ModuleFromNodeConfig) => {\n const {\n direction, identity, maxDepth,\n } = config ?? {}\n return {\n direction, identity, maxDepth,\n }\n}\n","import type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const getWeakModuleFilterOptions = (config?: WeakModuleFromNodeConfig) => {\n const {\n direction, identity, maxDepth,\n } = config ?? {}\n return {\n direction, identity, maxDepth,\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { ModuleFilterOptions, ModuleInstance } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\n\nexport type ModuleFromNodeConfig<T extends ModuleInstance = ModuleInstance> = ModuleFilterOptions<T> & {\n logger?: Logger\n node?: NodeInstance | string\n}\n\nexport const getModuleFromNodeConfigLogger = (config?: ModuleFromNodeConfig) => {\n return config?.logger\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { NodeContext } from '@xyo-network/react-node-context'\nimport { useContext } from 'react'\n\nexport const useProvidedNode = (): [NodeInstance | null | undefined] => {\n const { node } = useContext(NodeContext)\n return [node]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { NodeContext } from '@xyo-network/react-node-context'\nimport { useContext, useMemo } from 'react'\n\nexport const useWeakProvidedNode = (): [WeakRef<NodeInstance> | null | undefined] => {\n const { node } = useContext(NodeContext)\n const weakNode = useMemo(() => (node ? new WeakRef(node) : null), [node])\n return [weakNode]\n}\n","import type { TypeCheck } from '@xylabs/object'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport { isModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { getModuleFromNodeConfigLogger } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\n/** @deprecated use useWeakModuleFromNode */\nexport const useModuleFromNode = <T extends ModuleInstance | void = void>(\n nameOrAddressOrInstance: string | (T extends ModuleInstance ? T : ModuleInstance) | undefined = undefined,\n config?: T extends ModuleInstance ? ModuleFromNodeConfig<T> : ModuleFromNodeConfig | undefined,\n): [(T extends ModuleInstance ? T : ModuleInstance) | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = getModuleFromNodeConfigLogger(config)\n const filterOptions = getModuleFilterOptions(config)\n const [result, setResult] = useState<(T extends ModuleInstance ? T : ModuleInstance) | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const identity: TypeCheck<T extends ModuleInstance ? T : ModuleInstance> = (config?.identity ?? isModuleInstance) as TypeCheck<\n T extends ModuleInstance ? T : ModuleInstance\n >\n if (node && nameOrAddressOrInstance) {\n node.on('moduleAttached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(identity(mod) ? (mod as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n })\n node.on('moduleDetached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(undefined)\n }\n })\n if (identity(nameOrAddressOrInstance)) {\n setResult(nameOrAddressOrInstance)\n } else {\n const result = await node.resolve(nameOrAddressOrInstance, filterOptions)\n logger?.debug(`Result: ${result?.address}`)\n setResult(identity(result) ? (result as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n return result\n }\n logger?.debug('Result: No Node')\n return\n }, [node, nameOrAddressOrInstance])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useProvidedNode } from './provided/index.ts'\nimport { useNodeConfigNodeField } from './useNodeConfigNodeField.ts'\n\nexport const useNode = (config?: ModuleFromNodeConfig | undefined): [NodeInstance | undefined, Error | undefined] => {\n const [nodeAddress, nodeInstance] = useNodeConfigNodeField(config)\n const [providedNode] = useProvidedNode()\n const [nodeAddressNode, error] = usePromise(async () => {\n if (providedNode && nodeAddress) {\n return asNodeInstance(await providedNode.resolve(nodeAddress), 'Module is not a node')\n }\n }, [providedNode, nodeAddress])\n return [nodeAddressNode ?? nodeInstance ?? providedNode ?? undefined, error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { useMemo } from 'react'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\n\nexport const useNodeConfigNodeField = (config?: ModuleFromNodeConfig | undefined): [string | undefined, NodeInstance | undefined] => {\n const nodeAddress = useMemo(() => (typeof config?.node === 'string' ? config?.node : undefined), [config?.node])\n const nodeInstance = useMemo(() => (typeof config?.node === 'object' ? config?.node : undefined), [config?.node])\n return [nodeAddress, nodeInstance]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleFilter, ModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\n/** @deprecated use useModulesFromNode */\nexport const useModulesFromNode = (filter?: ModuleFilter, config?: ModuleFromNodeConfig): [ModuleInstance[] | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = config?.logger\n const filterOptions = getModuleFilterOptions()\n const [result, setResult] = useState<ModuleInstance[] | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n if (node) {\n node.on('moduleAttached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n const moduleInstances = filter ? await node.resolve(filter, filterOptions) : await node.resolve('*', filterOptions)\n setResult(moduleInstances)\n })\n node.on('moduleDetached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n const moduleInstances = filter ? await node.resolve(filter, filterOptions) : await node.resolve('*', filterOptions)\n setResult(moduleInstances)\n })\n const moduleInstances = filter ? await node.resolve(filter, filterOptions) : await node.resolve('*', filterOptions)\n setResult(moduleInstances)\n return moduleInstances\n }\n console.log('Result: No Node')\n return\n }, [node, filter])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleDescription, ModuleDescriptionPayload } from '@xyo-network/module-model'\nimport { ModuleDescriptionSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\nexport const useNodeDescription = (config?: ModuleFromNodeConfig | undefined): [ModuleDescription | undefined, Error | undefined] => {\n const [activeNode, nodeError] = useNode(config)\n const [description, error] = usePromise(async () => {\n const state = await activeNode?.state()\n return state?.find<ModuleDescriptionPayload>(isPayloadOfSchemaType(ModuleDescriptionSchema))\n }, [activeNode])\n return [description, nodeError ?? error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useModuleFromNode } from './useModuleFromNode.ts'\n\n/** @deprecated use useWeakNodeFromNode instead */\nexport const useNodeFromNode = (\n nameOrAddressOrInstance?: string | NodeInstance,\n config?: ModuleFromNodeConfig,\n): [NodeInstance | undefined, Error | undefined] => {\n const [mod, error] = useModuleFromNode(nameOrAddressOrInstance, config)\n const instance = asNodeInstance(mod)\n if (mod && !instance) {\n const error = new Error(`Resolved module is not a NodeInstance [${mod.config?.schema}:${mod.config?.name}:${mod.address}]`)\n console.error(error.message)\n return [undefined, error]\n }\n return [instance, error]\n}\n","import type { ModuleFilter } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { isNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useModulesFromNode } from './useModulesFromNode.ts'\n\n/** @deprecated use useWeakNodesFromNode */\nexport const useNodesFromNode = (filter?: ModuleFilter, config?: ModuleFromNodeConfig): [NodeInstance[] | null | undefined, Error | undefined] => {\n const [modules, error] = useModulesFromNode(filter, config)\n if (error) {\n return [null, error]\n }\n return modules\n ? [\n // eslint-disable-next-line unicorn/no-array-reduce\n modules.reduce<NodeInstance[]>((prev, mod) => {\n if (isNodeInstance(mod)) {\n prev.push(mod)\n }\n return prev\n }, []),\n undefined,\n ]\n : [modules, error]\n}\n","import type { TypeCheck } from '@xylabs/object'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport { isModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getWeakModuleFilterOptions } from './getWeakModuleFilterOptions.ts'\nimport { useWeakNode } from './useWeakNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\nimport { getWeakModuleFromNodeConfigLogger } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakModuleFromNode = <T extends ModuleInstance | void = void>(\n nameOrAddressOrInstance: string | (T extends ModuleInstance ? T : ModuleInstance) | undefined = undefined,\n config?: WeakModuleFromNodeConfig,\n): [WeakRef<T extends ModuleInstance ? T : ModuleInstance> | undefined, Error | undefined] => {\n const [node, nodeError] = useWeakNode(config)\n const logger = getWeakModuleFromNodeConfigLogger(config)\n const filterOptions = getWeakModuleFilterOptions(config)\n const [result, setResult] = useState<WeakRef<T extends ModuleInstance ? T : ModuleInstance> | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const identity: TypeCheck<T extends ModuleInstance ? T : ModuleInstance> = (config?.identity ?? isModuleInstance) as TypeCheck<\n T extends ModuleInstance ? T : ModuleInstance\n >\n const nodeInstance = node?.deref()\n if (nodeInstance && nameOrAddressOrInstance) {\n nodeInstance.on('moduleAttached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(identity(mod) ? new WeakRef(mod as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n })\n nodeInstance.on('moduleDetached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(undefined)\n }\n })\n if (identity(nameOrAddressOrInstance)) {\n setResult(new WeakRef(nameOrAddressOrInstance as T extends ModuleInstance ? T : ModuleInstance))\n } else {\n const result = await nodeInstance.resolve(nameOrAddressOrInstance, filterOptions)\n logger?.debug(`Result: ${result?.address}`)\n setResult(identity(result) ? new WeakRef(result as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n return result\n }\n logger?.debug('Result: No Node')\n return\n }, [node, nameOrAddressOrInstance])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport { useWeakProvidedNode } from './provided/index.ts'\nimport { useWeakNodeConfigNodeField } from './useWeakNodeConfigNodeField.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNode = (config?: WeakModuleFromNodeConfig | undefined): [WeakRef<NodeInstance> | undefined, Error | undefined] => {\n const [nodeAddress, nodeInstance] = useWeakNodeConfigNodeField(config)\n const [providedNode] = useWeakProvidedNode()\n const [nodeAddressNode, error] = usePromise(async () => {\n const providedNodeInstance = providedNode?.deref()\n if (providedNodeInstance && nodeAddress) {\n return new WeakRef(asNodeInstance(await providedNodeInstance.resolve(nodeAddress), 'Module is not a node'))\n }\n }, [providedNode, nodeAddress])\n return [nodeAddressNode ?? nodeInstance ?? providedNode ?? undefined, error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { useMemo } from 'react'\n\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeConfigNodeField = (\n config?: WeakModuleFromNodeConfig | undefined,\n): [string | undefined, WeakRef<NodeInstance> | undefined] => {\n const nodeAddress = useMemo(() => (typeof config?.node === 'string' ? config?.node : undefined), [config?.node])\n const nodeInstance = useMemo(() => (typeof config?.node === 'object' ? config?.node : undefined), [config?.node])\n return [nodeAddress, nodeInstance]\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { ModuleFilterOptions } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\n\nexport type WeakModuleFromNodeConfig = ModuleFilterOptions & {\n logger?: Logger\n node?: WeakRef<NodeInstance> | string\n}\n\nexport const getWeakModuleFromNodeConfigLogger = (config?: WeakModuleFromNodeConfig) => {\n return config?.logger\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleFilter, ModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\nexport const useWeakModulesFromNode = (\n filter?: ModuleFilter,\n config?: ModuleFromNodeConfig,\n): [WeakRef<ModuleInstance>[] | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = config?.logger\n const filterOptions = getModuleFilterOptions()\n const [result, setResult] = useState<WeakRef<ModuleInstance>[] | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const nodeInstance = node\n if (nodeInstance) {\n nodeInstance.on('moduleAttached', async ({ mod }) => {\n const nodeInstance = node\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n const moduleInstances = filter ? await nodeInstance?.resolve(filter, filterOptions) : await nodeInstance?.resolve('*', filterOptions)\n setResult(moduleInstances?.map(mod => new WeakRef(mod)))\n })\n nodeInstance.on('moduleDetached', async ({ mod }) => {\n const nodeInstance = node\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n const moduleInstances = filter ? await nodeInstance?.resolve(filter, filterOptions) : await nodeInstance?.resolve('*', filterOptions)\n setResult(moduleInstances?.map(mod => new WeakRef(mod)))\n })\n const moduleInstances = filter ? await nodeInstance.resolve(filter, filterOptions) : await nodeInstance.resolve('*', filterOptions)\n setResult(moduleInstances?.map(mod => new WeakRef(mod)))\n return moduleInstances\n }\n console.log('Result: No Node')\n return\n }, [node, filter])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleDescription, ModuleDescriptionPayload } from '@xyo-network/module-model'\nimport { ModuleDescriptionSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { useWeakNode } from './useWeakNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeDescription = (config?: WeakModuleFromNodeConfig | undefined): [ModuleDescription | undefined, Error | undefined] => {\n const [activeNode, nodeError] = useWeakNode(config)\n const [description, error] = usePromise(async () => {\n const state = await activeNode?.deref()?.state()\n return state?.find<ModuleDescriptionPayload>(isPayloadOfSchemaType(ModuleDescriptionSchema))\n }, [activeNode])\n return [description, nodeError ?? error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { isNodeInstance } from '@xyo-network/node-model'\n\nimport { useWeakModuleFromNode } from './useWeakModuleFromNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeFromNode = (\n nameOrAddressOrInstance?: string | NodeInstance,\n config?: WeakModuleFromNodeConfig,\n): [WeakRef<NodeInstance> | undefined, Error | undefined] => {\n return useWeakModuleFromNode<NodeInstance>(nameOrAddressOrInstance, { identity: isNodeInstance, ...config })\n}\n","import { Close as CloseIcon } from '@mui/icons-material'\nimport type { DrawerProps } from '@mui/material'\nimport {\n ClickAwayListener, Drawer, IconButton,\n} from '@mui/material'\nimport { FlexGrowCol, FlexRow } from '@xylabs/react-flexbox'\nimport { useNodeDrawer } from '@xyo-network/react-node-provider'\nimport type { PropsWithChildren } from 'react'\nimport React from 'react'\n\nimport { useWeakProvidedNode } from '../hooks/index.ts'\nimport { ModuleDescriptionBox } from './render/index.ts'\n\nexport interface NodeDrawerProps extends PropsWithChildren, Omit<DrawerProps, 'open'> {}\n\nexport const NodeDrawer: React.FC<NodeDrawerProps> = ({ children, ...props }) => {\n const { open, setOpen } = useNodeDrawer()\n const [node] = useWeakProvidedNode()\n\n return (\n <Drawer open={open ?? false} anchor=\"right\" {...props}>\n <ClickAwayListener onClickAway={() => setOpen?.(false)}>\n <FlexGrowCol role=\"presentation\" justifyContent=\"start\" p={2} rowGap={2} minWidth=\"33vw\">\n <FlexRow alignContent=\"start\" justifyContent=\"start\" width=\"100%\">\n <IconButton onClick={() => setOpen?.(false)}>\n <CloseIcon />\n </IconButton>\n </FlexRow>\n <ModuleDescriptionBox mod={node} />\n {children}\n </FlexGrowCol>\n </ClickAwayListener>\n </Drawer>\n )\n}\n","import { ChevronRight as ChevronRightIcon, ExpandMore as ExpandMoreIcon } from '@mui/icons-material'\nimport { styled, Typography } from '@mui/material'\nimport { SimpleTreeView } from '@mui/x-tree-view'\nimport type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport React, { useRef } from 'react'\n\nimport { RenderModule } from './RenderModule.tsx'\n\nexport interface ModuleDescriptionProps extends FlexBoxProps {\n mod?: WeakRef<ModuleInstance> | null\n}\nexport const ModuleDescriptionBox: React.FC<ModuleDescriptionProps> = ({ mod }) => {\n const idRef = useRef<{ idIncrementor: number; ids: string[] }>({ idIncrementor: 0, ids: [] })\n\n return (\n <>\n {mod\n ? (\n <>\n <Typography variant=\"h4\">Node Configuration</Typography>\n <StyledTreeView\n aria-label=\"file system navigator\"\n slots={{ collapseIcon: ExpandMoreIcon, expandIcon: ChevronRightIcon }}\n sx={{ flexGrow: 1 }}\n >\n <RenderModule mod={mod} idRef={idRef} />\n </StyledTreeView>\n </>\n )\n : mod === null\n ? <Typography variant=\"h4\">Node loading...</Typography>\n : <Typography variant=\"h4\">Node not found</Typography>}\n </>\n )\n}\n\nconst StyledTreeView = styled(SimpleTreeView, { name: 'StyledTreeView' })(() => ({\n height: 'auto',\n maxWidth: 'auto',\n}))\n","import { styled } from '@mui/material'\nimport { TreeItem } from '@mui/x-tree-view'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport type { MutableRefObject } from 'react'\nimport React, { useState } from 'react'\n\ninterface RenderModuleProps {\n idRef: MutableRefObject<{\n idIncrementor: number\n ids: string[]\n }>\n mod: WeakRef<ModuleInstance>\n}\n\nexport const RenderModule: React.FC<RenderModuleProps> = ({ mod, idRef }) => {\n const [childModules, setChildModules] = useState<WeakRef<ModuleInstance>[]>()\n\n useAsyncEffect(\n\n async (mounted) => {\n const moduleInstance = mod.deref()\n const { address } = moduleInstance ?? {}\n if (moduleInstance) {\n const children = (await moduleInstance.resolve('*')).filter(childModule => childModule.address !== address)\n if (mounted()) {\n setChildModules(children.map(childModule => new WeakRef(childModule)))\n }\n }\n },\n [mod],\n )\n\n const increment = () => {\n const newId = (idRef.current.idIncrementor++).toString()\n idRef.current.ids.push(newId)\n return newId\n }\n\n const moduleInstance = mod.deref()\n const { queries, address } = moduleInstance ?? {}\n\n return (\n <StyledAddressTreeItem itemId={increment()} label={`address: ${address}`}>\n {queries?.map((query, index) => {\n return <TreeItem key={query} itemId={increment()} label={`query : ${query}`} sx={{ mb: index === queries.length - 1 ? 1.5 : 0.5 }} />\n })}\n {childModules && childModules.length > 0\n ? (\n <TreeItem itemId={increment()} label=\"children\" sx={{ mb: 0.5 }}>\n {childModules.map((childModuleRef) => {\n const childModule = childModuleRef.deref()\n return childModule ? <RenderModule key={childModule?.address} mod={childModuleRef} idRef={idRef} /> : null\n })}\n </TreeItem>\n )\n : null}\n </StyledAddressTreeItem>\n )\n}\n\nconst StyledAddressTreeItem = styled(TreeItem, { name: 'StyledAddressTreeItem' })(({ theme }) => (\n { '& .MuiTreeItem-content': { marginBottom: theme.spacing(0.25) } }\n))\n","export * from './components/index.ts'\nexport * from './hooks/index.ts'\nexport * from '@xyo-network/react-node-context'\nexport * from '@xyo-network/react-node-provider'\n"],"mappings":"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","names":["React","FlexCol","React","getModuleFilterOptions","config","direction","identity","maxDepth","getWeakModuleFilterOptions","config","direction","identity","maxDepth","getModuleFromNodeConfigLogger","config","logger","NodeContext","useContext","useProvidedNode","node","useContext","NodeContext","NodeContext","useContext","useMemo","useWeakProvidedNode","node","useContext","NodeContext","weakNode","useMemo","WeakRef","usePromise","isModuleInstance","useState","usePromise","asNodeInstance","useMemo","useNodeConfigNodeField","config","nodeAddress","useMemo","node","undefined","nodeInstance","useNode","config","nodeAddress","nodeInstance","useNodeConfigNodeField","providedNode","useProvidedNode","nodeAddressNode","error","usePromise","asNodeInstance","resolve","undefined","useModuleFromNode","nameOrAddressOrInstance","undefined","config","node","nodeError","useNode","logger","getModuleFromNodeConfigLogger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","identity","isModuleInstance","on","mod","name","address","resolve","usePromise","useState","useModulesFromNode","filter","config","node","nodeError","useNode","logger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","on","mod","name","address","moduleInstances","resolve","console","log","usePromise","ModuleDescriptionSchema","isPayloadOfSchemaType","useNodeDescription","config","activeNode","nodeError","useNode","description","error","usePromise","state","find","isPayloadOfSchemaType","ModuleDescriptionSchema","asNodeInstance","useNodeFromNode","nameOrAddressOrInstance","config","mod","error","useModuleFromNode","instance","asNodeInstance","Error","schema","name","address","console","message","undefined","isNodeInstance","useNodesFromNode","filter","config","modules","error","useModulesFromNode","reduce","prev","mod","isNodeInstance","push","undefined","usePromise","isModuleInstance","useState","usePromise","asNodeInstance","useMemo","useWeakNodeConfigNodeField","config","nodeAddress","useMemo","node","undefined","nodeInstance","useWeakNode","config","nodeAddress","nodeInstance","useWeakNodeConfigNodeField","providedNode","useWeakProvidedNode","nodeAddressNode","error","usePromise","providedNodeInstance","deref","WeakRef","asNodeInstance","resolve","undefined","getWeakModuleFromNodeConfigLogger","config","logger","useWeakModuleFromNode","nameOrAddressOrInstance","undefined","config","node","nodeError","useWeakNode","logger","getWeakModuleFromNodeConfigLogger","filterOptions","getWeakModuleFilterOptions","result","setResult","useState","error","usePromise","debug","identity","isModuleInstance","nodeInstance","deref","on","mod","name","address","WeakRef","resolve","usePromise","useState","useWeakModulesFromNode","filter","config","node","nodeError","useNode","logger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","nodeInstance","on","mod","name","address","moduleInstances","resolve","map","WeakRef","console","log","usePromise","ModuleDescriptionSchema","isPayloadOfSchemaType","useWeakNodeDescription","config","activeNode","nodeError","useWeakNode","description","error","usePromise","state","deref","find","isPayloadOfSchemaType","ModuleDescriptionSchema","isNodeInstance","useWeakNodeFromNode","nameOrAddressOrInstance","config","useWeakModuleFromNode","identity","isNodeInstance","NodeDescriptionBox","node","props","description","error","useWeakNodeDescription","FlexCol","code","color","undefined","message","JSON","stringify","NodeBox","variant","props","React","NodeDescriptionBox","Close","CloseIcon","ClickAwayListener","Drawer","IconButton","FlexGrowCol","FlexRow","useNodeDrawer","React","ChevronRight","ChevronRightIcon","ExpandMore","ExpandMoreIcon","styled","Typography","SimpleTreeView","React","useRef","styled","TreeItem","useAsyncEffect","React","useState","RenderModule","mod","idRef","childModules","setChildModules","useState","useAsyncEffect","mounted","moduleInstance","deref","address","children","resolve","filter","childModule","map","WeakRef","increment","newId","current","idIncrementor","toString","ids","push","queries","React","StyledAddressTreeItem","itemId","label","query","index","TreeItem","key","sx","mb","length","childModuleRef","styled","name","theme","marginBottom","spacing","ModuleDescriptionBox","mod","idRef","useRef","idIncrementor","ids","React","Typography","variant","StyledTreeView","aria-label","slots","collapseIcon","ExpandMoreIcon","expandIcon","ChevronRightIcon","sx","flexGrow","RenderModule","styled","SimpleTreeView","name","height","maxWidth","NodeDrawer","children","props","open","setOpen","useNodeDrawer","node","useWeakProvidedNode","React","Drawer","anchor","ClickAwayListener","onClickAway","FlexGrowCol","role","justifyContent","p","rowGap","minWidth","FlexRow","alignContent","width","IconButton","onClick","CloseIcon","ModuleDescriptionBox","mod"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/Node.tsx","../../src/components/NodeDescriptionBox.tsx","../../src/hooks/getModuleFilterOptions.ts","../../src/hooks/getWeakModuleFilterOptions.ts","../../src/hooks/ModuleFromNodeConfig.ts","../../src/hooks/provided/useProvidedNode.tsx","../../src/hooks/provided/useWeakProvidedNode.tsx","../../src/hooks/useModuleFromNode.ts","../../src/hooks/useNode.ts","../../src/hooks/useNodeConfigNodeField.ts","../../src/hooks/useModulesFromNode.ts","../../src/hooks/useNodeDescription.ts","../../src/hooks/useNodeFromNode.tsx","../../src/hooks/useNodesFromNode.tsx","../../src/hooks/useWeakModuleFromNode.ts","../../src/hooks/useWeakNode.ts","../../src/hooks/useWeakNodeConfigNodeField.ts","../../src/hooks/WeakModuleFromNodeConfig.ts","../../src/hooks/useWeakModulesFromNode.ts","../../src/hooks/useWeakNodeDescription.ts","../../src/hooks/useWeakNodeFromNode.tsx","../../src/components/NodeDrawer.tsx","../../src/components/render/ModuleDescriptionBox.tsx","../../src/components/render/RenderModule.tsx","../../src/index.ts"],"sourcesContent":["import type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport React from 'react'\n\nimport { NodeDescriptionBox } from './NodeDescriptionBox.tsx'\n\nexport interface NodeBoxProps extends FlexBoxProps {\n node?: string | WeakRef<NodeInstance>\n variant?: 'description'\n}\n\nexport const NodeBox: React.FC<NodeBoxProps> = ({ variant, ...props }) => {\n switch (variant) {\n // eslint-disable-next-line unicorn/no-useless-switch-case\n case 'description':\n default: {\n return <NodeDescriptionBox {...props} />\n }\n }\n}\n","import type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport React from 'react'\n\nimport { useWeakNodeDescription } from '../hooks/index.ts'\n\nexport interface NodeDescriptionBoxProps extends FlexBoxProps {\n node?: string | WeakRef<NodeInstance>\n}\n\nexport const NodeDescriptionBox: React.FC<NodeDescriptionBoxProps> = ({ node, ...props }) => {\n const [description, error] = useWeakNodeDescription({ node })\n\n return (\n <FlexCol {...props}>\n <code color={error ? 'red' : undefined}>{error ? error.message : JSON.stringify(description, null, 2)}</code>\n </FlexCol>\n )\n}\n","import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\n\nexport const getModuleFilterOptions = (config?: ModuleFromNodeConfig) => {\n const {\n direction, identity, maxDepth,\n } = config ?? {}\n return {\n direction, identity, maxDepth,\n }\n}\n","import type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const getWeakModuleFilterOptions = (config?: WeakModuleFromNodeConfig) => {\n const {\n direction, identity, maxDepth,\n } = config ?? {}\n return {\n direction, identity, maxDepth,\n }\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { ModuleFilterOptions, ModuleInstance } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\n\nexport type ModuleFromNodeConfig<T extends ModuleInstance = ModuleInstance> = ModuleFilterOptions<T> & {\n logger?: Logger\n node?: NodeInstance | string\n}\n\nexport const getModuleFromNodeConfigLogger = (config?: ModuleFromNodeConfig) => {\n return config?.logger\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { NodeContext } from '@xyo-network/react-node-context'\nimport { useContext } from 'react'\n\nexport const useProvidedNode = (): [NodeInstance | null | undefined] => {\n const { node } = useContext(NodeContext)\n return [node]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { NodeContext } from '@xyo-network/react-node-context'\nimport { useContext, useMemo } from 'react'\n\nexport const useWeakProvidedNode = (): [WeakRef<NodeInstance> | null | undefined] => {\n const { node } = useContext(NodeContext)\n const weakNode = useMemo(() => (node ? new WeakRef(node) : null), [node])\n return [weakNode]\n}\n","import type { TypeCheck } from '@xylabs/object'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport { isModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { getModuleFromNodeConfigLogger } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\n/** @deprecated use useWeakModuleFromNode */\nexport const useModuleFromNode = <T extends ModuleInstance | void = void>(\n nameOrAddressOrInstance: string | (T extends ModuleInstance ? T : ModuleInstance) | undefined = undefined,\n config?: T extends ModuleInstance ? ModuleFromNodeConfig<T> : ModuleFromNodeConfig | undefined,\n): [(T extends ModuleInstance ? T : ModuleInstance) | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = getModuleFromNodeConfigLogger(config)\n const filterOptions = getModuleFilterOptions(config)\n const [result, setResult] = useState<(T extends ModuleInstance ? T : ModuleInstance) | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const identity: TypeCheck<T extends ModuleInstance ? T : ModuleInstance> = (config?.identity ?? isModuleInstance) as TypeCheck<\n T extends ModuleInstance ? T : ModuleInstance\n >\n if (node && nameOrAddressOrInstance) {\n node.on('moduleAttached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(identity(mod) ? (mod as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n })\n node.on('moduleDetached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(undefined)\n }\n })\n if (identity(nameOrAddressOrInstance)) {\n setResult(nameOrAddressOrInstance)\n } else {\n const result = await node.resolve(nameOrAddressOrInstance, filterOptions)\n logger?.debug(`Result: ${result?.address}`)\n setResult(identity(result) ? (result as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n return result\n }\n logger?.debug('Result: No Node')\n return\n }, [node, nameOrAddressOrInstance])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useProvidedNode } from './provided/index.ts'\nimport { useNodeConfigNodeField } from './useNodeConfigNodeField.ts'\n\nexport const useNode = (config?: ModuleFromNodeConfig | undefined): [NodeInstance | undefined, Error | undefined] => {\n const [nodeAddress, nodeInstance] = useNodeConfigNodeField(config)\n const [providedNode] = useProvidedNode()\n const [nodeAddressNode, error] = usePromise(async () => {\n if (providedNode && nodeAddress) {\n return asNodeInstance(await providedNode.resolve(nodeAddress), 'Module is not a node')\n }\n }, [providedNode, nodeAddress])\n return [nodeAddressNode ?? nodeInstance ?? providedNode ?? undefined, error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { useMemo } from 'react'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\n\nexport const useNodeConfigNodeField = (config?: ModuleFromNodeConfig | undefined): [string | undefined, NodeInstance | undefined] => {\n const nodeAddress = useMemo(() => (typeof config?.node === 'string' ? config?.node : undefined), [config?.node])\n const nodeInstance = useMemo(() => (typeof config?.node === 'object' ? config?.node : undefined), [config?.node])\n return [nodeAddress, nodeInstance]\n}\n","import { exists } from '@xylabs/exists'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\n/** @deprecated use useWeakModulesFromNode */\nexport const useModulesFromNode = (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig): [ModuleInstance[] | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = config?.logger\n const filterOptions = getModuleFilterOptions()\n const [result, setResult] = useState<ModuleInstance[] | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n if (node) {\n const refreshModules = async () => {\n const moduleInstances = ids\n ? (await Promise.all(ids.map(id => node.resolve(id, filterOptions)))).filter(exists)\n : await node.resolve('*', filterOptions)\n setResult(moduleInstances)\n return moduleInstances\n }\n node.on('moduleAttached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n await refreshModules()\n })\n node.on('moduleDetached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n await refreshModules()\n })\n return await refreshModules()\n }\n console.log('Result: No Node')\n return\n }, [node, ids])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleDescription, ModuleDescriptionPayload } from '@xyo-network/module-model'\nimport { ModuleDescriptionSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\nexport const useNodeDescription = (config?: ModuleFromNodeConfig | undefined): [ModuleDescription | undefined, Error | undefined] => {\n const [activeNode, nodeError] = useNode(config)\n const [description, error] = usePromise(async () => {\n const state = await activeNode?.state()\n return state?.find<ModuleDescriptionPayload>(isPayloadOfSchemaType(ModuleDescriptionSchema))\n }, [activeNode])\n return [description, nodeError ?? error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useModuleFromNode } from './useModuleFromNode.ts'\n\n/** @deprecated use useWeakNodeFromNode instead */\nexport const useNodeFromNode = (\n nameOrAddressOrInstance?: string | NodeInstance,\n config?: ModuleFromNodeConfig,\n): [NodeInstance | undefined, Error | undefined] => {\n const [mod, error] = useModuleFromNode(nameOrAddressOrInstance, config)\n const instance = asNodeInstance(mod)\n if (mod && !instance) {\n const error = new Error(`Resolved module is not a NodeInstance [${mod.config?.schema}:${mod.config?.name}:${mod.address}]`)\n console.error(error.message)\n return [undefined, error]\n }\n return [instance, error]\n}\n","import type { ModuleIdentifier } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { isNodeInstance } from '@xyo-network/node-model'\n\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useModulesFromNode } from './useModulesFromNode.ts'\n\n/** @deprecated use useWeakNodesFromNode */\nexport const useNodesFromNode = (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig): [NodeInstance[] | null | undefined, Error | undefined] => {\n const [modules, error] = useModulesFromNode(ids, config)\n if (error) {\n return [null, error]\n }\n return modules\n ? [\n // eslint-disable-next-line unicorn/no-array-reduce\n modules.reduce<NodeInstance[]>((prev, mod) => {\n if (isNodeInstance(mod)) {\n prev.push(mod)\n }\n return prev\n }, []),\n undefined,\n ]\n : [modules, error]\n}\n","import type { TypeCheck } from '@xylabs/object'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport { isModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getWeakModuleFilterOptions } from './getWeakModuleFilterOptions.ts'\nimport { useWeakNode } from './useWeakNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\nimport { getWeakModuleFromNodeConfigLogger } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakModuleFromNode = <T extends ModuleInstance | void = void>(\n nameOrAddressOrInstance: string | (T extends ModuleInstance ? T : ModuleInstance) | undefined = undefined,\n config?: WeakModuleFromNodeConfig,\n): [WeakRef<T extends ModuleInstance ? T : ModuleInstance> | undefined, Error | undefined] => {\n const [node, nodeError] = useWeakNode(config)\n const logger = getWeakModuleFromNodeConfigLogger(config)\n const filterOptions = getWeakModuleFilterOptions(config)\n const [result, setResult] = useState<WeakRef<T extends ModuleInstance ? T : ModuleInstance> | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const identity: TypeCheck<T extends ModuleInstance ? T : ModuleInstance> = (config?.identity ?? isModuleInstance) as TypeCheck<\n T extends ModuleInstance ? T : ModuleInstance\n >\n const nodeInstance = node?.deref()\n if (nodeInstance && nameOrAddressOrInstance) {\n nodeInstance.on('moduleAttached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(identity(mod) ? new WeakRef(mod as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n })\n nodeInstance.on('moduleDetached', ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n if (mod.address === nameOrAddressOrInstance || mod.config?.name === nameOrAddressOrInstance) {\n setResult(undefined)\n }\n })\n if (identity(nameOrAddressOrInstance)) {\n setResult(new WeakRef(nameOrAddressOrInstance as T extends ModuleInstance ? T : ModuleInstance))\n } else {\n const result = await nodeInstance.resolve(nameOrAddressOrInstance, filterOptions)\n logger?.debug(`Result: ${result?.address}`)\n setResult(identity(result) ? new WeakRef(result as T extends ModuleInstance ? T : ModuleInstance) : undefined)\n }\n return result\n }\n logger?.debug('Result: No Node')\n return\n }, [node, nameOrAddressOrInstance])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { NodeInstance } from '@xyo-network/node-model'\nimport { asNodeInstance } from '@xyo-network/node-model'\n\nimport { useWeakProvidedNode } from './provided/index.ts'\nimport { useWeakNodeConfigNodeField } from './useWeakNodeConfigNodeField.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNode = (config?: WeakModuleFromNodeConfig | undefined): [WeakRef<NodeInstance> | undefined, Error | undefined] => {\n const [nodeAddress, nodeInstance] = useWeakNodeConfigNodeField(config)\n const [providedNode] = useWeakProvidedNode()\n const [nodeAddressNode, error] = usePromise(async () => {\n const providedNodeInstance = providedNode?.deref()\n if (providedNodeInstance && nodeAddress) {\n return new WeakRef(asNodeInstance(await providedNodeInstance.resolve(nodeAddress), 'Module is not a node'))\n }\n }, [providedNode, nodeAddress])\n return [nodeAddressNode ?? nodeInstance ?? providedNode ?? undefined, error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { useMemo } from 'react'\n\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeConfigNodeField = (\n config?: WeakModuleFromNodeConfig | undefined,\n): [string | undefined, WeakRef<NodeInstance> | undefined] => {\n const nodeAddress = useMemo(() => (typeof config?.node === 'string' ? config?.node : undefined), [config?.node])\n const nodeInstance = useMemo(() => (typeof config?.node === 'object' ? config?.node : undefined), [config?.node])\n return [nodeAddress, nodeInstance]\n}\n","import type { Logger } from '@xylabs/logger'\nimport type { ModuleFilterOptions } from '@xyo-network/module-model'\nimport type { NodeInstance } from '@xyo-network/node-model'\n\nexport type WeakModuleFromNodeConfig = ModuleFilterOptions & {\n logger?: Logger\n node?: WeakRef<NodeInstance> | string\n}\n\nexport const getWeakModuleFromNodeConfigLogger = (config?: WeakModuleFromNodeConfig) => {\n return config?.logger\n}\n","import { exists } from '@xylabs/exists'\nimport { usePromise } from '@xylabs/react-promise'\nimport type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'\nimport { useState } from 'react'\n\nimport { getModuleFilterOptions } from './getModuleFilterOptions.ts'\nimport type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'\nimport { useNode } from './useNode.ts'\n\nexport const useWeakModulesFromNode = (\n ids?: ModuleIdentifier[],\n config?: ModuleFromNodeConfig,\n): [WeakRef<ModuleInstance>[] | undefined, Error | undefined] => {\n const [node, nodeError] = useNode(config)\n const logger = config?.logger\n const filterOptions = getModuleFilterOptions()\n const [result, setResult] = useState<WeakRef<ModuleInstance>[] | undefined>()\n const [, error] = usePromise(async () => {\n logger?.debug('useModuleFromNode: resolving')\n const nodeInstance = node\n if (nodeInstance) {\n const refreshModules = async () => {\n const moduleInstances = ids\n ? (await Promise.all(ids.map(id => node.resolve(id, filterOptions)))).filter(exists)\n : await node.resolve('*', filterOptions)\n setResult(moduleInstances.map(mod => new WeakRef(mod)))\n return moduleInstances\n }\n nodeInstance.on('moduleAttached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)\n await refreshModules()\n })\n nodeInstance.on('moduleDetached', async ({ mod }) => {\n logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)\n await refreshModules()\n })\n return await refreshModules()\n }\n console.log('Result: No Node')\n return\n }, [node, ids])\n return [result, nodeError ?? error]\n}\n","import { usePromise } from '@xylabs/react-promise'\nimport type { ModuleDescription, ModuleDescriptionPayload } from '@xyo-network/module-model'\nimport { ModuleDescriptionSchema } from '@xyo-network/module-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { useWeakNode } from './useWeakNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeDescription = (config?: WeakModuleFromNodeConfig | undefined): [ModuleDescription | undefined, Error | undefined] => {\n const [activeNode, nodeError] = useWeakNode(config)\n const [description, error] = usePromise(async () => {\n const state = await activeNode?.deref()?.state()\n return state?.find<ModuleDescriptionPayload>(isPayloadOfSchemaType(ModuleDescriptionSchema))\n }, [activeNode])\n return [description, nodeError ?? error]\n}\n","import type { NodeInstance } from '@xyo-network/node-model'\nimport { isNodeInstance } from '@xyo-network/node-model'\n\nimport { useWeakModuleFromNode } from './useWeakModuleFromNode.ts'\nimport type { WeakModuleFromNodeConfig } from './WeakModuleFromNodeConfig.ts'\n\nexport const useWeakNodeFromNode = (\n nameOrAddressOrInstance?: string | NodeInstance,\n config?: WeakModuleFromNodeConfig,\n): [WeakRef<NodeInstance> | undefined, Error | undefined] => {\n return useWeakModuleFromNode<NodeInstance>(nameOrAddressOrInstance, { identity: isNodeInstance, ...config })\n}\n","import { Close as CloseIcon } from '@mui/icons-material'\nimport type { DrawerProps } from '@mui/material'\nimport {\n ClickAwayListener, Drawer, IconButton,\n} from '@mui/material'\nimport { FlexGrowCol, FlexRow } from '@xylabs/react-flexbox'\nimport { useNodeDrawer } from '@xyo-network/react-node-provider'\nimport type { PropsWithChildren } from 'react'\nimport React from 'react'\n\nimport { useWeakProvidedNode } from '../hooks/index.ts'\nimport { ModuleDescriptionBox } from './render/index.ts'\n\nexport interface NodeDrawerProps extends PropsWithChildren, Omit<DrawerProps, 'open'> {}\n\nexport const NodeDrawer: React.FC<NodeDrawerProps> = ({ children, ...props }) => {\n const { open, setOpen } = useNodeDrawer()\n const [node] = useWeakProvidedNode()\n\n return (\n <Drawer open={open ?? false} anchor=\"right\" {...props}>\n <ClickAwayListener onClickAway={() => setOpen?.(false)}>\n <FlexGrowCol role=\"presentation\" justifyContent=\"start\" p={2} rowGap={2} minWidth=\"33vw\">\n <FlexRow alignContent=\"start\" justifyContent=\"start\" width=\"100%\">\n <IconButton onClick={() => setOpen?.(false)}>\n <CloseIcon />\n </IconButton>\n </FlexRow>\n <ModuleDescriptionBox mod={node} />\n {children}\n </FlexGrowCol>\n </ClickAwayListener>\n </Drawer>\n )\n}\n","import { ChevronRight as ChevronRightIcon, ExpandMore as ExpandMoreIcon } from '@mui/icons-material'\nimport { styled, Typography } from '@mui/material'\nimport { SimpleTreeView } from '@mui/x-tree-view'\nimport type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport React, { useRef } from 'react'\n\nimport { RenderModule } from './RenderModule.tsx'\n\nexport interface ModuleDescriptionProps extends FlexBoxProps {\n mod?: WeakRef<ModuleInstance> | null\n}\nexport const ModuleDescriptionBox: React.FC<ModuleDescriptionProps> = ({ mod }) => {\n const idRef = useRef<{ idIncrementor: number; ids: string[] }>({ idIncrementor: 0, ids: [] })\n\n return (\n <>\n {mod\n ? (\n <>\n <Typography variant=\"h4\">Node Configuration</Typography>\n <StyledTreeView\n aria-label=\"file system navigator\"\n slots={{ collapseIcon: ExpandMoreIcon, expandIcon: ChevronRightIcon }}\n sx={{ flexGrow: 1 }}\n >\n <RenderModule mod={mod} idRef={idRef} />\n </StyledTreeView>\n </>\n )\n : mod === null\n ? <Typography variant=\"h4\">Node loading...</Typography>\n : <Typography variant=\"h4\">Node not found</Typography>}\n </>\n )\n}\n\nconst StyledTreeView = styled(SimpleTreeView, { name: 'StyledTreeView' })(() => ({\n height: 'auto',\n maxWidth: 'auto',\n}))\n","import { styled } from '@mui/material'\nimport { TreeItem } from '@mui/x-tree-view'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport type { ModuleInstance } from '@xyo-network/module-model'\nimport type { MutableRefObject } from 'react'\nimport React, { useState } from 'react'\n\ninterface RenderModuleProps {\n idRef: MutableRefObject<{\n idIncrementor: number\n ids: string[]\n }>\n mod: WeakRef<ModuleInstance>\n}\n\nexport const RenderModule: React.FC<RenderModuleProps> = ({ mod, idRef }) => {\n const [childModules, setChildModules] = useState<WeakRef<ModuleInstance>[]>()\n\n useAsyncEffect(\n\n async (mounted) => {\n const moduleInstance = mod.deref()\n const { address } = moduleInstance ?? {}\n if (moduleInstance) {\n const children = (await moduleInstance.resolve('*')).filter(childModule => childModule.address !== address)\n if (mounted()) {\n setChildModules(children.map(childModule => new WeakRef(childModule)))\n }\n }\n },\n [mod],\n )\n\n const increment = () => {\n const newId = (idRef.current.idIncrementor++).toString()\n idRef.current.ids.push(newId)\n return newId\n }\n\n const moduleInstance = mod.deref()\n const { queries, address } = moduleInstance ?? {}\n\n return (\n <StyledAddressTreeItem itemId={increment()} label={`address: ${address}`}>\n {queries?.map((query, index) => {\n return <TreeItem key={query} itemId={increment()} label={`query : ${query}`} sx={{ mb: index === queries.length - 1 ? 1.5 : 0.5 }} />\n })}\n {childModules && childModules.length > 0\n ? (\n <TreeItem itemId={increment()} label=\"children\" sx={{ mb: 0.5 }}>\n {childModules.map((childModuleRef) => {\n const childModule = childModuleRef.deref()\n return childModule ? <RenderModule key={childModule?.address} mod={childModuleRef} idRef={idRef} /> : null\n })}\n </TreeItem>\n )\n : null}\n </StyledAddressTreeItem>\n )\n}\n\nconst StyledAddressTreeItem = styled(TreeItem, { name: 'StyledAddressTreeItem' })(({ theme }) => (\n { '& .MuiTreeItem-content': { marginBottom: theme.spacing(0.25) } }\n))\n","export * from './components/index.ts'\nexport * from './hooks/index.ts'\nexport * from '@xyo-network/react-node-context'\nexport * from '@xyo-network/react-node-provider'\n"],"mappings":"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","names":["React","FlexCol","React","getModuleFilterOptions","config","direction","identity","maxDepth","getWeakModuleFilterOptions","config","direction","identity","maxDepth","getModuleFromNodeConfigLogger","config","logger","NodeContext","useContext","useProvidedNode","node","useContext","NodeContext","NodeContext","useContext","useMemo","useWeakProvidedNode","node","useContext","NodeContext","weakNode","useMemo","WeakRef","usePromise","isModuleInstance","useState","usePromise","asNodeInstance","useMemo","useNodeConfigNodeField","config","nodeAddress","useMemo","node","undefined","nodeInstance","useNode","config","nodeAddress","nodeInstance","useNodeConfigNodeField","providedNode","useProvidedNode","nodeAddressNode","error","usePromise","asNodeInstance","resolve","undefined","useModuleFromNode","nameOrAddressOrInstance","undefined","config","node","nodeError","useNode","logger","getModuleFromNodeConfigLogger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","identity","isModuleInstance","on","mod","name","address","resolve","exists","usePromise","useState","useModulesFromNode","ids","config","node","nodeError","useNode","logger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","refreshModules","moduleInstances","Promise","all","map","id","resolve","filter","exists","on","mod","name","address","console","log","usePromise","ModuleDescriptionSchema","isPayloadOfSchemaType","useNodeDescription","config","activeNode","nodeError","useNode","description","error","usePromise","state","find","isPayloadOfSchemaType","ModuleDescriptionSchema","asNodeInstance","useNodeFromNode","nameOrAddressOrInstance","config","mod","error","useModuleFromNode","instance","asNodeInstance","Error","schema","name","address","console","message","undefined","isNodeInstance","useNodesFromNode","ids","config","modules","error","useModulesFromNode","reduce","prev","mod","isNodeInstance","push","undefined","usePromise","isModuleInstance","useState","usePromise","asNodeInstance","useMemo","useWeakNodeConfigNodeField","config","nodeAddress","useMemo","node","undefined","nodeInstance","useWeakNode","config","nodeAddress","nodeInstance","useWeakNodeConfigNodeField","providedNode","useWeakProvidedNode","nodeAddressNode","error","usePromise","providedNodeInstance","deref","WeakRef","asNodeInstance","resolve","undefined","getWeakModuleFromNodeConfigLogger","config","logger","useWeakModuleFromNode","nameOrAddressOrInstance","undefined","config","node","nodeError","useWeakNode","logger","getWeakModuleFromNodeConfigLogger","filterOptions","getWeakModuleFilterOptions","result","setResult","useState","error","usePromise","debug","identity","isModuleInstance","nodeInstance","deref","on","mod","name","address","WeakRef","resolve","exists","usePromise","useState","useWeakModulesFromNode","ids","config","node","nodeError","useNode","logger","filterOptions","getModuleFilterOptions","result","setResult","useState","error","usePromise","debug","nodeInstance","refreshModules","moduleInstances","Promise","all","map","id","resolve","filter","exists","mod","WeakRef","on","name","address","console","log","usePromise","ModuleDescriptionSchema","isPayloadOfSchemaType","useWeakNodeDescription","config","activeNode","nodeError","useWeakNode","description","error","usePromise","state","deref","find","isPayloadOfSchemaType","ModuleDescriptionSchema","isNodeInstance","useWeakNodeFromNode","nameOrAddressOrInstance","config","useWeakModuleFromNode","identity","isNodeInstance","NodeDescriptionBox","node","props","description","error","useWeakNodeDescription","FlexCol","code","color","undefined","message","JSON","stringify","NodeBox","variant","props","React","NodeDescriptionBox","Close","CloseIcon","ClickAwayListener","Drawer","IconButton","FlexGrowCol","FlexRow","useNodeDrawer","React","ChevronRight","ChevronRightIcon","ExpandMore","ExpandMoreIcon","styled","Typography","SimpleTreeView","React","useRef","styled","TreeItem","useAsyncEffect","React","useState","RenderModule","mod","idRef","childModules","setChildModules","useState","useAsyncEffect","mounted","moduleInstance","deref","address","children","resolve","filter","childModule","map","WeakRef","increment","newId","current","idIncrementor","toString","ids","push","queries","React","StyledAddressTreeItem","itemId","label","query","index","TreeItem","key","sx","mb","length","childModuleRef","styled","name","theme","marginBottom","spacing","ModuleDescriptionBox","mod","idRef","useRef","idIncrementor","ids","React","Typography","variant","StyledTreeView","aria-label","slots","collapseIcon","ExpandMoreIcon","expandIcon","ChevronRightIcon","sx","flexGrow","RenderModule","styled","SimpleTreeView","name","height","maxWidth","NodeDrawer","children","props","open","setOpen","useNodeDrawer","node","useWeakProvidedNode","React","Drawer","anchor","ClickAwayListener","onClickAway","FlexGrowCol","role","justifyContent","p","rowGap","minWidth","FlexRow","alignContent","width","IconButton","onClick","CloseIcon","ModuleDescriptionBox","mod"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/react-node",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "Common React library for all XYO projects that use React",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xyo",
|
|
@@ -53,27 +53,27 @@
|
|
|
53
53
|
"@xylabs/exists": "^4.5.1",
|
|
54
54
|
"@xylabs/logger": "^4.5.1",
|
|
55
55
|
"@xylabs/object": "^4.5.1",
|
|
56
|
-
"@xylabs/react-async-effect": "^5.3.
|
|
57
|
-
"@xylabs/react-flexbox": "^5.3.
|
|
58
|
-
"@xylabs/react-promise": "^5.3.
|
|
59
|
-
"@xyo-network/module-abstract": "^3.
|
|
60
|
-
"@xyo-network/module-model": "^3.
|
|
61
|
-
"@xyo-network/node-model": "^3.
|
|
62
|
-
"@xyo-network/payload-model": "^3.
|
|
63
|
-
"@xyo-network/react-node-context": "^4.
|
|
64
|
-
"@xyo-network/react-node-provider": "^4.
|
|
56
|
+
"@xylabs/react-async-effect": "^5.3.22",
|
|
57
|
+
"@xylabs/react-flexbox": "^5.3.22",
|
|
58
|
+
"@xylabs/react-promise": "^5.3.22",
|
|
59
|
+
"@xyo-network/module-abstract": "^3.7.0",
|
|
60
|
+
"@xyo-network/module-model": "^3.7.0",
|
|
61
|
+
"@xyo-network/node-model": "^3.7.0",
|
|
62
|
+
"@xyo-network/payload-model": "^3.7.0",
|
|
63
|
+
"@xyo-network/react-node-context": "^4.4.0",
|
|
64
|
+
"@xyo-network/react-node-provider": "^4.4.0"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@storybook/react": "^8.5.
|
|
67
|
+
"@storybook/react": "^8.5.2",
|
|
68
68
|
"@xylabs/ts-scripts-yarn3": "^4.2.6",
|
|
69
69
|
"@xylabs/tsconfig-react": "^4.2.6",
|
|
70
|
-
"@xyo-network/node-memory": "^3.
|
|
71
|
-
"@xyo-network/payload-model": "^3.
|
|
72
|
-
"@xyo-network/react-storybook": "^4.
|
|
73
|
-
"@xyo-network/react-wallet": "^4.
|
|
70
|
+
"@xyo-network/node-memory": "^3.7.0",
|
|
71
|
+
"@xyo-network/payload-model": "^3.7.0",
|
|
72
|
+
"@xyo-network/react-storybook": "^4.4.0",
|
|
73
|
+
"@xyo-network/react-wallet": "^4.4.0",
|
|
74
74
|
"react": "^18.3.1",
|
|
75
75
|
"react-dom": "^18.3.1",
|
|
76
|
-
"storybook": "^8.5.
|
|
76
|
+
"storybook": "^8.5.2",
|
|
77
77
|
"typescript": "^5.7.3"
|
|
78
78
|
},
|
|
79
79
|
"peerDependencies": {
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { exists } from '@xylabs/exists'
|
|
1
2
|
import { usePromise } from '@xylabs/react-promise'
|
|
2
|
-
import type {
|
|
3
|
+
import type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
|
|
3
4
|
import { useState } from 'react'
|
|
4
5
|
|
|
5
6
|
import { getModuleFilterOptions } from './getModuleFilterOptions.ts'
|
|
6
7
|
import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'
|
|
7
8
|
import { useNode } from './useNode.ts'
|
|
8
9
|
|
|
9
|
-
/** @deprecated use
|
|
10
|
-
export const useModulesFromNode = (
|
|
10
|
+
/** @deprecated use useWeakModulesFromNode */
|
|
11
|
+
export const useModulesFromNode = (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig): [ModuleInstance[] | undefined, Error | undefined] => {
|
|
11
12
|
const [node, nodeError] = useNode(config)
|
|
12
13
|
const logger = config?.logger
|
|
13
14
|
const filterOptions = getModuleFilterOptions()
|
|
@@ -15,22 +16,25 @@ export const useModulesFromNode = (filter?: ModuleFilter, config?: ModuleFromNod
|
|
|
15
16
|
const [, error] = usePromise(async () => {
|
|
16
17
|
logger?.debug('useModuleFromNode: resolving')
|
|
17
18
|
if (node) {
|
|
19
|
+
const refreshModules = async () => {
|
|
20
|
+
const moduleInstances = ids
|
|
21
|
+
? (await Promise.all(ids.map(id => node.resolve(id, filterOptions)))).filter(exists)
|
|
22
|
+
: await node.resolve('*', filterOptions)
|
|
23
|
+
setResult(moduleInstances)
|
|
24
|
+
return moduleInstances
|
|
25
|
+
}
|
|
18
26
|
node.on('moduleAttached', async ({ mod }) => {
|
|
19
27
|
logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)
|
|
20
|
-
|
|
21
|
-
setResult(moduleInstances)
|
|
28
|
+
await refreshModules()
|
|
22
29
|
})
|
|
23
30
|
node.on('moduleDetached', async ({ mod }) => {
|
|
24
31
|
logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)
|
|
25
|
-
|
|
26
|
-
setResult(moduleInstances)
|
|
32
|
+
await refreshModules()
|
|
27
33
|
})
|
|
28
|
-
|
|
29
|
-
setResult(moduleInstances)
|
|
30
|
-
return moduleInstances
|
|
34
|
+
return await refreshModules()
|
|
31
35
|
}
|
|
32
36
|
console.log('Result: No Node')
|
|
33
37
|
return
|
|
34
|
-
}, [node,
|
|
38
|
+
}, [node, ids])
|
|
35
39
|
return [result, nodeError ?? error]
|
|
36
40
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ModuleIdentifier } from '@xyo-network/module-model'
|
|
2
2
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
3
3
|
import { isNodeInstance } from '@xyo-network/node-model'
|
|
4
4
|
|
|
@@ -6,8 +6,8 @@ import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'
|
|
|
6
6
|
import { useModulesFromNode } from './useModulesFromNode.ts'
|
|
7
7
|
|
|
8
8
|
/** @deprecated use useWeakNodesFromNode */
|
|
9
|
-
export const useNodesFromNode = (
|
|
10
|
-
const [modules, error] = useModulesFromNode(
|
|
9
|
+
export const useNodesFromNode = (ids?: ModuleIdentifier[], config?: ModuleFromNodeConfig): [NodeInstance[] | null | undefined, Error | undefined] => {
|
|
10
|
+
const [modules, error] = useModulesFromNode(ids, config)
|
|
11
11
|
if (error) {
|
|
12
12
|
return [null, error]
|
|
13
13
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { exists } from '@xylabs/exists'
|
|
1
2
|
import { usePromise } from '@xylabs/react-promise'
|
|
2
|
-
import type {
|
|
3
|
+
import type { ModuleIdentifier, ModuleInstance } from '@xyo-network/module-model'
|
|
3
4
|
import { useState } from 'react'
|
|
4
5
|
|
|
5
6
|
import { getModuleFilterOptions } from './getModuleFilterOptions.ts'
|
|
@@ -7,7 +8,7 @@ import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'
|
|
|
7
8
|
import { useNode } from './useNode.ts'
|
|
8
9
|
|
|
9
10
|
export const useWeakModulesFromNode = (
|
|
10
|
-
|
|
11
|
+
ids?: ModuleIdentifier[],
|
|
11
12
|
config?: ModuleFromNodeConfig,
|
|
12
13
|
): [WeakRef<ModuleInstance>[] | undefined, Error | undefined] => {
|
|
13
14
|
const [node, nodeError] = useNode(config)
|
|
@@ -18,24 +19,25 @@ export const useWeakModulesFromNode = (
|
|
|
18
19
|
logger?.debug('useModuleFromNode: resolving')
|
|
19
20
|
const nodeInstance = node
|
|
20
21
|
if (nodeInstance) {
|
|
22
|
+
const refreshModules = async () => {
|
|
23
|
+
const moduleInstances = ids
|
|
24
|
+
? (await Promise.all(ids.map(id => node.resolve(id, filterOptions)))).filter(exists)
|
|
25
|
+
: await node.resolve('*', filterOptions)
|
|
26
|
+
setResult(moduleInstances.map(mod => new WeakRef(mod)))
|
|
27
|
+
return moduleInstances
|
|
28
|
+
}
|
|
21
29
|
nodeInstance.on('moduleAttached', async ({ mod }) => {
|
|
22
|
-
const nodeInstance = node
|
|
23
30
|
logger?.debug(`useModuleFromNode: moduleAttached [${mod.config.name ?? mod.address}]`)
|
|
24
|
-
|
|
25
|
-
setResult(moduleInstances?.map(mod => new WeakRef(mod)))
|
|
31
|
+
await refreshModules()
|
|
26
32
|
})
|
|
27
33
|
nodeInstance.on('moduleDetached', async ({ mod }) => {
|
|
28
|
-
const nodeInstance = node
|
|
29
34
|
logger?.debug(`useModuleFromNode: moduleDetached [${mod.config.name ?? mod.address}]`)
|
|
30
|
-
|
|
31
|
-
setResult(moduleInstances?.map(mod => new WeakRef(mod)))
|
|
35
|
+
await refreshModules()
|
|
32
36
|
})
|
|
33
|
-
|
|
34
|
-
setResult(moduleInstances?.map(mod => new WeakRef(mod)))
|
|
35
|
-
return moduleInstances
|
|
37
|
+
return await refreshModules()
|
|
36
38
|
}
|
|
37
39
|
console.log('Result: No Node')
|
|
38
40
|
return
|
|
39
|
-
}, [node,
|
|
41
|
+
}, [node, ids])
|
|
40
42
|
return [result, nodeError ?? error]
|
|
41
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { exists } from '@xylabs/exists'
|
|
2
|
-
import type {
|
|
2
|
+
import type { ModuleIdentifier } from '@xyo-network/module-model'
|
|
3
3
|
import type { NodeInstance } from '@xyo-network/node-model'
|
|
4
4
|
import { asNodeInstance } from '@xyo-network/node-model'
|
|
5
5
|
|
|
@@ -7,10 +7,10 @@ import type { ModuleFromNodeConfig } from './ModuleFromNodeConfig.ts'
|
|
|
7
7
|
import { useWeakModulesFromNode } from './useWeakModulesFromNode.ts'
|
|
8
8
|
|
|
9
9
|
export const useWeakNodesFromNode = (
|
|
10
|
-
|
|
10
|
+
ids?: ModuleIdentifier[],
|
|
11
11
|
config?: ModuleFromNodeConfig,
|
|
12
12
|
): [WeakRef<NodeInstance>[] | null | undefined, Error | undefined] => {
|
|
13
|
-
const [modules, error] = useWeakModulesFromNode(
|
|
13
|
+
const [modules, error] = useWeakModulesFromNode(ids, config)
|
|
14
14
|
if (error) {
|
|
15
15
|
return [null, error]
|
|
16
16
|
}
|