@fern-api/fern-api-dev 5.30.1 → 5.30.3

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 +241 -147
  2. package/package.json +1 -1
package/cli.cjs CHANGED
@@ -582273,6 +582273,9 @@ function getFernStreamingExtension(document4, operation) {
582273
582273
  resumable
582274
582274
  };
582275
582275
  }
582276
+ if (streaming["stream-condition"] == null) {
582277
+ return void 0;
582278
+ }
582276
582279
  return {
582277
582280
  type: "streamCondition",
582278
582281
  format: streaming.format ?? "json",
@@ -668026,7 +668029,7 @@ var AccessTokenPosthogManager = class {
668026
668029
  properties: {
668027
668030
  ...event,
668028
668031
  ...event.properties,
668029
- version: "5.30.1",
668032
+ version: "5.30.3",
668030
668033
  usingAccessToken: true,
668031
668034
  ...getRunIdProperties()
668032
668035
  }
@@ -668090,7 +668093,7 @@ var UserPosthogManager = class {
668090
668093
  distinctId: this.userId ?? await this.getPersistedDistinctId(),
668091
668094
  event: "CLI",
668092
668095
  properties: {
668093
- version: "5.30.1",
668096
+ version: "5.30.3",
668094
668097
  ...event,
668095
668098
  ...event.properties,
668096
668099
  usingAccessToken: false,
@@ -859866,7 +859869,7 @@ var LOCAL_STORAGE_FOLDER4 = ".fern-dev";
859866
859869
  var LOGS_FOLDER_NAME = "logs";
859867
859870
  var MAX_LOGS_DIR_SIZE_BYTES = 100 * 1024 * 1024;
859868
859871
  function getCliSource() {
859869
- const version7 = "5.30.1";
859872
+ const version7 = "5.30.3";
859870
859873
  return `cli@${version7}`;
859871
859874
  }
859872
859875
  var DebugLogger = class {
@@ -862627,6 +862630,8 @@ init_lib6();
862627
862630
  var import_path72 = __toESM(require("path"), 1);
862628
862631
 
862629
862632
  // ../cli-v2/lib/commands/docs/link/check/LinkCheckClient.js
862633
+ var MAX_RETRIES = 3;
862634
+ var RETRY_DELAY_MS = 2e3;
862630
862635
  var LinkCheckClient = class {
862631
862636
  baseUrl;
862632
862637
  token;
@@ -862644,161 +862649,139 @@ var LinkCheckClient = class {
862644
862649
  let workingLinks = 0;
862645
862650
  let pagesScrapedSoFar = 0;
862646
862651
  let linksCheckedSoFar = 0;
862647
- let serverError;
862648
- let sawComplete = false;
862649
- const url3 = `${this.baseUrl}?${new URLSearchParams({ domain: domain3 }).toString()}`;
862650
- const response = await fetch(url3, {
862651
- headers: {
862652
- Authorization: `Bearer ${this.token}`,
862653
- Accept: "text/event-stream"
862654
- }
862655
- });
862656
- if (!response.ok) {
862657
- let errorMessage;
862658
- try {
862659
- const body = await response.json();
862660
- if (typeof body === "object" && body != null) {
862661
- const obj = body;
862662
- if (typeof obj.message === "string") {
862663
- errorMessage = obj.message;
862664
- } else if (typeof obj.error === "string") {
862665
- errorMessage = obj.error;
862666
- } else {
862667
- errorMessage = response.statusText;
862652
+ let scrapeJobId = null;
862653
+ let checkJobId = null;
862654
+ let scrapeComplete = false;
862655
+ while (!scrapeComplete) {
862656
+ const params2 = new URLSearchParams({ domain: domain3, phase: "scrape" });
862657
+ if (scrapeJobId != null) {
862658
+ params2.set("scrapeJobId", scrapeJobId);
862659
+ }
862660
+ const events = await this.fetchSseStream(params2);
862661
+ let batchAdvanced = false;
862662
+ for (const event of events) {
862663
+ switch (event.type) {
862664
+ case "sitemap_fetched": {
862665
+ if (isSitemapFetchedData(event.data)) {
862666
+ totalPages = event.data.totalPages;
862667
+ callbacks.onSitemapFetched?.({ totalPages: event.data.totalPages });
862668
+ }
862669
+ break;
862670
+ }
862671
+ case "page_scraped": {
862672
+ if (isPageScrapedData(event.data)) {
862673
+ totalPages = event.data.totalPages;
862674
+ pagesScrapedSoFar = event.data.pageIndex;
862675
+ callbacks.onPageScraped?.(event.data);
862676
+ }
862677
+ break;
862678
+ }
862679
+ case "scrape_batch_complete": {
862680
+ if (isScrapeBatchCompleteData(event.data)) {
862681
+ scrapeJobId = event.data.scrapeJobId;
862682
+ batchAdvanced = true;
862683
+ }
862684
+ break;
862685
+ }
862686
+ case "scrape_complete": {
862687
+ if (isScrapeCompleteData(event.data)) {
862688
+ checkJobId = event.data.jobId;
862689
+ totalPages = event.data.totalPages;
862690
+ totalLinks = event.data.totalLinks;
862691
+ scrapeComplete = true;
862692
+ batchAdvanced = true;
862693
+ }
862694
+ break;
862695
+ }
862696
+ case "error": {
862697
+ if (isErrorData(event.data)) {
862698
+ throw new LinkCheckError(0, event.data.message);
862699
+ }
862700
+ break;
862668
862701
  }
862669
- } else {
862670
- errorMessage = response.statusText;
862671
862702
  }
862672
- } catch {
862673
- errorMessage = response.statusText;
862674
862703
  }
862675
- throw new LinkCheckError(response.status, errorMessage);
862704
+ if (!scrapeComplete && !batchAdvanced) {
862705
+ callbacks.onStreamInterrupted?.({
862706
+ phase: "scraping pages",
862707
+ pagesScraped: pagesScrapedSoFar,
862708
+ totalPages,
862709
+ linksChecked: 0,
862710
+ totalLinks: 0
862711
+ });
862712
+ return {
862713
+ totalPages: pagesScrapedSoFar,
862714
+ totalLinks: 0,
862715
+ workingLinks: 0,
862716
+ brokenLinks,
862717
+ blockedLinks,
862718
+ durationMs: Date.now() - startTime
862719
+ };
862720
+ }
862676
862721
  }
862677
- const reader = response.body?.getReader();
862678
- if (reader == null) {
862679
- throw new LinkCheckError(0, "No response body received from server.");
862722
+ if (checkJobId == null) {
862723
+ throw new LinkCheckError(0, "Scraping completed but no check job ID was returned.");
862680
862724
  }
862681
- const decoder = new TextDecoder();
862682
- let buffer = "";
862683
- const processLine = (line) => {
862684
- let payload;
862685
- if (line.startsWith("data: ")) {
862686
- payload = line.slice(6);
862687
- } else if (line.startsWith("data:")) {
862688
- payload = line.slice(5);
862689
- } else {
862690
- return;
862691
- }
862692
- let event;
862693
- try {
862694
- const parsed = JSON.parse(payload);
862695
- if (parsed == null || typeof parsed !== "object" || !("type" in parsed) || typeof parsed.type !== "string" || !("data" in parsed) || typeof parsed.data !== "object" || parsed.data == null) {
862696
- return;
862697
- }
862698
- event = parsed;
862699
- } catch {
862700
- return;
862701
- }
862702
- switch (event.type) {
862703
- case "sitemap_fetched": {
862704
- if (isSitemapFetchedData(event.data)) {
862705
- totalPages = event.data.totalPages;
862706
- callbacks.onSitemapFetched?.({ totalPages: event.data.totalPages });
862725
+ let checkComplete = false;
862726
+ while (!checkComplete) {
862727
+ const params2 = new URLSearchParams({ domain: domain3, phase: "check", jobId: checkJobId });
862728
+ const events = await this.fetchSseStream(params2);
862729
+ let batchAdvanced = false;
862730
+ for (const event of events) {
862731
+ switch (event.type) {
862732
+ case "links_check_started": {
862733
+ if (isLinksCheckStartedData(event.data)) {
862734
+ totalLinks = event.data.totalLinks;
862735
+ }
862736
+ break;
862707
862737
  }
862708
- break;
862709
- }
862710
- case "page_scraped": {
862711
- if (isPageScrapedData(event.data)) {
862712
- totalPages = event.data.totalPages;
862713
- pagesScrapedSoFar = event.data.pageIndex + 1;
862714
- callbacks.onPageScraped?.({
862715
- ...event.data,
862716
- pageIndex: event.data.pageIndex + 1
862717
- });
862738
+ case "link_check_progress": {
862739
+ if (isLinkCheckProgressData(event.data)) {
862740
+ totalLinks = event.data.totalLinks;
862741
+ linksCheckedSoFar = event.data.linksChecked;
862742
+ callbacks.onLinkChecked?.(event.data);
862743
+ }
862744
+ break;
862718
862745
  }
862719
- break;
862720
- }
862721
- case "links_check_started": {
862722
- if (isLinksCheckStartedData(event.data)) {
862723
- totalLinks = event.data.totalLinks;
862746
+ case "link_checked": {
862747
+ if (isLinkCheckedData(event.data)) {
862748
+ brokenLinks.push(toBrokenLink(event.data));
862749
+ }
862750
+ break;
862724
862751
  }
862725
- break;
862726
- }
862727
- case "link_check_progress": {
862728
- if (isLinkCheckProgressData(event.data)) {
862729
- totalLinks = event.data.totalLinks;
862730
- linksCheckedSoFar = event.data.linksChecked;
862731
- callbacks.onLinkChecked?.(event.data);
862752
+ case "link_blocked": {
862753
+ if (isLinkCheckedData(event.data)) {
862754
+ blockedLinks.push(toBrokenLink(event.data));
862755
+ }
862756
+ break;
862732
862757
  }
862733
- break;
862734
- }
862735
- case "link_checked": {
862736
- if (isLinkCheckedData(event.data)) {
862737
- brokenLinks.push(toBrokenLink(event.data));
862758
+ case "batch_complete": {
862759
+ if (isBatchCompleteData(event.data)) {
862760
+ batchAdvanced = true;
862761
+ }
862762
+ break;
862738
862763
  }
862739
- break;
862740
- }
862741
- case "complete": {
862742
- if (isCompleteData(event.data)) {
862743
- sawComplete = true;
862744
- totalPages = event.data.totalPages;
862745
- totalLinks = event.data.totalLinks;
862746
- workingLinks = event.data.workingLinks;
862747
- brokenLinks.length = 0;
862748
- for (const link3 of event.data.brokenLinks) {
862749
- if (typeof link3 !== "object" || link3 == null) {
862750
- continue;
862751
- }
862752
- if (isLinkCheckedData(link3)) {
862753
- brokenLinks.push(toBrokenLink(link3));
862754
- }
862764
+ case "complete": {
862765
+ if (isCompleteData(event.data)) {
862766
+ checkComplete = true;
862767
+ batchAdvanced = true;
862768
+ totalPages = event.data.totalPages;
862769
+ totalLinks = event.data.totalLinks;
862770
+ workingLinks = event.data.workingLinks;
862755
862771
  }
862756
- blockedLinks.length = 0;
862757
- for (const link3 of event.data.blockedLinks) {
862758
- if (typeof link3 !== "object" || link3 == null) {
862759
- continue;
862760
- }
862761
- if (isLinkCheckedData(link3)) {
862762
- blockedLinks.push(toBrokenLink(link3));
862763
- }
862772
+ break;
862773
+ }
862774
+ case "error": {
862775
+ if (isErrorData(event.data)) {
862776
+ throw new LinkCheckError(0, event.data.message);
862764
862777
  }
862778
+ break;
862765
862779
  }
862766
- break;
862767
862780
  }
862768
- case "error": {
862769
- if (isErrorData(event.data)) {
862770
- serverError = event.data.message;
862771
- }
862772
- break;
862773
- }
862774
- }
862775
- };
862776
- while (true) {
862777
- const { done, value: value2 } = await reader.read();
862778
- if (done) {
862779
- break;
862780
- }
862781
- buffer += decoder.decode(value2, { stream: true });
862782
- const lines = buffer.split("\n");
862783
- buffer = lines.pop() ?? "";
862784
- for (const line of lines) {
862785
- processLine(line);
862786
862781
  }
862787
- }
862788
- buffer += decoder.decode();
862789
- if (buffer.length > 0) {
862790
- for (const line of buffer.split("\n")) {
862791
- processLine(line);
862792
- }
862793
- }
862794
- if (serverError != null) {
862795
- throw new LinkCheckError(0, serverError);
862796
- }
862797
- if (!sawComplete) {
862798
- const phase = totalLinks > 0 ? "checking links" : pagesScrapedSoFar > 0 ? "scraping pages" : "connecting";
862799
- if (brokenLinks.length > 0 || blockedLinks.length > 0) {
862782
+ if (!checkComplete && !batchAdvanced) {
862800
862783
  callbacks.onStreamInterrupted?.({
862801
- phase,
862784
+ phase: "checking links",
862802
862785
  pagesScraped: pagesScrapedSoFar,
862803
862786
  totalPages,
862804
862787
  linksChecked: linksCheckedSoFar,
@@ -862813,8 +862796,6 @@ var LinkCheckClient = class {
862813
862796
  durationMs: Date.now() - startTime
862814
862797
  };
862815
862798
  }
862816
- const detail = phase === "connecting" ? "The server closed the connection before sending any data. This may indicate a timeout or network issue." : `The connection was lost while ${phase} (${pagesScrapedSoFar} pages scraped, ${linksCheckedSoFar}/${totalLinks} links checked). This is usually caused by a server timeout.`;
862817
- throw new LinkCheckError(0, detail);
862818
862799
  }
862819
862800
  return {
862820
862801
  totalPages,
@@ -862825,7 +862806,111 @@ var LinkCheckClient = class {
862825
862806
  durationMs: Date.now() - startTime
862826
862807
  };
862827
862808
  }
862809
+ /**
862810
+ * Opens an SSE connection with retries and returns all parsed events.
862811
+ * Retries on connection failures up to MAX_RETRIES times.
862812
+ */
862813
+ async fetchSseStream(params2) {
862814
+ let lastError;
862815
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
862816
+ if (attempt > 0) {
862817
+ await new Promise((resolve15) => setTimeout(resolve15, RETRY_DELAY_MS * attempt));
862818
+ }
862819
+ try {
862820
+ return await this.readSseStream(params2);
862821
+ } catch (error50) {
862822
+ if (error50 instanceof LinkCheckError) {
862823
+ throw error50;
862824
+ }
862825
+ lastError = error50 instanceof Error ? error50 : new Error(String(error50));
862826
+ }
862827
+ }
862828
+ throw new LinkCheckError(0, `Connection failed after ${MAX_RETRIES + 1} attempts: ${lastError?.message ?? "unknown error"}`);
862829
+ }
862830
+ /**
862831
+ * Opens a single SSE connection and reads all events until the stream closes.
862832
+ */
862833
+ async readSseStream(params2) {
862834
+ const url3 = `${this.baseUrl}?${params2.toString()}`;
862835
+ const response = await fetch(url3, {
862836
+ headers: {
862837
+ Authorization: `Bearer ${this.token}`,
862838
+ Accept: "text/event-stream"
862839
+ }
862840
+ });
862841
+ if (!response.ok) {
862842
+ const errorMessage = await this.extractErrorMessage(response);
862843
+ throw new LinkCheckError(response.status, errorMessage);
862844
+ }
862845
+ const reader = response.body?.getReader();
862846
+ if (reader == null) {
862847
+ throw new LinkCheckError(0, "No response body received from server.");
862848
+ }
862849
+ const decoder = new TextDecoder();
862850
+ let buffer = "";
862851
+ const events = [];
862852
+ while (true) {
862853
+ const { done, value: value2 } = await reader.read();
862854
+ if (done) {
862855
+ break;
862856
+ }
862857
+ buffer += decoder.decode(value2, { stream: true });
862858
+ const lines = buffer.split("\n");
862859
+ buffer = lines.pop() ?? "";
862860
+ for (const line of lines) {
862861
+ const event = parseSseLine(line);
862862
+ if (event != null) {
862863
+ events.push(event);
862864
+ }
862865
+ }
862866
+ }
862867
+ buffer += decoder.decode();
862868
+ if (buffer.length > 0) {
862869
+ for (const line of buffer.split("\n")) {
862870
+ const event = parseSseLine(line);
862871
+ if (event != null) {
862872
+ events.push(event);
862873
+ }
862874
+ }
862875
+ }
862876
+ return events;
862877
+ }
862878
+ async extractErrorMessage(response) {
862879
+ try {
862880
+ const body = await response.json();
862881
+ if (typeof body === "object" && body != null) {
862882
+ const obj = body;
862883
+ if (typeof obj.message === "string") {
862884
+ return obj.message;
862885
+ }
862886
+ if (typeof obj.error === "string") {
862887
+ return obj.error;
862888
+ }
862889
+ }
862890
+ } catch {
862891
+ }
862892
+ return response.statusText;
862893
+ }
862828
862894
  };
862895
+ function parseSseLine(line) {
862896
+ let payload;
862897
+ if (line.startsWith("data: ")) {
862898
+ payload = line.slice(6);
862899
+ } else if (line.startsWith("data:")) {
862900
+ payload = line.slice(5);
862901
+ } else {
862902
+ return void 0;
862903
+ }
862904
+ try {
862905
+ const parsed = JSON.parse(payload);
862906
+ if (parsed == null || typeof parsed !== "object" || !("type" in parsed) || typeof parsed.type !== "string" || !("data" in parsed) || typeof parsed.data !== "object" || parsed.data == null) {
862907
+ return void 0;
862908
+ }
862909
+ return parsed;
862910
+ } catch {
862911
+ return void 0;
862912
+ }
862913
+ }
862829
862914
  function isSitemapFetchedData(data2) {
862830
862915
  return typeof data2.totalPages === "number";
862831
862916
  }
@@ -862844,6 +862929,15 @@ function isLinkCheckedData(data2) {
862844
862929
  function isCompleteData(data2) {
862845
862930
  return typeof data2.totalPages === "number" && typeof data2.totalLinks === "number" && typeof data2.workingLinks === "number" && Array.isArray(data2.brokenLinks) && Array.isArray(data2.blockedLinks);
862846
862931
  }
862932
+ function isScrapeBatchCompleteData(data2) {
862933
+ return typeof data2.scrapeJobId === "string" && typeof data2.hasMore === "boolean";
862934
+ }
862935
+ function isScrapeCompleteData(data2) {
862936
+ return typeof data2.jobId === "string" && typeof data2.totalPages === "number" && typeof data2.totalLinks === "number";
862937
+ }
862938
+ function isBatchCompleteData(data2) {
862939
+ return typeof data2.jobId === "string" && typeof data2.hasMore === "boolean";
862940
+ }
862847
862941
  function isErrorData(data2) {
862848
862942
  return typeof data2.message === "string";
862849
862943
  }
@@ -878607,7 +878701,7 @@ var LegacyDocsPublisher = class {
878607
878701
  previewId,
878608
878702
  disableTemplates: void 0,
878609
878703
  skipUpload,
878610
- cliVersion: "5.30.1",
878704
+ cliVersion: "5.30.3",
878611
878705
  loginCommand: "fern auth login"
878612
878706
  });
878613
878707
  if (taskContext.getResult() === TaskResult.Failure) {
@@ -953017,7 +953111,7 @@ function getAutomationContextFromEnv() {
953017
953111
  config_branch: process.env.FERN_CONFIG_BRANCH,
953018
953112
  config_pr_number: process.env.FERN_CONFIG_PR_NUMBER,
953019
953113
  trigger: process.env.GITHUB_EVENT_NAME,
953020
- cli_version: "5.30.1"
953114
+ cli_version: "5.30.3"
953021
953115
  };
953022
953116
  }
953023
953117
  function isAutomationMode() {
@@ -953843,7 +953937,7 @@ var CliContext = class _CliContext {
953843
953937
  if (false) {
953844
953938
  this.logger.error("CLI_VERSION is not defined");
953845
953939
  }
953846
- return "5.30.1";
953940
+ return "5.30.3";
953847
953941
  }
953848
953942
  getCliName() {
953849
953943
  if (false) {
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "5.30.1",
2
+ "version": "5.30.3",
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/fern-api/fern.git",