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

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,136 @@
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
+ },
67
77
  },
68
78
  emits: {
69
- /** Emitted when session status changes */
70
79
  session: (_status, _fork) => true,
71
- /** Emitted when automation produces output */
72
80
  output: (_output) => true,
81
+ forkActive: (_active) => true,
73
82
  },
74
83
  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
- });
84
+ const elementRef = ref(null);
85
+ // Sync non-serializable properties when element is mounted
86
+ const syncProperties = () => {
87
+ const el = elementRef.value;
88
+ if (!el)
89
+ return;
90
+ el.signals = props.signals;
91
+ el.capWidgetOptions = props.capWidgetOptions;
92
+ el.inheritFrom = props.inheritFrom;
93
+ el.classNames = props.classNames;
94
+ el.styles = props.styles;
95
+ el.onSessionCallback = (status, fork) => {
96
+ emit("session", status, fork);
97
+ };
98
+ el.onOutputCallback = (output) => {
99
+ emit("output", output);
100
+ };
101
+ el.onForkActiveCallback = (active) => {
102
+ emit("forkActive", active);
103
+ };
102
104
  };
103
- onMounted(() => {
104
- createClient();
105
+ watchEffect(() => {
106
+ syncProperties();
105
107
  });
106
- onUnmounted(() => {
107
- if (clientRef.value) {
108
- clientRef.value.destroy();
109
- clientRef.value = null;
110
- }
108
+ return () => h("adapt-automation", {
109
+ ref: elementRef,
110
+ "automation-id": props.id,
111
+ "session-token": props.sessionToken,
112
+ "auth-token": props.authToken,
113
+ transmitter: props.transmitter,
114
+ "challenge-token": props.challengeToken,
115
+ "requires-challenge": props.requiresChallenge ? "" : undefined,
116
+ "inherit-token": props.inheritToken,
117
+ "fork-display-mode": props.forkDisplay?.mode,
118
+ "side-by-side-split": props.forkDisplay?.mode === "side-by-side" &&
119
+ props.forkDisplay.split !== undefined
120
+ ? String(props.forkDisplay.split)
121
+ : undefined,
122
+ "dialog-backdrop-close": props.forkDisplay?.mode === "dialog" &&
123
+ props.forkDisplay.backdropClose
124
+ ? ""
125
+ : undefined,
126
+ "dialog-resize-to-content": props.forkDisplay?.mode === "dialog" &&
127
+ props.forkDisplay.resizeToContent
128
+ ? ""
129
+ : undefined,
130
+ "dark-mode": props.darkMode ? "" : undefined,
131
+ "auto-resizing": props.autoResizing ? "" : undefined,
132
+ ...attrs,
111
133
  });
112
- watch(() => props.id, createClient);
113
- return () => h("div", { id: containerId, ...attrs });
114
134
  },
115
135
  });
116
136
  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 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,71 @@ 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
+ };
69
76
  }>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
70
77
  [key: string]: any;
71
78
  }>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
72
- /** Emitted when session status changes */
73
79
  session: (_status: StatusJson, _fork?: string) => true;
74
- /** Emitted when automation produces output */
75
80
  output: (_output: Output) => true;
81
+ forkActive: (_active: boolean) => true;
76
82
  }, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
77
- /** Automation ID to connect to */
78
83
  id: {
79
84
  type: StringConstructor;
80
85
  required: true;
81
86
  };
82
- /** Pre-created session token from server-side session creation */
83
87
  sessionToken: {
84
88
  type: StringConstructor;
85
89
  default: undefined;
86
90
  };
87
- /** Authentication token for starting new sessions */
88
91
  authToken: {
89
92
  type: StringConstructor;
90
93
  default: undefined;
91
94
  };
92
- /** The transmitter to start from (optional) */
93
95
  transmitter: {
94
96
  type: StringConstructor;
95
97
  default: undefined;
96
98
  };
