polen 0.10.0-next.4 → 0.10.0-next.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +2 -1
  2. package/build/api/config/load.js +5 -5
  3. package/build/api/config/load.js.map +1 -1
  4. package/build/api/config-resolver/resolve.js +2 -2
  5. package/build/api/config-resolver/resolve.js.map +1 -1
  6. package/build/api/content/$$.d.ts +5 -0
  7. package/build/api/content/$$.d.ts.map +1 -0
  8. package/build/api/content/$$.js +5 -0
  9. package/build/api/content/$$.js.map +1 -0
  10. package/build/api/content/$.d.ts +2 -0
  11. package/build/api/content/$.d.ts.map +1 -0
  12. package/build/api/content/$.js +2 -0
  13. package/build/api/content/$.js.map +1 -0
  14. package/build/api/content/metadata.d.ts +10 -0
  15. package/build/api/content/metadata.d.ts.map +1 -0
  16. package/build/api/content/metadata.js +9 -0
  17. package/build/api/content/metadata.js.map +1 -0
  18. package/build/api/content/page.d.ts +11 -0
  19. package/build/api/content/page.d.ts.map +1 -0
  20. package/build/api/content/page.js +2 -0
  21. package/build/api/content/page.js.map +1 -0
  22. package/build/api/content/scan.d.ts +19 -0
  23. package/build/api/content/scan.d.ts.map +1 -0
  24. package/build/api/content/scan.js +57 -0
  25. package/build/api/content/scan.js.map +1 -0
  26. package/build/{lib/file-router/sidebar/types.d.ts → api/content/sidebar.d.ts} +8 -1
  27. package/build/api/content/sidebar.d.ts.map +1 -0
  28. package/build/api/content/sidebar.js +90 -0
  29. package/build/api/content/sidebar.js.map +1 -0
  30. package/build/api/schema/data-sources/schema-directory/schema-directory.js +1 -1
  31. package/build/api/schema/data-sources/schema-directory/schema-directory.js.map +1 -1
  32. package/build/api/vite/plugins/branding/index.js +4 -4
  33. package/build/api/vite/plugins/branding/index.js.map +1 -1
  34. package/build/api/vite/plugins/core.js +4 -4
  35. package/build/api/vite/plugins/core.js.map +1 -1
  36. package/build/api/vite/plugins/pages.d.ts +6 -8
  37. package/build/api/vite/plugins/pages.d.ts.map +1 -1
  38. package/build/api/vite/plugins/pages.js +99 -155
  39. package/build/api/vite/plugins/pages.js.map +1 -1
  40. package/build/api/vite/plugins/serve.js +5 -5
  41. package/build/api/vite/plugins/serve.js.map +1 -1
  42. package/build/cli/_/self-contained-mode.js +5 -5
  43. package/build/cli/_/self-contained-mode.js.map +1 -1
  44. package/build/exports/components.d.ts +2 -0
  45. package/build/exports/components.d.ts.map +1 -0
  46. package/build/exports/components.js +2 -0
  47. package/build/exports/components.js.map +1 -0
  48. package/build/lib/demos/config-schema.d.ts +14 -14
  49. package/build/lib/file-router/file-router.d.ts +0 -2
  50. package/build/lib/file-router/file-router.d.ts.map +1 -1
  51. package/build/lib/file-router/file-router.js +0 -2
  52. package/build/lib/file-router/file-router.js.map +1 -1
  53. package/build/lib/file-router/route.d.ts +2 -0
  54. package/build/lib/file-router/route.d.ts.map +1 -1
  55. package/build/lib/file-router/route.js.map +1 -1
  56. package/build/lib/file-router/scan.d.ts.map +1 -1
  57. package/build/lib/file-router/scan.js +16 -12
  58. package/build/lib/file-router/scan.js.map +1 -1
  59. package/build/singletons/debug.d.ts +1 -1
  60. package/build/singletons/debug.d.ts.map +1 -1
  61. package/build/singletons/debug.js +1 -1
  62. package/build/singletons/debug.js.map +1 -1
  63. package/build/template/components/content/$$.d.ts +2 -0
  64. package/build/template/components/content/$$.d.ts.map +1 -0
  65. package/build/template/components/content/$$.js +2 -0
  66. package/build/template/components/content/$$.js.map +1 -0
  67. package/build/template/components/sidebar/Sidebar.d.ts +2 -2
  68. package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
  69. package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
  70. package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
  71. package/build/template/components/sidebar/SidebarItem.jsx +1 -1
  72. package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
  73. package/package.json +10 -3
  74. package/src/api/config/load.ts +5 -5
  75. package/src/api/config-resolver/resolve.ts +2 -2
  76. package/src/api/content/$$.ts +4 -0
  77. package/src/api/content/$.test.ts +72 -0
  78. package/src/api/content/$.ts +1 -0
  79. package/src/api/content/metadata.ts +11 -0
  80. package/src/api/content/page.ts +12 -0
  81. package/src/api/content/scan.ts +82 -0
  82. package/src/api/content/sidebar.ts +136 -0
  83. package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
  84. package/src/api/vite/plugins/branding/index.ts +4 -4
  85. package/src/api/vite/plugins/core.ts +4 -4
  86. package/src/api/vite/plugins/pages.ts +117 -171
  87. package/src/api/vite/plugins/serve.ts +5 -5
  88. package/src/cli/_/self-contained-mode.ts +5 -5
  89. package/src/exports/components.ts +1 -0
  90. package/src/lib/deployment/$$.ts +1 -1
  91. package/src/lib/deployment/$.test.ts +3 -3
  92. package/src/lib/deployment/$.ts +1 -1
  93. package/src/lib/file-router/file-router.ts +0 -2
  94. package/src/lib/file-router/linter.test.ts +2 -0
  95. package/src/lib/file-router/route.ts +2 -0
  96. package/src/lib/file-router/scan.ts +19 -13
  97. package/src/lib/task/$.test.ts +3 -3
  98. package/src/singletons/debug.ts +1 -1
  99. package/src/template/components/content/$$.ts +1 -0
  100. package/src/template/components/sidebar/Sidebar.tsx +2 -2
  101. package/src/template/components/sidebar/SidebarItem.tsx +8 -8
  102. package/build/lib/file-router/scan-tree.d.ts +0 -20
  103. package/build/lib/file-router/scan-tree.d.ts.map +0 -1
  104. package/build/lib/file-router/scan-tree.js +0 -158
  105. package/build/lib/file-router/scan-tree.js.map +0 -1
  106. package/build/lib/file-router/sidebar/index.d.ts +0 -3
  107. package/build/lib/file-router/sidebar/index.d.ts.map +0 -1
  108. package/build/lib/file-router/sidebar/index.js +0 -4
  109. package/build/lib/file-router/sidebar/index.js.map +0 -1
  110. package/build/lib/file-router/sidebar/sidebar-tree.d.ts +0 -9
  111. package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +0 -1
  112. package/build/lib/file-router/sidebar/sidebar-tree.js +0 -85
  113. package/build/lib/file-router/sidebar/sidebar-tree.js.map +0 -1
  114. package/build/lib/file-router/sidebar/types.d.ts.map +0 -1
  115. package/build/lib/file-router/sidebar/types.js +0 -2
  116. package/build/lib/file-router/sidebar/types.js.map +0 -1
  117. package/build/lib/tree/index.d.ts +0 -3
  118. package/build/lib/tree/index.d.ts.map +0 -1
  119. package/build/lib/tree/index.js +0 -2
  120. package/build/lib/tree/index.js.map +0 -1
  121. package/build/lib/tree/tree.d.ts +0 -62
  122. package/build/lib/tree/tree.d.ts.map +0 -1
  123. package/build/lib/tree/tree.js +0 -134
  124. package/build/lib/tree/tree.js.map +0 -1
  125. package/src/lib/file-router/scan-tree.test.ts +0 -189
  126. package/src/lib/file-router/scan-tree.ts +0 -205
  127. package/src/lib/file-router/sidebar/index.ts +0 -3
  128. package/src/lib/file-router/sidebar/sidebar-tree.test.ts +0 -123
  129. package/src/lib/file-router/sidebar/sidebar-tree.ts +0 -110
  130. package/src/lib/file-router/sidebar/types.ts +0 -19
  131. package/src/lib/tree/index.ts +0 -2
  132. package/src/lib/tree/tree.test.ts +0 -117
  133. package/src/lib/tree/tree.ts +0 -183
