2022-08-23 23:08:53 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (c) Microsoft Corporation.
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// @ts-check
|
|
|
|
|
// This file is injected into the registry as text, no dependencies are allowed.
|
|
|
|
|
|
2023-03-18 02:08:28 +01:00
|
|
|
import { render as __pwSolidRender, createComponent as __pwSolidCreateComponent } from 'solid-js/web';
|
|
|
|
|
import __pwH from 'solid-js/h';
|
2022-08-23 23:08:53 +02:00
|
|
|
|
2023-04-26 03:08:34 +02:00
|
|
|
/** @typedef {import('../playwright-ct-core/types/component').JsxComponent} JsxComponent */
|
2022-08-25 17:40:14 +02:00
|
|
|
/** @typedef {() => import('solid-js').JSX.Element} FrameworkComponent */
|
2022-08-23 23:08:53 +02:00
|
|
|
|
2023-04-26 03:08:34 +02:00
|
|
|
/**
|
2023-10-26 23:57:49 +02:00
|
|
|
* @param {any} component
|
|
|
|
|
* @returns {component is JsxComponent}
|
2023-04-26 03:08:34 +02:00
|
|
|
*/
|
2024-01-13 05:02:27 +01:00
|
|
|
function isJsxComponent(component) {
|
|
|
|
|
return typeof component === 'object' && component && component.__pw_type === 'jsx';
|
2022-09-22 06:16:30 +02:00
|
|
|
}
|
|
|
|
|
|
2022-08-23 23:08:53 +02:00
|
|
|
/**
|
2024-01-13 05:02:27 +01:00
|
|
|
* @param {any} child
|
2023-10-28 20:22:10 +02:00
|
|
|
*/
|
2023-04-26 03:08:34 +02:00
|
|
|
function __pwCreateChild(child) {
|
2023-10-28 20:22:10 +02:00
|
|
|
if (Array.isArray(child))
|
|
|
|
|
return child.map(grandChild => __pwCreateChild(grandChild));
|
2024-01-13 05:02:27 +01:00
|
|
|
if (isJsxComponent(child))
|
2023-10-28 20:22:10 +02:00
|
|
|
return __pwCreateComponent(child);
|
|
|
|
|
return child;
|
2023-04-26 03:08:34 +02:00
|
|
|
}
|
|
|
|
|
|
2024-01-13 05:02:27 +01:00
|
|
|
/**
|
|
|
|
|
* @param {JsxComponent} component
|
|
|
|
|
* @returns {any[] | undefined}
|
|
|
|
|
*/
|
|
|
|
|
function __pwJsxChildArray(component) {
|
|
|
|
|
if (!component.props.children)
|
|
|
|
|
return;
|
|
|
|
|
if (Array.isArray(component.props.children))
|
|
|
|
|
return component.props.children;
|
|
|
|
|
return [component.props.children];
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-26 03:08:34 +02:00
|
|
|
/**
|
2023-10-26 23:57:49 +02:00
|
|
|
* @param {JsxComponent} component
|
2023-04-26 03:08:34 +02:00
|
|
|
*/
|
|
|
|
|
function __pwCreateComponent(component) {
|
2024-01-13 05:02:27 +01:00
|
|
|
const children = __pwJsxChildArray(component)?.map(child => __pwCreateChild(child)).filter(child => {
|
2023-10-28 20:22:10 +02:00
|
|
|
if (typeof child === 'string')
|
|
|
|
|
return !!child.trim();
|
|
|
|
|
return true;
|
|
|
|
|
});
|
2022-09-22 06:16:30 +02:00
|
|
|
|
2024-01-13 05:02:27 +01:00
|
|
|
if (typeof component.type === 'string')
|
2023-03-18 02:08:28 +01:00
|
|
|
return __pwH(component.type, component.props, children);
|
2022-09-22 06:16:30 +02:00
|
|
|
|
2024-01-13 05:02:27 +01:00
|
|
|
return __pwSolidCreateComponent(component.type, { ...component.props, children });
|
2022-08-23 23:08:53 +02:00
|
|
|
}
|
|
|
|
|
|
2023-03-18 02:08:28 +01:00
|
|
|
const __pwUnmountKey = Symbol('unmountKey');
|
2022-08-26 20:51:36 +02:00
|
|
|
|
2022-08-23 23:08:53 +02:00
|
|
|
window.playwrightMount = async (component, rootElement, hooksConfig) => {
|
2024-01-13 05:02:27 +01:00
|
|
|
if (!isJsxComponent(component))
|
2023-10-26 23:57:49 +02:00
|
|
|
throw new Error('Object mount notation is not supported');
|
|
|
|
|
|
2023-03-18 02:08:28 +01:00
|
|
|
let App = () => __pwCreateComponent(component);
|
2023-02-09 17:58:15 +01:00
|
|
|
for (const hook of window.__pw_hooks_before_mount || []) {
|
2022-12-27 23:26:17 +01:00
|
|
|
const wrapper = await hook({ App, hooksConfig });
|
|
|
|
|
if (wrapper)
|
|
|
|
|
App = () => wrapper;
|
|
|
|
|
}
|
2022-08-23 23:08:53 +02:00
|
|
|
|
2023-03-18 02:08:28 +01:00
|
|
|
const unmount = __pwSolidRender(App, rootElement);
|
|
|
|
|
rootElement[__pwUnmountKey] = unmount;
|
2022-08-23 23:08:53 +02:00
|
|
|
|
2023-02-09 17:58:15 +01:00
|
|
|
for (const hook of window.__pw_hooks_after_mount || [])
|
2022-08-23 23:08:53 +02:00
|
|
|
await hook({ hooksConfig });
|
|
|
|
|
};
|
2022-08-26 20:51:36 +02:00
|
|
|
|
|
|
|
|
window.playwrightUnmount = async rootElement => {
|
2023-03-18 02:08:28 +01:00
|
|
|
const unmount = rootElement[__pwUnmountKey];
|
2022-08-26 20:51:36 +02:00
|
|
|
if (!unmount)
|
|
|
|
|
throw new Error('Component was not mounted');
|
|
|
|
|
|
|
|
|
|
unmount();
|
|
|
|
|
};
|
2022-10-20 04:39:50 +02:00
|
|
|
|
|
|
|
|
window.playwrightUpdate = async (rootElement, component) => {
|
2024-01-13 05:02:27 +01:00
|
|
|
if (!isJsxComponent(component))
|
2023-10-26 23:57:49 +02:00
|
|
|
throw new Error('Object mount notation is not supported');
|
|
|
|
|
|
2022-10-20 04:39:50 +02:00
|
|
|
window.playwrightUnmount(rootElement);
|
|
|
|
|
window.playwrightMount(component, rootElement, {});
|
|
|
|
|
};
|