Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions example-project/component-library-react/src/components.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
/* eslint-disable */

import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
import { createComponent } from '@stencil/react-output-target/runtime';
import { createComponent, tagNameTransformer } from '@stencil/react-output-target/runtime';
import { type CheckboxChangeEventDetail, type IMyComponent, type InputChangeEventDetail, type MyCheckboxCustomEvent, type MyComponentCustomEvent, type MyInputCustomEvent, type MyPopoverCustomEvent, type MyRadioGroupCustomEvent, type MyRangeCustomEvent, type OverlayEventDetail, type RadioGroupChangeEventDetail, type RangeChangeEventDetail } from "component-library";
import { MyButton as MyButtonElement, defineCustomElement as defineMyButton } from "component-library/components/my-button.js";
import { MyCheckbox as MyCheckboxElement, defineCustomElement as defineMyCheckbox } from "component-library/components/my-checkbox.js";
Expand Down Expand Up @@ -38,7 +38,7 @@ export const MyButton: StencilReactComponent<MyButtonElement, MyButtonEvents> =
onMyFocus: 'myFocus',
onMyBlur: 'myBlur'
} as MyButtonEvents,
defineCustomElement: defineMyButton
defineCustomElement: () => defineMyButton(tagNameTransformer),
});

type MyCheckboxEvents = {
Expand All @@ -57,7 +57,7 @@ export const MyCheckbox: StencilReactComponent<MyCheckboxElement, MyCheckboxEven
onIonFocus: 'ionFocus',
onIonBlur: 'ionBlur'
} as MyCheckboxEvents,
defineCustomElement: defineMyCheckbox
defineCustomElement: () => defineMyCheckbox(tagNameTransformer),
});

type MyComponentEvents = {
Expand All @@ -74,7 +74,7 @@ export const MyComponent: StencilReactComponent<MyComponentElement, MyComponentE
onMyCustomEvent: 'myCustomEvent',
onMyCustomNestedEvent: 'myCustomNestedEvent'
} as MyComponentEvents,
defineCustomElement: defineMyComponent
defineCustomElement: () => defineMyComponent(tagNameTransformer),
});

