2.5.2

(fix): Fix dynamic snippet generator to emit placeholder auth values when snippet requests omit auth for endpoints that require bearer, OAuth, basic, or header authentication. Previously the generated constructor call was missing the required auth parameter, causing phpstan failures.


2.5.1

(chore): Bump @fern-api/generator-cli to 0.9.11. The GitHub pipeline step now creates signed commits via the GitHub REST API (matching fiddle’s legacy InMemoryGitRepo push path), restoring verified fern-api[bot] commits on replay-enabled orgs.

2.5.0

(feat): Add offsetSemantics config option. When set to "page-index", offset pagination increments by 1 each page instead of by the number of items returned ("item-index", the default).

2.4.4

(fix): Fix wire test verification for endpoints with multi-value array query parameters.

2.4.3

(chore): Add crash reporting via Sentry to the generator runtime, and classify thrown errors using the new shared GeneratorError taxonomy so user-facing failures (config, validation, auth, network, environment) are kept distinct from internal Fern bugs — only the latter are forwarded to Sentry. No change to generated output.


2.4.2

(chore): Bump phpunit/phpunit dev dependency from 9.0 to 12.5.22 to address GHSA-qrr6-mg7r-m243 (argument injection via newline in PHP INI values forwarded to child processes). Also bumps the PHP version used by the generated ci.yml workflow from 8.1 to 8.3, which is the minimum supported by PHPUnit 12. The php constraint in generated composer.json files is unchanged at 8.1, so production installs (composer install --no-dev) are unaffected.


2.4.1

(chore): Bump @fern-api/generator-cli to 0.9.8. Changelog URLs in generated PRs now use the commit SHA instead of the PR branch name, keeping the link valid after the branch is deleted or squash-merged.


2.4.0

(feat): Support omitting username or password from basic auth when configured via usernameOmit or passwordOmit in the IR. Omitted fields are removed from the SDK’s public API and treated as empty strings internally (e.g., omitting password encodes username:, omitting username encodes :password). When both are omitted, the Authorization header is skipped entirely.

2.3.1

(chore): Migrate template engine from lodash to Eta for consistency with other generators.

2.3.0

(feat): Add maxRetries custom config option to override the default maximum number of retries for failed requests. The default remains 2 when not specified.


2.3.2-rc.0

(feat): Upgrade to IR v66 which compresses the IR Name type, reducing IR size and increasing performance.


2.2.6

(fix): Support multiple Basic Auth schemes with AuthSchemesRequirement.Any. When an API defines more than one basic auth scheme (e.g., accountId/authToken and apiKey/apiKeySecret), the generated client now produces conditional if/else if blocks that check which credential pair was provided and sets the Authorization header accordingly. Previously, only the first basic auth scheme was used.


2.2.5

(fix): Wire Basic Auth credentials into the Authorization header. Previously, the generated client accepted username/password constructor parameters but never set the Authorization: Basic <base64> header on outgoing requests. The constructor now encodes the credentials and adds the header automatically.


2.2.4

(fix): Thread endpoint ID through dynamic snippet generator to differentiate generated snippets by endpoint.

2.2.3

(fix): Fix 204 No Content handling for endpoints with a JSON response type. Previously, endpoints returning an empty body (e.g. 204) would throw a BrevoException even on a successful response. Now all JSON response return types are nullable (?Type) and the generated code returns null instead of throwing when the response body is empty.


2.2.2

(fix): Fix JSON deserialization error when API returns an empty response body for endpoints with a declared JSON response type. Previously, a JsonException: Syntax error was thrown because the SDK attempted to JSON-decode an empty string. Now the generated code checks for an empty response body before attempting deserialization and returns null gracefully.