I'm trying to generate a component during the build based on some params using babel-plugin-codegen (https://github.com/kentcdodds/babel-plugin-codegen). I've spent hours and this is where I'm at now: it looks like my component is successfully generated through babel-cli, but not during build-time. I get an error: Module not found: Can't resolve 'fs'.
Here is my repo: https://github.com/abimatov/babel-macro-demo
Here are my detailed steps:
- I created a new Next.js project (https://nextjs.org/docs):
npx create-next-app@latest - Started the application:
npm run dev - Ran
npm i @babel/core --save-dev,npm i @babel/cli --save-dev,npm i babel-plugin-macros --save-dev,npm install --save-dev babel-plugin-preval,npm install --save-dev babel-plugin-codegen - Created a
.babelrcfile with the following contents:
{
"presets": ["next/babel"],
"plugins": ["macros", "preval", "codegen"]
}
- My
pages/index.jslooks something like this:
import codegen from 'babel-plugin-codegen';
export default function Home() {
const CodegenComponent = codegen.require('../components/codegenDemo');
return <>
<CodegenComponent />
</>;
}
- My
codegenDemo.jslooks like this:
module.exports = (input) => `<div>${input}</div>`;
- I run
npx babel .\pages\index.jsand the output looks right-ish to me:
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = Home;
var _react = _interopRequireDefault(require("react"));
var _babelPluginCodegen = _interopRequireDefault(require("babel-plugin-codegen"));
var __jsx = _react["default"].createElement;
function Home() {
var CodegenComponent = __jsx("div", null, "undefined");
return __jsx(_react["default"].Fragment, null, __jsx(CodegenComponent, null));
}
- I run
npm run devand go tolocalhost:3000
Expected result: I should see the CodegenComponent rendered (basically, just <div></div>).
Actual result: An error that Module not found: Can't resolve 'fs'

Solution:
codegenDemo.js:pages/index.js: