diff --git a/package.json b/package.json index 3bd8b13..e2f23ac 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,26 @@ "source": "src/index.js", "types": "src/index.d.ts", "main": "dist/preact-custom-element.js", - "module": "dist/preact-custom-element.esm.js", + "module": "dist/preact-custom-element.mjs", "unpkg": "dist/preact-custom-element.umd.js", + "exports": { + ".": { + "module": { + "types": "./src/index.d.mts", + "default": "./dist/preact-custom-element.mjs" + }, + "umd": "./dist/preact-custom-element.umd.js", + "import": { + "types": "./src/index.d.mts", + "default": "./dist/preact-custom-element.mjs" + }, + "require": { + "types": "./src/index.d.ts", + "default": "./dist/preact-custom-element.js" + } + }, + "./package.json": "./package.json" + }, "scripts": { "prepare": "npx simple-git-hooks", "build": "microbundle -f cjs,es,umd --no-generateTypes", diff --git a/src/index.d.mts b/src/index.d.mts new file mode 100644 index 0000000..1b79c47 --- /dev/null +++ b/src/index.d.mts @@ -0,0 +1,48 @@ +import { AnyComponent } from 'preact'; + +type Options = + | { + shadow: false; + } + | { + shadow: true; + mode?: 'open' | 'closed'; + adoptedStyleSheets?: CSSStyleSheet[]; + serializable?: boolean; + }; + +/** + * Register a preact component as web-component. + * + * @example + * ```jsx + * // use custom web-component class + * class PreactWebComponent extends Component { + * static tagName = 'my-web-component'; + * render() { + * return
Hello world!
+ * } + * } + * + * register(PreactComponent); + * + * // use a preact component + * function PreactComponent({ prop }) { + * returnHello {prop}!
+ * } + * + * register(PreactComponent, 'my-component'); + * register(PreactComponent, 'my-component', ['prop']); + * register(PreactComponent, 'my-component', ['prop'], { + * shadow: true, + * mode: 'closed' + * }); + * const klass = register(PreactComponent, 'my-component'); + * ``` + */ +export default function register( + Component: AnyComponent
,
+ tagName?: string,
+ propNames?: (keyof P)[],
+ options?: Options
+): HTMLElement;
diff --git a/src/index.js b/src/index.js
index 1ae5828..26424c7 100644
--- a/src/index.js
+++ b/src/index.js
@@ -118,15 +118,6 @@ function connectedCallback(options) {
(this.hasAttribute('hydrate') ? hydrate : render)(this._vdom, this._root);
}
-/**
- * Camel-cases a string
- * @param {string} str The string to transform to camelCase
- * @returns camel case version of the string
- */
-function toCamelCase(str) {
- return str.replace(/-(\w)/g, (_, c) => (c ? c.toUpperCase() : ''));
-}
-
/**
* Changed whenver an attribute of the HTML element changed
* @this {PreactCustomElement}
@@ -143,7 +134,6 @@ function attributeChangedCallback(name, oldValue, newValue) {
newValue = newValue == null ? undefined : newValue;
const props = {};
props[name] = newValue;
- props[toCamelCase(name)] = newValue;
this._vdom = cloneElement(this._vdom, props);
render(this._vdom, this._root);
}
@@ -192,7 +182,6 @@ function toVdom(element, nodeName, options) {
for (i = a.length; i--; ) {
if (a[i].name !== 'slot') {
props[a[i].name] = a[i].value;
- props[toCamelCase(a[i].name)] = a[i].value;
}
}
diff --git a/test/index.test.jsx b/test/index.test.jsx
index 734ab6c..6e83bd2 100644
--- a/test/index.test.jsx
+++ b/test/index.test.jsx
@@ -210,39 +210,6 @@ describe('web components', () => {
);
});
- const kebabName = 'custom-date-long-name';
- const camelName = 'customDateLongName';
- const lowerName = camelName.toLowerCase();
- function PropNameTransform(props) {
- return (
-
- {props[kebabName]} {props[lowerName]} {props[camelName]}
-
- );
- }
- registerElement(PropNameTransform, 'x-prop-name-transform', [
- kebabName,
- camelName,
- ]);
-
- it('handles kebab-case attributes with passthrough', () => {
- const el = document.createElement('x-prop-name-transform');
- el.setAttribute(kebabName, '11/11/2011');
- el.setAttribute(camelName, 'pretended to be camel');
-
- root.appendChild(el);
- assert.equal(
- root.innerHTML,
- `