@mochabug/adapt-vue 1.0.0-rc3 → 1.0.0-rc31

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.
@@ -0,0 +1,69 @@
1
+ import { AdaptCapElement } from "@mochabug/adapt-web";
2
+ import { defineComponent, h, ref, watchEffect, } from "vue";
3
+ // Re-export for direct use
4
+ export { AdaptCapWidget, } from "@mochabug/adapt-web";
5
+ // Ensure custom element is registered
6
+ void AdaptCapElement;
7
+ /**
8
+ * Vue component for Cap.js proof-of-work challenges.
9
+ * Renders `<adapt-cap>` custom element and syncs non-serializable properties via ref.
10
+ */
11
+ export const AdaptCap = defineComponent({
12
+ name: "AdaptCap",
13
+ inheritAttrs: false,
14
+ props: {
15
+ automationId: {
16
+ type: String,
17
+ required: true,
18
+ },
19
+ client: {
20
+ type: Object,
21
+ required: true,
22
+ },
23
+ workerCount: {
24
+ type: Number,
25
+ default: undefined,
26
+ },
27
+ i18n: {
28
+ type: Object,
29
+ default: undefined,
30
+ },
31
+ darkMode: {
32
+ type: Boolean,
33
+ default: false,
34
+ },
35
+ },
36
+ emits: {
37
+ solve: (_token, _expires) => true,
38
+ error: (_error) => true,
39
+ },
40
+ setup(props, { emit, attrs }) {
41
+ const elementRef = ref(null);
42
+ const syncProperties = () => {
43
+ const el = elementRef.value;
44
+ if (!el)
45
+ return;
46
+ el.client = props.client;
47
+ el.i18n = props.i18n;
48
+ el.onSolveCallback = (token, expires) => {
49
+ emit("solve", token, expires);
50
+ };
51
+ el.onErrorCallback = (error) => {
52
+ emit("error", error);
53
+ };
54
+ };
55
+ watchEffect(() => {
56
+ syncProperties();
57
+ });
58
+ return () => h("adapt-cap", {
59
+ ref: elementRef,
60
+ "automation-id": props.automationId,
61
+ "dark-mode": props.darkMode ? "" : undefined,
62
+ "worker-count": props.workerCount !== undefined
63
+ ? String(props.workerCount)
64
+ : undefined,
65
+ ...attrs,
66
+ });
67
+ },
68
+ });
69
+ export default AdaptCap;
package/dist/esm/index.js CHANGED
@@ -1,116 +1,143 @@
1
- import { AdaptWebClient, } from "@mochabug/adapt-web";
2
- import { defineComponent, h, onMounted, onUnmounted, ref, watch, } from "vue";
1
+ import { AdaptAutomationElement, } from "@mochabug/adapt-web";
2
+ import { defineComponent, h, ref, watchEffect } from "vue";
3
3
  // Re-export everything from web
4
4
  export * from "@mochabug/adapt-web";
5
+ // Export standalone Cap widget component
6
+ export { AdaptCap } from "./AdaptCap.js";
7
+ // Ensure custom element is registered
8
+ void AdaptAutomationElement;
5
9
  /**
6
10
  * Vue component for embedding Adapt automations.
11
+ * Renders `<adapt-automation>` custom element and syncs non-serializable properties via ref.
7
12
  */
