@atomic-testing/vue-3 0.78.0 → 0.80.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/{index.js → index.cjs} +15 -35
- package/dist/index.cjs.map +1 -0
- package/dist/{index.d.ts → index.d.cts} +6 -5
- package/dist/index.d.mts +5 -4
- package/dist/index.mjs +6 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -5
- package/src/VueInteractor.ts +15 -9
- package/src/createTestEngine.ts +1 -1
- package/src/types.ts +2 -2
- package/dist/index.js.map +0 -1
|
@@ -1,33 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
-
key = keys[i];
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
-
get: ((k) => from[k]).bind(null, key),
|
|
13
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
-
value: mod,
|
|
20
|
-
enumerable: true
|
|
21
|
-
}) : target, mod));
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
const __atomic_testing_core = __toESM(require("@atomic-testing/core"));
|
|
25
|
-
const __testing_library_vue = __toESM(require("@testing-library/vue"));
|
|
26
|
-
const vue = __toESM(require("vue"));
|
|
27
|
-
const __atomic_testing_dom_core = __toESM(require("@atomic-testing/dom-core"));
|
|
1
|
+
let _atomic_testing_core = require("@atomic-testing/core");
|
|
2
|
+
let _testing_library_vue = require("@testing-library/vue");
|
|
3
|
+
let vue = require("vue");
|
|
4
|
+
let _atomic_testing_dom_core = require("@atomic-testing/dom-core");
|
|
28
5
|
|
|
29
6
|
//#region src/VueInteractor.ts
|
|
30
|
-
var VueInteractor = class VueInteractor extends
|
|
7
|
+
var VueInteractor = class VueInteractor extends _atomic_testing_dom_core.DOMInteractor {
|
|
31
8
|
async flush() {
|
|
32
9
|
await (0, vue.nextTick)();
|
|
33
10
|
}
|
|
@@ -75,6 +52,10 @@ var VueInteractor = class VueInteractor extends __atomic_testing_dom_core.DOMInt
|
|
|
75
52
|
await super.focus(locator, option);
|
|
76
53
|
await this.flush();
|
|
77
54
|
}
|
|
55
|
+
async blur(locator, option) {
|
|
56
|
+
await super.blur(locator, option);
|
|
57
|
+
await this.flush();
|
|
58
|
+
}
|
|
78
59
|
async selectOptionValue(locator, values) {
|
|
79
60
|
await super.selectOptionValue(locator, values);
|
|
80
61
|
await this.flush();
|
|
@@ -83,7 +64,7 @@ var VueInteractor = class VueInteractor extends __atomic_testing_dom_core.DOMInt
|
|
|
83
64
|
await super.wait(ms);
|
|
84
65
|
await this.flush();
|
|
85
66
|
}
|
|
86
|
-
async waitUntilComponentState(locator, option =
|
|
67
|
+
async waitUntilComponentState(locator, option = _atomic_testing_core.defaultWaitForOption) {
|
|
87
68
|
await super.waitUntilComponentState(locator, option);
|
|
88
69
|
await this.flush();
|
|
89
70
|
}
|
|
@@ -93,7 +74,7 @@ var VueInteractor = class VueInteractor extends __atomic_testing_dom_core.DOMInt
|
|
|
93
74
|
return result;
|
|
94
75
|
}
|
|
95
76
|
clone() {
|
|
96
|
-
return new VueInteractor();
|
|
77
|
+
return new VueInteractor(this.rootEl);
|
|
97
78
|
}
|
|
98
79
|
};
|
|
99
80
|
|
|
@@ -128,8 +109,7 @@ function createTestEngine(component, partDefinitions, option) {
|
|
|
128
109
|
let app;
|
|
129
110
|
const compiledComponent = isSFCLikeObject(component) ? createComponentFromSFCLike(component) : component;
|
|
130
111
|
try {
|
|
131
|
-
|
|
132
|
-
unmount = renderResult.unmount;
|
|
112
|
+
unmount = (0, _testing_library_vue.render)(compiledComponent, { container }).unmount;
|
|
133
113
|
} catch (_error) {
|
|
134
114
|
app = (0, vue.createApp)(compiledComponent);
|
|
135
115
|
app.mount(container);
|
|
@@ -142,7 +122,7 @@ function createTestEngine(component, partDefinitions, option) {
|
|
|
142
122
|
rootEl.removeChild(container);
|
|
143
123
|
return Promise.resolve();
|
|
144
124
|
};
|
|
145
|
-
return new
|
|
125
|
+
return new _atomic_testing_core.TestEngine((0, _atomic_testing_core.byAttribute)(rootElementAttributeName, rootId), new VueInteractor(), { parts: partDefinitions }, cleanup);
|
|
146
126
|
}
|
|
147
127
|
function createRenderedTestEngine(rootElement, partDefinitions, _option) {
|
|
148
128
|
const rootId = getNextRootElementId();
|
|
@@ -151,11 +131,11 @@ function createRenderedTestEngine(rootElement, partDefinitions, _option) {
|
|
|
151
131
|
rootElement.removeAttribute(rootElementAttributeName);
|
|
152
132
|
return Promise.resolve();
|
|
153
133
|
};
|
|
154
|
-
return new
|
|
134
|
+
return new _atomic_testing_core.TestEngine((0, _atomic_testing_core.byAttribute)(rootElementAttributeName, rootId), new VueInteractor(), { parts: partDefinitions }, cleanup);
|
|
155
135
|
}
|
|
156
136
|
|
|
157
137
|
//#endregion
|
|
158
138
|
exports.VueInteractor = VueInteractor;
|
|
159
139
|
exports.createRenderedTestEngine = createRenderedTestEngine;
|
|
160
140
|
exports.createTestEngine = createTestEngine;
|
|
161
|
-
//# sourceMappingURL=index.
|
|
141
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["DOMInteractor","defaultWaitForOption","componentOptions: any","unmount: () => void","app: App","TestEngine"],"sources":["../src/VueInteractor.ts","../src/createTestEngine.ts"],"sourcesContent":["import {\n BlurOption,\n ClickOption,\n defaultWaitForOption,\n EnterTextOption,\n FocusOption,\n HoverOption,\n Interactor,\n MouseDownOption,\n MouseEnterOption,\n MouseLeaveOption,\n MouseMoveOption,\n MouseOutOption,\n MouseUpOption,\n PartLocator,\n WaitForOption,\n WaitUntilOption,\n} from '@atomic-testing/core';\nimport { DOMInteractor } from '@atomic-testing/dom-core';\nimport { nextTick } from 'vue';\n\nexport class VueInteractor extends DOMInteractor {\n private async flush() {\n await nextTick();\n }\n\n override async enterText(locator: PartLocator, text: string, option?: Partial<EnterTextOption>): Promise<void> {\n await super.enterText(locator, text, option);\n await this.flush();\n }\n\n override async click(locator: PartLocator, option?: Partial<ClickOption>): Promise<void> {\n await super.click(locator, option);\n await this.flush();\n }\n\n override async hover(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.hover(locator, option);\n await this.flush();\n }\n\n override async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {\n await super.mouseMove(locator, option);\n await this.flush();\n }\n\n override async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {\n await super.mouseDown(locator, option);\n await this.flush();\n }\n\n override async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {\n await super.mouseUp(locator, option);\n await this.flush();\n }\n\n override async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.mouseOver(locator, option);\n await this.flush();\n }\n\n override async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {\n await super.mouseOut(locator, option);\n await this.flush();\n }\n\n override async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {\n await super.mouseEnter(locator, option);\n await this.flush();\n }\n\n override async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {\n await super.mouseLeave(locator, option);\n await this.flush();\n }\n\n override async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {\n await super.focus(locator, option);\n await this.flush();\n }\n\n override async blur(locator: PartLocator, option?: Partial<BlurOption>): Promise<void> {\n await super.blur(locator, option);\n await this.flush();\n }\n\n override async selectOptionValue(locator: PartLocator, values: string[]): Promise<void> {\n await super.selectOptionValue(locator, values);\n await this.flush();\n }\n\n override async wait(ms: number): Promise<void> {\n await super.wait(ms);\n await this.flush();\n }\n\n override async waitUntilComponentState(\n locator: PartLocator,\n option: Partial<Readonly<WaitForOption>> = defaultWaitForOption\n ): Promise<void> {\n await super.waitUntilComponentState(locator, option);\n await this.flush();\n }\n\n override async waitUntil<T>(option: WaitUntilOption<T>): Promise<T> {\n const result = await super.waitUntil(option);\n await this.flush();\n return result;\n }\n\n override clone(): Interactor {\n return new VueInteractor(this.rootEl);\n }\n}\n","import { byAttribute, ScenePart, TestEngine } from '@atomic-testing/core';\nimport { render } from '@testing-library/vue';\nimport { App, Component, createApp, defineComponent } from 'vue';\n\nimport { VueInteractor } from './VueInteractor';\nimport { IVueTestEngineOption, VueSFCLikeComponent } from './types';\n\nlet _rootId = 0;\nfunction getNextRootElementId() {\n return `${_rootId++}`;\n}\n\nconst rootElementAttributeName = 'data-atomic-testing-vue';\n\nfunction isSFCLikeObject(component: any): component is VueSFCLikeComponent {\n return (\n component && typeof component === 'object' && 'template' in component && typeof component.template === 'string'\n );\n}\n\nfunction createComponentFromSFCLike(sfcObj: VueSFCLikeComponent): Component {\n const componentOptions: any = {\n name: sfcObj.name || 'SFCComponent',\n template: sfcObj.template,\n };\n\n if (sfcObj.props) {\n componentOptions.props = sfcObj.props;\n }\n\n if (sfcObj.setup) {\n componentOptions.setup = sfcObj.setup;\n }\n\n if (sfcObj.data) {\n componentOptions.data = sfcObj.data;\n }\n\n if (sfcObj.methods) {\n componentOptions.methods = sfcObj.methods;\n }\n\n if (sfcObj.computed) {\n componentOptions.computed = sfcObj.computed;\n }\n\n return defineComponent(componentOptions);\n}\n\nexport function createTestEngine<T extends ScenePart>(\n component: Component | VueSFCLikeComponent,\n partDefinitions: T,\n option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootEl = option?.rootElement ?? document.body;\n const container = rootEl.appendChild(document.createElement('div'));\n const rootId = getNextRootElementId();\n container.setAttribute(rootElementAttributeName, rootId);\n\n let unmount: () => void;\n let app: App;\n\n // Create component from SFC-like object if needed\n const compiledComponent = isSFCLikeObject(component)\n ? createComponentFromSFCLike(component)\n : (component as Component);\n\n try {\n const renderResult = render(compiledComponent, { container });\n unmount = renderResult.unmount;\n } catch (_error) {\n // Fallback to manual Vue app creation if render fails\n app = createApp(compiledComponent);\n app.mount(container);\n unmount = () => {\n if (app) {\n app.unmount();\n }\n };\n }\n\n const cleanup = () => {\n unmount();\n rootEl.removeChild(container);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n\nexport function createRenderedTestEngine<T extends ScenePart>(\n rootElement: HTMLElement,\n partDefinitions: T,\n _option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootId = getNextRootElementId();\n rootElement.setAttribute(rootElementAttributeName, rootId);\n\n const cleanup = () => {\n rootElement.removeAttribute(rootElementAttributeName);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClickOption, EnterTextOption, FocusOption, HoverOption, IComponentDriverOption, Interactor, MouseDownOption, MouseEnterOption, MouseLeaveOption, MouseMoveOption, MouseOutOption, MouseUpOption, PartLocator, ScenePart, TestEngine, WaitForOption, WaitUntilOption } from "@atomic-testing/core";
|
|
1
|
+
import { BlurOption, ClickOption, EnterTextOption, FocusOption, HoverOption, IComponentDriverOption, Interactor, MouseDownOption, MouseEnterOption, MouseLeaveOption, MouseMoveOption, MouseOutOption, MouseUpOption, PartLocator, ScenePart, TestEngine, WaitForOption, WaitUntilOption } from "@atomic-testing/core";
|
|
2
2
|
import { Component } from "vue";
|
|
3
3
|
import { DOMInteractor } from "@atomic-testing/dom-core";
|
|
4
4
|
|
|
@@ -10,8 +10,8 @@ interface VueSFCLikeComponent {
|
|
|
10
10
|
template: string;
|
|
11
11
|
setup?: () => any;
|
|
12
12
|
data?: () => any;
|
|
13
|
-
methods?: Record<string,
|
|
14
|
-
computed?: Record<string,
|
|
13
|
+
methods?: Record<string, (...args: any[]) => any>;
|
|
14
|
+
computed?: Record<string, () => any>;
|
|
15
15
|
name?: string;
|
|
16
16
|
props?: any;
|
|
17
17
|
}
|
|
@@ -34,6 +34,7 @@ declare class VueInteractor extends DOMInteractor {
|
|
|
34
34
|
mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void>;
|
|
35
35
|
mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void>;
|
|
36
36
|
focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void>;
|
|
37
|
+
blur(locator: PartLocator, option?: Partial<BlurOption>): Promise<void>;
|
|
37
38
|
selectOptionValue(locator: PartLocator, values: string[]): Promise<void>;
|
|
38
39
|
wait(ms: number): Promise<void>;
|
|
39
40
|
waitUntilComponentState(locator: PartLocator, option?: Partial<Readonly<WaitForOption>>): Promise<void>;
|
|
@@ -41,5 +42,5 @@ declare class VueInteractor extends DOMInteractor {
|
|
|
41
42
|
clone(): Interactor;
|
|
42
43
|
}
|
|
43
44
|
//#endregion
|
|
44
|
-
export { IVueTestEngineOption, VueInteractor, VueSFCLikeComponent, createRenderedTestEngine, createTestEngine };
|
|
45
|
-
//# sourceMappingURL=index.d.
|
|
45
|
+
export { type IVueTestEngineOption, VueInteractor, type VueSFCLikeComponent, createRenderedTestEngine, createTestEngine };
|
|
46
|
+
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClickOption, EnterTextOption, FocusOption, HoverOption, IComponentDriverOption, Interactor, MouseDownOption, MouseEnterOption, MouseLeaveOption, MouseMoveOption, MouseOutOption, MouseUpOption, PartLocator, ScenePart, TestEngine, WaitForOption, WaitUntilOption } from "@atomic-testing/core";
|
|
1
|
+
import { BlurOption, ClickOption, EnterTextOption, FocusOption, HoverOption, IComponentDriverOption, Interactor, MouseDownOption, MouseEnterOption, MouseLeaveOption, MouseMoveOption, MouseOutOption, MouseUpOption, PartLocator, ScenePart, TestEngine, WaitForOption, WaitUntilOption } from "@atomic-testing/core";
|
|
2
2
|
import { Component } from "vue";
|
|
3
3
|
import { DOMInteractor } from "@atomic-testing/dom-core";
|
|
4
4
|
|
|
@@ -10,8 +10,8 @@ interface VueSFCLikeComponent {
|
|
|
10
10
|
template: string;
|
|
11
11
|
setup?: () => any;
|
|
12
12
|
data?: () => any;
|
|
13
|
-
methods?: Record<string,
|
|
14
|
-
computed?: Record<string,
|
|
13
|
+
methods?: Record<string, (...args: any[]) => any>;
|
|
14
|
+
computed?: Record<string, () => any>;
|
|
15
15
|
name?: string;
|
|
16
16
|
props?: any;
|
|
17
17
|
}
|
|
@@ -34,6 +34,7 @@ declare class VueInteractor extends DOMInteractor {
|
|
|
34
34
|
mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void>;
|
|
35
35
|
mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void>;
|
|
36
36
|
focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void>;
|
|
37
|
+
blur(locator: PartLocator, option?: Partial<BlurOption>): Promise<void>;
|
|
37
38
|
selectOptionValue(locator: PartLocator, values: string[]): Promise<void>;
|
|
38
39
|
wait(ms: number): Promise<void>;
|
|
39
40
|
waitUntilComponentState(locator: PartLocator, option?: Partial<Readonly<WaitForOption>>): Promise<void>;
|
|
@@ -41,5 +42,5 @@ declare class VueInteractor extends DOMInteractor {
|
|
|
41
42
|
clone(): Interactor;
|
|
42
43
|
}
|
|
43
44
|
//#endregion
|
|
44
|
-
export { IVueTestEngineOption, VueInteractor, VueSFCLikeComponent, createRenderedTestEngine, createTestEngine };
|
|
45
|
+
export { type IVueTestEngineOption, VueInteractor, type VueSFCLikeComponent, createRenderedTestEngine, createTestEngine };
|
|
45
46
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
CHANGED
|
@@ -52,6 +52,10 @@ var VueInteractor = class VueInteractor extends DOMInteractor {
|
|
|
52
52
|
await super.focus(locator, option);
|
|
53
53
|
await this.flush();
|
|
54
54
|
}
|
|
55
|
+
async blur(locator, option) {
|
|
56
|
+
await super.blur(locator, option);
|
|
57
|
+
await this.flush();
|
|
58
|
+
}
|
|
55
59
|
async selectOptionValue(locator, values) {
|
|
56
60
|
await super.selectOptionValue(locator, values);
|
|
57
61
|
await this.flush();
|
|
@@ -70,7 +74,7 @@ var VueInteractor = class VueInteractor extends DOMInteractor {
|
|
|
70
74
|
return result;
|
|
71
75
|
}
|
|
72
76
|
clone() {
|
|
73
|
-
return new VueInteractor();
|
|
77
|
+
return new VueInteractor(this.rootEl);
|
|
74
78
|
}
|
|
75
79
|
};
|
|
76
80
|
|
|
@@ -105,8 +109,7 @@ function createTestEngine(component, partDefinitions, option) {
|
|
|
105
109
|
let app;
|
|
106
110
|
const compiledComponent = isSFCLikeObject(component) ? createComponentFromSFCLike(component) : component;
|
|
107
111
|
try {
|
|
108
|
-
|
|
109
|
-
unmount = renderResult.unmount;
|
|
112
|
+
unmount = render(compiledComponent, { container }).unmount;
|
|
110
113
|
} catch (_error) {
|
|
111
114
|
app = createApp(compiledComponent);
|
|
112
115
|
app.mount(container);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["locator: PartLocator","text: string","option?: Partial<EnterTextOption>","option?: Partial<ClickOption>","option?: Partial<HoverOption>","option?: Partial<MouseMoveOption>","option?: Partial<MouseDownOption>","option?: Partial<MouseUpOption>","option?: Partial<MouseOutOption>","option?: Partial<MouseEnterOption>","option?: Partial<MouseLeaveOption>","option?: Partial<FocusOption>","values: string[]","ms: number","option: Partial<Readonly<WaitForOption>>","option: WaitUntilOption<T>","component: any","sfcObj: VueSFCLikeComponent","componentOptions: any","component: Component | VueSFCLikeComponent","partDefinitions: T","option?: Readonly<Partial<IVueTestEngineOption>>","unmount: () => void","app: App","rootElement: HTMLElement","_option?: Readonly<Partial<IVueTestEngineOption>>"],"sources":["../src/VueInteractor.ts","../src/createTestEngine.ts"],"sourcesContent":["import {\n ClickOption,\n defaultWaitForOption,\n EnterTextOption,\n FocusOption,\n HoverOption,\n Interactor,\n MouseDownOption,\n MouseEnterOption,\n MouseLeaveOption,\n MouseMoveOption,\n MouseOutOption,\n MouseUpOption,\n PartLocator,\n WaitForOption,\n WaitUntilOption,\n} from '@atomic-testing/core';\nimport { DOMInteractor } from '@atomic-testing/dom-core';\nimport { nextTick } from 'vue';\n\nexport class VueInteractor extends DOMInteractor {\n private async flush() {\n await nextTick();\n }\n\n override async enterText(locator: PartLocator, text: string, option?: Partial<EnterTextOption>): Promise<void> {\n await super.enterText(locator, text, option);\n await this.flush();\n }\n\n override async click(locator: PartLocator, option?: Partial<ClickOption>): Promise<void> {\n await super.click(locator, option);\n await this.flush();\n }\n\n override async hover(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.hover(locator, option);\n await this.flush();\n }\n\n async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {\n await super.mouseMove(locator, option);\n await this.flush();\n }\n\n async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {\n await super.mouseDown(locator, option);\n await this.flush();\n }\n\n async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {\n await super.mouseUp(locator, option);\n await this.flush();\n }\n\n async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.mouseOver(locator, option);\n await this.flush();\n }\n\n async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {\n await super.mouseOut(locator, option);\n await this.flush();\n }\n\n async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {\n await super.mouseEnter(locator, option);\n await this.flush();\n }\n\n async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {\n await super.mouseLeave(locator, option);\n await this.flush();\n }\n\n async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {\n await super.focus(locator, option);\n await this.flush();\n }\n\n override async selectOptionValue(locator: PartLocator, values: string[]): Promise<void> {\n await super.selectOptionValue(locator, values);\n await this.flush();\n }\n\n override async wait(ms: number): Promise<void> {\n await super.wait(ms);\n await this.flush();\n }\n\n override async waitUntilComponentState(\n locator: PartLocator,\n option: Partial<Readonly<WaitForOption>> = defaultWaitForOption\n ): Promise<void> {\n await super.waitUntilComponentState(locator, option);\n await this.flush();\n }\n\n override async waitUntil<T>(option: WaitUntilOption<T>): Promise<T> {\n const result = await super.waitUntil(option);\n await this.flush();\n return result;\n }\n\n override clone(): Interactor {\n return new VueInteractor();\n }\n}\n","import { byAttribute, ScenePart, TestEngine } from '@atomic-testing/core';\nimport { render } from '@testing-library/vue';\nimport { App, Component, createApp, defineComponent, h } from 'vue';\n\nimport { VueInteractor } from './VueInteractor';\nimport { IVueTestEngineOption, VueSFCLikeComponent } from './types';\n\nlet _rootId = 0;\nfunction getNextRootElementId() {\n return `${_rootId++}`;\n}\n\nconst rootElementAttributeName = 'data-atomic-testing-vue';\n\nfunction isSFCLikeObject(component: any): component is VueSFCLikeComponent {\n return (\n component && typeof component === 'object' && 'template' in component && typeof component.template === 'string'\n );\n}\n\nfunction createComponentFromSFCLike(sfcObj: VueSFCLikeComponent): Component {\n const componentOptions: any = {\n name: sfcObj.name || 'SFCComponent',\n template: sfcObj.template,\n };\n\n if (sfcObj.props) {\n componentOptions.props = sfcObj.props;\n }\n\n if (sfcObj.setup) {\n componentOptions.setup = sfcObj.setup;\n }\n\n if (sfcObj.data) {\n componentOptions.data = sfcObj.data;\n }\n\n if (sfcObj.methods) {\n componentOptions.methods = sfcObj.methods;\n }\n\n if (sfcObj.computed) {\n componentOptions.computed = sfcObj.computed;\n }\n\n return defineComponent(componentOptions);\n}\n\nexport function createTestEngine<T extends ScenePart>(\n component: Component | VueSFCLikeComponent,\n partDefinitions: T,\n option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootEl = option?.rootElement ?? document.body;\n const container = rootEl.appendChild(document.createElement('div'));\n const rootId = getNextRootElementId();\n container.setAttribute(rootElementAttributeName, rootId);\n\n let unmount: () => void;\n let app: App;\n\n // Create component from SFC-like object if needed\n const compiledComponent = isSFCLikeObject(component)\n ? createComponentFromSFCLike(component)\n : (component as Component);\n\n try {\n const renderResult = render(compiledComponent, { container });\n unmount = renderResult.unmount;\n } catch (_error) {\n // Fallback to manual Vue app creation if render fails\n app = createApp(compiledComponent);\n app.mount(container);\n unmount = () => {\n if (app) {\n app.unmount();\n }\n };\n }\n\n const cleanup = () => {\n unmount();\n rootEl.removeChild(container);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n\nexport function createRenderedTestEngine<T extends ScenePart>(\n rootElement: HTMLElement,\n partDefinitions: T,\n _option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootId = getNextRootElementId();\n rootElement.setAttribute(rootElementAttributeName, rootId);\n\n const cleanup = () => {\n rootElement.removeAttribute(rootElementAttributeName);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["componentOptions: any","unmount: () => void","app: App"],"sources":["../src/VueInteractor.ts","../src/createTestEngine.ts"],"sourcesContent":["import {\n BlurOption,\n ClickOption,\n defaultWaitForOption,\n EnterTextOption,\n FocusOption,\n HoverOption,\n Interactor,\n MouseDownOption,\n MouseEnterOption,\n MouseLeaveOption,\n MouseMoveOption,\n MouseOutOption,\n MouseUpOption,\n PartLocator,\n WaitForOption,\n WaitUntilOption,\n} from '@atomic-testing/core';\nimport { DOMInteractor } from '@atomic-testing/dom-core';\nimport { nextTick } from 'vue';\n\nexport class VueInteractor extends DOMInteractor {\n private async flush() {\n await nextTick();\n }\n\n override async enterText(locator: PartLocator, text: string, option?: Partial<EnterTextOption>): Promise<void> {\n await super.enterText(locator, text, option);\n await this.flush();\n }\n\n override async click(locator: PartLocator, option?: Partial<ClickOption>): Promise<void> {\n await super.click(locator, option);\n await this.flush();\n }\n\n override async hover(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.hover(locator, option);\n await this.flush();\n }\n\n override async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {\n await super.mouseMove(locator, option);\n await this.flush();\n }\n\n override async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {\n await super.mouseDown(locator, option);\n await this.flush();\n }\n\n override async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {\n await super.mouseUp(locator, option);\n await this.flush();\n }\n\n override async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.mouseOver(locator, option);\n await this.flush();\n }\n\n override async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {\n await super.mouseOut(locator, option);\n await this.flush();\n }\n\n override async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {\n await super.mouseEnter(locator, option);\n await this.flush();\n }\n\n override async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {\n await super.mouseLeave(locator, option);\n await this.flush();\n }\n\n override async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {\n await super.focus(locator, option);\n await this.flush();\n }\n\n override async blur(locator: PartLocator, option?: Partial<BlurOption>): Promise<void> {\n await super.blur(locator, option);\n await this.flush();\n }\n\n override async selectOptionValue(locator: PartLocator, values: string[]): Promise<void> {\n await super.selectOptionValue(locator, values);\n await this.flush();\n }\n\n override async wait(ms: number): Promise<void> {\n await super.wait(ms);\n await this.flush();\n }\n\n override async waitUntilComponentState(\n locator: PartLocator,\n option: Partial<Readonly<WaitForOption>> = defaultWaitForOption\n ): Promise<void> {\n await super.waitUntilComponentState(locator, option);\n await this.flush();\n }\n\n override async waitUntil<T>(option: WaitUntilOption<T>): Promise<T> {\n const result = await super.waitUntil(option);\n await this.flush();\n return result;\n }\n\n override clone(): Interactor {\n return new VueInteractor(this.rootEl);\n }\n}\n","import { byAttribute, ScenePart, TestEngine } from '@atomic-testing/core';\nimport { render } from '@testing-library/vue';\nimport { App, Component, createApp, defineComponent } from 'vue';\n\nimport { VueInteractor } from './VueInteractor';\nimport { IVueTestEngineOption, VueSFCLikeComponent } from './types';\n\nlet _rootId = 0;\nfunction getNextRootElementId() {\n return `${_rootId++}`;\n}\n\nconst rootElementAttributeName = 'data-atomic-testing-vue';\n\nfunction isSFCLikeObject(component: any): component is VueSFCLikeComponent {\n return (\n component && typeof component === 'object' && 'template' in component && typeof component.template === 'string'\n );\n}\n\nfunction createComponentFromSFCLike(sfcObj: VueSFCLikeComponent): Component {\n const componentOptions: any = {\n name: sfcObj.name || 'SFCComponent',\n template: sfcObj.template,\n };\n\n if (sfcObj.props) {\n componentOptions.props = sfcObj.props;\n }\n\n if (sfcObj.setup) {\n componentOptions.setup = sfcObj.setup;\n }\n\n if (sfcObj.data) {\n componentOptions.data = sfcObj.data;\n }\n\n if (sfcObj.methods) {\n componentOptions.methods = sfcObj.methods;\n }\n\n if (sfcObj.computed) {\n componentOptions.computed = sfcObj.computed;\n }\n\n return defineComponent(componentOptions);\n}\n\nexport function createTestEngine<T extends ScenePart>(\n component: Component | VueSFCLikeComponent,\n partDefinitions: T,\n option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootEl = option?.rootElement ?? document.body;\n const container = rootEl.appendChild(document.createElement('div'));\n const rootId = getNextRootElementId();\n container.setAttribute(rootElementAttributeName, rootId);\n\n let unmount: () => void;\n let app: App;\n\n // Create component from SFC-like object if needed\n const compiledComponent = isSFCLikeObject(component)\n ? createComponentFromSFCLike(component)\n : (component as Component);\n\n try {\n const renderResult = render(compiledComponent, { container });\n unmount = renderResult.unmount;\n } catch (_error) {\n // Fallback to manual Vue app creation if render fails\n app = createApp(compiledComponent);\n app.mount(container);\n unmount = () => {\n if (app) {\n app.unmount();\n }\n };\n }\n\n const cleanup = () => {\n unmount();\n rootEl.removeChild(container);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n\nexport function createRenderedTestEngine<T extends ScenePart>(\n rootElement: HTMLElement,\n partDefinitions: T,\n _option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootId = getNextRootElementId();\n rootElement.setAttribute(rootElementAttributeName, rootId);\n\n const cleanup = () => {\n rootElement.removeAttribute(rootElementAttributeName);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomic-testing/vue-3",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.80.0",
|
|
4
4
|
"description": "The @atomic-testing/vue-3 package is a Vue 3 test adapter that extends Atomic Testing's component driver pattern to Vue applications. It enables testing Vue components using the same high-level semantic APIs used across React, Playwright, and DOM environments.",
|
|
5
|
-
"main": "dist/index.
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
|
-
"types": "dist/index.d.
|
|
7
|
+
"types": "dist/index.d.cts",
|
|
8
8
|
"files": [
|
|
9
9
|
"dist",
|
|
10
10
|
"src"
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"@testing-library/dom": "^10.4.0",
|
|
27
27
|
"@testing-library/vue": "^8.1.0",
|
|
28
28
|
"@vue/compiler-sfc": "^3.5.0",
|
|
29
|
-
"@atomic-testing/core": "0.
|
|
30
|
-
"@atomic-testing/dom-core": "0.
|
|
29
|
+
"@atomic-testing/core": "0.80.0",
|
|
30
|
+
"@atomic-testing/dom-core": "0.80.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"vue": "^3.5.0"
|
|
@@ -39,6 +39,13 @@
|
|
|
39
39
|
"vue": ">=3.0.0",
|
|
40
40
|
"@vue/compiler-sfc": ">=3.0.0"
|
|
41
41
|
},
|
|
42
|
+
"exports": {
|
|
43
|
+
".": {
|
|
44
|
+
"types": "./dist/index.d.mts",
|
|
45
|
+
"import": "./dist/index.mjs",
|
|
46
|
+
"require": "./dist/index.cjs"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
42
49
|
"scripts": {
|
|
43
50
|
"build": "tsdown",
|
|
44
51
|
"check:type": "tsc --noEmit"
|
package/src/VueInteractor.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
BlurOption,
|
|
2
3
|
ClickOption,
|
|
3
4
|
defaultWaitForOption,
|
|
4
5
|
EnterTextOption,
|
|
@@ -38,46 +39,51 @@ export class VueInteractor extends DOMInteractor {
|
|
|
38
39
|
await this.flush();
|
|
39
40
|
}
|
|
40
41
|
|
|
41
|
-
async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {
|
|
42
|
+
override async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {
|
|
42
43
|
await super.mouseMove(locator, option);
|
|
43
44
|
await this.flush();
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {
|
|
47
|
+
override async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {
|
|
47
48
|
await super.mouseDown(locator, option);
|
|
48
49
|
await this.flush();
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {
|
|
52
|
+
override async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {
|
|
52
53
|
await super.mouseUp(locator, option);
|
|
53
54
|
await this.flush();
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {
|
|
57
|
+
override async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {
|
|
57
58
|
await super.mouseOver(locator, option);
|
|
58
59
|
await this.flush();
|
|
59
60
|
}
|
|
60
61
|
|
|
61
|
-
async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {
|
|
62
|
+
override async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {
|
|
62
63
|
await super.mouseOut(locator, option);
|
|
63
64
|
await this.flush();
|
|
64
65
|
}
|
|
65
66
|
|
|
66
|
-
async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {
|
|
67
|
+
override async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {
|
|
67
68
|
await super.mouseEnter(locator, option);
|
|
68
69
|
await this.flush();
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {
|
|
72
|
+
override async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {
|
|
72
73
|
await super.mouseLeave(locator, option);
|
|
73
74
|
await this.flush();
|
|
74
75
|
}
|
|
75
76
|
|
|
76
|
-
async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {
|
|
77
|
+
override async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {
|
|
77
78
|
await super.focus(locator, option);
|
|
78
79
|
await this.flush();
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
override async blur(locator: PartLocator, option?: Partial<BlurOption>): Promise<void> {
|
|
83
|
+
await super.blur(locator, option);
|
|
84
|
+
await this.flush();
|
|
85
|
+
}
|
|
86
|
+
|
|
81
87
|
override async selectOptionValue(locator: PartLocator, values: string[]): Promise<void> {
|
|
82
88
|
await super.selectOptionValue(locator, values);
|
|
83
89
|
await this.flush();
|
|
@@ -103,6 +109,6 @@ export class VueInteractor extends DOMInteractor {
|
|
|
103
109
|
}
|
|
104
110
|
|
|
105
111
|
override clone(): Interactor {
|
|
106
|
-
return new VueInteractor();
|
|
112
|
+
return new VueInteractor(this.rootEl);
|
|
107
113
|
}
|
|
108
114
|
}
|
package/src/createTestEngine.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { byAttribute, ScenePart, TestEngine } from '@atomic-testing/core';
|
|
2
2
|
import { render } from '@testing-library/vue';
|
|
3
|
-
import { App, Component, createApp, defineComponent
|
|
3
|
+
import { App, Component, createApp, defineComponent } from 'vue';
|
|
4
4
|
|
|
5
5
|
import { VueInteractor } from './VueInteractor';
|
|
6
6
|
import { IVueTestEngineOption, VueSFCLikeComponent } from './types';
|
package/src/types.ts
CHANGED
|
@@ -9,8 +9,8 @@ export interface VueSFCLikeComponent {
|
|
|
9
9
|
template: string;
|
|
10
10
|
setup?: () => any;
|
|
11
11
|
data?: () => any;
|
|
12
|
-
methods?: Record<string,
|
|
13
|
-
computed?: Record<string,
|
|
12
|
+
methods?: Record<string, (...args: any[]) => any>;
|
|
13
|
+
computed?: Record<string, () => any>;
|
|
14
14
|
name?: string;
|
|
15
15
|
props?: any;
|
|
16
16
|
}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["DOMInteractor","locator: PartLocator","text: string","option?: Partial<EnterTextOption>","option?: Partial<ClickOption>","option?: Partial<HoverOption>","option?: Partial<MouseMoveOption>","option?: Partial<MouseDownOption>","option?: Partial<MouseUpOption>","option?: Partial<MouseOutOption>","option?: Partial<MouseEnterOption>","option?: Partial<MouseLeaveOption>","option?: Partial<FocusOption>","values: string[]","ms: number","option: Partial<Readonly<WaitForOption>>","defaultWaitForOption","option: WaitUntilOption<T>","component: any","sfcObj: VueSFCLikeComponent","componentOptions: any","component: Component | VueSFCLikeComponent","partDefinitions: T","option?: Readonly<Partial<IVueTestEngineOption>>","unmount: () => void","app: App","TestEngine","rootElement: HTMLElement","_option?: Readonly<Partial<IVueTestEngineOption>>"],"sources":["../src/VueInteractor.ts","../src/createTestEngine.ts"],"sourcesContent":["import {\n ClickOption,\n defaultWaitForOption,\n EnterTextOption,\n FocusOption,\n HoverOption,\n Interactor,\n MouseDownOption,\n MouseEnterOption,\n MouseLeaveOption,\n MouseMoveOption,\n MouseOutOption,\n MouseUpOption,\n PartLocator,\n WaitForOption,\n WaitUntilOption,\n} from '@atomic-testing/core';\nimport { DOMInteractor } from '@atomic-testing/dom-core';\nimport { nextTick } from 'vue';\n\nexport class VueInteractor extends DOMInteractor {\n private async flush() {\n await nextTick();\n }\n\n override async enterText(locator: PartLocator, text: string, option?: Partial<EnterTextOption>): Promise<void> {\n await super.enterText(locator, text, option);\n await this.flush();\n }\n\n override async click(locator: PartLocator, option?: Partial<ClickOption>): Promise<void> {\n await super.click(locator, option);\n await this.flush();\n }\n\n override async hover(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.hover(locator, option);\n await this.flush();\n }\n\n async mouseMove(locator: PartLocator, option?: Partial<MouseMoveOption>): Promise<void> {\n await super.mouseMove(locator, option);\n await this.flush();\n }\n\n async mouseDown(locator: PartLocator, option?: Partial<MouseDownOption>): Promise<void> {\n await super.mouseDown(locator, option);\n await this.flush();\n }\n\n async mouseUp(locator: PartLocator, option?: Partial<MouseUpOption>): Promise<void> {\n await super.mouseUp(locator, option);\n await this.flush();\n }\n\n async mouseOver(locator: PartLocator, option?: Partial<HoverOption>): Promise<void> {\n await super.mouseOver(locator, option);\n await this.flush();\n }\n\n async mouseOut(locator: PartLocator, option?: Partial<MouseOutOption>): Promise<void> {\n await super.mouseOut(locator, option);\n await this.flush();\n }\n\n async mouseEnter(locator: PartLocator, option?: Partial<MouseEnterOption>): Promise<void> {\n await super.mouseEnter(locator, option);\n await this.flush();\n }\n\n async mouseLeave(locator: PartLocator, option?: Partial<MouseLeaveOption>): Promise<void> {\n await super.mouseLeave(locator, option);\n await this.flush();\n }\n\n async focus(locator: PartLocator, option?: Partial<FocusOption>): Promise<void> {\n await super.focus(locator, option);\n await this.flush();\n }\n\n override async selectOptionValue(locator: PartLocator, values: string[]): Promise<void> {\n await super.selectOptionValue(locator, values);\n await this.flush();\n }\n\n override async wait(ms: number): Promise<void> {\n await super.wait(ms);\n await this.flush();\n }\n\n override async waitUntilComponentState(\n locator: PartLocator,\n option: Partial<Readonly<WaitForOption>> = defaultWaitForOption\n ): Promise<void> {\n await super.waitUntilComponentState(locator, option);\n await this.flush();\n }\n\n override async waitUntil<T>(option: WaitUntilOption<T>): Promise<T> {\n const result = await super.waitUntil(option);\n await this.flush();\n return result;\n }\n\n override clone(): Interactor {\n return new VueInteractor();\n }\n}\n","import { byAttribute, ScenePart, TestEngine } from '@atomic-testing/core';\nimport { render } from '@testing-library/vue';\nimport { App, Component, createApp, defineComponent, h } from 'vue';\n\nimport { VueInteractor } from './VueInteractor';\nimport { IVueTestEngineOption, VueSFCLikeComponent } from './types';\n\nlet _rootId = 0;\nfunction getNextRootElementId() {\n return `${_rootId++}`;\n}\n\nconst rootElementAttributeName = 'data-atomic-testing-vue';\n\nfunction isSFCLikeObject(component: any): component is VueSFCLikeComponent {\n return (\n component && typeof component === 'object' && 'template' in component && typeof component.template === 'string'\n );\n}\n\nfunction createComponentFromSFCLike(sfcObj: VueSFCLikeComponent): Component {\n const componentOptions: any = {\n name: sfcObj.name || 'SFCComponent',\n template: sfcObj.template,\n };\n\n if (sfcObj.props) {\n componentOptions.props = sfcObj.props;\n }\n\n if (sfcObj.setup) {\n componentOptions.setup = sfcObj.setup;\n }\n\n if (sfcObj.data) {\n componentOptions.data = sfcObj.data;\n }\n\n if (sfcObj.methods) {\n componentOptions.methods = sfcObj.methods;\n }\n\n if (sfcObj.computed) {\n componentOptions.computed = sfcObj.computed;\n }\n\n return defineComponent(componentOptions);\n}\n\nexport function createTestEngine<T extends ScenePart>(\n component: Component | VueSFCLikeComponent,\n partDefinitions: T,\n option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootEl = option?.rootElement ?? document.body;\n const container = rootEl.appendChild(document.createElement('div'));\n const rootId = getNextRootElementId();\n container.setAttribute(rootElementAttributeName, rootId);\n\n let unmount: () => void;\n let app: App;\n\n // Create component from SFC-like object if needed\n const compiledComponent = isSFCLikeObject(component)\n ? createComponentFromSFCLike(component)\n : (component as Component);\n\n try {\n const renderResult = render(compiledComponent, { container });\n unmount = renderResult.unmount;\n } catch (_error) {\n // Fallback to manual Vue app creation if render fails\n app = createApp(compiledComponent);\n app.mount(container);\n unmount = () => {\n if (app) {\n app.unmount();\n }\n };\n }\n\n const cleanup = () => {\n unmount();\n rootEl.removeChild(container);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n\nexport function createRenderedTestEngine<T extends ScenePart>(\n rootElement: HTMLElement,\n partDefinitions: T,\n _option?: Readonly<Partial<IVueTestEngineOption>>\n): TestEngine<T> {\n const rootId = getNextRootElementId();\n rootElement.setAttribute(rootElementAttributeName, rootId);\n\n const cleanup = () => {\n rootElement.removeAttribute(rootElementAttributeName);\n return Promise.resolve();\n };\n\n return new TestEngine(\n byAttribute(rootElementAttributeName, rootId),\n new VueInteractor(),\n {\n parts: partDefinitions,\n },\n cleanup\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,IAAa,gBAAb,MAAa,sBAAsBA,wCAAc;CAC/C,MAAc,QAAQ;AACpB,QAAM,mBAAU;CACjB;CAED,MAAe,UAAUC,SAAsBC,MAAcC,QAAkD;AAC7G,QAAM,MAAM,UAAU,SAAS,MAAM,OAAO;AAC5C,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,MAAMF,SAAsBG,QAA8C;AACvF,QAAM,MAAM,MAAM,SAAS,OAAO;AAClC,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,MAAMH,SAAsBI,QAA8C;AACvF,QAAM,MAAM,MAAM,SAAS,OAAO;AAClC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,UAAUJ,SAAsBK,QAAkD;AACtF,QAAM,MAAM,UAAU,SAAS,OAAO;AACtC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,UAAUL,SAAsBM,QAAkD;AACtF,QAAM,MAAM,UAAU,SAAS,OAAO;AACtC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,QAAQN,SAAsBO,QAAgD;AAClF,QAAM,MAAM,QAAQ,SAAS,OAAO;AACpC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,UAAUP,SAAsBI,QAA8C;AAClF,QAAM,MAAM,UAAU,SAAS,OAAO;AACtC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,SAASJ,SAAsBQ,QAAiD;AACpF,QAAM,MAAM,SAAS,SAAS,OAAO;AACrC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,WAAWR,SAAsBS,QAAmD;AACxF,QAAM,MAAM,WAAW,SAAS,OAAO;AACvC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,WAAWT,SAAsBU,QAAmD;AACxF,QAAM,MAAM,WAAW,SAAS,OAAO;AACvC,QAAM,KAAK,OAAO;CACnB;CAED,MAAM,MAAMV,SAAsBW,QAA8C;AAC9E,QAAM,MAAM,MAAM,SAAS,OAAO;AAClC,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,kBAAkBX,SAAsBY,QAAiC;AACtF,QAAM,MAAM,kBAAkB,SAAS,OAAO;AAC9C,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,KAAKC,IAA2B;AAC7C,QAAM,MAAM,KAAK,GAAG;AACpB,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,wBACbb,SACAc,SAA2CC,4CAC5B;AACf,QAAM,MAAM,wBAAwB,SAAS,OAAO;AACpD,QAAM,KAAK,OAAO;CACnB;CAED,MAAe,UAAaC,QAAwC;EAClE,MAAM,SAAS,MAAM,MAAM,UAAU,OAAO;AAC5C,QAAM,KAAK,OAAO;AAClB,SAAO;CACR;CAED,AAAS,QAAoB;AAC3B,SAAO,IAAI;CACZ;AACF;;;;ACpGD,IAAI,UAAU;AACd,SAAS,uBAAuB;AAC9B,WAAU;AACX;AAED,MAAM,2BAA2B;AAEjC,SAAS,gBAAgBC,WAAkD;AACzE,QACE,oBAAoB,cAAc,YAAY,cAAc,oBAAoB,UAAU,aAAa;AAE1G;AAED,SAAS,2BAA2BC,QAAwC;CAC1E,MAAMC,mBAAwB;EAC5B,MAAM,OAAO,QAAQ;EACrB,UAAU,OAAO;CAClB;AAED,KAAI,OAAO,MACT,kBAAiB,QAAQ,OAAO;AAGlC,KAAI,OAAO,MACT,kBAAiB,QAAQ,OAAO;AAGlC,KAAI,OAAO,KACT,kBAAiB,OAAO,OAAO;AAGjC,KAAI,OAAO,QACT,kBAAiB,UAAU,OAAO;AAGpC,KAAI,OAAO,SACT,kBAAiB,WAAW,OAAO;AAGrC,QAAO,yBAAgB,iBAAiB;AACzC;AAED,SAAgB,iBACdC,WACAC,iBACAC,QACe;CACf,MAAM,SAAS,QAAQ,eAAe,SAAS;CAC/C,MAAM,YAAY,OAAO,YAAY,SAAS,cAAc,MAAM,CAAC;CACnE,MAAM,SAAS,sBAAsB;AACrC,WAAU,aAAa,0BAA0B,OAAO;CAExD,IAAIC;CACJ,IAAIC;CAGJ,MAAM,oBAAoB,gBAAgB,UAAU,GAChD,2BAA2B,UAAU,GACpC;AAEL,KAAI;EACF,MAAM,eAAe,kCAAO,mBAAmB,EAAE,UAAW,EAAC;AAC7D,YAAU,aAAa;CACxB,SAAQ,QAAQ;AAEf,QAAM,mBAAU,kBAAkB;AAClC,MAAI,MAAM,UAAU;AACpB,YAAU,MAAM;AACd,OAAI,IACF,KAAI,SAAS;EAEhB;CACF;CAED,MAAM,UAAU,MAAM;AACpB,WAAS;AACT,SAAO,YAAY,UAAU;AAC7B,SAAO,QAAQ,SAAS;CACzB;AAED,QAAO,IAAIC,iCACT,uCAAY,0BAA0B,OAAO,EAC7C,IAAI,iBACJ,EACE,OAAO,gBACR,GACD;AAEH;AAED,SAAgB,yBACdC,aACAL,iBACAM,SACe;CACf,MAAM,SAAS,sBAAsB;AACrC,aAAY,aAAa,0BAA0B,OAAO;CAE1D,MAAM,UAAU,MAAM;AACpB,cAAY,gBAAgB,yBAAyB;AACrD,SAAO,QAAQ,SAAS;CACzB;AAED,QAAO,IAAIF,iCACT,uCAAY,0BAA0B,OAAO,EAC7C,IAAI,iBACJ,EACE,OAAO,gBACR,GACD;AAEH"}
|