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.
- package/README.md +2 -1
- package/build/api/config/load.js +5 -5
- package/build/api/config/load.js.map +1 -1
- package/build/api/config-resolver/resolve.js +2 -2
- package/build/api/config-resolver/resolve.js.map +1 -1
- package/build/api/content/$$.d.ts +5 -0
- package/build/api/content/$$.d.ts.map +1 -0
- package/build/api/content/$$.js +5 -0
- package/build/api/content/$$.js.map +1 -0
- package/build/api/content/$.d.ts +2 -0
- package/build/api/content/$.d.ts.map +1 -0
- package/build/api/content/$.js +2 -0
- package/build/api/content/$.js.map +1 -0
- package/build/api/content/metadata.d.ts +10 -0
- package/build/api/content/metadata.d.ts.map +1 -0
- package/build/api/content/metadata.js +9 -0
- package/build/api/content/metadata.js.map +1 -0
- package/build/api/content/page.d.ts +11 -0
- package/build/api/content/page.d.ts.map +1 -0
- package/build/api/content/page.js +2 -0
- package/build/api/content/page.js.map +1 -0
- package/build/api/content/scan.d.ts +19 -0
- package/build/api/content/scan.d.ts.map +1 -0
- package/build/api/content/scan.js +57 -0
- package/build/api/content/scan.js.map +1 -0
- package/build/{lib/file-router/sidebar/types.d.ts → api/content/sidebar.d.ts} +8 -1
- package/build/api/content/sidebar.d.ts.map +1 -0
- package/build/api/content/sidebar.js +90 -0
- package/build/api/content/sidebar.js.map +1 -0
- package/build/api/schema/data-sources/schema-directory/schema-directory.js +1 -1
- package/build/api/schema/data-sources/schema-directory/schema-directory.js.map +1 -1
- package/build/api/vite/plugins/branding/index.js +4 -4
- package/build/api/vite/plugins/branding/index.js.map +1 -1
- package/build/api/vite/plugins/core.js +4 -4
- package/build/api/vite/plugins/core.js.map +1 -1
- package/build/api/vite/plugins/pages.d.ts +6 -8
- package/build/api/vite/plugins/pages.d.ts.map +1 -1
- package/build/api/vite/plugins/pages.js +99 -155
- package/build/api/vite/plugins/pages.js.map +1 -1
- package/build/api/vite/plugins/serve.js +5 -5
- package/build/api/vite/plugins/serve.js.map +1 -1
- package/build/cli/_/self-contained-mode.js +5 -5
- package/build/cli/_/self-contained-mode.js.map +1 -1
- package/build/exports/components.d.ts +2 -0
- package/build/exports/components.d.ts.map +1 -0
- package/build/exports/components.js +2 -0
- package/build/exports/components.js.map +1 -0
- package/build/lib/demos/config-schema.d.ts +14 -14
- package/build/lib/file-router/file-router.d.ts +0 -2
- package/build/lib/file-router/file-router.d.ts.map +1 -1
- package/build/lib/file-router/file-router.js +0 -2
- package/build/lib/file-router/file-router.js.map +1 -1
- package/build/lib/file-router/route.d.ts +2 -0
- package/build/lib/file-router/route.d.ts.map +1 -1
- package/build/lib/file-router/route.js.map +1 -1
- package/build/lib/file-router/scan.d.ts.map +1 -1
- package/build/lib/file-router/scan.js +16 -12
- package/build/lib/file-router/scan.js.map +1 -1
- package/build/singletons/debug.d.ts +1 -1
- package/build/singletons/debug.d.ts.map +1 -1
- package/build/singletons/debug.js +1 -1
- package/build/singletons/debug.js.map +1 -1
- package/build/template/components/content/$$.d.ts +2 -0
- package/build/template/components/content/$$.d.ts.map +1 -0
- package/build/template/components/content/$$.js +2 -0
- package/build/template/components/content/$$.js.map +1 -0
- package/build/template/components/sidebar/Sidebar.d.ts +2 -2
- package/build/template/components/sidebar/Sidebar.d.ts.map +1 -1
- package/build/template/components/sidebar/SidebarItem.d.ts +3 -3
- package/build/template/components/sidebar/SidebarItem.d.ts.map +1 -1
- package/build/template/components/sidebar/SidebarItem.jsx +1 -1
- package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
- package/package.json +10 -3
- package/src/api/config/load.ts +5 -5
- package/src/api/config-resolver/resolve.ts +2 -2
- package/src/api/content/$$.ts +4 -0
- package/src/api/content/$.test.ts +72 -0
- package/src/api/content/$.ts +1 -0
- package/src/api/content/metadata.ts +11 -0
- package/src/api/content/page.ts +12 -0
- package/src/api/content/scan.ts +82 -0
- package/src/api/content/sidebar.ts +136 -0
- package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
- package/src/api/vite/plugins/branding/index.ts +4 -4
- package/src/api/vite/plugins/core.ts +4 -4
- package/src/api/vite/plugins/pages.ts +117 -171
- package/src/api/vite/plugins/serve.ts +5 -5
- package/src/cli/_/self-contained-mode.ts +5 -5
- package/src/exports/components.ts +1 -0
- package/src/lib/deployment/$$.ts +1 -1
- package/src/lib/deployment/$.test.ts +3 -3
- package/src/lib/deployment/$.ts +1 -1
- package/src/lib/file-router/file-router.ts +0 -2
- package/src/lib/file-router/linter.test.ts +2 -0
- package/src/lib/file-router/route.ts +2 -0
- package/src/lib/file-router/scan.ts +19 -13
- package/src/lib/task/$.test.ts +3 -3
- package/src/singletons/debug.ts +1 -1
- package/src/template/components/content/$$.ts +1 -0
- package/src/template/components/sidebar/Sidebar.tsx +2 -2
- package/src/template/components/sidebar/SidebarItem.tsx +8 -8
- package/build/lib/file-router/scan-tree.d.ts +0 -20
- package/build/lib/file-router/scan-tree.d.ts.map +0 -1
- package/build/lib/file-router/scan-tree.js +0 -158
- package/build/lib/file-router/scan-tree.js.map +0 -1
- package/build/lib/file-router/sidebar/index.d.ts +0 -3
- package/build/lib/file-router/sidebar/index.d.ts.map +0 -1
- package/build/lib/file-router/sidebar/index.js +0 -4
- package/build/lib/file-router/sidebar/index.js.map +0 -1
- package/build/lib/file-router/sidebar/sidebar-tree.d.ts +0 -9
- package/build/lib/file-router/sidebar/sidebar-tree.d.ts.map +0 -1
- package/build/lib/file-router/sidebar/sidebar-tree.js +0 -85
- package/build/lib/file-router/sidebar/sidebar-tree.js.map +0 -1
- package/build/lib/file-router/sidebar/types.d.ts.map +0 -1
- package/build/lib/file-router/sidebar/types.js +0 -2
- package/build/lib/file-router/sidebar/types.js.map +0 -1
- package/build/lib/tree/index.d.ts +0 -3
- package/build/lib/tree/index.d.ts.map +0 -1
- package/build/lib/tree/index.js +0 -2
- package/build/lib/tree/index.js.map +0 -1
- package/build/lib/tree/tree.d.ts +0 -62
- package/build/lib/tree/tree.d.ts.map +0 -1
- package/build/lib/tree/tree.js +0 -134
- package/build/lib/tree/tree.js.map +0 -1
- package/src/lib/file-router/scan-tree.test.ts +0 -189
- package/src/lib/file-router/scan-tree.ts +0 -205
- package/src/lib/file-router/sidebar/index.ts +0 -3
- package/src/lib/file-router/sidebar/sidebar-tree.test.ts +0 -123
- package/src/lib/file-router/sidebar/sidebar-tree.ts +0 -110
- package/src/lib/file-router/sidebar/types.ts +0 -19
- package/src/lib/tree/index.ts +0 -2
- package/src/lib/tree/tree.test.ts +0 -117
- package/src/lib/tree/tree.ts +0 -183
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAU3C,MAAM,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;AAEhC,MAAM,MAAM,QAAQ,GAAG,EAAE,CAAA;AAEzB,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,eAAO,MAAM,GAAG,MAAM,CAAA;AAEtB,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,WAE1C,CAAA;AAUD,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,SAAS,CAAA;
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAU3C,MAAM,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;AAEhC,MAAM,MAAM,QAAQ,GAAG,EAAE,CAAA;AAEzB,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,CAAA;AAEnC,MAAM,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAAC,CAAA;AAElE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,eAAO,MAAM,GAAG,MAAM,CAAA;AAEtB,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,WAE1C,CAAA;AAUD,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,YAAY,CAAA;IACrB,IAAI,EAAE,SAAS,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE;QACJ,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAA;QACrB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAA;KACtB,CAAA;CACF;AAUD,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,EAAE,oBAAoB,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAEvD,CAAA;AAcD,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,OAAO,EAAE,iBAAiB,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAA;CACd;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAEvD,CAAA;AAcD;;;;EAIE;AACF,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,KAAK,IAAI,aAIxD,CAAA;AASD,eAAO,MAAM,oBAAoB,GAAI,OAAO,KAAK,KAAG,OAEnD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,uBAAuB,WAAW,EAAE,KAAG,OAQjF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,EAAE,qBAAqB,WAAW,EAAE,KAAG,KAUrF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,KAAK,WAEjD,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAa,MAAM,iBAAiB,CAAA;AAoB3C,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAA;AAEtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7B,CAAC,CAAA;
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/lib/file-router/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAa,MAAM,iBAAiB,CAAA;AAoB3C,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAA;AAEtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE;IAC7C,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC7B,CAAC,CAAA;AA6CD;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAA0B,EAAE;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;AACxC,CAAC,CAAA;AAsBD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAY,EAA0B,EAAE;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;AACtC,CAAC,CAAA;AAED,EAAE;AACF,gBAAgB;AAChB,EAAE;AAEF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,gEAAgE;AAChE,EAAE;AACF,EAAE;AAEF;;;;EAIE;AACF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAA0B,EAAE;IACvE,oCAAoC;IACpC,8CAA8C;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAA;AACxC,CAAC,CAAA;AAED,EAAE;AACF,EAAE;AACF,EAAE;AACF,mCAAmC;AACnC,EAAE;AACF,EAAE;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAY,EAAW,EAAE;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAA;AACjE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,qBAAoC,EAAW,EAAE;IAC1F,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,WAAW,CAChB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,MAAM,CAAC,EACzD,qBAAqB,CACtB,CAAA;AACH,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAY,EAAE,mBAAkC,EAAS,EAAE;IAC5F,2FAA2F;IAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;IACpE,OAAO;QACL,GAAG,KAAK;QACR,OAAO,EAAE;YACP,GAAG,KAAK,CAAC,OAAO;YAChB,IAAI,EAAE,OAAO;SACd;KACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAY,EAAE,EAAE;IACpD,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;KACd;CACF,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAO,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,KAAK,KAAK,EAAkB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AA2B1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAUD,eAAO,MAAM,IAAI,GAAU,YAAY;IACrC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,OAAO,CAAC,UAAU,CAiBrB,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,oBAAoB,MAAM,EAAE,SAAS,MAAM,KAAG,KAqB7E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,UAAU,IAAI,CAAC,MAAM,KAAG,YAqB9D,CAAA"}
|
@@ -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 { lint } from "./linter.js";
|
5
|
-
import {
|
6
|
-
import { scanTree } from "./scan-tree.js";
|
4
|
+
import {} from "./route.js";
|
7
5
|
//
|
8
6
|
//
|
9
7
|
//
|
@@ -27,18 +25,17 @@ const conventions = {
|
|
27
25
|
//
|
28
26
|
//
|
29
27
|
export const scan = async (parameters) => {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
routes.push(node.value.route);
|
37
|
-
}
|
28
|
+
const { dir, glob = `**/*.{md,mdx}` } = parameters;
|
29
|
+
// Get all files directly
|
30
|
+
const filePaths = await TinyGlobby.glob(glob, {
|
31
|
+
absolute: true,
|
32
|
+
cwd: dir,
|
33
|
+
onlyFiles: true,
|
38
34
|
});
|
35
|
+
// Convert to routes
|
36
|
+
const routes = filePaths.map(filePath => filePathToRoute(filePath, dir));
|
39
37
|
// Apply linting
|
40
38
|
const lintResult = lint(routes);
|
41
|
-
// Routes are already sorted by the tree structure
|
42
39
|
return lintResult;
|
43
40
|
};
|
44
41
|
export const filePathToRoute = (filePathExpression, rootDir) => {
|
@@ -49,9 +46,16 @@ export const filePathToRoute = (filePathExpression, rootDir) => {
|
|
49
46
|
},
|
50
47
|
};
|
51
48
|
const logical = filePathToRouteLogical(file.path.relative);
|
49
|
+
// Generate id and parentId for tree building
|
50
|
+
const id = filePathExpression; // Use absolute path as unique ID
|
51
|
+
const relativePath = Path.relative(rootDir, filePathExpression);
|
52
|
+
const parentDir = Path.dirname(relativePath);
|
53
|
+
const parentId = parentDir === '.' ? null : Path.join(rootDir, parentDir);
|
52
54
|
return {
|
53
55
|
logical,
|
54
56
|
file,
|
57
|
+
id,
|
58
|
+
parentId,
|
55
59
|
};
|
56
60
|
};
|
57
61
|
export const filePathToRouteLogical = (filePath) => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/singletons/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,eAAO,MAAM,
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/singletons/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,eAAO,MAAM,UAAU,aAAwB,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/singletons/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,MAAM,
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/singletons/debug.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"$$.d.ts","sourceRoot":"","sources":["../../../../src/template/components/content/$$.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"$$.js","sourceRoot":"","sources":["../../../../src/template/components/content/$$.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA"}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import type {
|
1
|
+
import type { Content } from '#api/content/$';
|
2
2
|
import type { BoxOwnProps, LayoutProps, MarginProps } from '@radix-ui/themes/props';
|
3
3
|
interface SidebarProps extends LayoutProps, MarginProps, BoxOwnProps {
|
4
|
-
data:
|
4
|
+
data: Content.Item[];
|
5
5
|
style?: React.CSSProperties;
|
6
6
|
}
|
7
7
|
export declare const Sidebar: ({ data, ...props }: SidebarProps) => import("react").JSX.Element;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../src/template/components/sidebar/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../../src/template/components/sidebar/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGnF,UAAU,YAAa,SAAQ,WAAW,EAAE,WAAW,EAAE,WAAW;IAClE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B;AAED,eAAO,MAAM,OAAO,GAAI,oBAAoB,YAAY,gCAiBvD,CAAA"}
|
@@ -1,9 +1,9 @@
|
|
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
|
export declare const Items: React.FC<{
|
4
|
-
items:
|
4
|
+
items: Content.Item[];
|
5
5
|
}>;
|
6
6
|
export declare const Item: React.FC<{
|
7
|
-
item:
|
7
|
+
item: Content.Item;
|
8
8
|
}>;
|
9
9
|
//# sourceMappingURL=SidebarItem.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SidebarItem.d.ts","sourceRoot":"","sources":["../../../../src/template/components/sidebar/SidebarItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
1
|
+
{"version":3,"file":"SidebarItem.d.ts","sourceRoot":"","sources":["../../../../src/template/components/sidebar/SidebarItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAM7C,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAA;CAAE,CAWrD,CAAA;AAUD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAA;CAAE,CAUjD,CAAA"}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Texts } from '#template/components/Texts/index';
|
2
|
-
import { Box, Flex
|
2
|
+
import { Box, Flex } from '@radix-ui/themes';
|
3
3
|
import { useLocation } from 'react-router';
|
4
4
|
import { getPathActiveReport, Link } from "../Link.jsx";
|
5
5
|
export const Items = ({ items }) => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SidebarItem.jsx","sourceRoot":"","sources":["../../../../src/template/components/sidebar/SidebarItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,
|
1
|
+
{"version":3,"file":"SidebarItem.jsx","sourceRoot":"","sources":["../../../../src/template/components/sidebar/SidebarItem.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "polen",
|
3
|
-
"version": "0.10.0-next.
|
3
|
+
"version": "0.10.0-next.5",
|
4
4
|
"type": "module",
|
5
5
|
"description": "A framework for delightful GraphQL developer portals",
|
6
6
|
"author": {
|
@@ -41,13 +41,18 @@
|
|
41
41
|
"#lib/task": "./src/lib/task/$.ts",
|
42
42
|
"#lib/task/task": "./src/lib/task/$$.ts",
|
43
43
|
"#lib/deployment": "./src/lib/deployment/$.ts",
|
44
|
-
"#lib/deployment/deployment": "./src/lib/deployment/$$.ts"
|
44
|
+
"#lib/deployment/deployment": "./src/lib/deployment/$$.ts",
|
45
|
+
"#template/components/content/$$": "./src/template/components/content/$$.ts"
|
45
46
|
},
|
46
47
|
"exports": {
|
47
48
|
".": {
|
48
49
|
"source": "./src/exports/index.ts",
|
49
50
|
"default": "./build/exports/index.js"
|
50
51
|
},
|
52
|
+
"./components": {
|
53
|
+
"source": "./src/exports/components.ts",
|
54
|
+
"default": "./build/exports/components.js"
|
55
|
+
},
|
51
56
|
"./polen": {
|
52
57
|
"source": "./src/exports/polen.ts",
|
53
58
|
"default": "./build/exports/polen.js"
|
@@ -94,7 +99,7 @@
|
|
94
99
|
"@vitejs/plugin-react-oxc": "^0.2.3",
|
95
100
|
"@vltpkg/semver": "0.0.0-15",
|
96
101
|
"@vue/reactivity": "^3.5.16",
|
97
|
-
"@wollybeard/kit": "^0.
|
102
|
+
"@wollybeard/kit": "^0.41.0",
|
98
103
|
"@wollybeard/projector": "^0.2.0",
|
99
104
|
"ansis": "^4.1.0",
|
100
105
|
"clean-stack": "^5.2.0",
|
@@ -104,6 +109,7 @@
|
|
104
109
|
"fuse.js": "^7.1.0",
|
105
110
|
"graffle": "8.0.0-next.163",
|
106
111
|
"graphql": "^16.11.0",
|
112
|
+
"gray-matter": "^4.0.3",
|
107
113
|
"hono": "^4.7.11",
|
108
114
|
"jsesc": "^3.1.0",
|
109
115
|
"jsonc-parser": "^3.3.1",
|
@@ -112,6 +118,7 @@
|
|
112
118
|
"react-router": "^7.6.2",
|
113
119
|
"rehype-stringify": "^10.0.1",
|
114
120
|
"remark": "^15.0.1",
|
121
|
+
"remark-frontmatter": "^5.0.0",
|
115
122
|
"remark-gfm": "^4.0.1",
|
116
123
|
"remark-html": "^16.0.1",
|
117
124
|
"remark-parse": "^11.0.0",
|
package/src/api/config/load.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import type { SelfContainedModeHooksData } from '#cli/_/self-contained-mode'
|
2
2
|
import { assertOptionalPathAbsolute, pickFirstPathExisting } from '#lib/kit-temp'
|
3
3
|
import { packagePaths } from '#package-paths'
|
4
|
-
import {
|
4
|
+
import { debugPolen } from '#singletons/debug'
|
5
5
|
import type { Prom } from '@wollybeard/kit'
|
6
6
|
import { Path } from '@wollybeard/kit'
|
7
7
|
import * as Module from 'node:module'
|
@@ -20,7 +20,7 @@ export interface LoadOptions {
|
|
20
20
|
let isSelfContainedModeRegistered = false
|
21
21
|
|
22
22
|
export const load = async (options: LoadOptions): Promise<ConfigInput> => {
|
23
|
-
const
|
23
|
+
const debug = debugPolen.sub(`load`)
|
24
24
|
assertOptionalPathAbsolute(options.dir)
|
25
25
|
|
26
26
|
//
|
@@ -35,7 +35,7 @@ export const load = async (options: LoadOptions): Promise<ConfigInput> => {
|
|
35
35
|
const initializeData: SelfContainedModeHooksData = {
|
36
36
|
projectDirPathExp: options.dir,
|
37
37
|
}
|
38
|
-
|
38
|
+
debug(`register node module hooks`, { data: initializeData })
|
39
39
|
// TODO: would be simpler to use sync hooks
|
40
40
|
// https://nodejs.org/api/module.html#synchronous-hooks-accepted-by-moduleregisterhooks
|
41
41
|
// Requires NodeJS 22.15+ -- which is not working with PW until its next release.
|
@@ -67,7 +67,7 @@ export const load = async (options: LoadOptions): Promise<ConfigInput> => {
|
|
67
67
|
// eslint-disable-next-line
|
68
68
|
module = await import(filePath)
|
69
69
|
}
|
70
|
-
|
70
|
+
debug(`imported config module`)
|
71
71
|
|
72
72
|
// // Use dynamic import with file URL to support Windows
|
73
73
|
// const configUrl = pathToFileURL(configPath).href
|
@@ -97,7 +97,7 @@ export const load = async (options: LoadOptions): Promise<ConfigInput> => {
|
|
97
97
|
configInput.advanced.isSelfContainedMode = true
|
98
98
|
}
|
99
99
|
|
100
|
-
|
100
|
+
debug(`loaded config input`, configInput)
|
101
101
|
|
102
102
|
return configInput
|
103
103
|
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { debugPolen } from '#singletons/debug'
|
2
2
|
import { type ConfigInput, normalizeInput } from '../config/configurator.ts'
|
3
3
|
import { load, type LoadOptions } from '../config/load.ts'
|
4
4
|
import { mergeInputs } from '../config/merge.ts'
|
@@ -12,7 +12,7 @@ export const fromFile = async (options: ResolveFromFileOptions): Promise<ViteUse
|
|
12
12
|
const configInput = await load(options)
|
13
13
|
const configInputMerged = mergeInputs(configInput, options.overrides)
|
14
14
|
const config = await fromMemory(configInputMerged, options.dir)
|
15
|
-
|
15
|
+
debugPolen(`resolved config`, config)
|
16
16
|
return config
|
17
17
|
}
|
18
18
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
import { Fs, Path } from '@wollybeard/kit'
|
2
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest'
|
3
|
+
import { Content } from './$.ts'
|
4
|
+
|
5
|
+
describe('content', () => {
|
6
|
+
let testDir: string
|
7
|
+
|
8
|
+
beforeEach(async () => {
|
9
|
+
testDir = await Fs.makeTemporaryDirectory()
|
10
|
+
})
|
11
|
+
|
12
|
+
afterEach(async () => {
|
13
|
+
if (testDir && await Fs.exists(testDir)) {
|
14
|
+
await Fs.remove(testDir)
|
15
|
+
}
|
16
|
+
})
|
17
|
+
|
18
|
+
describe('MetadataSchema', () => {
|
19
|
+
test('validates metadata correctly', () => {
|
20
|
+
const valid = Content.MetadataSchema.safeParse({
|
21
|
+
description: 'Test page description',
|
22
|
+
hidden: true,
|
23
|
+
})
|
24
|
+
expect(valid.success).toBe(true)
|
25
|
+
expect(valid.data).toEqual({
|
26
|
+
description: 'Test page description',
|
27
|
+
hidden: true,
|
28
|
+
})
|
29
|
+
})
|
30
|
+
|
31
|
+
test('applies default values', () => {
|
32
|
+
const result = Content.MetadataSchema.safeParse({
|
33
|
+
description: 'Just a description',
|
34
|
+
})
|
35
|
+
expect(result.success).toBe(true)
|
36
|
+
expect(result.data?.hidden).toBe(false)
|
37
|
+
})
|
38
|
+
|
39
|
+
test('rejects invalid values', () => {
|
40
|
+
const result = Content.MetadataSchema.safeParse({
|
41
|
+
hidden: 'not a boolean',
|
42
|
+
invalid_field: 123,
|
43
|
+
})
|
44
|
+
expect(result.success).toBe(false)
|
45
|
+
})
|
46
|
+
})
|
47
|
+
|
48
|
+
describe('scan', () => {
|
49
|
+
test('scans directory and extracts metadata', async () => {
|
50
|
+
const filePath = Path.join(testDir, 'page.md')
|
51
|
+
await Fs.write({
|
52
|
+
path: filePath,
|
53
|
+
content: `---
|
54
|
+
description: Page description
|
55
|
+
---
|
56
|
+
Content`,
|
57
|
+
})
|
58
|
+
|
59
|
+
const result = await Content.scan({
|
60
|
+
dir: testDir,
|
61
|
+
glob: '**/*.md',
|
62
|
+
})
|
63
|
+
|
64
|
+
expect(result.list).toHaveLength(1)
|
65
|
+
expect(result.list[0]?.metadata).toEqual({
|
66
|
+
description: 'Page description',
|
67
|
+
hidden: false,
|
68
|
+
})
|
69
|
+
expect(result.diagnostics).toEqual([])
|
70
|
+
})
|
71
|
+
})
|
72
|
+
})
|
@@ -0,0 +1 @@
|
|
1
|
+
export * as Content from './$$.ts'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { z } from 'zod/v4'
|
2
|
+
|
3
|
+
/**
|
4
|
+
* Schema for validating front matter content
|
5
|
+
*/
|
6
|
+
export const MetadataSchema = z.object({
|
7
|
+
description: z.string().optional(),
|
8
|
+
hidden: z.boolean().default(false),
|
9
|
+
})
|
10
|
+
|
11
|
+
export type Metadata = z.infer<typeof MetadataSchema>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import type { FileRouter } from '#lib/file-router/index'
|
2
|
+
import type { Metadata } from './metadata.ts'
|
3
|
+
|
4
|
+
export type { Metadata }
|
5
|
+
|
6
|
+
/**
|
7
|
+
* A route with its associated metadata
|
8
|
+
*/
|
9
|
+
export interface Page {
|
10
|
+
route: FileRouter.Route
|
11
|
+
metadata: Metadata
|
12
|
+
}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
import { FileRouter } from '#lib/file-router/index'
|
2
|
+
import { Fs, Path, Tree } from '@wollybeard/kit'
|
3
|
+
import matter from 'gray-matter'
|
4
|
+
import { MetadataSchema } from './metadata.ts'
|
5
|
+
import type { Page } from './page.ts'
|
6
|
+
|
7
|
+
export interface ScanResult {
|
8
|
+
list: Page[]
|
9
|
+
tree: Tree.Tree<Page>
|
10
|
+
diagnostics: FileRouter.Diagnostic[]
|
11
|
+
}
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Scan a directory for pages and extract metadata from their front matter
|
15
|
+
* By default, hidden pages are filtered out from both the pages list and route tree.
|
16
|
+
*/
|
17
|
+
export const scan = async (options: {
|
18
|
+
dir: string
|
19
|
+
glob?: string
|
20
|
+
/** Include hidden pages in the result (useful for debugging or admin interfaces) */
|
21
|
+
includeHidden?: boolean
|
22
|
+
}): Promise<ScanResult> => {
|
23
|
+
// Scan for routes
|
24
|
+
const routeScanResult = await FileRouter.scan({
|
25
|
+
dir: options.dir,
|
26
|
+
glob: options.glob ?? '**/*.{md,mdx}',
|
27
|
+
})
|
28
|
+
|
29
|
+
// Create pages with metadata (id/parentId now come from route)
|
30
|
+
const allPages = await Promise.all(
|
31
|
+
routeScanResult.routes.map(route => readRoute(route)),
|
32
|
+
)
|
33
|
+
|
34
|
+
// Apply filtering if needed
|
35
|
+
const pages = options.includeHidden
|
36
|
+
? allPages
|
37
|
+
: allPages.filter(page => !page.metadata.hidden)
|
38
|
+
|
39
|
+
// Build tree from pages using Tree.fromList
|
40
|
+
// Transform pages to include id/parentId at the top level for Tree.fromList
|
41
|
+
const pagesWithIds = pages.map(page => ({
|
42
|
+
...page,
|
43
|
+
id: page.route.id,
|
44
|
+
parentId: page.route.parentId,
|
45
|
+
}))
|
46
|
+
|
47
|
+
const tree = Tree.fromList(pagesWithIds)
|
48
|
+
|
49
|
+
return {
|
50
|
+
list: pages,
|
51
|
+
tree,
|
52
|
+
diagnostics: routeScanResult.diagnostics,
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* Read a single route file and extract metadata from its front matter
|
58
|
+
*/
|
59
|
+
const readRoute = async (route: FileRouter.Route): Promise<Page> => {
|
60
|
+
const filePath = Path.format(route.file.path.absolute)
|
61
|
+
const fileContent = await Fs.read(filePath)
|
62
|
+
|
63
|
+
// Empty files still get default metadata (not hidden by default)
|
64
|
+
// This allows placeholder pages to exist in the navigation
|
65
|
+
if (!fileContent) {
|
66
|
+
return { route, metadata: { hidden: false } }
|
67
|
+
}
|
68
|
+
|
69
|
+
// Parse front matter
|
70
|
+
const { data } = matter(fileContent)
|
71
|
+
|
72
|
+
// Validate and parse the data
|
73
|
+
const parsed = MetadataSchema.safeParse(data)
|
74
|
+
|
75
|
+
if (!parsed.success) {
|
76
|
+
// Log warning but continue with defaults
|
77
|
+
console.warn(`Invalid front matter in ${filePath}:`, parsed.error.issues)
|
78
|
+
}
|
79
|
+
|
80
|
+
const metadata = parsed.success ? parsed.data : { hidden: false }
|
81
|
+
return { route, metadata }
|
82
|
+
}
|
@@ -0,0 +1,136 @@
|
|
1
|
+
import { FileRouter } from '#lib/file-router/index'
|
2
|
+
import { Tree } from '@wollybeard/kit'
|
3
|
+
import { Str } from '@wollybeard/kit'
|
4
|
+
import type { Page } from './page.ts'
|
5
|
+
|
6
|
+
export interface Sidebar {
|
7
|
+
items: Item[]
|
8
|
+
}
|
9
|
+
|
10
|
+
export type Item = ItemLink | ItemSection
|
11
|
+
|
12
|
+
export interface ItemLink {
|
13
|
+
type: `ItemLink`
|
14
|
+
title: string
|
15
|
+
pathExp: string
|
16
|
+
}
|
17
|
+
|
18
|
+
export interface ItemSection {
|
19
|
+
type: `ItemSection`
|
20
|
+
title: string
|
21
|
+
pathExp: string
|
22
|
+
isLinkToo: boolean
|
23
|
+
links: ItemLink[]
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Build sidebar from page tree structure
|
28
|
+
*/
|
29
|
+
export const buildFromPageTree = (pageTree: Tree.Tree<Page>, basePath: FileRouter.Path): Sidebar => {
|
30
|
+
const links: ItemLink[] = []
|
31
|
+
const sections: ItemSection[] = []
|
32
|
+
|
33
|
+
// Process only the children of the root node
|
34
|
+
if (pageTree.root) {
|
35
|
+
for (const child of pageTree.root.children) {
|
36
|
+
processPageNode(child, basePath, [], links, sections)
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
const items = [...links, ...sections]
|
41
|
+
|
42
|
+
return {
|
43
|
+
items,
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
const processPageNode = (
|
48
|
+
node: Tree.Node<Page>,
|
49
|
+
basePath: FileRouter.Path,
|
50
|
+
parentPath: string[],
|
51
|
+
links: ItemLink[],
|
52
|
+
sections: ItemSection[],
|
53
|
+
): void => {
|
54
|
+
const page = node.value
|
55
|
+
const routeName = page.route.logical.path.slice(-1)[0] || 'index'
|
56
|
+
const currentPath = [...parentPath, routeName]
|
57
|
+
|
58
|
+
// If this page has children, treat it as a section
|
59
|
+
if (node.children.length > 0) {
|
60
|
+
const sectionPath = [...basePath, ...currentPath]
|
61
|
+
const sectionPathExp = FileRouter.pathToExpression(sectionPath)
|
62
|
+
const sectionTitle = Str.titlizeSlug(routeName)
|
63
|
+
|
64
|
+
// Check if any child is an index page
|
65
|
+
const hasIndexChild = node.children.some(child => isIndexPage(child.value))
|
66
|
+
|
67
|
+
const section: ItemSection = {
|
68
|
+
type: `ItemSection`,
|
69
|
+
title: sectionTitle,
|
70
|
+
pathExp: sectionPathExp.startsWith('/') ? sectionPathExp.slice(1) : sectionPathExp,
|
71
|
+
isLinkToo: hasIndexChild, // Section is linkable if it has an index page
|
72
|
+
links: [],
|
73
|
+
}
|
74
|
+
|
75
|
+
// Process all children as links for this section
|
76
|
+
for (const child of node.children) {
|
77
|
+
const childPage = child.value
|
78
|
+
|
79
|
+
if (child.children.length > 0) {
|
80
|
+
// This child has children - only collect its descendants, not the child itself
|
81
|
+
collectPagesFromNode(child, basePath, section.links)
|
82
|
+
} else if (!childPage.metadata.hidden && !isIndexPage(childPage)) {
|
83
|
+
// This is a leaf node - add it as a link
|
84
|
+
section.links.push(pageToItemLink(childPage, basePath))
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
sections.push(section)
|
89
|
+
} else {
|
90
|
+
// This is a standalone file - add as top-level link
|
91
|
+
if (!page.metadata.hidden && !isIndexPage(page)) {
|
92
|
+
links.push(pageToItemLink(page, basePath))
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
const collectPagesFromNode = (
|
98
|
+
node: Tree.Node<Page>,
|
99
|
+
basePath: FileRouter.Path,
|
100
|
+
links: ItemLink[],
|
101
|
+
): void => {
|
102
|
+
// Only process children, not the node itself (to avoid double-adding intermediate directories)
|
103
|
+
for (const child of node.children) {
|
104
|
+
const childPage = child.value
|
105
|
+
if (childPage && !childPage.metadata.hidden && !isIndexPage(childPage)) {
|
106
|
+
links.push(pageToItemLink(childPage, basePath))
|
107
|
+
}
|
108
|
+
|
109
|
+
// Recursively process grandchildren
|
110
|
+
if (child.children.length > 0) {
|
111
|
+
collectPagesFromNode(child, basePath, links)
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
|
116
|
+
const pageToItemLink = (page: Page, basePath: FileRouter.Path): ItemLink => {
|
117
|
+
const pagePathExp = FileRouter.routeToPathExpression(page.route)
|
118
|
+
const pageRelative = FileRouter.makeRelativeUnsafe(page.route, basePath)
|
119
|
+
const pageRelativePathExp = FileRouter.routeToPathExpression(pageRelative)
|
120
|
+
|
121
|
+
// Remove leading slash for title generation
|
122
|
+
const titlePath = pageRelativePathExp.startsWith('/') ? pageRelativePathExp.slice(1) : pageRelativePathExp
|
123
|
+
|
124
|
+
// Use only the last segment for the title
|
125
|
+
const titleSegment = pageRelative.logical.path[pageRelative.logical.path.length - 1] || titlePath
|
126
|
+
|
127
|
+
return {
|
128
|
+
type: `ItemLink`,
|
129
|
+
pathExp: pagePathExp.startsWith('/') ? pagePathExp.slice(1) : pagePathExp,
|
130
|
+
title: Str.titlizeSlug(titleSegment),
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
const isIndexPage = (page: Page): boolean => {
|
135
|
+
return page.route.file.path.relative.name === 'index'
|
136
|
+
}
|