param( [Parameter(Mandatory = $true)] [ValidateSet('report', 'letter', 'commercial-offer', 'contract')] [string]$Name ) $ErrorActionPreference = 'Stop' $workspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..')) $starterRoot = [System.IO.Path]::GetFullPath( (Join-Path $workspaceRoot "docs\examples\documents\$Name") ) $mainTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'main.typ')) $chaptersTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'chapters')) $assetsTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'assets')) foreach ($path in @($starterRoot, $mainTarget, $chaptersTarget, $assetsTarget)) { if (-not $path.StartsWith( $workspaceRoot + [System.IO.Path]::DirectorySeparatorChar, [System.StringComparison]::OrdinalIgnoreCase )) { throw "Небезопасный путь за пределами проекта: $path" } } if (-not (Test-Path -LiteralPath (Join-Path $starterRoot 'main.typ'))) { throw "Не найден пример документа: $Name" } # Выбор типа разрешён даже при незакоммиченных изменениях: перед заменой # создаётся локальная резервная копия, которая не попадает в Git. $timestamp = Get-Date -Format 'yyyyMMdd-HHmmss' $backupRoot = [System.IO.Path]::GetFullPath( (Join-Path $workspaceRoot ".private\starter-backups\$timestamp") ) if (-not $backupRoot.StartsWith( $workspaceRoot + [System.IO.Path]::DirectorySeparatorChar, [System.StringComparison]::OrdinalIgnoreCase )) { throw "Небезопасный путь резервной копии: $backupRoot" } New-Item -ItemType Directory -Path $backupRoot -Force | Out-Null if (Test-Path -LiteralPath $mainTarget) { Copy-Item -LiteralPath $mainTarget -Destination (Join-Path $backupRoot 'main.typ') } if (Test-Path -LiteralPath $chaptersTarget) { Copy-Item -LiteralPath $chaptersTarget -Destination (Join-Path $backupRoot 'chapters') -Recurse Remove-Item -LiteralPath $chaptersTarget -Recurse -Force } Copy-Item -LiteralPath (Join-Path $starterRoot 'main.typ') -Destination $mainTarget -Force Copy-Item -LiteralPath (Join-Path $starterRoot 'chapters') -Destination $chaptersTarget -Recurse $starterAssets = Join-Path $starterRoot 'assets' if (Test-Path -LiteralPath $starterAssets) { New-Item -ItemType Directory -Path $assetsTarget -Force | Out-Null Copy-Item -Path (Join-Path $starterAssets '*') -Destination $assetsTarget -Recurse -Force } Write-Host "Установлен тип документа '$Name'." Write-Host "Предыдущие main.typ и chapters/ сохранены в $backupRoot" Write-Host 'Откройте main.typ и последовательно проверьте параметры.'