@fern-api/fern-api-dev 5.91.0 → 5.92.1

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 (2) hide show
  1. package/cli.cjs +69 -19
  2. package/package.json +1 -1
package/cli.cjs CHANGED
@@ -84773,6 +84773,10 @@ function getPackageNameFromGeneratorConfig(generatorInvocation) {
84773
84773
  if (packageName != null) {
84774
84774
  return packageName;
84775
84775
  }
84776
+ const kebabCasePackageName = generatorInvocation.raw.config["package-name"];
84777
+ if (typeof kebabCasePackageName === "string") {
84778
+ return kebabCasePackageName;
84779
+ }
84776
84780
  const modulePath = generatorInvocation.raw.config.module?.path;
84777
84781
  if (modulePath != null) {
84778
84782
  return modulePath;
@@ -103311,7 +103315,7 @@ function getFilesystemPublishTarget({ generatorInvocation, version: version7, us
103311
103315
  artifactId: packageName
103312
103316
  };
103313
103317
  } else if (typeof configObj["package-prefix"] === "string" && !packageName) {
103314
- context3.logger.warn("Java generator has package-prefix configured but packageName is missing");
103318
+ context3.logger.warn("Java generator has package-prefix configured but no package name could be resolved. Set 'package-name' (or 'group' and 'artifact') in the generator config to stamp Maven coordinates.");
103315
103319
  }
103316
103320
  return void 0;
103317
103321
  })();
