diff --git a/src/tools/esbuild/create-federation-tsconfig.spec.ts b/src/tools/esbuild/create-federation-tsconfig.spec.ts index 0b68bc9..b228695 100644 --- a/src/tools/esbuild/create-federation-tsconfig.spec.ts +++ b/src/tools/esbuild/create-federation-tsconfig.spec.ts @@ -1,4 +1,5 @@ import fs from 'fs'; +import path from 'path'; import JSON5 from 'json5'; import { updateFederationTsConfig } from './create-federation-tsconfig.js'; @@ -61,6 +62,22 @@ describe('updateFederationTsConfig', () => { expect(written.include).toEqual(['src/a.ts']); }); + it('normalizes OS-specific backslash separators to forward slashes', () => { + vi.mocked(fs.existsSync).mockReturnValue(true); + vi.mocked(fs.readFileSync).mockReturnValue(JSON5.stringify({ include: [] }) as never); + // Simulate Windows: path.relative returns single-backslash separators. + const relativeSpy = vi + .spyOn(path, 'relative') + .mockReturnValue('..\\libs\\shared\\src\\index.ts'); + + updateFederationTsConfig('/ws', 'tsconfig.fed.json', [entry('/libs/shared/src/index.ts')]); + + const written = JSON.parse(String(vi.mocked(fs.writeFileSync).mock.calls[0]![1])); + expect(written.include).toEqual(['../libs/shared/src/index.ts']); + + relativeSpy.mockRestore(); + }); + it('does not write when the resulting config is unchanged', () => { vi.mocked(fs.existsSync).mockReturnValue(true); vi.mocked(fs.readFileSync).mockReturnValue(JSON5.stringify({ include: ['src/a.ts'] }) as never); diff --git a/src/tools/esbuild/create-federation-tsconfig.ts b/src/tools/esbuild/create-federation-tsconfig.ts index 5cb4eaa..9a59432 100644 --- a/src/tools/esbuild/create-federation-tsconfig.ts +++ b/src/tools/esbuild/create-federation-tsconfig.ts @@ -18,7 +18,7 @@ export function updateFederationTsConfig( const filtered = entryPoints .filter(ep => !ep.fileName.startsWith('.')) - .map(ep => path.relative(tsconfigDir, ep.fileName).replace(/\\\\/g, '/')); + .map(ep => path.relative(tsconfigDir, ep.fileName).replace(/\\/g, '/')); if (filtered.length === 0) { return;