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 +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;CAChB;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
+ {"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;AA2CD;;;;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
+ {"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":"AAEA,OAAO,EAAE,IAAI,EAAO,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,KAAK,KAAK,EAAkB,KAAK,YAAY,EAAyB,MAAM,YAAY,CAAA;AA4BjG,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,KAa7E,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,UAAU,IAAI,CAAC,MAAM,KAAG,YAqB9D,CAAA"}
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 { routeToPathExpression } from "./route.js";
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
- // Use tree-based scanner
31
- const treeResult = await scanTree(parameters);
32
- // Flatten tree to get routes
33
- const routes = [];
34
- Tree.visit(treeResult.routeTree, (node) => {
35
- if (node.value.type === 'file' && node.value.route) {
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":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/lib/file-router/scan.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { Debug } from '@wollybeard/kit';
2
- export declare const debug: Debug.Debug;
2
+ export declare const debugPolen: Debug.Debug;
3
3
  //# sourceMappingURL=debug.d.ts.map
@@ -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,KAAK,aAAwB,CAAA"}
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,3 +1,3 @@
1
1
  import { Debug } from '@wollybeard/kit';
2
- export const debug = Debug.create(`polen`);
2
+ export const debugPolen = Debug.create(`polen`);
3
3
  //# sourceMappingURL=debug.js.map
@@ -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,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA"}
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,2 @@
1
+ export { Callout, Tabs } from '@radix-ui/themes';
2
+ //# sourceMappingURL=$$.d.ts.map
@@ -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,2 @@
1
+ export { Callout, Tabs } from '@radix-ui/themes';
2
+ //# sourceMappingURL=$$.js.map
@@ -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 { FileRouter } from '#lib/file-router/index';
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: FileRouter.Sidebar.Item[];
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,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAGnF,UAAU,YAAa,SAAQ,WAAW,EAAE,WAAW,EAAE,WAAW;IAClE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;CAC5B;AAED,eAAO,MAAM,OAAO,GAAI,oBAAoB,YAAY,gCAiBvD,CAAA"}
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: FileRouter.Sidebar.Item[];
4
+ items: Content.Item[];
5
5
  }>;
6
6
  export declare const Item: React.FC<{
7
- item: FileRouter.Sidebar.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,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAMxD,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,CAAA;CAAE,CAWhE,CAAA;AAUD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAA;CAAE,CAU5D,CAAA"}
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, Text } from '@radix-ui/themes';
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":"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"}
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.4",
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.40.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",
@@ -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 { debug } from '#singletons/debug'
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 _debug = debug.sub(`load`)
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
- _debug(`register node module hooks`, { data: initializeData })
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
- _debug(`imported config module`)
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
- _debug(`loaded config input`, configInput)
100
+ debug(`loaded config input`, configInput)
101
101
 
102
102
  return configInput
103
103
  }
@@ -1,4 +1,4 @@
1
- import { debug } from '#singletons/debug'
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
- debug(`resolved config`, config)
15
+ debugPolen(`resolved config`, config)
16
16
  return config
17
17
  }
18
18
 
@@ -0,0 +1,4 @@
1
+ export * from './metadata.ts'
2
+ export * from './page.ts'
3
+ export * from './scan.ts'
4
+ export * from './sidebar.ts'
@@ -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
+ }