3.63.5
(fix): Support inferred OAuth auth with form-encoded (application/x-www-form-urlencoded) token endpoints.
Previously, the generator crashed with “Cannot get exported name for request wrapper” when the
token endpoint used a justRequestBody shape instead of a wrapper shape.
3.63.4
(fix): Propagate license config to the license field in generated
package.json when publishing to npm registries.
3.63.3
(fix): Fix undiscriminated union variant matching in dynamic snippets selecting
incorrect variants when errors are added during conversion. The matcher
now checks whether errors were added (via errors.size() > errorsBefore)
alongside the existing isNop check, preventing empty objects from being
returned for union fields like options in generated code snippets.
3.63.1
(fix): Fix wire test expected response mismatch when noSerdeLayer is enabled and
the IR example shape contains fewer properties than the JSON example (e.g. for
inline types). The mock server sends the full raw JSON body, but the expected
assertion was built from the typed example which only included a subset of
properties. The test generator now uses the raw response body as the expected
value when noSerdeLayer is enabled, matching the SDK’s pass-through behavior.
3.63.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.
3.62.1
(fix): Fix incorrect import paths in generated test files when using a custom
package path (e.g. src/management). Multi-line imports in test files
like makeRequest.test.ts were emitting ../../../src/management/core/...
instead of ../../../core/..., causing the import to resolve to a
nonexistent path.
3.62.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.
3.61.1
(feat): Propagate the original error as cause on the SDK error class using the
ES2022 Error.cause standard. When a custom fetcher throws (e.g. network
failure, DNS issues, or custom logic), the thrown error is now preserved as
error.cause on the resulting SDK error, giving consumers access to the
full stack trace and any custom properties from the original error.
3.60.9
(fix): Fix wire test generator emitting pagination assertions (hasNextPage, getNextPage)
for endpoints whose results property type is a named alias to a list rather than
a direct list type. The client generator does not produce a Page object in this case,
so the test was calling methods that don’t exist on the response. The test generator
now checks that the results property value type is a concrete list (or optional/nullable
wrapping a list) before emitting Page-specific assertions, matching the client
generator’s behavior.
3.61.0-rc.0
(feat): Upgrade to IR v66 which reduces the IR size by a lot and increases performance.
3.60.8
(fix): Sanitize non-primitive path parameter example values at test-generation time.
When the IR contains object-typed path params (e.g. from unknown types), the
test generator now coerces them to the parameter’s original name string and
rebuilds the mock URL accordingly. This prevents [object Object] in generated
wire test URLs regardless of the CLI version used to produce the IR.
3.60.7
(fix): Fix auto-generated error test examples producing object path parameter values
(e.g. { key: "value" }) instead of strings. Path parameters are always scalar
URL segments, so generatePathParameterExamples now coerces non-primitive values
to a string fallback derived from the parameter name. This prevents [object Object]
from appearing in generated wire test URLs and removes the getMockUrlForExample
workaround added in 3.60.5.
3.60.6
(fix): Fix wire test generator asserting hasNextPage().toBe(true) for offset-paginated
endpoints when the example response has has_more: false (or equivalent
hasNextPage property set to false). The generator now checks the actual value
of the has-next-page property in the mock response and skips the hasNextPage()
and getNextPage() assertions when the example indicates there is no next page,
matching the SDK’s runtime behavior.
3.60.5
(fix): Fix wire test mock URL encoding mismatch for path parameters with non-primitive
example values. The IR’s example.url uses JSON.stringify for object path
parameter values (e.g. %7B%22key%22%3A%22value%22%7D), but the SDK’s
encodePathParam uses String() (producing %5Bobject%20Object%5D). The test
generator now reconstructs mock URLs using the same encoding as encodePathParam,
ensuring MSW intercepts requests correctly in auto-generated error test cases.
3.60.4
(chore): Redirect biome/lint/formatter output to a separate log file (/tmp/fern-*.log)
inside the Docker container instead of piping to the main generation log.
This reduces noise in the primary output while still preserving the tool
output for debugging.
3.63.2
(fix): Support alphabetical body parameter sorting in webhook signature verification.
When the IR specifies bodySort: ALPHABETICAL on the payload format, the generated
verifySignature method now accepts string | Record<string, string> for the
requestBody parameter. When a Record is provided, keys are sorted alphabetically
and concatenated as key-value pairs before signing. This is required by providers
whose signing algorithm sorts POST body parameters alphabetically.
3.60.3
(chore): Update @biomejs/biome from 2.4.9 to 2.4.10.
3.60.2
(fix): Fix request body properties being stripped when query parameter names
collide with body property names and resolveQueryParameterNameConflicts
is enabled. The destructuring pattern in the generated client method now
correctly uses the renamed query parameter property (e.g. filterIsComplete)
instead of the wire value (e.g. is_complete), preventing body properties
from being accidentally extracted as query parameters.
3.60.1
(fix): Fix WebSocket connections missing client-level default headers. The generated
connect method now includes this._options?.headers in the merged headers,
matching the behavior of HTTP endpoint methods. Previously, only auth headers
and user-provided connect-time headers were sent, causing Authorization and
other client-configured headers to be silently dropped on WebSocket connections.
3.60.0
(feat): Add Environments section to generated README showing how to select
different environments (production/sandbox) when initializing the client.
3.59.12
(fix): Fix duplicate property names in generated request interfaces when query
parameters and request body properties share the same wire name and
x-fern-parameter-name overrides are used with noSerdeLayer: true.
The generator now respects explicit name overrides (e.g.
x-fern-parameter-name: filter_assigned_to) even without a serde layer,
so query parameters use their override names instead of wire values.
3.59.10
(chore): Update oxfmt from 0.35.0 to 0.42.0, oxlint from 1.50.0 to 1.57.0, and oxlint-tsgolint from 0.14.2 to 0.17.4.
3.59.11
(fix): Fix wire test generation for SSE streaming endpoints where expected event
assertions used snake_case wire format instead of camelCase deserialized format.
The call_id field (and similar snake_case properties) in SSE event data now
correctly appear as callId in test expectations, matching the SDK’s runtime
deserialization behavior.
3.59.9
(chore): Upgrade vitest from ^3.2.4 to ^4.1.1 in generated SDK test configuration.
Vitest 4 brings performance improvements (especially with project-based configs), more accurate V8 coverage remapping, and stable browser mode. Note that vitest 4 requires Node.js >= 20 at test-run time (Node 18 is EOL).
3.59.8
(chore): Upgrade generated SDK dependencies to latest stable versions:
- typescript ~5.7.2 -> ~5.9.3
- @biomejs/biome 2.4.3 -> 2.4.9
- prettier 3.7.4 -> 3.8.1
- webpack ^5.97.1 -> ^5.105.4
- ts-loader ^9.5.1 -> ^9.5.4
- ws ^8.16.0 -> ^8.20.0
- @types/ws ^8.5.10 -> ^8.18.1
- readable-stream ^4.5.2 -> ^4.7.0
- @types/readable-stream ^4.0.18 -> ^4.0.23
- form-data-encoder ^4.0.2 -> ^4.1.0
- pnpm 10.20.0 -> 10.33.0
3.59.7
(fix): Extend globalThis. qualification for shadowed global types (e.g. Date) to
union visitor signatures and builder parameters, not just interface properties.
(fix): Fix Record serialization schema for maps with optional value types to strip
the optional wrapper, matching the type converter’s behavior.
3.59.6
(fix): Thread endpoint ID through dynamic snippet generator to differentiate
generated snippets by endpoint.
3.59.5
(fix): Fix unhandled WebSocket error crash when closing a connection in the CONNECTING state.
The _disconnect() and _handleAbort() methods removed all event listeners before
calling close(), but close() on a CONNECTING-state WebSocket emits an error event
asynchronously via abortHandshake(). A no-op error listener is now attached after
removing listeners to prevent this from crashing the Node.js process.