diff --git a/- b/-
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt
index efebf0ae9da4..91bcb3c7f399 100644
--- a/.github/actions/spell-check/expect.txt
+++ b/.github/actions/spell-check/expect.txt
@@ -1177,6 +1177,7 @@ powerrenameinput
POWERRENAMETEST
POWERTOYNAME
powertoyssetup
+powertoyssetupvnext
powertoysusersetup
Powrprof
ppenum
diff --git a/.gitignore b/.gitignore
index 89541c3a2e05..98a1d76435a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -350,6 +350,10 @@ src/common/Telemetry/*.etl
# Generated installer file for Monaco source files.
/installer/PowerToysSetup/MonacoSRC.wxs
+/installer/PowerToysSetupVNext/MonacoSRC.wxs
# MSBuildCache
/MSBuildCacheLogs/
+
+# PowerToysInstaller Build Temp Files
+installer/*/*.wxs.bk
diff --git a/.pipelines/v2/templates/job-build-project-vnext.yml b/.pipelines/v2/templates/job-build-project-vnext.yml
new file mode 100644
index 000000000000..8aa945a16f37
--- /dev/null
+++ b/.pipelines/v2/templates/job-build-project-vnext.yml
@@ -0,0 +1,472 @@
+parameters:
+ - name: additionalBuildOptions
+ type: string
+ default: ''
+ - name: buildConfigurations
+ type: object
+ default:
+ - Release
+ - name: buildPlatforms
+ type: object
+ default:
+ - x64
+ - arm64
+ - name: codeSign
+ type: boolean
+ default: false
+ - name: artifactStem
+ type: string
+ default: ''
+ - name: jobName
+ type: string
+ default: 'Build'
+ - name: condition
+ type: string
+ default: ''
+ - name: dependsOn
+ type: object
+ default: []
+ - name: pool
+ type: object
+ default: []
+ - name: beforeBuildSteps
+ type: stepList
+ default: []
+ - name: variables
+ type: object
+ default: {}
+ - name: publishArtifacts
+ type: boolean
+ default: true
+ - name: signingIdentity
+ type: object
+ default: {}
+ - name: enablePackageCaching
+ type: boolean
+ default: false
+ - name: enableMsBuildCaching
+ type: boolean
+ default: false
+ - name: runTests
+ type: boolean
+ default: true
+ - name: useVSPreview
+ type: boolean
+ default: false
+ - name: versionNumber
+ type: string
+ default: '0.0.1'
+ - name: useLatestWinAppSDK
+ type: boolean
+ default: false
+ - name: winAppSDKVersionNumber
+ type: string
+ default: 1.6
+ - name: useExperimentalVersion
+ type: boolean
+ default: false
+ - name: csProjectsToPublish
+ type: object
+ default:
+ - 'src/settings-ui/Settings.UI/PowerToys.Settings.csproj'
+ - 'src/modules/launcher/PowerLauncher/PowerLauncher.csproj'
+ - 'src/modules/previewpane/MonacoPreviewHandler/MonacoPreviewHandler.csproj'
+ - 'src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.csproj'
+ - 'src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj'
+ - 'src/modules/previewpane/SvgThumbnailProvider/SvgThumbnailProvider.csproj'
+ - 'src/modules/FileLocksmith/FileLocksmithUI/FileLocksmithUI.csproj'
+
+jobs:
+- job: ${{ parameters.jobName }}
+ ${{ if ne(length(parameters.pool), 0) }}:
+ pool: ${{ parameters.pool }}
+ dependsOn: ${{ parameters.dependsOn }}
+ condition: ${{ parameters.condition }}
+ strategy:
+ matrix:
+ ${{ each config in parameters.buildConfigurations }}:
+ ${{ each platform in parameters.buildPlatforms }}:
+ ${{ config }}_${{ platform }}:
+ BuildConfiguration: ${{ config }}
+ BuildPlatform: ${{ platform }}
+ ${{ if eq(platform, 'x86') }}:
+ OutputBuildPlatform: Win32
+ ${{ elseif eq(platform, 'Any CPU') }}:
+ OutputBuildPlatform: AnyCPU
+ ${{ else }}:
+ OutputBuildPlatform: ${{ platform }}
+ variables:
+ # Azure DevOps abhors a vacuum
+ # If these are blank, expansion will fail later on... which will result in direct substitution of the variable *names*
+ # later on. We'll just... set them to a single space and if we need to, check IsNullOrWhiteSpace.
+ # Yup.
+ MSBuildCacheParameters: ' '
+ JobOutputDirectory: $(Build.ArtifactStagingDirectory)
+ LogOutputDirectory: $(Build.ArtifactStagingDirectory)\logs
+ JobOutputArtifactName: build-$(BuildPlatform)-$(BuildConfiguration)${{ parameters.artifactStem }}
+ NUGET_RESTORE_MSBUILD_ARGS: /p:Platform=$(BuildPlatform) # Required for nuget to work due to self contained
+ NODE_OPTIONS: --max_old_space_size=16384
+ ${{ if eq(parameters.runTests, true) }}:
+ MSBuildMainBuildTargets: Build;Test
+ ${{ else }}:
+ MSBuildMainBuildTargets: Build
+ ${{ insert }}: ${{ parameters.variables }}
+ ${{ if eq(parameters.useLatestWinAppSDK, true) }}:
+ RestoreAdditionalProjectSourcesArg: '/p:RestoreAdditionalProjectSources="$(Build.SourcesDirectory)\localpackages\NugetPackages"'
+ ${{ else }}:
+ RestoreAdditionalProjectSourcesArg: ''
+ displayName: Build
+ timeoutInMinutes: 240
+ cancelTimeoutInMinutes: 1
+ templateContext: # Required when this template is hosted in 1ES PT
+ outputs:
+ - output: pipelineArtifact
+ artifactName: $(JobOutputArtifactName)
+ targetPath: $(Build.ArtifactStagingDirectory)
+ steps:
+ - checkout: self
+ clean: true
+ submodules: true
+ persistCredentials: True
+ fetchTags: false
+ fetchDepth: 1
+
+ - ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ - pwsh: |-
+ $MSBuildCacheParameters = ""
+ $MSBuildCacheParameters += " -graph"
+ $MSBuildCacheParameters += " -reportfileaccesses"
+ $MSBuildCacheParameters += " -p:MSBuildCacheEnabled=true"
+ $MSBuildCacheParameters += " -p:MSBuildCacheLogDirectory=$(LogOutputDirectory)\MSBuildCacheLogs"
+ Write-Host "MSBuildCacheParameters: $MSBuildCacheParameters"
+ Write-Host "##vso[task.setvariable variable=MSBuildCacheParameters]$MSBuildCacheParameters"
+ displayName: Prepare MSBuildCache variables
+
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '6.0'
+
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '8.0'
+
+ - template: steps-ensure-dotnet-version.yml
+ parameters:
+ sdk: true
+ version: '9.0'
+
+ - ${{ if eq(parameters.runTests, true) }}:
+ - task: VisualStudioTestPlatformInstaller@1
+ displayName: Ensure VSTest Platform
+
+ - pwsh: |-
+ & '.pipelines/applyXamlStyling.ps1' -Passive
+ displayName: Verify XAML formatting
+
+ - pwsh: |-
+ & '.pipelines/verifyNugetPackages.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
+ displayName: Verify Nuget package versions for PowerToys.sln
+
+ - pwsh: |-
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln'
+ & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln'
+ displayName: Verify ARM64 configurations
+
+ - ${{ if eq(parameters.enablePackageCaching, true) }}:
+ - task: Cache@2
+ displayName: 'Cache nuget packages (PackageReference)'
+ inputs:
+ key: '"PackageReference" | "$(Agent.OS)" | Directory.Packages.props'
+ restoreKeys: |
+ "PackageReference" | "$(Agent.OS)"
+ "PackageReference"
+ path: $(NUGET_PACKAGES)
+
+ - task: Cache@2
+ displayName: 'Cache nuget packages (packages.config)'
+ inputs:
+ key: '"packages.config" | "$(Agent.OS)" | **/packages.config'
+ restoreKeys: |
+ "packages.config" | "$(Agent.OS)"
+ "packages.config"
+ path: packages
+
+ - ${{ if eq(parameters.useLatestWinAppSDK, true)}}:
+ - template: .\steps-update-winappsdk-and-restore-nuget.yml
+ parameters:
+ versionNumber: ${{ parameters.winAppSDKVersionNumber }}
+ useExperimentalVersion: ${{ parameters.useExperimentalVersion }}
+
+ - ${{ if eq(parameters.useLatestWinAppSDK, false)}}:
+ - template: .\steps-restore-nuget.yml
+
+ - pwsh: |-
+ & "$(build.sourcesdirectory)\.pipelines\verifyAndSetLatestVCToolsVersion.ps1"
+ displayName: Work around DD-1541167 (VCToolsVersion)
+ ${{ if eq(parameters.useVSPreview, true) }}:
+ env:
+ VCWhereExtraVersionTarget: '-prerelease'
+
+ - pwsh: |-
+ & "$(build.sourcesdirectory)\.pipelines\installWiX.ps1"
+ displayName: Download and install WiX 3.14 development build
+
+ - ${{ parameters.beforeBuildSteps }}
+
+ - task: VSBuild@1
+ ${{ if eq(parameters.runTests, true) }}:
+ displayName: Build and Test PowerToys main project
+ ${{ else }}:
+ displayName: Build PowerToys main project
+ inputs:
+ solution: 'PowerToys.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-0-main.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ /t:$(MSBuildMainBuildTargets)
+ $(RestoreAdditionalProjectSourcesArg)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Build BugReportTool
+ inputs:
+ solution: '**/tools/BugReportTool/BugReportTool.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-bug-report.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ $(RestoreAdditionalProjectSourcesArg)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: VSBuild@1
+ displayName: Build StylesReportTool
+ inputs:
+ solution: '**/tools/StylesReportTool/StylesReportTool.sln'
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore -graph
+ /p:RestorePackagesConfig=true
+ /p:CIBuild=true
+ /bl:$(LogOutputDirectory)\build-styles-report.binlog
+ ${{ parameters.additionalBuildOptions }}
+ $(MSBuildCacheParameters)
+ $(RestoreAdditionalProjectSourcesArg)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+ ${{ if eq(parameters.enableMsBuildCaching, true) }}:
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - ${{ each project in parameters.csProjectsToPublish }}:
+ - task: VSBuild@1
+ displayName: Publish ${{ project }} for Packaging
+ inputs:
+ solution: ${{ project }}
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /target:Publish
+ /graph
+ /p:Configuration=$(BuildConfiguration);Platform=$(BuildPlatform);AppxBundle=Never
+ /p:VCRTForwarders-IncludeDebugCRT=false
+ /p:PowerToysRoot=$(Build.SourcesDirectory)
+ /p:PublishProfile=InstallationPublishProfile.pubxml
+ /bl:$(LogOutputDirectory)\publish-${{ join('_',split(project, '/')) }}.binlog
+ $(RestoreAdditionalProjectSourcesArg)
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ ### HACK: On ARM64 builds, building an app with Windows App SDK copies the x64 WebView2 dll instead of the ARM64 one. This task makes sure the right dll is used.
+ - task: CopyFiles@2
+ displayName: HACK Copy core WebView2 ARM64 dll to output directory
+ condition: eq(variables['BuildPlatform'],'arm64')
+ inputs:
+ contents: packages/Microsoft.Web.WebView2.1.0.2739.15/runtimes/win-ARM64/native_uap/Microsoft.Web.WebView2.Core.dll
+ targetFolder: $(Build.SourcesDirectory)/ARM64/Release/WinUI3Apps/
+ flattenFolders: True
+ OverWrite: True
+
+ # Check if deps.json files don't reference different dll versions.
+ - pwsh: |-
+ & '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+ displayName: Audit deps.json files for all applications
+
+ # Check if asset files on the main application paths are playing nice and avoiding basic conflicts.
+ - pwsh: |-
+ & '.pipelines/verifyPossibleAssetConflicts.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+ displayName: Audit base applications path asset conflicts
+
+ - pwsh: |-
+ & '.pipelines/verifyPossibleAssetConflicts.ps1' -targetDir '$(build.sourcesdirectory)\$(BuildPlatform)\$(BuildConfiguration)\WinUI3Apps'
+ displayName: Audit WinAppSDK applications path asset conflicts
+
+ # To streamline the pipeline and prevent errors, skip this step during compatibility tests with the latest WinAppSDK.
+ - ${{ if eq(parameters.useLatestWinAppSDK, false) }}:
+ - pwsh: |-
+ & '.pipelines/verifyNoticeMdAgainstNugetPackages.ps1' -path '$(build.sourcesdirectory)\'
+ displayName: Verify NOTICE.md and NuGet packages match
+
+ - ${{ if eq(parameters.runTests, true) }}:
+ # Publish test results which ran in MSBuild
+ - task: PublishTestResults@2
+ displayName: 'Publish Test Results'
+ inputs:
+ testResultsFormat: VSTest
+ testResultsFiles: '**/*.trx'
+ condition: ne(variables['BuildPlatform'],'arm64')
+
+ # Native dlls
+ - task: VSTest@2
+ condition: ne(variables['BuildPlatform'],'arm64') # No arm64 agents to run the tests.
+ displayName: 'Native Tests'
+ inputs:
+ platform: '$(BuildPlatform)'
+ configuration: '$(BuildConfiguration)'
+ testSelector: 'testAssemblies'
+ testAssemblyVer2: |
+ **\KeyboardManagerEngineTest.dll
+ **\KeyboardManagerEditorTest.dll
+ **\UnitTests-CommonLib.dll
+ **\PowerRenameUnitTests.dll
+ **\UnitTests-FancyZones.dll
+ !**\obj\**
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign Core PowerToys
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: '$(BuildPlatform)/$(BuildConfiguration)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_core.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: Sign DSC files
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'src/dsc/Microsoft.PowerToys.Configure'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_DSC.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ - template: steps-build-installer.yml
+ parameters:
+ codeSign: ${{ parameters.codeSign }}
+ signingIdentity: ${{ parameters.signingIdentity }}
+ versionNumber: ${{ parameters.versionNumber }}
+ additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
+
+ - template: steps-build-installer.yml
+ parameters:
+ codeSign: ${{ parameters.codeSign }}
+ signingIdentity: ${{ parameters.signingIdentity }}
+ versionNumber: ${{ parameters.versionNumber }}
+ additionalBuildOptions: ${{ parameters.additionalBuildOptions }}
+ buildUserInstaller: true # NOTE: This is the distinction between the above and below rules
+
+ # This saves ~1GiB per architecture. We won't need these later.
+ # Removes:
+ # - All .pdbs from any static libs .libs (which were only used during linking)
+ - pwsh: |-
+ $binDir = '$(Build.SourcesDirectory)'
+ $ImportLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.exp' | ForEach-Object { $_.FullName -Replace "exp$","lib" }
+ $StaticLibs = Get-ChildItem $binDir -Recurse -File -Filter '*.lib' | Where-Object FullName -NotIn $ImportLibs
+
+ $Items = @()
+ $Items += Get-Item ($StaticLibs.FullName -Replace "lib$","pdb") -ErrorAction:Ignore
+
+ $Items | Remove-Item -Recurse -Force -Verbose -ErrorAction:Ignore
+ displayName: Clean up static libs PDBs
+ errorActionPreference: silentlyContinue # It's OK if this silently fails
+
+ - task: CopyFiles@2
+ displayName: Stage Installers
+ inputs:
+ contents: "**/PowerToys*Setup-*.exe"
+ flattenFolders: True
+ targetFolder: $(JobOutputDirectory)
+
+ - task: CopyFiles@2
+ displayName: Stage Symbols
+ inputs:
+ contents: |-
+ **\*.pdb
+ !**\vc143.pdb
+ !**\*test*.pdb
+ flattenFolders: True
+ targetFolder: $(JobOutputDirectory)/symbols-$(BuildPlatform)/
+
+ - pwsh: |-
+ $p = "$(JobOutputDirectory)\"
+ $userHash = ((Get-Item $p\PowerToysUserSetup*.exe | Get-FileHash).Hash);
+ $machineHash = ((Get-Item $p\PowerToysSetup*.exe | Get-FileHash).Hash);
+ $userPlat = "hash_user_$(BuildPlatform).txt";
+ $machinePlat = "hash_machine_$(BuildPlatform).txt";
+ $combinedUserPath = $p + $userPlat;
+ $combinedMachinePath = $p + $machinePlat;
+
+ echo $p
+
+ echo $userPlat
+ echo $userHash
+ echo $combinedUserPath
+
+ echo $machinePlat
+ echo $machineHash
+ echo $combinedMachinePath
+
+ $userHash | out-file -filepath $combinedUserPath
+ $machineHash | out-file -filepath $combinedMachinePath
+ displayName: Calculate file hashes
+
+ # Publishing the GPO files
+ - pwsh: |-
+ New-Item "$(JobOutputDirectory)/gpo" -Type Directory
+ Copy-Item src\gpo\assets\* "$(JobOutputDirectory)/gpo" -Recurse
+ displayName: Stage GPO files
+
+ # Running the tests may result in future jobs consuming artifacts out of this build
+ - ${{ if eq(parameters.runTests, true) }}:
+ - task: CopyFiles@2
+ displayName: Stage entire build output
+ inputs:
+ sourceFolder: '$(Build.SourcesDirectory)'
+ contents: '$(BuildPlatform)/$(BuildConfiguration)/**/*'
+ targetFolder: '$(JobOutputDirectory)\$(BuildPlatform)\$(BuildConfiguration)'
+
+ - ${{ if eq(parameters.publishArtifacts, true) }}:
+ - publish: $(JobOutputDirectory)
+ artifact: $(JobOutputArtifactName)
+ displayName: Publish all outputs
+ condition: always()
\ No newline at end of file
diff --git a/.pipelines/v2/templates/steps-build-installer-vnext.yml b/.pipelines/v2/templates/steps-build-installer-vnext.yml
new file mode 100644
index 000000000000..4e62d82e8928
--- /dev/null
+++ b/.pipelines/v2/templates/steps-build-installer-vnext.yml
@@ -0,0 +1,184 @@
+parameters:
+ - name: versionNumber
+ type: string
+ default: "0.0.1"
+ - name: buildUserInstaller
+ type: boolean
+ default: false
+ - name: codeSign
+ type: boolean
+ default: false
+ - name: signingIdentity
+ type: object
+ default: {}
+ - name: additionalBuildOptions
+ type: string
+ default: ''
+
+steps:
+ - pwsh: |-
+ & git clean -xfd -e *exe -- .\installer\
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Clean installer to reduce cross-contamination
+
+ - pwsh: |-
+ $IsPerUser = $${{ parameters.buildUserInstaller }}
+ $InstallerBuildSlug = "MachineSetup"
+ $InstallerBasename = "PowerToysSetupVNext"
+ If($IsPerUser) {
+ $InstallerBuildSlug = "UserSetup"
+ $InstallerBasename = "PowerToysUserSetup"
+ }
+ $InstallerBasename += "-${{ parameters.versionNumber }}-$(BuildPlatform)"
+ Write-Host "##vso[task.setvariable variable=InstallerBuildSlug]$InstallerBuildSlug"
+ Write-Host "##vso[task.setvariable variable=InstallerRelativePath]$(BuildPlatform)\$(BuildConfiguration)\$InstallerBuildSlug"
+ Write-Host "##vso[task.setvariable variable=InstallerBasename]$InstallerBasename"
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Prepare Installer variables
+
+ # This dll needs to be built and signed before building the MSI.
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build PowerToysSetupCustomActions
+ inputs:
+ solution: "**/installer/PowerToysSetupVNext.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /t:PowerToysSetupCustomActions
+ /p:RunBuildEvents=true;PerUser=${{parameters.buildUserInstaller}};RestorePackagesConfig=true;CIBuild=true
+ -restore -graph
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-actions.binlog
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: true
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign PowerToysSetupCustomActions
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetupCustomActions/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ ## INSTALLER START
+ #### MSI BUILDING AND SIGNING
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build MSI
+ inputs:
+ solution: "**/installer/PowerToysSetupVNext.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ -restore
+ /t:PowerToysInstaller
+ /p:RunBuildEvents=false;PerUser=${{parameters.buildUserInstaller}};BuildProjectReferences=false;CIBuild=true
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-msi.binlog
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: false # don't undo our hard work above by deleting the CustomActions dll
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\dark.exe" -x $(build.sourcesdirectory)\extractedMsi installer\PowerToysSetupVNext\$(InstallerRelativePath)\$(InstallerBasename).msi
+ dir $(build.sourcesdirectory)\extractedMsi
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Extract and verify MSI"
+
+ # Check if deps.json files don't reference different dll versions.
+ - pwsh: |-
+ & '.pipelines/verifyDepsJsonLibraryVersions.ps1' -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Audit deps.json in MSI extracted files
+
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - pwsh: |-
+ & .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\File'
+ & .pipelines/versionAndSignCheck.ps1 -targetDir '$(build.sourcesdirectory)\extractedMsi\Binary'
+ git clean -xfd ./extractedMsi
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Verify all binaries are signed and versioned
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign MSI
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetupVNext/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+
+ #### END MSI
+ #### BOOTSTRAP BUILDING AND SIGNING
+
+ - task: VSBuild@1
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Build Bootstrapper
+ inputs:
+ solution: "**/installer/PowerToysSetupVNext.sln"
+ vsVersion: 17.0
+ msbuildArgs: >-
+ /t:PowerToysBootstrapper
+ /p:PerUser=${{parameters.buildUserInstaller}};CIBuild=true
+ /bl:$(LogOutputDirectory)\installer-$(InstallerBuildSlug)-bootstrapper.binlog
+ -restore -graph
+ ${{ parameters.additionalBuildOptions }}
+ platform: $(BuildPlatform)
+ configuration: $(BuildConfiguration)
+ clean: false # don't undo our hard work above by deleting the MSI
+ msbuildArchitecture: x64
+ maximumCpuCount: true
+
+ # The entirety of bundle unpacking/re-packing is unnecessary if we are not code signing it.
+ - ${{ if eq(parameters.codeSign, true) }}:
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ib installer\PowerToysSetupVNext\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\engine.exe
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Extract Engine from Bundle"
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign WiX Engine
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: "installer"
+ Pattern: engine.exe
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "KeyCode": "CP-230012",
+ "OperationCode": "SigntoolSign",
+ "Parameters": {
+ "OpusName": "Microsoft",
+ "OpusInfo": "http://www.microsoft.com",
+ "FileDigest": "/fd \"SHA256\"",
+ "PageHash": "/NPH",
+ "TimeStamp": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
+ },
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ },
+ {
+ "KeyCode": "CP-230012",
+ "OperationCode": "SigntoolVerify",
+ "Parameters": {},
+ "ToolName": "sign",
+ "ToolVersion": "1.0"
+ }
+ ]
+
+ - script: |-
+ "C:\Program Files (x86)\WiX Toolset v3.14\bin\insignia.exe" -ab installer\engine.exe installer\PowerToysSetupVNext\$(InstallerRelativePath)\$(InstallerBasename).exe -o installer\PowerToysSetupVNext\$(InstallerRelativePath)\$(InstallerBasename).exe
+ displayName: "${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Insignia: Merge Engine into Bundle"
+
+ - template: steps-esrp-signing.yml
+ parameters:
+ displayName: ${{replace(replace(parameters.buildUserInstaller,'True','👤'),'False','💻')}} Sign Final Bootstrapper
+ signingIdentity: ${{ parameters.signingIdentity }}
+ inputs:
+ FolderPath: 'installer/PowerToysSetupVNext/$(InstallerRelativePath)'
+ signType: batchSigning
+ batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_installer.json'
+ ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml'
+ #### END BOOTSTRAP
+ ## END INSTALLER
diff --git a/installer/PowerToysSetup.sln b/installer/PowerToysSetup.sln
index 540ef43d2366..39a2d5d97e1c 100644
--- a/installer/PowerToysSetup.sln
+++ b/installer/PowerToysSetup.sln
@@ -17,67 +17,52 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Version", "..\src\common\ve
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EtwTrace", "..\src\common\Telemetry\EtwTrace\EtwTrace.vcxproj", "{8F021B46-362B-485C-BFBA-CCF83E820CBD}"
EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PowerToysInstallerVNext", "PowerToysSetupVNext\PowerToysInstallerVNext.wixproj", "{B6E94700-DF38-41F6-A3FD-18B69674AB1E}"
+EndProject
+Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "PowerToysBootstrapperVNext", "PowerToysSetupVNext\PowerToysBootstrapperVNext.wixproj", "{DA4E9744-80BE-424C-B0F5-AFD8757DB575}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ARM64 = Debug|ARM64
- Debug|x64 = Debug|x64
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Debug|ARM64.Build.0 = Debug|ARM64
- {022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Debug|x64.ActiveCfg = Debug|x64
- {022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Debug|x64.Build.0 = Debug|x64
{022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Release|ARM64.ActiveCfg = Release|ARM64
{022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Release|ARM64.Build.0 = Release|ARM64
{022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Release|x64.ActiveCfg = Release|x64
{022A9D30-7C4F-416D-A9DF-5FF2661CC0AD}.Release|x64.Build.0 = Release|x64
- {32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Debug|x64.ActiveCfg = Debug|x64
- {32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Debug|x64.Build.0 = Debug|x64
{32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Release|ARM64.ActiveCfg = Release|ARM64
{32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Release|ARM64.Build.0 = Release|ARM64
{32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Release|x64.ActiveCfg = Release|x64
{32F3882B-F2D6-4586-B5ED-11E39E522BD3}.Release|x64.Build.0 = Release|x64
- {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x64.ActiveCfg = Debug|x64
- {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x64.Build.0 = Debug|x64
{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|ARM64.ActiveCfg = Release|ARM64
{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|ARM64.Build.0 = Release|ARM64
{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|x64.ActiveCfg = Release|x64
{7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|x64.Build.0 = Release|x64
- {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|x64.ActiveCfg = Debug|x64
- {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|x64.Build.0 = Debug|x64
{D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|ARM64.ActiveCfg = Release|ARM64
{D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|ARM64.Build.0 = Release|ARM64
{D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|x64.ActiveCfg = Release|x64
{D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|x64.Build.0 = Release|x64
- {31D72625-43C1-41B1-B784-BCE4A8DC5543}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {31D72625-43C1-41B1-B784-BCE4A8DC5543}.Debug|ARM64.Build.0 = Debug|ARM64
- {31D72625-43C1-41B1-B784-BCE4A8DC5543}.Debug|x64.ActiveCfg = Debug|x64
- {31D72625-43C1-41B1-B784-BCE4A8DC5543}.Debug|x64.Build.0 = Debug|x64
{31D72625-43C1-41B1-B784-BCE4A8DC5543}.Release|ARM64.ActiveCfg = Release|ARM64
{31D72625-43C1-41B1-B784-BCE4A8DC5543}.Release|ARM64.Build.0 = Release|ARM64
{31D72625-43C1-41B1-B784-BCE4A8DC5543}.Release|x64.ActiveCfg = Release|x64
{31D72625-43C1-41B1-B784-BCE4A8DC5543}.Release|x64.Build.0 = Release|x64
- {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|ARM64.Build.0 = Debug|ARM64
- {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.ActiveCfg = Debug|x64
- {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.Build.0 = Debug|x64
{CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|ARM64.ActiveCfg = Release|ARM64
{CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|ARM64.Build.0 = Release|ARM64
{CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.ActiveCfg = Release|x64
{CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.Build.0 = Release|x64
- {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|ARM64.Build.0 = Debug|ARM64
- {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x64.ActiveCfg = Debug|x64
- {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x64.Build.0 = Debug|x64
{8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|ARM64.ActiveCfg = Release|ARM64
{8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|ARM64.Build.0 = Release|ARM64
{8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x64.ActiveCfg = Release|x64
{8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x64.Build.0 = Release|x64
+ {B6E94700-DF38-41F6-A3FD-18B69674AB1E}.Release|ARM64.ActiveCfg = Release|x64
+ {B6E94700-DF38-41F6-A3FD-18B69674AB1E}.Release|ARM64.Build.0 = Release|x64
+ {B6E94700-DF38-41F6-A3FD-18B69674AB1E}.Release|x64.ActiveCfg = Release|x64
+ {B6E94700-DF38-41F6-A3FD-18B69674AB1E}.Release|x64.Build.0 = Release|x64
+ {DA4E9744-80BE-424C-B0F5-AFD8757DB575}.Release|ARM64.ActiveCfg = Release|x64
+ {DA4E9744-80BE-424C-B0F5-AFD8757DB575}.Release|ARM64.Build.0 = Release|x64
+ {DA4E9744-80BE-424C-B0F5-AFD8757DB575}.Release|x64.ActiveCfg = Release|x64
+ {DA4E9744-80BE-424C-B0F5-AFD8757DB575}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
index e2de4a40658b..0e1448f160f9 100644
--- a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
+++ b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj
@@ -78,8 +78,35 @@
call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\Workspaces.wxs"" ""$(ProjectDir)..\PowerToysSetup\Workspaces.wxs.bk""""
if not "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform)
if "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetup\generateAllFileComponents.ps1 -platform $(Platform) -installscopeperuser $(NormalizedPerUserValue)
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\AdvancedPaste.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\AdvancedPaste.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Awake.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Awake.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\BaseApplications.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\BaseApplications.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\ColorPicker.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\ColorPicker.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Core.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Core.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\EnvironmentVariables.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\EnvironmentVariables.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\FileExplorerPreview.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\FileExplorerPreview.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\FileLocksmith.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\FileLocksmith.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Hosts.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Hosts.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\ImageResizer.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\ImageResizer.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\KeyboardManager.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\KeyboardManager.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\MouseWithoutBorders.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\MouseWithoutBorders.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\NewPlus.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\NewPlus.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Peek.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Peek.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\PowerRename.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\PowerRename.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Product.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Product.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\RegistryPreview.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\RegistryPreview.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Resources.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Resources.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Run.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Run.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Settings.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Settings.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\ShortcutGuide.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\ShortcutGuide.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Tools.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Tools.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\WinAppSDK.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\WinAppSDK.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\WinUI3Applications.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\WinUI3Applications.wxs.bk""""
+ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetupVNext\Workspaces.wxs"" ""$(ProjectDir)..\PowerToysSetupVNext\Workspaces.wxs.bk""""
+ if not "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetupVNext\generateAllFileComponents.ps1 -platform $(Platform)
+ if "$(NormalizedPerUserValue)" == "true" call powershell.exe -NonInteractive -executionpolicy Unrestricted -File ..\PowerToysSetupVNext\generateAllFileComponents.ps1 -platform $(Platform) -installscopeperuser $(NormalizedPerUserValue)
- Backing up original files and populating .NET and WPF Runtime dependencies
+ Backing up original files and populating .NET and WPF Runtime dependencies for WiX3 based installer
diff --git a/installer/PowerToysSetupVNext/AdvancedPaste.wxs b/installer/PowerToysSetupVNext/AdvancedPaste.wxs
new file mode 100644
index 000000000000..a865ddbf6c01
--- /dev/null
+++ b/installer/PowerToysSetupVNext/AdvancedPaste.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Awake.wxs b/installer/PowerToysSetupVNext/Awake.wxs
new file mode 100644
index 000000000000..a8f5536ff41a
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Awake.wxs
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/BaseApplications.wxs b/installer/PowerToysSetupVNext/BaseApplications.wxs
new file mode 100644
index 000000000000..134a3ee89a12
--- /dev/null
+++ b/installer/PowerToysSetupVNext/BaseApplications.wxs
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/ColorPicker.wxs b/installer/PowerToysSetupVNext/ColorPicker.wxs
new file mode 100644
index 000000000000..0c744a7b2628
--- /dev/null
+++ b/installer/PowerToysSetupVNext/ColorPicker.wxs
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Common.wxi b/installer/PowerToysSetupVNext/Common.wxi
new file mode 100644
index 000000000000..21855a79363a
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Common.wxi
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Core.wxs b/installer/PowerToysSetupVNext/Core.wxs
new file mode 100644
index 000000000000..eb39fdc9db02
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Core.wxs
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ INSTALLDESKTOPSHORTCUT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/CustomDialogs/PTInstallDirDlg.wxs b/installer/PowerToysSetupVNext/CustomDialogs/PTInstallDirDlg.wxs
new file mode 100644
index 000000000000..d5697ec631de
--- /dev/null
+++ b/installer/PowerToysSetupVNext/CustomDialogs/PTInstallDirDlg.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/CustomDialogs/PTLicenseDlg.wxs b/installer/PowerToysSetupVNext/CustomDialogs/PTLicenseDlg.wxs
new file mode 100644
index 000000000000..ee7b75259133
--- /dev/null
+++ b/installer/PowerToysSetupVNext/CustomDialogs/PTLicenseDlg.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/installer/PowerToysSetupVNext/CustomDialogs/WixUI_PTInstallDir.wxs b/installer/PowerToysSetupVNext/CustomDialogs/WixUI_PTInstallDir.wxs
new file mode 100644
index 000000000000..a06d1ed278be
--- /dev/null
+++ b/installer/PowerToysSetupVNext/CustomDialogs/WixUI_PTInstallDir.wxs
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ "1"]]>
+
+ 1
+
+ NOT Installed
+ Installed AND PATCH
+
+ 1
+ 1
+
+ 1
+ 1
+ NOT WIXUI_DONTVALIDATEPATH
+ "1"]]>
+ WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"
+ 1
+ 1
+ NOT Installed
+ Installed AND NOT PATCH
+ Installed AND PATCH
+
+ 1
+
+ 1
+ 1
+ 1
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/EnvironmentVariables.wxs b/installer/PowerToysSetupVNext/EnvironmentVariables.wxs
new file mode 100644
index 000000000000..44567055afbe
--- /dev/null
+++ b/installer/PowerToysSetupVNext/EnvironmentVariables.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/FileExplorerPreview.wxs b/installer/PowerToysSetupVNext/FileExplorerPreview.wxs
new file mode 100644
index 000000000000..0a92d94c3ee1
--- /dev/null
+++ b/installer/PowerToysSetupVNext/FileExplorerPreview.wxs
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/FileLocksmith.wxs b/installer/PowerToysSetupVNext/FileLocksmith.wxs
new file mode 100644
index 000000000000..085e60eaa79d
--- /dev/null
+++ b/installer/PowerToysSetupVNext/FileLocksmith.wxs
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Hosts.wxs b/installer/PowerToysSetupVNext/Hosts.wxs
new file mode 100644
index 000000000000..cb86aa8e11b4
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Hosts.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/ImageResizer.wxs b/installer/PowerToysSetupVNext/ImageResizer.wxs
new file mode 100644
index 000000000000..9f4602939a5b
--- /dev/null
+++ b/installer/PowerToysSetupVNext/ImageResizer.wxs
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Images/banner.png b/installer/PowerToysSetupVNext/Images/banner.png
new file mode 100644
index 000000000000..25f878ee82b8
Binary files /dev/null and b/installer/PowerToysSetupVNext/Images/banner.png differ
diff --git a/installer/PowerToysSetupVNext/Images/dialog.png b/installer/PowerToysSetupVNext/Images/dialog.png
new file mode 100644
index 000000000000..b422990982c1
Binary files /dev/null and b/installer/PowerToysSetupVNext/Images/dialog.png differ
diff --git a/installer/PowerToysSetupVNext/Images/logo.png b/installer/PowerToysSetupVNext/Images/logo.png
new file mode 100644
index 000000000000..c9f940540507
Binary files /dev/null and b/installer/PowerToysSetupVNext/Images/logo.png differ
diff --git a/installer/PowerToysSetupVNext/Images/logo150.png b/installer/PowerToysSetupVNext/Images/logo150.png
new file mode 100644
index 000000000000..35e757d8e53b
Binary files /dev/null and b/installer/PowerToysSetupVNext/Images/logo150.png differ
diff --git a/installer/PowerToysSetupVNext/Images/logo44.png b/installer/PowerToysSetupVNext/Images/logo44.png
new file mode 100644
index 000000000000..b931931dff6c
Binary files /dev/null and b/installer/PowerToysSetupVNext/Images/logo44.png differ
diff --git a/installer/PowerToysSetupVNext/KeyboardManager.wxs b/installer/PowerToysSetupVNext/KeyboardManager.wxs
new file mode 100644
index 000000000000..dc216ccde301
--- /dev/null
+++ b/installer/PowerToysSetupVNext/KeyboardManager.wxs
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/MouseWithoutBorders.wxs b/installer/PowerToysSetupVNext/MouseWithoutBorders.wxs
new file mode 100644
index 000000000000..8a5efa1f8d03
--- /dev/null
+++ b/installer/PowerToysSetupVNext/MouseWithoutBorders.wxs
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/NewPlus.wxs b/installer/PowerToysSetupVNext/NewPlus.wxs
new file mode 100644
index 000000000000..4dd1c677010e
--- /dev/null
+++ b/installer/PowerToysSetupVNext/NewPlus.wxs
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Peek.wxs b/installer/PowerToysSetupVNext/Peek.wxs
new file mode 100644
index 000000000000..f87794e945a0
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Peek.wxs
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/PowerRename.wxs b/installer/PowerToysSetupVNext/PowerRename.wxs
new file mode 100644
index 000000000000..1e722d933459
--- /dev/null
+++ b/installer/PowerToysSetupVNext/PowerRename.wxs
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/PowerToys.wxs b/installer/PowerToysSetupVNext/PowerToys.wxs
new file mode 100644
index 000000000000..2e50d278fbd9
--- /dev/null
+++ b/installer/PowerToysSetupVNext/PowerToys.wxs
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ MinimumVersion >= DetectedPowerToysVersion
+ TargetPowerToysVersion >= DetectedPowerToysUserVersion OR WixBundleInstalled
+
+ MinimumVersion >= DetectedPowerToysUserVersion
+ TargetPowerToysVersion >= DetectedPowerToysVersion OR WixBundleInstalled
+
+
+
+
+ DetectedWindowsBuildNumber >= 19041 OR WixBundleInstalled
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/PowerToysBootstrapperVNext.wixproj b/installer/PowerToysSetupVNext/PowerToysBootstrapperVNext.wixproj
new file mode 100644
index 000000000000..f5ee3564c133
--- /dev/null
+++ b/installer/PowerToysSetupVNext/PowerToysBootstrapperVNext.wixproj
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+ Version=$(Version)
+ PowerToysVNextBootstrapper
+ {da4e9744-80be-424c-b0f5-afd8757db575}
+
+
+ $(DefineConstants);PerUser=true
+
+
+ $(DefineConstants);PerUser=false
+
+
+ Release
+ x64
+ arm64
+ 3.10
+ 2.0
+ PowerToysSetup-$(Version)-$(Platform)
+ Bundle
+ True
+ PowerToysSetup-$(Version)-$(Platform)
+ PowerToysUserSetup-$(Version)-$(Platform)
+ $(Platform)\$(Configuration)\MachineSetup
+ $(Platform)\$(Configuration)\UserSetup
+ obj\$(Platform)\$(Configuration)\
+
+
+
+
+
+
+
+ $(WixExtDir)\WixUtilExtension.dll
+ WixUtilExtension
+
+
+ $(WixExtDir)\WixUIExtension.dll
+ WixUIExtension
+
+
+ $(WixExtDir)\WixNetFxExtension.dll
+ WixNetFxExtension
+
+
+ $(WixExtDir)\WixBalExtension.dll
+ WixBalExtension
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+ <_ValidProjectsForRestore Include="$(MSBuildProjectFullPath)" />
+
+
+
+
\ No newline at end of file
diff --git a/installer/PowerToysSetupVNext/PowerToysInstallerVNext.wixproj b/installer/PowerToysSetupVNext/PowerToysInstallerVNext.wixproj
new file mode 100644
index 000000000000..e2c66c0f28ca
--- /dev/null
+++ b/installer/PowerToysSetupVNext/PowerToysInstallerVNext.wixproj
@@ -0,0 +1,189 @@
+
+
+
+
+
+ Version=$(Version);MonacoSRCHarvestPath=$(ProjectDir)..\..\x64\$(Configuration)\Assets\Monaco\monacoSRC
+
+ IF NOT DEFINED IsPipeline (
+call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
+SET PTRoot=$(SolutionDir)\..
+call "..\..\..\publish.cmd" x64
+)
+call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs"
+
+
+
+ Version=$(Version);MonacoSRCHarvestPath=$(ProjectDir)..\..\ARM64\$(Configuration)\Assets\Monaco\monacoSRC
+ IF NOT DEFINED IsPipeline (
+call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
+SET PTRoot=$(SolutionDir)\..
+call "..\..\..\publish.cmd" arm64
+)
+call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs"
+
+
+
+ Always
+
+ call move /Y ..\..\..\AdvancedPaste.wxs.bk ..\..\..\AdvancedPaste.wxs
+ call move /Y ..\..\..\Awake.wxs.bk ..\..\..\Awake.wxs
+ call move /Y ..\..\..\BaseApplications.wxs.bk ..\..\..\BaseApplications.wxs
+ call move /Y ..\..\..\ColorPicker.wxs.bk ..\..\..\ColorPicker.wxs
+ call move /Y ..\..\..\Core.wxs.bk ..\..\..\Core.wxs
+ call move /Y ..\..\..\EnvironmentVariables.wxs.bk ..\..\..\EnvironmentVariables.wxs
+ call move /Y ..\..\..\FileExplorerPreview.wxs.bk ..\..\..\FileExplorerPreview.wxs
+ call move /Y ..\..\..\FileLocksmith.wxs.bk ..\..\..\FileLocksmith.wxs
+ call move /Y ..\..\..\Hosts.wxs.bk ..\..\..\Hosts.wxs
+ call move /Y ..\..\..\ImageResizer.wxs.bk ..\..\..\ImageResizer.wxs
+ call move /Y ..\..\..\KeyboardManager.wxs.bk ..\..\..\KeyboardManager.wxs
+ call move /Y ..\..\..\MouseWithoutBorders.wxs.bk ..\..\..\MouseWithoutBorders.wxs
+ call move /Y ..\..\..\NewPlus.wxs.bk ..\..\..\NewPlus.wxs
+ call move /Y ..\..\..\Peek.wxs.bk ..\..\..\Peek.wxs
+ call move /Y ..\..\..\PowerRename.wxs.bk ..\..\..\PowerRename.wxs
+ call move /Y ..\..\..\Product.wxs.bk ..\..\..\Product.wxs
+ call move /Y ..\..\..\RegistryPreview.wxs.bk ..\..\..\RegistryPreview.wxs
+ call move /Y ..\..\..\Resources.wxs.bk ..\..\..\Resources.wxs
+ call move /Y ..\..\..\Run.wxs.bk ..\..\..\Run.wxs
+ call move /Y ..\..\..\Settings.wxs.bk ..\..\..\Settings.wxs
+ call move /Y ..\..\..\ShortcutGuide.wxs.bk ..\..\..\ShortcutGuide.wxs
+ call move /Y ..\..\..\Tools.wxs.bk ..\..\..\Tools.wxs
+ call move /Y ..\..\..\WinAppSDK.wxs.bk ..\..\..\WinAppSDK.wxs
+ call move /Y ..\..\..\WinUI3Applications.wxs.bk ..\..\..\WinUI3Applications.wxs
+ call move /Y ..\..\..\Workspaces.wxs.bk ..\..\..\Workspaces.wxs
+
+
+
+ $(DefineConstants);PerUser=true
+
+
+ $(DefineConstants);PerUser=false
+
+
+ PowerToysVNextInstaller
+
+ Release
+ $(Platform)
+ 3.10
+ {b6e94700-df38-41f6-a3fd-18b69674ab1e}
+ 2.0
+ PowerToysSetup-$(Version)-$(Platform)
+ PowerToysUserSetup-$(Version)-$(Platform)
+ Package
+ True
+
+
+
+
+ ICE91
+ 1026;1076
+
+
+ $(Platform)\$(Configuration)\MachineSetup
+ $(Platform)\$(Configuration)\UserSetup
+ obj\$(Platform)\$(Configuration)\MachineSetup
+ obj\$(Platform)\$(Configuration)\UserSetup
+ ICE40
+
+
+
+
+ -v -sh -sw1108
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(WixExtDir)\WixFirewallExtension.dll
+ WixFirewallExtension
+
+
+ $(WixExtDir)\WixUtilExtension.dll
+ WixUtilExtension
+
+
+ $(WixExtDir)\WixUIExtension.dll
+ WixUIExtension
+
+
+ $(WixExtDir)\WixNetFxExtension.dll
+ WixNetFxExtension
+
+
+
+
+
+
+
+ PowerToysSetupCustomActions
+ {32f3882b-f2d6-4586-b5ed-11e39e522bd3}
+ True
+ True
+ Binaries;Content;Satellites
+ INSTALLFOLDER
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+ <_ValidProjectsForRestore Include="$(MSBuildProjectFullPath)" />
+
+
+
+
\ No newline at end of file
diff --git a/installer/PowerToysSetupVNext/Product.wxs b/installer/PowerToysSetupVNext/Product.wxs
new file mode 100644
index 000000000000..33dc8d0e550e
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Product.wxs
@@ -0,0 +1,471 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ = 19041)]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+
+ NOT Installed
+ 1
+ NOT Installed
+ NOT Installed
+ Installed AND _REMOVE_ALL="Yes"
+ Installed AND _REMOVE_ALL="Yes"
+ Installed AND NOT (_REMOVE_ALL="Yes")
+ Installed AND NOT (_REMOVE_ALL="Yes")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ""]]>
+
+
+ DEFAULTBOOTSTRAPPERINSTALLFOLDER OR PREVIOUSINSTALLFOLDER = ""]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ NOT Installed
+
+
+ NOT Installed
+
+
+
+
+
+
+
+
+
+ NOT Installed
+
+
+ Installed and (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
+
+
+ Installed AND (REMOVE="ALL")
+
+
+ Installed AND (REMOVE="ALL")
+
+
+ Installed AND (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
+
+
+ Installed AND (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
+
+
+ WIX_UPGRADE_DETECTED
+
+
+ Installed AND (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
+
+
+
+
+
+ Installed AND (REMOVE="ALL")
+
+
+
+ NOT Installed
+
+
+ NOT Installed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/RegistryPreview.wxs b/installer/PowerToysSetupVNext/RegistryPreview.wxs
new file mode 100644
index 000000000000..f7bd3948d422
--- /dev/null
+++ b/installer/PowerToysSetupVNext/RegistryPreview.wxs
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Resources.wxs b/installer/PowerToysSetupVNext/Resources.wxs
new file mode 100644
index 000000000000..0f4e10f4a64e
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Resources.wxs
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Run.wxs b/installer/PowerToysSetupVNext/Run.wxs
new file mode 100644
index 000000000000..94a589585f49
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Run.wxs
@@ -0,0 +1,448 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Settings.wxs b/installer/PowerToysSetupVNext/Settings.wxs
new file mode 100644
index 000000000000..07a2b056dc61
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Settings.wxs
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/ShortcutGuide.wxs b/installer/PowerToysSetupVNext/ShortcutGuide.wxs
new file mode 100644
index 000000000000..729a80586101
--- /dev/null
+++ b/installer/PowerToysSetupVNext/ShortcutGuide.wxs
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Tools.wxs b/installer/PowerToysSetupVNext/Tools.wxs
new file mode 100644
index 000000000000..24c3fc2007e9
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Tools.wxs
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/WebView2/MicrosoftEdgeWebview2Setup.exe b/installer/PowerToysSetupVNext/WebView2/MicrosoftEdgeWebview2Setup.exe
new file mode 100644
index 000000000000..d95ba2e89363
Binary files /dev/null and b/installer/PowerToysSetupVNext/WebView2/MicrosoftEdgeWebview2Setup.exe differ
diff --git a/installer/PowerToysSetupVNext/WinAppSDK.wxs b/installer/PowerToysSetupVNext/WinAppSDK.wxs
new file mode 100644
index 000000000000..631fb033efb8
--- /dev/null
+++ b/installer/PowerToysSetupVNext/WinAppSDK.wxs
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/WinUI3Applications.wxs b/installer/PowerToysSetupVNext/WinUI3Applications.wxs
new file mode 100644
index 000000000000..742f3dcf80db
--- /dev/null
+++ b/installer/PowerToysSetupVNext/WinUI3Applications.wxs
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/Workspaces.wxs b/installer/PowerToysSetupVNext/Workspaces.wxs
new file mode 100644
index 000000000000..4237aab94548
--- /dev/null
+++ b/installer/PowerToysSetupVNext/Workspaces.wxs
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/installer/PowerToysSetupVNext/generateAllFileComponents.ps1 b/installer/PowerToysSetupVNext/generateAllFileComponents.ps1
new file mode 100644
index 000000000000..3592b14362ba
--- /dev/null
+++ b/installer/PowerToysSetupVNext/generateAllFileComponents.ps1
@@ -0,0 +1,323 @@
+[CmdletBinding()]
+Param(
+ [Parameter(Mandatory = $True, Position = 1)]
+ [string]$platform,
+ [Parameter(Mandatory = $False, Position = 2)]
+ [string]$installscopeperuser = "false"
+)
+
+Function Generate-FileList() {
+ [CmdletBinding()]
+ Param(
+ # Can be multiple files separated by ; as long as they're on the same directory
+ [Parameter(Mandatory = $True, Position = 1)]
+ [AllowEmptyString()]
+ [string]$fileDepsJson,
+ [Parameter(Mandatory = $True, Position = 2)]
+ [string]$fileListName,
+ [Parameter(Mandatory = $True, Position = 3)]
+ [string]$wxsFilePath,
+ # If there is no deps.json file, just pass path to files
+ [Parameter(Mandatory = $False, Position = 4)]
+ [string]$depsPath,
+ # launcher plugins are being loaded into launcher process,
+ # so there are some additional dependencies to skip
+ [Parameter(Mandatory = $False, Position = 5)]
+ [bool]$isLauncherPlugin
+ )
+
+ $fileWxs = Get-Content $wxsFilePath;
+
+ $fileExclusionList = @("*.pdb", "*.lastcodeanalysissucceeded", "createdump.exe", "powertoys.exe")
+
+ $fileInclusionList = @("*.dll", "*.exe", "*.json", "*.msix", "*.png", "*.gif", "*.ico", "*.cur", "*.svg", "index.html", "reg.js", "gitignore.js", "srt.js", "monacoSpecialLanguages.js", "customTokenThemeRules.js", "*.pri")
+
+ $dllsToIgnore = @("System.CodeDom.dll", "WindowsBase.dll")
+
+ if ($fileDepsJson -eq [string]::Empty) {
+ $fileDepsRoot = $depsPath
+ } else {
+ $multipleDepsJson = $fileDepsJson.Split(";")
+
+ foreach ( $singleDepsJson in $multipleDepsJson )
+ {
+
+ $fileDepsRoot = (Get-ChildItem $singleDepsJson).Directory.FullName
+ $depsJson = Get-Content $singleDepsJson | ConvertFrom-Json
+
+ $runtimeList = ([array]$depsJson.targets.PSObject.Properties)[-1].Value.PSObject.Properties | Where-Object {
+ $_.Name -match "runtimepack.*Runtime"
+ };
+
+ $runtimeList | ForEach-Object {
+ $_.Value.PSObject.Properties.Value | ForEach-Object {
+ $fileExclusionList += $_.PSObject.Properties.Name
+ }
+ }
+ }
+ }
+
+ $fileExclusionList = $fileExclusionList | Where-Object {$_ -notin $dllsToIgnore}
+
+ if ($isLauncherPlugin -eq $True) {
+ $fileInclusionList += @("*.deps.json")
+ $fileExclusionList += @("Ijwhost.dll", "PowerToys.Common.UI.dll", "PowerToys.GPOWrapper.dll", "PowerToys.GPOWrapperProjection.dll", "PowerToys.PowerLauncher.Telemetry.dll", "PowerToys.ManagedCommon.dll", "PowerToys.Settings.UI.Lib.dll", "Wox.Infrastructure.dll", "Wox.Plugin.dll")
+ }
+
+ $fileList = Get-ChildItem $fileDepsRoot -Include $fileInclusionList -Exclude $fileExclusionList -File -Name
+
+ $fileWxs = $fileWxs -replace "(<\?define $($fileListName)=)", "") {
+ [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'fileList',
+ Justification = 'variable is used in another scope')]
+
+ $fileList = $matches[2] -split ';'
+ return
+ }
+ }
+
+ $componentId = "$($fileListName)_Component"
+
+ $componentDefs = "`r`n"
+ $componentDefs +=
+ @"
+
+
+
+ `r`n
+"@
+
+ foreach ($file in $fileList) {
+ $fileTmp = $file -replace "-", "_"
+ $componentDefs +=
+ @"
+ `r`n
+"@
+ }
+
+ $componentDefs +=
+ @"
+ `r`n
+"@
+
+ $wxsFile = $wxsFile -replace "\s+()", $componentDefs
+
+ $componentRef =
+ @"
+
+"@
+
+ $wxsFile = $wxsFile -replace "\s+()", "$componentRef`r`n "
+
+ Set-Content -Path $wxsFilePath -Value $wxsFile
+}
+
+if ($platform -ceq "arm64") {
+ $platform = "ARM64"
+}
+
+if ($installscopeperuser -eq "true") {
+ $registryroot = "HKCU"
+} else {
+ $registryroot = "HKLM"
+}
+
+#BaseApplications
+Generate-FileList -fileDepsJson "" -fileListName BaseApplicationsFiles -wxsFilePath $PSScriptRoot\BaseApplications.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release"
+Generate-FileComponents -fileListName "BaseApplicationsFiles" -wxsFilePath $PSScriptRoot\BaseApplications.wxs -regroot $registryroot
+
+#WinUI3Applications
+Generate-FileList -fileDepsJson "" -fileListName WinUI3ApplicationsFiles -wxsFilePath $PSScriptRoot\WinUI3Applications.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps"
+Generate-FileComponents -fileListName "WinUI3ApplicationsFiles" -wxsFilePath $PSScriptRoot\WinUI3Applications.wxs -regroot $registryroot
+
+#AdvancedPaste
+Generate-FileList -fileDepsJson "" -fileListName AdvancedPasteAssetsFiles -wxsFilePath $PSScriptRoot\AdvancedPaste.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\AdvancedPaste"
+Generate-FileComponents -fileListName "AdvancedPasteAssetsFiles" -wxsFilePath $PSScriptRoot\AdvancedPaste.wxs -regroot $registryroot
+
+#AwakeFiles
+Generate-FileList -fileDepsJson "" -fileListName AwakeImagesFiles -wxsFilePath $PSScriptRoot\Awake.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\Awake"
+Generate-FileComponents -fileListName "AwakeImagesFiles" -wxsFilePath $PSScriptRoot\Awake.wxs -regroot $registryroot
+
+#ColorPicker
+Generate-FileList -fileDepsJson "" -fileListName ColorPickerAssetsFiles -wxsFilePath $PSScriptRoot\ColorPicker.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\ColorPicker"
+Generate-FileComponents -fileListName "ColorPickerAssetsFiles" -wxsFilePath $PSScriptRoot\ColorPicker.wxs -regroot $registryroot
+
+#Environment Variables
+Generate-FileList -fileDepsJson "" -fileListName EnvironmentVariablesAssetsFiles -wxsFilePath $PSScriptRoot\EnvironmentVariables.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\EnvironmentVariables"
+Generate-FileComponents -fileListName "EnvironmentVariablesAssetsFiles" -wxsFilePath $PSScriptRoot\EnvironmentVariables.wxs -regroot $registryroot
+
+#FileExplorerAdd-ons
+Generate-FileList -fileDepsJson "" -fileListName MonacoPreviewHandlerMonacoAssetsFiles -wxsFilePath $PSScriptRoot\FileExplorerPreview.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\Monaco"
+Generate-FileList -fileDepsJson "" -fileListName MonacoPreviewHandlerCustomLanguagesFiles -wxsFilePath $PSScriptRoot\FileExplorerPreview.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\Monaco\customLanguages"
+Generate-FileComponents -fileListName "MonacoPreviewHandlerMonacoAssetsFiles" -wxsFilePath $PSScriptRoot\FileExplorerPreview.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "MonacoPreviewHandlerCustomLanguagesFiles" -wxsFilePath $PSScriptRoot\FileExplorerPreview.wxs -regroot $registryroot
+
+#FileLocksmith
+Generate-FileList -fileDepsJson "" -fileListName FileLocksmithAssetsFiles -wxsFilePath $PSScriptRoot\FileLocksmith.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\FileLocksmith"
+Generate-FileComponents -fileListName "FileLocksmithAssetsFiles" -wxsFilePath $PSScriptRoot\FileLocksmith.wxs -regroot $registryroot
+
+#Hosts
+Generate-FileList -fileDepsJson "" -fileListName HostsAssetsFiles -wxsFilePath $PSScriptRoot\Hosts.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Hosts"
+Generate-FileComponents -fileListName "HostsAssetsFiles" -wxsFilePath $PSScriptRoot\Hosts.wxs -regroot $registryroot
+
+#ImageResizer
+Generate-FileList -fileDepsJson "" -fileListName ImageResizerAssetsFiles -wxsFilePath $PSScriptRoot\ImageResizer.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\ImageResizer"
+Generate-FileComponents -fileListName "ImageResizerAssetsFiles" -wxsFilePath $PSScriptRoot\ImageResizer.wxs -regroot $registryroot
+
+#New+
+Generate-FileList -fileDepsJson "" -fileListName NewPlusAssetsFiles -wxsFilePath $PSScriptRoot\NewPlus.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\NewPlus"
+Generate-FileComponents -fileListName "NewPlusAssetsFiles" -wxsFilePath $PSScriptRoot\NewPlus.wxs -regroot $registryroot
+
+#Peek
+Generate-FileList -fileDepsJson "" -fileListName PeekAssetsFiles -wxsFilePath $PSScriptRoot\Peek.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Peek\"
+Generate-FileComponents -fileListName "PeekAssetsFiles" -wxsFilePath $PSScriptRoot\Peek.wxs -regroot $registryroot
+
+#PowerRename
+Generate-FileList -fileDepsJson "" -fileListName PowerRenameAssetsFiles -wxsFilePath $PSScriptRoot\PowerRename.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\PowerRename\"
+Generate-FileComponents -fileListName "PowerRenameAssetsFiles" -wxsFilePath $PSScriptRoot\PowerRename.wxs -regroot $registryroot
+
+#RegistryPreview
+Generate-FileList -fileDepsJson "" -fileListName RegistryPreviewAssetsFiles -wxsFilePath $PSScriptRoot\RegistryPreview.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\RegistryPreview\"
+Generate-FileComponents -fileListName "RegistryPreviewAssetsFiles" -wxsFilePath $PSScriptRoot\RegistryPreview.wxs -regroot $registryroot
+
+#Run
+Generate-FileList -fileDepsJson "" -fileListName launcherImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\PowerLauncher"
+Generate-FileComponents -fileListName "launcherImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+## Plugins
+###Calculator
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Calculator\Microsoft.PowerToys.Run.Plugin.Calculator.deps.json" -fileListName calcComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName calcImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Calculator\Images"
+Generate-FileComponents -fileListName "calcComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "calcImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Folder
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Folder\Microsoft.Plugin.Folder.deps.json" -fileListName FolderComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName FolderImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Folder\Images"
+Generate-FileComponents -fileListName "FolderComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "FolderImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Program
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Program\Microsoft.Plugin.Program.deps.json" -fileListName ProgramComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName ProgramImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Program\Images"
+Generate-FileComponents -fileListName "ProgramComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "ProgramImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Shell
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Shell\Microsoft.Plugin.Shell.deps.json" -fileListName ShellComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName ShellImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Shell\Images"
+Generate-FileComponents -fileListName "ShellComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "ShellImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Indexer
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Indexer\Microsoft.Plugin.Indexer.deps.json" -fileListName IndexerComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName IndexerImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Indexer\Images"
+Generate-FileComponents -fileListName "IndexerComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "IndexerImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###UnitConverter
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\UnitConverter\Community.PowerToys.Run.Plugin.UnitConverter.deps.json" -fileListName UnitConvCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName UnitConvImagesCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\UnitConverter\Images"
+Generate-FileComponents -fileListName "UnitConvCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "UnitConvImagesCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###WebSearch
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WebSearch\Community.PowerToys.Run.Plugin.WebSearch.deps.json" -fileListName WebSrchCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName WebSrchImagesCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WebSearch\Images"
+Generate-FileComponents -fileListName "WebSrchCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "WebSrchImagesCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###History
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\History\Microsoft.PowerToys.Run.Plugin.History.deps.json" -fileListName HistoryPluginComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName HistoryPluginImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\History\Images"
+Generate-FileComponents -fileListName "HistoryPluginComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "HistoryPluginImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Uri
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Uri\Microsoft.Plugin.Uri.deps.json" -fileListName UriComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName UriImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Uri\Images"
+Generate-FileComponents -fileListName "UriComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "UriImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###VSCodeWorkspaces
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\VSCodeWorkspaces\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.deps.json" -fileListName VSCWrkCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName VSCWrkImagesCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\VSCodeWorkspaces\Images"
+Generate-FileComponents -fileListName "VSCWrkCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "VSCWrkImagesCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###WindowWalker
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowWalker\Microsoft.Plugin.WindowWalker.deps.json" -fileListName WindowWlkrCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName WindowWlkrImagesCompFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowWalker\Images"
+Generate-FileComponents -fileListName "WindowWlkrCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "WindowWlkrImagesCompFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###OneNote
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\OneNote\Microsoft.PowerToys.Run.Plugin.OneNote.deps.json" -fileListName OneNoteComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName OneNoteImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\OneNote\Images"
+Generate-FileComponents -fileListName "OneNoteComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "OneNoteImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Registry
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Registry\Microsoft.PowerToys.Run.Plugin.Registry.deps.json" -fileListName RegistryComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName RegistryImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Registry\Images"
+Generate-FileComponents -fileListName "RegistryComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "RegistryImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###Service
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Service\Microsoft.PowerToys.Run.Plugin.Service.deps.json" -fileListName ServiceComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName ServiceImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\Service\Images"
+Generate-FileComponents -fileListName "ServiceComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "ServiceImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###System
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\System\Microsoft.PowerToys.Run.Plugin.System.deps.json" -fileListName SystemComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName SystemImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\System\Images"
+Generate-FileComponents -fileListName "SystemComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "SystemImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###TimeDate
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\TimeDate\Microsoft.PowerToys.Run.Plugin.TimeDate.deps.json" -fileListName TimeDateComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName TimeDateImagesComponentFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\TimeDate\Images"
+Generate-FileComponents -fileListName "TimeDateComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "TimeDateImagesComponentFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###WindowsSettings
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowsSettings\Microsoft.PowerToys.Run.Plugin.WindowsSettings.deps.json" -fileListName WinSetCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName WinSetImagesCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowsSettings\Images"
+Generate-FileComponents -fileListName "WinSetCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "WinSetImagesCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###WindowsTerminal
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowsTerminal\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.deps.json" -fileListName WinTermCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName WinTermImagesCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\WindowsTerminal\Images"
+Generate-FileComponents -fileListName "WinTermCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "WinTermImagesCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###PowerToys
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\PowerToys\Microsoft.PowerToys.Run.Plugin.PowerToys.deps.json" -fileListName PowerToysCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName PowerToysImagesCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\PowerToys\Images"
+Generate-FileComponents -fileListName "PowerToysCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "PowerToysImagesCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+###ValueGenerator
+Generate-FileList -fileDepsJson "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\ValueGenerator\Community.PowerToys.Run.Plugin.ValueGenerator.deps.json" -fileListName ValueGeneratorCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -isLauncherPlugin 1
+Generate-FileList -fileDepsJson "" -fileListName ValueGeneratorImagesCmpFiles -wxsFilePath $PSScriptRoot\Run.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\RunPlugins\ValueGenerator\Images"
+Generate-FileComponents -fileListName "ValueGeneratorCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "ValueGeneratorImagesCmpFiles" -wxsFilePath $PSScriptRoot\Run.wxs -regroot $registryroot
+## Plugins
+
+#ShortcutGuide
+Generate-FileList -fileDepsJson "" -fileListName ShortcutGuideSvgFiles -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\ShortcutGuide\"
+Generate-FileComponents -fileListName "ShortcutGuideSvgFiles" -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -regroot $registryroot
+
+#Settings
+Generate-FileList -fileDepsJson "" -fileListName SettingsV2AssetsFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\"
+Generate-FileList -fileDepsJson "" -fileListName SettingsV2AssetsModulesFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\Modules\"
+Generate-FileList -fileDepsJson "" -fileListName SettingsV2OOBEAssetsModulesFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\Modules\OOBE\"
+Generate-FileList -fileDepsJson "" -fileListName SettingsV2OOBEAssetsFluentIconsFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\Icons\"
+Generate-FileComponents -fileListName "SettingsV2AssetsFiles" -wxsFilePath $PSScriptRoot\Settings.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "SettingsV2AssetsModulesFiles" -wxsFilePath $PSScriptRoot\Settings.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "SettingsV2OOBEAssetsModulesFiles" -wxsFilePath $PSScriptRoot\Settings.wxs -regroot $registryroot
+Generate-FileComponents -fileListName "SettingsV2OOBEAssetsFluentIconsFiles" -wxsFilePath $PSScriptRoot\Settings.wxs -regroot $registryroot
+
+#Workspaces
+Generate-FileList -fileDepsJson "" -fileListName WorkspacesImagesComponentFiles -wxsFilePath $PSScriptRoot\Workspaces.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\Workspaces\"
+Generate-FileComponents -fileListName "WorkspacesImagesComponentFiles" -wxsFilePath $PSScriptRoot\Workspaces.wxs -regroot $registryroot
diff --git a/installer/PowerToysSetupVNext/generateMonacoWxs.ps1 b/installer/PowerToysSetupVNext/generateMonacoWxs.ps1
new file mode 100644
index 000000000000..94536618da4f
--- /dev/null
+++ b/installer/PowerToysSetupVNext/generateMonacoWxs.ps1
@@ -0,0 +1,70 @@
+[CmdletBinding()]
+Param(
+ [Parameter(Mandatory = $True, Position = 1)]
+ [string]$monacoWxsFile
+)
+
+$fileWxs = Get-Content $monacoWxsFile;
+
+$fileWxs = $fileWxs -replace " KeyPath=`"yes`" ", " "
+
+$newFileContent = ""
+
+$componentId = "error"
+$directories = @()
+
+$fileWxs | ForEach-Object {
+ $line = $_;
+ if ($line -match "") {
+ $line +=
+@"
+`r`n
+ `r`n
+"@
+ }
+ if ($line -match "") {
+ $directories += $matches[1]
+ }
+ if ($line -match "") {
+ $line =
+@"
+
+
+
+
+"@
+ }
+
+ $newFileContent += $line + "`r`n";
+}
+
+$removeFolderEntries =
+@"
+`r`n
+
+
+ `r`n
+"@
+
+$directories | ForEach-Object {
+
+ $removeFolderEntries +=
+@"
+
+
+"@
+}
+
+$removeFolderEntries +=
+@"
+
+"@
+
+
+
+$newFileContent = $newFileContent -replace "\s+()", "$removeFolderEntries`r`n "
+
+Set-Content -Path $monacoWxsFile -Value $newFileContent
\ No newline at end of file
diff --git a/installer/PowerToysSetupVNext/packages.config b/installer/PowerToysSetupVNext/packages.config
new file mode 100644
index 000000000000..569e1bea867b
--- /dev/null
+++ b/installer/PowerToysSetupVNext/packages.config
@@ -0,0 +1,3 @@
+
+
+
diff --git a/installer/PowerToysSetupVNext/publish.cmd b/installer/PowerToysSetupVNext/publish.cmd
new file mode 100644
index 000000000000..18fa40b4aa18
--- /dev/null
+++ b/installer/PowerToysSetupVNext/publish.cmd
@@ -0,0 +1,17 @@
+setlocal enableDelayedExpansion
+
+IF NOT DEFINED PTRoot (SET PTRoot=..\..)
+
+SET PlatformArg=%1
+IF NOT DEFINED PlatformArg (SET PlatformArg=x64)
+SET VCToolsVersion=!VCToolsVersion!
+SET ClearDevCommandPromptEnvVars=false
+
+rem In case of Release we should not use Debug CRT in VCRT forwarders
+msbuild !PTRoot!\src\modules\previewpane\MonacoPreviewHandler\MonacoPreviewHandler.csproj -t:Publish -p:Configuration="Release" -p:Platform="!PlatformArg!" -p:AppxBundle=Never -p:PowerToysRoot=!PTRoot! -p:VCRTForwarders-IncludeDebugCRT=false -p:PublishProfile=InstallationPublishProfile.pubxml
+
+msbuild !PTRoot!\src\modules\previewpane\MarkdownPreviewHandler\MarkdownPreviewHandler.csproj -t:Publish -p:Configuration="Release" -p:Platform="!PlatformArg!" -p:AppxBundle=Never -p:PowerToysRoot=!PTRoot! -p:VCRTForwarders-IncludeDebugCRT=false -p:PublishProfile=InstallationPublishProfile.pubxml
+
+msbuild !PTRoot!\src\modules\previewpane\SvgPreviewHandler\SvgPreviewHandler.csproj -t:Publish -p:Configuration="Release" -p:Platform="!PlatformArg!" -p:AppxBundle=Never -p:PowerToysRoot=!PTRoot! -p:VCRTForwarders-IncludeDebugCRT=false -p:PublishProfile=InstallationPublishProfile.pubxml
+
+msbuild !PTRoot!\src\modules\previewpane\SvgThumbnailProvider\SvgThumbnailProvider.csproj -t:Publish -p:Configuration="Release" -p:Platform="!PlatformArg!" -p:AppxBundle=Never -p:PowerToysRoot=!PTRoot! -p:VCRTForwarders-IncludeDebugCRT=false -p:PublishProfile=InstallationPublishProfile.pubxml
diff --git a/installer/PowerToysSetupVNext/terminate_powertoys.cmd b/installer/PowerToysSetupVNext/terminate_powertoys.cmd
new file mode 100644
index 000000000000..8206b90aaeb4
--- /dev/null
+++ b/installer/PowerToysSetupVNext/terminate_powertoys.cmd
@@ -0,0 +1,12 @@
+@echo off
+setlocal ENABLEDELAYEDEXPANSION
+
+@REM We loop here until taskkill cannot find a PowerToys process. We can't use /F flag, because it
+@REM doesn't give application an opportunity to cleanup. Thus we send WM_CLOSE which is being caught
+@REM by multiple windows running a msg loop in PowerToys.exe process, which we close one by one.
+for /l %%x in (1, 1, 100) do (
+ taskkill /IM PowerToys.exe 1>NUL 2>NUL
+ if !ERRORLEVEL! NEQ 0 goto quit
+)
+
+:quit
\ No newline at end of file
diff --git a/installer/wixVNext.props b/installer/wixVNext.props
new file mode 100644
index 000000000000..d33624a8c7a8
--- /dev/null
+++ b/installer/wixVNext.props
@@ -0,0 +1,14 @@
+
+
+
+ C:\Program Files (x86)\WiX Toolset v3.14\bin\
+ $(WixInstallPath)\
+
+ $(WixInstallPath)\..\wix.targets
+ $(WixInstallPath)\..\lux.targets
+
+ $(WixInstallPath)\WixTasks.dll
+ $(WixInstallPath)\..\sdk\
+ $(WixSdkPath)\..\wix.ca.targets
+
+
\ No newline at end of file