Skip to content

Commit

Permalink
chore: written register source
Browse files Browse the repository at this point in the history
Co-authored-by: Jack Shelton <[email protected]>
  • Loading branch information
shairez and thejackshelton committed Feb 1, 2024
1 parent 5ca03d1 commit 522a4f3
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 92 deletions.
8 changes: 0 additions & 8 deletions packages/playwright-ct-qwik/src/lib/add-qwik-loader.ts

This file was deleted.

101 changes: 36 additions & 65 deletions packages/playwright-ct-qwik/src/register-source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,90 +17,61 @@
// @ts-check
// This file is injected into the registry as text, no dependencies are allowed.

import __pwH from 'solid-js/h';
import { createComponent as __pwSolidCreateComponent, render as __pwSolidRender } from 'solid-js/web';

/** @typedef {import('../playwright-ct-core/types/component').JsxComponent} JsxComponent */
/** @typedef {() => import('solid-js').JSX.Element} FrameworkComponent */

import { JSXOutput, render } from '@builder.io/qwik';
import { QWIK_LOADER } from '@builder.io/qwik/loader';
/**
* @param {any} component
* @returns {component is JsxComponent}
*/
function isJsxComponent(component) {
return typeof component === 'object' && component && component.__pw_type === 'jsx';
// function isJsxComponent(component) {
// return typeof component === 'object' && component && component.__pw_type === 'jsx';
// }

export function addQwikLoader() {
const scriptEl = document.createElement('script');
const inlineScript = document.createTextNode(QWIK_LOADER);
scriptEl.appendChild(inlineScript);
document.body.appendChild(scriptEl);
}

/**
* @param {any} child
*/
function __pwCreateChild(child) {
if (Array.isArray(child))
return child.map(grandChild => __pwCreateChild(grandChild));
if (isJsxComponent(child))
return __pwCreateComponent(child);
return child;
}

/**
* @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];
}

/**
* @param {JsxComponent} component
*/
function __pwCreateComponent(component) {
const children = __pwJsxChildArray(component)?.map(child => __pwCreateChild(child)).filter(child => {
if (typeof child === 'string')
return !!child.trim();
return true;
});

if (typeof component.type === 'string')
return __pwH(component.type, component.props, children);

return __pwSolidCreateComponent(component.type, { ...component.props, children });
}
addQwikLoader();

const __pwUnmountKey = Symbol('unmountKey');

window.playwrightMount = async (component, rootElement, hooksConfig) => {
if (!isJsxComponent(component))
throw new Error('Object mount notation is not supported');

let App = () => __pwCreateComponent(component);
for (const hook of window.__pw_hooks_before_mount || []) {
const wrapper = await hook({ App, hooksConfig });
if (wrapper)
App = () => wrapper;
window.playwrightMount = async (
component: JSXOutput,
rootElement: HTMLElement,
hooksConfig: unknown,
) => {
// if (!isJsxComponent(component))
// throw new Error('Object mount notation is not supported');

let componentToRender = component;
for (const hook of window['__pw_hooks_before_mount'] || []) {
const wrapper = await hook({ component, hooksConfig });
if (wrapper) {
componentToRender = wrapper;
}
}

const unmount = __pwSolidRender(App, rootElement);
rootElement[__pwUnmountKey] = unmount;
const { cleanup } = await render(rootElement, componentToRender);

rootElement[__pwUnmountKey] = cleanup;

for (const hook of window.__pw_hooks_after_mount || [])
for (const hook of window['__pw_hooks_after_mount'] || [])
await hook({ hooksConfig });
};

window.playwrightUnmount = async rootElement => {
const unmount = rootElement[__pwUnmountKey];
if (!unmount)
throw new Error('Component was not mounted');
window.playwrightUnmount = async (rootElement) => {
const cleanup = rootElement[__pwcleanupKey];
if (!cleanup) throw new Error('Component was not mounted');

unmount();
cleanup();
};

window.playwrightUpdate = async (rootElement, component) => {
if (!isJsxComponent(component))
throw new Error('Object mount notation is not supported');
// if (!isJsxComponent(component))
// throw new Error('Object mount notation is not supported');

window.playwrightUnmount(rootElement);
window.playwrightMount(component, rootElement, {});
Expand Down
17 changes: 0 additions & 17 deletions packages/playwright-ct-qwik/src/register.d.ts

This file was deleted.

5 changes: 3 additions & 2 deletions packages/playwright-ct-qwik/src/register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@
* limitations under the License.
*/

import { pwRegister } from './registerSource.mjs';
import { pwRegister } from './register-source';

export default (components) => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export default (components: Record<string, any>): void => {
pwRegister(components);
};

0 comments on commit 522a4f3

Please sign in to comment.