@@ -1,9 +1,7 @@
1
1
  import { TinyGlobby } from '#dep/tiny-globby/index'
2
- import { Tree } from '#lib/tree/index'
3
2
  import { Path, Str } from '@wollybeard/kit'
4
3
  import { type Diagnostic, lint } from './linter.ts'
5
- import { type Route, type RouteFile, type RouteLogical, routeToPathExpression } from './route.ts'
6
- import { scanTree } from './scan-tree.ts'
4
+ import { type Route, type RouteFile, type RouteLogical } from './route.ts'
7
5
 
8
6
  //
9
7
  //
@@ -47,21 +45,21 @@ export const scan = async (parameters: {
47
45
  dir: string
48
46
  glob?: string
49
47
  }): Promise<ScanResult> => {
50
- // Use tree-based scanner
51
- const treeResult = await scanTree(parameters)
52
-
53
- // Flatten tree to get routes
54
- const routes: Route[] = []
55
- Tree.visit(treeResult.routeTree, (node) => {
56
- if (node.value.type === 'file' && node.value.route) {
57
- routes.push(node.value.route)
58
- }
48
+ const { dir, glob = `**/*.{md,mdx}` } = parameters
49
+
50
+ // Get all files directly
51
+ const filePaths = await TinyGlobby.glob(glob, {
52
+ absolute: true,
53
+ cwd: dir,
54
+ onlyFiles: true,
59
55
  })
60
56
 
57
+ // Convert to routes
58
+ const routes = filePaths.map(filePath => filePathToRoute(filePath, dir))
59
+
61
60
  // Apply linting
62
61
  const lintResult = lint(routes)
63
62
 
64
- // Routes are already sorted by the tree structure
65
63
  return lintResult
66
64
  }
67
65
 
@@ -74,9 +72,17 @@ export const filePathToRoute = (filePathExpression: string, rootDir: string): Ro
74
72
  }
75
73
  const logical = filePathToRouteLogical(file.path.relative)
76
74
 
75
+ // Generate id and parentId for tree building
76
+ const id = filePathExpression // Use absolute path as unique ID
77
+ const relativePath = Path.relative(rootDir, filePathExpression)
78
+ const parentDir = Path.dirname(relativePath)
79
+ const parentId = parentDir === '.' ? null : Path.join(rootDir, parentDir)
80
+
77
81
  return {
78
82
  logical,
79
83
  file,
84
+ id,
85
+ parentId,
80
86
  }
81
87
  }
