nx/e2e/js/src/js-inlining.test.ts

152 lines
5.1 KiB
TypeScript

import {
checkFilesExist,
cleanupProject,
newProject,
readFile,
runCLI,
uniq,
updateFile,
} from '@nx/e2e/utils';
import { execSync } from 'child_process';
describe('inlining', () => {
let scope: string;
beforeEach(() => {
scope = newProject();
});
afterEach(() => cleanupProject());
it.each(['tsc', 'swc'])(
'should inline libraries with --bundler=%s',
async (bundler) => {
const parent = uniq('parent');
runCLI(
`generate @nx/js:lib ${parent} --bundler=${bundler} --no-interactive`
);
const buildable = uniq('buildable');
runCLI(
`generate @nx/js:lib ${buildable} --bundler=${bundler} --no-interactive`
);
const buildableTwo = uniq('buildabletwo');
runCLI(
`generate @nx/js:lib ${buildableTwo} --bundler=${bundler} --no-interactive`
);
const nonBuildable = uniq('nonbuildable');
runCLI(
`generate @nx/js:lib ${nonBuildable} --bundler=none --no-interactive`
);
updateFile(`libs/${parent}/src/lib/${parent}.ts`, () => {
return `
import { ${buildable} } from '@${scope}/${buildable}';
import { ${buildableTwo} } from '@${scope}/${buildableTwo}';
import { ${nonBuildable} } from '@${scope}/${nonBuildable}';
export function ${parent}() {
${buildable}();
${buildableTwo}();
${nonBuildable}();
}
`;
});
// 1. external is set to all
execSync(`rm -rf dist`);
runCLI(`build ${parent} --external=all`);
checkFilesExist(
`dist/libs/${buildable}/src/index.js`, // buildable
`dist/libs/${buildableTwo}/src/index.js`, // buildable two
`dist/libs/${parent}/src/index.js`, // parent
`dist/libs/${parent}/${nonBuildable}/src/index.js` // inlined non buildable
);
// non-buildable lib import path is modified to relative path
let fileContent = readFile(`dist/libs/${parent}/src/lib/${parent}.js`);
expect(fileContent).toContain(`${nonBuildable}/src`);
// 2. external is set to none
execSync(`rm -rf dist`);
runCLI(`build ${parent} --external=none`);
checkFilesExist(
`dist/libs/${parent}/src/index.js`, // parent
`dist/libs/${parent}/${buildable}/src/index.js`, // inlined buildable
`dist/libs/${parent}/${buildableTwo}/src/index.js`, // inlined buildable two
`dist/libs/${parent}/${nonBuildable}/src/index.js` // inlined non buildable
);
fileContent = readFile(`dist/libs/${parent}/src/lib/${parent}.js`);
expect(fileContent).toContain(`${nonBuildable}/src`);
expect(fileContent).toContain(`${buildable}/src`);
expect(fileContent).toContain(`${buildableTwo}/src`);
// 3. external is set to an array of libs
execSync(`rm -rf dist`);
runCLI(`build ${parent} --external=${buildable}`);
checkFilesExist(
`dist/libs/${buildable}/src/index.js`, // buildable
`dist/libs/${buildableTwo}/src/index.js`, // buildable two original output should be persisted
`dist/libs/${parent}/src/index.js`, // parent
`dist/libs/${parent}/${buildableTwo}/src/index.js`, // inlined buildable two
`dist/libs/${parent}/${nonBuildable}/src/index.js` // inlined non buildable
);
fileContent = readFile(`dist/libs/${parent}/src/lib/${parent}.js`);
expect(fileContent).toContain(`${nonBuildable}/src`);
expect(fileContent).toContain(`${buildableTwo}/src`);
expect(fileContent).not.toContain(`${buildable}/src`);
},
240_000
);
it('should inline nesting libraries', async () => {
const parent = uniq('parent');
runCLI(`generate @nx/js:lib ${parent} --no-interactive`);
const child = uniq('child');
runCLI(`generate @nx/js:lib ${child} --bundler=none --no-interactive`);
const grandChild = uniq('grandchild');
runCLI(`generate @nx/js:lib ${grandChild} --bundler=none --no-interactive`);
updateFile(`libs/${parent}/src/lib/${parent}.ts`, () => {
return `
import { ${child} } from '@${scope}/${child}';
export function ${parent}() {
${child}();
}
`;
});
updateFile(`libs/${child}/src/lib/${child}.ts`, () => {
return `
import { ${grandChild} } from '@${scope}/${grandChild}';
export function ${child}() {
${grandChild}();
}
`;
});
runCLI(`build ${parent} --external=all`);
checkFilesExist(
`dist/libs/${parent}/src/index.js`, // parent
`dist/libs/${parent}/${child}/src/index.js`, // inlined child
`dist/libs/${parent}/${grandChild}/src/index.js` // inlined grand child
);
// non-buildable lib import path is modified to relative path
const parentFileContent = readFile(
`dist/libs/${parent}/src/lib/${parent}.js`
);
expect(parentFileContent).toContain(`${child}/src`);
expect(parentFileContent).not.toContain(`${grandChild}/src`);
const childFileContent = readFile(
`dist/libs/${parent}/${child}/src/lib/${child}.js`
);
expect(childFileContent).toContain(`${grandChild}/src`);
}, 240_000);
});