diff --git a/frontend/create-spfx.ps1 b/frontend/create-spfx.ps1 new file mode 100644 index 0000000..7fd786c --- /dev/null +++ b/frontend/create-spfx.ps1 @@ -0,0 +1,282 @@ +# ============================================================= +# SPFx + Heft project bootstrap script (PowerShell) +# Запустите из корня вашей ПУСТОЙ папки проекта: +# .\setup-spfx-heft.ps1 +# +# Если запуск скриптов заблокирован, выполните сначала: +# Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned +# ============================================================= + +$ErrorActionPreference = "Stop" + +# ---- Цвета вывода ---- +function Info { param($msg) Write-Host "[INFO] $msg" -ForegroundColor Cyan } +function Success { param($msg) Write-Host "[OK] $msg" -ForegroundColor Green } +function Warn { param($msg) Write-Host "[WARN] $msg" -ForegroundColor Yellow } +function Header { param($msg) Write-Host "`n$msg" -ForegroundColor White } + +Header "=================================================" +Header " SPFx + Heft — автоматическая инициализация" +Header "=================================================`n" + +# --------------------------------------------------------- +# 1. Проверка Node.js (SPFx 1.20+ требует Node 18+) +# --------------------------------------------------------- +Info "Проверка Node.js..." + +try { + $nodeVersion = (node --version).Trim() +} catch { + Warn "Node.js не найден. Установите Node 18 LTS: https://nodejs.org" + exit 1 +} + +$nodeMajor = [int]($nodeVersion.TrimStart('v').Split('.')[0]) +if ($nodeMajor -lt 18) { + Warn "Обнаружен Node.js $nodeVersion. SPFx 1.20+ требует Node 18.x или выше." + Warn "Установите Node 18 LTS через nvm-windows или с https://nodejs.org" + exit 1 +} +Success "Node.js $nodeVersion — подходит." + +# --------------------------------------------------------- +# 2. Вспомогательная функция: установка глобального пакета +# --------------------------------------------------------- +function Install-GlobalIfMissing { + param( + [string]$Package, + [string]$Command = "" + ) + if ($Command -eq "") { $Command = $Package.Split('/')[-1] } + + if (-not (Get-Command $Command -ErrorAction SilentlyContinue)) { + Info "Устанавливаем $Package глобально..." + npm install -g $Package + Success "$Package установлен." + } else { + Success "$Package уже установлен." + } +} + +Install-GlobalIfMissing "@microsoft/generator-sharepoint" "yo" +Install-GlobalIfMissing "yo" "yo" +Install-GlobalIfMissing "@rushstack/heft" "heft" + +# --------------------------------------------------------- +# 3. Создание package.json +# --------------------------------------------------------- +Info "Создаём package.json..." + +$packageJson = @' +{ + "name": "spfx-heft-project", + "version": "0.0.1", + "private": true, + "scripts": { + "build": "heft build", + "bundle": "heft build && gulp bundle --ship", + "package-solution": "heft build && gulp package-solution --ship", + "serve": "heft build && gulp serve", + "clean": "heft clean" + }, + "overrides": { + "ajv": "^8.0.0" + } +} +'@ + +$packageJson | Set-Content -Encoding UTF8 "package.json" +Success "package.json создан." + +# --------------------------------------------------------- +# 4. Создание структуры папок +# --------------------------------------------------------- +Info "Создаём структуру папок..." +New-Item -ItemType Directory -Force -Path "config" | Out-Null +New-Item -ItemType Directory -Force -Path "src\webparts" | Out-Null +Success "Папки созданы." + +# --------------------------------------------------------- +# 5. Запуск Yeoman-генератора SPFx +# --------------------------------------------------------- +Info "Запускаем Yeoman-генератор SPFx..." +Write-Host "" +Write-Host ">>> Сейчас откроется интерактивный генератор Yeoman." -ForegroundColor Yellow +Write-Host ">>> Выберите тип: WebPart, Framework: No framework (или React)." -ForegroundColor Yellow +Write-Host "" + +yo "@microsoft/sharepoint" + +npm uninstall @microsoft/sp-build-web ajv gulp +npm uninstall @microsoft/rush-stack-compiler-5.3 + +# --------------------------------------------------------- +# 6. Установка Heft и Rush Stack зависимостей +# --------------------------------------------------------- +Info "Устанавливаем Heft и плагины..." + +$devDeps = @( + "@microsoft/spfx-web-build-rig@1.22.1", + "@microsoft/spfx-heft-plugins@1.22.1", + "@microsoft/eslint-config-spfx@1.22.1", + "@microsoft/eslint-plugin-spfx@1.22.17", + "@microsoft/sp-module-interfaces@1.22.1", + "@rushstack/eslint-config@4.5.2", + "@rushstack/heft@1.1.2", + "@types/heft-jest@1.0.2", + "@typescript-eslint/parser@8.46.2" +) + +npm install --save-dev @($devDeps) --save-exact --force --legacy-peer-deps +npm install typescript@~5.8.0 --save-dev + +Success "Heft и плагины установлены." + +# --------------------------------------------------------- +# 7. config/rig.json +# --------------------------------------------------------- +Info "Создаём config\rig.json..." +New-Item -ItemType Directory -Force -Path "config" | Out-Null + +$rigJson = @' +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "@microsoft/spfx-web-build-rig" +} +'@ + +$rigJson | Set-Content -Encoding UTF8 "config\rig.json" +Success "config\rig.json создан." + +# --------------------------------------------------------- +# 8. config/sass.json +# --------------------------------------------------------- +Info "Создаём config\sass.json..." +New-Item -ItemType Directory -Force -Path "config" | Out-Null + +$sassJson = @' +{ + "$schema": "https://developer.microsoft.com/json-schemas/heft/v0/heft-sass-plugin.schema.json", + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/sass.json" +} +'@ + +$sassJson | Set-Content -Encoding UTF8 "config\sass.json" +Success "config\sass.json создан." + +# --------------------------------------------------------- +# 9. config/typescript.json +# --------------------------------------------------------- +Info "Создаём config\typescript.json..." +New-Item -ItemType Directory -Force -Path "config" | Out-Null + +$typescriptJson = @' +{ + "extends": "@microsoft/spfx-web-build-rig/profiles/default/config/typescript.json", + "staticAssetsToCopy": { + "fileExtensions": [".resx", ".jpg", ".png", ".woff", ".eot", ".ttf", ".svg", ".gif"], + "includeGlobs": ["webparts/*/loc/*.js"] + } +} +'@ + +$typescriptJson | Set-Content -Encoding UTF8 "config\typescript.json" +Success "config\typescript.json создан." + +# --------------------------------------------------------- +# 8. tsconfig.json (если Yeoman ещё не создал) +# --------------------------------------------------------- +if (-not (Test-Path "tsconfig.json")) { + Info "Создаём tsconfig.json..." + + $tsConfig = @' +{ + "extends": "./node_modules/@microsoft/spfx-web-build-rig/profiles/default/tsconfig-base.json" +} +'@ + + $tsConfig | Set-Content -Encoding UTF8 "tsconfig.json" + Success "tsconfig.json создан." +} else { + Success "tsconfig.json уже существует, пропускаем." +} + +# --------------------------------------------------------- +# 9. .eslintrc.js (если не создан) +# --------------------------------------------------------- +if (-not (Test-Path ".eslintrc.js")) { + Info "Создаём .eslintrc.js..." + + $eslintConfig = @' +require('@rushstack/eslint-config/patch/modern-module-resolution'); + +module.exports = { + extends: ['@microsoft/eslint-config-spfx/lib/profiles/default'], + parserOptions: { tsconfigRootDir: __dirname } +}; +'@ + + $eslintConfig | Set-Content -Encoding UTF8 ".eslintrc.js" + Success ".eslintrc.js создан." +} else { + Success ".eslintrc.js уже существует, пропускаем." +} + +# --------------------------------------------------------- +# 10. .gitignore +# --------------------------------------------------------- +Info "Создаём .gitignore..." + +$gitignore = @' +node_modules/ +lib/ +dist/ +temp/ +*.sppkg +.heft/ +sharepoint/solution/ +'@ + +$gitignore | Set-Content -Encoding UTF8 ".gitignore" +Success ".gitignore создан." + +# --------------------------------------------------------- +# 11. Финальный npm install +# --------------------------------------------------------- +$devDeps = @( + "@microsoft/sp-component-base@1.22.1", + "@microsoft/sp-core-library@1.22.1", + "@microsoft/sp-lodash-subset@1.22.1", + "@microsoft/sp-office-ui-fabric-core@1.22.1", + "@microsoft/sp-property-pane@1.22.1", + "@microsoft/sp-webpart-base@1.22.1" +) + +Info "Финальный npm install..." +npm install @($devDeps) --save-exact --legacy-peer-deps +Success "Все зависимости установлены." + +# --------------------------------------------------------- +# Готово +# --------------------------------------------------------- +Write-Host "" +Write-Host "=================================================" -ForegroundColor Green +Write-Host " Проект успешно инициализирован!" -ForegroundColor Green +Write-Host "=================================================" -ForegroundColor Green +Write-Host "" +Write-Host " Доступные команды:" -ForegroundColor White +Write-Host "" +Write-Host " npm run serve " -NoNewline -ForegroundColor Cyan +Write-Host "— локальная разработка (gulp serve)" +Write-Host " npm run build " -NoNewline -ForegroundColor Cyan +Write-Host "— сборка через Heft" +Write-Host " npm run bundle " -NoNewline -ForegroundColor Cyan +Write-Host "— бандлинг для продакшна" +Write-Host " npm run package-solution " -NoNewline -ForegroundColor Cyan +Write-Host "— создание .sppkg пакета" +Write-Host " npm run clean " -NoNewline -ForegroundColor Cyan +Write-Host "— очистка артефактов сборки" +Write-Host "" +Write-Host " Следующий шаг: " -NoNewline -ForegroundColor Yellow +Write-Host "npm run serve" -ForegroundColor Cyan +Write-Host "" \ No newline at end of file