polen 0.9.1-next.2 → 0.10.0-next.10
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/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 +1 -1
- 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/root.d.ts.map +1 -1
- package/build/template/routes/root.jsx +66 -53
- 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/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 +8 -8
- package/src/template/contexts/ThemeContext.tsx +60 -0
- package/src/template/routes/root.tsx +85 -74
- 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,183 @@
|
|
1
|
+
import type { Context } from '@actions/github/lib/context.ts'
|
2
|
+
import type { GitHub } from '@actions/github/lib/utils.ts'
|
3
|
+
import { type Deployment, fetchPullRequestDeployments } from './lib/get-pr-deployments.ts'
|
4
|
+
|
5
|
+
const createCommentMarker = (id: string) => `<!-- comment-id: ${id} -->`
|
6
|
+
|
7
|
+
export interface CommentOptions {
|
8
|
+
/**
|
9
|
+
* Unique identifier for the comment. Used to find and update existing comments.
|
10
|
+
* If not provided, uses the current step name as the ID.
|
11
|
+
*/
|
12
|
+
id?: string
|
13
|
+
/**
|
14
|
+
* Markdown content of the comment
|
15
|
+
*/
|
16
|
+
content: string
|
17
|
+
/**
|
18
|
+
* Whether this comment is optional. If true, errors are logged but not thrown
|
19
|
+
* when not in a PR context. Defaults to false.
|
20
|
+
*/
|
21
|
+
optional?: boolean
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* Create a PR controller. Returns a no-op controller when not in PR context.
|
26
|
+
*/
|
27
|
+
export function createPullRequestController(
|
28
|
+
github: InstanceType<typeof GitHub>,
|
29
|
+
context: Context,
|
30
|
+
defaultCommentId?: string,
|
31
|
+
): PullRequestController {
|
32
|
+
// Check if this is a PR-related event
|
33
|
+
let prNumber: number | null = null
|
34
|
+
|
35
|
+
if (context.payload.pull_request?.number) {
|
36
|
+
// Direct PR events
|
37
|
+
prNumber = context.payload.pull_request.number
|
38
|
+
} else if (context.eventName === 'issue_comment' && context.payload.issue?.['pull_request']) {
|
39
|
+
// Issue comment on a PR (not on a regular issue)
|
40
|
+
prNumber = context.payload.issue.number
|
41
|
+
}
|
42
|
+
|
43
|
+
return new PullRequestController(github, context, prNumber, defaultCommentId)
|
44
|
+
}
|
45
|
+
|
46
|
+
// /**
|
47
|
+
// * Check if the current event is PR-related
|
48
|
+
// */
|
49
|
+
// function isPREvent(context: Context): boolean {
|
50
|
+
// const prEvents = [
|
51
|
+
// 'pull_request',
|
52
|
+
// 'pull_request_review',
|
53
|
+
// 'pull_request_review_comment',
|
54
|
+
// 'pull_request_target',
|
55
|
+
// 'issue_comment', // Can be on PRs too
|
56
|
+
// ]
|
57
|
+
|
58
|
+
// return prEvents.includes(context.eventName)
|
59
|
+
// || (context.eventName === 'issue_comment' && context.payload.issue?.['pull_request'])
|
60
|
+
// }
|
61
|
+
|
62
|
+
/**
|
63
|
+
* PR Controller for GitHub Actions
|
64
|
+
* Provides easy-to-use methods for interacting with pull requests
|
65
|
+
*/
|
66
|
+
export class PullRequestController {
|
67
|
+
public readonly isActive: boolean
|
68
|
+
public readonly number: number
|
69
|
+
|
70
|
+
constructor(
|
71
|
+
private github: InstanceType<typeof GitHub>,
|
72
|
+
private context: Context,
|
73
|
+
prNumber: number | null,
|
74
|
+
private defaultCommentId?: string,
|
75
|
+
) {
|
76
|
+
this.isActive = prNumber !== null
|
77
|
+
this.number = prNumber || 0
|
78
|
+
}
|
79
|
+
|
80
|
+
async comment(options: CommentOptions): Promise<void> {
|
81
|
+
if (!this.isActive) {
|
82
|
+
if (options.optional) {
|
83
|
+
console.log('[skip] Not in a PR context, cannot create comment')
|
84
|
+
return
|
85
|
+
}
|
86
|
+
throw new Error('Not in a PR context, cannot create comment')
|
87
|
+
}
|
88
|
+
|
89
|
+
const { owner, repo } = this.context.repo
|
90
|
+
|
91
|
+
// Use provided ID or fall back to default
|
92
|
+
const commentId = options.id || this.defaultCommentId || 'default'
|
93
|
+
|
94
|
+
// Search for existing comment with the ID in the body
|
95
|
+
const commentMarker = createCommentMarker(commentId)
|
96
|
+
const body = `${options.content}\n\n${commentMarker}`
|
97
|
+
|
98
|
+
// Find existing comment
|
99
|
+
const { data: comments } = await this.github.rest.issues.listComments({
|
100
|
+
owner,
|
101
|
+
repo,
|
102
|
+
issue_number: this.number,
|
103
|
+
per_page: 100,
|
104
|
+
})
|
105
|
+
|
106
|
+
const existingComment = comments.find(comment => comment.body?.includes(commentMarker))
|
107
|
+
|
108
|
+
if (existingComment) {
|
109
|
+
// Update existing comment
|
110
|
+
await this.github.rest.issues.updateComment({
|
111
|
+
owner,
|
112
|
+
repo,
|
113
|
+
comment_id: existingComment.id,
|
114
|
+
body,
|
115
|
+
})
|
116
|
+
} else {
|
117
|
+
// Create new comment
|
118
|
+
await this.github.rest.issues.createComment({
|
119
|
+
owner,
|
120
|
+
repo,
|
121
|
+
issue_number: this.number,
|
122
|
+
body,
|
123
|
+
})
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
async fetchDeployments(): Promise<Deployment[]> {
|
128
|
+
if (!this.isActive) {
|
129
|
+
console.log('[skip] Not in a PR context, cannot fetch deployments')
|
130
|
+
return []
|
131
|
+
}
|
132
|
+
return await fetchPullRequestDeployments(
|
133
|
+
this.github,
|
134
|
+
this.context.repo.owner,
|
135
|
+
this.context.repo.repo,
|
136
|
+
this.number,
|
137
|
+
)
|
138
|
+
}
|
139
|
+
|
140
|
+
async deleteComment(id: string): Promise<void> {
|
141
|
+
if (!this.isActive) {
|
142
|
+
console.log('[skip] Not in a PR context, cannot delete comment')
|
143
|
+
return
|
144
|
+
}
|
145
|
+
const { owner, repo } = this.context.repo
|
146
|
+
const commentMarker = createCommentMarker(id)
|
147
|
+
|
148
|
+
// Find existing comment
|
149
|
+
const { data: comments } = await this.github.rest.issues.listComments({
|
150
|
+
owner,
|
151
|
+
repo,
|
152
|
+
issue_number: this.number,
|
153
|
+
per_page: 100,
|
154
|
+
})
|
155
|
+
|
156
|
+
const existingComment = comments.find(comment => comment.body?.includes(commentMarker))
|
157
|
+
|
158
|
+
if (existingComment) {
|
159
|
+
await this.github.rest.issues.deleteComment({
|
160
|
+
owner,
|
161
|
+
repo,
|
162
|
+
comment_id: existingComment.id,
|
163
|
+
})
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
// async getComments(): Promise<Array<{ id: number; body: string; created_at: string }>> {
|
168
|
+
// const { owner, repo } = this.context.repo
|
169
|
+
|
170
|
+
// const { data: comments } = await this.github.rest.issues.listComments({
|
171
|
+
// owner,
|
172
|
+
// repo,
|
173
|
+
// issue_number: this.number,
|
174
|
+
// per_page: 100,
|
175
|
+
// })
|
176
|
+
|
177
|
+
// return comments.map(comment => ({
|
178
|
+
// id: comment.id,
|
179
|
+
// body: comment.body || '',
|
180
|
+
// created_at: comment.created_at,
|
181
|
+
// }))
|
182
|
+
// }
|
183
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
/**
|
3
|
+
* CLI for running workflow steps
|
4
|
+
*
|
5
|
+
* This is designed to be called from GitHub Actions workflows
|
6
|
+
* with our convention of steps being in .github/steps/<name>.ts
|
7
|
+
*/
|
8
|
+
|
9
|
+
import * as core from '@actions/core'
|
10
|
+
import { runStep, runStepByName } from './runner.ts'
|
11
|
+
|
12
|
+
async function main() {
|
13
|
+
const stepName = process.argv[2]
|
14
|
+
const workflowName = process.argv[3]
|
15
|
+
const pathOverride = process.argv[4]
|
16
|
+
const inputsJson = process.argv[5] || '{}'
|
17
|
+
const previousJson = process.argv[7] || '{}'
|
18
|
+
|
19
|
+
if (!stepName) {
|
20
|
+
core.setFailed('Missing required step name parameter')
|
21
|
+
core.error(
|
22
|
+
'Usage: run-step-cli <step-name> <workflow-name> [path-override] [inputs-json] [previous-json]',
|
23
|
+
)
|
24
|
+
core.error('This runner expects steps to be in .github/steps/<name>.ts')
|
25
|
+
process.exit(1)
|
26
|
+
}
|
27
|
+
|
28
|
+
// Module discovery is now handled by the runner
|
29
|
+
|
30
|
+
try {
|
31
|
+
core.info(`Running workflow step: ${stepName}`)
|
32
|
+
|
33
|
+
// Parse all inputs
|
34
|
+
const inputs = JSON.parse(inputsJson)
|
35
|
+
const previous = JSON.parse(previousJson)
|
36
|
+
|
37
|
+
// Debug logging
|
38
|
+
core.debug(`Parsed inputs: ${JSON.stringify(inputs)}`)
|
39
|
+
core.debug(`Parsed previous: ${JSON.stringify(previous)}`)
|
40
|
+
|
41
|
+
const mergedInputs = {
|
42
|
+
...inputs,
|
43
|
+
previous,
|
44
|
+
}
|
45
|
+
|
46
|
+
core.debug(`Merged inputs: ${JSON.stringify(mergedInputs)}`)
|
47
|
+
|
48
|
+
// If path override is provided and not empty, use it directly
|
49
|
+
if (pathOverride && pathOverride !== '') {
|
50
|
+
await runStep(pathOverride, JSON.stringify(mergedInputs))
|
51
|
+
} else {
|
52
|
+
await runStepByName(stepName, workflowName, JSON.stringify(mergedInputs))
|
53
|
+
}
|
54
|
+
} catch (error) {
|
55
|
+
const message = error instanceof Error ? error.message : String(error)
|
56
|
+
const stack = error instanceof Error ? error.stack : undefined
|
57
|
+
|
58
|
+
core.error(`Failed to run step ${stepName}: ${message}`)
|
59
|
+
if (stack) {
|
60
|
+
core.error(`Stack trace:`)
|
61
|
+
core.error(stack)
|
62
|
+
}
|
63
|
+
|
64
|
+
core.error(`Step name: ${stepName}`)
|
65
|
+
core.error(`Workflow name: ${workflowName || 'none'}`)
|
66
|
+
core.error(`Path override: ${pathOverride || 'none'}`)
|
67
|
+
core.error(`Inputs: ${inputsJson}`)
|
68
|
+
core.error(`Previous: ${previousJson}`)
|
69
|
+
|
70
|
+
// Check for common issues
|
71
|
+
if (error instanceof Error) {
|
72
|
+
if (error.message.includes('Cannot find module')) {
|
73
|
+
core.error(`Module import error - check that all dependencies are installed`)
|
74
|
+
} else if (error.message.includes('SyntaxError')) {
|
75
|
+
core.error(`Syntax error in step file - check TypeScript compilation`)
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
core.setFailed(`Step execution failed: ${message}`)
|
80
|
+
process.exit(1)
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
main()
|
@@ -0,0 +1,192 @@
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
2
|
+
import { z } from 'zod/v4'
|
3
|
+
import { runStep } from './runner.ts'
|
4
|
+
import { createStep } from './step.ts'
|
5
|
+
|
6
|
+
// Mock the discovery module
|
7
|
+
vi.mock('./discovery.ts')
|
8
|
+
|
9
|
+
// Mock @actions/core
|
10
|
+
vi.mock('@actions/core', () => ({
|
11
|
+
startGroup: vi.fn(),
|
12
|
+
endGroup: vi.fn(),
|
13
|
+
debug: vi.fn(),
|
14
|
+
info: vi.fn(),
|
15
|
+
warning: vi.fn(),
|
16
|
+
error: vi.fn(),
|
17
|
+
setOutput: vi.fn(),
|
18
|
+
setFailed: vi.fn(),
|
19
|
+
}))
|
20
|
+
|
21
|
+
// Mock GitHub context
|
22
|
+
vi.mock('@actions/github', () => ({
|
23
|
+
context: {
|
24
|
+
repo: { owner: 'test', repo: 'test' },
|
25
|
+
eventName: 'push',
|
26
|
+
payload: {},
|
27
|
+
},
|
28
|
+
getOctokit: vi.fn(() => ({
|
29
|
+
rest: {
|
30
|
+
issues: {
|
31
|
+
listComments: vi.fn().mockResolvedValue({ data: [] }),
|
32
|
+
createComment: vi.fn(),
|
33
|
+
updateComment: vi.fn(),
|
34
|
+
deleteComment: vi.fn(),
|
35
|
+
},
|
36
|
+
},
|
37
|
+
})),
|
38
|
+
}))
|
39
|
+
|
40
|
+
describe('runner', () => {
|
41
|
+
beforeEach(() => {
|
42
|
+
vi.clearAllMocks()
|
43
|
+
process.env['GITHUB_TOKEN'] = 'test-token'
|
44
|
+
})
|
45
|
+
|
46
|
+
describe('runStep', () => {
|
47
|
+
it('validates inputs before running step', async () => {
|
48
|
+
const TestStep = createStep({
|
49
|
+
name: 'test-step',
|
50
|
+
description: 'Test step',
|
51
|
+
inputs: z.object({
|
52
|
+
required: z.string(),
|
53
|
+
number: z.number(),
|
54
|
+
}),
|
55
|
+
outputs: z.object({ result: z.string() }),
|
56
|
+
async run({ inputs }) {
|
57
|
+
return { result: `Got ${inputs.required} and ${inputs.number}` }
|
58
|
+
},
|
59
|
+
})
|
60
|
+
|
61
|
+
// Mock the module import
|
62
|
+
vi.doMock('./test-step.ts', () => ({
|
63
|
+
default: TestStep,
|
64
|
+
}))
|
65
|
+
|
66
|
+
await runStep(
|
67
|
+
'./test-step.ts',
|
68
|
+
JSON.stringify({
|
69
|
+
required: 'value',
|
70
|
+
number: 42,
|
71
|
+
}),
|
72
|
+
)
|
73
|
+
|
74
|
+
const core = await import('@actions/core')
|
75
|
+
expect(core.startGroup).toHaveBeenCalledWith('test-step: Test step')
|
76
|
+
expect(core.setOutput).toHaveBeenCalledWith('result', 'Got value and 42')
|
77
|
+
})
|
78
|
+
|
79
|
+
it('handles validation errors', async () => {
|
80
|
+
const TestStep = createStep({
|
81
|
+
name: 'test-step',
|
82
|
+
description: 'Test step',
|
83
|
+
inputs: z.object({
|
84
|
+
required: z.string(),
|
85
|
+
number: z.number(),
|
86
|
+
}),
|
87
|
+
outputs: z.object({ result: z.string() }),
|
88
|
+
async run() {
|
89
|
+
return { result: 'ok' }
|
90
|
+
},
|
91
|
+
})
|
92
|
+
|
93
|
+
vi.doMock('./test-step.ts', () => ({
|
94
|
+
default: TestStep,
|
95
|
+
}))
|
96
|
+
|
97
|
+
const core = await import('@actions/core')
|
98
|
+
|
99
|
+
await expect(runStep(
|
100
|
+
'./test-step.ts',
|
101
|
+
JSON.stringify({
|
102
|
+
required: 'value',
|
103
|
+
number: 'not-a-number', // Invalid type
|
104
|
+
}),
|
105
|
+
)).rejects.toThrow()
|
106
|
+
|
107
|
+
expect(core.error).toHaveBeenCalledWith(
|
108
|
+
expect.stringContaining('Validation error in step test-step'),
|
109
|
+
)
|
110
|
+
})
|
111
|
+
|
112
|
+
it('warns about unknown inputs', async () => {
|
113
|
+
const TestStep = createStep({
|
114
|
+
name: 'test-step',
|
115
|
+
description: 'Test step',
|
116
|
+
inputs: z.object({
|
117
|
+
known: z.string(),
|
118
|
+
}),
|
119
|
+
outputs: z.object({ result: z.string() }),
|
120
|
+
async run({ inputs }) {
|
121
|
+
return { result: inputs.known }
|
122
|
+
},
|
123
|
+
})
|
124
|
+
|
125
|
+
vi.doMock('./test-step.ts', () => ({
|
126
|
+
default: TestStep,
|
127
|
+
}))
|
128
|
+
|
129
|
+
await runStep(
|
130
|
+
'./test-step.ts',
|
131
|
+
JSON.stringify({
|
132
|
+
known: 'value',
|
133
|
+
unknown1: 'should-warn',
|
134
|
+
unknown2: 'also-warn',
|
135
|
+
}),
|
136
|
+
)
|
137
|
+
|
138
|
+
const core = await import('@actions/core')
|
139
|
+
expect(core.warning).toHaveBeenCalledWith(
|
140
|
+
`Step 'test-step' received unknown inputs: unknown1, unknown2. These inputs will be ignored.`,
|
141
|
+
)
|
142
|
+
})
|
143
|
+
|
144
|
+
it('validates and exports outputs', async () => {
|
145
|
+
const TestStep = createStep({
|
146
|
+
name: 'test-step',
|
147
|
+
description: 'Test step',
|
148
|
+
inputs: z.object({}),
|
149
|
+
outputs: z.object({
|
150
|
+
status: z.string(),
|
151
|
+
count: z.number(),
|
152
|
+
}),
|
153
|
+
async run() {
|
154
|
+
return { status: 'complete', count: 5 }
|
155
|
+
},
|
156
|
+
})
|
157
|
+
|
158
|
+
vi.doMock('./test-step.ts', () => ({
|
159
|
+
default: TestStep,
|
160
|
+
}))
|
161
|
+
|
162
|
+
await runStep('./test-step.ts', '{}')
|
163
|
+
|
164
|
+
const core = await import('@actions/core')
|
165
|
+
expect(core.setOutput).toHaveBeenCalledWith('status', 'complete')
|
166
|
+
expect(core.setOutput).toHaveBeenCalledWith('count', '5')
|
167
|
+
})
|
168
|
+
|
169
|
+
it('warns when step returns outputs without schema', async () => {
|
170
|
+
const TestStep = createStep({
|
171
|
+
name: 'test-step',
|
172
|
+
description: 'Test step',
|
173
|
+
inputs: z.object({}),
|
174
|
+
// No outputs schema defined
|
175
|
+
async run() {
|
176
|
+
return { unexpected: 'output' } as any
|
177
|
+
},
|
178
|
+
})
|
179
|
+
|
180
|
+
vi.doMock('./test-step.ts', () => ({
|
181
|
+
default: TestStep,
|
182
|
+
}))
|
183
|
+
|
184
|
+
await runStep('./test-step.ts', '{}')
|
185
|
+
|
186
|
+
const core = await import('@actions/core')
|
187
|
+
expect(core.warning).toHaveBeenCalledWith(
|
188
|
+
expect.stringContaining('Step did not define outputs schema, but returned outputs'),
|
189
|
+
)
|
190
|
+
})
|
191
|
+
})
|
192
|
+
})
|
@@ -0,0 +1,226 @@
|
|
1
|
+
/**
|
2
|
+
* Runner utilities for executing workflow steps in GitHub Actions
|
3
|
+
*/
|
4
|
+
|
5
|
+
import * as core from '@actions/core'
|
6
|
+
import { context, getOctokit } from '@actions/github'
|
7
|
+
import { Obj, Path, Str } from '@wollybeard/kit'
|
8
|
+
import { promises as fs } from 'node:fs'
|
9
|
+
import { z } from 'zod/v4'
|
10
|
+
import { $ } from 'zx'
|
11
|
+
import { createGitController } from './git-controller.ts'
|
12
|
+
import { createPullRequestController } from './pr-controller.ts'
|
13
|
+
import { searchModule } from './search-module.ts'
|
14
|
+
import type { Args, Step } from './step.ts'
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Create a workflow context with all necessary tools
|
18
|
+
*/
|
19
|
+
export function createArgs(stepName: string): Args {
|
20
|
+
const githubToken = process.env['GITHUB_TOKEN']
|
21
|
+
if (!githubToken) {
|
22
|
+
throw new Error('GITHUB_TOKEN environment variable is required')
|
23
|
+
}
|
24
|
+
|
25
|
+
const github = getOctokit(githubToken)
|
26
|
+
const pr = createPullRequestController(github, context, stepName)
|
27
|
+
const git = createGitController($)
|
28
|
+
|
29
|
+
return {
|
30
|
+
core,
|
31
|
+
github,
|
32
|
+
context,
|
33
|
+
$,
|
34
|
+
fs,
|
35
|
+
pr,
|
36
|
+
git,
|
37
|
+
inputs: {},
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
/**
|
42
|
+
* Run a workflow step by name using discovery
|
43
|
+
*/
|
44
|
+
export async function runStepByName(
|
45
|
+
stepName: string,
|
46
|
+
workflowName?: string,
|
47
|
+
inputsJson?: string,
|
48
|
+
): Promise<void> {
|
49
|
+
// Discover the step module
|
50
|
+
const moduleLocation = searchModule({ stepName, workflowName })
|
51
|
+
|
52
|
+
if (!moduleLocation.found || !moduleLocation.path) {
|
53
|
+
core.error(`Step '${stepName}' not found`)
|
54
|
+
core.error(`Searched paths:`)
|
55
|
+
moduleLocation.searchedPaths.forEach(path => core.error(` - ${path}`))
|
56
|
+
throw new Error(`Step '${stepName}' not found`)
|
57
|
+
}
|
58
|
+
|
59
|
+
core.debug(`Found step at: ${moduleLocation.path}`)
|
60
|
+
await runStep(moduleLocation.path, inputsJson)
|
61
|
+
}
|
62
|
+
|
63
|
+
/**
|
64
|
+
* Run a workflow step by importing it from a path
|
65
|
+
*/
|
66
|
+
export async function runStep(
|
67
|
+
stepPath: string,
|
68
|
+
inputsJson?: string,
|
69
|
+
): Promise<void> {
|
70
|
+
const rawInputs = inputsJson ? JSON.parse(inputsJson) : {}
|
71
|
+
|
72
|
+
try {
|
73
|
+
// Dynamically import the step module
|
74
|
+
let stepModule: any
|
75
|
+
|
76
|
+
// Check if this is a test scenario (mocked module)
|
77
|
+
if (process.env['NODE_ENV'] === 'test' && stepPath.startsWith('./test-')) {
|
78
|
+
// For tests, use direct import path
|
79
|
+
stepModule = await import(stepPath)
|
80
|
+
} else {
|
81
|
+
// For real usage, convert to absolute path
|
82
|
+
const { resolve } = await import('node:path')
|
83
|
+
const { pathToFileURL } = await import('node:url')
|
84
|
+
|
85
|
+
// Resolve to absolute path and convert to file URL for proper ESM import
|
86
|
+
const absolutePath = resolve(process.cwd(), stepPath)
|
87
|
+
const importUrl = pathToFileURL(absolutePath).href
|
88
|
+
|
89
|
+
stepModule = await import(importUrl)
|
90
|
+
}
|
91
|
+
|
92
|
+
const step: Step = stepModule.default
|
93
|
+
|
94
|
+
if (!step || !step.run || !step.definition) {
|
95
|
+
throw new Error(`Module at ${stepPath} does not export a valid workflow step as default export`)
|
96
|
+
}
|
97
|
+
|
98
|
+
//
|
99
|
+
//
|
100
|
+
//
|
101
|
+
//
|
102
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Process Step Definition
|
103
|
+
// Validate Inputs
|
104
|
+
// Warning about excess properties
|
105
|
+
// Validate expected GitHub event versus actual
|
106
|
+
//
|
107
|
+
//
|
108
|
+
|
109
|
+
const { definition } = step
|
110
|
+
const stepName = definition.name ?? Path.parse(stepPath).name
|
111
|
+
|
112
|
+
// todo: allow step definition to opt-out of runtime validation
|
113
|
+
// Validate context if schema is provided
|
114
|
+
let validatedContext: any = context
|
115
|
+
if (definition.contextSchema) {
|
116
|
+
const contextValidation = definition.contextSchema.safeParse(context)
|
117
|
+
if (!contextValidation.success) {
|
118
|
+
const errorMessage = `Step '${stepName}' expects a different GitHub event context`
|
119
|
+
core.error(errorMessage)
|
120
|
+
core.error(`Expected context: ${JSON.stringify(contextValidation.error.issues, null, 2)}`)
|
121
|
+
core.error(`Actual event: ${context.eventName}`)
|
122
|
+
|
123
|
+
// For now, default to hard error. We can make this configurable later
|
124
|
+
throw new Error(errorMessage)
|
125
|
+
}
|
126
|
+
validatedContext = contextValidation.data
|
127
|
+
}
|
128
|
+
|
129
|
+
// Validate inputs
|
130
|
+
let inputs: Record<string, unknown> = {}
|
131
|
+
if (definition.inputsSchema) {
|
132
|
+
const parseResult = definition.inputsSchema.safeParse(rawInputs)
|
133
|
+
if (parseResult.success) {
|
134
|
+
inputs = parseResult.data
|
135
|
+
} else {
|
136
|
+
core.error(`Validation error in step ${stepName}: ${parseResult.error.message}`)
|
137
|
+
core.debug(`Validation issues: ${JSON.stringify(parseResult.error.issues, null, 2)}`)
|
138
|
+
core.debug(`Received data: ${JSON.stringify(rawInputs, null, 2)}`)
|
139
|
+
throw parseResult.error
|
140
|
+
}
|
141
|
+
|
142
|
+
// todo: let step define if it wants to silence this warning
|
143
|
+
// Check for excess properties if using object schema
|
144
|
+
if (definition.inputsSchema instanceof z.ZodObject && typeof rawInputs === 'object' && rawInputs !== null) {
|
145
|
+
const knownKeys = Object.keys(definition.inputsSchema.shape)
|
146
|
+
const providedKeys = Object.keys(rawInputs)
|
147
|
+
const unknownKeys = providedKeys.filter(key => !knownKeys.includes(key))
|
148
|
+
|
149
|
+
if (unknownKeys.length > 0) {
|
150
|
+
core.warning(
|
151
|
+
`Step '${stepName}' received unknown inputs: ${unknownKeys.join(', ')}. These inputs will be ignored.`,
|
152
|
+
)
|
153
|
+
core.debug(`Known inputs: ${knownKeys.join(', ')}`)
|
154
|
+
core.debug(`Provided inputs: ${JSON.stringify(rawInputs, null, 2)}`)
|
155
|
+
}
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
//
|
160
|
+
//
|
161
|
+
//
|
162
|
+
//
|
163
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Run Step
|
164
|
+
//
|
165
|
+
//
|
166
|
+
|
167
|
+
// Create context with validated inputs
|
168
|
+
const args = createArgs(stepName)
|
169
|
+
const stepArgs = {
|
170
|
+
...args,
|
171
|
+
context: validatedContext,
|
172
|
+
inputs: inputs as any,
|
173
|
+
}
|
174
|
+
|
175
|
+
core.startGroup(`${definition.name}: ${definition.description}`)
|
176
|
+
core.debug(`Inputs: ${JSON.stringify(inputs)}`)
|
177
|
+
|
178
|
+
// Execute step
|
179
|
+
const outputRaw = await step.run(stepArgs)
|
180
|
+
|
181
|
+
//
|
182
|
+
//
|
183
|
+
//
|
184
|
+
//
|
185
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ • Handle Step Output
|
186
|
+
//
|
187
|
+
//
|
188
|
+
|
189
|
+
// Validate & Export outputs
|
190
|
+
// todo: allow step definition to opt-out of output validation
|
191
|
+
if (definition.outputsSchema) {
|
192
|
+
const outputs = definition.outputsSchema.parse(outputRaw)
|
193
|
+
const json = JSON.stringify(outputs)
|
194
|
+
core.setOutput('json', json)
|
195
|
+
for (const [key, value] of Obj.entries(outputs)) {
|
196
|
+
// todo: if key === json raise an error, it is a reserved name
|
197
|
+
core.setOutput(key, Str.is(value) ? value : JSON.stringify(value))
|
198
|
+
}
|
199
|
+
} else if (outputRaw !== undefined && outputRaw !== null) {
|
200
|
+
core.warning(
|
201
|
+
`Step did not define outputs schema, but returned outputs. These will not be validated or exported. Outputs were: ${
|
202
|
+
JSON.stringify(outputRaw)
|
203
|
+
}`,
|
204
|
+
)
|
205
|
+
}
|
206
|
+
|
207
|
+
core.endGroup()
|
208
|
+
} catch (error) {
|
209
|
+
core.endGroup()
|
210
|
+
|
211
|
+
// Log error details once (if not already logged)
|
212
|
+
if (error instanceof Error && !(error instanceof z.ZodError)) {
|
213
|
+
core.error(`Step failed: ${error.message}`)
|
214
|
+
core.debug(`Stack: ${error.stack}`)
|
215
|
+
} else if (!(error instanceof z.ZodError)) {
|
216
|
+
core.error(`Step failed: ${String(error)}`)
|
217
|
+
}
|
218
|
+
|
219
|
+
if (inputsJson) {
|
220
|
+
core.debug(`Step inputs: ${inputsJson}`)
|
221
|
+
}
|
222
|
+
|
223
|
+
// Re-throw to let CLI handle the error
|
224
|
+
throw error
|
225
|
+
}
|
226
|
+
}
|