97
- /** Initial signals to pass to the transmitter */
98
99
  signals: {
99
100
  type: PropType<{
100
101
  [key: string]: SignalValue;
101
102
  }>;
102
103
  default: undefined;
103
104
  };
104
- /** Token to inherit an existing session */
105
105
  inheritToken: {
106
106
  type: StringConstructor;
107
107
  default: undefined;
108
108
  };
109
- /** Auto-parse inherit token from URL */
110
109
  inheritFrom: {
111
110
  type: PropType<{
112
111
  hash: string;
@@ -115,30 +114,44 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
115
114
  }>;
116
115
  default: undefined;
117
116
  };
118
- /** Fork display mode (default: 'side-by-side') */
119
- forkDisplayMode: {
120
- type: PropType<"side-by-side" | "dialog">;
121
- default: string;
117
+ forkDisplay: {
118
+ type: PropType<ForkDisplay>;
119
+ default: undefined;
122
120
  };
123
- /** Split percentage for side-by-side mode, 0-100 (default: 50) */
124
- sideBySideSplit: {
125
- type: NumberConstructor;
126
- default: number;
121
+ darkMode: {
122
+ type: BooleanConstructor;
123
+ default: boolean;
127
124
  };
128
- /** Allow closing dialog via backdrop click (default: false) */
129
- dialogBackdropClose: {
125
+ autoResizing: {
130
126
  type: BooleanConstructor;
131
127
  default: boolean;
132
128
  };
133
- /** Custom CSS class names for internal elements */
134
129
  classNames: {
135
130
  type: PropType<AdaptWebClientOptions["classNames"]>;
136
131
  default: undefined;
137
132
  };
133
+ styles: {
134
+ type: PropType<Partial<CSSStyleDeclaration>>;
135
+ default: undefined;
136
+ };
137
+ challengeToken: {
138
+ type: StringConstructor;
139
+ default: undefined;
140
+ };
141
+ requiresChallenge: {
142
+ type: BooleanConstructor;
143
+ default: boolean;
144
+ };
145
+ capWidgetOptions: {
146
+ type: PropType<AdaptWebClientOptions["capWidgetOptions"]>;
147
+ default: undefined;
148
+ };
138
149
  }>> & Readonly<{
139
- onSession?: ((_status: StatusJson, _fork?: string | undefined) => any) | undefined;
140
150
  onOutput?: ((_output: Output) => any) | undefined;
151
+ onSession?: ((_status: StatusJson, _fork?: string | undefined) => any) | undefined;
152
+ onForkActive?: ((_active: boolean) => any) | undefined;
141
153
  }>, {
154
+ darkMode: boolean;
142
155
  classNames: {
143
156
  root?: string;
144
157
  wrapper?: string;
@@ -152,7 +165,11 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
152
165
  dialogClose?: string;
153
166
  dragHandle?: string;
154
167
  expandButton?: string;
168
+ toolbar?: string;
169
+ toolbarTitle?: string;
170
+ toolbarButton?: string;
155
171
  } | undefined;
172
+ capWidgetOptions: import("@mochabug/adapt-web").CapWidgetOptions | undefined;
156
173
  sessionToken: string;
157
174
  authToken: string;
158
175
  transmitter: string;
@@ -165,8 +182,10 @@ export declare const Adapt: import("vue").DefineComponent<import("vue").ExtractP
165
182
  } | {
166
183
  param: string;
167
184
  };
168
- forkDisplayMode: "side-by-side" | "dialog";
169
- sideBySideSplit: number;
170
- dialogBackdropClose: boolean;
185
+ forkDisplay: ForkDisplay;
186
+ autoResizing: boolean;
187
+ styles: Partial<CSSStyleDeclaration>;
188
+ challengeToken: string;
189
+ requiresChallenge: boolean;
171
190
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
172
191
  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-rc30",
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-rc53"
40
40
  }
41
41
  }