feat(core): include community plugins when running nx report
This commit is contained in:
parent
3cc17d7566
commit
91967a37a7
122
packages/workspace/src/command-line/report.spec.ts
Normal file
122
packages/workspace/src/command-line/report.spec.ts
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import { findInstalledCommunityPlugins } from './report';
|
||||||
|
import * as devkit from '@nrwl/devkit';
|
||||||
|
import * as fileUtils from '../utilities/fileutils';
|
||||||
|
import { join } from 'path';
|
||||||
|
|
||||||
|
jest.mock('@nrwl/tao/src/utils/app-root', () => ({
|
||||||
|
appRootPath: '',
|
||||||
|
}));
|
||||||
|
|
||||||
|
jest.mock('../utilities/fileutils', () => ({
|
||||||
|
...(jest.requireActual('../utilities/fileutils') as typeof fileUtils),
|
||||||
|
resolve: (file) => `node_modules/${file}`,
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('report', () => {
|
||||||
|
describe('findInstalledCommunityPlugins', () => {
|
||||||
|
afterEach(() => jest.resetAllMocks());
|
||||||
|
|
||||||
|
it('should read angular-devkit plugins', () => {
|
||||||
|
jest.spyOn(devkit, 'readJsonFile').mockImplementation((path) => {
|
||||||
|
console.log(path);
|
||||||
|
if (path === 'package.json') {
|
||||||
|
return {
|
||||||
|
dependencies: {
|
||||||
|
'plugin-one': '1.0.0',
|
||||||
|
},
|
||||||
|
devDependencies: {
|
||||||
|
'plugin-two': '2.0.0',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-one', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
'ng-update': {},
|
||||||
|
version: '1.0.0',
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-two', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
schematics: {},
|
||||||
|
version: '2.0.0',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const plugins = findInstalledCommunityPlugins();
|
||||||
|
expect(plugins).toEqual([
|
||||||
|
{ package: 'plugin-one', version: '1.0.0' },
|
||||||
|
{ package: 'plugin-two', version: '2.0.0' },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should read nx devkit plugins', () => {
|
||||||
|
jest.spyOn(devkit, 'readJsonFile').mockImplementation((path) => {
|
||||||
|
if (path === 'package.json') {
|
||||||
|
return {
|
||||||
|
dependencies: {
|
||||||
|
'plugin-one': '1.0.0',
|
||||||
|
},
|
||||||
|
devDependencies: {
|
||||||
|
'plugin-two': '2.0.0',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-one', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
'nx-migrations': {},
|
||||||
|
version: '1.0.0',
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-two', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
generators: {},
|
||||||
|
version: '2.0.0',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const plugins = findInstalledCommunityPlugins();
|
||||||
|
expect(plugins).toEqual([
|
||||||
|
{ package: 'plugin-one', version: '1.0.0' },
|
||||||
|
{ package: 'plugin-two', version: '2.0.0' },
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not include non-plugins', () => {
|
||||||
|
jest.spyOn(devkit, 'readJsonFile').mockImplementation((path) => {
|
||||||
|
if (path === 'package.json') {
|
||||||
|
return {
|
||||||
|
dependencies: {
|
||||||
|
'plugin-one': '1.0.0',
|
||||||
|
},
|
||||||
|
devDependencies: {
|
||||||
|
'plugin-two': '2.0.0',
|
||||||
|
'other-package': '1.44.0',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-one', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
'nx-migrations': {},
|
||||||
|
};
|
||||||
|
} else if (
|
||||||
|
path.includes(join('node_modules', 'plugin-two', 'package.json'))
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
generators: {},
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
version: '',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const plugins = findInstalledCommunityPlugins().map((x) => x.package);
|
||||||
|
expect(plugins).not.toContain('other-package');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -6,6 +6,8 @@ import {
|
|||||||
readJsonFile,
|
readJsonFile,
|
||||||
} from '@nrwl/devkit';
|
} from '@nrwl/devkit';
|
||||||
import { output } from '../utilities/output';
|
import { output } from '../utilities/output';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { resolve } from '../utilities/fileutils';
|
||||||
|
|
||||||
export const packagesWeCareAbout = [
|
export const packagesWeCareAbout = [
|
||||||
'nx',
|
'nx',
|
||||||
@ -22,6 +24,7 @@ export const packagesWeCareAbout = [
|
|||||||
'@nrwl/node',
|
'@nrwl/node',
|
||||||
'@nrwl/nx-cloud',
|
'@nrwl/nx-cloud',
|
||||||
'@nrwl/react',
|
'@nrwl/react',
|
||||||
|
'@nrwl/react-native',
|
||||||
'@nrwl/schematics',
|
'@nrwl/schematics',
|
||||||
'@nrwl/tao',
|
'@nrwl/tao',
|
||||||
'@nrwl/web',
|
'@nrwl/web',
|
||||||
@ -29,8 +32,15 @@ export const packagesWeCareAbout = [
|
|||||||
'@nrwl/storybook',
|
'@nrwl/storybook',
|
||||||
'@nrwl/gatsby',
|
'@nrwl/gatsby',
|
||||||
'typescript',
|
'typescript',
|
||||||
|
'rxjs',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
export const packagesWeIgnoreInCommunityReport = new Set([
|
||||||
|
...packagesWeCareAbout,
|
||||||
|
'@schematics/angular',
|
||||||
|
'@nestjs/schematics',
|
||||||
|
]);
|
||||||
|
|
||||||
export const report = {
|
export const report = {
|
||||||
command: 'report',
|
command: 'report',
|
||||||
describe: 'Reports useful version numbers to copy into the Nx issue template',
|
describe: 'Reports useful version numbers to copy into the Nx issue template',
|
||||||
@ -58,14 +68,15 @@ function reportHandler() {
|
|||||||
];
|
];
|
||||||
|
|
||||||
packagesWeCareAbout.forEach((p) => {
|
packagesWeCareAbout.forEach((p) => {
|
||||||
let status = 'Not Found';
|
bodyLines.push(`${chalk.green(p)} : ${chalk.bold(readPackageVersion(p))}`);
|
||||||
try {
|
|
||||||
const packageJsonPath = require.resolve(`${p}/package.json`, {
|
|
||||||
paths: [appRootPath],
|
|
||||||
});
|
});
|
||||||
status = readJsonFile(packageJsonPath).version;
|
|
||||||
} catch {}
|
bodyLines.push('---------------------------------------');
|
||||||
bodyLines.push(`${chalk.green(p)} : ${chalk.bold(status)}`);
|
|
||||||
|
const communityPlugins = findInstalledCommunityPlugins();
|
||||||
|
bodyLines.push('Community plugins:');
|
||||||
|
communityPlugins.forEach((p) => {
|
||||||
|
bodyLines.push(`\t ${chalk.green(p.package)}: ${chalk.bold(p.version)}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
output.log({
|
output.log({
|
||||||
@ -73,3 +84,65 @@ function reportHandler() {
|
|||||||
bodyLines,
|
bodyLines,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function readPackageJson(p: string) {
|
||||||
|
try {
|
||||||
|
const packageJsonPath = resolve(`${p}/package.json`, {
|
||||||
|
paths: [appRootPath],
|
||||||
|
});
|
||||||
|
return readJsonFile(packageJsonPath);
|
||||||
|
} catch {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function readPackageVersion(p: string) {
|
||||||
|
let status = 'Not Found';
|
||||||
|
try {
|
||||||
|
status = readPackageJson(p).version;
|
||||||
|
} catch {}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function findInstalledCommunityPlugins(): {
|
||||||
|
package: string;
|
||||||
|
version: string;
|
||||||
|
}[] {
|
||||||
|
const { dependencies, devDependencies } = readJsonFile(
|
||||||
|
join(appRootPath, 'package.json')
|
||||||
|
);
|
||||||
|
const deps = [
|
||||||
|
Object.keys(dependencies || {}),
|
||||||
|
Object.keys(devDependencies || {}),
|
||||||
|
].flat();
|
||||||
|
|
||||||
|
return deps.reduce(
|
||||||
|
(arr: any[], nextDep: string): { project: string; version: string }[] => {
|
||||||
|
if (packagesWeIgnoreInCommunityReport.has(nextDep)) {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const depPackageJson = readPackageJson(nextDep);
|
||||||
|
if (
|
||||||
|
[
|
||||||
|
'ng-update',
|
||||||
|
'nx-migrations',
|
||||||
|
'schematics',
|
||||||
|
'generators',
|
||||||
|
'builders',
|
||||||
|
'executors',
|
||||||
|
].some((field) => field in depPackageJson)
|
||||||
|
) {
|
||||||
|
arr.push({ package: nextDep, version: depPackageJson.version });
|
||||||
|
return arr;
|
||||||
|
} else {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
console.warn(`Error parsing packageJson for ${nextDep}`);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import {
|
|||||||
renameSync as fsRenameSync,
|
renameSync as fsRenameSync,
|
||||||
} from 'fs';
|
} from 'fs';
|
||||||
import { ensureDirSync } from 'fs-extra';
|
import { ensureDirSync } from 'fs-extra';
|
||||||
import { basename, dirname, resolve } from 'path';
|
import { basename, dirname, resolve as pathResolve } from 'path';
|
||||||
import {
|
import {
|
||||||
parseJson,
|
parseJson,
|
||||||
serializeJson,
|
serializeJson,
|
||||||
@ -40,7 +40,7 @@ export function updateJsonFile(path: string, callback: (a: any) => any) {
|
|||||||
export function copyFile(file: string, target: string) {
|
export function copyFile(file: string, target: string) {
|
||||||
const f = basename(file);
|
const f = basename(file);
|
||||||
const source = createReadStream(file);
|
const source = createReadStream(file);
|
||||||
const dest = createWriteStream(resolve(target, f));
|
const dest = createWriteStream(pathResolve(target, f));
|
||||||
source.pipe(dest);
|
source.pipe(dest);
|
||||||
source.on('error', (e) => console.error(e));
|
source.on('error', (e) => console.error(e));
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ export function fileExists(filePath: string): boolean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createDirectory(directoryPath: string) {
|
export function createDirectory(directoryPath: string) {
|
||||||
const parentPath = resolve(directoryPath, '..');
|
const parentPath = pathResolve(directoryPath, '..');
|
||||||
if (!directoryExists(parentPath)) {
|
if (!directoryExists(parentPath)) {
|
||||||
createDirectory(parentPath);
|
createDirectory(parentPath);
|
||||||
}
|
}
|
||||||
@ -84,7 +84,7 @@ export function renameSync(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make sure parent path exists
|
// Make sure parent path exists
|
||||||
const parentPath = resolve(to, '..');
|
const parentPath = pathResolve(to, '..');
|
||||||
createDirectory(parentPath);
|
createDirectory(parentPath);
|
||||||
|
|
||||||
fsRenameSync(from, to);
|
fsRenameSync(from, to);
|
||||||
@ -102,3 +102,5 @@ export function isRelativePath(path: string): boolean {
|
|||||||
path.startsWith('../')
|
path.startsWith('../')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const resolve = require.resolve;
|
||||||
|
|||||||
@ -29,6 +29,7 @@ function check() {
|
|||||||
'packages/create-nx-workspace/bin/create-nx-workspace.ts',
|
'packages/create-nx-workspace/bin/create-nx-workspace.ts',
|
||||||
'packages/create-nx-plugin/bin/create-nx-plugin.ts',
|
'packages/create-nx-plugin/bin/create-nx-plugin.ts',
|
||||||
'packages/workspace/src/command-line/affected.ts',
|
'packages/workspace/src/command-line/affected.ts',
|
||||||
|
'packages/workspace/src/command-line/report.ts',
|
||||||
'packages/workspace/src/core/file-utils.ts',
|
'packages/workspace/src/core/file-utils.ts',
|
||||||
'packages/workspace/src/generators/preset/preset.ts',
|
'packages/workspace/src/generators/preset/preset.ts',
|
||||||
'packages/workspace/src/generators/init/init.ts',
|
'packages/workspace/src/generators/init/init.ts',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user