fix: fileReplacements should be relative to app root

This commit is contained in:
Igor Randjelovic
2021-03-29 13:59:09 +02:00
parent fd5f4a023f
commit 687bc641a5
2 changed files with 71 additions and 68 deletions

View File

@ -1,92 +1,86 @@
import { getFileReplacementsFromEnv } from '../../src/helpers/fileReplacements' import { getFileReplacementsFromEnv } from '../../src/helpers/fileReplacements';
describe('getFileReplacementsFromEnv', () => { describe('getFileReplacementsFromEnv', () => {
it('handles no replacements', () => { it('handles no replacements', () => {
const res = getFileReplacementsFromEnv({}) const res = getFileReplacementsFromEnv({});
expect(res).toEqual({}) expect(res).toEqual({});
}) });
it('ignores invalid env', () => { it('ignores invalid env', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
// @ts-ignore // @ts-ignore
replace: {} replace: {},
}) });
expect(res).toEqual({}) expect(res).toEqual({});
}) });
it('handles invalid replacements', () => { it('resolves replacements relative to the project root', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
replace: [ replace: './src/foo.ts:./src/bar.ts',
'one', });
'two:', const entries = Object.entries(res);
'three:four' expect(res).toBeDefined();
] expect(entries.length).toBe(1);
}) expect(entries[0]).toEqual(['__jest__/src/foo.ts', '__jest__/src/bar.ts']);
const entries = Object.entries(res) });
expect(res).toBeDefined()
expect(entries.length).toBe(1) it('ignores invalid replacements', () => {
expect(entries[0]).toEqual([ const res = getFileReplacementsFromEnv({
'three', replace: ['one', 'two:', 'three:four'],
'four' });
]) const entries = Object.entries(res);
}) expect(res).toBeDefined();
expect(entries.length).toBe(1);
expect(entries[0]).toEqual(['__jest__/three', '__jest__/four']);
});
it('can parse replacements from a string', () => { it('can parse replacements from a string', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
replace: 'one:two' replace: 'one:two',
}) });
const entries = Object.entries(res) const entries = Object.entries(res);
expect(res).toBeDefined() expect(res).toBeDefined();
expect(entries.length).toBe(1) expect(entries.length).toBe(1);
expect(entries[0]).toEqual([ expect(entries[0]).toEqual(['__jest__/one', '__jest__/two']);
'one', });
'two'
])
})
it('can parse multiple replacements from a string', () => { it('can parse multiple replacements from a string', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
replace: 'one:two,three:four' replace: 'one:two,three:four',
}) });
const entries = Object.entries(res) const entries = Object.entries(res);
expect(res).toBeDefined() expect(res).toBeDefined();
expect(entries.length).toBe(2) expect(entries.length).toBe(2);
expect(entries).toEqual([ expect(entries).toEqual([
['one', 'two'], ['__jest__/one', '__jest__/two'],
['three', 'four'], ['__jest__/three', '__jest__/four'],
]) ]);
}) });
it('can parse replacements from an array', () => { it('can parse replacements from an array', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
replace: [ replace: ['one:two', 'three:four'],
'one:two', });
'three:four' const entries = Object.entries(res);
] expect(res).toBeDefined();
}) expect(entries.length).toBe(2);
const entries = Object.entries(res)
expect(res).toBeDefined()
expect(entries.length).toBe(2)
expect(entries).toEqual([ expect(entries).toEqual([
['one', 'two'], ['__jest__/one', '__jest__/two'],
['three', 'four'], ['__jest__/three', '__jest__/four'],
]) ]);
}) });
it('can parse multiple replacements from an array', () => { it('can parse multiple replacements from an array', () => {
const res = getFileReplacementsFromEnv({ const res = getFileReplacementsFromEnv({
replace: [ replace: ['one:two,three:four', 'five:six'],
'one:two,three:four', });
'five:six' const entries = Object.entries(res);
] expect(res).toBeDefined();
}) expect(entries.length).toBe(3);
const entries = Object.entries(res)
expect(res).toBeDefined()
expect(entries.length).toBe(3)
expect(entries).toEqual([ expect(entries).toEqual([
['one', 'two'], ['__jest__/one', '__jest__/two'],
['three', 'four'], ['__jest__/three', '__jest__/four'],
['five', 'six'], ['__jest__/five', '__jest__/six'],
]) ]);
}) });
}); });

View File

@ -1,5 +1,8 @@
import { resolve } from 'path';
import { env as _env, IWebpackEnv } from '../index'; import { env as _env, IWebpackEnv } from '../index';
import { addCopyRule } from './copyRules'; import { addCopyRule } from './copyRules';
import { getProjectRootPath } from './project';
interface IReplacementMap { interface IReplacementMap {
[_replace: string]: /* _with */ string; [_replace: string]: /* _with */ string;
@ -27,11 +30,17 @@ export function getFileReplacementsFromEnv(
entries.forEach((replaceEntry) => { entries.forEach((replaceEntry) => {
replaceEntry.split(/,\s*/).forEach((r: string) => { replaceEntry.split(/,\s*/).forEach((r: string) => {
const [_replace, _with] = r.split(':'); let [_replace, _with] = r.split(':');
if (!_replace || !_with) { if (!_replace || !_with) {
return; return;
} }
// make sure to resolve replacements to a full path
// relative to the project root
_replace = resolve(getProjectRootPath(), _replace);
_with = resolve(getProjectRootPath(), _with);
fileReplacements[_replace] = _with; fileReplacements[_replace] = _with;
}); });
}); });