polen 0.9.1-next.2 → 0.10.0-next.11
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 +49 -364
- package/build/api/api.d.ts +1 -0
- package/build/api/api.d.ts.map +1 -1
- package/build/api/api.js +1 -0
- package/build/api/api.js.map +1 -1
- package/build/api/config/configurator.d.ts +9 -1
- package/build/api/config/configurator.d.ts.map +1 -1
- package/build/api/config/configurator.js +18 -6
- package/build/api/config/configurator.js.map +1 -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 +7 -0
- package/build/api/content/$$.d.ts.map +1 -0
- package/build/api/content/$$.js +7 -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/navbar.d.ts +10 -0
- package/build/api/content/navbar.d.ts.map +1 -0
- package/build/api/content/navbar.js +45 -0
- package/build/api/content/navbar.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 +90 -0
- package/build/api/content/scan.js.map +1 -0
- package/build/api/content/sidebar.d.ts +104 -0
- package/build/api/content/sidebar.d.ts.map +1 -0
- package/build/api/content/sidebar.js +166 -0
- package/build/api/content/sidebar.js.map +1 -0
- package/build/api/content/utils.d.ts +5 -0
- package/build/api/content/utils.d.ts.map +1 -0
- package/build/api/content/utils.js +8 -0
- package/build/api/content/utils.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/static/index.d.ts +2 -0
- package/build/api/static/index.d.ts.map +1 -0
- package/build/api/static/index.js +2 -0
- package/build/api/static/index.js.map +1 -0
- package/build/api/static/manifest.d.ts +18 -0
- package/build/api/static/manifest.d.ts.map +1 -0
- package/build/api/static/manifest.js +13 -0
- package/build/api/static/manifest.js.map +1 -0
- package/build/api/static/rebase.d.ts +14 -0
- package/build/api/static/rebase.d.ts.map +1 -0
- package/build/api/static/rebase.js +110 -0
- package/build/api/static/rebase.js.map +1 -0
- package/build/api/static/static.d.ts +3 -0
- package/build/api/static/static.d.ts.map +1 -0
- package/build/api/static/static.js +3 -0
- package/build/api/static/static.js.map +1 -0
- package/build/api/vite/plugins/branding/index.d.ts +4 -0
- package/build/api/vite/plugins/branding/index.d.ts.map +1 -0
- package/build/api/vite/plugins/branding/index.js +80 -0
- package/build/api/vite/plugins/branding/index.js.map +1 -0
- package/build/api/vite/plugins/build.d.ts.map +1 -1
- package/build/api/vite/plugins/build.js +22 -1
- package/build/api/vite/plugins/build.js.map +1 -1
- package/build/api/vite/plugins/core.d.ts +2 -2
- package/build/api/vite/plugins/core.d.ts.map +1 -1
- package/build/api/vite/plugins/core.js +4 -5
- package/build/api/vite/plugins/core.js.map +1 -1
- package/build/api/vite/plugins/main.d.ts.map +1 -1
- package/build/api/vite/plugins/main.js +2 -1
- package/build/api/vite/plugins/main.js.map +1 -1
- package/build/api/vite/plugins/pages.d.ts +8 -14
- package/build/api/vite/plugins/pages.d.ts.map +1 -1
- package/build/api/vite/plugins/pages.js +110 -183
- 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/cli/commands/static/$default.d.ts +3 -0
- package/build/cli/commands/static/$default.d.ts.map +1 -0
- package/build/cli/commands/static/$default.js +38 -0
- package/build/cli/commands/static/$default.js.map +1 -0
- package/build/cli/commands/static/rebase.d.ts +2 -0
- package/build/cli/commands/static/rebase.d.ts.map +1 -0
- package/build/cli/commands/static/rebase.js +26 -0
- package/build/cli/commands/static/rebase.js.map +1 -0
- package/build/cli/commands/static.d.ts +3 -0
- package/build/cli/commands/static.d.ts.map +1 -0
- package/build/cli/commands/static.js +5 -0
- package/build/cli/commands/static.js.map +1 -0
- 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/builder.d.ts +83 -0
- package/build/lib/demos/builder.d.ts.map +1 -0
- package/build/lib/demos/builder.js +237 -0
- package/build/lib/demos/builder.js.map +1 -0
- package/build/lib/demos/config-schema.d.ts +243 -0
- package/build/lib/demos/config-schema.d.ts.map +1 -0
- package/build/lib/demos/config-schema.js +52 -0
- package/build/lib/demos/config-schema.js.map +1 -0
- package/build/lib/demos/config.d.ts +40 -0
- package/build/lib/demos/config.d.ts.map +1 -0
- package/build/lib/demos/config.js +180 -0
- package/build/lib/demos/config.js.map +1 -0
- package/build/lib/demos/index.d.ts +9 -0
- package/build/lib/demos/index.d.ts.map +1 -0
- package/build/lib/demos/index.js +8 -0
- package/build/lib/demos/index.js.map +1 -0
- package/build/lib/demos/ui/components.d.ts +33 -0
- package/build/lib/demos/ui/components.d.ts.map +1 -0
- package/build/lib/demos/ui/components.js +699 -0
- package/build/lib/demos/ui/components.js.map +1 -0
- package/build/lib/demos/ui/data-collector.d.ts +88 -0
- package/build/lib/demos/ui/data-collector.d.ts.map +1 -0
- package/build/lib/demos/ui/data-collector.js +174 -0
- package/build/lib/demos/ui/data-collector.js.map +1 -0
- package/build/lib/demos/ui/landing-page-cli.d.ts +3 -0
- package/build/lib/demos/ui/landing-page-cli.d.ts.map +1 -0
- package/build/lib/demos/ui/landing-page-cli.js +21 -0
- package/build/lib/demos/ui/landing-page-cli.js.map +1 -0
- package/build/lib/demos/ui/landing-page.d.ts +32 -0
- package/build/lib/demos/ui/landing-page.d.ts.map +1 -0
- package/build/lib/demos/ui/landing-page.js +83 -0
- package/build/lib/demos/ui/landing-page.js.map +1 -0
- package/build/lib/demos/ui/page-renderer.d.ts +26 -0
- package/build/lib/demos/ui/page-renderer.d.ts.map +1 -0
- package/build/lib/demos/ui/page-renderer.js +104 -0
- package/build/lib/demos/ui/page-renderer.js.map +1 -0
- package/build/lib/demos/utils.d.ts +14 -0
- package/build/lib/demos/utils.d.ts.map +1 -0
- package/build/lib/demos/utils.js +37 -0
- package/build/lib/demos/utils.js.map +1 -0
- package/build/lib/deployment/$$.d.ts +3 -0
- package/build/lib/deployment/$$.d.ts.map +1 -0
- package/build/lib/deployment/$$.js +3 -0
- package/build/lib/deployment/$$.js.map +1 -0
- package/build/lib/deployment/$.d.ts +2 -0
- package/build/lib/deployment/$.d.ts.map +1 -0
- package/build/lib/deployment/$.js +2 -0
- package/build/lib/deployment/$.js.map +1 -0
- package/build/lib/deployment/metadata.d.ts +32 -0
- package/build/lib/deployment/metadata.d.ts.map +1 -0
- package/build/lib/deployment/metadata.js +37 -0
- package/build/lib/deployment/metadata.js.map +1 -0
- package/build/lib/deployment/path-manager.d.ts +41 -0
- package/build/lib/deployment/path-manager.d.ts.map +1 -0
- package/build/lib/deployment/path-manager.js +157 -0
- package/build/lib/deployment/path-manager.js.map +1 -0
- 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 +22 -13
- package/build/lib/file-router/scan.js.map +1 -1
- package/build/lib/github-actions/git-controller.d.ts +50 -0
- package/build/lib/github-actions/git-controller.d.ts.map +1 -0
- package/build/lib/github-actions/git-controller.js +90 -0
- package/build/lib/github-actions/git-controller.js.map +1 -0
- package/build/lib/github-actions/github-actions.d.ts +7 -0
- package/build/lib/github-actions/github-actions.d.ts.map +1 -0
- package/build/lib/github-actions/github-actions.js +7 -0
- package/build/lib/github-actions/github-actions.js.map +1 -0
- package/build/lib/github-actions/index.d.ts +2 -0
- package/build/lib/github-actions/index.d.ts.map +1 -0
- package/build/lib/github-actions/index.js +2 -0
- package/build/lib/github-actions/index.js.map +1 -0
- package/build/lib/github-actions/lib/get-pr-deployments.d.ts +12 -0
- package/build/lib/github-actions/lib/get-pr-deployments.d.ts.map +1 -0
- package/build/lib/github-actions/lib/get-pr-deployments.js +51 -0
- package/build/lib/github-actions/lib/get-pr-deployments.js.map +1 -0
- package/build/lib/github-actions/pr-controller.d.ts +39 -0
- package/build/lib/github-actions/pr-controller.d.ts.map +1 -0
- package/build/lib/github-actions/pr-controller.js +122 -0
- package/build/lib/github-actions/pr-controller.js.map +1 -0
- package/build/lib/github-actions/run-step-cli.d.ts +9 -0
- package/build/lib/github-actions/run-step-cli.d.ts.map +1 -0
- package/build/lib/github-actions/run-step-cli.js +71 -0
- package/build/lib/github-actions/run-step-cli.js.map +1 -0
- package/build/lib/github-actions/runner.d.ts +17 -0
- package/build/lib/github-actions/runner.d.ts.map +1 -0
- package/build/lib/github-actions/runner.js +195 -0
- package/build/lib/github-actions/runner.js.map +1 -0
- package/build/lib/github-actions/schemas/context.d.ts +933 -0
- package/build/lib/github-actions/schemas/context.d.ts.map +1 -0
- package/build/lib/github-actions/schemas/context.js +407 -0
- package/build/lib/github-actions/schemas/context.js.map +1 -0
- package/build/lib/github-actions/schemas/index.d.ts +5 -0
- package/build/lib/github-actions/schemas/index.d.ts.map +1 -0
- package/build/lib/github-actions/schemas/index.js +5 -0
- package/build/lib/github-actions/schemas/index.js.map +1 -0
- package/build/lib/github-actions/search-module.d.ts +38 -0
- package/build/lib/github-actions/search-module.d.ts.map +1 -0
- package/build/lib/github-actions/search-module.js +40 -0
- package/build/lib/github-actions/search-module.js.map +1 -0
- package/build/lib/github-actions/step.d.ts +163 -0
- package/build/lib/github-actions/step.d.ts.map +1 -0
- package/build/lib/github-actions/step.js +121 -0
- package/build/lib/github-actions/step.js.map +1 -0
- package/build/lib/helpers.d.ts.map +1 -1
- package/build/lib/helpers.js +5 -3
- package/build/lib/helpers.js.map +1 -1
- package/build/lib/kit-temp.d.ts +54 -0
- package/build/lib/kit-temp.d.ts.map +1 -1
- package/build/lib/kit-temp.js +82 -14
- package/build/lib/kit-temp.js.map +1 -1
- package/build/lib/kit-temp.test-d.d.ts +2 -0
- package/build/lib/kit-temp.test-d.d.ts.map +1 -0
- package/build/lib/kit-temp.test-d.js +75 -0
- package/build/lib/kit-temp.test-d.js.map +1 -0
- package/build/lib/mask/$$.d.ts +3 -0
- package/build/lib/mask/$$.d.ts.map +1 -0
- package/build/lib/mask/$$.js +3 -0
- package/build/lib/mask/$$.js.map +1 -0
- package/build/lib/mask/$.d.ts +2 -0
- package/build/lib/mask/$.d.ts.map +1 -0
- package/build/lib/mask/$.js +2 -0
- package/build/lib/mask/$.js.map +1 -0
- package/build/lib/mask/apply.d.ts +86 -0
- package/build/lib/mask/apply.d.ts.map +1 -0
- package/build/lib/mask/apply.js +86 -0
- package/build/lib/mask/apply.js.map +1 -0
- package/build/lib/mask/mask.d.ts +124 -0
- package/build/lib/mask/mask.d.ts.map +1 -0
- package/build/lib/mask/mask.js +137 -0
- package/build/lib/mask/mask.js.map +1 -0
- package/build/lib/mask/mask.test-d.d.ts +2 -0
- package/build/lib/mask/mask.test-d.d.ts.map +1 -0
- package/build/lib/mask/mask.test-d.js +102 -0
- package/build/lib/mask/mask.test-d.js.map +1 -0
- package/build/lib/mutation-type.d.ts +18 -0
- package/build/lib/mutation-type.d.ts.map +1 -0
- package/build/lib/mutation-type.js +16 -0
- package/build/lib/mutation-type.js.map +1 -0
- package/build/lib/task/$$.d.ts +3 -0
- package/build/lib/task/$$.d.ts.map +1 -0
- package/build/lib/task/$$.js +3 -0
- package/build/lib/task/$$.js.map +1 -0
- package/build/lib/task/$.d.ts +2 -0
- package/build/lib/task/$.d.ts.map +1 -0
- package/build/lib/task/$.js +2 -0
- package/build/lib/task/$.js.map +1 -0
- package/build/lib/task/report.d.ts +28 -0
- package/build/lib/task/report.d.ts.map +1 -0
- package/build/lib/task/report.js +33 -0
- package/build/lib/task/report.js.map +1 -0
- package/build/lib/task/task.d.ts +44 -0
- package/build/lib/task/task.d.ts.map +1 -0
- package/build/lib/task/task.js +63 -0
- package/build/lib/task/task.js.map +1 -0
- package/build/lib/version-history/index.d.ts +3 -0
- package/build/lib/version-history/index.d.ts.map +1 -0
- package/build/lib/version-history/index.js +2 -0
- package/build/lib/version-history/index.js.map +1 -0
- package/build/lib/version-history/types.d.ts +64 -0
- package/build/lib/version-history/types.d.ts.map +1 -0
- package/build/lib/version-history/types.js +5 -0
- package/build/lib/version-history/types.js.map +1 -0
- package/build/lib/version-history/version-history.d.ts +85 -0
- package/build/lib/version-history/version-history.d.ts.map +1 -0
- package/build/lib/version-history/version-history.js +248 -0
- package/build/lib/version-history/version-history.js.map +1 -0
- package/build/project-data.d.ts +0 -1
- package/build/project-data.d.ts.map +1 -1
- package/build/sandbox.d.ts +2 -0
- package/build/sandbox.d.ts.map +1 -0
- package/build/sandbox.js +18 -0
- package/build/sandbox.js.map +1 -0
- 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/CodeBlockEnhancer.d.ts +2 -0
- package/build/template/components/CodeBlockEnhancer.d.ts.map +1 -0
- package/build/template/components/CodeBlockEnhancer.jsx +175 -0
- package/build/template/components/CodeBlockEnhancer.jsx.map +1 -0
- package/build/template/components/HamburgerMenu.d.ts +9 -0
- package/build/template/components/HamburgerMenu.d.ts.map +1 -0
- package/build/template/components/HamburgerMenu.jsx +53 -0
- package/build/template/components/HamburgerMenu.jsx.map +1 -0
- package/build/template/components/Link.jsx +1 -1
- package/build/template/components/Logo.d.ts +9 -0
- package/build/template/components/Logo.d.ts.map +1 -0
- package/build/template/components/Logo.jsx +29 -0
- package/build/template/components/Logo.jsx.map +1 -0
- package/build/template/components/NotFound.d.ts +2 -0
- package/build/template/components/NotFound.d.ts.map +1 -0
- package/build/template/components/NotFound.jsx +26 -0
- package/build/template/components/NotFound.jsx.map +1 -0
- package/build/template/components/ThemeToggle.d.ts +3 -0
- package/build/template/components/ThemeToggle.d.ts.map +1 -0
- package/build/template/components/ThemeToggle.jsx +10 -0
- package/build/template/components/ThemeToggle.jsx.map +1 -0
- 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 +3 -3
- package/build/template/components/sidebar/SidebarItem.jsx.map +1 -1
- package/build/template/contexts/ThemeContext.d.ts +12 -0
- package/build/template/contexts/ThemeContext.d.ts.map +1 -0
- package/build/template/contexts/ThemeContext.jsx +41 -0
- package/build/template/contexts/ThemeContext.jsx.map +1 -0
- package/build/template/routes/reference.d.ts.map +1 -1
- package/build/template/routes/reference.jsx +4 -8
- package/build/template/routes/reference.jsx.map +1 -1
- package/build/template/routes/root.d.ts.map +1 -1
- package/build/template/routes/root.jsx +192 -55
- package/build/template/routes/root.jsx.map +1 -1
- package/build/template/server/app.d.ts.map +1 -1
- package/build/template/server/app.js +2 -21
- package/build/template/server/app.js.map +1 -1
- package/package.json +27 -13
- package/src/api/api.ts +1 -0
- package/src/api/config/configurator.ts +28 -6
- package/src/api/config/load.ts +5 -5
- package/src/api/config-resolver/resolve.ts +2 -2
- package/src/api/content/$$.ts +6 -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/navbar.test.ts +55 -0
- package/src/api/content/navbar.ts +61 -0
- package/src/api/content/page.ts +12 -0
- package/src/api/content/scan.ts +117 -0
- package/src/api/content/sidebar.test.ts +297 -0
- package/src/api/content/sidebar.ts +283 -0
- package/src/api/content/utils.ts +7 -0
- package/src/api/schema/data-sources/schema-directory/schema-directory.ts +1 -1
- package/src/api/singletons/markdown/markdown.test.ts +1 -1
- package/src/api/static/index.ts +1 -0
- package/src/api/static/manifest.test.ts +106 -0
- package/src/api/static/manifest.ts +16 -0
- package/src/api/static/rebase.test.ts +229 -0
- package/src/api/static/rebase.ts +140 -0
- package/src/api/static/static.ts +2 -0
- package/src/api/utils/asset-url/asset-url.test.ts +4 -4
- package/src/api/vite/plugins/branding/index.ts +108 -0
- package/src/api/vite/plugins/build.ts +25 -1
- package/src/api/vite/plugins/core.ts +6 -7
- package/src/api/vite/plugins/main.ts +2 -0
- package/src/api/vite/plugins/pages.ts +131 -207
- package/src/api/vite/plugins/serve.ts +5 -5
- package/src/cli/_/self-contained-mode.ts +5 -5
- package/src/cli/commands/static/$default.ts +43 -0
- package/src/cli/commands/static/rebase.ts +37 -0
- package/src/cli/commands/static.ts +6 -0
- package/src/exports/components.ts +1 -0
- package/src/lib/demos/builder.ts +298 -0
- package/src/lib/demos/config-schema.ts +56 -0
- package/src/lib/demos/config.test.ts +193 -0
- package/src/lib/demos/config.ts +205 -0
- package/src/lib/demos/index.ts +9 -0
- package/src/lib/demos/ui/components.ts +739 -0
- package/src/lib/demos/ui/data-collector.ts +246 -0
- package/src/lib/demos/ui/landing-page-cli.ts +23 -0
- package/src/lib/demos/ui/landing-page.ts +126 -0
- package/src/lib/demos/ui/page-renderer.ts +124 -0
- package/src/lib/demos/utils.ts +43 -0
- package/src/lib/deployment/$$.ts +2 -0
- package/src/lib/deployment/$.test.ts +53 -0
- package/src/lib/deployment/$.ts +1 -0
- package/src/lib/deployment/metadata.ts +40 -0
- package/src/lib/deployment/path-manager.ts +186 -0
- 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 +26 -14
- package/src/lib/github-actions/git-controller.ts +151 -0
- package/src/lib/github-actions/github-actions.ts +6 -0
- package/src/lib/github-actions/index.ts +1 -0
- package/src/lib/github-actions/lib/get-pr-deployments.ts +76 -0
- package/src/lib/github-actions/pr-controller.test.ts +172 -0
- package/src/lib/github-actions/pr-controller.ts +183 -0
- package/src/lib/github-actions/run-step-cli.ts +84 -0
- package/src/lib/github-actions/runner.test.ts +192 -0
- package/src/lib/github-actions/runner.ts +226 -0
- package/src/lib/github-actions/schemas/context.ts +424 -0
- package/src/lib/github-actions/schemas/index.ts +5 -0
- package/src/lib/github-actions/search-module.test.ts +110 -0
- package/src/lib/github-actions/search-module.ts +76 -0
- package/src/lib/github-actions/step.test.ts +149 -0
- package/src/lib/github-actions/step.ts +232 -0
- package/src/lib/helpers.ts +4 -3
- package/src/lib/kit-temp.test-d.ts +115 -0
- package/src/lib/kit-temp.test.ts +127 -0
- package/src/lib/kit-temp.ts +128 -14
- package/src/lib/mask/$$.ts +2 -0
- package/src/lib/mask/$.test.ts +248 -0
- package/src/lib/mask/$.ts +1 -0
- package/src/lib/mask/apply.ts +134 -0
- package/src/lib/mask/mask.test-d.ts +144 -0
- package/src/lib/mask/mask.ts +244 -0
- package/src/lib/mutation-type.ts +20 -0
- package/src/lib/shiki/shiki.test.ts +1 -1
- package/src/lib/task/$$.ts +2 -0
- package/src/lib/task/$.test.ts +209 -0
- package/src/lib/task/$.ts +1 -0
- package/src/lib/task/report.ts +72 -0
- package/src/lib/task/task.ts +112 -0
- package/src/lib/version-history/index.test.ts +196 -0
- package/src/lib/version-history/index.ts +4 -0
- package/src/lib/version-history/types.ts +68 -0
- package/src/lib/version-history/version-history.ts +293 -0
- package/src/project-data.ts +0 -1
- package/src/sandbox.ts +20 -0
- package/src/singletons/debug.ts +1 -1
- package/src/template/components/CodeBlockEnhancer.tsx +192 -0
- package/src/template/components/HamburgerMenu.tsx +96 -0
- package/src/template/components/Link.tsx +1 -1
- package/src/template/components/Logo.tsx +46 -0
- package/src/template/components/NotFound.tsx +28 -0
- package/src/template/components/ThemeToggle.tsx +21 -0
- package/src/template/components/content/$$.ts +1 -0
- package/src/template/components/sidebar/Sidebar.tsx +2 -2
- package/src/template/components/sidebar/SidebarItem.tsx +12 -12
- package/src/template/contexts/ThemeContext.tsx +60 -0
- package/src/template/routes/reference.tsx +4 -8
- package/src/template/routes/root.tsx +216 -76
- package/src/template/server/app.ts +2 -27
- 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 +0 -17
- 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
@@ -0,0 +1,106 @@
|
|
1
|
+
import { Err, Fs, Path } from '@wollybeard/kit'
|
2
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest'
|
3
|
+
import { buildManifest, type PolenBuildManifest } from './manifest.ts'
|
4
|
+
|
5
|
+
describe('validate-build', () => {
|
6
|
+
let testDir: string
|
7
|
+
let manifestPath: string
|
8
|
+
|
9
|
+
beforeEach(async () => {
|
10
|
+
testDir = await Fs.makeTemporaryDirectory()
|
11
|
+
manifestPath = Path.join(testDir, '.polen', 'build.json')
|
12
|
+
})
|
13
|
+
|
14
|
+
afterEach(async () => {
|
15
|
+
if (testDir && await Fs.exists(testDir)) {
|
16
|
+
await Fs.remove(testDir)
|
17
|
+
}
|
18
|
+
})
|
19
|
+
|
20
|
+
describe('readBuildManifest', () => {
|
21
|
+
test('reads valid manifest', async () => {
|
22
|
+
const manifest: PolenBuildManifest = {
|
23
|
+
type: 'ssr',
|
24
|
+
version: '2.1.0',
|
25
|
+
basePath: '/docs/',
|
26
|
+
}
|
27
|
+
await Fs.write({
|
28
|
+
path: manifestPath,
|
29
|
+
content: JSON.stringify(manifest, null, 2),
|
30
|
+
})
|
31
|
+
|
32
|
+
const result = await buildManifest.read(testDir)
|
33
|
+
expect(Err.is(result)).toBe(false)
|
34
|
+
expect(result).toEqual(manifest)
|
35
|
+
})
|
36
|
+
|
37
|
+
test('returns error when manifest does not exist', async () => {
|
38
|
+
// Verify the file doesn't exist
|
39
|
+
const manifestExists = await Fs.exists(manifestPath)
|
40
|
+
expect(manifestExists).toBe(false)
|
41
|
+
|
42
|
+
const result = await buildManifest.read(testDir)
|
43
|
+
expect(Err.is(result)).toBe(true)
|
44
|
+
})
|
45
|
+
|
46
|
+
test('returns error for invalid manifest structure', async () => {
|
47
|
+
await Fs.write({
|
48
|
+
path: manifestPath,
|
49
|
+
content: JSON.stringify({ invalid: 'data' }, null, 2),
|
50
|
+
})
|
51
|
+
const result = await buildManifest.read(testDir)
|
52
|
+
expect(Err.is(result)).toBe(true)
|
53
|
+
})
|
54
|
+
|
55
|
+
test('returns error for invalid build type', async () => {
|
56
|
+
await Fs.write({
|
57
|
+
path: manifestPath,
|
58
|
+
content: JSON.stringify(
|
59
|
+
{
|
60
|
+
type: 'invalid',
|
61
|
+
version: '1.0.0',
|
62
|
+
basePath: '/',
|
63
|
+
},
|
64
|
+
null,
|
65
|
+
2,
|
66
|
+
),
|
67
|
+
})
|
68
|
+
const result = await buildManifest.read(testDir)
|
69
|
+
expect(Err.is(result)).toBe(true)
|
70
|
+
})
|
71
|
+
|
72
|
+
test('returns error when version is not a string', async () => {
|
73
|
+
await Fs.write({
|
74
|
+
path: manifestPath,
|
75
|
+
content: JSON.stringify(
|
76
|
+
{
|
77
|
+
type: 'ssg',
|
78
|
+
version: 123,
|
79
|
+
basePath: '/',
|
80
|
+
},
|
81
|
+
null,
|
82
|
+
2,
|
83
|
+
),
|
84
|
+
})
|
85
|
+
const result = await buildManifest.read(testDir)
|
86
|
+
expect(Err.is(result)).toBe(true)
|
87
|
+
})
|
88
|
+
|
89
|
+
test('returns error when basePath is not a string', async () => {
|
90
|
+
await Fs.write({
|
91
|
+
path: manifestPath,
|
92
|
+
content: JSON.stringify(
|
93
|
+
{
|
94
|
+
type: 'ssg',
|
95
|
+
version: '1.0.0',
|
96
|
+
basePath: null,
|
97
|
+
},
|
98
|
+
null,
|
99
|
+
2,
|
100
|
+
),
|
101
|
+
})
|
102
|
+
const result = await buildManifest.read(testDir)
|
103
|
+
expect(Err.is(result)).toBe(true)
|
104
|
+
})
|
105
|
+
})
|
106
|
+
})
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { Codec, Resource } from '@wollybeard/kit'
|
2
|
+
import { z } from 'zod/v4'
|
3
|
+
|
4
|
+
export const PolenBuildManifestSchema = z.object({
|
5
|
+
type: z.enum(['ssg', 'ssr']),
|
6
|
+
version: z.string(),
|
7
|
+
basePath: z.string(),
|
8
|
+
}).loose()
|
9
|
+
|
10
|
+
export type PolenBuildManifest = z.infer<typeof PolenBuildManifestSchema>
|
11
|
+
|
12
|
+
export const buildManifest = Resource.create({
|
13
|
+
name: 'polen-build-manifest',
|
14
|
+
path: '.polen/build.json',
|
15
|
+
codec: Codec.fromZod(PolenBuildManifestSchema),
|
16
|
+
})
|
@@ -0,0 +1,229 @@
|
|
1
|
+
import { Fs, Path } from '@wollybeard/kit'
|
2
|
+
import { afterEach, beforeEach, describe, expect, test } from 'vitest'
|
3
|
+
import { rebase, type RebasePlan } from './rebase.ts'
|
4
|
+
|
5
|
+
const testDir = 'temp/rebase-test'
|
6
|
+
|
7
|
+
const createTestBuild = async (dir: string, basePath: string = '/') => {
|
8
|
+
await Fs.makeDirectory(dir)
|
9
|
+
|
10
|
+
// Create Polen build manifest
|
11
|
+
const polenDir = Path.join(dir, '.polen')
|
12
|
+
await Fs.makeDirectory(polenDir)
|
13
|
+
|
14
|
+
const manifest = {
|
15
|
+
type: 'ssg' as const,
|
16
|
+
version: '1.0.0',
|
17
|
+
basePath,
|
18
|
+
}
|
19
|
+
|
20
|
+
await Fs.write({
|
21
|
+
path: Path.join(polenDir, 'build.json'),
|
22
|
+
content: JSON.stringify(manifest, null, 2),
|
23
|
+
})
|
24
|
+
|
25
|
+
// Create some HTML files
|
26
|
+
await Fs.write({
|
27
|
+
path: Path.join(dir, 'index.html'),
|
28
|
+
content: `<!DOCTYPE html>
|
29
|
+
<html>
|
30
|
+
<head>
|
31
|
+
<base href="${basePath}">
|
32
|
+
<title>Test</title>
|
33
|
+
</head>
|
34
|
+
<body>
|
35
|
+
<h1>Test Page</h1>
|
36
|
+
</body>
|
37
|
+
</html>`,
|
38
|
+
})
|
39
|
+
|
40
|
+
// Create nested HTML file
|
41
|
+
const nestedDir = Path.join(dir, 'docs')
|
42
|
+
await Fs.makeDirectory(nestedDir)
|
43
|
+
|
44
|
+
await Fs.write({
|
45
|
+
path: Path.join(nestedDir, 'page.html'),
|
46
|
+
content: `<!DOCTYPE html>
|
47
|
+
<html>
|
48
|
+
<head>
|
49
|
+
<title>Nested</title>
|
50
|
+
</head>
|
51
|
+
<body>
|
52
|
+
<h1>Nested Page</h1>
|
53
|
+
</body>
|
54
|
+
</html>`,
|
55
|
+
})
|
56
|
+
}
|
57
|
+
|
58
|
+
describe('rebase', () => {
|
59
|
+
beforeEach(async () => {
|
60
|
+
await Fs.remove(testDir)
|
61
|
+
})
|
62
|
+
|
63
|
+
afterEach(async () => {
|
64
|
+
await Fs.remove(testDir)
|
65
|
+
})
|
66
|
+
|
67
|
+
test('mutate mode updates base paths in place', async () => {
|
68
|
+
const buildDir = Path.join(testDir, 'build')
|
69
|
+
await createTestBuild(buildDir, '/old/')
|
70
|
+
|
71
|
+
const plan: RebasePlan = {
|
72
|
+
sourcePath: buildDir,
|
73
|
+
newBasePath: '/new/',
|
74
|
+
changeMode: 'mutate',
|
75
|
+
}
|
76
|
+
|
77
|
+
await rebase(plan)
|
78
|
+
|
79
|
+
// Check updated manifest
|
80
|
+
const manifest = await Fs.readJson(Path.join(buildDir, '.polen', 'build.json'))
|
81
|
+
expect(manifest).toMatchObject({
|
82
|
+
type: 'ssg',
|
83
|
+
version: '1.0.0',
|
84
|
+
basePath: '/new/',
|
85
|
+
})
|
86
|
+
|
87
|
+
// Check updated HTML file
|
88
|
+
const indexContent = await Fs.read(Path.join(buildDir, 'index.html'))
|
89
|
+
expect(indexContent).toContain('<base href="/new/">')
|
90
|
+
|
91
|
+
// Check nested HTML file (should have base tag inserted)
|
92
|
+
const nestedContent = await Fs.read(Path.join(buildDir, 'docs', 'page.html'))
|
93
|
+
expect(nestedContent).toContain('<base href="/new/">')
|
94
|
+
})
|
95
|
+
|
96
|
+
test('copy mode creates new build with updated base paths', async () => {
|
97
|
+
const buildDir = Path.join(testDir, 'build')
|
98
|
+
const copyDir = Path.join(testDir, 'copy')
|
99
|
+
|
100
|
+
await createTestBuild(buildDir, '/old/')
|
101
|
+
|
102
|
+
const plan: RebasePlan = {
|
103
|
+
sourcePath: buildDir,
|
104
|
+
targetPath: copyDir,
|
105
|
+
newBasePath: '/new/',
|
106
|
+
changeMode: 'copy',
|
107
|
+
}
|
108
|
+
|
109
|
+
await rebase(plan)
|
110
|
+
|
111
|
+
// Original should be unchanged
|
112
|
+
const originalManifest = await Fs.readJson(Path.join(buildDir, '.polen', 'build.json'))
|
113
|
+
expect(originalManifest).toMatchObject({
|
114
|
+
basePath: '/old/',
|
115
|
+
})
|
116
|
+
|
117
|
+
// Copy should be updated
|
118
|
+
const copyManifest = await Fs.readJson(Path.join(copyDir, '.polen', 'build.json'))
|
119
|
+
expect(copyManifest).toMatchObject({
|
120
|
+
basePath: '/new/',
|
121
|
+
})
|
122
|
+
|
123
|
+
const copyIndexContent = await Fs.read(Path.join(copyDir, 'index.html'))
|
124
|
+
expect(copyIndexContent).toContain('<base href="/new/">')
|
125
|
+
})
|
126
|
+
|
127
|
+
test('throws error for invalid base path', async () => {
|
128
|
+
const buildDir = Path.join(testDir, 'build')
|
129
|
+
await createTestBuild(buildDir)
|
130
|
+
|
131
|
+
const plan: RebasePlan = {
|
132
|
+
sourcePath: buildDir,
|
133
|
+
newBasePath: 'invalid-path',
|
134
|
+
changeMode: 'mutate',
|
135
|
+
}
|
136
|
+
|
137
|
+
await expect(rebase(plan)).rejects.toThrow('Invalid base path: invalid-path')
|
138
|
+
})
|
139
|
+
|
140
|
+
test('throws error when source is not a Polen build', async () => {
|
141
|
+
const buildDir = Path.join(testDir, 'not-polen')
|
142
|
+
await Fs.makeDirectory(buildDir)
|
143
|
+
|
144
|
+
const plan: RebasePlan = {
|
145
|
+
sourcePath: buildDir,
|
146
|
+
newBasePath: '/new/',
|
147
|
+
changeMode: 'mutate',
|
148
|
+
}
|
149
|
+
|
150
|
+
await expect(rebase(plan)).rejects.toThrow('Polen build manifest not found')
|
151
|
+
})
|
152
|
+
|
153
|
+
test('throws error when copy target exists and is not empty', async () => {
|
154
|
+
const buildDir = Path.join(testDir, 'build')
|
155
|
+
const copyDir = Path.join(testDir, 'copy')
|
156
|
+
|
157
|
+
await createTestBuild(buildDir)
|
158
|
+
|
159
|
+
// Create non-empty target
|
160
|
+
await Fs.makeDirectory(copyDir)
|
161
|
+
await Fs.write({
|
162
|
+
path: Path.join(copyDir, 'existing.txt'),
|
163
|
+
content: 'existing file',
|
164
|
+
})
|
165
|
+
|
166
|
+
const plan: RebasePlan = {
|
167
|
+
sourcePath: buildDir,
|
168
|
+
targetPath: copyDir,
|
169
|
+
newBasePath: '/new/',
|
170
|
+
changeMode: 'copy',
|
171
|
+
}
|
172
|
+
|
173
|
+
await expect(rebase(plan)).rejects.toThrow('Target path already exists and is not empty')
|
174
|
+
})
|
175
|
+
|
176
|
+
test('handles HTML file without existing base tag', async () => {
|
177
|
+
const buildDir = Path.join(testDir, 'build')
|
178
|
+
await createTestBuild(buildDir)
|
179
|
+
|
180
|
+
// Create HTML without base tag
|
181
|
+
await Fs.write({
|
182
|
+
path: Path.join(buildDir, 'no-base.html'),
|
183
|
+
content: `<!DOCTYPE html>
|
184
|
+
<html>
|
185
|
+
<head>
|
186
|
+
<title>No Base</title>
|
187
|
+
</head>
|
188
|
+
<body>
|
189
|
+
<h1>No Base Tag</h1>
|
190
|
+
</body>
|
191
|
+
</html>`,
|
192
|
+
})
|
193
|
+
|
194
|
+
const plan: RebasePlan = {
|
195
|
+
sourcePath: buildDir,
|
196
|
+
newBasePath: '/new/',
|
197
|
+
changeMode: 'mutate',
|
198
|
+
}
|
199
|
+
|
200
|
+
await rebase(plan)
|
201
|
+
|
202
|
+
const content = await Fs.read(Path.join(buildDir, 'no-base.html'))
|
203
|
+
expect(content).toContain('<base href="/new/">')
|
204
|
+
})
|
205
|
+
|
206
|
+
test('throws error for HTML file without head tag', async () => {
|
207
|
+
const buildDir = Path.join(testDir, 'build')
|
208
|
+
await createTestBuild(buildDir)
|
209
|
+
|
210
|
+
// Create invalid HTML without head
|
211
|
+
await Fs.write({
|
212
|
+
path: Path.join(buildDir, 'invalid.html'),
|
213
|
+
content: `<!DOCTYPE html>
|
214
|
+
<html>
|
215
|
+
<body>
|
216
|
+
<h1>Invalid HTML</h1>
|
217
|
+
</body>
|
218
|
+
</html>`,
|
219
|
+
})
|
220
|
+
|
221
|
+
const plan: RebasePlan = {
|
222
|
+
sourcePath: buildDir,
|
223
|
+
newBasePath: '/new/',
|
224
|
+
changeMode: 'mutate',
|
225
|
+
}
|
226
|
+
|
227
|
+
await expect(rebase(plan)).rejects.toThrow('Could not find <head> tag in HTML file')
|
228
|
+
})
|
229
|
+
})
|
@@ -0,0 +1,140 @@
|
|
1
|
+
import { TinyGlobby } from '#dep/tiny-globby/index'
|
2
|
+
import { Fs, Path } from '@wollybeard/kit'
|
3
|
+
import { Err } from '@wollybeard/kit'
|
4
|
+
import { buildManifest, type PolenBuildManifest } from './manifest.ts'
|
5
|
+
|
6
|
+
export type RebasePlan = RebaseOverwritePlan | RebaseCopyPlan
|
7
|
+
|
8
|
+
export interface RebaseOverwritePlan {
|
9
|
+
changeMode: 'mutate'
|
10
|
+
newBasePath: string
|
11
|
+
sourcePath: string
|
12
|
+
}
|
13
|
+
|
14
|
+
export interface RebaseCopyPlan {
|
15
|
+
changeMode: 'copy'
|
16
|
+
newBasePath: string
|
17
|
+
sourcePath: string
|
18
|
+
targetPath: string
|
19
|
+
}
|
20
|
+
|
21
|
+
export const rebase = async (plan: RebasePlan): Promise<void> => {
|
22
|
+
// 1. Validate source is a Polen build
|
23
|
+
const manifestResult = await buildManifest.read(plan.sourcePath)
|
24
|
+
if (Err.is(manifestResult)) {
|
25
|
+
throw new Error(`Polen build manifest not found at: ${Path.join(plan.sourcePath, '.polen', 'build.json')}`)
|
26
|
+
}
|
27
|
+
const manifest = manifestResult
|
28
|
+
|
29
|
+
// 2. Validate newBasePath is valid URL path
|
30
|
+
if (!isValidUrlPath(plan.newBasePath)) {
|
31
|
+
throw new Error(`Invalid base path: ${plan.newBasePath}`)
|
32
|
+
}
|
33
|
+
|
34
|
+
// 3. Handle copy vs mutate
|
35
|
+
let workingPath: string
|
36
|
+
if (plan.changeMode === 'copy') {
|
37
|
+
if (await Fs.exists(plan.targetPath)) {
|
38
|
+
const isEmpty = await Fs.isEmptyDir(plan.targetPath)
|
39
|
+
if (!isEmpty) {
|
40
|
+
throw new Error(`Target path already exists and is not empty: ${plan.targetPath}`)
|
41
|
+
}
|
42
|
+
}
|
43
|
+
await Fs.copyDir({ from: plan.sourcePath, to: plan.targetPath })
|
44
|
+
workingPath = plan.targetPath
|
45
|
+
} else {
|
46
|
+
workingPath = plan.sourcePath
|
47
|
+
}
|
48
|
+
|
49
|
+
// 4. Update HTML files with new base path
|
50
|
+
await updateHtmlFiles(workingPath, manifest.basePath, plan.newBasePath)
|
51
|
+
|
52
|
+
// 5. Update manifest
|
53
|
+
await updateManifest(workingPath, { basePath: plan.newBasePath })
|
54
|
+
}
|
55
|
+
|
56
|
+
//
|
57
|
+
//
|
58
|
+
//
|
59
|
+
//
|
60
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Local Helpers
|
61
|
+
//
|
62
|
+
//
|
63
|
+
|
64
|
+
// TODO: this is very generic, factor out to kit-temp
|
65
|
+
const isValidUrlPath = (path: string): boolean => {
|
66
|
+
// URL path should start with / and not contain invalid characters
|
67
|
+
if (!path.startsWith('/')) return false
|
68
|
+
if (!path.endsWith('/')) return false
|
69
|
+
|
70
|
+
// Basic validation - no spaces, proper URL characters
|
71
|
+
const urlPathRegex = /^\/[a-zA-Z0-9\-._~:/?#[\]@!$&'()*+,;=%]*\/$/
|
72
|
+
return urlPathRegex.test(path)
|
73
|
+
}
|
74
|
+
|
75
|
+
const updateHtmlFiles = async (buildPath: string, oldBasePath: string, newBasePath: string): Promise<void> => {
|
76
|
+
// Find all HTML files recursively
|
77
|
+
const htmlFiles = await findHtmlFiles(buildPath)
|
78
|
+
|
79
|
+
for (const htmlFile of htmlFiles) {
|
80
|
+
await updateHtmlFile(htmlFile, oldBasePath, newBasePath)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
const findHtmlFiles = async (dir: string): Promise<string[]> => {
|
85
|
+
return await TinyGlobby.glob('**/*.html', {
|
86
|
+
absolute: true,
|
87
|
+
cwd: dir,
|
88
|
+
onlyFiles: true,
|
89
|
+
})
|
90
|
+
}
|
91
|
+
|
92
|
+
const updateHtmlFile = async (filePath: string, oldBasePath: string, newBasePath: string): Promise<void> => {
|
93
|
+
const content = await Fs.read(filePath)
|
94
|
+
|
95
|
+
if (content === null) {
|
96
|
+
throw new Error(`Could not read HTML file: ${filePath}`)
|
97
|
+
}
|
98
|
+
|
99
|
+
// Simple regex-based approach to update base tag
|
100
|
+
// Look for existing base tag first
|
101
|
+
const baseTagRegex = /<base\s+href\s*=\s*["']([^"']*)["'][^>]*>/i
|
102
|
+
|
103
|
+
let updatedContent: string
|
104
|
+
|
105
|
+
if (baseTagRegex.test(content)) {
|
106
|
+
// Update existing base tag
|
107
|
+
updatedContent = content.replace(baseTagRegex, `<base href="${newBasePath}">`)
|
108
|
+
} else {
|
109
|
+
// Insert new base tag in head
|
110
|
+
const headRegex = /<head[^>]*>/i
|
111
|
+
const headMatch = content.match(headRegex)
|
112
|
+
|
113
|
+
if (headMatch) {
|
114
|
+
const insertPosition = headMatch.index! + headMatch[0].length
|
115
|
+
updatedContent = content.slice(0, insertPosition)
|
116
|
+
+ `\n <base href="${newBasePath}">`
|
117
|
+
+ content.slice(insertPosition)
|
118
|
+
} else {
|
119
|
+
throw new Error(`Could not find <head> tag in HTML file: ${filePath}`)
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
await Fs.write({ path: filePath, content: updatedContent })
|
124
|
+
}
|
125
|
+
|
126
|
+
const updateManifest = async (buildPath: string, updates: Partial<PolenBuildManifest>): Promise<void> => {
|
127
|
+
const manifestPath = Path.join(buildPath, '.polen', 'build.json')
|
128
|
+
const manifestResult = await buildManifest.read(buildPath)
|
129
|
+
if (Err.is(manifestResult)) {
|
130
|
+
throw new Error(`Polen build manifest not found at: ${manifestPath}`)
|
131
|
+
}
|
132
|
+
const currentManifest = manifestResult
|
133
|
+
|
134
|
+
const updatedManifest = { ...currentManifest, ...updates }
|
135
|
+
|
136
|
+
await Fs.write({
|
137
|
+
path: manifestPath,
|
138
|
+
content: JSON.stringify(updatedManifest, null, 2),
|
139
|
+
})
|
140
|
+
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { describe, expect, test } from 'vitest'
|
2
|
-
import { assetUrl, faviconUrl, joinPaths, pageUrl } from './asset-url.
|
2
|
+
import { assetUrl, faviconUrl, joinPaths, pageUrl } from './asset-url.ts'
|
3
3
|
|
4
4
|
describe('asset-url helpers', () => {
|
5
5
|
describe('joinPaths', () => {
|
@@ -20,9 +20,9 @@ describe('asset-url helpers', () => {
|
|
20
20
|
|
21
21
|
describe('assetUrl', () => {
|
22
22
|
test('creates asset URLs with base path', () => {
|
23
|
-
expect(assetUrl('assets/app.
|
24
|
-
expect(assetUrl('assets/app.
|
25
|
-
expect(assetUrl('/assets/app.
|
23
|
+
expect(assetUrl('assets/app.ts', '/')).toBe('/assets/app.ts')
|
24
|
+
expect(assetUrl('assets/app.ts', '/my-app/')).toBe('/my-app/assets/app.ts')
|
25
|
+
expect(assetUrl('/assets/app.ts', '/my-app/')).toBe('/my-app/assets/app.ts')
|
26
26
|
})
|
27
27
|
})
|
28
28
|
|
@@ -0,0 +1,108 @@
|
|
1
|
+
import type { Config } from '#api/api'
|
2
|
+
import { polenVirtual } from '#api/vite/vi'
|
3
|
+
import type { Vite } from '#dep/vite/index'
|
4
|
+
import { type ExistenceDiff, getMutationType, MutationType } from '#lib/mutation-type'
|
5
|
+
import { debugPolen } from '#singletons/debug'
|
6
|
+
import { Fs } from '@wollybeard/kit'
|
7
|
+
import type { Plugin } from 'vite'
|
8
|
+
|
9
|
+
const viLogo = polenVirtual(['project', 'assets', 'logo.svg'])
|
10
|
+
|
11
|
+
const generateDefaultLogo = async () => {
|
12
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
|
13
|
+
<circle cx="64" cy="64" r="48" fill="none" stroke="black" stroke-width="8"/>
|
14
|
+
</svg>`
|
15
|
+
}
|
16
|
+
|
17
|
+
export function Branding(config: Config.Config): Plugin {
|
18
|
+
const debug = debugPolen.sub('vite-plugin:branding')
|
19
|
+
debug('initialized')
|
20
|
+
|
21
|
+
return {
|
22
|
+
name: 'polen:branding',
|
23
|
+
enforce: 'pre',
|
24
|
+
|
25
|
+
async buildStart() {
|
26
|
+
this.addWatchFile(config.paths.project.absolute.public.logo)
|
27
|
+
},
|
28
|
+
|
29
|
+
async handleHotUpdate({ file, server }) {
|
30
|
+
return await handleWatchedFileChange({
|
31
|
+
watchedFile: config.paths.project.absolute.public.logo,
|
32
|
+
changedFile: file,
|
33
|
+
moduleId: viLogo.resolved,
|
34
|
+
server,
|
35
|
+
debug: debug,
|
36
|
+
})
|
37
|
+
},
|
38
|
+
|
39
|
+
resolveId(id) {
|
40
|
+
if (id === viLogo.id) {
|
41
|
+
return viLogo.resolved
|
42
|
+
}
|
43
|
+
},
|
44
|
+
|
45
|
+
async load(id) {
|
46
|
+
if (id === viLogo.resolved) {
|
47
|
+
const logoFileContent = await Fs.read(config.paths.project.absolute.public.logo)
|
48
|
+
const content = logoFileContent ? logoFileContent : await generateDefaultLogo()
|
49
|
+
const dataUrl = `data:image/svg+xml;base64,${Buffer.from(content).toString('base64')}`
|
50
|
+
return `export default ${JSON.stringify(dataUrl)}`
|
51
|
+
}
|
52
|
+
},
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
interface HandleWatchedFileChangeParams {
|
57
|
+
watchedFile: string
|
58
|
+
changedFile: string
|
59
|
+
moduleId: string
|
60
|
+
server: Vite.ViteDevServer
|
61
|
+
debug: (msg: string, data?: any) => void
|
62
|
+
}
|
63
|
+
|
64
|
+
const handleWatchedFileChange = async (
|
65
|
+
params: HandleWatchedFileChangeParams,
|
66
|
+
): Promise<Array<Vite.ModuleNode> | void> => {
|
67
|
+
const { watchedFile, changedFile, moduleId, server, debug } = params
|
68
|
+
|
69
|
+
// Check if change is for watched file
|
70
|
+
if (changedFile !== watchedFile) return
|
71
|
+
|
72
|
+
// Check current existence
|
73
|
+
const existsNow = await Fs.exists(watchedFile)
|
74
|
+
|
75
|
+
// Check previous existence via module graph
|
76
|
+
const module = server.moduleGraph.getModuleById(moduleId)
|
77
|
+
const existedBefore = !!module
|
78
|
+
|
79
|
+
// Early return if no mutation
|
80
|
+
if (!existedBefore && !existsNow) {
|
81
|
+
debug(`no mutation detected - file didn't exist before or after`, { file: changedFile })
|
82
|
+
return
|
83
|
+
}
|
84
|
+
|
85
|
+
const mutationType = getMutationType({
|
86
|
+
before: existedBefore,
|
87
|
+
after: existsNow,
|
88
|
+
} as ExistenceDiff)
|
89
|
+
|
90
|
+
debug(`file ${mutationType}`, { file: changedFile })
|
91
|
+
|
92
|
+
switch (mutationType) {
|
93
|
+
case MutationType.Create:
|
94
|
+
// Full reload needed - module never existed
|
95
|
+
server.ws.send({
|
96
|
+
type: 'full-reload',
|
97
|
+
path: '*',
|
98
|
+
})
|
99
|
+
break
|
100
|
+
|
101
|
+
case MutationType.Update:
|
102
|
+
case MutationType.Delete:
|
103
|
+
// Invalidate module for HMR
|
104
|
+
server.moduleGraph.invalidateModule(module!)
|
105
|
+
// Return empty array to prevent default HMR
|
106
|
+
return []
|
107
|
+
}
|
108
|
+
}
|
@@ -1,7 +1,9 @@
|
|
1
1
|
import type { Config } from '#api/config/index'
|
2
|
+
import type { PolenBuildManifest } from '#api/static/manifest'
|
2
3
|
import { Vite } from '#dep/vite/index'
|
3
4
|
import { ViteVirtual } from '#lib/vite-virtual/index'
|
4
5
|
import { Fs, Path } from '@wollybeard/kit'
|
6
|
+
import packageJson from '../../../../package.json' with { type: 'json' }
|
5
7
|
import { isKitUnusedExternalImport, isRadixModuleLevelDirective } from '../log-filters.ts'
|
6
8
|
import { polenVirtual } from '../vi.ts'
|
7
9
|
|
@@ -10,7 +12,7 @@ export const Build = (config: Config.Config): Vite.Plugin[] => {
|
|
10
12
|
|
11
13
|
// const outDir = Path.join(config.paths.project.rootDir, `dist`)
|
12
14
|
|
13
|
-
return [Manifest(config), {
|
15
|
+
return [Manifest(config), BuildManifest(config), {
|
14
16
|
name: `polen:build-client`,
|
15
17
|
apply: `build`,
|
16
18
|
applyToEnvironment: Vite.isEnvironmentClient,
|
@@ -144,3 +146,25 @@ const Manifest = (config: Config.Config): Vite.Plugin => {
|
|
144
146
|
),
|
145
147
|
}
|
146
148
|
}
|
149
|
+
|
150
|
+
const BuildManifest = (config: Config.Config): Vite.Plugin => {
|
151
|
+
return {
|
152
|
+
name: 'polen:build-manifest',
|
153
|
+
apply: 'build',
|
154
|
+
applyToEnvironment: Vite.isEnvironmentClient,
|
155
|
+
async generateBundle() {
|
156
|
+
const manifest: PolenBuildManifest = {
|
157
|
+
type: config.build.architecture === 'ssr' ? 'ssr' : 'ssg',
|
158
|
+
version: packageJson.version,
|
159
|
+
basePath: config.build.base || '/',
|
160
|
+
}
|
161
|
+
|
162
|
+
// Emit the manifest as an asset
|
163
|
+
this.emitFile({
|
164
|
+
type: 'asset',
|
165
|
+
fileName: '.polen/build.json',
|
166
|
+
source: JSON.stringify(manifest, null, 2),
|
167
|
+
})
|
168
|
+
},
|
169
|
+
}
|
170
|
+
}
|