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

View File

@ -1,5 +1,8 @@
import { resolve } from 'path';
import { env as _env, IWebpackEnv } from '../index';
import { addCopyRule } from './copyRules';
import { getProjectRootPath } from './project';
interface IReplacementMap {
[_replace: string]: /* _with */ string;
@ -27,11 +30,17 @@ export function getFileReplacementsFromEnv(
entries.forEach((replaceEntry) => {
replaceEntry.split(/,\s*/).forEach((r: string) => {
const [_replace, _with] = r.split(':');
let [_replace, _with] = r.split(':');
if (!_replace || !_with) {
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;
});
});