diff --git a/scripts/schedjs-npm-oidc-setup.ps1 b/scripts/schedjs-npm-oidc-setup.ps1 index e8daabb..ba337f7 100644 --- a/scripts/schedjs-npm-oidc-setup.ps1 +++ b/scripts/schedjs-npm-oidc-setup.ps1 @@ -21,7 +21,7 @@ [CmdletBinding()] param( - [ValidateSet('github', 'npm', 'verify')] + [ValidateSet('github', 'login', 'npm', 'verify', 'all')] [string]$Phase = 'github', [string]$Repo = 'schedjs/schedjs', @@ -79,6 +79,17 @@ function Phase-GitHub { Say "OK: environment готов (секреты не нужны — OIDC)" } +function Ensure-WebLogin { + $npmrc = Join-Path $env:USERPROFILE '.npmrc' + $content = if (Test-Path $npmrc) { Get-Content $npmrc -Raw } else { '' } + if ($content -notmatch 'registry\.npmjs\.org/:_authToken=npm_') { Say '== .npmrc: automation-токена нет — логин уже web-сессия (или токен иной формы)'; return } + Say '== .npmrc: automation-токен npm_… — для trust нужна web-сессия. Откроется браузер, введи код 2FA.' + $old = $ErrorActionPreference; $ErrorActionPreference = 'Continue' + try { & npm login --auth-type=web } finally { $ErrorActionPreference = $old } + if ($LASTEXITCODE -ne 0) { Fail "npm login завершился с кодом $LASTEXITCODE — повтори вручную: npm login --auth-type=web" } + Say ' логин ок' +} + function Assert-NpmAuth { $npmver = (Invoke-Npm @('-v')).Text.Trim() Say "== npm $npmver (нужно >= 11.15.0)" @@ -109,6 +120,7 @@ function Assert-NpmAuth { } function Phase-Npm { + Ensure-WebLogin Assert-NpmAuth Say "== trusted publisher: $($pkgs.Count) пакетов @schedjs/*" $ok = @(); $bad = @() @@ -145,6 +157,8 @@ function Phase-Verify { switch ($Phase) { 'github' { Phase-GitHub } + 'login' { Ensure-WebLogin } 'npm' { Phase-Npm } 'verify' { Phase-Verify } + 'all' { Phase-Npm; Say ''; Phase-Verify } }