82
88
 
@@ -137,10 +137,10 @@ describe('runAndExit', () => {
137
137
  const double = async (x: number) => x * 2
138
138
 
139
139
  await expect(() => Task.runAndExit(double, 5, { name: 'double' })).rejects.toThrow('process.exit called')
140
-
140
+
141
141
  expect(mockExit).toHaveBeenCalledWith(0)
142
142
  expect(mockLog).toHaveBeenCalled()
143
-
143
+
144
144
  // Verify the logged output contains expected content
145
145
  const loggedOutput = mockLog.mock.calls[0]?.[0]
146
146
  expect(loggedOutput).toContain('double')
@@ -161,7 +161,7 @@ describe('runAndExit', () => {
161
161
  }
162
162
 
163
163
  await expect(() => Task.runAndExit(failing, null, { name: 'failing' })).rejects.toThrow('process.exit called')
164
-
164
+
165
165
  expect(mockExit).toHaveBeenCalledWith(1)
166
166
  expect(mockLog).toHaveBeenCalled()
167
167
 
@@ -1,3 +1,3 @@
1
1
  import { Debug } from '@wollybeard/kit'
2
2
 
3
- export const debug = Debug.create(`polen`)
3
+ export const debugPolen = Debug.create(`polen`)
@@ -0,0 +1 @@
1
+ export { Callout, Tabs } from '@radix-ui/themes'
@@ -1,10 +1,10 @@
1
- import type { FileRouter } from '#lib/file-router/index'
1
+ import type { Content } from '#api/content/$'
2
2
  import { Box } from '@radix-ui/themes'
3
3
  import type { BoxOwnProps, LayoutProps, MarginProps } from '@radix-ui/themes/props'
4
4
  import { Items } from './SidebarItem.tsx'
5
5
 
6
6
  interface SidebarProps extends LayoutProps, MarginProps, BoxOwnProps {
7
- data: FileRouter.Sidebar.Item[]
7
+ data: Content.Item[]
8
8
  style?: React.CSSProperties
9
9
  }
10
10
 
@@ -1,11 +1,11 @@
1
+ import type { Content } from '#api/content/$'
1
2
  import type { React } from '#dep/react/index'
2
- import type { FileRouter } from '#lib/file-router/index'
3
3
  import { Texts } from '#template/components/Texts/index'
4
- import { Box, Flex, Text } from '@radix-ui/themes'
4
+ import { Box, Flex } from '@radix-ui/themes'
5
5
  import { useLocation } from 'react-router'
6
6
  import { getPathActiveReport, Link } from '../Link.tsx'
7
7
 
8
- export const Items: React.FC<{ items: FileRouter.Sidebar.Item[] }> = ({ items }) => {
8
+ export const Items: React.FC<{ items: Content.Item[] }> = ({ items }) => {
9
9
  return (
10
10
  <Flex direction='column' gap='2px'>
11
11
  {items.map((item) => (
@@ -26,7 +26,7 @@ export const Items: React.FC<{ items: FileRouter.Sidebar.Item[] }> = ({ items })
26
26
  //
27
27
  //
28
28
 
29
- export const Item: React.FC<{ item: FileRouter.Sidebar.Item }> = ({ item }) => {
29
+ export const Item: React.FC<{ item: Content.Item }> = ({ item }) => {
30
30
  if (item.type === `ItemLink`) {
31
31
  return <SBLink link={item} />
32
32
  }
@@ -47,7 +47,7 @@ export const Item: React.FC<{ item: FileRouter.Sidebar.Item }> = ({ item }) => {
47
47
  //
48
48
 
49
49
  const SBLink: React.FC<{
50
- link: FileRouter.Sidebar.ItemLink | FileRouter.Sidebar.ItemSection
50
+ link: Content.ItemLink | Content.ItemSection
51
51
  }> = ({ link }) => {
52
52
  const location = useLocation()
53
53
  const currentPathExp = location.pathname
@@ -81,7 +81,7 @@ const SBLink: React.FC<{
81
81
  //
82
82
 
83
83
  const Section: React.FC<{
84
- section: FileRouter.Sidebar.ItemSection
84
+ section: Content.ItemSection
85
85
  }> = ({ section }) => {
86
86
  return (
87
87
  <Box mt='8'>
@@ -104,7 +104,7 @@ const Section: React.FC<{
104
104
  //
105
105
 
106
106
  const LinkedSection: React.FC<{
107
- section: FileRouter.Sidebar.ItemSection
107
+ section: Content.ItemSection
108
108
  }> = ({ section }) => {
109
109
  return (
110
110
  <Box>
@@ -133,7 +133,7 @@ const LinkedSection: React.FC<{
133
133
  )
134
134
  }
135
135
 
136
- const SectionLink: React.FC<{ link: FileRouter.Sidebar.ItemLink }> = ({ link }) => {
136
+ const SectionLink: React.FC<{ link: Content.ItemLink }> = ({ link }) => {
137
137
  const location = useLocation()
138
138
  const active = getPathActiveReport(link.pathExp, location.pathname)
139
139
 
@@ -1,20 +0,0 @@
1
- import { type TreeNode } from '#lib/tree/index';
2
- import type { Diagnostic } from './linter.ts';
3
- import type { Route } from './route.ts';
4
- export type RouteTreeNodeType = 'directory' | 'file';
5
- export interface RouteTreeNodeValue {
6
- name: string;
7
- order?: number;
8
- type: RouteTreeNodeType;
9
- route?: Route;
10
- }
11
- export type RouteTreeNode = TreeNode<RouteTreeNodeValue>;
12
- export interface ScanTreeResult {
13
- routeTree: RouteTreeNode;
14
- diagnostics: Diagnostic[];
15
- }
16
- export declare const scanTree: (parameters: {
17
- dir: string;
18
- glob?: string;
19
- }) => Promise<ScanTreeResult>;
20
- //# sourceMappingURL=scan-tree.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan-tree.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/scan-tree.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAa,MAAM,YAAY,CAAA;AAMlD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,MAAM,CAAA;AAEpD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,iBAAiB,CAAA;IACvB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAA;AAExD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,aAAa,CAAA;IACxB,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAkID,eAAO,MAAM,QAAQ,GAAU,YAAY;IACzC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,OAAO,CAAC,cAAc,CAoBzB,CAAA"}
@@ -1,158 +0,0 @@
1
- import { TinyGlobby } from '#dep/tiny-globby/index';
2
- import { Tree } from '#lib/tree/index';
3
- import { Path, Str } from '@wollybeard/kit';
4
- //
5
- // Constants
6
- //
7
- const conventions = {
8
- index: {
9
- name: `index`,
10
- },
11
- numberedPrefix: {
12
- pattern: Str.pattern(/^(?<order>\d+)[_-](?<name>.+)$/),
13
- },
14
- };
15
- //
16
- // Helpers
17
- //
18
- const parseSegment = (segment) => {
19
- const match = Str.match(segment, conventions.numberedPrefix.pattern);
20
- if (match) {
21
- return {
22
- name: match.groups.name,
23
- order: parseInt(match.groups.order, 10),
24
- };
25
- }
26
- return { name: segment };
27
- };
28
- const buildRouteTreeFromPaths = async (paths, rootDir) => {
29
- // Root node (represents the pages directory itself)
30
- const root = Tree.node({
31
- name: 'root',
32
- type: 'directory',
33
- });
34
- // Process each file path
35
- for (const filePath of paths) {
36
- const relativePath = Path.relative(rootDir, filePath);
37
- // Split the path into segments
38
- const segments = relativePath.split(Path.sep).filter(s => s.length > 0);
39
- if (segments.length === 0)
40
- continue; // Skip root directory
41
- // Navigate/create path in tree
42
- let currentNode = root;
43
- for (let i = 0; i < segments.length; i++) {
44
- const segment = segments[i];
45
- const isLast = i === segments.length - 1;
46
- // Parse segment for ordering
47
- let segmentName = segment;
48
- // Strip extension for files
49
- if (isLast && (segment.endsWith('.md') || segment.endsWith('.mdx'))) {
50
- segmentName = segment.replace(/\.(md|mdx)$/, '');
51
- }
52
- const parsed = parseSegment(segmentName);
53
- // Find existing child
54
- const existingChildIndex = currentNode.children.findIndex(child => child.value.name === parsed.name);
55
- let childNode = existingChildIndex >= 0 ? currentNode.children[existingChildIndex] : undefined;
56
- if (!childNode) {
57
- // Create new node
58
- if (isLast) {
59
- // This is a file
60
- const route = filePathToRoute(filePath, rootDir);
61
- childNode = Tree.node({
62
- name: parsed.name,
63
- order: parsed.order,
64
- type: 'file',
65
- route,
66
- });
67
- }
68
- else {
69
- // This is a directory (implicit from file path)
70
- childNode = Tree.node({
71
- name: parsed.name,
72
- order: parsed.order,
73
- type: 'directory',
74
- });
75
- }
76
- currentNode.children.push(childNode);
77
- }
78
- else if (isLast && childNode.value.type === 'file') {
79
- // Handle collision for files with same name
80
- // If new file has higher or equal order, replace the existing one (last wins for ties)
81
- if (parsed.order !== undefined
82
- && (childNode.value.order === undefined || parsed.order >= childNode.value.order)) {
83
- const route = filePathToRoute(filePath, rootDir);
84
- const newNode = Tree.node({
85
- name: parsed.name,
86
- order: parsed.order,
87
- type: 'file',
88
- route,
89
- });
90
- currentNode.children[existingChildIndex] = newNode;
91
- childNode = newNode;
92
- }
93
- // Otherwise keep the existing node (when existing has higher order)
94
- }
95
- currentNode = childNode;
96
- }
97
- }
98
- // Sort the tree
99
- return sortRouteTree(root);
100
- };
101
- const sortRouteTree = (tree) => {
102
- return Tree.sort(tree, (a, b) => {
103
- // If both have orders, sort by order
104
- if (a.order !== undefined && b.order !== undefined) {
105
- return a.order - b.order;
106
- }
107
- // If only one has order, it comes first
108
- if (a.order !== undefined)
109
- return -1;
110
- if (b.order !== undefined)
111
- return 1;
112
- // Otherwise sort alphabetically
113
- return a.name.localeCompare(b.name);
114
- });
115
- };
116
- //
117
- // Main scan function
118
- //
119
- export const scanTree = async (parameters) => {
120
- const { dir, glob = `**/*` } = parameters;
121
- // Get all files
122
- const filePaths = await TinyGlobby.glob(glob, {
123
- absolute: true,
124
- cwd: dir,
125
- onlyFiles: true,
126
- });
127
- // Build tree structure (directories will be created implicitly)
128
- const routeTree = await buildRouteTreeFromPaths(filePaths, dir);
129
- // TODO: Implement tree-based linting
130
- const diagnostics = [];
131
- return {
132
- routeTree,
133
- diagnostics,
134
- };
135
- };
136
- // Reuse existing route creation logic
137
- const filePathToRoute = (filePathExpression, rootDir) => {
138
- const file = {
139
- path: {
140
- absolute: Path.parse(filePathExpression),
141
- relative: Path.parse(Path.relative(rootDir, filePathExpression)),
142
- },
143
- };
144
- const dirPath = Str.split(Str.removeSurrounding(file.path.relative.dir, Path.sep), Path.sep);
145
- // Parse numbered prefix from filename
146
- const prefixMatch = file.path.relative.name.match(conventions.numberedPrefix.pattern);
147
- const order = prefixMatch?.groups?.[`order`] ? parseInt(prefixMatch.groups[`order`], 10) : undefined;
148
- const nameWithoutPrefix = prefixMatch?.groups?.[`name`] ?? file.path.relative.name;
149
- const logical = {
150
- path: nameWithoutPrefix === conventions.index.name ? dirPath : dirPath.concat(nameWithoutPrefix),
151
- order,
152
- };
153
- return {
154
- logical,
155
- file,
156
- };
157
- };
158
- //# sourceMappingURL=scan-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan-tree.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan-tree.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export * as SidebarTree from './sidebar-tree.ts';
2
- export * as Sidebar from './sidebar-tree.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAEhD,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAA"}
@@ -1,4 +0,0 @@
1
- export * as SidebarTree from "./sidebar-tree.js";
2
- // Re-export SidebarTree as Sidebar for backward compatibility
3
- export * as Sidebar from "./sidebar-tree.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAA;AAChD,8DAA8D;AAC9D,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAA"}
@@ -1,9 +0,0 @@
1
- import * as FileRouter from '../file-router.ts';
2
- import type { RouteTreeNode } from '../scan-tree.ts';
3
- import type { Sidebar } from './types.ts';
4
- export * from './types.ts';
5
- /**
6
- * Build sidebar from tree structure
7
- */
8
- export declare const buildFromTree: (routeTree: RouteTreeNode, basePath: FileRouter.Path) => Sidebar;
9
- //# sourceMappingURL=sidebar-tree.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar-tree.d.ts","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/sidebar-tree.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAyB,OAAO,EAAE,MAAM,YAAY,CAAA;AAEhE,cAAc,YAAY,CAAA;AAE1B;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,WAAW,aAAa,EAAE,UAAU,UAAU,CAAC,IAAI,KAAG,OAcnF,CAAA"}
@@ -1,85 +0,0 @@
1
- import { Tree } from '#lib/tree/index';
2
- import { Str } from '@wollybeard/kit';
3
- import * as FileRouter from "../file-router.js";
4
- export * from "./types.js";
5
- /**
6
- * Build sidebar from tree structure
7
- */
8
- export const buildFromTree = (routeTree, basePath) => {
9
- const links = [];
10
- const sections = [];
11
- // Process only the children of the root node
12
- for (const child of routeTree.children) {
13
- processNode(child, basePath, [], links, sections);
14
- }
15
- const items = [...links, ...sections];
16
- return {
17
- items,
18
- };
19
- };
20
- const processNode = (node, basePath, parentPath, links, sections) => {
21
- const currentPath = [...parentPath, node.value.name];
22
- if (node.value.type === 'directory') {
23
- // This is a directory - create a section
24
- const sectionPath = [...basePath, ...currentPath];
25
- const sectionPathExp = FileRouter.pathToExpression(sectionPath);
26
- const sectionTitle = Str.titlizeSlug(node.value.name);
27
- const section = {
28
- type: `ItemSection`,
29
- title: sectionTitle,
30
- pathExp: sectionPathExp.startsWith('/') ? sectionPathExp.slice(1) : sectionPathExp,
31
- isLinkToo: false,
32
- links: [],
33
- };
34
- // Check if this directory has an index file
35
- const indexChild = node.children.find(child => child.value.type === 'file' && child.value.name === 'index');
36
- if (indexChild) {
37
- section.isLinkToo = true;
38
- }
39
- // Process all non-index children as links for this section
40
- for (const child of node.children) {
41
- if (child.value.type === 'file' && child.value.name !== 'index' && child.value.route) {
42
- // Pass the parent path of the route, not the section path
43
- const routeParentPath = child.value.route.logical.path.slice(0, -1);
44
- section.links.push(routeToItemLink(child.value.route, routeParentPath));
45
- }
46
- else if (child.value.type === 'directory') {
47
- // Recursively process subdirectories
48
- // Note: This creates nested sections which the original implementation doesn't support
49
- // For now, we'll just add the files from subdirectories to the parent section
50
- collectFilesFromDirectory(child, child.value.route?.logical.path || [], section.links);
51
- }
52
- }
53
- sections.push(section);
54
- }
55
- else if (node.value.type === 'file' && node.value.route) {
56
- // This is a top-level file - add as nav
57
- if (node.value.name !== 'index') {
58
- links.push(routeToItemLink(node.value.route, basePath));
59
- }
60
- }
61
- };
62
- const collectFilesFromDirectory = (node, basePath, links) => {
63
- Tree.visit(node, (n) => {
64
- if (n.value.type === 'file' && n.value.route && n.value.name !== 'index') {
65
- // Use the route's parent path for relative title generation
66
- const routeParentPath = n.value.route.logical.path.slice(0, -1);
67
- links.push(routeToItemLink(n.value.route, routeParentPath));
68
- }
69
- });
70
- };
71
- const routeToItemLink = (route, basePath) => {
72
- const pagePathExp = FileRouter.routeToPathExpression(route);
73
- const pageRelative = FileRouter.makeRelativeUnsafe(route, basePath);
74
- const pageRelativePathExp = FileRouter.routeToPathExpression(pageRelative);
75
- // Remove leading slash for title generation
76
- const titlePath = pageRelativePathExp.startsWith('/') ? pageRelativePathExp.slice(1) : pageRelativePathExp;
77
- // Use only the last segment for the title
78
- const titleSegment = pageRelative.logical.path[pageRelative.logical.path.length - 1] || titlePath;
79
- return {
80
- type: `ItemLink`,
81
- pathExp: pagePathExp.startsWith('/') ? pagePathExp.slice(1) : pagePathExp,
82
- title: Str.titlizeSlug(titleSegment),
83
- };
84
- };
85
- //# sourceMappingURL=sidebar-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar-tree.js","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/sidebar-tree.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,IAAI,EAAE,CAAA;CACd;AAED,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,aAAa,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAA;CAClB"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/file-router/sidebar/types.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- export * as Tree from './tree.ts';
2
- export type { TreeMapper, TreeNode, TreePredicate, TreeVisitor } from './tree.ts';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/tree/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
@@ -1,2 +0,0 @@
1
- export * as Tree from "./tree.js";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/tree/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA"}
@@ -1,62 +0,0 @@
1
- /**
2
- * Generic tree data structure and utilities
3
- */
4
- export interface TreeNode<T> {
5
- value: T;
6
- children: TreeNode<T>[];
7
- }
8
- export type TreeVisitor<T, R = void> = (node: TreeNode<T>, depth: number, path: T[]) => R;
9
- export type TreeMapper<T, U> = (value: T, depth: number, path: T[]) => U;
10
- export type TreePredicate<T> = (value: T, depth: number, path: T[]) => boolean;
11
- /**
12
- * Create a new tree node
13
- */
14
- export declare const node: <T>(value: T, children?: TreeNode<T>[]) => TreeNode<T>;
15
- /**
16
- * Map over a tree, transforming each node's value
17
- */
18
- export declare const map: <T, U>(tree: TreeNode<T>, mapper: TreeMapper<T, U>, depth?: number, path?: T[]) => TreeNode<U>;
19
- /**
20
- * Visit each node in the tree (depth-first)
21
- */
22
- export declare const visit: <T>(tree: TreeNode<T>, visitor: TreeVisitor<T>, depth?: number, path?: T[]) => void;
23
- /**
24
- * Find a node in the tree
25
- */
26
- export declare const find: <T>(tree: TreeNode<T>, predicate: TreePredicate<T>, depth?: number, path?: T[]) => TreeNode<T> | undefined;
27
- /**
28
- * Filter tree nodes (keeps structure, removes non-matching nodes)
29
- */
30
- export declare const filter: <T>(tree: TreeNode<T>, predicate: TreePredicate<T>, depth?: number, path?: T[]) => TreeNode<T> | undefined;
31
- /**
32
- * Sort a tree's children at each level
33
- */
34
- export declare const sort: <T>(tree: TreeNode<T>, compareFn: (a: T, b: T) => number) => TreeNode<T>;
35
- /**
36
- * Flatten a tree into an array (depth-first)
37
- */
38
- export declare const flatten: <T>(tree: TreeNode<T>) => T[];
39
- /**
40
- * Get the depth of the tree
41
- */
42
- export declare const depth: <T>(tree: TreeNode<T>) => number;
43
- /**
44
- * Count total nodes in the tree
45
- */
46
- export declare const count: <T>(tree: TreeNode<T>) => number;
47
- /**
48
- * Check if a node is a leaf (has no children)
49
- */
50
- export declare const isLeaf: <T>(node: TreeNode<T>) => boolean;
51
- /**
52
- * Get all leaf nodes
53
- */
54
- export declare const leaves: <T>(tree: TreeNode<T>) => TreeNode<T>[];
55
- /**
56
- * Build a tree from a flat list with parent references
57
- */
58
- export declare const fromList: <T extends {
59
- id: string;
60
- parentId?: string;
61
- }>(items: T[], rootId?: string) => TreeNode<T>[];
62
- //# sourceMappingURL=tree.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/lib/tree/tree.ts"],"names":[],"mappings":"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"}