diff --git a/packages/angular/cli/lib/config/workspace-schema.json b/packages/angular/cli/lib/config/workspace-schema.json index f73424b5b554..323e127e64ae 100644 --- a/packages/angular/cli/lib/config/workspace-schema.json +++ b/packages/angular/cli/lib/config/workspace-schema.json @@ -47,7 +47,7 @@ "packageManager": { "description": "Specify which package manager tool to use.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"] + "enum": ["npm", "yarn", "pnpm", "bun", "nub"] }, "warnings": { "description": "Control CLI specific console warnings", @@ -101,7 +101,7 @@ "packageManager": { "description": "Specify which package manager tool to use.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"] + "enum": ["npm", "yarn", "pnpm", "bun", "nub"] }, "warnings": { "description": "Control CLI specific console warnings", diff --git a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts index cad01202462d..83863413f721 100644 --- a/packages/angular/cli/src/package-managers/package-manager-descriptor.ts +++ b/packages/angular/cli/src/package-managers/package-manager-descriptor.ts @@ -281,6 +281,37 @@ export const SUPPORTED_PACKAGE_MANAGERS = { }, isNotFound: isKnownNotFound, }, + nub: { + // nub is pnpm-CLI-compatible, so its descriptor mirrors pnpm's aside from + // the binary name and the pnpm-v9-format lockfile it writes (`nub.lock`). + binary: 'nub', + lockfiles: ['nub.lock'], + addCommand: 'add', + installCommand: ['install'], + forceFlag: '--force', + saveExactFlag: '--save-exact', + saveTildeFlag: '--save-tilde', + saveDevFlag: '--save-dev', + noLockfileFlag: '--no-lockfile', + ignoreScriptsFlag: '--ignore-scripts', + ignorePeerDependenciesFlag: '--strict-peer-dependencies=false', + configFiles: ['.npmrc'], + getRegistryOptions: (registry: string) => ({ args: ['--registry', registry] }), + versionCommand: ['--version'], + listDependenciesCommand: ['list', '--depth=0', '--json'], + getReleaseAgeConfigCommand: ['config', 'get', 'minimum-release-age'], + getPackageNameCommand: ['pkg', 'get', 'name'], + getManifestCommand: ['view', '--json'], + viewCommandFieldArgFormatter: (fields) => [...fields], + outputParsers: { + listDependencies: parseNpmLikeDependencies, + getRegistryManifest: parseNpmLikeManifest, + getRegistryMetadata: parseNpmLikeMetadata, + getError: parseNpmLikeError, + getReleaseAge: parsePnpmReleaseAge, + }, + isNotFound: isKnownNotFound, + }, bun: { binary: 'bun', lockfiles: ['bun.lockb', 'bun.lock'], @@ -346,6 +377,7 @@ export const SUPPORTED_PACKAGE_MANAGERS = { */ export const PACKAGE_MANAGER_PRECEDENCE: readonly PackageManagerName[] = [ 'pnpm', + 'nub', 'yarn', 'bun', 'npm', diff --git a/packages/angular/create/src/index.ts b/packages/angular/create/src/index.ts index 5e225fd1b1ca..646d44ae34d7 100644 --- a/packages/angular/create/src/index.ts +++ b/packages/angular/create/src/index.ts @@ -17,7 +17,7 @@ const hasPackageManagerArg = args.some((a) => a.startsWith('--package-manager')) if (!hasPackageManagerArg) { // Ex: yarn/1.22.18 npm/? node/v16.15.1 linux x64 const packageManager = process.env['npm_config_user_agent']?.split('/')[0]; - if (packageManager && ['npm', 'pnpm', 'yarn', 'bun'].includes(packageManager)) { + if (packageManager && ['npm', 'pnpm', 'yarn', 'bun', 'nub'].includes(packageManager)) { args.push('--package-manager', packageManager); } } diff --git a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts index dc97a4e78277..c687c9d3929d 100644 --- a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts +++ b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts @@ -45,6 +45,12 @@ const packageManagers: { [name: string]: PackageManagerProfile } = { installPackage: 'install', }, }, + 'nub': { + commands: { + installAll: 'install', + installPackage: 'add', + }, + }, }; export class UnknownPackageManagerException extends BaseException { diff --git a/packages/angular_devkit/schematics_cli/blank/schema.json b/packages/angular_devkit/schematics_cli/blank/schema.json index 9ab174efd482..3a98dfe86878 100644 --- a/packages/angular_devkit/schematics_cli/blank/schema.json +++ b/packages/angular_devkit/schematics_cli/blank/schema.json @@ -15,7 +15,7 @@ "packageManager": { "description": "The package manager used to install dependencies.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"], + "enum": ["npm", "yarn", "pnpm", "bun", "nub"], "default": "npm" }, "author": { diff --git a/packages/angular_devkit/schematics_cli/schematic/schema.json b/packages/angular_devkit/schematics_cli/schematic/schema.json index 4780529c9311..5857caf3d86f 100644 --- a/packages/angular_devkit/schematics_cli/schematic/schema.json +++ b/packages/angular_devkit/schematics_cli/schematic/schema.json @@ -15,7 +15,7 @@ "packageManager": { "description": "The package manager used to install dependencies.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"], + "enum": ["npm", "yarn", "pnpm", "bun", "nub"], "default": "npm" } }, diff --git a/packages/schematics/angular/ng-new/schema.json b/packages/schematics/angular/ng-new/schema.json index 257628fcda9e..8eb9fc5bff49 100644 --- a/packages/schematics/angular/ng-new/schema.json +++ b/packages/schematics/angular/ng-new/schema.json @@ -132,7 +132,7 @@ "packageManager": { "description": "The package manager used to install dependencies.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"] + "enum": ["npm", "yarn", "pnpm", "bun", "nub"] }, "standalone": { "description": "Creates an application based upon the standalone API, without NgModules.", diff --git a/packages/schematics/angular/workspace/schema.json b/packages/schematics/angular/workspace/schema.json index 51ec1a22e889..39485f7d6168 100644 --- a/packages/schematics/angular/workspace/schema.json +++ b/packages/schematics/angular/workspace/schema.json @@ -40,7 +40,7 @@ "packageManager": { "description": "The package manager to use for installing dependencies.", "type": "string", - "enum": ["npm", "yarn", "pnpm", "bun"], + "enum": ["npm", "yarn", "pnpm", "bun", "nub"], "$default": { "$source": "packageManager" }