@fern-api/fdr-sdk 1.2.56-488d16ee49 → 1.2.56-a6947428a1
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/dist/js/navigation/ledger-root-builder.js +1 -1
- package/dist/js/navigation/ledger-root-builder.js.map +1 -1
- package/dist/js/navigation/ledger-root-builder.mjs +1 -1
- package/dist/js/navigation/ledger-root-builder.mjs.map +1 -1
- package/dist/navigation/__test__/ledger-root-builder.rootChildOrder.test.js +5 -7
- package/dist/navigation/__test__/ledger-root-builder.rootChildOrder.test.js.map +1 -1
- package/dist/navigation/ledger-root-builder.d.ts.map +1 -1
- package/dist/navigation/ledger-root-builder.js +6 -9
- package/dist/navigation/ledger-root-builder.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/navigation/ledger-root-builder.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/orpc-client/api/shared.ts","../../../src/orpc-client/shared.ts","../../../src/navigation/types/latest.ts","../../../src/navigation/versions/latest/getChildren.ts","../../../src/navigation/versions/latest/NavigationNodeApiLeaf.ts","../../../src/navigation/versions/latest/NavigationNodePageLeaf.ts","../../../src/navigation/versions/latest/NavigationNodeLeaf.ts","../../../../commons/core-utils/src/assertNever.ts","../../../../commons/core-utils/src/visitDiscriminatedUnion.ts","../../../src/navigation/versions/latest/getPageId.ts","../../../src/navigation/versions/latest/NavigationNodeSection.ts","../../../src/navigation/versions/latest/NavigationNodeSectionOverview.ts","../../../src/navigation/versions/latest/NavigationNodeMarkdown.ts","../../../src/navigation/versions/latest/NavigationNodePage.ts","../../../src/navigation/versions/latest/NavigationNodeWithMetadata.ts","../../../src/navigation/versions/latest/NavigationNodeWithRedirect.ts","../../../../commons/core-utils/src/isNonNullish.ts","../../../src/navigation/versions/latest/slugjoin.ts","../../../src/navigation/versions/latest/toDefaultSlug.ts","../../../src/utils/traversers/types.ts","../../../src/utils/traversers/dfs.ts","../../../src/navigation/versions/latest/traverseDF.ts","../../../src/navigation/utils/syntheticSectionPath.ts","../../../src/navigation/ledger-root-builder.ts"],"sourcesContent":["import * as z from \"zod\";\nimport { ApiDefinitionIdSchema, HttpMethod, HttpMethodSchema } from \"../shared.js\";\n\nexport { ApiDefinitionIdSchema, HttpMethod, HttpMethodSchema };\n\nexport const TypeIdSchema = z.string();\nexport type TypeId = z.infer<typeof TypeIdSchema>;\nexport function TypeId(value: string): TypeId {\n return value;\n}\n\nexport const EndpointIdSchema = z.string();\nexport type EndpointId = z.infer<typeof EndpointIdSchema>;\nexport function EndpointId(value: string): EndpointId {\n return value;\n}\n\nexport const WebSocketIdSchema = z.string();\nexport type WebSocketId = z.infer<typeof WebSocketIdSchema>;\nexport function WebSocketId(value: string): WebSocketId {\n return value;\n}\n\nexport const WebhookIdSchema = z.string();\nexport type WebhookId = z.infer<typeof WebhookIdSchema>;\nexport function WebhookId(value: string): WebhookId {\n return value;\n}\n\nexport const GraphQlOperationIdSchema = z.string();\nexport type GraphQlOperationId = z.infer<typeof GraphQlOperationIdSchema>;\nexport function GraphQlOperationId(value: string): GraphQlOperationId {\n return value;\n}\n\n/**\n * Resolve every GraphQL operation id backing a graphql node: the primary\n * operation plus any grouped (namespace) operations, deduplicated.\n *\n * The primary `graphqlOperationId` is NOT guaranteed to appear in\n * `graphqlOperationIds` — for namespace nodes it is the parent operation, which\n * lives outside the grouped-children list — so it must be unioned in explicitly.\n * Any caller that needs the full operation set (pruning, search indexing,\n * markdown) must use this rather than reading `graphqlOperationIds` directly.\n */\nexport function getGraphqlOperationIds(node: {\n graphqlOperationId: GraphQlOperationId;\n graphqlOperationIds?: GraphQlOperationId[] | undefined;\n}): GraphQlOperationId[] {\n const ids = new Set<GraphQlOperationId>(node.graphqlOperationIds ?? []);\n ids.add(node.graphqlOperationId);\n return [...ids];\n}\n\nexport const GraphQlTypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"scalar\", \"interface\", \"union\"]);\nexport type GraphQlTypeCategory = z.infer<typeof GraphQlTypeCategorySchema>;\n\nexport const EnvironmentIdSchema = z.string();\nexport type EnvironmentId = z.infer<typeof EnvironmentIdSchema>;\nexport function EnvironmentId(value: string): EnvironmentId {\n return value;\n}\n\nexport const PropertyKeySchema = z.string();\nexport type PropertyKey = z.infer<typeof PropertyKeySchema>;\nexport function PropertyKey(value: string): PropertyKey {\n return value;\n}\n\nexport const AuthSchemeIdSchema = z.string();\nexport type AuthSchemeId = z.infer<typeof AuthSchemeIdSchema>;\nexport function AuthSchemeId(value: string): AuthSchemeId {\n return value;\n}\n\nexport const SubpackageIdSchema = z.string();\nexport type SubpackageId = z.infer<typeof SubpackageIdSchema>;\nexport function SubpackageId(value: string): SubpackageId {\n return value;\n}\n\nexport const WebSocketMessageIdSchema = z.string();\nexport type WebSocketMessageId = z.infer<typeof WebSocketMessageIdSchema>;\nexport function WebSocketMessageId(value: string): WebSocketMessageId {\n return value;\n}\n\nexport const FileIdSchema: z.ZodType<FileId> = z.string() as any;\nexport type FileId = string & { FileId: void };\nexport function FileId(value: string): FileId {\n return value as unknown as FileId;\n}\n\nexport const MultipleAuthTypeSchema = z.object({\n schemes: z.array(AuthSchemeIdSchema)\n});\nexport type MultipleAuthType = z.infer<typeof MultipleAuthTypeSchema>;\n\nexport const GrpcMethodSchema = z.enum([\"UNARY\", \"CLIENT_STREAM\", \"SERVER_STREAM\", \"BIDIRECTIONAL_STREAM\"]);\n\nexport const AvailabilitySchema = z.enum([\n \"Alpha\",\n \"Stable\",\n \"GenerallyAvailable\",\n \"InDevelopment\",\n \"PreRelease\",\n \"Deprecated\",\n \"Beta\",\n \"Preview\",\n \"Legacy\"\n]);\n\nexport const WebSocketMessageOriginSchema = z.enum([\"client\", \"server\"]);\nexport type WebSocketMessageOrigin = z.infer<typeof WebSocketMessageOriginSchema>;\n\nexport const WebhookHttpMethodSchema = z.enum([\"GET\", \"POST\"]);\nexport type WebhookHttpMethod = z.infer<typeof WebhookHttpMethodSchema>;\n\nexport const WithDescriptionSchema = z.object({\n description: z.string().nullish()\n});\nexport type WithDescription = z.infer<typeof WithDescriptionSchema>;\n\nexport const WithAvailabilitySchema = z.object({\n availability: AvailabilitySchema.nullish()\n});\nexport type WithAvailability = z.infer<typeof WithAvailabilitySchema>;\n\nexport const EnvironmentSchema = z.object({\n id: EnvironmentIdSchema,\n baseUrl: z.string(),\n audiences: z.array(z.string()).nullish()\n});\nexport type Environment = z.infer<typeof EnvironmentSchema>;\n\nexport const RestProtocolSchema = z.object({});\n\nexport const OpenRpcProtocolSchema = z.object({\n methodName: z.string()\n});\n\nexport const GrpcProtocolSchema = z.object({\n methodName: z.string(),\n methodType: GrpcMethodSchema.nullish()\n});\n\nexport const ProtocolSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"rest\"), ...RestProtocolSchema.shape }),\n z.object({ type: z.literal(\"openrpc\"), ...OpenRpcProtocolSchema.shape }),\n z.object({ type: z.literal(\"grpc\"), ...GrpcProtocolSchema.shape })\n]);\nexport type Protocol = z.infer<typeof ProtocolSchema>;\n\nexport const ObjectPropertyAccessSchema = z.enum([\"READ_ONLY\", \"WRITE_ONLY\"]);\nexport type ObjectPropertyAccess = z.infer<typeof ObjectPropertyAccessSchema>;\n\nexport const TypeReferenceIdDefaultSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"enum\"), value: z.string() })\n]);\nexport type TypeReferenceIdDefault = z.infer<typeof TypeReferenceIdDefaultSchema>;\n\nconst _numberNullish = z.number().nullish();\nconst _numberIntNullish = z.number().int().nullish();\n\nfunction coerceNumber(val: unknown): unknown {\n if (typeof val === \"string\" && val.trim() !== \"\") {\n const num = Number(val);\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return val;\n}\n\nconst coercedNumberNullish = z.preprocess(coerceNumber, z.number().nullish()) as unknown as typeof _numberNullish;\nconst coercedNumberIntNullish = z.preprocess(\n coerceNumber,\n z.number().int().nullish()\n) as unknown as typeof _numberIntNullish;\n\nexport const IntegerTypeSchema = z.object({\n minimum: coercedNumberIntNullish,\n maximum: coercedNumberIntNullish,\n exclusiveMinimum: coercedNumberIntNullish,\n exclusiveMaximum: coercedNumberIntNullish,\n multipleOf: coercedNumberIntNullish,\n default: coercedNumberIntNullish\n});\nexport type IntegerType = z.infer<typeof IntegerTypeSchema>;\n\nexport const DoubleTypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type DoubleType = z.infer<typeof DoubleTypeSchema>;\n\nexport const StringTypeSchema = z.object({\n format: z.string().nullish(),\n regex: z.string().nullish(),\n minLength: z.number().int().nullish(),\n maxLength: z.number().int().nullish(),\n default: z.string().nullish()\n});\nexport type StringType = z.infer<typeof StringTypeSchema>;\n\nexport const LongTypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type LongType = z.infer<typeof LongTypeSchema>;\n\nconst _booleanNullish = z.boolean().nullish();\n\nexport const BooleanTypeSchema = z.object({\n default: z.preprocess((val) => {\n if (typeof val === \"string\") {\n if (val.toLowerCase() === \"true\") {\n return true;\n }\n if (val.toLowerCase() === \"false\") {\n return false;\n }\n }\n return val;\n }, z.boolean().nullish()) as unknown as typeof _booleanNullish\n});\nexport type BooleanType = z.infer<typeof BooleanTypeSchema>;\n\nexport const DatetimeTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type DatetimeType = z.infer<typeof DatetimeTypeSchema>;\n\nexport const UuidTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type UuidType = z.infer<typeof UuidTypeSchema>;\n\nexport const Base64TypeSchema = z.object({\n default: z.string().nullish(),\n mimeType: z.string().nullish()\n});\nexport type Base64Type = z.infer<typeof Base64TypeSchema>;\n\nexport const DateTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type DateType = z.infer<typeof DateTypeSchema>;\n\nexport const BigIntegerTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type BigIntegerType = z.infer<typeof BigIntegerTypeSchema>;\n\nexport const UintTypeSchema = z.object({\n minimum: coercedNumberIntNullish,\n maximum: coercedNumberIntNullish,\n exclusiveMinimum: coercedNumberIntNullish,\n exclusiveMaximum: coercedNumberIntNullish,\n multipleOf: coercedNumberIntNullish,\n default: coercedNumberIntNullish\n});\nexport type UintType = z.infer<typeof UintTypeSchema>;\n\nexport const Uint64TypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type Uint64Type = z.infer<typeof Uint64TypeSchema>;\n\nexport const ScalarTypeSchema = z.object({\n name: z.string(),\n description: z.string().nullish(),\n default: z.unknown().nullish()\n});\nexport type ScalarType = z.infer<typeof ScalarTypeSchema>;\n\nexport const PrimitiveTypeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"integer\"), ...IntegerTypeSchema.shape }),\n z.object({ type: z.literal(\"double\"), ...DoubleTypeSchema.shape }),\n z.object({ type: z.literal(\"string\"), ...StringTypeSchema.shape }),\n z.object({ type: z.literal(\"long\"), ...LongTypeSchema.shape }),\n z.object({ type: z.literal(\"boolean\"), ...BooleanTypeSchema.shape }),\n z.object({ type: z.literal(\"datetime\"), ...DatetimeTypeSchema.shape }),\n z.object({ type: z.literal(\"uuid\"), ...UuidTypeSchema.shape }),\n z.object({ type: z.literal(\"base64\"), ...Base64TypeSchema.shape }),\n z.object({ type: z.literal(\"date\"), ...DateTypeSchema.shape }),\n z.object({ type: z.literal(\"bigInteger\"), ...BigIntegerTypeSchema.shape }),\n z.object({ type: z.literal(\"uint\"), ...UintTypeSchema.shape }),\n z.object({ type: z.literal(\"uint64\"), ...Uint64TypeSchema.shape }),\n z.object({ type: z.literal(\"scalar\"), ...ScalarTypeSchema.shape })\n]);\nexport type PrimitiveType = z.infer<typeof PrimitiveTypeSchema>;\n\nexport const LiteralTypeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"booleanLiteral\"), value: z.boolean() }),\n z.object({ type: z.literal(\"stringLiteral\"), value: z.string() })\n]);\nexport type LiteralType = z.infer<typeof LiteralTypeSchema>;\n\nexport type TypeReference =\n | TypeReference.Id\n | TypeReference.Primitive\n | TypeReference.Optional\n | TypeReference.Nullable\n | TypeReference.List\n | TypeReference.Set\n | TypeReference.Map\n | TypeReference.Literal\n | TypeReference.Unknown;\n\nexport namespace TypeReference {\n export interface Id {\n type: \"id\";\n value: string;\n default?: TypeReferenceIdDefault | null;\n }\n export interface Primitive {\n type: \"primitive\";\n value: PrimitiveType;\n }\n export interface Optional {\n type: \"optional\";\n itemType: TypeReference;\n defaultValue?: unknown | null;\n }\n export interface Nullable {\n type: \"nullable\";\n itemType: TypeReference;\n }\n export interface List {\n type: \"list\";\n itemType: TypeReference;\n minItems?: number | null;\n maxItems?: number | null;\n }\n export interface Set {\n type: \"set\";\n itemType: TypeReference;\n minItems?: number | null;\n maxItems?: number | null;\n }\n export interface Map {\n type: \"map\";\n keyType: TypeReference;\n valueType: TypeReference;\n minProperties?: number | null;\n maxProperties?: number | null;\n }\n export interface Literal {\n type: \"literal\";\n value: LiteralType;\n }\n export interface Unknown {\n type: \"unknown\";\n }\n}\n\nexport const TypeReferenceSchema: z.ZodType<TypeReference> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"id\"),\n value: TypeIdSchema,\n default: TypeReferenceIdDefaultSchema.nullish()\n }),\n z.object({\n type: z.literal(\"primitive\"),\n value: PrimitiveTypeSchema\n }),\n z.object({\n type: z.literal(\"optional\"),\n itemType: TypeReferenceSchema,\n defaultValue: z.unknown().nullish()\n }),\n z.object({\n type: z.literal(\"nullable\"),\n itemType: TypeReferenceSchema\n }),\n z.object({\n type: z.literal(\"list\"),\n itemType: TypeReferenceSchema,\n minItems: z.number().int().nullish(),\n maxItems: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"set\"),\n itemType: TypeReferenceSchema,\n minItems: z.number().int().nullish(),\n maxItems: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"map\"),\n keyType: TypeReferenceSchema,\n valueType: TypeReferenceSchema,\n minProperties: z.number().int().nullish(),\n maxProperties: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"literal\"),\n value: LiteralTypeSchema\n }),\n z.object({\n type: z.literal(\"unknown\")\n })\n ])\n);\n\nexport interface GraphQlArgument {\n description?: string | null;\n availability?: z.infer<typeof AvailabilitySchema> | null;\n name: string;\n type: TypeReference;\n defaultValue?: unknown | null;\n}\nexport const GraphQlArgumentSchema: z.ZodType<GraphQlArgument> = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n name: z.string(),\n type: TypeReferenceSchema,\n defaultValue: z.unknown().nullish()\n});\n\nexport const ObjectPropertySchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n valueType: TypeReferenceSchema,\n propertyAccess: ObjectPropertyAccessSchema.nullish(),\n arguments: z.array(GraphQlArgumentSchema).nullish()\n});\nexport type ObjectProperty = z.infer<typeof ObjectPropertySchema>;\n\nexport const ObjectTypeSchema = z.object({\n extends: z.array(TypeIdSchema),\n properties: z.array(ObjectPropertySchema),\n extraProperties: TypeReferenceSchema.nullish()\n});\nexport type ObjectType = z.infer<typeof ObjectTypeSchema>;\n\nexport const EnumValueSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n value: z.string()\n});\nexport type EnumValue = z.infer<typeof EnumValueSchema>;\n\nexport const EnumTypeSchema = z.object({\n default: z.string().nullish(),\n values: z.array(EnumValueSchema)\n});\nexport type EnumType = z.infer<typeof EnumTypeSchema>;\n\nexport const DiscriminatedUnionVariantSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n discriminantValue: z.string(),\n displayName: z.string().nullish(),\n additionalProperties: ObjectTypeSchema\n});\nexport type DiscriminatedUnionVariant = z.infer<typeof DiscriminatedUnionVariantSchema>;\n\nexport const DiscriminatedUnionTypeSchema = z.object({\n discriminant: z.string(),\n variants: z.array(DiscriminatedUnionVariantSchema)\n});\nexport type DiscriminatedUnionType = z.infer<typeof DiscriminatedUnionTypeSchema>;\n\nexport const ContentTypeSchema = z.union([z.string(), z.array(z.string())]);\nexport type ContentType = z.infer<typeof ContentTypeSchema>;\n\nexport const FilePropertySingleSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n isOptional: z.boolean(),\n contentType: ContentTypeSchema.nullish()\n});\nexport type FilePropertySingle = z.infer<typeof FilePropertySingleSchema>;\n\nexport const FilePropertyArraySchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n isOptional: z.boolean(),\n contentType: ContentTypeSchema.nullish()\n});\nexport type FilePropertyArray = z.infer<typeof FilePropertyArraySchema>;\n\nexport const FormDataFilePropertySchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"file\"), ...FilePropertySingleSchema.shape }),\n z.object({ type: z.literal(\"fileArray\"), ...FilePropertyArraySchema.shape })\n]);\nexport type FormDataFileProperty = z.infer<typeof FormDataFilePropertySchema>;\n\nexport const FormDataBodyPropertySchema = z.object({\n ...ObjectPropertySchema.shape,\n contentType: ContentTypeSchema.nullish(),\n exploded: z.boolean().nullish()\n});\nexport type FormDataBodyProperty = z.infer<typeof FormDataBodyPropertySchema>;\n\nexport const FormDataPropertySchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"file\"), value: FormDataFilePropertySchema }),\n z.object({ type: z.literal(\"bodyProperty\"), ...FormDataBodyPropertySchema.shape })\n]);\nexport type FormDataProperty = z.infer<typeof FormDataPropertySchema>;\n\nexport const FormDataRequestSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n name: z.string(),\n properties: z.array(FormDataPropertySchema)\n});\nexport type FormDataRequest = z.infer<typeof FormDataRequestSchema>;\n\nexport const EndpointPathPartSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"literal\"), value: z.string() }),\n z.object({ type: z.literal(\"pathParameter\"), value: PropertyKeySchema })\n]);\nexport type EndpointPathPart = z.infer<typeof EndpointPathPartSchema>;\n\nexport const PathParameterSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n type: TypeReferenceSchema,\n explode: z.boolean().nullish()\n});\nexport type PathParameter = z.infer<typeof PathParameterSchema>;\n\nexport const EndpointPathSchema = z.object({\n parts: z.array(EndpointPathPartSchema),\n pathParameters: z.array(PathParameterSchema)\n});\nexport type EndpointPath = z.infer<typeof EndpointPathSchema>;\n\nexport const QueryParameterSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: z.string(),\n type: TypeReferenceSchema,\n explode: z.boolean().nullish()\n});\nexport type QueryParameter = z.infer<typeof QueryParameterSchema>;\n\nexport const HeaderSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: z.string(),\n type: TypeReferenceSchema\n});\nexport type Header = z.infer<typeof HeaderSchema>;\n\nexport const JsonBodyShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema })\n]);\nexport type JsonBodyShape = z.infer<typeof JsonBodyShapeSchema>;\n\nexport const FileDownloadResponseBodyShapeSchema = z.object({\n contentType: z.string().nullish()\n});\nexport type FileDownloadResponseBodyShape = z.infer<typeof FileDownloadResponseBodyShapeSchema>;\n\nexport const StreamResponseV2Schema = z.object({\n terminator: z.string().nullish(),\n shape: JsonBodyShapeSchema\n});\nexport type StreamResponseV2 = z.infer<typeof StreamResponseV2Schema>;\n\nexport const StreamConditionSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"booleanRequestProperty\"), value: PropertyKeySchema })\n]);\nexport type StreamCondition = z.infer<typeof StreamConditionSchema>;\n\nexport const FilenameWithDataSchema = z.object({\n filename: z.string(),\n data: FileIdSchema\n});\nexport type FilenameWithData = z.infer<typeof FilenameWithDataSchema>;\n\nexport const FormValueSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"filename\"), value: z.string() }),\n z.object({ type: z.literal(\"filenames\"), value: z.array(z.string()) }),\n z.object({ type: z.literal(\"filenameWithData\"), ...FilenameWithDataSchema.shape }),\n z.object({ type: z.literal(\"filenamesWithData\"), value: z.array(FilenameWithDataSchema) }),\n z.object({ type: z.literal(\"exploded\"), value: z.array(z.unknown()) })\n]);\nexport type FormValue = z.infer<typeof FormValueSchema>;\n\nexport const BytesValueSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"base64\"), value: z.string() })\n]);\nexport type BytesValue = z.infer<typeof BytesValueSchema>;\n\n// The form variant uses z.unknown() for record values instead of FormValueSchema to be\n// forward-compatible with new form value types and to tolerate form values produced by\n// the AI example enhancer (which may not conform to the strict FormValueSchema).\n// Example data is display-only and does not require strict validation at registration time.\nexport const ExampleEndpointRequestSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"form\"), value: z.record(z.string(), z.unknown()) }),\n z.object({ type: z.literal(\"bytes\"), value: BytesValueSchema })\n]);\nexport type ExampleEndpointRequest = z.infer<typeof ExampleEndpointRequestSchema>;\n\nexport const ExampleServerSentEventSchema = z.object({\n event: z.string(),\n data: z.unknown()\n});\nexport type ExampleServerSentEvent = z.infer<typeof ExampleServerSentEventSchema>;\n\nexport const ExampleEndpointResponseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"filename\"), value: z.unknown() }),\n z.object({ type: z.literal(\"stream\"), value: z.array(z.unknown()) }),\n z.object({ type: z.literal(\"sse\"), value: z.array(ExampleServerSentEventSchema) })\n]);\nexport type ExampleEndpointResponse = z.infer<typeof ExampleEndpointResponseSchema>;\n\nexport const ErrorDeclarationSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n type: TypeReferenceSchema.nullish(),\n statusCode: z.number().int()\n});\nexport type ErrorDeclaration = z.infer<typeof ErrorDeclarationSchema>;\n\nexport const ExampleErrorResponseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() })\n]);\nexport type ExampleErrorResponse = z.infer<typeof ExampleErrorResponseSchema>;\n\nexport const ErrorExampleSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n responseBody: ExampleErrorResponseSchema\n});\nexport type ErrorExample = z.infer<typeof ErrorExampleSchema>;\n\nexport const GraphQlOperationTypeSchema = z.enum([\"QUERY\", \"MUTATION\", \"SUBSCRIPTION\"]);\nexport type GraphQlOperationType = z.infer<typeof GraphQlOperationTypeSchema>;\n\nexport const GraphQlExampleSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n query: z.string(),\n variables: z.record(z.string(), z.unknown()).nullish(),\n response: z.unknown().nullish()\n});\nexport type GraphQlExample = z.infer<typeof GraphQlExampleSchema>;\n\nexport const CodeSnippetSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n language: z.string(),\n install: z.string().nullish(),\n code: z.string(),\n generated: z.boolean()\n});\nexport type CodeSnippet = z.infer<typeof CodeSnippetSchema>;\n\nexport const GraphQlOperationSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n id: GraphQlOperationIdSchema,\n operationType: GraphQlOperationTypeSchema,\n name: z.string(),\n displayName: z.string().nullish(),\n fieldPath: z.array(z.string()).nullish(),\n arguments: z.array(GraphQlArgumentSchema).nullish(),\n returnType: TypeReferenceSchema,\n examples: z.array(GraphQlExampleSchema).nullish(),\n snippets: z.record(z.string(), z.array(CodeSnippetSchema)).nullish()\n});\nexport type GraphQlOperation = z.infer<typeof GraphQlOperationSchema>;\n\nexport const WebhookPayloadShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema }),\n z.object({ type: z.literal(\"formData\"), ...FormDataRequestSchema.shape })\n]);\nexport type WebhookPayloadShape = z.infer<typeof WebhookPayloadShapeSchema>;\n\nexport const WebhookPayloadSchema = z.object({\n description: z.string().nullish(),\n type: WebhookPayloadShapeSchema\n});\nexport type WebhookPayload = z.infer<typeof WebhookPayloadSchema>;\n\nexport const ExampleWebhookPayloadSchema = z.object({\n name: z.string().nullish(),\n payload: z.unknown()\n});\nexport type ExampleWebhookPayload = z.infer<typeof ExampleWebhookPayloadSchema>;\n\nexport const WebSocketMessageBodyShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema })\n]);\nexport type WebSocketMessageBodyShape = z.infer<typeof WebSocketMessageBodyShapeSchema>;\n\nexport const WebSocketMessageSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n type: WebSocketMessageIdSchema,\n displayName: z.string().nullish(),\n origin: WebSocketMessageOriginSchema,\n body: WebSocketMessageBodyShapeSchema\n});\nexport type WebSocketMessage = z.infer<typeof WebSocketMessageSchema>;\n\nexport const ExampleWebSocketMessageSchema = z.object({\n type: WebSocketMessageIdSchema,\n body: z.unknown()\n});\nexport type ExampleWebSocketMessage = z.infer<typeof ExampleWebSocketMessageSchema>;\n\nexport const ExampleWebSocketSessionSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n path: z.string(),\n pathParameters: z.record(PropertyKeySchema, z.unknown()),\n queryParameters: z.record(z.string(), z.unknown()),\n headers: z.record(z.string(), z.unknown()),\n messages: z.array(ExampleWebSocketMessageSchema)\n});\nexport type ExampleWebSocketSession = z.infer<typeof ExampleWebSocketSessionSchema>;\n\nexport type ApiNavigationConfigItem =\n | ApiNavigationConfigItem.Subpackage\n | ApiNavigationConfigItem.EndpointId\n | ApiNavigationConfigItem.WebsocketId\n | ApiNavigationConfigItem.WebhookId\n | ApiNavigationConfigItem.GraphqlOperationId;\n\nexport namespace ApiNavigationConfigItem {\n export interface Subpackage {\n type: \"subpackage\";\n subpackageId: string;\n items: ApiNavigationConfigItem[];\n }\n export interface EndpointId {\n type: \"endpointId\";\n value: string;\n }\n export interface WebsocketId {\n type: \"websocketId\";\n value: string;\n }\n export interface WebhookId {\n type: \"webhookId\";\n value: string;\n }\n export interface GraphqlOperationId {\n type: \"graphqlOperationId\";\n value: string;\n }\n}\n\nexport const ApiNavigationConfigItemSchema: z.ZodType<ApiNavigationConfigItem> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"subpackage\"),\n subpackageId: SubpackageIdSchema,\n items: z.array(ApiNavigationConfigItemSchema)\n }),\n z.object({ type: z.literal(\"endpointId\"), value: EndpointIdSchema }),\n z.object({ type: z.literal(\"websocketId\"), value: WebSocketIdSchema }),\n z.object({ type: z.literal(\"webhookId\"), value: WebhookIdSchema }),\n z.object({ type: z.literal(\"graphqlOperationId\"), value: GraphQlOperationIdSchema })\n ])\n);\n\nexport const ApiNavigationConfigRootSchema = z.object({\n items: z.array(ApiNavigationConfigItemSchema)\n});\nexport type ApiNavigationConfigRoot = z.infer<typeof ApiNavigationConfigRootSchema>;\n\nexport const BearerAuthSchema = z.object({\n description: z.string().nullish(),\n tokenName: z.string().nullish()\n});\nexport type BearerAuth = z.infer<typeof BearerAuthSchema>;\n\nexport const BasicAuthSchema = z.object({\n description: z.string().nullish(),\n usernameName: z.string().nullish(),\n passwordName: z.string().nullish(),\n passwordAlwaysEmpty: z.boolean().nullish()\n});\nexport type BasicAuth = z.infer<typeof BasicAuthSchema>;\n\nexport const HeaderAuthSchema = z.object({\n description: z.string().nullish(),\n nameOverride: z.string().nullish(),\n headerWireValue: z.string(),\n prefix: z.string().nullish()\n});\nexport type HeaderAuth = z.infer<typeof HeaderAuthSchema>;\n\nexport const OAuthClientCredentialsReferencedEndpointSchema = z.object({\n description: z.string().nullish(),\n endpointId: EndpointIdSchema,\n accessTokenLocator: z.string(),\n headerName: z.string().nullish(),\n tokenPrefix: z.string().nullish()\n});\nexport type OAuthClientCredentialsReferencedEndpoint = z.infer<typeof OAuthClientCredentialsReferencedEndpointSchema>;\n\nexport const OAuthClientCredentialsSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"referencedEndpoint\"),\n ...OAuthClientCredentialsReferencedEndpointSchema.shape\n })\n]);\nexport type OAuthClientCredentials = z.infer<typeof OAuthClientCredentialsSchema>;\n\nexport const OAuthSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"clientCredentials\"), value: OAuthClientCredentialsSchema })\n]);\nexport type OAuth = z.infer<typeof OAuthSchema>;\n\nexport const ApiAuthSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"bearerAuth\"), ...BearerAuthSchema.shape }),\n z.object({ type: z.literal(\"basicAuth\"), ...BasicAuthSchema.shape }),\n z.object({ type: z.literal(\"header\"), ...HeaderAuthSchema.shape }),\n z.object({ type: z.literal(\"oAuth\"), value: OAuthSchema })\n]);\nexport type ApiAuth = z.infer<typeof ApiAuthSchema>;\n","import * as z from \"zod\";\n\n// ── Org / API identifiers ──────────────────────────────────────────────\n\nexport const OrgIdSchema = z.string();\nexport type OrgId = z.infer<typeof OrgIdSchema>;\nexport function OrgId(value: string): OrgId {\n return value;\n}\n\nexport const ApiIdSchema = z.string();\nexport type ApiId = z.infer<typeof ApiIdSchema>;\nexport function ApiId(value: string): ApiId {\n return value;\n}\n\nexport const ApiDefinitionIdSchema = z.string().uuid();\nexport type ApiDefinitionId = z.infer<typeof ApiDefinitionIdSchema>;\nexport function ApiDefinitionId(value: string): ApiDefinitionId {\n return value;\n}\n\n// ── HTTP / Endpoint schemas ─────────────────────────────────────────────\n\nexport const HttpMethodSchema = z.enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\"]);\nexport type HttpMethod = z.infer<typeof HttpMethodSchema>;\n\nexport const HttpMethod = {\n Get: \"GET\",\n Post: \"POST\",\n Put: \"PUT\",\n Patch: \"PATCH\",\n Delete: \"DELETE\",\n Head: \"HEAD\"\n} as const;\n\nexport const UrlSchema: z.ZodType<Url> = z.string() as any;\nexport type Url = string & { Url: void };\nexport function Url(value: string): Url {\n return value as unknown as Url;\n}\n\nexport const EndpointPathLiteralSchema = z.string();\nexport type EndpointPathLiteral = z.infer<typeof EndpointPathLiteralSchema>;\nexport function EndpointPathLiteral(value: string): EndpointPathLiteral {\n return value;\n}\n\nexport const EndpointIdentifierSchema = z.object({\n path: z.string(),\n method: HttpMethodSchema,\n identifierOverride: z.string().nullish()\n});\nexport type EndpointIdentifier = z.infer<typeof EndpointIdentifierSchema>;\n\n// ── SDK request schema ──────────────────────────────────────────────────\n\nexport type SdkRequest =\n | { type: \"typescript\"; package: string; version: string | undefined }\n | { type: \"python\"; package: string; version: string | undefined }\n | { type: \"go\"; githubRepo: string; version: string | undefined }\n | { type: \"ruby\"; gem: string; version: string | undefined }\n | { type: \"java\"; group: string; artifact: string; version: string | undefined }\n | { type: \"csharp\"; package: string; version: string | undefined };\n\nexport const SdkRequestSchema: z.ZodType<SdkRequest> = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"typescript\"), package: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"python\"), package: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"go\"), githubRepo: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"ruby\"), gem: z.string(), version: z.string().nullish() }),\n z.object({\n type: z.literal(\"java\"),\n group: z.string(),\n artifact: z.string(),\n version: z.string().nullish()\n }),\n z.object({ type: z.literal(\"csharp\"), package: z.string(), version: z.string().nullish() })\n]) as any;\n\n// ── Additional identifiers ─────────────────────────────────────────────\n\nexport const DocsConfigIdSchema = z.string();\nexport type DocsConfigId = z.infer<typeof DocsConfigIdSchema>;\nexport function DocsConfigId(value: string): DocsConfigId {\n return value;\n}\n\nexport const GrpcIdSchema = z.string();\nexport type GrpcId = z.infer<typeof GrpcIdSchema>;\nexport function GrpcId(value: string): GrpcId {\n return value;\n}\n\nexport const PageIdSchema = z.string();\nexport type PageId = z.infer<typeof PageIdSchema>;\nexport function PageId(value: string): PageId {\n return value;\n}\n\nexport const RoleIdSchema = z.string();\nexport type RoleId = z.infer<typeof RoleIdSchema>;\nexport function RoleId(value: string): RoleId {\n return value;\n}\n\nexport const TokenIdSchema = z.string();\nexport type TokenId = z.infer<typeof TokenIdSchema>;\n\nexport const VersionIdSchema = z.string();\nexport type VersionId = z.infer<typeof VersionIdSchema>;\nexport function VersionId(value: string): VersionId {\n return value;\n}\n\n// ── Enums ──────────────────────────────────────────────────────────────\n\nexport const LinkTarget = {\n Blank: \"_blank\",\n Self: \"_self\",\n Parent: \"_parent\",\n Top: \"_top\"\n} as const;\nexport type LinkTarget = (typeof LinkTarget)[keyof typeof LinkTarget];\n\nexport const GrpcMethod = {\n Unary: \"UNARY\",\n ClientStream: \"CLIENT_STREAM\",\n ServerStream: \"SERVER_STREAM\",\n BidirectionalStream: \"BIDIRECTIONAL_STREAM\"\n} as const;\nexport type GrpcMethod = (typeof GrpcMethod)[keyof typeof GrpcMethod];\n\nexport const Availability = {\n Alpha: \"Alpha\",\n Stable: \"Stable\",\n GenerallyAvailable: \"GenerallyAvailable\",\n InDevelopment: \"InDevelopment\",\n PreRelease: \"PreRelease\",\n Deprecated: \"Deprecated\",\n Beta: \"Beta\",\n Preview: \"Preview\",\n Legacy: \"Legacy\"\n} as const;\nexport type Availability = (typeof Availability)[keyof typeof Availability];\n\nexport const SupportedLanguage = {\n Curl: \"curl\",\n Python: \"python\",\n Javascript: \"javascript\",\n Js: \"js\",\n Node: \"node\",\n Typescript: \"typescript\",\n Ts: \"ts\",\n Go: \"go\",\n Ruby: \"ruby\",\n Csharp: \"csharp\",\n Php: \"php\",\n Swift: \"swift\",\n Rust: \"rust\"\n} as const;\nexport type SupportedLanguage = (typeof SupportedLanguage)[keyof typeof SupportedLanguage];\n\nexport const HttpSnippetLanguage = {\n Curl: \"curl\",\n Csharp: \"csharp\",\n Go: \"go\",\n Java: \"java\",\n Javascript: \"javascript\",\n Php: \"php\",\n Python: \"python\",\n Ruby: \"ruby\",\n Swift: \"swift\",\n Rust: \"rust\",\n Typescript: \"typescript\"\n} as const;\nexport type HttpSnippetLanguage = (typeof HttpSnippetLanguage)[keyof typeof HttpSnippetLanguage];\n\n// ── Error types ────────────────────────────────────────────────────────\n\nexport interface InvalidDomainErrorBody {\n /** Value the domain should end with (i.e. docs.buildwithfern.com or dev.docs.buildwithfern.com) */\n requiredDomainSuffix: string;\n}\n\n// ── Docs types ─────────────────────────────────────────────────────────\n\nexport interface AnnouncementConfig {\n /** The text to display in the banner, using markdown. */\n text: string;\n}\n\n// ── Snippet types ──────────────────────────────────────────────────────\n\nexport type SnippetsByEndpointMethod = Partial<Record<HttpMethod, Snippet[]>>;\n\nexport const SnippetsByEndpointMethodSchema: z.ZodType<SnippetsByEndpointMethod> = z.record(\n HttpMethodSchema,\n z.array(z.unknown())\n) as any;\n\n// ── SDK types for snippets ────────────────────────────────────────────\n\nexport interface TypeScriptSdk {\n package: string;\n version: string;\n}\n\nexport interface PythonSdk {\n package: string;\n version: string;\n}\n\nexport interface GoSdk {\n githubRepo: string;\n version: string;\n}\n\nexport interface RubySdk {\n gem: string;\n version: string;\n}\n\nexport interface CsharpSdk {\n package: string;\n version: string;\n}\n\nexport interface JavaSdk {\n group: string;\n artifact: string;\n version: string;\n}\n\nexport interface TypeScriptSnippet {\n sdk: TypeScriptSdk;\n client: string;\n}\n\nexport interface PythonSnippet {\n sdk: PythonSdk;\n async_client: string;\n sync_client: string;\n}\n\nexport interface GoSnippet {\n sdk: GoSdk;\n client: string;\n}\n\nexport interface RubySnippet {\n sdk: RubySdk;\n client: string;\n}\n\nexport interface CsharpSnippet {\n sdk: CsharpSdk;\n client: string;\n}\n\nexport interface JavaSnippet {\n sdk: JavaSdk;\n async_client: string;\n sync_client: string;\n}\n\n// ── Snippet discriminated union ───────────────────────────────────────\n\n// ── Snippet code types (used to deserialize snippet data from DB) ────\n\nexport interface TypeScriptSnippetCode {\n client: string;\n}\n\nexport interface PythonSnippetCode {\n async_client: string;\n sync_client: string;\n}\n\nexport interface GoSnippetCode {\n client: string;\n}\n\nexport interface RubySnippetCode {\n client: string;\n}\n\nexport interface JavaSnippetCode {\n async_client: string;\n sync_client: string;\n}\n\nexport interface CsharpSnippetCode {\n client: string;\n}\n\n// ── Sdk type (SdkRequest with required version) ─────────────────────\n\nexport const SdkSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"typescript\"), package: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"python\"), package: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"go\"), githubRepo: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"ruby\"), gem: z.string(), version: z.string() }),\n z.object({\n type: z.literal(\"java\"),\n group: z.string(),\n artifact: z.string(),\n version: z.string()\n }),\n z.object({ type: z.literal(\"csharp\"), package: z.string(), version: z.string() })\n]);\nexport type Sdk = z.infer<typeof SdkSchema>;\n\n// ── Template type (generic template placeholder) ────────────────────\nexport type Template = unknown;\n\nexport type Snippet = Snippet.Typescript | Snippet.Python | Snippet.Java | Snippet.Go | Snippet.Ruby | Snippet.Csharp;\n\nexport namespace Snippet {\n interface _Base {\n exampleIdentifier: string | undefined;\n }\n\n export interface Typescript extends TypeScriptSnippet, _Base {\n type: \"typescript\";\n }\n\n export interface Python extends PythonSnippet, _Base {\n type: \"python\";\n }\n\n export interface Java extends JavaSnippet, _Base {\n type: \"java\";\n }\n\n export interface Go extends GoSnippet, _Base {\n type: \"go\";\n }\n\n export interface Ruby extends RubySnippet, _Base {\n type: \"ruby\";\n }\n\n export interface Csharp extends CsharpSnippet, _Base {\n type: \"csharp\";\n }\n}\n","import type {\n EndpointId,\n EnvironmentId,\n FileId,\n GraphQlOperationId,\n GraphQlOperationType,\n GraphQlTypeCategory,\n TypeId,\n WebhookId,\n WebSocketId\n} from \"../../orpc-client/api/shared.js\";\nimport type {\n AnnouncementConfig,\n ApiDefinitionId,\n Availability,\n GrpcId,\n GrpcMethod,\n HttpMethod,\n LinkTarget,\n PageId,\n RoleId,\n Url,\n VersionId\n} from \"../../orpc-client/shared.js\";\n\nexport type Slug = string & {\n navigation_latest_Slug: void;\n};\n\nexport function Slug(value: string): Slug {\n return value as unknown as Slug;\n}\n\nexport type TabId = string & {\n navigation_latest_TabId: void;\n};\n\nexport function TabId(value: string): TabId {\n return value as unknown as TabId;\n}\n\nexport type NodeId = string & {\n navigation_latest_NodeId: void;\n};\n\nexport function NodeId(value: string): NodeId {\n return value as unknown as NodeId;\n}\n\nexport type ProductId = string & {\n navigation_latest_ProductId: void;\n};\n\nexport function ProductId(value: string): ProductId {\n return value as unknown as ProductId;\n}\n\nexport type VariantId = string & {\n navigation_latest_VariantId: void;\n};\n\nexport function VariantId(value: string): VariantId {\n return value as unknown as VariantId;\n}\n\nexport type RootChild = VersionedNode | UnversionedNode | ProductGroupNode;\n\nexport type ProductNode = InternalProductNode | ExternalProductNode;\n\nexport type ProductChild = VersionedNode | UnversionedNode;\n\nexport type VersionChild = TabbedNode | SidebarRootNode | VariantedNode;\n\nexport type VariantChild = ApiReferenceNode | SectionNode | SidebarGroupNode | PageNode | LinkNode | ChangelogNode;\n\nexport type TabChild = TabNode | LinkNode | ChangelogNode;\n\nexport type SidebarRootChild = SidebarGroupNode | ApiReferenceNode | SectionNode | VariantedNode;\n\nexport type NavigationChild = ApiReferenceNode | SectionNode | PageNode | LinkNode | ChangelogNode | VariantedNode;\n\nexport type ApiPackageChild =\n | ApiPackageNode\n | EndpointNode\n | EndpointPairNode\n | WebSocketNode\n | WebhookNode\n | GrpcNode\n | GraphQlNode\n | GraphQlTypeNode\n | PageNode\n | LinkNode;\n\nexport interface WithNodeId {\n id: NodeId;\n collapsed: boolean | \"open-by-default\" | undefined;\n}\n\nexport interface WithPermissions {\n viewers: RoleId[] | undefined;\n orphaned: boolean | undefined;\n}\n\nexport interface WithFeatureFlags {\n featureFlags: FeatureFlagOptions[] | undefined;\n}\n\nexport interface WithNodeMetadata extends WithNodeId, WithPermissions, WithFeatureFlags {\n title: string;\n slug: Slug;\n canonicalSlug: Slug | undefined;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n}\n\nexport interface WithPage {\n pageId: PageId;\n noindex: boolean | undefined;\n}\n\nexport interface WithOverviewPage {\n overviewPageId: PageId | undefined;\n noindex: boolean | undefined;\n}\n\nexport interface WithApiDefinitionId {\n apiDefinitionId: ApiDefinitionId;\n availability: Availability | undefined;\n}\n\nexport interface WithRedirect {\n pointsTo: Slug | undefined;\n}\n\nexport interface FeatureFlagOptions {\n flag: string;\n fallbackValue: unknown | undefined;\n match: unknown | undefined;\n}\n\nexport interface BreadcrumbItem {\n title: string;\n pointsTo: Slug | undefined;\n}\n\nexport interface PlaygroundButtonSettings {\n href: Url | undefined;\n}\n\nexport interface PlaygroundSettings {\n environments: EnvironmentId[] | undefined;\n button: PlaygroundButtonSettings | undefined;\n \"limit-websocket-messages-per-connection\": number | undefined;\n hidden: boolean | undefined;\n}\n\nexport type { GraphQlOperationType };\nexport type { GraphQlTypeCategory };\n\nexport interface ProductGroupNode extends WithNodeId {\n type: \"productgroup\";\n landingPage: LandingPageNode | undefined;\n children: ProductNode[];\n}\n\nexport interface VersionedNode extends WithNodeId {\n type: \"versioned\";\n children: VersionNode[];\n}\n\nexport interface UnversionedNode extends WithNodeId {\n type: \"unversioned\";\n child: VersionChild;\n landingPage: LandingPageNode | undefined;\n}\n\nexport interface VariantedNode extends WithNodeId {\n type: \"varianted\";\n children: VariantNode[];\n}\n\nexport interface TabbedNode extends WithNodeId {\n type: \"tabbed\";\n children: TabChild[];\n}\n\nexport interface SidebarRootNode extends WithNodeId {\n type: \"sidebarRoot\";\n children: SidebarRootChild[];\n}\n\nexport interface SidebarGroupNode extends WithNodeId {\n type: \"sidebarGroup\";\n children: NavigationChild[];\n}\n\nexport interface EndpointPairNode extends WithNodeId {\n type: \"endpointPair\";\n stream: EndpointNode;\n nonStream: EndpointNode;\n}\n\nexport interface LinkNode extends WithNodeId {\n type: \"link\";\n title: string;\n icon: string | undefined;\n url: Url;\n target: LinkTarget | undefined;\n}\n\nexport interface RootNode extends WithNodeMetadata, WithRedirect {\n type: \"root\";\n version: \"v2\";\n child: RootChild;\n roles: RoleId[] | undefined;\n}\n\nexport interface InternalProductNode extends WithNodeMetadata, WithRedirect {\n type: \"product\";\n default: boolean;\n productId: ProductId;\n child: ProductChild;\n subtitle: string;\n image: FileId | undefined;\n announcement: AnnouncementConfig | undefined;\n}\n\nexport interface ExternalProductNode extends WithNodeId, WithPermissions, WithFeatureFlags {\n type: \"productLink\";\n default: boolean;\n productId: ProductId;\n title: string;\n href: Url;\n target: LinkTarget | undefined;\n subtitle: string;\n icon: string | undefined;\n image: FileId | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n}\n\nexport interface VersionNode extends WithNodeMetadata, WithRedirect {\n type: \"version\";\n default: boolean;\n versionId: VersionId;\n child: VersionChild;\n availability: Availability | undefined;\n landingPage: LandingPageNode | undefined;\n announcement: AnnouncementConfig | undefined;\n}\n\nexport interface VariantNode extends WithNodeMetadata, WithRedirect {\n type: \"variant\";\n default: boolean;\n variantId: VariantId;\n subtitle: string | undefined;\n image: FileId | undefined;\n children: VariantChild[];\n}\n\nexport interface TabNode extends WithNodeMetadata, WithRedirect {\n type: \"tab\";\n child: SidebarRootNode;\n}\n\nexport interface PageNode extends WithNodeMetadata, WithPage {\n type: \"page\";\n availability: Availability | undefined;\n}\n\nexport interface LandingPageNode extends WithNodeMetadata, WithPage {\n type: \"landingPage\";\n}\n\nexport interface SectionNode extends WithNodeMetadata, WithOverviewPage, WithRedirect {\n type: \"section\";\n collapsible: boolean | undefined;\n collapsedByDefault: boolean | undefined;\n children: NavigationChild[];\n availability: Availability | undefined;\n}\n\nexport interface ChangelogNode extends WithNodeMetadata, WithOverviewPage {\n type: \"changelog\";\n children: ChangelogYearNode[];\n}\n\nexport interface ChangelogYearNode extends WithNodeMetadata {\n type: \"changelogYear\";\n year: number;\n children: ChangelogMonthNode[];\n}\n\nexport interface ChangelogMonthNode extends WithNodeMetadata {\n type: \"changelogMonth\";\n month: number;\n children: ChangelogEntryNode[];\n}\n\nexport interface ChangelogEntryNode extends WithNodeMetadata, WithPage {\n type: \"changelogEntry\";\n date: string;\n tags: string[] | undefined;\n}\n\nexport interface ApiReferenceNode extends WithNodeMetadata, WithOverviewPage, WithApiDefinitionId, WithRedirect {\n type: \"apiReference\";\n paginated: boolean | undefined;\n showErrors: boolean | undefined;\n hideTitle: boolean | undefined;\n children: ApiPackageChild[];\n changelog: ChangelogNode | undefined;\n playground: PlaygroundSettings | undefined;\n postmanCollectionUrl: string | undefined;\n}\n\nexport interface EndpointNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"endpoint\";\n method: HttpMethod;\n endpointId: EndpointId;\n isResponseStream: boolean | undefined;\n playground: PlaygroundSettings | undefined;\n}\n\nexport interface WebSocketNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"webSocket\";\n webSocketId: WebSocketId;\n playground: PlaygroundSettings | undefined;\n}\n\nexport interface WebhookNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"webhook\";\n method: HttpMethod;\n webhookId: WebhookId;\n}\n\nexport interface GrpcNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"grpc\";\n method: GrpcMethod;\n grpcId: GrpcId;\n}\n\nexport interface GraphQlNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"graphql\";\n operationType: GraphQlOperationType;\n graphqlOperationId: GraphQlOperationId;\n /** Additional operation IDs when this node represents a namespace group (e.g. fieldPath grouping). */\n graphqlOperationIds: GraphQlOperationId[] | undefined;\n playground: PlaygroundSettings | undefined;\n}\n\n/**\n * A navigation node representing a single GraphQL schema type (object, input,\n * enum, scalar, interface, or union) as opposed to a GraphQL operation.\n *\n * This node is a navigable leaf, mirroring {@link GraphQlNode}. Generating these\n * nodes from a schema (FER-10879) and rendering a dedicated type page\n * (FER-10880) are tracked separately.\n */\nexport interface GraphQlTypeNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"graphqlType\";\n typeId: TypeId;\n typeCategory: GraphQlTypeCategory;\n}\n\nexport interface ApiPackageNode extends WithNodeMetadata, WithOverviewPage, WithApiDefinitionId, WithRedirect {\n type: \"apiPackage\";\n children: ApiPackageChild[];\n playground: PlaygroundSettings | undefined;\n}\n","import { UnreachableCaseError } from \"ts-essentials\";\n\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isLeaf } from \"./NavigationNodeLeaf\";\n\nexport function getChildren(node: NavigationNode): readonly NavigationNode[] {\n if (isLeaf(node)) {\n return [];\n }\n\n switch (node.type) {\n case \"apiPackage\":\n case \"changelog\":\n case \"changelogMonth\":\n case \"changelogYear\":\n case \"section\":\n case \"sidebarGroup\":\n case \"sidebarRoot\":\n case \"tabbed\":\n case \"versioned\":\n case \"varianted\":\n return node.children;\n case \"product\":\n case \"root\":\n case \"tab\":\n return [node.child];\n case \"productLink\":\n return [];\n case \"variant\":\n return node.children;\n case \"apiReference\":\n return [...node.children, ...(node.changelog ? [node.changelog] : [])];\n case \"endpointPair\":\n return [node.nonStream, node.stream];\n case \"productgroup\":\n return [...(node.landingPage ? [node.landingPage] : []), ...node.children];\n case \"unversioned\":\n case \"version\":\n return [...(node.landingPage ? [node.landingPage] : []), node.child];\n default:\n throw new UnreachableCaseError(node);\n }\n}\n","import type { EndpointNode, GraphQlNode, GraphQlTypeNode, GrpcNode, WebhookNode, WebSocketNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A node in the navigation tree that represents an API endpoint, web socket, or webhook.\n */\nexport type NavigationNodeApiLeaf =\n | EndpointNode\n | WebSocketNode\n | WebhookNode\n | GrpcNode\n | GraphQlNode\n | GraphQlTypeNode;\n\nexport function isApiLeaf(node: NavigationNode): node is NavigationNodeApiLeaf {\n return (\n node.type === \"endpoint\" ||\n node.type === \"webSocket\" ||\n node.type === \"webhook\" ||\n node.type === \"grpc\" ||\n node.type === \"graphql\" ||\n node.type === \"graphqlType\"\n );\n}\n","import type { ChangelogEntryNode, LandingPageNode, PageNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A leaf node that contains primarily markdown content\n */\nexport type NavigationNodeMarkdownLeaf = ChangelogEntryNode | PageNode | LandingPageNode;\n\nexport function isMarkdownLeaf(node: NavigationNode): node is NavigationNodeMarkdownLeaf {\n return node.type === \"page\" || node.type === \"landingPage\" || node.type === \"changelogEntry\";\n}\n","import type { LinkNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isApiLeaf, type NavigationNodeApiLeaf } from \"./NavigationNodeApiLeaf\";\nimport { isMarkdownLeaf, type NavigationNodeMarkdownLeaf } from \"./NavigationNodePageLeaf\";\n\n/**\n * A navigation node that represents a leaf in the navigation tree (i.e. a node that does not have children)\n */\nexport type NavigationNodeLeaf = NavigationNodeApiLeaf | NavigationNodeMarkdownLeaf | LinkNode;\n\nexport function isLeaf(node: NavigationNode): node is NavigationNodeLeaf {\n return isApiLeaf(node) || isMarkdownLeaf(node) || node.type === \"link\";\n}\n","export function assertNever(x: never): never {\n throw new Error(\"Unexpected value: \" + JSON.stringify(x));\n}\n\nexport function assertNeverNoThrow(_: never): void {}\n\nexport default assertNever;\n","import { assertNever } from \"./assertNever\";\n\nexport type DiscriminatedUnionVisitor<T extends Record<Discriminant, string>, U, Discriminant extends string> = {\n [D in T[Discriminant]]: (value: Extract<T, Record<Discriminant, D>>) => U;\n} & {\n _other?: (value: Record<Discriminant, string>) => U;\n};\n\nexport function visitDiscriminatedUnion<T extends Record<\"type\", string>>(\n item: T\n): { _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, \"type\">) => U };\nexport function visitDiscriminatedUnion<T extends Record<Discriminant, string>, Discriminant extends string>(\n item: T,\n discriminant: Discriminant\n): { _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, Discriminant>) => U };\nexport function visitDiscriminatedUnion<T extends Record<Discriminant, string>, Discriminant extends string>(\n item: T,\n discriminant: Discriminant = \"type\" as Discriminant\n): {\n _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, Discriminant>) => U;\n} {\n return {\n _visit: (visitor) => {\n const visit = visitor[item[discriminant]];\n if (visit != null) {\n return visit(item as Extract<T, Record<Discriminant, string>>);\n } else {\n if (visitor._other == null) {\n assertNever(item as never);\n }\n return visitor._other(item);\n }\n }\n };\n}\n\nexport default visitDiscriminatedUnion;\n","import visitDiscriminatedUnion from \"@fern-api/ui-core-utils/visitDiscriminatedUnion\";\n\nimport type { NavigationNodePage, PageId } from \".\";\n\nconst RETURN_PAGEID = (node: { pageId: PageId }) => node.pageId;\nconst RETURN_OVERVIEW_PAGEID = (node: { overviewPageId?: PageId }) => node.overviewPageId;\nconst RETURN_UNDEFINED = () => undefined;\n\nexport function getPageId(node: NavigationNodePage): PageId | undefined {\n return visitDiscriminatedUnion(node)._visit({\n section: RETURN_OVERVIEW_PAGEID,\n apiReference: RETURN_OVERVIEW_PAGEID,\n changelog: RETURN_OVERVIEW_PAGEID,\n apiPackage: RETURN_OVERVIEW_PAGEID,\n changelogEntry: RETURN_PAGEID,\n page: RETURN_PAGEID,\n landingPage: RETURN_PAGEID,\n\n // if the following changes, make sure to update the algolia records generator\n endpoint: RETURN_UNDEFINED,\n webSocket: RETURN_UNDEFINED,\n webhook: RETURN_UNDEFINED,\n grpc: RETURN_UNDEFINED,\n graphql: RETURN_UNDEFINED,\n graphqlType: RETURN_UNDEFINED\n // changelogYear: RETURN_UNDEFINED,\n // changelogMonth: RETURN_UNDEFINED,\n });\n}\n","import type { ApiPackageNode, ApiReferenceNode, ChangelogNode, SectionNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A navigation node that isn't a leaf node and contains markdown content\n */\nexport type NavigationNodeSection = SectionNode | ApiReferenceNode | ChangelogNode | ApiPackageNode;\n\nexport function isSection(node: NavigationNode): node is NavigationNodeSection {\n return (\n node.type === \"section\" ||\n node.type === \"apiReference\" ||\n node.type === \"changelog\" ||\n node.type === \"apiPackage\"\n );\n}\n","import type { PageId, WithOverviewPage } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isSection, type NavigationNodeSection } from \"./NavigationNodeSection\";\n\ntype WithRequiredOverviewPage<T extends WithOverviewPage> = T & {\n overviewPageId: PageId;\n};\n\n/**\n * A navigation node that isn't a leaf node and contains markdown content\n */\nexport type NavigationNodeSectionOverview = WithRequiredOverviewPage<NavigationNodeSection>;\n\nexport function isSectionOverview(node: NavigationNode): node is NavigationNodeSectionOverview {\n return isSection(node) && node.overviewPageId != null;\n}\n","import type { NavigationNode } from \"./NavigationNode\";\nimport { isMarkdownLeaf, type NavigationNodeMarkdownLeaf } from \"./NavigationNodePageLeaf\";\nimport { isSectionOverview, type NavigationNodeSectionOverview } from \"./NavigationNodeSectionOverview\";\n\n/**\n * A navigation node that contains markdown content\n */\nexport type NavigationNodeWithMarkdown = NavigationNodeSectionOverview | NavigationNodeMarkdownLeaf;\n\nexport function hasMarkdown(node: NavigationNode): node is NavigationNodeWithMarkdown {\n return isMarkdownLeaf(node) || isSectionOverview(node);\n}\n","import type { ChangelogNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isApiLeaf, type NavigationNodeApiLeaf } from \"./NavigationNodeApiLeaf\";\nimport { hasMarkdown, type NavigationNodeWithMarkdown } from \"./NavigationNodeMarkdown\";\n\n/**\n * A navigation node that represents a visitable page in the documentation\n */\nexport type NavigationNodePage = NavigationNodeWithMarkdown | NavigationNodeApiLeaf | ChangelogNode;\n// | ChangelogYearNode\n// | ChangelogMonthNode;\n\nexport function isPage<N extends NavigationNode>(node: N): node is N & NavigationNodePage {\n return (\n isApiLeaf(node) ||\n node.type === \"changelog\" ||\n // TODO: Uncomment when changelog years and months are visitable\n // node.type === \"changelogYear\" ||\n // node.type === \"changelogMonth\" ||\n hasMarkdown(node)\n );\n}\n","import type { WithNodeMetadata } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A navigation node that has a title and a slug\n */\nexport type NavigationNodeWithMetadata = Extract<NavigationNode, WithNodeMetadata>;\n\nexport function hasMetadata(node: Partial<NavigationNode>): node is NavigationNodeWithMetadata {\n return (\n typeof (node as NavigationNodeWithMetadata).title === \"string\" &&\n typeof (node as NavigationNodeWithMetadata).slug === \"string\"\n );\n}\n","import type { Slug, WithRedirect } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * Navigation nodes that can have a redirect\n */\nexport type NavigationNodeWithPointsTo = Extract<NavigationNode, WithRedirect>;\n\nexport function hasPointsTo(node: NavigationNode): node is NavigationNodeWithPointsTo {\n return (\n node.type === \"root\" ||\n node.type === \"product\" ||\n node.type === \"version\" ||\n node.type === \"tab\" ||\n node.type === \"section\" ||\n node.type === \"apiReference\" ||\n node.type === \"apiPackage\"\n );\n}\n\n/**\n * Navigation nodes that extend WithRedirect\n */\n\nexport function hasRedirect(node: NavigationNode): node is NavigationNodeWithPointsTo & { pointsTo: Slug } {\n if (!hasPointsTo(node)) {\n return false;\n }\n return node.pointsTo != null;\n}\n","export function isNonNullish<T>(x: T | null | undefined): x is T {\n return x != null;\n}\n\nexport function assertNonNullish<T>(x: T | null | undefined, message?: string): asserts x is T {\n if (x == null) {\n throw new Error(message ?? \"Value is null or undefined\");\n }\n}\n","import { isNonNullish } from \"@fern-api/ui-core-utils\";\nimport urljoin from \"url-join\";\n\nimport { Slug } from \".\";\n\n// normalizes slug parts and joins them with a single slash\nexport function slugjoin(...parts: (string | string[] | null | undefined)[]): Slug {\n const slugArray = parts\n .filter(isNonNullish)\n .flatMap((part) => (typeof part === \"string\" ? [part.trim()] : part.map((part) => part.trim())))\n .map((part) => decodeURIComponent(part));\n\n const joined = urljoin(slugArray) ?? \"\";\n const normalized = joined\n .replaceAll(\"//*\", \"/\") // Remove duplicate slashes\n .replace(/^\\//, \"\") // Remove leading slash\n .replace(/\\/$/, \"\"); // Remove trailing slash\n\n return Slug(normalized);\n}\n","import { escapeRegExp } from \"es-toolkit/string\";\n\nimport { Slug } from \".\";\n\n/**\n * All versioned slugs are prefixed with the version slug, but the default version may be accessed without the version prefix.\n * toDefaultSlug creates the \"unversioned\" slug for pages under the default version.\n * This should be treated as the cannonical slug for that page.\n */\nexport function toDefaultSlug(slug: Slug, rootSlug: Slug, versionSlug: Slug): Slug;\nexport function toDefaultSlug(slug: Slug | undefined, rootSlug: Slug, versionSlug: Slug): Slug | undefined;\nexport function toDefaultSlug(slug: Slug | undefined, rootSlug: Slug, versionSlug: Slug): Slug | undefined {\n if (slug == null) {\n return undefined;\n }\n if (slug.startsWith(versionSlug)) {\n return Slug(slug.replace(new RegExp(`^${escapeRegExp(versionSlug)}`), rootSlug).replace(/^\\//, \"\"));\n }\n return slug;\n}\n","export const SKIP = \"skip\" as const;\nexport const STOP = false;\nexport const CONTINUE = true;\n\nexport type Action = typeof CONTINUE | typeof SKIP | typeof STOP | void;\n\nexport type TraverserVisit<N, P extends N = N> = (node: N, parents: readonly P[]) => Action;\nexport type TraverserGetChildren<N, P extends N = N> = (parent: P) => readonly N[];\n\nexport type DeleterAction = \"deleted\" | \"should-delete-parent\" | \"noop\";\n","import { SKIP, STOP, type TraverserGetChildren, type TraverserVisit } from \"./types\";\n\nexport function dfs<N, P extends N = N>(\n root: N,\n visit: TraverserVisit<N, P>,\n getChildren: TraverserGetChildren<N, P>,\n isParent: (node: N) => node is P = (node): node is P => true\n): void {\n const stack: [N, P[]][] = [[root, []]];\n while (stack.length > 0) {\n const [node, parents] = stack.pop() ?? [];\n if (!node) {\n continue;\n }\n const next = visit(node, parents ?? []);\n\n if (next === SKIP) {\n continue;\n } else if (next === STOP) {\n return;\n }\n\n if (isParent(node)) {\n for (const child of [...getChildren(node)].reverse()) {\n stack.push([child, [...(parents ?? []), node]]);\n }\n }\n }\n}\n","import { dfs } from \"../../../utils/traversers/dfs\";\nimport type { TraverserVisit } from \"../../../utils/traversers/types\";\nimport { getChildren } from \"./getChildren\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport type { NavigationNodeParent } from \"./NavigationNodeParent\";\n\n/**\n * Traverse the navigation tree in a depth-first manner (pre-order).\n */\nexport function traverseDF(node: NavigationNode, visit: TraverserVisit<NavigationNode, NavigationNodeParent>): void {\n return dfs(node, visit, getChildren);\n}\n","/**\n * Synthetic section-path segments disambiguate skipUrlSlug nodes in the\n * flat ledger segment model. When a node shares its parent's slug\n * (skipUrlSlug), the publish transform assigns a section path like\n * `parent/~3` instead of `parent`. The read side (ledger-root-builder)\n * strips these synthetic components when computing URL slugs so they\n * never appear in rendered navigation.\n */\n\n/** Prefix for synthetic section-path segments. */\nexport const SKIP_URL_SLUG_PREFIX = \"~\";\n\n/** Pattern matching a synthetic segment: the prefix followed by one or more digits. */\nconst SYNTHETIC_SEGMENT_RE = /^~\\d+$/;\n\n/** Strip synthetic `~<n>` path components used for skipUrlSlug disambiguation. */\nexport function stripSyntheticSegments(section: string): string {\n return section\n .split(\"/\")\n .filter((part) => !SYNTHETIC_SEGMENT_RE.test(part))\n .join(\"/\");\n}\n","import type { NavResponse, VersionMetadataResponse } from \"../orpc-client/docs-ledger/contract.js\";\nimport * as FernNavigation from \"./index.js\";\nimport { stripSyntheticSegments } from \"./utils/syntheticSectionPath.js\";\n\n/**\n * Reconstruct a FernNavigation `RootNode` from the decomposed ledger model\n * (segments + per-segment nav) instead of an embedded `config.root` blob.\n *\n * This is the \"slower fallback\" referenced in the ledger loader refactor: the\n * route/segment-first hot path resolves a single page + its local sidebar\n * without materialising the whole tree, but compatibility methods that need\n * the full root (`getRoot`, `unsafe_getFullRoot`, `findNode`, `getProductList`,\n * …) reconstruct it here.\n *\n * ── Design notes ──────────────────────────────────────────────────────────\n *\n * The transform (`docsPublishTransform.ts`) decomposes a V1 RootNode into:\n * - segment_details: product / version / variant / tab dimensions\n * - segments: a (locale × product × version × variant × tab × section) scope\n * with a `metadata.type` descriptor (section | apiReference | apiPackage |\n * changelog | tabRoot)\n * - artifacts: the leaf nodes (pages, endpoints, links, changelog entries)\n * - nav: routing (fullPath) + sidebar ordering (displaySortOrder)\n *\n * Reconstruction inverts this:\n * 1. Group segments by their (product, version, variant, tab) scope.\n * 2. Within a scope, build the sidebar by nesting `section` segments via\n * their `section` path string (\"models/command\" is a child of \"models\").\n * 3. Assemble scopes into tabbed / sidebarRoot, versioned, productgroup, or\n * unversioned scaffolding based on which dimensions are present.\n *\n * Node slugs are grounded in the stored canonical `fullPath` (the nav row that\n * carries `displaySortOrder`) wherever an artifact exists, so we don't have to\n * re-derive default-slug elision. Structural nodes without their own route\n * (products / versions / sections without an overview) derive a slug via\n * {@link FernNavigation.slugjoin} from the scope prefix.\n *\n * API reference segments are emitted as `paginated` ApiReferenceNodes whose\n * children are populated from the segment's nav routes (endpoint/webhook stubs\n * built via {@link apiLeafNodeFromNavRouteInternal}). This mirrors V2 parity:\n * `findNode` and the slug map locate endpoint pages via the tree, while the\n * full API definition content is still loaded on demand at render time.\n */\n\ntype Segment = VersionMetadataResponse[\"segments\"][number];\ntype SegmentDetail = NonNullable<Segment[\"product\"]>;\ntype NavRoute = NavResponse[\"routes\"][number];\n\n// ── Segment type taxonomy ────────────────────────────────────────────────\n//\n// These types mirror the `metadata.type` values written by\n// `docsPublishTransform.ts`. Keeping them in a typed constant guarded by\n// `satisfies` means the compiler will catch drift if a new structural\n// type is added on the write side but not here.\n\n/** Segment types that have dedicated node builders (cases B/C in buildSidebarRootChildren). */\ntype StructuralSegmentType = \"section\" | \"apiReference\" | \"apiPackage\" | \"changelog\";\n\nconst STRUCTURAL_SEGMENT_TYPES = new Set<string>([\n \"section\",\n \"apiReference\",\n \"apiPackage\",\n \"changelog\"\n] satisfies StructuralSegmentType[]);\n\n/** Structural types routed to `apiReferenceNode` (both carry an apiDefinitionId). */\ntype ApiNodeSegmentType = \"apiReference\" | \"apiPackage\";\n\nconst API_NODE_SEGMENT_TYPES = new Set<string>([\"apiReference\", \"apiPackage\"] satisfies ApiNodeSegmentType[]);\n\n/** Infrastructure segment types filtered out before tree building. */\ntype InfraSegmentType = \"files\" | \"redirects\";\n\nconst INFRA_SEGMENT_TYPES = new Set<string>([\"files\", \"redirects\"] satisfies InfraSegmentType[]);\n\nexport interface BuildRootOptions {\n /** The deployment's root slug — the cleaned basepath (e.g. \"\" or \"docs\"). */\n basePath: string;\n /** V1 root slug. Usually equals basePath, but can be empty on sites served under a platform basepath. */\n rootSlug?: string;\n /** The site title (RootNode.title). */\n title: string;\n /** Segments for the resolved locale (already locale-deduped by the DAO). */\n segments: Segment[];\n /** Per-segment sidebar nav entries, keyed by segmentHash. */\n navBySegment: Map<string, NavRoute[]>;\n /**\n * When true, skip merging shared (tab-level) sections from sibling\n * versions into the default version. Scoped roots (route-first renders)\n * must set this to avoid slug conflicts: the scoped root only loads nav\n * for the requested route's scope, so merged sections carry the source\n * version's fullPaths into the default version's tree, creating\n * duplicate slugs that cause NodeCollector to orphan the real version's\n * pages and return wrong tabs/sidebar.\n */\n skipSharedSectionMerge?: boolean;\n}\n\n// ── id / slug helpers ──────────────────────────────────────────────────────\n\n/**\n * Per-build state. Created once per {@link buildFullRootFromSegments} call and\n * threaded through the builders so concurrent invocations never share state.\n * This matters under Vercel Fluid Compute, where concurrent requests can share\n * a single module instance — module-level mutable state would let one build's\n * ids/basepath bleed into another.\n */\ninterface BuildContext {\n nodeId: (key: string) => FernNavigation.NodeId;\n /** Slug for a content artifact/section, prefixed with the deployment basepath. */\n contentSlug: (relativePath: string) => FernNavigation.Slug;\n}\n\n/** @internal Exported for testing only. */\nexport function createBuildContext(basePath: string): BuildContext {\n // Tracks how many times each id key has been handed out, so collisions get\n // a deterministic `-N` suffix. NodeIds only need to be unique within a\n // single tree; keying them off content (slug/scope) instead of a running\n // counter makes them stable across builds — so client state keyed by\n // node.id (e.g. playground form state in localStorage) survives republish\n // as long as the node's slug/position is unchanged.\n const seen = new Map<string, number>();\n // Nav `fullPath`s are stored relative to the docs root (no basepath);\n // FernNavigation slugs include the basepath prefix, so content node slugs\n // are joined onto this prefix.\n const basePrefix = basePath.replace(/^\\/+|\\/+$/g, \"\");\n return {\n nodeId: (key) => {\n const count = seen.get(key) ?? 0;\n seen.set(key, count + 1);\n return FernNavigation.NodeId(count === 0 ? key : `${key}-${count}`);\n },\n contentSlug: (relativePath) => {\n const clean = relativePath.replace(/^\\/+|\\/+$/g, \"\");\n return basePrefix === \"\" ? FernNavigation.Slug(clean) : FernNavigation.slugjoin(basePrefix, clean);\n }\n };\n}\n\nfunction asSlug(path: string): FernNavigation.Slug {\n return FernNavigation.Slug(path.replace(/^\\/+|\\/+$/g, \"\"));\n}\n\n/**\n * Resolve a product/version/tab `metadata.pointsTo` value to a node slug.\n *\n * `pointsTo` is written basepath-ABSOLUTE: it is a V1 accumulated slug, rooted\n * at the deployment basepath (`root.slug`), exactly like the `routes` dict\n * keys, the `routing` table, and `versionFirstRoute`. Only sidebar `fullPath`s\n * are stored basepath-RELATIVE and re-prefixed via {@link BuildContext.contentSlug}.\n *\n * Passing `pointsTo` through `contentSlug` would prepend the basepath a SECOND\n * time (`docs/runtime/overview` → `docs/docs/runtime/overview`), so the bare\n * product/version landing redirect targets a non-existent route and 404s on any\n * non-root (`/docs`) site. Treat it as already-absolute — only normalise slashes.\n */\nfunction pointsToSlug(metaPointsTo: string): FernNavigation.Slug {\n return asSlug(metaPointsTo);\n}\n\n/** Read a string field off an unknown metadata blob. */\nfunction metaStr(metadata: unknown, key: string): string | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"string\" ? v : undefined;\n }\n return undefined;\n}\n\n/**\n * V1 availability values stored in ledger metadata are lowercase (e.g. \"deprecated\"),\n * but the latest Availability type uses PascalCase (e.g. \"Deprecated\"). This map\n * normalises both formats so the badge component can look up display names correctly.\n */\nconst AVAILABILITY_LOOKUP: Record<string, FernNavigation.Availability> = {\n // V1 lowercase values (stored by docsPublishTransform from V1 navigation tree)\n alpha: FernNavigation.Availability.Alpha,\n stable: FernNavigation.Availability.Stable,\n \"generally-available\": FernNavigation.Availability.GenerallyAvailable,\n \"in-development\": FernNavigation.Availability.InDevelopment,\n \"pre-release\": FernNavigation.Availability.PreRelease,\n deprecated: FernNavigation.Availability.Deprecated,\n beta: FernNavigation.Availability.Beta,\n preview: FernNavigation.Availability.Preview,\n legacy: FernNavigation.Availability.Legacy,\n // Latest PascalCase values (pass-through)\n Alpha: FernNavigation.Availability.Alpha,\n Stable: FernNavigation.Availability.Stable,\n GenerallyAvailable: FernNavigation.Availability.GenerallyAvailable,\n InDevelopment: FernNavigation.Availability.InDevelopment,\n PreRelease: FernNavigation.Availability.PreRelease,\n Deprecated: FernNavigation.Availability.Deprecated,\n Beta: FernNavigation.Availability.Beta,\n Preview: FernNavigation.Availability.Preview,\n Legacy: FernNavigation.Availability.Legacy\n};\n\n/** Read an announcement config from metadata (`{ text: string }` stored as `announcementText`). */\nfunction metaAnnouncement(metadata: unknown): { text: string } | undefined {\n const text = metaStr(metadata, \"announcementText\");\n return text != null ? { text } : undefined;\n}\n\n/** Read an availability field from metadata, converting V1 lowercase to latest PascalCase. */\nfunction metaAvailability(metadata: unknown): FernNavigation.Availability | undefined {\n const raw = metaStr(metadata, \"availability\");\n if (raw == null) {\n return undefined;\n }\n return AVAILABILITY_LOOKUP[raw];\n}\n\nfunction metaBool(metadata: unknown, key: string): boolean | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"boolean\" ? v : undefined;\n }\n return undefined;\n}\n\nfunction metaNum(metadata: unknown, key: string): number | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"number\" ? v : undefined;\n }\n return undefined;\n}\n\n/** Read the `collapsed` field which can be boolean or \"open-by-default\". */\nfunction metaCollapsed(metadata: unknown): boolean | \"open-by-default\" | undefined {\n if (metadata != null && typeof metadata === \"object\" && \"collapsed\" in metadata) {\n const v = (metadata as Record<string, unknown>).collapsed;\n if (typeof v === \"boolean\") {\n return v;\n }\n if (v === \"open-by-default\") {\n return \"open-by-default\";\n }\n }\n return undefined;\n}\n\n/** Extract a string array from a metadata blob (e.g. page-level `viewers`). */\nfunction metaStrArr(metadata: unknown, key: string): string[] | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n if (Array.isArray(v)) {\n return v.filter((x): x is string => typeof x === \"string\");\n }\n }\n return undefined;\n}\n\nfunction metaFeatureFlags(metadata: unknown): FernNavigation.FeatureFlagOptions[] | undefined {\n if (metadata != null && typeof metadata === \"object\" && \"featureFlags\" in metadata) {\n const v = (metadata as Record<string, unknown>).featureFlags;\n return Array.isArray(v) && v.length > 0 ? (v as FernNavigation.FeatureFlagOptions[]) : undefined;\n }\n return undefined;\n}\n\n/** Map raw viewer role strings to branded RoleIds, or undefined when empty. */\nfunction toViewers(viewers: string[] | undefined): FernNavigation.RoleId[] | undefined {\n if (viewers == null || viewers.length === 0) {\n return undefined;\n }\n return viewers.map((v) => FernNavigation.RoleId(v));\n}\n\n/**\n * Merge segment-level viewers with the owning variant's viewers so that\n * variant-level RBAC restrictions propagate into section/apiReference/changelog\n * nodes. Without this, removing the variant filter from `inScope` would allow\n * cross-variant prev/next links to disclose restricted content.\n */\nfunction mergeVariantViewers(seg: Segment): FernNavigation.RoleId[] | undefined {\n const segViewers = STRUCTURAL_SEGMENT_TYPES.has(seg.metadata.type)\n ? (seg.metadata as { viewers?: string[] }).viewers\n : undefined;\n const variantViewers = seg.variant?.viewers;\n if ((segViewers == null || segViewers.length === 0) && (variantViewers == null || variantViewers.length === 0)) {\n return undefined;\n }\n const merged = new Set<string>();\n if (segViewers != null) {\n for (const v of segViewers) {\n merged.add(v);\n }\n }\n if (variantViewers != null) {\n for (const v of variantViewers) {\n merged.add(v);\n }\n }\n return merged.size > 0 ? [...merged].map((v) => FernNavigation.RoleId(v)) : undefined;\n}\n\nfunction detailSlug(detail: SegmentDetail): string {\n return detail.metadata?.slug ?? \"\";\n}\n\nfunction detailIsDefault(detail: SegmentDetail): boolean {\n return detail.metadata?.default ?? false;\n}\n\n// ── scope grouping ───────────────────────────────────────────────────────\n\n/** Stable identity for a (product, version, variant, tab) scope. */\nfunction scopeKey(seg: Segment): string {\n return [seg.product?.id ?? \"\", seg.version?.id ?? \"\", seg.variant?.id ?? \"\", seg.tab?.id ?? \"\"].join(\"|\");\n}\n\n// ── artifact → node conversion ─────────────────────────────────────────────\n\nfunction withMetadataDefaults(base: {\n id: FernNavigation.NodeId;\n title: string;\n slug: FernNavigation.Slug;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed?: boolean | undefined;\n viewers?: FernNavigation.RoleId[];\n orphaned?: boolean | undefined;\n featureFlags?: FernNavigation.FeatureFlagOptions[] | undefined;\n}): {\n id: FernNavigation.NodeId;\n title: string;\n slug: FernNavigation.Slug;\n canonicalSlug: FernNavigation.Slug | undefined;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n collapsed: boolean | undefined;\n viewers: FernNavigation.RoleId[] | undefined;\n orphaned: boolean | undefined;\n featureFlags: FernNavigation.FeatureFlagOptions[] | undefined;\n} {\n const { viewers, featureFlags, ...rest } = base;\n return {\n ...rest,\n canonicalSlug: undefined,\n authed: base.authed === true ? true : undefined,\n collapsed: undefined,\n // Normalise empty arrays to undefined so unrestricted nodes don't add\n // filter-level noise; a non-empty array engages the RBAC view gate.\n viewers: viewers != null && viewers.length > 0 ? viewers : undefined,\n orphaned: base.orphaned === true ? true : undefined,\n featureFlags: featureFlags != null && featureFlags.length > 0 ? featureFlags : undefined\n };\n}\n\n/**\n * Convert one sidebar nav artifact into a leaf navigation node. Returns\n * undefined for artifacts that don't become standalone sidebar nodes here\n * (endpoints live under paginated apiReferences; overview pages are folded\n * into their owning section).\n */\nfunction artifactToNode(ctx: BuildContext, route: NavRoute): FernNavigation.NavigationChild | undefined {\n const md = route.metadata;\n const title = metaStr(md, \"title\") ?? \"\";\n const icon = metaStr(md, \"icon\");\n const viewers = toViewers(metaStrArr(md, \"viewers\"));\n const slug = ctx.contentSlug(route.fullPath ?? \"\");\n\n switch (route.type) {\n case \"markdown\": {\n // Overview pages are represented on their section, not as a sibling.\n if (metaBool(md, \"isOverview\")) {\n return undefined;\n }\n const pageId = metaStr(md, \"pageId\") ?? \"\";\n const node: FernNavigation.PageNode = {\n type: \"page\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`page:${slug}`),\n title,\n slug,\n icon,\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers,\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n }),\n pageId: FernNavigation.PageId(pageId),\n noindex: metaBool(md, \"noindex\"),\n availability: metaAvailability(md)\n };\n return node;\n }\n case \"link\": {\n const node: FernNavigation.LinkNode = {\n type: \"link\",\n id: ctx.nodeId(`link:${metaStr(md, \"url\") ?? route.fullPath ?? \"\"}`),\n collapsed: undefined,\n title,\n icon,\n url: FernNavigation.Url(metaStr(md, \"url\") ?? \"\"),\n target: metaStr(md, \"target\") as FernNavigation.LinkNode[\"target\"]\n };\n return node;\n }\n // API leaf types are handled by apiReferenceNode (which calls\n // apiLeafNodeFromNavRouteInternal), not by section-level artifact\n // conversion. Returning undefined here prevents them from appearing\n // as duplicate siblings alongside the apiReference node.\n case \"rest\":\n case \"asyncapi\":\n case \"webhook\":\n case \"grpc\":\n case \"graphql\":\n return undefined;\n default:\n return undefined;\n }\n}\n\n// ── API-leaf node construction (route/segment-first explorer scoping) ──────\n\n/**\n * The HTTP-method-bearing nav route types emitted by the publish transform for\n * API leaves. Used by both the root builder (to populate apiReference children)\n * and the route/segment-first explorer reads (to resolve endpoint/webhook\n * navigation nodes from a single API segment's nav without walking the full\n * reconstructed root). See ADR 0013 §API-explorer methods.\n */\nexport type ApiLeafNode =\n | FernNavigation.EndpointNode\n | FernNavigation.WebhookNode\n | FernNavigation.WebSocketNode\n | FernNavigation.GrpcNode\n | FernNavigation.GraphQlNode;\n\ntype PositionedApiChild = {\n node: FernNavigation.ApiPackageChild;\n pos: number;\n};\n\n/**\n * Convert one API-leaf nav route into its navigation node, or undefined when\n * the route is not an API leaf carrying the required identifiers.\n *\n * @internal Exported for the ledger loader's scoped explorer methods.\n */\nexport function apiLeafNodeFromNavRoute(\n route: NavRoute,\n basePath: string,\n segmentApiDefinitionId: string\n): ApiLeafNode | undefined {\n const ctx = createBuildContext(basePath);\n return apiLeafNodeFromNavRouteInternal(ctx, route, segmentApiDefinitionId);\n}\n\nfunction apiLeafNodeFromNavRouteInternal(\n ctx: BuildContext,\n route: NavRoute,\n segmentApiDefinitionId: string\n): ApiLeafNode | undefined {\n // Defensive guard: if fullPath is null/undefined, the writer failed to\n // assign a path (e.g. due to slug collision dedup). Skip the node rather\n // than produce a broken entry with the bare basepath as its slug.\n if (route.fullPath == null) {\n return undefined;\n }\n const md = route.metadata;\n const apiDefinitionId = FernNavigation.ApiDefinitionId(metaStr(md, \"apiDefinitionId\") ?? segmentApiDefinitionId);\n const slug = ctx.contentSlug(route.fullPath);\n const title = metaStr(md, \"title\") ?? \"\";\n const icon = metaStr(md, \"icon\");\n const viewers = toViewers(metaStrArr(md, \"viewers\"));\n const meta = withMetadataDefaults({\n id: ctx.nodeId(`api-leaf:${slug}`),\n title,\n slug,\n icon,\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers,\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n });\n\n if (route.type === \"rest\") {\n const endpointId = metaStr(md, \"endpointId\");\n const method = metaStr(md, \"method\");\n if (endpointId == null || method == null) {\n return undefined;\n }\n return {\n type: \"endpoint\",\n ...meta,\n method: method as FernNavigation.EndpointNode[\"method\"],\n endpointId: FernNavigation.EndpointId(endpointId),\n apiDefinitionId,\n isResponseStream: metaBool(md, \"isResponseStream\"),\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n if (route.type === \"webhook\") {\n const webhookId = metaStr(md, \"webhookId\");\n const method = metaStr(md, \"method\");\n if (webhookId == null || method == null) {\n return undefined;\n }\n return {\n type: \"webhook\",\n ...meta,\n method: method as FernNavigation.WebhookNode[\"method\"],\n webhookId: FernNavigation.WebhookId(webhookId),\n apiDefinitionId,\n availability: metaAvailability(md)\n };\n }\n\n if (route.type === \"asyncapi\") {\n const webSocketId = metaStr(md, \"webSocketId\");\n if (webSocketId == null) {\n return undefined;\n }\n return {\n type: \"webSocket\",\n ...meta,\n webSocketId: FernNavigation.WebSocketId(webSocketId),\n apiDefinitionId,\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n if (route.type === \"grpc\") {\n const grpcId = metaStr(md, \"grpcId\");\n const method = metaStr(md, \"method\");\n if (grpcId == null || method == null) {\n return undefined;\n }\n return {\n type: \"grpc\",\n ...meta,\n method: method as FernNavigation.GrpcNode[\"method\"],\n grpcId: FernNavigation.GrpcId(grpcId),\n apiDefinitionId,\n availability: metaAvailability(md)\n };\n }\n\n if (route.type === \"graphql\") {\n const graphqlOperationId = metaStr(md, \"graphqlOperationId\");\n const operationType = metaStr(md, \"operationType\");\n if (graphqlOperationId == null || operationType == null) {\n return undefined;\n }\n return {\n type: \"graphql\",\n ...meta,\n operationType: operationType as FernNavigation.GraphQlNode[\"operationType\"],\n graphqlOperationId: FernNavigation.GraphQlOperationId(graphqlOperationId),\n graphqlOperationIds: undefined,\n apiDefinitionId,\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n return undefined;\n}\n\nfunction apiLeafPositionKey(node: ApiLeafNode): string {\n switch (node.type) {\n case \"endpoint\":\n return `endpoint:${node.endpointId}`;\n case \"webhook\":\n return `webhook:${node.webhookId}`;\n case \"webSocket\":\n return `webSocket:${node.webSocketId}`;\n case \"grpc\":\n return `grpc:${node.grpcId}`;\n case \"graphql\":\n return `graphql:${node.graphqlOperationId}`;\n }\n}\n\nfunction apiChildPositionKey(node: FernNavigation.ApiPackageChild): string | undefined {\n switch (node.type) {\n case \"endpoint\":\n case \"webhook\":\n case \"webSocket\":\n case \"grpc\":\n case \"graphql\":\n return apiLeafPositionKey(node);\n default:\n return undefined;\n }\n}\n\nfunction positionedApiLeafChildren(ctx: BuildContext, nav: NavRoute[], apiDefinitionId: string): PositionedApiChild[] {\n const rawLeafNodes: ApiLeafNode[] = [];\n const leafPositions = new Map<string, number>();\n const nonApiLeafNodes: PositionedApiChild[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const route = nav[i]!;\n const pos = route.displaySortOrder ?? i;\n const apiLeaf = apiLeafNodeFromNavRouteInternal(ctx, route, apiDefinitionId);\n if (apiLeaf != null) {\n rawLeafNodes.push(apiLeaf);\n const key = apiLeafPositionKey(apiLeaf);\n leafPositions.set(key, Math.min(leafPositions.get(key) ?? pos, pos));\n continue;\n }\n\n const node = artifactToNode(ctx, route);\n if (node?.type === \"page\" || node?.type === \"link\") {\n nonApiLeafNodes.push({ node, pos });\n }\n }\n\n const apiLeafNodes = mergeEndpointPairs(ctx, rawLeafNodes, nav);\n const positionedApiLeafNodes = apiLeafNodes.map((node, index): PositionedApiChild => {\n if (node.type === \"endpointPair\") {\n const streamPos = leafPositions.get(apiLeafPositionKey(node.stream)) ?? index;\n const nonStreamPos = leafPositions.get(apiLeafPositionKey(node.nonStream)) ?? index;\n return { node, pos: Math.min(streamPos, nonStreamPos) };\n }\n const key = apiChildPositionKey(node);\n return { node, pos: key != null ? (leafPositions.get(key) ?? index) : index };\n });\n\n return [...positionedApiLeafNodes, ...nonApiLeafNodes];\n}\n\n/**\n * Collect every endpoint/webhook navigation node from a single API segment's\n * nav routes. The root builder now populates apiReference children directly,\n * but this helper is still used by the ledger loader's per-apiDefinitionId\n * explorer methods (getApiLeafNodes) which scope to a single API definition.\n *\n * @internal Exported for the ledger loader's scoped explorer methods.\n */\nexport function collectApiLeafNodesFromNav(\n routes: NavRoute[],\n basePath: string,\n segmentApiDefinitionId: string\n): ApiLeafNode[] {\n const ctx = createBuildContext(basePath);\n return routes\n .map((route) => apiLeafNodeFromNavRouteInternal(ctx, route, segmentApiDefinitionId))\n .filter((node): node is ApiLeafNode => node != null);\n}\n\n/**\n * Read the apiDefinitionId off a segment's metadata, or undefined.\n * The matched types (apiReference, apiPackage, changelog) are the\n * subset of {@link StructuralSegmentType} that carry an apiDefinitionId.\n */\nexport function segmentApiDefinitionId(metadata: Segment[\"metadata\"]): string | undefined {\n switch (metadata.type) {\n case \"apiReference\":\n case \"apiPackage\":\n case \"changelog\":\n return metadata.apiDefinitionId;\n default:\n return undefined;\n }\n}\n\n// ── section-tree assembly within one scope ───────────────────────────────\n\ninterface ScopedSegment {\n seg: Segment;\n nav: NavRoute[];\n}\n\n/** Find the overview artifact (isOverview) within a segment's nav, if any. */\nfunction overviewRoute(nav: NavRoute[]): NavRoute | undefined {\n return nav.find((r) => r.type === \"markdown\" && metaBool(r.metadata, \"isOverview\"));\n}\n\n/**\n * Find the overview page for a section using the segment's own\n * `metadata.overviewPageId` when `overviewRoute` (isOverview flag on nav\n * routes) fails. This handles sections where the CLI stored the overview\n * reference on the segment metadata but didn't set `isOverview` on the page.\n *\n * Legacy compat: older CLI versions wrote `overviewPageId` on the segment\n * metadata but omitted the `isOverview` flag on the nav route itself. This\n * fallback keeps those segments working. Once all published sites have been\n * re-published with a CLI that sets `isOverview`, this path can be removed.\n */\nfunction overviewRouteFromSegmentMeta(seg: Segment, nav: NavRoute[]): NavRoute | undefined {\n const overviewPageId = metaStr(seg.metadata, \"overviewPageId\");\n if (overviewPageId == null) {\n return undefined;\n }\n return nav.find((r) => metaStr(r.metadata, \"pageId\") === overviewPageId);\n}\n\n/**\n * Infer the section slug for a root section (`seg.section === \"\"`) from its\n * child pages' fullPaths. When the section path is empty and there is no\n * overview page, we look at the first routable page whose content slug\n * extends beyond the scope prefix. The first path segment past the scope\n * prefix is the section's implicit slug segment (e.g. `overview` in\n * `{scope}/overview/introduction`).\n *\n * Limitations:\n * - Assumes the first routable child's path structure matches the section\n * slug. Heterogeneous child path prefixes (rare) would infer incorrectly.\n * - Sections with only single-segment children (path = `{scope}/pagename`)\n * cannot be distinguished from bare pages, so inference falls through to\n * the bare scope prefix. This is acceptable — the section effectively\n * has no URL-visible slug of its own.\n */\nfunction inferSectionSlugFromNav(\n ctx: BuildContext,\n nav: NavRoute[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.Slug | undefined {\n const scopeStr = String(scopePrefix);\n const prefix = scopeStr !== \"\" ? scopeStr + \"/\" : \"\";\n for (const r of nav) {\n if (r.fullPath == null) {\n continue;\n }\n if (r.type !== \"markdown\" && r.type !== \"page\") {\n continue;\n }\n const contentSlug = String(ctx.contentSlug(r.fullPath));\n const rel =\n prefix !== \"\" ? (contentSlug.startsWith(prefix) ? contentSlug.slice(prefix.length) : null) : contentSlug;\n if (rel == null) {\n continue;\n }\n const parts = rel.split(\"/\");\n // Need at least 2 parts (section-slug / page-name) to distinguish\n // a section slug from a bare page slug.\n if (parts.length >= 2 && parts[0] !== \"\") {\n return FernNavigation.slugjoin(scopePrefix, parts[0]!);\n }\n }\n // No child had a multi-segment path past the scope prefix — fall back\n // to the caller's default (bare scope prefix).\n return undefined;\n}\n\n/**\n * Derive the slug for a structural section / apiReference node.\n *\n * When the section has its own routable overview page, that page's `fullPath`\n * (basepath-relative) is the canonical slug — re-prefix the basepath via\n * {@link BuildContext.contentSlug}. When it does NOT (a pure sidebar grouping\n * with no own route), the node still needs a slug for the tree, but\n * `seg.section` is only a structural path string (`release-information`,\n * `develop-with-the-cli/run-airflow-locally`) that does NOT carry the scope\n * prefix.\n *\n * The fallback MUST be rooted at the enclosing scope (`{basepath}/{product}/\n * {version}/…`) rather than just `{basepath}/{section}`. `NodeCollector`'s\n * default-version pruning (`pruneVersionNode` → `toDefaultSlug`) walks the\n * default version subtree and SKIPS a node — and all its descendants — whose\n * slug does not start with the version slug (it assumes such a node was already\n * pruned). A structural section slugged `{basepath}/{section}` does not start\n * with the version slug, so its child pages (e.g. `…/v-1-42/release-notes`)\n * would never be pruned into their clean default-version alias, and the clean\n * URL 404s with `page-not-in-nav` on basepath sites. Rooting the structural\n * slug at the scope prefix keeps the subtree inside the prune window.\n * (ADR-0014 #6.)\n */\nfunction structuralNodeSlug(\n ctx: BuildContext,\n overviewFullPath: string | null | undefined,\n section: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.Slug {\n if (overviewFullPath != null) {\n return ctx.contentSlug(overviewFullPath);\n }\n // No own route: derive a structural slug rooted at the enclosing scope so it\n // stays within the default-version prune window. `scopePrefix` is already\n // basepath-absolute (it is the version/product/tab node's slug), so join it\n // directly rather than going through `contentSlug` (which would re-prefix\n // the basepath).\n const cleanSection = stripSyntheticSegments(section);\n return cleanSection !== \"\" ? FernNavigation.slugjoin(scopePrefix, cleanSection) : scopePrefix;\n}\n\nfunction stripLeadingScopePrefix(section: string, scopePrefix: FernNavigation.Slug): string {\n const prefix = scopePrefix as string;\n if (prefix === \"\") {\n return section;\n }\n if (section === prefix) {\n return \"\";\n }\n if (section.startsWith(prefix + \"/\")) {\n return section.slice(prefix.length + 1);\n }\n return section;\n}\n\n/** A navigation child annotated with its original position from the V1 tree. */\ninterface AnnotatedChild {\n node: FernNavigation.NavigationChild;\n childIndex: number | undefined;\n}\n\nfunction computeDuplicateSiblingSortBoundaries(\n siblings: ScopedSegment[]\n): Map<ScopedSegment, { lo: number; hi: number }> {\n const result = new Map<ScopedSegment, { lo: number; hi: number }>();\n const byPath = new Map<string, ScopedSegment[]>();\n\n for (const sibling of siblings) {\n if (metaStr(sibling.seg.metadata, \"type\") !== \"section\") {\n continue;\n }\n const group = byPath.get(sibling.seg.section) ?? [];\n group.push(sibling);\n byPath.set(sibling.seg.section, group);\n }\n\n for (const [, group] of byPath) {\n if (group.length <= 1) {\n continue;\n }\n for (let i = 0; i < group.length; i++) {\n result.set(group[i]!, {\n lo: group[i]!.seg.sortOrder,\n hi: i + 1 < group.length ? group[i + 1]!.seg.sortOrder : Number.MAX_SAFE_INTEGER\n });\n }\n }\n\n return result;\n}\n\n/**\n * Merge leaf children and section children by their original V1 tree position.\n * Leaves carry position via `displaySortOrder` (stored in nav routes), sections\n * carry position via `childIndex` in segment metadata. When both have positions,\n * we interleave them in ascending order. When positions are absent (old\n * deployments without childIndex), falls back to `[...leaves, ...sections]`.\n */\nfunction mergeChildrenByPosition(\n ctx: BuildContext,\n nav: NavRoute[],\n sectionChildren: AnnotatedChild[]\n): FernNavigation.NavigationChild[] {\n const leafNodes: Array<{ node: FernNavigation.NavigationChild; pos: number }> = [];\n for (let i = 0; i < nav.length; i++) {\n const route = nav[i]!;\n const node = artifactToNode(ctx, route);\n if (node != null) {\n leafNodes.push({ node, pos: route.displaySortOrder ?? i });\n }\n }\n\n const hasChildIndex = sectionChildren.some((s) => s.childIndex != null);\n if (!hasChildIndex) {\n return [...leafNodes.map((l) => l.node), ...sectionChildren.map((s) => s.node)];\n }\n\n const positioned: Array<{ node: FernNavigation.NavigationChild; pos: number }> = [...leafNodes];\n for (const s of sectionChildren) {\n positioned.push({ node: s.node, pos: s.childIndex ?? Number.MAX_SAFE_INTEGER });\n }\n\n positioned.sort((a, b) => a.pos - b.pos);\n return positioned.map((p) => p.node);\n}\n\nfunction sectionNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n sectionChildren: AnnotatedChild[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.SectionNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav) ?? overviewRouteFromSegmentMeta(seg, nav);\n // Prefer the overview page's actual pageId (which is what V1/V2 use\n // for content-ID dedup), falling back to the segment metadata's\n // overviewPageId. The two can diverge when the publisher writes a\n // section-specific overviewPageId that differs from the page content\n // ID, breaking cross-section canonical-slug dedup.\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n // Strip the leading scope prefix to prevent double-prefixing when the\n // section path already includes the scope (e.g. section=\"2026-02-09\"\n // with scopePrefix=\"2026-02-09\" would produce \"2026-02-09/2026-02-09\").\n const relSection = stripLeadingScopePrefix(seg.section, scopePrefix);\n let slug = structuralNodeSlug(ctx, overview?.fullPath, relSection, scopePrefix);\n\n // When the section path is empty and there is no overview page, the\n // structural slug collapses to the bare scope prefix (the tab slug),\n // losing the section segment that v2 derives from the overview page or\n // the config's urlSlug. Infer it from child page fullPaths instead —\n // but only when the inferred slug does NOT collide with an existing\n // child page slug. A collision causes mutableUpdatePointsTo to clear\n // pointsTo (slug === redirect target), breaking the breadcrumb link.\n // (See the analogous guard on apiReferenceNode.)\n if (relSection === \"\" && overview?.fullPath == null) {\n const inferred = inferSectionSlugFromNav(ctx, nav, scopePrefix);\n if (inferred != null) {\n const inferredStr = String(inferred);\n const collides = nav.some((r) => r.fullPath != null && String(ctx.contentSlug(r.fullPath)) === inferredStr);\n if (!collides) {\n slug = inferred;\n }\n }\n }\n const defaults = withMetadataDefaults({\n id: ctx.nodeId(`section:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n });\n\n return {\n type: \"section\",\n ...defaults,\n collapsed: metaCollapsed(seg.metadata) ?? defaults.collapsed,\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n collapsible: metaBool(seg.metadata, \"collapsible\") ?? (metaCollapsed(seg.metadata) === true ? true : undefined),\n collapsedByDefault:\n metaBool(seg.metadata, \"collapsedByDefault\") ?? (metaCollapsed(seg.metadata) === true ? true : undefined),\n availability: metaAvailability(seg.metadata),\n // Don't read pointsTo from metadata for sections; let\n // mutableUpdatePointsTo compute it via followRedirect so that\n // self-referencing redirects are cleared, matching v2 behavior.\n pointsTo: undefined,\n children: mergeChildrenByPosition(ctx, nav, sectionChildren)\n };\n}\n\n/**\n * Find direct child apiPackage segments of `parentSection`. A direct child has\n * `parentSectionPath(seg.section) === parentSection`, or is an orphaned segment\n * whose nearest existing ancestor is `parentSection`.\n */\nfunction directChildApiPackages(\n parentSection: string,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string\n): ScopedSegment[] {\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n return scopeSegs\n .filter((s) => {\n if (metaStr(s.seg.metadata, \"type\") !== \"apiPackage\") {\n return false;\n }\n if (metaStr(s.seg.metadata, \"apiDefinitionId\") !== apiDefinitionId) {\n return false;\n }\n const parent = parentSectionPath(s.seg.section);\n if (parent === parentSection) {\n return true;\n }\n // Orphaned: parent doesn't exist, adopt if nearest ancestor is parentSection.\n if (!sectionPaths.has(parent)) {\n return nearestExistingAncestor(s.seg.section, sectionPaths) === parentSection;\n }\n return false;\n })\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n}\n\n/**\n * Build the children of an API section (apiReference or apiPackage) by combining\n * the segment's own leaf nodes with nested apiPackage children.\n */\nfunction buildApiChildren(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiPackageChild[] {\n const { seg, nav } = scoped;\n\n // Build leaf nodes from this segment's own nav routes (not descendants).\n // API references can contain normal docs pages and links in addition to\n // endpoint leaves, so include markdown/link artifacts here instead of only\n // API leaf types.\n const leafNodes = positionedApiLeafChildren(ctx, nav, apiDefinitionId);\n\n // Build nested ApiPackageNodes from direct child apiPackage segments.\n let childPackages = directChildApiPackages(seg.section, scopeSegs, apiDefinitionId);\n\n // When multiple API-type segments share the same section path (skipUrlSlug\n // group packages that collapse to their parent's section), children from\n // different groups get mixed together. Scope children to this segment's DFS\n // subtree using sortOrder boundaries to restore correct ownership.\n const samePathApiSiblings = scopeSegs.filter(\n (s) =>\n s.seg.section === seg.section &&\n s.seg.sortOrder !== seg.sortOrder &&\n API_NODE_SEGMENT_TYPES.has(metaStr(s.seg.metadata, \"type\") ?? \"\")\n );\n const hasCollapsedGroups = samePathApiSiblings.length > 0;\n\n if (hasCollapsedGroups && metaStr(seg.metadata, \"type\") !== \"apiReference\") {\n // This is a group package sharing its section with siblings.\n // Only claim children whose sortOrder falls within our DFS subtree.\n const nextSibling = samePathApiSiblings\n .filter((s) => s.seg.sortOrder > seg.sortOrder)\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder)[0];\n const lo = seg.sortOrder;\n const hi = nextSibling?.seg.sortOrder ?? Number.MAX_SAFE_INTEGER;\n childPackages = childPackages.filter((c) => c.seg.sortOrder > lo && c.seg.sortOrder < hi);\n }\n const packageNodes = childPackages.map((child) => ({\n node: apiPackageChildNode(\n ctx,\n child,\n scopeSegs,\n apiDefinitionId,\n scopePrefix\n ) as FernNavigation.ApiPackageChild,\n childIndex: metaNum(child.seg.metadata, \"childIndex\")\n }));\n\n // When collapsed groups are detected at apiReference level, children's\n // childIndex values are relative to different parent groups and cannot be\n // used for interleaving. Fall back to sortOrder (DFS creation order).\n if (hasCollapsedGroups && metaStr(seg.metadata, \"type\") === \"apiReference\") {\n return [...leafNodes, ...packageNodes.map((p, i) => ({ node: p.node, pos: leafNodes.length + i }))]\n .sort((a, b) => a.pos - b.pos)\n .map((p) => p.node);\n }\n\n // Interleave by position when childIndex metadata is available\n const hasChildIndex = packageNodes.some((p) => p.childIndex != null);\n if (!hasChildIndex) {\n return [...leafNodes, ...packageNodes.map((p) => ({ node: p.node, pos: Number.MAX_SAFE_INTEGER }))]\n .sort((a, b) => a.pos - b.pos)\n .map((p) => p.node);\n }\n\n const positioned: Array<{ node: FernNavigation.ApiPackageChild; pos: number }> = [];\n positioned.push(...leafNodes);\n for (const p of packageNodes) {\n positioned.push({ node: p.node, pos: p.childIndex ?? Number.MAX_SAFE_INTEGER });\n }\n\n positioned.sort((a, b) => a.pos - b.pos);\n return positioned.map((p) => p.node);\n}\n\n/**\n * Build an ApiPackageNode from an apiPackage segment, recursively nesting any\n * deeper sub-packages.\n */\nfunction apiPackageChildNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n parentApiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiPackageNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n // Prefer the overview page's actual pageId for content-ID dedup,\n // falling back to segment metadata's overviewPageId (see sectionNode).\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n const apiDefinitionId = metaStr(seg.metadata, \"apiDefinitionId\") ?? parentApiDefinitionId;\n // Use structuralNodeSlug so the package gets its own slug (matching V2)\n // rather than inheriting the first endpoint's path.\n const slug = structuralNodeSlug(\n ctx,\n overview?.fullPath,\n stripLeadingScopePrefix(seg.section, scopePrefix),\n scopePrefix\n );\n\n const children = buildApiChildren(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n\n return {\n type: \"apiPackage\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`api-pkg:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: toViewers(metaStrArr(seg.metadata, \"viewers\")),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n apiDefinitionId: FernNavigation.ApiDefinitionId(apiDefinitionId),\n availability: metaAvailability(seg.metadata),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n // Don't read pointsTo from metadata; let mutableUpdatePointsTo\n // compute it via followRedirect, matching v2 behavior.\n pointsTo: undefined,\n children,\n playground: undefined\n };\n}\n\n/**\n * Merge endpoint nodes that were originally part of an `endpointPair` in the V1\n * tree. The publish transform stamps both artifacts with a shared\n * `endpointPairKey` in their route metadata; this function groups endpoints by\n * that key and reconstructs `EndpointPairNode`s — matching the v2 nav tree\n * structure where stream/non-stream variants share a single page with a toggle.\n */\n/** @internal Exported for testing only. */\nexport function mergeEndpointPairs(\n ctx: BuildContext,\n leafNodes: ApiLeafNode[],\n allNav: NavRoute[]\n): FernNavigation.ApiPackageChild[] {\n // Build a lookup from endpointId → endpointPairKey using route metadata.\n // Only REST routes carry `endpointPairKey`.\n const endpointIdToPairKey = new Map<string, string>();\n for (const route of allNav) {\n if (route.type !== \"rest\") {\n continue;\n }\n const pairKey = metaStr(route.metadata, \"endpointPairKey\");\n const endpointId = metaStr(route.metadata, \"endpointId\");\n if (pairKey != null && endpointId != null) {\n endpointIdToPairKey.set(endpointId, pairKey);\n }\n }\n\n // If no pair keys exist (pre-existing data without the key), return as-is.\n if (endpointIdToPairKey.size === 0) {\n return leafNodes;\n }\n\n const result: FernNavigation.ApiPackageChild[] = [];\n // Track which pair keys we've already merged so we only emit the pair once.\n const mergedPairKeys = new Map<string, number>();\n\n for (const node of leafNodes) {\n if (node.type !== \"endpoint\") {\n result.push(node);\n continue;\n }\n\n const pairKey = endpointIdToPairKey.get(String(node.endpointId));\n if (pairKey == null) {\n result.push(node);\n continue;\n }\n\n const existingIdx = mergedPairKeys.get(pairKey);\n if (existingIdx == null) {\n // First endpoint of the pair — push it and record its position.\n mergedPairKeys.set(pairKey, result.length);\n result.push(node);\n } else {\n // Second endpoint — merge with the first into an EndpointPairNode.\n const first = result[existingIdx];\n if (first == null || first.type !== \"endpoint\") {\n result.push(node);\n continue;\n }\n\n // Determine which is stream and which is non-stream.\n const stream = node.isResponseStream ? node : first;\n const nonStream = node.isResponseStream ? first : node;\n\n // Point the stream endpoint's canonicalSlug to the non-stream slug\n // so the sitemap deduplicates them (matching v2 behavior where the\n // v1→latest migrator's title-disambiguation cache achieves the same).\n stream.canonicalSlug = nonStream.slug;\n\n const pairNode: FernNavigation.EndpointPairNode = {\n id: ctx.nodeId(`endpoint-pair:${pairKey}`),\n type: \"endpointPair\",\n collapsed: undefined,\n stream,\n nonStream\n };\n result[existingIdx] = pairNode;\n }\n }\n\n return result;\n}\n\nfunction apiReferenceNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiReferenceNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n // Prefer the overview page's actual pageId for content-ID dedup,\n // falling back to segment metadata's overviewPageId (see sectionNode).\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n const apiDefinitionId = metaStr(seg.metadata, \"apiDefinitionId\") ?? \"\";\n // Slug: prefer the overview route, else a structural slug rooted at the\n // enclosing scope (so the subtree stays inside the default-version prune\n // window — see {@link structuralNodeSlug}).\n // NOTE: do NOT fall back to nav[0]?.fullPath here. When the apiReference\n // has direct endpoint children (no sub-packages), that would set the\n // apiReference's slug to the first endpoint's slug. Then\n // mutableUpdatePointsTo clears pointsTo (slug === redirect target),\n // breaking the breadcrumb link.\n const slug = structuralNodeSlug(\n ctx,\n overview?.fullPath,\n stripLeadingScopePrefix(seg.section, scopePrefix),\n scopePrefix\n );\n\n const children = buildApiChildren(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n const changelog = attachedApiChangelogNode(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n\n return {\n type: \"apiReference\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`api:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n apiDefinitionId: FernNavigation.ApiDefinitionId(apiDefinitionId),\n availability: metaAvailability(seg.metadata),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n paginated: metaBool(seg.metadata, \"paginated\"),\n showErrors: metaBool(seg.metadata, \"showErrors\"),\n hideTitle: metaBool(seg.metadata, \"hideTitle\"),\n // Don't read pointsTo from metadata; let mutableUpdatePointsTo\n // compute it via followRedirect, matching v2 behavior.\n pointsTo: undefined,\n children,\n changelog,\n playground: undefined,\n postmanCollectionUrl: undefined\n };\n}\n\nfunction attachedApiChangelogNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ChangelogNode | undefined {\n const { seg } = scoped;\n const candidates = scopeSegs.filter((candidate) => {\n if (metaStr(candidate.seg.metadata, \"type\") !== \"changelog\") {\n return false;\n }\n return metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId;\n });\n const apiReferenceCount = scopeSegs.filter((candidate) => {\n return (\n metaStr(candidate.seg.metadata, \"type\") === \"apiReference\" &&\n metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId\n );\n }).length;\n const changelogSeg =\n candidates.find((candidate) => parentSectionPath(candidate.seg.section) === seg.section) ??\n (apiReferenceCount === 1 ? candidates[0] : undefined);\n return changelogSeg != null ? changelogNode(ctx, changelogSeg, scopePrefix) : undefined;\n}\n\nfunction hasOwningApiReference(scoped: ScopedSegment, scopeSegs: ScopedSegment[]): boolean {\n const apiDefinitionId = metaStr(scoped.seg.metadata, \"apiDefinitionId\");\n if (apiDefinitionId == null || metaStr(scoped.seg.metadata, \"type\") !== \"changelog\") {\n return false;\n }\n const candidates = scopeSegs.filter((candidate) => {\n if (metaStr(candidate.seg.metadata, \"type\") !== \"apiReference\") {\n return false;\n }\n return metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId;\n });\n return (\n candidates.some((candidate) => parentSectionPath(scoped.seg.section) === candidate.seg.section) ||\n candidates.length === 1\n );\n}\n\n/**\n * True when this segment is an `apiPackage` that will be nested under an in-scope\n * `apiReference` for the same API by {@link buildApiChildren}, and therefore must\n * NOT also be emitted as a standalone root/section node.\n *\n * Without this guard, a skip-slug apiReference (section \"\") leaves its resource\n * subpackages with `parentSectionPath === \"\"`, so they look root-level and get\n * emitted a second time as always-expanded top-level apiReference nodes —\n * duplicating every resource and endpoint in the sidebar (the \"67 apiReference\n * nodes vs 1\" API-reference regression).\n *\n * Reachability mirrors {@link directChildApiPackages}: walk up the section-path\n * chain (hopping to nearestExistingAncestor when a parent section is absent)\n * until we reach an apiReference's section. If no apiReference is an ancestor the\n * package is left where it is, so it can never be dropped.\n */\nfunction isNestedApiPackage(scoped: ScopedSegment, scopeSegs: ScopedSegment[]): boolean {\n if (metaStr(scoped.seg.metadata, \"type\") !== \"apiPackage\") {\n return false;\n }\n const apiDefinitionId = metaStr(scoped.seg.metadata, \"apiDefinitionId\");\n if (apiDefinitionId == null) {\n return false;\n }\n const apiReferenceSections = new Set(\n scopeSegs\n .filter(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"apiReference\" &&\n metaStr(s.seg.metadata, \"apiDefinitionId\") === apiDefinitionId\n )\n .map((s) => s.seg.section)\n );\n if (apiReferenceSections.size === 0) {\n return false;\n }\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n const resolveParent = (section: string): string => {\n const parent = parentSectionPath(section);\n if (parent === \"\" || sectionPaths.has(parent)) {\n return parent;\n }\n return nearestExistingAncestor(section, sectionPaths);\n };\n let current = scoped.seg.section;\n const seen = new Set<string>([current]);\n // Walk up until we hit an owning apiReference (nested → true) or run out.\n for (;;) {\n const parent = resolveParent(current);\n if (apiReferenceSections.has(parent)) {\n return true;\n }\n if (parent === \"\" || seen.has(parent)) {\n return false;\n }\n seen.add(parent);\n current = parent;\n }\n}\n\nfunction changelogNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ChangelogNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n const overviewPageId = overview != null ? metaStr(overview.metadata, \"pageId\") : undefined;\n\n // Group changelog entries by year → month. Entry dates are ISO strings.\n const entries = nav.filter((r) => r.type === \"changelog\");\n const byYear = new Map<number, Map<number, FernNavigation.ChangelogEntryNode[]>>();\n for (const r of entries) {\n const dateStr = metaStr(r.metadata, \"date\");\n const date = dateStr != null ? new Date(dateStr) : new Date(0);\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1;\n const entry: FernNavigation.ChangelogEntryNode = {\n type: \"changelogEntry\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-entry:${r.fullPath ?? metaStr(r.metadata, \"pageId\") ?? \"\"}`),\n title: metaStr(r.metadata, \"title\") ?? \"\",\n slug: ctx.contentSlug(r.fullPath ?? \"\"),\n icon: metaStr(r.metadata, \"icon\"),\n hidden: r.hidden,\n authed: metaBool(r.metadata, \"authed\"),\n viewers: toViewers(metaStrArr(r.metadata, \"viewers\")),\n orphaned: metaBool(r.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(r.metadata)\n }),\n pageId: FernNavigation.PageId(metaStr(r.metadata, \"pageId\") ?? \"\"),\n noindex: metaBool(r.metadata, \"noindex\"),\n date: dateStr ?? \"\",\n tags: metaStrArr(r.metadata, \"tags\")\n };\n let months = byYear.get(year);\n if (months == null) {\n months = new Map();\n byYear.set(year, months);\n }\n const arr = months.get(month) ?? [];\n arr.push(entry);\n months.set(month, arr);\n }\n\n // The publish transform stores changelog section paths in two shapes:\n // • Changelog TABs: \"home/changelog\" (scope prefix baked in)\n // • Changelog sidebar children: \"changelog\" (relative to the tab)\n // `structuralNodeSlug` unconditionally joins `scopePrefix + section`, so\n // an already-scoped section gets double-prefixed (\"home/home/changelog\").\n // Strip the leading scope prefix when present so the join is idempotent.\n const relativeSection = stripLeadingScopePrefix(seg.section, scopePrefix);\n const baseSlug = structuralNodeSlug(ctx, overview?.fullPath, relativeSection, scopePrefix);\n const years: FernNavigation.ChangelogYearNode[] = [...byYear.entries()]\n .sort((a, b) => b[0] - a[0])\n .map(([year, months]) => ({\n type: \"changelogYear\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-year:${baseSlug}/${year}`),\n title: String(year),\n slug: asSlug(`${baseSlug}/${year}`),\n icon: undefined,\n hidden: undefined\n }),\n year,\n children: [...months.entries()]\n .sort((a, b) => b[0] - a[0])\n .map(([month, children]) => ({\n type: \"changelogMonth\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-month:${baseSlug}/${year}/${month}`),\n title: String(month),\n slug: asSlug(`${baseSlug}/${year}/${month}`),\n icon: undefined,\n hidden: undefined\n }),\n month,\n children\n }))\n }));\n\n return {\n type: \"changelog\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`changelog:${baseSlug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug: baseSlug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n children: years\n };\n}\n\n/** The immediate parent section path of a section path (\"a/b/c\" → \"a/b\", \"a\" → \"\"). */\nfunction parentSectionPath(sectionPath: string): string {\n const idx = sectionPath.lastIndexOf(\"/\");\n return idx === -1 ? \"\" : sectionPath.slice(0, idx);\n}\n\n/** Walk up the section path hierarchy to find the nearest ancestor that exists in the set. */\nfunction nearestExistingAncestor(sectionPath: string, existing: Set<string>): string {\n let current = parentSectionPath(sectionPath);\n while (current !== \"\") {\n if (existing.has(current)) {\n return current;\n }\n current = parentSectionPath(current);\n }\n return \"\";\n}\n\n/**\n * Build the section/api/changelog nodes whose immediate parent is `parentPath`,\n * recursing into nested sections. Also picks up orphaned segments whose parent\n * section doesn't exist but whose nearest existing ancestor is `parentPath`.\n */\nfunction buildSectionTree(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n parentPath: string,\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): AnnotatedChild[] {\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n\n // Look up the parent segment's sidebarDepth so we can prevent false\n // adoption of siblings whose slug-derived path happens to create a\n // parent-child hierarchy (e.g. \"sdks\" and \"sdks/checkout\" at depth 1).\n // When multiple segments share parentPath, prefer the shallowest (depth-0)\n // as the authoritative parent — deeper ones are skipUrlSlug children.\n const parentCandidates = scopeSegs.filter((s) => s.seg.section === parentPath);\n const parentSeg =\n parentCandidates.length > 1\n ? parentCandidates.reduce((best, cur) => {\n const bd = metaNum(best.seg.metadata, \"sidebarDepth\") ?? Number.MAX_SAFE_INTEGER;\n const cd = metaNum(cur.seg.metadata, \"sidebarDepth\") ?? Number.MAX_SAFE_INTEGER;\n return cd < bd ? cur : best;\n })\n : parentCandidates[0];\n const parentDepth = parentSeg != null ? metaNum(parentSeg.seg.metadata, \"sidebarDepth\") : undefined;\n\n const direct = scopeSegs\n .filter((s) => {\n const sec = s.seg.section;\n const type = metaStr(s.seg.metadata, \"type\");\n if (sec === \"\" || type === \"tabRoot\") {\n return false;\n }\n if (hasOwningApiReference(s, scopeSegs) || isNestedApiPackage(s, scopeSegs)) {\n return false;\n }\n // Segments marked as sidebar depth 0 are V1 root-level peers and\n // must never be adopted as children of another section.\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n if (depth === 0) {\n return false;\n }\n // SkipUrlSlug children: a segment sharing the parent's exact\n // section path at a deeper level is a child (e.g. Server-side SDKs\n // with sec=\"sdks\" depth=1 under Integration options sec=\"sdks\"\n // depth=0). Exclude the parent segment itself.\n if (sec === parentPath && s !== parentSeg && depth != null && parentDepth != null && depth > parentDepth) {\n return true;\n }\n // Segments at the same (or shallower) depth as the parent are\n // siblings, not children. This prevents false nesting when a\n // skipUrlSlug parent produces multi-segment section paths that\n // look hierarchical (e.g. sections \"sdks\" and \"sdks/checkout\"\n // both at depth 1 are siblings, not parent-child).\n if (parentDepth != null && depth != null && depth <= parentDepth) {\n return false;\n }\n const parent = parentSectionPath(sec);\n if (parent === parentPath) {\n return true;\n }\n // Orphaned segment: parent doesn't exist, walk up to find nearest\n // existing ancestor. If it's parentPath, adopt this segment.\n if (!sectionPaths.has(parent)) {\n return nearestExistingAncestor(sec, sectionPaths) === parentPath;\n }\n // The slug-derived parent exists, but check if it would reject\n // this candidate due to depth constraints (same or shallower\n // depth means siblings, not parent-child). If so, the candidate\n // is effectively orphaned — walk up past the rejecting parent\n // to find the nearest ancestor that CAN adopt it.\n if (depth != null) {\n const pSeg = scopeSegs.find((c) => c.seg.section === parent);\n const pDepth = pSeg != null ? metaNum(pSeg.seg.metadata, \"sidebarDepth\") : undefined;\n if (pDepth != null && depth <= pDepth) {\n return nearestExistingAncestor(parent, sectionPaths) === parentPath;\n }\n }\n return false;\n })\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n\n const siblingBoundaries = computeDuplicateSiblingSortBoundaries(direct);\n\n return direct.map((s) => {\n const type = metaStr(s.seg.metadata, \"type\");\n const childIndex = metaNum(s.seg.metadata, \"childIndex\");\n let node: FernNavigation.NavigationChild;\n if (API_NODE_SEGMENT_TYPES.has(type ?? \"\")) {\n node = apiReferenceNode(ctx, s, scopeSegs, scopePrefix);\n } else if (type === \"changelog\") {\n node = changelogNode(ctx, s, changelogScopePrefix ?? scopePrefix);\n } else {\n // section (or unrecognised) → recurse for nested sections.\n // SkipUrlSlug children share the parent's section path, so\n // recursing with that path would re-find the same children\n // (infinite loop). Their subsections can't be distinguished by\n // path alone, so they get no recursive children — content comes\n // only from their leaf pages.\n const isSkipSlugChild = s.seg.section === parentPath;\n if (isSkipSlugChild) {\n node = sectionNode(ctx, s, [], scopePrefix);\n } else {\n const boundary = siblingBoundaries.get(s);\n const childScopeSegs =\n boundary != null\n ? scopeSegs.filter(\n (candidate) =>\n candidate.seg.sortOrder >= boundary.lo && candidate.seg.sortOrder < boundary.hi\n )\n : scopeSegs;\n node = sectionNode(\n ctx,\n s,\n buildSectionTree(ctx, childScopeSegs, s.seg.section, scopePrefix, changelogScopePrefix),\n scopePrefix\n );\n }\n }\n return { node, childIndex };\n });\n}\n\n// ── build a sidebarRoot for a single scope ─────────────────────────────────\n\n/**\n * When multiple root-level sections share the same section path (common for\n * versioned docs where all tab-level sections receive the version slug as\n * their path), we need to scope buildSectionTree so each section only adopts\n * the child segments that physically belong to it.\n *\n * Ownership is determined by sortOrder ranges: a section owns segments whose\n * sortOrder falls between its own and the next sibling section's sortOrder.\n * Returns a map only for sections that have duplicates; unique sections won't\n * appear (and should pass unfiltered scopeSegs to buildSectionTree).\n */\nfunction computeSiblingSortBoundaries(ordered: ScopedSegment[]): Map<ScopedSegment, { lo: number; hi: number }> {\n const result = new Map<ScopedSegment, { lo: number; hi: number }>();\n\n // Collect root-level sections grouped by their section path.\n // Sections with sec===\"\" (skip-slug sections) are included: when multiple\n // skip-slug sections exist at the root, they share path \"\" and need\n // boundaries so each only adopts its own children.\n const sectionPaths = new Set(ordered.map((s) => s.seg.section));\n const rootSections: ScopedSegment[] = [];\n for (const s of ordered) {\n const type = metaStr(s.seg.metadata, \"type\");\n const sec = s.seg.section;\n if (type !== \"section\") {\n continue;\n }\n if (sec === \"\") {\n rootSections.push(s);\n continue;\n }\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n const parent = parentSectionPath(sec);\n const isRootLevel =\n depth === 0 ||\n parent === \"\" ||\n (!sectionPaths.has(parent) && nearestExistingAncestor(sec, sectionPaths) === \"\");\n if (isRootLevel) {\n rootSections.push(s);\n }\n }\n\n // When a depth-0 section shares its path with a depth>0 section, the\n // deeper one is a skipUrlSlug child — not a true root-level sibling.\n // Remove it from the siblings list so boundaries aren't computed between\n // parent and child (which would give the parent a tiny ownership range).\n const depth0Paths = new Set<string>();\n for (const s of rootSections) {\n if (metaNum(s.seg.metadata, \"sidebarDepth\") === 0) {\n depth0Paths.add(s.seg.section);\n }\n }\n const effectiveRootSections = rootSections.filter((s) => {\n const d = metaNum(s.seg.metadata, \"sidebarDepth\");\n // Keep: depth-0 sections, sections without depth metadata, and\n // sections whose path has no depth-0 owner.\n return d === 0 || d == null || !depth0Paths.has(s.seg.section);\n });\n\n // Group by section path — only paths with >1 section need boundaries.\n const byPath = new Map<string, ScopedSegment[]>();\n for (const s of effectiveRootSections) {\n const group = byPath.get(s.seg.section) ?? [];\n group.push(s);\n byPath.set(s.seg.section, group);\n }\n\n for (const [, siblings] of byPath) {\n if (siblings.length <= 1) {\n continue;\n }\n // Siblings are already in sortOrder (from `ordered`).\n for (let i = 0; i < siblings.length; i++) {\n const lo = siblings[i]!.seg.sortOrder;\n const hi = i + 1 < siblings.length ? siblings[i + 1]!.seg.sortOrder : Number.MAX_SAFE_INTEGER;\n result.set(siblings[i]!, { lo, hi });\n }\n }\n\n return result;\n}\n\n/**\n * Assemble the children of a scope's sidebar root in cross-segment order.\n * `tabRoot` segments contribute their page/link artifacts inline at their\n * sort position; depth-0 `section`/`apiReference`/`changelog` segments become\n * their own nodes (with nested sections attached recursively).\n *\n * Segments whose parent section path doesn't correspond to any existing\n * segment are \"orphaned\" and emitted at the top level. This happens when\n * the publish transform skips segment creation for an apiReference with no\n * direct artifacts (e.g. no overview page), leaving only apiPackage children\n * like `rest-api/store` with no `rest-api` parent segment.\n */\nfunction buildSidebarRootChildren(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootChild[] {\n const ordered = [...scopeSegs].sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n const sectionPaths = new Set(ordered.map((s) => s.seg.section));\n // `pos` is the original V1 child position when known — `displaySortOrder`\n // for root-level loose artifacts, `metadata.childIndex` for depth-0\n // segments. Both index into the SAME child list at write time, so they\n // interleave directly (e.g. [page 0, page 1, section 2…15, page 16, 17]).\n const annotated: Array<{ node: FernNavigation.NavigationChild; pos: number | undefined; isLeaf: boolean }> = [];\n\n // ── Sibling section ownership ────────────────────────────────────────\n //\n // Multiple root-level sections can share the same section path (e.g.\n // three sections all with path equal to the version slug). When this\n // happens, buildSectionTree would incorrectly give ALL child subsections\n // to each sibling. We resolve ownership via sortOrder: a section owns\n // segments whose sortOrder falls between its own and the next sibling's.\n //\n // Computed first because hasRootSection (below) uses it to decide\n // whether bounded skip-slug siblings should activate adoption.\n const siblingBoundaries = computeSiblingSortBoundaries(ordered);\n\n // ── Root-section adoption flow ──────────────────────────────────────\n //\n // A scope may contain a \"root section\" — a segment with type \"section\"\n // and section path \"\". When present, it acts as a structural wrapper:\n //\n // hasRootSection = true\n // │\n // ├─ (A) tabRoot / loose artifacts (sec==\"\", !STRUCTURAL_SEGMENT_TYPES)\n // │ → emit pages/links inline at their displaySortOrder\n // │\n // ├─ (B) the root section itself (sec==\"\", type==\"section\")\n // │ → buildSectionTree adopts nested children (depth > 0)\n // │ → emit one sectionNode wrapping the subtree\n // │\n // └─ (C) depth-0 sections (sidebarDepth==0 or parentSectionPath==\"\")\n // → emit directly as root children (not adopted by B)\n //\n // Without a root section, depth-0 sections are emitted directly.\n //\n // A section with sec==\"\" AND `childIndex` in its metadata is a sibling\n // inside a V1 sidebarGroup that has skipUrlSlug — not a true structural\n // wrapper. `walkNavSubTrees` always passes `childIndex`; direct\n // sidebarRoot children (true wrappers) never receive one.\n //\n // Such siblings only activate adoption when they have sortOrder\n // boundaries (multiple sec=\"\" sections sharing the same path), which\n // correctly scope each section's children. A *single* unbounded\n // skip-slug sibling (e.g. mangopay's \"Introduction\") must NOT adopt\n // its depth-0 peers — doing so produces spurious breadcrumb entries.\n const hasRootSection = ordered.some(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"section\" &&\n s.seg.section === \"\" &&\n (metaNum(s.seg.metadata, \"childIndex\") == null || siblingBoundaries.has(s))\n );\n\n // True when a section with sec=\"\" has NO childIndex — this is a structural\n // root wrapper (not a skip-slug sibling with an index). For old data\n // without sidebarDepth, sections under a true root wrapper should still\n // be adopted; sections alongside skip-slug siblings should not.\n const hasTrueRootWrapper = ordered.some(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"section\" &&\n s.seg.section === \"\" &&\n metaNum(s.seg.metadata, \"childIndex\") == null\n );\n\n // Paths that have a depth-0 section — deeper sections sharing that path\n // are skipUrlSlug children adopted by the depth-0 section, not root peers.\n const depth0SectionPaths = new Set<string>();\n for (const s of ordered) {\n if (metaStr(s.seg.metadata, \"type\") === \"section\" && metaNum(s.seg.metadata, \"sidebarDepth\") === 0) {\n depth0SectionPaths.add(s.seg.section);\n }\n }\n\n for (const s of ordered) {\n const type = metaStr(s.seg.metadata, \"type\");\n const sec = s.seg.section;\n\n if (hasOwningApiReference(s, scopeSegs) || isNestedApiPackage(s, scopeSegs)) {\n continue;\n }\n\n // Skip apiPackage segments that share their section path with an\n // apiReference sibling (skipUrlSlug structural wrappers). Their\n // children are already claimed by the apiReference via DFS ordering.\n if (type === \"apiPackage\") {\n const hasApiRefSibling = ordered.some(\n (sib) => sib.seg.section === sec && metaStr(sib.seg.metadata, \"type\") === \"apiReference\"\n );\n if (hasApiRefSibling) {\n continue;\n }\n }\n\n if (type === \"tabRoot\" && metaBool(s.seg.metadata, \"landingPage\") === true) {\n continue;\n }\n\n // (A) Loose artifacts: tabRoot or non-structural segments at section path \"\".\n // Structural types need their own node builders in (B)/(C) even when\n // their section path is \"\" (which happens with skip-slug: true).\n if (type === \"tabRoot\" || (sec === \"\" && !STRUCTURAL_SEGMENT_TYPES.has(type ?? \"\"))) {\n for (const r of s.nav) {\n const node = artifactToNode(ctx, r);\n if (node != null) {\n annotated.push({ node, pos: r.displaySortOrder ?? undefined, isLeaf: true });\n }\n }\n continue;\n }\n\n // (B) Root section wrapper — adopts depth-0 children via buildSectionTree.\n // Only applies to true root wrappers (no childIndex); sibling\n // sections with skipUrlSlug (have childIndex) fall through to (C).\n // When multiple sections share sec===\"\" (skip-slug), scope children\n // to each section's sortOrder range so subsections aren't duplicated.\n if (type === \"section\" && sec === \"\" && hasRootSection) {\n const bounds = siblingBoundaries.get(s);\n let ownedSegs =\n bounds != null\n ? scopeSegs.filter((seg) => seg.seg.sortOrder >= bounds.lo && seg.seg.sortOrder < bounds.hi)\n : scopeSegs;\n // When there's no true root wrapper (only skip-slug siblings),\n // exclude depth-undefined real-slug sections from adoption —\n // they are peers, not children, and case (C) emits them at\n // root level.\n if (!hasTrueRootWrapper) {\n ownedSegs = ownedSegs.filter((o) => {\n if (o.seg.section === \"\") {\n return true;\n }\n return metaNum(o.seg.metadata, \"sidebarDepth\") != null;\n });\n }\n const sectionChildren = buildSectionTree(ctx, ownedSegs, \"\", scopePrefix, changelogScopePrefix);\n const node = sectionNode(ctx, s, sectionChildren, scopePrefix);\n annotated.push({ node, pos: metaNum(s.seg.metadata, \"childIndex\"), isLeaf: false });\n continue;\n }\n\n // (C) Depth-0 or orphaned sections — emit at root unless already\n // adopted by a root section (B).\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n const parent = parentSectionPath(sec);\n const isRootLevel =\n depth === 0 ||\n parent === \"\" ||\n (!sectionPaths.has(parent) && nearestExistingAncestor(sec, sectionPaths) === \"\");\n // Skip sections already adopted by the root section wrapper (B).\n // Sections with sidebarDepth===0 are true V1 root peers that\n // buildSectionTree now excludes — they must NOT be skipped.\n // Sections with sidebarDepth>0 are nested children that SHOULD\n // be adopted, so they must be skipped to avoid duplication.\n // Sections without sidebarDepth (old data): skip only when a\n // true root wrapper exists (no childIndex on sec=\"\" section).\n // When hasRootSection is caused only by skip-slug siblings\n // (sec=\"\" WITH childIndex), depth-undefined sections are peers\n // that must NOT be skipped (Contentful Optimization SDK case).\n if (isRootLevel && hasRootSection && sec !== \"\" && (depth != null ? depth !== 0 : hasTrueRootWrapper)) {\n continue;\n }\n // Skip depth>0 sections that share their path with a depth-0\n // section — they are skipUrlSlug children adopted via\n // buildSectionTree by the depth-0 owner, not root peers.\n if (isRootLevel && depth != null && depth > 0 && depth0SectionPaths.has(sec)) {\n continue;\n }\n if (isRootLevel) {\n let node: FernNavigation.NavigationChild;\n if (API_NODE_SEGMENT_TYPES.has(type ?? \"\")) {\n node = apiReferenceNode(ctx, s, scopeSegs, scopePrefix);\n } else if (type === \"changelog\") {\n node = changelogNode(ctx, s, changelogScopePrefix ?? scopePrefix);\n } else {\n // Scope child segments to this section's sortOrder range when\n // sibling sections share the same path.\n const bounds = siblingBoundaries.get(s);\n const ownedSegs =\n bounds != null\n ? scopeSegs.filter((seg) => seg.seg.sortOrder >= bounds.lo && seg.seg.sortOrder < bounds.hi)\n : scopeSegs;\n // A section with sec=\"\" that reaches here (not adopted as a\n // root wrapper in case B) is a skipUrlSlug sibling.\n // When sortOrder boundaries exist (multiple sec=\"\" sections),\n // the scoped ownedSegs correctly limits which subsections\n // each section can adopt. When there are NO boundaries\n // (single sec=\"\" section), buildSectionTree(\"\") could\n // re-adopt depth-0 peers. However, when child segments\n // with sidebarDepth > 0 exist, buildSectionTree's\n // depth===0 filter already excludes peers — so adoption\n // is safe and necessary to preserve the parent hierarchy.\n const isUnboundedSkipSlugSibling =\n sec === \"\" && metaNum(s.seg.metadata, \"childIndex\") != null && bounds == null;\n const hasDepthMarkedChildren =\n isUnboundedSkipSlugSibling &&\n ownedSegs.some((candidate) => {\n const d = metaNum(candidate.seg.metadata, \"sidebarDepth\");\n return d != null && d > 0 && parentSectionPath(candidate.seg.section) === sec;\n });\n const sectionChildren =\n isUnboundedSkipSlugSibling && !hasDepthMarkedChildren\n ? []\n : buildSectionTree(ctx, ownedSegs, sec, scopePrefix, changelogScopePrefix);\n node = sectionNode(ctx, s, sectionChildren, scopePrefix);\n }\n // Shared/merged sections (paths not rooted in scopePrefix) must not\n // carry childIndex — their source-version positions would sort them\n // ahead of native sections. Only applies when sibling sections exist\n // (multiple sections sharing same path), indicating a versioned site\n // where shared sections were merged from a sibling version.\n const isSharedSection =\n siblingBoundaries.size > 0 && scopePrefix !== \"\" && sec !== \"\" && !sec.startsWith(scopePrefix);\n annotated.push({\n node,\n pos: isSharedSection ? undefined : metaNum(s.seg.metadata, \"childIndex\"),\n isLeaf: false\n });\n }\n }\n\n // Interleave by V1 position only when BOTH leaves and segments carry one.\n // Manifests written before displaySortOrder was carried through have\n // position-less leaves; reordering on childIndex alone would move every\n // loose page behind its sibling sections, so those keep the legacy\n // (segment-sortOrder) order. The seq tiebreak preserves legacy order for\n // equal or missing positions.\n const hasLeafPos = annotated.some((a) => a.isLeaf && a.pos != null);\n const hasSegmentPos = annotated.some((a) => !a.isLeaf && a.pos != null);\n const flat =\n hasLeafPos && hasSegmentPos\n ? annotated\n .map((a, seq) => ({ ...a, seq }))\n .sort(\n (x, y) =>\n (x.pos ?? Number.MAX_SAFE_INTEGER) - (y.pos ?? Number.MAX_SAFE_INTEGER) ||\n // When positions tie, prefer structural nodes (sections) over\n // leaves (pages). This handles stale tabRoot nav entries whose\n // displaySortOrder wasn't updated due to content-addressing\n // (the segment hash doesn't include childPosition).\n (x.isLeaf === y.isLeaf ? 0 : x.isLeaf ? 1 : -1) ||\n x.seq - y.seq\n )\n .map((a) => a.node)\n : annotated.map((a) => a.node);\n\n return groupSidebarRootChildren(ctx, flat);\n}\n\n/**\n * `SidebarRootChild` only permits SidebarGroupNode / ApiReferenceNode /\n * SectionNode / VariantedNode. Sections, apiReferences, and varianted nodes\n * pass through as direct root children (rendered as static headings via\n * SidebarRootSectionNode / SidebarRootApiPackageNode — always expanded, no\n * toggle). Pages, links, and changelogs are wrapped into a SidebarGroupNode\n * so they render via SidebarNavigationChild (mirroring the V1 tree structure\n * where sections are always direct SidebarRootChildren).\n */\nfunction groupSidebarRootChildren(\n ctx: BuildContext,\n children: FernNavigation.NavigationChild[]\n): FernNavigation.SidebarRootChild[] {\n const out: FernNavigation.SidebarRootChild[] = [];\n let run: FernNavigation.NavigationChild[] = [];\n\n const flushRun = () => {\n if (run.length > 0) {\n // Key off the first child's (already-stable) id so the group id is\n // stable across builds and unique per run.\n out.push({\n type: \"sidebarGroup\",\n id: ctx.nodeId(`sidebar-group:${run[0]?.id ?? \"\"}`),\n collapsed: undefined,\n children: run\n });\n run = [];\n }\n };\n\n for (const child of children) {\n if (child.type === \"apiReference\" || child.type === \"varianted\") {\n flushRun();\n out.push(child);\n } else if (child.type === \"section\" && child.collapsed == null && !child.collapsible) {\n // Match the CLI's DocsDefinitionResolver.toSidebarRootNode: only\n // sections WITHOUT an explicit `collapsed` key become direct\n // SidebarRootChildren (rendered via SidebarRootSectionNode — a\n // static heading with hoisted children). Any explicit `collapsed`\n // value (true, false, or \"open-by-default\") marks the section as\n // collapsible, so it stays in a sidebarGroup and renders as a\n // level-1 collapsible row. Sections with `collapsible: true` also\n // stay grouped (V2 NavigationConfigConverter parity).\n flushRun();\n out.push(child);\n } else {\n run.push(child);\n }\n }\n flushRun();\n return out;\n}\n\nfunction buildSidebarRoot(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootNode {\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\",\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: buildSidebarRootChildren(ctx, scopeSegs, scopePrefix, changelogScopePrefix)\n };\n}\n\n// ── public entrypoint ───────────────────────────────────────────────────────\n\n/**\n * Build a full (un-pruned) `RootNode` from the decomposed ledger model.\n */\nexport function buildFullRootFromSegments(options: BuildRootOptions): FernNavigation.RootNode {\n const { basePath, rootSlug: sourceRootSlug, title, segments, navBySegment, skipSharedSectionMerge } = options;\n // Per-call state — never shared across concurrent builds.\n const ctx = createBuildContext(basePath);\n\n const scoped: ScopedSegment[] = segments\n // Infrastructure segments (files/redirects) are filtered server-side,\n // but guard here too.\n .filter((seg) => {\n const t = metaStr(seg.metadata, \"type\");\n return !INFRA_SEGMENT_TYPES.has(t ?? \"\");\n })\n .map((seg) => ({ seg, nav: navBySegment.get(seg.segmentHash) ?? [] }));\n\n const rootSlug = asSlug(sourceRootSlug ?? basePath);\n\n // Group by scope identity.\n const scopesByKey = new Map<string, ScopedSegment[]>();\n for (const s of scoped) {\n const key = scopeKey(s.seg);\n const arr = scopesByKey.get(key) ?? [];\n arr.push(s);\n scopesByKey.set(key, arr);\n }\n\n const products = uniqueDetails(scoped, \"product\");\n const versions = uniqueDetails(scoped, \"version\");\n const tabs = uniqueDetails(scoped, \"tab\");\n\n let child: FernNavigation.RootChild;\n\n if (products.length > 0) {\n child = buildProductGroup(ctx, products, scoped, rootSlug, skipSharedSectionMerge);\n } else if (versions.length > 0) {\n child = buildVersioned(ctx, versions, scoped, rootSlug, undefined, skipSharedSectionMerge);\n } else {\n child = buildUnversioned(ctx, scoped, rootSlug, tabs.length > 0);\n }\n\n // Derive root.pointsTo from the default child's metadata so root-slug\n // visits redirect correctly even when mutableUpdatePointsTo is skipped\n // (structure-only roots). On the full root mutableUpdatePointsTo\n // recomputes this via tree traversal; this seed value is only visible\n // on structure-only roots where the traversal is intentionally skipped.\n let rootPointsTo: FernNavigation.Slug | undefined;\n if (child.type === \"productgroup\") {\n if (child.landingPage != null && !child.landingPage.hidden) {\n rootPointsTo = child.landingPage.slug;\n } else {\n const defaultProduct = child.children.find((p) => p.default) ?? child.children[0];\n rootPointsTo = defaultProduct?.type === \"product\" ? defaultProduct.pointsTo : undefined;\n }\n } else if (child.type === \"versioned\") {\n const defaultVersion = child.children.find((v) => v.default) ?? child.children[0];\n rootPointsTo = defaultVersion?.pointsTo;\n } else if (child.type === \"unversioned\") {\n // Landing pages take priority: when the unversioned child has a\n // visible landing page the root should redirect there, not to the\n // first tab's content page.\n if (child.landingPage != null && !child.landingPage.hidden) {\n rootPointsTo = child.landingPage.slug;\n } else if (tabs.length > 0) {\n const firstTab = tabs[0];\n const pt = firstTab != null ? metaStr(firstTab.metadata, \"pointsTo\") : undefined;\n rootPointsTo = pt != null ? pointsToSlug(pt) : undefined;\n } else {\n const sorted = [...scoped].sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n for (const s of sorted) {\n if (s.seg.hidden) {\n continue;\n }\n const pt = metaStr(s.seg.metadata, \"pointsTo\");\n if (pt != null) {\n rootPointsTo = pointsToSlug(pt);\n break;\n }\n }\n }\n }\n\n const root: FernNavigation.RootNode = {\n type: \"root\",\n version: \"v2\",\n ...withMetadataDefaults({ id: ctx.nodeId(\"root\"), title, slug: rootSlug, icon: undefined, hidden: undefined }),\n roles: undefined,\n pointsTo: rootPointsTo,\n child\n };\n\n return root;\n}\n\n// ── scaffolding builders ────────────────────────────────────────────────────\n\n/**\n * Collapse segment details by identity.\n *\n * Primary key is the detail's slug when non-empty — this deduplicates\n * stale rows from old publishes that share the same slug but have\n * different DB ids. When the slug is empty (skip-slug items) we fall\n * back to `detail.id` so that distinct skip-slug tabs/products aren't\n * collapsed into a single entry.\n *\n * Tabs always key by `d.id` because skip-slug tabs inherit their\n * parent's slug (e.g. the version slug \"v-2\"), so multiple distinct\n * tabs share the same slug — keying by slug would collapse them.\n *\n * Among duplicates at the same key we prefer the one whose metadata\n * carries a `pointsTo` value (richer / more recent publish).\n */\nfunction uniqueDetails(scoped: ScopedSegment[], dim: \"product\" | \"version\" | \"variant\" | \"tab\"): SegmentDetail[] {\n const byKey = new Map<string, SegmentDetail>();\n for (const s of scoped) {\n const d = s.seg[dim];\n if (d == null) {\n continue;\n }\n const slug = detailSlug(d);\n // Tabs always key by id: skip-slug tabs share the parent slug\n // (e.g. \"v-2\") and would otherwise collapse into one entry.\n const key = dim === \"tab\" ? d.id : slug !== \"\" ? slug : d.id;\n const existing = byKey.get(key);\n if (existing == null) {\n byKey.set(key, d);\n } else if (metaStr(d.metadata, \"pointsTo\") != null && metaStr(existing.metadata, \"pointsTo\") == null) {\n byKey.set(key, d);\n }\n }\n return [...byKey.values()].sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\nfunction scopeSlugPrefix(rootSlug: FernNavigation.Slug, ...details: (SegmentDetail | null | undefined)[]): string {\n const parts: string[] = [rootSlug];\n for (const d of details) {\n if (d != null && !detailIsDefault(d)) {\n const s = detailSlug(d);\n if (s !== \"\") {\n parts.push(s);\n }\n }\n }\n return FernNavigation.slugjoin(...parts);\n}\n\n/**\n * Build a VariantedNode from variant details, grouping segments by variant\n * so each variant gets its own scoped sidebar children.\n */\nfunction buildVariantedNode(\n ctx: BuildContext,\n variants: SegmentDetail[],\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.VariantedNode {\n const variantChildren: FernNavigation.VariantNode[] = variants.map((variant) => {\n const variantSegs = scopeSegs.filter((s) => s.seg.variant?.id === variant.id);\n // V2 never elides variant slugs — they always appear in the URL\n // (unlike product/version defaults which ARE elided). Use the\n // variant's individual slug directly instead of scopeSlugPrefix\n // which skips default details.\n const variantIndividualSlug = detailSlug(variant);\n const variantSlug =\n variantIndividualSlug !== \"\"\n ? asSlug(FernNavigation.slugjoin(scopePrefix, variantIndividualSlug))\n : scopePrefix;\n const metaPointsTo = metaStr(variant.metadata, \"pointsTo\");\n\n const children = buildSidebarRootChildren(ctx, variantSegs, variantSlug);\n\n return {\n type: \"variant\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`variant:${variantSlug}`),\n title: variant.displayName,\n slug: variantSlug,\n icon: variant.icon ?? undefined,\n hidden: variant.hidden,\n viewers: toViewers(variant.viewers)\n }),\n default: detailIsDefault(variant),\n variantId: FernNavigation.VariantId(String(variant.id)),\n subtitle: metaStr(variant.metadata, \"subtitle\") ?? undefined,\n image:\n metaStr(variant.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(variant.metadata, \"image\")!)\n : undefined,\n pointsTo: metaPointsTo != null ? pointsToSlug(metaPointsTo) : undefined,\n children: children as FernNavigation.VariantChild[]\n };\n });\n\n return {\n type: \"varianted\",\n id: ctx.nodeId(`varianted:${scopeSegs[0] != null ? scopeKey(scopeSegs[0].seg) : \"root\"}`),\n collapsed: undefined,\n children: variantChildren\n };\n}\n\n/**\n * Build a sidebar root, wrapping content in a VariantedNode when variants exist.\n * Without this, all variant segments merge into one flat sidebar — causing the\n * \"double sidebar\" where both variants' nav entries render simultaneously.\n */\nfunction buildSidebarRootWithVariants(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootNode {\n const variants = uniqueDetails(scopeSegs, \"variant\");\n if (variants.length <= 1) {\n return buildSidebarRoot(ctx, scopeSegs, scopePrefix, changelogScopePrefix);\n }\n\n const sharedSegs = scopeSegs.filter((s) => s.seg.variant == null);\n const variantedNode = buildVariantedNode(ctx, variants, scopeSegs, scopePrefix);\n const sharedChildren: FernNavigation.SidebarRootChild[] =\n sharedSegs.length > 0 ? buildSidebarRootChildren(ctx, sharedSegs, scopePrefix, changelogScopePrefix) : [];\n\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\",\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: [...sharedChildren, variantedNode]\n };\n}\n\nfunction buildTabbedOrSidebar(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n tabsPresent: boolean,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.SidebarRootNode | FernNavigation.TabbedNode | FernNavigation.VariantedNode {\n if (!tabsPresent) {\n // When no tabs exist but variants do, wrap variant-scoped segments\n // in a VariantedNode and include non-variant segments alongside it.\n const variants = uniqueDetails(scopeSegs, \"variant\");\n if (variants.length > 1) {\n const sharedSegs = scopeSegs.filter((s) => s.seg.variant == null);\n const variantedNode = buildVariantedNode(ctx, variants, scopeSegs, scopePrefix);\n if (sharedSegs.length > 0) {\n const sharedChildren = buildSidebarRootChildren(ctx, sharedSegs, scopePrefix);\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\" as const,\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: [...sharedChildren, variantedNode]\n };\n }\n return variantedNode;\n }\n return buildSidebarRoot(ctx, scopeSegs, scopePrefix);\n }\n // Group this scope's segments by tab.\n const tabDetails = uniqueDetails(scopeSegs, \"tab\");\n const children: FernNavigation.TabChild[] = tabDetails.map((tab): FernNavigation.TabChild => {\n const tabType = metaStr(tab.metadata, \"tab_type\");\n // The tab slug ACCUMULATES the enclosing scope prefix (basepath/product/\n // version) and appends the tab segment, mirroring the canonical V1->V2\n // converter (`SlugGenerator.apply`, which appends the tab onto the\n // version/product slug). Rooting at the empty slug instead would drop\n // the product/version prefix, breaking parity with v2's tab/breadcrumb\n // slugs AND breaking default-version elision: the tab node's slug would\n // not start with the version slug, so `toDefaultSlug` (the prune window)\n // would skip it. Because `scopePrefix` already carries the FULL version\n // segment, `{...}/{version}/{tab}` still starts with the version slug and\n // stays inside the prune window (see {@link structuralNodeSlug}).\n // V2's SlugGenerator.set() treats a tab slug that starts with the\n // version slug as a fullSlug (absolute path) and uses it as-is.\n // Without this check, scopeSlugPrefix joins version + tab producing\n // a doubled prefix (e.g. \"2026-02-09/2026-02-09\").\n const rawTabSlug = detailSlug(tab);\n const versionDetail = scopeSegs[0]?.seg.version;\n const versionSlugStr = versionDetail != null ? detailSlug(versionDetail) : undefined;\n const tabSlug =\n versionSlugStr != null &&\n rawTabSlug !== \"\" &&\n (rawTabSlug === versionSlugStr || rawTabSlug.startsWith(versionSlugStr + \"/\"))\n ? asSlug(rawTabSlug)\n : asSlug(scopeSlugPrefix(scopePrefix, tab));\n\n if (tabType === \"link\") {\n return {\n type: \"link\",\n id: ctx.nodeId(`link:${metaStr(tab.metadata, \"url\") ?? tabSlug}`),\n collapsed: undefined,\n title: tab.displayName,\n icon: tab.icon ?? undefined,\n url: FernNavigation.Url(metaStr(tab.metadata, \"url\") ?? \"\"),\n target: metaStr(tab.metadata, \"target\") as FernNavigation.LinkNode[\"target\"]\n };\n }\n\n if (tabType === \"changelog\") {\n const tabSegs = scopeSegs.filter((s) => s.seg.tab?.id === tab.id);\n const changelogSeg = tabSegs.find((s) => metaStr(s.seg.metadata, \"type\") === \"changelog\");\n if (changelogSeg != null) {\n // Root the changelog at the TAB slug (`tabSlug`), not the bare\n // scope prefix. Tab-level changelogs have an empty section path\n // (the publish transform strips the tab segment because\n // `extractSlugSegment(tabSlug, tabSlug) === \"\"`), so\n // `structuralNodeSlug(ctx, null, \"\", scopePrefix)` collapses to\n // just the scope prefix — which is the product/version slug.\n // That slug collision causes the changelog node to replace the\n // product node in NodeCollector's slug map, breaking structural\n // redirects (the product slug renders changelog content instead\n // of redirecting to the first docs page). Passing `tabSlug`\n // yields the correct `{...}/{changelog}` structural slug.\n return changelogNode(ctx, changelogSeg, tabSlug);\n }\n // Fallback: empty changelog node for the tab\n return {\n type: \"changelog\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`changelog:${tabSlug}`),\n title: tab.displayName,\n slug: tabSlug,\n icon: tab.icon ?? undefined,\n hidden: tab.hidden,\n viewers: toViewers(tab.viewers)\n }),\n overviewPageId: undefined,\n noindex: undefined,\n children: []\n };\n }\n\n // Default: regular tab\n const tabSegs = scopeSegs.filter((s) => s.seg.tab?.id === tab.id);\n const metaPointsTo = metaStr(tab.metadata, \"pointsTo\");\n return {\n type: \"tab\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`tab:${tabSlug}`),\n title: tab.displayName,\n slug: tabSlug,\n icon: tab.icon ?? undefined,\n hidden: tab.hidden,\n viewers: toViewers(tab.viewers)\n }),\n pointsTo: metaPointsTo != null ? pointsToSlug(metaPointsTo) : undefined,\n // Structural sections under this tab are rooted at the TAB slug\n // (`{...}/{version}/{tab}`) so their slugs nest under the tab\n // (matching v2) while still starting with the version slug, keeping\n // the subtree inside the default-version prune window (see\n // {@link structuralNodeSlug}).\n // Changelog sidebar children use the product/version prefix — v2\n // roots changelogs at the scope level, not under the tab.\n child: buildSidebarRootWithVariants(ctx, tabSegs, tabSlug, scopePrefix)\n };\n });\n const first = scopeSegs[0];\n return {\n type: \"tabbed\",\n id: ctx.nodeId(`tabbed:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children\n };\n}\n\nfunction buildUnversioned(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n tabsPresent: boolean\n): FernNavigation.UnversionedNode {\n const first = scopeSegs[0];\n const node: FernNavigation.UnversionedNode = {\n type: \"unversioned\",\n id: ctx.nodeId(`unversioned:${first?.seg.product?.id ?? \"root\"}`),\n collapsed: undefined,\n landingPage: buildLandingPage(ctx, scopeSegs),\n // The enclosing scope prefix (product slug, or rootSlug at the top\n // level) roots structural sections so they share the scope's slug\n // namespace.\n child: buildTabbedOrSidebar(ctx, scopeSegs, tabsPresent, scopePrefix)\n };\n // Within-scope dedup for unversioned sites: collapse duplicate pages\n // that appear under multiple parent sections.\n markWithinScopeCanonicalSlugs(node);\n return node;\n}\n\n/**\n * Merge shared (tab-level) sections from sibling versions into the default\n * version's segment list. A section is considered \"shared\" when its section\n * path does NOT start with any version slug — indicating it was authored at\n * the tab level and the publish transform assigned it to only one version.\n */\nfunction mergeSharedSections(\n defaultSegs: ScopedSegment[],\n allScoped: ScopedSegment[],\n defaultVersion: SegmentDetail,\n versionSlugs: string[]\n): ScopedSegment[] {\n // Build a map of the default version's tabs by displayName for\n // cross-version matching. Tab slugs can't be used because the \"default\"\n // tab's slug equals the version slug (e.g. \"2026-02-09\" vs \"2025-04-21\"\n // for the same logical \"Documentation\" tab across versions).\n const defaultTabsByName = new Map<string, SegmentDetail>();\n for (const s of defaultSegs) {\n if (s.seg.tab != null) {\n const tabName = s.seg.tab.displayName;\n if (!defaultTabsByName.has(tabName)) {\n defaultTabsByName.set(tabName, s.seg.tab);\n }\n }\n }\n\n // Collect section paths already present in the default version.\n const existingSections = new Set(\n defaultSegs.filter((s) => metaStr(s.seg.metadata, \"type\") === \"section\").map((s) => s.seg.section)\n );\n\n // Merged sections must sort AFTER all native default segments so they\n // appear in a trailing sidebarGroup (after non-collapsible sections like\n // \"Getting Started\", \"Dev Tools\", \"Capabilities\") matching v2 ordering.\n const maxSortOrder = defaultSegs.reduce((max, s) => Math.max(max, s.seg.sortOrder), 0);\n let nextSortOrder = maxSortOrder + 1;\n\n const merged = [...defaultSegs];\n for (const s of allScoped) {\n if (s.seg.version?.id === defaultVersion.id) {\n continue;\n }\n const type = metaStr(s.seg.metadata, \"type\");\n if (type !== \"section\") {\n continue;\n }\n const sectionPath = s.seg.section;\n // Skip version-specific sections (path starts with a version slug).\n if (versionSlugs.some((vs) => sectionPath === vs || sectionPath.startsWith(vs + \"/\"))) {\n continue;\n }\n // Skip if the default version already has this section.\n if (existingSections.has(sectionPath)) {\n continue;\n }\n // Match the source tab to the default version's corresponding tab\n // by displayName (tab slugs differ across versions for the default tab).\n const sourceTabName = s.seg.tab?.displayName ?? \"\";\n const targetTab = defaultTabsByName.get(sourceTabName);\n if (targetTab == null) {\n continue;\n }\n // Re-map the segment's tab and version to the default version's.\n // Strip childIndex from metadata so merged sections don't sort before\n // native sections in the annotated interleave step, and assign a\n // sortOrder after all native segments to place them in the trailing\n // sidebarGroup.\n const metadata = s.seg.metadata != null ? { ...s.seg.metadata, childIndex: undefined } : s.seg.metadata;\n merged.push({\n seg: {\n ...s.seg,\n tab: targetTab,\n version: defaultVersion,\n sortOrder: nextSortOrder++,\n metadata\n },\n nav: s.nav\n });\n existingSections.add(sectionPath);\n }\n return merged;\n}\n\nfunction buildVersioned(\n ctx: BuildContext,\n versions: SegmentDetail[],\n scoped: ScopedSegment[],\n rootSlug: FernNavigation.Slug,\n productPrefix: string | undefined,\n skipSharedSectionMerge?: boolean\n): FernNavigation.VersionedNode {\n // Collect version slugs for detecting version-prefixed section paths.\n const versionSlugs = versions.map((v) => detailSlug(v)).filter((s) => s !== \"\");\n\n const children: FernNavigation.VersionNode[] = versions.map((version) => {\n let versionSegs = scoped.filter((s) => s.seg.version?.id === version.id);\n\n // Merge shared tab-level sections from sibling versions into the\n // default version. The publish transform may assign tab-level content\n // (sections without a version-prefixed path) to a single version;\n // v2's monolith root includes them in every version's sidebar.\n // Skipped for scoped roots: the scoped root only loads nav for a\n // single route's scope, so merged sections carry the source version's\n // fullPaths into the default tree, creating duplicate slugs that\n // orphan the real version's pages in NodeCollector.\n if (detailIsDefault(version) && !skipSharedSectionMerge) {\n versionSegs = mergeSharedSections(versionSegs, scoped, version, versionSlugs);\n }\n const tabsPresent = uniqueDetails(versionSegs, \"tab\").length > 0;\n const prefix = productPrefix != null ? productPrefix : (rootSlug as string);\n // The version node always carries its FULL versioned slug\n // (`{basepath}/{product}/{version}`), even when it is the default\n // version. This matches the canonical V1→V2 converter\n // (`SlugGenerator.setVersionSlug`, which never elides the version\n // segment) and is REQUIRED for default-version elision: `NodeCollector`\n // prunes the default version by passing `node.slug` to\n // `toDefaultSlug(pageSlug, productSlug, versionSlug)`, which strips the\n // version segment from each page slug to produce the clean alias\n // (`docs/astro/cli/v-1-42/overview` → `docs/astro/cli/overview`). If the\n // default version's slug were collapsed to the product prefix\n // (`versionSlug === productSlug`), `toDefaultSlug` would be a no-op and\n // the elided slug would never enter the slugMap — so the clean URL 404s\n // with `page-not-in-nav` on basepath (`/docs`) sites. (ADR-0014 #6.)\n //\n // `scopeSlugPrefix(rootSlug, version)` is NOT used here because it joins\n // only the rootSlug + version segment (dropping the product prefix);\n // joining the resolved `prefix` (product prefix, or rootSlug when\n // version-less) with the version's own slug segment yields the correct\n // fully-qualified slug.\n const versionSegment = detailSlug(version);\n const slug = versionSegment !== \"\" ? FernNavigation.slugjoin(asSlug(prefix), versionSegment) : asSlug(prefix);\n const node: FernNavigation.VersionNode = {\n type: \"version\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`version:${slug}`),\n title: version.displayName,\n slug: asSlug(slug),\n icon: version.icon ?? undefined,\n hidden: version.hidden,\n viewers: toViewers(version.viewers)\n }),\n default: detailIsDefault(version),\n versionId: FernNavigation.VersionId(version.id),\n availability: metaAvailability(version.metadata),\n landingPage: buildLandingPage(ctx, versionSegs),\n announcement: metaAnnouncement(version.metadata),\n pointsTo:\n metaStr(version.metadata, \"pointsTo\") != null\n ? pointsToSlug(metaStr(version.metadata, \"pointsTo\")!)\n : undefined,\n // The version's full slug roots structural sections so the whole\n // version subtree stays inside the default-version prune window.\n child: buildTabbedOrSidebar(ctx, versionSegs, tabsPresent, asSlug(slug))\n };\n // Within-version dedup: collapse duplicate pages that appear\n // under multiple parent sections (same endpointId, pageId, etc.).\n // Must run BEFORE markDefaultVersionCanonicalSlugs so the canonical\n // slug is transformed along with the rest of the version's slugs.\n markWithinScopeCanonicalSlugs(node);\n\n if (node.default) {\n markDefaultVersionCanonicalSlugs(node, productPrefix != null ? asSlug(productPrefix) : rootSlug, node.slug);\n }\n return node;\n });\n\n // Cross-version canonical slug deduplication (V2 parity).\n // V2's migrator deduplicates pages across versions using a title-based\n // disambiguation key. Without this, non-default version pages that have\n // a title-equivalent in the default version appear as separate sitemap\n // entries (e.g. `/2024-12-23/evaluation/overview` alongside the default\n // `/evaluation/overview`).\n markCrossVersionCanonicalSlugs(children);\n\n return {\n type: \"versioned\",\n id: ctx.nodeId(`versioned:${productPrefix ?? \"root\"}`),\n collapsed: undefined,\n children\n };\n}\n\nfunction markDefaultVersionCanonicalSlugs(\n node: FernNavigation.VersionNode,\n pruneSlug: FernNavigation.Slug,\n versionSlug: FernNavigation.Slug\n): void {\n FernNavigation.traverseDF(node, (child) => {\n if (FernNavigation.hasMetadata(child)) {\n const canonicalSlug = FernNavigation.toDefaultSlug(\n child.canonicalSlug ?? child.slug,\n pruneSlug,\n versionSlug\n );\n if (canonicalSlug !== child.slug) {\n child.canonicalSlug = canonicalSlug;\n }\n }\n if (FernNavigation.hasRedirect(child)) {\n child.pointsTo = FernNavigation.toDefaultSlug(child.pointsTo, pruneSlug, versionSlug);\n }\n return;\n });\n}\n\n/**\n * Find parents after the innermost version node (unversioned ancestors).\n */\nfunction unversionedParents(\n parents: readonly FernNavigation.NavigationNodeParent[]\n): readonly FernNavigation.NavigationNodeParent[] {\n let versionIdx = -1;\n for (let i = parents.length - 1; i >= 0; i--) {\n if (parents[i]!.type === \"version\") {\n versionIdx = i;\n break;\n }\n }\n return versionIdx >= 0 ? parents.slice(versionIdx + 1) : parents;\n}\n\n/**\n * Build dedup keys for a page node, mirroring V2's `#getAndSetCanonicalSlug`.\n * V2 uses multiple keys per node so ANY match deduplicates:\n * - `pageId` / `overviewPageId` — content-addressable, same across versions\n * - API-specific key (`api:endpoint:METHOD:ID`) — for API leaf nodes\n * - title disambiguation key — structural fallback using parent titles\n */\nfunction crossVersionDedupKeys(\n node: FernNavigation.NavigationNode & FernNavigation.NavigationNodeWithMetadata,\n parents: readonly FernNavigation.NavigationNodeParent[]\n): string[] {\n const keys: string[] = [];\n const uParents = unversionedParents(parents);\n\n // 1. Content-ID key (pageId or overviewPageId)\n const pid = FernNavigation.getPageId(node as FernNavigation.NavigationNodePage);\n if (pid != null) {\n keys.push(`pid:${pid}`);\n }\n\n // 2. API-specific key for endpoints/websockets/webhooks/grpc/graphql\n if (\n node.type === \"endpoint\" ||\n node.type === \"webSocket\" ||\n node.type === \"webhook\" ||\n node.type === \"grpc\" ||\n node.type === \"graphql\"\n ) {\n const apiParentTitles = uParents\n .filter(\n (p): p is FernNavigation.NavigationNodeParent & { type: \"apiReference\" } => p.type === \"apiReference\"\n )\n .map((p) => (p as FernNavigation.NavigationNodeWithMetadata).title.replaceAll(\" \", \"\"));\n const apiPrefix = apiParentTitles.join(\":\");\n\n if (node.type === \"endpoint\") {\n keys.push(`${apiPrefix}:api:endpoint:${node.method}:${node.endpointId}`);\n } else if (node.type === \"webSocket\") {\n keys.push(`${apiPrefix}:api:websocket:${node.webSocketId}`);\n } else if (node.type === \"webhook\") {\n keys.push(`${apiPrefix}:api:webhook:${node.method}:${node.webhookId}`);\n } else if (node.type === \"grpc\") {\n keys.push(`${apiPrefix}:api:grpc:${node.method}:${node.grpcId}`);\n } else if (node.type === \"graphql\") {\n keys.push(`${apiPrefix}:api:graphql:${node.id}`);\n }\n }\n\n // 3. Title disambiguation key (structural fallback)\n const parentTitles: string[] = [];\n for (const p of uParents) {\n if (FernNavigation.hasMetadata(p)) {\n parentTitles.push(p.title);\n }\n }\n keys.push([...parentTitles, node.title].join(\"###\"));\n\n return keys;\n}\n\nfunction routeToLandingPage(\n ctx: BuildContext,\n route: NavRoute | undefined\n): FernNavigation.LandingPageNode | undefined {\n if (route == null || route.type !== \"markdown\" || route.fullPath == null) {\n return undefined;\n }\n const md = route.metadata;\n const pageId = metaStr(md, \"pageId\");\n if (pageId == null) {\n return undefined;\n }\n const slug = ctx.contentSlug(route.fullPath);\n return {\n type: \"landingPage\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`landing:${slug}`),\n title: metaStr(md, \"title\") ?? \"\",\n slug,\n icon: metaStr(md, \"icon\"),\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers: toViewers(metaStrArr(md, \"viewers\")),\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n }),\n pageId: FernNavigation.PageId(pageId),\n noindex: metaBool(md, \"noindex\")\n };\n}\n\n/**\n * Build a LandingPageNode from the explicit landing-page segment emitted by\n * the publish transform. This avoids confusing ordinary loose tabRoot pages\n * with root/product/version landing pages.\n */\nfunction buildLandingPage(ctx: BuildContext, scopeSegs: ScopedSegment[]): FernNavigation.LandingPageNode | undefined {\n const landingSegment = scopeSegs.find(\n (s) => metaStr(s.seg.metadata, \"type\") === \"tabRoot\" && metaBool(s.seg.metadata, \"landingPage\") === true\n );\n return routeToLandingPage(\n ctx,\n landingSegment?.nav.find((route) => route.type === \"markdown\")\n );\n}\n\n/**\n * Map each slug to the content-ID dedup keys of the FIRST page node that owns it\n * (in DFS order). Used to decide whether folding a container (apiPackage with\n * endpoint children) into an ancestor slug is legitimate.\n *\n * A container should only canonicalize up to an ancestor slug when the page that\n * actually renders at that slug shares the container's overview content (same\n * `overviewPageId`/`pageId`) — matching V2, which dedups purely on content keys.\n * When a DIFFERENT page owns the ancestor slug (e.g. BigCommerce: a `section`\n * owns `.../payments` while an apiPackage under it has its own beta overview),\n * folding would point the container at unrelated content, so it must stay a\n * separate sitemap entry.\n */\nfunction buildSlugOwnerContentKeys(roots: FernNavigation.NavigationNode[]): Map<FernNavigation.Slug, Set<string>> {\n const slugOwnerKeys = new Map<FernNavigation.Slug, Set<string>>();\n for (const root of roots) {\n FernNavigation.traverseDF(root, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child) && !slugOwnerKeys.has(child.slug)) {\n slugOwnerKeys.set(child.slug, new Set(crossVersionDedupKeys(child, parents)));\n }\n });\n }\n return slugOwnerKeys;\n}\n\n/** Does the page that owns `canonical` share a content-ID key (`pid:`) with `keys`? */\nfunction canonicalOwnerSharesContent(\n slugOwnerKeys: Map<FernNavigation.Slug, Set<string>>,\n canonical: FernNavigation.Slug,\n keys: string[]\n): boolean {\n const ownerKeys = slugOwnerKeys.get(canonical);\n if (ownerKeys == null) {\n return false;\n }\n return keys.some((key) => key.startsWith(\"pid:\") && ownerKeys.has(key));\n}\n\n/**\n * Within a single version (or unversioned scope), deduplicate pages that\n * share the same content-identity key (endpointId, pageId, etc.).\n * The first occurrence in DFS order becomes canonical; subsequent\n * occurrences get `canonicalSlug` pointing to the first.\n *\n * This mirrors V2's global `#canonicalSlugs` map in v1ToV2.ts, which\n * deduplicates endpoints appearing under multiple parent sections within\n * the same version (e.g. the same endpoint under both\n * `content/store-content/redirects/` and `management/redirects/`).\n */\nfunction markWithinScopeCanonicalSlugs(scopeNode: FernNavigation.VersionNode | FernNavigation.UnversionedNode): void {\n const keyToCanonical = new Map<string, FernNavigation.Slug>();\n const slugOwnerKeys = buildSlugOwnerContentKeys([scopeNode]);\n\n FernNavigation.traverseDF(scopeNode, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const keys = crossVersionDedupKeys(child, parents);\n let matched = false;\n for (const key of keys) {\n const canonical = keyToCanonical.get(key);\n if (canonical != null && canonical !== child.slug) {\n // Skip dedup when the canonical slug is a proper ancestor of the\n // child's slug AND the child is a container (apiPackage with\n // endpoint children) — UNLESS the page that actually owns the\n // ancestor slug shares this child's overview content. V2 folds a\n // container into its parent only when the parent genuinely renders\n // the same overview (contentful: `spaces` -> `content-delivery-api`);\n // it keeps the container separate when a different page owns that\n // slug (BigCommerce: a `section` owns `.../payments`).\n if (\n child.slug.startsWith(canonical + \"/\") &&\n FernNavigation.getChildren(child).length > 0 &&\n !canonicalOwnerSharesContent(slugOwnerKeys, canonical, keys)\n ) {\n continue;\n }\n child.canonicalSlug = canonical;\n matched = true;\n break;\n }\n }\n if (!matched) {\n const slug = child.canonicalSlug ?? child.slug;\n for (const key of keys) {\n if (!keyToCanonical.has(key)) {\n keyToCanonical.set(key, slug);\n }\n }\n }\n }\n });\n}\n\n/**\n * After default-version canonical slugs are marked, propagate them across\n * ALL versions using a global first-come-first-served approach (matching V2).\n * V2's migrator uses a single `#canonicalSlugs` map across the entire tree,\n * so the first version to register a key wins. This deduplicates pages both\n * default→non-default AND across non-default versions (e.g. v2025-04-21\n * and v2024-12-23 sharing the same pageId).\n */\nfunction markCrossVersionCanonicalSlugs(versionNodes: FernNavigation.VersionNode[]): void {\n const keyToCanonical = new Map<string, FernNavigation.Slug>();\n\n // Process versions in order (default first, then non-default in tree order).\n // The first version to register a key wins — matching V2's DFS traversal\n // which processes the default version before others.\n const sorted = [...versionNodes].sort((a, b) => {\n if (a.default !== b.default) {\n return a.default ? -1 : 1;\n }\n return 0;\n });\n const slugOwnerKeys = buildSlugOwnerContentKeys(sorted);\n\n for (const version of sorted) {\n FernNavigation.traverseDF(version, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const keys = crossVersionDedupKeys(child, parents);\n let matched = false;\n for (const key of keys) {\n const canonical = keyToCanonical.get(key);\n if (canonical != null && !version.default) {\n // Skip dedup when the canonical slug is a proper ancestor of the\n // child's slug AND the child is a container — UNLESS the page that\n // owns the ancestor slug shares this child's overview content (see\n // markWithinScopeCanonicalSlugs for the contentful/BigCommerce cases).\n if (\n child.slug.startsWith(canonical + \"/\") &&\n FernNavigation.getChildren(child).length > 0 &&\n !canonicalOwnerSharesContent(slugOwnerKeys, canonical, keys)\n ) {\n continue;\n }\n child.canonicalSlug = canonical;\n matched = true;\n break;\n }\n }\n if (!matched) {\n const canonical = child.canonicalSlug ?? child.slug;\n for (const key of keys) {\n if (!keyToCanonical.has(key)) {\n keyToCanonical.set(key, canonical);\n }\n }\n }\n }\n });\n }\n}\n\nfunction buildProductGroup(\n ctx: BuildContext,\n products: SegmentDetail[],\n scoped: ScopedSegment[],\n rootSlug: FernNavigation.Slug,\n skipSharedSectionMerge?: boolean\n): FernNavigation.ProductGroupNode {\n const children: FernNavigation.ProductNode[] = products.map((product) => {\n // External product link — no child navigation, just a URL.\n const href = metaStr(product.metadata, \"href\");\n if (href != null) {\n return {\n type: \"productLink\" as const,\n id: ctx.nodeId(`productLink:${href}`),\n collapsed: undefined,\n default: detailIsDefault(product),\n productId: FernNavigation.ProductId(product.displayName),\n title: product.displayName,\n href: FernNavigation.Url(href),\n target: (metaStr(product.metadata, \"target\") ?? undefined) as\n | FernNavigation.ExternalProductNode[\"target\"]\n | undefined,\n subtitle: metaStr(product.metadata, \"subtitle\") ?? \"\",\n icon: product.icon ?? undefined,\n image:\n metaStr(product.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(product.metadata, \"image\")!)\n : undefined,\n hidden: product.hidden,\n authed: undefined,\n viewers: toViewers(product.viewers),\n orphaned: product.orphaned,\n featureFlags: undefined\n } satisfies FernNavigation.ExternalProductNode;\n }\n\n const productSegs = scoped.filter((s) => s.seg.product?.id === product.id);\n const versions = uniqueDetails(productSegs, \"version\");\n const tabsPresent = uniqueDetails(productSegs, \"tab\").length > 0;\n const productPrefix = scopeSlugPrefix(rootSlug, product);\n\n // ProductChild is VersionedNode | UnversionedNode — a version-less\n // product wraps its sidebar/tabs in an UnversionedNode.\n const productChild: FernNavigation.ProductChild =\n versions.length > 0\n ? buildVersioned(ctx, versions, productSegs, rootSlug, productPrefix, skipSharedSectionMerge)\n : buildUnversioned(ctx, productSegs, asSlug(productPrefix), tabsPresent);\n\n const node: FernNavigation.InternalProductNode = {\n type: \"product\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`product:${productPrefix}`),\n title: product.displayName,\n slug: asSlug(detailIsDefault(product) ? (rootSlug as string) : productPrefix),\n icon: product.icon ?? undefined,\n hidden: product.hidden,\n viewers: toViewers(product.viewers)\n }),\n default: detailIsDefault(product),\n // `product.id` is the content-addressed STORAGE hash (the segment\n // key). `productId` is the SEMANTIC identifier search/UI key off\n // (the product-scoped search filter does `product.title:${productId}`,\n // so it must equal the product title). v2 carries the display name\n // here; sourcing it from the hash makes that filter match nothing.\n productId: FernNavigation.ProductId(product.displayName),\n subtitle: metaStr(product.metadata, \"subtitle\") ?? \"\",\n image:\n metaStr(product.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(product.metadata, \"image\")!)\n : undefined,\n announcement: metaAnnouncement(product.metadata),\n pointsTo:\n metaStr(product.metadata, \"pointsTo\") != null\n ? pointsToSlug(metaStr(product.metadata, \"pointsTo\")!)\n : undefined,\n child: productChild\n };\n return node;\n });\n\n // Cross-product canonical slug deduplication (V2 parity).\n // V2's migrator deduplicates pages across products via a global pageId map:\n // the first product to register a pageId wins, and subsequent products'\n // pages with the same pageId receive a canonicalSlug pointing to the\n // canonical (default-product) page. Without this, shared content that is\n // materialized under every product scope (e.g. merge-api-basics pages)\n // appears as separate sitemap entries per product.\n markCrossProductCanonicalSlugs(children);\n\n return {\n type: \"productgroup\",\n id: ctx.nodeId(\"productgroup\"),\n collapsed: undefined,\n landingPage: buildLandingPage(\n ctx,\n scoped.filter((s) => s.seg.product == null)\n ),\n children\n };\n}\n\n/**\n * Deduplicate pages across products using pageId as a content-identity key.\n * Pages with the same pageId in different products are the same content\n * materialized per-scope; the default product's slug becomes canonical and\n * non-default copies receive `canonicalSlug` so the sitemap collapses them.\n *\n * API leaf nodes (endpoints, websockets, etc.) are unaffected — `getPageId`\n * returns undefined for those types, so product-specific API surface is\n * never suppressed.\n */\nfunction markCrossProductCanonicalSlugs(productNodes: FernNavigation.ProductNode[]): void {\n const pageIdToCanonical = new Map<string, { slug: FernNavigation.Slug; productId: FernNavigation.ProductId }>();\n\n // Process default product first so its slugs become the canonical targets.\n const sorted = [...productNodes].sort((a, b) => {\n if (a.default !== b.default) {\n return a.default ? -1 : 1;\n }\n return 0;\n });\n\n for (const product of sorted) {\n FernNavigation.traverseDF(product, (child) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const pid = FernNavigation.getPageId(child as FernNavigation.NavigationNodePage);\n if (pid == null) {\n return;\n }\n const key = `pid:${pid}`;\n const entry = pageIdToCanonical.get(key);\n if (entry != null && !product.default && entry.productId !== product.productId) {\n child.canonicalSlug = entry.slug;\n } else if (entry == null) {\n pageIdToCanonical.set(key, {\n slug: child.canonicalSlug ?? child.slug,\n productId: product.productId\n });\n }\n }\n });\n }\n}\n\n// (root keeps the bare \"root\" id; it is the single tree root.)\n"],"mappings":"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","names":["z","part","getChildren","segmentApiDefinitionId","first","tabSegs"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/orpc-client/api/shared.ts","../../../src/orpc-client/shared.ts","../../../src/navigation/types/latest.ts","../../../src/navigation/versions/latest/getChildren.ts","../../../src/navigation/versions/latest/NavigationNodeApiLeaf.ts","../../../src/navigation/versions/latest/NavigationNodePageLeaf.ts","../../../src/navigation/versions/latest/NavigationNodeLeaf.ts","../../../../commons/core-utils/src/assertNever.ts","../../../../commons/core-utils/src/visitDiscriminatedUnion.ts","../../../src/navigation/versions/latest/getPageId.ts","../../../src/navigation/versions/latest/NavigationNodeSection.ts","../../../src/navigation/versions/latest/NavigationNodeSectionOverview.ts","../../../src/navigation/versions/latest/NavigationNodeMarkdown.ts","../../../src/navigation/versions/latest/NavigationNodePage.ts","../../../src/navigation/versions/latest/NavigationNodeWithMetadata.ts","../../../src/navigation/versions/latest/NavigationNodeWithRedirect.ts","../../../../commons/core-utils/src/isNonNullish.ts","../../../src/navigation/versions/latest/slugjoin.ts","../../../src/navigation/versions/latest/toDefaultSlug.ts","../../../src/utils/traversers/types.ts","../../../src/utils/traversers/dfs.ts","../../../src/navigation/versions/latest/traverseDF.ts","../../../src/navigation/utils/syntheticSectionPath.ts","../../../src/navigation/ledger-root-builder.ts"],"sourcesContent":["import * as z from \"zod\";\nimport { ApiDefinitionIdSchema, HttpMethod, HttpMethodSchema } from \"../shared.js\";\n\nexport { ApiDefinitionIdSchema, HttpMethod, HttpMethodSchema };\n\nexport const TypeIdSchema = z.string();\nexport type TypeId = z.infer<typeof TypeIdSchema>;\nexport function TypeId(value: string): TypeId {\n return value;\n}\n\nexport const EndpointIdSchema = z.string();\nexport type EndpointId = z.infer<typeof EndpointIdSchema>;\nexport function EndpointId(value: string): EndpointId {\n return value;\n}\n\nexport const WebSocketIdSchema = z.string();\nexport type WebSocketId = z.infer<typeof WebSocketIdSchema>;\nexport function WebSocketId(value: string): WebSocketId {\n return value;\n}\n\nexport const WebhookIdSchema = z.string();\nexport type WebhookId = z.infer<typeof WebhookIdSchema>;\nexport function WebhookId(value: string): WebhookId {\n return value;\n}\n\nexport const GraphQlOperationIdSchema = z.string();\nexport type GraphQlOperationId = z.infer<typeof GraphQlOperationIdSchema>;\nexport function GraphQlOperationId(value: string): GraphQlOperationId {\n return value;\n}\n\n/**\n * Resolve every GraphQL operation id backing a graphql node: the primary\n * operation plus any grouped (namespace) operations, deduplicated.\n *\n * The primary `graphqlOperationId` is NOT guaranteed to appear in\n * `graphqlOperationIds` — for namespace nodes it is the parent operation, which\n * lives outside the grouped-children list — so it must be unioned in explicitly.\n * Any caller that needs the full operation set (pruning, search indexing,\n * markdown) must use this rather than reading `graphqlOperationIds` directly.\n */\nexport function getGraphqlOperationIds(node: {\n graphqlOperationId: GraphQlOperationId;\n graphqlOperationIds?: GraphQlOperationId[] | undefined;\n}): GraphQlOperationId[] {\n const ids = new Set<GraphQlOperationId>(node.graphqlOperationIds ?? []);\n ids.add(node.graphqlOperationId);\n return [...ids];\n}\n\nexport const GraphQlTypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"scalar\", \"interface\", \"union\"]);\nexport type GraphQlTypeCategory = z.infer<typeof GraphQlTypeCategorySchema>;\n\nexport const EnvironmentIdSchema = z.string();\nexport type EnvironmentId = z.infer<typeof EnvironmentIdSchema>;\nexport function EnvironmentId(value: string): EnvironmentId {\n return value;\n}\n\nexport const PropertyKeySchema = z.string();\nexport type PropertyKey = z.infer<typeof PropertyKeySchema>;\nexport function PropertyKey(value: string): PropertyKey {\n return value;\n}\n\nexport const AuthSchemeIdSchema = z.string();\nexport type AuthSchemeId = z.infer<typeof AuthSchemeIdSchema>;\nexport function AuthSchemeId(value: string): AuthSchemeId {\n return value;\n}\n\nexport const SubpackageIdSchema = z.string();\nexport type SubpackageId = z.infer<typeof SubpackageIdSchema>;\nexport function SubpackageId(value: string): SubpackageId {\n return value;\n}\n\nexport const WebSocketMessageIdSchema = z.string();\nexport type WebSocketMessageId = z.infer<typeof WebSocketMessageIdSchema>;\nexport function WebSocketMessageId(value: string): WebSocketMessageId {\n return value;\n}\n\nexport const FileIdSchema: z.ZodType<FileId> = z.string() as any;\nexport type FileId = string & { FileId: void };\nexport function FileId(value: string): FileId {\n return value as unknown as FileId;\n}\n\nexport const MultipleAuthTypeSchema = z.object({\n schemes: z.array(AuthSchemeIdSchema)\n});\nexport type MultipleAuthType = z.infer<typeof MultipleAuthTypeSchema>;\n\nexport const GrpcMethodSchema = z.enum([\"UNARY\", \"CLIENT_STREAM\", \"SERVER_STREAM\", \"BIDIRECTIONAL_STREAM\"]);\n\nexport const AvailabilitySchema = z.enum([\n \"Alpha\",\n \"Stable\",\n \"GenerallyAvailable\",\n \"InDevelopment\",\n \"PreRelease\",\n \"Deprecated\",\n \"Beta\",\n \"Preview\",\n \"Legacy\"\n]);\n\nexport const WebSocketMessageOriginSchema = z.enum([\"client\", \"server\"]);\nexport type WebSocketMessageOrigin = z.infer<typeof WebSocketMessageOriginSchema>;\n\nexport const WebhookHttpMethodSchema = z.enum([\"GET\", \"POST\"]);\nexport type WebhookHttpMethod = z.infer<typeof WebhookHttpMethodSchema>;\n\nexport const WithDescriptionSchema = z.object({\n description: z.string().nullish()\n});\nexport type WithDescription = z.infer<typeof WithDescriptionSchema>;\n\nexport const WithAvailabilitySchema = z.object({\n availability: AvailabilitySchema.nullish()\n});\nexport type WithAvailability = z.infer<typeof WithAvailabilitySchema>;\n\nexport const EnvironmentSchema = z.object({\n id: EnvironmentIdSchema,\n baseUrl: z.string(),\n audiences: z.array(z.string()).nullish()\n});\nexport type Environment = z.infer<typeof EnvironmentSchema>;\n\nexport const RestProtocolSchema = z.object({});\n\nexport const OpenRpcProtocolSchema = z.object({\n methodName: z.string()\n});\n\nexport const GrpcProtocolSchema = z.object({\n methodName: z.string(),\n methodType: GrpcMethodSchema.nullish()\n});\n\nexport const ProtocolSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"rest\"), ...RestProtocolSchema.shape }),\n z.object({ type: z.literal(\"openrpc\"), ...OpenRpcProtocolSchema.shape }),\n z.object({ type: z.literal(\"grpc\"), ...GrpcProtocolSchema.shape })\n]);\nexport type Protocol = z.infer<typeof ProtocolSchema>;\n\nexport const ObjectPropertyAccessSchema = z.enum([\"READ_ONLY\", \"WRITE_ONLY\"]);\nexport type ObjectPropertyAccess = z.infer<typeof ObjectPropertyAccessSchema>;\n\nexport const TypeReferenceIdDefaultSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"enum\"), value: z.string() })\n]);\nexport type TypeReferenceIdDefault = z.infer<typeof TypeReferenceIdDefaultSchema>;\n\nconst _numberNullish = z.number().nullish();\nconst _numberIntNullish = z.number().int().nullish();\n\nfunction coerceNumber(val: unknown): unknown {\n if (typeof val === \"string\" && val.trim() !== \"\") {\n const num = Number(val);\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return val;\n}\n\nconst coercedNumberNullish = z.preprocess(coerceNumber, z.number().nullish()) as unknown as typeof _numberNullish;\nconst coercedNumberIntNullish = z.preprocess(\n coerceNumber,\n z.number().int().nullish()\n) as unknown as typeof _numberIntNullish;\n\nexport const IntegerTypeSchema = z.object({\n minimum: coercedNumberIntNullish,\n maximum: coercedNumberIntNullish,\n exclusiveMinimum: coercedNumberIntNullish,\n exclusiveMaximum: coercedNumberIntNullish,\n multipleOf: coercedNumberIntNullish,\n default: coercedNumberIntNullish\n});\nexport type IntegerType = z.infer<typeof IntegerTypeSchema>;\n\nexport const DoubleTypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type DoubleType = z.infer<typeof DoubleTypeSchema>;\n\nexport const StringTypeSchema = z.object({\n format: z.string().nullish(),\n regex: z.string().nullish(),\n minLength: z.number().int().nullish(),\n maxLength: z.number().int().nullish(),\n default: z.string().nullish()\n});\nexport type StringType = z.infer<typeof StringTypeSchema>;\n\nexport const LongTypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type LongType = z.infer<typeof LongTypeSchema>;\n\nconst _booleanNullish = z.boolean().nullish();\n\nexport const BooleanTypeSchema = z.object({\n default: z.preprocess((val) => {\n if (typeof val === \"string\") {\n if (val.toLowerCase() === \"true\") {\n return true;\n }\n if (val.toLowerCase() === \"false\") {\n return false;\n }\n }\n return val;\n }, z.boolean().nullish()) as unknown as typeof _booleanNullish\n});\nexport type BooleanType = z.infer<typeof BooleanTypeSchema>;\n\nexport const DatetimeTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type DatetimeType = z.infer<typeof DatetimeTypeSchema>;\n\nexport const UuidTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type UuidType = z.infer<typeof UuidTypeSchema>;\n\nexport const Base64TypeSchema = z.object({\n default: z.string().nullish(),\n mimeType: z.string().nullish()\n});\nexport type Base64Type = z.infer<typeof Base64TypeSchema>;\n\nexport const DateTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type DateType = z.infer<typeof DateTypeSchema>;\n\nexport const BigIntegerTypeSchema = z.object({\n default: z.string().nullish()\n});\nexport type BigIntegerType = z.infer<typeof BigIntegerTypeSchema>;\n\nexport const UintTypeSchema = z.object({\n minimum: coercedNumberIntNullish,\n maximum: coercedNumberIntNullish,\n exclusiveMinimum: coercedNumberIntNullish,\n exclusiveMaximum: coercedNumberIntNullish,\n multipleOf: coercedNumberIntNullish,\n default: coercedNumberIntNullish\n});\nexport type UintType = z.infer<typeof UintTypeSchema>;\n\nexport const Uint64TypeSchema = z.object({\n minimum: coercedNumberNullish,\n maximum: coercedNumberNullish,\n exclusiveMinimum: coercedNumberNullish,\n exclusiveMaximum: coercedNumberNullish,\n multipleOf: coercedNumberNullish,\n default: coercedNumberNullish\n});\nexport type Uint64Type = z.infer<typeof Uint64TypeSchema>;\n\nexport const ScalarTypeSchema = z.object({\n name: z.string(),\n description: z.string().nullish(),\n default: z.unknown().nullish()\n});\nexport type ScalarType = z.infer<typeof ScalarTypeSchema>;\n\nexport const PrimitiveTypeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"integer\"), ...IntegerTypeSchema.shape }),\n z.object({ type: z.literal(\"double\"), ...DoubleTypeSchema.shape }),\n z.object({ type: z.literal(\"string\"), ...StringTypeSchema.shape }),\n z.object({ type: z.literal(\"long\"), ...LongTypeSchema.shape }),\n z.object({ type: z.literal(\"boolean\"), ...BooleanTypeSchema.shape }),\n z.object({ type: z.literal(\"datetime\"), ...DatetimeTypeSchema.shape }),\n z.object({ type: z.literal(\"uuid\"), ...UuidTypeSchema.shape }),\n z.object({ type: z.literal(\"base64\"), ...Base64TypeSchema.shape }),\n z.object({ type: z.literal(\"date\"), ...DateTypeSchema.shape }),\n z.object({ type: z.literal(\"bigInteger\"), ...BigIntegerTypeSchema.shape }),\n z.object({ type: z.literal(\"uint\"), ...UintTypeSchema.shape }),\n z.object({ type: z.literal(\"uint64\"), ...Uint64TypeSchema.shape }),\n z.object({ type: z.literal(\"scalar\"), ...ScalarTypeSchema.shape })\n]);\nexport type PrimitiveType = z.infer<typeof PrimitiveTypeSchema>;\n\nexport const LiteralTypeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"booleanLiteral\"), value: z.boolean() }),\n z.object({ type: z.literal(\"stringLiteral\"), value: z.string() })\n]);\nexport type LiteralType = z.infer<typeof LiteralTypeSchema>;\n\nexport type TypeReference =\n | TypeReference.Id\n | TypeReference.Primitive\n | TypeReference.Optional\n | TypeReference.Nullable\n | TypeReference.List\n | TypeReference.Set\n | TypeReference.Map\n | TypeReference.Literal\n | TypeReference.Unknown;\n\nexport namespace TypeReference {\n export interface Id {\n type: \"id\";\n value: string;\n default?: TypeReferenceIdDefault | null;\n }\n export interface Primitive {\n type: \"primitive\";\n value: PrimitiveType;\n }\n export interface Optional {\n type: \"optional\";\n itemType: TypeReference;\n defaultValue?: unknown | null;\n }\n export interface Nullable {\n type: \"nullable\";\n itemType: TypeReference;\n }\n export interface List {\n type: \"list\";\n itemType: TypeReference;\n minItems?: number | null;\n maxItems?: number | null;\n }\n export interface Set {\n type: \"set\";\n itemType: TypeReference;\n minItems?: number | null;\n maxItems?: number | null;\n }\n export interface Map {\n type: \"map\";\n keyType: TypeReference;\n valueType: TypeReference;\n minProperties?: number | null;\n maxProperties?: number | null;\n }\n export interface Literal {\n type: \"literal\";\n value: LiteralType;\n }\n export interface Unknown {\n type: \"unknown\";\n }\n}\n\nexport const TypeReferenceSchema: z.ZodType<TypeReference> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"id\"),\n value: TypeIdSchema,\n default: TypeReferenceIdDefaultSchema.nullish()\n }),\n z.object({\n type: z.literal(\"primitive\"),\n value: PrimitiveTypeSchema\n }),\n z.object({\n type: z.literal(\"optional\"),\n itemType: TypeReferenceSchema,\n defaultValue: z.unknown().nullish()\n }),\n z.object({\n type: z.literal(\"nullable\"),\n itemType: TypeReferenceSchema\n }),\n z.object({\n type: z.literal(\"list\"),\n itemType: TypeReferenceSchema,\n minItems: z.number().int().nullish(),\n maxItems: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"set\"),\n itemType: TypeReferenceSchema,\n minItems: z.number().int().nullish(),\n maxItems: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"map\"),\n keyType: TypeReferenceSchema,\n valueType: TypeReferenceSchema,\n minProperties: z.number().int().nullish(),\n maxProperties: z.number().int().nullish()\n }),\n z.object({\n type: z.literal(\"literal\"),\n value: LiteralTypeSchema\n }),\n z.object({\n type: z.literal(\"unknown\")\n })\n ])\n);\n\nexport interface GraphQlArgument {\n description?: string | null;\n availability?: z.infer<typeof AvailabilitySchema> | null;\n name: string;\n type: TypeReference;\n defaultValue?: unknown | null;\n}\nexport const GraphQlArgumentSchema: z.ZodType<GraphQlArgument> = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n name: z.string(),\n type: TypeReferenceSchema,\n defaultValue: z.unknown().nullish()\n});\n\nexport const ObjectPropertySchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n valueType: TypeReferenceSchema,\n propertyAccess: ObjectPropertyAccessSchema.nullish(),\n arguments: z.array(GraphQlArgumentSchema).nullish()\n});\nexport type ObjectProperty = z.infer<typeof ObjectPropertySchema>;\n\nexport const ObjectTypeSchema = z.object({\n extends: z.array(TypeIdSchema),\n properties: z.array(ObjectPropertySchema),\n extraProperties: TypeReferenceSchema.nullish()\n});\nexport type ObjectType = z.infer<typeof ObjectTypeSchema>;\n\nexport const EnumValueSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n value: z.string()\n});\nexport type EnumValue = z.infer<typeof EnumValueSchema>;\n\nexport const EnumTypeSchema = z.object({\n default: z.string().nullish(),\n values: z.array(EnumValueSchema)\n});\nexport type EnumType = z.infer<typeof EnumTypeSchema>;\n\nexport const DiscriminatedUnionVariantSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n discriminantValue: z.string(),\n displayName: z.string().nullish(),\n additionalProperties: ObjectTypeSchema\n});\nexport type DiscriminatedUnionVariant = z.infer<typeof DiscriminatedUnionVariantSchema>;\n\nexport const DiscriminatedUnionTypeSchema = z.object({\n discriminant: z.string(),\n variants: z.array(DiscriminatedUnionVariantSchema)\n});\nexport type DiscriminatedUnionType = z.infer<typeof DiscriminatedUnionTypeSchema>;\n\nexport const ContentTypeSchema = z.union([z.string(), z.array(z.string())]);\nexport type ContentType = z.infer<typeof ContentTypeSchema>;\n\nexport const FilePropertySingleSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n isOptional: z.boolean(),\n contentType: ContentTypeSchema.nullish()\n});\nexport type FilePropertySingle = z.infer<typeof FilePropertySingleSchema>;\n\nexport const FilePropertyArraySchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n isOptional: z.boolean(),\n contentType: ContentTypeSchema.nullish()\n});\nexport type FilePropertyArray = z.infer<typeof FilePropertyArraySchema>;\n\nexport const FormDataFilePropertySchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"file\"), ...FilePropertySingleSchema.shape }),\n z.object({ type: z.literal(\"fileArray\"), ...FilePropertyArraySchema.shape })\n]);\nexport type FormDataFileProperty = z.infer<typeof FormDataFilePropertySchema>;\n\nexport const FormDataBodyPropertySchema = z.object({\n ...ObjectPropertySchema.shape,\n contentType: ContentTypeSchema.nullish(),\n exploded: z.boolean().nullish()\n});\nexport type FormDataBodyProperty = z.infer<typeof FormDataBodyPropertySchema>;\n\nexport const FormDataPropertySchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"file\"), value: FormDataFilePropertySchema }),\n z.object({ type: z.literal(\"bodyProperty\"), ...FormDataBodyPropertySchema.shape })\n]);\nexport type FormDataProperty = z.infer<typeof FormDataPropertySchema>;\n\nexport const FormDataRequestSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n name: z.string(),\n properties: z.array(FormDataPropertySchema)\n});\nexport type FormDataRequest = z.infer<typeof FormDataRequestSchema>;\n\nexport const EndpointPathPartSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"literal\"), value: z.string() }),\n z.object({ type: z.literal(\"pathParameter\"), value: PropertyKeySchema })\n]);\nexport type EndpointPathPart = z.infer<typeof EndpointPathPartSchema>;\n\nexport const PathParameterSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: PropertyKeySchema,\n type: TypeReferenceSchema,\n explode: z.boolean().nullish()\n});\nexport type PathParameter = z.infer<typeof PathParameterSchema>;\n\nexport const EndpointPathSchema = z.object({\n parts: z.array(EndpointPathPartSchema),\n pathParameters: z.array(PathParameterSchema)\n});\nexport type EndpointPath = z.infer<typeof EndpointPathSchema>;\n\nexport const QueryParameterSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: z.string(),\n type: TypeReferenceSchema,\n explode: z.boolean().nullish()\n});\nexport type QueryParameter = z.infer<typeof QueryParameterSchema>;\n\nexport const HeaderSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n key: z.string(),\n type: TypeReferenceSchema\n});\nexport type Header = z.infer<typeof HeaderSchema>;\n\nexport const JsonBodyShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema })\n]);\nexport type JsonBodyShape = z.infer<typeof JsonBodyShapeSchema>;\n\nexport const FileDownloadResponseBodyShapeSchema = z.object({\n contentType: z.string().nullish()\n});\nexport type FileDownloadResponseBodyShape = z.infer<typeof FileDownloadResponseBodyShapeSchema>;\n\nexport const StreamResponseV2Schema = z.object({\n terminator: z.string().nullish(),\n shape: JsonBodyShapeSchema\n});\nexport type StreamResponseV2 = z.infer<typeof StreamResponseV2Schema>;\n\nexport const StreamConditionSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"booleanRequestProperty\"), value: PropertyKeySchema })\n]);\nexport type StreamCondition = z.infer<typeof StreamConditionSchema>;\n\nexport const FilenameWithDataSchema = z.object({\n filename: z.string(),\n data: FileIdSchema\n});\nexport type FilenameWithData = z.infer<typeof FilenameWithDataSchema>;\n\nexport const FormValueSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"filename\"), value: z.string() }),\n z.object({ type: z.literal(\"filenames\"), value: z.array(z.string()) }),\n z.object({ type: z.literal(\"filenameWithData\"), ...FilenameWithDataSchema.shape }),\n z.object({ type: z.literal(\"filenamesWithData\"), value: z.array(FilenameWithDataSchema) }),\n z.object({ type: z.literal(\"exploded\"), value: z.array(z.unknown()) })\n]);\nexport type FormValue = z.infer<typeof FormValueSchema>;\n\nexport const BytesValueSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"base64\"), value: z.string() })\n]);\nexport type BytesValue = z.infer<typeof BytesValueSchema>;\n\n// The form variant uses z.unknown() for record values instead of FormValueSchema to be\n// forward-compatible with new form value types and to tolerate form values produced by\n// the AI example enhancer (which may not conform to the strict FormValueSchema).\n// Example data is display-only and does not require strict validation at registration time.\nexport const ExampleEndpointRequestSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"form\"), value: z.record(z.string(), z.unknown()) }),\n z.object({ type: z.literal(\"bytes\"), value: BytesValueSchema })\n]);\nexport type ExampleEndpointRequest = z.infer<typeof ExampleEndpointRequestSchema>;\n\nexport const ExampleServerSentEventSchema = z.object({\n event: z.string(),\n data: z.unknown()\n});\nexport type ExampleServerSentEvent = z.infer<typeof ExampleServerSentEventSchema>;\n\nexport const ExampleEndpointResponseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() }),\n z.object({ type: z.literal(\"filename\"), value: z.unknown() }),\n z.object({ type: z.literal(\"stream\"), value: z.array(z.unknown()) }),\n z.object({ type: z.literal(\"sse\"), value: z.array(ExampleServerSentEventSchema) })\n]);\nexport type ExampleEndpointResponse = z.infer<typeof ExampleEndpointResponseSchema>;\n\nexport const ErrorDeclarationSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n type: TypeReferenceSchema.nullish(),\n statusCode: z.number().int()\n});\nexport type ErrorDeclaration = z.infer<typeof ErrorDeclarationSchema>;\n\nexport const ExampleErrorResponseSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"json\"), value: z.unknown() })\n]);\nexport type ExampleErrorResponse = z.infer<typeof ExampleErrorResponseSchema>;\n\nexport const ErrorExampleSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n responseBody: ExampleErrorResponseSchema\n});\nexport type ErrorExample = z.infer<typeof ErrorExampleSchema>;\n\nexport const GraphQlOperationTypeSchema = z.enum([\"QUERY\", \"MUTATION\", \"SUBSCRIPTION\"]);\nexport type GraphQlOperationType = z.infer<typeof GraphQlOperationTypeSchema>;\n\nexport const GraphQlExampleSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n query: z.string(),\n variables: z.record(z.string(), z.unknown()).nullish(),\n response: z.unknown().nullish()\n});\nexport type GraphQlExample = z.infer<typeof GraphQlExampleSchema>;\n\nexport const CodeSnippetSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n language: z.string(),\n install: z.string().nullish(),\n code: z.string(),\n generated: z.boolean()\n});\nexport type CodeSnippet = z.infer<typeof CodeSnippetSchema>;\n\nexport const GraphQlOperationSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n id: GraphQlOperationIdSchema,\n operationType: GraphQlOperationTypeSchema,\n name: z.string(),\n displayName: z.string().nullish(),\n fieldPath: z.array(z.string()).nullish(),\n arguments: z.array(GraphQlArgumentSchema).nullish(),\n returnType: TypeReferenceSchema,\n examples: z.array(GraphQlExampleSchema).nullish(),\n snippets: z.record(z.string(), z.array(CodeSnippetSchema)).nullish()\n});\nexport type GraphQlOperation = z.infer<typeof GraphQlOperationSchema>;\n\nexport const WebhookPayloadShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema }),\n z.object({ type: z.literal(\"formData\"), ...FormDataRequestSchema.shape })\n]);\nexport type WebhookPayloadShape = z.infer<typeof WebhookPayloadShapeSchema>;\n\nexport const WebhookPayloadSchema = z.object({\n description: z.string().nullish(),\n type: WebhookPayloadShapeSchema\n});\nexport type WebhookPayload = z.infer<typeof WebhookPayloadSchema>;\n\nexport const ExampleWebhookPayloadSchema = z.object({\n name: z.string().nullish(),\n payload: z.unknown()\n});\nexport type ExampleWebhookPayload = z.infer<typeof ExampleWebhookPayloadSchema>;\n\nexport const WebSocketMessageBodyShapeSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"object\"), ...ObjectTypeSchema.shape }),\n z.object({ type: z.literal(\"reference\"), value: TypeReferenceSchema })\n]);\nexport type WebSocketMessageBodyShape = z.infer<typeof WebSocketMessageBodyShapeSchema>;\n\nexport const WebSocketMessageSchema = z.object({\n description: z.string().nullish(),\n availability: AvailabilitySchema.nullish(),\n type: WebSocketMessageIdSchema,\n displayName: z.string().nullish(),\n origin: WebSocketMessageOriginSchema,\n body: WebSocketMessageBodyShapeSchema\n});\nexport type WebSocketMessage = z.infer<typeof WebSocketMessageSchema>;\n\nexport const ExampleWebSocketMessageSchema = z.object({\n type: WebSocketMessageIdSchema,\n body: z.unknown()\n});\nexport type ExampleWebSocketMessage = z.infer<typeof ExampleWebSocketMessageSchema>;\n\nexport const ExampleWebSocketSessionSchema = z.object({\n description: z.string().nullish(),\n name: z.string().nullish(),\n path: z.string(),\n pathParameters: z.record(PropertyKeySchema, z.unknown()),\n queryParameters: z.record(z.string(), z.unknown()),\n headers: z.record(z.string(), z.unknown()),\n messages: z.array(ExampleWebSocketMessageSchema)\n});\nexport type ExampleWebSocketSession = z.infer<typeof ExampleWebSocketSessionSchema>;\n\nexport type ApiNavigationConfigItem =\n | ApiNavigationConfigItem.Subpackage\n | ApiNavigationConfigItem.EndpointId\n | ApiNavigationConfigItem.WebsocketId\n | ApiNavigationConfigItem.WebhookId\n | ApiNavigationConfigItem.GraphqlOperationId;\n\nexport namespace ApiNavigationConfigItem {\n export interface Subpackage {\n type: \"subpackage\";\n subpackageId: string;\n items: ApiNavigationConfigItem[];\n }\n export interface EndpointId {\n type: \"endpointId\";\n value: string;\n }\n export interface WebsocketId {\n type: \"websocketId\";\n value: string;\n }\n export interface WebhookId {\n type: \"webhookId\";\n value: string;\n }\n export interface GraphqlOperationId {\n type: \"graphqlOperationId\";\n value: string;\n }\n}\n\nexport const ApiNavigationConfigItemSchema: z.ZodType<ApiNavigationConfigItem> = z.lazy(() =>\n z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"subpackage\"),\n subpackageId: SubpackageIdSchema,\n items: z.array(ApiNavigationConfigItemSchema)\n }),\n z.object({ type: z.literal(\"endpointId\"), value: EndpointIdSchema }),\n z.object({ type: z.literal(\"websocketId\"), value: WebSocketIdSchema }),\n z.object({ type: z.literal(\"webhookId\"), value: WebhookIdSchema }),\n z.object({ type: z.literal(\"graphqlOperationId\"), value: GraphQlOperationIdSchema })\n ])\n);\n\nexport const ApiNavigationConfigRootSchema = z.object({\n items: z.array(ApiNavigationConfigItemSchema)\n});\nexport type ApiNavigationConfigRoot = z.infer<typeof ApiNavigationConfigRootSchema>;\n\nexport const BearerAuthSchema = z.object({\n description: z.string().nullish(),\n tokenName: z.string().nullish()\n});\nexport type BearerAuth = z.infer<typeof BearerAuthSchema>;\n\nexport const BasicAuthSchema = z.object({\n description: z.string().nullish(),\n usernameName: z.string().nullish(),\n passwordName: z.string().nullish(),\n passwordAlwaysEmpty: z.boolean().nullish()\n});\nexport type BasicAuth = z.infer<typeof BasicAuthSchema>;\n\nexport const HeaderAuthSchema = z.object({\n description: z.string().nullish(),\n nameOverride: z.string().nullish(),\n headerWireValue: z.string(),\n prefix: z.string().nullish()\n});\nexport type HeaderAuth = z.infer<typeof HeaderAuthSchema>;\n\nexport const OAuthClientCredentialsReferencedEndpointSchema = z.object({\n description: z.string().nullish(),\n endpointId: EndpointIdSchema,\n accessTokenLocator: z.string(),\n headerName: z.string().nullish(),\n tokenPrefix: z.string().nullish()\n});\nexport type OAuthClientCredentialsReferencedEndpoint = z.infer<typeof OAuthClientCredentialsReferencedEndpointSchema>;\n\nexport const OAuthClientCredentialsSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"referencedEndpoint\"),\n ...OAuthClientCredentialsReferencedEndpointSchema.shape\n })\n]);\nexport type OAuthClientCredentials = z.infer<typeof OAuthClientCredentialsSchema>;\n\nexport const OAuthSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"clientCredentials\"), value: OAuthClientCredentialsSchema })\n]);\nexport type OAuth = z.infer<typeof OAuthSchema>;\n\nexport const ApiAuthSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"bearerAuth\"), ...BearerAuthSchema.shape }),\n z.object({ type: z.literal(\"basicAuth\"), ...BasicAuthSchema.shape }),\n z.object({ type: z.literal(\"header\"), ...HeaderAuthSchema.shape }),\n z.object({ type: z.literal(\"oAuth\"), value: OAuthSchema })\n]);\nexport type ApiAuth = z.infer<typeof ApiAuthSchema>;\n","import * as z from \"zod\";\n\n// ── Org / API identifiers ──────────────────────────────────────────────\n\nexport const OrgIdSchema = z.string();\nexport type OrgId = z.infer<typeof OrgIdSchema>;\nexport function OrgId(value: string): OrgId {\n return value;\n}\n\nexport const ApiIdSchema = z.string();\nexport type ApiId = z.infer<typeof ApiIdSchema>;\nexport function ApiId(value: string): ApiId {\n return value;\n}\n\nexport const ApiDefinitionIdSchema = z.string().uuid();\nexport type ApiDefinitionId = z.infer<typeof ApiDefinitionIdSchema>;\nexport function ApiDefinitionId(value: string): ApiDefinitionId {\n return value;\n}\n\n// ── HTTP / Endpoint schemas ─────────────────────────────────────────────\n\nexport const HttpMethodSchema = z.enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\"]);\nexport type HttpMethod = z.infer<typeof HttpMethodSchema>;\n\nexport const HttpMethod = {\n Get: \"GET\",\n Post: \"POST\",\n Put: \"PUT\",\n Patch: \"PATCH\",\n Delete: \"DELETE\",\n Head: \"HEAD\"\n} as const;\n\nexport const UrlSchema: z.ZodType<Url> = z.string() as any;\nexport type Url = string & { Url: void };\nexport function Url(value: string): Url {\n return value as unknown as Url;\n}\n\nexport const EndpointPathLiteralSchema = z.string();\nexport type EndpointPathLiteral = z.infer<typeof EndpointPathLiteralSchema>;\nexport function EndpointPathLiteral(value: string): EndpointPathLiteral {\n return value;\n}\n\nexport const EndpointIdentifierSchema = z.object({\n path: z.string(),\n method: HttpMethodSchema,\n identifierOverride: z.string().nullish()\n});\nexport type EndpointIdentifier = z.infer<typeof EndpointIdentifierSchema>;\n\n// ── SDK request schema ──────────────────────────────────────────────────\n\nexport type SdkRequest =\n | { type: \"typescript\"; package: string; version: string | undefined }\n | { type: \"python\"; package: string; version: string | undefined }\n | { type: \"go\"; githubRepo: string; version: string | undefined }\n | { type: \"ruby\"; gem: string; version: string | undefined }\n | { type: \"java\"; group: string; artifact: string; version: string | undefined }\n | { type: \"csharp\"; package: string; version: string | undefined };\n\nexport const SdkRequestSchema: z.ZodType<SdkRequest> = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"typescript\"), package: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"python\"), package: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"go\"), githubRepo: z.string(), version: z.string().nullish() }),\n z.object({ type: z.literal(\"ruby\"), gem: z.string(), version: z.string().nullish() }),\n z.object({\n type: z.literal(\"java\"),\n group: z.string(),\n artifact: z.string(),\n version: z.string().nullish()\n }),\n z.object({ type: z.literal(\"csharp\"), package: z.string(), version: z.string().nullish() })\n]) as any;\n\n// ── Additional identifiers ─────────────────────────────────────────────\n\nexport const DocsConfigIdSchema = z.string();\nexport type DocsConfigId = z.infer<typeof DocsConfigIdSchema>;\nexport function DocsConfigId(value: string): DocsConfigId {\n return value;\n}\n\nexport const GrpcIdSchema = z.string();\nexport type GrpcId = z.infer<typeof GrpcIdSchema>;\nexport function GrpcId(value: string): GrpcId {\n return value;\n}\n\nexport const PageIdSchema = z.string();\nexport type PageId = z.infer<typeof PageIdSchema>;\nexport function PageId(value: string): PageId {\n return value;\n}\n\nexport const RoleIdSchema = z.string();\nexport type RoleId = z.infer<typeof RoleIdSchema>;\nexport function RoleId(value: string): RoleId {\n return value;\n}\n\nexport const TokenIdSchema = z.string();\nexport type TokenId = z.infer<typeof TokenIdSchema>;\n\nexport const VersionIdSchema = z.string();\nexport type VersionId = z.infer<typeof VersionIdSchema>;\nexport function VersionId(value: string): VersionId {\n return value;\n}\n\n// ── Enums ──────────────────────────────────────────────────────────────\n\nexport const LinkTarget = {\n Blank: \"_blank\",\n Self: \"_self\",\n Parent: \"_parent\",\n Top: \"_top\"\n} as const;\nexport type LinkTarget = (typeof LinkTarget)[keyof typeof LinkTarget];\n\nexport const GrpcMethod = {\n Unary: \"UNARY\",\n ClientStream: \"CLIENT_STREAM\",\n ServerStream: \"SERVER_STREAM\",\n BidirectionalStream: \"BIDIRECTIONAL_STREAM\"\n} as const;\nexport type GrpcMethod = (typeof GrpcMethod)[keyof typeof GrpcMethod];\n\nexport const Availability = {\n Alpha: \"Alpha\",\n Stable: \"Stable\",\n GenerallyAvailable: \"GenerallyAvailable\",\n InDevelopment: \"InDevelopment\",\n PreRelease: \"PreRelease\",\n Deprecated: \"Deprecated\",\n Beta: \"Beta\",\n Preview: \"Preview\",\n Legacy: \"Legacy\"\n} as const;\nexport type Availability = (typeof Availability)[keyof typeof Availability];\n\nexport const SupportedLanguage = {\n Curl: \"curl\",\n Python: \"python\",\n Javascript: \"javascript\",\n Js: \"js\",\n Node: \"node\",\n Typescript: \"typescript\",\n Ts: \"ts\",\n Go: \"go\",\n Ruby: \"ruby\",\n Csharp: \"csharp\",\n Php: \"php\",\n Swift: \"swift\",\n Rust: \"rust\"\n} as const;\nexport type SupportedLanguage = (typeof SupportedLanguage)[keyof typeof SupportedLanguage];\n\nexport const HttpSnippetLanguage = {\n Curl: \"curl\",\n Csharp: \"csharp\",\n Go: \"go\",\n Java: \"java\",\n Javascript: \"javascript\",\n Php: \"php\",\n Python: \"python\",\n Ruby: \"ruby\",\n Swift: \"swift\",\n Rust: \"rust\",\n Typescript: \"typescript\"\n} as const;\nexport type HttpSnippetLanguage = (typeof HttpSnippetLanguage)[keyof typeof HttpSnippetLanguage];\n\n// ── Error types ────────────────────────────────────────────────────────\n\nexport interface InvalidDomainErrorBody {\n /** Value the domain should end with (i.e. docs.buildwithfern.com or dev.docs.buildwithfern.com) */\n requiredDomainSuffix: string;\n}\n\n// ── Docs types ─────────────────────────────────────────────────────────\n\nexport interface AnnouncementConfig {\n /** The text to display in the banner, using markdown. */\n text: string;\n}\n\n// ── Snippet types ──────────────────────────────────────────────────────\n\nexport type SnippetsByEndpointMethod = Partial<Record<HttpMethod, Snippet[]>>;\n\nexport const SnippetsByEndpointMethodSchema: z.ZodType<SnippetsByEndpointMethod> = z.record(\n HttpMethodSchema,\n z.array(z.unknown())\n) as any;\n\n// ── SDK types for snippets ────────────────────────────────────────────\n\nexport interface TypeScriptSdk {\n package: string;\n version: string;\n}\n\nexport interface PythonSdk {\n package: string;\n version: string;\n}\n\nexport interface GoSdk {\n githubRepo: string;\n version: string;\n}\n\nexport interface RubySdk {\n gem: string;\n version: string;\n}\n\nexport interface CsharpSdk {\n package: string;\n version: string;\n}\n\nexport interface JavaSdk {\n group: string;\n artifact: string;\n version: string;\n}\n\nexport interface TypeScriptSnippet {\n sdk: TypeScriptSdk;\n client: string;\n}\n\nexport interface PythonSnippet {\n sdk: PythonSdk;\n async_client: string;\n sync_client: string;\n}\n\nexport interface GoSnippet {\n sdk: GoSdk;\n client: string;\n}\n\nexport interface RubySnippet {\n sdk: RubySdk;\n client: string;\n}\n\nexport interface CsharpSnippet {\n sdk: CsharpSdk;\n client: string;\n}\n\nexport interface JavaSnippet {\n sdk: JavaSdk;\n async_client: string;\n sync_client: string;\n}\n\n// ── Snippet discriminated union ───────────────────────────────────────\n\n// ── Snippet code types (used to deserialize snippet data from DB) ────\n\nexport interface TypeScriptSnippetCode {\n client: string;\n}\n\nexport interface PythonSnippetCode {\n async_client: string;\n sync_client: string;\n}\n\nexport interface GoSnippetCode {\n client: string;\n}\n\nexport interface RubySnippetCode {\n client: string;\n}\n\nexport interface JavaSnippetCode {\n async_client: string;\n sync_client: string;\n}\n\nexport interface CsharpSnippetCode {\n client: string;\n}\n\n// ── Sdk type (SdkRequest with required version) ─────────────────────\n\nexport const SdkSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"typescript\"), package: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"python\"), package: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"go\"), githubRepo: z.string(), version: z.string() }),\n z.object({ type: z.literal(\"ruby\"), gem: z.string(), version: z.string() }),\n z.object({\n type: z.literal(\"java\"),\n group: z.string(),\n artifact: z.string(),\n version: z.string()\n }),\n z.object({ type: z.literal(\"csharp\"), package: z.string(), version: z.string() })\n]);\nexport type Sdk = z.infer<typeof SdkSchema>;\n\n// ── Template type (generic template placeholder) ────────────────────\nexport type Template = unknown;\n\nexport type Snippet = Snippet.Typescript | Snippet.Python | Snippet.Java | Snippet.Go | Snippet.Ruby | Snippet.Csharp;\n\nexport namespace Snippet {\n interface _Base {\n exampleIdentifier: string | undefined;\n }\n\n export interface Typescript extends TypeScriptSnippet, _Base {\n type: \"typescript\";\n }\n\n export interface Python extends PythonSnippet, _Base {\n type: \"python\";\n }\n\n export interface Java extends JavaSnippet, _Base {\n type: \"java\";\n }\n\n export interface Go extends GoSnippet, _Base {\n type: \"go\";\n }\n\n export interface Ruby extends RubySnippet, _Base {\n type: \"ruby\";\n }\n\n export interface Csharp extends CsharpSnippet, _Base {\n type: \"csharp\";\n }\n}\n","import type {\n EndpointId,\n EnvironmentId,\n FileId,\n GraphQlOperationId,\n GraphQlOperationType,\n GraphQlTypeCategory,\n TypeId,\n WebhookId,\n WebSocketId\n} from \"../../orpc-client/api/shared.js\";\nimport type {\n AnnouncementConfig,\n ApiDefinitionId,\n Availability,\n GrpcId,\n GrpcMethod,\n HttpMethod,\n LinkTarget,\n PageId,\n RoleId,\n Url,\n VersionId\n} from \"../../orpc-client/shared.js\";\n\nexport type Slug = string & {\n navigation_latest_Slug: void;\n};\n\nexport function Slug(value: string): Slug {\n return value as unknown as Slug;\n}\n\nexport type TabId = string & {\n navigation_latest_TabId: void;\n};\n\nexport function TabId(value: string): TabId {\n return value as unknown as TabId;\n}\n\nexport type NodeId = string & {\n navigation_latest_NodeId: void;\n};\n\nexport function NodeId(value: string): NodeId {\n return value as unknown as NodeId;\n}\n\nexport type ProductId = string & {\n navigation_latest_ProductId: void;\n};\n\nexport function ProductId(value: string): ProductId {\n return value as unknown as ProductId;\n}\n\nexport type VariantId = string & {\n navigation_latest_VariantId: void;\n};\n\nexport function VariantId(value: string): VariantId {\n return value as unknown as VariantId;\n}\n\nexport type RootChild = VersionedNode | UnversionedNode | ProductGroupNode;\n\nexport type ProductNode = InternalProductNode | ExternalProductNode;\n\nexport type ProductChild = VersionedNode | UnversionedNode;\n\nexport type VersionChild = TabbedNode | SidebarRootNode | VariantedNode;\n\nexport type VariantChild = ApiReferenceNode | SectionNode | SidebarGroupNode | PageNode | LinkNode | ChangelogNode;\n\nexport type TabChild = TabNode | LinkNode | ChangelogNode;\n\nexport type SidebarRootChild = SidebarGroupNode | ApiReferenceNode | SectionNode | VariantedNode;\n\nexport type NavigationChild = ApiReferenceNode | SectionNode | PageNode | LinkNode | ChangelogNode | VariantedNode;\n\nexport type ApiPackageChild =\n | ApiPackageNode\n | EndpointNode\n | EndpointPairNode\n | WebSocketNode\n | WebhookNode\n | GrpcNode\n | GraphQlNode\n | GraphQlTypeNode\n | PageNode\n | LinkNode;\n\nexport interface WithNodeId {\n id: NodeId;\n collapsed: boolean | \"open-by-default\" | undefined;\n}\n\nexport interface WithPermissions {\n viewers: RoleId[] | undefined;\n orphaned: boolean | undefined;\n}\n\nexport interface WithFeatureFlags {\n featureFlags: FeatureFlagOptions[] | undefined;\n}\n\nexport interface WithNodeMetadata extends WithNodeId, WithPermissions, WithFeatureFlags {\n title: string;\n slug: Slug;\n canonicalSlug: Slug | undefined;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n}\n\nexport interface WithPage {\n pageId: PageId;\n noindex: boolean | undefined;\n}\n\nexport interface WithOverviewPage {\n overviewPageId: PageId | undefined;\n noindex: boolean | undefined;\n}\n\nexport interface WithApiDefinitionId {\n apiDefinitionId: ApiDefinitionId;\n availability: Availability | undefined;\n}\n\nexport interface WithRedirect {\n pointsTo: Slug | undefined;\n}\n\nexport interface FeatureFlagOptions {\n flag: string;\n fallbackValue: unknown | undefined;\n match: unknown | undefined;\n}\n\nexport interface BreadcrumbItem {\n title: string;\n pointsTo: Slug | undefined;\n}\n\nexport interface PlaygroundButtonSettings {\n href: Url | undefined;\n}\n\nexport interface PlaygroundSettings {\n environments: EnvironmentId[] | undefined;\n button: PlaygroundButtonSettings | undefined;\n \"limit-websocket-messages-per-connection\": number | undefined;\n hidden: boolean | undefined;\n}\n\nexport type { GraphQlOperationType };\nexport type { GraphQlTypeCategory };\n\nexport interface ProductGroupNode extends WithNodeId {\n type: \"productgroup\";\n landingPage: LandingPageNode | undefined;\n children: ProductNode[];\n}\n\nexport interface VersionedNode extends WithNodeId {\n type: \"versioned\";\n children: VersionNode[];\n}\n\nexport interface UnversionedNode extends WithNodeId {\n type: \"unversioned\";\n child: VersionChild;\n landingPage: LandingPageNode | undefined;\n}\n\nexport interface VariantedNode extends WithNodeId {\n type: \"varianted\";\n children: VariantNode[];\n}\n\nexport interface TabbedNode extends WithNodeId {\n type: \"tabbed\";\n children: TabChild[];\n}\n\nexport interface SidebarRootNode extends WithNodeId {\n type: \"sidebarRoot\";\n children: SidebarRootChild[];\n}\n\nexport interface SidebarGroupNode extends WithNodeId {\n type: \"sidebarGroup\";\n children: NavigationChild[];\n}\n\nexport interface EndpointPairNode extends WithNodeId {\n type: \"endpointPair\";\n stream: EndpointNode;\n nonStream: EndpointNode;\n}\n\nexport interface LinkNode extends WithNodeId {\n type: \"link\";\n title: string;\n icon: string | undefined;\n url: Url;\n target: LinkTarget | undefined;\n}\n\nexport interface RootNode extends WithNodeMetadata, WithRedirect {\n type: \"root\";\n version: \"v2\";\n child: RootChild;\n roles: RoleId[] | undefined;\n}\n\nexport interface InternalProductNode extends WithNodeMetadata, WithRedirect {\n type: \"product\";\n default: boolean;\n productId: ProductId;\n child: ProductChild;\n subtitle: string;\n image: FileId | undefined;\n announcement: AnnouncementConfig | undefined;\n}\n\nexport interface ExternalProductNode extends WithNodeId, WithPermissions, WithFeatureFlags {\n type: \"productLink\";\n default: boolean;\n productId: ProductId;\n title: string;\n href: Url;\n target: LinkTarget | undefined;\n subtitle: string;\n icon: string | undefined;\n image: FileId | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n}\n\nexport interface VersionNode extends WithNodeMetadata, WithRedirect {\n type: \"version\";\n default: boolean;\n versionId: VersionId;\n child: VersionChild;\n availability: Availability | undefined;\n landingPage: LandingPageNode | undefined;\n announcement: AnnouncementConfig | undefined;\n}\n\nexport interface VariantNode extends WithNodeMetadata, WithRedirect {\n type: \"variant\";\n default: boolean;\n variantId: VariantId;\n subtitle: string | undefined;\n image: FileId | undefined;\n children: VariantChild[];\n}\n\nexport interface TabNode extends WithNodeMetadata, WithRedirect {\n type: \"tab\";\n child: SidebarRootNode;\n}\n\nexport interface PageNode extends WithNodeMetadata, WithPage {\n type: \"page\";\n availability: Availability | undefined;\n}\n\nexport interface LandingPageNode extends WithNodeMetadata, WithPage {\n type: \"landingPage\";\n}\n\nexport interface SectionNode extends WithNodeMetadata, WithOverviewPage, WithRedirect {\n type: \"section\";\n collapsible: boolean | undefined;\n collapsedByDefault: boolean | undefined;\n children: NavigationChild[];\n availability: Availability | undefined;\n}\n\nexport interface ChangelogNode extends WithNodeMetadata, WithOverviewPage {\n type: \"changelog\";\n children: ChangelogYearNode[];\n}\n\nexport interface ChangelogYearNode extends WithNodeMetadata {\n type: \"changelogYear\";\n year: number;\n children: ChangelogMonthNode[];\n}\n\nexport interface ChangelogMonthNode extends WithNodeMetadata {\n type: \"changelogMonth\";\n month: number;\n children: ChangelogEntryNode[];\n}\n\nexport interface ChangelogEntryNode extends WithNodeMetadata, WithPage {\n type: \"changelogEntry\";\n date: string;\n tags: string[] | undefined;\n}\n\nexport interface ApiReferenceNode extends WithNodeMetadata, WithOverviewPage, WithApiDefinitionId, WithRedirect {\n type: \"apiReference\";\n paginated: boolean | undefined;\n showErrors: boolean | undefined;\n hideTitle: boolean | undefined;\n children: ApiPackageChild[];\n changelog: ChangelogNode | undefined;\n playground: PlaygroundSettings | undefined;\n postmanCollectionUrl: string | undefined;\n}\n\nexport interface EndpointNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"endpoint\";\n method: HttpMethod;\n endpointId: EndpointId;\n isResponseStream: boolean | undefined;\n playground: PlaygroundSettings | undefined;\n}\n\nexport interface WebSocketNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"webSocket\";\n webSocketId: WebSocketId;\n playground: PlaygroundSettings | undefined;\n}\n\nexport interface WebhookNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"webhook\";\n method: HttpMethod;\n webhookId: WebhookId;\n}\n\nexport interface GrpcNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"grpc\";\n method: GrpcMethod;\n grpcId: GrpcId;\n}\n\nexport interface GraphQlNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"graphql\";\n operationType: GraphQlOperationType;\n graphqlOperationId: GraphQlOperationId;\n /** Additional operation IDs when this node represents a namespace group (e.g. fieldPath grouping). */\n graphqlOperationIds: GraphQlOperationId[] | undefined;\n playground: PlaygroundSettings | undefined;\n}\n\n/**\n * A navigation node representing a single GraphQL schema type (object, input,\n * enum, scalar, interface, or union) as opposed to a GraphQL operation.\n *\n * This node is a navigable leaf, mirroring {@link GraphQlNode}. Generating these\n * nodes from a schema (FER-10879) and rendering a dedicated type page\n * (FER-10880) are tracked separately.\n */\nexport interface GraphQlTypeNode extends WithNodeMetadata, WithApiDefinitionId {\n type: \"graphqlType\";\n typeId: TypeId;\n typeCategory: GraphQlTypeCategory;\n}\n\nexport interface ApiPackageNode extends WithNodeMetadata, WithOverviewPage, WithApiDefinitionId, WithRedirect {\n type: \"apiPackage\";\n children: ApiPackageChild[];\n playground: PlaygroundSettings | undefined;\n}\n","import { UnreachableCaseError } from \"ts-essentials\";\n\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isLeaf } from \"./NavigationNodeLeaf\";\n\nexport function getChildren(node: NavigationNode): readonly NavigationNode[] {\n if (isLeaf(node)) {\n return [];\n }\n\n switch (node.type) {\n case \"apiPackage\":\n case \"changelog\":\n case \"changelogMonth\":\n case \"changelogYear\":\n case \"section\":\n case \"sidebarGroup\":\n case \"sidebarRoot\":\n case \"tabbed\":\n case \"versioned\":\n case \"varianted\":\n return node.children;\n case \"product\":\n case \"root\":\n case \"tab\":\n return [node.child];\n case \"productLink\":\n return [];\n case \"variant\":\n return node.children;\n case \"apiReference\":\n return [...node.children, ...(node.changelog ? [node.changelog] : [])];\n case \"endpointPair\":\n return [node.nonStream, node.stream];\n case \"productgroup\":\n return [...(node.landingPage ? [node.landingPage] : []), ...node.children];\n case \"unversioned\":\n case \"version\":\n return [...(node.landingPage ? [node.landingPage] : []), node.child];\n default:\n throw new UnreachableCaseError(node);\n }\n}\n","import type { EndpointNode, GraphQlNode, GraphQlTypeNode, GrpcNode, WebhookNode, WebSocketNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A node in the navigation tree that represents an API endpoint, web socket, or webhook.\n */\nexport type NavigationNodeApiLeaf =\n | EndpointNode\n | WebSocketNode\n | WebhookNode\n | GrpcNode\n | GraphQlNode\n | GraphQlTypeNode;\n\nexport function isApiLeaf(node: NavigationNode): node is NavigationNodeApiLeaf {\n return (\n node.type === \"endpoint\" ||\n node.type === \"webSocket\" ||\n node.type === \"webhook\" ||\n node.type === \"grpc\" ||\n node.type === \"graphql\" ||\n node.type === \"graphqlType\"\n );\n}\n","import type { ChangelogEntryNode, LandingPageNode, PageNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A leaf node that contains primarily markdown content\n */\nexport type NavigationNodeMarkdownLeaf = ChangelogEntryNode | PageNode | LandingPageNode;\n\nexport function isMarkdownLeaf(node: NavigationNode): node is NavigationNodeMarkdownLeaf {\n return node.type === \"page\" || node.type === \"landingPage\" || node.type === \"changelogEntry\";\n}\n","import type { LinkNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isApiLeaf, type NavigationNodeApiLeaf } from \"./NavigationNodeApiLeaf\";\nimport { isMarkdownLeaf, type NavigationNodeMarkdownLeaf } from \"./NavigationNodePageLeaf\";\n\n/**\n * A navigation node that represents a leaf in the navigation tree (i.e. a node that does not have children)\n */\nexport type NavigationNodeLeaf = NavigationNodeApiLeaf | NavigationNodeMarkdownLeaf | LinkNode;\n\nexport function isLeaf(node: NavigationNode): node is NavigationNodeLeaf {\n return isApiLeaf(node) || isMarkdownLeaf(node) || node.type === \"link\";\n}\n","export function assertNever(x: never): never {\n throw new Error(\"Unexpected value: \" + JSON.stringify(x));\n}\n\nexport function assertNeverNoThrow(_: never): void {}\n\nexport default assertNever;\n","import { assertNever } from \"./assertNever\";\n\nexport type DiscriminatedUnionVisitor<T extends Record<Discriminant, string>, U, Discriminant extends string> = {\n [D in T[Discriminant]]: (value: Extract<T, Record<Discriminant, D>>) => U;\n} & {\n _other?: (value: Record<Discriminant, string>) => U;\n};\n\nexport function visitDiscriminatedUnion<T extends Record<\"type\", string>>(\n item: T\n): { _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, \"type\">) => U };\nexport function visitDiscriminatedUnion<T extends Record<Discriminant, string>, Discriminant extends string>(\n item: T,\n discriminant: Discriminant\n): { _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, Discriminant>) => U };\nexport function visitDiscriminatedUnion<T extends Record<Discriminant, string>, Discriminant extends string>(\n item: T,\n discriminant: Discriminant = \"type\" as Discriminant\n): {\n _visit: <U>(visitor: DiscriminatedUnionVisitor<T, U, Discriminant>) => U;\n} {\n return {\n _visit: (visitor) => {\n const visit = visitor[item[discriminant]];\n if (visit != null) {\n return visit(item as Extract<T, Record<Discriminant, string>>);\n } else {\n if (visitor._other == null) {\n assertNever(item as never);\n }\n return visitor._other(item);\n }\n }\n };\n}\n\nexport default visitDiscriminatedUnion;\n","import visitDiscriminatedUnion from \"@fern-api/ui-core-utils/visitDiscriminatedUnion\";\n\nimport type { NavigationNodePage, PageId } from \".\";\n\nconst RETURN_PAGEID = (node: { pageId: PageId }) => node.pageId;\nconst RETURN_OVERVIEW_PAGEID = (node: { overviewPageId?: PageId }) => node.overviewPageId;\nconst RETURN_UNDEFINED = () => undefined;\n\nexport function getPageId(node: NavigationNodePage): PageId | undefined {\n return visitDiscriminatedUnion(node)._visit({\n section: RETURN_OVERVIEW_PAGEID,\n apiReference: RETURN_OVERVIEW_PAGEID,\n changelog: RETURN_OVERVIEW_PAGEID,\n apiPackage: RETURN_OVERVIEW_PAGEID,\n changelogEntry: RETURN_PAGEID,\n page: RETURN_PAGEID,\n landingPage: RETURN_PAGEID,\n\n // if the following changes, make sure to update the algolia records generator\n endpoint: RETURN_UNDEFINED,\n webSocket: RETURN_UNDEFINED,\n webhook: RETURN_UNDEFINED,\n grpc: RETURN_UNDEFINED,\n graphql: RETURN_UNDEFINED,\n graphqlType: RETURN_UNDEFINED\n // changelogYear: RETURN_UNDEFINED,\n // changelogMonth: RETURN_UNDEFINED,\n });\n}\n","import type { ApiPackageNode, ApiReferenceNode, ChangelogNode, SectionNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A navigation node that isn't a leaf node and contains markdown content\n */\nexport type NavigationNodeSection = SectionNode | ApiReferenceNode | ChangelogNode | ApiPackageNode;\n\nexport function isSection(node: NavigationNode): node is NavigationNodeSection {\n return (\n node.type === \"section\" ||\n node.type === \"apiReference\" ||\n node.type === \"changelog\" ||\n node.type === \"apiPackage\"\n );\n}\n","import type { PageId, WithOverviewPage } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isSection, type NavigationNodeSection } from \"./NavigationNodeSection\";\n\ntype WithRequiredOverviewPage<T extends WithOverviewPage> = T & {\n overviewPageId: PageId;\n};\n\n/**\n * A navigation node that isn't a leaf node and contains markdown content\n */\nexport type NavigationNodeSectionOverview = WithRequiredOverviewPage<NavigationNodeSection>;\n\nexport function isSectionOverview(node: NavigationNode): node is NavigationNodeSectionOverview {\n return isSection(node) && node.overviewPageId != null;\n}\n","import type { NavigationNode } from \"./NavigationNode\";\nimport { isMarkdownLeaf, type NavigationNodeMarkdownLeaf } from \"./NavigationNodePageLeaf\";\nimport { isSectionOverview, type NavigationNodeSectionOverview } from \"./NavigationNodeSectionOverview\";\n\n/**\n * A navigation node that contains markdown content\n */\nexport type NavigationNodeWithMarkdown = NavigationNodeSectionOverview | NavigationNodeMarkdownLeaf;\n\nexport function hasMarkdown(node: NavigationNode): node is NavigationNodeWithMarkdown {\n return isMarkdownLeaf(node) || isSectionOverview(node);\n}\n","import type { ChangelogNode } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport { isApiLeaf, type NavigationNodeApiLeaf } from \"./NavigationNodeApiLeaf\";\nimport { hasMarkdown, type NavigationNodeWithMarkdown } from \"./NavigationNodeMarkdown\";\n\n/**\n * A navigation node that represents a visitable page in the documentation\n */\nexport type NavigationNodePage = NavigationNodeWithMarkdown | NavigationNodeApiLeaf | ChangelogNode;\n// | ChangelogYearNode\n// | ChangelogMonthNode;\n\nexport function isPage<N extends NavigationNode>(node: N): node is N & NavigationNodePage {\n return (\n isApiLeaf(node) ||\n node.type === \"changelog\" ||\n // TODO: Uncomment when changelog years and months are visitable\n // node.type === \"changelogYear\" ||\n // node.type === \"changelogMonth\" ||\n hasMarkdown(node)\n );\n}\n","import type { WithNodeMetadata } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * A navigation node that has a title and a slug\n */\nexport type NavigationNodeWithMetadata = Extract<NavigationNode, WithNodeMetadata>;\n\nexport function hasMetadata(node: Partial<NavigationNode>): node is NavigationNodeWithMetadata {\n return (\n typeof (node as NavigationNodeWithMetadata).title === \"string\" &&\n typeof (node as NavigationNodeWithMetadata).slug === \"string\"\n );\n}\n","import type { Slug, WithRedirect } from \".\";\nimport type { NavigationNode } from \"./NavigationNode\";\n\n/**\n * Navigation nodes that can have a redirect\n */\nexport type NavigationNodeWithPointsTo = Extract<NavigationNode, WithRedirect>;\n\nexport function hasPointsTo(node: NavigationNode): node is NavigationNodeWithPointsTo {\n return (\n node.type === \"root\" ||\n node.type === \"product\" ||\n node.type === \"version\" ||\n node.type === \"tab\" ||\n node.type === \"section\" ||\n node.type === \"apiReference\" ||\n node.type === \"apiPackage\"\n );\n}\n\n/**\n * Navigation nodes that extend WithRedirect\n */\n\nexport function hasRedirect(node: NavigationNode): node is NavigationNodeWithPointsTo & { pointsTo: Slug } {\n if (!hasPointsTo(node)) {\n return false;\n }\n return node.pointsTo != null;\n}\n","export function isNonNullish<T>(x: T | null | undefined): x is T {\n return x != null;\n}\n\nexport function assertNonNullish<T>(x: T | null | undefined, message?: string): asserts x is T {\n if (x == null) {\n throw new Error(message ?? \"Value is null or undefined\");\n }\n}\n","import { isNonNullish } from \"@fern-api/ui-core-utils\";\nimport urljoin from \"url-join\";\n\nimport { Slug } from \".\";\n\n// normalizes slug parts and joins them with a single slash\nexport function slugjoin(...parts: (string | string[] | null | undefined)[]): Slug {\n const slugArray = parts\n .filter(isNonNullish)\n .flatMap((part) => (typeof part === \"string\" ? [part.trim()] : part.map((part) => part.trim())))\n .map((part) => decodeURIComponent(part));\n\n const joined = urljoin(slugArray) ?? \"\";\n const normalized = joined\n .replaceAll(\"//*\", \"/\") // Remove duplicate slashes\n .replace(/^\\//, \"\") // Remove leading slash\n .replace(/\\/$/, \"\"); // Remove trailing slash\n\n return Slug(normalized);\n}\n","import { escapeRegExp } from \"es-toolkit/string\";\n\nimport { Slug } from \".\";\n\n/**\n * All versioned slugs are prefixed with the version slug, but the default version may be accessed without the version prefix.\n * toDefaultSlug creates the \"unversioned\" slug for pages under the default version.\n * This should be treated as the cannonical slug for that page.\n */\nexport function toDefaultSlug(slug: Slug, rootSlug: Slug, versionSlug: Slug): Slug;\nexport function toDefaultSlug(slug: Slug | undefined, rootSlug: Slug, versionSlug: Slug): Slug | undefined;\nexport function toDefaultSlug(slug: Slug | undefined, rootSlug: Slug, versionSlug: Slug): Slug | undefined {\n if (slug == null) {\n return undefined;\n }\n if (slug.startsWith(versionSlug)) {\n return Slug(slug.replace(new RegExp(`^${escapeRegExp(versionSlug)}`), rootSlug).replace(/^\\//, \"\"));\n }\n return slug;\n}\n","export const SKIP = \"skip\" as const;\nexport const STOP = false;\nexport const CONTINUE = true;\n\nexport type Action = typeof CONTINUE | typeof SKIP | typeof STOP | void;\n\nexport type TraverserVisit<N, P extends N = N> = (node: N, parents: readonly P[]) => Action;\nexport type TraverserGetChildren<N, P extends N = N> = (parent: P) => readonly N[];\n\nexport type DeleterAction = \"deleted\" | \"should-delete-parent\" | \"noop\";\n","import { SKIP, STOP, type TraverserGetChildren, type TraverserVisit } from \"./types\";\n\nexport function dfs<N, P extends N = N>(\n root: N,\n visit: TraverserVisit<N, P>,\n getChildren: TraverserGetChildren<N, P>,\n isParent: (node: N) => node is P = (node): node is P => true\n): void {\n const stack: [N, P[]][] = [[root, []]];\n while (stack.length > 0) {\n const [node, parents] = stack.pop() ?? [];\n if (!node) {\n continue;\n }\n const next = visit(node, parents ?? []);\n\n if (next === SKIP) {\n continue;\n } else if (next === STOP) {\n return;\n }\n\n if (isParent(node)) {\n for (const child of [...getChildren(node)].reverse()) {\n stack.push([child, [...(parents ?? []), node]]);\n }\n }\n }\n}\n","import { dfs } from \"../../../utils/traversers/dfs\";\nimport type { TraverserVisit } from \"../../../utils/traversers/types\";\nimport { getChildren } from \"./getChildren\";\nimport type { NavigationNode } from \"./NavigationNode\";\nimport type { NavigationNodeParent } from \"./NavigationNodeParent\";\n\n/**\n * Traverse the navigation tree in a depth-first manner (pre-order).\n */\nexport function traverseDF(node: NavigationNode, visit: TraverserVisit<NavigationNode, NavigationNodeParent>): void {\n return dfs(node, visit, getChildren);\n}\n","/**\n * Synthetic section-path segments disambiguate skipUrlSlug nodes in the\n * flat ledger segment model. When a node shares its parent's slug\n * (skipUrlSlug), the publish transform assigns a section path like\n * `parent/~3` instead of `parent`. The read side (ledger-root-builder)\n * strips these synthetic components when computing URL slugs so they\n * never appear in rendered navigation.\n */\n\n/** Prefix for synthetic section-path segments. */\nexport const SKIP_URL_SLUG_PREFIX = \"~\";\n\n/** Pattern matching a synthetic segment: the prefix followed by one or more digits. */\nconst SYNTHETIC_SEGMENT_RE = /^~\\d+$/;\n\n/** Strip synthetic `~<n>` path components used for skipUrlSlug disambiguation. */\nexport function stripSyntheticSegments(section: string): string {\n return section\n .split(\"/\")\n .filter((part) => !SYNTHETIC_SEGMENT_RE.test(part))\n .join(\"/\");\n}\n","import type { NavResponse, VersionMetadataResponse } from \"../orpc-client/docs-ledger/contract.js\";\nimport * as FernNavigation from \"./index.js\";\nimport { stripSyntheticSegments } from \"./utils/syntheticSectionPath.js\";\n\n/**\n * Reconstruct a FernNavigation `RootNode` from the decomposed ledger model\n * (segments + per-segment nav) instead of an embedded `config.root` blob.\n *\n * This is the \"slower fallback\" referenced in the ledger loader refactor: the\n * route/segment-first hot path resolves a single page + its local sidebar\n * without materialising the whole tree, but compatibility methods that need\n * the full root (`getRoot`, `unsafe_getFullRoot`, `findNode`, `getProductList`,\n * …) reconstruct it here.\n *\n * ── Design notes ──────────────────────────────────────────────────────────\n *\n * The transform (`docsPublishTransform.ts`) decomposes a V1 RootNode into:\n * - segment_details: product / version / variant / tab dimensions\n * - segments: a (locale × product × version × variant × tab × section) scope\n * with a `metadata.type` descriptor (section | apiReference | apiPackage |\n * changelog | tabRoot)\n * - artifacts: the leaf nodes (pages, endpoints, links, changelog entries)\n * - nav: routing (fullPath) + sidebar ordering (displaySortOrder)\n *\n * Reconstruction inverts this:\n * 1. Group segments by their (product, version, variant, tab) scope.\n * 2. Within a scope, build the sidebar by nesting `section` segments via\n * their `section` path string (\"models/command\" is a child of \"models\").\n * 3. Assemble scopes into tabbed / sidebarRoot, versioned, productgroup, or\n * unversioned scaffolding based on which dimensions are present.\n *\n * Node slugs are grounded in the stored canonical `fullPath` (the nav row that\n * carries `displaySortOrder`) wherever an artifact exists, so we don't have to\n * re-derive default-slug elision. Structural nodes without their own route\n * (products / versions / sections without an overview) derive a slug via\n * {@link FernNavigation.slugjoin} from the scope prefix.\n *\n * API reference segments are emitted as `paginated` ApiReferenceNodes whose\n * children are populated from the segment's nav routes (endpoint/webhook stubs\n * built via {@link apiLeafNodeFromNavRouteInternal}). This mirrors V2 parity:\n * `findNode` and the slug map locate endpoint pages via the tree, while the\n * full API definition content is still loaded on demand at render time.\n */\n\ntype Segment = VersionMetadataResponse[\"segments\"][number];\ntype SegmentDetail = NonNullable<Segment[\"product\"]>;\ntype NavRoute = NavResponse[\"routes\"][number];\n\n// ── Segment type taxonomy ────────────────────────────────────────────────\n//\n// These types mirror the `metadata.type` values written by\n// `docsPublishTransform.ts`. Keeping them in a typed constant guarded by\n// `satisfies` means the compiler will catch drift if a new structural\n// type is added on the write side but not here.\n\n/** Segment types that have dedicated node builders (cases B/C in buildSidebarRootChildren). */\ntype StructuralSegmentType = \"section\" | \"apiReference\" | \"apiPackage\" | \"changelog\";\n\nconst STRUCTURAL_SEGMENT_TYPES = new Set<string>([\n \"section\",\n \"apiReference\",\n \"apiPackage\",\n \"changelog\"\n] satisfies StructuralSegmentType[]);\n\n/** Structural types routed to `apiReferenceNode` (both carry an apiDefinitionId). */\ntype ApiNodeSegmentType = \"apiReference\" | \"apiPackage\";\n\nconst API_NODE_SEGMENT_TYPES = new Set<string>([\"apiReference\", \"apiPackage\"] satisfies ApiNodeSegmentType[]);\n\n/** Infrastructure segment types filtered out before tree building. */\ntype InfraSegmentType = \"files\" | \"redirects\";\n\nconst INFRA_SEGMENT_TYPES = new Set<string>([\"files\", \"redirects\"] satisfies InfraSegmentType[]);\n\nexport interface BuildRootOptions {\n /** The deployment's root slug — the cleaned basepath (e.g. \"\" or \"docs\"). */\n basePath: string;\n /** V1 root slug. Usually equals basePath, but can be empty on sites served under a platform basepath. */\n rootSlug?: string;\n /** The site title (RootNode.title). */\n title: string;\n /** Segments for the resolved locale (already locale-deduped by the DAO). */\n segments: Segment[];\n /** Per-segment sidebar nav entries, keyed by segmentHash. */\n navBySegment: Map<string, NavRoute[]>;\n /**\n * When true, skip merging shared (tab-level) sections from sibling\n * versions into the default version. Scoped roots (route-first renders)\n * must set this to avoid slug conflicts: the scoped root only loads nav\n * for the requested route's scope, so merged sections carry the source\n * version's fullPaths into the default version's tree, creating\n * duplicate slugs that cause NodeCollector to orphan the real version's\n * pages and return wrong tabs/sidebar.\n */\n skipSharedSectionMerge?: boolean;\n}\n\n// ── id / slug helpers ──────────────────────────────────────────────────────\n\n/**\n * Per-build state. Created once per {@link buildFullRootFromSegments} call and\n * threaded through the builders so concurrent invocations never share state.\n * This matters under Vercel Fluid Compute, where concurrent requests can share\n * a single module instance — module-level mutable state would let one build's\n * ids/basepath bleed into another.\n */\ninterface BuildContext {\n nodeId: (key: string) => FernNavigation.NodeId;\n /** Slug for a content artifact/section, prefixed with the deployment basepath. */\n contentSlug: (relativePath: string) => FernNavigation.Slug;\n}\n\n/** @internal Exported for testing only. */\nexport function createBuildContext(basePath: string): BuildContext {\n // Tracks how many times each id key has been handed out, so collisions get\n // a deterministic `-N` suffix. NodeIds only need to be unique within a\n // single tree; keying them off content (slug/scope) instead of a running\n // counter makes them stable across builds — so client state keyed by\n // node.id (e.g. playground form state in localStorage) survives republish\n // as long as the node's slug/position is unchanged.\n const seen = new Map<string, number>();\n // Nav `fullPath`s are stored relative to the docs root (no basepath);\n // FernNavigation slugs include the basepath prefix, so content node slugs\n // are joined onto this prefix.\n const basePrefix = basePath.replace(/^\\/+|\\/+$/g, \"\");\n return {\n nodeId: (key) => {\n const count = seen.get(key) ?? 0;\n seen.set(key, count + 1);\n return FernNavigation.NodeId(count === 0 ? key : `${key}-${count}`);\n },\n contentSlug: (relativePath) => {\n const clean = relativePath.replace(/^\\/+|\\/+$/g, \"\");\n return basePrefix === \"\" ? FernNavigation.Slug(clean) : FernNavigation.slugjoin(basePrefix, clean);\n }\n };\n}\n\nfunction asSlug(path: string): FernNavigation.Slug {\n return FernNavigation.Slug(path.replace(/^\\/+|\\/+$/g, \"\"));\n}\n\n/**\n * Resolve a product/version/tab `metadata.pointsTo` value to a node slug.\n *\n * `pointsTo` is written basepath-ABSOLUTE: it is a V1 accumulated slug, rooted\n * at the deployment basepath (`root.slug`), exactly like the `routes` dict\n * keys, the `routing` table, and `versionFirstRoute`. Only sidebar `fullPath`s\n * are stored basepath-RELATIVE and re-prefixed via {@link BuildContext.contentSlug}.\n *\n * Passing `pointsTo` through `contentSlug` would prepend the basepath a SECOND\n * time (`docs/runtime/overview` → `docs/docs/runtime/overview`), so the bare\n * product/version landing redirect targets a non-existent route and 404s on any\n * non-root (`/docs`) site. Treat it as already-absolute — only normalise slashes.\n */\nfunction pointsToSlug(metaPointsTo: string): FernNavigation.Slug {\n return asSlug(metaPointsTo);\n}\n\n/** Read a string field off an unknown metadata blob. */\nfunction metaStr(metadata: unknown, key: string): string | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"string\" ? v : undefined;\n }\n return undefined;\n}\n\n/**\n * V1 availability values stored in ledger metadata are lowercase (e.g. \"deprecated\"),\n * but the latest Availability type uses PascalCase (e.g. \"Deprecated\"). This map\n * normalises both formats so the badge component can look up display names correctly.\n */\nconst AVAILABILITY_LOOKUP: Record<string, FernNavigation.Availability> = {\n // V1 lowercase values (stored by docsPublishTransform from V1 navigation tree)\n alpha: FernNavigation.Availability.Alpha,\n stable: FernNavigation.Availability.Stable,\n \"generally-available\": FernNavigation.Availability.GenerallyAvailable,\n \"in-development\": FernNavigation.Availability.InDevelopment,\n \"pre-release\": FernNavigation.Availability.PreRelease,\n deprecated: FernNavigation.Availability.Deprecated,\n beta: FernNavigation.Availability.Beta,\n preview: FernNavigation.Availability.Preview,\n legacy: FernNavigation.Availability.Legacy,\n // Latest PascalCase values (pass-through)\n Alpha: FernNavigation.Availability.Alpha,\n Stable: FernNavigation.Availability.Stable,\n GenerallyAvailable: FernNavigation.Availability.GenerallyAvailable,\n InDevelopment: FernNavigation.Availability.InDevelopment,\n PreRelease: FernNavigation.Availability.PreRelease,\n Deprecated: FernNavigation.Availability.Deprecated,\n Beta: FernNavigation.Availability.Beta,\n Preview: FernNavigation.Availability.Preview,\n Legacy: FernNavigation.Availability.Legacy\n};\n\n/** Read an announcement config from metadata (`{ text: string }` stored as `announcementText`). */\nfunction metaAnnouncement(metadata: unknown): { text: string } | undefined {\n const text = metaStr(metadata, \"announcementText\");\n return text != null ? { text } : undefined;\n}\n\n/** Read an availability field from metadata, converting V1 lowercase to latest PascalCase. */\nfunction metaAvailability(metadata: unknown): FernNavigation.Availability | undefined {\n const raw = metaStr(metadata, \"availability\");\n if (raw == null) {\n return undefined;\n }\n return AVAILABILITY_LOOKUP[raw];\n}\n\nfunction metaBool(metadata: unknown, key: string): boolean | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"boolean\" ? v : undefined;\n }\n return undefined;\n}\n\nfunction metaNum(metadata: unknown, key: string): number | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n return typeof v === \"number\" ? v : undefined;\n }\n return undefined;\n}\n\n/** Read the `collapsed` field which can be boolean or \"open-by-default\". */\nfunction metaCollapsed(metadata: unknown): boolean | \"open-by-default\" | undefined {\n if (metadata != null && typeof metadata === \"object\" && \"collapsed\" in metadata) {\n const v = (metadata as Record<string, unknown>).collapsed;\n if (typeof v === \"boolean\") {\n return v;\n }\n if (v === \"open-by-default\") {\n return \"open-by-default\";\n }\n }\n return undefined;\n}\n\n/** Extract a string array from a metadata blob (e.g. page-level `viewers`). */\nfunction metaStrArr(metadata: unknown, key: string): string[] | undefined {\n if (metadata != null && typeof metadata === \"object\" && key in metadata) {\n const v = (metadata as Record<string, unknown>)[key];\n if (Array.isArray(v)) {\n return v.filter((x): x is string => typeof x === \"string\");\n }\n }\n return undefined;\n}\n\nfunction metaFeatureFlags(metadata: unknown): FernNavigation.FeatureFlagOptions[] | undefined {\n if (metadata != null && typeof metadata === \"object\" && \"featureFlags\" in metadata) {\n const v = (metadata as Record<string, unknown>).featureFlags;\n return Array.isArray(v) && v.length > 0 ? (v as FernNavigation.FeatureFlagOptions[]) : undefined;\n }\n return undefined;\n}\n\n/** Map raw viewer role strings to branded RoleIds, or undefined when empty. */\nfunction toViewers(viewers: string[] | undefined): FernNavigation.RoleId[] | undefined {\n if (viewers == null || viewers.length === 0) {\n return undefined;\n }\n return viewers.map((v) => FernNavigation.RoleId(v));\n}\n\n/**\n * Merge segment-level viewers with the owning variant's viewers so that\n * variant-level RBAC restrictions propagate into section/apiReference/changelog\n * nodes. Without this, removing the variant filter from `inScope` would allow\n * cross-variant prev/next links to disclose restricted content.\n */\nfunction mergeVariantViewers(seg: Segment): FernNavigation.RoleId[] | undefined {\n const segViewers = STRUCTURAL_SEGMENT_TYPES.has(seg.metadata.type)\n ? (seg.metadata as { viewers?: string[] }).viewers\n : undefined;\n const variantViewers = seg.variant?.viewers;\n if ((segViewers == null || segViewers.length === 0) && (variantViewers == null || variantViewers.length === 0)) {\n return undefined;\n }\n const merged = new Set<string>();\n if (segViewers != null) {\n for (const v of segViewers) {\n merged.add(v);\n }\n }\n if (variantViewers != null) {\n for (const v of variantViewers) {\n merged.add(v);\n }\n }\n return merged.size > 0 ? [...merged].map((v) => FernNavigation.RoleId(v)) : undefined;\n}\n\nfunction detailSlug(detail: SegmentDetail): string {\n return detail.metadata?.slug ?? \"\";\n}\n\nfunction detailIsDefault(detail: SegmentDetail): boolean {\n return detail.metadata?.default ?? false;\n}\n\n// ── scope grouping ───────────────────────────────────────────────────────\n\n/** Stable identity for a (product, version, variant, tab) scope. */\nfunction scopeKey(seg: Segment): string {\n return [seg.product?.id ?? \"\", seg.version?.id ?? \"\", seg.variant?.id ?? \"\", seg.tab?.id ?? \"\"].join(\"|\");\n}\n\n// ── artifact → node conversion ─────────────────────────────────────────────\n\nfunction withMetadataDefaults(base: {\n id: FernNavigation.NodeId;\n title: string;\n slug: FernNavigation.Slug;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed?: boolean | undefined;\n viewers?: FernNavigation.RoleId[];\n orphaned?: boolean | undefined;\n featureFlags?: FernNavigation.FeatureFlagOptions[] | undefined;\n}): {\n id: FernNavigation.NodeId;\n title: string;\n slug: FernNavigation.Slug;\n canonicalSlug: FernNavigation.Slug | undefined;\n icon: string | undefined;\n hidden: boolean | undefined;\n authed: boolean | undefined;\n collapsed: boolean | undefined;\n viewers: FernNavigation.RoleId[] | undefined;\n orphaned: boolean | undefined;\n featureFlags: FernNavigation.FeatureFlagOptions[] | undefined;\n} {\n const { viewers, featureFlags, ...rest } = base;\n return {\n ...rest,\n canonicalSlug: undefined,\n authed: base.authed === true ? true : undefined,\n collapsed: undefined,\n // Normalise empty arrays to undefined so unrestricted nodes don't add\n // filter-level noise; a non-empty array engages the RBAC view gate.\n viewers: viewers != null && viewers.length > 0 ? viewers : undefined,\n orphaned: base.orphaned === true ? true : undefined,\n featureFlags: featureFlags != null && featureFlags.length > 0 ? featureFlags : undefined\n };\n}\n\n/**\n * Convert one sidebar nav artifact into a leaf navigation node. Returns\n * undefined for artifacts that don't become standalone sidebar nodes here\n * (endpoints live under paginated apiReferences; overview pages are folded\n * into their owning section).\n */\nfunction artifactToNode(ctx: BuildContext, route: NavRoute): FernNavigation.NavigationChild | undefined {\n const md = route.metadata;\n const title = metaStr(md, \"title\") ?? \"\";\n const icon = metaStr(md, \"icon\");\n const viewers = toViewers(metaStrArr(md, \"viewers\"));\n const slug = ctx.contentSlug(route.fullPath ?? \"\");\n\n switch (route.type) {\n case \"markdown\": {\n // Overview pages are represented on their section, not as a sibling.\n if (metaBool(md, \"isOverview\")) {\n return undefined;\n }\n const pageId = metaStr(md, \"pageId\") ?? \"\";\n const node: FernNavigation.PageNode = {\n type: \"page\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`page:${slug}`),\n title,\n slug,\n icon,\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers,\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n }),\n pageId: FernNavigation.PageId(pageId),\n noindex: metaBool(md, \"noindex\"),\n availability: metaAvailability(md)\n };\n return node;\n }\n case \"link\": {\n const node: FernNavigation.LinkNode = {\n type: \"link\",\n id: ctx.nodeId(`link:${metaStr(md, \"url\") ?? route.fullPath ?? \"\"}`),\n collapsed: undefined,\n title,\n icon,\n url: FernNavigation.Url(metaStr(md, \"url\") ?? \"\"),\n target: metaStr(md, \"target\") as FernNavigation.LinkNode[\"target\"]\n };\n return node;\n }\n // API leaf types are handled by apiReferenceNode (which calls\n // apiLeafNodeFromNavRouteInternal), not by section-level artifact\n // conversion. Returning undefined here prevents them from appearing\n // as duplicate siblings alongside the apiReference node.\n case \"rest\":\n case \"asyncapi\":\n case \"webhook\":\n case \"grpc\":\n case \"graphql\":\n return undefined;\n default:\n return undefined;\n }\n}\n\n// ── API-leaf node construction (route/segment-first explorer scoping) ──────\n\n/**\n * The HTTP-method-bearing nav route types emitted by the publish transform for\n * API leaves. Used by both the root builder (to populate apiReference children)\n * and the route/segment-first explorer reads (to resolve endpoint/webhook\n * navigation nodes from a single API segment's nav without walking the full\n * reconstructed root). See ADR 0013 §API-explorer methods.\n */\nexport type ApiLeafNode =\n | FernNavigation.EndpointNode\n | FernNavigation.WebhookNode\n | FernNavigation.WebSocketNode\n | FernNavigation.GrpcNode\n | FernNavigation.GraphQlNode;\n\ntype PositionedApiChild = {\n node: FernNavigation.ApiPackageChild;\n pos: number;\n};\n\n/**\n * Convert one API-leaf nav route into its navigation node, or undefined when\n * the route is not an API leaf carrying the required identifiers.\n *\n * @internal Exported for the ledger loader's scoped explorer methods.\n */\nexport function apiLeafNodeFromNavRoute(\n route: NavRoute,\n basePath: string,\n segmentApiDefinitionId: string\n): ApiLeafNode | undefined {\n const ctx = createBuildContext(basePath);\n return apiLeafNodeFromNavRouteInternal(ctx, route, segmentApiDefinitionId);\n}\n\nfunction apiLeafNodeFromNavRouteInternal(\n ctx: BuildContext,\n route: NavRoute,\n segmentApiDefinitionId: string\n): ApiLeafNode | undefined {\n // Defensive guard: if fullPath is null/undefined, the writer failed to\n // assign a path (e.g. due to slug collision dedup). Skip the node rather\n // than produce a broken entry with the bare basepath as its slug.\n if (route.fullPath == null) {\n return undefined;\n }\n const md = route.metadata;\n const apiDefinitionId = FernNavigation.ApiDefinitionId(metaStr(md, \"apiDefinitionId\") ?? segmentApiDefinitionId);\n const slug = ctx.contentSlug(route.fullPath);\n const title = metaStr(md, \"title\") ?? \"\";\n const icon = metaStr(md, \"icon\");\n const viewers = toViewers(metaStrArr(md, \"viewers\"));\n const meta = withMetadataDefaults({\n id: ctx.nodeId(`api-leaf:${slug}`),\n title,\n slug,\n icon,\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers,\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n });\n\n if (route.type === \"rest\") {\n const endpointId = metaStr(md, \"endpointId\");\n const method = metaStr(md, \"method\");\n if (endpointId == null || method == null) {\n return undefined;\n }\n return {\n type: \"endpoint\",\n ...meta,\n method: method as FernNavigation.EndpointNode[\"method\"],\n endpointId: FernNavigation.EndpointId(endpointId),\n apiDefinitionId,\n isResponseStream: metaBool(md, \"isResponseStream\"),\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n if (route.type === \"webhook\") {\n const webhookId = metaStr(md, \"webhookId\");\n const method = metaStr(md, \"method\");\n if (webhookId == null || method == null) {\n return undefined;\n }\n return {\n type: \"webhook\",\n ...meta,\n method: method as FernNavigation.WebhookNode[\"method\"],\n webhookId: FernNavigation.WebhookId(webhookId),\n apiDefinitionId,\n availability: metaAvailability(md)\n };\n }\n\n if (route.type === \"asyncapi\") {\n const webSocketId = metaStr(md, \"webSocketId\");\n if (webSocketId == null) {\n return undefined;\n }\n return {\n type: \"webSocket\",\n ...meta,\n webSocketId: FernNavigation.WebSocketId(webSocketId),\n apiDefinitionId,\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n if (route.type === \"grpc\") {\n const grpcId = metaStr(md, \"grpcId\");\n const method = metaStr(md, \"method\");\n if (grpcId == null || method == null) {\n return undefined;\n }\n return {\n type: \"grpc\",\n ...meta,\n method: method as FernNavigation.GrpcNode[\"method\"],\n grpcId: FernNavigation.GrpcId(grpcId),\n apiDefinitionId,\n availability: metaAvailability(md)\n };\n }\n\n if (route.type === \"graphql\") {\n const graphqlOperationId = metaStr(md, \"graphqlOperationId\");\n const operationType = metaStr(md, \"operationType\");\n if (graphqlOperationId == null || operationType == null) {\n return undefined;\n }\n return {\n type: \"graphql\",\n ...meta,\n operationType: operationType as FernNavigation.GraphQlNode[\"operationType\"],\n graphqlOperationId: FernNavigation.GraphQlOperationId(graphqlOperationId),\n graphqlOperationIds: undefined,\n apiDefinitionId,\n availability: metaAvailability(md),\n playground: undefined\n };\n }\n\n return undefined;\n}\n\nfunction apiLeafPositionKey(node: ApiLeafNode): string {\n switch (node.type) {\n case \"endpoint\":\n return `endpoint:${node.endpointId}`;\n case \"webhook\":\n return `webhook:${node.webhookId}`;\n case \"webSocket\":\n return `webSocket:${node.webSocketId}`;\n case \"grpc\":\n return `grpc:${node.grpcId}`;\n case \"graphql\":\n return `graphql:${node.graphqlOperationId}`;\n }\n}\n\nfunction apiChildPositionKey(node: FernNavigation.ApiPackageChild): string | undefined {\n switch (node.type) {\n case \"endpoint\":\n case \"webhook\":\n case \"webSocket\":\n case \"grpc\":\n case \"graphql\":\n return apiLeafPositionKey(node);\n default:\n return undefined;\n }\n}\n\nfunction positionedApiLeafChildren(ctx: BuildContext, nav: NavRoute[], apiDefinitionId: string): PositionedApiChild[] {\n const rawLeafNodes: ApiLeafNode[] = [];\n const leafPositions = new Map<string, number>();\n const nonApiLeafNodes: PositionedApiChild[] = [];\n\n for (let i = 0; i < nav.length; i++) {\n const route = nav[i]!;\n const pos = route.displaySortOrder ?? i;\n const apiLeaf = apiLeafNodeFromNavRouteInternal(ctx, route, apiDefinitionId);\n if (apiLeaf != null) {\n rawLeafNodes.push(apiLeaf);\n const key = apiLeafPositionKey(apiLeaf);\n leafPositions.set(key, Math.min(leafPositions.get(key) ?? pos, pos));\n continue;\n }\n\n const node = artifactToNode(ctx, route);\n if (node?.type === \"page\" || node?.type === \"link\") {\n nonApiLeafNodes.push({ node, pos });\n }\n }\n\n const apiLeafNodes = mergeEndpointPairs(ctx, rawLeafNodes, nav);\n const positionedApiLeafNodes = apiLeafNodes.map((node, index): PositionedApiChild => {\n if (node.type === \"endpointPair\") {\n const streamPos = leafPositions.get(apiLeafPositionKey(node.stream)) ?? index;\n const nonStreamPos = leafPositions.get(apiLeafPositionKey(node.nonStream)) ?? index;\n return { node, pos: Math.min(streamPos, nonStreamPos) };\n }\n const key = apiChildPositionKey(node);\n return { node, pos: key != null ? (leafPositions.get(key) ?? index) : index };\n });\n\n return [...positionedApiLeafNodes, ...nonApiLeafNodes];\n}\n\n/**\n * Collect every endpoint/webhook navigation node from a single API segment's\n * nav routes. The root builder now populates apiReference children directly,\n * but this helper is still used by the ledger loader's per-apiDefinitionId\n * explorer methods (getApiLeafNodes) which scope to a single API definition.\n *\n * @internal Exported for the ledger loader's scoped explorer methods.\n */\nexport function collectApiLeafNodesFromNav(\n routes: NavRoute[],\n basePath: string,\n segmentApiDefinitionId: string\n): ApiLeafNode[] {\n const ctx = createBuildContext(basePath);\n return routes\n .map((route) => apiLeafNodeFromNavRouteInternal(ctx, route, segmentApiDefinitionId))\n .filter((node): node is ApiLeafNode => node != null);\n}\n\n/**\n * Read the apiDefinitionId off a segment's metadata, or undefined.\n * The matched types (apiReference, apiPackage, changelog) are the\n * subset of {@link StructuralSegmentType} that carry an apiDefinitionId.\n */\nexport function segmentApiDefinitionId(metadata: Segment[\"metadata\"]): string | undefined {\n switch (metadata.type) {\n case \"apiReference\":\n case \"apiPackage\":\n case \"changelog\":\n return metadata.apiDefinitionId;\n default:\n return undefined;\n }\n}\n\n// ── section-tree assembly within one scope ───────────────────────────────\n\ninterface ScopedSegment {\n seg: Segment;\n nav: NavRoute[];\n}\n\n/** Find the overview artifact (isOverview) within a segment's nav, if any. */\nfunction overviewRoute(nav: NavRoute[]): NavRoute | undefined {\n return nav.find((r) => r.type === \"markdown\" && metaBool(r.metadata, \"isOverview\"));\n}\n\n/**\n * Find the overview page for a section using the segment's own\n * `metadata.overviewPageId` when `overviewRoute` (isOverview flag on nav\n * routes) fails. This handles sections where the CLI stored the overview\n * reference on the segment metadata but didn't set `isOverview` on the page.\n *\n * Legacy compat: older CLI versions wrote `overviewPageId` on the segment\n * metadata but omitted the `isOverview` flag on the nav route itself. This\n * fallback keeps those segments working. Once all published sites have been\n * re-published with a CLI that sets `isOverview`, this path can be removed.\n */\nfunction overviewRouteFromSegmentMeta(seg: Segment, nav: NavRoute[]): NavRoute | undefined {\n const overviewPageId = metaStr(seg.metadata, \"overviewPageId\");\n if (overviewPageId == null) {\n return undefined;\n }\n return nav.find((r) => metaStr(r.metadata, \"pageId\") === overviewPageId);\n}\n\n/**\n * Infer the section slug for a root section (`seg.section === \"\"`) from its\n * child pages' fullPaths. When the section path is empty and there is no\n * overview page, we look at the first routable page whose content slug\n * extends beyond the scope prefix. The first path segment past the scope\n * prefix is the section's implicit slug segment (e.g. `overview` in\n * `{scope}/overview/introduction`).\n *\n * Limitations:\n * - Assumes the first routable child's path structure matches the section\n * slug. Heterogeneous child path prefixes (rare) would infer incorrectly.\n * - Sections with only single-segment children (path = `{scope}/pagename`)\n * cannot be distinguished from bare pages, so inference falls through to\n * the bare scope prefix. This is acceptable — the section effectively\n * has no URL-visible slug of its own.\n */\nfunction inferSectionSlugFromNav(\n ctx: BuildContext,\n nav: NavRoute[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.Slug | undefined {\n const scopeStr = String(scopePrefix);\n const prefix = scopeStr !== \"\" ? scopeStr + \"/\" : \"\";\n for (const r of nav) {\n if (r.fullPath == null) {\n continue;\n }\n if (r.type !== \"markdown\" && r.type !== \"page\") {\n continue;\n }\n const contentSlug = String(ctx.contentSlug(r.fullPath));\n const rel =\n prefix !== \"\" ? (contentSlug.startsWith(prefix) ? contentSlug.slice(prefix.length) : null) : contentSlug;\n if (rel == null) {\n continue;\n }\n const parts = rel.split(\"/\");\n // Need at least 2 parts (section-slug / page-name) to distinguish\n // a section slug from a bare page slug.\n if (parts.length >= 2 && parts[0] !== \"\") {\n return FernNavigation.slugjoin(scopePrefix, parts[0]!);\n }\n }\n // No child had a multi-segment path past the scope prefix — fall back\n // to the caller's default (bare scope prefix).\n return undefined;\n}\n\n/**\n * Derive the slug for a structural section / apiReference node.\n *\n * When the section has its own routable overview page, that page's `fullPath`\n * (basepath-relative) is the canonical slug — re-prefix the basepath via\n * {@link BuildContext.contentSlug}. When it does NOT (a pure sidebar grouping\n * with no own route), the node still needs a slug for the tree, but\n * `seg.section` is only a structural path string (`release-information`,\n * `develop-with-the-cli/run-airflow-locally`) that does NOT carry the scope\n * prefix.\n *\n * The fallback MUST be rooted at the enclosing scope (`{basepath}/{product}/\n * {version}/…`) rather than just `{basepath}/{section}`. `NodeCollector`'s\n * default-version pruning (`pruneVersionNode` → `toDefaultSlug`) walks the\n * default version subtree and SKIPS a node — and all its descendants — whose\n * slug does not start with the version slug (it assumes such a node was already\n * pruned). A structural section slugged `{basepath}/{section}` does not start\n * with the version slug, so its child pages (e.g. `…/v-1-42/release-notes`)\n * would never be pruned into their clean default-version alias, and the clean\n * URL 404s with `page-not-in-nav` on basepath sites. Rooting the structural\n * slug at the scope prefix keeps the subtree inside the prune window.\n * (ADR-0014 #6.)\n */\nfunction structuralNodeSlug(\n ctx: BuildContext,\n overviewFullPath: string | null | undefined,\n section: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.Slug {\n if (overviewFullPath != null) {\n return ctx.contentSlug(overviewFullPath);\n }\n // No own route: derive a structural slug rooted at the enclosing scope so it\n // stays within the default-version prune window. `scopePrefix` is already\n // basepath-absolute (it is the version/product/tab node's slug), so join it\n // directly rather than going through `contentSlug` (which would re-prefix\n // the basepath).\n const cleanSection = stripSyntheticSegments(section);\n return cleanSection !== \"\" ? FernNavigation.slugjoin(scopePrefix, cleanSection) : scopePrefix;\n}\n\nfunction stripLeadingScopePrefix(section: string, scopePrefix: FernNavigation.Slug): string {\n const prefix = scopePrefix as string;\n if (prefix === \"\") {\n return section;\n }\n if (section === prefix) {\n return \"\";\n }\n if (section.startsWith(prefix + \"/\")) {\n return section.slice(prefix.length + 1);\n }\n return section;\n}\n\n/** A navigation child annotated with its original position from the V1 tree. */\ninterface AnnotatedChild {\n node: FernNavigation.NavigationChild;\n childIndex: number | undefined;\n}\n\nfunction computeDuplicateSiblingSortBoundaries(\n siblings: ScopedSegment[]\n): Map<ScopedSegment, { lo: number; hi: number }> {\n const result = new Map<ScopedSegment, { lo: number; hi: number }>();\n const byPath = new Map<string, ScopedSegment[]>();\n\n for (const sibling of siblings) {\n if (metaStr(sibling.seg.metadata, \"type\") !== \"section\") {\n continue;\n }\n const group = byPath.get(sibling.seg.section) ?? [];\n group.push(sibling);\n byPath.set(sibling.seg.section, group);\n }\n\n for (const [, group] of byPath) {\n if (group.length <= 1) {\n continue;\n }\n for (let i = 0; i < group.length; i++) {\n result.set(group[i]!, {\n lo: group[i]!.seg.sortOrder,\n hi: i + 1 < group.length ? group[i + 1]!.seg.sortOrder : Number.MAX_SAFE_INTEGER\n });\n }\n }\n\n return result;\n}\n\n/**\n * Merge leaf children and section children by their original V1 tree position.\n * Leaves carry position via `displaySortOrder` (stored in nav routes), sections\n * carry position via `childIndex` in segment metadata. When both have positions,\n * we interleave them in ascending order. When positions are absent (old\n * deployments without childIndex), falls back to `[...leaves, ...sections]`.\n */\nfunction mergeChildrenByPosition(\n ctx: BuildContext,\n nav: NavRoute[],\n sectionChildren: AnnotatedChild[]\n): FernNavigation.NavigationChild[] {\n const leafNodes: Array<{ node: FernNavigation.NavigationChild; pos: number }> = [];\n for (let i = 0; i < nav.length; i++) {\n const route = nav[i]!;\n const node = artifactToNode(ctx, route);\n if (node != null) {\n leafNodes.push({ node, pos: route.displaySortOrder ?? i });\n }\n }\n\n const hasChildIndex = sectionChildren.some((s) => s.childIndex != null);\n if (!hasChildIndex) {\n return [...leafNodes.map((l) => l.node), ...sectionChildren.map((s) => s.node)];\n }\n\n const positioned: Array<{ node: FernNavigation.NavigationChild; pos: number }> = [...leafNodes];\n for (const s of sectionChildren) {\n positioned.push({ node: s.node, pos: s.childIndex ?? Number.MAX_SAFE_INTEGER });\n }\n\n positioned.sort((a, b) => a.pos - b.pos);\n return positioned.map((p) => p.node);\n}\n\nfunction sectionNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n sectionChildren: AnnotatedChild[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.SectionNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav) ?? overviewRouteFromSegmentMeta(seg, nav);\n // Prefer the overview page's actual pageId (which is what V1/V2 use\n // for content-ID dedup), falling back to the segment metadata's\n // overviewPageId. The two can diverge when the publisher writes a\n // section-specific overviewPageId that differs from the page content\n // ID, breaking cross-section canonical-slug dedup.\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n // Strip the leading scope prefix to prevent double-prefixing when the\n // section path already includes the scope (e.g. section=\"2026-02-09\"\n // with scopePrefix=\"2026-02-09\" would produce \"2026-02-09/2026-02-09\").\n const relSection = stripLeadingScopePrefix(seg.section, scopePrefix);\n let slug = structuralNodeSlug(ctx, overview?.fullPath, relSection, scopePrefix);\n\n // When the section path is empty and there is no overview page, the\n // structural slug collapses to the bare scope prefix (the tab slug),\n // losing the section segment that v2 derives from the overview page or\n // the config's urlSlug. Infer it from child page fullPaths instead —\n // but only when the inferred slug does NOT collide with an existing\n // child page slug. A collision causes mutableUpdatePointsTo to clear\n // pointsTo (slug === redirect target), breaking the breadcrumb link.\n // (See the analogous guard on apiReferenceNode.)\n if (relSection === \"\" && overview?.fullPath == null) {\n const inferred = inferSectionSlugFromNav(ctx, nav, scopePrefix);\n if (inferred != null) {\n const inferredStr = String(inferred);\n const collides = nav.some((r) => r.fullPath != null && String(ctx.contentSlug(r.fullPath)) === inferredStr);\n if (!collides) {\n slug = inferred;\n }\n }\n }\n const defaults = withMetadataDefaults({\n id: ctx.nodeId(`section:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n });\n\n return {\n type: \"section\",\n ...defaults,\n collapsed: metaCollapsed(seg.metadata) ?? defaults.collapsed,\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n collapsible: metaBool(seg.metadata, \"collapsible\") ?? (metaCollapsed(seg.metadata) === true ? true : undefined),\n collapsedByDefault:\n metaBool(seg.metadata, \"collapsedByDefault\") ?? (metaCollapsed(seg.metadata) === true ? true : undefined),\n availability: metaAvailability(seg.metadata),\n // Don't read pointsTo from metadata for sections; let\n // mutableUpdatePointsTo compute it via followRedirect so that\n // self-referencing redirects are cleared, matching v2 behavior.\n pointsTo: undefined,\n children: mergeChildrenByPosition(ctx, nav, sectionChildren)\n };\n}\n\n/**\n * Find direct child apiPackage segments of `parentSection`. A direct child has\n * `parentSectionPath(seg.section) === parentSection`, or is an orphaned segment\n * whose nearest existing ancestor is `parentSection`.\n */\nfunction directChildApiPackages(\n parentSection: string,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string\n): ScopedSegment[] {\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n return scopeSegs\n .filter((s) => {\n if (metaStr(s.seg.metadata, \"type\") !== \"apiPackage\") {\n return false;\n }\n if (metaStr(s.seg.metadata, \"apiDefinitionId\") !== apiDefinitionId) {\n return false;\n }\n const parent = parentSectionPath(s.seg.section);\n if (parent === parentSection) {\n return true;\n }\n // Orphaned: parent doesn't exist, adopt if nearest ancestor is parentSection.\n if (!sectionPaths.has(parent)) {\n return nearestExistingAncestor(s.seg.section, sectionPaths) === parentSection;\n }\n return false;\n })\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n}\n\n/**\n * Build the children of an API section (apiReference or apiPackage) by combining\n * the segment's own leaf nodes with nested apiPackage children.\n */\nfunction buildApiChildren(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiPackageChild[] {\n const { seg, nav } = scoped;\n\n // Build leaf nodes from this segment's own nav routes (not descendants).\n // API references can contain normal docs pages and links in addition to\n // endpoint leaves, so include markdown/link artifacts here instead of only\n // API leaf types.\n const leafNodes = positionedApiLeafChildren(ctx, nav, apiDefinitionId);\n\n // Build nested ApiPackageNodes from direct child apiPackage segments.\n let childPackages = directChildApiPackages(seg.section, scopeSegs, apiDefinitionId);\n\n // When multiple API-type segments share the same section path (skipUrlSlug\n // group packages that collapse to their parent's section), children from\n // different groups get mixed together. Scope children to this segment's DFS\n // subtree using sortOrder boundaries to restore correct ownership.\n const samePathApiSiblings = scopeSegs.filter(\n (s) =>\n s.seg.section === seg.section &&\n s.seg.sortOrder !== seg.sortOrder &&\n API_NODE_SEGMENT_TYPES.has(metaStr(s.seg.metadata, \"type\") ?? \"\")\n );\n const hasCollapsedGroups = samePathApiSiblings.length > 0;\n\n if (hasCollapsedGroups && metaStr(seg.metadata, \"type\") !== \"apiReference\") {\n // This is a group package sharing its section with siblings.\n // Only claim children whose sortOrder falls within our DFS subtree.\n const nextSibling = samePathApiSiblings\n .filter((s) => s.seg.sortOrder > seg.sortOrder)\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder)[0];\n const lo = seg.sortOrder;\n const hi = nextSibling?.seg.sortOrder ?? Number.MAX_SAFE_INTEGER;\n childPackages = childPackages.filter((c) => c.seg.sortOrder > lo && c.seg.sortOrder < hi);\n }\n const packageNodes = childPackages.map((child) => ({\n node: apiPackageChildNode(\n ctx,\n child,\n scopeSegs,\n apiDefinitionId,\n scopePrefix\n ) as FernNavigation.ApiPackageChild,\n childIndex: metaNum(child.seg.metadata, \"childIndex\")\n }));\n\n // When collapsed groups are detected at apiReference level, children's\n // childIndex values are relative to different parent groups and cannot be\n // used for interleaving. Fall back to sortOrder (DFS creation order).\n if (hasCollapsedGroups && metaStr(seg.metadata, \"type\") === \"apiReference\") {\n return [...leafNodes, ...packageNodes.map((p, i) => ({ node: p.node, pos: leafNodes.length + i }))]\n .sort((a, b) => a.pos - b.pos)\n .map((p) => p.node);\n }\n\n // Interleave by position when childIndex metadata is available\n const hasChildIndex = packageNodes.some((p) => p.childIndex != null);\n if (!hasChildIndex) {\n return [...leafNodes, ...packageNodes.map((p) => ({ node: p.node, pos: Number.MAX_SAFE_INTEGER }))]\n .sort((a, b) => a.pos - b.pos)\n .map((p) => p.node);\n }\n\n const positioned: Array<{ node: FernNavigation.ApiPackageChild; pos: number }> = [];\n positioned.push(...leafNodes);\n for (const p of packageNodes) {\n positioned.push({ node: p.node, pos: p.childIndex ?? Number.MAX_SAFE_INTEGER });\n }\n\n positioned.sort((a, b) => a.pos - b.pos);\n return positioned.map((p) => p.node);\n}\n\n/**\n * Build an ApiPackageNode from an apiPackage segment, recursively nesting any\n * deeper sub-packages.\n */\nfunction apiPackageChildNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n parentApiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiPackageNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n // Prefer the overview page's actual pageId for content-ID dedup,\n // falling back to segment metadata's overviewPageId (see sectionNode).\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n const apiDefinitionId = metaStr(seg.metadata, \"apiDefinitionId\") ?? parentApiDefinitionId;\n // Use structuralNodeSlug so the package gets its own slug (matching V2)\n // rather than inheriting the first endpoint's path.\n const slug = structuralNodeSlug(\n ctx,\n overview?.fullPath,\n stripLeadingScopePrefix(seg.section, scopePrefix),\n scopePrefix\n );\n\n const children = buildApiChildren(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n\n return {\n type: \"apiPackage\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`api-pkg:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: toViewers(metaStrArr(seg.metadata, \"viewers\")),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n apiDefinitionId: FernNavigation.ApiDefinitionId(apiDefinitionId),\n availability: metaAvailability(seg.metadata),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n // Don't read pointsTo from metadata; let mutableUpdatePointsTo\n // compute it via followRedirect, matching v2 behavior.\n pointsTo: undefined,\n children,\n playground: undefined\n };\n}\n\n/**\n * Merge endpoint nodes that were originally part of an `endpointPair` in the V1\n * tree. The publish transform stamps both artifacts with a shared\n * `endpointPairKey` in their route metadata; this function groups endpoints by\n * that key and reconstructs `EndpointPairNode`s — matching the v2 nav tree\n * structure where stream/non-stream variants share a single page with a toggle.\n */\n/** @internal Exported for testing only. */\nexport function mergeEndpointPairs(\n ctx: BuildContext,\n leafNodes: ApiLeafNode[],\n allNav: NavRoute[]\n): FernNavigation.ApiPackageChild[] {\n // Build a lookup from endpointId → endpointPairKey using route metadata.\n // Only REST routes carry `endpointPairKey`.\n const endpointIdToPairKey = new Map<string, string>();\n for (const route of allNav) {\n if (route.type !== \"rest\") {\n continue;\n }\n const pairKey = metaStr(route.metadata, \"endpointPairKey\");\n const endpointId = metaStr(route.metadata, \"endpointId\");\n if (pairKey != null && endpointId != null) {\n endpointIdToPairKey.set(endpointId, pairKey);\n }\n }\n\n // If no pair keys exist (pre-existing data without the key), return as-is.\n if (endpointIdToPairKey.size === 0) {\n return leafNodes;\n }\n\n const result: FernNavigation.ApiPackageChild[] = [];\n // Track which pair keys we've already merged so we only emit the pair once.\n const mergedPairKeys = new Map<string, number>();\n\n for (const node of leafNodes) {\n if (node.type !== \"endpoint\") {\n result.push(node);\n continue;\n }\n\n const pairKey = endpointIdToPairKey.get(String(node.endpointId));\n if (pairKey == null) {\n result.push(node);\n continue;\n }\n\n const existingIdx = mergedPairKeys.get(pairKey);\n if (existingIdx == null) {\n // First endpoint of the pair — push it and record its position.\n mergedPairKeys.set(pairKey, result.length);\n result.push(node);\n } else {\n // Second endpoint — merge with the first into an EndpointPairNode.\n const first = result[existingIdx];\n if (first == null || first.type !== \"endpoint\") {\n result.push(node);\n continue;\n }\n\n // Determine which is stream and which is non-stream.\n const stream = node.isResponseStream ? node : first;\n const nonStream = node.isResponseStream ? first : node;\n\n // Point the stream endpoint's canonicalSlug to the non-stream slug\n // so the sitemap deduplicates them (matching v2 behavior where the\n // v1→latest migrator's title-disambiguation cache achieves the same).\n stream.canonicalSlug = nonStream.slug;\n\n const pairNode: FernNavigation.EndpointPairNode = {\n id: ctx.nodeId(`endpoint-pair:${pairKey}`),\n type: \"endpointPair\",\n collapsed: undefined,\n stream,\n nonStream\n };\n result[existingIdx] = pairNode;\n }\n }\n\n return result;\n}\n\nfunction apiReferenceNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ApiReferenceNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n // Prefer the overview page's actual pageId for content-ID dedup,\n // falling back to segment metadata's overviewPageId (see sectionNode).\n const overviewPageId = metaStr(overview?.metadata, \"pageId\") ?? metaStr(seg.metadata, \"overviewPageId\");\n const apiDefinitionId = metaStr(seg.metadata, \"apiDefinitionId\") ?? \"\";\n // Slug: prefer the overview route, else a structural slug rooted at the\n // enclosing scope (so the subtree stays inside the default-version prune\n // window — see {@link structuralNodeSlug}).\n // NOTE: do NOT fall back to nav[0]?.fullPath here. When the apiReference\n // has direct endpoint children (no sub-packages), that would set the\n // apiReference's slug to the first endpoint's slug. Then\n // mutableUpdatePointsTo clears pointsTo (slug === redirect target),\n // breaking the breadcrumb link.\n const slug = structuralNodeSlug(\n ctx,\n overview?.fullPath,\n stripLeadingScopePrefix(seg.section, scopePrefix),\n scopePrefix\n );\n\n const children = buildApiChildren(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n const changelog = attachedApiChangelogNode(ctx, scoped, scopeSegs, apiDefinitionId, scopePrefix);\n\n return {\n type: \"apiReference\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`api:${slug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n apiDefinitionId: FernNavigation.ApiDefinitionId(apiDefinitionId),\n availability: metaAvailability(seg.metadata),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n paginated: metaBool(seg.metadata, \"paginated\"),\n showErrors: metaBool(seg.metadata, \"showErrors\"),\n hideTitle: metaBool(seg.metadata, \"hideTitle\"),\n // Don't read pointsTo from metadata; let mutableUpdatePointsTo\n // compute it via followRedirect, matching v2 behavior.\n pointsTo: undefined,\n children,\n changelog,\n playground: undefined,\n postmanCollectionUrl: undefined\n };\n}\n\nfunction attachedApiChangelogNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopeSegs: ScopedSegment[],\n apiDefinitionId: string,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ChangelogNode | undefined {\n const { seg } = scoped;\n const candidates = scopeSegs.filter((candidate) => {\n if (metaStr(candidate.seg.metadata, \"type\") !== \"changelog\") {\n return false;\n }\n return metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId;\n });\n const apiReferenceCount = scopeSegs.filter((candidate) => {\n return (\n metaStr(candidate.seg.metadata, \"type\") === \"apiReference\" &&\n metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId\n );\n }).length;\n const changelogSeg =\n candidates.find((candidate) => parentSectionPath(candidate.seg.section) === seg.section) ??\n (apiReferenceCount === 1 ? candidates[0] : undefined);\n return changelogSeg != null ? changelogNode(ctx, changelogSeg, scopePrefix) : undefined;\n}\n\nfunction hasOwningApiReference(scoped: ScopedSegment, scopeSegs: ScopedSegment[]): boolean {\n const apiDefinitionId = metaStr(scoped.seg.metadata, \"apiDefinitionId\");\n if (apiDefinitionId == null || metaStr(scoped.seg.metadata, \"type\") !== \"changelog\") {\n return false;\n }\n const candidates = scopeSegs.filter((candidate) => {\n if (metaStr(candidate.seg.metadata, \"type\") !== \"apiReference\") {\n return false;\n }\n return metaStr(candidate.seg.metadata, \"apiDefinitionId\") === apiDefinitionId;\n });\n return (\n candidates.some((candidate) => parentSectionPath(scoped.seg.section) === candidate.seg.section) ||\n candidates.length === 1\n );\n}\n\n/**\n * True when this segment is an `apiPackage` that will be nested under an in-scope\n * `apiReference` for the same API by {@link buildApiChildren}, and therefore must\n * NOT also be emitted as a standalone root/section node.\n *\n * Without this guard, a skip-slug apiReference (section \"\") leaves its resource\n * subpackages with `parentSectionPath === \"\"`, so they look root-level and get\n * emitted a second time as always-expanded top-level apiReference nodes —\n * duplicating every resource and endpoint in the sidebar (the \"67 apiReference\n * nodes vs 1\" API-reference regression).\n *\n * Reachability mirrors {@link directChildApiPackages}: walk up the section-path\n * chain (hopping to nearestExistingAncestor when a parent section is absent)\n * until we reach an apiReference's section. If no apiReference is an ancestor the\n * package is left where it is, so it can never be dropped.\n */\nfunction isNestedApiPackage(scoped: ScopedSegment, scopeSegs: ScopedSegment[]): boolean {\n if (metaStr(scoped.seg.metadata, \"type\") !== \"apiPackage\") {\n return false;\n }\n const apiDefinitionId = metaStr(scoped.seg.metadata, \"apiDefinitionId\");\n if (apiDefinitionId == null) {\n return false;\n }\n const apiReferenceSections = new Set(\n scopeSegs\n .filter(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"apiReference\" &&\n metaStr(s.seg.metadata, \"apiDefinitionId\") === apiDefinitionId\n )\n .map((s) => s.seg.section)\n );\n if (apiReferenceSections.size === 0) {\n return false;\n }\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n const resolveParent = (section: string): string => {\n const parent = parentSectionPath(section);\n if (parent === \"\" || sectionPaths.has(parent)) {\n return parent;\n }\n return nearestExistingAncestor(section, sectionPaths);\n };\n let current = scoped.seg.section;\n const seen = new Set<string>([current]);\n // Walk up until we hit an owning apiReference (nested → true) or run out.\n for (;;) {\n const parent = resolveParent(current);\n if (apiReferenceSections.has(parent)) {\n return true;\n }\n if (parent === \"\" || seen.has(parent)) {\n return false;\n }\n seen.add(parent);\n current = parent;\n }\n}\n\nfunction changelogNode(\n ctx: BuildContext,\n scoped: ScopedSegment,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.ChangelogNode {\n const { seg, nav } = scoped;\n const overview = overviewRoute(nav);\n const overviewPageId = overview != null ? metaStr(overview.metadata, \"pageId\") : undefined;\n\n // Group changelog entries by year → month. Entry dates are ISO strings.\n const entries = nav.filter((r) => r.type === \"changelog\");\n const byYear = new Map<number, Map<number, FernNavigation.ChangelogEntryNode[]>>();\n for (const r of entries) {\n const dateStr = metaStr(r.metadata, \"date\");\n const date = dateStr != null ? new Date(dateStr) : new Date(0);\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1;\n const entry: FernNavigation.ChangelogEntryNode = {\n type: \"changelogEntry\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-entry:${r.fullPath ?? metaStr(r.metadata, \"pageId\") ?? \"\"}`),\n title: metaStr(r.metadata, \"title\") ?? \"\",\n slug: ctx.contentSlug(r.fullPath ?? \"\"),\n icon: metaStr(r.metadata, \"icon\"),\n hidden: r.hidden,\n authed: metaBool(r.metadata, \"authed\"),\n viewers: toViewers(metaStrArr(r.metadata, \"viewers\")),\n orphaned: metaBool(r.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(r.metadata)\n }),\n pageId: FernNavigation.PageId(metaStr(r.metadata, \"pageId\") ?? \"\"),\n noindex: metaBool(r.metadata, \"noindex\"),\n date: dateStr ?? \"\",\n tags: metaStrArr(r.metadata, \"tags\")\n };\n let months = byYear.get(year);\n if (months == null) {\n months = new Map();\n byYear.set(year, months);\n }\n const arr = months.get(month) ?? [];\n arr.push(entry);\n months.set(month, arr);\n }\n\n // The publish transform stores changelog section paths in two shapes:\n // • Changelog TABs: \"home/changelog\" (scope prefix baked in)\n // • Changelog sidebar children: \"changelog\" (relative to the tab)\n // `structuralNodeSlug` unconditionally joins `scopePrefix + section`, so\n // an already-scoped section gets double-prefixed (\"home/home/changelog\").\n // Strip the leading scope prefix when present so the join is idempotent.\n const relativeSection = stripLeadingScopePrefix(seg.section, scopePrefix);\n const baseSlug = structuralNodeSlug(ctx, overview?.fullPath, relativeSection, scopePrefix);\n const years: FernNavigation.ChangelogYearNode[] = [...byYear.entries()]\n .sort((a, b) => b[0] - a[0])\n .map(([year, months]) => ({\n type: \"changelogYear\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-year:${baseSlug}/${year}`),\n title: String(year),\n slug: asSlug(`${baseSlug}/${year}`),\n icon: undefined,\n hidden: undefined\n }),\n year,\n children: [...months.entries()]\n .sort((a, b) => b[0] - a[0])\n .map(([month, children]) => ({\n type: \"changelogMonth\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`cl-month:${baseSlug}/${year}/${month}`),\n title: String(month),\n slug: asSlug(`${baseSlug}/${year}/${month}`),\n icon: undefined,\n hidden: undefined\n }),\n month,\n children\n }))\n }));\n\n return {\n type: \"changelog\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`changelog:${baseSlug}`),\n title: metaStr(seg.metadata, \"title\") ?? \"\",\n slug: baseSlug,\n icon: metaStr(seg.metadata, \"icon\"),\n hidden: seg.hidden,\n authed: metaBool(seg.metadata, \"authed\"),\n viewers: mergeVariantViewers(seg),\n orphaned: metaBool(seg.metadata, \"orphaned\"),\n featureFlags: metaFeatureFlags(seg.metadata)\n }),\n overviewPageId: overviewPageId != null ? FernNavigation.PageId(overviewPageId) : undefined,\n noindex: metaBool(overview?.metadata, \"noindex\") ?? metaBool(seg.metadata, \"noindex\"),\n children: years\n };\n}\n\n/** The immediate parent section path of a section path (\"a/b/c\" → \"a/b\", \"a\" → \"\"). */\nfunction parentSectionPath(sectionPath: string): string {\n const idx = sectionPath.lastIndexOf(\"/\");\n return idx === -1 ? \"\" : sectionPath.slice(0, idx);\n}\n\n/** Walk up the section path hierarchy to find the nearest ancestor that exists in the set. */\nfunction nearestExistingAncestor(sectionPath: string, existing: Set<string>): string {\n let current = parentSectionPath(sectionPath);\n while (current !== \"\") {\n if (existing.has(current)) {\n return current;\n }\n current = parentSectionPath(current);\n }\n return \"\";\n}\n\n/**\n * Build the section/api/changelog nodes whose immediate parent is `parentPath`,\n * recursing into nested sections. Also picks up orphaned segments whose parent\n * section doesn't exist but whose nearest existing ancestor is `parentPath`.\n */\nfunction buildSectionTree(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n parentPath: string,\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): AnnotatedChild[] {\n const sectionPaths = new Set(scopeSegs.map((s) => s.seg.section));\n\n // Look up the parent segment's sidebarDepth so we can prevent false\n // adoption of siblings whose slug-derived path happens to create a\n // parent-child hierarchy (e.g. \"sdks\" and \"sdks/checkout\" at depth 1).\n // When multiple segments share parentPath, prefer the shallowest (depth-0)\n // as the authoritative parent — deeper ones are skipUrlSlug children.\n const parentCandidates = scopeSegs.filter((s) => s.seg.section === parentPath);\n const parentSeg =\n parentCandidates.length > 1\n ? parentCandidates.reduce((best, cur) => {\n const bd = metaNum(best.seg.metadata, \"sidebarDepth\") ?? Number.MAX_SAFE_INTEGER;\n const cd = metaNum(cur.seg.metadata, \"sidebarDepth\") ?? Number.MAX_SAFE_INTEGER;\n return cd < bd ? cur : best;\n })\n : parentCandidates[0];\n const parentDepth = parentSeg != null ? metaNum(parentSeg.seg.metadata, \"sidebarDepth\") : undefined;\n\n const direct = scopeSegs\n .filter((s) => {\n const sec = s.seg.section;\n const type = metaStr(s.seg.metadata, \"type\");\n if (sec === \"\" || type === \"tabRoot\") {\n return false;\n }\n if (hasOwningApiReference(s, scopeSegs) || isNestedApiPackage(s, scopeSegs)) {\n return false;\n }\n // Segments marked as sidebar depth 0 are V1 root-level peers and\n // must never be adopted as children of another section.\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n if (depth === 0) {\n return false;\n }\n // SkipUrlSlug children: a segment sharing the parent's exact\n // section path at a deeper level is a child (e.g. Server-side SDKs\n // with sec=\"sdks\" depth=1 under Integration options sec=\"sdks\"\n // depth=0). Exclude the parent segment itself.\n if (sec === parentPath && s !== parentSeg && depth != null && parentDepth != null && depth > parentDepth) {\n return true;\n }\n // Segments at the same (or shallower) depth as the parent are\n // siblings, not children. This prevents false nesting when a\n // skipUrlSlug parent produces multi-segment section paths that\n // look hierarchical (e.g. sections \"sdks\" and \"sdks/checkout\"\n // both at depth 1 are siblings, not parent-child).\n if (parentDepth != null && depth != null && depth <= parentDepth) {\n return false;\n }\n const parent = parentSectionPath(sec);\n if (parent === parentPath) {\n return true;\n }\n // Orphaned segment: parent doesn't exist, walk up to find nearest\n // existing ancestor. If it's parentPath, adopt this segment.\n if (!sectionPaths.has(parent)) {\n return nearestExistingAncestor(sec, sectionPaths) === parentPath;\n }\n // The slug-derived parent exists, but check if it would reject\n // this candidate due to depth constraints (same or shallower\n // depth means siblings, not parent-child). If so, the candidate\n // is effectively orphaned — walk up past the rejecting parent\n // to find the nearest ancestor that CAN adopt it.\n if (depth != null) {\n const pSeg = scopeSegs.find((c) => c.seg.section === parent);\n const pDepth = pSeg != null ? metaNum(pSeg.seg.metadata, \"sidebarDepth\") : undefined;\n if (pDepth != null && depth <= pDepth) {\n return nearestExistingAncestor(parent, sectionPaths) === parentPath;\n }\n }\n return false;\n })\n .sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n\n const siblingBoundaries = computeDuplicateSiblingSortBoundaries(direct);\n\n return direct.map((s) => {\n const type = metaStr(s.seg.metadata, \"type\");\n const childIndex = metaNum(s.seg.metadata, \"childIndex\");\n let node: FernNavigation.NavigationChild;\n if (API_NODE_SEGMENT_TYPES.has(type ?? \"\")) {\n node = apiReferenceNode(ctx, s, scopeSegs, scopePrefix);\n } else if (type === \"changelog\") {\n node = changelogNode(ctx, s, changelogScopePrefix ?? scopePrefix);\n } else {\n // section (or unrecognised) → recurse for nested sections.\n // SkipUrlSlug children share the parent's section path, so\n // recursing with that path would re-find the same children\n // (infinite loop). Their subsections can't be distinguished by\n // path alone, so they get no recursive children — content comes\n // only from their leaf pages.\n const isSkipSlugChild = s.seg.section === parentPath;\n if (isSkipSlugChild) {\n node = sectionNode(ctx, s, [], scopePrefix);\n } else {\n const boundary = siblingBoundaries.get(s);\n const childScopeSegs =\n boundary != null\n ? scopeSegs.filter(\n (candidate) =>\n candidate.seg.sortOrder >= boundary.lo && candidate.seg.sortOrder < boundary.hi\n )\n : scopeSegs;\n node = sectionNode(\n ctx,\n s,\n buildSectionTree(ctx, childScopeSegs, s.seg.section, scopePrefix, changelogScopePrefix),\n scopePrefix\n );\n }\n }\n return { node, childIndex };\n });\n}\n\n// ── build a sidebarRoot for a single scope ─────────────────────────────────\n\n/**\n * When multiple root-level sections share the same section path (common for\n * versioned docs where all tab-level sections receive the version slug as\n * their path), we need to scope buildSectionTree so each section only adopts\n * the child segments that physically belong to it.\n *\n * Ownership is determined by sortOrder ranges: a section owns segments whose\n * sortOrder falls between its own and the next sibling section's sortOrder.\n * Returns a map only for sections that have duplicates; unique sections won't\n * appear (and should pass unfiltered scopeSegs to buildSectionTree).\n */\nfunction computeSiblingSortBoundaries(ordered: ScopedSegment[]): Map<ScopedSegment, { lo: number; hi: number }> {\n const result = new Map<ScopedSegment, { lo: number; hi: number }>();\n\n // Collect root-level sections grouped by their section path.\n // Sections with sec===\"\" (skip-slug sections) are included: when multiple\n // skip-slug sections exist at the root, they share path \"\" and need\n // boundaries so each only adopts its own children.\n const sectionPaths = new Set(ordered.map((s) => s.seg.section));\n const rootSections: ScopedSegment[] = [];\n for (const s of ordered) {\n const type = metaStr(s.seg.metadata, \"type\");\n const sec = s.seg.section;\n if (type !== \"section\") {\n continue;\n }\n if (sec === \"\") {\n rootSections.push(s);\n continue;\n }\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n const parent = parentSectionPath(sec);\n const isRootLevel =\n depth === 0 ||\n parent === \"\" ||\n (!sectionPaths.has(parent) && nearestExistingAncestor(sec, sectionPaths) === \"\");\n if (isRootLevel) {\n rootSections.push(s);\n }\n }\n\n // When a depth-0 section shares its path with a depth>0 section, the\n // deeper one is a skipUrlSlug child — not a true root-level sibling.\n // Remove it from the siblings list so boundaries aren't computed between\n // parent and child (which would give the parent a tiny ownership range).\n const depth0Paths = new Set<string>();\n for (const s of rootSections) {\n if (metaNum(s.seg.metadata, \"sidebarDepth\") === 0) {\n depth0Paths.add(s.seg.section);\n }\n }\n const effectiveRootSections = rootSections.filter((s) => {\n const d = metaNum(s.seg.metadata, \"sidebarDepth\");\n // Keep: depth-0 sections, sections without depth metadata, and\n // sections whose path has no depth-0 owner.\n return d === 0 || d == null || !depth0Paths.has(s.seg.section);\n });\n\n // Group by section path — only paths with >1 section need boundaries.\n const byPath = new Map<string, ScopedSegment[]>();\n for (const s of effectiveRootSections) {\n const group = byPath.get(s.seg.section) ?? [];\n group.push(s);\n byPath.set(s.seg.section, group);\n }\n\n for (const [, siblings] of byPath) {\n if (siblings.length <= 1) {\n continue;\n }\n // Siblings are already in sortOrder (from `ordered`).\n for (let i = 0; i < siblings.length; i++) {\n const lo = siblings[i]!.seg.sortOrder;\n const hi = i + 1 < siblings.length ? siblings[i + 1]!.seg.sortOrder : Number.MAX_SAFE_INTEGER;\n result.set(siblings[i]!, { lo, hi });\n }\n }\n\n return result;\n}\n\n/**\n * Assemble the children of a scope's sidebar root in cross-segment order.\n * `tabRoot` segments contribute their page/link artifacts inline at their\n * sort position; depth-0 `section`/`apiReference`/`changelog` segments become\n * their own nodes (with nested sections attached recursively).\n *\n * Segments whose parent section path doesn't correspond to any existing\n * segment are \"orphaned\" and emitted at the top level. This happens when\n * the publish transform skips segment creation for an apiReference with no\n * direct artifacts (e.g. no overview page), leaving only apiPackage children\n * like `rest-api/store` with no `rest-api` parent segment.\n */\nfunction buildSidebarRootChildren(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootChild[] {\n const ordered = [...scopeSegs].sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n const sectionPaths = new Set(ordered.map((s) => s.seg.section));\n // `pos` is the original V1 child position when known — `displaySortOrder`\n // for root-level loose artifacts, `metadata.childIndex` for depth-0\n // segments. Both index into the SAME child list at write time, so they\n // interleave directly (e.g. [page 0, page 1, section 2…15, page 16, 17]).\n const annotated: Array<{ node: FernNavigation.NavigationChild; pos: number | undefined; isLeaf: boolean }> = [];\n\n // ── Sibling section ownership ────────────────────────────────────────\n //\n // Multiple root-level sections can share the same section path (e.g.\n // three sections all with path equal to the version slug). When this\n // happens, buildSectionTree would incorrectly give ALL child subsections\n // to each sibling. We resolve ownership via sortOrder: a section owns\n // segments whose sortOrder falls between its own and the next sibling's.\n //\n // Computed first because hasRootSection (below) uses it to decide\n // whether bounded skip-slug siblings should activate adoption.\n const siblingBoundaries = computeSiblingSortBoundaries(ordered);\n\n // ── Root-section adoption flow ──────────────────────────────────────\n //\n // A scope may contain a \"root section\" — a segment with type \"section\"\n // and section path \"\". When present, it acts as a structural wrapper:\n //\n // hasRootSection = true\n // │\n // ├─ (A) tabRoot / loose artifacts (sec==\"\", !STRUCTURAL_SEGMENT_TYPES)\n // │ → emit pages/links inline at their displaySortOrder\n // │\n // ├─ (B) the root section itself (sec==\"\", type==\"section\")\n // │ → buildSectionTree adopts nested children (depth > 0)\n // │ → emit one sectionNode wrapping the subtree\n // │\n // └─ (C) depth-0 sections (sidebarDepth==0 or parentSectionPath==\"\")\n // → emit directly as root children (not adopted by B)\n //\n // Without a root section, depth-0 sections are emitted directly.\n //\n // A section with sec==\"\" AND `childIndex` in its metadata is a sibling\n // inside a V1 sidebarGroup that has skipUrlSlug — not a true structural\n // wrapper. `walkNavSubTrees` always passes `childIndex`; direct\n // sidebarRoot children (true wrappers) never receive one.\n //\n // Such siblings only activate adoption when they have sortOrder\n // boundaries (multiple sec=\"\" sections sharing the same path), which\n // correctly scope each section's children. A *single* unbounded\n // skip-slug sibling (e.g. mangopay's \"Introduction\") must NOT adopt\n // its depth-0 peers — doing so produces spurious breadcrumb entries.\n const hasRootSection = ordered.some(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"section\" &&\n s.seg.section === \"\" &&\n (metaNum(s.seg.metadata, \"childIndex\") == null || siblingBoundaries.has(s))\n );\n\n // True when a section with sec=\"\" has NO childIndex — this is a structural\n // root wrapper (not a skip-slug sibling with an index). For old data\n // without sidebarDepth, sections under a true root wrapper should still\n // be adopted; sections alongside skip-slug siblings should not.\n const hasTrueRootWrapper = ordered.some(\n (s) =>\n metaStr(s.seg.metadata, \"type\") === \"section\" &&\n s.seg.section === \"\" &&\n metaNum(s.seg.metadata, \"childIndex\") == null\n );\n\n // Paths that have a depth-0 section — deeper sections sharing that path\n // are skipUrlSlug children adopted by the depth-0 section, not root peers.\n const depth0SectionPaths = new Set<string>();\n for (const s of ordered) {\n if (metaStr(s.seg.metadata, \"type\") === \"section\" && metaNum(s.seg.metadata, \"sidebarDepth\") === 0) {\n depth0SectionPaths.add(s.seg.section);\n }\n }\n\n for (const s of ordered) {\n const type = metaStr(s.seg.metadata, \"type\");\n const sec = s.seg.section;\n\n if (hasOwningApiReference(s, scopeSegs) || isNestedApiPackage(s, scopeSegs)) {\n continue;\n }\n\n // Skip apiPackage segments that share their section path with an\n // apiReference sibling (skipUrlSlug structural wrappers). Their\n // children are already claimed by the apiReference via DFS ordering.\n if (type === \"apiPackage\") {\n const hasApiRefSibling = ordered.some(\n (sib) => sib.seg.section === sec && metaStr(sib.seg.metadata, \"type\") === \"apiReference\"\n );\n if (hasApiRefSibling) {\n continue;\n }\n }\n\n if (type === \"tabRoot\" && metaBool(s.seg.metadata, \"landingPage\") === true) {\n continue;\n }\n\n // (A) Loose artifacts: tabRoot or non-structural segments at section path \"\".\n // Structural types need their own node builders in (B)/(C) even when\n // their section path is \"\" (which happens with skip-slug: true).\n if (type === \"tabRoot\" || (sec === \"\" && !STRUCTURAL_SEGMENT_TYPES.has(type ?? \"\"))) {\n for (const r of s.nav) {\n const node = artifactToNode(ctx, r);\n if (node != null) {\n annotated.push({ node, pos: r.displaySortOrder ?? undefined, isLeaf: true });\n }\n }\n continue;\n }\n\n // (B) Root section wrapper — adopts depth-0 children via buildSectionTree.\n // Only applies to true root wrappers (no childIndex); sibling\n // sections with skipUrlSlug (have childIndex) fall through to (C).\n // When multiple sections share sec===\"\" (skip-slug), scope children\n // to each section's sortOrder range so subsections aren't duplicated.\n if (type === \"section\" && sec === \"\" && hasRootSection) {\n const bounds = siblingBoundaries.get(s);\n let ownedSegs =\n bounds != null\n ? scopeSegs.filter((seg) => seg.seg.sortOrder >= bounds.lo && seg.seg.sortOrder < bounds.hi)\n : scopeSegs;\n // When there's no true root wrapper (only skip-slug siblings),\n // exclude depth-undefined real-slug sections from adoption —\n // they are peers, not children, and case (C) emits them at\n // root level.\n if (!hasTrueRootWrapper) {\n ownedSegs = ownedSegs.filter((o) => {\n if (o.seg.section === \"\") {\n return true;\n }\n return metaNum(o.seg.metadata, \"sidebarDepth\") != null;\n });\n }\n const sectionChildren = buildSectionTree(ctx, ownedSegs, \"\", scopePrefix, changelogScopePrefix);\n const node = sectionNode(ctx, s, sectionChildren, scopePrefix);\n annotated.push({ node, pos: metaNum(s.seg.metadata, \"childIndex\"), isLeaf: false });\n continue;\n }\n\n // (C) Depth-0 or orphaned sections — emit at root unless already\n // adopted by a root section (B).\n const depth = metaNum(s.seg.metadata, \"sidebarDepth\");\n const parent = parentSectionPath(sec);\n const isRootLevel =\n depth === 0 ||\n parent === \"\" ||\n (!sectionPaths.has(parent) && nearestExistingAncestor(sec, sectionPaths) === \"\");\n // Skip sections already adopted by the root section wrapper (B).\n // Sections with sidebarDepth===0 are true V1 root peers that\n // buildSectionTree now excludes — they must NOT be skipped.\n // Sections with sidebarDepth>0 are nested children that SHOULD\n // be adopted, so they must be skipped to avoid duplication.\n // Sections without sidebarDepth (old data): skip only when a\n // true root wrapper exists (no childIndex on sec=\"\" section).\n // When hasRootSection is caused only by skip-slug siblings\n // (sec=\"\" WITH childIndex), depth-undefined sections are peers\n // that must NOT be skipped (Contentful Optimization SDK case).\n if (isRootLevel && hasRootSection && sec !== \"\" && (depth != null ? depth !== 0 : hasTrueRootWrapper)) {\n continue;\n }\n // Skip depth>0 sections that share their path with a depth-0\n // section — they are skipUrlSlug children adopted via\n // buildSectionTree by the depth-0 owner, not root peers.\n if (isRootLevel && depth != null && depth > 0 && depth0SectionPaths.has(sec)) {\n continue;\n }\n if (isRootLevel) {\n let node: FernNavigation.NavigationChild;\n if (API_NODE_SEGMENT_TYPES.has(type ?? \"\")) {\n node = apiReferenceNode(ctx, s, scopeSegs, scopePrefix);\n } else if (type === \"changelog\") {\n node = changelogNode(ctx, s, changelogScopePrefix ?? scopePrefix);\n } else {\n // Scope child segments to this section's sortOrder range when\n // sibling sections share the same path.\n const bounds = siblingBoundaries.get(s);\n const ownedSegs =\n bounds != null\n ? scopeSegs.filter((seg) => seg.seg.sortOrder >= bounds.lo && seg.seg.sortOrder < bounds.hi)\n : scopeSegs;\n // A section with sec=\"\" that reaches here (not adopted as a\n // root wrapper in case B) is a skipUrlSlug sibling.\n // When sortOrder boundaries exist (multiple sec=\"\" sections),\n // the scoped ownedSegs correctly limits which subsections\n // each section can adopt. When there are NO boundaries\n // (single sec=\"\" section), buildSectionTree(\"\") could\n // re-adopt depth-0 peers. However, when child segments\n // with sidebarDepth > 0 exist, buildSectionTree's\n // depth===0 filter already excludes peers — so adoption\n // is safe and necessary to preserve the parent hierarchy.\n const isUnboundedSkipSlugSibling =\n sec === \"\" && metaNum(s.seg.metadata, \"childIndex\") != null && bounds == null;\n const hasDepthMarkedChildren =\n isUnboundedSkipSlugSibling &&\n ownedSegs.some((candidate) => {\n const d = metaNum(candidate.seg.metadata, \"sidebarDepth\");\n return d != null && d > 0 && parentSectionPath(candidate.seg.section) === sec;\n });\n const sectionChildren =\n isUnboundedSkipSlugSibling && !hasDepthMarkedChildren\n ? []\n : buildSectionTree(ctx, ownedSegs, sec, scopePrefix, changelogScopePrefix);\n node = sectionNode(ctx, s, sectionChildren, scopePrefix);\n }\n // Shared/merged sections (paths not rooted in scopePrefix) must not\n // carry childIndex — their source-version positions would sort them\n // ahead of native sections. Only applies when sibling sections exist\n // (multiple sections sharing same path), indicating a versioned site\n // where shared sections were merged from a sibling version.\n const isSharedSection =\n siblingBoundaries.size > 0 && scopePrefix !== \"\" && sec !== \"\" && !sec.startsWith(scopePrefix);\n annotated.push({\n node,\n pos: isSharedSection ? undefined : metaNum(s.seg.metadata, \"childIndex\"),\n isLeaf: false\n });\n }\n }\n\n // Interleave by V1 position only when BOTH leaves and segments carry one.\n // Manifests written before displaySortOrder was carried through have\n // position-less leaves; reordering on childIndex alone would move every\n // loose page behind its sibling sections, so those keep the legacy\n // (segment-sortOrder) order. The seq tiebreak preserves legacy order for\n // equal or missing positions.\n const hasLeafPos = annotated.some((a) => a.isLeaf && a.pos != null);\n const hasSegmentPos = annotated.some((a) => !a.isLeaf && a.pos != null);\n const flat =\n hasLeafPos && hasSegmentPos\n ? annotated\n .map((a, seq) => ({ ...a, seq }))\n .sort(\n (x, y) =>\n (x.pos ?? Number.MAX_SAFE_INTEGER) - (y.pos ?? Number.MAX_SAFE_INTEGER) ||\n // When positions tie, prefer structural nodes (sections) over\n // leaves (pages). This handles stale tabRoot nav entries whose\n // displaySortOrder wasn't updated due to content-addressing\n // (the segment hash doesn't include childPosition).\n (x.isLeaf === y.isLeaf ? 0 : x.isLeaf ? 1 : -1) ||\n x.seq - y.seq\n )\n .map((a) => a.node)\n : annotated.map((a) => a.node);\n\n return groupSidebarRootChildren(ctx, flat);\n}\n\n/**\n * `SidebarRootChild` only permits SidebarGroupNode / ApiReferenceNode /\n * SectionNode / VariantedNode. Sections, apiReferences, and varianted nodes\n * pass through as direct root children (rendered as static headings via\n * SidebarRootSectionNode / SidebarRootApiPackageNode — always expanded, no\n * toggle). Pages, links, and changelogs are wrapped into a SidebarGroupNode\n * so they render via SidebarNavigationChild (mirroring the V1 tree structure\n * where sections are always direct SidebarRootChildren).\n */\nfunction groupSidebarRootChildren(\n ctx: BuildContext,\n children: FernNavigation.NavigationChild[]\n): FernNavigation.SidebarRootChild[] {\n const out: FernNavigation.SidebarRootChild[] = [];\n let run: FernNavigation.NavigationChild[] = [];\n\n const flushRun = () => {\n if (run.length > 0) {\n // Key off the first child's (already-stable) id so the group id is\n // stable across builds and unique per run.\n out.push({\n type: \"sidebarGroup\",\n id: ctx.nodeId(`sidebar-group:${run[0]?.id ?? \"\"}`),\n collapsed: undefined,\n children: run\n });\n run = [];\n }\n };\n\n for (const child of children) {\n if (child.type === \"apiReference\" || child.type === \"varianted\") {\n flushRun();\n out.push(child);\n } else if (child.type === \"section\" && !child.collapsible) {\n // Match V2 NavigationConfigConverter.groupSidebarRootChildren:\n // all non-collapsible sections become direct SidebarRootChildren\n // (rendered via SidebarRootSectionNode — always-expanded heading).\n // Only sections with explicit `collapsible: true` stay in a\n // sidebarGroup.\n flushRun();\n out.push(child);\n } else {\n run.push(child);\n }\n }\n flushRun();\n return out;\n}\n\nfunction buildSidebarRoot(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootNode {\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\",\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: buildSidebarRootChildren(ctx, scopeSegs, scopePrefix, changelogScopePrefix)\n };\n}\n\n// ── public entrypoint ───────────────────────────────────────────────────────\n\n/**\n * Build a full (un-pruned) `RootNode` from the decomposed ledger model.\n */\nexport function buildFullRootFromSegments(options: BuildRootOptions): FernNavigation.RootNode {\n const { basePath, rootSlug: sourceRootSlug, title, segments, navBySegment, skipSharedSectionMerge } = options;\n // Per-call state — never shared across concurrent builds.\n const ctx = createBuildContext(basePath);\n\n const scoped: ScopedSegment[] = segments\n // Infrastructure segments (files/redirects) are filtered server-side,\n // but guard here too.\n .filter((seg) => {\n const t = metaStr(seg.metadata, \"type\");\n return !INFRA_SEGMENT_TYPES.has(t ?? \"\");\n })\n .map((seg) => ({ seg, nav: navBySegment.get(seg.segmentHash) ?? [] }));\n\n const rootSlug = asSlug(sourceRootSlug ?? basePath);\n\n // Group by scope identity.\n const scopesByKey = new Map<string, ScopedSegment[]>();\n for (const s of scoped) {\n const key = scopeKey(s.seg);\n const arr = scopesByKey.get(key) ?? [];\n arr.push(s);\n scopesByKey.set(key, arr);\n }\n\n const products = uniqueDetails(scoped, \"product\");\n const versions = uniqueDetails(scoped, \"version\");\n const tabs = uniqueDetails(scoped, \"tab\");\n\n let child: FernNavigation.RootChild;\n\n if (products.length > 0) {\n child = buildProductGroup(ctx, products, scoped, rootSlug, skipSharedSectionMerge);\n } else if (versions.length > 0) {\n child = buildVersioned(ctx, versions, scoped, rootSlug, undefined, skipSharedSectionMerge);\n } else {\n child = buildUnversioned(ctx, scoped, rootSlug, tabs.length > 0);\n }\n\n // Derive root.pointsTo from the default child's metadata so root-slug\n // visits redirect correctly even when mutableUpdatePointsTo is skipped\n // (structure-only roots). On the full root mutableUpdatePointsTo\n // recomputes this via tree traversal; this seed value is only visible\n // on structure-only roots where the traversal is intentionally skipped.\n let rootPointsTo: FernNavigation.Slug | undefined;\n if (child.type === \"productgroup\") {\n if (child.landingPage != null && !child.landingPage.hidden) {\n rootPointsTo = child.landingPage.slug;\n } else {\n const defaultProduct = child.children.find((p) => p.default) ?? child.children[0];\n rootPointsTo = defaultProduct?.type === \"product\" ? defaultProduct.pointsTo : undefined;\n }\n } else if (child.type === \"versioned\") {\n const defaultVersion = child.children.find((v) => v.default) ?? child.children[0];\n rootPointsTo = defaultVersion?.pointsTo;\n } else if (child.type === \"unversioned\") {\n // Landing pages take priority: when the unversioned child has a\n // visible landing page the root should redirect there, not to the\n // first tab's content page.\n if (child.landingPage != null && !child.landingPage.hidden) {\n rootPointsTo = child.landingPage.slug;\n } else if (tabs.length > 0) {\n const firstTab = tabs[0];\n const pt = firstTab != null ? metaStr(firstTab.metadata, \"pointsTo\") : undefined;\n rootPointsTo = pt != null ? pointsToSlug(pt) : undefined;\n } else {\n const sorted = [...scoped].sort((a, b) => a.seg.sortOrder - b.seg.sortOrder);\n for (const s of sorted) {\n if (s.seg.hidden) {\n continue;\n }\n const pt = metaStr(s.seg.metadata, \"pointsTo\");\n if (pt != null) {\n rootPointsTo = pointsToSlug(pt);\n break;\n }\n }\n }\n }\n\n const root: FernNavigation.RootNode = {\n type: \"root\",\n version: \"v2\",\n ...withMetadataDefaults({ id: ctx.nodeId(\"root\"), title, slug: rootSlug, icon: undefined, hidden: undefined }),\n roles: undefined,\n pointsTo: rootPointsTo,\n child\n };\n\n return root;\n}\n\n// ── scaffolding builders ────────────────────────────────────────────────────\n\n/**\n * Collapse segment details by identity.\n *\n * Primary key is the detail's slug when non-empty — this deduplicates\n * stale rows from old publishes that share the same slug but have\n * different DB ids. When the slug is empty (skip-slug items) we fall\n * back to `detail.id` so that distinct skip-slug tabs/products aren't\n * collapsed into a single entry.\n *\n * Tabs always key by `d.id` because skip-slug tabs inherit their\n * parent's slug (e.g. the version slug \"v-2\"), so multiple distinct\n * tabs share the same slug — keying by slug would collapse them.\n *\n * Among duplicates at the same key we prefer the one whose metadata\n * carries a `pointsTo` value (richer / more recent publish).\n */\nfunction uniqueDetails(scoped: ScopedSegment[], dim: \"product\" | \"version\" | \"variant\" | \"tab\"): SegmentDetail[] {\n const byKey = new Map<string, SegmentDetail>();\n for (const s of scoped) {\n const d = s.seg[dim];\n if (d == null) {\n continue;\n }\n const slug = detailSlug(d);\n // Tabs always key by id: skip-slug tabs share the parent slug\n // (e.g. \"v-2\") and would otherwise collapse into one entry.\n const key = dim === \"tab\" ? d.id : slug !== \"\" ? slug : d.id;\n const existing = byKey.get(key);\n if (existing == null) {\n byKey.set(key, d);\n } else if (metaStr(d.metadata, \"pointsTo\") != null && metaStr(existing.metadata, \"pointsTo\") == null) {\n byKey.set(key, d);\n }\n }\n return [...byKey.values()].sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\nfunction scopeSlugPrefix(rootSlug: FernNavigation.Slug, ...details: (SegmentDetail | null | undefined)[]): string {\n const parts: string[] = [rootSlug];\n for (const d of details) {\n if (d != null && !detailIsDefault(d)) {\n const s = detailSlug(d);\n if (s !== \"\") {\n parts.push(s);\n }\n }\n }\n return FernNavigation.slugjoin(...parts);\n}\n\n/**\n * Build a VariantedNode from variant details, grouping segments by variant\n * so each variant gets its own scoped sidebar children.\n */\nfunction buildVariantedNode(\n ctx: BuildContext,\n variants: SegmentDetail[],\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug\n): FernNavigation.VariantedNode {\n const variantChildren: FernNavigation.VariantNode[] = variants.map((variant) => {\n const variantSegs = scopeSegs.filter((s) => s.seg.variant?.id === variant.id);\n // V2 never elides variant slugs — they always appear in the URL\n // (unlike product/version defaults which ARE elided). Use the\n // variant's individual slug directly instead of scopeSlugPrefix\n // which skips default details.\n const variantIndividualSlug = detailSlug(variant);\n const variantSlug =\n variantIndividualSlug !== \"\"\n ? asSlug(FernNavigation.slugjoin(scopePrefix, variantIndividualSlug))\n : scopePrefix;\n const metaPointsTo = metaStr(variant.metadata, \"pointsTo\");\n\n const children = buildSidebarRootChildren(ctx, variantSegs, variantSlug);\n\n return {\n type: \"variant\" as const,\n ...withMetadataDefaults({\n id: ctx.nodeId(`variant:${variantSlug}`),\n title: variant.displayName,\n slug: variantSlug,\n icon: variant.icon ?? undefined,\n hidden: variant.hidden,\n viewers: toViewers(variant.viewers)\n }),\n default: detailIsDefault(variant),\n variantId: FernNavigation.VariantId(String(variant.id)),\n subtitle: metaStr(variant.metadata, \"subtitle\") ?? undefined,\n image:\n metaStr(variant.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(variant.metadata, \"image\")!)\n : undefined,\n pointsTo: metaPointsTo != null ? pointsToSlug(metaPointsTo) : undefined,\n children: children as FernNavigation.VariantChild[]\n };\n });\n\n return {\n type: \"varianted\",\n id: ctx.nodeId(`varianted:${scopeSegs[0] != null ? scopeKey(scopeSegs[0].seg) : \"root\"}`),\n collapsed: undefined,\n children: variantChildren\n };\n}\n\n/**\n * Build a sidebar root, wrapping content in a VariantedNode when variants exist.\n * Without this, all variant segments merge into one flat sidebar — causing the\n * \"double sidebar\" where both variants' nav entries render simultaneously.\n */\nfunction buildSidebarRootWithVariants(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n changelogScopePrefix?: FernNavigation.Slug\n): FernNavigation.SidebarRootNode {\n const variants = uniqueDetails(scopeSegs, \"variant\");\n if (variants.length <= 1) {\n return buildSidebarRoot(ctx, scopeSegs, scopePrefix, changelogScopePrefix);\n }\n\n const sharedSegs = scopeSegs.filter((s) => s.seg.variant == null);\n const variantedNode = buildVariantedNode(ctx, variants, scopeSegs, scopePrefix);\n const sharedChildren: FernNavigation.SidebarRootChild[] =\n sharedSegs.length > 0 ? buildSidebarRootChildren(ctx, sharedSegs, scopePrefix, changelogScopePrefix) : [];\n\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\",\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: [...sharedChildren, variantedNode]\n };\n}\n\nfunction buildTabbedOrSidebar(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n tabsPresent: boolean,\n scopePrefix: FernNavigation.Slug\n): FernNavigation.SidebarRootNode | FernNavigation.TabbedNode | FernNavigation.VariantedNode {\n if (!tabsPresent) {\n // When no tabs exist but variants do, wrap variant-scoped segments\n // in a VariantedNode and include non-variant segments alongside it.\n const variants = uniqueDetails(scopeSegs, \"variant\");\n if (variants.length > 1) {\n const sharedSegs = scopeSegs.filter((s) => s.seg.variant == null);\n const variantedNode = buildVariantedNode(ctx, variants, scopeSegs, scopePrefix);\n if (sharedSegs.length > 0) {\n const sharedChildren = buildSidebarRootChildren(ctx, sharedSegs, scopePrefix);\n const first = scopeSegs[0];\n return {\n type: \"sidebarRoot\" as const,\n id: ctx.nodeId(`sidebar:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children: [...sharedChildren, variantedNode]\n };\n }\n return variantedNode;\n }\n return buildSidebarRoot(ctx, scopeSegs, scopePrefix);\n }\n // Group this scope's segments by tab.\n const tabDetails = uniqueDetails(scopeSegs, \"tab\");\n const children: FernNavigation.TabChild[] = tabDetails.map((tab): FernNavigation.TabChild => {\n const tabType = metaStr(tab.metadata, \"tab_type\");\n // The tab slug ACCUMULATES the enclosing scope prefix (basepath/product/\n // version) and appends the tab segment, mirroring the canonical V1->V2\n // converter (`SlugGenerator.apply`, which appends the tab onto the\n // version/product slug). Rooting at the empty slug instead would drop\n // the product/version prefix, breaking parity with v2's tab/breadcrumb\n // slugs AND breaking default-version elision: the tab node's slug would\n // not start with the version slug, so `toDefaultSlug` (the prune window)\n // would skip it. Because `scopePrefix` already carries the FULL version\n // segment, `{...}/{version}/{tab}` still starts with the version slug and\n // stays inside the prune window (see {@link structuralNodeSlug}).\n // V2's SlugGenerator.set() treats a tab slug that starts with the\n // version slug as a fullSlug (absolute path) and uses it as-is.\n // Without this check, scopeSlugPrefix joins version + tab producing\n // a doubled prefix (e.g. \"2026-02-09/2026-02-09\").\n const rawTabSlug = detailSlug(tab);\n const versionDetail = scopeSegs[0]?.seg.version;\n const versionSlugStr = versionDetail != null ? detailSlug(versionDetail) : undefined;\n const tabSlug =\n versionSlugStr != null &&\n rawTabSlug !== \"\" &&\n (rawTabSlug === versionSlugStr || rawTabSlug.startsWith(versionSlugStr + \"/\"))\n ? asSlug(rawTabSlug)\n : asSlug(scopeSlugPrefix(scopePrefix, tab));\n\n if (tabType === \"link\") {\n return {\n type: \"link\",\n id: ctx.nodeId(`link:${metaStr(tab.metadata, \"url\") ?? tabSlug}`),\n collapsed: undefined,\n title: tab.displayName,\n icon: tab.icon ?? undefined,\n url: FernNavigation.Url(metaStr(tab.metadata, \"url\") ?? \"\"),\n target: metaStr(tab.metadata, \"target\") as FernNavigation.LinkNode[\"target\"]\n };\n }\n\n if (tabType === \"changelog\") {\n const tabSegs = scopeSegs.filter((s) => s.seg.tab?.id === tab.id);\n const changelogSeg = tabSegs.find((s) => metaStr(s.seg.metadata, \"type\") === \"changelog\");\n if (changelogSeg != null) {\n // Root the changelog at the TAB slug (`tabSlug`), not the bare\n // scope prefix. Tab-level changelogs have an empty section path\n // (the publish transform strips the tab segment because\n // `extractSlugSegment(tabSlug, tabSlug) === \"\"`), so\n // `structuralNodeSlug(ctx, null, \"\", scopePrefix)` collapses to\n // just the scope prefix — which is the product/version slug.\n // That slug collision causes the changelog node to replace the\n // product node in NodeCollector's slug map, breaking structural\n // redirects (the product slug renders changelog content instead\n // of redirecting to the first docs page). Passing `tabSlug`\n // yields the correct `{...}/{changelog}` structural slug.\n return changelogNode(ctx, changelogSeg, tabSlug);\n }\n // Fallback: empty changelog node for the tab\n return {\n type: \"changelog\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`changelog:${tabSlug}`),\n title: tab.displayName,\n slug: tabSlug,\n icon: tab.icon ?? undefined,\n hidden: tab.hidden,\n viewers: toViewers(tab.viewers)\n }),\n overviewPageId: undefined,\n noindex: undefined,\n children: []\n };\n }\n\n // Default: regular tab\n const tabSegs = scopeSegs.filter((s) => s.seg.tab?.id === tab.id);\n const metaPointsTo = metaStr(tab.metadata, \"pointsTo\");\n return {\n type: \"tab\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`tab:${tabSlug}`),\n title: tab.displayName,\n slug: tabSlug,\n icon: tab.icon ?? undefined,\n hidden: tab.hidden,\n viewers: toViewers(tab.viewers)\n }),\n pointsTo: metaPointsTo != null ? pointsToSlug(metaPointsTo) : undefined,\n // Structural sections under this tab are rooted at the TAB slug\n // (`{...}/{version}/{tab}`) so their slugs nest under the tab\n // (matching v2) while still starting with the version slug, keeping\n // the subtree inside the default-version prune window (see\n // {@link structuralNodeSlug}).\n // Changelog sidebar children use the product/version prefix — v2\n // roots changelogs at the scope level, not under the tab.\n child: buildSidebarRootWithVariants(ctx, tabSegs, tabSlug, scopePrefix)\n };\n });\n const first = scopeSegs[0];\n return {\n type: \"tabbed\",\n id: ctx.nodeId(`tabbed:${first != null ? scopeKey(first.seg) : \"root\"}`),\n collapsed: undefined,\n children\n };\n}\n\nfunction buildUnversioned(\n ctx: BuildContext,\n scopeSegs: ScopedSegment[],\n scopePrefix: FernNavigation.Slug,\n tabsPresent: boolean\n): FernNavigation.UnversionedNode {\n const first = scopeSegs[0];\n const node: FernNavigation.UnversionedNode = {\n type: \"unversioned\",\n id: ctx.nodeId(`unversioned:${first?.seg.product?.id ?? \"root\"}`),\n collapsed: undefined,\n landingPage: buildLandingPage(ctx, scopeSegs),\n // The enclosing scope prefix (product slug, or rootSlug at the top\n // level) roots structural sections so they share the scope's slug\n // namespace.\n child: buildTabbedOrSidebar(ctx, scopeSegs, tabsPresent, scopePrefix)\n };\n // Within-scope dedup for unversioned sites: collapse duplicate pages\n // that appear under multiple parent sections.\n markWithinScopeCanonicalSlugs(node);\n return node;\n}\n\n/**\n * Merge shared (tab-level) sections from sibling versions into the default\n * version's segment list. A section is considered \"shared\" when its section\n * path does NOT start with any version slug — indicating it was authored at\n * the tab level and the publish transform assigned it to only one version.\n */\nfunction mergeSharedSections(\n defaultSegs: ScopedSegment[],\n allScoped: ScopedSegment[],\n defaultVersion: SegmentDetail,\n versionSlugs: string[]\n): ScopedSegment[] {\n // Build a map of the default version's tabs by displayName for\n // cross-version matching. Tab slugs can't be used because the \"default\"\n // tab's slug equals the version slug (e.g. \"2026-02-09\" vs \"2025-04-21\"\n // for the same logical \"Documentation\" tab across versions).\n const defaultTabsByName = new Map<string, SegmentDetail>();\n for (const s of defaultSegs) {\n if (s.seg.tab != null) {\n const tabName = s.seg.tab.displayName;\n if (!defaultTabsByName.has(tabName)) {\n defaultTabsByName.set(tabName, s.seg.tab);\n }\n }\n }\n\n // Collect section paths already present in the default version.\n const existingSections = new Set(\n defaultSegs.filter((s) => metaStr(s.seg.metadata, \"type\") === \"section\").map((s) => s.seg.section)\n );\n\n // Merged sections must sort AFTER all native default segments so they\n // appear in a trailing sidebarGroup (after non-collapsible sections like\n // \"Getting Started\", \"Dev Tools\", \"Capabilities\") matching v2 ordering.\n const maxSortOrder = defaultSegs.reduce((max, s) => Math.max(max, s.seg.sortOrder), 0);\n let nextSortOrder = maxSortOrder + 1;\n\n const merged = [...defaultSegs];\n for (const s of allScoped) {\n if (s.seg.version?.id === defaultVersion.id) {\n continue;\n }\n const type = metaStr(s.seg.metadata, \"type\");\n if (type !== \"section\") {\n continue;\n }\n const sectionPath = s.seg.section;\n // Skip version-specific sections (path starts with a version slug).\n if (versionSlugs.some((vs) => sectionPath === vs || sectionPath.startsWith(vs + \"/\"))) {\n continue;\n }\n // Skip if the default version already has this section.\n if (existingSections.has(sectionPath)) {\n continue;\n }\n // Match the source tab to the default version's corresponding tab\n // by displayName (tab slugs differ across versions for the default tab).\n const sourceTabName = s.seg.tab?.displayName ?? \"\";\n const targetTab = defaultTabsByName.get(sourceTabName);\n if (targetTab == null) {\n continue;\n }\n // Re-map the segment's tab and version to the default version's.\n // Strip childIndex from metadata so merged sections don't sort before\n // native sections in the annotated interleave step, and assign a\n // sortOrder after all native segments to place them in the trailing\n // sidebarGroup.\n const metadata = s.seg.metadata != null ? { ...s.seg.metadata, childIndex: undefined } : s.seg.metadata;\n merged.push({\n seg: {\n ...s.seg,\n tab: targetTab,\n version: defaultVersion,\n sortOrder: nextSortOrder++,\n metadata\n },\n nav: s.nav\n });\n existingSections.add(sectionPath);\n }\n return merged;\n}\n\nfunction buildVersioned(\n ctx: BuildContext,\n versions: SegmentDetail[],\n scoped: ScopedSegment[],\n rootSlug: FernNavigation.Slug,\n productPrefix: string | undefined,\n skipSharedSectionMerge?: boolean\n): FernNavigation.VersionedNode {\n // Collect version slugs for detecting version-prefixed section paths.\n const versionSlugs = versions.map((v) => detailSlug(v)).filter((s) => s !== \"\");\n\n const children: FernNavigation.VersionNode[] = versions.map((version) => {\n let versionSegs = scoped.filter((s) => s.seg.version?.id === version.id);\n\n // Merge shared tab-level sections from sibling versions into the\n // default version. The publish transform may assign tab-level content\n // (sections without a version-prefixed path) to a single version;\n // v2's monolith root includes them in every version's sidebar.\n // Skipped for scoped roots: the scoped root only loads nav for a\n // single route's scope, so merged sections carry the source version's\n // fullPaths into the default tree, creating duplicate slugs that\n // orphan the real version's pages in NodeCollector.\n if (detailIsDefault(version) && !skipSharedSectionMerge) {\n versionSegs = mergeSharedSections(versionSegs, scoped, version, versionSlugs);\n }\n const tabsPresent = uniqueDetails(versionSegs, \"tab\").length > 0;\n const prefix = productPrefix != null ? productPrefix : (rootSlug as string);\n // The version node always carries its FULL versioned slug\n // (`{basepath}/{product}/{version}`), even when it is the default\n // version. This matches the canonical V1→V2 converter\n // (`SlugGenerator.setVersionSlug`, which never elides the version\n // segment) and is REQUIRED for default-version elision: `NodeCollector`\n // prunes the default version by passing `node.slug` to\n // `toDefaultSlug(pageSlug, productSlug, versionSlug)`, which strips the\n // version segment from each page slug to produce the clean alias\n // (`docs/astro/cli/v-1-42/overview` → `docs/astro/cli/overview`). If the\n // default version's slug were collapsed to the product prefix\n // (`versionSlug === productSlug`), `toDefaultSlug` would be a no-op and\n // the elided slug would never enter the slugMap — so the clean URL 404s\n // with `page-not-in-nav` on basepath (`/docs`) sites. (ADR-0014 #6.)\n //\n // `scopeSlugPrefix(rootSlug, version)` is NOT used here because it joins\n // only the rootSlug + version segment (dropping the product prefix);\n // joining the resolved `prefix` (product prefix, or rootSlug when\n // version-less) with the version's own slug segment yields the correct\n // fully-qualified slug.\n const versionSegment = detailSlug(version);\n const slug = versionSegment !== \"\" ? FernNavigation.slugjoin(asSlug(prefix), versionSegment) : asSlug(prefix);\n const node: FernNavigation.VersionNode = {\n type: \"version\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`version:${slug}`),\n title: version.displayName,\n slug: asSlug(slug),\n icon: version.icon ?? undefined,\n hidden: version.hidden,\n viewers: toViewers(version.viewers)\n }),\n default: detailIsDefault(version),\n versionId: FernNavigation.VersionId(version.id),\n availability: metaAvailability(version.metadata),\n landingPage: buildLandingPage(ctx, versionSegs),\n announcement: metaAnnouncement(version.metadata),\n pointsTo:\n metaStr(version.metadata, \"pointsTo\") != null\n ? pointsToSlug(metaStr(version.metadata, \"pointsTo\")!)\n : undefined,\n // The version's full slug roots structural sections so the whole\n // version subtree stays inside the default-version prune window.\n child: buildTabbedOrSidebar(ctx, versionSegs, tabsPresent, asSlug(slug))\n };\n // Within-version dedup: collapse duplicate pages that appear\n // under multiple parent sections (same endpointId, pageId, etc.).\n // Must run BEFORE markDefaultVersionCanonicalSlugs so the canonical\n // slug is transformed along with the rest of the version's slugs.\n markWithinScopeCanonicalSlugs(node);\n\n if (node.default) {\n markDefaultVersionCanonicalSlugs(node, productPrefix != null ? asSlug(productPrefix) : rootSlug, node.slug);\n }\n return node;\n });\n\n // Cross-version canonical slug deduplication (V2 parity).\n // V2's migrator deduplicates pages across versions using a title-based\n // disambiguation key. Without this, non-default version pages that have\n // a title-equivalent in the default version appear as separate sitemap\n // entries (e.g. `/2024-12-23/evaluation/overview` alongside the default\n // `/evaluation/overview`).\n markCrossVersionCanonicalSlugs(children);\n\n return {\n type: \"versioned\",\n id: ctx.nodeId(`versioned:${productPrefix ?? \"root\"}`),\n collapsed: undefined,\n children\n };\n}\n\nfunction markDefaultVersionCanonicalSlugs(\n node: FernNavigation.VersionNode,\n pruneSlug: FernNavigation.Slug,\n versionSlug: FernNavigation.Slug\n): void {\n FernNavigation.traverseDF(node, (child) => {\n if (FernNavigation.hasMetadata(child)) {\n const canonicalSlug = FernNavigation.toDefaultSlug(\n child.canonicalSlug ?? child.slug,\n pruneSlug,\n versionSlug\n );\n if (canonicalSlug !== child.slug) {\n child.canonicalSlug = canonicalSlug;\n }\n }\n if (FernNavigation.hasRedirect(child)) {\n child.pointsTo = FernNavigation.toDefaultSlug(child.pointsTo, pruneSlug, versionSlug);\n }\n return;\n });\n}\n\n/**\n * Find parents after the innermost version node (unversioned ancestors).\n */\nfunction unversionedParents(\n parents: readonly FernNavigation.NavigationNodeParent[]\n): readonly FernNavigation.NavigationNodeParent[] {\n let versionIdx = -1;\n for (let i = parents.length - 1; i >= 0; i--) {\n if (parents[i]!.type === \"version\") {\n versionIdx = i;\n break;\n }\n }\n return versionIdx >= 0 ? parents.slice(versionIdx + 1) : parents;\n}\n\n/**\n * Build dedup keys for a page node, mirroring V2's `#getAndSetCanonicalSlug`.\n * V2 uses multiple keys per node so ANY match deduplicates:\n * - `pageId` / `overviewPageId` — content-addressable, same across versions\n * - API-specific key (`api:endpoint:METHOD:ID`) — for API leaf nodes\n * - title disambiguation key — structural fallback using parent titles\n */\nfunction crossVersionDedupKeys(\n node: FernNavigation.NavigationNode & FernNavigation.NavigationNodeWithMetadata,\n parents: readonly FernNavigation.NavigationNodeParent[]\n): string[] {\n const keys: string[] = [];\n const uParents = unversionedParents(parents);\n\n // 1. Content-ID key (pageId or overviewPageId)\n const pid = FernNavigation.getPageId(node as FernNavigation.NavigationNodePage);\n if (pid != null) {\n keys.push(`pid:${pid}`);\n }\n\n // 2. API-specific key for endpoints/websockets/webhooks/grpc/graphql\n if (\n node.type === \"endpoint\" ||\n node.type === \"webSocket\" ||\n node.type === \"webhook\" ||\n node.type === \"grpc\" ||\n node.type === \"graphql\"\n ) {\n const apiParentTitles = uParents\n .filter(\n (p): p is FernNavigation.NavigationNodeParent & { type: \"apiReference\" } => p.type === \"apiReference\"\n )\n .map((p) => (p as FernNavigation.NavigationNodeWithMetadata).title.replaceAll(\" \", \"\"));\n const apiPrefix = apiParentTitles.join(\":\");\n\n if (node.type === \"endpoint\") {\n keys.push(`${apiPrefix}:api:endpoint:${node.method}:${node.endpointId}`);\n } else if (node.type === \"webSocket\") {\n keys.push(`${apiPrefix}:api:websocket:${node.webSocketId}`);\n } else if (node.type === \"webhook\") {\n keys.push(`${apiPrefix}:api:webhook:${node.method}:${node.webhookId}`);\n } else if (node.type === \"grpc\") {\n keys.push(`${apiPrefix}:api:grpc:${node.method}:${node.grpcId}`);\n } else if (node.type === \"graphql\") {\n keys.push(`${apiPrefix}:api:graphql:${node.id}`);\n }\n }\n\n // 3. Title disambiguation key (structural fallback)\n const parentTitles: string[] = [];\n for (const p of uParents) {\n if (FernNavigation.hasMetadata(p)) {\n parentTitles.push(p.title);\n }\n }\n keys.push([...parentTitles, node.title].join(\"###\"));\n\n return keys;\n}\n\nfunction routeToLandingPage(\n ctx: BuildContext,\n route: NavRoute | undefined\n): FernNavigation.LandingPageNode | undefined {\n if (route == null || route.type !== \"markdown\" || route.fullPath == null) {\n return undefined;\n }\n const md = route.metadata;\n const pageId = metaStr(md, \"pageId\");\n if (pageId == null) {\n return undefined;\n }\n const slug = ctx.contentSlug(route.fullPath);\n return {\n type: \"landingPage\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`landing:${slug}`),\n title: metaStr(md, \"title\") ?? \"\",\n slug,\n icon: metaStr(md, \"icon\"),\n hidden: route.hidden,\n authed: metaBool(md, \"authed\"),\n viewers: toViewers(metaStrArr(md, \"viewers\")),\n orphaned: metaBool(md, \"orphaned\"),\n featureFlags: metaFeatureFlags(md)\n }),\n pageId: FernNavigation.PageId(pageId),\n noindex: metaBool(md, \"noindex\")\n };\n}\n\n/**\n * Build a LandingPageNode from the explicit landing-page segment emitted by\n * the publish transform. This avoids confusing ordinary loose tabRoot pages\n * with root/product/version landing pages.\n */\nfunction buildLandingPage(ctx: BuildContext, scopeSegs: ScopedSegment[]): FernNavigation.LandingPageNode | undefined {\n const landingSegment = scopeSegs.find(\n (s) => metaStr(s.seg.metadata, \"type\") === \"tabRoot\" && metaBool(s.seg.metadata, \"landingPage\") === true\n );\n return routeToLandingPage(\n ctx,\n landingSegment?.nav.find((route) => route.type === \"markdown\")\n );\n}\n\n/**\n * Map each slug to the content-ID dedup keys of the FIRST page node that owns it\n * (in DFS order). Used to decide whether folding a container (apiPackage with\n * endpoint children) into an ancestor slug is legitimate.\n *\n * A container should only canonicalize up to an ancestor slug when the page that\n * actually renders at that slug shares the container's overview content (same\n * `overviewPageId`/`pageId`) — matching V2, which dedups purely on content keys.\n * When a DIFFERENT page owns the ancestor slug (e.g. BigCommerce: a `section`\n * owns `.../payments` while an apiPackage under it has its own beta overview),\n * folding would point the container at unrelated content, so it must stay a\n * separate sitemap entry.\n */\nfunction buildSlugOwnerContentKeys(roots: FernNavigation.NavigationNode[]): Map<FernNavigation.Slug, Set<string>> {\n const slugOwnerKeys = new Map<FernNavigation.Slug, Set<string>>();\n for (const root of roots) {\n FernNavigation.traverseDF(root, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child) && !slugOwnerKeys.has(child.slug)) {\n slugOwnerKeys.set(child.slug, new Set(crossVersionDedupKeys(child, parents)));\n }\n });\n }\n return slugOwnerKeys;\n}\n\n/** Does the page that owns `canonical` share a content-ID key (`pid:`) with `keys`? */\nfunction canonicalOwnerSharesContent(\n slugOwnerKeys: Map<FernNavigation.Slug, Set<string>>,\n canonical: FernNavigation.Slug,\n keys: string[]\n): boolean {\n const ownerKeys = slugOwnerKeys.get(canonical);\n if (ownerKeys == null) {\n return false;\n }\n return keys.some((key) => key.startsWith(\"pid:\") && ownerKeys.has(key));\n}\n\n/**\n * Within a single version (or unversioned scope), deduplicate pages that\n * share the same content-identity key (endpointId, pageId, etc.).\n * The first occurrence in DFS order becomes canonical; subsequent\n * occurrences get `canonicalSlug` pointing to the first.\n *\n * This mirrors V2's global `#canonicalSlugs` map in v1ToV2.ts, which\n * deduplicates endpoints appearing under multiple parent sections within\n * the same version (e.g. the same endpoint under both\n * `content/store-content/redirects/` and `management/redirects/`).\n */\nfunction markWithinScopeCanonicalSlugs(scopeNode: FernNavigation.VersionNode | FernNavigation.UnversionedNode): void {\n const keyToCanonical = new Map<string, FernNavigation.Slug>();\n const slugOwnerKeys = buildSlugOwnerContentKeys([scopeNode]);\n\n FernNavigation.traverseDF(scopeNode, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const keys = crossVersionDedupKeys(child, parents);\n let matched = false;\n for (const key of keys) {\n const canonical = keyToCanonical.get(key);\n if (canonical != null && canonical !== child.slug) {\n // Skip dedup when the canonical slug is a proper ancestor of the\n // child's slug AND the child is a container (apiPackage with\n // endpoint children) — UNLESS the page that actually owns the\n // ancestor slug shares this child's overview content. V2 folds a\n // container into its parent only when the parent genuinely renders\n // the same overview (contentful: `spaces` -> `content-delivery-api`);\n // it keeps the container separate when a different page owns that\n // slug (BigCommerce: a `section` owns `.../payments`).\n if (\n child.slug.startsWith(canonical + \"/\") &&\n FernNavigation.getChildren(child).length > 0 &&\n !canonicalOwnerSharesContent(slugOwnerKeys, canonical, keys)\n ) {\n continue;\n }\n child.canonicalSlug = canonical;\n matched = true;\n break;\n }\n }\n if (!matched) {\n const slug = child.canonicalSlug ?? child.slug;\n for (const key of keys) {\n if (!keyToCanonical.has(key)) {\n keyToCanonical.set(key, slug);\n }\n }\n }\n }\n });\n}\n\n/**\n * After default-version canonical slugs are marked, propagate them across\n * ALL versions using a global first-come-first-served approach (matching V2).\n * V2's migrator uses a single `#canonicalSlugs` map across the entire tree,\n * so the first version to register a key wins. This deduplicates pages both\n * default→non-default AND across non-default versions (e.g. v2025-04-21\n * and v2024-12-23 sharing the same pageId).\n */\nfunction markCrossVersionCanonicalSlugs(versionNodes: FernNavigation.VersionNode[]): void {\n const keyToCanonical = new Map<string, FernNavigation.Slug>();\n\n // Process versions in order (default first, then non-default in tree order).\n // The first version to register a key wins — matching V2's DFS traversal\n // which processes the default version before others.\n const sorted = [...versionNodes].sort((a, b) => {\n if (a.default !== b.default) {\n return a.default ? -1 : 1;\n }\n return 0;\n });\n const slugOwnerKeys = buildSlugOwnerContentKeys(sorted);\n\n for (const version of sorted) {\n FernNavigation.traverseDF(version, (child, parents) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const keys = crossVersionDedupKeys(child, parents);\n let matched = false;\n for (const key of keys) {\n const canonical = keyToCanonical.get(key);\n if (canonical != null && !version.default) {\n // Skip dedup when the canonical slug is a proper ancestor of the\n // child's slug AND the child is a container — UNLESS the page that\n // owns the ancestor slug shares this child's overview content (see\n // markWithinScopeCanonicalSlugs for the contentful/BigCommerce cases).\n if (\n child.slug.startsWith(canonical + \"/\") &&\n FernNavigation.getChildren(child).length > 0 &&\n !canonicalOwnerSharesContent(slugOwnerKeys, canonical, keys)\n ) {\n continue;\n }\n child.canonicalSlug = canonical;\n matched = true;\n break;\n }\n }\n if (!matched) {\n const canonical = child.canonicalSlug ?? child.slug;\n for (const key of keys) {\n if (!keyToCanonical.has(key)) {\n keyToCanonical.set(key, canonical);\n }\n }\n }\n }\n });\n }\n}\n\nfunction buildProductGroup(\n ctx: BuildContext,\n products: SegmentDetail[],\n scoped: ScopedSegment[],\n rootSlug: FernNavigation.Slug,\n skipSharedSectionMerge?: boolean\n): FernNavigation.ProductGroupNode {\n const children: FernNavigation.ProductNode[] = products.map((product) => {\n // External product link — no child navigation, just a URL.\n const href = metaStr(product.metadata, \"href\");\n if (href != null) {\n return {\n type: \"productLink\" as const,\n id: ctx.nodeId(`productLink:${href}`),\n collapsed: undefined,\n default: detailIsDefault(product),\n productId: FernNavigation.ProductId(product.displayName),\n title: product.displayName,\n href: FernNavigation.Url(href),\n target: (metaStr(product.metadata, \"target\") ?? undefined) as\n | FernNavigation.ExternalProductNode[\"target\"]\n | undefined,\n subtitle: metaStr(product.metadata, \"subtitle\") ?? \"\",\n icon: product.icon ?? undefined,\n image:\n metaStr(product.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(product.metadata, \"image\")!)\n : undefined,\n hidden: product.hidden,\n authed: undefined,\n viewers: toViewers(product.viewers),\n orphaned: product.orphaned,\n featureFlags: undefined\n } satisfies FernNavigation.ExternalProductNode;\n }\n\n const productSegs = scoped.filter((s) => s.seg.product?.id === product.id);\n const versions = uniqueDetails(productSegs, \"version\");\n const tabsPresent = uniqueDetails(productSegs, \"tab\").length > 0;\n const productPrefix = scopeSlugPrefix(rootSlug, product);\n\n // ProductChild is VersionedNode | UnversionedNode — a version-less\n // product wraps its sidebar/tabs in an UnversionedNode.\n const productChild: FernNavigation.ProductChild =\n versions.length > 0\n ? buildVersioned(ctx, versions, productSegs, rootSlug, productPrefix, skipSharedSectionMerge)\n : buildUnversioned(ctx, productSegs, asSlug(productPrefix), tabsPresent);\n\n const node: FernNavigation.InternalProductNode = {\n type: \"product\",\n ...withMetadataDefaults({\n id: ctx.nodeId(`product:${productPrefix}`),\n title: product.displayName,\n slug: asSlug(detailIsDefault(product) ? (rootSlug as string) : productPrefix),\n icon: product.icon ?? undefined,\n hidden: product.hidden,\n viewers: toViewers(product.viewers)\n }),\n default: detailIsDefault(product),\n // `product.id` is the content-addressed STORAGE hash (the segment\n // key). `productId` is the SEMANTIC identifier search/UI key off\n // (the product-scoped search filter does `product.title:${productId}`,\n // so it must equal the product title). v2 carries the display name\n // here; sourcing it from the hash makes that filter match nothing.\n productId: FernNavigation.ProductId(product.displayName),\n subtitle: metaStr(product.metadata, \"subtitle\") ?? \"\",\n image:\n metaStr(product.metadata, \"image\") != null\n ? FernNavigation.FileId(metaStr(product.metadata, \"image\")!)\n : undefined,\n announcement: metaAnnouncement(product.metadata),\n pointsTo:\n metaStr(product.metadata, \"pointsTo\") != null\n ? pointsToSlug(metaStr(product.metadata, \"pointsTo\")!)\n : undefined,\n child: productChild\n };\n return node;\n });\n\n // Cross-product canonical slug deduplication (V2 parity).\n // V2's migrator deduplicates pages across products via a global pageId map:\n // the first product to register a pageId wins, and subsequent products'\n // pages with the same pageId receive a canonicalSlug pointing to the\n // canonical (default-product) page. Without this, shared content that is\n // materialized under every product scope (e.g. merge-api-basics pages)\n // appears as separate sitemap entries per product.\n markCrossProductCanonicalSlugs(children);\n\n return {\n type: \"productgroup\",\n id: ctx.nodeId(\"productgroup\"),\n collapsed: undefined,\n landingPage: buildLandingPage(\n ctx,\n scoped.filter((s) => s.seg.product == null)\n ),\n children\n };\n}\n\n/**\n * Deduplicate pages across products using pageId as a content-identity key.\n * Pages with the same pageId in different products are the same content\n * materialized per-scope; the default product's slug becomes canonical and\n * non-default copies receive `canonicalSlug` so the sitemap collapses them.\n *\n * API leaf nodes (endpoints, websockets, etc.) are unaffected — `getPageId`\n * returns undefined for those types, so product-specific API surface is\n * never suppressed.\n */\nfunction markCrossProductCanonicalSlugs(productNodes: FernNavigation.ProductNode[]): void {\n const pageIdToCanonical = new Map<string, { slug: FernNavigation.Slug; productId: FernNavigation.ProductId }>();\n\n // Process default product first so its slugs become the canonical targets.\n const sorted = [...productNodes].sort((a, b) => {\n if (a.default !== b.default) {\n return a.default ? -1 : 1;\n }\n return 0;\n });\n\n for (const product of sorted) {\n FernNavigation.traverseDF(product, (child) => {\n if (FernNavigation.hasMetadata(child) && FernNavigation.isPage(child)) {\n const pid = FernNavigation.getPageId(child as FernNavigation.NavigationNodePage);\n if (pid == null) {\n return;\n }\n const key = `pid:${pid}`;\n const entry = pageIdToCanonical.get(key);\n if (entry != null && !product.default && entry.productId !== product.productId) {\n child.canonicalSlug = entry.slug;\n } else if (entry == null) {\n pageIdToCanonical.set(key, {\n slug: child.canonicalSlug ?? child.slug,\n productId: product.productId\n });\n }\n }\n });\n }\n}\n\n// (root keeps the bare \"root\" id; it is the single tree root.)\n"],"mappings":"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","names":["z","part","getChildren","segmentApiDefinitionId","first","tabSegs"]}
|