@mintlify/validation 0.1.739 → 0.1.741

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.
@@ -1,3 +1,4 @@
1
+ import { compareNodes } from '../order.js';
1
2
  import { generateNodeId } from '../utils.js';
2
3
  export const createIdGenerator = () => {
3
4
  let counter = 0;
@@ -35,7 +36,7 @@ export function buildChildrenMap(tree) {
35
36
  childrenMap.set(node.parent, children);
36
37
  });
37
38
  childrenMap.forEach((children) => {
38
- children.sort((a, b) => a.order - b.order);
39
+ children.sort(compareNodes);
39
40
  });
40
41
  return childrenMap;
41
42
  }
@@ -1,4 +1,5 @@
1
1
  import traverse from 'neotraverse';
2
+ import { compareNodes } from '../order.js';
2
3
  import { isGlobalNode } from '../schema.js';
3
4
  import { createIdGenerator, isProductConfig, isLanguageConfig, isVersionConfig, isTabConfig, isMenuItemConfig, isDropdownConfig, isAnchorConfig, isGroupConfig, } from './common.js';
4
5
  function pickDefined(obj) {
@@ -412,7 +413,7 @@ function reorderGlobalNodesFirst(nodes) {
412
413
  return -1;
413
414
  if (!aIsGlobal && bIsGlobal)
414
415
  return 1;
415
- return a.order - b.order;
416
+ return compareNodes(a, b);
416
417
  });
