@cloudhal/cli 0.0.0-stage → 0.1.1
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/LICENSE +202 -0
- package/README.md +191 -2
- package/dist/assets/skills/comment-triage/SKILL.md +34 -0
- package/dist/assets/skills/comment-triage/evals/nightly-queue.json +13 -0
- package/dist/assets/skills/publish-article/SKILL.md +44 -0
- package/dist/assets/skills/publish-article/evals/file-under-category.json +10 -0
- package/dist/assets/skills/publish-article/evals/publish-draft.json +8 -0
- package/dist/assets/skills/publish-article/evals/schedule-draft.json +10 -0
- package/dist/assets/skills/publish-article/references/editorial-checklist.md +9 -0
- package/dist/assets/skills/rollback/SKILL.md +23 -0
- package/dist/assets/skills/rollback/evals/revert-last.json +4 -0
- package/dist/assets/skills/safe-edit/SKILL.md +29 -0
- package/dist/assets/skills/safe-edit/evals/retitle.json +4 -0
- package/dist/assets/skills/safe-edit/references/retagging.md +8 -0
- package/dist/assets/skills/site-bootstrap/SKILL.md +29 -0
- package/dist/assets/skills/site-bootstrap/evals/empty-site.json +9 -0
- package/dist/assets/skills/site-bootstrap/references/content-guidelines.md +6 -0
- package/dist/assets/skills/site-design/SKILL.md +31 -0
- package/dist/assets/skills/site-design/evals/landing-page.json +12 -0
- package/dist/assets/skills/site-design/references/checklist.md +10 -0
- package/dist/assets/skills/site-design/references/guidance.md +13 -0
- package/dist/assets/skills/site-design/references/page-recipes.md +34 -0
- package/dist/assets/skills/site-design/references/tokens.md +40 -0
- package/dist/assets/skills/stale-review/SKILL.md +40 -0
- package/dist/assets/skills/stale-review/evals/weekly-review.json +13 -0
- package/dist/assets/starters/blog/.yarnrc.yml +2 -0
- package/dist/assets/starters/blog/README.md +46 -0
- package/dist/assets/starters/blog/_gitignore +5 -0
- package/dist/assets/starters/blog/astro.config.mjs +40 -0
- package/dist/assets/starters/blog/package.json +35 -0
- package/dist/assets/starters/blog/public/favicon.ico +0 -0
- package/dist/assets/starters/blog/public/favicon.svg +1 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/fraunces-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/inter-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/inter-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/inter-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/jetbrains-mono-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-sans-3-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/source-serif-4-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-OFL.txt +93 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-latin-ext-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/public/fonts/space-grotesk-latin-wght-normal.woff2 +0 -0
- package/dist/assets/starters/blog/src/DESIGN.md +42 -0
- package/dist/assets/starters/blog/src/blocks.ts +45 -0
- package/dist/assets/starters/blog/src/components/Archive.astro +108 -0
- package/dist/assets/starters/blog/src/components/Article.astro +105 -0
- package/dist/assets/starters/blog/src/components/Breadcrumbs.astro +25 -0
- package/dist/assets/starters/blog/src/components/EntryList.astro +54 -0
- package/dist/assets/starters/blog/src/components/LatestPosts.astro +30 -0
- package/dist/assets/starters/blog/src/components/MenuPanel.astro +46 -0
- package/dist/assets/starters/blog/src/components/NavLink.astro +27 -0
- package/dist/assets/starters/blog/src/components/NavMenu.astro +95 -0
- package/dist/assets/starters/blog/src/components/NotFound.astro +27 -0
- package/dist/assets/starters/blog/src/components/PostTerms.astro +33 -0
- package/dist/assets/starters/blog/src/components/RelatedPosts.astro +20 -0
- package/dist/assets/starters/blog/src/components/Search.astro +57 -0
- package/dist/assets/starters/blog/src/components/SearchDialog.astro +46 -0
- package/dist/assets/starters/blog/src/components/blocks/Testimonial.astro +18 -0
- package/dist/assets/starters/blog/src/env.d.ts +5 -0
- package/dist/assets/starters/blog/src/fonts.ts +15 -0
- package/dist/assets/starters/blog/src/icons.ts +12 -0
- package/dist/assets/starters/blog/src/layouts/Base.astro +426 -0
- package/dist/assets/starters/blog/src/middleware.ts +2 -0
- package/dist/assets/starters/blog/src/pages/[...path]/llms.txt.ts +40 -0
- package/dist/assets/starters/blog/src/pages/[...path]/rss.xml.ts +93 -0
- package/dist/assets/starters/blog/src/pages/[...path]/search.json.ts +23 -0
- package/dist/assets/starters/blog/src/pages/[...path].astro +449 -0
- package/dist/assets/starters/blog/src/pages/llms.txt.ts +21 -0
- package/dist/assets/starters/blog/src/pages/robots.txt.ts +13 -0
- package/dist/assets/starters/blog/src/pages/rss.xml.ts +25 -0
- package/dist/assets/starters/blog/src/pages/search.json.ts +21 -0
- package/dist/assets/starters/blog/src/pages/sitemap.xml.ts +23 -0
- package/dist/assets/starters/blog/src/settings.ts +312 -0
- package/dist/assets/starters/blog/src/strings.ts +269 -0
- package/dist/assets/starters/blog/src/styles/features/ambient.css +185 -0
- package/dist/assets/starters/blog/src/styles/features/article.css +215 -0
- package/dist/assets/starters/blog/src/styles/features/blocks.css +93 -0
- package/dist/assets/starters/blog/src/styles/features/carousel.css +266 -0
- package/dist/assets/starters/blog/src/styles/features/chrome-menus.css +264 -0
- package/dist/assets/starters/blog/src/styles/features/chrome.css +193 -0
- package/dist/assets/starters/blog/src/styles/features/comments.css +75 -0
- package/dist/assets/starters/blog/src/styles/features/icons.css +70 -0
- package/dist/assets/starters/blog/src/styles/features/languages.css +34 -0
- package/dist/assets/starters/blog/src/styles/features/live-surfaces.css +235 -0
- package/dist/assets/starters/blog/src/styles/features/motion-effects.css +217 -0
- package/dist/assets/starters/blog/src/styles/features/motion-scroll.css +309 -0
- package/dist/assets/starters/blog/src/styles/features/motion.css +254 -0
- package/dist/assets/starters/blog/src/styles/features/overlays.css +324 -0
- package/dist/assets/starters/blog/src/styles/features/prose.css +140 -0
- package/dist/assets/starters/blog/src/styles/features/search-dialog.css +144 -0
- package/dist/assets/starters/blog/src/styles/features/search.css +59 -0
- package/dist/assets/starters/blog/src/styles/features/surface-media.css +123 -0
- package/dist/assets/starters/blog/src/styles/features/surfaces.css +309 -0
- package/dist/assets/starters/blog/src/styles/features/tokens.css +100 -0
- package/dist/assets/starters/blog/src/styles/fonts.css +113 -0
- package/dist/assets/starters/blog/src/styles/global.css +30 -0
- package/dist/assets/starters/blog/src/theme.ts +48 -0
- package/dist/assets/starters/blog/tsconfig.json +5 -0
- package/dist/assets/studio/.assetsignore +2 -0
- package/dist/assets/studio/_headers +14 -0
- package/dist/assets/studio/assets/AccountPage-Dzr5d8sk.js +2 -0
- package/dist/assets/studio/assets/ActivityPage-C0HlgSI5.js +2 -0
- package/dist/assets/studio/assets/AgentModes-B81a2nUo.js +2 -0
- package/dist/assets/studio/assets/AgentsPage-BzCOyX4g.js +2 -0
- package/dist/assets/studio/assets/AnalyticsPage-7yb7DBOH.js +3 -0
- package/dist/assets/studio/assets/ApprovalsPage-_tqc02mk.js +3 -0
- package/dist/assets/studio/assets/Archive.es-C0uhxndN.js +2 -0
- package/dist/assets/studio/assets/ArrowClockwise.es-BA0pzb0Y.js +2 -0
- package/dist/assets/studio/assets/ArrowCounterClockwise.es-Bn2jikgp.js +2 -0
- package/dist/assets/studio/assets/ArrowSquareOut.es-BWeH9CSw.js +2 -0
- package/dist/assets/studio/assets/ArrowUp.es-Bh0pVk-S.js +2 -0
- package/dist/assets/studio/assets/ArrowsMerge.es-gfKOrxGd.js +2 -0
- package/dist/assets/studio/assets/ArticleEditorPage-Bcb81dXC.js +2 -0
- package/dist/assets/studio/assets/ArticlesPage-152INxny.js +2 -0
- package/dist/assets/studio/assets/AssetPage-ddWJt0hs.js +2 -0
- package/dist/assets/studio/assets/Audit-BCzf5vBq.js +2 -0
- package/dist/assets/studio/assets/AuditBadges-C4sNtzf9.js +2 -0
- package/dist/assets/studio/assets/AuthLayout-Cidy_2Lu.js +2 -0
- package/dist/assets/studio/assets/AutocompleteItem-drxau0wm3735nihq-C-iAptWL.js +2 -0
- package/dist/assets/studio/assets/AutomationsPage-Dc6g5v_v.js +2 -0
- package/dist/assets/studio/assets/BlockPropsForm-fj5gMAa0.js +2 -0
- package/dist/assets/studio/assets/BlockSection-CnUXl5Sg.js +2 -0
- package/dist/assets/studio/assets/BodyChanges-M0zcsivC.js +4 -0
- package/dist/assets/studio/assets/BookOpenText.es-BfXzf_Vn.js +2 -0
- package/dist/assets/studio/assets/BuildPage-C1Nwy4dt.js +2 -0
- package/dist/assets/studio/assets/CSPContext-ctyrgg64girv38ls-2UvfJ5m0.js +2 -0
- package/dist/assets/studio/assets/CalendarCheck.es-DWymuVqi.js +2 -0
- package/dist/assets/studio/assets/CalendarPlus.es-YGFiosIm.js +2 -0
- package/dist/assets/studio/assets/CaretLeft.es-BUnHcaxq.js +2 -0
- package/dist/assets/studio/assets/CaretRight.es-D_coqYai.js +2 -0
- package/dist/assets/studio/assets/CaretUp.es-DBg3pdpL.js +2 -0
- package/dist/assets/studio/assets/CheckCircle.es-XJ9Tr9Tu.js +2 -0
- package/dist/assets/studio/assets/ClockClockwise.es-1egHMnBk.js +2 -0
- package/dist/assets/studio/assets/ClockCountdown.es-BR_zz6vi.js +2 -0
- package/dist/assets/studio/assets/Columns-DGrju-Ia.js +2 -0
- package/dist/assets/studio/assets/ComboboxEmpty-o0q20j2l2syar9kx-Bf-42bzQ.js +2 -0
- package/dist/assets/studio/assets/CommandMenu-CH5CJ8Kg.js +2 -0
- package/dist/assets/studio/assets/CommentThreadControls-D04pICZT.js +2 -0
- package/dist/assets/studio/assets/CommentThreadPage-BP0N9T4z.js +2 -0
- package/dist/assets/studio/assets/CommenterPage-CeFR4pn4.js +2 -0
- package/dist/assets/studio/assets/Comments-CnfKPS2z.js +2 -0
- package/dist/assets/studio/assets/CommentsPage-BlP_knlf.js +2 -0
- package/dist/assets/studio/assets/CompositeItem-hzuk5x3e5zsfgnyj-XaSr50DG.js +2 -0
- package/dist/assets/studio/assets/CompositeRoot-g72lchaerolf5dc9-B2BokDIY.js +2 -0
- package/dist/assets/studio/assets/ConfirmDialog-DEHkMoTj.js +2 -0
- package/dist/assets/studio/assets/Crumbs-Ci_RdgHU.js +2 -0
- package/dist/assets/studio/assets/DeviceMobile.es-B4PwJ85Q.js +2 -0
- package/dist/assets/studio/assets/DeviceTablet.es-BpxIF5z6.js +2 -0
- package/dist/assets/studio/assets/DialogRoot-hl3genvzl9h8ridm-BRUDLjaw.js +2 -0
- package/dist/assets/studio/assets/DialogTrigger-g44cuem7n4wez533-B5K8lQD3.js +2 -0
- package/dist/assets/studio/assets/DirectionalIcon-BKKMj3KT.js +2 -0
- package/dist/assets/studio/assets/DotsThree.es-C-pT5SgE.js +2 -0
- package/dist/assets/studio/assets/DownloadSimple.es-Cq4-UK-k.js +2 -0
- package/dist/assets/studio/assets/EditorLayout-DVegYcZT.js +2 -0
- package/dist/assets/studio/assets/EditorPreview-DsZG4-oJ.js +2 -0
- package/dist/assets/studio/assets/Elevation-Ca3Q8sk-.js +2 -0
- package/dist/assets/studio/assets/ElevationRequest-B0_Q_gVT.js +2 -0
- package/dist/assets/studio/assets/EnvelopeSimple.es-g-hlqV74.js +2 -0
- package/dist/assets/studio/assets/Eye.es-DqovdtPt.js +2 -0
- package/dist/assets/studio/assets/EyeSlash.es-YoqigHIr.js +2 -0
- package/dist/assets/studio/assets/File.es-VYp_u8mn.js +2 -0
- package/dist/assets/studio/assets/FolderSimple.es-CbGWmBJc.js +2 -0
- package/dist/assets/studio/assets/FolderSimplePlus.es-C9Fl6ewY.js +2 -0
- package/dist/assets/studio/assets/ForgotPasswordPage-LNtBXfC8.js +2 -0
- package/dist/assets/studio/assets/Funnel.es-L1Sdi8-A.js +2 -0
- package/dist/assets/studio/assets/Gating-BdY3KxOv.js +2 -0
- package/dist/assets/studio/assets/Gauge.es-D0Pz39Z0.js +2 -0
- package/dist/assets/studio/assets/GitDiff.es-fB1csyEF.js +2 -0
- package/dist/assets/studio/assets/GlobeHemisphereWest.es-C34XiLRk.js +2 -0
- package/dist/assets/studio/assets/GovernanceDialog-DR0m4Bhp.js +2 -0
- package/dist/assets/studio/assets/HandPalm.es-CB5OlkOg.js +2 -0
- package/dist/assets/studio/assets/Heartbeat.es-DZziz772.js +2 -0
- package/dist/assets/studio/assets/Hourglass.es-aqS22q0y.js +2 -0
- package/dist/assets/studio/assets/House.es-BQyZgbwu.js +2 -0
- package/dist/assets/studio/assets/IconBase.es-BZDpYMnj.js +2 -0
- package/dist/assets/studio/assets/Image.es-BcOUS77O.js +2 -0
- package/dist/assets/studio/assets/InsetPanel-CHSg953_.js +2 -0
- package/dist/assets/studio/assets/InvitePage-CZ-4Clg6.js +2 -0
- package/dist/assets/studio/assets/Key.es-DE551dL3.js +2 -0
- package/dist/assets/studio/assets/Lightning.es-D0IF-5OW.js +2 -0
- package/dist/assets/studio/assets/LinkBreak.es-BvGThatb.js +2 -0
- package/dist/assets/studio/assets/LinkSimple.es-BB_3GfFO.js +2 -0
- package/dist/assets/studio/assets/ListBullets.es-DzSyoNA1.js +2 -0
- package/dist/assets/studio/assets/ListToolbar-CE70usqf.js +2 -0
- package/dist/assets/studio/assets/LockSimple.es-D3HQqnoN.js +2 -0
- package/dist/assets/studio/assets/LoginPage-BfUjD7n3.js +2 -0
- package/dist/assets/studio/assets/MediaPage-D7h4RBbB.js +2 -0
- package/dist/assets/studio/assets/MediaPicker-DlJLkaGR.js +2 -0
- package/dist/assets/studio/assets/MediaUpload-BpTyBTHG.js +2 -0
- package/dist/assets/studio/assets/MembersPage-BNu1FOBL.js +2 -0
- package/dist/assets/studio/assets/Menus-ChmyHrPc.js +2 -0
- package/dist/assets/studio/assets/Monitor.es-CeaPWdET.js +2 -0
- package/dist/assets/studio/assets/NavigationPage-C10U827y.js +2 -0
- package/dist/assets/studio/assets/NewSiteDialog-D7SUMMY3.js +2 -0
- package/dist/assets/studio/assets/PageEditorPage-DBJUAqjk.js +5 -0
- package/dist/assets/studio/assets/PagesPage-Bwm8b58m.js +2 -0
- package/dist/assets/studio/assets/PasswordField-Cn0g88_l.js +2 -0
- package/dist/assets/studio/assets/PencilSimple.es-CsZ-k9wK.js +2 -0
- package/dist/assets/studio/assets/Plus.es-XNm1OB5Q.js +2 -0
- package/dist/assets/studio/assets/PreviewPanel-ChFoJD1H.js +2 -0
- package/dist/assets/studio/assets/Prohibit.es-CAvPLn3v.js +2 -0
- package/dist/assets/studio/assets/ProhibitInset.es-DsnL02EX.js +2 -0
- package/dist/assets/studio/assets/ProjectPage-e5BSkkda.js +2 -0
- package/dist/assets/studio/assets/Question.es-BqQtQle2.js +2 -0
- package/dist/assets/studio/assets/Readers-CvhU7wCy.js +3 -0
- package/dist/assets/studio/assets/RedirectDialog-DCNKLV43.js +2 -0
- package/dist/assets/studio/assets/RedirectsPage-CR1Di-T6.js +2 -0
- package/dist/assets/studio/assets/ReleaseApproval-gkciKrWx.js +2 -0
- package/dist/assets/studio/assets/ReleasePage-BRa167d9.js +2 -0
- package/dist/assets/studio/assets/ReleaseParts-BEMf510p.js +2 -0
- package/dist/assets/studio/assets/ResetPasswordPage-DLpZlh7i.js +2 -0
- package/dist/assets/studio/assets/RowMenu-BTHdea9k.js +2 -0
- package/dist/assets/studio/assets/ScheduleCard-BQWUIwPX.js +2 -0
- package/dist/assets/studio/assets/ScheduleDialog-B-QQ_Z3F.js +2 -0
- package/dist/assets/studio/assets/ScheduleHistoryPage-wv3pKfaZ.js +2 -0
- package/dist/assets/studio/assets/ScheduleStatusBadge-DHGmEyDv.js +2 -0
- package/dist/assets/studio/assets/SchedulerStalled-DUmZxbV4.js +2 -0
- package/dist/assets/studio/assets/Schedules-R6HfROIM.js +3 -0
- package/dist/assets/studio/assets/SchedulesPage-CIbzmMag.js +2 -0
- package/dist/assets/studio/assets/ScopeBadge-DM2PO5Xk.js +2 -0
- package/dist/assets/studio/assets/SectionCard-SzT8t6oM.js +2 -0
- package/dist/assets/studio/assets/Seo-CYyFHl3G.js +2 -0
- package/dist/assets/studio/assets/SeoPreview-tarmyT2Y.js +2 -0
- package/dist/assets/studio/assets/Settings-C407Vxml.js +2 -0
- package/dist/assets/studio/assets/ShieldCheck.es-BOXTHH7h.js +2 -0
- package/dist/assets/studio/assets/ShieldWarning.es-DPxoDMpT.js +2 -0
- package/dist/assets/studio/assets/SignIn.es-jAzHZG6b.js +2 -0
- package/dist/assets/studio/assets/SiteAccessField-D34vIaAo.js +2 -0
- package/dist/assets/studio/assets/SiteOverviewPage-Bm0-f1bp.js +4 -0
- package/dist/assets/studio/assets/SiteSettingsPage-tq4SzyMQ.js +3 -0
- package/dist/assets/studio/assets/SitesPage-B2QS2zaq.js +4 -0
- package/dist/assets/studio/assets/SkillsPage-BtFk0bBw.js +3 -0
- package/dist/assets/studio/assets/SlidersHorizontal.es-Bg-14CTG.js +2 -0
- package/dist/assets/studio/assets/SnapshotsPage-cltqpJLv.js +2 -0
- package/dist/assets/studio/assets/SourceEditor-UA14mu6Q.js +16 -0
- package/dist/assets/studio/assets/Sparkle.es-OfyfGCDe.js +2 -0
- package/dist/assets/studio/assets/Star.es-DhrrAurR.js +2 -0
- package/dist/assets/studio/assets/StatTile-DyU32i8V.js +2 -0
- package/dist/assets/studio/assets/Status-BgB2wP8j.js +2 -0
- package/dist/assets/studio/assets/StatusActions-tY-DY4Wa.js +3 -0
- package/dist/assets/studio/assets/StopCircle.es-a6tRK2fc.js +2 -0
- package/dist/assets/studio/assets/Table.es-6S52tmK7.js +2 -0
- package/dist/assets/studio/assets/TableSkeleton-CbqPrk-p.js +2 -0
- package/dist/assets/studio/assets/TagsMigration-BggsWH7A.js +2 -0
- package/dist/assets/studio/assets/Taxonomy-CeQUBEeZ.js +2 -0
- package/dist/assets/studio/assets/TaxonomyPage-hm0h5Ug5.js +2 -0
- package/dist/assets/studio/assets/TermEditorPage-tRUgbC0f.js +2 -0
- package/dist/assets/studio/assets/TermPickers-cZIwRG5t.js +2 -0
- package/dist/assets/studio/assets/TerminalWindow.es-DRFBT_Ie.js +2 -0
- package/dist/assets/studio/assets/TextAa.es-CuNv62rI.js +2 -0
- package/dist/assets/studio/assets/Toast-BHyBhGXI.js +2 -0
- package/dist/assets/studio/assets/ToolbarRootContext-eqk40r8uh4h6r211-DBIMpkd1.js +2 -0
- package/dist/assets/studio/assets/TranslationList-Cc4K8uy_.js +2 -0
- package/dist/assets/studio/assets/TranslationsPage-MFJsWMgX.js +2 -0
- package/dist/assets/studio/assets/Trash.es-CxKLVMOQ.js +2 -0
- package/dist/assets/studio/assets/User.es-BLqDj7XT.js +2 -0
- package/dist/assets/studio/assets/UserCircle.es-D4ZFhshn.js +2 -0
- package/dist/assets/studio/assets/Warning.es-LZXqwHRF.js +2 -0
- package/dist/assets/studio/assets/XCircle.es-3fJHkmwA.js +2 -0
- package/dist/assets/studio/assets/account-BXWuYNDB.js +2 -0
- package/dist/assets/studio/assets/activity-C0we9-m8.js +2 -0
- package/dist/assets/studio/assets/agents-BBsojpg9.js +4 -0
- package/dist/assets/studio/assets/aiSettings.ar-BhZdR6qG.js +2 -0
- package/dist/assets/studio/assets/aiSettings.de-CXaCGWio.js +2 -0
- package/dist/assets/studio/assets/aiSettings.en-C8dj9xkg.js +2 -0
- package/dist/assets/studio/assets/aiSettings.es-avCBqU5-.js +2 -0
- package/dist/assets/studio/assets/aiSettings.fa-CKFnDB0Q.js +2 -0
- package/dist/assets/studio/assets/aiSettings.fr-35_A52Su.js +2 -0
- package/dist/assets/studio/assets/aiSettings.he-CbsdxPL1.js +2 -0
- package/dist/assets/studio/assets/aiSettings.hi-y4QpRZgC.js +2 -0
- package/dist/assets/studio/assets/aiSettings.id-CO4I-Nr1.js +2 -0
- package/dist/assets/studio/assets/aiSettings.it-B-OytWUY.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ja-ClLGRpLX.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ko-CedNf6wA.js +2 -0
- package/dist/assets/studio/assets/aiSettings.nl-DuEVpMb_.js +2 -0
- package/dist/assets/studio/assets/aiSettings.pl-wXUoviqN.js +2 -0
- package/dist/assets/studio/assets/aiSettings.pt-BR-Dm3HTskY.js +2 -0
- package/dist/assets/studio/assets/aiSettings.ru-DOWh4XHX.js +2 -0
- package/dist/assets/studio/assets/aiSettings.tr-xC2kyYK8.js +2 -0
- package/dist/assets/studio/assets/aiSettings.uk-DrE0ioQJ.js +2 -0
- package/dist/assets/studio/assets/aiSettings.zh-Hans-CBZ7ePsr.js +2 -0
- package/dist/assets/studio/assets/analytics-range-BqKm9TTo.js +2 -0
- package/dist/assets/studio/assets/analytics.ar-DFKPNZOf.js +2 -0
- package/dist/assets/studio/assets/analytics.de-CE2_NGRB.js +2 -0
- package/dist/assets/studio/assets/analytics.en-BjRe9VE9.js +2 -0
- package/dist/assets/studio/assets/analytics.es-DmWAl1lg.js +2 -0
- package/dist/assets/studio/assets/analytics.fa-YJ3Xk-rc.js +2 -0
- package/dist/assets/studio/assets/analytics.fr-BDyCguOG.js +2 -0
- package/dist/assets/studio/assets/analytics.he-BJ5kfLvV.js +2 -0
- package/dist/assets/studio/assets/analytics.hi-Cc9ZxzNg.js +2 -0
- package/dist/assets/studio/assets/analytics.id-CyUlDO82.js +2 -0
- package/dist/assets/studio/assets/analytics.it-NlLzAH3s.js +2 -0
- package/dist/assets/studio/assets/analytics.ja-DWrGTLXw.js +2 -0
- package/dist/assets/studio/assets/analytics.ko-BtZwKyZk.js +2 -0
- package/dist/assets/studio/assets/analytics.nl-CAny5E3q.js +2 -0
- package/dist/assets/studio/assets/analytics.pl-CpcS7l9b.js +2 -0
- package/dist/assets/studio/assets/analytics.pt-BR-BAK_LNqi.js +2 -0
- package/dist/assets/studio/assets/analytics.ru-BhvbWlC_.js +2 -0
- package/dist/assets/studio/assets/analytics.tr-aCP2FxF6.js +2 -0
- package/dist/assets/studio/assets/analytics.uk-CAGnu8AX.js +2 -0
- package/dist/assets/studio/assets/analytics.zh-Hans-NF-Le9KQ.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ar-C5r58XUn.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.de-DVXtSeKl.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.en-Dn_QYKbo.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.es-BdkgtxLM.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.fa-CPuBleHO.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.fr-BSq7kZAb.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.he-Bt4A9H0D.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.hi-ii2QSWPw.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.id-CIZyEXYS.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.it-Sevpe-t4.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ja-C_52hTsO.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ko-Bpr2STd6.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.nl-DYfP6Uld.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.pl-BuJZVVIi.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.pt-BR-C4BNIRKw.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.ru-CiMbwjeg.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.tr-Csuqe5q9.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.uk-DVRqhoqA.js +2 -0
- package/dist/assets/studio/assets/analyticsSettings.zh-Hans-Y3Ei4xGe.js +2 -0
- package/dist/assets/studio/assets/api-Sbz4Rbu7.js +4 -0
- package/dist/assets/studio/assets/api-errors-FBnZYqCy.js +2 -0
- package/dist/assets/studio/assets/appearance.ar-CjHmVq1_.js +2 -0
- package/dist/assets/studio/assets/appearance.de-RD44SQgd.js +2 -0
- package/dist/assets/studio/assets/appearance.en-mFJuOtIH.js +2 -0
- package/dist/assets/studio/assets/appearance.es-Dn1vcVTZ.js +2 -0
- package/dist/assets/studio/assets/appearance.fa-DclMXXrQ.js +2 -0
- package/dist/assets/studio/assets/appearance.fr-CRqH6-pt.js +2 -0
- package/dist/assets/studio/assets/appearance.he-COP1zzas.js +2 -0
- package/dist/assets/studio/assets/appearance.hi-CnnlhSEx.js +2 -0
- package/dist/assets/studio/assets/appearance.id-aSp7eOOW.js +2 -0
- package/dist/assets/studio/assets/appearance.it-D4AXypSF.js +2 -0
- package/dist/assets/studio/assets/appearance.ja-BoMHIaWB.js +2 -0
- package/dist/assets/studio/assets/appearance.ko-BqysekcN.js +2 -0
- package/dist/assets/studio/assets/appearance.nl-DkQd7NMN.js +2 -0
- package/dist/assets/studio/assets/appearance.pl-YvYqfbPP.js +2 -0
- package/dist/assets/studio/assets/appearance.pt-BR-8R80D9mc.js +2 -0
- package/dist/assets/studio/assets/appearance.ru-CLiGYIyF.js +2 -0
- package/dist/assets/studio/assets/appearance.tr-T9TtsGiz.js +2 -0
- package/dist/assets/studio/assets/appearance.uk-C-AHWC43.js +2 -0
- package/dist/assets/studio/assets/appearance.zh-Hans-0HyzAidT.js +2 -0
- package/dist/assets/studio/assets/approvals-BB74ogKx.js +2 -0
- package/dist/assets/studio/assets/ar-6o5tS7uI.js +6 -0
- package/dist/assets/studio/assets/ar-CS6h3U7d.js +2 -0
- package/dist/assets/studio/assets/areArraysEqual-bcx201k1x9ziizym-DpJhDMgE.js +2 -0
- package/dist/assets/studio/assets/auth-BXDbnIpO.js +4 -0
- package/dist/assets/studio/assets/badge-dq8bx752b9dp7dst-D1xrG37q.js +2 -0
- package/dist/assets/studio/assets/banner-msnmqm7of2lck01x-DRzQHuca.js +2 -0
- package/dist/assets/studio/assets/bash-jpzh6zbf5237424t-bmc95DGl.js +1 -0
- package/dist/assets/studio/assets/blockIcon-DmMm6cQr.js +2 -0
- package/dist/assets/studio/assets/blocks-CvH3xqPj.js +3 -0
- package/dist/assets/studio/assets/body-blocks-D3YZCH_O.js +6 -0
- package/dist/assets/studio/assets/bodyEditor.ar-DIDA9Sn4.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.de-qfipY5HQ.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.en-B8FW4NF8.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.es-t2G9FCJv.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.fa-C4B5tIHm.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.fr-B93u2T8B.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.he-AjBYzDbH.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.hi-BL4B8EIK.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.id-DaiRImPk.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.it-COSRU27e.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ja-4ELaS2Vi.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ko-DzXpHAYj.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.nl-7a_XD53a.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.pl-o2L5fJfH.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.pt-BR-CRnn6BFL.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.ru-BS2txhVI.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.tr-DXm3ACCU.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.uk-D32F3Hv3.js +2 -0
- package/dist/assets/studio/assets/bodyEditor.zh-Hans-DzWUdSMX.js +2 -0
- package/dist/assets/studio/assets/build.ar-CvCBBGmP.js +2 -0
- package/dist/assets/studio/assets/build.de-Dh25xQiI.js +2 -0
- package/dist/assets/studio/assets/build.en-Byn4-h2I.js +2 -0
- package/dist/assets/studio/assets/build.es-ClTjZJkv.js +2 -0
- package/dist/assets/studio/assets/build.fa-BKTGFm97.js +2 -0
- package/dist/assets/studio/assets/build.fr-DWmKJ0b2.js +2 -0
- package/dist/assets/studio/assets/build.he-CMkIxK5A.js +2 -0
- package/dist/assets/studio/assets/build.hi-bSlyuwEN.js +2 -0
- package/dist/assets/studio/assets/build.id-DYXKpcM4.js +2 -0
- package/dist/assets/studio/assets/build.it-DshuVK4I.js +2 -0
- package/dist/assets/studio/assets/build.ja-DUQGeTAB.js +2 -0
- package/dist/assets/studio/assets/build.ko-BgOecD0b.js +2 -0
- package/dist/assets/studio/assets/build.nl-CqcFxeNS.js +2 -0
- package/dist/assets/studio/assets/build.pl-DOh2FAZL.js +2 -0
- package/dist/assets/studio/assets/build.pt-BR-DIS1WMA1.js +2 -0
- package/dist/assets/studio/assets/build.ru-CT93GG0h.js +2 -0
- package/dist/assets/studio/assets/build.tr-BJ066yTf.js +2 -0
- package/dist/assets/studio/assets/build.uk-foNFYsBE.js +2 -0
- package/dist/assets/studio/assets/build.zh-Hans-D0aEdiJR.js +2 -0
- package/dist/assets/studio/assets/button-pa1bq9b85hawg41a-BcGpLLER.js +2 -0
- package/dist/assets/studio/assets/calendar-locale-D4aJYygH.js +2 -0
- package/dist/assets/studio/assets/charts-DL9SbRU8.js +39 -0
- package/dist/assets/studio/assets/checkbox-lbo436duy7krxcsk-BmusNS83.js +6 -0
- package/dist/assets/studio/assets/clamp-jcjhzx71s6wt1rnc-D0kAXd-u.js +2 -0
- package/dist/assets/studio/assets/clipboard-text-gd6s3n1bqse9zgt8-DXnAaY6R.js +2 -0
- package/dist/assets/studio/assets/code-eu8kzwqnlhoyin24-_5wcX_Lj.js +2 -0
- package/dist/assets/studio/assets/collapsible-l8g94on4w7qfosmn-udgP1bfF.js +2 -0
- package/dist/assets/studio/assets/combobox-hdxtsm2gqcxxgfju-BzzDlvd3.js +2 -0
- package/dist/assets/studio/assets/comment-model-CArtcrfg.js +4 -0
- package/dist/assets/studio/assets/comment-settings-M6JXROM1.js +2 -0
- package/dist/assets/studio/assets/comments-B1PIozwq.js +2 -0
- package/dist/assets/studio/assets/comments.ar-7NPLRbXL.js +2 -0
- package/dist/assets/studio/assets/comments.de-BML9h-8i.js +2 -0
- package/dist/assets/studio/assets/comments.en-DXe1aP-J.js +2 -0
- package/dist/assets/studio/assets/comments.es-B9qnqc6H.js +2 -0
- package/dist/assets/studio/assets/comments.fa-q5l6LTXH.js +2 -0
- package/dist/assets/studio/assets/comments.fr-7tNmTLTd.js +2 -0
- package/dist/assets/studio/assets/comments.he-C6eZFBr_.js +2 -0
- package/dist/assets/studio/assets/comments.hi-BBW7jI8Z.js +2 -0
- package/dist/assets/studio/assets/comments.id-XxjsE0p0.js +2 -0
- package/dist/assets/studio/assets/comments.it-3QvytToA.js +2 -0
- package/dist/assets/studio/assets/comments.ja-SEFPl5By.js +2 -0
- package/dist/assets/studio/assets/comments.ko-B_laV8JW.js +2 -0
- package/dist/assets/studio/assets/comments.nl-sc5X58Ly.js +2 -0
- package/dist/assets/studio/assets/comments.pl-DF090zb0.js +2 -0
- package/dist/assets/studio/assets/comments.pt-BR-DItdiBpU.js +2 -0
- package/dist/assets/studio/assets/comments.ru-BQjNpLAH.js +2 -0
- package/dist/assets/studio/assets/comments.tr-B22wAK59.js +2 -0
- package/dist/assets/studio/assets/comments.uk-D7MXty4-.js +2 -0
- package/dist/assets/studio/assets/comments.zh-Hans-Cuxj9eiV.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ar-CFEC5U3P.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.de-B7jRspXp.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.en-CjQdkMZH.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.es-hozx4ts0.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.fa-Idlvxfyt.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.fr-CUYc20e7.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.he-DXrfjejv.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.hi-Bc2QmPb_.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.id-BlqU87IM.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.it-BxURj-49.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ja--0JkaZKL.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ko-Bc51E0cW.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.nl-BAfV9gzf.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.pl-CqCY2bHr.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.pt-BR-C1W1xEAM.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.ru-BNldyy_U.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.tr-DoM2JLr_.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.uk-B07IS9-u.js +2 -0
- package/dist/assets/studio/assets/commentsSettings.zh-Hans-iQA7XsFn.js +2 -0
- package/dist/assets/studio/assets/composite-ab8dmdfoj6tmhcn1-DBTnwEaq.js +2 -0
- package/dist/assets/studio/assets/core-n0de50o00ej2ecfe-gtt67pEc.js +13 -0
- package/dist/assets/studio/assets/countries-110m-CmKPZPcB.json +1 -0
- package/dist/assets/studio/assets/createToastManager-onmoqrmr8zo02rif-DtEv4lxV.js +2 -0
- package/dist/assets/studio/assets/css-j501gxq1am2gnikh-BsVw1vtW.js +2 -0
- package/dist/assets/studio/assets/date-picker-BSgojKR2.js +1 -0
- package/dist/assets/studio/assets/date-picker-cotkexrpqu5tjikv-C9Knj8LQ.js +2 -0
- package/dist/assets/studio/assets/de-BN-GS_nX.js +6 -0
- package/dist/assets/studio/assets/de-COZWf0tz.js +2 -0
- package/dist/assets/studio/assets/deleteLabels-DwQes2_M.js +2 -0
- package/dist/assets/studio/assets/dialog-glpnivujociqs9lh-BefDeRGC.js +2 -0
- package/dist/assets/studio/assets/diff-g2re0kj6fh27rgg5-woXpYk--.js +2 -0
- package/dist/assets/studio/assets/editor-C9MhZu7g.js +218 -0
- package/dist/assets/studio/assets/empty-hkvg3is3uc6dj1at-BGNUzomN.js +2 -0
- package/dist/assets/studio/assets/engine-javascript-e9xj8hhz9xfqhpnu-CaOb2Rd2.js +142 -0
- package/dist/assets/studio/assets/engine-oniguruma-ias56ildu01gf939-BO8SA_1o.js +2 -0
- package/dist/assets/studio/assets/errors-svQ83Q62.js +2 -0
- package/dist/assets/studio/assets/es-C1E3agwU.js +6 -0
- package/dist/assets/studio/assets/es-Cpr7u5Cz.js +2 -0
- package/dist/assets/studio/assets/fa-8y3tvKw6.js +2 -0
- package/dist/assets/studio/assets/fa-VZyv0VcS.js +6 -0
- package/dist/assets/studio/assets/format-DGE2c-4V.js +2 -0
- package/dist/assets/studio/assets/fr-IaaUvy1z.js +6 -0
- package/dist/assets/studio/assets/fr-IvKa5dhW.js +2 -0
- package/dist/assets/studio/assets/getElementTransform-cuiqmjglkrz4db6c-CjP1vzKy.js +2 -0
- package/dist/assets/studio/assets/github-light-hir7yctc38258pwt-EUqPIrTm.js +2 -0
- package/dist/assets/studio/assets/graphql-n9vlzkvcp2j19p7a-qc8EicCw.js +2 -0
- package/dist/assets/studio/assets/hcl-ohpfnrffs96hzyj5-Dh228itO.js +2 -0
- package/dist/assets/studio/assets/he-Ca3dnXtb.js +6 -0
- package/dist/assets/studio/assets/he-DG-oJz8N.js +2 -0
- package/dist/assets/studio/assets/hi-BXkaH5dy.js +6 -0
- package/dist/assets/studio/assets/hi-CngsNxV4.js +2 -0
- package/dist/assets/studio/assets/html-nimj6ljkkifnc9ni-_gDbiBIU.js +2 -0
- package/dist/assets/studio/assets/i18n-Cjiv6Esx.js +7 -0
- package/dist/assets/studio/assets/id-BuNEmn7g.js +6 -0
- package/dist/assets/studio/assets/id-CrWAlC6J.js +2 -0
- package/dist/assets/studio/assets/index-Boved2Nz.js +4 -0
- package/dist/assets/studio/assets/index-DaI1wvdp.css +2 -0
- package/dist/assets/studio/assets/inertValue-e0o6qvuef83v78fk-DAETOorM.js +2 -0
- package/dist/assets/studio/assets/inline-copy-text-gbd7jhwpor27l4rq-PUCnUeNZ.js +2 -0
- package/dist/assets/studio/assets/input-c8lv9ulv0kortliq-Cum0c7P1.js +5 -0
- package/dist/assets/studio/assets/input-group-fjr4r5ax0x78ppax-e-s-YUWj.js +2 -0
- package/dist/assets/studio/assets/input-h5ox92gf13ge04hp-jfy1uD8s.js +2 -0
- package/dist/assets/studio/assets/intl-C22KAx_l.js +2 -0
- package/dist/assets/studio/assets/it-BbkGji4q.js +2 -0
- package/dist/assets/studio/assets/it-DEB0m7yM.js +6 -0
- package/dist/assets/studio/assets/ja-BJv09PXI.js +6 -0
- package/dist/assets/studio/assets/ja-CLpIeite.js +2 -0
- package/dist/assets/studio/assets/javascript-b6fq9bl50fdj6813-BgS3c2Ky.js +2 -0
- package/dist/assets/studio/assets/json-h2g0z143t3cs13d7-qhed-kSA.js +2 -0
- package/dist/assets/studio/assets/jsonc-jxlzvingck161eej-CYpm1nAK.js +2 -0
- package/dist/assets/studio/assets/jsx-jp7a33937sef92sn-Bz0zcwM4.js +2 -0
- package/dist/assets/studio/assets/ko-Cikp2ojH.js +6 -0
- package/dist/assets/studio/assets/ko-u0y0T6iL.js +2 -0
- package/dist/assets/studio/assets/languages-CbQ722uB.js +2 -0
- package/dist/assets/studio/assets/layer-dialog-j5ywmzs46ccg6oqy-DyWF5y24.js +2 -0
- package/dist/assets/studio/assets/link-cqyfjezntvr53rh7-CwZJ95XT.js +10 -0
- package/dist/assets/studio/assets/markdown-eybeqjr58vfygtz1-BYOwaDjH.js +2 -0
- package/dist/assets/studio/assets/marked.esm-DCShygCS.js +68 -0
- package/dist/assets/studio/assets/media-DqHiLqTz.js +21 -0
- package/dist/assets/studio/assets/media.ar-Dx9z7Ceu.js +2 -0
- package/dist/assets/studio/assets/media.de-D6vlydhW.js +2 -0
- package/dist/assets/studio/assets/media.en-BT47PRGz.js +2 -0
- package/dist/assets/studio/assets/media.es-CDRleryS.js +2 -0
- package/dist/assets/studio/assets/media.fa-DXam9tY_.js +2 -0
- package/dist/assets/studio/assets/media.fr-DKfkWH0D.js +2 -0
- package/dist/assets/studio/assets/media.he-COj2GX3h.js +2 -0
- package/dist/assets/studio/assets/media.hi-1a0-Fk6b.js +2 -0
- package/dist/assets/studio/assets/media.id-CAgR7je9.js +2 -0
- package/dist/assets/studio/assets/media.it-huMn4qfV.js +2 -0
- package/dist/assets/studio/assets/media.ja-DIiDhxEt.js +2 -0
- package/dist/assets/studio/assets/media.ko-CEzTT9w2.js +2 -0
- package/dist/assets/studio/assets/media.nl-DAcAkgwj.js +2 -0
- package/dist/assets/studio/assets/media.pl-BIZYXHQa.js +2 -0
- package/dist/assets/studio/assets/media.pt-BR-C1Xda0__.js +2 -0
- package/dist/assets/studio/assets/media.ru-DQzNvBXO.js +2 -0
- package/dist/assets/studio/assets/media.tr-BaqtqqOw.js +2 -0
- package/dist/assets/studio/assets/media.uk-DGk-oYWc.js +2 -0
- package/dist/assets/studio/assets/media.zh-Hans-CrLAn2xd.js +2 -0
- package/dist/assets/studio/assets/menus.ar-BABqU-We.js +2 -0
- package/dist/assets/studio/assets/menus.de-Ba8EWf-g.js +2 -0
- package/dist/assets/studio/assets/menus.en-CJ5d7ms0.js +2 -0
- package/dist/assets/studio/assets/menus.es-CA6YLxuk.js +2 -0
- package/dist/assets/studio/assets/menus.fa-C7O8Jr5Z.js +2 -0
- package/dist/assets/studio/assets/menus.fr-Bq5ukcBM.js +2 -0
- package/dist/assets/studio/assets/menus.he-BiYUZo7X.js +2 -0
- package/dist/assets/studio/assets/menus.hi-CPYsx5YL.js +2 -0
- package/dist/assets/studio/assets/menus.id-B5JAh3Kk.js +2 -0
- package/dist/assets/studio/assets/menus.it-DpdTqaL4.js +2 -0
- package/dist/assets/studio/assets/menus.ja-NH9k2gC3.js +2 -0
- package/dist/assets/studio/assets/menus.ko-C_MCO4Mp.js +2 -0
- package/dist/assets/studio/assets/menus.nl-CLflbcbY.js +2 -0
- package/dist/assets/studio/assets/menus.pl-DLXN0-US.js +2 -0
- package/dist/assets/studio/assets/menus.pt-BR-Djh61S7r.js +2 -0
- package/dist/assets/studio/assets/menus.ru-Dn7rmQ8H.js +2 -0
- package/dist/assets/studio/assets/menus.tr-BOeLMbHv.js +2 -0
- package/dist/assets/studio/assets/menus.uk-BVwLEGId.js +2 -0
- package/dist/assets/studio/assets/menus.zh-Hans-X7QVgirl.js +2 -0
- package/dist/assets/studio/assets/meter-majprsslwmpbmkzg-DBo7nISC.js +2 -0
- package/dist/assets/studio/assets/names-R-Dypr9Y.js +2 -0
- package/dist/assets/studio/assets/nl-BiYEXj4B.js +6 -0
- package/dist/assets/studio/assets/nl-CraQgOQ0.js +2 -0
- package/dist/assets/studio/assets/pagination-oaenm9t7ou3lmcgw-DjC4Zsp5.js +2 -0
- package/dist/assets/studio/assets/pl-Iaem81Jv.js +6 -0
- package/dist/assets/studio/assets/pl-Z99ZIGWL.js +2 -0
- package/dist/assets/studio/assets/preload-helper-DjzSQ1t3.js +1 -0
- package/dist/assets/studio/assets/pt-BR-CM8N0OoK.js +6 -0
- package/dist/assets/studio/assets/pt-BR-CjvH9SeS.js +2 -0
- package/dist/assets/studio/assets/python-nrpnmxq4r6yp6fcd-gzcpVVnB.js +2 -0
- package/dist/assets/studio/assets/radio-35dx7y6rjrezbjsp-DY9M1ouC.js +2 -0
- package/dist/assets/studio/assets/react-CDCuUAOg.js +10 -0
- package/dist/assets/studio/assets/readers.ar-YaMfL_Lj.js +2 -0
- package/dist/assets/studio/assets/readers.de-wAkjNmXo.js +2 -0
- package/dist/assets/studio/assets/readers.en-CbmwKSip.js +2 -0
- package/dist/assets/studio/assets/readers.es-Clx8q_tO.js +2 -0
- package/dist/assets/studio/assets/readers.fa-8cssg4YZ.js +2 -0
- package/dist/assets/studio/assets/readers.fr-JJ3OFBav.js +2 -0
- package/dist/assets/studio/assets/readers.he-B0yqdtyq.js +2 -0
- package/dist/assets/studio/assets/readers.hi-i7cAeleO.js +2 -0
- package/dist/assets/studio/assets/readers.id-BdaxiKFf.js +2 -0
- package/dist/assets/studio/assets/readers.it-DXf3Um9S.js +2 -0
- package/dist/assets/studio/assets/readers.ja-B2eb6ZUO.js +2 -0
- package/dist/assets/studio/assets/readers.ko-BX4g0Q7l.js +2 -0
- package/dist/assets/studio/assets/readers.nl-cWSL2Ylr.js +2 -0
- package/dist/assets/studio/assets/readers.pl-C4WdmkML.js +2 -0
- package/dist/assets/studio/assets/readers.pt-BR-x4dMCgC9.js +2 -0
- package/dist/assets/studio/assets/readers.ru-BukUgT1q.js +2 -0
- package/dist/assets/studio/assets/readers.tr-nYS49xYR.js +2 -0
- package/dist/assets/studio/assets/readers.uk-DbcRoxdR.js +2 -0
- package/dist/assets/studio/assets/readers.zh-Hans-DcGU8fSg.js +2 -0
- package/dist/assets/studio/assets/reading-keys-CBjq-Jc-.js +2 -0
- package/dist/assets/studio/assets/resolveAriaLabelledBy-nc8mdie5shy87nsb-asx42i8W.js +2 -0
- package/dist/assets/studio/assets/resolveValueLabel-hpmsash3ektitvnb-X_gYut6U.js +2 -0
- package/dist/assets/studio/assets/roles-B7USahqW.js +2 -0
- package/dist/assets/studio/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/dist/assets/studio/assets/rolldown-runtime-hi7ti5xiuxsegr96-DK3Fl9T5.js +2 -0
- package/dist/assets/studio/assets/ru-2qsjd_Gm.js +6 -0
- package/dist/assets/studio/assets/ru-CwyHst7f.js +2 -0
- package/dist/assets/studio/assets/schedule-notices-DSgNUP07.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ar-DjCN-gPq.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.de-CkLy189g.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.en-Ke9GgFqw.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.es-DMlXyS4t.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.fa-B8pDw0e4.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.fr-D93CiYDm.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.he-Ce8vr2xp.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.hi-ClQTAEIx.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.id-TZ0m_tpl.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.it-v63UBHwg.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ja-DjNw2QpF.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ko-D-tIgkq1.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.nl-CQM8NRDu.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.pl-CUY8YZhH.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.pt-BR-2YkyZTua.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.ru-D-XI8CtL.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.tr-ChWn742p.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.uk-Czj_lfWV.js +2 -0
- package/dist/assets/studio/assets/scheduleSettings.zh-Hans-B1hytO83.js +2 -0
- package/dist/assets/studio/assets/schedules-BHug03zB.js +2 -0
- package/dist/assets/studio/assets/schedules-api-B7c4AXSw.js +2 -0
- package/dist/assets/studio/assets/schedules-search-B-7SpriY.js +2 -0
- package/dist/assets/studio/assets/schedules.ar-fkzR2RAY.js +2 -0
- package/dist/assets/studio/assets/schedules.de-DbgcJ6cl.js +2 -0
- package/dist/assets/studio/assets/schedules.en-D7O8u4iy.js +2 -0
- package/dist/assets/studio/assets/schedules.es-C3AvgW6g.js +2 -0
- package/dist/assets/studio/assets/schedules.fa-1UfcjmAY.js +2 -0
- package/dist/assets/studio/assets/schedules.fr-KDBHjGVO.js +2 -0
- package/dist/assets/studio/assets/schedules.he-D8Pds1dL.js +2 -0
- package/dist/assets/studio/assets/schedules.hi-DNpu7GlX.js +2 -0
- package/dist/assets/studio/assets/schedules.id-FewyiLfv.js +2 -0
- package/dist/assets/studio/assets/schedules.it-CY96E2q3.js +2 -0
- package/dist/assets/studio/assets/schedules.ja-CN3N8MH6.js +2 -0
- package/dist/assets/studio/assets/schedules.ko-B9ah4ZVM.js +2 -0
- package/dist/assets/studio/assets/schedules.nl-u3tZ7Ckd.js +2 -0
- package/dist/assets/studio/assets/schedules.pl-Bofx1Ubo.js +2 -0
- package/dist/assets/studio/assets/schedules.pt-BR-BFxLBiyp.js +2 -0
- package/dist/assets/studio/assets/schedules.ru-C5ZnKmGt.js +2 -0
- package/dist/assets/studio/assets/schedules.tr-Bfi96rHj.js +2 -0
- package/dist/assets/studio/assets/schedules.uk-BU4Kj6Az.js +2 -0
- package/dist/assets/studio/assets/schedules.zh-Hans-DDsu_SeS.js +2 -0
- package/dist/assets/studio/assets/scrollable-b6m9ze1u7ps0q1qn-BDQyLiel.js +2 -0
- package/dist/assets/studio/assets/select-futox5zqr3r80y9a-5U5PtwHa.js +2 -0
- package/dist/assets/studio/assets/seo-C-YSZ4mD.js +2 -0
- package/dist/assets/studio/assets/serializeValue-ipcakiw32jb7kany-B_EucO5O.js +2 -0
- package/dist/assets/studio/assets/shellscript-i4m7lo8wi0f5bl8b-CLZ0U2zV.js +2 -0
- package/dist/assets/studio/assets/site-settings-Cmq0DkaT.js +2 -0
- package/dist/assets/studio/assets/skeleton-line-m9dyh126t9k07jvg-CHsT8Hs3.js +4 -0
- package/dist/assets/studio/assets/sql-hqp2eekl7qhmxe92-BsFa4tDR.js +2 -0
- package/dist/assets/studio/assets/stringifyLocale-bxsgxdnzaef2vcar-CkHjdQTJ.js +2 -0
- package/dist/assets/studio/assets/styles-kl02oyrlnld7arja-BX5Ypy0Y.js +2 -0
- package/dist/assets/studio/assets/switch-cqsvolm7h69z7vgg-sFG02Szv.js +2 -0
- package/dist/assets/studio/assets/table-yf8ul2e5nbemioi1-DNq9jhfh.js +2 -0
- package/dist/assets/studio/assets/tabs-gf57qqf1wcclaejq-Cay-6qhK.js +2 -0
- package/dist/assets/studio/assets/tag-input-ohfybx5dbxy3houy-DhZt3VBi.js +2 -0
- package/dist/assets/studio/assets/tanstack-BiJ_7SEB.js +3 -0
- package/dist/assets/studio/assets/taxonomy-S-y5xbUa.js +2 -0
- package/dist/assets/studio/assets/toml-oyqrgosuct25x413-CcmNWLt0.js +2 -0
- package/dist/assets/studio/assets/toolbar-h213d8e22yjh5cwq-CipG_KSA.js +2 -0
- package/dist/assets/studio/assets/tr-BK-gVqHj.js +6 -0
- package/dist/assets/studio/assets/tr-DOAJHdbH.js +2 -0
- package/dist/assets/studio/assets/tsx-pem8x69upvmibv6l-udAQXfEw.js +2 -0
- package/dist/assets/studio/assets/typescript-pe5y016phdwbgws7-bsJCZSQ-.js +2 -0
- package/dist/assets/studio/assets/uk-9ZV1-TPI.js +2 -0
- package/dist/assets/studio/assets/uk-PoqqfkaM.js +6 -0
- package/dist/assets/studio/assets/useAnalyticsCard-MXajmsui.js +2 -0
- package/dist/assets/studio/assets/useAriaLabelledBy-ox8dum59shmgypq1-gkARNgzh.js +2 -0
- package/dist/assets/studio/assets/useBaseUiId-lg1teubxudgin0w2-CrAc3DRu.js +3 -0
- package/dist/assets/studio/assets/useButton-h7s9aq1sfw6arawe-BbWTOEat.js +4 -0
- package/dist/assets/studio/assets/useChartPalette-DXG2lo2x.js +2 -0
- package/dist/assets/studio/assets/useClick-l0p0endoxrlp0ae5-Bbq8u-IC.js +2 -0
- package/dist/assets/studio/assets/useCompositeItem-p7090ga00dpqcg5j-CiGYXm-8.js +2 -0
- package/dist/assets/studio/assets/useDebounced-DmPVYKCM.js +2 -0
- package/dist/assets/studio/assets/useListNavigation-3nyjs362qcau34in-DAKhz5rq.js +2 -0
- package/dist/assets/studio/assets/useMe-z-wff5FW.js +2 -0
- package/dist/assets/studio/assets/usePaging-BiNrjkE2.js +2 -0
- package/dist/assets/studio/assets/usePendingApprovals-BRHKM3-1.js +2 -0
- package/dist/assets/studio/assets/useRender-onwjigxa00uch2ip-DueSv9wh.js +2 -0
- package/dist/assets/studio/assets/useRenderDialogRoot-lddunc01twftravv-CpXvIQfS.js +2 -0
- package/dist/assets/studio/assets/useSettled-C0sKy_Gd.js +2 -0
- package/dist/assets/studio/assets/useTriggerFocusGuards-lz7wt484xltizro4-Dd4azd_G.js +2 -0
- package/dist/assets/studio/assets/util-B4GkKYcU.js +2 -0
- package/dist/assets/studio/assets/vesper-g839e590k3dxnwh3-DdrHHSXu.js +2 -0
- package/dist/assets/studio/assets/w3c-keyname-BOAvb0qz.js +2 -0
- package/dist/assets/studio/assets/wasm-cpasy0o9lsjrm39j-BnjxR4X6.js +2 -0
- package/dist/assets/studio/assets/workflow-D1TOv5ea.js +2 -0
- package/dist/assets/studio/assets/yaml-kzk5ddyekbyha04v-rwi0_p6S.js +2 -0
- package/dist/assets/studio/assets/zh-Hans-BYiQm8Cr.js +6 -0
- package/dist/assets/studio/assets/zh-Hans-D57DCm9K.js +2 -0
- package/dist/assets/studio/index.html +111 -0
- package/dist/bin/cloudhal.d.ts +2 -0
- package/dist/bin/cloudhal.js +10 -0
- package/dist/src/assets.d.ts +37 -0
- package/dist/src/assets.js +189 -0
- package/dist/src/blocks.d.ts +26 -0
- package/dist/src/blocks.js +102 -0
- package/dist/src/cli/commands-content.d.ts +7 -0
- package/dist/src/cli/commands-content.js +145 -0
- package/dist/src/cli/commands-local.d.ts +13 -0
- package/dist/src/cli/commands-local.js +167 -0
- package/dist/src/cli/commands-ops.d.ts +6 -0
- package/dist/src/cli/commands-ops.js +175 -0
- package/dist/src/cli/commands-remote.d.ts +8 -0
- package/dist/src/cli/commands-remote.js +131 -0
- package/dist/src/cli/commands-site.d.ts +4 -0
- package/dist/src/cli/commands-site.js +52 -0
- package/dist/src/cli/help.d.ts +2 -0
- package/dist/src/cli/help.js +83 -0
- package/dist/src/cli/prompts.d.ts +7 -0
- package/dist/src/cli/prompts.js +35 -0
- package/dist/src/cli/types.d.ts +26 -0
- package/dist/src/cli/types.js +42 -0
- package/dist/src/cli.d.ts +174 -0
- package/dist/src/cli.js +95 -0
- package/dist/src/cloudflare/admin.d.ts +54 -0
- package/dist/src/cloudflare/admin.js +156 -0
- package/dist/src/cloudflare/build.d.ts +5 -0
- package/dist/src/cloudflare/build.js +36 -0
- package/dist/src/cloudflare/config.d.ts +1082 -0
- package/dist/src/cloudflare/config.js +458 -0
- package/dist/src/cloudflare/search.d.ts +37 -0
- package/dist/src/cloudflare/search.js +47 -0
- package/dist/src/cloudflare/wrangler.d.ts +27 -0
- package/dist/src/cloudflare/wrangler.js +133 -0
- package/dist/src/commands/ai.d.ts +39 -0
- package/dist/src/commands/ai.js +264 -0
- package/dist/src/commands/analytics.d.ts +94 -0
- package/dist/src/commands/analytics.js +347 -0
- package/dist/src/commands/astro.d.ts +22 -0
- package/dist/src/commands/astro.js +87 -0
- package/dist/src/commands/chrome.d.ts +22 -0
- package/dist/src/commands/chrome.js +90 -0
- package/dist/src/commands/comments-local.d.ts +40 -0
- package/dist/src/commands/comments-local.js +114 -0
- package/dist/src/commands/comments.d.ts +45 -0
- package/dist/src/commands/comments.js +285 -0
- package/dist/src/commands/deploy/attach.d.ts +2 -0
- package/dist/src/commands/deploy/attach.js +190 -0
- package/dist/src/commands/deploy/context.d.ts +21 -0
- package/dist/src/commands/deploy/context.js +22 -0
- package/dist/src/commands/deploy/options.d.ts +98 -0
- package/dist/src/commands/deploy/options.js +106 -0
- package/dist/src/commands/deploy/prepare.d.ts +55 -0
- package/dist/src/commands/deploy/prepare.js +298 -0
- package/dist/src/commands/deploy/resources.d.ts +26 -0
- package/dist/src/commands/deploy/resources.js +157 -0
- package/dist/src/commands/deploy/schedules-guard.d.ts +24 -0
- package/dist/src/commands/deploy/schedules-guard.js +95 -0
- package/dist/src/commands/deploy/served-sites.d.ts +28 -0
- package/dist/src/commands/deploy/served-sites.js +86 -0
- package/dist/src/commands/deploy/settings.d.ts +24 -0
- package/dist/src/commands/deploy/settings.js +115 -0
- package/dist/src/commands/deploy/ship.d.ts +46 -0
- package/dist/src/commands/deploy/ship.js +174 -0
- package/dist/src/commands/deploy/state.d.ts +30 -0
- package/dist/src/commands/deploy/state.js +102 -0
- package/dist/src/commands/deploy.d.ts +52 -0
- package/dist/src/commands/deploy.js +223 -0
- package/dist/src/commands/domain.d.ts +15 -0
- package/dist/src/commands/domain.js +44 -0
- package/dist/src/commands/init.d.ts +18 -0
- package/dist/src/commands/init.js +142 -0
- package/dist/src/commands/mail-local.d.ts +7 -0
- package/dist/src/commands/mail-local.js +30 -0
- package/dist/src/commands/mcp.d.ts +22 -0
- package/dist/src/commands/mcp.js +113 -0
- package/dist/src/commands/media-placeholders.d.ts +29 -0
- package/dist/src/commands/media-placeholders.js +239 -0
- package/dist/src/commands/media.d.ts +32 -0
- package/dist/src/commands/media.js +182 -0
- package/dist/src/commands/migrate.d.ts +16 -0
- package/dist/src/commands/migrate.js +63 -0
- package/dist/src/commands/motion.d.ts +29 -0
- package/dist/src/commands/motion.js +118 -0
- package/dist/src/commands/owner.d.ts +18 -0
- package/dist/src/commands/owner.js +39 -0
- package/dist/src/commands/render.d.ts +26 -0
- package/dist/src/commands/render.js +94 -0
- package/dist/src/commands/scheduler-local.d.ts +55 -0
- package/dist/src/commands/scheduler-local.js +237 -0
- package/dist/src/commands/schedules.d.ts +32 -0
- package/dist/src/commands/schedules.js +170 -0
- package/dist/src/commands/search.d.ts +14 -0
- package/dist/src/commands/search.js +53 -0
- package/dist/src/commands/site.d.ts +46 -0
- package/dist/src/commands/site.js +151 -0
- package/dist/src/commands/snapshot.d.ts +10 -0
- package/dist/src/commands/snapshot.js +50 -0
- package/dist/src/commands/studio.d.ts +29 -0
- package/dist/src/commands/studio.js +172 -0
- package/dist/src/commands/sync.d.ts +42 -0
- package/dist/src/commands/sync.js +211 -0
- package/dist/src/commands/tokens.d.ts +12 -0
- package/dist/src/commands/tokens.js +45 -0
- package/dist/src/config-search.d.ts +24 -0
- package/dist/src/config-search.js +41 -0
- package/dist/src/config.d.ts +168 -0
- package/dist/src/config.js +348 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +82 -0
- package/dist/src/project-setup.d.ts +21 -0
- package/dist/src/project-setup.js +50 -0
- package/dist/src/render-chrome.d.ts +9 -0
- package/dist/src/render-chrome.js +140 -0
- package/dist/src/starter-files.d.ts +4 -0
- package/dist/src/starter-files.js +51 -0
- package/dist/src/studio-build.d.ts +43 -0
- package/dist/src/studio-build.js +138 -0
- package/package.json +63 -3
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The phases of `cloudhal deploy` that change Cloudflare: both Workers (secrets through files that
|
|
3
|
+
* exist only while wrangler runs), the first push and the site's domains, the one-time cache purge.
|
|
4
|
+
*/
|
|
5
|
+
import { chmod, rm, writeFile } from "node:fs/promises";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { openLocalStore } from "@cloudhal/core-ts/local";
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import { deployedUrls, isCronLimitError, must, WranglerError } from "../../cloudflare/wrangler.js";
|
|
15
|
+
import { pushSite, setPrimaryDomain } from "../sync.js";
|
|
16
|
+
|
|
17
|
+
import { purgeSite, waitForHealth } from "./resources.js";
|
|
18
|
+
import { CRON_REFUSED_MESSAGE } from "./schedules-guard.js";
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `wrangler deploy` for the site Worker, then the admin Worker. When Cloudflare refuses the cron
|
|
25
|
+
* trigger (RFC-0008 §8.3: Workers Free allows 5 per account), the same Worker goes without it and
|
|
26
|
+
* the SchedulerClock alarm ticks instead.
|
|
27
|
+
*/
|
|
28
|
+
export async function shipWorkers(
|
|
29
|
+
ctx ,
|
|
30
|
+
input
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
{
|
|
41
|
+
const { options, run, names, log, dir } = ctx;
|
|
42
|
+
const { secrets, admin } = input;
|
|
43
|
+
let scheduler = input.scheduler;
|
|
44
|
+
// Secrets go to wrangler through files that exist only while it runs (0600, then removed).
|
|
45
|
+
const siteSecretsFile = path.join(dir, "site-secrets.json");
|
|
46
|
+
const adminSecretsFile = path.join(dir, "admin-secrets.json");
|
|
47
|
+
const writeSecret = async (file , value ) => {
|
|
48
|
+
await writeFile(file, JSON.stringify(value), { mode: 0o600 });
|
|
49
|
+
await chmod(file, 0o600);
|
|
50
|
+
};
|
|
51
|
+
let siteDeploy ;
|
|
52
|
+
let adminDeploy ;
|
|
53
|
+
try {
|
|
54
|
+
await writeSecret(siteSecretsFile, {
|
|
55
|
+
CLOUDHAL_PREVIEW_SECRET: secrets.CLOUDHAL_PREVIEW_SECRET,
|
|
56
|
+
CLOUDHAL_PURGE_TOKEN: secrets.CLOUDHAL_PURGE_TOKEN,
|
|
57
|
+
// RFC-0007: the same value as the admin Worker's (proof of work, emails, stored secrets)
|
|
58
|
+
CLOUDHAL_COMMENTS_KEY: secrets.CLOUDHAL_COMMENTS_KEY,
|
|
59
|
+
});
|
|
60
|
+
await writeSecret(adminSecretsFile, secrets);
|
|
61
|
+
log(`deploying ${names.site}`);
|
|
62
|
+
siteDeploy = await must(run, ["deploy", "--secrets-file", siteSecretsFile], options.projectDir);
|
|
63
|
+
log(`deploying ${names.admin}`);
|
|
64
|
+
const adminArgs = ["deploy", "-c", admin.configPath, "--secrets-file", adminSecretsFile];
|
|
65
|
+
adminDeploy = await run(adminArgs, { cwd: admin.dir });
|
|
66
|
+
if (
|
|
67
|
+
adminDeploy.code !== 0 &&
|
|
68
|
+
scheduler === "cron" &&
|
|
69
|
+
isCronLimitError(adminDeploy.stderr + adminDeploy.stdout)
|
|
70
|
+
) {
|
|
71
|
+
log(CRON_REFUSED_MESSAGE);
|
|
72
|
+
scheduler = "alarm";
|
|
73
|
+
await input.prepareAdmin(scheduler);
|
|
74
|
+
adminDeploy = await run(adminArgs, { cwd: admin.dir });
|
|
75
|
+
}
|
|
76
|
+
if (adminDeploy.code !== 0)
|
|
77
|
+
throw new WranglerError(
|
|
78
|
+
`wrangler ${adminArgs.join(" ")} failed:\n${(adminDeploy.stderr || adminDeploy.stdout).slice(-3000)}`,
|
|
79
|
+
);
|
|
80
|
+
} finally {
|
|
81
|
+
await rm(siteSecretsFile, { force: true });
|
|
82
|
+
await rm(adminSecretsFile, { force: true });
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
siteUrl: deployedUrls(siteDeploy.records)[0],
|
|
86
|
+
adminUrl: deployedUrls(adminDeploy.records)[0],
|
|
87
|
+
scheduler,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* 5. first deploy: push the local site, and make the site's hostname primary (the custom domain
|
|
93
|
+
* when there is one). Returns whether the site was pushed.
|
|
94
|
+
*/
|
|
95
|
+
export async function afterDeploy(
|
|
96
|
+
ctx ,
|
|
97
|
+
{ siteUrl, adminUrl } ,
|
|
98
|
+
) {
|
|
99
|
+
const { options, cfg, site, previous, log } = ctx;
|
|
100
|
+
if (!adminUrl) return false;
|
|
101
|
+
// A brand-new workers.dev hostname can take a while to answer; wait instead of failing.
|
|
102
|
+
await waitForHealth(adminUrl, options.fetch ?? fetch, log, options.healthTimeoutMs ?? 120_000);
|
|
103
|
+
if (siteUrl && !(site.domains ?? []).length) {
|
|
104
|
+
// Preview links need the public hostname of the site.
|
|
105
|
+
const l = await openLocalStore(path.join(options.projectDir, cfg.dataDir));
|
|
106
|
+
const current = await l.store.getSite(cfg.siteId);
|
|
107
|
+
if (current)
|
|
108
|
+
await l.store.updateSite({
|
|
109
|
+
...current,
|
|
110
|
+
domains: [{ hostname: new URL(siteUrl).hostname, primary: true }],
|
|
111
|
+
});
|
|
112
|
+
await l.close();
|
|
113
|
+
}
|
|
114
|
+
const result = await pushSite({
|
|
115
|
+
projectDir: options.projectDir,
|
|
116
|
+
ifAbsent: true,
|
|
117
|
+
log,
|
|
118
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
119
|
+
});
|
|
120
|
+
// A custom domain becomes the site's primary hostname (the workers.dev one stays secondary).
|
|
121
|
+
if (cfg.domains?.site) {
|
|
122
|
+
await setPrimaryDomain({
|
|
123
|
+
projectDir: options.projectDir,
|
|
124
|
+
hostname: cfg.domains.site,
|
|
125
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
126
|
+
});
|
|
127
|
+
log(
|
|
128
|
+
`site domain: https://${cfg.domains.site} (Cloudflare issues the certificate on first use)`,
|
|
129
|
+
);
|
|
130
|
+
} else if (previous?.siteDomain && siteUrl) {
|
|
131
|
+
// The custom domain was removed from cloudhal.json: workers.dev is primary again.
|
|
132
|
+
await setPrimaryDomain({
|
|
133
|
+
projectDir: options.projectDir,
|
|
134
|
+
hostname: new URL(siteUrl).hostname,
|
|
135
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
136
|
+
});
|
|
137
|
+
log(
|
|
138
|
+
`site domain ${previous.siteDomain} removed from cloudhal.json; if Cloudflare still lists it under the Worker's Domains & Routes, remove it there`,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return result.pushed;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Analytics switched on (or off): purge the site's cache once, so cached pages gain (or lose)
|
|
146
|
+
* the script tag. The admin Worker ran migration 0014 on the health check; until it has, the Site
|
|
147
|
+
* Worker counts analytics as off (fail closed). Comments availability likewise (RFC-0007): pages
|
|
148
|
+
* cached before carry no `cloudhal-comments-<id>` tag, so a site turning comments on later could
|
|
149
|
+
* not reach them.
|
|
150
|
+
*/
|
|
151
|
+
export async function purgeIfSwitched(
|
|
152
|
+
ctx ,
|
|
153
|
+
input
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
,
|
|
159
|
+
) {
|
|
160
|
+
const { previous, options, log } = ctx;
|
|
161
|
+
const { siteUrl, analytics, comments } = input;
|
|
162
|
+
let purged = false;
|
|
163
|
+
const analyticsChanged = (previous?.analytics ?? "off") !== (analytics ? "on" : "off");
|
|
164
|
+
const commentsChanged = (previous?.comments ?? "off") !== (comments.available ? "on" : "off");
|
|
165
|
+
if (siteUrl && (analyticsChanged || commentsChanged)) {
|
|
166
|
+
purged = await purgeSite(siteUrl, input.purgeToken, options.fetch ?? fetch, log);
|
|
167
|
+
const what = [
|
|
168
|
+
...(analyticsChanged ? [`analytics ${analytics ? "on" : "off"}`] : []),
|
|
169
|
+
...(commentsChanged ? [`comments ${comments.available ? "available" : "unavailable"}`] : []),
|
|
170
|
+
];
|
|
171
|
+
if (purged) log(`${what.join(", ")}: purged the site cache`);
|
|
172
|
+
}
|
|
173
|
+
return { purged, analyticsChanged, commentsChanged };
|
|
174
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SchedulerTicker, WorkersPlan } from "../../cloudflare/config.js";
|
|
2
|
+
export declare const SECRET_KEYS: readonly ["BETTER_AUTH_SECRET", "MCP_STATE_KEY", "CLOUDHAL_PREVIEW_SECRET", "CLOUDHAL_PURGE_TOKEN", "CLOUDHAL_DEPLOY_TOKEN", "CLOUDHAL_SETUP_TOKEN", "CLOUDHAL_COMMENTS_KEY"];
|
|
3
|
+
export type DeploySecrets = Record<(typeof SECRET_KEYS)[number], string>;
|
|
4
|
+
export interface DeployState {
|
|
5
|
+
name: string;
|
|
6
|
+
adminUrl?: string;
|
|
7
|
+
siteUrl?: string;
|
|
8
|
+
deployedAt?: string;
|
|
9
|
+
/** The custom site domain this deploy routed, so removing it later restores workers.dev. */
|
|
10
|
+
siteDomain?: string;
|
|
11
|
+
/** Whether the last deploy had analytics on (a change purges the site's cache once). */
|
|
12
|
+
analytics?: "on" | "off";
|
|
13
|
+
/** Whether the last deploy had reader comments available (a change purges once too). */
|
|
14
|
+
comments?: "on" | "off";
|
|
15
|
+
/** Where a deploy of this project created the D1 database (absent: before RFC-0007). */
|
|
16
|
+
jurisdiction?: Jurisdiction;
|
|
17
|
+
/** What drives the scheduler (RFC-0008 §8.3): the cron trigger, or the Durable Object alarm. */
|
|
18
|
+
scheduler?: SchedulerTicker;
|
|
19
|
+
/** The Workers plan the tick budget was sized for (`--plan`, RFC-0008 §8.2). */
|
|
20
|
+
plan?: WorkersPlan;
|
|
21
|
+
}
|
|
22
|
+
/** D1 data location (RFC-0007 D7): `auto` (Cloudflare picks) or the EU jurisdiction. */
|
|
23
|
+
export type Jurisdiction = "auto" | "eu";
|
|
24
|
+
export declare function exists(p: string): Promise<boolean>;
|
|
25
|
+
export declare const deployDir: (projectDir: string, dataDir: string) => string;
|
|
26
|
+
export declare function randomSecret(): string;
|
|
27
|
+
/** Secrets are generated once per project and reused on every deploy. */
|
|
28
|
+
export declare function loadOrCreateSecrets(dir: string): Promise<DeploySecrets>;
|
|
29
|
+
export declare function readDeployState(projectDir: string, dataDir: string): Promise<DeployState | undefined>;
|
|
30
|
+
export declare function writeDeployState(projectDir: string, dataDir: string, state: DeployState): Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** Deploy secrets (generated once per project) and the last deploy's state under `.cloudhal/deploy`. */
|
|
2
|
+
import { access, chmod, mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
export const SECRET_KEYS = [
|
|
7
|
+
"BETTER_AUTH_SECRET",
|
|
8
|
+
"MCP_STATE_KEY",
|
|
9
|
+
"CLOUDHAL_PREVIEW_SECRET",
|
|
10
|
+
"CLOUDHAL_PURGE_TOKEN",
|
|
11
|
+
"CLOUDHAL_DEPLOY_TOKEN",
|
|
12
|
+
"CLOUDHAL_SETUP_TOKEN",
|
|
13
|
+
// RFC-0007: proof-of-work MACs, email encryption and hashes, stored secrets; both Workers.
|
|
14
|
+
"CLOUDHAL_COMMENTS_KEY",
|
|
15
|
+
] ;
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/** D1 data location (RFC-0007 D7): `auto` (Cloudflare picks) or the EU jurisdiction. */
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
export async function exists(p ) {
|
|
41
|
+
try {
|
|
42
|
+
await access(p);
|
|
43
|
+
return true;
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const deployDir = (projectDir , dataDir ) =>
|
|
50
|
+
path.join(projectDir, dataDir, "deploy");
|
|
51
|
+
|
|
52
|
+
export function randomSecret() {
|
|
53
|
+
const bytes = crypto.getRandomValues(new Uint8Array(32));
|
|
54
|
+
return btoa(String.fromCharCode(...bytes))
|
|
55
|
+
.replace(/\+/g, "-")
|
|
56
|
+
.replace(/\//g, "_")
|
|
57
|
+
.replace(/=+$/, "");
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Secrets are generated once per project and reused on every deploy. */
|
|
61
|
+
export async function loadOrCreateSecrets(dir ) {
|
|
62
|
+
const file = path.join(dir, "secrets.json");
|
|
63
|
+
let current = {};
|
|
64
|
+
try {
|
|
65
|
+
current = JSON.parse(await readFile(file, "utf8")) ;
|
|
66
|
+
} catch {
|
|
67
|
+
// first deploy
|
|
68
|
+
}
|
|
69
|
+
const secrets = { ...current } ;
|
|
70
|
+
let changed = false;
|
|
71
|
+
for (const key of SECRET_KEYS)
|
|
72
|
+
if (!secrets[key] || secrets[key].length < 32) {
|
|
73
|
+
secrets[key] = randomSecret();
|
|
74
|
+
changed = true;
|
|
75
|
+
}
|
|
76
|
+
if (changed) {
|
|
77
|
+
await mkdir(dir, { recursive: true });
|
|
78
|
+
await writeFile(file, `${JSON.stringify(secrets, null, 2)}\n`, { mode: 0o600 });
|
|
79
|
+
await chmod(file, 0o600);
|
|
80
|
+
}
|
|
81
|
+
return secrets;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function readDeployState(
|
|
85
|
+
projectDir ,
|
|
86
|
+
dataDir ,
|
|
87
|
+
) {
|
|
88
|
+
try {
|
|
89
|
+
return JSON.parse(
|
|
90
|
+
await readFile(path.join(deployDir(projectDir, dataDir), "state.json"), "utf8"),
|
|
91
|
+
) ;
|
|
92
|
+
} catch {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function writeDeployState(projectDir , dataDir , state ) {
|
|
98
|
+
await writeFile(
|
|
99
|
+
path.join(deployDir(projectDir, dataDir), "state.json"),
|
|
100
|
+
`${JSON.stringify(state, null, 2)}\n`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cloudhal deploy` — puts the project on Cloudflare (ADR-0012):
|
|
3
|
+
*
|
|
4
|
+
* 1. D1 database + R2 bucket (created if missing; ids recorded in the wrangler configs)
|
|
5
|
+
* 2. secrets generated once into `<dataDir>/deploy/secrets.json` (0600, never committed)
|
|
6
|
+
* 3. site Worker: `astro build` for the cloudflare target, `wrangler deploy`
|
|
7
|
+
* 4. admin Worker: generated entry + bundled skills + built Studio, `wrangler deploy`
|
|
8
|
+
* 5. push: the local site (graph, snapshots, blobs) through the admin API — first deploy only;
|
|
9
|
+
* afterwards the deployment is the source of truth (use `cloudhal pull`).
|
|
10
|
+
* 6. analytics (RFC-0006 §11): with `analytics` on in cloudhal.json both configs get their
|
|
11
|
+
* bindings and vars (wrangler ≥ 4.145 is required); a project without the key is asked once in
|
|
12
|
+
* a terminal (non-interactive: off). When analytics switch on or off the site's cache is purged
|
|
13
|
+
* once, so pages gain or lose the script tag. `analytics.rateLimit` adds the beacon's Workers
|
|
14
|
+
* Rate Limiting binding (`ANALYTICS_RL`).
|
|
15
|
+
* 7. reader comments (RFC-0007 §15.4): available unless `comments.available` is `false`, and
|
|
16
|
+
* still off for every site until someone turns them on in Studio. `CLOUDHAL_COMMENTS_KEY` is
|
|
17
|
+
* generated once with the other secrets and given to both Workers; the admin Worker gets
|
|
18
|
+
* `CLOUDHAL_COMMENTS_AVAILABLE`; `comments.rateLimit` adds `COMMENTS_RL`. When availability
|
|
19
|
+
* changes the site's cache is purged once (pages gain or lose the comments tag).
|
|
20
|
+
* 8. data location (RFC-0007 D7): only when this deploy creates the D1 database, `--jurisdiction
|
|
21
|
+
* eu` (or the terminal question) creates it in the EU jurisdiction. It cannot change later;
|
|
22
|
+
* existing databases are never touched.
|
|
23
|
+
* 9. the scheduler (RFC-0008 §8.2–§8.3, §16): the admin Worker gets the minute cron trigger
|
|
24
|
+
* (`* * * * *`, the slot the hourly jobs used), the `SchedulerClock` Durable Object binding and
|
|
25
|
+
* migration (always), and `CLOUDHAL_SCHEDULER`. When Cloudflare refuses the trigger (Workers
|
|
26
|
+
* Free allows 5 per account) it redeploys without it and with `CLOUDHAL_SCHEDULER=alarm`; the
|
|
27
|
+
* ticker is remembered in `state.json` (`--scheduler cron` tries the trigger again). A
|
|
28
|
+
* deployment last deployed with the legacy `CLOUDHAL_*_CRON=off` starts as `alarm`.
|
|
29
|
+
* 10. the downgrade guard (RFC-0008 Compatibility): code whose schedules level is lower than the
|
|
30
|
+
* deployment's would ignore holds and time gates, so it is refused while the deployment has
|
|
31
|
+
* open releases or gated pages and entries, unless `--force-downgrade`.
|
|
32
|
+
* 11. the tick budget and the automations switch (RFC-0008 §8.2, §11.6): the admin Worker always
|
|
33
|
+
* gets `CLOUDHAL_TICK_BUDGET` (`free` unless `--plan paid` or `schedules.plan` says `paid`; the
|
|
34
|
+
* plan is remembered in `state.json`) and `CLOUDHAL_AUTOMATIONS` (`off` when
|
|
35
|
+
* `schedules.automations` is `false`). Cloudflare offers no cheap, reliable way to read an
|
|
36
|
+
* account's Workers plan with wrangler's login, so the owner says it once.
|
|
37
|
+
* 12. the Studio build: running from the monorepo, the admin Worker gets `apps/studio/dist`, which
|
|
38
|
+
* only a build keeps current. When it is missing or older than the newest file in
|
|
39
|
+
* `apps/studio/src`, `apps/studio/index.html` or `packages/ui/src`, the deploy runs
|
|
40
|
+
* `pnpm --filter @cloudhal/studio build` first; `--no-build-studio` fails instead. A published
|
|
41
|
+
* install ships Studio prebuilt and is never checked.
|
|
42
|
+
*
|
|
43
|
+
* `--dry-run` runs everything up to wrangler's own `--dry-run` (bundles, configs) and skips
|
|
44
|
+
* provisioning, deployment and push — no Cloudflare account needed.
|
|
45
|
+
*/
|
|
46
|
+
import type { DeployOptions, DeployResult } from "./deploy/options.js";
|
|
47
|
+
export type { DeployOptions, DeployResult } from "./deploy/options.js";
|
|
48
|
+
export { BUNDLE_LIFECYCLE_DAYS, BUNDLE_LIFECYCLE_RULE } from "./deploy/resources.js";
|
|
49
|
+
export { CRON_REFUSED_MESSAGE, projectSchedulesLevel, type SchedulesStatus, } from "./deploy/schedules-guard.js";
|
|
50
|
+
export { commentsRateLimitDeployment, DEFAULT_QUERY_BUDGET, observabilityOf, rateLimitDeployment, } from "./deploy/settings.js";
|
|
51
|
+
export { type DeploySecrets, type DeployState, deployDir, type Jurisdiction, loadOrCreateSecrets, readDeployState, SECRET_KEYS, } from "./deploy/state.js";
|
|
52
|
+
export declare function deploy(options: DeployOptions): Promise<DeployResult>;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cloudhal deploy` — puts the project on Cloudflare (ADR-0012):
|
|
3
|
+
*
|
|
4
|
+
* 1. D1 database + R2 bucket (created if missing; ids recorded in the wrangler configs)
|
|
5
|
+
* 2. secrets generated once into `<dataDir>/deploy/secrets.json` (0600, never committed)
|
|
6
|
+
* 3. site Worker: `astro build` for the cloudflare target, `wrangler deploy`
|
|
7
|
+
* 4. admin Worker: generated entry + bundled skills + built Studio, `wrangler deploy`
|
|
8
|
+
* 5. push: the local site (graph, snapshots, blobs) through the admin API — first deploy only;
|
|
9
|
+
* afterwards the deployment is the source of truth (use `cloudhal pull`).
|
|
10
|
+
* 6. analytics (RFC-0006 §11): with `analytics` on in cloudhal.json both configs get their
|
|
11
|
+
* bindings and vars (wrangler ≥ 4.145 is required); a project without the key is asked once in
|
|
12
|
+
* a terminal (non-interactive: off). When analytics switch on or off the site's cache is purged
|
|
13
|
+
* once, so pages gain or lose the script tag. `analytics.rateLimit` adds the beacon's Workers
|
|
14
|
+
* Rate Limiting binding (`ANALYTICS_RL`).
|
|
15
|
+
* 7. reader comments (RFC-0007 §15.4): available unless `comments.available` is `false`, and
|
|
16
|
+
* still off for every site until someone turns them on in Studio. `CLOUDHAL_COMMENTS_KEY` is
|
|
17
|
+
* generated once with the other secrets and given to both Workers; the admin Worker gets
|
|
18
|
+
* `CLOUDHAL_COMMENTS_AVAILABLE`; `comments.rateLimit` adds `COMMENTS_RL`. When availability
|
|
19
|
+
* changes the site's cache is purged once (pages gain or lose the comments tag).
|
|
20
|
+
* 8. data location (RFC-0007 D7): only when this deploy creates the D1 database, `--jurisdiction
|
|
21
|
+
* eu` (or the terminal question) creates it in the EU jurisdiction. It cannot change later;
|
|
22
|
+
* existing databases are never touched.
|
|
23
|
+
* 9. the scheduler (RFC-0008 §8.2–§8.3, §16): the admin Worker gets the minute cron trigger
|
|
24
|
+
* (`* * * * *`, the slot the hourly jobs used), the `SchedulerClock` Durable Object binding and
|
|
25
|
+
* migration (always), and `CLOUDHAL_SCHEDULER`. When Cloudflare refuses the trigger (Workers
|
|
26
|
+
* Free allows 5 per account) it redeploys without it and with `CLOUDHAL_SCHEDULER=alarm`; the
|
|
27
|
+
* ticker is remembered in `state.json` (`--scheduler cron` tries the trigger again). A
|
|
28
|
+
* deployment last deployed with the legacy `CLOUDHAL_*_CRON=off` starts as `alarm`.
|
|
29
|
+
* 10. the downgrade guard (RFC-0008 Compatibility): code whose schedules level is lower than the
|
|
30
|
+
* deployment's would ignore holds and time gates, so it is refused while the deployment has
|
|
31
|
+
* open releases or gated pages and entries, unless `--force-downgrade`.
|
|
32
|
+
* 11. the tick budget and the automations switch (RFC-0008 §8.2, §11.6): the admin Worker always
|
|
33
|
+
* gets `CLOUDHAL_TICK_BUDGET` (`free` unless `--plan paid` or `schedules.plan` says `paid`; the
|
|
34
|
+
* plan is remembered in `state.json`) and `CLOUDHAL_AUTOMATIONS` (`off` when
|
|
35
|
+
* `schedules.automations` is `false`). Cloudflare offers no cheap, reliable way to read an
|
|
36
|
+
* account's Workers plan with wrangler's login, so the owner says it once.
|
|
37
|
+
* 12. the Studio build: running from the monorepo, the admin Worker gets `apps/studio/dist`, which
|
|
38
|
+
* only a build keeps current. When it is missing or older than the newest file in
|
|
39
|
+
* `apps/studio/src`, `apps/studio/index.html` or `packages/ui/src`, the deploy runs
|
|
40
|
+
* `pnpm --filter @cloudhal/studio build` first; `--no-build-studio` fails instead. A published
|
|
41
|
+
* install ships Studio prebuilt and is never checked.
|
|
42
|
+
*
|
|
43
|
+
* `--dry-run` runs everything up to wrangler's own `--dry-run` (bundles, configs) and skips
|
|
44
|
+
* provisioning, deployment and push — no Cloudflare account needed.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
import path from "node:path";
|
|
48
|
+
import { prepareAdminWorker } from "../cloudflare/admin.js";
|
|
49
|
+
|
|
50
|
+
import { must } from "../cloudflare/wrangler.js";
|
|
51
|
+
import { readProjectConfig } from "../config.js";
|
|
52
|
+
import { deployAttached } from "./deploy/attach.js";
|
|
53
|
+
|
|
54
|
+
import {
|
|
55
|
+
analyticsAndComments,
|
|
56
|
+
buildSite,
|
|
57
|
+
checkOptions,
|
|
58
|
+
deploySettings,
|
|
59
|
+
loadDeploy,
|
|
60
|
+
provision,
|
|
61
|
+
studioDirFor,
|
|
62
|
+
} from "./deploy/prepare.js";
|
|
63
|
+
import { downgradeGuard } from "./deploy/schedules-guard.js";
|
|
64
|
+
import { attachedWorkers } from "./deploy/served-sites.js";
|
|
65
|
+
import { commentsResult } from "./deploy/settings.js";
|
|
66
|
+
import { afterDeploy, purgeIfSwitched, shipWorkers } from "./deploy/ship.js";
|
|
67
|
+
import { loadOrCreateSecrets, writeDeployState } from "./deploy/state.js";
|
|
68
|
+
import { resolveSkillsDir } from "./mcp.js";
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
export { BUNDLE_LIFECYCLE_DAYS, BUNDLE_LIFECYCLE_RULE } from "./deploy/resources.js";
|
|
72
|
+
export {
|
|
73
|
+
CRON_REFUSED_MESSAGE,
|
|
74
|
+
projectSchedulesLevel,
|
|
75
|
+
|
|
76
|
+
} from "./deploy/schedules-guard.js";
|
|
77
|
+
export {
|
|
78
|
+
commentsRateLimitDeployment,
|
|
79
|
+
DEFAULT_QUERY_BUDGET,
|
|
80
|
+
observabilityOf,
|
|
81
|
+
rateLimitDeployment,
|
|
82
|
+
} from "./deploy/settings.js";
|
|
83
|
+
export {
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
deployDir,
|
|
87
|
+
|
|
88
|
+
loadOrCreateSecrets,
|
|
89
|
+
readDeployState,
|
|
90
|
+
SECRET_KEYS,
|
|
91
|
+
} from "./deploy/state.js";
|
|
92
|
+
|
|
93
|
+
export async function deploy(options ) {
|
|
94
|
+
checkOptions(options);
|
|
95
|
+
// RFC-0034 §4: a site Worker that joins another installation deploys only itself.
|
|
96
|
+
if ((await readProjectConfig(options.projectDir)).installation) return deployAttached(options);
|
|
97
|
+
const ctx = await loadDeploy(options);
|
|
98
|
+
const { cfg, log, previous, base, names } = ctx;
|
|
99
|
+
const { analytics, comments } = await analyticsAndComments(ctx);
|
|
100
|
+
const studioDir = await studioDirFor(ctx);
|
|
101
|
+
const { withIds, databaseCreated } = await provision(ctx);
|
|
102
|
+
// 2. secrets; 2b. RFC-0008: never deploy code that ignores holds and gates over open releases
|
|
103
|
+
const secrets = await loadOrCreateSecrets(ctx.dir);
|
|
104
|
+
if (!options.dryRun && previous?.adminUrl)
|
|
105
|
+
await downgradeGuard(options, previous.adminUrl, secrets.CLOUDHAL_DEPLOY_TOKEN, log);
|
|
106
|
+
const settings = await deploySettings(ctx);
|
|
107
|
+
const { plan, schedules, observability } = settings;
|
|
108
|
+
const site = await buildSite(ctx, { withIds, analytics, comments, observability });
|
|
109
|
+
|
|
110
|
+
// 4. admin Worker, bound to every site Worker attached to this installation (RFC-0034 §4)
|
|
111
|
+
const skillsDir = await resolveSkillsDir(options.projectDir);
|
|
112
|
+
const siteWorkers = await attachedWorkers(ctx);
|
|
113
|
+
const prepareAdmin = (ticker ) =>
|
|
114
|
+
prepareAdminWorker({
|
|
115
|
+
projectDir: options.projectDir,
|
|
116
|
+
dataDir: cfg.dataDir,
|
|
117
|
+
names: withIds,
|
|
118
|
+
siteId: cfg.siteId,
|
|
119
|
+
...(cfg.sites ? { siteIds: cfg.sites } : {}),
|
|
120
|
+
siteWorkers,
|
|
121
|
+
studioDir,
|
|
122
|
+
skillsDir,
|
|
123
|
+
blockTypes: site.blockTypes,
|
|
124
|
+
themeSettings: site.themeSettings,
|
|
125
|
+
themeDesign: site.themeDesign,
|
|
126
|
+
domain: cfg.domains?.studio,
|
|
127
|
+
analytics,
|
|
128
|
+
comments,
|
|
129
|
+
scheduler: ticker,
|
|
130
|
+
schedules,
|
|
131
|
+
mail: cfg.mail,
|
|
132
|
+
ai: Boolean(cfg.ai),
|
|
133
|
+
browser: cfg.render !== false,
|
|
134
|
+
observability,
|
|
135
|
+
placement: cfg.placement,
|
|
136
|
+
});
|
|
137
|
+
const admin = await prepareAdmin(settings.scheduler);
|
|
138
|
+
|
|
139
|
+
if (options.dryRun) {
|
|
140
|
+
await must(
|
|
141
|
+
ctx.run,
|
|
142
|
+
["deploy", "--dry-run", "--outdir", path.join(ctx.dir, "out/site")],
|
|
143
|
+
options.projectDir,
|
|
144
|
+
);
|
|
145
|
+
await must(
|
|
146
|
+
ctx.run,
|
|
147
|
+
["deploy", "-c", admin.configPath, "--dry-run", "--outdir", path.join(ctx.dir, "out/admin")],
|
|
148
|
+
admin.dir,
|
|
149
|
+
);
|
|
150
|
+
log("dry run complete: bundles in .cloudhal/deploy/out");
|
|
151
|
+
return {
|
|
152
|
+
dryRun: true,
|
|
153
|
+
names,
|
|
154
|
+
siteConfig: site.siteConfig,
|
|
155
|
+
adminConfig: admin.configPath,
|
|
156
|
+
scheduler: settings.scheduler,
|
|
157
|
+
schedules,
|
|
158
|
+
analytics: analytics
|
|
159
|
+
? { enabled: true, dataset: analytics.dataset, cron: settings.scheduler === "cron" }
|
|
160
|
+
: { enabled: false },
|
|
161
|
+
comments: commentsResult(comments, settings.scheduler),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const { siteUrl, adminUrl, scheduler } = await shipWorkers(ctx, {
|
|
166
|
+
secrets,
|
|
167
|
+
admin,
|
|
168
|
+
prepareAdmin,
|
|
169
|
+
scheduler: settings.scheduler,
|
|
170
|
+
});
|
|
171
|
+
// where the database lives, when a deploy of this deployment name created it
|
|
172
|
+
const jurisdiction =
|
|
173
|
+
databaseCreated ?? (previous?.name === base.name ? previous.jurisdiction : undefined);
|
|
174
|
+
await writeDeployState(options.projectDir, cfg.dataDir, {
|
|
175
|
+
name: base.name,
|
|
176
|
+
...(adminUrl ? { adminUrl } : {}),
|
|
177
|
+
...(siteUrl ? { siteUrl } : {}),
|
|
178
|
+
deployedAt: new Date().toISOString(),
|
|
179
|
+
...(cfg.domains?.site ? { siteDomain: cfg.domains.site } : {}),
|
|
180
|
+
analytics: analytics ? "on" : "off",
|
|
181
|
+
comments: comments.available ? "on" : "off",
|
|
182
|
+
...(jurisdiction ? { jurisdiction } : {}),
|
|
183
|
+
scheduler,
|
|
184
|
+
plan,
|
|
185
|
+
});
|
|
186
|
+
const pushed = await afterDeploy(ctx, { siteUrl, adminUrl });
|
|
187
|
+
const { purged, analyticsChanged, commentsChanged } = await purgeIfSwitched(ctx, {
|
|
188
|
+
siteUrl,
|
|
189
|
+
analytics,
|
|
190
|
+
comments,
|
|
191
|
+
purgeToken: secrets.CLOUDHAL_PURGE_TOKEN,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
// First deploy: the owner account can only be created through this one-time link.
|
|
195
|
+
const setupUrl =
|
|
196
|
+
pushed && adminUrl
|
|
197
|
+
? `${adminUrl.replace(/\/$/, "")}/login#setup=${secrets.CLOUDHAL_SETUP_TOKEN}`
|
|
198
|
+
: undefined;
|
|
199
|
+
return {
|
|
200
|
+
dryRun: false,
|
|
201
|
+
names,
|
|
202
|
+
siteConfig: site.siteConfig,
|
|
203
|
+
adminConfig: admin.configPath,
|
|
204
|
+
siteUrl,
|
|
205
|
+
adminUrl,
|
|
206
|
+
pushed,
|
|
207
|
+
...(setupUrl ? { setupUrl } : {}),
|
|
208
|
+
...(cfg.domains?.site ? { customSiteUrl: `https://${cfg.domains.site}` } : {}),
|
|
209
|
+
...(cfg.domains?.studio ? { customStudioUrl: `https://${cfg.domains.studio}` } : {}),
|
|
210
|
+
scheduler,
|
|
211
|
+
schedules,
|
|
212
|
+
analytics: analytics
|
|
213
|
+
? {
|
|
214
|
+
enabled: true,
|
|
215
|
+
dataset: analytics.dataset,
|
|
216
|
+
cron: scheduler === "cron",
|
|
217
|
+
purged: purged && analyticsChanged,
|
|
218
|
+
}
|
|
219
|
+
: { enabled: false, ...(purged && analyticsChanged ? { purged } : {}) },
|
|
220
|
+
comments: commentsResult(comments, scheduler, purged && commentsChanged),
|
|
221
|
+
...(databaseCreated ? { databaseCreated } : {}),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ProjectConfig } from "../config.js";
|
|
2
|
+
export type DomainTarget = "site" | "studio";
|
|
3
|
+
export interface DomainOptions {
|
|
4
|
+
readonly projectDir: string;
|
|
5
|
+
/** Hostnames to set (others stay as they are). */
|
|
6
|
+
readonly set?: {
|
|
7
|
+
readonly site?: string;
|
|
8
|
+
readonly studio?: string;
|
|
9
|
+
};
|
|
10
|
+
/** Domains to forget. */
|
|
11
|
+
readonly remove?: readonly DomainTarget[];
|
|
12
|
+
}
|
|
13
|
+
/** A hostname as typed → normalised, or an error that says why it cannot be used. */
|
|
14
|
+
export declare function checkHostname(input: string): string;
|
|
15
|
+
export declare function domain(options: DomainOptions): Promise<ProjectConfig["domains"]>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `cloudhal domain` — the custom domains `cloudhal deploy` routes to this project's Workers
|
|
3
|
+
* (Cloudflare Custom Domains: the zone must be in the same Cloudflare account; wrangler creates
|
|
4
|
+
* the DNS record and certificate). Kept in cloudhal.json so the setting travels with the project.
|
|
5
|
+
*/
|
|
6
|
+
import { isHostname, normalizeHostname } from "@cloudhal/core-ts";
|
|
7
|
+
import { readProjectConfig, writeProjectConfig } from "../config.js";
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
/** A hostname as typed → normalised, or an error that says why it cannot be used. */
|
|
20
|
+
export function checkHostname(input ) {
|
|
21
|
+
const host = normalizeHostname(input);
|
|
22
|
+
if (!isHostname(host)) throw new Error(`"${input}" is not a hostname (e.g. news.example.com)`);
|
|
23
|
+
if (host.endsWith(".workers.dev"))
|
|
24
|
+
throw new Error("workers.dev addresses are assigned by Cloudflare; set your own domain here");
|
|
25
|
+
return host;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function domain(options ) {
|
|
29
|
+
const cfg = await readProjectConfig(options.projectDir);
|
|
30
|
+
const next = { ...cfg.domains };
|
|
31
|
+
for (const target of options.remove ?? []) delete next[target];
|
|
32
|
+
if (options.set?.site) next.site = checkHostname(options.set.site);
|
|
33
|
+
if (options.set?.studio) next.studio = checkHostname(options.set.studio);
|
|
34
|
+
if (next.site && next.site === next.studio)
|
|
35
|
+
throw new Error("the site and Studio need different hostnames");
|
|
36
|
+
if (options.set || options.remove) {
|
|
37
|
+
const { domains: _old, ...rest } = cfg;
|
|
38
|
+
await writeProjectConfig(options.projectDir, {
|
|
39
|
+
...rest,
|
|
40
|
+
...(next.site || next.studio ? { domains: next } : {}),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return next.site || next.studio ? next : undefined;
|
|
44
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InitOptions {
|
|
2
|
+
readonly dir: string;
|
|
3
|
+
readonly name?: string;
|
|
4
|
+
readonly starter?: string;
|
|
5
|
+
readonly log?: (line: string) => void;
|
|
6
|
+
}
|
|
7
|
+
/** Walks up from `dir` to find a pnpm workspace root (so copied starters keep `workspace:*` links). */
|
|
8
|
+
export declare function findWorkspaceRoot(dir: string): Promise<string | undefined>;
|
|
9
|
+
export interface InitResult {
|
|
10
|
+
readonly projectDir: string;
|
|
11
|
+
readonly siteId: string;
|
|
12
|
+
/**
|
|
13
|
+
* The `@cloudhal/*` dependencies are `link:`s to the monorepo checkout this CLI runs from (its
|
|
14
|
+
* versions may not be on npm yet); such a project installs with pnpm.
|
|
15
|
+
*/
|
|
16
|
+
readonly linked: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function init(options: InitOptions): Promise<InitResult>;
|