@octonodes/ui-extensions 0.1.5

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/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Octonode UI extensions
2
+
3
+ Use `@octonodes/ui-extensions/react` to arrange a plugin node's existing inputs without taking ownership of values, expressions, connections, or saving.
4
+
5
+ ```sh
6
+ npm install @octonodes/ui-extensions
7
+ ```
8
+
9
+ ```tsx
10
+ import { defineExtension, InputField, NodeForm, Section } from "@octonodes/ui-extensions/react";
11
+
12
+ function Inputs() {
13
+ return (
14
+ <NodeForm>
15
+ <Section title="Message">
16
+ <InputField name="channel" />
17
+ <InputField name="text" appearance="multiline" />
18
+ </Section>
19
+ </NodeForm>
20
+ );
21
+ }
22
+
23
+ export default defineExtension("node.inspector.inputs", Inputs);
24
+ ```
25
+
26
+ Declare the entry on the node passed to `defineNode`:
27
+
28
+ ```ts
29
+ ui: {
30
+ apiVersion: "1",
31
+ renderers: {
32
+ focused: {
33
+ label: "Focused form",
34
+ targets: { "node.inspector.inputs": "src/slack-inputs.tsx" },
35
+ },
36
+ },
37
+ }
38
+ ```
39
+
40
+ `octonodes plugin build` bundles the entry into the immutable plugin artifact. Octonode loads it only for the exact installed plugin version and renders real host-owned form controls inside an isolated, network-disabled sandbox.
41
+
42
+ The first public target is `node.inspector.inputs`. Undeclared or omitted inputs fall back to the standard inspector form.
@@ -0,0 +1,38 @@
1
+ export declare const UI_EXTENSION_API_VERSION: "1";
2
+ export declare const UI_EXTENSION_TARGETS: readonly ["node.inspector.inputs"];
3
+ export type UiExtensionTarget = (typeof UI_EXTENSION_TARGETS)[number];
4
+ export type UiExtensionTree = {
5
+ type: "text";
6
+ value: string;
7
+ } | {
8
+ type: "node-form";
9
+ children: UiExtensionTree[];
10
+ } | {
11
+ type: "section";
12
+ title: string;
13
+ children: UiExtensionTree[];
14
+ } | {
15
+ type: "input-field";
16
+ name: string;
17
+ appearance?: "single-line" | "multiline";
18
+ };
19
+ export interface UiExtensionRenderMessage {
20
+ octonode: "ui-extension";
21
+ apiVersion: typeof UI_EXTENSION_API_VERSION;
22
+ type: "render";
23
+ target: UiExtensionTarget;
24
+ tree: UiExtensionTree;
25
+ }
26
+ export interface UiExtensionErrorMessage {
27
+ octonode: "ui-extension";
28
+ apiVersion: typeof UI_EXTENSION_API_VERSION;
29
+ type: "error";
30
+ target: UiExtensionTarget;
31
+ message: string;
32
+ }
33
+ export type UiExtensionMessage = UiExtensionRenderMessage | UiExtensionErrorMessage;
34
+ export declare function validateExtensionMessage(value: unknown, expectedTarget: UiExtensionTarget): {
35
+ message: UiExtensionMessage;
36
+ inputNames: string[];
37
+ } | null;
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,wBAAwB,EAAG,GAAY,CAAC;AACrD,eAAO,MAAM,oBAAoB,oCAAqC,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtE,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,eAAe,EAAE,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,aAAa,GAAG,WAAW,CAAA;CAAE,CAAC;AAEpF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,OAAO,wBAAwB,CAAC;IAC5C,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,OAAO,wBAAwB,CAAC;IAC5C,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,GAAG,uBAAuB,CAAC;AAOpF,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,iBAAiB,GAChC;IAAE,OAAO,EAAE,kBAAkB,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAyC9D"}
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
1
+ // Generated from sdks/ui-extensions/src/index.ts. Do not edit; run the Octonode SDK sync.
2
+ export const UI_EXTENSION_API_VERSION = "1";
3
+ export const UI_EXTENSION_TARGETS = ["node.inspector.inputs"];
4
+ const MAX_NODES = 100;
5
+ const MAX_DEPTH = 10;
6
+ const MAX_TEXT = 4_000;
7
+ const INPUT_NAME = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
8
+ export function validateExtensionMessage(value, expectedTarget) {
9
+ if (!value || typeof value !== "object")
10
+ return null;
11
+ const message = value;
12
+ if (message.octonode !== "ui-extension" ||
13
+ message.apiVersion !== UI_EXTENSION_API_VERSION ||
14
+ message.target !== expectedTarget)
15
+ return null;
16
+ if (message.type === "error")
17
+ return typeof message.message === "string" && message.message.length <= MAX_TEXT
18
+ ? { message: message, inputNames: [] }
19
+ : null;
20
+ if (message.type !== "render")
21
+ return null;
22
+ let count = 0;
23
+ const inputNames = [];
24
+ const visit = (node, depth) => {
25
+ if (!node || typeof node !== "object" || depth > MAX_DEPTH || ++count > MAX_NODES)
26
+ return false;
27
+ const candidate = node;
28
+ if (candidate.type === "text")
29
+ return typeof candidate.value === "string" && candidate.value.length <= MAX_TEXT;
30
+ if (candidate.type === "input-field") {
31
+ if (typeof candidate.name !== "string" ||
32
+ !INPUT_NAME.test(candidate.name) ||
33
+ (candidate.appearance !== undefined &&
34
+ candidate.appearance !== "single-line" &&
35
+ candidate.appearance !== "multiline"))
36
+ return false;
37
+ if (inputNames.includes(candidate.name))
38
+ return false;
39
+ inputNames.push(candidate.name);
40
+ return true;
41
+ }
42
+ if (candidate.type === "section") {
43
+ if (typeof candidate.title !== "string" || candidate.title.length > 240)
44
+ return false;
45
+ }
46
+ else if (candidate.type !== "node-form")
47
+ return false;
48
+ return Array.isArray(candidate.children) && candidate.children.every((child) => visit(child, depth + 1));
49
+ };
50
+ return visit(message.tree, 0)
51
+ ? { message: message, inputNames: [...new Set(inputNames)] }
52
+ : null;
53
+ }
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type ComponentType, type ReactNode } from "react";
2
+ import { UI_EXTENSION_API_VERSION, type UiExtensionTarget } from "./index";
3
+ export interface UiExtensionDefinition {
4
+ apiVersion: typeof UI_EXTENSION_API_VERSION;
5
+ target: UiExtensionTarget;
6
+ component: ComponentType;
7
+ }
8
+ export declare function defineExtension(target: UiExtensionTarget, component: ComponentType): UiExtensionDefinition;
9
+ export declare function NodeForm({ children }: {
10
+ children?: ReactNode;
11
+ }): import("react").DOMElement<import("react").DOMAttributes<Element>, Element>;
12
+ export declare function Section({ title, children }: {
13
+ title: string;
14
+ children?: ReactNode;
15
+ }): import("react").ReactElement<{
16
+ title: string;
17
+ }, string | import("react").JSXElementConstructor<any>>;
18
+ export declare function InputField({ name, appearance }: {
19
+ name: string;
20
+ appearance?: "single-line" | "multiline";
21
+ }): import("react").ReactElement<{
22
+ name: string;
23
+ appearance: "single-line" | "multiline" | undefined;
24
+ }, string | import("react").JSXElementConstructor<any>>;
25
+ export declare function startExtension(extension: UiExtensionDefinition): void;
26
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,wBAAwB,EAAE,KAAK,iBAAiB,EAAwB,MAAM,SAAS,CAAC;AAEjG,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,OAAO,wBAAwB,CAAC;IAC5C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,GAAG,qBAAqB,CAE1G;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,+EAE9D;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE;;wDAEnF;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,aAAa,GAAG,WAAW,CAAA;CAAE;;;wDAE1G;AA0BD,wBAAgB,cAAc,CAAC,SAAS,EAAE,qBAAqB,GAAG,IAAI,CAyCrE"}
package/dist/react.js ADDED
@@ -0,0 +1,77 @@
1
+ // Generated from sdks/ui-extensions/src/react.tsx. Do not edit; run the Octonode SDK sync.
2
+ import { createElement } from "react";
3
+ import { createRoot } from "react-dom/client";
4
+ import { UI_EXTENSION_API_VERSION } from "./index";
5
+ export function defineExtension(target, component) {
6
+ return { apiVersion: UI_EXTENSION_API_VERSION, target, component };
7
+ }
8
+ export function NodeForm({ children }) {
9
+ return createElement("octonode-node-form", null, children);
10
+ }
11
+ export function Section({ title, children }) {
12
+ return createElement("octonode-section", { title }, children);
13
+ }
14
+ export function InputField({ name, appearance }) {
15
+ return createElement("octonode-input-field", { name, appearance });
16
+ }
17
+ function serialize(node) {
18
+ if (node.nodeType === Node.TEXT_NODE) {
19
+ const value = node.textContent?.trim();
20
+ return value ? { type: "text", value } : null;
21
+ }
22
+ if (!(node instanceof Element))
23
+ return null;
24
+ const children = Array.from(node.childNodes).flatMap((child) => {
25
+ const serialized = serialize(child);
26
+ return serialized ? [serialized] : [];
27
+ });
28
+ if (node.localName === "octonode-node-form")
29
+ return { type: "node-form", children };
30
+ if (node.localName === "octonode-section")
31
+ return { type: "section", title: node.getAttribute("title") ?? "", children };
32
+ if (node.localName === "octonode-input-field") {
33
+ const appearance = node.getAttribute("appearance");
34
+ return {
35
+ type: "input-field",
36
+ name: node.getAttribute("name") ?? "",
37
+ ...(appearance === "single-line" || appearance === "multiline" ? { appearance } : {}),
38
+ };
39
+ }
40
+ return null;
41
+ }
42
+ export function startExtension(extension) {
43
+ const root = document.createElement("div");
44
+ document.body.append(root);
45
+ let queued = false;
46
+ const publish = () => {
47
+ queued = false;
48
+ const tree = Array.from(root.childNodes).flatMap((node) => {
49
+ const serialized = serialize(node);
50
+ return serialized ? [serialized] : [];
51
+ });
52
+ parent.postMessage({
53
+ octonode: "ui-extension",
54
+ apiVersion: UI_EXTENSION_API_VERSION,
55
+ type: "render",
56
+ target: extension.target,
57
+ tree: { type: "node-form", children: tree },
58
+ }, "*");
59
+ };
60
+ const observer = new MutationObserver(() => {
61
+ if (queued)
62
+ return;
63
+ queued = true;
64
+ queueMicrotask(publish);
65
+ });
66
+ observer.observe(root, { subtree: true, childList: true, attributes: true, characterData: true });
67
+ addEventListener("error", (event) => parent.postMessage({
68
+ octonode: "ui-extension",
69
+ apiVersion: UI_EXTENSION_API_VERSION,
70
+ type: "error",
71
+ target: extension.target,
72
+ message: event.message,
73
+ }, "*"));
74
+ createRoot(root).render(createElement(extension.component));
75
+ queueMicrotask(publish);
76
+ }
77
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { validateExtensionMessage } from "./index";
2
+ export type { UiExtensionMessage, UiExtensionTree } from "./index";
3
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Generated from sdks/ui-extensions/src/testing.ts. Do not edit; run the Octonode SDK sync.
2
+ export { validateExtensionMessage } from "./index";
3
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@octonodes/ui-extensions",
3
+ "version": "0.1.5",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "description": "Portable contracts and React primitives for Octonode plugin UI extensions.",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./react": {
15
+ "types": "./dist/react.d.ts",
16
+ "import": "./dist/react.js"
17
+ },
18
+ "./testing": {
19
+ "types": "./dist/testing.d.ts",
20
+ "import": "./dist/testing.js"
21
+ }
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "peerDependencies": {
27
+ "react": "^19.0.0",
28
+ "react-dom": "^19.0.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/react": "19.2.18",
32
+ "@types/react-dom": "19.2.4",
33
+ "react": "19.2.8",
34
+ "react-dom": "19.2.8"
35
+ }
36
+ }