@fern-api/fern-api-dev 5.7.6-2-g68a151c4de6 → 5.7.6-3-gd8ee8ddb229
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 +60 -59
- package/package.json +1 -1
package/cli.cjs
CHANGED
|
@@ -535141,7 +535141,7 @@ var ExampleTypeFactory = class _ExampleTypeFactory {
|
|
|
535141
535141
|
if (example != null) {
|
|
535142
535142
|
const allowed = schema2.values.map((v9) => v9.value);
|
|
535143
535143
|
const exampleStr = _ExampleTypeFactory.truncateExample(example);
|
|
535144
|
-
this.context.logger.
|
|
535144
|
+
this.context.logger.debug(`Example value ${exampleStr} is not a valid enum value${options2.name != null ? ` for '${options2.name}'` : ""}. Allowed values: [${allowed.join(", ")}]. Using fallback value instead.`);
|
|
535145
535145
|
}
|
|
535146
535146
|
return schema2.values[0] != null ? FullExample.enum(schema2.values[0]?.value) : void 0;
|
|
535147
535147
|
case "literal":
|
|
@@ -535973,7 +535973,7 @@ var ExampleTypeFactory = class _ExampleTypeFactory {
|
|
|
535973
535973
|
const fieldDesc = options2.name != null ? ` for '${options2.name}'` : "";
|
|
535974
535974
|
const actualType = typeof example;
|
|
535975
535975
|
const exampleStr = _ExampleTypeFactory.truncateExample(example);
|
|
535976
|
-
this.context.logger.
|
|
535976
|
+
this.context.logger.debug(`Invalid example${fieldDesc}: expected ${expected} but got ${actualType} (${exampleStr}). The provided example does not match the '${schemaType}' schema and will be replaced with a generated value.`);
|
|
535977
535977
|
}
|
|
535978
535978
|
static truncateExample(example, maxLength = 100) {
|
|
535979
535979
|
const str3 = JSON.stringify(example);
|
|
@@ -541476,7 +541476,6 @@ function replaceWithSchemaReference({ openapi, replaceReference, schemaReference
|
|
|
541476
541476
|
// ../api-importers/openapi/openapi-ir-parser/lib/openapi/v3/generateIr.js
|
|
541477
541477
|
function generateIr({ openApi, taskContext, options: options2, source: source2, namespace }) {
|
|
541478
541478
|
openApi = runResolutions({ openapi: openApi });
|
|
541479
|
-
validateOpenApiSpecForDocsCompat({ openApi, taskContext });
|
|
541480
541479
|
resetTitleCollisionTracker();
|
|
541481
541480
|
const tempContext = new OpenAPIV3ParserContext({
|
|
541482
541481
|
document: openApi,
|
|
@@ -541911,35 +541910,6 @@ function getAllParentSchemaIds({ schema: schema2, schemas }) {
|
|
|
541911
541910
|
function distinct(array3) {
|
|
541912
541911
|
return [...new Set(array3)];
|
|
541913
541912
|
}
|
|
541914
|
-
var NON_ASCII_REGEX = new RegExp("[^\\x00-\\x7F]");
|
|
541915
|
-
var FRONTMATTER_DELIMITER_REGEX = /(?:^|\n)\s*---\s*(?:\n|$)/;
|
|
541916
|
-
function validateOpenApiSpecForDocsCompat({ openApi, taskContext }) {
|
|
541917
|
-
for (const tag2 of openApi.tags ?? []) {
|
|
541918
|
-
if (NON_ASCII_REGEX.test(tag2.name)) {
|
|
541919
|
-
const nonAsciiChars = [...tag2.name].filter((c5) => NON_ASCII_REGEX.test(c5));
|
|
541920
|
-
taskContext.logger.error(`Tag name "${tag2.name}" contains non-ASCII characters: ${nonAsciiChars.join(", ")}. Non-ASCII characters in tag names will be included in URL paths and HTTP headers, which only support ASCII characters. This will cause runtime errors (ERR_INVALID_CHAR). Remove non-ASCII characters from the tag name.`);
|
|
541921
|
-
}
|
|
541922
|
-
}
|
|
541923
|
-
for (const [path106, pathItem] of Object.entries(openApi.paths ?? {})) {
|
|
541924
|
-
if (pathItem == null) {
|
|
541925
|
-
continue;
|
|
541926
|
-
}
|
|
541927
|
-
for (const method8 of ["get", "post", "put", "delete", "patch", "options", "head", "trace"]) {
|
|
541928
|
-
const operation = pathItem[method8];
|
|
541929
|
-
if (operation?.description != null && FRONTMATTER_DELIMITER_REGEX.test(operation.description)) {
|
|
541930
|
-
taskContext.logger.error(`Description at paths.${path106}.${method8} contains "---" frontmatter delimiters which will cause YAML parsing failures in the generated docs site. Remove the "---" delimiters from the description.`);
|
|
541931
|
-
}
|
|
541932
|
-
if (operation?.tags != null && (openApi.tags == null || openApi.tags.length === 0)) {
|
|
541933
|
-
for (const tag2 of operation.tags) {
|
|
541934
|
-
if (NON_ASCII_REGEX.test(tag2)) {
|
|
541935
|
-
const nonAsciiChars = [...tag2].filter((c5) => NON_ASCII_REGEX.test(c5));
|
|
541936
|
-
taskContext.logger.error(`Tag name "${tag2}" at paths.${path106}.${method8} contains non-ASCII characters: ${nonAsciiChars.join(", ")}. Remove non-ASCII characters from the tag name.`);
|
|
541937
|
-
}
|
|
541938
|
-
}
|
|
541939
|
-
}
|
|
541940
|
-
}
|
|
541941
|
-
}
|
|
541942
|
-
}
|
|
541943
541913
|
function getAudiences({ operation }) {
|
|
541944
541914
|
let endpointAudiences = [];
|
|
541945
541915
|
switch (operation.type) {
|
|
@@ -607103,23 +607073,23 @@ var ExampleValidator = class {
|
|
|
607103
607073
|
};
|
|
607104
607074
|
|
|
607105
607075
|
// ../api-importers/v3-importer-commons/lib/OpenApiSpecValidations.js
|
|
607106
|
-
var
|
|
607107
|
-
var
|
|
607076
|
+
var NON_ASCII_REGEX = new RegExp("[^\\x00-\\x7F]");
|
|
607077
|
+
var FRONTMATTER_DELIMITER_REGEX = /(?:^|\n)\s*---\s*(?:\n|$)/;
|
|
607108
607078
|
function validateTagNames({ tags, errorCollector }) {
|
|
607109
607079
|
for (const tag2 of tags) {
|
|
607110
|
-
if (
|
|
607111
|
-
const nonAsciiChars = [...tag2.name].filter((c5) =>
|
|
607080
|
+
if (NON_ASCII_REGEX.test(tag2.name)) {
|
|
607081
|
+
const nonAsciiChars = [...tag2.name].filter((c5) => NON_ASCII_REGEX.test(c5));
|
|
607112
607082
|
errorCollector.collect({
|
|
607113
607083
|
level: APIErrorLevel.ERROR,
|
|
607114
607084
|
message: `Tag name "${tag2.name}" contains non-ASCII characters: ${nonAsciiChars.join(", ")}. Non-ASCII characters in tag names will be included in URL paths and HTTP headers, which only support ASCII characters. This will cause runtime errors (ERR_INVALID_CHAR).`,
|
|
607115
607085
|
path: ["tags", tag2.name],
|
|
607116
|
-
resolution: `Remove non-ASCII characters from the tag name. For example, rename "${tag2.name}" to "${tag2.name.replace(
|
|
607086
|
+
resolution: `Remove non-ASCII characters from the tag name. For example, rename "${tag2.name}" to "${tag2.name.replace(NON_ASCII_REGEX, "").trim()}".`
|
|
607117
607087
|
});
|
|
607118
607088
|
}
|
|
607119
607089
|
}
|
|
607120
607090
|
}
|
|
607121
607091
|
function validateDescription({ description, path: path106, errorCollector }) {
|
|
607122
|
-
if (
|
|
607092
|
+
if (FRONTMATTER_DELIMITER_REGEX.test(description)) {
|
|
607123
607093
|
errorCollector.collect({
|
|
607124
607094
|
level: APIErrorLevel.ERROR,
|
|
607125
607095
|
message: `Description contains "---" frontmatter delimiters which will cause YAML parsing failures in the generated docs site. The docs renderer interprets content between "---" delimiters as YAML frontmatter, which will fail if the content is not valid YAML.`,
|
|
@@ -607156,14 +607126,14 @@ function validateOpenApiSpec({ spec, errorCollector }) {
|
|
|
607156
607126
|
}
|
|
607157
607127
|
if (Array.isArray(op4.tags) && !Array.isArray(spec.tags)) {
|
|
607158
607128
|
for (const tag2 of op4.tags) {
|
|
607159
|
-
if (typeof tag2 === "string" && !seenTags.has(tag2) &&
|
|
607129
|
+
if (typeof tag2 === "string" && !seenTags.has(tag2) && NON_ASCII_REGEX.test(tag2)) {
|
|
607160
607130
|
seenTags.add(tag2);
|
|
607161
|
-
const nonAsciiChars = [...tag2].filter((c5) =>
|
|
607131
|
+
const nonAsciiChars = [...tag2].filter((c5) => NON_ASCII_REGEX.test(c5));
|
|
607162
607132
|
errorCollector.collect({
|
|
607163
607133
|
level: APIErrorLevel.ERROR,
|
|
607164
607134
|
message: `Tag name "${tag2}" contains non-ASCII characters: ${nonAsciiChars.join(", ")}. Non-ASCII characters in tag names will be included in URL paths and HTTP headers, which only support ASCII characters. This will cause runtime errors (ERR_INVALID_CHAR).`,
|
|
607165
607135
|
path: ["paths", path106, method8, "tags"],
|
|
607166
|
-
resolution: `Remove non-ASCII characters from the tag name. For example, rename "${tag2}" to "${tag2.replace(
|
|
607136
|
+
resolution: `Remove non-ASCII characters from the tag name. For example, rename "${tag2}" to "${tag2.replace(NON_ASCII_REGEX, "").trim()}".`
|
|
607167
607137
|
});
|
|
607168
607138
|
}
|
|
607169
607139
|
}
|
|
@@ -614844,7 +614814,7 @@ function audiencesIntersect(a3, b8) {
|
|
|
614844
614814
|
|
|
614845
614815
|
// ../workspace/oss-validator/lib/rules/no-invalid-tag-names-or-frontmatter/no-invalid-tag-names-or-frontmatter.js
|
|
614846
614816
|
init_lib6();
|
|
614847
|
-
var
|
|
614817
|
+
var NON_ASCII_REGEX2 = new RegExp("[^\\x00-\\x7F]");
|
|
614848
614818
|
var FRONTMATTER_REGEX = /(?:^|\n)\s*---\s*(?:\n|$)/;
|
|
614849
614819
|
var HTTP_METHODS = ["get", "post", "put", "delete", "patch", "options", "head", "trace"];
|
|
614850
614820
|
var NoInvalidTagNamesOrFrontmatterRule = {
|
|
@@ -614865,8 +614835,8 @@ var NoInvalidTagNamesOrFrontmatterRule = {
|
|
|
614865
614835
|
if (Array.isArray(apiDoc.tags)) {
|
|
614866
614836
|
for (const tag2 of apiDoc.tags) {
|
|
614867
614837
|
if (typeof tag2 === "object" && tag2 != null && typeof tag2.name === "string") {
|
|
614868
|
-
if (
|
|
614869
|
-
const nonAsciiChars = [...tag2.name].filter((c5) =>
|
|
614838
|
+
if (NON_ASCII_REGEX2.test(tag2.name)) {
|
|
614839
|
+
const nonAsciiChars = [...tag2.name].filter((c5) => NON_ASCII_REGEX2.test(c5));
|
|
614870
614840
|
violations.push({
|
|
614871
614841
|
name: "no-invalid-tag-names-or-frontmatter",
|
|
614872
614842
|
severity: "error",
|
|
@@ -614902,9 +614872,9 @@ var NoInvalidTagNamesOrFrontmatterRule = {
|
|
|
614902
614872
|
}
|
|
614903
614873
|
if (Array.isArray(op4.tags) && !Array.isArray(apiDoc.tags)) {
|
|
614904
614874
|
for (const tag2 of op4.tags) {
|
|
614905
|
-
if (typeof tag2 === "string" && !seenInlineTags.has(tag2) &&
|
|
614875
|
+
if (typeof tag2 === "string" && !seenInlineTags.has(tag2) && NON_ASCII_REGEX2.test(tag2)) {
|
|
614906
614876
|
seenInlineTags.add(tag2);
|
|
614907
|
-
const nonAsciiChars = [...tag2].filter((c5) =>
|
|
614877
|
+
const nonAsciiChars = [...tag2].filter((c5) => NON_ASCII_REGEX2.test(c5));
|
|
614908
614878
|
violations.push({
|
|
614909
614879
|
name: "no-invalid-tag-names-or-frontmatter",
|
|
614910
614880
|
severity: "error",
|
|
@@ -622607,7 +622577,7 @@ var AccessTokenPosthogManager = class {
|
|
|
622607
622577
|
properties: {
|
|
622608
622578
|
...event,
|
|
622609
622579
|
...event.properties,
|
|
622610
|
-
version: "5.7.6-
|
|
622580
|
+
version: "5.7.6-3-gd8ee8ddb229",
|
|
622611
622581
|
usingAccessToken: true
|
|
622612
622582
|
}
|
|
622613
622583
|
});
|
|
@@ -622661,7 +622631,7 @@ var UserPosthogManager = class {
|
|
|
622661
622631
|
distinctId: this.userId ?? await this.getPersistedDistinctId(),
|
|
622662
622632
|
event: "CLI",
|
|
622663
622633
|
properties: {
|
|
622664
|
-
version: "5.7.6-
|
|
622634
|
+
version: "5.7.6-3-gd8ee8ddb229",
|
|
622665
622635
|
...event,
|
|
622666
622636
|
...event.properties,
|
|
622667
622637
|
usingAccessToken: false,
|
|
@@ -847021,7 +846991,7 @@ var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
|
|
|
847021
846991
|
var LOGS_FOLDER_NAME = "logs";
|
|
847022
846992
|
var MAX_LOGS_DIR_SIZE_BYTES = 100 * 1024 * 1024;
|
|
847023
846993
|
function getCliSource() {
|
|
847024
|
-
const version7 = "5.7.6-
|
|
846994
|
+
const version7 = "5.7.6-3-gd8ee8ddb229";
|
|
847025
846995
|
return `cli@${version7}`;
|
|
847026
846996
|
}
|
|
847027
846997
|
var DebugLogger = class {
|
|
@@ -859637,7 +859607,7 @@ var LegacyDocsPublisher = class {
|
|
|
859637
859607
|
previewId,
|
|
859638
859608
|
disableTemplates: void 0,
|
|
859639
859609
|
skipUpload,
|
|
859640
|
-
cliVersion: "5.7.6-
|
|
859610
|
+
cliVersion: "5.7.6-3-gd8ee8ddb229",
|
|
859641
859611
|
loginCommand: "fern auth login"
|
|
859642
859612
|
});
|
|
859643
859613
|
if (taskContext.getResult() === TaskResult.Failure) {
|
|
@@ -934079,7 +934049,7 @@ var CliContext = class _CliContext {
|
|
|
934079
934049
|
if (false) {
|
|
934080
934050
|
this.logger.error("CLI_VERSION is not defined");
|
|
934081
934051
|
}
|
|
934082
|
-
return "5.7.6-
|
|
934052
|
+
return "5.7.6-3-gd8ee8ddb229";
|
|
934083
934053
|
}
|
|
934084
934054
|
getCliName() {
|
|
934085
934055
|
if (false) {
|
|
@@ -949172,6 +949142,7 @@ async function formatWorkspaces({
|
|
|
949172
949142
|
// src/commands/generate/generateDocsWorkspace.ts
|
|
949173
949143
|
init_lib4();
|
|
949174
949144
|
init_js();
|
|
949145
|
+
init_lib6();
|
|
949175
949146
|
|
|
949176
949147
|
// src/utils/environment.ts
|
|
949177
949148
|
function detectCISource() {
|
|
@@ -949375,22 +949346,21 @@ ${source_default.yellow("?")} Are you sure you want to continue?`,
|
|
|
949375
949346
|
const skippedWorkspacePaths = /* @__PURE__ */ new Set();
|
|
949376
949347
|
const ossWorkspacesForValidation = await filterOssWorkspaces(project);
|
|
949377
949348
|
for (const ossWorkspace of ossWorkspacesForValidation) {
|
|
949349
|
+
const apiName = ossWorkspace.workspaceName ?? basename3(ossWorkspace.absoluteFilePath);
|
|
949378
949350
|
try {
|
|
949379
949351
|
const violations = await validateOSSWorkspace(ossWorkspace, context3);
|
|
949380
949352
|
const errors4 = violations.filter((v9) => v9.severity === "fatal" || v9.severity === "error");
|
|
949381
949353
|
if (errors4.length > 0) {
|
|
949382
|
-
|
|
949383
|
-
|
|
949384
|
-
|
|
949385
|
-
|
|
949386
|
-
|
|
949354
|
+
const reasons = summarizeValidationErrors(errors4);
|
|
949355
|
+
const reasonList = reasons.map((r5) => ` - ${r5}`).join("\n");
|
|
949356
|
+
context3.logger.error(
|
|
949357
|
+
`Skipping API ${apiName} due to ${errors4.length} validation error${errors4.length !== 1 ? "s" : ""}:
|
|
949358
|
+
${reasonList}`
|
|
949387
949359
|
);
|
|
949388
949360
|
skippedWorkspacePaths.add(ossWorkspace.absoluteFilePath);
|
|
949389
949361
|
}
|
|
949390
949362
|
} catch (error50) {
|
|
949391
|
-
context3.logger.
|
|
949392
|
-
`Skipping API workspace at ${ossWorkspace.absoluteFilePath}: ${extractErrorMessage(error50)}`
|
|
949393
|
-
);
|
|
949363
|
+
context3.logger.error(`Skipping API ${apiName}: ${extractErrorMessage(error50)}`);
|
|
949394
949364
|
skippedWorkspacePaths.add(ossWorkspace.absoluteFilePath);
|
|
949395
949365
|
}
|
|
949396
949366
|
}
|
|
@@ -949430,6 +949400,37 @@ function getExcludeRules(brokenLinks, strictBrokenLinks) {
|
|
|
949430
949400
|
}
|
|
949431
949401
|
return excludeRules;
|
|
949432
949402
|
}
|
|
949403
|
+
function summarizeValidationErrors(errors4) {
|
|
949404
|
+
const summaries = [];
|
|
949405
|
+
const frontmatterEndpoints = [];
|
|
949406
|
+
const nonAsciiTags = [];
|
|
949407
|
+
const otherErrors = [];
|
|
949408
|
+
for (const error50 of errors4) {
|
|
949409
|
+
if (error50.message.includes("---") && error50.message.includes("frontmatter")) {
|
|
949410
|
+
const methodPathMatch = error50.message.match(/for ((?:GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD|TRACE) \S+)/);
|
|
949411
|
+
frontmatterEndpoints.push(methodPathMatch?.[1] ?? error50.nodePath.join("."));
|
|
949412
|
+
} else if (error50.message.includes("non-ASCII")) {
|
|
949413
|
+
const tagMatch = error50.message.match(/Tag name "([^"]+)"/);
|
|
949414
|
+
nonAsciiTags.push(tagMatch?.[1] ?? "unknown");
|
|
949415
|
+
} else {
|
|
949416
|
+
otherErrors.push(error50);
|
|
949417
|
+
}
|
|
949418
|
+
}
|
|
949419
|
+
if (frontmatterEndpoints.length > 0) {
|
|
949420
|
+
summaries.push(
|
|
949421
|
+
`${frontmatterEndpoints.length} endpoint${frontmatterEndpoints.length !== 1 ? "s" : ""} contain "---" frontmatter delimiters that will cause 500 errors on the docs site`
|
|
949422
|
+
);
|
|
949423
|
+
}
|
|
949424
|
+
if (nonAsciiTags.length > 0) {
|
|
949425
|
+
summaries.push(
|
|
949426
|
+
`${nonAsciiTags.length} tag${nonAsciiTags.length !== 1 ? "s" : ""} contain non-ASCII characters: ${nonAsciiTags.join(", ")}`
|
|
949427
|
+
);
|
|
949428
|
+
}
|
|
949429
|
+
for (const error50 of otherErrors) {
|
|
949430
|
+
summaries.push(`${error50.relativeFilepath}: ${error50.message}`);
|
|
949431
|
+
}
|
|
949432
|
+
return summaries;
|
|
949433
|
+
}
|
|
949433
949434
|
|
|
949434
949435
|
// src/commands/generate-dynamic-ir/generateDynamicIrForWorkspaces.ts
|
|
949435
949436
|
init_lib6();
|
package/package.json
CHANGED