Bug Report
Description
When using luaBundle in a pnpm (or yarn) workspace monorepo, the same package gets bundled multiple times under different module keys if it's referenced both directly and transitively through symlinked dependencies.
Reproduction
Setup: pnpm workspace monorepo with three packages:
pkg-a — base library (buildMode: "library")
pkg-b — depends on pkg-a (buildMode: "library")
pkg-c — depends on pkg-a and pkg-b (luaBundle entry point)
pnpm symlink layout:
packages/pkg-c/node_modules/pkg-a -> ../../pkg-a (real path: packages/pkg-a)
packages/pkg-c/node_modules/pkg-b -> ../../pkg-b
packages/pkg-b/node_modules/pkg-a -> ../../pkg-a (same real path!)
Result: bundle.lua contains pkg-a twice:
____modules = {
["lua_modules.pkg-a.dist.index"] = function(...) -- direct dep from pkg-c
-- ... pkg-a code ...
end,
["lua_modules.pkg-b.node_modules.pkg-a.dist.index"] = function(...) -- transitive dep via pkg-b
-- ... identical pkg-a code ...
end,
}
Expected: pkg-a should appear only once in the bundle.
Root Cause
In src/transpilation/resolve.ts, the enhanced-resolve resolver is configured with symlinks: false (to preserve node_modules path detection). The deduplication in resolvedFiles and processedDependencies uses string-based path comparison. Since pnpm symlinks create different filesystem paths for the same physical file, the same module passes deduplication checks and gets bundled multiple times.
Environment
- typescript-to-lua: 1.33.2
- pnpm: 10.28.0
- OS: Linux (WSL2)
Bug Report
Description
When using
luaBundlein a pnpm (or yarn) workspace monorepo, the same package gets bundled multiple times under different module keys if it's referenced both directly and transitively through symlinked dependencies.Reproduction
Setup: pnpm workspace monorepo with three packages:
pkg-a— base library (buildMode: "library")pkg-b— depends onpkg-a(buildMode: "library")pkg-c— depends onpkg-aandpkg-b(luaBundle entry point)pnpm symlink layout:
Result:
bundle.luacontainspkg-atwice:Expected:
pkg-ashould appear only once in the bundle.Root Cause
In
src/transpilation/resolve.ts, the enhanced-resolve resolver is configured withsymlinks: false(to preservenode_modulespath detection). The deduplication inresolvedFilesandprocessedDependenciesuses string-based path comparison. Since pnpm symlinks create different filesystem paths for the same physical file, the same module passes deduplication checks and gets bundled multiple times.Environment