diff --git a/packages/cli/docs-resolver/src/ApiReferenceNodeConverter.ts b/packages/cli/docs-resolver/src/ApiReferenceNodeConverter.ts index 35282c1547e..4c088273aec 100644 --- a/packages/cli/docs-resolver/src/ApiReferenceNodeConverter.ts +++ b/packages/cli/docs-resolver/src/ApiReferenceNodeConverter.ts @@ -42,6 +42,7 @@ export class ApiReferenceNodeConverter { private docsWorkspace: DocsWorkspace, private taskContext: TaskContext, private markdownFilesToFullSlugs: Map, + private markdownFilesToNoIndex: Map, idgen: NodeIdGenerator ) { this.disableEndpointPairs = docsWorkspace.config.experimental?.disableStreamToggle ?? false; @@ -88,6 +89,7 @@ export class ApiReferenceNodeConverter { const pointsTo = FernNavigation.V1.followRedirects(this.#children); const changelogNodeConverter = new ChangelogNodeConverter( this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, this.workspace.changelog?.files.map((file) => file.absoluteFilepath), this.docsWorkspace, this.#idgen @@ -160,6 +162,7 @@ export class ApiReferenceNodeConverter { parentSlug, docsWorkspace: this.docsWorkspace, markdownFilesToFullSlugs: this.markdownFilesToFullSlugs, + markdownFilesToNoIndex: this.markdownFilesToNoIndex, idgen: this.#idgen }); } diff --git a/packages/cli/docs-resolver/src/ApiReferenceNodeConverterLatest.ts b/packages/cli/docs-resolver/src/ApiReferenceNodeConverterLatest.ts index 0476a989685..a968dbc8d6b 100644 --- a/packages/cli/docs-resolver/src/ApiReferenceNodeConverterLatest.ts +++ b/packages/cli/docs-resolver/src/ApiReferenceNodeConverterLatest.ts @@ -49,6 +49,7 @@ export class ApiReferenceNodeConverterLatest { private docsWorkspace: DocsWorkspace, private taskContext: TaskContext, private markdownFilesToFullSlugs: Map, + private markdownFilesToNoIndex: Map, idgen: NodeIdGenerator ) { this.#api = api; @@ -92,6 +93,7 @@ export class ApiReferenceNodeConverterLatest { const pointsTo = FernNavigation.V1.followRedirects(this.#children); const changelogNodeConverter = new ChangelogNodeConverter( this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, this.workspace?.changelog?.files.map((file) => file.absoluteFilepath), this.docsWorkspace, this.#idgen @@ -161,7 +163,8 @@ export class ApiReferenceNodeConverterLatest { page, parentSlug, idgen: this.#idgen, - markdownFilesToFullSlugs: this.markdownFilesToFullSlugs + markdownFilesToFullSlugs: this.markdownFilesToFullSlugs, + markdownFilesToNoIndex: this.markdownFilesToNoIndex }); } diff --git a/packages/cli/docs-resolver/src/ChangelogNodeConverter.ts b/packages/cli/docs-resolver/src/ChangelogNodeConverter.ts index 2819fcbd971..6d7f3e47ba4 100644 --- a/packages/cli/docs-resolver/src/ChangelogNodeConverter.ts +++ b/packages/cli/docs-resolver/src/ChangelogNodeConverter.ts @@ -30,6 +30,7 @@ const RESERVED_OVERVIEW_PAGE_NAMES = ["summary", "index", "overview"]; export class ChangelogNodeConverter { public constructor( private markdownToFullSlug: Map, + private markdownToNoIndex: Map, private changelogFiles: AbsoluteFilePath[] | undefined, private docsWorkspace: DocsWorkspace, private idgen: NodeIdGenerator @@ -73,6 +74,8 @@ export class ChangelogNodeConverter { urlSlug: opts.slug ?? kebabCase(title) }); + const noindex = overviewPagePath != null ? this.markdownToNoIndex.get(overviewPagePath) : undefined; + // sort changelog items by date, in descending order const changelogItems = unsortedChangelogItems.map((item): FernNavigation.V1.ChangelogEntryNode => { const date = dayjs.utc(item.date); @@ -91,7 +94,7 @@ export class ChangelogNodeConverter { hidden: undefined, date: item.date.toISOString(), pageId: item.pageId, - noindex: undefined, + noindex: this.markdownToNoIndex.get(item.absoluteFilepath), authed: undefined, viewers: undefined, orphaned: undefined, @@ -114,7 +117,7 @@ export class ChangelogNodeConverter { hidden: opts.hidden, children: changelogYears, overviewPageId, - noindex: undefined, + noindex, authed: undefined, viewers: opts.viewers, orphaned: opts.orphaned, diff --git a/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts b/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts index 8eb43862b43..641eb1cc77e 100644 --- a/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts +++ b/packages/cli/docs-resolver/src/DocsDefinitionResolver.ts @@ -690,6 +690,7 @@ export class DocsDefinitionResolver { this.docsWorkspace, this.taskContext, this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, this.#idgen ); return node.get(); @@ -715,6 +716,7 @@ export class DocsDefinitionResolver { this.docsWorkspace, this.taskContext, this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, this.#idgen ); return node.get(); @@ -751,6 +753,7 @@ export class DocsDefinitionResolver { this.docsWorkspace, this.taskContext, this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, this.#idgen ); return node.get(); @@ -762,6 +765,7 @@ export class DocsDefinitionResolver { ): Promise { const changelogResolver = new ChangelogNodeConverter( this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, item.changelog, this.docsWorkspace, this.#idgen @@ -879,6 +883,7 @@ export class DocsDefinitionResolver { ): Promise { const changelogResolver = new ChangelogNodeConverter( this.markdownFilesToFullSlugs, + this.markdownFilesToNoIndex, changelog, this.docsWorkspace, this.#idgen diff --git a/packages/cli/docs-resolver/src/__test__/api-resolver.test.ts b/packages/cli/docs-resolver/src/__test__/api-resolver.test.ts index a8d0ef31c21..e5af3f811f0 100644 --- a/packages/cli/docs-resolver/src/__test__/api-resolver.test.ts +++ b/packages/cli/docs-resolver/src/__test__/api-resolver.test.ts @@ -82,6 +82,7 @@ it.skip("converts to api reference node", async () => { docsWorkspace, context, new Map(), + new Map(), NodeIdGenerator.init() ).get(); diff --git a/packages/cli/docs-resolver/src/__test__/openapi-latest.test.ts b/packages/cli/docs-resolver/src/__test__/openapi-latest.test.ts index 746910f1638..c59a8a79348 100644 --- a/packages/cli/docs-resolver/src/__test__/openapi-latest.test.ts +++ b/packages/cli/docs-resolver/src/__test__/openapi-latest.test.ts @@ -72,6 +72,7 @@ it.skip("converts to api reference latest node", async () => { docsWorkspace, context, new Map(), + new Map(), NodeIdGenerator.init() ).get(); diff --git a/packages/cli/docs-resolver/src/__test__/stream.test.ts b/packages/cli/docs-resolver/src/__test__/stream.test.ts index d91ea53f39d..b590925e5d4 100644 --- a/packages/cli/docs-resolver/src/__test__/stream.test.ts +++ b/packages/cli/docs-resolver/src/__test__/stream.test.ts @@ -86,6 +86,7 @@ it.skip("converts to api reference node", async () => { docsWorkspace, context, new Map(), + new Map(), NodeIdGenerator.init() ).get(); diff --git a/packages/cli/docs-resolver/src/utils/toPageNode.ts b/packages/cli/docs-resolver/src/utils/toPageNode.ts index ce1d1bd2279..204ba9b7bbc 100644 --- a/packages/cli/docs-resolver/src/utils/toPageNode.ts +++ b/packages/cli/docs-resolver/src/utils/toPageNode.ts @@ -13,13 +13,15 @@ export function toPageNode({ page, parentSlug, idgen, - markdownFilesToFullSlugs + markdownFilesToFullSlugs, + markdownFilesToNoIndex }: { docsWorkspace: DocsWorkspace; page: docsYml.DocsNavigationItem.Page; parentSlug: FernNavigation.V1.SlugGenerator; idgen: NodeIdGenerator; markdownFilesToFullSlugs: Map; + markdownFilesToNoIndex: Map; }): FernNavigation.V1.PageNode { const pageId = FernNavigation.V1.PageId(toRelativeFilepath(docsWorkspace, page.absolutePath)); const pageSlug = parentSlug.apply({ @@ -34,7 +36,7 @@ export function toPageNode({ slug: pageSlug.get(), icon: page.icon, hidden: page.hidden, - noindex: page.noindex, + noindex: page.noindex || markdownFilesToNoIndex.get(page.absolutePath), authed: undefined, viewers: page.viewers, orphaned: page.orphaned, diff --git a/packages/cli/yaml/docs-validator/src/docsAst/versions-yml.schema.json b/packages/cli/yaml/docs-validator/src/docsAst/versions-yml.schema.json index e3682586898..95e6fbf5ae5 100644 --- a/packages/cli/yaml/docs-validator/src/docsAst/versions-yml.schema.json +++ b/packages/cli/yaml/docs-validator/src/docsAst/versions-yml.schema.json @@ -287,6 +287,16 @@ "type": "null" } ] + }, + "noindex": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ] } }, "required": [