8
13
  export const Adapt = defineComponent({
9
14
  name: "Adapt",
10
15
  inheritAttrs: false,
11
16
  props: {
12
- /** Automation ID to connect to */
13
17
  id: {
14
18
  type: String,
15
19
  required: true,
16
20
  },
17
- /** Pre-created session token from server-side session creation */
18
21
  sessionToken: {
19
22
  type: String,
20
23
  default: undefined,
21
24
  },
22
- /** Authentication token for starting new sessions */
23
25
  authToken: {
24
26
  type: String,
25
27
  default: undefined,
26
28
  },
27
- /** The transmitter to start from (optional) */
28
29
  transmitter: {
29
30
  type: String,
30
31
  default: undefined,
31
32
  },
32
- /** Initial signals to pass to the transmitter */
33
33
  signals: {
34
34
  type: Object,
35
35
  default: undefined,
36
36
  },
37
- /** Token to inherit an existing session */
38
37
  inheritToken: {
39
38
  type: String,
40
39
  default: undefined,
41
40
  },
42
- /** Auto-parse inherit token from URL */
43
41
  inheritFrom: {
44
42
  type: Object,
45
43
  default: undefined,
46
44
  },
47
- /** Fork display mode (default: 'side-by-side') */
48
- forkDisplayMode: {
49
- type: String,
50
- default: "side-by-side",
45
+ forkDisplay: {
46
+ type: Object,
47
+ default: undefined,
51
48
  },
52
- /** Split percentage for side-by-side mode, 0-100 (default: 50) */
53
- sideBySideSplit: {
54
- type: Number,
55
- default: 50,
49
+ darkMode: {
50
+ type: Boolean,
51
+ default: false,
56
52
  },
57
- /** Allow closing dialog via backdrop click (default: false) */
58
- dialogBackdropClose: {
53
+ autoResizing: {
59
54
  type: Boolean,
60
55
  default: false,
61
56
  },
62
- /** Custom CSS class names for internal elements */
63
57
  classNames: {
64
58
  type: Object,
65
59
  default: undefined,
66
60
  },
61
+ styles: {
62
+ type: Object,
63
+ default: undefined,
64
+ },
65
+ challengeToken: {
66
+ type: String,
67
+ default: undefined,
68
+ },
69
+ requiresChallenge: {
70
+ type: Boolean,
71
+ default: false,
72
+ },
73
+ capWidgetOptions: {
74
+ type: Object,
75
+ default: undefined,
76
+ },
77
+ persist: {
78
+ type: [Boolean, Object],
79
+ default: undefined,
80
+ },
67
81
  },
68
82
  emits: {
69
- /** Emitted when session status changes */
70
83
  session: (_status, _fork) => true,
71
- /** Emitted when automation produces output */
72
84
  output: (_output) => true,
85
+ forkActive: (_active) => true,
73
86
  },
74
87
  setup(props, { emit, attrs }) {
75
- const containerId = `adapt-${Math.random().toString(36).slice(2, 11)}`;
76
- const clientRef = ref(null);
77
- const createClient = () => {
78
- if (clientRef.value) {
79
- clientRef.value.destroy();
80
- clientRef.value = null;
81
- }
82
- clientRef.value = new AdaptWebClient({
83
- container: containerId,
84
- id: props.id,
85
- sessionToken: props.sessionToken,
86
- authToken: props.authToken,
87
- transmitter: props.transmitter,
88
- signals: props.signals,
89
- inheritToken: props.inheritToken,
90
- inheritFrom: props.inheritFrom,
91
- forkDisplayMode: props.forkDisplayMode,
92
- sideBySideSplit: props.sideBySideSplit,
93
- dialogBackdropClose: props.dialogBackdropClose,
94
- classNames: props.classNames,
95
- onSession: (status, fork) => {
96
- emit("session", status, fork);
97
- },
98
- onOutput: (output) => {
99
- emit("output", output);
100
- },
101
- });
88
+ const elementRef = ref(null);
89
+ // Sync non-serializable properties when element is mounted
90
+ const syncProperties = () => {
91
+ const el = elementRef.value;
92
+ if (!el)
93
+ return;
94
+ el.signals = props.signals;
95
+ el.capWidgetOptions = props.capWidgetOptions;
96
+ el.inheritFrom = props.inheritFrom;
97
+ el.classNames = props.classNames;
98
+ el.styles = props.styles;
99
+ el.persistOptions =
100
+ typeof props.persist === "object" ? props.persist : undefined;
101
+ el.onSessionCallback = (status, fork) => {
102
+ emit("session", status, fork);
103
+ };
104
+ el.onOutputCallback = (output) => {
105
+ emit("output", output);
106
+ };
107
+ el.onForkActiveCallback = (active) => {
108
+ emit("forkActive", active);
109
+ };
102
110
  };
103
- onMounted(() => {
104
- createClient();
111
+ watchEffect(() => {
112
+ syncProperties();
105
113
  });
106
- onUnmounted(() => {
107
- if (clientRef.value) {
108
- clientRef.value.destroy();
109
- clientRef.value = null;
110
- }
114
+ return () => h("adapt-automation", {
115
+ ref: elementRef,
116
+ "automation-id": props.id,
117
+ "session-token": props.sessionToken,
118
+ "auth-token": props.authToken,
119
+ transmitter: props.transmitter,
120
+ "challenge-token": props.challengeToken,
121
+ "requires-challenge": props.requiresChallenge ? "" : undefined,
122
+ "inherit-token": props.inheritToken,
123
+ "fork-display-mode": props.forkDisplay?.mode,
124
+ "side-by-side-split": props.forkDisplay?.mode === "side-by-side" &&
125
+ props.forkDisplay.split !== undefined
126
+ ? String(props.forkDisplay.split)
127
+ : undefined,
128
+ "dialog-backdrop-close": props.forkDisplay?.mode === "dialog" &&
129
+ props.forkDisplay.backdropClose !== false
130
+ ? ""
131
+ : undefined,
132
+ "dialog-resize-to-content": props.forkDisplay?.mode === "dialog" &&
133
+ props.forkDisplay.resizeToContent !== false
134
+ ? ""
135
+ : undefined,
136
+ "dark-mode": props.darkMode ? "" : undefined,
137
+ "auto-resizing": props.autoResizing ? "" : undefined,
138
+ persist: props.persist ? "" : undefined,
139
+ ...attrs,
111
140
  });
112
- watch(() => props.id, createClient);
113
- return () => h("div", { id: containerId, ...attrs });
114
141
  },
115
142
  });
116
143
  export default Adapt;
@@ -0,0 +1,64 @@
1
+ import type { AutomationClient } from "@mochabug/adapt-core";
2
+ import { type CapWidgetI18n } from "@mochabug/adapt-web";
3
+ import { type PropType } from "vue";
4
+ export { AdaptCapWidget, type AdaptCapWidgetOptions, } from "@mochabug/adapt-web";
5
+ /**
6
+ * Vue component for Cap.js proof-of-work challenges.
7
+ * Renders `<adapt-cap>` custom element and syncs non-serializable properties via ref.
8
+ */
9
+ export declare const AdaptCap: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
10
+ automationId: {
11
+ type: StringConstructor;
12
+ required: true;
13
+ };
14
+ client: {
15
+ type: PropType<AutomationClient>;
16
+ required: true;
17
+ };
18
+ workerCount: {
19
+ type: NumberConstructor;
20
+ default: undefined;
21
+ };
22
+ i18n: {
23
+ type: PropType<CapWidgetI18n>;
24
+ default: undefined;
25
+ };
26
+ darkMode: {
27
+ type: BooleanConstructor;
28
+ default: boolean;
29
+ };
30
+ }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
31
+ [key: string]: any;
32
+ }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
33
+ solve: (_token: string, _expires: Date) => true;
34
+ error: (_error: Error) => true;
35
+ }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
36
+ automationId: {
37
+ type: StringConstructor;
38
+ required: true;
39
+ };
40
+ client: {
41
+ type: PropType<AutomationClient>;
42
+ required: true;
43
+ };
44
+ workerCount: {
45
+ type: NumberConstructor;
46
+ default: undefined;
47
+ };
48
+ i18n: {
49
+ type: PropType<CapWidgetI18n>;
50
+ default: undefined;
51
+ };
52
+ darkMode: {
53
+ type: BooleanConstructor;
54
+ default: boolean;
55
+ };
56
+ }>> & Readonly<{
57
+ onSolve?: ((_token: string, _expires: Date) => any) | undefined;
58
+ onError?: ((_error: Error) => any) | undefined;
59
+ }>, {
60
+ workerCount: number;
61
+ i18n: CapWidgetI18n;
62
+ darkMode: boolean;
63
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
64
+ export default AdaptCap;
@@ -1,43 +1,38 @@
1
- import { type AdaptWebClientOptions, type Output, type SignalValue, type StatusJson } from "@mochabug/adapt-web";
1
+ import { type AdaptWebClientOptions, type ForkDisplay, type Output, type PersistOptions, type SignalValue, type StatusJson } from "@mochabug/adapt-web";
2
2
  import { type PropType } from "vue";
3
3
  export * from "@mochabug/adapt-web";
4
+ export { AdaptCap } from "./AdaptCap.js";
4
5
  /**
5
6
  * Vue component for embedding Adapt automations.
7
+ * Renders `<adapt-automation>` custom element and syncs non-serializable properties via ref.
6
8
  */
7
9
  export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
8
- /** Automation ID to connect to */
9
10
  id: {
10
11
  type: StringConstructor;
11
12
  required: true;
12
13
  };
13
- /** Pre-created session token from server-side session creation */
14
14
  sessionToken: {
15
15
  type: StringConstructor;
16
16
  default: undefined;
17
17
  };
18
- /** Authentication token for starting new sessions */
19
18
  authToken: {
20
19
  type: StringConstructor;
21
20
  default: undefined;
22
21
  };
23
- /** The transmitter to start from (optional) */
24
22
  transmitter: {
25
23
  type: StringConstructor;
26
24
  default: undefined;
27
25
  };
28
- /** Initial signals to pass to the transmitter */
29
26
  signals: {
30
27
  type: PropType<{
31
28
  [key: string]: SignalValue;
32
29
  }>;
33
30
  default: undefined;
34
31
  };
35
- /** Token to inherit an existing session */
36
32
  inheritToken: {
37
33
  type: StringConstructor;
38
34
  default: undefined;
39
35
  };
40
- /** Auto-parse inherit token from URL */
41
36
  inheritFrom: {
42
37
  type: PropType<{
43
38
  hash: string;
@@ -46,67 +41,75 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
46
41
  }>;
47
42
  default: undefined;
48
43
  };
49
- /** Fork display mode (default: 'side-by-side') */
50
- forkDisplayMode: {
51
- type: PropType<"side-by-side" | "dialog">;
52
- default: string;
44
+ forkDisplay: {
45
+ type: PropType<ForkDisplay>;
46
+ default: undefined;
53
47
  };
54
- /** Split percentage for side-by-side mode, 0-100 (default: 50) */
55
- sideBySideSplit: {
56
- type: NumberConstructor;
57
- default: number;
48
+ darkMode: {
49
+ type: BooleanConstructor;
50
+ default: boolean;
58
51
  };
59
- /** Allow closing dialog via backdrop click (default: false) */
60
- dialogBackdropClose: {
52
+ autoResizing: {
61
53
  type: BooleanConstructor;
62
54
  default: boolean;
63
55
  };
64
- /** Custom CSS class names for internal elements */
65
56
  classNames: {
66
57
  type: PropType<AdaptWebClientOptions["classNames"]>;
67
58
  default: undefined;
68
59
  };
60
+ styles: {
61
+ type: PropType<Partial<CSSStyleDeclaration>>;
62
+ default: undefined;
63
+ };
64
+ challengeToken: {
65
+ type: StringConstructor;
66
+ default: undefined;
67
+ };
68
+ requiresChallenge: {
69
+ type: BooleanConstructor;
70
+ default: boolean;
71
+ };
72
+ capWidgetOptions: {
73
+ type: PropType<AdaptWebClientOptions["capWidgetOptions"]>;
74
+ default: undefined;
75
+ };
76
+ persist: {
77
+ type: PropType<boolean | PersistOptions>;
78
+ default: undefined;
79
+ };
69
80
  }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
70
81
  [key: string]: any;
71
82
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
72
- /** Emitted when session status changes */
73
83
  session: (_status: StatusJson, _fork?: string) => true;
74
- /** Emitted when automation produces output */
75
84
  output: (_output: Output) => true;
85
+ forkActive: (_active: boolean) => true;
76
86
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
77
- /** Automation ID to connect to */
78
87
  id: {
79
88
  type: StringConstructor;
80
89
  required: true;
81
90
  };
82
- /** Pre-created session token from server-side session creation */
83
91
  sessionToken: {
84
92
  type: StringConstructor;
85
93
  default: undefined;
86
94
  };
87
- /** Authentication token for starting new sessions */
88
95
  authToken: {
89
96
  type: StringConstructor;
90
97
  default: undefined;
91
98
  };
92
- /** The transmitter to start from (optional) */
93
99
  transmitter: {
94
100
  type: StringConstructor;
95
101
  default: undefined;
96
102
  };
97
- /** Initial signals to pass to the transmitter */
98
103
  signals: {
99
104
  type: PropType<{
100
105
  [key: string]: SignalValue;
101
106
  }>;
102
107
  default: undefined;
103
108
  };
104
- /** Token to inherit an existing session */
105
109
  inheritToken: {
106
110
  type: StringConstructor;
107
111
  default: undefined;
108
112
  };
109
- /** Auto-parse inherit token from URL */
110
113
  inheritFrom: {
111
114
  type: PropType<{
112
115
  hash: string;
@@ -115,30 +118,48 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
115
118
  }>;
116
119
  default: undefined;
117
120
  };
118
- /** Fork display mode (default: 'side-by-side') */
119
- forkDisplayMode: {
120
- type: PropType<"side-by-side" | "dialog">;
121
- default: string;
121
+ forkDisplay: {
122
+ type: PropType<ForkDisplay>;
123
+ default: undefined;
122
124
  };
123
- /** Split percentage for side-by-side mode, 0-100 (default: 50) */
124
- sideBySideSplit: {
125
- type: NumberConstructor;
126
- default: number;
125
+ darkMode: {
126
+ type: BooleanConstructor;
127
+ default: boolean;
127
128
  };
128
- /** Allow closing dialog via backdrop click (default: false) */
129
- dialogBackdropClose: {
129
+ autoResizing: {
130
130
  type: BooleanConstructor;
131
131
  default: boolean;
132
132
  };
133
- /** Custom CSS class names for internal elements */
134
133
  classNames: {
135
134
  type: PropType<AdaptWebClientOptions["classNames"]>;
136
135
  default: undefined;
137
136
  };
137
+ styles: {
138
+ type: PropType<Partial<CSSStyleDeclaration>>;
139
+ default: undefined;
140
+ };
141
+ challengeToken: {
142
+ type: StringConstructor;
143
+ default: undefined;
144
+ };
145
+ requiresChallenge: {
146
+ type: BooleanConstructor;
147
+ default: boolean;
148
+ };
149
+ capWidgetOptions: {
150
+ type: PropType<AdaptWebClientOptions["capWidgetOptions"]>;
151
+ default: undefined;
152
+ };
153
+ persist: {
154
+ type: PropType<boolean | PersistOptions>;
155
+ default: undefined;
156
+ };
138
157
  }>> & Readonly<{
139
- onSession?: ((_status: StatusJson, _fork?: string | undefined) => any) | undefined;
140
158
  onOutput?: ((_output: Output) => any) | undefined;
159
+ onSession?: ((_status: StatusJson, _fork?: string | undefined) => any) | undefined;
160
+ onForkActive?: ((_active: boolean) => any) | undefined;
141
161
  }>, {
162
+ darkMode: boolean;
142
163
  classNames: {
143
164
  root?: string;
144
165
  wrapper?: string;
@@ -152,7 +173,11 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
152
173
  dialogClose?: string;
153
174
  dragHandle?: string;
154
175
  expandButton?: string;
176
+ toolbar?: string;
177
+ toolbarTitle?: string;
178
+ toolbarButton?: string;
155
179
  } | undefined;
180
+ capWidgetOptions: import("@mochabug/adapt-web").CapWidgetOptions | undefined;
156
181
  sessionToken: string;
157
182
  authToken: string;
158
183
  transmitter: string;
@@ -165,8 +190,11 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
165
190
  } | {
166
191
  param: string;
167
192
  };
168
- forkDisplayMode: "side-by-side" | "dialog";
169
- sideBySideSplit: number;
170
- dialogBackdropClose: boolean;
193
+ forkDisplay: ForkDisplay;
194
+ autoResizing: boolean;
195
+ styles: Partial<CSSStyleDeclaration>;
196
+ challengeToken: string;
197
+ requiresChallenge: boolean;
198
+ persist: boolean | PersistOptions;
171
199
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
172
200
  export default Adapt;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mochabug/adapt-vue",
3
- "version": "1.0.0-rc3",
3
+ "version": "1.0.0-rc31",
4
4
  "description": "Vue component for Adapt automation platform",
5
5
  "type": "module",
6
6
  "main": "./dist/esm/index.js",
@@ -18,7 +18,7 @@
18
18
  "build:esm": "tsc --project tsconfig.esm.json",
19
19
  "build:types": "tsc --project tsconfig.types.json",
20
20
  "build": "rm -rf dist && npm run build:esm && npm run build:types",
21
- "sample": "cd sample && npm run dev"
21
+ "sample": "npm run build && cd sample && npm run dev"
22
22
  },
23
23
  "keywords": [
24
24
  "adapt",
@@ -33,9 +33,9 @@
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "^5.9.3",
36
- "vue": "^3.5.24"
36
+ "vue": "^3.5.29"
37
37
  },
38
38
  "dependencies": {
39
- "@mochabug/adapt-web": "^1.0.0-rc24"
39
+ "@mochabug/adapt-web": "^1.0.0-rc54"
40
40
  }
41
41
  }