Studio regroupe l'exécutable hôte (C++, à venir dans studio/host) et l'interface web (TypeScript, studio/ui). Chemins mis à jour dans les scripts, .gitignore et la documentation ; paquet renommé @sequa/studio-ui.
161 lines
5.3 KiB
PowerShell
161 lines
5.3 KiB
PowerShell
# SPDX-License-Identifier: MPL-2.0
|
|
# Messages en ASCII : compatible Windows PowerShell 5.1 sans BOM.
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Lance SEQUA Studio en developpement et ouvre le navigateur.
|
|
|
|
.DESCRIPTION
|
|
Demarre le serveur Vite (rechargement a chaud) dans studio/. Installe les
|
|
dependances (npm ci) au premier lancement ou si package-lock.json a change.
|
|
Sans -Core ni -MockCore, Studio utilise le Core simule. Arret : Ctrl+C
|
|
(le faux Core, s'il tourne, est arrete automatiquement).
|
|
|
|
.PARAMETER Core
|
|
URL WebSocket d'un Core reel (ws:// ou wss://). Sans ce parametre : Core simule.
|
|
|
|
.PARAMETER MockCore
|
|
Demarre le FAUX Core de developpement (simule) en arriere-plan sur
|
|
ws://127.0.0.1:9101 et pointe Studio dessus. Pour tester le chemin
|
|
WebSocket sans compiler le vrai Core (sequa-core). Exclusif avec -Core.
|
|
|
|
.PARAMETER Scenario
|
|
Scenario du faux Core, utilisable seulement avec -MockCore :
|
|
ok, incompatible, error, silent, garbage ou close. Defaut : ok.
|
|
|
|
.PARAMETER Port
|
|
Port du serveur de developpement. Defaut : 5173.
|
|
|
|
.PARAMETER NoOpen
|
|
N'ouvre pas le navigateur.
|
|
|
|
.PARAMETER Help
|
|
Affiche cette aide.
|
|
|
|
.EXAMPLE
|
|
.\scripts\studio.ps1
|
|
|
|
.EXAMPLE
|
|
.\scripts\studio.ps1 -Core ws://127.0.0.1:9100
|
|
|
|
.EXAMPLE
|
|
.\scripts\studio.ps1 -MockCore
|
|
|
|
.EXAMPLE
|
|
.\scripts\studio.ps1 -MockCore -Scenario error
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[string]$Core,
|
|
[switch]$MockCore,
|
|
[ValidateSet("ok", "incompatible", "error", "silent", "garbage", "close")]
|
|
[string]$Scenario = "ok",
|
|
[int]$Port = 5173,
|
|
[switch]$NoOpen,
|
|
[Alias("h", "?")]
|
|
[switch]$Help
|
|
)
|
|
|
|
if ($Help) {
|
|
Get-Help $PSCommandPath -Detailed
|
|
exit 0
|
|
}
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$studio = Join-Path (Split-Path -Parent $PSScriptRoot) "studio\ui"
|
|
|
|
if (-not (Get-Command npm -ErrorAction SilentlyContinue)) {
|
|
throw "npm introuvable : installer Node.js 24 (https://nodejs.org)."
|
|
}
|
|
if ($Core -and $Core -notmatch '^wss?://') {
|
|
throw "-Core doit commencer par ws:// ou wss:// (recu : $Core)."
|
|
}
|
|
if ($Core -and $MockCore) {
|
|
throw "-Core et -MockCore sont exclusifs."
|
|
}
|
|
|
|
# Attend que le faux Core accepte les connexions TCP sur son port.
|
|
function Wait-MockCore {
|
|
param([string]$TargetHost, [int]$TargetPort, [int]$TimeoutMs = 5000)
|
|
$deadline = [DateTime]::UtcNow.AddMilliseconds($TimeoutMs)
|
|
while ([DateTime]::UtcNow -lt $deadline) {
|
|
$client = New-Object System.Net.Sockets.TcpClient
|
|
try {
|
|
$client.Connect($TargetHost, $TargetPort)
|
|
return $true
|
|
} catch {
|
|
Start-Sleep -Milliseconds 100
|
|
} finally {
|
|
$client.Close()
|
|
}
|
|
}
|
|
return $false
|
|
}
|
|
|
|
$mockProcess = $null
|
|
$mockOut = $null
|
|
$mockErr = $null
|
|
|
|
Push-Location $studio
|
|
try {
|
|
$lock = Get-Item "package-lock.json"
|
|
$installed = "node_modules\.package-lock.json"
|
|
if (-not (Test-Path $installed) -or (Get-Item $installed).LastWriteTime -lt $lock.LastWriteTime) {
|
|
Write-Host "==> npm ci" -ForegroundColor Cyan
|
|
npm ci --no-audit --no-fund
|
|
if ($LASTEXITCODE -ne 0) { throw "Echec : npm ci" }
|
|
}
|
|
|
|
$coreUrl = ""
|
|
if ($Core) {
|
|
$coreUrl = $Core
|
|
}
|
|
elseif ($MockCore) {
|
|
$coreUrl = "ws://127.0.0.1:9101"
|
|
Write-Host "==> FAUX CORE DE DEVELOPPEMENT (SIMULE) : $coreUrl (scenario $Scenario)" -ForegroundColor Cyan
|
|
|
|
# Arriere-plan, journal dans des fichiers temporaires (affiches si le demarrage echoue).
|
|
# [IO.Path]::GetTempFileName() : toujours disponible (New-TemporaryFile
|
|
# peut manquer selon l'environnement PowerShell 5.1).
|
|
$mockOut = [System.IO.Path]::GetTempFileName()
|
|
$mockErr = [System.IO.Path]::GetTempFileName()
|
|
$mockProcess = Start-Process -FilePath "node" -ArgumentList @(
|
|
"tools/mock-core.mjs", "--scenario", $Scenario, "--port", "9101", "--host", "127.0.0.1"
|
|
) -WorkingDirectory $studio -WindowStyle Hidden -PassThru `
|
|
-RedirectStandardOutput $mockOut -RedirectStandardError $mockErr
|
|
|
|
if (-not (Wait-MockCore -TargetHost "127.0.0.1" -TargetPort 9101)) {
|
|
$outText = ""
|
|
$errText = ""
|
|
if (Test-Path $mockOut) { $outText = [string](Get-Content $mockOut -Raw) }
|
|
if (Test-Path $mockErr) { $errText = [string](Get-Content $mockErr -Raw) }
|
|
throw "Le faux Core n'a pas demarre sur le port 9101. Journal : $outText $errText"
|
|
}
|
|
}
|
|
|
|
$path = "/"
|
|
if ($coreUrl) { $path = "/?core=" + [uri]::EscapeDataString($coreUrl) }
|
|
$mode = if ($Core) { "Core reel $coreUrl" } elseif ($MockCore) { "Faux Core (simule) $coreUrl" } else { "Core simule" }
|
|
Write-Host "==> SEQUA Studio : http://localhost:$Port$path ($mode) - Ctrl+C pour arreter" -ForegroundColor Cyan
|
|
|
|
$viteArgs = @("run", "dev", "--", "--port", "$Port", "--strictPort")
|
|
if (-not $NoOpen) { $viteArgs += @("--open", $path) }
|
|
npm @viteArgs
|
|
}
|
|
finally {
|
|
# Arret de l'arbre de processus du faux Core (taskkill /T), s'il vit encore.
|
|
if ($null -ne $mockProcess) {
|
|
if (-not $mockProcess.HasExited) {
|
|
taskkill /PID $mockProcess.Id /T /F 2>$null | Out-Null
|
|
}
|
|
$mockProcess.Dispose()
|
|
}
|
|
foreach ($temp in @($mockOut, $mockErr)) {
|
|
if ($null -ne $temp -and (Test-Path $temp)) {
|
|
Remove-Item $temp -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
Pop-Location
|
|
}
|