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.