diff --git a/custom-elements-manifest.config.mjs b/custom-elements-manifest.config.mjs index 52793c09..59a10372 100644 --- a/custom-elements-manifest.config.mjs +++ b/custom-elements-manifest.config.mjs @@ -27,7 +27,7 @@ export default { return { type: { - text: `CustomEvent<${type.text.replace(/.*<([a-z]+)>/, '$1')}>` + text: `CustomEvent<${type.text.match(/EventDispatcher<(.*?)>/s)[1]}>` }, description, name diff --git a/package-lock.json b/package-lock.json index 48e048c5..6b1d1b9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,7 @@ "lint-staged": "^13.1.2", "minimist": "^1.2.6", "npm-run-all": "^4.1.5", + "pascal-case": "^3.1.2", "prettier": "^2.0.4", "rollup-plugin-lit-css": "^4.0.0", "storybook": "6.5.9", diff --git a/package.json b/package.json index 845a5f63..89bf221c 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "lint-staged": "^13.1.2", "minimist": "^1.2.6", "npm-run-all": "^4.1.5", + "pascal-case": "^3.1.2", "prettier": "^2.0.4", "rollup-plugin-lit-css": "^4.0.0", "storybook": "6.5.9", diff --git a/scripts/generate-react-exports.js b/scripts/generate-react-exports.js index 9cdf6c7c..f6b44a5e 100644 --- a/scripts/generate-react-exports.js +++ b/scripts/generate-react-exports.js @@ -1,24 +1,26 @@ const fs = require('fs-extra'); +const { pascalCase } = require('pascal-case'); const importStatements = [ - "import React from 'react';", - "import { createComponent } from '@lit-labs/react';", + 'import React from "react";', + 'import { type EventName, createComponent, ReactWebComponent } from "@lit-labs/react";', + + // FIXME: These types should be determined automatically + 'import { ISelectOption } from "./components/select/bl-select"', ]; function writeBaklavaReactFile(fileContentParts) { - let fileContentText = ` - /* eslint-disable @typescript-eslint/ban-ts-comment */ - // @ts-nocheck - ${importStatements.join('\n')} - ${fileContentParts.join('\n\n')} - `; + let fileContentText = `/* eslint-disable @typescript-eslint/ban-ts-comment */\n` + + `// @ts-nocheck\n` + + `${importStatements.join('\n')}\n\n` + + `${fileContentParts.join('\n\n')}\n` + ; - fs.writeFileSync(`${__dirname}/../src/baklava-react.ts`, fileContentText.trim()); + fs.writeFileSync(`${__dirname}/../src/baklava-react.ts`, fileContentText); } function getReactEventName(baklavaEventName) { - const rawEventName = baklavaEventName.match(/(\w+)/g).at(-1); - return `on${rawEventName[0].toUpperCase()}${rawEventName.slice(1)}`; + return `on${pascalCase(baklavaEventName)}`; } const customElements = fs.readJSONSync(`${__dirname}/../dist/custom-elements.json`); @@ -38,26 +40,28 @@ for (const module of customElementsModules) { }, {}) : {}; + const eventTypes = events + ? `, {${events.map(event => `${getReactEventName(event.name)}: EventName<${event.type.text}>`).join(', ')}}` + : ''; + const importPath = path.replace(/^src\//, '').replace(/\.ts$/, ''); const Type = componentName + 'Type'; importStatements.push(`import type ${Type} from "./${importPath}";`); baklavaReactFileParts.push( - ` - export const ${componentName} = React.lazy(() => - customElements.whenDefined('${fileName}').then(elem => ({ - default: createComponent<${Type}>( - { - react: React, - tagName: '${fileName}', - elementClass: elem, - events:${JSON.stringify(eventNames)} - } +`export const ${componentName} = React.lazy>(() => + customElements.whenDefined('${fileName}').then(elem => ({ + default: createComponent<${Type}>( + { + react: React, + tagName: '${fileName}', + elementClass: elem, + events: ${JSON.stringify(eventNames)} + } ) - }) - )); - ` + }) +));` ); }