@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.
- package/cli.cjs +69 -19
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
976976
|
+
return "5.92.1";
|
|
976927
976977
|
}
|
|
976928
976978
|
getCliName() {
|
|
976929
976979
|
if (false) {
|
package/package.json
CHANGED