type MyInputEvents = {
Expand All @@ -95,7 +95,7 @@ export const MyInput: StencilReactComponent<MyInputElement, MyInputEvents> = /*@
onMyBlur: 'myBlur',
onMyFocus: 'myFocus'
} as MyInputEvents,
defineCustomElement: defineMyInput
defineCustomElement: () => defineMyInput(tagNameTransformer),
});

type MyListEvents = NonNullable<unknown>;
Expand All @@ -106,7 +106,7 @@ export const MyList: StencilReactComponent<MyListElement, MyListEvents> = /*@__P
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyListEvents,
defineCustomElement: defineMyList
defineCustomElement: () => defineMyList(tagNameTransformer),
});

type MyListItemEvents = NonNullable<unknown>;
Expand All @@ -117,7 +117,7 @@ export const MyListItem: StencilReactComponent<MyListItemElement, MyListItemEven
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyListItemEvents,
defineCustomElement: defineMyListItem
defineCustomElement: () => defineMyListItem(tagNameTransformer),
});

type MyPopoverEvents = {
Expand All @@ -138,7 +138,7 @@ export const MyPopover: StencilReactComponent<MyPopoverElement, MyPopoverEvents>
onMyPopoverWillDismiss: 'myPopoverWillDismiss',
onMyPopoverDidDismiss: 'myPopoverDidDismiss'
} as MyPopoverEvents,
defineCustomElement: defineMyPopover
defineCustomElement: () => defineMyPopover(tagNameTransformer),
});

type MyRadioEvents = {
Expand All @@ -155,7 +155,7 @@ export const MyRadio: StencilReactComponent<MyRadioElement, MyRadioEvents> = /*@
onIonFocus: 'ionFocus',
onIonBlur: 'ionBlur'
} as MyRadioEvents,
defineCustomElement: defineMyRadio
defineCustomElement: () => defineMyRadio(tagNameTransformer),
});

type MyRadioGroupEvents = { onMyChange: EventName<MyRadioGroupCustomEvent<RadioGroupChangeEventDetail>> };
Expand All @@ -166,7 +166,7 @@ export const MyRadioGroup: StencilReactComponent<MyRadioGroupElement, MyRadioGro
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: { onMyChange: 'myChange' } as MyRadioGroupEvents,
defineCustomElement: defineMyRadioGroup
defineCustomElement: () => defineMyRadioGroup(tagNameTransformer),
});

type MyRangeEvents = {
Expand All @@ -185,7 +185,7 @@ export const MyRange: StencilReactComponent<MyRangeElement, MyRangeEvents> = /*@
onMyFocus: 'myFocus',
onMyBlur: 'myBlur'
} as MyRangeEvents,
defineCustomElement: defineMyRange
defineCustomElement: () => defineMyRange(tagNameTransformer),
});

type MyToggleEvents = NonNullable<unknown>;
Expand All @@ -196,7 +196,7 @@ export const MyToggle: StencilReactComponent<MyToggleElement, MyToggleEvents> =
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyToggleEvents,
defineCustomElement: defineMyToggle
defineCustomElement: () => defineMyToggle(tagNameTransformer),
});

type MyToggleContentEvents = NonNullable<unknown>;
Expand All @@ -207,5 +207,5 @@ export const MyToggleContent: StencilReactComponent<MyToggleContentElement, MyTo
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyToggleContentEvents,
defineCustomElement: defineMyToggleContent
defineCustomElement: () => defineMyToggleContent(tagNameTransformer),
});
7 changes: 5 additions & 2 deletions example-project/component-library-react/src/main.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import React from 'react';
import React, { lazy } from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { setTagNameTransformer } from '@stencil/react-output-target/runtime';

setTagNameTransformer((tagName: string) => tagName + '-modified');
const App = lazy(() => import('./App'));

ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
Expand Down
26 changes: 13 additions & 13 deletions example-project/next-app/src/app/components.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
/* eslint-disable */

import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
import { createComponent, createSSRComponent } from '@stencil/react-output-target/runtime';
import { createComponent, createSSRComponent, tagNameTransformer } from '@stencil/react-output-target/runtime';
import { type CheckboxChangeEventDetail, type IMyComponent, type InputChangeEventDetail, type MyCheckboxCustomEvent, type MyComponentCustomEvent, type MyInputCustomEvent, type MyPopoverCustomEvent, type MyRadioGroupCustomEvent, type MyRangeCustomEvent, type OverlayEventDetail, type RadioGroupChangeEventDetail, type RangeChangeEventDetail } from "component-library";
import { MyButton as MyButtonElement, defineCustomElement as defineMyButton } from "component-library/components/my-button.js";
import { MyCheckbox as MyCheckboxElement, defineCustomElement as defineMyCheckbox } from "component-library/components/my-checkbox.js";
Expand Down Expand Up @@ -40,7 +40,7 @@ export const MyButton: StencilReactComponent<MyButtonElement, MyButtonEvents> =
onMyFocus: 'myFocus',
onMyBlur: 'myBlur'
} as MyButtonEvents,
defineCustomElement: defineMyButton
defineCustomElement: () => defineMyButton(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyButtonElement, MyButtonEvents>({
tagName: 'my-button',
Expand Down Expand Up @@ -79,7 +79,7 @@ export const MyCheckbox: StencilReactComponent<MyCheckboxElement, MyCheckboxEven
onIonFocus: 'ionFocus',
onIonBlur: 'ionBlur'
} as MyCheckboxEvents,
defineCustomElement: defineMyCheckbox
defineCustomElement: () => defineMyCheckbox(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyCheckboxElement, MyCheckboxEvents>({
tagName: 'my-checkbox',
Expand Down Expand Up @@ -112,7 +112,7 @@ export const MyComponent: StencilReactComponent<MyComponentElement, MyComponentE
onMyCustomEvent: 'myCustomEvent',
onMyCustomNestedEvent: 'myCustomNestedEvent'
} as MyComponentEvents,
defineCustomElement: defineMyComponent
defineCustomElement: () => defineMyComponent(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyComponentElement, MyComponentEvents>({
tagName: 'my-component',
Expand Down Expand Up @@ -145,7 +145,7 @@ export const MyInput: StencilReactComponent<MyInputElement, MyInputEvents> = typ
onMyBlur: 'myBlur',
onMyFocus: 'myFocus'
} as MyInputEvents,
defineCustomElement: defineMyInput
defineCustomElement: () => defineMyInput(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyInputElement, MyInputEvents>({
tagName: 'my-input',
Expand Down Expand Up @@ -189,7 +189,7 @@ export const MyList: StencilReactComponent<MyListElement, MyListEvents> = typeof
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyListEvents,
defineCustomElement: defineMyList
defineCustomElement: () => defineMyList(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyListElement, MyListEvents>({
tagName: 'my-list',
Expand All @@ -206,7 +206,7 @@ export const MyListItem: StencilReactComponent<MyListItemElement, MyListItemEven
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyListItemEvents,
defineCustomElement: defineMyListItem
defineCustomElement: () => defineMyListItem(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyListItemElement, MyListItemEvents>({
tagName: 'my-list-item',
Expand All @@ -233,7 +233,7 @@ export const MyPopover: StencilReactComponent<MyPopoverElement, MyPopoverEvents>
onMyPopoverWillDismiss: 'myPopoverWillDismiss',
onMyPopoverDidDismiss: 'myPopoverDidDismiss'
} as MyPopoverEvents,
defineCustomElement: defineMyPopover
defineCustomElement: () => defineMyPopover(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyPopoverElement, MyPopoverEvents>({
tagName: 'my-popover',
Expand Down Expand Up @@ -265,7 +265,7 @@ export const MyRadio: StencilReactComponent<MyRadioElement, MyRadioEvents> = typ
onIonFocus: 'ionFocus',
onIonBlur: 'ionBlur'
} as MyRadioEvents,
defineCustomElement: defineMyRadio
defineCustomElement: () => defineMyRadio(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyRadioElement, MyRadioEvents>({
tagName: 'my-radio',
Expand All @@ -290,7 +290,7 @@ export const MyRadioGroup: StencilReactComponent<MyRadioGroupElement, MyRadioGro
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: { onMyChange: 'myChange' } as MyRadioGroupEvents,
defineCustomElement: defineMyRadioGroup
defineCustomElement: () => defineMyRadioGroup(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyRadioGroupElement, MyRadioGroupEvents>({
tagName: 'my-radio-group',
Expand Down Expand Up @@ -320,7 +320,7 @@ export const MyRange: StencilReactComponent<MyRangeElement, MyRangeEvents> = typ
onMyFocus: 'myFocus',
onMyBlur: 'myBlur'
} as MyRangeEvents,
defineCustomElement: defineMyRange
defineCustomElement: () => defineMyRange(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyRangeElement, MyRangeEvents>({
tagName: 'my-range',
Expand Down Expand Up @@ -350,7 +350,7 @@ export const MyToggle: StencilReactComponent<MyToggleElement, MyToggleEvents> =
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyToggleEvents,
defineCustomElement: defineMyToggle
defineCustomElement: () => defineMyToggle(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyToggleElement, MyToggleEvents>({
tagName: 'my-toggle',
Expand All @@ -367,7 +367,7 @@ export const MyToggleContent: StencilReactComponent<MyToggleContentElement, MyTo
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyToggleContentEvents,
defineCustomElement: defineMyToggleContent
defineCustomElement: () => defineMyToggleContent(tagNameTransformer),
})
: /*@__PURE__*/ createSSRComponent<MyToggleContentElement, MyToggleContentEvents>({
tagName: 'my-toggle-content',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ describe('createComponentWrappers', () => {
/* eslint-disable */

import type { StencilReactComponent } from '@stencil/react-output-target/runtime';
import { createComponent } from '@stencil/react-output-target/runtime';
import { createComponent, tagNameTransformer } from '@stencil/react-output-target/runtime';
import { MyComponent as MyComponentElement, defineCustomElement as defineMyComponent } from "my-package/dist/custom-elements/my-component.js";
import React from 'react';

Expand All @@ -51,7 +51,7 @@ export const MyComponent: StencilReactComponent<MyComponentElement, MyComponentE
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyComponentEvents,
defineCustomElement: defineMyComponent
defineCustomElement: () => defineMyComponent(tagNameTransformer),
});

`);
Expand Down Expand Up @@ -93,7 +93,7 @@ export const MyComponent: StencilReactComponent<MyComponentElement, MyComponentE
/* eslint-disable */

import type { StencilReactComponent } from '@stencil/react-output-target/runtime';
import { createComponent } from '@stencil/react-output-target/runtime';
import { createComponent, tagNameTransformer } from '@stencil/react-output-target/runtime';
import { MyComponent as MyComponentElement, defineCustomElement as defineMyComponent } from "my-package/dist/custom-elements/my-component.js";
import React from 'react';

Expand All @@ -105,7 +105,7 @@ const MyComponent: StencilReactComponent<MyComponentElement, MyComponentEvents>
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {} as MyComponentEvents,
defineCustomElement: defineMyComponent
defineCustomElement: () => defineMyComponent(tagNameTransformer),
});

export default MyComponent;
Expand Down Expand Up @@ -207,7 +207,7 @@ export default MyComponent;
/* eslint-disable */

import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
import { createComponent } from '@stencil/react-output-target/runtime';
import { createComponent, tagNameTransformer } from '@stencil/react-output-target/runtime';
import { type MyComponentCustomEvent } from "my-package";
import { MyComponent as MyComponentElement, defineCustomElement as defineMyComponent } from "my-package/dist/custom-elements/my-component.js";
import React from 'react';
Expand All @@ -220,7 +220,7 @@ export const MyComponent: StencilReactComponent<MyComponentElement, MyComponentE
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: { onMyEvent: 'myEvent' } as MyComponentEvents,
defineCustomElement: defineMyComponent
defineCustomElement: () => defineMyComponent(tagNameTransformer),
});

`);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ export const createStencilReactComponents = ({
'component.ts',
`${useClientDirective}${autogeneratedComment}${disableEslint}
import React from 'react';
import { ${runtimeImports} } from '@stencil/react-output-target/runtime';
import { ${runtimeImports}, tagNameTransformer } from '@stencil/react-output-target/runtime';
import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
`
);
Expand Down Expand Up @@ -151,7 +151,7 @@ import type { EventName, StencilReactComponent } from '@stencil/react-output-tar
// @ts-ignore - React type of Stencil Output Target may differ from the React version used in the Nuxt.js project, this can be ignored.
react: React,
events: {${events.map((e) => `${e.name}: '${e.originalName}'`).join(',\n')}} as ${componentEventNamesType},
defineCustomElement: define${reactTagName}
defineCustomElement: () => define${reactTagName}(tagNameTransformer),
})`;
const serverComponentCall = `/*@__PURE__*/ createSSRComponent<${componentElement}, ${componentEventNamesType}>({
tagName: '${tagName}',
Expand Down
6 changes: 6 additions & 0 deletions packages/react/src/react/create-component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import type { EventName, Options } from '@lit/react';
import { createComponent as createComponentWrapper, type ReactWebComponent, WebComponentProps } from '@lit/react';

import type { RenderToString } from './ssr';
import { tagNameTransformer } from './tagNameTransformer';

// A key value map matching React prop names to event names.
type EventNames = Record<string, EventName | string>;
Expand All @@ -18,6 +19,11 @@ export const createComponent = <I extends HTMLElement, E extends EventNames = {}
if (typeof defineCustomElement !== 'undefined') {
defineCustomElement();
}

if (typeof tagNameTransformer === 'function') {
options.tagName = tagNameTransformer(options.tagName);
}

return createComponentWrapper<I, E>(options);
};

Expand Down
1 change: 1 addition & 0 deletions packages/react/src/react/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export type { EventName, Options } from '@lit/react';
export { createComponent, createSSRComponent, type StencilReactComponent } from './create-component';
export { setTagNameTransformer, tagNameTransformer } from './tagNameTransformer';
6 changes: 6 additions & 0 deletions packages/react/src/react/tagNameTransformer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type TagNameTransformer = (tagName: string) => string;

export let tagNameTransformer: TagNameTransformer | undefined;
export const setTagNameTransformer = (_tagNameTransformer: TagNameTransformer) => {
tagNameTransformer = _tagNameTransformer;
};