@woodsportal/hubspot-kit 1.0.41 → 1.0.42-dev.0
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/CHANGELOG.md +14 -1
- package/README.md +191 -157
- package/dist/{chunk-S2YJDWZU.js → chunk-NWBK3XBZ.js} +1 -1
- package/dist/chunk-NWBK3XBZ.js.map +1 -0
- package/dist/chunk-WHYTQEZX.js +554 -0
- package/dist/chunk-WHYTQEZX.js.map +1 -0
- package/dist/cli.js +1778 -864
- package/dist/cli.js.map +1 -1
- package/dist/ensure-wphs-workspace-5S3GTO6K.js +234 -0
- package/dist/ensure-wphs-workspace-5S3GTO6K.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/scaffold-page-lifecycle-EHMPWPPE.js +194 -0
- package/dist/scaffold-page-lifecycle-EHMPWPPE.js.map +1 -0
- package/dist/vite/index.js +1 -1
- package/examples/greenfield/module-hybrid-cdn/public/fields.json +73 -28
- package/examples/greenfield/module-hybrid-cdn/public/module.html +21 -5
- package/examples/greenfield/module-hybrid-cdn/src/assets/css/main.dev.css +15 -0
- package/examples/greenfield/module-hybrid-cdn/src/components/layout/starter-nav.tsx +12 -15
- package/examples/greenfield/module-hybrid-cdn/src/config/starter-nav.ts +9 -0
- package/examples/greenfield/module-hybrid-cdn/src/features/starter/components/starter-home.tsx +25 -29
- package/examples/greenfield/module-hybrid-cdn/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-hybrid-cdn/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-hybrid-cdn/src/features/starter/hooks/use-starter-preview.ts +20 -37
- package/examples/greenfield/module-hybrid-cdn-auth-full/.env.dev.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/.env.local.example +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/.env.prod.example +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/.env.stg.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/.wphs/README.md +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/README.md +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/hubspot.config.yml.example +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/index.html +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/package.json +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/portal.cdn.json.example +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/public/fields.json +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/public/meta.json +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/public/module.html +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/app.tsx +172 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/assets/css/main.dev.css +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/assets/css/main.prod.css +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/assets/css/tailwind.css.config.css +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/cdn/app-entry.ts +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/cdn/vendor-entry.ts +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/AppLayoutWrapper.tsx +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/AuthLayout.tsx +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/DefaultLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/MainLayout.tsx +42 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/UnauthorizedLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/Layouts/index.ts +13 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/layout/section-card.tsx +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/layout/starter-nav.tsx +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/layout/starter-shell.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/Button.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/Form.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/Input.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/Toaster.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/auth/SsoLoginButton.tsx +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/link.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/components/ui/loader/loader.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/config/auth-tier.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/config/nav-scaffold.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/config/portal-nav.ts +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/config/router.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/config/routes.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/data/hubSpotContext.ts +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/data/sync-sdk-hub-context.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/defaultData.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/env.ts +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/app-bootstrap-guards.ts +14 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/auth-navigation.ts +81 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/auth-route-paths.ts +29 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/auth-session-events.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/auth-session.ts +51 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/clear-client-auth-session.ts +62 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/components/starter-login.tsx +83 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/login-email-storage.ts +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/login-session-bridge.ts +74 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/mfa-otp-utils.ts +24 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/mfa-pending-storage.ts +108 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/mfa-portal.ts +45 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/post-login-path.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/resolve-auth-login-error-message.ts +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/resolve-post-login-path.ts +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/sso-callback.ts +120 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/use-mfa-login-otp-flow.ts +78 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/use-portal-session.ts +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/use-signed-in-email.ts +55 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/auth/use-sso-callback-handler.ts +92 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-guide-page.tsx +210 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-home-page.tsx +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-home.tsx +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-page-frame.tsx +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-protected-page.tsx +54 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/components/starter-single-page.tsx +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/content/auth-guide-content.ts +85 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/content/woodscli-guide-content.ts +86 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/hooks/use-starter-preview.ts +30 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/features/starter/index.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/hubspot/bootstrap.ts +16 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/hubspot/default-data.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/hubspot/is-cms-editor.ts +78 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/hubspot/module-entry.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/hubspot/types.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/integrations/configure-woodsportal-sdk.ts +98 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/integrations/tanstack-query/root-provider.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/integrations/tanstack-router/router.tsx +39 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/integrations/woodsportal-sdk.ts +37 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/main.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/portal/api-endpoint.ts +11 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/portal/ensure-portal-cdn-stylesheet.ts +115 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/portal/mount-dev-preview.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/portal/mount-portal.tsx +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routeTree.gen.ts +182 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/__root.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/_app/portal.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/_auth/login/sso.tsx +27 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/_auth/login.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/_auth/two-fa.tsx +91 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/guide.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/index.tsx +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/routes/unauthorized.tsx +50 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/ValidationSchema.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/cookie.ts +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/normalize-router-path.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/private-route.tsx +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/public-route.tsx +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/resolve-api-base-url.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/src/utils/safe-router-navigation.ts +82 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/tsconfig.json +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.cdn-app.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.cdn-esm.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.cdn-vendor.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.dev.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.hubspot.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/vite.config.monolith.mjs +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/woodscli.json +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-full/wphs.adapter.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/.env.dev.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/.env.local.example +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/.env.prod.example +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/.env.stg.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/.wphs/README.md +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/README.md +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/hubspot.config.yml.example +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/index.html +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/package.json +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/portal.cdn.json.example +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/public/fields.json +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/public/meta.json +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/public/module.html +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/app.tsx +180 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/assets/css/main.dev.css +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/assets/css/main.prod.css +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/assets/css/tailwind.css.config.css +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/cdn/app-entry.ts +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/cdn/vendor-entry.ts +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/AppLayoutWrapper.tsx +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/AuthLayout.tsx +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/DefaultLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/MainLayout.tsx +42 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/UnauthorizedLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/Layouts/index.ts +13 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/layout/section-card.tsx +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/layout/starter-nav.tsx +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/layout/starter-shell.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/Button.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/Form.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/Input.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/Toaster.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/auth/SsoLoginButton.tsx +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/link.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/components/ui/loader/loader.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/config/auth-tier.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/config/nav-scaffold.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/config/portal-nav.ts +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/config/router.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/config/routes.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/data/hubSpotContext.ts +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/data/sync-sdk-hub-context.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/defaultData.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/env.ts +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/app-bootstrap-guards.ts +14 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/auth-navigation.ts +81 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/auth-route-paths.ts +29 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/auth-session-events.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/auth-session.ts +26 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/clear-client-auth-session.ts +62 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/components/starter-login.tsx +83 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/login-email-storage.ts +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/login-session-bridge.ts +72 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/post-login-path.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/resolve-auth-login-error-message.ts +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/resolve-post-login-path.ts +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/sso-callback.ts +120 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/use-portal-session.ts +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/use-signed-in-email.ts +55 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/auth/use-sso-callback-handler.ts +92 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-guide-page.tsx +210 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-home-page.tsx +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-home.tsx +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-page-frame.tsx +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-protected-page.tsx +54 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/components/starter-single-page.tsx +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/content/auth-guide-content.ts +85 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/content/woodscli-guide-content.ts +86 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/hooks/use-starter-preview.ts +30 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/features/starter/index.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/hubspot/bootstrap.ts +16 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/hubspot/default-data.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/hubspot/is-cms-editor.ts +78 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/hubspot/module-entry.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/hubspot/types.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/integrations/configure-woodsportal-sdk.ts +94 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/integrations/tanstack-query/root-provider.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/integrations/tanstack-router/router.tsx +39 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/integrations/woodsportal-sdk.ts +37 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/main.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/portal/api-endpoint.ts +11 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/portal/ensure-portal-cdn-stylesheet.ts +115 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/portal/mount-dev-preview.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/portal/mount-portal.tsx +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routeTree.gen.ts +155 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/__root.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/_app/portal.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/_auth/login/sso.tsx +27 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/_auth/login.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/guide.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/index.tsx +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/routes/unauthorized.tsx +50 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/ValidationSchema.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/cookie.ts +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/normalize-router-path.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/private-route.tsx +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/public-route.tsx +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/resolve-api-base-url.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/src/utils/safe-router-navigation.ts +82 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/tsconfig.json +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.cdn-app.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.cdn-esm.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.cdn-vendor.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.dev.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.hubspot.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/vite.config.monolith.mjs +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/woodscli.json +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-sso/wphs.adapter.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/.env.dev.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/.env.local.example +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/.env.prod.example +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/.env.stg.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/.wphs/README.md +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/README.md +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/hubspot.config.yml.example +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/index.html +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/package.json +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/portal.cdn.json.example +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/public/fields.json +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/public/meta.json +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/public/module.html +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/app.tsx +173 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/assets/css/main.dev.css +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/assets/css/main.prod.css +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/assets/css/tailwind.css.config.css +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/cdn/app-entry.ts +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/cdn/vendor-entry.ts +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/AppLayoutWrapper.tsx +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/AuthLayout.tsx +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/DefaultLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/MainLayout.tsx +42 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/UnauthorizedLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/Layouts/index.ts +13 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/layout/section-card.tsx +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/layout/starter-nav.tsx +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/layout/starter-shell.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/Button.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/Form.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/Input.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/Toaster.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/link.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/components/ui/loader/loader.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/config/auth-tier.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/config/nav-scaffold.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/config/portal-nav.ts +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/config/router.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/config/routes.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/data/hubSpotContext.ts +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/data/sync-sdk-hub-context.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/defaultData.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/env.ts +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/app-bootstrap-guards.ts +14 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/auth-navigation.ts +81 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/auth-route-paths.ts +29 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/auth-session-events.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/auth-session.ts +26 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/clear-client-auth-session.ts +62 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/components/starter-login.tsx +76 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/login-email-storage.ts +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/login-session-bridge.ts +72 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/post-login-path.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/resolve-auth-login-error-message.ts +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/resolve-post-login-path.ts +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/use-portal-session.ts +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/auth/use-signed-in-email.ts +55 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-guide-page.tsx +218 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-home-page.tsx +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-home.tsx +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-page-frame.tsx +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-protected-page.tsx +54 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/components/starter-single-page.tsx +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/content/auth-guide-content.ts +91 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/content/woodscli-guide-content.ts +86 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/hooks/use-starter-preview.ts +30 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/features/starter/index.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/hubspot/bootstrap.ts +16 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/hubspot/default-data.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/hubspot/is-cms-editor.ts +78 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/hubspot/module-entry.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/hubspot/types.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/integrations/configure-woodsportal-sdk.ts +94 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/integrations/tanstack-query/root-provider.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/integrations/tanstack-router/router.tsx +39 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/integrations/woodsportal-sdk.ts +37 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/main.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/portal/api-endpoint.ts +11 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/portal/ensure-portal-cdn-stylesheet.ts +115 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/portal/mount-dev-preview.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/portal/mount-portal.tsx +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routeTree.gen.ts +134 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/__root.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/_app/portal.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/_auth/login.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/guide.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/index.tsx +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/routes/unauthorized.tsx +50 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/ValidationSchema.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/cookie.ts +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/normalize-router-path.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/private-route.tsx +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/public-route.tsx +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/resolve-api-base-url.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/src/utils/safe-router-navigation.ts +82 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/tsconfig.json +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.cdn-app.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.cdn-esm.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.cdn-vendor.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.dev.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.hubspot.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/vite.config.monolith.mjs +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/woodscli.json +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter/wphs.adapter.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/.env.dev.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/.env.local.example +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/.env.prod.example +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/.env.stg.example +3 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/.wphs/README.md +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/README.md +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/hubspot.config.yml.example +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/index.html +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/package.json +34 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/portal.cdn.json.example +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/public/fields.json +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/public/meta.json +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/public/module.html +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/app.tsx +173 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/assets/css/main.dev.css +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/assets/css/main.prod.css +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/assets/css/tailwind.css.config.css +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/cdn/app-entry.ts +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/cdn/vendor-entry.ts +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/AppLayoutWrapper.tsx +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/AuthLayout.tsx +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/DefaultLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/MainLayout.tsx +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/UnauthorizedLayout.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/Layouts/index.ts +13 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/layout/portal-sidebar-nav.tsx +33 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/layout/portal-sidebar.tsx +139 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/layout/section-card.tsx +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/layout/starter-nav.tsx +28 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/layout/starter-shell.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/Button.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/Form.tsx +22 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/Input.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/Toaster.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/link.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/components/ui/loader/loader.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/config/auth-tier.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/config/nav-scaffold.ts +4 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/config/portal-nav.ts +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/config/router.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/config/routes.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/data/hubSpotContext.ts +57 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/data/sync-sdk-hub-context.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/defaultData.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/env.ts +59 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/app-bootstrap-guards.ts +14 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/auth-navigation.ts +81 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/auth-route-paths.ts +29 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/auth-session-events.ts +2 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/auth-session.ts +26 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/clear-client-auth-session.ts +62 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/components/starter-login.tsx +76 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/login-email-storage.ts +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/login-session-bridge.ts +72 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/post-login-path.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/resolve-auth-login-error-message.ts +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/resolve-post-login-path.ts +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/use-portal-session.ts +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/auth/use-signed-in-email.ts +55 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-guide-page.tsx +210 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-home-page.tsx +21 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-home.tsx +48 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-page-frame.tsx +25 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-protected-page.tsx +54 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/components/starter-single-page.tsx +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/content/auth-guide-content.ts +85 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/content/woodscli-guide-content.ts +86 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/hooks/use-starter-preview.ts +30 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/features/starter/index.ts +6 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/hubspot/bootstrap.ts +16 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/hubspot/default-data.ts +7 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/hubspot/is-cms-editor.ts +78 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/hubspot/module-entry.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/hubspot/types.ts +17 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/integrations/configure-woodsportal-sdk.ts +94 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/integrations/tanstack-query/root-provider.tsx +18 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/integrations/tanstack-router/router.tsx +39 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/integrations/woodsportal-sdk.ts +37 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/main.tsx +5 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/portal/api-endpoint.ts +11 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/portal/ensure-portal-cdn-stylesheet.ts +115 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/portal/mount-dev-preview.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/portal/mount-portal.tsx +52 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routeTree.gen.ts +134 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/__root.tsx +12 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/_app/portal.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/_auth/login.tsx +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/guide.tsx +9 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/index.tsx +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/routes/unauthorized.tsx +50 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/ValidationSchema.ts +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/cookie.ts +23 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/normalize-router-path.ts +10 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/private-route.tsx +100 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/public-route.tsx +64 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/resolve-api-base-url.ts +44 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/src/utils/safe-router-navigation.ts +82 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/tsconfig.json +20 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.cdn-app.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.cdn-esm.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.cdn-vendor.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.dev.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.hubspot.mjs +1 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/vite.config.monolith.mjs +8 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/woodscli.json +38 -0
- package/examples/greenfield/module-hybrid-cdn-auth-starter-sidebar/wphs.adapter.ts +7 -0
- package/examples/greenfield/module-monolith/public/fields.json +66 -16
- package/examples/greenfield/module-monolith/src/assets/css/main.dev.css +7 -0
- package/examples/greenfield/module-monolith/src/components/layout/starter-nav.tsx +12 -15
- package/examples/greenfield/module-monolith/src/config/starter-nav.ts +9 -0
- package/examples/greenfield/module-monolith/src/features/starter/components/starter-home.tsx +25 -29
- package/examples/greenfield/module-monolith/src/features/starter/hooks/starter-preview-values.ts +60 -0
- package/examples/greenfield/module-monolith/src/features/starter/hooks/use-starter-preview.dev.ts +18 -0
- package/examples/greenfield/module-monolith/src/features/starter/hooks/use-starter-preview.ts +20 -37
- package/examples/manifest.json +5 -1
- package/examples/smoke/run-matrix.mjs +37 -0
- package/package.json +28 -12
- package/scripts/audit-tdz-split.mjs +11 -5
- package/scripts/check-cdn-size-regression.mjs +49 -0
- package/scripts/check-hubspot-bundle-size.mjs +18 -4
- package/scripts/cli-smoke-helpers.mjs +150 -0
- package/scripts/generate-cdn-bundle-breakdown.mjs +61 -0
- package/scripts/generate-cdn-manifest.mjs +23 -8
- package/scripts/portal-vite-env.mjs +76 -2
- package/scripts/publish-cdn-github.mjs +79 -14
- package/scripts/refresh-artifact-sizes.mjs +77 -0
- package/scripts/regenerate-route-tree.mjs +71 -0
- package/scripts/sync-auth-scaffold-from-client.mjs +41 -0
- package/scripts/verify-cdn-api-endpoint.mjs +17 -10
- package/scripts/vite/create-dev-server-config.mjs +7 -1
- package/scripts/vite/portal-build-shared.js +62 -2
- package/scripts/wp-cli-smoke.test.mjs +263 -0
- package/src/dev/bootstrap-greenfield.tsx +6 -0
- package/src/dev-module-config/ui/module-config-overlay-side.ts +13 -3
- package/src/dev-module-config/ui/module-config-toolbar-theme.ts +12 -3
- package/templates/module-hybrid-cdn/public/fields.json +47 -7
- package/templates/module-hybrid-cdn/public/module.html +7 -6
- package/templates/module-hybrid-cdn/src/assets/css/main.dev.css +7 -0
- package/templates/module-hybrid-cdn/src/components/layout/starter-nav.tsx +12 -15
- package/templates/module-hybrid-cdn/src/config/starter-nav.ts +9 -0
- package/templates/module-hybrid-cdn/src/features/starter/components/starter-home.tsx +25 -27
- package/templates/module-hybrid-cdn/src/features/starter/hooks/starter-preview-values.ts +5 -5
- package/templates/module-monolith/public/fields.json +49 -6
- package/templates/module-monolith/src/assets/css/main.dev.css +7 -0
- package/templates/module-monolith/src/components/layout/starter-nav.tsx +12 -15
- package/templates/module-monolith/src/config/starter-nav.ts +9 -0
- package/templates/module-monolith/src/features/starter/components/starter-home.tsx +25 -27
- package/templates/module-monolith/src/features/starter/hooks/starter-preview-values.ts +5 -5
- package/templates/scaffold/auth/_full/src/app.tsx +172 -0
- package/templates/scaffold/auth/_full/src/config/auth-tier.ts +4 -0
- package/templates/scaffold/auth/_full/src/features/auth/auth-session.ts +51 -0
- package/templates/scaffold/auth/_full/src/features/auth/login-session-bridge.ts +74 -0
- package/templates/scaffold/auth/_full/src/features/auth/mfa-otp-utils.ts +24 -0
- package/templates/scaffold/auth/_full/src/features/auth/mfa-pending-storage.ts +108 -0
- package/templates/scaffold/auth/_full/src/features/auth/mfa-portal.ts +45 -0
- package/templates/scaffold/auth/_full/src/features/auth/use-mfa-login-otp-flow.ts +78 -0
- package/templates/scaffold/auth/_full/src/routeTree.gen.ts +182 -0
- package/templates/scaffold/auth/_full/src/routes/_auth/two-fa.tsx +91 -0
- package/templates/scaffold/auth/_nav-sidebar/src/components/Layouts/MainLayout.tsx +7 -0
- package/templates/scaffold/auth/_nav-sidebar/src/components/layout/portal-sidebar-nav.tsx +33 -0
- package/templates/scaffold/auth/_nav-sidebar/src/components/layout/portal-sidebar.tsx +139 -0
- package/templates/scaffold/auth/_nav-top/src/components/Layouts/MainLayout.tsx +42 -0
- package/templates/scaffold/auth/_shared/src/app.tsx +178 -0
- package/templates/scaffold/auth/_shared/src/components/Layouts/AppLayoutWrapper.tsx +38 -0
- package/templates/scaffold/auth/_shared/src/components/Layouts/AuthLayout.tsx +7 -0
- package/templates/scaffold/auth/_shared/src/components/Layouts/DefaultLayout.tsx +5 -0
- package/templates/scaffold/auth/_shared/src/components/Layouts/UnauthorizedLayout.tsx +5 -0
- package/templates/scaffold/auth/_shared/src/components/Layouts/index.ts +13 -0
- package/templates/scaffold/auth/_shared/src/components/ui/Button.tsx +22 -0
- package/templates/scaffold/auth/_shared/src/components/ui/Form.tsx +22 -0
- package/templates/scaffold/auth/_shared/src/components/ui/Input.tsx +12 -0
- package/templates/scaffold/auth/_shared/src/components/ui/Toaster.tsx +5 -0
- package/templates/scaffold/auth/_shared/src/components/ui/link.tsx +10 -0
- package/templates/scaffold/auth/_shared/src/components/ui/loader/loader.tsx +18 -0
- package/templates/scaffold/auth/_shared/src/config/auth-tier.ts +4 -0
- package/templates/scaffold/auth/_shared/src/config/nav-scaffold.ts +4 -0
- package/templates/scaffold/auth/_shared/src/config/portal-nav.ts +9 -0
- package/templates/scaffold/auth/_shared/src/config/router.ts +1 -0
- package/templates/scaffold/auth/_shared/src/config/routes.ts +10 -0
- package/templates/scaffold/auth/_shared/src/data/hubSpotContext.ts +57 -0
- package/templates/scaffold/auth/_shared/src/data/sync-sdk-hub-context.ts +44 -0
- package/templates/scaffold/auth/_shared/src/env.ts +59 -0
- package/templates/scaffold/auth/_shared/src/features/auth/app-bootstrap-guards.ts +14 -0
- package/templates/scaffold/auth/_shared/src/features/auth/auth-navigation.ts +81 -0
- package/templates/scaffold/auth/_shared/src/features/auth/auth-route-paths.ts +29 -0
- package/templates/scaffold/auth/_shared/src/features/auth/auth-session-events.ts +2 -0
- package/templates/scaffold/auth/_shared/src/features/auth/auth-session.ts +26 -0
- package/templates/scaffold/auth/_shared/src/features/auth/clear-client-auth-session.ts +62 -0
- package/templates/scaffold/auth/_shared/src/features/auth/components/starter-login.tsx +76 -0
- package/templates/scaffold/auth/_shared/src/features/auth/login-email-storage.ts +64 -0
- package/templates/scaffold/auth/_shared/src/features/auth/login-session-bridge.ts +72 -0
- package/templates/scaffold/auth/_shared/src/features/auth/post-login-path.ts +17 -0
- package/templates/scaffold/auth/_shared/src/features/auth/resolve-auth-login-error-message.ts +52 -0
- package/templates/scaffold/auth/_shared/src/features/auth/resolve-post-login-path.ts +21 -0
- package/templates/scaffold/auth/_shared/src/features/auth/use-portal-session.ts +25 -0
- package/templates/scaffold/auth/_shared/src/features/auth/use-signed-in-email.ts +55 -0
- package/templates/scaffold/auth/_shared/src/features/starter/components/starter-guide-page.tsx +218 -0
- package/templates/scaffold/auth/_shared/src/features/starter/components/starter-page-frame.tsx +25 -0
- package/templates/scaffold/auth/_shared/src/features/starter/components/starter-protected-page.tsx +54 -0
- package/templates/scaffold/auth/_shared/src/features/starter/content/auth-guide-content.ts +91 -0
- package/templates/scaffold/auth/_shared/src/hubspot/is-cms-editor.ts +78 -0
- package/templates/scaffold/auth/_shared/src/integrations/configure-woodsportal-sdk.ts +100 -0
- package/templates/scaffold/auth/_shared/src/integrations/tanstack-query/root-provider.tsx +18 -0
- package/templates/scaffold/auth/_shared/src/integrations/tanstack-router/router.tsx +39 -0
- package/templates/scaffold/auth/_shared/src/integrations/woodsportal-sdk.ts +37 -0
- package/templates/scaffold/auth/_shared/src/portal/mount-portal.tsx +59 -0
- package/templates/scaffold/auth/_shared/src/routeTree.gen.ts +134 -0
- package/templates/scaffold/auth/_shared/src/routes/__root.tsx +12 -0
- package/templates/scaffold/auth/_shared/src/routes/_app/portal.tsx +10 -0
- package/templates/scaffold/auth/_shared/src/routes/_auth/login.tsx +10 -0
- package/templates/scaffold/auth/_shared/src/routes/guide.tsx +9 -0
- package/templates/scaffold/auth/_shared/src/routes/index.tsx +8 -0
- package/templates/scaffold/auth/_shared/src/routes/unauthorized.tsx +50 -0
- package/templates/scaffold/auth/_shared/src/utils/ValidationSchema.ts +1 -0
- package/templates/scaffold/auth/_shared/src/utils/cookie.ts +23 -0
- package/templates/scaffold/auth/_shared/src/utils/normalize-router-path.ts +10 -0
- package/templates/scaffold/auth/_shared/src/utils/private-route.tsx +100 -0
- package/templates/scaffold/auth/_shared/src/utils/public-route.tsx +64 -0
- package/templates/scaffold/auth/_shared/src/utils/resolve-api-base-url.ts +44 -0
- package/templates/scaffold/auth/_shared/src/utils/safe-router-navigation.ts +82 -0
- package/templates/scaffold/auth/_sso/src/app.tsx +180 -0
- package/templates/scaffold/auth/_sso/src/components/ui/auth/SsoLoginButton.tsx +34 -0
- package/templates/scaffold/auth/_sso/src/config/auth-tier.ts +4 -0
- package/templates/scaffold/auth/_sso/src/features/auth/components/starter-login.tsx +83 -0
- package/templates/scaffold/auth/_sso/src/features/auth/sso-callback.ts +120 -0
- package/templates/scaffold/auth/_sso/src/features/auth/use-sso-callback-handler.ts +92 -0
- package/templates/scaffold/auth/_sso/src/routeTree.gen.ts +155 -0
- package/templates/scaffold/auth/_sso/src/routes/_auth/login/sso.tsx +27 -0
- package/templates/scaffold/auth/nav-manifest.json +8 -0
- package/templates/scaffold/auth/sync-manifest.json +16 -0
- package/templates/scaffold/auth/tier-manifest.json +18 -0
- package/templates/scaffold/page/page-component-auth.tsx.tpl +10 -0
- package/templates/scaffold/page/page-component-plain.tsx.tpl +11 -0
- package/templates/scaffold/page/route-protected-auth.tsx.tpl +10 -0
- package/templates/scaffold/page/route-public-auth.tsx.tpl +9 -0
- package/templates/scaffold/page/route-public-plain.tsx.tpl +6 -0
- package/vite/vite.config.cdn-app.mjs +43 -30
- package/vite/vite.config.cdn-audit.mjs +34 -0
- package/vite/vite.config.cdn-esm.mjs +1 -1
- package/dist/chunk-S2YJDWZU.js.map +0 -1
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
|
|
4
|
+
// scripts/ensure-wphs-workspace.mjs
|
|
5
|
+
import { existsSync as existsSync5, mkdirSync as mkdirSync2, writeFileSync } from "fs";
|
|
6
|
+
|
|
7
|
+
// scripts/project-root.mjs
|
|
8
|
+
import { existsSync as existsSync2 } from "fs";
|
|
9
|
+
import { dirname, resolve as resolve2 } from "path";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
|
|
12
|
+
// scripts/config-files.mjs
|
|
13
|
+
import { existsSync } from "fs";
|
|
14
|
+
import { resolve } from "path";
|
|
15
|
+
var WOODSCLI_CONFIG_FILE = "woodscli.json";
|
|
16
|
+
function woodscliConfigPath(projectRoot) {
|
|
17
|
+
return resolve(projectRoot, WOODSCLI_CONFIG_FILE);
|
|
18
|
+
}
|
|
19
|
+
function resolveProjectConfigPath(projectRoot) {
|
|
20
|
+
const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null;
|
|
21
|
+
if (fromEnv) {
|
|
22
|
+
const path2 = resolve(projectRoot, fromEnv);
|
|
23
|
+
return existsSync(path2) ? path2 : null;
|
|
24
|
+
}
|
|
25
|
+
const path = woodscliConfigPath(projectRoot);
|
|
26
|
+
return existsSync(path) ? path : null;
|
|
27
|
+
}
|
|
28
|
+
function findProjectRootWithConfig(from = process.cwd()) {
|
|
29
|
+
if (process.env.WP_HS_PROJECT_ROOT?.trim()) {
|
|
30
|
+
return resolve(process.env.WP_HS_PROJECT_ROOT.trim());
|
|
31
|
+
}
|
|
32
|
+
let dir = resolve(from);
|
|
33
|
+
while (true) {
|
|
34
|
+
if (resolveProjectConfigPath(dir)) return dir;
|
|
35
|
+
const parent = resolve(dir, "..");
|
|
36
|
+
if (parent === dir) return resolve(from);
|
|
37
|
+
dir = parent;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// scripts/project-root.mjs
|
|
42
|
+
var kitRoot = resolve2(dirname(fileURLToPath(import.meta.url)), "..");
|
|
43
|
+
function findProjectRoot(from = process.cwd()) {
|
|
44
|
+
return findProjectRootWithConfig(from);
|
|
45
|
+
}
|
|
46
|
+
function getKitRoot() {
|
|
47
|
+
return kitRoot;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// scripts/wphs-paths.mjs
|
|
51
|
+
import { existsSync as existsSync3, readFileSync } from "fs";
|
|
52
|
+
import { join, resolve as resolve3 } from "path";
|
|
53
|
+
var WPHS_WORKSPACE_DIR = ".wphs";
|
|
54
|
+
var LEGACY_WORKSPACE_DIRS = [".dev", ".woodsportal"];
|
|
55
|
+
function readWphsWorkspaceDir(projectRoot) {
|
|
56
|
+
const root = projectRoot ?? findProjectRootWithConfig();
|
|
57
|
+
const configPath = resolveProjectConfigPath(root);
|
|
58
|
+
if (configPath && existsSync3(configPath)) {
|
|
59
|
+
try {
|
|
60
|
+
const raw = JSON.parse(readFileSync(configPath, "utf8"));
|
|
61
|
+
const dir = raw?.dev?.moduleConfigDir;
|
|
62
|
+
if (typeof dir === "string" && dir.trim()) {
|
|
63
|
+
const trimmed = dir.trim();
|
|
64
|
+
if (trimmed !== WPHS_WORKSPACE_DIR) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`dev.moduleConfigDir must be "${WPHS_WORKSPACE_DIR}" (got "${trimmed}"). Run wp migrate.`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return trimmed;
|
|
70
|
+
}
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (error instanceof Error && error.message.includes("moduleConfigDir")) {
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return WPHS_WORKSPACE_DIR;
|
|
78
|
+
}
|
|
79
|
+
function wphsPaths(projectRoot) {
|
|
80
|
+
const workspaceDir = readWphsWorkspaceDir(projectRoot);
|
|
81
|
+
const workspaceRoot = resolve3(projectRoot, workspaceDir);
|
|
82
|
+
return {
|
|
83
|
+
workspaceDir,
|
|
84
|
+
moduleConfigDir: workspaceDir,
|
|
85
|
+
workspaceRoot,
|
|
86
|
+
devDir: workspaceRoot,
|
|
87
|
+
configDir: join(workspaceRoot, "config"),
|
|
88
|
+
localConfigPath: join(workspaceRoot, "config", "module-config.local.json"),
|
|
89
|
+
exampleConfigPath: join(workspaceRoot, "config", "module-config.example.json"),
|
|
90
|
+
assetsDir: join(workspaceRoot, "assets", "branding"),
|
|
91
|
+
fixturesDir: join(workspaceRoot, "fixtures"),
|
|
92
|
+
hubspotDataFixturePath: join(workspaceRoot, "fixtures", "hubspot-data.json"),
|
|
93
|
+
previewFixturesDir: join(workspaceRoot, "fixtures", "preview"),
|
|
94
|
+
cacheDir: join(workspaceRoot, "cache"),
|
|
95
|
+
auditDir: join(workspaceRoot, "audit"),
|
|
96
|
+
baselineDir: join(workspaceRoot, "audit", "baseline"),
|
|
97
|
+
stateDir: join(workspaceRoot, "state"),
|
|
98
|
+
kitModuleConfigLink: join(workspaceRoot, ".kit-module-config"),
|
|
99
|
+
kitBootstrapLink: join(workspaceRoot, ".kit-bootstrap.tsx"),
|
|
100
|
+
kitBootstrapGreenfieldLink: join(workspaceRoot, ".kit-bootstrap-greenfield.tsx"),
|
|
101
|
+
readmePath: join(workspaceRoot, "README.md"),
|
|
102
|
+
brandingAssetsUrlPrefix: `/${workspaceDir}/assets/branding/`,
|
|
103
|
+
legacyBrandingAssetsUrlPrefixes: [
|
|
104
|
+
"/dev/branding-assets/",
|
|
105
|
+
"/.dev/branding-assets/",
|
|
106
|
+
`/${workspaceDir}/branding-assets/`
|
|
107
|
+
],
|
|
108
|
+
legacyWorkspaceDirs: LEGACY_WORKSPACE_DIRS
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function moduleConfigPaths(projectRoot) {
|
|
112
|
+
const paths = wphsPaths(projectRoot);
|
|
113
|
+
return {
|
|
114
|
+
moduleConfigDir: paths.moduleConfigDir,
|
|
115
|
+
devDir: paths.devDir,
|
|
116
|
+
localConfigPath: paths.localConfigPath,
|
|
117
|
+
exampleConfigPath: paths.exampleConfigPath,
|
|
118
|
+
assetsDir: paths.assetsDir,
|
|
119
|
+
brandingAssetsUrlPrefix: paths.brandingAssetsUrlPrefix,
|
|
120
|
+
legacyBrandingAssetsUrlPrefix: paths.legacyBrandingAssetsUrlPrefixes[0],
|
|
121
|
+
legacyBrandingAssetsUrlPrefixes: paths.legacyBrandingAssetsUrlPrefixes,
|
|
122
|
+
...paths
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function wphsWorkspaceSubdirs(projectRoot) {
|
|
126
|
+
const p = wphsPaths(projectRoot);
|
|
127
|
+
return [
|
|
128
|
+
p.configDir,
|
|
129
|
+
p.assetsDir,
|
|
130
|
+
p.fixturesDir,
|
|
131
|
+
p.previewFixturesDir,
|
|
132
|
+
p.cacheDir,
|
|
133
|
+
p.auditDir,
|
|
134
|
+
p.baselineDir,
|
|
135
|
+
p.stateDir
|
|
136
|
+
];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// scripts/vite/ensure-dev-kit-shims.js
|
|
140
|
+
import { cpSync, existsSync as existsSync4, lstatSync, mkdirSync, rmSync, symlinkSync } from "fs";
|
|
141
|
+
import { dirname as dirname2, resolve as resolve4 } from "path";
|
|
142
|
+
import { platform } from "os";
|
|
143
|
+
var isWin = platform() === "win32";
|
|
144
|
+
function ensureKitShim(shimPath, target, { directory }) {
|
|
145
|
+
const targetAbs = resolve4(target);
|
|
146
|
+
const shimAbs = resolve4(shimPath);
|
|
147
|
+
try {
|
|
148
|
+
if (existsSync4(shimAbs)) {
|
|
149
|
+
const stat = lstatSync(shimAbs);
|
|
150
|
+
if (stat.isSymbolicLink()) {
|
|
151
|
+
return shimAbs;
|
|
152
|
+
}
|
|
153
|
+
rmSync(shimAbs, { recursive: directory, force: true });
|
|
154
|
+
}
|
|
155
|
+
mkdirSync(dirname2(shimAbs), { recursive: true });
|
|
156
|
+
if (isWin && directory) {
|
|
157
|
+
symlinkSync(targetAbs, shimAbs, "junction");
|
|
158
|
+
return shimAbs;
|
|
159
|
+
}
|
|
160
|
+
symlinkSync(targetAbs, shimAbs, directory ? "dir" : "file");
|
|
161
|
+
return shimAbs;
|
|
162
|
+
} catch {
|
|
163
|
+
try {
|
|
164
|
+
if (existsSync4(shimAbs)) {
|
|
165
|
+
rmSync(shimAbs, { recursive: directory, force: true });
|
|
166
|
+
}
|
|
167
|
+
mkdirSync(dirname2(shimAbs), { recursive: true });
|
|
168
|
+
cpSync(targetAbs, shimAbs, { recursive: directory, force: true });
|
|
169
|
+
return shimAbs;
|
|
170
|
+
} catch {
|
|
171
|
+
return targetAbs;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function ensureDevKitShims(projectRoot, kitRoot2) {
|
|
176
|
+
const { devDir } = moduleConfigPaths(projectRoot);
|
|
177
|
+
const moduleConfigRoot = ensureKitShim(
|
|
178
|
+
resolve4(devDir, ".kit-module-config"),
|
|
179
|
+
resolve4(kitRoot2, "src/dev-module-config"),
|
|
180
|
+
{ directory: true }
|
|
181
|
+
);
|
|
182
|
+
const bootstrapShim = ensureKitShim(
|
|
183
|
+
resolve4(devDir, ".kit-bootstrap.tsx"),
|
|
184
|
+
resolve4(kitRoot2, "src/dev/bootstrap.tsx"),
|
|
185
|
+
{ directory: false }
|
|
186
|
+
);
|
|
187
|
+
const bootstrapGreenfieldShim = ensureKitShim(
|
|
188
|
+
resolve4(devDir, ".kit-bootstrap-greenfield.tsx"),
|
|
189
|
+
resolve4(kitRoot2, "src/dev/bootstrap-greenfield.tsx"),
|
|
190
|
+
{ directory: false }
|
|
191
|
+
);
|
|
192
|
+
return { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// scripts/ensure-wphs-workspace.mjs
|
|
196
|
+
var WPHS_README = `# WoodsCLI workspace (.wphs/)
|
|
197
|
+
|
|
198
|
+
Local state for **WoodsCLI** (\`@woodsportal/hubspot-kit\`). Not shipped to HubSpot.
|
|
199
|
+
|
|
200
|
+
| Path | Purpose |
|
|
201
|
+
|------|---------|
|
|
202
|
+
| \`config/module-config.local.json\` | Live Content/Styles values (gitignored) |
|
|
203
|
+
| \`config/module-config.example.json\` | Example generated from \`fields.json\` |
|
|
204
|
+
| \`assets/branding/\` | Dev-tool uploaded images (gitignored) |
|
|
205
|
+
| \`fixtures/\` | Optional preview / hubspot-data overrides |
|
|
206
|
+
| \`cache/\` | CLI caches (gitignored) |
|
|
207
|
+
| \`audit/baseline/\` | Build parity snapshots (gitignored) |
|
|
208
|
+
| \`.kit-module-config\` | Symlink to kit dev-module-config |
|
|
209
|
+
| \`.kit-bootstrap.tsx\` | Symlink to kit dev bootstrap (full portal) |
|
|
210
|
+
| \`.kit-bootstrap-greenfield.tsx\` | Symlink to kit greenfield dev bootstrap |
|
|
211
|
+
|
|
212
|
+
Run \`wp doctor\` to recreate missing folders.
|
|
213
|
+
`;
|
|
214
|
+
function ensureWphsWorkspace(projectRoot, kitRoot2) {
|
|
215
|
+
const root = projectRoot ?? findProjectRoot();
|
|
216
|
+
const kit = kitRoot2 ?? getKitRoot();
|
|
217
|
+
const paths = wphsPaths(root);
|
|
218
|
+
for (const dir of wphsWorkspaceSubdirs(root)) {
|
|
219
|
+
mkdirSync2(dir, { recursive: true });
|
|
220
|
+
}
|
|
221
|
+
if (!existsSync5(paths.readmePath)) {
|
|
222
|
+
writeFileSync(paths.readmePath, WPHS_README);
|
|
223
|
+
}
|
|
224
|
+
ensureDevKitShims(root, kit);
|
|
225
|
+
return paths;
|
|
226
|
+
}
|
|
227
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
228
|
+
const paths = ensureWphsWorkspace();
|
|
229
|
+
console.log(`[wphs] workspace ready at ${paths.workspaceRoot}`);
|
|
230
|
+
}
|
|
231
|
+
export {
|
|
232
|
+
ensureWphsWorkspace
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=ensure-wphs-workspace-5S3GTO6K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../scripts/ensure-wphs-workspace.mjs","../scripts/project-root.mjs","../scripts/config-files.mjs","../scripts/wphs-paths.mjs","../scripts/vite/ensure-dev-kit-shims.js"],"sourcesContent":["#!/usr/bin/env node\n/**\n * Scaffold WoodsCLI `.wphs/` workspace + kit symlinks.\n */\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\n\nimport { findProjectRoot, getKitRoot } from './project-root.mjs'\nimport { wphsPaths, wphsWorkspaceSubdirs } from './wphs-paths.mjs'\nimport { ensureDevKitShims } from './vite/ensure-dev-kit-shims.js'\n\nconst WPHS_README = `# WoodsCLI workspace (.wphs/)\n\nLocal state for **WoodsCLI** (\\`@woodsportal/hubspot-kit\\`). Not shipped to HubSpot.\n\n| Path | Purpose |\n|------|---------|\n| \\`config/module-config.local.json\\` | Live Content/Styles values (gitignored) |\n| \\`config/module-config.example.json\\` | Example generated from \\`fields.json\\` |\n| \\`assets/branding/\\` | Dev-tool uploaded images (gitignored) |\n| \\`fixtures/\\` | Optional preview / hubspot-data overrides |\n| \\`cache/\\` | CLI caches (gitignored) |\n| \\`audit/baseline/\\` | Build parity snapshots (gitignored) |\n| \\`.kit-module-config\\` | Symlink to kit dev-module-config |\n| \\`.kit-bootstrap.tsx\\` | Symlink to kit dev bootstrap (full portal) |\n| \\`.kit-bootstrap-greenfield.tsx\\` | Symlink to kit greenfield dev bootstrap |\n\nRun \\`wp doctor\\` to recreate missing folders.\n`\n\n/**\n * @param {string} [projectRoot]\n * @param {string} [kitRoot]\n */\nexport function ensureWphsWorkspace(projectRoot, kitRoot) {\n const root = projectRoot ?? findProjectRoot()\n const kit = kitRoot ?? getKitRoot()\n const paths = wphsPaths(root)\n\n for (const dir of wphsWorkspaceSubdirs(root)) {\n mkdirSync(dir, { recursive: true })\n }\n\n if (!existsSync(paths.readmePath)) {\n writeFileSync(paths.readmePath, WPHS_README)\n }\n\n ensureDevKitShims(root, kit)\n return paths\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n const paths = ensureWphsWorkspace()\n console.log(`[wphs] workspace ready at ${paths.workspaceRoot}`)\n}\n","/**\n * Resolve consumer project root (woodscli.json) vs kit package root.\n */\nimport { existsSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { findProjectRootWithConfig } from './config-files.mjs'\n\nconst kitRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..')\n\n/**\n * @param {string} [from]\n */\nexport function findProjectRoot(from = process.cwd()) {\n return findProjectRootWithConfig(from)\n}\n\nexport function getKitRoot() {\n return kitRoot\n}\n\n/**\n * @param {...string} segments\n */\nexport function kitPath(...segments) {\n return resolve(kitRoot, ...segments)\n}\n\nexport { resolveProjectConfigPath, WOODSCLI_CONFIG_FILE, LEGACY_WOODSPORTAL_HS_FILE } from './config-files.mjs'\n","/**\n * Shared project config resolution — `woodscli.json` only.\n */\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport const WOODSCLI_CONFIG_FILE = 'woodscli.json'\nexport const LEGACY_WOODSPORTAL_HS_FILE = 'woodsportal.hs.json'\n\n/**\n * @param {string} projectRoot\n */\nexport function woodscliConfigPath(projectRoot) {\n return resolve(projectRoot, WOODSCLI_CONFIG_FILE)\n}\n\n/**\n * @param {string} projectRoot\n */\nexport function legacyConfigPath(projectRoot) {\n return resolve(projectRoot, LEGACY_WOODSPORTAL_HS_FILE)\n}\n\n/**\n * @param {string} projectRoot\n */\nexport function resolveProjectConfigPath(projectRoot) {\n const fromEnv = process.env.WOODSCLI_CONFIG?.trim() || process.env.WP_HS_CONFIG?.trim() || null\n if (fromEnv) {\n const path = resolve(projectRoot, fromEnv)\n return existsSync(path) ? path : null\n }\n\n const path = woodscliConfigPath(projectRoot)\n return existsSync(path) ? path : null\n}\n\n/**\n * @param {string} [from]\n */\nexport function findProjectRootWithConfig(from = process.cwd()) {\n if (process.env.WP_HS_PROJECT_ROOT?.trim()) {\n return resolve(process.env.WP_HS_PROJECT_ROOT.trim())\n }\n\n let dir = resolve(from)\n while (true) {\n if (resolveProjectConfigPath(dir)) return dir\n const parent = resolve(dir, '..')\n if (parent === dir) return resolve(from)\n dir = parent\n }\n}\n","/**\n * WoodsCLI workspace (`.wphs/`) — single local home for config, assets, fixtures, cache, audit.\n */\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport { findProjectRootWithConfig, resolveProjectConfigPath } from './config-files.mjs'\n\nexport const WPHS_WORKSPACE_DIR = '.wphs'\n\n/** @deprecated use WPHS_WORKSPACE_DIR */\nexport const DEFAULT_MODULE_CONFIG_DIR = WPHS_WORKSPACE_DIR\n\nconst LEGACY_WORKSPACE_DIRS = ['.dev', '.woodsportal']\n\n/**\n * @param {string} [projectRoot]\n */\nexport function readWphsWorkspaceDir(projectRoot) {\n const root = projectRoot ?? findProjectRootWithConfig()\n const configPath = resolveProjectConfigPath(root)\n if (configPath && existsSync(configPath)) {\n try {\n const raw = JSON.parse(readFileSync(configPath, 'utf8'))\n const dir = raw?.dev?.moduleConfigDir\n if (typeof dir === 'string' && dir.trim()) {\n const trimmed = dir.trim()\n if (trimmed !== WPHS_WORKSPACE_DIR) {\n throw new Error(\n `dev.moduleConfigDir must be \"${WPHS_WORKSPACE_DIR}\" (got \"${trimmed}\"). Run wp migrate.`,\n )\n }\n return trimmed\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('moduleConfigDir')) {\n throw error\n }\n }\n }\n return WPHS_WORKSPACE_DIR\n}\n\n/** @deprecated use readWphsWorkspaceDir */\nexport const readModuleConfigDir = readWphsWorkspaceDir\n\n/**\n * @param {string} projectRoot\n */\nexport function wphsPaths(projectRoot) {\n const workspaceDir = readWphsWorkspaceDir(projectRoot)\n const workspaceRoot = resolve(projectRoot, workspaceDir)\n return {\n workspaceDir,\n moduleConfigDir: workspaceDir,\n workspaceRoot,\n devDir: workspaceRoot,\n configDir: join(workspaceRoot, 'config'),\n localConfigPath: join(workspaceRoot, 'config', 'module-config.local.json'),\n exampleConfigPath: join(workspaceRoot, 'config', 'module-config.example.json'),\n assetsDir: join(workspaceRoot, 'assets', 'branding'),\n fixturesDir: join(workspaceRoot, 'fixtures'),\n hubspotDataFixturePath: join(workspaceRoot, 'fixtures', 'hubspot-data.json'),\n previewFixturesDir: join(workspaceRoot, 'fixtures', 'preview'),\n cacheDir: join(workspaceRoot, 'cache'),\n auditDir: join(workspaceRoot, 'audit'),\n baselineDir: join(workspaceRoot, 'audit', 'baseline'),\n stateDir: join(workspaceRoot, 'state'),\n kitModuleConfigLink: join(workspaceRoot, '.kit-module-config'),\n kitBootstrapLink: join(workspaceRoot, '.kit-bootstrap.tsx'),\n kitBootstrapGreenfieldLink: join(workspaceRoot, '.kit-bootstrap-greenfield.tsx'),\n readmePath: join(workspaceRoot, 'README.md'),\n brandingAssetsUrlPrefix: `/${workspaceDir}/assets/branding/`,\n legacyBrandingAssetsUrlPrefixes: [\n '/dev/branding-assets/',\n '/.dev/branding-assets/',\n `/${workspaceDir}/branding-assets/`,\n ],\n legacyWorkspaceDirs: LEGACY_WORKSPACE_DIRS,\n }\n}\n\n/** @deprecated use wphsPaths */\nexport function moduleConfigPaths(projectRoot) {\n const paths = wphsPaths(projectRoot)\n return {\n moduleConfigDir: paths.moduleConfigDir,\n devDir: paths.devDir,\n localConfigPath: paths.localConfigPath,\n exampleConfigPath: paths.exampleConfigPath,\n assetsDir: paths.assetsDir,\n brandingAssetsUrlPrefix: paths.brandingAssetsUrlPrefix,\n legacyBrandingAssetsUrlPrefix: paths.legacyBrandingAssetsUrlPrefixes[0],\n legacyBrandingAssetsUrlPrefixes: paths.legacyBrandingAssetsUrlPrefixes,\n ...paths,\n }\n}\n\n/**\n * Subdirectories created by wp doctor / wp init.\n * @param {string} projectRoot\n * @returns {string[]}\n */\nexport function wphsWorkspaceSubdirs(projectRoot) {\n const p = wphsPaths(projectRoot)\n return [\n p.configDir,\n p.assetsDir,\n p.fixturesDir,\n p.previewFixturesDir,\n p.cacheDir,\n p.auditDir,\n p.baselineDir,\n p.stateDir,\n ]\n}\n","import { cpSync, existsSync, lstatSync, mkdirSync, rmSync, symlinkSync } from 'node:fs'\nimport { dirname, resolve } from 'node:path'\nimport { platform } from 'node:os'\n\nimport { moduleConfigPaths } from '../module-config-dir.mjs'\n\nconst isWin = platform() === 'win32'\n\n/**\n * Link or copy kit dev sources into `.wphs/` so Vite serves them in-project.\n * Windows: directory junctions (no admin) and file copy fallback — symlinks often fail with EPERM.\n */\nexport function ensureKitShim(shimPath, target, { directory }) {\n const targetAbs = resolve(target)\n const shimAbs = resolve(shimPath)\n\n try {\n if (existsSync(shimAbs)) {\n const stat = lstatSync(shimAbs)\n if (stat.isSymbolicLink()) {\n return shimAbs\n }\n rmSync(shimAbs, { recursive: directory, force: true })\n }\n\n mkdirSync(dirname(shimAbs), { recursive: true })\n\n if (isWin && directory) {\n symlinkSync(targetAbs, shimAbs, 'junction')\n return shimAbs\n }\n\n symlinkSync(targetAbs, shimAbs, directory ? 'dir' : 'file')\n return shimAbs\n } catch {\n try {\n if (existsSync(shimAbs)) {\n rmSync(shimAbs, { recursive: directory, force: true })\n }\n mkdirSync(dirname(shimAbs), { recursive: true })\n cpSync(targetAbs, shimAbs, { recursive: directory, force: true })\n return shimAbs\n } catch {\n return targetAbs\n }\n }\n}\n\n/**\n * Symlink kit dev sources into the consumer repo so Vite serves them in-root\n * (avoids @fs/ + broken react/jsx-dev-runtime / react-dom CJS interop).\n */\nexport function ensureDevKitShims(projectRoot, kitRoot) {\n const { devDir } = moduleConfigPaths(projectRoot)\n\n const moduleConfigRoot = ensureKitShim(\n resolve(devDir, '.kit-module-config'),\n resolve(kitRoot, 'src/dev-module-config'),\n { directory: true },\n )\n\n const bootstrapShim = ensureKitShim(\n resolve(devDir, '.kit-bootstrap.tsx'),\n resolve(kitRoot, 'src/dev/bootstrap.tsx'),\n { directory: false },\n )\n\n const bootstrapGreenfieldShim = ensureKitShim(\n resolve(devDir, '.kit-bootstrap-greenfield.tsx'),\n resolve(kitRoot, 'src/dev/bootstrap-greenfield.tsx'),\n { directory: false },\n )\n\n return { moduleConfigRoot, bootstrapShim, bootstrapGreenfieldShim }\n}\n\n/** @deprecated use ensureDevKitShims */\nexport function ensureDevModuleConfigShim(projectRoot, kitRoot) {\n return ensureDevKitShims(projectRoot, kitRoot).moduleConfigRoot\n}\n"],"mappings":"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","names":["existsSync","mkdirSync","existsSync","resolve","path","resolve","existsSync","resolve","existsSync","resolve","existsSync","dirname","resolve","resolve","existsSync","dirname","kitRoot","kitRoot","mkdirSync","existsSync"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -94,10 +94,18 @@ declare const WoodsPortalHsSchema: z.ZodObject<{
|
|
|
94
94
|
scaffold: z.ZodOptional<z.ZodObject<{
|
|
95
95
|
/** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */
|
|
96
96
|
router: z.ZodDefault<z.ZodEnum<["hash", "browser", "none"]>>;
|
|
97
|
+
/** Portal user auth tier (module templates only) */
|
|
98
|
+
auth: z.ZodDefault<z.ZodEnum<["none", "starter", "sso", "full"]>>;
|
|
99
|
+
/** Authenticated shell navigation — only when auth ≠ none */
|
|
100
|
+
nav: z.ZodOptional<z.ZodDefault<z.ZodEnum<["top", "sidebar"]>>>;
|
|
97
101
|
}, "strip", z.ZodTypeAny, {
|
|
98
102
|
router: "none" | "hash" | "browser";
|
|
103
|
+
auth: "none" | "starter" | "sso" | "full";
|
|
104
|
+
nav?: "top" | "sidebar" | undefined;
|
|
99
105
|
}, {
|
|
100
106
|
router?: "none" | "hash" | "browser" | undefined;
|
|
107
|
+
auth?: "none" | "starter" | "sso" | "full" | undefined;
|
|
108
|
+
nav?: "top" | "sidebar" | undefined;
|
|
101
109
|
}>>;
|
|
102
110
|
}, "strip", z.ZodTypeAny, {
|
|
103
111
|
configVersion: number;
|
|
@@ -136,6 +144,8 @@ declare const WoodsPortalHsSchema: z.ZodObject<{
|
|
|
136
144
|
} | undefined;
|
|
137
145
|
scaffold?: {
|
|
138
146
|
router: "none" | "hash" | "browser";
|
|
147
|
+
auth: "none" | "starter" | "sso" | "full";
|
|
148
|
+
nav?: "top" | "sidebar" | undefined;
|
|
139
149
|
} | undefined;
|
|
140
150
|
}, {
|
|
141
151
|
projectType: "module-hybrid-cdn" | "module-monolith" | "theme-starter";
|
|
@@ -174,6 +184,8 @@ declare const WoodsPortalHsSchema: z.ZodObject<{
|
|
|
174
184
|
} | undefined;
|
|
175
185
|
scaffold?: {
|
|
176
186
|
router?: "none" | "hash" | "browser" | undefined;
|
|
187
|
+
auth?: "none" | "starter" | "sso" | "full" | undefined;
|
|
188
|
+
nav?: "top" | "sidebar" | undefined;
|
|
177
189
|
} | undefined;
|
|
178
190
|
}>;
|
|
179
191
|
type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>;
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
getViteConfigPath,
|
|
9
9
|
kitPath,
|
|
10
10
|
resolveProjectConfig
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-NWBK3XBZ.js";
|
|
12
12
|
|
|
13
13
|
// src/schema/woodsportal-hs.ts
|
|
14
14
|
import { z } from "zod";
|
|
@@ -52,7 +52,11 @@ var WoodsPortalHsSchema = z.object({
|
|
|
52
52
|
}).default({}),
|
|
53
53
|
scaffold: z.object({
|
|
54
54
|
/** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */
|
|
55
|
-
router: z.enum(["hash", "browser", "none"]).default("hash")
|
|
55
|
+
router: z.enum(["hash", "browser", "none"]).default("hash"),
|
|
56
|
+
/** Portal user auth tier (module templates only) */
|
|
57
|
+
auth: z.enum(["none", "starter", "sso", "full"]).default("none"),
|
|
58
|
+
/** Authenticated shell navigation — only when auth ≠ none */
|
|
59
|
+
nav: z.enum(["top", "sidebar"]).default("top").optional()
|
|
56
60
|
}).optional()
|
|
57
61
|
});
|
|
58
62
|
var DEFAULT_WOODSPORTAL_HS = {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schema/woodsportal-hs.ts","../src/lib/config.ts","../src/adapters/types.ts","../src/lib/generic-field-mapper.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.module-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n /** Monolith production IIFE entry (wp build --hubspot-only) */\n module: z.string().default('src/hubspot/module-entry.tsx'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n scaffold: z\n .object({\n /** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */\n router: z.enum(['hash', 'browser', 'none']).default('hash'),\n })\n .optional(),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.module-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n module: 'src/hubspot/module-entry.tsx',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","/** Must match dev-module-config/schema/types.ts */\nexport const MODULE_CONFIG_CHANGED = 'woodsportal:module-config-changed'\n\nexport type ModuleConfigBuiltState = {\n built: Record<string, unknown>\n}\n\n/** WoodsCLI consumer hook — mount app + sync module-config live data. */\nexport interface HubSpotKitAdapter {\n syncLiveData(built: Record<string, unknown>): void\n getDefaultHubSpotData?(): Record<string, unknown>\n mountDevApp?(root: unknown): void | Promise<void>\n}\n\nexport function bindAdapterToModuleConfig(adapter: HubSpotKitAdapter): void {\n if (typeof globalThis.window === 'undefined') return\n globalThis.window.addEventListener(MODULE_CONFIG_CHANGED, (event: Event) => {\n const detail = (event as CustomEvent<ModuleConfigBuiltState>).detail\n adapter.syncLiveData(detail.built)\n })\n}\n\nexport function syncAdapterFromModuleState(\n adapter: HubSpotKitAdapter,\n state: ModuleConfigBuiltState,\n): void {\n adapter.syncLiveData(state.built)\n}\n\n/** Minimal adapter for greenfield templates without a full app. */\nexport const defaultHubSpotKitAdapter: HubSpotKitAdapter = {\n syncLiveData(built) {\n const w = globalThis as typeof globalThis & { __WPHS_DATA__?: Record<string, unknown> }\n w.__WPHS_DATA__ = built\n },\n getDefaultHubSpotData() {\n return {}\n },\n}\n","/**\n * Generic fields.json → flat runtime object (WoodsCLI default transform).\n */\nexport type GenericFieldDefinition = {\n name: string\n type: string\n default?: unknown\n children?: GenericFieldDefinition[]\n}\n\nexport type GenericFieldValues = Record<string, unknown>\n\nfunction flattenField(\n field: GenericFieldDefinition,\n values: GenericFieldValues,\n out: Record<string, unknown>,\n): void {\n const key = field.name\n const value = values[key]\n\n if (field.type === 'group' && field.children && value && typeof value === 'object') {\n const groupValues = value as GenericFieldValues\n for (const child of field.children) {\n flattenField(child, groupValues, out)\n }\n return\n }\n\n if (field.type === 'repeater' && Array.isArray(value)) {\n out[key] = value\n return\n }\n\n out[key] = value ?? field.default ?? null\n}\n\nexport function mapFieldsToRuntime(\n schema: GenericFieldDefinition[],\n values: GenericFieldValues,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const field of schema) {\n flattenField(field, values, out)\n }\n return out\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/schema/woodsportal-hs.ts","../src/lib/config.ts","../src/adapters/types.ts","../src/lib/generic-field-mapper.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const CONFIG_VERSION = 1\n\nexport const WPHS_WORKSPACE_DIR = '.wphs' as const\n\nexport const WoodsPortalHsSchema = z.object({\n configVersion: z.number().int().default(CONFIG_VERSION),\n projectType: z.enum(['module-hybrid-cdn', 'module-monolith', 'theme-starter']),\n module: z.object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n outDir: z.string().default('dist/WoodsPortal.Module'),\n }),\n theme: z\n .object({\n name: z.string().min(1),\n uploadPath: z.string().min(1),\n srcDir: z.string().default('src/theme'),\n themeJson: z.string().default('src/theme/theme.json'),\n })\n .optional(),\n cdn: z\n .object({\n mode: z.enum(['jsdelivr', 'custom', 'local', 'none']).default('jsdelivr'),\n buildIdFile: z.string().default('.module-build-id'),\n mirror: z.string().default('portal.cdn.json'),\n })\n .default({}),\n entries: z\n .object({\n app: z.string().default('src/cdn/app-entry.ts'),\n vendor: z.string().default('src/cdn/vendor-entry.ts'),\n hubspotBootstrap: z.string().default('src/hubspot/bootstrap.ts'),\n /** Monolith production IIFE entry (wp build --hubspot-only) */\n module: z.string().default('src/hubspot/module-entry.tsx'),\n localDev: z.string().default('src/main.tsx'),\n })\n .default({}),\n env: z\n .object({\n tiers: z.array(z.enum(['dev', 'stg', 'prod'])).default(['dev', 'stg', 'prod']),\n })\n .default({}),\n dev: z\n .object({\n moduleConfigDir: z.literal(WPHS_WORKSPACE_DIR).default(WPHS_WORKSPACE_DIR),\n adapter: z.string().default('./wphs.adapter.ts'),\n fieldsJson: z.string().default('public/fields.json'),\n themeFieldsJson: z.string().optional(),\n })\n .default({}),\n scaffold: z\n .object({\n /** hash = woodsportal-client-frontend (HubSpot CMS); browser = local clean URLs; none = single page */\n router: z.enum(['hash', 'browser', 'none']).default('hash'),\n /** Portal user auth tier (module templates only) */\n auth: z.enum(['none', 'starter', 'sso', 'full']).default('none'),\n /** Authenticated shell navigation — only when auth ≠ none */\n nav: z.enum(['top', 'sidebar']).default('top').optional(),\n })\n .optional(),\n})\n\nexport type WoodsPortalHsConfig = z.infer<typeof WoodsPortalHsSchema>\n\nexport const DEFAULT_WOODSPORTAL_HS: WoodsPortalHsConfig = {\n configVersion: CONFIG_VERSION,\n projectType: 'module-hybrid-cdn',\n module: {\n name: 'woodsportal-module',\n uploadPath: 'dw-modules/woodsportal-module.module',\n outDir: 'dist/WoodsPortal.Module',\n },\n cdn: {\n mode: 'jsdelivr',\n buildIdFile: '.module-build-id',\n mirror: 'portal.cdn.json',\n },\n entries: {\n app: 'src/cdn/app-entry.ts',\n vendor: 'src/cdn/vendor-entry.ts',\n hubspotBootstrap: 'src/hubspot/bootstrap.ts',\n module: 'src/hubspot/module-entry.tsx',\n localDev: 'src/main.tsx',\n },\n env: {\n tiers: ['dev', 'stg', 'prod'],\n },\n dev: {\n moduleConfigDir: WPHS_WORKSPACE_DIR,\n adapter: './wphs.adapter.ts',\n fieldsJson: 'public/fields.json',\n },\n}\n\nexport function isModuleProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' || config.projectType === 'module-monolith'\n}\n\nexport function isThemeProject(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'theme-starter'\n}\n\nexport function usesCdnPipeline(config: WoodsPortalHsConfig): boolean {\n return config.projectType === 'module-hybrid-cdn' && config.cdn.mode !== 'none'\n}\n","import { readFileSync } from 'node:fs'\n\nimport {\n resolveProjectConfig,\n WOODSCLI_CONFIG_FILE,\n} from './config-files.js'\nimport { WoodsPortalHsSchema, type WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { WpHsError, ExitCode } from './errors.js'\nimport { findProjectRoot } from './paths.js'\n\nexport type LoadedProjectConfig = {\n root: string\n config: WoodsPortalHsConfig\n configPath: string\n configFileName: string\n}\n\nexport function loadConfig(projectRoot?: string): LoadedProjectConfig {\n const root = projectRoot ?? findProjectRoot()\n const resolved = resolveProjectConfig(root)\n\n if (!resolved) {\n throw new WpHsError(`Missing ${WOODSCLI_CONFIG_FILE}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp init. Legacy woodsportal.hs.json → run wp migrate --yes.',\n })\n }\n\n let raw: unknown\n try {\n raw = JSON.parse(readFileSync(resolved.path, 'utf8'))\n } catch (cause) {\n throw new WpHsError(`Invalid JSON in ${resolved.fileName}`, {\n exitCode: ExitCode.USER_ERROR,\n cause,\n })\n }\n\n const parsed = WoodsPortalHsSchema.safeParse(raw)\n if (!parsed.success) {\n throw new WpHsError(`${resolved.fileName} validation failed: ${parsed.error.message}`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Run wp config validate for details.',\n })\n }\n\n return {\n root,\n config: parsed.data,\n configPath: resolved.path,\n configFileName: resolved.fileName,\n }\n}\n\nexport function validateConfigFile(projectRoot?: string): {\n valid: boolean\n errors: string[]\n config?: WoodsPortalHsConfig\n} {\n try {\n const { config } = loadConfig(projectRoot)\n return { valid: true, errors: [], config }\n } catch (error) {\n if (error instanceof WpHsError) {\n return { valid: false, errors: [error.message] }\n }\n return { valid: false, errors: [String(error)] }\n }\n}\n","/** Must match dev-module-config/schema/types.ts */\nexport const MODULE_CONFIG_CHANGED = 'woodsportal:module-config-changed'\n\nexport type ModuleConfigBuiltState = {\n built: Record<string, unknown>\n}\n\n/** WoodsCLI consumer hook — mount app + sync module-config live data. */\nexport interface HubSpotKitAdapter {\n syncLiveData(built: Record<string, unknown>): void\n getDefaultHubSpotData?(): Record<string, unknown>\n mountDevApp?(root: unknown): void | Promise<void>\n}\n\nexport function bindAdapterToModuleConfig(adapter: HubSpotKitAdapter): void {\n if (typeof globalThis.window === 'undefined') return\n globalThis.window.addEventListener(MODULE_CONFIG_CHANGED, (event: Event) => {\n const detail = (event as CustomEvent<ModuleConfigBuiltState>).detail\n adapter.syncLiveData(detail.built)\n })\n}\n\nexport function syncAdapterFromModuleState(\n adapter: HubSpotKitAdapter,\n state: ModuleConfigBuiltState,\n): void {\n adapter.syncLiveData(state.built)\n}\n\n/** Minimal adapter for greenfield templates without a full app. */\nexport const defaultHubSpotKitAdapter: HubSpotKitAdapter = {\n syncLiveData(built) {\n const w = globalThis as typeof globalThis & { __WPHS_DATA__?: Record<string, unknown> }\n w.__WPHS_DATA__ = built\n },\n getDefaultHubSpotData() {\n return {}\n },\n}\n","/**\n * Generic fields.json → flat runtime object (WoodsCLI default transform).\n */\nexport type GenericFieldDefinition = {\n name: string\n type: string\n default?: unknown\n children?: GenericFieldDefinition[]\n}\n\nexport type GenericFieldValues = Record<string, unknown>\n\nfunction flattenField(\n field: GenericFieldDefinition,\n values: GenericFieldValues,\n out: Record<string, unknown>,\n): void {\n const key = field.name\n const value = values[key]\n\n if (field.type === 'group' && field.children && value && typeof value === 'object') {\n const groupValues = value as GenericFieldValues\n for (const child of field.children) {\n flattenField(child, groupValues, out)\n }\n return\n }\n\n if (field.type === 'repeater' && Array.isArray(value)) {\n out[key] = value\n return\n }\n\n out[key] = value ?? field.default ?? null\n}\n\nexport function mapFieldsToRuntime(\n schema: GenericFieldDefinition[],\n values: GenericFieldValues,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const field of schema) {\n flattenField(field, values, out)\n }\n return out\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
isModuleProject,
|
|
4
|
+
isThemeProject,
|
|
5
|
+
normalizePageSlug,
|
|
6
|
+
regenerateRouteTree,
|
|
7
|
+
removeNavItemsEntry,
|
|
8
|
+
resolveProjectNavConfig,
|
|
9
|
+
slugToCamelCase,
|
|
10
|
+
slugToPascalCase
|
|
11
|
+
} from "./chunk-WHYTQEZX.js";
|
|
12
|
+
import {
|
|
13
|
+
ExitCode,
|
|
14
|
+
WpHsError
|
|
15
|
+
} from "./chunk-4GOJPOW3.js";
|
|
16
|
+
|
|
17
|
+
// src/lib/scaffold-page-lifecycle.ts
|
|
18
|
+
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs";
|
|
19
|
+
import { resolve } from "path";
|
|
20
|
+
var BUILTIN_ROUTE_KEYS = /* @__PURE__ */ new Set([
|
|
21
|
+
"home",
|
|
22
|
+
"guide",
|
|
23
|
+
"login",
|
|
24
|
+
"twoFa",
|
|
25
|
+
"unauthorized",
|
|
26
|
+
"ssoLogin",
|
|
27
|
+
"portal",
|
|
28
|
+
"app"
|
|
29
|
+
]);
|
|
30
|
+
function assertModuleWithRouter(config) {
|
|
31
|
+
if (isThemeProject(config)) {
|
|
32
|
+
throw new WpHsError("wp page is only supported for module projects.", {
|
|
33
|
+
exitCode: ExitCode.USER_ERROR
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (!isModuleProject(config)) {
|
|
37
|
+
throw new WpHsError("wp page requires a module project.", { exitCode: ExitCode.USER_ERROR });
|
|
38
|
+
}
|
|
39
|
+
if ((config.scaffold?.router ?? "hash") === "none") {
|
|
40
|
+
throw new WpHsError("wp page requires client-side routing.", {
|
|
41
|
+
exitCode: ExitCode.USER_ERROR
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function routesConfigPath(projectRoot) {
|
|
46
|
+
const path = resolve(projectRoot, "src/config/routes.ts");
|
|
47
|
+
if (!existsSync(path)) {
|
|
48
|
+
throw new WpHsError("Missing src/config/routes.ts", { exitCode: ExitCode.USER_ERROR });
|
|
49
|
+
}
|
|
50
|
+
return path;
|
|
51
|
+
}
|
|
52
|
+
function parseRoutePaths(routesFile) {
|
|
53
|
+
const content = readFileSync(routesFile, "utf8");
|
|
54
|
+
const entries = {};
|
|
55
|
+
const pattern = /^\s*([a-zA-Z][a-zA-Z0-9_]*)\s*:\s*'([^']*)'/gm;
|
|
56
|
+
for (const match of content.matchAll(pattern)) {
|
|
57
|
+
entries[match[1]] = match[2];
|
|
58
|
+
}
|
|
59
|
+
return entries;
|
|
60
|
+
}
|
|
61
|
+
function navContainsRoutesKey(projectRoot, routesKey) {
|
|
62
|
+
const navConfig = resolveProjectNavConfig(projectRoot);
|
|
63
|
+
if (!navConfig) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const content = readFileSync(navConfig.filePath, "utf8");
|
|
67
|
+
return new RegExp(`\\.${routesKey}\\b`).test(content);
|
|
68
|
+
}
|
|
69
|
+
function detectPageAccess(projectRoot, slug) {
|
|
70
|
+
const protectedRoute = resolve(projectRoot, "src/routes/_app", `${slug}.tsx`);
|
|
71
|
+
if (existsSync(protectedRoute)) {
|
|
72
|
+
return "protected";
|
|
73
|
+
}
|
|
74
|
+
return "public";
|
|
75
|
+
}
|
|
76
|
+
function listScaffoldedPages(projectRoot, config) {
|
|
77
|
+
assertModuleWithRouter(config);
|
|
78
|
+
const pagesDir = resolve(projectRoot, "src/features/pages");
|
|
79
|
+
if (!existsSync(pagesDir)) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const routesFile = routesConfigPath(projectRoot);
|
|
83
|
+
const routePaths = parseRoutePaths(routesFile);
|
|
84
|
+
const pages = [];
|
|
85
|
+
for (const file of readdirSync(pagesDir)) {
|
|
86
|
+
if (!file.endsWith("-page.tsx")) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const slug = file.replace(/-page\.tsx$/, "");
|
|
90
|
+
const routesKey = slugToCamelCase(slug);
|
|
91
|
+
if (BUILTIN_ROUTE_KEYS.has(routesKey)) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const access = detectPageAccess(projectRoot, slug);
|
|
95
|
+
const routeRelative = access === "protected" ? `src/routes/_app/${slug}.tsx` : `src/routes/${slug}.tsx`;
|
|
96
|
+
pages.push({
|
|
97
|
+
slug,
|
|
98
|
+
routesKey,
|
|
99
|
+
path: routePaths[routesKey] ?? `/${slug}`,
|
|
100
|
+
access,
|
|
101
|
+
routeFile: routeRelative,
|
|
102
|
+
pageFile: `src/features/pages/${slug}-page.tsx`,
|
|
103
|
+
inNav: navContainsRoutesKey(projectRoot, routesKey)
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return pages.sort((a, b) => a.slug.localeCompare(b.slug));
|
|
107
|
+
}
|
|
108
|
+
function removeRoutesKeyFromFile(routesFile, routesKey) {
|
|
109
|
+
const content = readFileSync(routesFile, "utf8");
|
|
110
|
+
const linePattern = new RegExp(`^\\s*${routesKey}\\s*:\\s*'[^']*',?\\n`, "m");
|
|
111
|
+
const updated = content.replace(linePattern, "");
|
|
112
|
+
if (updated === content) {
|
|
113
|
+
throw new WpHsError(`Routes key "${routesKey}" not found in src/config/routes.ts.`, {
|
|
114
|
+
exitCode: ExitCode.USER_ERROR
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
writeFileSync(routesFile, updated);
|
|
118
|
+
}
|
|
119
|
+
function removePagesBarrelExport(projectRoot, slug, componentName) {
|
|
120
|
+
const barrelPath = resolve(projectRoot, "src/features/pages/index.ts");
|
|
121
|
+
if (!existsSync(barrelPath)) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const exportLine = `export { ${componentName} } from './${slug}-page'`;
|
|
125
|
+
const content = readFileSync(barrelPath, "utf8");
|
|
126
|
+
const updated = content.split("\n").filter((line) => line.trim() !== exportLine).join("\n").replace(/\n{3,}/g, "\n\n").trimEnd();
|
|
127
|
+
if (updated) {
|
|
128
|
+
writeFileSync(barrelPath, `${updated}
|
|
129
|
+
`);
|
|
130
|
+
} else {
|
|
131
|
+
rmSync(barrelPath);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function removeScaffoldedPage(input) {
|
|
135
|
+
assertModuleWithRouter(input.config);
|
|
136
|
+
const slug = normalizePageSlug(input.slug);
|
|
137
|
+
const routesKey = slugToCamelCase(slug);
|
|
138
|
+
const componentName = `${slugToPascalCase(slug)}Page`;
|
|
139
|
+
if (BUILTIN_ROUTE_KEYS.has(routesKey)) {
|
|
140
|
+
throw new WpHsError(`Cannot remove built-in route key "${routesKey}".`, {
|
|
141
|
+
exitCode: ExitCode.USER_ERROR
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
const pageFile = resolve(input.projectRoot, "src/features/pages", `${slug}-page.tsx`);
|
|
145
|
+
const access = detectPageAccess(input.projectRoot, slug);
|
|
146
|
+
const routeRelative = access === "protected" ? `src/routes/_app/${slug}.tsx` : `src/routes/${slug}.tsx`;
|
|
147
|
+
const routeFile = resolve(input.projectRoot, routeRelative);
|
|
148
|
+
if (!existsSync(pageFile)) {
|
|
149
|
+
throw new WpHsError(`Scaffolded page not found: src/features/pages/${slug}-page.tsx`, {
|
|
150
|
+
exitCode: ExitCode.USER_ERROR,
|
|
151
|
+
remediation: "Use wp page list to see scaffolded pages."
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
if (input.dryRun) {
|
|
155
|
+
input.logger?.info(`[dry-run] Would remove ${routeRelative} and src/features/pages/${slug}-page.tsx`);
|
|
156
|
+
return {
|
|
157
|
+
slug,
|
|
158
|
+
removedRoute: routeRelative,
|
|
159
|
+
removedPage: `src/features/pages/${slug}-page.tsx`,
|
|
160
|
+
routeTreeRegenerated: false
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const { projectRoot } = input;
|
|
164
|
+
rmSync(pageFile);
|
|
165
|
+
if (existsSync(routeFile)) {
|
|
166
|
+
rmSync(routeFile);
|
|
167
|
+
}
|
|
168
|
+
removeRoutesKeyFromFile(routesConfigPath(projectRoot), routesKey);
|
|
169
|
+
removePagesBarrelExport(projectRoot, slug, componentName);
|
|
170
|
+
const navConfig = resolveProjectNavConfig(projectRoot);
|
|
171
|
+
if (input.removeFromNav !== false && navConfig && navContainsRoutesKey(projectRoot, routesKey)) {
|
|
172
|
+
try {
|
|
173
|
+
removeNavItemsEntry(navConfig, routesKey);
|
|
174
|
+
} catch {
|
|
175
|
+
input.logger?.warn(`Nav entry for "${routesKey}" was not removed \u2014 edit ${navConfig.relativePath} manually.`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const regen = regenerateRouteTree(projectRoot, { logger: input.logger, dryRun: input.dryRun });
|
|
179
|
+
if (regen.warning) {
|
|
180
|
+
input.logger?.warn(regen.warning);
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
slug,
|
|
184
|
+
removedRoute: routeRelative,
|
|
185
|
+
removedPage: `src/features/pages/${slug}-page.tsx`,
|
|
186
|
+
routeTreeRegenerated: regen.ok,
|
|
187
|
+
routeTreeWarning: regen.warning
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export {
|
|
191
|
+
listScaffoldedPages,
|
|
192
|
+
removeScaffoldedPage
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=scaffold-page-lifecycle-EHMPWPPE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/scaffold-page-lifecycle.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport type { WoodsPortalHsConfig } from '../schema/woodsportal-hs.js'\nimport { isModuleProject, isThemeProject } from '../schema/woodsportal-hs.js'\nimport { ExitCode, WpHsError } from './errors.js'\nimport type { Logger } from './logger.js'\nimport {\n removeNavItemsEntry,\n resolveProjectNavConfig,\n} from './project-nav-config.js'\nimport { regenerateRouteTree } from './regenerate-route-tree.js'\nimport {\n normalizePageSlug,\n type PageAccess,\n slugToCamelCase,\n slugToPascalCase,\n} from './scaffold-page.js'\n\nexport type ListedPage = {\n slug: string\n routesKey: string\n path: string\n access: PageAccess\n routeFile: string\n pageFile: string\n inNav: boolean\n}\n\nconst BUILTIN_ROUTE_KEYS = new Set([\n 'home',\n 'guide',\n 'login',\n 'twoFa',\n 'unauthorized',\n 'ssoLogin',\n 'portal',\n 'app',\n])\n\nfunction assertModuleWithRouter(config: WoodsPortalHsConfig): void {\n if (isThemeProject(config)) {\n throw new WpHsError('wp page is only supported for module projects.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n if (!isModuleProject(config)) {\n throw new WpHsError('wp page requires a module project.', { exitCode: ExitCode.USER_ERROR })\n }\n if ((config.scaffold?.router ?? 'hash') === 'none') {\n throw new WpHsError('wp page requires client-side routing.', {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n}\n\nfunction routesConfigPath(projectRoot: string): string {\n const path = resolve(projectRoot, 'src/config/routes.ts')\n if (!existsSync(path)) {\n throw new WpHsError('Missing src/config/routes.ts', { exitCode: ExitCode.USER_ERROR })\n }\n return path\n}\n\nfunction parseRoutePaths(routesFile: string): Record<string, string> {\n const content = readFileSync(routesFile, 'utf8')\n const entries: Record<string, string> = {}\n const pattern = /^\\s*([a-zA-Z][a-zA-Z0-9_]*)\\s*:\\s*'([^']*)'/gm\n for (const match of content.matchAll(pattern)) {\n entries[match[1]] = match[2]\n }\n return entries\n}\n\nfunction navContainsRoutesKey(projectRoot: string, routesKey: string): boolean {\n const navConfig = resolveProjectNavConfig(projectRoot)\n if (!navConfig) {\n return false\n }\n const content = readFileSync(navConfig.filePath, 'utf8')\n return new RegExp(`\\\\.${routesKey}\\\\b`).test(content)\n}\n\nfunction detectPageAccess(projectRoot: string, slug: string): PageAccess {\n const protectedRoute = resolve(projectRoot, 'src/routes/_app', `${slug}.tsx`)\n if (existsSync(protectedRoute)) {\n return 'protected'\n }\n return 'public'\n}\n\nexport function listScaffoldedPages(projectRoot: string, config: WoodsPortalHsConfig): ListedPage[] {\n assertModuleWithRouter(config)\n\n const pagesDir = resolve(projectRoot, 'src/features/pages')\n if (!existsSync(pagesDir)) {\n return []\n }\n\n const routesFile = routesConfigPath(projectRoot)\n const routePaths = parseRoutePaths(routesFile)\n\n const pages: ListedPage[] = []\n for (const file of readdirSync(pagesDir)) {\n if (!file.endsWith('-page.tsx')) {\n continue\n }\n const slug = file.replace(/-page\\.tsx$/, '')\n const routesKey = slugToCamelCase(slug)\n if (BUILTIN_ROUTE_KEYS.has(routesKey)) {\n continue\n }\n\n const access = detectPageAccess(projectRoot, slug)\n const routeRelative =\n access === 'protected' ? `src/routes/_app/${slug}.tsx` : `src/routes/${slug}.tsx`\n\n pages.push({\n slug,\n routesKey,\n path: routePaths[routesKey] ?? `/${slug}`,\n access,\n routeFile: routeRelative,\n pageFile: `src/features/pages/${slug}-page.tsx`,\n inNav: navContainsRoutesKey(projectRoot, routesKey),\n })\n }\n\n return pages.sort((a, b) => a.slug.localeCompare(b.slug))\n}\n\nfunction removeRoutesKeyFromFile(routesFile: string, routesKey: string): void {\n const content = readFileSync(routesFile, 'utf8')\n const linePattern = new RegExp(`^\\\\s*${routesKey}\\\\s*:\\\\s*'[^']*',?\\\\n`, 'm')\n const updated = content.replace(linePattern, '')\n if (updated === content) {\n throw new WpHsError(`Routes key \"${routesKey}\" not found in src/config/routes.ts.`, {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n writeFileSync(routesFile, updated)\n}\n\nfunction removePagesBarrelExport(projectRoot: string, slug: string, componentName: string): void {\n const barrelPath = resolve(projectRoot, 'src/features/pages/index.ts')\n if (!existsSync(barrelPath)) {\n return\n }\n const exportLine = `export { ${componentName} } from './${slug}-page'`\n const content = readFileSync(barrelPath, 'utf8')\n const updated = content\n .split('\\n')\n .filter((line) => line.trim() !== exportLine)\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trimEnd()\n if (updated) {\n writeFileSync(barrelPath, `${updated}\\n`)\n } else {\n rmSync(barrelPath)\n }\n}\n\nexport type RemovePageInput = {\n projectRoot: string\n config: WoodsPortalHsConfig\n slug: string\n removeFromNav?: boolean\n dryRun?: boolean\n logger?: Logger\n}\n\nexport type RemovePageResult = {\n slug: string\n removedRoute: string\n removedPage: string\n routeTreeRegenerated: boolean\n routeTreeWarning?: string\n}\n\nexport function removeScaffoldedPage(input: RemovePageInput): RemovePageResult {\n assertModuleWithRouter(input.config)\n\n const slug = normalizePageSlug(input.slug)\n const routesKey = slugToCamelCase(slug)\n const componentName = `${slugToPascalCase(slug)}Page`\n\n if (BUILTIN_ROUTE_KEYS.has(routesKey)) {\n throw new WpHsError(`Cannot remove built-in route key \"${routesKey}\".`, {\n exitCode: ExitCode.USER_ERROR,\n })\n }\n\n const pageFile = resolve(input.projectRoot, 'src/features/pages', `${slug}-page.tsx`)\n const access = detectPageAccess(input.projectRoot, slug)\n const routeRelative =\n access === 'protected' ? `src/routes/_app/${slug}.tsx` : `src/routes/${slug}.tsx`\n const routeFile = resolve(input.projectRoot, routeRelative)\n\n if (!existsSync(pageFile)) {\n throw new WpHsError(`Scaffolded page not found: src/features/pages/${slug}-page.tsx`, {\n exitCode: ExitCode.USER_ERROR,\n remediation: 'Use wp page list to see scaffolded pages.',\n })\n }\n\n if (input.dryRun) {\n input.logger?.info(`[dry-run] Would remove ${routeRelative} and src/features/pages/${slug}-page.tsx`)\n return {\n slug,\n removedRoute: routeRelative,\n removedPage: `src/features/pages/${slug}-page.tsx`,\n routeTreeRegenerated: false,\n }\n }\n\n const { projectRoot } = input\n rmSync(pageFile)\n if (existsSync(routeFile)) {\n rmSync(routeFile)\n }\n\n removeRoutesKeyFromFile(routesConfigPath(projectRoot), routesKey)\n removePagesBarrelExport(projectRoot, slug, componentName)\n\n const navConfig = resolveProjectNavConfig(projectRoot)\n if (input.removeFromNav !== false && navConfig && navContainsRoutesKey(projectRoot, routesKey)) {\n try {\n removeNavItemsEntry(navConfig, routesKey)\n } catch {\n input.logger?.warn(`Nav entry for \"${routesKey}\" was not removed — edit ${navConfig.relativePath} manually.`)\n }\n }\n\n const regen = regenerateRouteTree(projectRoot, { logger: input.logger, dryRun: input.dryRun })\n if (regen.warning) {\n input.logger?.warn(regen.warning)\n }\n\n return {\n slug,\n removedRoute: routeRelative,\n removedPage: `src/features/pages/${slug}-page.tsx`,\n routeTreeRegenerated: regen.ok,\n routeTreeWarning: regen.warning,\n }\n}\n"],"mappings":"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","names":[]}
|