@fern-api/fdr-sdk 1.2.50-22414d3dea → 1.2.51-403b2eae4f
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 +26 -3
- package/dist/js/navigation/ledger-root-builder.js.map +1 -1
- package/dist/js/navigation/ledger-root-builder.mjs +26 -3
- package/dist/js/navigation/ledger-root-builder.mjs.map +1 -1
- package/dist/navigation/__test__/ledger-canonical-bugs.repro.test.js +399 -12
- package/dist/navigation/__test__/ledger-canonical-bugs.repro.test.js.map +1 -1
- package/dist/navigation/__test__/ledger-root-builder.nullFullPath.test.d.ts +2 -0
- package/dist/navigation/__test__/ledger-root-builder.nullFullPath.test.d.ts.map +1 -0
- package/dist/navigation/__test__/ledger-root-builder.nullFullPath.test.js +146 -0
- package/dist/navigation/__test__/ledger-root-builder.nullFullPath.test.js.map +1 -0
- package/dist/navigation/ledger-root-builder.d.ts.map +1 -1
- package/dist/navigation/ledger-root-builder.js +59 -11
- package/dist/navigation/ledger-root-builder.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/navigation/__test__/ledger-root-builder.nullFullPath.test.d.ts +2 -0
- package/dist/types/navigation/__test__/ledger-root-builder.nullFullPath.test.d.ts.map +1 -0
- package/dist/types/navigation/ledger-root-builder.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -12,12 +12,15 @@ import { buildFullRootFromSegments } from "../ledger-root-builder.js";
|
|
|
12
12
|
* metadata rather than the overview page's actual pageId. If they
|
|
13
13
|
* differ, the content-ID dedup key is lost.
|
|
14
14
|
*
|
|
15
|
-
* Bug 2:
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* children)
|
|
19
|
-
*
|
|
20
|
-
*
|
|
15
|
+
* Bug 2 (FER-11461): an apiPackage landing page that shares its overviewPageId
|
|
16
|
+
* with its parent apiReference should canonicalize up to the parent —
|
|
17
|
+
* matching V2. This holds for both leaf apiPackages AND container
|
|
18
|
+
* apiPackages (with endpoint children): having children is NOT a reason
|
|
19
|
+
* to keep a separate entry. The container is only kept separate when a
|
|
20
|
+
* DIFFERENT page owns the parent slug (e.g. BigCommerce, where a section
|
|
21
|
+
* owns `.../payments` with its own overview) — i.e. the guard skips dedup
|
|
22
|
+
* only when the page owning the canonical slug does not share the
|
|
23
|
+
* container's content.
|
|
21
24
|
*/
|
|
22
25
|
function pageRoute(opts) {
|
|
23
26
|
return {
|
|
@@ -85,6 +88,23 @@ const EXTENSIBILITY_PRODUCT = {
|
|
|
85
88
|
slug: "extensibility",
|
|
86
89
|
isDefault: false
|
|
87
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* The set of slugs that would appear in the rendered sitemap, mirroring
|
|
93
|
+
* `collectLocaleSitemapPages` in the bundle's sitemap route: every indexable
|
|
94
|
+
* page node, keyed by `canonicalSlug ?? slug` (so folded duplicates collapse).
|
|
95
|
+
* Used to assert the user-facing symptom (sitemap entry present/absent), not
|
|
96
|
+
* just the internal `canonicalSlug` field.
|
|
97
|
+
*/
|
|
98
|
+
function sitemapSlugs(root) {
|
|
99
|
+
const slugs = new Set();
|
|
100
|
+
for (const node of FernNavigation.NodeCollector.collect(root).indexablePageNodesWithAuth) {
|
|
101
|
+
if (node.authed) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
slugs.add(node.canonicalSlug ?? node.slug);
|
|
105
|
+
}
|
|
106
|
+
return slugs;
|
|
107
|
+
}
|
|
88
108
|
describe("Bug 2: apiPackage landing pages should canonicalize to parent apiReference", () => {
|
|
89
109
|
it("leaf apiPackage with same overviewPageId as parent apiReference canonicalizes up", () => {
|
|
90
110
|
// When an apiPackage is a leaf (no endpoint children) and shares the
|
|
@@ -152,11 +172,14 @@ describe("Bug 2: apiPackage landing pages should canonicalize to parent apiRefer
|
|
|
152
172
|
// Leaf apiPackage canonicalizes to parent because guard is skipped
|
|
153
173
|
expect(apiPkg?.canonicalSlug).toBe("developers/docs/references/content-delivery-api");
|
|
154
174
|
});
|
|
155
|
-
it("apiPackage
|
|
156
|
-
//
|
|
157
|
-
//
|
|
158
|
-
//
|
|
159
|
-
//
|
|
175
|
+
it("container apiPackage canonicalizes up when the apiReference that OWNS the parent slug shares its overview (contentful, FER-11461)", () => {
|
|
176
|
+
// A container apiPackage (with endpoint children) that shares its
|
|
177
|
+
// overviewPageId with the parent apiReference MUST canonicalize up when
|
|
178
|
+
// that apiReference is the page genuinely rendering the parent slug —
|
|
179
|
+
// matching V2 (live: contentful `spaces` -> `content-delivery-api`,
|
|
180
|
+
// excluded from the sitemap). Having endpoint children is NOT sufficient
|
|
181
|
+
// reason to keep it separate; only a DIFFERENT owner of the parent slug
|
|
182
|
+
// is (see the BigCommerce case below).
|
|
160
183
|
const SHARED_OVERVIEW = "cda-overview-page";
|
|
161
184
|
const API_DEF = "api-def-cda";
|
|
162
185
|
const root = buildFullRootFromSegments({
|
|
@@ -226,8 +249,372 @@ describe("Bug 2: apiPackage landing pages should canonicalize to parent apiRefer
|
|
|
226
249
|
expect(apiRef?.canonicalSlug).toBeUndefined();
|
|
227
250
|
const apiPkg = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/spaces"))?.node;
|
|
228
251
|
expect(apiPkg?.type).toBe("apiPackage");
|
|
229
|
-
// Container apiPackage
|
|
252
|
+
// Container apiPackage canonicalizes UP: the apiReference owns the parent
|
|
253
|
+
// slug AND shares the overview content, so this is a duplicate (matches V2).
|
|
254
|
+
expect(apiPkg?.canonicalSlug).toBe("developers/docs/references/content-delivery-api");
|
|
255
|
+
// Symptom-level: the folded collection page drops OUT of the sitemap and
|
|
256
|
+
// the API root remains (live: contentful ledger sitemap 895 -> 888).
|
|
257
|
+
const inSitemap = sitemapSlugs(root);
|
|
258
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api")).toBe(true);
|
|
259
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/spaces")).toBe(false);
|
|
260
|
+
});
|
|
261
|
+
it("container apiPackage stays separate when a DIFFERENT page owns the parent slug (BigCommerce, #12610)", () => {
|
|
262
|
+
// BigCommerce shape: a `section` owns the slug `.../payments` (its own
|
|
263
|
+
// overview), and a transparent apiReference at the SAME slug has a child
|
|
264
|
+
// apiPackage that shares the apiReference's beta overview. Folding the
|
|
265
|
+
// apiPackage into `.../payments` would point it at the section's unrelated
|
|
266
|
+
// overview, so it must remain a separate sitemap entry.
|
|
267
|
+
const SECTION_OVERVIEW = "payments-section-overview";
|
|
268
|
+
const BETA_OVERVIEW = "stored-instruments-beta-overview";
|
|
269
|
+
const API_DEF = "api-def-tokens";
|
|
270
|
+
const root = buildFullRootFromSegments({
|
|
271
|
+
basePath: "developers/docs",
|
|
272
|
+
title: "BigCommerce",
|
|
273
|
+
segments: [
|
|
274
|
+
segment({
|
|
275
|
+
segmentHash: "seg-root",
|
|
276
|
+
section: "",
|
|
277
|
+
sortOrder: 0,
|
|
278
|
+
metadata: { type: "tabRoot" }
|
|
279
|
+
}),
|
|
280
|
+
// The SECTION owns `.../payments` with its own overview.
|
|
281
|
+
segment({
|
|
282
|
+
segmentHash: "seg-payments",
|
|
283
|
+
section: "developer/payments",
|
|
284
|
+
sortOrder: 1,
|
|
285
|
+
metadata: {
|
|
286
|
+
type: "section",
|
|
287
|
+
title: "Payments",
|
|
288
|
+
childIndex: 0,
|
|
289
|
+
overviewPageId: SECTION_OVERVIEW
|
|
290
|
+
}
|
|
291
|
+
}),
|
|
292
|
+
// Transparent apiReference at the SAME slug, sharing the beta overview
|
|
293
|
+
// with its apiPackage child.
|
|
294
|
+
segment({
|
|
295
|
+
segmentHash: "seg-payments-apiref",
|
|
296
|
+
section: "developer/payments",
|
|
297
|
+
sortOrder: 2,
|
|
298
|
+
metadata: {
|
|
299
|
+
type: "apiReference",
|
|
300
|
+
title: "API Reference",
|
|
301
|
+
childIndex: 1,
|
|
302
|
+
apiDefinitionId: API_DEF,
|
|
303
|
+
overviewPageId: BETA_OVERVIEW
|
|
304
|
+
}
|
|
305
|
+
}),
|
|
306
|
+
segment({
|
|
307
|
+
segmentHash: "seg-payments-stored",
|
|
308
|
+
section: "developer/payments/stored-instruments",
|
|
309
|
+
sortOrder: 3,
|
|
310
|
+
metadata: {
|
|
311
|
+
type: "apiPackage",
|
|
312
|
+
title: "Stored Instruments (Beta)",
|
|
313
|
+
childIndex: 0,
|
|
314
|
+
apiDefinitionId: API_DEF,
|
|
315
|
+
overviewPageId: BETA_OVERVIEW
|
|
316
|
+
}
|
|
317
|
+
})
|
|
318
|
+
],
|
|
319
|
+
navBySegment: new Map([
|
|
320
|
+
[
|
|
321
|
+
"seg-payments",
|
|
322
|
+
[
|
|
323
|
+
pageRoute({
|
|
324
|
+
fullPath: "developer/payments",
|
|
325
|
+
title: "Payments Overview",
|
|
326
|
+
pageId: SECTION_OVERVIEW,
|
|
327
|
+
isOverview: true
|
|
328
|
+
})
|
|
329
|
+
]
|
|
330
|
+
],
|
|
331
|
+
[
|
|
332
|
+
"seg-payments-stored",
|
|
333
|
+
[
|
|
334
|
+
endpointRoute({
|
|
335
|
+
fullPath: "developer/payments/stored-instruments/create-instrument",
|
|
336
|
+
title: "Create Instrument",
|
|
337
|
+
endpointId: "create-instrument",
|
|
338
|
+
apiDefinitionId: API_DEF
|
|
339
|
+
})
|
|
340
|
+
]
|
|
341
|
+
]
|
|
342
|
+
])
|
|
343
|
+
});
|
|
344
|
+
FernNavigation.utils.mutableUpdatePointsTo(root);
|
|
345
|
+
const slugMap = FernNavigation.NodeCollector.collect(root).getSlugMapWithParents();
|
|
346
|
+
const stored = slugMap.get(FernNavigation.Slug("developers/docs/developer/payments/stored-instruments"))?.node;
|
|
347
|
+
expect(stored?.type).toBe("apiPackage");
|
|
348
|
+
// A DIFFERENT page (the section) owns `.../payments`, so the container
|
|
349
|
+
// must NOT fold into it — stays a separate sitemap entry.
|
|
350
|
+
expect(stored?.canonicalSlug).toBeUndefined();
|
|
351
|
+
// Symptom-level: the container keeps its own sitemap entry, and the
|
|
352
|
+
// section's own slug is still present (no regression to #12610).
|
|
353
|
+
const inSitemap = sitemapSlugs(root);
|
|
354
|
+
expect(inSitemap.has("developers/docs/developer/payments/stored-instruments")).toBe(true);
|
|
355
|
+
expect(inSitemap.has("developers/docs/developer/payments")).toBe(true);
|
|
356
|
+
});
|
|
357
|
+
it("container apiPackage with its OWN unique overviewPageId stays a separate sitemap entry (no over-folding)", () => {
|
|
358
|
+
// Guard against over-folding: a container that does NOT share its parent's
|
|
359
|
+
// overview has independent content and must keep its own canonical page.
|
|
360
|
+
const PARENT_OVERVIEW = "cda-overview-page";
|
|
361
|
+
const OWN_OVERVIEW = "spaces-own-overview-page";
|
|
362
|
+
const API_DEF = "api-def-cda";
|
|
363
|
+
const root = buildFullRootFromSegments({
|
|
364
|
+
basePath: "developers/docs",
|
|
365
|
+
title: "Contentful",
|
|
366
|
+
segments: [
|
|
367
|
+
segment({ segmentHash: "seg-root", section: "", sortOrder: 0, metadata: { type: "tabRoot" } }),
|
|
368
|
+
segment({
|
|
369
|
+
segmentHash: "seg-cda",
|
|
370
|
+
section: "references/content-delivery-api",
|
|
371
|
+
sortOrder: 1,
|
|
372
|
+
metadata: {
|
|
373
|
+
type: "apiReference",
|
|
374
|
+
title: "Content Delivery API",
|
|
375
|
+
childIndex: 0,
|
|
376
|
+
apiDefinitionId: API_DEF,
|
|
377
|
+
overviewPageId: PARENT_OVERVIEW
|
|
378
|
+
}
|
|
379
|
+
}),
|
|
380
|
+
segment({
|
|
381
|
+
segmentHash: "seg-cda-spaces",
|
|
382
|
+
section: "references/content-delivery-api/spaces",
|
|
383
|
+
sortOrder: 2,
|
|
384
|
+
metadata: {
|
|
385
|
+
type: "apiPackage",
|
|
386
|
+
title: "Spaces",
|
|
387
|
+
childIndex: 0,
|
|
388
|
+
apiDefinitionId: API_DEF,
|
|
389
|
+
overviewPageId: OWN_OVERVIEW
|
|
390
|
+
}
|
|
391
|
+
})
|
|
392
|
+
],
|
|
393
|
+
navBySegment: new Map([
|
|
394
|
+
[
|
|
395
|
+
"seg-cda",
|
|
396
|
+
[
|
|
397
|
+
pageRoute({
|
|
398
|
+
fullPath: "references/content-delivery-api",
|
|
399
|
+
title: "Content Delivery API Overview",
|
|
400
|
+
pageId: PARENT_OVERVIEW,
|
|
401
|
+
isOverview: true
|
|
402
|
+
})
|
|
403
|
+
]
|
|
404
|
+
],
|
|
405
|
+
[
|
|
406
|
+
"seg-cda-spaces",
|
|
407
|
+
[
|
|
408
|
+
endpointRoute({
|
|
409
|
+
fullPath: "references/content-delivery-api/spaces/get-space",
|
|
410
|
+
title: "Get a space",
|
|
411
|
+
endpointId: "get-space",
|
|
412
|
+
apiDefinitionId: API_DEF
|
|
413
|
+
})
|
|
414
|
+
]
|
|
415
|
+
]
|
|
416
|
+
])
|
|
417
|
+
});
|
|
418
|
+
FernNavigation.utils.mutableUpdatePointsTo(root);
|
|
419
|
+
const slugMap = FernNavigation.NodeCollector.collect(root).getSlugMapWithParents();
|
|
420
|
+
const apiPkg = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/spaces"))?.node;
|
|
421
|
+
expect(apiPkg?.type).toBe("apiPackage");
|
|
422
|
+
// Unique overview → not a duplicate → keeps its own canonical + sitemap entry.
|
|
230
423
|
expect(apiPkg?.canonicalSlug).toBeUndefined();
|
|
424
|
+
const inSitemap = sitemapSlugs(root);
|
|
425
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api")).toBe(true);
|
|
426
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/spaces")).toBe(true);
|
|
427
|
+
});
|
|
428
|
+
it("multiple sibling collection apiPackages sharing the apiReference overview all fold out of the sitemap (contentful 7-page symptom)", () => {
|
|
429
|
+
const SHARED_OVERVIEW = "cda-overview-page";
|
|
430
|
+
const API_DEF = "api-def-cda";
|
|
431
|
+
const root = buildFullRootFromSegments({
|
|
432
|
+
basePath: "developers/docs",
|
|
433
|
+
title: "Contentful",
|
|
434
|
+
segments: [
|
|
435
|
+
segment({ segmentHash: "seg-root", section: "", sortOrder: 0, metadata: { type: "tabRoot" } }),
|
|
436
|
+
segment({
|
|
437
|
+
segmentHash: "seg-cda",
|
|
438
|
+
section: "references/content-delivery-api",
|
|
439
|
+
sortOrder: 1,
|
|
440
|
+
metadata: {
|
|
441
|
+
type: "apiReference",
|
|
442
|
+
title: "Content Delivery API",
|
|
443
|
+
childIndex: 0,
|
|
444
|
+
apiDefinitionId: API_DEF,
|
|
445
|
+
overviewPageId: SHARED_OVERVIEW
|
|
446
|
+
}
|
|
447
|
+
}),
|
|
448
|
+
segment({
|
|
449
|
+
segmentHash: "seg-spaces",
|
|
450
|
+
section: "references/content-delivery-api/spaces",
|
|
451
|
+
sortOrder: 2,
|
|
452
|
+
metadata: {
|
|
453
|
+
type: "apiPackage",
|
|
454
|
+
title: "Spaces",
|
|
455
|
+
childIndex: 0,
|
|
456
|
+
apiDefinitionId: API_DEF,
|
|
457
|
+
overviewPageId: SHARED_OVERVIEW
|
|
458
|
+
}
|
|
459
|
+
}),
|
|
460
|
+
segment({
|
|
461
|
+
segmentHash: "seg-entries",
|
|
462
|
+
section: "references/content-delivery-api/entries",
|
|
463
|
+
sortOrder: 3,
|
|
464
|
+
metadata: {
|
|
465
|
+
type: "apiPackage",
|
|
466
|
+
title: "Entries",
|
|
467
|
+
childIndex: 1,
|
|
468
|
+
apiDefinitionId: API_DEF,
|
|
469
|
+
overviewPageId: SHARED_OVERVIEW
|
|
470
|
+
}
|
|
471
|
+
})
|
|
472
|
+
],
|
|
473
|
+
navBySegment: new Map([
|
|
474
|
+
[
|
|
475
|
+
"seg-cda",
|
|
476
|
+
[
|
|
477
|
+
pageRoute({
|
|
478
|
+
fullPath: "references/content-delivery-api",
|
|
479
|
+
title: "Content Delivery API Overview",
|
|
480
|
+
pageId: SHARED_OVERVIEW,
|
|
481
|
+
isOverview: true
|
|
482
|
+
})
|
|
483
|
+
]
|
|
484
|
+
],
|
|
485
|
+
[
|
|
486
|
+
"seg-spaces",
|
|
487
|
+
[
|
|
488
|
+
endpointRoute({
|
|
489
|
+
fullPath: "references/content-delivery-api/spaces/get-space",
|
|
490
|
+
title: "Get a space",
|
|
491
|
+
endpointId: "get-space",
|
|
492
|
+
apiDefinitionId: API_DEF
|
|
493
|
+
})
|
|
494
|
+
]
|
|
495
|
+
],
|
|
496
|
+
[
|
|
497
|
+
"seg-entries",
|
|
498
|
+
[
|
|
499
|
+
endpointRoute({
|
|
500
|
+
fullPath: "references/content-delivery-api/entries/get-entry",
|
|
501
|
+
title: "Get an entry",
|
|
502
|
+
endpointId: "get-entry",
|
|
503
|
+
apiDefinitionId: API_DEF
|
|
504
|
+
})
|
|
505
|
+
]
|
|
506
|
+
]
|
|
507
|
+
])
|
|
508
|
+
});
|
|
509
|
+
FernNavigation.utils.mutableUpdatePointsTo(root);
|
|
510
|
+
const slugMap = FernNavigation.NodeCollector.collect(root).getSlugMapWithParents();
|
|
511
|
+
const spaces = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/spaces"))?.node;
|
|
512
|
+
const entries = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/entries"))?.node;
|
|
513
|
+
expect(spaces?.canonicalSlug).toBe("developers/docs/references/content-delivery-api");
|
|
514
|
+
expect(entries?.canonicalSlug).toBe("developers/docs/references/content-delivery-api");
|
|
515
|
+
const inSitemap = sitemapSlugs(root);
|
|
516
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api")).toBe(true);
|
|
517
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/spaces")).toBe(false);
|
|
518
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/entries")).toBe(false);
|
|
519
|
+
});
|
|
520
|
+
it("nested sub-apiPackage folds to its content-owning ancestor, not the top apiReference", () => {
|
|
521
|
+
// The fold target is the NEAREST page that owns the shared overview: a
|
|
522
|
+
// sub-apiPackage sharing its parent apiPackage's overview folds to that
|
|
523
|
+
// parent (taxonomy), while the parent — owning a different overview than
|
|
524
|
+
// the apiReference — stays its own entry.
|
|
525
|
+
const CDA_OVERVIEW = "cda-overview";
|
|
526
|
+
const TAXONOMY_OVERVIEW = "taxonomy-overview";
|
|
527
|
+
const API_DEF = "api-def-cda";
|
|
528
|
+
const root = buildFullRootFromSegments({
|
|
529
|
+
basePath: "developers/docs",
|
|
530
|
+
title: "Contentful",
|
|
531
|
+
segments: [
|
|
532
|
+
segment({ segmentHash: "seg-root", section: "", sortOrder: 0, metadata: { type: "tabRoot" } }),
|
|
533
|
+
segment({
|
|
534
|
+
segmentHash: "seg-cda",
|
|
535
|
+
section: "references/content-delivery-api",
|
|
536
|
+
sortOrder: 1,
|
|
537
|
+
metadata: {
|
|
538
|
+
type: "apiReference",
|
|
539
|
+
title: "Content Delivery API",
|
|
540
|
+
childIndex: 0,
|
|
541
|
+
apiDefinitionId: API_DEF,
|
|
542
|
+
overviewPageId: CDA_OVERVIEW
|
|
543
|
+
}
|
|
544
|
+
}),
|
|
545
|
+
segment({
|
|
546
|
+
segmentHash: "seg-tax",
|
|
547
|
+
section: "references/content-delivery-api/taxonomy",
|
|
548
|
+
sortOrder: 2,
|
|
549
|
+
metadata: {
|
|
550
|
+
type: "apiPackage",
|
|
551
|
+
title: "Taxonomy",
|
|
552
|
+
childIndex: 0,
|
|
553
|
+
apiDefinitionId: API_DEF,
|
|
554
|
+
overviewPageId: TAXONOMY_OVERVIEW
|
|
555
|
+
}
|
|
556
|
+
}),
|
|
557
|
+
segment({
|
|
558
|
+
segmentHash: "seg-concepts",
|
|
559
|
+
section: "references/content-delivery-api/taxonomy/concepts",
|
|
560
|
+
sortOrder: 3,
|
|
561
|
+
metadata: {
|
|
562
|
+
type: "apiPackage",
|
|
563
|
+
title: "Concepts",
|
|
564
|
+
childIndex: 0,
|
|
565
|
+
apiDefinitionId: API_DEF,
|
|
566
|
+
overviewPageId: TAXONOMY_OVERVIEW
|
|
567
|
+
}
|
|
568
|
+
})
|
|
569
|
+
],
|
|
570
|
+
navBySegment: new Map([
|
|
571
|
+
[
|
|
572
|
+
"seg-cda",
|
|
573
|
+
[
|
|
574
|
+
pageRoute({
|
|
575
|
+
fullPath: "references/content-delivery-api",
|
|
576
|
+
title: "CDA Overview",
|
|
577
|
+
pageId: CDA_OVERVIEW,
|
|
578
|
+
isOverview: true
|
|
579
|
+
})
|
|
580
|
+
]
|
|
581
|
+
],
|
|
582
|
+
[
|
|
583
|
+
"seg-tax",
|
|
584
|
+
[
|
|
585
|
+
pageRoute({
|
|
586
|
+
fullPath: "references/content-delivery-api/taxonomy",
|
|
587
|
+
title: "Taxonomy Overview",
|
|
588
|
+
pageId: TAXONOMY_OVERVIEW,
|
|
589
|
+
isOverview: true
|
|
590
|
+
})
|
|
591
|
+
]
|
|
592
|
+
],
|
|
593
|
+
[
|
|
594
|
+
"seg-concepts",
|
|
595
|
+
[
|
|
596
|
+
endpointRoute({
|
|
597
|
+
fullPath: "references/content-delivery-api/taxonomy/concepts/get-concept",
|
|
598
|
+
title: "Get a concept",
|
|
599
|
+
endpointId: "get-concept",
|
|
600
|
+
apiDefinitionId: API_DEF
|
|
601
|
+
})
|
|
602
|
+
]
|
|
603
|
+
]
|
|
604
|
+
])
|
|
605
|
+
});
|
|
606
|
+
FernNavigation.utils.mutableUpdatePointsTo(root);
|
|
607
|
+
const slugMap = FernNavigation.NodeCollector.collect(root).getSlugMapWithParents();
|
|
608
|
+
const taxonomy = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/taxonomy"))?.node;
|
|
609
|
+
const concepts = slugMap.get(FernNavigation.Slug("developers/docs/references/content-delivery-api/taxonomy/concepts"))?.node;
|
|
610
|
+
// Taxonomy owns a different overview than the apiReference → stays separate.
|
|
611
|
+
expect(taxonomy?.canonicalSlug).toBeUndefined();
|
|
612
|
+
// Concepts shares taxonomy's overview → folds to taxonomy (nearest owner), not CDA.
|
|
613
|
+
expect(concepts?.canonicalSlug).toBe("developers/docs/references/content-delivery-api/taxonomy");
|
|
614
|
+
const inSitemap = sitemapSlugs(root);
|
|
615
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api")).toBe(true);
|
|
616
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/taxonomy")).toBe(true);
|
|
617
|
+
expect(inSitemap.has("developers/docs/references/content-delivery-api/taxonomy/concepts")).toBe(false);
|
|
231
618
|
});
|
|
232
619
|
});
|
|
233
620
|
describe("Bug 1: redirect destination should canonicalize back to redirect source", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-canonical-bugs.repro.test.js","sourceRoot":"","sources":["../../../src/navigation/__test__/ledger-canonical-bugs.repro.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ledger-canonical-bugs.repro.test.js","sourceRoot":"","sources":["../../../src/navigation/__test__/ledger-canonical-bugs.repro.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-root-builder.nullFullPath.test.d.ts","sourceRoot":"","sources":["../../../src/navigation/__test__/ledger-root-builder.nullFullPath.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import * as FernNavigation from "../index.js";
|
|
3
|
+
import { buildFullRootFromSegments } from "../ledger-root-builder.js";
|
|
4
|
+
function seg(opts) {
|
|
5
|
+
return {
|
|
6
|
+
segmentId: opts.segmentHash,
|
|
7
|
+
segmentHash: opts.segmentHash,
|
|
8
|
+
section: opts.section ?? "",
|
|
9
|
+
locale: "en",
|
|
10
|
+
sortOrder: 0,
|
|
11
|
+
hidden: false,
|
|
12
|
+
metadata: opts.metadata ?? { type: "apiReference", apiDefinitionId: "api-1" },
|
|
13
|
+
product: null,
|
|
14
|
+
version: null,
|
|
15
|
+
variant: null,
|
|
16
|
+
tab: null
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function epRoute(opts) {
|
|
20
|
+
return {
|
|
21
|
+
type: "rest",
|
|
22
|
+
fullPath: opts.fullPath,
|
|
23
|
+
stream: null,
|
|
24
|
+
hidden: false,
|
|
25
|
+
displaySortOrder: opts.displaySortOrder,
|
|
26
|
+
metadata: {
|
|
27
|
+
title: opts.title,
|
|
28
|
+
endpointId: opts.endpointId,
|
|
29
|
+
method: opts.method,
|
|
30
|
+
apiDefinitionId: opts.apiDefinitionId,
|
|
31
|
+
isResponseStream: false
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
describe("buildFullRootFromSegments - null fullPath defensive guard", () => {
|
|
36
|
+
it("skips api-leaf node when fullPath is null instead of collapsing to basepath", () => {
|
|
37
|
+
// When the writer fails to assign a fullPath (e.g. due to a slug
|
|
38
|
+
// collision bug), the reader should skip the node entirely rather
|
|
39
|
+
// than producing a broken entry with the bare basepath as its slug.
|
|
40
|
+
const root = buildFullRootFromSegments({
|
|
41
|
+
basePath: "/docs",
|
|
42
|
+
title: "Test",
|
|
43
|
+
segments: [
|
|
44
|
+
seg({
|
|
45
|
+
segmentHash: "seg-branches",
|
|
46
|
+
section: "api-reference/branches",
|
|
47
|
+
metadata: { type: "apiReference", apiDefinitionId: "api-1" }
|
|
48
|
+
})
|
|
49
|
+
],
|
|
50
|
+
navBySegment: new Map([
|
|
51
|
+
[
|
|
52
|
+
"seg-branches",
|
|
53
|
+
[
|
|
54
|
+
epRoute({
|
|
55
|
+
fullPath: "api-reference/branches/preview",
|
|
56
|
+
title: "Preview merged configuration",
|
|
57
|
+
endpointId: "preview-merged",
|
|
58
|
+
method: "POST",
|
|
59
|
+
apiDefinitionId: "api-1",
|
|
60
|
+
displaySortOrder: 0
|
|
61
|
+
}),
|
|
62
|
+
epRoute({
|
|
63
|
+
fullPath: null,
|
|
64
|
+
title: "Preview rebased configuration",
|
|
65
|
+
endpointId: "preview-rebased",
|
|
66
|
+
method: "POST",
|
|
67
|
+
apiDefinitionId: "api-1",
|
|
68
|
+
displaySortOrder: 1
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
]
|
|
72
|
+
])
|
|
73
|
+
});
|
|
74
|
+
// The valid endpoint should be findable
|
|
75
|
+
const validResult = FernNavigation.utils.findNode(root, FernNavigation.Slug("docs/api-reference/branches/preview"));
|
|
76
|
+
expect(validResult.type).toBe("found");
|
|
77
|
+
// A node with the basepath slug "docs" should NOT be an endpoint
|
|
78
|
+
const basepathResult = FernNavigation.utils.findNode(root, FernNavigation.Slug("docs"));
|
|
79
|
+
// Either not found or not an endpoint type
|
|
80
|
+
if (basepathResult.type === "found") {
|
|
81
|
+
expect(basepathResult.node.type).not.toBe("endpoint");
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it("retains valid nodes alongside null-fullPath ones", () => {
|
|
85
|
+
const root = buildFullRootFromSegments({
|
|
86
|
+
basePath: "",
|
|
87
|
+
title: "Test",
|
|
88
|
+
segments: [
|
|
89
|
+
seg({
|
|
90
|
+
segmentHash: "seg-api",
|
|
91
|
+
section: "api",
|
|
92
|
+
metadata: { type: "apiReference", apiDefinitionId: "api-1" }
|
|
93
|
+
})
|
|
94
|
+
],
|
|
95
|
+
navBySegment: new Map([
|
|
96
|
+
[
|
|
97
|
+
"seg-api",
|
|
98
|
+
[
|
|
99
|
+
epRoute({
|
|
100
|
+
fullPath: "api/list",
|
|
101
|
+
title: "List items",
|
|
102
|
+
endpointId: "list-items",
|
|
103
|
+
method: "GET",
|
|
104
|
+
apiDefinitionId: "api-1",
|
|
105
|
+
displaySortOrder: 0
|
|
106
|
+
}),
|
|
107
|
+
epRoute({
|
|
108
|
+
fullPath: null,
|
|
109
|
+
title: "Broken endpoint",
|
|
110
|
+
endpointId: "broken-ep",
|
|
111
|
+
method: "POST",
|
|
112
|
+
apiDefinitionId: "api-1",
|
|
113
|
+
displaySortOrder: 1
|
|
114
|
+
}),
|
|
115
|
+
epRoute({
|
|
116
|
+
fullPath: "api/create",
|
|
117
|
+
title: "Create item",
|
|
118
|
+
endpointId: "create-item",
|
|
119
|
+
method: "POST",
|
|
120
|
+
apiDefinitionId: "api-1",
|
|
121
|
+
displaySortOrder: 2
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
]
|
|
125
|
+
])
|
|
126
|
+
});
|
|
127
|
+
// Both valid endpoints should be findable
|
|
128
|
+
const listResult = FernNavigation.utils.findNode(root, FernNavigation.Slug("api/list"));
|
|
129
|
+
expect(listResult.type).toBe("found");
|
|
130
|
+
if (listResult.type === "found") {
|
|
131
|
+
expect(listResult.node.title).toBe("List items");
|
|
132
|
+
}
|
|
133
|
+
const createResult = FernNavigation.utils.findNode(root, FernNavigation.Slug("api/create"));
|
|
134
|
+
expect(createResult.type).toBe("found");
|
|
135
|
+
if (createResult.type === "found") {
|
|
136
|
+
expect(createResult.node.title).toBe("Create item");
|
|
137
|
+
}
|
|
138
|
+
// The broken endpoint with null fullPath should not produce a node at
|
|
139
|
+
// the empty basepath
|
|
140
|
+
const emptyResult = FernNavigation.utils.findNode(root, FernNavigation.Slug(""));
|
|
141
|
+
if (emptyResult.type === "found") {
|
|
142
|
+
expect(emptyResult.node.type).not.toBe("endpoint");
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=ledger-root-builder.nullFullPath.test.js.map
|