-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(js): add e2e test to check built package.json (#13981)
- Loading branch information
Showing
5 changed files
with
495 additions
and
382 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); |
Oops, something went wrong.