417
418
  siblings.forEach((node, index) => {
418
419
  node.order = index;
@@ -1,4 +1,5 @@
1
1
  export * from './types.js';
2
2
  export * from './utils.js';
3
3
  export * from './schema.js';
4
+ export * from './order.js';
4
5
  export * from './conversion/index.js';
@@ -1,4 +1,5 @@
1
1
  export * from './types.js';
2
2
  export * from './utils.js';
3
3
  export * from './schema.js';
4
+ export * from './order.js';
4
5
  export * from './conversion/index.js';
@@ -0,0 +1,17 @@
1
+ import { generateKeyBetween, generateNKeysBetween } from 'fractional-indexing';
2
+ import type { NavigationOrder } from './types.js';
3
+ export { generateKeyBetween, generateNKeysBetween };
4
+ type OrderedNode = {
5
+ id: string;
6
+ order: NavigationOrder;
7
+ };
8
+ type OrderedTreeNode = OrderedNode & {
9
+ parent: string | 0;
10
+ };
11
+ type WithNavigationOrder<T extends OrderedNode> = Omit<T, 'order'> & {
12
+ order: NavigationOrder;
13
+ };
14
+ export declare function compareNodes(a: OrderedNode, b: OrderedNode): number;
15
+ export declare function sortByOrder<T extends OrderedNode>(nodes: readonly T[]): T[];
16
+ export declare function normalizeTreeOrder<T extends OrderedTreeNode>(tree: readonly T[]): WithNavigationOrder<T>[];
17
+ export declare function alignTreeOrderKeys<T extends OrderedTreeNode>(tree: readonly T[], reference: readonly OrderedTreeNode[]): WithNavigationOrder<T>[];
@@ -0,0 +1,98 @@
1
+ import { generateKeyBetween, generateNKeysBetween } from 'fractional-indexing';
2
+ export { generateKeyBetween, generateNKeysBetween };
3
+ function compareOrder(a, b) {
4
+ if (typeof a === 'number' && typeof b === 'number')
5
+ return a - b;
6
+ if (typeof a === 'number')
7
+ return -1;
8
+ if (typeof b === 'number')
9
+ return 1;
10
+ return a < b ? -1 : a > b ? 1 : 0;
11
+ }
12
+ export function compareNodes(a, b) {
13
+ const byOrder = compareOrder(a.order, b.order);
14
+ if (byOrder !== 0)
15
+ return byOrder;
16
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
17
+ }
18
+ export function sortByOrder(nodes) {
19
+ return [...nodes].sort(compareNodes);
20
+ }
21
+ function groupByParent(nodes) {
22
+ var _a;
23
+ const byParent = new Map();
24
+ for (const node of nodes) {
25
+ const group = (_a = byParent.get(node.parent)) !== null && _a !== void 0 ? _a : [];
26
+ group.push(node);
27
+ byParent.set(node.parent, group);
28
+ }
29
+ return byParent;
30
+ }
31
+ function applyOrderUpdates(tree, orderById) {
32
+ if (orderById.size === 0)
33
+ return tree;
34
+ return tree.map((node) => {
35
+ const order = orderById.get(node.id);
36
+ return order === undefined ? node : Object.assign(Object.assign({}, node), { order });
37
+ });
38
+ }
39
+ export function normalizeTreeOrder(tree) {
40
+ const orderById = new Map();
41
+ for (const group of groupByParent(tree).values()) {
42
+ if (!group.some((node) => typeof node.order === 'number'))
43
+ continue;
44
+ const sorted = sortByOrder(group);
45
+ const keys = generateNKeysBetween(null, null, sorted.length);
46
+ sorted.forEach((node, index) => {
47
+ const key = keys[index];
48
+ if (key !== undefined && node.order !== key)
49
+ orderById.set(node.id, key);
50
+ });
51
+ }
52
+ return applyOrderUpdates(tree, orderById);
53
+ }
54
+ export function alignTreeOrderKeys(tree, reference) {
55
+ var _a, _b, _c;
56
+ const referenceKeys = new Map();
57
+ for (const node of reference) {
58
+ if (typeof node.order !== 'string')
59
+ continue;
60
+ referenceKeys.set(`${node.parent}::${node.id}`, node.order);
61
+ }
62
+ const orderById = new Map();
63
+ for (const group of groupByParent(tree).values()) {
64
+ const sorted = sortByOrder(group);
65
+ const keys = sorted.map(() => null);
66
+ let lastReused = null;
67
+ sorted.forEach((node, index) => {
68
+ const key = referenceKeys.get(`${node.parent}::${node.id}`);
69
+ if (key !== undefined && (lastReused === null || key > lastReused)) {
70
+ keys[index] = key;
71
+ lastReused = key;
72
+ }
73
+ });
74
+ let start = 0;
75
+ while (start < sorted.length) {
76
+ if (keys[start] !== null) {
77
+ start++;
78
+ continue;
79
+ }
80
+ let end = start;
81
+ while (end < sorted.length && keys[end] === null)
82
+ end++;
83
+ const before = start > 0 ? ((_a = keys[start - 1]) !== null && _a !== void 0 ? _a : null) : null;
84
+ const after = end < sorted.length ? ((_b = keys[end]) !== null && _b !== void 0 ? _b : null) : null;
85
+ const filled = generateNKeysBetween(before, after, end - start);
86
+ for (let i = start; i < end; i++)
87
+ keys[i] = (_c = filled[i - start]) !== null && _c !== void 0 ? _c : null;
88
+ start = end;
89
+ }
90
+ sorted.forEach((node, index) => {
91
+ var _a;
92
+ const key = (_a = keys[index]) !== null && _a !== void 0 ? _a : null;
93
+ if (key !== null && node.order !== key)
94
+ orderById.set(node.id, key);
95
+ });
96
+ }
97
+ return applyOrderUpdates(tree, orderById);
98
+ }
@@ -10,6 +10,7 @@ export type NavigationNodeType = DivisionType | ContentType | FilesystemType;
10
10
  export declare const ROOT_NODE: "root";
11
11
  export type ROOT_NODE_TYPE = typeof ROOT_NODE;
12
12
  export type ParentNodeType = NavigationNodeType | ROOT_NODE_TYPE;
13
+ export type NavigationOrder = number | string;
13
14
  export interface BaseNavigationNode<TData> {
14
15
  id: string;
15
16
  parent: string | 0;