diff --git a/IgniteUI.png b/IgniteUI.png
new file mode 100644
index 0000000..20091a4
Binary files /dev/null and b/IgniteUI.png differ
diff --git a/Infragistics.QueryBuilder.Executor.csproj b/Infragistics.QueryBuilder.Executor.csproj
index 102ae96..68f937c 100644
--- a/Infragistics.QueryBuilder.Executor.csproj
+++ b/Infragistics.QueryBuilder.Executor.csproj
@@ -4,12 +4,36 @@
net9.0
enable
enable
+ Infragistics.QueryBuilder.Executor
+ Infragistics Inc.
+ Infragistics Inc.
+ Infragistics Inc.
+ A .NET 9 library for dynamic, strongly-typed query building and execution over Entity Framework Core data sources. Supports advanced filtering, projection, and SQL generation.
+ 1.0.0.0
+ We want to generate the version attributes at runtime and we need this flag enabled for that<-->
+ true
+ true
+ false
+ MIT
+ Infragistics
+ ReadMe.md
+ https://github.com/IgniteUI/Infragistics.QueryBuilder.Executor
+ https://github.com/IgniteUI/Infragistics.QueryBuilder.Executor
+ git
+ https://github.com/IgniteUI/Infragistics.QueryBuilder.Executor
+ Infragistics;App Builder;Ignite UI;Filtering;Query;Query Builder;Models
+ IgniteUI.png
+
+
+ True
+
+
diff --git a/azure-pipelines/build-and-publish.yml b/azure-pipelines/build-and-publish.yml
new file mode 100644
index 0000000..4426eaa
--- /dev/null
+++ b/azure-pipelines/build-and-publish.yml
@@ -0,0 +1,124 @@
+trigger:
+ tags:
+ include:
+ - '*'
+# This pipeline is meant to build & deploy upon tagging. It's not meant to be a part of PR validation.
+pr: none
+
+name: $(Build.SourceBranchName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)
+
+variables:
+- group: Code_Signing_Certificate_2023_2026
+- name: prId
+ value: $[coalesce(variables['System.PullRequest.PullRequestId'], '000')]
+- name: prIteration
+ value: $[counter(variables['prId'], 1)]
+- name: buildConfiguration
+ value: Release
+- name: releaseTag
+ value: $(Build.SourceBranchName)
+
+stages:
+- stage: BuildAndPublish
+ condition: succeeded()
+ jobs:
+ - job: BuildAndSign
+ pool:
+ vmImage: 'windows-latest'
+
+ steps:
+ - checkout: self
+ fetchDepth: 0
+
+ - task: UseDotNet@2
+ inputs:
+ packageType: 'sdk'
+ version: '9.x'
+
+ - task: DownloadSecureFile@1
+ name: cert
+ inputs:
+ secureFile: 'code-signing-certificate-2023-2026.pfx'
+
+ - task: DotNetCoreCLI@2
+ displayName: 'Build Project'
+ inputs:
+ command: 'build'
+ projects: 'Infragistics.QueryBuilder.Executor.csproj'
+ arguments: >
+ -c $(buildConfiguration)
+ /p:Version=$(releaseTag)
+
+ - powershell: |
+ $outputDir = "$(Build.SourcesDirectory)\bin\$(buildConfiguration)\net9.0"
+ Write-Host "Listing contents of: $outputDir"
+ if (-Not (Test-Path $outputDir)) {
+ Write-Error "Output folder not found: $outputDir"
+ exit 1
+ }
+ Get-ChildItem $outputDir -Recurse | ForEach-Object {
+ Write-Host $_.FullName
+ }
+ displayName: 'Debug: List build output contents'
+
+ - powershell: |
+ $dllFolder = "$(Build.SourcesDirectory)\bin\$(buildConfiguration)\net9.0"
+ Write-Host "Signing DLLs in folder: $dllFolder"
+
+ $signtoolPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\signtool.exe"
+ Write-Host "Using signtool at: $signtoolPath"
+
+ $dllFiles = Get-ChildItem -Path $dllFolder -Filter *.dll -Recurse
+ foreach ($dll in $dllFiles) {
+ Write-Host "Signing $($dll.FullName)..."
+ & $signtoolPath sign /f $(cert.secureFilePath) /p $env:CERT_PASS /tr $(SigningCertificateTimestampUrl) /td sha256 /fd sha256 $dll.FullName
+
+ if ($LASTEXITCODE -ne 0) {
+ Write-Error "Signing failed for $($dll.FullName)"
+ exit 1
+ }
+ }
+ displayName: 'Sign all DLL files with PFX certificate'
+ env:
+ CERT_PASS: $(SigningCertificatePassword)
+
+ - powershell: |
+ $packageOutputDir = "$(Build.ArtifactStagingDirectory)\nuget"
+ $packageVersion = "$(releaseTag)"
+
+ Write-Host "Packing project from existing build output..."
+ dotnet pack ./Infragistics.QueryBuilder.Executor.csproj `
+ --no-build `
+ --configuration $(buildConfiguration) `
+ -p:PackageVersion=$packageVersion `
+ -o $packageOutputDir
+
+ if ($LASTEXITCODE -ne 0) {
+ Write-Error "dotnet pack failed"
+ exit 1
+ }
+ displayName: 'Pack NuGet Package using PowerShell'
+
+ - task: PowerShell@2
+ displayName: 'Sign NuGet package'
+ env:
+ CERT_PASS: $(SigningCertificatePassword)
+ inputs:
+ targetType: 'inline'
+ script: |
+ nuget.exe sign $(Build.ArtifactStagingDirectory)\nuget\*.nupkg -CertificatePath $(cert.secureFilePath) -CertificatePassword $env:CERT_PASS -Timestamper $(SigningCertificateTimestampUrl)
+
+ - task: PublishBuildArtifacts@1
+ inputs:
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/nuget'
+ ArtifactName: 'NuGetPackage'
+ publishLocation: 'Container'
+ displayName: 'Publish NuGet Package as Build Artifact'
+
+ - task: NuGetCommand@2
+ inputs:
+ command: 'push'
+ packagesToPush: '$(Build.ArtifactStagingDirectory)/nuget/*.nupkg'
+ nuGetFeedType: 'external'
+ publishFeedCredentials: 'NuGet.Org'
+ displayName: 'Publish to NuGet.org'