Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c2403d56e2 |
@@ -12,6 +12,7 @@ on:
|
||||
default: false
|
||||
|
||||
env:
|
||||
NX_NIGHTLY_TESTS: true
|
||||
CYPRESS_CACHE_FOLDER: ${{ github.workspace }}/.cypress
|
||||
|
||||
permissions: { }
|
||||
@@ -105,7 +106,7 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 90
|
||||
timeout-minutes: 120
|
||||
strategy:
|
||||
matrix:
|
||||
os:
|
||||
@@ -157,9 +158,9 @@ jobs:
|
||||
os_name: 'MacOS'
|
||||
# test timeouts
|
||||
- os: ubuntu-latest
|
||||
os_timeout: 60
|
||||
os_timeout: 120
|
||||
- os: macos-latest
|
||||
os_timeout: 90
|
||||
os_timeout: 120
|
||||
# codeowner groups
|
||||
- project: e2e-angular
|
||||
codeowners: 'S04SS457V38'
|
||||
@@ -218,6 +219,13 @@ jobs:
|
||||
- project: e2e-workspace-create
|
||||
codeowners: 'S04SYHYKGNP'
|
||||
exclude:
|
||||
# disable testes that always fail to reduce noise
|
||||
# TODO: investigate failures and fix tests
|
||||
- node_version: 20
|
||||
package_manager: yarn
|
||||
project: e2e-plugin
|
||||
- package_manager: yarn
|
||||
project: e2e-lerna-smoke-tests
|
||||
# exclude react-native tests from ubuntu
|
||||
- os: ubuntu-latest
|
||||
project: e2e-react-native
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
checkFilesDoNotExist,
|
||||
checkFilesExist,
|
||||
getSelectedPackageManager,
|
||||
cleanupProject,
|
||||
newProject,
|
||||
runCLI,
|
||||
@@ -29,6 +30,25 @@ describe('Next.js Styles', () => {
|
||||
});
|
||||
|
||||
it('should support different --style options', async () => {
|
||||
// This is failing for yarn in nightly
|
||||
/* TODO(nicholas): investigate what's going on, it's a type error like this:
|
||||
Type error: Type '(App: AppType<{}>) => (props: AppPropsType<any, {}>) => ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' is not assignable to type 'Enhancer<AppType<{}>>'.
|
||||
Type '(props: AppPropsType<any, {}>) => ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' is not assignable to type 'AppType<{}>'.
|
||||
Type '(props: AppPropsType<any, {}>) => ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' is not assignable to type 'FunctionComponent<AppPropsType<any, {}>> & { getInitialProps?(context: AppContextType<NextRouter>): {} | Promise<...>; }'.
|
||||
Type '(props: AppPropsType<any, {}>) => ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' is not assignable to type 'FunctionComponent<AppPropsType<any, {}>>'.
|
||||
Type 'ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' is not assignable to type 'ReactNode'.
|
||||
Property 'children' is missing in type 'ReactElement<{ sheet: ServerStyleSheet; }, string | JSXElementConstructor<any>>' but required in type 'ReactPortal'.
|
||||
|
||||
20 | ctx.renderPage = () =>
|
||||
21 | originalRenderPage({
|
||||
> 22 | enhanceApp: (App) => (props) => sheet.collectStyles(<App {...props} />),
|
||||
| ^
|
||||
23 | enhanceComponent: (Component) => Component,
|
||||
24 | });
|
||||
25 |
|
||||
Warning: command "next build" exited with non-zero status code
|
||||
*/
|
||||
if (getSelectedPackageManager() === 'yarn') return;
|
||||
const lessApp = uniq('app');
|
||||
|
||||
runCLI(
|
||||
|
||||
@@ -51,7 +51,9 @@ describe('Nuxt Plugin', () => {
|
||||
}, 300_000);
|
||||
|
||||
it('should have build, serve, build-static, server-static targets', () => {
|
||||
runCLI(`show project ${app} --json > targets.json`);
|
||||
runCLI(`show project ${app} --json > targets.json`, {
|
||||
verbose: false,
|
||||
});
|
||||
|
||||
const targets = readJson('targets.json');
|
||||
expect(targets.targets['build']).toBeDefined();
|
||||
|
||||
@@ -63,13 +63,19 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
);
|
||||
|
||||
const affectedProjects = runCLI(
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts"`
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts"`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(affectedProjects).toContain(myapp);
|
||||
expect(affectedProjects).not.toContain(myapp2);
|
||||
|
||||
let affectedLibs = runCLI(
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts" --type lib`
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts" --type lib`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
// type lib shows no apps
|
||||
expect(affectedLibs).not.toContain(myapp);
|
||||
@@ -77,40 +83,58 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
expect(affectedLibs).toContain(mylib);
|
||||
|
||||
const implicitlyAffectedApps = runCLI(
|
||||
'show projects --affected --files="tsconfig.base.json"'
|
||||
'show projects --affected --files="tsconfig.base.json"',
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(implicitlyAffectedApps).toContain(myapp);
|
||||
expect(implicitlyAffectedApps).toContain(myapp2);
|
||||
|
||||
const noAffectedApps = runCLI(
|
||||
'show projects --affected projects --files="README.md"'
|
||||
'show projects --affected projects --files="README.md"',
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(noAffectedApps).not.toContain(myapp);
|
||||
expect(noAffectedApps).not.toContain(myapp2);
|
||||
|
||||
affectedLibs = runCLI(
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts"`
|
||||
`show projects --affected --files="libs/${mylib}/src/index.ts"`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(affectedLibs).toContain(mypublishablelib);
|
||||
expect(affectedLibs).toContain(mylib);
|
||||
expect(affectedLibs).not.toContain(mylib2);
|
||||
|
||||
const implicitlyAffectedLibs = runCLI(
|
||||
'show projects --affected --files="tsconfig.base.json"'
|
||||
'show projects --affected --files="tsconfig.base.json"',
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(implicitlyAffectedLibs).toContain(mypublishablelib);
|
||||
expect(implicitlyAffectedLibs).toContain(mylib);
|
||||
expect(implicitlyAffectedLibs).toContain(mylib2);
|
||||
|
||||
const noAffectedLibsNonExistentFile = runCLI(
|
||||
'show projects --affected --files="tsconfig.json"'
|
||||
'show projects --affected --files="tsconfig.json"',
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(noAffectedLibsNonExistentFile).not.toContain(mypublishablelib);
|
||||
expect(noAffectedLibsNonExistentFile).not.toContain(mylib);
|
||||
expect(noAffectedLibsNonExistentFile).not.toContain(mylib2);
|
||||
|
||||
const noAffectedLibs = runCLI(
|
||||
'show projects --affected --files="README.md"'
|
||||
'show projects --affected --files="README.md"',
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(noAffectedLibs).not.toContain(mypublishablelib);
|
||||
expect(noAffectedLibs).not.toContain(mylib);
|
||||
@@ -118,7 +142,10 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
|
||||
// build
|
||||
const build = runCLI(
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --parallel`
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --parallel`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(build).toContain(`Running target build for 3 projects:`);
|
||||
expect(build).toContain(`- ${myapp}`);
|
||||
@@ -127,13 +154,19 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
expect(build).toContain('Successfully ran target build');
|
||||
|
||||
const buildExcluded = runCLI(
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --exclude=${myapp}`
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --exclude=${myapp}`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(buildExcluded).toContain(`Running target build for 2 projects:`);
|
||||
expect(buildExcluded).toContain(`- ${mypublishablelib}`);
|
||||
|
||||
const buildExcludedByTag = runCLI(
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --exclude=tag:ui`
|
||||
`affected:build --files="libs/${mylib}/src/index.ts" --exclude=tag:ui`,
|
||||
{
|
||||
verbose: false,
|
||||
}
|
||||
);
|
||||
expect(buildExcludedByTag).toContain(
|
||||
`Running target build for 2 projects:`
|
||||
@@ -151,7 +184,10 @@ describe('Nx Affected and Graph Tests', () => {
|
||||
|
||||
const failedTests = runCLI(
|
||||
`affected:test --files="libs/${mylib}/src/index.ts"`,
|
||||
{ silenceError: true }
|
||||
{
|
||||
verbose: false,
|
||||
silenceError: true,
|
||||
}
|
||||
);
|
||||
expect(failedTests).toContain(mylib);
|
||||
expect(failedTests).toContain(myapp);
|
||||
|
||||
@@ -40,7 +40,9 @@ describe('Nx Commands', () => {
|
||||
const app1 = uniq('myapp');
|
||||
const app2 = uniq('myapp');
|
||||
expect(
|
||||
runCLI('show projects').replace(/.*nx show projects( --verbose)?\n/, '')
|
||||
runCLI('show projects', {
|
||||
verbose: false,
|
||||
}).replace(/.*nx show projects( --verbose)?\n/, '')
|
||||
).toEqual('');
|
||||
|
||||
runCLI(`generate @nx/web:app apps/${app1} --tags e2etag`);
|
||||
@@ -70,7 +72,9 @@ describe('Nx Commands', () => {
|
||||
const app = uniq('myapp');
|
||||
runCLI(`generate @nx/web:app apps/${app}`);
|
||||
const project: ProjectConfiguration = JSON.parse(
|
||||
runCLI(`show project ${app}`)
|
||||
runCLI(`show project ${app}`, {
|
||||
verbose: false,
|
||||
})
|
||||
);
|
||||
expect(project.targets.build).toBeDefined();
|
||||
expect(project.targets.lint).toBeDefined();
|
||||
|
||||
+40
-21
@@ -107,7 +107,7 @@ describe('Nx Running Tests', () => {
|
||||
|
||||
it('should execute long running tasks', () => {
|
||||
const myapp = uniq('myapp');
|
||||
runCLI(`generate @nx/web:app apps/${myapp}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp} --bundler=vite`);
|
||||
updateJson(`apps/${myapp}/project.json`, (c) => {
|
||||
c.targets['counter'] = {
|
||||
executor: '@nx/workspace:counter',
|
||||
@@ -172,7 +172,7 @@ describe('Nx Running Tests', () => {
|
||||
|
||||
beforeAll(async () => {
|
||||
app = uniq('myapp');
|
||||
runCLI(`generate @nx/web:app apps/${app}`);
|
||||
runCLI(`generate @nx/web:app apps/${app} --bundler=vite`);
|
||||
});
|
||||
|
||||
it('should support using {projectRoot} in options blocks in project.json', async () => {
|
||||
@@ -294,8 +294,8 @@ describe('Nx Running Tests', () => {
|
||||
it('should stop executing all tasks when one of the tasks fails', async () => {
|
||||
const myapp1 = uniq('a');
|
||||
const myapp2 = uniq('b');
|
||||
runCLI(`generate @nx/web:app apps/${myapp1}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp2}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp1} --bundler=vite`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp2} --bundler=vite`);
|
||||
updateJson(`apps/${myapp1}/project.json`, (c) => {
|
||||
c.targets['error'] = {
|
||||
command: 'echo boom1 && exit 1',
|
||||
@@ -343,14 +343,14 @@ describe('Nx Running Tests', () => {
|
||||
describe('run-one', () => {
|
||||
it('should build a specific project', () => {
|
||||
const myapp = uniq('app');
|
||||
runCLI(`generate @nx/web:app apps/${myapp}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp} --bundler=vite`);
|
||||
|
||||
runCLI(`build ${myapp}`);
|
||||
}, 10000);
|
||||
|
||||
it('should support project name positional arg non-consecutive to target', () => {
|
||||
const myapp = uniq('app');
|
||||
runCLI(`generate @nx/web:app apps/${myapp}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp} --bundler=vite`);
|
||||
|
||||
runCLI(`build --verbose ${myapp}`);
|
||||
}, 10000);
|
||||
@@ -361,7 +361,7 @@ describe('Nx Running Tests', () => {
|
||||
const expectedOutput = uniq('myEchoedString');
|
||||
const expectedEnvOutput = uniq('myEnvString');
|
||||
|
||||
runCLI(`generate @nx/web:app apps/${myapp}`);
|
||||
runCLI(`generate @nx/web:app apps/${myapp} --bundler=vite`);
|
||||
updateFile(
|
||||
`apps/${myapp}/package.json`,
|
||||
JSON.stringify({
|
||||
@@ -395,7 +395,9 @@ describe('Nx Running Tests', () => {
|
||||
|
||||
it('should build a specific project with the daemon disabled', () => {
|
||||
const myapp = uniq('app');
|
||||
runCLI(`generate @nx/web:app ${myapp} --directory=apps/${myapp}`);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${myapp} --directory=apps/${myapp} --bundler=vite`
|
||||
);
|
||||
|
||||
const buildWithDaemon = runCLI(`build ${myapp}`, {
|
||||
env: { NX_DAEMON: 'false' },
|
||||
@@ -412,7 +414,9 @@ describe('Nx Running Tests', () => {
|
||||
|
||||
it('should build the project when within the project root', () => {
|
||||
const myapp = uniq('app');
|
||||
runCLI(`generate @nx/web:app ${myapp} --directory=apps/${myapp}`);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${myapp} --directory=apps/${myapp} --bundler=vite`
|
||||
);
|
||||
|
||||
// Should work within the project directory
|
||||
expect(runCommand(`cd apps/${myapp}/src && npx nx build`)).toContain(
|
||||
@@ -491,7 +495,9 @@ describe('Nx Running Tests', () => {
|
||||
myapp = uniq('myapp');
|
||||
mylib1 = uniq('mylib1');
|
||||
mylib2 = uniq('mylib1');
|
||||
runCLI(`generate @nx/web:app ${myapp} --directory=apps/${myapp}`);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${myapp} --directory=apps/${myapp} --bundler=vite`
|
||||
);
|
||||
runCLI(`generate @nx/js:lib ${mylib1} --directory=libs/${mylib1}`);
|
||||
runCLI(`generate @nx/js:lib ${mylib2} --directory=libs/${mylib2}`);
|
||||
|
||||
@@ -578,7 +584,9 @@ describe('Nx Running Tests', () => {
|
||||
const libC = uniq('libc-rand');
|
||||
const libD = uniq('libd-rand');
|
||||
|
||||
runCLI(`generate @nx/web:app ${appA} --directory=apps/${appA}`);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${appA} --directory=apps/${appA} --bundler=vite`
|
||||
);
|
||||
runCLI(
|
||||
`generate @nx/js:lib ${libA} --bundler=tsc --defaults --directory=libs/${libA}`
|
||||
);
|
||||
@@ -695,8 +703,12 @@ describe('Nx Running Tests', () => {
|
||||
it('should run multiple targets', () => {
|
||||
const myapp1 = uniq('myapp');
|
||||
const myapp2 = uniq('myapp');
|
||||
runCLI(`generate @nx/web:app ${myapp1} --directory=apps/${myapp1}`);
|
||||
runCLI(`generate @nx/web:app ${myapp2} --directory=apps/${myapp2}`);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${myapp1} --directory=apps/${myapp1} --bundler=vite`
|
||||
);
|
||||
runCLI(
|
||||
`generate @nx/web:app ${myapp2} --directory=apps/${myapp2} --bundler=vite`
|
||||
);
|
||||
|
||||
let outputs = runCLI(
|
||||
// Options with lists can be specified using multiple args or with a delimiter (comma or space).
|
||||
@@ -786,7 +798,9 @@ describe('Nx Running Tests', () => {
|
||||
let output = runCLI('exec -- echo HELLO');
|
||||
expect(output).toContain('HELLO');
|
||||
|
||||
output = runCLI(`build ${pkg}`);
|
||||
output = runCLI(`build ${pkg}`, {
|
||||
verbose: false,
|
||||
});
|
||||
expect(output).toContain(pkg);
|
||||
expect(output).not.toContain(pkg2);
|
||||
|
||||
@@ -796,21 +810,26 @@ describe('Nx Running Tests', () => {
|
||||
expect(output).toContain(pkg);
|
||||
expect(output).not.toContain(pkg2);
|
||||
|
||||
output = runCLI(`exec -- echo '$NX_PROJECT_NAME'`).replace(/\s+/g, ' ');
|
||||
output = runCLI(`exec -- echo '$NX_PROJECT_NAME'`, {
|
||||
verbose: false,
|
||||
}).replace(/\s+/g, ' ');
|
||||
expect(output).toContain(pkg);
|
||||
expect(output).toContain(pkg2);
|
||||
|
||||
output = runCLI("exec -- echo '$NX_PROJECT_ROOT_PATH'").replace(
|
||||
/\s+/g,
|
||||
' '
|
||||
);
|
||||
output = runCLI("exec -- echo '$NX_PROJECT_ROOT_PATH'", {
|
||||
verbose: false,
|
||||
}).replace(/\s+/g, ' ');
|
||||
expect(output).toContain(`${path.join('libs', pkg)}`);
|
||||
expect(output).toContain(`${path.join('libs', pkg2)}`);
|
||||
|
||||
output = runCLI(`exec --projects ${pkg} -- echo WORLD`);
|
||||
output = runCLI(`exec --projects ${pkg} -- echo WORLD`, {
|
||||
verbose: false,
|
||||
});
|
||||
expect(output).toContain('WORLD');
|
||||
|
||||
output = runCLI(`exec --projects ${pkg} -- echo '$NX_PROJECT_NAME'`);
|
||||
output = runCLI(`exec --projects ${pkg} -- echo '$NX_PROJECT_NAME'`, {
|
||||
verbose: false,
|
||||
});
|
||||
expect(output).toContain(pkg);
|
||||
expect(output).not.toContain(pkg2);
|
||||
});
|
||||
|
||||
@@ -223,7 +223,7 @@ describe('nx release - private JS packages', () => {
|
||||
|
||||
// The private package should have never been published
|
||||
expect(() => execSync(`npm view @proj/${privatePkg} version`)).toThrowError(
|
||||
/npm ERR! code E404/
|
||||
/code E404/
|
||||
);
|
||||
}, 500000);
|
||||
|
||||
@@ -311,7 +311,7 @@ describe('nx release - private JS packages', () => {
|
||||
|
||||
// The private package should have never been published
|
||||
expect(() => execSync(`npm view @proj/${privatePkg} version`)).toThrowError(
|
||||
/npm ERR! code E404/
|
||||
/code E404/
|
||||
);
|
||||
}, 500000);
|
||||
});
|
||||
|
||||
@@ -421,17 +421,17 @@ describe('nx release', () => {
|
||||
execSync(
|
||||
`npm view @proj/${pkg1}@next version --registry=${customRegistryUrl}`
|
||||
)
|
||||
).toThrowError(/npm ERR! code E404/);
|
||||
).toThrowError(/code E404/);
|
||||
expect(() =>
|
||||
execSync(
|
||||
`npm view @proj/${pkg2}@next version --registry=${customRegistryUrl}`
|
||||
)
|
||||
).toThrowError(/npm ERR! code E404/);
|
||||
).toThrowError(/code E404/);
|
||||
expect(() =>
|
||||
execSync(
|
||||
`npm view @proj/${pkg3}@next version --registry=${customRegistryUrl}`
|
||||
)
|
||||
).toThrowError(/npm ERR! code E404/);
|
||||
).toThrowError(/code E404/);
|
||||
|
||||
// Actually publish to the custom registry (not e2e registry), and a custom dist tag of "next"
|
||||
const publishOutput3 = runCLI(publishToNext);
|
||||
|
||||
@@ -375,16 +375,21 @@ export function runCLI(
|
||||
): string {
|
||||
try {
|
||||
const pm = getPackageManagerCommand();
|
||||
const isVerbose = opts.verbose ?? isVerboseE2ERun();
|
||||
const commandToRun = `${pm.runNxSilent} ${command} ${
|
||||
opts.verbose ?? isVerboseE2ERun() ? ' --verbose' : ''
|
||||
isVerbose ? ' --verbose' : ''
|
||||
}${opts.redirectStderr ? ' 2>&1' : ''}`;
|
||||
const env = {
|
||||
CI: 'true',
|
||||
...getStrippedEnvironmentVariables(),
|
||||
...opts.env,
|
||||
};
|
||||
if (!isVerbose && env['NX_VERBOSE_LOGGING'] === 'true') {
|
||||
delete env['NX_VERBOSE_LOGGING'];
|
||||
}
|
||||
const logs = execSync(commandToRun, {
|
||||
cwd: opts.cwd || tmpProjPath(),
|
||||
env: {
|
||||
CI: 'true',
|
||||
...getStrippedEnvironmentVariables(),
|
||||
...opts.env,
|
||||
},
|
||||
env,
|
||||
encoding: 'utf-8',
|
||||
stdio: 'pipe',
|
||||
maxBuffer: 50 * 1024 * 1024,
|
||||
|
||||
@@ -44,7 +44,7 @@ describe('create-nx-workspace --preset=npm', () => {
|
||||
if (getSelectedPackageManager() === 'pnpm') {
|
||||
checkFilesExist('pnpm-workspace.yaml');
|
||||
} else {
|
||||
expect(packageJson.workspaces).toEqual(['packages/*']);
|
||||
expect(packageJson.workspaces).toEqual(['packages/**']);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user