| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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 и последовательно проверьте параметры.'
|