mirror of
https://github.com/MAKS-IT-COM/maksit-certs-ui.git
synced 2026-06-13 09:46:41 +02:00
119 lines
4.3 KiB
PowerShell
119 lines
4.3 KiB
PowerShell
#requires -Version 7.0
|
|
#requires -PSEdition Core
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Publishes npm workspace packages to the npm registry.
|
|
|
|
.DESCRIPTION
|
|
Publishes packages in configured order using an API key from an environment
|
|
variable (for example NPMJS_MAKS_IT). Uses a temporary .npmrc in the
|
|
workspace root for auth and supports --skip-duplicate semantics via npm.
|
|
#>
|
|
|
|
if (-not (Get-Command Import-PluginDependency -ErrorAction SilentlyContinue)) {
|
|
$srcDir = Split-Path (Split-Path $PSScriptRoot -Parent) -Parent
|
|
$pluginSupportModulePath = Join-Path $srcDir "modules/Engine/PluginSupport.psm1"
|
|
if (Test-Path $pluginSupportModulePath -PathType Leaf) {
|
|
Import-Module $pluginSupportModulePath -Force -Global -ErrorAction Stop
|
|
}
|
|
}
|
|
|
|
function Invoke-Plugin {
|
|
param(
|
|
[Parameter(Mandatory = $true)]
|
|
$Settings
|
|
)
|
|
|
|
Import-PluginDependency -ModuleName "Logging" -RequiredCommand "Write-Log"
|
|
Import-PluginDependency -ModuleName "ScriptConfig" -RequiredCommand "Assert-Command"
|
|
Import-PluginDependency -ModuleName "EngineContext" -RequiredCommand "Resolve-RelativePaths"
|
|
|
|
$pluginSettings = $Settings
|
|
$shared = $Settings.context
|
|
|
|
Assert-Command npm
|
|
|
|
$npmApiKeyEnvVar = $pluginSettings.npmApiKey
|
|
if ([string]::IsNullOrWhiteSpace($npmApiKeyEnvVar)) {
|
|
throw "NpmPublish plugin requires 'npmApiKey' in scriptSettings.json (environment variable name)."
|
|
}
|
|
|
|
$npmApiKey = [System.Environment]::GetEnvironmentVariable($npmApiKeyEnvVar)
|
|
if ([string]::IsNullOrWhiteSpace($npmApiKey)) {
|
|
throw "npm API key is not set. Set '$npmApiKeyEnvVar' and rerun."
|
|
}
|
|
|
|
$workspaceRoot = $null
|
|
if ($pluginSettings.workspaceRoot) {
|
|
$workspaceRoots = @(Resolve-RelativePaths -Value $pluginSettings.workspaceRoot -BasePath $shared.scriptDir)
|
|
$workspaceRoot = $workspaceRoots[0]
|
|
}
|
|
elseif ($shared.PSObject.Properties['npmWorkspaceRoot'] -and -not [string]::IsNullOrWhiteSpace([string]$shared.npmWorkspaceRoot)) {
|
|
$workspaceRoot = [string]$shared.npmWorkspaceRoot
|
|
}
|
|
else {
|
|
throw "NpmPublish plugin requires 'workspaceRoot' or a prior NpmReleaseVersion plugin run."
|
|
}
|
|
|
|
$registry = if ([string]::IsNullOrWhiteSpace([string]$pluginSettings.registry)) {
|
|
'https://registry.npmjs.org'
|
|
}
|
|
else {
|
|
[string]$pluginSettings.registry
|
|
}
|
|
|
|
$access = if ([string]::IsNullOrWhiteSpace([string]$pluginSettings.access)) {
|
|
'public'
|
|
}
|
|
else {
|
|
[string]$pluginSettings.access
|
|
}
|
|
|
|
$publishOrder = @()
|
|
if ($pluginSettings.publishOrder) {
|
|
if ($pluginSettings.publishOrder -is [System.Collections.IEnumerable] -and -not ($pluginSettings.publishOrder -is [string])) {
|
|
$publishOrder = @($pluginSettings.publishOrder | Where-Object { -not [string]::IsNullOrWhiteSpace([string]$_) })
|
|
}
|
|
elseif (-not [string]::IsNullOrWhiteSpace([string]$pluginSettings.publishOrder)) {
|
|
$publishOrder = @([string]$pluginSettings.publishOrder)
|
|
}
|
|
}
|
|
|
|
if ($publishOrder.Count -eq 0) {
|
|
throw "NpmPublish plugin requires non-empty 'publishOrder' (workspace package names)."
|
|
}
|
|
|
|
$registryHost = ([uri]$registry).Host
|
|
$tempNpmRcPath = Join-Path $workspaceRoot ".npmrc.release-temp"
|
|
$npmRcContent = @"
|
|
registry=$registry
|
|
//$registryHost/:_authToken=$npmApiKey
|
|
"@
|
|
|
|
Push-Location $workspaceRoot
|
|
try {
|
|
Set-Content -Path $tempNpmRcPath -Value $npmRcContent -Encoding UTF8 -NoNewline
|
|
|
|
foreach ($packageName in $publishOrder) {
|
|
Write-Log -Level "STEP" -Message "Publishing npm package '$packageName'..."
|
|
npm publish -w $packageName --access $access --userconfig $tempNpmRcPath
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "Failed to publish npm package '$packageName'."
|
|
}
|
|
Write-Log -Level "OK" -Message " Published $packageName."
|
|
}
|
|
|
|
Write-Log -Level "OK" -Message " npm publish completed."
|
|
$shared | Add-Member -NotePropertyName publishCompleted -NotePropertyValue $true -Force
|
|
}
|
|
finally {
|
|
if (Test-Path $tempNpmRcPath -PathType Leaf) {
|
|
Remove-Item -Path $tempNpmRcPath -Force -ErrorAction SilentlyContinue
|
|
}
|
|
Pop-Location
|
|
}
|
|
}
|
|
|
|
Export-ModuleMember -Function Invoke-Plugin
|