diff --git a/packages/plugin/vite/src/Config.ts b/packages/plugin/vite/src/Config.ts index bf20f6386a..2b1293ef0e 100644 --- a/packages/plugin/vite/src/Config.ts +++ b/packages/plugin/vite/src/Config.ts @@ -36,4 +36,8 @@ export interface VitePluginConfig { * Renderer process Vite configs. */ renderer: VitePluginRendererConfig[]; + /** + * Whether symlinked dependencies should be dereferenced during the copying of node_modules. Defaults to false. + */ + derefSymlinks?: boolean; } diff --git a/packages/plugin/vite/src/ViteConfig.ts b/packages/plugin/vite/src/ViteConfig.ts index b91d8abb9e..2c8755295a 100644 --- a/packages/plugin/vite/src/ViteConfig.ts +++ b/packages/plugin/vite/src/ViteConfig.ts @@ -37,6 +37,10 @@ export default class ViteConfigGenerator { return this.isProd ? 'production' : 'development'; } + get derefSymlinks(): boolean { + return this.pluginConfig.derefSymlinks ?? false; + } + async getBuildConfig(): Promise { if (!Array.isArray(this.pluginConfig.build)) { throw new Error('"config.build" must be an Array'); diff --git a/packages/plugin/vite/src/VitePlugin.ts b/packages/plugin/vite/src/VitePlugin.ts index 1df51a905f..9be0f819c8 100644 --- a/packages/plugin/vite/src/VitePlugin.ts +++ b/packages/plugin/vite/src/VitePlugin.ts @@ -120,9 +120,11 @@ the generated files). Instead, it is ${JSON.stringify(pj.main)}`); spaces: 2, }); + const dereference = this.configGenerator.derefSymlinks; + // Copy the dependencies in package.json for (const dep of flatDependencies) { - await fs.copy(dep.src, path.resolve(buildPath, dep.dest)); + await fs.copy(dep.src, path.resolve(buildPath, dep.dest), { dereference }); } }; diff --git a/packages/plugin/vite/test/ViteConfig_spec.ts b/packages/plugin/vite/test/ViteConfig_spec.ts index 9ee0c4f3ab..6abd3959cf 100644 --- a/packages/plugin/vite/test/ViteConfig_spec.ts +++ b/packages/plugin/vite/test/ViteConfig_spec.ts @@ -61,4 +61,23 @@ describe('ViteConfigGenerator', () => { expect(buildConfig1).deep.equal(buildConfig2); }); + + it('derefSymlinks', () => { + const createGeneratorWithConfig = (config: Partial) => { + const _config: VitePluginConfig = { build: [], renderer: [], ...config }; + return new ViteConfigGenerator(_config, configRoot, true); + }; + + const testCases = new Map>([ + [false, {}], + [false, { derefSymlinks: false }], + [true, { derefSymlinks: true }], + ]); + + for (const [expectedResult, config] of testCases) { + const generator = createGeneratorWithConfig(config); + + expect(generator.derefSymlinks).to.eq(expectedResult); + } + }); });