feat(devkit): reexport package manager methods in devkit

This commit is contained in:
Phillip Barta 2021-06-17 11:43:16 +02:00 committed by Jason Jean
parent 632d2f72ae
commit 5e6cf9646b
13 changed files with 200 additions and 119 deletions

View File

@ -60,9 +60,11 @@
- [applyChangesToString](../../angular/nx-devkit/index#applychangestostring)
- [convertNxExecutor](../../angular/nx-devkit/index#convertnxexecutor)
- [convertNxGenerator](../../angular/nx-devkit/index#convertnxgenerator)
- [detectPackageManager](../../angular/nx-devkit/index#detectpackagemanager)
- [formatFiles](../../angular/nx-devkit/index#formatfiles)
- [generateFiles](../../angular/nx-devkit/index#generatefiles)
- [getPackageManagerCommand](../../angular/nx-devkit/index#getpackagemanagercommand)
- [getPackageManagerVersion](../../angular/nx-devkit/index#getpackagemanagerversion)
- [getProjects](../../angular/nx-devkit/index#getprojects)
- [getWorkspaceLayout](../../angular/nx-devkit/index#getworkspacelayout)
- [getWorkspacePath](../../angular/nx-devkit/index#getworkspacepath)
@ -578,6 +580,22 @@ Convert an Nx Generator into an Angular Devkit Schematic
---
### detectPackageManager
**detectPackageManager**(`dir?`: _string_): [_PackageManager_](../../angular/nx-devkit/index#packagemanager)
Detects which package manager is used in the workspace based on the lock file.
#### Parameters
| Name | Type | Default value |
| :---- | :------- | :------------ |
| `dir` | _string_ | '' |
**Returns:** [_PackageManager_](../../angular/nx-devkit/index#packagemanager)
---
### formatFiles
**formatFiles**(`host`: [_Tree_](../../angular/nx-devkit/index#tree)): _Promise_<void\>
@ -635,7 +653,7 @@ doesn't get confused about incorrect TypeScript files.
### getPackageManagerCommand
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../angular/nx-devkit/index#packagemanager)): _object_
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../angular/nx-devkit/index#packagemanager)): PackageManagerCommands
Returns commands for the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
@ -653,17 +671,25 @@ execSync(`${getPackageManagerCommand().addDev} my-dev-package`);
| :--------------- | :--------------------------------------------------------------- |
| `packageManager` | [_PackageManager_](../../angular/nx-devkit/index#packagemanager) |
**Returns:** _object_
**Returns:** PackageManagerCommands
---
### getPackageManagerVersion
**getPackageManagerVersion**(`packageManager?`: [_PackageManager_](../../angular/nx-devkit/index#packagemanager)): _string_
Returns the version of the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
but it can also be passed in explicitly.
#### Parameters
| Name | Type |
| :-------- | :------------------------------------------------- |
| `add` | _string_ |
| `addDev` | _string_ |
| `exec` | _string_ |
| `install` | _string_ |
| `list` | _string_ |
| `rm` | _string_ |
| `run` | (`script`: _string_, `args`: _string_) => _string_ |
| :--------------- | :--------------------------------------------------------------- |
| `packageManager` | [_PackageManager_](../../angular/nx-devkit/index#packagemanager) |
**Returns:** _string_
---

View File

@ -60,9 +60,11 @@
- [applyChangesToString](../../node/nx-devkit/index#applychangestostring)
- [convertNxExecutor](../../node/nx-devkit/index#convertnxexecutor)
- [convertNxGenerator](../../node/nx-devkit/index#convertnxgenerator)
- [detectPackageManager](../../node/nx-devkit/index#detectpackagemanager)
- [formatFiles](../../node/nx-devkit/index#formatfiles)
- [generateFiles](../../node/nx-devkit/index#generatefiles)
- [getPackageManagerCommand](../../node/nx-devkit/index#getpackagemanagercommand)
- [getPackageManagerVersion](../../node/nx-devkit/index#getpackagemanagerversion)
- [getProjects](../../node/nx-devkit/index#getprojects)
- [getWorkspaceLayout](../../node/nx-devkit/index#getworkspacelayout)
- [getWorkspacePath](../../node/nx-devkit/index#getworkspacepath)
@ -578,6 +580,22 @@ Convert an Nx Generator into an Angular Devkit Schematic
---
### detectPackageManager
**detectPackageManager**(`dir?`: _string_): [_PackageManager_](../../node/nx-devkit/index#packagemanager)
Detects which package manager is used in the workspace based on the lock file.
#### Parameters
| Name | Type | Default value |
| :---- | :------- | :------------ |
| `dir` | _string_ | '' |
**Returns:** [_PackageManager_](../../node/nx-devkit/index#packagemanager)
---
### formatFiles
**formatFiles**(`host`: [_Tree_](../../node/nx-devkit/index#tree)): _Promise_<void\>
@ -635,7 +653,7 @@ doesn't get confused about incorrect TypeScript files.
### getPackageManagerCommand
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../node/nx-devkit/index#packagemanager)): _object_
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../node/nx-devkit/index#packagemanager)): PackageManagerCommands
Returns commands for the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
@ -653,17 +671,25 @@ execSync(`${getPackageManagerCommand().addDev} my-dev-package`);
| :--------------- | :------------------------------------------------------------ |
| `packageManager` | [_PackageManager_](../../node/nx-devkit/index#packagemanager) |
**Returns:** _object_
**Returns:** PackageManagerCommands
---
### getPackageManagerVersion
**getPackageManagerVersion**(`packageManager?`: [_PackageManager_](../../node/nx-devkit/index#packagemanager)): _string_
Returns the version of the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
but it can also be passed in explicitly.
#### Parameters
| Name | Type |
| :-------- | :------------------------------------------------- |
| `add` | _string_ |
| `addDev` | _string_ |
| `exec` | _string_ |
| `install` | _string_ |
| `list` | _string_ |
| `rm` | _string_ |
| `run` | (`script`: _string_, `args`: _string_) => _string_ |
| :--------------- | :------------------------------------------------------------ |
| `packageManager` | [_PackageManager_](../../node/nx-devkit/index#packagemanager) |
**Returns:** _string_
---

View File

@ -60,9 +60,11 @@
- [applyChangesToString](../../react/nx-devkit/index#applychangestostring)
- [convertNxExecutor](../../react/nx-devkit/index#convertnxexecutor)
- [convertNxGenerator](../../react/nx-devkit/index#convertnxgenerator)
- [detectPackageManager](../../react/nx-devkit/index#detectpackagemanager)
- [formatFiles](../../react/nx-devkit/index#formatfiles)
- [generateFiles](../../react/nx-devkit/index#generatefiles)
- [getPackageManagerCommand](../../react/nx-devkit/index#getpackagemanagercommand)
- [getPackageManagerVersion](../../react/nx-devkit/index#getpackagemanagerversion)
- [getProjects](../../react/nx-devkit/index#getprojects)
- [getWorkspaceLayout](../../react/nx-devkit/index#getworkspacelayout)
- [getWorkspacePath](../../react/nx-devkit/index#getworkspacepath)
@ -578,6 +580,22 @@ Convert an Nx Generator into an Angular Devkit Schematic
---
### detectPackageManager
**detectPackageManager**(`dir?`: _string_): [_PackageManager_](../../react/nx-devkit/index#packagemanager)
Detects which package manager is used in the workspace based on the lock file.
#### Parameters
| Name | Type | Default value |
| :---- | :------- | :------------ |
| `dir` | _string_ | '' |
**Returns:** [_PackageManager_](../../react/nx-devkit/index#packagemanager)
---
### formatFiles
**formatFiles**(`host`: [_Tree_](../../react/nx-devkit/index#tree)): _Promise_<void\>
@ -635,7 +653,7 @@ doesn't get confused about incorrect TypeScript files.
### getPackageManagerCommand
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../react/nx-devkit/index#packagemanager)): _object_
**getPackageManagerCommand**(`packageManager?`: [_PackageManager_](../../react/nx-devkit/index#packagemanager)): PackageManagerCommands
Returns commands for the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
@ -653,17 +671,25 @@ execSync(`${getPackageManagerCommand().addDev} my-dev-package`);
| :--------------- | :------------------------------------------------------------- |
| `packageManager` | [_PackageManager_](../../react/nx-devkit/index#packagemanager) |
**Returns:** _object_
**Returns:** PackageManagerCommands
---
### getPackageManagerVersion
**getPackageManagerVersion**(`packageManager?`: [_PackageManager_](../../react/nx-devkit/index#packagemanager)): _string_
Returns the version of the package manager used in the workspace.
By default, the package manager is derived based on the lock file,
but it can also be passed in explicitly.
#### Parameters
| Name | Type |
| :-------- | :------------------------------------------------- |
| `add` | _string_ |
| `addDev` | _string_ |
| `exec` | _string_ |
| `install` | _string_ |
| `list` | _string_ |
| `rm` | _string_ |
| `run` | (`script`: _string_, `args`: _string_) => _string_ |
| :--------------- | :------------------------------------------------------------- |
| `packageManager` | [_PackageManager_](../../react/nx-devkit/index#packagemanager) |
**Returns:** _string_
---

View File

@ -20,7 +20,11 @@ export type {
} from '@nrwl/tao/src/shared/nx';
export { logger } from '@nrwl/tao/src/shared/logger';
export type { PackageManager } from '@nrwl/tao/src/shared/package-manager';
export { getPackageManagerCommand } from '@nrwl/tao/src/shared/package-manager';
export {
getPackageManagerCommand,
detectPackageManager,
getPackageManagerVersion,
} from '@nrwl/tao/src/shared/package-manager';
export type { Target } from '@nrwl/tao/src/commands/run';
export { runExecutor } from '@nrwl/tao/src/commands/run';

View File

@ -6,11 +6,7 @@ import { gt, lte } from 'semver';
import { dirSync } from 'tmp';
import { logger } from '../shared/logger';
import { convertToCamelCase, handleErrors } from '../shared/params';
import {
detectPackageManager,
getPackageManagerCommand,
PackageManager,
} from '../shared/package-manager';
import { getPackageManagerCommand } from '../shared/package-manager';
import { FsTree } from '../shared/tree';
import { flushChanges } from './generate';
import {
@ -424,7 +420,7 @@ function versions(root: string, from: { [p: string]: string }) {
}
// testing-fetch-start
function createFetcher(packageManager: PackageManager) {
function createFetcher() {
const cache = {};
return async function f(
packageName: string,
@ -433,7 +429,7 @@ function createFetcher(packageManager: PackageManager) {
if (!cache[`${packageName}-${packageVersion}`]) {
const dir = dirSync().name;
logger.info(`Fetching ${packageName}@${packageVersion}`);
const pmc = getPackageManagerCommand(packageManager);
const pmc = getPackageManagerCommand();
execSync(`${pmc.add} ${packageName}@${packageVersion}`, {
stdio: [],
cwd: dir,
@ -539,14 +535,13 @@ async function generateMigrationsJsonAndUpdatePackageJson(
to: { [p: string]: string };
}
) {
const packageManager = detectPackageManager();
const pmc = getPackageManagerCommand(packageManager);
const pmc = getPackageManagerCommand();
try {
logger.info(`Fetching meta data about packages.`);
logger.info(`It may take a few minutes.`);
const migrator = new Migrator({
versions: versions(root, opts.from),
fetch: createFetcher(packageManager),
fetch: createFetcher(),
from: opts.from,
to: opts.to,
});
@ -611,7 +606,7 @@ function installAngularDevkitIfNecessaryToExecuteLegacyMigrations(
);
if (!hasAngularDevkitMigrations) return false;
const pmCommands = getPackageManagerCommand(detectPackageManager());
const pmCommands = getPackageManagerCommand();
const devkitInstalled =
execSync(`${pmCommands.list} @angular-devkit/schematics`)
.toString()
@ -630,13 +625,13 @@ function installAngularDevkitIfNecessaryToExecuteLegacyMigrations(
}
function removeAngularDevkitMigrations() {
const pmCommands = getPackageManagerCommand(detectPackageManager());
const pmCommands = getPackageManagerCommand();
execSync(`${pmCommands.rm} @angular-devkit/schematics`);
execSync(`${pmCommands.rm} @angular-devkit/core`);
}
function runInstall() {
const pmCommands = getPackageManagerCommand(detectPackageManager());
const pmCommands = getPackageManagerCommand();
logger.info(
`NX Running '${pmCommands.install}' to make sure necessary packages are installed`
);

View File

@ -22,7 +22,7 @@ import {
toNewFormatOrNull,
toOldFormatOrNull,
workspaceConfigName,
} from '@nrwl/tao/src/shared/workspace';
} from '../shared/workspace';
import { dirname, extname, resolve, join } from 'path';
import { FileBuffer } from '@angular-devkit/core/src/virtual-fs/host/interface';
import { EMPTY, Observable, of, concat } from 'rxjs';

View File

@ -4,6 +4,19 @@ import { join } from 'path';
export type PackageManager = 'yarn' | 'pnpm' | 'npm';
export interface PackageManagerCommands {
install: string;
add: string;
addDev: string;
rm: string;
exec: string;
list: string;
run: (script: string, args: string) => string;
}
/**
* Detects which package manager is used in the workspace based on the lock file.
*/
export function detectPackageManager(dir: string = ''): PackageManager {
return existsSync(join(dir, 'yarn.lock'))
? 'yarn'
@ -22,22 +35,12 @@ export function detectPackageManager(dir: string = ''): PackageManager {
* ```javascript
* execSync(`${getPackageManagerCommand().addDev} my-dev-package`);
* ```
*
*/
export function getPackageManagerCommand(
packageManager: PackageManager = detectPackageManager()
): {
install: string;
add: string;
addDev: string;
rm: string;
exec: string;
list: string;
run: (script: string, args: string) => string;
} {
switch (packageManager) {
case 'yarn':
return {
): PackageManagerCommands {
const commands: { [pm in PackageManager]: () => PackageManagerCommands } = {
yarn: () => ({
install: 'yarn',
add: 'yarn add',
addDev: 'yarn add -D',
@ -45,10 +48,8 @@ export function getPackageManagerCommand(
exec: 'yarn',
run: (script: string, args: string) => `yarn ${script} ${args}`,
list: 'yarn list',
};
case 'pnpm':
return {
}),
pnpm: () => ({
install: 'pnpm install --no-frozen-lockfile', // explicitly disable in case of CI
add: 'pnpm add',
addDev: 'pnpm add -D',
@ -56,11 +57,10 @@ export function getPackageManagerCommand(
exec: 'pnpx',
run: (script: string, args: string) => `pnpm run ${script} -- ${args}`,
list: 'pnpm ls --depth 100',
};
}),
npm: () => {
process.env.npm_config_legacy_peer_deps ??= 'true';
case 'npm':
process.env.npm_config_legacy_peer_deps =
process.env.npm_config_legacy_peer_deps ?? 'true';
return {
install: 'npm install',
add: 'npm install',
@ -70,11 +70,19 @@ export function getPackageManagerCommand(
run: (script: string, args: string) => `npm run ${script} -- ${args}`,
list: 'npm ls',
};
}
},
};
return commands[packageManager]();
}
/**
* Returns the version of the package manager used in the workspace.
* By default, the package manager is derived based on the lock file,
* but it can also be passed in explicitly.
*/
export function getPackageManagerVersion(
packageManager: PackageManager
packageManager: PackageManager = detectPackageManager()
): string {
return execSync(`${packageManager} --version`).toString('utf-8').trim();
}

View File

@ -1,6 +1,6 @@
import { readNxJson } from '../core/file-utils';
import { output } from '../utilities/output';
import { getPackageManagerCommand } from '@nrwl/tao/src/shared/package-manager';
import { getPackageManagerCommand } from '@nrwl/devkit';
import { execSync } from 'child_process';
export async function connectToNxCloudUsingScan(scan: boolean): Promise<void> {

View File

@ -1,8 +1,7 @@
import { execSync } from 'child_process';
import { getPackageManagerCommand } from '@nrwl/tao/src/shared/package-manager';
import { getPackageManagerCommand, writeJsonFile } from '@nrwl/devkit';
import * as yargs from 'yargs';
import { nxVersion } from '../utils/versions';
import { writeFileSync } from 'fs';
import * as path from 'path';
const noop = (yargs: yargs.Argv): yargs.Argv => yargs;
@ -445,9 +444,7 @@ function taoPath() {
const { dirSync } = require('tmp');
const tmpDir = dirSync().name;
writeFileSync(
path.join(tmpDir, 'package.json'),
JSON.stringify({
writeJsonFile(path.join(tmpDir, 'package.json'), {
dependencies: {
'@nrwl/tao': 'latest',
@ -457,8 +454,7 @@ function taoPath() {
'@angular-devkit/core': 'latest',
},
license: 'MIT',
})
);
});
execSync(packageManager.install, {
cwd: tmpDir,

View File

@ -1,9 +1,11 @@
import * as chalk from 'chalk';
import { execSync } from 'child_process';
import { appRootPath } from '../utilities/app-root';
import { detectPackageManager } from '@nrwl/tao/src/shared/package-manager';
import {
detectPackageManager,
getPackageManagerVersion,
readJsonFile,
} from '@nrwl/devkit';
import { output } from '../utilities/output';
import { readJsonFile } from '../utilities/fileutils';
export const packagesWeCareAbout = [
'nx',
@ -45,7 +47,7 @@ export const report = {
*/
function reportHandler() {
const pm = detectPackageManager();
const pmVersion = execSync(`${pm} --version`).toString('utf-8').trim();
const pmVersion = getPackageManagerVersion(pm);
const bodyLines = [
`Node : ${process.versions.node}`,

View File

@ -5,19 +5,18 @@ import { copySync, removeSync } from 'fs-extra';
import * as path from 'path';
import * as yargsParser from 'yargs-parser';
import { appRootPath } from '../utilities/app-root';
import {
detectPackageManager,
getPackageManagerCommand,
} from '@nrwl/tao/src/shared/package-manager';
import {
fileExists,
readJsonFile,
writeJsonFile,
} from '../utilities/fileutils';
import { fileExists } from '../utilities/fileutils';
import { output } from '../utilities/output';
import type { CompilerOptions } from 'typescript';
import { Workspaces } from '@nrwl/tao/src/shared/workspace';
import { logger, normalizePath } from '@nrwl/devkit';
import {
logger,
normalizePath,
getPackageManagerCommand,
detectPackageManager,
readJsonFile,
writeJsonFile,
} from '@nrwl/devkit';
import { generate } from '@nrwl/tao/src/commands/generate';
const rootDirectory = appRootPath;

View File

@ -1,6 +1,6 @@
import { execSync } from 'child_process';
import { getPackageManagerCommand } from '@nrwl/tao/src/shared/package-manager';
import { ExecutorContext } from '@nrwl/devkit';
import { getPackageManagerCommand } from '@nrwl/devkit';
import type { ExecutorContext } from '@nrwl/devkit';
import * as path from 'path';
export interface RunScriptOptions {

View File

@ -1,7 +1,6 @@
import * as chalk from 'chalk';
import { getPackageManagerCommand } from '@nrwl/tao/src/shared/package-manager';
import { getPackageManagerCommand, readJsonFile } from '@nrwl/devkit';
import { appRootPath } from '../app-root';
import { readJsonFile } from '../fileutils';
import { output } from '../output';
import type { PluginCapabilities } from './models';
import { hasElements } from './shared';