@@ -10,11 +10,32 @@ import pathIsExists from "../../../utils/pathIsExists";
1010import { getViteDefaultConfig } from '../../../configurations/vite' ;
1111import getWidgetName from '../../../utils/getWidgetName' ;
1212import getViteUserConfiguration from '../../../utils/getViteUserConfiguration' ;
13+ import { generateTypesFromFile } from '../../../type-generator' ;
14+
15+ const generateTyping = async ( ) => {
16+ const widgetName = await getWidgetName ( ) ;
17+ const originWidgetXmlPath = path . join ( PROJECT_DIRECTORY , `src/${ widgetName } .xml` ) ;
18+ const typingsPath = path . join ( PROJECT_DIRECTORY , 'typings' ) ;
19+ const typingsDirExists = await pathIsExists ( typingsPath ) ;
20+
21+ if ( typingsDirExists ) {
22+ await fs . rm ( typingsPath , { recursive : true , force : true } ) ;
23+ }
24+
25+ await fs . mkdir ( typingsPath ) ;
26+
27+ const newTypingsFilePath = path . join ( typingsPath , `${ widgetName } Props.d.ts` ) ;
28+ const typingContents = await generateTypesFromFile ( originWidgetXmlPath , 'web' ) ;
29+
30+ await fs . writeFile ( newTypingsFilePath , typingContents ) ;
31+ } ;
1332
1433const startWebCommand = async ( ) => {
1534 try {
1635 showMessage ( 'Start widget server' ) ;
1736
37+ await generateTyping ( ) ;
38+
1839 const customViteConfigPath = path . join ( PROJECT_DIRECTORY , VITE_CONFIGURATION_FILENAME ) ;
1940 const viteConfigIsExists = await pathIsExists ( customViteConfigPath ) ;
2041 let resultViteConfig : UserConfig ;
@@ -362,66 +383,16 @@ const startWebCommand = async () => {
362383 }
363384 }
364385 } ,
365- // {
366- // name: 'mendix-hotreload-react',
367- // enforce: 'pre',
368- // transform(code, id) {
369- // if (!id.includes('node_modules') && /\.(tsx?|jsx?)$/.test(id)) {
370- // let transformedCode = code;
371-
372- // transformedCode = transformedCode.replace(
373- // /import\s+(\w+)\s+from\s+['"]react['"]/g,
374- // 'const $1 = window.React'
375- // );
376-
377- // transformedCode = transformedCode.replace(
378- // /import\s+\*\s+as\s+(\w+)\s+from\s+['"]react['"]/g,
379- // 'const $1 = window.React'
380- // );
381-
382- // transformedCode = transformedCode.replace(
383- // /import\s+{([^}]+) }\s+from\s+['"]react['"]/g,
384- // (match, imports) => {
385- // const cleanImports = imports.replace(/\s+/g, ' ').trim();
386- // return `const { ${cleanImports} } = window.React`;
387- // }
388- // );
389-
390- // transformedCode = transformedCode.replace(
391- // /import\s+(\w+)\s*,\s*{([^}]+) }\s+from\s+['"]react['"]/g,
392- // (match, defaultImport, namedImports) => {
393- // const cleanImports = namedImports.replace(/\s+/g, ' ').trim();
394- // return `const ${defaultImport} = window.React;\nconst { ${cleanImports} } = window.React`;
395- // }
396- // );
397-
398- // transformedCode = transformedCode.replace(
399- // /import\s+(\w+)\s+from\s+['"]react-dom['"]/g,
400- // 'const $1 = window.ReactDOM'
401- // );
402-
403- // transformedCode = transformedCode.replace(
404- // /import\s+{([^}]+) }\s+from\s+['"]react-dom['"]/g,
405- // 'const { $1 } = window.ReactDOM'
406- // );
407-
408- // transformedCode = transformedCode.replace(
409- // /import\s+{([^}]+) }\s+from\s+['"]react-dom\/client['"]/g,
410- // 'const { $1 } = window.ReactDOM'
411- // );
412-
413- // transformedCode = transformedCode.replace(
414- // /import\s+type\s+{([^}]+) }\s+from\s+['"]react['"]/g,
415- // '// Type import removed: $1'
416- // );
417-
418- // return {
419- // code: transformedCode,
420- // map: null
421- // };
422- // }
423- // },
424- // },
386+ {
387+ name : 'mendix-xml-watch-plugin' ,
388+ configureServer ( server ) {
389+ server . watcher . on ( 'change' , ( file ) => {
390+ if ( file . endsWith ( 'xml' ) ) {
391+ generateTyping ( ) ;
392+ }
393+ } ) ;
394+ }
395+ }
425396 ]
426397 } ) ;
427398
0 commit comments