@@ -130864,6 +130868,7 @@ var init_OpenApiSettingsSchema2 = __esm({
130864
130868
  "respect-readonly-schemas": schemas_exports8.boolean().optional(),
130865
130869
  "use-read-variant-for-responses": schemas_exports8.boolean().optional(),
130866
130870
  "respect-forward-compatible-enums": schemas_exports8.boolean().optional(),
130871
+ "respect-optional-request-body": schemas_exports8.boolean().optional(),
130867
130872
  "use-bytes-for-binary-response": schemas_exports8.boolean().optional(),
130868
130873
  "default-form-parameter-encoding": FormParameterEncoding2.optional(),
130869
130874
  filter: OpenApiFilterSchema.optional(),
@@ -132397,6 +132402,7 @@ var init_ConvertOpenAPIOptions = __esm({
132397
132402
  respectNullableSchemas: true,
132398
132403
  onlyIncludeReferencedSchemas: false,
132399
132404
  inlinePathParameters: true,
132405
+ respectOptionalRequestBody: false,
132400
132406
  useBytesForBinaryResponse: false,
132401
132407
  respectForwardCompatibleEnums: false,
132402
132408
  wrapReferencesToNullableInOptional: false,
@@ -147143,6 +147149,12 @@ function getRequest({ endpoint: endpoint3, declarationFile, context: context3, r
147143
147149
  requestValue.docs = request7.description;
147144
147150
  }
147145
147151
  const canCollapse = typeof requestValue.body === "string" && requestValue["path-parameters"] == null && requestValue["query-parameters"] == null && requestValue.headers == null && requestValue.name == null && requestValue.docs == null && (requestValue["content-type"] == null || requestValue["content-type"] === "application/json");
147152
+ if (context3.options.respectOptionalRequestBody && isOptionalJsonBody(request7)) {
147153
+ requestValue.body = typeof requestTypeReference === "string" ? wrapTypeReferenceInOptional(requestTypeReference) : {
147154
+ ...requestTypeReference,
147155
+ type: wrapTypeReferenceInOptional(requestTypeReference.type)
147156
+ };
147157
+ }
147146
147158
  return {
147147
147159
  schemaIdsToExclude: [],
147148
147160
  value: canCollapse ? requestValue.body : requestValue
@@ -147299,7 +147311,7 @@ function getRequest({ endpoint: endpoint3, declarationFile, context: context3, r
147299
147311
  if (request7.additionalProperties) {
147300
147312
  requestBodySchema["extra-properties"] = true;
147301
147313
  }
147302
- if (request7.type === "json" && request7.required !== true) {
147314
+ if (isOptionalJsonBody(request7)) {
147303
147315
  requestBodySchema.optional = true;
147304
147316
  }
147305
147317
  const convertedRequestValue = {
@@ -147398,6 +147410,12 @@ function getRequest({ endpoint: endpoint3, declarationFile, context: context3, r
147398
147410
  assertNever(request7);
147399
147411
  }
147400
147412
  }
147413
+ function isOptionalJsonBody(request7) {
147414
+ return request7.type === "json" && request7.required !== true;
147415
+ }
147416
+ function wrapTypeReferenceInOptional(typeReference2) {
147417
+ return typeReference2.startsWith("optional<") ? typeReference2 : `optional<${typeReference2}>`;
147418
+ }
147401
147419
  function endpointRequestSupportsInlinedPathParameters({ context: context3, request: request7 }) {
147402
147420
  if (!context3.options.inlinePathParameters) {
147403
147421
  return false;
@@ -151775,6 +151793,7 @@ var init_BaseOpenAPIWorkspace = __esm({
151775
151793
  exampleGeneration;
151776
151794
  useBytesForBinaryResponse;
151777
151795
  respectForwardCompatibleEnums;
151796
+ respectOptionalRequestBody;
151778
151797
  inlineAllOfSchemas;
151779
151798
  resolveAliases;
151780
151799
  groupEnvironmentsByHost;
@@ -151799,6 +151818,7 @@ var init_BaseOpenAPIWorkspace = __esm({
151799
151818
  this.exampleGeneration = args.exampleGeneration;
151800
151819
  this.useBytesForBinaryResponse = args.useBytesForBinaryResponse;
151801
151820
  this.respectForwardCompatibleEnums = args.respectForwardCompatibleEnums;
151821
+ this.respectOptionalRequestBody = args.respectOptionalRequestBody;
151802
151822
  this.inlineAllOfSchemas = args.inlineAllOfSchemas;
151803
151823
  this.resolveAliases = args.resolveAliases;
151804
151824
  this.groupEnvironmentsByHost = args.groupEnvironmentsByHost;
@@ -167249,6 +167269,7 @@ function getRequestBody2({ context: context3, operation, streamingExtension, isS
167249
167269
  };
167250
167270
  return {
167251
167271
  requestBody: {
167272
+ required: resolvedRequestBody.required,
167252
167273
  content: {
167253
167274
  [MediaType.APPLICATION_JSON]: {
167254
167275
  schema: requestBodySchemaWithLiteralProperty
@@ -199882,6 +199903,7 @@ var init_getAPIDefinitionSettings = __esm({
199882
199903
  inlinePathParameters: "inlinePathParameters",
199883
199904
  useBytesForBinaryResponse: "useBytesForBinaryResponse",
199884
199905
  respectForwardCompatibleEnums: "respectForwardCompatibleEnums",
199906
+ respectOptionalRequestBody: "respectOptionalRequestBody",
199885
199907
  filter: "filter",
199886
199908
  defaultFormParameterEncoding: "defaultFormParameterEncoding",
199887
199909
  exampleGeneration: "exampleGeneration",
@@ -264186,6 +264208,7 @@ function parseOpenApiDefinitionSettingsSchema(settings) {
264186
264208
  defaultFormParameterEncoding: settings?.["default-form-parameter-encoding"],
264187
264209
  useBytesForBinaryResponse: settings?.["use-bytes-for-binary-response"],
264188
264210
  respectForwardCompatibleEnums: settings?.["respect-forward-compatible-enums"],
264211
+ respectOptionalRequestBody: settings?.["respect-optional-request-body"],
264189
264212
  additionalPropertiesDefaultsTo: settings?.["additional-properties-defaults-to"],
264190
264213
  typeDatesAsStrings: settings?.["type-dates-as-strings"],
264191
264214
  preserveSingleSchemaOneOf: settings?.["preserve-single-schema-oneof"],
@@ -265042,6 +265065,7 @@ var init_convertGeneratorsConfiguration = __esm({
265042
265065
  inlinePathParameters: void 0,
265043
265066
  useBytesForBinaryResponse: void 0,
265044
265067
  respectForwardCompatibleEnums: void 0,
265068
+ respectOptionalRequestBody: void 0,
265045
265069
  filter: void 0,
265046
265070
  exampleGeneration: void 0,
265047
265071
  defaultFormParameterEncoding: void 0,
@@ -275421,6 +275445,10 @@ function convertHeaders({ service, endpoint: endpoint3, example, typeResolver, e
275421
275445
  serviceHeaders
275422
275446
  };
275423
275447
  }
275448
+ function isOptionalType({ rawType, typeResolver, file: file4 }) {
275449
+ const resolvedType = typeResolver.resolveType({ type: rawType, file: file4 });
275450
+ return resolvedType?._type === "container" && resolvedType.container._type === "optional";
275451
+ }
275424
275452
  function convertExampleRequestBody({ endpoint: endpoint3, example, typeResolver, exampleResolver, file: file4, workspace }) {
275425
275453
  const requestType = typeof endpoint3.request !== "string" ? endpoint3.request?.body : endpoint3.request;
275426
275454
  if (requestType == null) {
@@ -275430,9 +275458,13 @@ function convertExampleRequestBody({ endpoint: endpoint3, example, typeResolver,
275430
275458
  return void 0;
275431
275459
  }
275432
275460
  if (!isInlineRequestBody(requestType)) {
275461
+ const rawTypeBeingExemplified = typeof requestType !== "string" ? requestType.type : requestType;
275462
+ if (example.request === void 0 && isOptionalType({ rawType: rawTypeBeingExemplified, typeResolver, file: file4 })) {
275463
+ return void 0;
275464
+ }
275433
275465
  return ExampleRequestBody.reference(convertTypeReferenceExample({
275434
275466
  example: example.request,
275435
- rawTypeBeingExemplified: typeof requestType !== "string" ? requestType.type : requestType,
275467
+ rawTypeBeingExemplified,
275436
275468
  typeResolver,
275437
275469
  exampleResolver,
275438
275470
  fileContainingRawTypeReference: file4,
@@ -372145,6 +372177,7 @@ var init_OSSWorkspace = __esm({
372145
372177
  objectQueryParameters: collapseSpecBooleanSetting(specs, (s5) => s5?.objectQueryParameters),
372146
372178
  useBytesForBinaryResponse: collapseSpecBooleanSetting(openapiSpecs, (s5) => s5?.useBytesForBinaryResponse),
372147
372179
  respectForwardCompatibleEnums: collapseSpecBooleanSetting(openapiSpecs, (s5) => s5?.respectForwardCompatibleEnums),
372180
+ respectOptionalRequestBody: collapseSpecBooleanSetting(openapiSpecs, (s5) => s5?.respectOptionalRequestBody),
372148
372181
  inlineAllOfSchemas: collapseSpecBooleanSetting(specs, (s5) => s5?.inlineAllOfSchemas),
372149
372182
  resolveAliases: (() => {
372150
372183
  const values2 = specs.map((spec) => spec.settings?.resolveAliases);
@@ -690038,6 +690071,10 @@ function validateExampleEndpointCallParameters({ allDeclarations = {}, examples,
690038
690071
  // ../fern-definition/validator/lib/rules/valid-example-endpoint-call/validateRequest.js
690039
690072
  init_lib10();
690040
690073
  init_lib23();
690074
+ var REQUIRED_REQUEST_BODY_VIOLATION = {
690075
+ severity: "fatal",
690076
+ message: "This endpoint requires a request body, so its examples must specify request. Mark the body optional to allow calling the endpoint without one."
690077
+ };
690041
690078
  function validateRequest({ example, endpoint: endpoint3, typeResolver, exampleResolver, file: file4, workspace }) {
690042
690079
  const violations = [];
690043
690080
  const body = typeof endpoint3.request !== "string" ? endpoint3.request?.body : endpoint3.request;
@@ -690049,14 +690086,11 @@ function validateRequest({ example, endpoint: endpoint3, typeResolver, exampleRe
690049
690086
  });
690050
690087
  }
690051
690088
  } else if (isInlineRequestBody(body)) {
690052
- if (example == null) {
690089
+ if (example === void 0) {
690053
690090
  if (body.optional) {
690054
690091
  return violations;
690055
690092
  }
690056
- violations.push({
690057
- severity: "fatal",
690058
- message: "This endpoint requires a request body, so its examples must specify request. Mark the body optional to allow calling the endpoint without one."
690059
- });
690093
+ violations.push(REQUIRED_REQUEST_BODY_VIOLATION);
690060
690094
  return violations;
690061
690095
  }
690062
690096
  violations.push(...examples_exports6.validateObjectExample({
@@ -690078,7 +690112,7 @@ function validateRequest({ example, endpoint: endpoint3, typeResolver, exampleRe
690078
690112
  return { severity: val.severity ?? "fatal", message: val.message };
690079
690113
  }));
690080
690114
  } else {
690081
- violations.push(...examples_exports6.validateTypeReferenceExample({
690115
+ const bodyViolations = examples_exports6.validateTypeReferenceExample({
690082
690116
  rawTypeReference: typeof body === "string" ? body : body.type,
690083
690117
  example,
690084
690118
  file: file4,
@@ -690089,7 +690123,12 @@ function validateRequest({ example, endpoint: endpoint3, typeResolver, exampleRe
690089
690123
  depth: 0
690090
690124
  }).map((val) => {
690091
690125
  return { severity: val.severity ?? "fatal", message: val.message };
690092
- }));
690126
+ });
690127
+ if (example === void 0 && bodyViolations.length > 0) {
690128
+ violations.push(REQUIRED_REQUEST_BODY_VIOLATION);
690129
+ return violations;
690130
+ }
690131
+ violations.push(...bodyViolations);
690093
690132
  }
690094
690133
  return violations;
690095
690134
  }
@@ -693977,6 +694016,8 @@ var OpenApiSettingsSchema2 = BaseApiSettingsSchema2.extend({
693977
694016
  useReadVariantForResponses: external_exports.boolean().optional(),
693978
694017
  /** Enables respecting forward compatible enums in OpenAPI specifications. Defaults to false. */
693979
694018
  respectForwardCompatibleEnums: external_exports.boolean().optional(),
694019
+ /** Enables making a JSON request body that OpenAPI does not mark as required optional in the generated SDK, so callers may omit the body. Defaults to false. */
694020
+ respectOptionalRequestBody: external_exports.boolean().optional(),
693980
694021
  /** Enables using the `bytes` type for binary responses in OpenAPI specifications. Defaults to a file stream. */
693981
694022
  useBytesForBinaryResponse: external_exports.boolean().optional(),
693982
694023
  /** The default encoding of form parameters. Defaults to JSON. */
@@ -702636,7 +702677,7 @@ var AccessTokenPosthogManager = class {
702636
702677
  properties: {
702637
702678
  ...event,
702638
702679
  ...event.properties,
702639
- version: "5.91.0",
702680
+ version: "5.92.1",
702640
702681
  usingAccessToken: true,
702641
702682
  ...getRunIdProperties()
702642
702683
  }
@@ -702702,7 +702743,7 @@ var UserPosthogManager = class {
702702
702743
  distinctId: this.userId ?? await this.getPersistedDistinctId(),
702703
702744
  event: "CLI",
702704
702745
  properties: {
702705
- version: "5.91.0",
702746
+ version: "5.92.1",
702706
702747
  ...event,
702707
702748
  ...event.properties,
702708
702749
  usingAccessToken: false,
@@ -709502,6 +709543,7 @@ var LegacyApiSpecAdapter = class {
709502
709543
  shouldUseUndiscriminatedUnionsWithLiterals: settings.preferUndiscriminatedUnionsWithLiterals,
709503
709544
  objectQueryParameters: settings.objectQueryParameters,
709504
709545
  respectForwardCompatibleEnums: settings.respectForwardCompatibleEnums,
709546
+ respectOptionalRequestBody: settings.respectOptionalRequestBody,
709505
709547
  useBytesForBinaryResponse: settings.useBytesForBinaryResponse,
709506
709548
  defaultFormParameterEncoding: settings.defaultFormParameterEncoding,
709507
709549
  filter: settings.filter,
@@ -881950,6 +881992,7 @@ var SETTINGS_KEY_MAP = {
881950
881992
  "respect-readonly-schemas": "respectReadonlySchemas",
881951
881993
  "use-read-variant-for-responses": "useReadVariantForResponses",
881952
881994
  "respect-forward-compatible-enums": "respectForwardCompatibleEnums",
881995
+ "respect-optional-request-body": "respectOptionalRequestBody",
881953
881996
  "use-bytes-for-binary-response": "useBytesForBinaryResponse",
881954
881997
  "default-form-parameter-encoding": "defaultFormParameterEncoding",
881955
881998
  "example-generation": "exampleGeneration",
@@ -883866,7 +883909,7 @@ var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
883866
883909
  var LOGS_FOLDER_NAME = "logs";
883867
883910
  var MAX_LOGS_DIR_SIZE_BYTES = 100 * 1024 * 1024;
883868
883911
  function getCliSource() {
883869
- const version7 = "5.91.0";
883912
+ const version7 = "5.92.1";
883870
883913
  return `cli@${version7}`;
883871
883914
  }
883872
883915
  var DebugLogger = class {
@@ -909182,7 +909225,7 @@ var LegacyDocsPublisher = class {
909182
909225
  previewId,
909183
909226
  disableTemplates: void 0,
909184
909227
  skipUpload,
909185
- cliVersion: "5.91.0",
909228
+ cliVersion: "5.92.1",
909186
909229
  loginCommand: "fern auth login"
909187
909230
  });
909188
909231
  if (taskContext.getResult() === TaskResult.Failure) {
@@ -928916,6 +928959,8 @@ var Generation = class {
928916
928959
  extraDependencies: () => this.customConfig["extra-dependencies"] ?? {},
928917
928960
  /** When true, omits Fern platform headers (X-Fern-Language, SDK name/version, User-Agent) from generated SDK requests. Default: false. */
928918
928961
  omitFernHeaders: () => this.customConfig["omit-fern-headers"] ?? false,
928962
+ /** When true, explicitly provided constructor auth credentials take precedence over env-var defaults when selecting the auth scheme (explicit basic auth wins over OAuth env vars). Default: false. */
928963
+ preferExplicitAuth: () => this.customConfig["prefer-explicit-auth"] ?? false,
928919
928964
  /** When true, emits the platform observability headers (X-Fern-Runtime, X-Fern-Runtime-Version, X-Fern-Platform). Default: false. Still subject to omitFernHeaders. */
928920
928965
  includePlatformHeaders: () => this.customConfig["include-platform-headers"] ?? false,
928921
928966
  /** When true, exposes an `AppInfo` client option whose sanitized product token is appended to the `User-Agent` header (RFC 9110). Default: false. Independent of includePlatformHeaders; still subject to omitFernHeaders. */
@@ -961708,7 +961753,10 @@ var EndpointSnippetGenerator9 = class {
961708
961753
  this.context.errors.unscope();
961709
961754
  this.context.errors.scope(Scope4.RequestBody);
961710
961755
  if (request7.body != null) {
961711
- args.push(this.getBodyRequestArg({ body: request7.body, value: snippet.requestBody }));
961756
+ const bodyArg = this.getBodyRequestArg({ body: request7.body, value: snippet.requestBody });
961757
+ if (!typescript_exports.TypeLiteral.isNop(bodyArg)) {
961758
+ args.push(bodyArg);
961759
+ }
961712
961760
  }
961713
961761
  this.context.errors.unscope();
961714
961762
  return args;
@@ -961831,8 +961879,10 @@ var EndpointSnippetGenerator9 = class {
961831
961879
  switch (body.type) {
961832
961880
  case "properties":
961833
961881
  return this.getInlinedRequestBodyPropertyObjectFields({ parameters: body.value, value: value2 });
961834
- case "referenced":
961835
- return [this.getReferencedRequestBodyPropertyObjectField({ body, value: value2 })];
961882
+ case "referenced": {
961883
+ const field5 = this.getReferencedRequestBodyPropertyObjectField({ body, value: value2 });
961884
+ return typescript_exports.TypeLiteral.isNop(field5.value) ? [] : [field5];
961885
+ }
961836
961886
  case "fileUpload":
961837
961887
  return this.getFileUploadRequestBodyObjectFields({ filePropertyInfo });
961838
961888
  default:
@@ -976091,7 +976141,7 @@ function getAutomationContextFromEnv() {
976091
976141
  config_branch: process.env.FERN_CONFIG_BRANCH,
976092
976142
  config_pr_number: process.env.FERN_CONFIG_PR_NUMBER,
976093
976143
  trigger: process.env.GITHUB_EVENT_NAME,
976094
- cli_version: "5.91.0"
976144
+ cli_version: "5.92.1"
976095
976145
  };
976096
976146
  }
976097
976147
  function isAutomationMode() {
@@ -976923,7 +976973,7 @@ var CliContext = class _CliContext {
976923
976973
  if (false) {
976924
976974
  this.logger.error("CLI_VERSION is not defined");
976925
976975
  }
976926
- return "5.91.0";
976976
+ return "5.92.1";
976927
976977
  }
976928
976978
  getCliName() {
976929
976979
  if (false) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "5.91.0",
2
+ "version": "5.92.1",
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/fern-api/fern.git",