Skip to content
Merged
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
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@repixelcorp/hyper-pwt",
"version": "0.1.5",
"version": "0.1.6",
"description": "A faster, more modern, superior alternative for Mendix PWT.",
"repository": {
"type": "git",
Expand Down Expand Up @@ -38,6 +38,7 @@
"devDependencies": {
"@rslib/core": "0.12.2",
"@types/node": "22.17.2",
"esbuild": "0.25.9",
"type-fest": "4.41.0",
"typescript": "5.9.2"
},
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

315 changes: 7 additions & 308 deletions src/commands/start/web/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import { getViteDefaultConfig } from '../../../configurations/vite';
import getWidgetName from '../../../utils/getWidgetName';
import getViteUserConfiguration from '../../../utils/getViteUserConfiguration';
import { generateTypesFromFile } from '../../../type-generator';
import { mendixHotreloadReactPlugin } from '../../../configurations/vite/plugins/mendix-hotreload-react-plugin';
import { mendixHotreloadReactEsbuildPlugin } from '../../../configurations/vite/plugins/mendix-hotreload-react-esbuild-plugin';
import { mendixPatchViteClientPlugin } from '../../../configurations/vite/plugins/mendix-patch-vite-client-plugin';

const generateTyping = async () => {
const widgetName = await getWidgetName();
Expand Down Expand Up @@ -71,318 +74,14 @@ const startWebCommand = async () => {
optimizeDeps: {
esbuildOptions: {
plugins: [
// @note When the React version of Mendix is updated, the following content must also be updated.
// @todo Depending on the React version, we need to consider whether there is a way to handle this automatically rather than manually.
{
name: 'replace-react-with-virtual',
setup(build) {
build.onResolve({ filter: /^react$/ }, (args) => {
return {
path: 'mendix:react',
namespace: 'mendix-react',
external: false
};
});

build.onResolve({ filter: /^react-dom$/ }, (args) => {
return {
path: 'mendix:react-dom',
namespace: 'mendix-react-dom',
external: false
};
});

build.onResolve({ filter: /^react-dom\/client$/ }, (args) => {
return {
path: 'mendix:react-dom/client',
namespace: 'mendix-react-dom-client',
external: false
};
});

build.onResolve({ filter: /^react\/jsx-runtime$/ }, (args) => {
return {
path: 'mendix:react/jsx-runtime',
namespace: 'mendix-react-jsx-runtime',
external: false
};
});

build.onResolve({ filter: /^react\/jsx-dev-runtime$/ }, (args) => {
return {
path: 'mendix:react/jsx-dev-runtime',
namespace: 'mendix-react-jsx-dev-runtime',
external: false
};
});

build.onLoad({ filter: /.*/, namespace: 'mendix-react' }, () => {
return {
contents: `
const React = window.React;

export const Children = React.Children;
export const Component = React.Component;
export const Fragment = React.Fragment;
export const Profiler = React.Profiler;
export const PureComponent = React.PureComponent;
export const StrictMode = React.StrictMode;
export const Suspense = React.Suspense;
export const cloneElement = React.cloneElement;
export const createContext = React.createContext;
export const createElement = React.createElement;
export const createFactory = React.createFactory;
export const createRef = React.createRef;
export const forwardRef = React.forwardRef;
export const isValidElement = React.isValidElement;
export const lazy = React.lazy;
export const memo = React.memo;
export const startTransition = React.startTransition;
export const unstable_act = React.unstable_act;
export const useCallback = React.useCallback;
export const useContext = React.useContext;
export const useDebugValue = React.useDebugValue;
export const useDeferredValue = React.useDeferredValue;
export const useEffect = React.useEffect;
export const useId = React.useId;
export const useImperativeHandle = React.useImperativeHandle;
export const useInsertionEffect = React.useInsertionEffect;
export const useLayoutEffect = React.useLayoutEffect;
export const useMemo = React.useMemo;
export const useReducer = React.useReducer;
export const useRef = React.useRef;
export const useState = React.useState;
export const useSyncExternalStore = React.useSyncExternalStore;
export const useTransition = React.useTransition;
export const version = React.version;

export default React;
`,
loader: 'js',
};
});

build.onLoad({ filter: /.*/, namespace: 'mendix-react-dom' }, () => {
return {
contents: `
const ReactDOM = window.ReactDOM;

export const createPortal = ReactDOM.createPortal;
export const createRoot = ReactDOM.createRoot;
export const findDOMNode = ReactDOM.findDOMNode;
export const flushSync = ReactDOM.flushSync;
export const hydrate = ReactDOM.hydrate;
export const hydrateRoot = ReactDOM.hydrateRoot;
export const render = ReactDOM.render;
export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode;
export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates;
export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer;
export const version = ReactDOM.version;

export default ReactDOM;
`,
loader: 'js',
};
});

build.onLoad({ filter: /.*/, namespace: 'mendix-react-dom-client' }, () => {
return {
contents: `
const ReactDOMClient = window.ReactDOMClient;

export const createRoot = ReactDOMClient.createRoot;
export const hydrateRoot = ReactDOMClient.hydrateRoot;

export default ReactDOMClient;
`,
loader: 'js',
};
});

build.onLoad({ filter: /.*/, namespace: 'mendix-react-jsx-runtime' }, () => {
return {
contents: `
const ReactJSXRuntime = window.ReactJSXRuntime;

export const Fragment = ReactJSXRuntime.Fragment;
export const jsx = ReactJSXRuntime.jsx;
export const jsxs = ReactJSXRuntime.jsxs;

export default ReactJSXRuntime;
`,
loader: 'js',
};
});

build.onLoad({ filter: /.*/, namespace: 'mendix-react-jsx-dev-runtime' }, () => {
return {
contents: `
const ReactJSXDevRuntime = window.ReactJSXDevRuntime;

export const Fragment = ReactJSXDevRuntime.Fragment;
export const jsxDEV = ReactJSXDevRuntime.jsxDEV;

export default ReactJSXDevRuntime;
`,
loader: 'js',
};
});

build.onResolve({ filter: /.*node_modules[\\\/]react[\\\/]index\.js$/ }, (args) => {
return {
path: 'mendix:react',
namespace: 'mendix-react',
external: false
};
});

build.onResolve({ filter: /.*node_modules[\\\/]react-dom[\\\/]index\.js$/ }, (args) => {
return {
path: 'mendix:react-dom',
namespace: 'mendix-react-dom',
external: false
};
});

build.onResolve({ filter: /.*node_modules[\\\/]react-dom[\\\/]client\.js$/ }, (args) => {
return {
path: 'mendix:react-dom/client',
namespace: 'mendix-react-dom-client',
external: false
};
});
}
}
mendixHotreloadReactEsbuildPlugin(),
],
}
},
plugins: [
...resultViteConfig.plugins as PluginOption[],
// @note When the React version of Mendix is updated, the following content must also be updated.
// @todo Depending on the React version, we need to consider whether there is a way to handle this automatically rather than manually.
{
name: 'mendix-hotreload-react-18.2.0',
enforce: 'pre',
resolveId(id) {
if (id === 'react') {
return { id: 'mendix:react', external: true };
}

if (id === 'react-dom') {
return { id: 'mendix:react-dom', external: true };
}

if (id === 'react-dom/client') {
return { id: 'mendix:react-dom/client', external: true };
}

if (id === 'react/jsx-runtime') {
return { id: 'mendix:react/jsx-runtime', external: true };
}

if (id === 'react/jsx-dev-runtime') {
return { id: 'mendix:react/jsx-dev-runtime', external: true };
}
},
load(id) {
if (id === 'mendix:react') {
return `
const React = window.React;

export const Children = React.Children;
export const Component = React.Component;
export const Fragment = React.Fragment;
export const Profiler = React.Profiler;
export const PureComponent = React.PureComponent;
export const StrictMode = React.StrictMode;
export const Suspense = React.Suspense;
export const cloneElement = React.cloneElement;
export const createContext = React.createContext;
export const createElement = React.createElement;
export const createFactory = React.createFactory;
export const createRef = React.createRef;
export const forwardRef = React.forwardRef;
export const isValidElement = React.isValidElement;
export const lazy = React.lazy;
export const memo = React.memo;
export const startTransition = React.startTransition;
export const unstable_act = React.unstable_act;
export const useCallback = React.useCallback;
export const useContext = React.useContext;
export const useDebugValue = React.useDebugValue;
export const useDeferredValue = React.useDeferredValue;
export const useEffect = React.useEffect;
export const useId = React.useId;
export const useImperativeHandle = React.useImperativeHandle;
export const useInsertionEffect = React.useInsertionEffect;
export const useLayoutEffect = React.useLayoutEffect;
export const useMemo = React.useMemo;
export const useReducer = React.useReducer;
export const useRef = React.useRef;
export const useState = React.useState;
export const useSyncExternalStore = React.useSyncExternalStore;
export const useTransition = React.useTransition;
export const version = React.version;

export default React;
`;
}

if (id === 'mendix:react-dom') {
return `
const ReactDOM = window.ReactDOM;

export const createPortal = ReactDOM.createPortal;
export const createRoot = ReactDOM.createRoot;
export const findDOMNode = ReactDOM.findDOMNode;
export const flushSync = ReactDOM.flushSync;
export const hydrate = ReactDOM.hydrate;
export const hydrateRoot = ReactDOM.hydrateRoot;
export const render = ReactDOM.render;
export const unmountComponentAtNode = ReactDOM.unmountComponentAtNode;
export const unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates;
export const unstable_renderSubtreeIntoContainer = ReactDOM.unstable_renderSubtreeIntoContainer;
export const version = ReactDOM.version;

export default ReactDOM;
`;
}

if (id === 'mendix:react-dom/client') {
return `
const ReactDOMClient = window.ReactDOMClient;

export const createRoot = ReactDOMClient.createRoot;
export const hydrateRoot = ReactDOMClient.hydrateRoot;

export default ReactDOMClient;
`;
}

if (id === 'mendix:react/jsx-runtime') {
return `
const ReactJSXRuntime = window.ReactJSXRuntime;

export const Fragment = ReactJSXRuntime.Fragment;
export const jsx = ReactJSXRuntime.jsx;
export const jsxs = ReactJSXRuntime.jsxs;

export default ReactJSXRuntime;
`;
}

if (id === 'mendix:react/jsx-dev-runtime') {
return `
const ReactJSXDevRuntime = window.ReactJSXDevRuntime;

export const Fragment = ReactJSXDevRuntime.Fragment;
export const jsxDEV = ReactJSXDevRuntime.jsxDEV;

export default ReactJSXDevRuntime;
`;
}
}
},
mendixHotreloadReactPlugin(),
mendixPatchViteClientPlugin(),
{
name: 'mendix-xml-watch-plugin',
configureServer(server) {
Expand All @@ -392,7 +91,7 @@ const startWebCommand = async () => {
}
});
}
}
},
]
});

Expand Down
Loading
Loading