diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index faeefa80cbd7..fa5c68042cc0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,7 +162,7 @@ jobs: matrix: os: [ubuntu-latest] node: [22] - subset: [yarn, pnpm, bun] + subset: [yarn, pnpm, bun, deno] shard: [0, 1, 2] runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 91d2a7c5a24d..022ddc730518 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -180,7 +180,7 @@ jobs: matrix: os: [ubuntu-latest] node: [22] - subset: [yarn, pnpm, bun] + subset: [yarn, pnpm, bun, deno] shard: [0, 1, 2] runs-on: ${{ matrix.os }} steps: diff --git a/packages/angular/cli/lib/config/workspace-schema.json b/packages/angular/cli/lib/config/workspace-schema.json index 3fede1746559..dde97e1ead8f 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", "deno"] }, "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", "deno"] }, "warnings": { "description": "Control CLI specific console warnings", diff --git a/packages/angular/cli/src/commands/update/schematic/schema.json b/packages/angular/cli/src/commands/update/schematic/schema.json index 4768df46f2d5..97a5e67a7654 100644 --- a/packages/angular/cli/src/commands/update/schematic/schema.json +++ b/packages/angular/cli/src/commands/update/schematic/schema.json @@ -57,7 +57,7 @@ "description": "The preferred package manager configuration files to use for registry settings.", "type": "string", "default": "npm", - "enum": ["npm", "yarn", "pnpm", "bun"] + "enum": ["npm", "yarn", "pnpm", "bun", "deno"] } }, "required": [] diff --git a/packages/angular/cli/src/utilities/package-manager.ts b/packages/angular/cli/src/utilities/package-manager.ts index b913a3bfd72d..b92caf4f4453 100644 --- a/packages/angular/cli/src/utilities/package-manager.ts +++ b/packages/angular/cli/src/utilities/package-manager.ts @@ -23,6 +23,7 @@ const LOCKFILE_NAMES: Readonly 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', 'deno'].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..46dd3869bcc9 100644 --- a/packages/angular_devkit/schematics/tasks/package-manager/executor.ts +++ b/packages/angular_devkit/schematics/tasks/package-manager/executor.ts @@ -39,6 +39,12 @@ const packageManagers: { [name: string]: PackageManagerProfile } = { installPackage: 'add', }, }, + 'deno': { + commands: { + installAll: 'install', + installPackage: 'add', + }, + }, 'pnpm': { commands: { installAll: 'install', diff --git a/packages/angular_devkit/schematics_cli/blank/schema.json b/packages/angular_devkit/schematics_cli/blank/schema.json index 9ab174efd482..1abbb50e5163 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", "deno"], "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..d893c4513d1f 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", "deno"], "default": "npm" } }, diff --git a/packages/schematics/angular/ng-new/schema.json b/packages/schematics/angular/ng-new/schema.json index 3bbb0eb3dee4..e725d6977f4e 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", "deno"] }, "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..c1bdb6639b3a 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", "deno"], "$default": { "$source": "packageManager" } diff --git a/tests/legacy-cli/e2e.bzl b/tests/legacy-cli/e2e.bzl index 62a89ee6a76f..8eed08a93a14 100644 --- a/tests/legacy-cli/e2e.bzl +++ b/tests/legacy-cli/e2e.bzl @@ -85,6 +85,7 @@ def e2e_suites(name, runner, data): _e2e_suite(name, runner, "npm", data, toolchain_name, toolchain) _e2e_suite(name, runner, "bun", data, toolchain_name, toolchain) + _e2e_suite(name, runner, "deno", data, toolchain_name, toolchain) _e2e_suite(name, runner, "pnpm", data, toolchain_name, toolchain) _e2e_suite(name, runner, "yarn", data, toolchain_name, toolchain) _e2e_suite(name, runner, "esbuild", data, toolchain_name, toolchain) @@ -140,7 +141,7 @@ def _e2e_tests(name, runner, toolchain, **kwargs): def _e2e_suite(name, runner, type, data, toolchain_name = "", toolchain = None): """ - Setup a predefined test suite (yarn|pnpm|bun|esbuild|saucelabs|npm). + Setup a predefined test suite (yarn|pnpm|bun|deno|esbuild|saucelabs|npm). """ args = [] tests = None @@ -149,7 +150,7 @@ def _e2e_suite(name, runner, type, data, toolchain_name = "", toolchain = None): if toolchain_name: toolchain_name = "_" + toolchain_name - if type == "yarn" or type == "bun" or type == "pnpm": + if type == "yarn" or type == "bun" or type == "deno" or type == "pnpm": args.append("--package-manager=%s" % type) args.append("--esbuild") tests = PACKAGE_MANAGER_SUBSET_TESTS diff --git a/tests/legacy-cli/e2e/setup/100-global-cli.ts b/tests/legacy-cli/e2e/setup/100-global-cli.ts index 9f587fa5c38d..38015aa81f6a 100644 --- a/tests/legacy-cli/e2e/setup/100-global-cli.ts +++ b/tests/legacy-cli/e2e/setup/100-global-cli.ts @@ -7,6 +7,7 @@ const PACKAGE_MANAGER_VERSION = { 'yarn': '1.22.22', 'pnpm': '10.17.1', 'bun': '1.3.2', + 'deno': '2.5.6', }; export default async function () { diff --git a/tests/legacy-cli/e2e/tests/misc/create-angular.ts b/tests/legacy-cli/e2e/tests/misc/create-angular.ts index acbdf135359b..047d532a9a49 100644 --- a/tests/legacy-cli/e2e/tests/misc/create-angular.ts +++ b/tests/legacy-cli/e2e/tests/misc/create-angular.ts @@ -2,7 +2,7 @@ import { equal } from 'node:assert'; import { join, resolve } from 'node:path'; import { expectFileToExist, readFile, rimraf } from '../../utils/fs'; import { getActivePackageManager } from '../../utils/packages'; -import { silentBun, silentNpm, silentPnpm, silentYarn } from '../../utils/process'; +import { silentBun, silentDeno, silentNpm, silentPnpm, silentYarn } from '../../utils/process'; export default async function () { const currentDirectory = process.cwd(); @@ -25,6 +25,10 @@ export default async function () { case 'bun': await silentBun('create', '@angular', projectName, '--style=scss'); + break; + case 'deno': + await silentDeno('init', '--npm', '@angular', projectName, '--style=scss'); + break; case 'pnpm': await silentPnpm('create', '@angular', projectName, '--style=scss'); diff --git a/tests/legacy-cli/e2e/utils/packages.ts b/tests/legacy-cli/e2e/utils/packages.ts index 087d771f14b8..8c977170fd68 100644 --- a/tests/legacy-cli/e2e/utils/packages.ts +++ b/tests/legacy-cli/e2e/utils/packages.ts @@ -1,5 +1,5 @@ import { getGlobalVariable } from './env'; -import { ProcessOutput, silentBun, silentNpm, silentPnpm, silentYarn } from './process'; +import { ProcessOutput, silentBun, silentDeno, silentNpm, silentPnpm, silentYarn } from './process'; export interface PkgInfo { readonly name: string; @@ -7,7 +7,7 @@ export interface PkgInfo { readonly path: string; } -export function getActivePackageManager(): 'npm' | 'yarn' | 'bun' | 'pnpm' { +export function getActivePackageManager(): 'npm' | 'yarn' | 'bun' | 'deno' | 'pnpm' { return getGlobalVariable('package-manager'); } @@ -29,6 +29,9 @@ export async function installWorkspacePackages(options?: { force?: boolean }): P case 'bun': await silentBun('install'); break; + case 'deno': + await silentDeno('install'); + break; } } @@ -41,6 +44,8 @@ export function installPackage(specifier: string, registry?: string): Promise { case 'bun': await silentBun('remove', name); break; + case 'deno': + await silentDeno('remove', name); + break; case 'pnpm': await silentPnpm('remove', name); break; diff --git a/tests/legacy-cli/e2e/utils/process.ts b/tests/legacy-cli/e2e/utils/process.ts index cb542ff1ea0f..44a77138542e 100644 --- a/tests/legacy-cli/e2e/utils/process.ts +++ b/tests/legacy-cli/e2e/utils/process.ts @@ -393,6 +393,10 @@ export function silentBun(...args: string[]) { return _exec({ silent: true }, 'bun', args); } +export function silentDeno(...args: string[]) { + return _exec({ silent: true }, 'deno', args); +} + export function globalNpm(args: string[], env?: NodeJS.ProcessEnv) { if (!process.env.LEGACY_CLI_RUNNER) { throw new Error(