eng/common/scripts/TypeSpec-Project-Generate.ps1 (98 lines of code) (raw):

# For details see https://github.com/Azure/azure-sdk-tools/blob/main/doc/common/TypeSpec-Project-Scripts.md [CmdletBinding()] param ( [Parameter(Position=0)] [ValidateNotNullOrEmpty()] [string] $ProjectDirectory, [string] $TypespecAdditionalOptions = $null, ## additional typespec emitter options, separated by semicolon if more than one, e.g. option1=value1;option2=value2 [switch] $SaveInputs = $false ## saves the temporary files during execution, default false ) $ErrorActionPreference = "Stop" . $PSScriptRoot/Helpers/PSModule-Helpers.ps1 . $PSScriptRoot/Helpers/CommandInvocation-Helpers.ps1 . $PSScriptRoot/common.ps1 Install-ModuleIfNotInstalled "powershell-yaml" "0.4.7" | Import-Module function NpmInstallForProject([string]$workingDirectory) { Push-Location $workingDirectory try { $currentDur = Resolve-Path "." Write-Host "Generating from $currentDur" if (Test-Path "package.json") { Write-Host "Removing existing package.json" Remove-Item -Path "package.json" -Force } if (Test-Path ".npmrc") { Write-Host "Removing existing .nprc" Remove-Item -Path ".npmrc" -Force } if (Test-Path "node_modules") { Write-Host "Removing existing node_modules" Remove-Item -Path "node_modules" -Force -Recurse } if (Test-Path "package-lock.json") { Write-Host "Removing existing package-lock.json" Remove-Item -Path "package-lock.json" -Force } $replacementPackageJson = Join-Path $PSScriptRoot "../../emitter-package.json" Write-Host("Copying package.json from $replacementPackageJson") Copy-Item -Path $replacementPackageJson -Destination "package.json" -Force $emitterPackageLock = Join-Path $PSScriptRoot "../../emitter-package-lock.json" $usingLockFile = Test-Path $emitterPackageLock if ($usingLockFile) { Write-Host("Copying package-lock.json from $emitterPackageLock") Copy-Item -Path $emitterPackageLock -Destination "package-lock.json" -Force } if ($usingLockFile) { Invoke-LoggedCommand "npm ci" } else { Invoke-LoggedCommand "npm install" } if ($LASTEXITCODE) { exit $LASTEXITCODE } } finally { Pop-Location } } $resolvedProjectDirectory = Resolve-Path $ProjectDirectory $emitterName = &$GetEmitterNameFn $typespecConfigurationFile = Resolve-Path "$ProjectDirectory/tsp-location.yaml" Write-Host "Reading configuration from $typespecConfigurationFile" $configuration = Get-Content -Path $typespecConfigurationFile -Raw | ConvertFrom-Yaml $specSubDirectory = $configuration["directory"] $innerFolder = Split-Path $specSubDirectory -Leaf $tempFolder = "$ProjectDirectory/TempTypeSpecFiles" $npmWorkingDir = Resolve-Path $tempFolder/$innerFolder $mainTypeSpecFile = If (Test-Path "$npmWorkingDir/client.*") { Resolve-Path "$npmWorkingDir/client.*" } Else { Resolve-Path "$npmWorkingDir/main.*"} try { Push-Location $npmWorkingDir NpmInstallForProject $npmWorkingDir if ($LASTEXITCODE) { exit $LASTEXITCODE } if (Test-Path "Function:$GetEmitterAdditionalOptionsFn") { $emitterAdditionalOptions = &$GetEmitterAdditionalOptionsFn $resolvedProjectDirectory if ($emitterAdditionalOptions.Length -gt 0) { $emitterAdditionalOptions = " $emitterAdditionalOptions" } } $typespecCompileCommand = "npx tsp compile $mainTypeSpecFile --emit $emitterName$emitterAdditionalOptions" if ($TypespecAdditionalOptions) { $options = $TypespecAdditionalOptions.Split(";"); foreach ($option in $options) { $typespecCompileCommand += " --option $emitterName.$option" } } if ($SaveInputs) { $typespecCompileCommand += " --option $emitterName.save-inputs=true" } Write-Host($typespecCompileCommand) Invoke-Expression $typespecCompileCommand if ($LASTEXITCODE) { exit $LASTEXITCODE } } finally { Pop-Location } $shouldCleanUp = !$SaveInputs if ($shouldCleanUp) { Remove-Item $tempFolder -Recurse -Force } exit 0