@fern-api/fern-api-dev 3.56.0 → 3.56.8-2-gaa987c8967c

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 +23 -128
  2. package/package.json +1 -1
package/cli.cjs CHANGED
@@ -1454492,7 +1454492,7 @@ function getRequestBody3(endpoint3) {
1454492
1454492
  // ../fern-definition/schema/lib/utils/HttpEndpointReferenceParser.js
1454493
1454493
  var HttpEndpointReferenceParser2 = class {
1454494
1454494
  //eslint-disable-next-line
1454495
- REFERENCE_REGEX = /^(?:(\w+)::)?(GET|POST|PUT|DELETE|PATCH|HEAD)\s(\/\S*)$/;
1454495
+ REFERENCE_REGEX = /^(GET|POST|PUT|DELETE|PATCH|HEAD)\s(\/\S*)$/;
1454496
1454496
  validate(reference4) {
1454497
1454497
  const validFormat = this.REFERENCE_REGEX.test(reference4);
1454498
1454498
  if (!validFormat) {
@@ -1454506,14 +1454506,12 @@ var HttpEndpointReferenceParser2 = class {
1454506
1454506
  return void 0;
1454507
1454507
  }
1454508
1454508
  const match3 = reference4.match(this.REFERENCE_REGEX);
1454509
- if (match3 == null || match3[2] == null || match3[3] == null) {
1454509
+ if (match3 == null || match3[1] == null || match3[2] == null) {
1454510
1454510
  return void 0;
1454511
1454511
  }
1454512
1454512
  return {
1454513
- namespace: match3[1],
1454514
- // undefined if no namespace prefix
1454515
- method: match3[2],
1454516
- path: match3[3]
1454513
+ method: match3[1],
1454514
+ path: match3[2]
1454517
1454515
  };
1454518
1454516
  }
1454519
1454517
  };
@@ -1506917,15 +1506915,9 @@ var EndpointResolverImpl = class {
1506917
1506915
  }
1506918
1506916
  return resolvedEndpoint;
1506919
1506917
  }
1506920
- resolveEndpointByMethodAndPath({ method: method8, path: path86, namespace, casingsGenerator }) {
1506918
+ resolveEndpointByMethodAndPath({ method: method8, path: path86, casingsGenerator }) {
1506921
1506919
  let result = void 0;
1506922
1506920
  visitAllDefinitionFiles(this.workspace, (relativeFilepath, file4, metadata) => {
1506923
- if (namespace != null) {
1506924
- const fileNamespace = this.getNamespaceFromFilepath(relativeFilepath);
1506925
- if (fileNamespace !== namespace) {
1506926
- return;
1506927
- }
1506928
- }
1506929
1506921
  const context2 = constructFernFileContext({
1506930
1506922
  relativeFilepath,
1506931
1506923
  definitionFile: file4,
@@ -1506944,12 +1506936,6 @@ var EndpointResolverImpl = class {
1506944
1506936
  }
1506945
1506937
  });
1506946
1506938
  visitAllPackageMarkers(this.workspace, (relativeFilepath, packageMarker) => {
1506947
- if (namespace != null) {
1506948
- const fileNamespace = this.getNamespaceFromFilepath(relativeFilepath);
1506949
- if (fileNamespace !== namespace) {
1506950
- return;
1506951
- }
1506952
- }
1506953
1506939
  const context2 = constructFernFileContext({
1506954
1506940
  relativeFilepath,
1506955
1506941
  definitionFile: packageMarker,
@@ -1506968,21 +1506954,12 @@ var EndpointResolverImpl = class {
1506968
1506954
  });
1506969
1506955
  return result;
1506970
1506956
  }
1506971
- getNamespaceFromFilepath(relativeFilepath) {
1506972
- const parts = relativeFilepath.split("/");
1506973
- if (parts.length > 1) {
1506974
- return parts[0];
1506975
- }
1506976
- return void 0;
1506977
- }
1506978
1506957
  resolveEndpoint({ endpoint: endpoint3, file: file4 }) {
1506979
1506958
  const referenceParser = new HttpEndpointReferenceParser2();
1506980
1506959
  const parsedEndpointReference = referenceParser.tryParse(endpoint3);
1506981
1506960
  if (parsedEndpointReference != null) {
1506982
1506961
  return this.resolveEndpointByMethodAndPath({
1506983
- method: parsedEndpointReference.method,
1506984
- path: parsedEndpointReference.path,
1506985
- namespace: parsedEndpointReference.namespace,
1506962
+ ...parsedEndpointReference,
1506986
1506963
  casingsGenerator: file4.casingsGenerator
1506987
1506964
  });
1506988
1506965
  }
@@ -1547646,7 +1547623,7 @@ async function getFrontmatterPosition({ absolutePath, readFileFn = (path86, enco
1547646
1547623
  }
1547647
1547624
  async function buildNavigationForDirectory({ directoryPath, getDir = getDirectoryContents, readFileFn = (path86, encoding) => (0, import_promises28.readFile)(path86, encoding) }) {
1547648
1547625
  const contents = await getDir(directoryPath);
1547649
- const markdownFiles = contents.filter((item) => item.type === "file" && (item.name.toLowerCase().endsWith(".md") || item.name.toLowerCase().endsWith(".mdx")));
1547626
+ const markdownFiles = contents.filter((item) => item.type === "file" && (item.name.endsWith(".md") || item.name.endsWith(".mdx")));
1547650
1547627
  const subdirectories = contents.filter((item) => item.type === "directory");
1547651
1547628
  const pagePositions = await Promise.all(markdownFiles.map((file4) => getFrontmatterPosition({ absolutePath: file4.absolutePath, readFileFn })));
1547652
1547629
  const pages = markdownFiles.map((file4) => {
@@ -1547670,18 +1547647,16 @@ async function buildNavigationForDirectory({ directoryPath, getDir = getDirector
1547670
1547647
  getDir,
1547671
1547648
  readFileFn
1547672
1547649
  });
1547673
- const indexPage = subContents.find((item) => item.type === "page" && (item.slug === "index" || item.absolutePath.toLowerCase().endsWith("/index.mdx") || item.absolutePath.toLowerCase().endsWith("/index.md")));
1547674
- const filteredContents = indexPage ? subContents.filter((item) => item !== indexPage) : subContents;
1547675
1547650
  return {
1547676
1547651
  type: "section",
1547677
1547652
  title: nameToTitle({ name: dir.name }),
1547678
1547653
  slug: nameToSlug({ name: dir.name }),
1547679
1547654
  icon: void 0,
1547680
- contents: filteredContents,
1547655
+ contents: subContents,
1547681
1547656
  collapsed: void 0,
1547682
1547657
  hidden: void 0,
1547683
1547658
  skipUrlSlug: false,
1547684
- overviewAbsolutePath: indexPage?.type === "page" ? indexPage.absolutePath : void 0,
1547659
+ overviewAbsolutePath: void 0,
1547685
1547660
  viewers: void 0,
1547686
1547661
  orphaned: void 0,
1547687
1547662
  featureFlags: void 0,
@@ -1548387,8 +1548362,6 @@ async function expandFolderConfiguration({ rawConfig, absolutePathToFernFolder,
1548387
1548362
  context2.failAndThrow(`Folder not found: ${rawConfig.folder}`);
1548388
1548363
  }
1548389
1548364
  const contents = await buildNavigationForDirectory({ directoryPath: folderPath });
1548390
- const indexPage = contents.find((item) => item.type === "page" && (item.slug === "index" || item.absolutePath.toLowerCase().endsWith("/index.mdx") || item.absolutePath.toLowerCase().endsWith("/index.md")));
1548391
- const filteredContents = indexPage ? contents.filter((item) => item !== indexPage) : contents;
1548392
1548365
  const folderName = import_path28.default.basename(folderPath);
1548393
1548366
  const title4 = rawConfig.title ?? nameToTitle({ name: folderName });
1548394
1548367
  const slug = rawConfig.slug ?? nameToSlug({ name: folderName });
@@ -1548396,12 +1548369,12 @@ async function expandFolderConfiguration({ rawConfig, absolutePathToFernFolder,
1548396
1548369
  type: "section",
1548397
1548370
  title: title4,
1548398
1548371
  icon: resolveIconPath(rawConfig.icon, absolutePathToConfig),
1548399
- contents: filteredContents,
1548372
+ contents,
1548400
1548373
  slug,
1548401
1548374
  collapsed: rawConfig.collapsed ?? void 0,
1548402
1548375
  hidden: rawConfig.hidden ?? void 0,
1548403
1548376
  skipUrlSlug: rawConfig.skipSlug ?? false,
1548404
- overviewAbsolutePath: indexPage?.type === "page" ? indexPage.absolutePath : void 0,
1548377
+ overviewAbsolutePath: void 0,
1548405
1548378
  viewers: parseRoles(rawConfig.viewers),
1548406
1548379
  orphaned: rawConfig.orphaned,
1548407
1548380
  featureFlags: convertFeatureFlag(rawConfig.featureFlag),
@@ -1554014,7 +1553987,6 @@ async function doesPathExist2(filepath) {
1554014
1553987
  }
1554015
1553988
 
1554016
1553989
  // ../../commons/github/lib/cloneRepository.js
1554017
- var import_child_process3 = require("child_process");
1554018
1553990
  var import_tmp_promise3 = __toESM(require_tmp_promise(), 1);
1554019
1553991
 
1554020
1553992
  // ../../commons/github/lib/parseRepository.js
@@ -1554060,77 +1554032,17 @@ function getCloneUrl({ remote, owner, repo }) {
1554060
1554032
  }
1554061
1554033
 
1554062
1554034
  // ../../commons/github/lib/cloneRepository.js
1554063
- function sanitizeCloneUrl(url3) {
1554064
- return url3.replace(/\/\/[^@]+@/, "//[REDACTED]@");
1554065
- }
1554066
- function isGitAvailable() {
1554067
- try {
1554068
- (0, import_child_process3.execSync)("git --version", { encoding: "utf-8", stdio: "pipe" });
1554069
- return true;
1554070
- } catch {
1554071
- return false;
1554072
- }
1554073
- }
1554074
- function getGitDiagnostics() {
1554075
- const diagnostics = [];
1554076
- try {
1554077
- const whichCommand = process.platform === "win32" ? "where git" : "which git";
1554078
- const gitPath = (0, import_child_process3.execSync)(`${whichCommand} 2>/dev/null || echo 'not found'`, { encoding: "utf-8" }).trim();
1554079
- diagnostics.push(`git path: ${gitPath}`);
1554080
- } catch {
1554081
- diagnostics.push("git path: unable to determine");
1554082
- }
1554083
- try {
1554084
- const gitVersion = (0, import_child_process3.execSync)("git --version 2>/dev/null || echo 'unknown'", { encoding: "utf-8" }).trim();
1554085
- diagnostics.push(`version: ${gitVersion}`);
1554086
- } catch {
1554087
- diagnostics.push("version: unknown");
1554088
- }
1554089
- try {
1554090
- const isContainer = (0, import_child_process3.execSync)("test -f /.dockerenv && echo 'yes' || echo 'no'", { encoding: "utf-8" }).trim() === "yes";
1554091
- diagnostics.push(`in container: ${isContainer}`);
1554092
- } catch {
1554093
- diagnostics.push("in container: unknown");
1554094
- }
1554095
- diagnostics.push(`PATH: ${process.env.PATH ?? "unset"}`);
1554096
- return diagnostics.join(", ");
1554097
- }
1554098
1554035
  async function cloneRepository({ githubRepository, installationToken, targetDirectory, timeoutMs }) {
1554099
1554036
  const repositoryReference = parseRepository2(githubRepository);
1554100
1554037
  const cloneUrl = installationToken != null ? repositoryReference.getAuthedCloneUrl(installationToken) : repositoryReference.cloneUrl;
1554101
1554038
  const clonePath = targetDirectory ?? (await import_tmp_promise3.default.dir()).path;
1554102
- const sanitizedUrl = sanitizeCloneUrl(cloneUrl);
1554103
- if (!isGitAvailable()) {
1554104
- const diagnostics = getGitDiagnostics();
1554105
- throw new Error(`Git is not installed or not found in PATH. Self-hosted GitHub mode requires git to be installed on the host machine where the Fern CLI runs. Please install git and ensure it is available in your PATH. Repository: ${githubRepository}. Debug info: ${diagnostics}`);
1554106
- }
1554107
1554039
  const git = esm_default3(clonePath, {
1554108
1554040
  timeout: timeoutMs != null ? {
1554109
1554041
  block: timeoutMs
1554110
1554042
  // Kill the process if no data is received for the specified time
1554111
1554043
  } : void 0
1554112
1554044
  });
1554113
- const startTime = Date.now();
1554114
- try {
1554115
- await git.clone(cloneUrl, ".");
1554116
- } catch (error49) {
1554117
- const elapsed = Date.now() - startTime;
1554118
- const errorMessage = error49 instanceof Error ? error49.message : String(error49);
1554119
- if (errorMessage.includes("ENOENT") || errorMessage.includes("spawn git")) {
1554120
- const diagnostics = getGitDiagnostics();
1554121
- throw new Error(`Failed to clone repository: git command not found. Self-hosted GitHub mode requires git to be installed on the host machine where the Fern CLI runs. URL: ${sanitizedUrl}. Elapsed: ${elapsed}ms. Debug info: ${diagnostics}. Original error: ${errorMessage}`);
1554122
- }
1554123
- if (errorMessage.includes("Authentication failed") || errorMessage.includes("could not read Username") || errorMessage.includes("401") || errorMessage.includes("403")) {
1554124
- throw new Error(`Failed to clone repository: authentication failed. Ensure your GitHub token is set and has access to the repository. URL: ${sanitizedUrl}. Elapsed: ${elapsed}ms. Original error: ${errorMessage}`);
1554125
- }
1554126
- if (errorMessage.includes("Repository not found") || errorMessage.includes("not found") || errorMessage.includes("404")) {
1554127
- throw new Error(`Failed to clone repository: repository not found. Check that ${githubRepository} exists and your token has access. URL: ${sanitizedUrl}. Elapsed: ${elapsed}ms. Original error: ${errorMessage}`);
1554128
- }
1554129
- if (errorMessage.includes("Connection refused") || errorMessage.includes("Connection timed out") || errorMessage.includes("Could not resolve host") || errorMessage.includes("unable to access")) {
1554130
- throw new Error(`Failed to clone repository: network error. Check network connectivity and proxy settings. URL: ${sanitizedUrl}. Elapsed: ${elapsed}ms. Original error: ${errorMessage}`);
1554131
- }
1554132
- throw new Error(`Failed to clone repository ${githubRepository}. URL: ${sanitizedUrl}. Elapsed: ${elapsed}ms. Original error: ${errorMessage}`);
1554133
- }
1554045
+ await git.clone(cloneUrl, ".");
1554134
1554046
  return new ClonedRepository({
1554135
1554047
  clonePath,
1554136
1554048
  git
@@ -1610119,10 +1610031,7 @@ function convertTypeShape4(irType) {
1610119
1610031
  description: variant.docs ?? void 0,
1610120
1610032
  type: convertTypeReference12(variant.type),
1610121
1610033
  availability: void 0,
1610122
- // If displayName is not specified, don't fall back to originalName
1610123
- // originalName may contain generated names (e.g., "ObjectsObjectTypeBatchUpsertPostRequestBody...")
1610124
- // which are not user-friendly and should not be user-facing
1610125
- displayName: variant.type.type === "named" ? variant.type.displayName : void 0
1610034
+ displayName: variant.type.type === "named" ? variant.type.displayName ?? variant.type.name.originalName : void 0
1610126
1610035
  };
1610127
1610036
  })
1610128
1610037
  };
@@ -1664035,19 +1663944,6 @@ generators:
1664035
1663944
  if (selfhostedGithubConfig != null) {
1664036
1663945
  await fs20.rm(absolutePathToLocalOutput, { recursive: true, force: true });
1664037
1663946
  await fs20.mkdir(absolutePathToLocalOutput, { recursive: true });
1664038
- interactiveTaskContext.logger.debug(`Self-hosted GitHub mode: cloning ${selfhostedGithubConfig.uri} to ${absolutePathToLocalOutput}`);
1664039
- try {
1664040
- const { execSync: execSync3 } = await import("child_process");
1664041
- const gitPath = execSync3("which git 2>/dev/null || echo 'not found'", {
1664042
- encoding: "utf-8"
1664043
- }).trim();
1664044
- const gitVersion = execSync3("git --version 2>/dev/null || echo 'unknown'", {
1664045
- encoding: "utf-8"
1664046
- }).trim();
1664047
- interactiveTaskContext.logger.debug(`Git environment: path=${gitPath}, version=${gitVersion}, PATH=${process.env.PATH ?? "unset"}`);
1664048
- } catch {
1664049
- interactiveTaskContext.logger.debug(`Git environment: unable to determine git info, PATH=${process.env.PATH ?? "unset"}`);
1664050
- }
1664051
1663947
  try {
1664052
1663948
  const repo = await cloneRepository({
1664053
1663949
  githubRepository: selfhostedGithubConfig.uri,
@@ -1668263,7 +1668159,7 @@ var import_yoctocolors_cjs11 = __toESM(require_yoctocolors_cjs(), 1);
1668263
1668159
 
1668264
1668160
  // ../../../node_modules/.pnpm/@inquirer+external-editor@1.0.3_@types+node@18.15.3/node_modules/@inquirer/external-editor/dist/esm/index.js
1668265
1668161
  var import_chardet = __toESM(require_lib11(), 1);
1668266
- var import_child_process4 = require("child_process");
1668162
+ var import_child_process3 = require("child_process");
1668267
1668163
  var import_fs20 = require("fs");
1668268
1668164
  var import_node_path16 = __toESM(require("path"), 1);
1668269
1668165
  var import_node_os2 = __toESM(require("os"), 1);
@@ -1668441,7 +1668337,7 @@ var ExternalEditor = class {
1668441
1668337
  }
1668442
1668338
  launchEditor() {
1668443
1668339
  try {
1668444
- const editorProcess = (0, import_child_process4.spawnSync)(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
1668340
+ const editorProcess = (0, import_child_process3.spawnSync)(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
1668445
1668341
  this.lastExitStatus = editorProcess.status ?? 0;
1668446
1668342
  } catch (launchError) {
1668447
1668343
  throw new LaunchEditorError(launchError);
@@ -1668449,7 +1668345,7 @@ var ExternalEditor = class {
1668449
1668345
  }
1668450
1668346
  launchEditorAsync(callback) {
1668451
1668347
  try {
1668452
- const editorProcess = (0, import_child_process4.spawn)(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
1668348
+ const editorProcess = (0, import_child_process3.spawn)(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: "inherit" });
1668453
1668349
  editorProcess.on("exit", (code6) => {
1668454
1668350
  this.lastExitStatus = code6;
1668455
1668351
  setImmediate(callback);
@@ -1672661,7 +1672557,7 @@ var AccessTokenPosthogManager = class {
1672661
1672557
  properties: {
1672662
1672558
  ...event,
1672663
1672559
  ...event.properties,
1672664
- version: "3.56.0",
1672560
+ version: "3.56.8-2-gaa987c8967c",
1672665
1672561
  usingAccessToken: true
1672666
1672562
  }
1672667
1672563
  });
@@ -1672711,7 +1672607,7 @@ var UserPosthogManager = class {
1672711
1672607
  distinctId: this.userId ?? await this.getPersistedDistinctId(),
1672712
1672608
  event: "CLI",
1672713
1672609
  properties: {
1672714
- version: "3.56.0",
1672610
+ version: "3.56.8-2-gaa987c8967c",
1672715
1672611
  ...event,
1672716
1672612
  ...event.properties,
1672717
1672613
  usingAccessToken: false,
@@ -1704633,7 +1704529,7 @@ var CliContext = class {
1704633
1704529
  if (false) {
1704634
1704530
  this.logger.error("CLI_VERSION is not defined");
1704635
1704531
  }
1704636
- return "3.56.0";
1704532
+ return "3.56.8-2-gaa987c8967c";
1704637
1704533
  }
1704638
1704534
  getCliName() {
1704639
1704535
  if (false) {
@@ -1707747,7 +1707643,7 @@ var import_path54 = __toESM(require("path"), 1);
1707747
1707643
  var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
1707748
1707644
  var LOGS_FOLDER_NAME = "logs";
1707749
1707645
  function getCliSource() {
1707750
- const version7 = "3.56.0";
1707646
+ const version7 = "3.56.8-2-gaa987c8967c";
1707751
1707647
  return `cli@${version7}`;
1707752
1707648
  }
1707753
1707649
  var DebugLogger = class {
@@ -1725286,8 +1725182,7 @@ async function listDocsPreview({
1725286
1725182
  const fdr = createFdrService({ token: token.value });
1725287
1725183
  const listResponse = await fdr.docs.v2.read.listAllDocsUrls({
1725288
1725184
  page,
1725289
- limit: limit ?? 100,
1725290
- preview: true
1725185
+ limit: limit ?? 100
1725291
1725186
  });
1725292
1725187
  if (!listResponse.ok) {
1725293
1725188
  return context2.failAndThrow("Failed to fetch docs URLs", listResponse.error);
@@ -1735096,9 +1734991,9 @@ function getAIEnhancerConfig2() {
1735096
1734991
  }
1735097
1734992
 
1735098
1734993
  // src/commands/sdk-diff/sdkDiffCommand.ts
1735099
- var import_child_process5 = require("child_process");
1734994
+ var import_child_process4 = require("child_process");
1735100
1734995
  var import_util64 = require("util");
1735101
- var execAsync = (0, import_util64.promisify)(import_child_process5.exec);
1734996
+ var execAsync = (0, import_util64.promisify)(import_child_process4.exec);
1735102
1734997
  async function getClientRegistry(context2, project) {
1735103
1734998
  const workspace = project.apiWorkspaces[0];
1735104
1734999
  if (workspace == null) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.56.0",
2
+ "version": "3.56.8-2-gaa987c8967c",
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/fern-api/fern.git",