@postman/sdk-config 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/index.cjs +214 -9
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +1 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +214 -9
  6. package/dist/index.js.map +1 -1
  7. package/dist/sdk-config/index.cjs +214 -9
  8. package/dist/sdk-config/index.cjs.map +1 -1
  9. package/dist/sdk-config/index.d.cts +1 -1
  10. package/dist/sdk-config/index.d.ts +1 -1
  11. package/dist/sdk-config/index.js +214 -9
  12. package/dist/sdk-config/index.js.map +1 -1
  13. package/dist/sdk-config/v1/index.cjs +214 -9
  14. package/dist/sdk-config/v1/index.cjs.map +1 -1
  15. package/dist/sdk-config/v1/index.d.cts +234 -2
  16. package/dist/sdk-config/v1/index.d.ts +234 -2
  17. package/dist/sdk-config/v1/index.js +214 -9
  18. package/dist/sdk-config/v1/index.js.map +1 -1
  19. package/dist/sdk-config-ir/index.cjs +39 -1
  20. package/dist/sdk-config-ir/index.cjs.map +1 -1
  21. package/dist/sdk-config-ir/index.d.cts +1 -1
  22. package/dist/sdk-config-ir/index.d.ts +1 -1
  23. package/dist/sdk-config-ir/index.js +39 -1
  24. package/dist/sdk-config-ir/index.js.map +1 -1
  25. package/dist/sdk-config-ir/v1/index.cjs +39 -1
  26. package/dist/sdk-config-ir/v1/index.cjs.map +1 -1
  27. package/dist/sdk-config-ir/v1/index.d.cts +186 -2
  28. package/dist/sdk-config-ir/v1/index.d.ts +186 -2
  29. package/dist/sdk-config-ir/v1/index.js +39 -1
  30. package/dist/sdk-config-ir/v1/index.js.map +1 -1
  31. package/dist/{typescript-CsAa1VSy.d.cts → typescript-Byhn4MqL.d.cts} +64 -0
  32. package/dist/{typescript-CsAa1VSy.d.ts → typescript-Byhn4MqL.d.ts} +64 -0
  33. package/package.json +1 -1
  34. package/src/sdk-config-ir/v1/README.md +79 -31
