Fix Infisical v4 query params, convert flags to switches, fix changelog regex

- InfisicalSecretsClient: use projectId / includeImports (camelCase) per Infisical v4 OpenAPI
- Get-InfisicalSecrets / Get-InfisicalSecret: change [bool] flag parameters to [switch]
- DesignSpec.md: updated 14.3 / 14.4 examples to match new switch syntax
- build.ps1: anchor Update-Changelog regex to the literal '## Unreleased' line and limit replacement to 1 to stop exponential duplication of carried-forward markers
- Manifest bumped to 2026.06.03.0032 (commit c866760105)
This commit is contained in:
GraceSolutions
2026-06-02 20:33:12 -04:00
parent c866760105
commit 7e5209190a
8 changed files with 39 additions and 31 deletions
+6
View File
@@ -6,6 +6,12 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) loos
## Unreleased ## Unreleased
## 2026.06.03.0032
- Build produced from commit c86676010532.
## Unreleased (carried forward)
## 2026.06.02.1907 ## 2026.06.02.1907
- Build produced from commit fa65c18bc171. - Build produced from commit fa65c18bc171.
+2 -2
View File
@@ -1,6 +1,6 @@
@{ @{
RootModule = 'PSInfisicalAPI.psm1' RootModule = 'PSInfisicalAPI.psm1'
ModuleVersion = '2026.06.02.1907' ModuleVersion = '2026.06.03.0032'
GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51' GUID = 'b8a2f3d4-7c51-4d2f-9e6a-1f0c8b3d4e51'
Author = 'Grace Solutions' Author = 'Grace Solutions'
CompanyName = 'Grace Solutions' CompanyName = 'Grace Solutions'
@@ -27,7 +27,7 @@
LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html' LicenseUri = 'https://www.gnu.org/licenses/agpl-3.0.html'
ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI' ProjectUri = 'https://prod.git.gracesolution.info/gsadmin/PSInfisicalAPI'
ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.' ReleaseNotes = 'See CHANGELOG.md in the project repository for release history.'
CommitHash = 'fa65c18bc171' CommitHash = 'c86676010532'
} }
} }
} }
Binary file not shown.
+3 -1
View File
@@ -133,7 +133,9 @@ function Update-Changelog {
if ($existing -match [Regex]::Escape($marker)) { return } if ($existing -match [Regex]::Escape($marker)) { return }
$insertion = "## $Version`r`n`r`n- Build produced from commit $CommitHash.`r`n`r`n" $insertion = "## $Version`r`n`r`n- Build produced from commit $CommitHash.`r`n`r`n"
$updated = $existing -replace '## Unreleased', "## Unreleased`r`n`r`n$insertion## Unreleased (carried forward)" $unreleasedRegex = [regex]::new('(?m)^## Unreleased\r?$')
if (-not $unreleasedRegex.IsMatch($existing)) { return }
$updated = $unreleasedRegex.Replace($existing, "## Unreleased`r`n`r`n$insertion## Unreleased (carried forward)", 1)
[System.IO.File]::WriteAllText($ChangelogFile.FullName, $updated, [System.Text.UTF8Encoding]::new($false)) [System.IO.File]::WriteAllText($ChangelogFile.FullName, $updated, [System.Text.UTF8Encoding]::new($false))
} }
+12 -12
View File
@@ -954,10 +954,10 @@ Get-InfisicalSecrets `
[-Environment <string>] ` [-Environment <string>] `
[-SecretPath <string>] ` [-SecretPath <string>] `
[-Recursive] ` [-Recursive] `
[-IncludeImports <bool>] ` [-IncludeImports] `
[-IncludePersonalOverrides] ` [-IncludePersonalOverrides] `
[-ExpandSecretReferences <bool>] ` [-ExpandSecretReferences] `
[-ViewSecretValue <bool>] ` [-ViewSecretValue] `
[-MetadataFilter <hashtable>] ` [-MetadataFilter <hashtable>] `
[-TagSlugs <string[]>] [-TagSlugs <string[]>]
``` ```
@@ -969,9 +969,9 @@ ProjectId: Current connection ProjectId
Environment: Current connection Environment Environment: Current connection Environment
SecretPath: Current connection DefaultSecretPath or / SecretPath: Current connection DefaultSecretPath or /
Recursive: false Recursive: false
IncludeImports: true IncludeImports: false
ExpandSecretReferences: true ExpandSecretReferences: false
ViewSecretValue: true ViewSecretValue: false
``` ```
## Behavior ## Behavior
@@ -1020,9 +1020,9 @@ Get-InfisicalSecret `
[-SecretPath <string>] ` [-SecretPath <string>] `
[-Version <int>] ` [-Version <int>] `
[-Type <InfisicalSecretType>] ` [-Type <InfisicalSecretType>] `
[-ViewSecretValue <bool>] ` [-ViewSecretValue] `
[-ExpandSecretReferences <bool>] ` [-ExpandSecretReferences] `
[-IncludeImports <bool>] [-IncludeImports]
``` ```
## Parameter Attributes ## Parameter Attributes
@@ -1040,9 +1040,9 @@ ProjectId: Current connection ProjectId
Environment: Current connection Environment Environment: Current connection Environment
SecretPath: Current connection DefaultSecretPath or / SecretPath: Current connection DefaultSecretPath or /
Type: Shared Type: Shared
ViewSecretValue: true ViewSecretValue: false
ExpandSecretReferences: true ExpandSecretReferences: false
IncludeImports: true IncludeImports: false
``` ```
## Behavior ## Behavior
@@ -18,9 +18,9 @@ namespace PSInfisicalAPI.Cmdlets
[Parameter] public string SecretPath { get; set; } [Parameter] public string SecretPath { get; set; }
[Parameter] public int? Version { get; set; } [Parameter] public int? Version { get; set; }
[Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared; [Parameter] public InfisicalSecretType Type { get; set; } = InfisicalSecretType.Shared;
[Parameter] public bool ViewSecretValue { get; set; } = true; [Parameter] public SwitchParameter ViewSecretValue { get; set; }
[Parameter] public bool ExpandSecretReferences { get; set; } = true; [Parameter] public SwitchParameter ExpandSecretReferences { get; set; }
[Parameter] public bool IncludeImports { get; set; } = true; [Parameter] public SwitchParameter IncludeImports { get; set; }
protected override void ProcessRecord() protected override void ProcessRecord()
{ {
@@ -36,9 +36,9 @@ namespace PSInfisicalAPI.Cmdlets
SecretPath = SecretPath, SecretPath = SecretPath,
Version = Version, Version = Version,
Type = Type.ToString(), Type = Type.ToString(),
ViewSecretValue = ViewSecretValue, ViewSecretValue = ViewSecretValue.IsPresent,
ExpandSecretReferences = ExpandSecretReferences, ExpandSecretReferences = ExpandSecretReferences.IsPresent,
IncludeImports = IncludeImports IncludeImports = IncludeImports.IsPresent
}; };
InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger); InfisicalSecretsClient client = new InfisicalSecretsClient(HttpClient, Logger);
@@ -16,10 +16,10 @@ namespace PSInfisicalAPI.Cmdlets
[Parameter] public string Environment { get; set; } [Parameter] public string Environment { get; set; }
[Parameter] public string SecretPath { get; set; } [Parameter] public string SecretPath { get; set; }
[Parameter] public SwitchParameter Recursive { get; set; } [Parameter] public SwitchParameter Recursive { get; set; }
[Parameter] public bool IncludeImports { get; set; } = true; [Parameter] public SwitchParameter IncludeImports { get; set; }
[Parameter] public SwitchParameter IncludePersonalOverrides { get; set; } [Parameter] public SwitchParameter IncludePersonalOverrides { get; set; }
[Parameter] public bool ExpandSecretReferences { get; set; } = true; [Parameter] public SwitchParameter ExpandSecretReferences { get; set; }
[Parameter] public bool ViewSecretValue { get; set; } = true; [Parameter] public SwitchParameter ViewSecretValue { get; set; }
[Parameter] public Hashtable MetadataFilter { get; set; } [Parameter] public Hashtable MetadataFilter { get; set; }
[Parameter] public string[] TagSlugs { get; set; } [Parameter] public string[] TagSlugs { get; set; }
@@ -35,10 +35,10 @@ namespace PSInfisicalAPI.Cmdlets
Environment = Environment, Environment = Environment,
SecretPath = SecretPath, SecretPath = SecretPath,
Recursive = Recursive.IsPresent, Recursive = Recursive.IsPresent,
IncludeImports = IncludeImports, IncludeImports = IncludeImports.IsPresent,
IncludePersonalOverrides = IncludePersonalOverrides.IsPresent, IncludePersonalOverrides = IncludePersonalOverrides.IsPresent,
ExpandSecretReferences = ExpandSecretReferences, ExpandSecretReferences = ExpandSecretReferences.IsPresent,
ViewSecretValue = ViewSecretValue, ViewSecretValue = ViewSecretValue.IsPresent,
MetadataFilter = ToStringDictionary(MetadataFilter), MetadataFilter = ToStringDictionary(MetadataFilter),
TagSlugs = TagSlugs TagSlugs = TagSlugs
}; };
@@ -35,11 +35,11 @@ namespace PSInfisicalAPI.Secrets
InfisicalEndpointDefinition definition = InfisicalEndpointRegistry.Get(InfisicalEndpointNames.ListSecrets); InfisicalEndpointDefinition definition = InfisicalEndpointRegistry.Get(InfisicalEndpointNames.ListSecrets);
List<KeyValuePair<string, string>> queryParameters = new List<KeyValuePair<string, string>>(); List<KeyValuePair<string, string>> queryParameters = new List<KeyValuePair<string, string>>();
AddIfNotNull(queryParameters, "workspaceId", FirstNonEmpty(query.ProjectId, connection.ProjectId)); AddIfNotNull(queryParameters, "projectId", FirstNonEmpty(query.ProjectId, connection.ProjectId));
AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment)); AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment));
AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/")); AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/"));
queryParameters.Add(new KeyValuePair<string, string>("recursive", query.Recursive ? "true" : "false")); queryParameters.Add(new KeyValuePair<string, string>("recursive", query.Recursive ? "true" : "false"));
if (query.IncludeImports.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("include_imports", query.IncludeImports.Value ? "true" : "false")); } if (query.IncludeImports.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("includeImports", query.IncludeImports.Value ? "true" : "false")); }
if (query.IncludePersonalOverrides) { queryParameters.Add(new KeyValuePair<string, string>("includePersonalOverrides", "true")); } if (query.IncludePersonalOverrides) { queryParameters.Add(new KeyValuePair<string, string>("includePersonalOverrides", "true")); }
if (query.ExpandSecretReferences.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("expandSecretReferences", query.ExpandSecretReferences.Value ? "true" : "false")); } if (query.ExpandSecretReferences.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("expandSecretReferences", query.ExpandSecretReferences.Value ? "true" : "false")); }
if (query.ViewSecretValue.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("viewSecretValue", query.ViewSecretValue.Value ? "true" : "false")); } if (query.ViewSecretValue.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("viewSecretValue", query.ViewSecretValue.Value ? "true" : "false")); }
@@ -93,14 +93,14 @@ namespace PSInfisicalAPI.Secrets
Dictionary<string, string> pathParameters = new Dictionary<string, string> { { "secretName", query.SecretName } }; Dictionary<string, string> pathParameters = new Dictionary<string, string> { { "secretName", query.SecretName } };
List<KeyValuePair<string, string>> queryParameters = new List<KeyValuePair<string, string>>(); List<KeyValuePair<string, string>> queryParameters = new List<KeyValuePair<string, string>>();
AddIfNotNull(queryParameters, "workspaceId", FirstNonEmpty(query.ProjectId, connection.ProjectId)); AddIfNotNull(queryParameters, "projectId", FirstNonEmpty(query.ProjectId, connection.ProjectId));
AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment)); AddIfNotNull(queryParameters, "environment", FirstNonEmpty(query.Environment, connection.Environment));
AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/")); AddIfNotNull(queryParameters, "secretPath", FirstNonEmpty(query.SecretPath, connection.DefaultSecretPath, "/"));
AddIfNotNull(queryParameters, "type", string.IsNullOrEmpty(query.Type) ? "shared" : query.Type.ToLowerInvariant()); AddIfNotNull(queryParameters, "type", string.IsNullOrEmpty(query.Type) ? "shared" : query.Type.ToLowerInvariant());
if (query.Version.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("version", query.Version.Value.ToString(CultureInfo.InvariantCulture))); } if (query.Version.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("version", query.Version.Value.ToString(CultureInfo.InvariantCulture))); }
if (query.ViewSecretValue.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("viewSecretValue", query.ViewSecretValue.Value ? "true" : "false")); } if (query.ViewSecretValue.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("viewSecretValue", query.ViewSecretValue.Value ? "true" : "false")); }
if (query.ExpandSecretReferences.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("expandSecretReferences", query.ExpandSecretReferences.Value ? "true" : "false")); } if (query.ExpandSecretReferences.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("expandSecretReferences", query.ExpandSecretReferences.Value ? "true" : "false")); }
if (query.IncludeImports.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("include_imports", query.IncludeImports.Value ? "true" : "false")); } if (query.IncludeImports.HasValue) { queryParameters.Add(new KeyValuePair<string, string>("includeImports", query.IncludeImports.Value ? "true" : "false")); }
Uri uri = InfisicalUriBuilder.Build(connection.BaseUri, definition, pathParameters, queryParameters); Uri uri = InfisicalUriBuilder.Build(connection.BaseUri, definition, pathParameters, queryParameters);
InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, "RetrieveSecret", uri, null); InfisicalHttpResponse response = ExecuteAuthorized(connection, definition, "RetrieveSecret", uri, null);