A webpack loader that adds location metadata to JSX elements for development debugging. This loader automatically injects data-macaly-loc and data-macaly-name attributes into your JSX elements, making it easy to trace elements back to their source code location.
- 🎯 Precise location tracking: Shows exact file, line, and column for each JSX element
- 🚀 Zero runtime overhead: Only runs in development mode
- đź”§ Easy integration: Simple webpack configuration
- 📦 TypeScript support: Works with both
.jsxand.tsxfiles - đźš« Smart filtering: Automatically excludes
node_modules
npm install --save-dev macaly-taggerThe loader has the following dependencies that will be installed automatically:
@babel/parsermagic-stringestree-walker
Configure your next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
turbopack: {
rules: {
"*.{jsx,tsx}": {
condition: {
all: [
{ not: "foreign" }, // Exclude node_modules
"development", // Only in development mode
],
},
loaders: [
{
loader: "macaly-tagger",
options: {
disableSourceMaps: true, // Required to avoid Turbopack crashes
},
},
],
as: "*", // Preserve original file handling
},
},
},
};
module.exports = nextConfig;Important Notes for Turbopack:
disableSourceMaps: trueis required to prevent Turbopack crashes when processing source mapsas: "*"preserves the original file type handling (don't use"*.js")- Don't include
'browser'condition as it may exclude server components in Next.js- The simple
"*.{jsx,tsx}"glob pattern works correctly with these settings
Configure your next.config.js:
const path = require("path");
/** @type {import('next').NextConfig} */
const nextConfig = {
webpack: (config, { dev, isServer }) => {
// Only apply in development
if (dev) {
config.module.rules.unshift({
test: /\.(jsx|tsx)$/,
exclude: /node_modules/,
use: [
{
loader: "macaly-tagger",
},
],
enforce: "pre", // Run before other loaders
});
}
return config;
},
};
module.exports = nextConfig;For custom webpack configurations:
module.exports = {
module: {
rules: [
{
test: /\.(jsx|tsx)$/,
exclude: /node_modules/,
use: [
{
loader: "macaly-tagger",
},
],
enforce: "pre",
},
// ... other rules
],
},
};For Vite projects, you'll need a Vite plugin wrapper (not included in this package).
export default function TestComponent() {
return (
<div className="container">
<h1>Hello Macaly!</h1>
<button onClick={() => console.log("clicked")}>Click me</button>
<MyLib.SpecialButton />
</div>
);
}<div
data-macaly-loc="components/TestComponent.jsx:3:4"
data-macaly-name="div"
class="container"
>
<h1 data-macaly-loc="components/TestComponent.jsx:4:6" data-macaly-name="h1">
Hello Macaly!
</h1>
<button
data-macaly-loc="components/TestComponent.jsx:5:6"
data-macaly-name="button"
>
Click me
</button>
<button
data-macaly-loc="components/TestComponent.jsx:8:6"
data-macaly-name="MyLib.SpecialButton"
>
Special
</button>
</div>The loader:
- Parses JSX/TSX files using Babel parser
- Walks the AST to find JSX opening elements
- Adds location attributes with file path, line, and column information
- Preserves source maps for debugging
- Skips already tagged elements to avoid duplicates
The loader works out of the box with no configuration needed. It automatically:
- Processes only
.jsxand.tsxfiles - Excludes
node_modulesdirectory - Runs only in development mode (when configured properly)
- Handles both regular JSX elements (
<div>) and member expressions (<MyLib.Button>)
You can pass options to the loader:
{
loader: 'macaly-tagger',
options: {
debug: true, // Enable debug logging
disableSourceMaps: true, // Disable source map generation (useful for Turbopack)
},
}| Option | Type | Default | Description |
|---|---|---|---|
debug |
boolean |
false |
Enable detailed console logging for debugging |
disableSourceMaps |
boolean |
false |
Disable source map generation (recommended for Turbopack to avoid crashes) |
For each JSX element, the loader adds:
data-macaly-loc: File path, line, and column (e.g.,"components/Button.jsx:15:8")data-macaly-name: Component/element name (e.g.,"button"or"MyLib.Button")
Once installed, you can:
- Open browser DevTools
- Inspect any element
- See the
data-macaly-locattribute to find the exact source location - Use browser extensions or custom scripts to jump to source code
- Check console for errors: Look for
[macaly-tagger]warnings in the browser console - Verify development mode: Ensure the loader only runs in development (
dev && !isServerfor Next.js) - Check file extensions: Only
.jsxand.tsxfiles are processed
- Install dependencies: Ensure all peer dependencies are installed
- Check webpack version: Requires webpack >= 4.0.0 (for webpack setup)
- Verify loader path: Make sure the loader is correctly referenced
The loader is optimized for development:
- Only processes JSX/TSX files
- Excludes node_modules automatically
- Uses efficient AST walking
- Includes source map support
Add a console log to see which files are being processed:
// In your webpack config
{
loader: 'macaly-tagger',
options: {
debug: true // If you implement options support
}
}- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
MIT License - see LICENSE file for details.
- Added
disableSourceMapsoption to prevent Turbopack crashes - Added comprehensive Turbopack configuration documentation
- Tested and verified Turbopack compatibility with Next.js 15.3.0+
- Initial release
- Support for JSX and TSX files
- Location tracking with file, line, and column
- Member expression support (e.g.,
MyLib.Button) - Source map preservation