use-starter.ps1 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. param(
  2. [Parameter(Mandatory = $true)]
  3. [ValidateSet('report', 'letter', 'commercial-offer', 'contract')]
  4. [string]$Name
  5. )
  6. $ErrorActionPreference = 'Stop'
  7. $workspaceRoot = [System.IO.Path]::GetFullPath((Join-Path $PSScriptRoot '..\..\..'))
  8. $starterRoot = [System.IO.Path]::GetFullPath(
  9. (Join-Path $workspaceRoot "docs\examples\documents\$Name")
  10. )
  11. $mainTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'main.typ'))
  12. $chaptersTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'chapters'))
  13. $assetsTarget = [System.IO.Path]::GetFullPath((Join-Path $workspaceRoot 'assets'))
  14. foreach ($path in @($starterRoot, $mainTarget, $chaptersTarget, $assetsTarget)) {
  15. if (-not $path.StartsWith(
  16. $workspaceRoot + [System.IO.Path]::DirectorySeparatorChar,
  17. [System.StringComparison]::OrdinalIgnoreCase
  18. )) {
  19. throw "Небезопасный путь за пределами проекта: $path"
  20. }
  21. }
  22. if (-not (Test-Path -LiteralPath (Join-Path $starterRoot 'main.typ'))) {
  23. throw "Не найден пример документа: $Name"
  24. }
  25. # Выбор типа разрешён даже при незакоммиченных изменениях: перед заменой
  26. # создаётся локальная резервная копия, которая не попадает в Git.
  27. $timestamp = Get-Date -Format 'yyyyMMdd-HHmmss'
  28. $backupRoot = [System.IO.Path]::GetFullPath(
  29. (Join-Path $workspaceRoot ".private\starter-backups\$timestamp")
  30. )
  31. if (-not $backupRoot.StartsWith(
  32. $workspaceRoot + [System.IO.Path]::DirectorySeparatorChar,
  33. [System.StringComparison]::OrdinalIgnoreCase
  34. )) {
  35. throw "Небезопасный путь резервной копии: $backupRoot"
  36. }
  37. New-Item -ItemType Directory -Path $backupRoot -Force | Out-Null
  38. if (Test-Path -LiteralPath $mainTarget) {
  39. Copy-Item -LiteralPath $mainTarget -Destination (Join-Path $backupRoot 'main.typ')
  40. }
  41. if (Test-Path -LiteralPath $chaptersTarget) {
  42. Copy-Item -LiteralPath $chaptersTarget -Destination (Join-Path $backupRoot 'chapters') -Recurse
  43. Remove-Item -LiteralPath $chaptersTarget -Recurse -Force
  44. }
  45. Copy-Item -LiteralPath (Join-Path $starterRoot 'main.typ') -Destination $mainTarget -Force
  46. Copy-Item -LiteralPath (Join-Path $starterRoot 'chapters') -Destination $chaptersTarget -Recurse
  47. $starterAssets = Join-Path $starterRoot 'assets'
  48. if (Test-Path -LiteralPath $starterAssets) {
  49. New-Item -ItemType Directory -Path $assetsTarget -Force | Out-Null
  50. Copy-Item -Path (Join-Path $starterAssets '*') -Destination $assetsTarget -Recurse -Force
  51. }
  52. Write-Host "Установлен тип документа '$Name'."
  53. Write-Host "Предыдущие main.typ и chapters/ сохранены в $backupRoot"
  54. Write-Host 'Откройте main.typ и последовательно проверьте параметры.'