Skip to content

Commit

Permalink
chore(js): add e2e test to check built package.json (#13981)
Browse files Browse the repository at this point in the history
  • Loading branch information
jaysoo authored Dec 22, 2022
1 parent 4a43a04 commit 8f267ed
Show file tree
Hide file tree
Showing 5 changed files with 495 additions and 382 deletions.
33 changes: 33 additions & 0 deletions e2e/js/src/js-bundling.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import {
checkFilesExist,
cleanupProject,
newProject,
runCLI,
uniq,
} from '@nrwl/e2e/utils';

describe('bundling libs', () => {
let scope: string;

beforeEach(() => {
scope = newProject();
});

afterEach(() => cleanupProject());

it('should support esbuild and vite bundlers for building libs', () => {
const esbuildLib = uniq('esbuildlib');
const viteLib = uniq('vitelib');

runCLI(
`generate @nrwl/js:lib ${esbuildLib} --bundler=esbuild --no-interactive`
);
runCLI(`generate @nrwl/js:lib ${viteLib} --bundler=vite --no-interactive`);

runCLI(`build ${esbuildLib}`);
runCLI(`build ${viteLib}`);

checkFilesExist(`dist/libs/${esbuildLib}/index.js`);
checkFilesExist(`dist/libs/${viteLib}/index.js`);
}, 240_000);
});
149 changes: 149 additions & 0 deletions e2e/js/src/js-inlining.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import {
checkFilesExist,
cleanupProject,
newProject,
readFile,
runCLI,
uniq,
updateFile,
} from '@nrwl/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 --compiler=%s',
async (compiler) => {
const parent = uniq('parent');
runCLI(
`generate @nrwl/js:lib ${parent} --compiler=${compiler} --no-interactive`
);

const buildable = uniq('buildable');
runCLI(`generate @nrwl/js:lib ${buildable} --no-interactive`);

const buildableTwo = uniq('buildabletwo');
runCLI(`generate @nrwl/js:lib ${buildableTwo} --no-interactive`);

const nonBuildable = uniq('nonbuildable');
runCLI(
`generate @nrwl/js:lib ${nonBuildable} --buildable=false --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 @nrwl/js:lib ${parent} --no-interactive`);

const child = uniq('child');
runCLI(`generate @nrwl/js:lib ${child} --buildable=false --no-interactive`);

const grandChild = uniq('grandchild');
runCLI(
`generate @nrwl/js:lib ${grandChild} --buildable=false --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);
});
108 changes: 108 additions & 0 deletions e2e/js/src/js-swc.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import { satisfies } from 'semver';
import {
checkFilesDoNotExist,
checkFilesExist,
cleanupProject,
newProject,
readJson,
runCLI,
runCLIAsync,
uniq,
updateFile,
updateJson,
} from '../../utils';

describe('js e2e', () => {
let scope: string;

beforeEach(() => {
scope = newProject();
});

afterEach(() => cleanupProject());

it('should create libs with js executors (--compiler=swc)', async () => {
const lib = uniq('lib');
runCLI(
`generate @nrwl/js:lib ${lib} --buildable --compiler=swc --no-interactive`
);
const libPackageJson = readJson(`libs/${lib}/package.json`);
expect(libPackageJson.scripts).toBeUndefined();

expect(runCLI(`build ${lib}`)).toContain(
'Successfully compiled: 2 files with swc'
);
checkFilesExist(
`dist/libs/${lib}/package.json`,
`dist/libs/${lib}/src/index.js`,
`dist/libs/${lib}/src/lib/${lib}.js`,
`dist/libs/${lib}/src/index.d.ts`,
`dist/libs/${lib}/src/lib/${lib}.d.ts`
);

checkFilesDoNotExist(`libs/${lib}/.babelrc`);

const parentLib = uniq('parentlib');
runCLI(
`generate @nrwl/js:lib ${parentLib} --buildable --compiler=swc --no-interactive`
);
const parentLibPackageJson = readJson(`libs/${parentLib}/package.json`);
expect(parentLibPackageJson.scripts).toBeUndefined();
expect((await runCLIAsync(`test ${parentLib}`)).combinedOutput).toContain(
'Ran all test suites'
);

expect(runCLI(`build ${parentLib}`)).toContain(
'Successfully compiled: 2 files with swc'
);
checkFilesExist(
`dist/libs/${parentLib}/package.json`,
`dist/libs/${parentLib}/src/index.js`,
`dist/libs/${parentLib}/src/lib/${parentLib}.js`,
`dist/libs/${parentLib}/src/index.d.ts`,
`dist/libs/${parentLib}/src/lib/${parentLib}.d.ts`
);

const tsconfig = readJson(`tsconfig.base.json`);
expect(tsconfig.compilerOptions.paths).toEqual({
[`@${scope}/${lib}`]: [`libs/${lib}/src/index.ts`],
[`@${scope}/${parentLib}`]: [`libs/${parentLib}/src/index.ts`],
});

updateFile(`libs/${parentLib}/src/index.ts`, () => {
return `
import { ${lib} } from '@${scope}/${lib}';
export * from './lib/${parentLib}';
`;
});

const output = runCLI(`build ${parentLib}`);
expect(output).toContain('1 task it depends on');
expect(output).toContain('Successfully compiled: 2 files with swc');

updateJson(`libs/${lib}/.lib.swcrc`, (json) => {
json.jsc.externalHelpers = true;
return json;
});

runCLI(`build ${lib}`);

const swcHelpersFromRoot =
readJson(`package.json`).dependencies['@swc/helpers'];
const swcHelpersFromDist = readJson(`dist/libs/${lib}/package.json`)
.peerDependencies['@swc/helpers'];

expect(satisfies(swcHelpersFromDist, swcHelpersFromRoot)).toBeTruthy();

updateJson(`libs/${lib}/.lib.swcrc`, (json) => {
json.jsc.externalHelpers = false;
return json;
});

runCLI(`build ${lib}`);

expect(readJson(`dist/libs/${lib}/package.json`)).not.toHaveProperty(
'peerDependencies.@swc/helpers'
);
}, 240_000);
});
Loading

0 comments on commit 8f267ed

Please sign in to comment.