@@ -44,6 +44,10 @@ declare const packageConfigSchema: z.ZodObject<{
44
44
  description: z.ZodOptional<z.ZodString>;
45
45
  repository: z.ZodOptional<z.ZodString>;
46
46
  homepage: z.ZodOptional<z.ZodString>;
47
+ bugs: z.ZodOptional<z.ZodObject<{
48
+ url: z.ZodOptional<z.ZodString>;
49
+ email: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strict>>;
47
51
  documentationUrl: z.ZodOptional<z.ZodString>;
48
52
  authors: z.ZodOptional<z.ZodArray<z.ZodObject<{
49
53
  name: z.ZodString;
@@ -304,6 +308,7 @@ declare const mcpGenerationConfigSchema: z.ZodObject<{
304
308
  name: z.ZodEnum<{
305
309
  axios: "axios";
306
310
  fetch: "fetch";
311
+ "node-fetch": "node-fetch";
307
312
  }>;
308
313
  }, z.core.$strict>>;
309
314
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -323,6 +328,35 @@ declare const mcpGenerationConfigSchema: z.ZodObject<{
323
328
  exportClassDefault: z.ZodOptional<z.ZodBoolean>;
324
329
  namespaceExportName: z.ZodOptional<z.ZodString>;
325
330
  consolidateTypeFiles: z.ZodOptional<z.ZodBoolean>;
331
+ formDataSupport: z.ZodOptional<z.ZodEnum<{
332
+ Node16: "Node16";
333
+ Node18: "Node18";
334
+ }>>;
335
+ allowExtraFields: z.ZodOptional<z.ZodBoolean>;
336
+ generateSubpackageExports: z.ZodOptional<z.ZodBoolean>;
337
+ exportAllRequestsAtRoot: z.ZodOptional<z.ZodBoolean>;
338
+ generateEndpointMetadata: z.ZodOptional<z.ZodBoolean>;
339
+ outputEsm: z.ZodOptional<z.ZodBoolean>;
340
+ neverThrowErrors: z.ZodOptional<z.ZodBoolean>;
341
+ includeOtherInUnionTypes: z.ZodOptional<z.ZodBoolean>;
342
+ includeUtilsOnUnionMembers: z.ZodOptional<z.ZodBoolean>;
343
+ omitFernHeaders: z.ZodOptional<z.ZodBoolean>;
344
+ linter: z.ZodOptional<z.ZodEnum<{
345
+ biome: "biome";
346
+ oxlint: "oxlint";
347
+ none: "none";
348
+ }>>;
349
+ formatter: z.ZodOptional<z.ZodEnum<{
350
+ biome: "biome";
351
+ none: "none";
352
+ prettier: "prettier";
353
+ oxfmt: "oxfmt";
354
+ }>>;
355
+ exports: z.ZodOptional<z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>>;
356
+ files: z.ZodOptional<z.ZodArray<z.ZodString>>;
357
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
358
+ lintStaged: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
359
+ browser: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
326
360
  allowCustomFetcher: z.ZodOptional<z.ZodBoolean>;
327
361
  useBrandedStringAliases: z.ZodOptional<z.ZodBoolean>;
328
362
  useLegacyExports: z.ZodOptional<z.ZodBoolean>;
@@ -493,6 +527,7 @@ declare const typescriptGenerationConfigSchema: z.ZodObject<{
493
527
  name: z.ZodEnum<{
494
528
  axios: "axios";
495
529
  fetch: "fetch";
530
+ "node-fetch": "node-fetch";
496
531
  }>;
497
532
  }, z.core.$strict>>;
498
533
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -513,6 +548,35 @@ declare const typescriptGenerationConfigSchema: z.ZodObject<{
513
548
  /** Name of the top-level namespace export emitted by Fern-compatible TypeScript SDKs. */
514
549
  namespaceExportName: z.ZodOptional<z.ZodString>;
515
550
  consolidateTypeFiles: z.ZodOptional<z.ZodBoolean>;
551
+ formDataSupport: z.ZodOptional<z.ZodEnum<{
552
+ Node16: "Node16";
553
+ Node18: "Node18";
554
+ }>>;
555
+ allowExtraFields: z.ZodOptional<z.ZodBoolean>;
556
+ generateSubpackageExports: z.ZodOptional<z.ZodBoolean>;
557
+ exportAllRequestsAtRoot: z.ZodOptional<z.ZodBoolean>;
558
+ generateEndpointMetadata: z.ZodOptional<z.ZodBoolean>;
559
+ outputEsm: z.ZodOptional<z.ZodBoolean>;
560
+ neverThrowErrors: z.ZodOptional<z.ZodBoolean>;
561
+ includeOtherInUnionTypes: z.ZodOptional<z.ZodBoolean>;
562
+ includeUtilsOnUnionMembers: z.ZodOptional<z.ZodBoolean>;
563
+ omitFernHeaders: z.ZodOptional<z.ZodBoolean>;
564
+ linter: z.ZodOptional<z.ZodEnum<{
565
+ biome: "biome";
566
+ oxlint: "oxlint";
567
+ none: "none";
568
+ }>>;
569
+ formatter: z.ZodOptional<z.ZodEnum<{
570
+ biome: "biome";
571
+ none: "none";
572
+ prettier: "prettier";
573
+ oxfmt: "oxfmt";
574
+ }>>;
575
+ exports: z.ZodOptional<z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>>;
576
+ files: z.ZodOptional<z.ZodArray<z.ZodString>>;
577
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
578
+ lintStaged: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
579
+ browser: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
516
580
  allowCustomFetcher: z.ZodOptional<z.ZodBoolean>;
517
581
  useBrandedStringAliases: z.ZodOptional<z.ZodBoolean>;
518
582
  useLegacyExports: z.ZodOptional<z.ZodBoolean>;
@@ -44,6 +44,10 @@ declare const packageConfigSchema: z.ZodObject<{
44
44
  description: z.ZodOptional<z.ZodString>;
45
45
  repository: z.ZodOptional<z.ZodString>;
46
46
  homepage: z.ZodOptional<z.ZodString>;
47
+ bugs: z.ZodOptional<z.ZodObject<{
48
+ url: z.ZodOptional<z.ZodString>;
49
+ email: z.ZodOptional<z.ZodString>;
50
+ }, z.core.$strict>>;
47
51
  documentationUrl: z.ZodOptional<z.ZodString>;
48
52
  authors: z.ZodOptional<z.ZodArray<z.ZodObject<{
49
53
  name: z.ZodString;
@@ -304,6 +308,7 @@ declare const mcpGenerationConfigSchema: z.ZodObject<{
304
308
  name: z.ZodEnum<{
305
309
  axios: "axios";
306
310
  fetch: "fetch";
311
+ "node-fetch": "node-fetch";
307
312
  }>;
308
313
  }, z.core.$strict>>;
309
314
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -323,6 +328,35 @@ declare const mcpGenerationConfigSchema: z.ZodObject<{
323
328
  exportClassDefault: z.ZodOptional<z.ZodBoolean>;
324
329
  namespaceExportName: z.ZodOptional<z.ZodString>;
325
330
  consolidateTypeFiles: z.ZodOptional<z.ZodBoolean>;
331
+ formDataSupport: z.ZodOptional<z.ZodEnum<{
332
+ Node16: "Node16";
333
+ Node18: "Node18";
334
+ }>>;
335
+ allowExtraFields: z.ZodOptional<z.ZodBoolean>;
336
+ generateSubpackageExports: z.ZodOptional<z.ZodBoolean>;
337
+ exportAllRequestsAtRoot: z.ZodOptional<z.ZodBoolean>;
338
+ generateEndpointMetadata: z.ZodOptional<z.ZodBoolean>;
339
+ outputEsm: z.ZodOptional<z.ZodBoolean>;
340
+ neverThrowErrors: z.ZodOptional<z.ZodBoolean>;
341
+ includeOtherInUnionTypes: z.ZodOptional<z.ZodBoolean>;
342
+ includeUtilsOnUnionMembers: z.ZodOptional<z.ZodBoolean>;
343
+ omitFernHeaders: z.ZodOptional<z.ZodBoolean>;
344
+ linter: z.ZodOptional<z.ZodEnum<{
345
+ biome: "biome";
346
+ oxlint: "oxlint";
347
+ none: "none";
348
+ }>>;
349
+ formatter: z.ZodOptional<z.ZodEnum<{
350
+ biome: "biome";
351
+ none: "none";
352
+ prettier: "prettier";
353
+ oxfmt: "oxfmt";
354
+ }>>;
355
+ exports: z.ZodOptional<z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>>;
356
+ files: z.ZodOptional<z.ZodArray<z.ZodString>>;
357
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
358
+ lintStaged: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
359
+ browser: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
326
360
  allowCustomFetcher: z.ZodOptional<z.ZodBoolean>;
327
361
  useBrandedStringAliases: z.ZodOptional<z.ZodBoolean>;
328
362
  useLegacyExports: z.ZodOptional<z.ZodBoolean>;
@@ -493,6 +527,7 @@ declare const typescriptGenerationConfigSchema: z.ZodObject<{
493
527
  name: z.ZodEnum<{
494
528
  axios: "axios";
495
529
  fetch: "fetch";
530
+ "node-fetch": "node-fetch";
496
531
  }>;
497
532
  }, z.core.$strict>>;
498
533
  packageManager: z.ZodOptional<z.ZodEnum<{
@@ -513,6 +548,35 @@ declare const typescriptGenerationConfigSchema: z.ZodObject<{
513
548
  /** Name of the top-level namespace export emitted by Fern-compatible TypeScript SDKs. */
514
549
  namespaceExportName: z.ZodOptional<z.ZodString>;
515
550
  consolidateTypeFiles: z.ZodOptional<z.ZodBoolean>;
551
+ formDataSupport: z.ZodOptional<z.ZodEnum<{
552
+ Node16: "Node16";
553
+ Node18: "Node18";
554
+ }>>;
555
+ allowExtraFields: z.ZodOptional<z.ZodBoolean>;
556
+ generateSubpackageExports: z.ZodOptional<z.ZodBoolean>;
557
+ exportAllRequestsAtRoot: z.ZodOptional<z.ZodBoolean>;
558
+ generateEndpointMetadata: z.ZodOptional<z.ZodBoolean>;
559
+ outputEsm: z.ZodOptional<z.ZodBoolean>;
560
+ neverThrowErrors: z.ZodOptional<z.ZodBoolean>;
561
+ includeOtherInUnionTypes: z.ZodOptional<z.ZodBoolean>;
562
+ includeUtilsOnUnionMembers: z.ZodOptional<z.ZodBoolean>;
563
+ omitFernHeaders: z.ZodOptional<z.ZodBoolean>;
564
+ linter: z.ZodOptional<z.ZodEnum<{
565
+ biome: "biome";
566
+ oxlint: "oxlint";
567
+ none: "none";
568
+ }>>;
569
+ formatter: z.ZodOptional<z.ZodEnum<{
570
+ biome: "biome";
571
+ none: "none";
572
+ prettier: "prettier";
573
+ oxfmt: "oxfmt";
574
+ }>>;
575
+ exports: z.ZodOptional<z.ZodType<JsonObject, unknown, z.core.$ZodTypeInternals<JsonObject, unknown>>>;
576
+ files: z.ZodOptional<z.ZodArray<z.ZodString>>;
577
+ engines: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
578
+ lintStaged: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>>;
579
+ browser: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodBoolean, z.ZodString]>>>;
516
580
  allowCustomFetcher: z.ZodOptional<z.ZodBoolean>;
517
581
  useBrandedStringAliases: z.ZodOptional<z.ZodBoolean>;
518
582
  useLegacyExports: z.ZodOptional<z.ZodBoolean>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@postman/sdk-config",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Shared SDK configuration contracts and transformations for Postman SDK generation",
5
5
  "license": "UNLICENSED",
6
6
  "sideEffects": false,
@@ -239,6 +239,7 @@ audited on 2026-07-17. Counts guide the initial contract; they are not a permane
239
239
  | `user-agent`, `includePlatformHeaders`, `allowUserAgentAppInfo` | `client.userAgent` | Not in the project snapshot; see below |
240
240
  | `offsetSemantics` | `client.offsetSemantics` | Not in the project snapshot; see below |
241
241
  | `enable-wire-tests`, `enableWireTests`, `generateWireTests` | `generation.wireTests` | 1-15 per language |
242
+ | TypeScript `wireTestsFallbackToAutoGeneratedErrorExamples` | `generation.wireTests.fallbackToGeneratedErrorExamples` | Not in the project snapshot; see below |
242
243
  | WebSocket generation aliases | `generation.webSockets` | 3 TS, 3 Python |
243
244
  | `streamType`, `fileResponseType` | `generation.streams` | 1 TS |
244
245
  | client/exported/environment class aliases | `generation.naming` | 1-28 per language |
@@ -246,7 +247,7 @@ audited on 2026-07-17. Counts guide the initial contract; they are not a permane
246
247
  | namespace/package-prefix aliases | `package.namespace` | 1-30 per language |
247
248
  | output registry package names | `package.packageName` | 5-28 per registry language |
248
249
  | TypeScript `packageJson` / PHP `composerJson` portable metadata | `package.packageName`, `description`, `authors`, and `license` | Portable subset only. |
249
- | TypeScript `fetchSupport: native` | `generation.language.typescript.httpClient.name: "fetch"` | Native only. |
250
+ | TypeScript `fetchSupport` | `generation.language.typescript.httpClient.name`: `native` is `"fetch"`, `node-fetch` is `"node-fetch"` | Native only. |
250
251
  | Python custom `package_name` | `package.moduleName` | 18 |
251
252
  | Python `additional_init_exports` | `generation.language.python.additionalInitExports` | 3 |
252
253
  | Go `module.path` | `package.modulePath` | 3 |
@@ -263,6 +264,49 @@ audited on 2026-07-17. Counts guide the initial contract; they are not a permane
263
264
  | Fern README config | `docs.readme` | 12 API names; 11 disabled-section configs |
264
265
  | `customReadmeSections` | `docs.readme.customSections` | Not in the project snapshot; see below |
265
266
  | `includeApiReference` | `docs.includeApiReference` | 10 TS |
267
+ | TypeScript `formDataSupport` | `generation.language.typescript.formDataSupport` | Not in the project snapshot; see below |
268
+ | TypeScript `allowExtraFields` | `generation.language.typescript.allowExtraFields` | Not in the project snapshot; see below |
269
+ | TypeScript `generateSubpackageExports` | `generation.language.typescript.generateSubpackageExports` | Not in the project snapshot; see below |
270
+
271
+ The TypeScript options below are copied by the mapper only when they have the declared type, and
272
+ anything else is reported in `compatibility.unsupportedFields`. Omitted options stay omitted; the
273
+ generator applies Fern's defaults. Each maps to the field of the same name in
274
+ `generation.language.typescript` unless noted. The mapper reads them for the TypeScript SDK generator
275
+ only. The MCP generator's converter has never read them, so an MCP config that sets one still
276
+ reports it in `compatibility.unsupportedFields` (`fetchSupport: node-fetch` included; `native` still
277
+ maps).
278
+
279
+ | Fern option | Values | Fern default | Maps to |
280
+ | -------------------------------------------------------------------------------------- | ------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------- |
281
+ | `formDataSupport` | `Node16`, `Node18` | `Node18` | |
282
+ | `allowExtraFields` | boolean | `false` | |
283
+ | `generateSubpackageExports` | boolean | `true` | |
284
+ | `exportAllRequestsAtRoot`, `generateEndpointMetadata`, `outputEsm`, `neverThrowErrors` | boolean | `false` | |
285
+ | `includeOtherInUnionTypes`, `includeUtilsOnUnionMembers`, `omitFernHeaders` | boolean | `false` | |
286
+ | `linter` | `biome`, `oxlint`, `none` | `biome` | |
287
+ | `formatter` | `prettier`, `biome`, `oxfmt`, `none` | `biome` | |
288
+ | `fetchSupport` | `native`, `node-fetch` | `native` | `httpClient.name` (`fetch`, `node-fetch`) |
289
+ | `wireTestsFallbackToAutoGeneratedErrorExamples` | boolean | `true` | `generation.wireTests.fallbackToGeneratedErrorExamples` |
290
+ | `packageJson.exports` | object keyed by subpath | generated map | `exports` |
291
+ | `packageJson.scripts` | object of name to command | generated scripts | `scripts` (`{ name, command }` list) |
292
+ | `packageJson.files` | string list | generated list | `files` |
293
+ | `packageJson.engines` | object of name to range | generated (`node >=18.0.0`) | `engines` |
294
+ | `packageJson["lint-staged"]` | object of glob to commands | none | `lintStaged` |
295
+ | `packageJson.browser` | object of module to `false` or path | generated (`fs`, `os`, `path`, `stream`, `crypto` set to `false`) | `browser` |
296
+ | `packageJson.bugs` | URL string, or `{ url, email }` | none | `package.bugs` |
297
+ | `packageJson.repository` | URL string, or `{ type: "git", url }` | none | `package.repository` |
298
+
299
+ `generation.wireTests` requires `enabled`, and Fern generates wire tests unless told not to, so a
300
+ config that sets only the fallback option maps to `{ enabled: true, fallbackToGeneratedErrorExamples }`.
301
+ The `packageJson` keys above are the ones that have a typed home. For `engines` and `browser`, Fern merges the
302
+ customer's entries into the generated object key by key, so a customer `node` range replaces the generated one and a
303
+ customer `browser` entry is added to the generated ones. Fern merges the values you set over
304
+ the generated `package.json`; `files` entries come first, and `exports` subpaths replace the
305
+ generated ones one subpath at a time (Fern's default `shallow` merge; `packageJsonMergeStrategy` is
306
+ not carried). A key outside this list, a repository `directory`, or a repository `type` other than
307
+ `git` is still reported as unsupported.
308
+ `outputEsm` marks the package as an ES module while still shipping its CommonJS build; `esmOnly`
309
+ drops the CommonJS build.
266
310
 
267
311
  The Rust language config was added after the initial audit. That audit compared existing Fern
268
312
  _customer projects_, which surfaced no Rust-specific options; comparing the Fern Rust generator's
@@ -359,19 +403,19 @@ project's OpenAPI specs carry it too and are refused for it.
359
403
 
360
404
  Only options that remain language-specific stay in `generation.language`.
361
405
 
362
- | Language | Fern fields retained in language config | Shared mappings lifted out |
363
- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
364
- | TypeScript | `packageManager` (1), `testFramework` (2), `namespaceExportName`, `allowCustomFetcher` (13), branded aliases (1), legacy exports (1), `useBigInt`, and positive `serdeLayer` from `noSerdeLayer` (8) | Namespace, validation, inline types, dependencies, wire tests, streams, WebSockets, pager/client names |
365
- | Python | Python/Pydantic versions, client filenames, model switches, TypedDict requests, redirect/chunk/recursion compatibility, and package extras | Package/module names, enum form, extra fields, response validation, request style, dependencies, timeout, layout, wire tests, WebSockets |
366
- | Java/Kotlin | Package layout (3), local dates (2), optional-nullable collapse (2), Gradle settings (7), and JVM async-client style | Maven identity, namespace, names, forward-compatible enums, inline properties, dependencies, pager, wire tests |
367
- | Go | Legacy complex models, union version (3), legacy client options (1), and the fern root-client constructor name | Module/package identity, client name, environments, smart casing, inline properties, pager, wire tests |
368
- | C# | Optional wrapper, simplified dictionaries (1), explicit namespaces (7), core namespace behavior (1), exception handler (5), and the experimental explicit-nullable-optional switch | NuGet identity, namespace, class/error names, pager, wire tests |
369
- | PHP | Property access (2) and generated client interfaces (1) | Composer identity, namespace, client/pager names, request style, dependencies, wire tests, idempotency keys, User-Agent, offset semantics |
370
- | Ruby | Require paths (2) | Gem identity, client name, dependencies, pager, wire tests |
371
- | Rust | Datetime representation, initialism casing, and Cargo features/default-features | Crate identity, client name, and package metadata use shared fields. |
372
- | Swift | Module name and the nullable-as-optional collapse | Client, environment and error naming use shared fields. |
373
- | CLI | Pagination parameter names, the `skills` boolean, and the typed CLI settings below | Go module and package identity use `package`. |
374
- | MCP | Server identity, availability exclusions, tool filters and named toolsets, plus the TypeScript options | npm package identity, client and serialization behavior |
406
+ | Language | Fern fields retained in language config | Shared mappings lifted out |
407
+ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
408
+ | TypeScript | `packageManager` (1), `testFramework` (2), `namespaceExportName`, `allowCustomFetcher` (13), branded aliases (1), legacy exports (1), `formDataSupport`, `allowExtraFields`, `generateSubpackageExports`, `exportAllRequestsAtRoot`, `generateEndpointMetadata`, `outputEsm`, `neverThrowErrors`, `includeOtherInUnionTypes`, `includeUtilsOnUnionMembers`, `omitFernHeaders`, `linter`, `formatter`, `useBigInt`, and positive `serdeLayer` from `noSerdeLayer` (8) | Namespace, validation, inline types, dependencies, wire tests, streams, WebSockets, pager/client names |
409
+ | Python | Python/Pydantic versions, client filenames, model switches, TypedDict requests, redirect/chunk/recursion compatibility, and package extras | Package/module names, enum form, extra fields, response validation, request style, dependencies, timeout, layout, wire tests, WebSockets |
410
+ | Java/Kotlin | Package layout (3), local dates (2), optional-nullable collapse (2), Gradle settings (7), and JVM async-client style | Maven identity, namespace, names, forward-compatible enums, inline properties, dependencies, pager, wire tests |
411
+ | Go | Legacy complex models, union version (3), legacy client options (1), and the fern root-client constructor name | Module/package identity, client name, environments, smart casing, inline properties, pager, wire tests |
412
+ | C# | Optional wrapper, simplified dictionaries (1), explicit namespaces (7), core namespace behavior (1), exception handler (5), and the experimental explicit-nullable-optional switch | NuGet identity, namespace, class/error names, pager, wire tests |
413
+ | PHP | Property access (2) and generated client interfaces (1) | Composer identity, namespace, client/pager names, request style, dependencies, wire tests, idempotency keys, User-Agent, offset semantics |
414
+ | Ruby | Require paths (2) | Gem identity, client name, dependencies, pager, wire tests |
415
+ | Rust | Datetime representation, initialism casing, and Cargo features/default-features | Crate identity, client name, and package metadata use shared fields. |
416
+ | Swift | Module name and the nullable-as-optional collapse | Client, environment and error naming use shared fields. |
417
+ | CLI | Pagination parameter names, the `skills` boolean, and the typed CLI settings below | Go module and package identity use `package`. |
418
+ | MCP | Server identity, availability exclusions, tool filters and named toolsets, plus the TypeScript options | npm package identity, client and serialization behavior |
375
419
 
376
420
  `generation.language.cli` also accepts the typed CLI settings `binaryName`, `customCommands`,
377
421
  `rootGroup`, `profiles`, `splitTypeCrates`, and `userAgentSuffixFlag`. Their shapes, validation,
@@ -400,18 +444,22 @@ the migration.
400
444
 
401
445
  ### Removed after finding no customer use and no sdk-gen-core equivalent
402
446
 
403
- - Common Fern generation: the omit platform-header override (`omitFernHeaders`). Output-profile
404
- defaults own this compatibility behavior instead of a second permanent switch. The include side
405
- was re-added as `client.userAgent.includePlatformInfo` once the Fern PHP generator documented it.
447
+ - Common Fern generation: the omit platform-header override (`omitFernHeaders`) was removed from the
448
+ shared blocks, and Output-profile defaults own that compatibility behavior. The include side was
449
+ re-added as `client.userAgent.includePlatformInfo` once the Fern PHP generator documented it. The
450
+ TypeScript `omitFernHeaders` option is carried as its own TypeScript setting because real
451
+ TypeScript configs set it.
406
452
  - Source import: optional-additional-properties defaults, environment grouping strategies,
407
453
  discriminant removal, forward-compatible inference, default environment inference, const
408
454
  coercion, endpoint filters, example-depth controls, alias resolution, single-schema oneOf
409
455
  preservation, read-variant responses, binary-response import coercion, form encoding defaults,
410
456
  additional-properties defaults, and discriminated-union inference.
411
- - TypeScript: linter/formatter selection, subpackage exports, and endpoint metadata. (Consolidated
412
- type files was re-added as `consolidateTypeFiles` in `typescriptGenerationConfigSchema` after
413
- real customer use turned up — `intercom`/`auth0_fern` both set it — so this list entry no longer
414
- applies to it.)
457
+ - TypeScript: the options once removed here were re-added as real configs turned up. Consolidated
458
+ type files is `consolidateTypeFiles` (`intercom` and `auth0_fern` set it), subpackage exports is
459
+ `generateSubpackageExports` (`auth0_fern`, `auth0_teams`, `corti_latest`, and `merge` set it),
460
+ and linter/formatter selection and endpoint metadata are `linter`, `formatter`, and
461
+ `generateEndpointMetadata` (`auth0_fern` and `auth0_teams` set them). None of these entries
462
+ applies to those options any more.
415
463
  - Python: ORM/smart-union/coercion/wrapped-alias/positional-constructor/inheritance/validator
416
464
  switches, flattened union bodies, lazy imports, and custom transport.
417
465
  - Java/JVM: JSON include, required-builder checks, public/extensible constructors, unknown-as-node,
@@ -425,16 +473,16 @@ the migration.
425
473
 
426
474
  ### Observed but deliberately deferred as bespoke or low-use
427
475
 
428
- | Legacy configuration | Observed projects | Reason |
429
- | ----------------------------------------------------------- | ----------------: | ------------------------------------------------------------------------ |
430
- | TypeScript arbitrary `packageJson` exports/scripts | 2 | Open-ended manifest rewriting conflicts with the typed package contract. |
431
- | TypeScript `outputEsm` and form-data runtime | 1-2 | Runtime-specific and not required by sdk-gen-core today. |
432
- | Python excluded `__init__` exports | 6 | File-layout customization with significant generator coupling. |
433
- | Python improved imports and file-upload-only TypedDict mode | 1-3 | Experimental or narrow compatibility behavior. |
434
- | Java custom Gradle plugins / include-wrapper | 1 | Arbitrary build-file injection or one-customer behavior. |
435
- | C# experimental fully qualified/version namespaces | 1 | Experimental one-customer behavior. |
436
- | PHP arbitrary Composer autoload files | 2 | Open-ended manifest rewriting; typed dependencies remain supported. |
437
- | Ruby flattened module structure | 1 | One-customer layout behavior. |
476
+ | Legacy configuration | Observed projects | Reason |
477
+ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------: | ------------------------------------------------------------------------------------------------------------- |
478
+ | TypeScript `packageJson` keys without a typed field (everything but `exports`, `scripts`, `files`, `engines`, `lint-staged`, `browser`, `bugs`, `repository` and the portable metadata) | 2 | Open-ended manifest rewriting conflicts with the typed package contract. |
479
+ | README `exampleStyle` | 1 | Only the Fern Java generator reads it and no Postman generator does, so a typed field would have no consumer. |
480
+ | Python excluded `__init__` exports | 6 | File-layout customization with significant generator coupling. |
481
+ | Python improved imports and file-upload-only TypedDict mode | 1-3 | Experimental or narrow compatibility behavior. |
482
+ | Java custom Gradle plugins / include-wrapper | 1 | Arbitrary build-file injection or one-customer behavior. |
483
+ | C# experimental fully qualified/version namespaces | 1 | Experimental one-customer behavior. |
484
+ | PHP arbitrary Composer autoload files | 2 | Open-ended manifest rewriting; typed dependencies remain supported. |
485
+ | Ruby flattened module structure | 1 | One-customer layout behavior. |
438
486
 
439
487
  Adding one of these fields later is additive. Retaining every historical generator flag now would
440
488
  make v1 expensive to implement and would turn temporary compatibility behavior into a permanent