diff --git a/.github/workflows/it-tests.yml b/.github/workflows/it-tests.yml index f8a6beb075..35b1eb92c4 100644 --- a/.github/workflows/it-tests.yml +++ b/.github/workflows/it-tests.yml @@ -51,7 +51,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest] - packageManager: [yarn, npm] + packageManager: [yarn, npm, yarn1] testEnvironment: [o3r-project-with-app] runs-on: ${{ matrix.os }} env: diff --git a/packages/@o3r/create/src/index.ts b/packages/@o3r/create/src/index.ts index 4a44cfef1b..454db6adf2 100644 --- a/packages/@o3r/create/src/index.ts +++ b/packages/@o3r/create/src/index.ts @@ -191,8 +191,7 @@ const addOtterFramework = (relativeDirectory = '.', projectPackageManager = 'npm const runner = process.platform === 'win32' ? `${projectPackageManager}.cmd` : projectPackageManager; const options = schematicsCliOptions .flat(); - - exitProcessIfErrorInSpawnSync(3, spawnSync(runner, ['exec', 'ng', 'add', `@o3r/core@~${version}`, ...(projectPackageManager === 'npm' ? ['--'] : []), ...options], { + exitProcessIfErrorInSpawnSync(3, spawnSync(runner, ['exec', 'ng', 'add', `@o3r/core@~${version}`, '--', ...options], { stdio: 'inherit', cwd })); diff --git a/packages/@o3r/telemetry/src/environment/index.ts b/packages/@o3r/telemetry/src/environment/index.ts index 56ca1b96e3..4369098933 100644 --- a/packages/@o3r/telemetry/src/environment/index.ts +++ b/packages/@o3r/telemetry/src/environment/index.ts @@ -4,14 +4,14 @@ import { execSync } from 'node:child_process'; import * as path from 'node:path'; /** Support NPM package managers */ -type SupportedPackageManagers = 'npm' | 'yarn'; +type SupportedPackageManagers = 'npm' | 'yarn' | 'yarn1'; /** * Determine if the given packager manager is supported * @param name Name of the package manager */ function isSupportedPackageManager(name?: any): name is SupportedPackageManagers { - return name === 'yarn' || name === 'npm'; + return name in ['yarn', 'yarn1', 'npm']; } /** @@ -19,7 +19,7 @@ function isSupportedPackageManager(name?: any): name is SupportedPackageManagers */ function getPackageManager() { if (isSupportedPackageManager(process.env?.ENFORCED_PACKAGE_MANAGER)) { - return process.env.ENFORCED_PACKAGE_MANAGER; + return (process.env.ENFORCED_PACKAGE_MANAGE === 'npm') ? 'npm' : 'yarn'; } return (process.env?.npm_execpath?.includes('yarn') && 'yarn') || 'npm'; } diff --git a/packages/@o3r/test-helpers/src/prepare-test-env.ts b/packages/@o3r/test-helpers/src/prepare-test-env.ts index 854c09d39f..067fa99d40 100644 --- a/packages/@o3r/test-helpers/src/prepare-test-env.ts +++ b/packages/@o3r/test-helpers/src/prepare-test-env.ts @@ -3,7 +3,7 @@ import { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statS import * as path from 'node:path'; import type { PackageJson } from 'type-fest'; import { createTestEnvironmentBlank } from './test-environments/create-test-environment-blank'; -import { createWithLock, getPackageManager, type Logger, packageManagerInstall, setPackagerManagerConfig, setupGit } from './utilities/index'; +import { createWithLock, getVersionedPackageManager, isYarn1, type Logger, packageManagerInstall, setPackagerManagerConfig, setupGit, YARN_1_LATEST_VERSION } from './utilities/index'; import { createTestEnvironmentOtterProjectWithApp } from './test-environments/create-test-environment-otter-project'; import { O3rCliError } from '@o3r/schematics'; @@ -15,8 +15,7 @@ export type PrepareTestEnvType = 'blank' | 'o3r-project-with-app'; /** * Retrieve the version used by yarn and setup at root level - * @param rootFolderPath: path to the folder where to take the configuration from - * @param rootFolderPath + * @param rootFolderPath path to the folder where to take the configuration from */ export function getYarnVersionFromRoot(rootFolderPath: string) { const o3rPackageJson: PackageJson & { generatorDependencies?: Record } = @@ -49,7 +48,7 @@ export async function prepareTestEnv(folderName: string, options?: PrepareTestEn const cacheFolderPath = path.resolve(globalFolderPath, 'cache'); JSON.parse(readFileSync(path.join(rootFolderPath, 'packages', '@o3r', 'core', 'package.json')).toString()); - const yarnVersion: string = yarnVersionParam || getYarnVersionFromRoot(rootFolderPath); + const yarnVersion: string = yarnVersionParam || (isYarn1() && YARN_1_LATEST_VERSION) || getYarnVersionFromRoot(rootFolderPath); const execAppOptions: ExecSyncOptions = { cwd: workspacePath, stdio: 'inherit', @@ -108,7 +107,7 @@ export async function prepareTestEnv(folderName: string, options?: PrepareTestEn let isInWorkspace = false; let untouchedProject: undefined | string; let untouchedProjectPath: undefined | string; - const appDirectory = `${type}-${getPackageManager()}`; + const appDirectory = `${type}-${getVersionedPackageManager()}`; switch (type) { case 'blank': { await createTestEnvironmentBlank({ diff --git a/packages/@o3r/test-helpers/src/utilities/package-manager.ts b/packages/@o3r/test-helpers/src/utilities/package-manager.ts index 02a1d82c90..3fab3fab0b 100644 --- a/packages/@o3r/test-helpers/src/utilities/package-manager.ts +++ b/packages/@o3r/test-helpers/src/utilities/package-manager.ts @@ -30,6 +30,15 @@ const PACKAGE_MANAGERS_CMD = { run: ['yarn', 'run'], workspaceExec: ['yarn', 'workspace'], workspaceRun: ['yarn', 'workspace'] + }, + yarn1: { + add: ['yarn', 'add'], + create: ['yarn', 'create'], + exec: ['yarn'], + install: ['yarn', 'install'], + run: ['yarn', 'run'], + workspaceExec: ['yarn', 'workspace'], + workspaceRun: ['yarn', 'workspace'] } }; @@ -41,14 +50,36 @@ type CommandArguments = { }; /** - * Get the package manager to be used for the tests by reading environment variable ENFORCED_PACKAGE_MANAGER + * Get the package manager with its version to be used for the tests by reading environment variable ENFORCED_PACKAGE_MANAGER + * 'yarn', 'yarn1', 'npm' */ -export function getPackageManager() { +export function getVersionedPackageManager() { return (process.env.ENFORCED_PACKAGE_MANAGER && process.env.ENFORCED_PACKAGE_MANAGER in PACKAGE_MANAGERS_CMD) ? process.env.ENFORCED_PACKAGE_MANAGER as keyof typeof PACKAGE_MANAGERS_CMD : 'yarn'; } +/** + * Get the package manager to be used for the tests based on env ENFORCED_PACKAGE_MANAGER + * 'yarn', 'npm' + */ +export function getPackageManager() { + return getVersionedPackageManager() === 'npm' ? 'npm' : 'yarn'; +} + + +/** + * latest version of yarn 1 + */ +export const YARN_1_LATEST_VERSION = '1.22.19'; + +/** + * is yarn 1 + */ +export function isYarn1() { + return process.env.ENFORCED_PACKAGE_MANAGER === 'yarn1'; +} + /** * Need to add additional dashes when running command like exec on npm * Convert `npm exec test --param` to `npm exec test -- --param` @@ -90,7 +121,7 @@ function execCmd(args: string[], execOptions: ExecSyncOptions) { * @param options */ export function packageManagerAdd(packages: string, options: ExecSyncOptions) { - return execCmd([...PACKAGE_MANAGERS_CMD[getPackageManager()].add, packages], options); + return execCmd([...PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].add, packages], options); } /** @@ -101,7 +132,7 @@ export function packageManagerAdd(packages: string, options: ExecSyncOptions) { */ export function packageManagerCreate(command: CommandArguments, options: ExecSyncOptions, packageManagerOverride?: keyof typeof PACKAGE_MANAGERS_CMD) { const { script, args } = command; - const packageManager = packageManagerOverride || getPackageManager(); + const packageManager = packageManagerOverride || getVersionedPackageManager(); return execCmd([...PACKAGE_MANAGERS_CMD[packageManager].create, script, ...addDashesForNpmCommand(args, packageManager)], options); } @@ -112,7 +143,7 @@ export function packageManagerCreate(command: CommandArguments, options: ExecSyn */ export function packageManagerExec(command: CommandArguments, options: ExecSyncOptions) { const { script, args } = command; - return execCmd([...PACKAGE_MANAGERS_CMD[getPackageManager()].exec, script, ...addDashesForNpmCommand(args)], options); + return execCmd([...PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].exec, script, ...addDashesForNpmCommand(args)], options); } /** @@ -123,7 +154,7 @@ export function packageManagerExec(command: CommandArguments, options: ExecSyncO */ export function packageManagerWorkspaceExec(workspaceProjectName: string, command: CommandArguments, options: ExecSyncOptions) { const { script, args } = command; - return execCmd([...PACKAGE_MANAGERS_CMD[getPackageManager()].workspaceExec, workspaceProjectName, script, ...addDashesForNpmCommand(args)], options); + return execCmd([...PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].workspaceExec, workspaceProjectName, script, ...addDashesForNpmCommand(args)], options); } /** @@ -142,7 +173,7 @@ export function packageManagerExecOnProject(projectName: string, isInWorkspace: * @param options */ export function packageManagerInstall(options: ExecSyncOptions) { - return execCmd(PACKAGE_MANAGERS_CMD[getPackageManager()].install, options); + return execCmd(PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].install, options); } /** @@ -152,7 +183,7 @@ export function packageManagerInstall(options: ExecSyncOptions) { */ export function packageManagerRun(command: CommandArguments, options: ExecSyncOptions) { const { script, args } = command; - return execCmd([...PACKAGE_MANAGERS_CMD[getPackageManager()].run, script, ...addDashesForNpmCommand(args)], options); + return execCmd([...PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].run, script, ...addDashesForNpmCommand(args)], options); } /** @@ -163,7 +194,7 @@ export function packageManagerRun(command: CommandArguments, options: ExecSyncOp */ export function packageManagerWorkspaceRun(workspaceProjectName: string, command: CommandArguments, options: ExecSyncOptions) { const { script, args } = command; - return execCmd([...PACKAGE_MANAGERS_CMD[getPackageManager()].workspaceRun, workspaceProjectName, script, ...addDashesForNpmCommand(args)], options); + return execCmd([...PACKAGE_MANAGERS_CMD[getVersionedPackageManager()].workspaceRun, workspaceProjectName, script, ...addDashesForNpmCommand(args)], options); } /** @@ -209,7 +240,7 @@ export function setPackagerManagerConfig(options: PackageManagerConfig, execAppO const packageJsonPath = join(execOptions.cwd as string, 'package.json'); const shouldCleanPackageJson = !existsSync(packageJsonPath); - switch (getPackageManager()) { + switch (getVersionedPackageManager()) { case 'yarn': { // Set yarn version if (options.yarnVersion) { @@ -231,6 +262,11 @@ export function setPackagerManagerConfig(options: PackageManagerConfig, execAppO execFileSync('yarn', ['config', 'set', 'unsafeHttpWhitelist', '127.0.0.1'], execOptions); break; } + case 'yarn1':{ + if (options.yarnVersion) { + execFileSync('yarn', ['set', 'version', options.yarnVersion], execOptions); + } + } } execFileSync('npm', ['config', 'set', 'audit=false', '-L=project'], execOptions);