diff --git a/.pnpmfile.cjs b/.pnpmfile.cjs new file mode 100644 index 00000000..c0f2d29a --- /dev/null +++ b/.pnpmfile.cjs @@ -0,0 +1,14 @@ +function beforePacking(pkg) { + // Remove bundled dependency from published package + delete pkg.dependencies['@mendix/widget-typings-generator']; + + console.log('✓ Removed bundled dependency from package.json'); + + return pkg; +} + +module.exports = { + hooks: { + beforePacking + } +}; diff --git a/packages/command-tests/commands.js b/packages/command-tests/commands.js index 4831815f..3ba09791 100644 --- a/packages/command-tests/commands.js +++ b/packages/command-tests/commands.js @@ -39,7 +39,7 @@ async function main() { console.log("Preparing..."); const pluggableWidgetsToolsPath = "../pluggable-widgets-tools"; - const { stdout: packOutput } = await execAsync("npm pack", join(__dirname, pluggableWidgetsToolsPath)); + const { stdout: packOutput } = await execAsync("pnpm pack", join(__dirname, pluggableWidgetsToolsPath)); const toolsPackagePath = join(__dirname, pluggableWidgetsToolsPath, packOutput.trim().split(/\n/g).pop()); const workDirs = []; diff --git a/packages/pluggable-widgets-tools/configs/rollup-plugin-widget-typing.mjs b/packages/pluggable-widgets-tools/configs/rollup-plugin-widget-typing.mjs index 0fbe0b05..ef76257e 100644 --- a/packages/pluggable-widgets-tools/configs/rollup-plugin-widget-typing.mjs +++ b/packages/pluggable-widgets-tools/configs/rollup-plugin-widget-typing.mjs @@ -1,8 +1,7 @@ import { promises as fs } from "fs"; import { extname, join } from "path"; import { listDir } from "./shared.mjs"; - -const { transformPackage } = await import(new URL("../dist/typings-generator/index.js", import.meta.url)); +import { transformPackage } from "../dist/widget-typings-generator.js"; export function widgetTyping({ sourceDir }) { let firstRun = true; diff --git a/packages/pluggable-widgets-tools/jest.config.js b/packages/pluggable-widgets-tools/jest.config.js index f6582d1b..ff91b7e9 100644 --- a/packages/pluggable-widgets-tools/jest.config.js +++ b/packages/pluggable-widgets-tools/jest.config.js @@ -7,7 +7,6 @@ const webConfig = { rootDir: ".", testMatch: [ "/src/web/**/*.spec.{ts,tsx}", - "/src/typings-generator/**/*.spec.{ts,tsx}", "/src/utils/**/*.spec.{ts,tsx}" ] }; diff --git a/packages/pluggable-widgets-tools/package.json b/packages/pluggable-widgets-tools/package.json index 7410d883..a0c80cc7 100644 --- a/packages/pluggable-widgets-tools/package.json +++ b/packages/pluggable-widgets-tools/package.json @@ -11,7 +11,8 @@ "pluggable-widgets-tools": "bin/mx-scripts.js" }, "scripts": { - "prepack": "shx rm -rf dist && tsc", + "build:typings": "pnpm --filter=@mendix/widget-typings-generator run build", + "prepack": "shx rm -rf dist && pnpm build:typings && tsc && rollup -c prepack.rollup.mjs", "test": "jest" }, "files": [ @@ -25,6 +26,7 @@ "utils" ], "dependencies": { + "@mendix/widget-typings-generator": "workspace:*", "@babel/core": "^7.26.0", "@babel/plugin-transform-class-properties": "^7.25.9", "@babel/plugin-transform-private-methods": "^7.25.9", diff --git a/packages/pluggable-widgets-tools/prepack.rollup.mjs b/packages/pluggable-widgets-tools/prepack.rollup.mjs new file mode 100644 index 00000000..f763a84b --- /dev/null +++ b/packages/pluggable-widgets-tools/prepack.rollup.mjs @@ -0,0 +1,21 @@ +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; + +export default [ + { + treeshake: false, + input: 'node_modules/@mendix/widget-typings-generator/dist/index.js', + output: { + file: 'dist/widget-typings-generator.js', + format: 'cjs', + exports: 'named', + sourcemap: false + }, + plugins: [ + commonjs(), + nodeResolve({ + preferBuiltins: true + }), + ] + } +]; diff --git a/packages/pluggable-widgets-tools/src/index.ts b/packages/pluggable-widgets-tools/src/index.ts index 23709764..7dec38af 100644 --- a/packages/pluggable-widgets-tools/src/index.ts +++ b/packages/pluggable-widgets-tools/src/index.ts @@ -1,5 +1,6 @@ export * from "./common"; export * from "./native/common"; -export * from "./web/common"; -export * from "./utils/typings"; export * from "./utils"; +export * from "./utils/typings"; +export * from "./web/common"; + diff --git a/packages/widget-typings-generator/README.md b/packages/widget-typings-generator/README.md new file mode 100644 index 00000000..80396869 --- /dev/null +++ b/packages/widget-typings-generator/README.md @@ -0,0 +1,81 @@ +# @mendix/widget-typings-generator + +TypeScript typings generator for Mendix Pluggable Widgets. + +## Overview + +Generates TypeScript definition files (`.d.ts`) from Mendix widget XML schema files, providing type-safe development experience for widget creators. + +## Usage + +### Basic Usage + +```typescript +import { transformPackage } from "@mendix/widget-typings-generator"; +import { readFile } from "fs/promises"; + +// Read your widget's package.xml +const packageXml = await readFile("./src/{WidgetName}.xml", "utf-8"); + +// Generate TypeScript definitions +await transformPackage(packageXml, "./src"); +``` + +This will: +1. Parse `{WidgetName}.xml` to find all widget XML files +2. Generate TypeScript interfaces for each widget +3. Create `.d.ts` files in `../typings/{WidgetName}.xml/` directory + +### Generated Types + +For a widget named `MyWidget`, it generates: +- **Web:** `MyWidgetContainerProps` (runtime) and `MyWidgetPreviewProps` (Studio Pro) +- **Native:** `MyWidgetProps