@jxsuite/studio 2.0.1 → 2.1.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/canvas.html +21 -0
- package/dist/chunks/Overlay.dev-qfjzkms8.js +23 -0
- package/dist/chunks/{Overlay.dev-cszx7yn5.js.map → Overlay.dev-qfjzkms8.js.map} +1 -1
- package/dist/chunks/{adapter-z8fkmbmv.js → adapter-qfnesn5v.js} +2 -2
- package/dist/chunks/{cf-settings-mmyv436d.js → cf-settings-73sh5z4p.js} +3 -3
- package/dist/chunks/{components-799jpvhm.js → components-2bpqp4mq.js} +5 -7
- package/dist/chunks/{components-799jpvhm.js.map → components-2bpqp4mq.js.map} +1 -1
- package/dist/chunks/content-source-34gnkbnn.js +38 -0
- package/dist/chunks/content-source-34gnkbnn.js.map +9 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js +258 -0
- package/dist/chunks/convert-to-repeater-t8kxre5s.js.map +10 -0
- package/dist/chunks/extension-sections-6mqydz35.js +301 -0
- package/dist/chunks/extension-sections-6mqydz35.js.map +11 -0
- package/dist/chunks/files-8kn321h1.js +70 -0
- package/dist/chunks/files-8kn321h1.js.map +9 -0
- package/dist/chunks/{format-host-8jxwts2p.js → format-host-mkwsmt8d.js} +3 -3
- package/dist/chunks/git-panel-tjbr191d.js +51 -0
- package/dist/chunks/git-panel-tjbr191d.js.map +9 -0
- package/dist/chunks/{index-baeg2x3y.js → index-7pxchcce.js} +4 -3
- package/dist/chunks/{index-baeg2x3y.js.map → index-7pxchcce.js.map} +3 -3
- package/dist/chunks/{jx-validate-qx8degj7.js → jx-validate-v6qgknrs.js} +3 -3
- package/dist/chunks/layers-panel-87pb25km.js +58 -0
- package/dist/chunks/layers-panel-87pb25km.js.map +9 -0
- package/dist/chunks/{monaco-setup-zjdp9zdw.js → monaco-setup-e0yh25j4.js} +4 -75
- package/dist/chunks/{monaco-setup-zjdp9zdw.js.map → monaco-setup-e0yh25j4.js.map} +3 -4
- package/dist/chunks/publish-panel-m0fcgdrt.js +21 -0
- package/dist/chunks/publish-panel-m0fcgdrt.js.map +9 -0
- package/dist/chunks/quick-search-rhs6cbsb.js +53 -0
- package/dist/chunks/quick-search-rhs6cbsb.js.map +9 -0
- package/dist/chunks/right-panel-zpdxd98t.js +37 -0
- package/dist/chunks/right-panel-zpdxd98t.js.map +9 -0
- package/dist/chunks/section-registry-zmckaxf4.js +30 -0
- package/dist/chunks/section-registry-zmckaxf4.js.map +9 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js +18 -0
- package/dist/chunks/sp-overlay.dev-9ran0sfq.js.map +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js +9 -0
- package/dist/chunks/sp-popover.dev-rebmdncr.js.map +9 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js +15 -0
- package/dist/chunks/sp-progress-circle.dev-5vkppfkt.js.map +9 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js +15 -0
- package/dist/chunks/sp-tooltip.dev-ykqrg8h5.js.map +9 -0
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js → sp-tray.dev-ey59vfh7.js} +10 -8
- package/dist/chunks/{sp-tray.dev-pb2fsd65.js.map → sp-tray.dev-ey59vfh7.js.map} +2 -2
- package/dist/chunks/{studio-9qr6fq7p.js → studio-0rqqhrdy.js} +10 -378
- package/dist/chunks/{studio-9qr6fq7p.js.map → studio-0rqqhrdy.js.map} +4 -14
- package/dist/chunks/{studio-5x6tqqec.js → studio-2sj1jj3v.js} +10 -8
- package/dist/chunks/{studio-5x6tqqec.js.map → studio-2sj1jj3v.js.map} +2 -2
- package/dist/chunks/{studio-h3fw0wn8.js → studio-3fk1ac9z.js} +6 -4
- package/dist/chunks/{studio-h3fw0wn8.js.map → studio-3fk1ac9z.js.map} +2 -2
- package/dist/chunks/studio-41exgzhq.js +6690 -0
- package/dist/chunks/studio-41exgzhq.js.map +38 -0
- package/dist/chunks/{studio-7v2bpweq.js → studio-4mqb9a0j.js} +6 -4
- package/dist/chunks/{studio-7v2bpweq.js.map → studio-4mqb9a0j.js.map} +2 -2
- package/dist/chunks/studio-50k77cca.js +1787 -0
- package/dist/chunks/studio-50k77cca.js.map +18 -0
- package/dist/chunks/{studio-56v3zwk6.js → studio-6a0h7sne.js} +10 -8
- package/dist/chunks/{studio-56v3zwk6.js.map → studio-6a0h7sne.js.map} +2 -2
- package/dist/chunks/studio-6f0am8f2.js +53 -0
- package/dist/chunks/studio-6f0am8f2.js.map +10 -0
- package/dist/chunks/studio-6nmjc5qk.js +7002 -0
- package/dist/chunks/studio-6nmjc5qk.js.map +32 -0
- package/dist/chunks/studio-7afd21nw.js +67 -0
- package/dist/chunks/studio-7afd21nw.js.map +10 -0
- package/dist/chunks/{studio-xze4zrs1.js → studio-7bmdvzne.js} +2 -2
- package/dist/chunks/studio-7bmdvzne.js.map +10 -0
- package/dist/chunks/studio-8jpzqk5s.js +128 -0
- package/dist/chunks/studio-8jpzqk5s.js.map +10 -0
- package/dist/chunks/studio-94m77tgk.js +1482 -0
- package/dist/chunks/studio-94m77tgk.js.map +13 -0
- package/dist/chunks/studio-9je6w5sq.js +1000 -0
- package/dist/chunks/studio-9je6w5sq.js.map +16 -0
- package/dist/chunks/{studio-w7c6kvk7.js → studio-a7pzveq1.js} +2 -2
- package/dist/chunks/{studio-gs6kqdt1.js → studio-adn0z1k3.js} +14 -8
- package/dist/chunks/{studio-gs6kqdt1.js.map → studio-adn0z1k3.js.map} +3 -3
- package/dist/chunks/{studio-kr88ryr7.js → studio-bsxxx3x2.js} +17 -15
- package/dist/chunks/{studio-kr88ryr7.js.map → studio-bsxxx3x2.js.map} +7 -6
- package/dist/chunks/studio-bw5dz6km.js +608 -0
- package/dist/chunks/studio-bw5dz6km.js.map +21 -0
- package/dist/chunks/studio-c6s5getc.js +4232 -0
- package/dist/chunks/studio-c6s5getc.js.map +39 -0
- package/dist/chunks/studio-cjm7fdjf.js +451 -0
- package/dist/chunks/studio-cjm7fdjf.js.map +14 -0
- package/dist/chunks/{studio-cx91mnh8.js → studio-ckwz4d3x.js} +53 -53
- package/dist/chunks/{studio-cx91mnh8.js.map → studio-ckwz4d3x.js.map} +5 -5
- package/dist/chunks/studio-dg7zyt5x.js +28 -0
- package/dist/chunks/studio-dg7zyt5x.js.map +10 -0
- package/dist/chunks/studio-dzcyvvvz.js +166 -0
- package/dist/chunks/studio-dzcyvvvz.js.map +10 -0
- package/dist/chunks/{studio-7kqe41sa.js → studio-evkr5d3b.js} +15 -7
- package/dist/chunks/{studio-7kqe41sa.js.map → studio-evkr5d3b.js.map} +5 -4
- package/dist/chunks/studio-f12h6177.js +411 -0
- package/dist/chunks/studio-f12h6177.js.map +13 -0
- package/dist/chunks/studio-hbp1s8m9.js +1817 -0
- package/dist/chunks/studio-hbp1s8m9.js.map +14 -0
- package/dist/chunks/studio-k2sxjph5.js +15295 -0
- package/dist/chunks/studio-k2sxjph5.js.map +235 -0
- package/dist/chunks/studio-myje51t3.js +385 -0
- package/dist/chunks/studio-myje51t3.js.map +12 -0
- package/dist/chunks/studio-na6rwzhw.js +353 -0
- package/dist/chunks/studio-na6rwzhw.js.map +11 -0
- package/dist/chunks/{studio-4k0m4fmp.js → studio-p471gg5n.js} +126 -3
- package/dist/chunks/studio-p471gg5n.js.map +14 -0
- package/dist/chunks/{studio-9bjwf0d4.js → studio-rgwcpast.js} +5 -46
- package/dist/chunks/{studio-9bjwf0d4.js.map → studio-rgwcpast.js.map} +4 -5
- package/dist/chunks/{studio-esrewxap.js → studio-s519zc99.js} +3 -3
- package/dist/chunks/studio-sas7mt3k.js +75 -0
- package/dist/chunks/studio-sas7mt3k.js.map +10 -0
- package/dist/chunks/studio-t5wqwzdh.js +74 -0
- package/dist/chunks/studio-t5wqwzdh.js.map +10 -0
- package/dist/chunks/{studio-9qpspwfn.js → studio-temv5bw4.js} +5 -5
- package/dist/chunks/{studio-9qpspwfn.js.map → studio-temv5bw4.js.map} +1 -1
- package/dist/chunks/{studio-qkvt37c0.js → studio-tr20m8g8.js} +669 -18
- package/dist/chunks/studio-tr20m8g8.js.map +9 -0
- package/dist/chunks/{studio-v7jkjqng.js → studio-v96qfnww.js} +5514 -4291
- package/dist/chunks/studio-v96qfnww.js.map +54 -0
- package/dist/chunks/studio-vcetc91k.js +659 -0
- package/dist/chunks/studio-vcetc91k.js.map +10 -0
- package/dist/chunks/{studio-jm0z592w.js → studio-vmymjefp.js} +2972 -4937
- package/dist/chunks/studio-vmymjefp.js.map +98 -0
- package/dist/chunks/{studio-bghqfmea.js → studio-wwseqyw0.js} +2 -2
- package/dist/chunks/studio-x9hmy5kr.js +390 -0
- package/dist/chunks/studio-x9hmy5kr.js.map +10 -0
- package/dist/chunks/studio-xa0ce0n7.js +335 -0
- package/dist/chunks/studio-xa0ce0n7.js.map +10 -0
- package/dist/chunks/studio-xm3dbxvn.js +378 -0
- package/dist/chunks/studio-xm3dbxvn.js.map +19 -0
- package/dist/chunks/{studio-nqw433kv.js → studio-xmvbhg31.js} +2 -2
- package/dist/chunks/studio-zv37yrfa.js +1054 -0
- package/dist/chunks/studio-zv37yrfa.js.map +13 -0
- package/dist/chunks/{ws-client-q7hkz3j9.js → ws-client-654ts66j.js} +6 -4
- package/dist/chunks/ws-client-654ts66j.js.map +11 -0
- package/dist/iframe-entry.js +668 -230
- package/dist/studio.js +21080 -32585
- package/index.html +35 -4685
- package/package.json +17 -15
- package/src/about/about-modal.ts +42 -11
- package/src/browse/library-commands.ts +240 -0
- package/src/browse/library-layouts.ts +369 -0
- package/src/browse/library-model.ts +396 -0
- package/src/browse/library-pane.ts +1049 -0
- package/src/browse/library-preview.ts +252 -0
- package/src/browse/library-source.ts +150 -0
- package/src/canvas/canvas-helpers.ts +33 -9
- package/src/canvas/canvas-live-render.ts +45 -29
- package/src/canvas/canvas-patcher.ts +151 -31
- package/src/canvas/canvas-perf.ts +46 -7
- package/src/canvas/canvas-render.ts +1092 -220
- package/src/canvas/canvas-surface.ts +240 -0
- package/src/canvas/canvas-utils.ts +1166 -124
- package/src/canvas/iframe-drop.ts +2 -1
- package/src/canvas/iframe-entry.ts +241 -4
- package/src/canvas/iframe-host.ts +1226 -143
- package/src/canvas/iframe-inline-edit.ts +31 -0
- package/src/canvas/iframe-interaction.ts +76 -16
- package/src/canvas/iframe-keys.ts +107 -45
- package/src/canvas/iframe-overlay.ts +38 -1
- package/src/canvas/iframe-protocol.ts +137 -2
- package/src/canvas/iframe-render.ts +70 -2
- package/src/canvas/iframe-slash.ts +6 -0
- package/src/canvas/path-mapping.ts +56 -6
- package/src/canvas/surface-registry.ts +292 -0
- package/src/collab/collab-commands.ts +244 -0
- package/src/collab/collab-session.ts +198 -32
- package/src/collab/collab-state.ts +28 -2
- package/src/collab/presence-chips.ts +100 -9
- package/src/commands/active-registry.ts +42 -0
- package/src/commands/app-commands.ts +176 -0
- package/src/commands/budget.ts +158 -0
- package/src/commands/command-args.ts +253 -0
- package/src/commands/context.ts +387 -0
- package/src/commands/defaults.ts +580 -0
- package/src/commands/keymap.ts +571 -0
- package/src/commands/levels.ts +345 -0
- package/src/commands/live-context.ts +193 -0
- package/src/commands/reference.ts +227 -0
- package/src/commands/registry.ts +293 -0
- package/src/component-props.ts +3 -2
- package/src/content/draft-state.ts +106 -0
- package/src/content/entry-commands.ts +282 -0
- package/src/content/entry-editor.ts +327 -0
- package/src/content/entry-fields.ts +116 -0
- package/src/content/entry-model.ts +175 -0
- package/src/editor/canvas-context-menu.ts +17 -11
- package/src/editor/canvas-slash-bridge.ts +11 -4
- package/src/editor/context-menu.ts +804 -204
- package/src/editor/convert-to-component.ts +31 -10
- package/src/editor/convert-to-repeater.ts +3 -2
- package/src/editor/inline-edit-apply.ts +5 -5
- package/src/editor/inline-edit.ts +86 -50
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/shortcuts.ts +1043 -329
- package/src/editor/slash-menu.ts +1 -0
- package/src/files/elements.ts +166 -0
- package/src/files/file-ops.ts +178 -31
- package/src/files/files.ts +898 -268
- package/src/files/fs-events.ts +21 -0
- package/src/files/media-meta.ts +203 -0
- package/src/files/media-paths.ts +141 -0
- package/src/files/media-upload.ts +7 -3
- package/src/files/media-usage.ts +189 -0
- package/src/github/github-auth.ts +235 -33
- package/src/github/github-publish.ts +80 -21
- package/src/grid/grid-controller.ts +152 -12
- package/src/grid/grid-layout.ts +225 -20
- package/src/grid/grid-open.ts +120 -0
- package/src/grid/grid-panel.ts +554 -39
- package/src/grid/grid-source.ts +27 -1
- package/src/grid/redirects-grid.ts +599 -0
- package/src/grid/redirects.ts +398 -0
- package/src/grid/sources/content-source.ts +108 -2
- package/src/i18n/i18n-commands.ts +322 -0
- package/src/new-project/add-repo-modal.ts +8 -10
- package/src/new-project/import-tab.ts +7 -0
- package/src/new-project/location-fields.ts +9 -1
- package/src/new-project/new-project-modal.ts +221 -245
- package/src/packages/jxsuite-update.ts +97 -48
- package/src/packages/pull-package-sync.ts +18 -9
- package/src/page-params.ts +2 -1
- package/src/panels/activity-bar.ts +152 -91
- package/src/panels/activity-panel.ts +481 -0
- package/src/panels/ai-chat/chat-markdown.ts +8 -3
- package/src/panels/ai-chat/chat-view.ts +245 -18
- package/src/panels/ai-chat/composer.ts +31 -5
- package/src/panels/ai-chat/sessions-view.ts +17 -10
- package/src/panels/ai-panel.ts +279 -53
- package/src/panels/block-action-bar.ts +1115 -224
- package/src/panels/bottom-dock.ts +337 -0
- package/src/panels/canvas-dnd-bridge.ts +37 -8
- package/src/panels/chat-panel.ts +29 -12
- package/src/panels/data-explorer.ts +254 -112
- package/src/panels/data-grid.ts +10 -4
- package/src/panels/dnd.ts +28 -51
- package/src/panels/editors.ts +434 -107
- package/src/panels/elements-panel.ts +66 -2
- package/src/panels/empty-state.ts +112 -0
- package/src/panels/events-panel.ts +596 -82
- package/src/panels/formula-workspace.ts +408 -218
- package/src/panels/frontmatter-fields.ts +51 -10
- package/src/panels/frontmatter-panel.ts +357 -79
- package/src/panels/git-panel.ts +375 -164
- package/src/panels/head-panel.ts +791 -85
- package/src/panels/i18n-panel.ts +592 -0
- package/src/panels/imports-panel.ts +95 -85
- package/src/panels/jump-bar.ts +584 -0
- package/src/panels/layers-panel.ts +1106 -328
- package/src/panels/left-panel.ts +109 -204
- package/src/panels/navigator-panels.ts +131 -0
- package/src/panels/overlays.ts +7 -2
- package/src/panels/pane-context.ts +1477 -0
- package/src/panels/pane-grid.ts +406 -0
- package/src/panels/panel-registry.ts +340 -0
- package/src/panels/panel-scheduler.ts +75 -0
- package/src/panels/problems-panel.ts +234 -0
- package/src/panels/properties-panel.ts +946 -1139
- package/src/panels/provenance.ts +258 -0
- package/src/panels/quick-search.ts +791 -122
- package/src/panels/right-panel.ts +228 -102
- package/src/panels/seo-modal.ts +395 -0
- package/src/panels/settings-pane.ts +203 -0
- package/src/panels/signals-panel.ts +354 -137
- package/src/panels/statement-editor.ts +41 -25
- package/src/panels/statusbar.ts +342 -106
- package/src/panels/style-panel.ts +974 -463
- package/src/panels/style-utils.ts +3 -3
- package/src/panels/stylebook-doc.ts +4 -2
- package/src/panels/stylebook-layers-panel.ts +3 -2
- package/src/panels/stylebook-panel.ts +51 -26
- package/src/panels/tab-strip.ts +1058 -78
- package/src/panels/target-line.ts +274 -0
- package/src/panels/toolbar.ts +631 -484
- package/src/panels/welcome-screen.ts +301 -198
- package/src/platform-errors.ts +26 -3
- package/src/platform.ts +96 -2
- package/src/platforms/cloud.ts +71 -8
- package/src/platforms/devserver.ts +92 -29
- package/src/publish/deploy-checklist.ts +383 -0
- package/src/publish/pages-service.ts +10 -1
- package/src/publish/publish-commands.ts +218 -0
- package/src/publish/publish-panel.ts +110 -16
- package/src/recent-projects.ts +3 -2
- package/src/services/a11y-report.ts +505 -0
- package/src/services/ai-models.ts +30 -1
- package/src/services/ai-project-tools.ts +29 -10
- package/src/services/ai-system-prompt.ts +53 -14
- package/src/services/ai-tools.ts +39 -3
- package/src/services/ai-writes.ts +154 -0
- package/src/services/announce.ts +97 -0
- package/src/services/automation.ts +424 -175
- package/src/services/cem-export.ts +9 -4
- package/src/services/clock.ts +61 -0
- package/src/services/document-assistant.ts +36 -8
- package/src/services/idle.ts +179 -0
- package/src/services/import-client.ts +26 -0
- package/src/services/monaco-buffer.ts +627 -0
- package/src/services/monaco-lazy.ts +36 -0
- package/src/services/notify.ts +271 -0
- package/src/services/profile.ts +155 -0
- package/src/services/references.ts +0 -0
- package/src/services/token-lint.ts +3 -2
- package/src/services/tool-executor.ts +53 -7
- package/src/services/trusted-types.ts +123 -0
- package/src/settings/contexts-section.ts +427 -0
- package/src/settings/contributed-section.ts +149 -11
- package/src/settings/css-vars-editor.ts +306 -349
- package/src/settings/defs-editor.ts +93 -34
- package/src/settings/dependencies-editor.ts +7 -7
- package/src/settings/extension-sections.ts +37 -5
- package/src/settings/general-settings.ts +204 -121
- package/src/settings/locales-section.ts +347 -0
- package/src/settings/preferences-accounts.ts +140 -0
- package/src/settings/preferences-dialog.ts +620 -0
- package/src/settings/preferences-keymap.ts +270 -0
- package/src/settings/project-sections.ts +260 -0
- package/src/settings/section-registry.ts +169 -0
- package/src/settings/settings-document.ts +385 -0
- package/src/shell.ts +1549 -0
- package/src/site-context.ts +45 -20
- package/src/state.ts +14 -275
- package/src/store.ts +88 -43
- package/src/studio.ts +790 -346
- package/src/style/live-preview.ts +36 -0
- package/src/style/project-styles.ts +349 -0
- package/src/style/token-ref.ts +123 -0
- package/src/tabs/patch-ops.ts +16 -4
- package/src/tabs/project-config.ts +416 -0
- package/src/tabs/selection.ts +323 -0
- package/src/tabs/tab.ts +182 -47
- package/src/tabs/transact.ts +209 -28
- package/src/types.ts +68 -13
- package/src/ui/ai-credentials-form.ts +39 -35
- package/src/ui/ai-managed-connect.ts +7 -1
- package/src/ui/dynamic-slot.ts +224 -81
- package/src/ui/expression-editor.ts +71 -63
- package/src/ui/field-input.ts +4 -6
- package/src/ui/field-row.ts +215 -38
- package/src/ui/form-controls.ts +194 -7
- package/src/ui/layers.ts +492 -69
- package/src/ui/media-picker.ts +115 -25
- package/src/ui/panel-resize.ts +109 -91
- package/src/ui/progress-modal.ts +131 -50
- package/src/ui/regions.ts +462 -0
- package/src/ui/schema-form.ts +229 -45
- package/src/ui/spectrum.ts +24 -8
- package/src/ui/timing.ts +49 -0
- package/src/ui/value-selector.ts +20 -0
- package/src/ui/value-source.ts +348 -0
- package/src/ui/virtual-window.ts +400 -0
- package/src/utils/edit-display.ts +3 -2
- package/src/utils/inherited-style.ts +67 -37
- package/src/view.ts +64 -78
- package/src/workspace/pane-derive.ts +1258 -0
- package/src/workspace/session.ts +317 -0
- package/src/workspace/workspace.ts +1345 -23
- package/styles/canvas.css +653 -0
- package/styles/forced-colors.css +106 -0
- package/styles/inspector.css +1454 -0
- package/styles/overlays.css +2704 -0
- package/styles/panels.css +1701 -0
- package/styles/shell.css +1423 -0
- package/styles/tokens.css +151 -0
- package/dist/chunks/Overlay.dev-cszx7yn5.js +0 -22
- package/dist/chunks/extension-sections-qr3drkkw.js +0 -531
- package/dist/chunks/extension-sections-qr3drkkw.js.map +0 -12
- package/dist/chunks/files-j8a1t06k.js +0 -50
- package/dist/chunks/files-j8a1t06k.js.map +0 -9
- package/dist/chunks/git-panel-xtq5z81x.js +0 -28
- package/dist/chunks/git-panel-xtq5z81x.js.map +0 -9
- package/dist/chunks/layers-panel-ancn2wpq.js +0 -26
- package/dist/chunks/layers-panel-ancn2wpq.js.map +0 -9
- package/dist/chunks/settings-modal-17ttr96g.js +0 -29
- package/dist/chunks/settings-modal-17ttr96g.js.map +0 -9
- package/dist/chunks/sp-overlay.dev-earn5as8.js +0 -17
- package/dist/chunks/sp-overlay.dev-earn5as8.js.map +0 -9
- package/dist/chunks/sp-popover.dev-frxtfejn.js +0 -8
- package/dist/chunks/sp-popover.dev-frxtfejn.js.map +0 -9
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js +0 -14
- package/dist/chunks/sp-progress-circle.dev-7tvw34h8.js.map +0 -9
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js +0 -21
- package/dist/chunks/sp-tooltip.dev-a9fywesm.js.map +0 -10
- package/dist/chunks/studio-0xgs7xrs.js +0 -429
- package/dist/chunks/studio-0xgs7xrs.js.map +0 -13
- package/dist/chunks/studio-4d8hzcz5.js +0 -3427
- package/dist/chunks/studio-4d8hzcz5.js.map +0 -26
- package/dist/chunks/studio-4k0m4fmp.js.map +0 -13
- package/dist/chunks/studio-9smfzqhc.js +0 -19
- package/dist/chunks/studio-9smfzqhc.js.map +0 -10
- package/dist/chunks/studio-jm0z592w.js.map +0 -115
- package/dist/chunks/studio-m2t4mdg5.js +0 -1854
- package/dist/chunks/studio-m2t4mdg5.js.map +0 -18
- package/dist/chunks/studio-n4p11dfy.js +0 -853
- package/dist/chunks/studio-n4p11dfy.js.map +0 -12
- package/dist/chunks/studio-qkvt37c0.js.map +0 -9
- package/dist/chunks/studio-sjh1wt1a.js +0 -3744
- package/dist/chunks/studio-sjh1wt1a.js.map +0 -22
- package/dist/chunks/studio-v7jkjqng.js.map +0 -46
- package/dist/chunks/studio-xq0t7n5t.js +0 -140
- package/dist/chunks/studio-xq0t7n5t.js.map +0 -10
- package/dist/chunks/studio-xze4zrs1.js.map +0 -10
- package/dist/chunks/studio-yfcstdzy.js +0 -399
- package/dist/chunks/studio-yfcstdzy.js.map +0 -12
- package/dist/chunks/studio-zp7jncs8.js +0 -469
- package/dist/chunks/studio-zp7jncs8.js.map +0 -14
- package/dist/chunks/ws-client-q7hkz3j9.js.map +0 -11
- package/src/browse/browse-modal.ts +0 -69
- package/src/browse/browse.ts +0 -904
- package/src/canvas/canvas-diff.ts +0 -216
- package/src/canvas/nested-site-style.ts +0 -58
- package/src/new-project/design-fields.ts +0 -264
- package/src/new-project/templates.ts +0 -61
- package/src/panels/tab-bar.ts +0 -548
- package/src/settings/settings-modal.ts +0 -203
- /package/dist/chunks/{adapter-z8fkmbmv.js.map → adapter-qfnesn5v.js.map} +0 -0
- /package/dist/chunks/{cf-settings-mmyv436d.js.map → cf-settings-73sh5z4p.js.map} +0 -0
- /package/dist/chunks/{format-host-8jxwts2p.js.map → format-host-mkwsmt8d.js.map} +0 -0
- /package/dist/chunks/{jx-validate-qx8degj7.js.map → jx-validate-v6qgknrs.js.map} +0 -0
- /package/dist/chunks/{studio-w7c6kvk7.js.map → studio-a7pzveq1.js.map} +0 -0
- /package/dist/chunks/{studio-esrewxap.js.map → studio-s519zc99.js.map} +0 -0
- /package/dist/chunks/{studio-bghqfmea.js.map → studio-wwseqyw0.js.map} +0 -0
- /package/dist/chunks/{studio-nqw433kv.js.map → studio-xmvbhg31.js.map} +0 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import {
|
|
2
|
+
activeRegistry,
|
|
3
|
+
shell,
|
|
4
|
+
updateSiteConfig
|
|
5
|
+
} from "./studio-41exgzhq.js";
|
|
6
|
+
import {
|
|
7
|
+
html,
|
|
8
|
+
nothing
|
|
9
|
+
} from "./studio-5x5774ak.js";
|
|
10
|
+
import {
|
|
11
|
+
projectState
|
|
12
|
+
} from "./studio-cjm7fdjf.js";
|
|
13
|
+
import {
|
|
14
|
+
getPlatform
|
|
15
|
+
} from "./studio-sas7mt3k.js";
|
|
16
|
+
|
|
17
|
+
// ../create/scaffold.ts
|
|
18
|
+
var CF_ADAPTERS = new Set(["cloudflare-pages", "cloudflare-workers"]);
|
|
19
|
+
function buildWranglerJsonc({ slug, adapter }) {
|
|
20
|
+
const compatibilityDate = new Date().toISOString().slice(0, 10);
|
|
21
|
+
const config = adapter === "cloudflare-workers" ? {
|
|
22
|
+
assets: { binding: "ASSETS", directory: "./dist" },
|
|
23
|
+
compatibility_date: compatibilityDate,
|
|
24
|
+
compatibility_flags: ["nodejs_compat"],
|
|
25
|
+
main: "./dist/worker.js",
|
|
26
|
+
name: slug
|
|
27
|
+
} : {
|
|
28
|
+
compatibility_date: compatibilityDate,
|
|
29
|
+
compatibility_flags: ["nodejs_compat"],
|
|
30
|
+
name: slug,
|
|
31
|
+
pages_build_output_dir: "./dist"
|
|
32
|
+
};
|
|
33
|
+
return `${JSON.stringify(config, null, "\t")}
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
function updateWranglerConfig(existing, { slug, adapter }) {
|
|
37
|
+
if (!existing) {
|
|
38
|
+
return { content: buildWranglerJsonc({ adapter, slug }), patched: true };
|
|
39
|
+
}
|
|
40
|
+
let config;
|
|
41
|
+
try {
|
|
42
|
+
config = JSON.parse(existing);
|
|
43
|
+
} catch {
|
|
44
|
+
return { content: existing, patched: false };
|
|
45
|
+
}
|
|
46
|
+
config["name"] = slug;
|
|
47
|
+
if (adapter === "cloudflare-workers") {
|
|
48
|
+
delete config["pages_build_output_dir"];
|
|
49
|
+
config["main"] = "./dist/worker.js";
|
|
50
|
+
config["assets"] = { binding: "ASSETS", directory: "./dist" };
|
|
51
|
+
} else {
|
|
52
|
+
delete config["main"];
|
|
53
|
+
delete config["assets"];
|
|
54
|
+
config["pages_build_output_dir"] = "./dist";
|
|
55
|
+
}
|
|
56
|
+
return { content: `${JSON.stringify(config, null, "\t")}
|
|
57
|
+
`, patched: true };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// src/publish/pages-service.ts
|
|
61
|
+
function platformSupportsPublish() {
|
|
62
|
+
try {
|
|
63
|
+
return typeof getPlatform().cfApi === "function";
|
|
64
|
+
} catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function cfApi(path, init) {
|
|
69
|
+
const api = getPlatform().cfApi;
|
|
70
|
+
if (!api) {
|
|
71
|
+
throw new Error("This platform cannot reach the Cloudflare API");
|
|
72
|
+
}
|
|
73
|
+
return await api(path, init);
|
|
74
|
+
}
|
|
75
|
+
async function listAccounts() {
|
|
76
|
+
return cfApi("/accounts");
|
|
77
|
+
}
|
|
78
|
+
async function getPagesProject(accountId, projectName) {
|
|
79
|
+
try {
|
|
80
|
+
return await cfApi(`/accounts/${accountId}/pages/projects/${projectName}`);
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function createPagesProject(opts) {
|
|
86
|
+
return cfApi(`/accounts/${opts.accountId}/pages/projects`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: {
|
|
89
|
+
name: opts.projectName,
|
|
90
|
+
production_branch: opts.productionBranch,
|
|
91
|
+
build_config: {
|
|
92
|
+
build_command: "bunx jx build",
|
|
93
|
+
destination_dir: "dist"
|
|
94
|
+
},
|
|
95
|
+
source: {
|
|
96
|
+
type: "github",
|
|
97
|
+
config: {
|
|
98
|
+
owner: opts.owner,
|
|
99
|
+
repo_name: opts.repo,
|
|
100
|
+
production_branch: opts.productionBranch,
|
|
101
|
+
deployments_enabled: true
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async function latestDeployment(deploy) {
|
|
108
|
+
const deployments = await cfApi(`/accounts/${deploy.accountId}/pages/projects/${deploy.projectName}/deployments`);
|
|
109
|
+
const [latest] = deployments;
|
|
110
|
+
if (!latest) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
id: latest.id,
|
|
115
|
+
url: latest.url,
|
|
116
|
+
environment: latest.environment,
|
|
117
|
+
stage: latest.latest_stage?.name ?? "unknown",
|
|
118
|
+
status: latest.latest_stage?.status ?? "unknown",
|
|
119
|
+
createdOn: latest.created_on
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
async function writeDeployConfig(config, deploy) {
|
|
123
|
+
const build = { ...config.build };
|
|
124
|
+
if (deploy === null) {
|
|
125
|
+
delete build.deploy;
|
|
126
|
+
} else {
|
|
127
|
+
build.deploy = deploy;
|
|
128
|
+
}
|
|
129
|
+
await updateSiteConfig({ build });
|
|
130
|
+
if (deploy !== null) {
|
|
131
|
+
const platform = getPlatform();
|
|
132
|
+
let existing = null;
|
|
133
|
+
try {
|
|
134
|
+
existing = await platform.readFile("wrangler.jsonc");
|
|
135
|
+
} catch {
|
|
136
|
+
existing = null;
|
|
137
|
+
}
|
|
138
|
+
const adapter = build.adapter === "cloudflare-workers" ? "cloudflare-workers" : "cloudflare-pages";
|
|
139
|
+
const { content, patched } = updateWranglerConfig(existing, {
|
|
140
|
+
adapter,
|
|
141
|
+
slug: deploy.projectName
|
|
142
|
+
});
|
|
143
|
+
if (patched) {
|
|
144
|
+
await platform.writeFile("wrangler.jsonc", content);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async function connectDeploy(config, opts) {
|
|
149
|
+
const existing = await getPagesProject(opts.accountId, opts.projectName);
|
|
150
|
+
const project = existing ?? await createPagesProject(opts);
|
|
151
|
+
const deploy = {
|
|
152
|
+
provider: "cloudflare-pages",
|
|
153
|
+
accountId: opts.accountId,
|
|
154
|
+
projectName: opts.projectName,
|
|
155
|
+
...project.subdomain ? { productionUrl: `https://${project.subdomain}` } : {}
|
|
156
|
+
};
|
|
157
|
+
await writeDeployConfig(config, deploy);
|
|
158
|
+
return deploy;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// src/publish/deploy-checklist.ts
|
|
162
|
+
function currentConfig() {
|
|
163
|
+
return projectState?.projectConfig ?? null;
|
|
164
|
+
}
|
|
165
|
+
function currentDeploy() {
|
|
166
|
+
return currentConfig()?.build?.deploy;
|
|
167
|
+
}
|
|
168
|
+
var _observed = null;
|
|
169
|
+
var _asked = false;
|
|
170
|
+
function noteDeployment(info) {
|
|
171
|
+
_observed = info;
|
|
172
|
+
_asked = true;
|
|
173
|
+
}
|
|
174
|
+
function repoStep() {
|
|
175
|
+
const { status } = shell.git;
|
|
176
|
+
if (status === null) {
|
|
177
|
+
return {
|
|
178
|
+
command: "git.init",
|
|
179
|
+
detail: "Source control has not reported on this project yet.",
|
|
180
|
+
id: "repo",
|
|
181
|
+
label: "Track this project with git",
|
|
182
|
+
state: "unknown"
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return status.isRepo ? {
|
|
186
|
+
command: "git.init",
|
|
187
|
+
detail: `Tracked${status.branch ? ` — on branch ${status.branch}` : ""}.`,
|
|
188
|
+
id: "repo",
|
|
189
|
+
label: "Track this project with git",
|
|
190
|
+
state: "done"
|
|
191
|
+
} : {
|
|
192
|
+
command: "git.init",
|
|
193
|
+
detail: "A deploy ships what the repository holds, so the repository comes first.",
|
|
194
|
+
id: "repo",
|
|
195
|
+
label: "Track this project with git",
|
|
196
|
+
state: "todo"
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function remoteStep() {
|
|
200
|
+
const { status } = shell.git;
|
|
201
|
+
if (status === null || !status.isRepo) {
|
|
202
|
+
return {
|
|
203
|
+
command: "git.createGithubRepository",
|
|
204
|
+
detail: "A remote is where the provider builds from.",
|
|
205
|
+
id: "remote",
|
|
206
|
+
label: "Push to a remote",
|
|
207
|
+
state: status === null ? "unknown" : "todo"
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
if ((status.remotes ?? []).length === 0) {
|
|
211
|
+
return {
|
|
212
|
+
command: "git.createGithubRepository",
|
|
213
|
+
detail: "This repository is local only — nothing outside this machine can build it.",
|
|
214
|
+
id: "remote",
|
|
215
|
+
label: "Push to a remote",
|
|
216
|
+
state: "todo"
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return status.ahead > 0 ? {
|
|
220
|
+
command: "git.push",
|
|
221
|
+
detail: `${status.ahead} commit(s) are not on ${status.remotes[0]} yet, so a build would ship the older tree.`,
|
|
222
|
+
id: "remote",
|
|
223
|
+
label: "Push to a remote",
|
|
224
|
+
state: "todo"
|
|
225
|
+
} : {
|
|
226
|
+
command: "git.push",
|
|
227
|
+
detail: `Up to date with ${status.remotes[0]}.`,
|
|
228
|
+
id: "remote",
|
|
229
|
+
label: "Push to a remote",
|
|
230
|
+
state: "done"
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function providerStep() {
|
|
234
|
+
const deploy = currentDeploy();
|
|
235
|
+
if (deploy) {
|
|
236
|
+
return {
|
|
237
|
+
command: "publish.setUp",
|
|
238
|
+
detail: `Cloudflare Pages project ${deploy.projectName}.`,
|
|
239
|
+
id: "provider",
|
|
240
|
+
label: "Connect a deploy provider",
|
|
241
|
+
state: "done"
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return platformSupportsPublish() ? {
|
|
245
|
+
command: "publish.setUp",
|
|
246
|
+
detail: "Connecting one makes every commit build and publish on its own.",
|
|
247
|
+
id: "provider",
|
|
248
|
+
label: "Connect a deploy provider",
|
|
249
|
+
state: "todo"
|
|
250
|
+
} : {
|
|
251
|
+
command: "publish.setUp",
|
|
252
|
+
detail: "This platform cannot reach the Cloudflare API. Commit and push instead — your host " + "runs bunx jx build and serves dist/.",
|
|
253
|
+
id: "provider",
|
|
254
|
+
label: "Connect a deploy provider",
|
|
255
|
+
state: "unknown"
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function deployedStep() {
|
|
259
|
+
if (!currentDeploy()) {
|
|
260
|
+
return {
|
|
261
|
+
command: "publish.deploy",
|
|
262
|
+
detail: "Nothing has been deployed, because no provider is connected.",
|
|
263
|
+
id: "deployed",
|
|
264
|
+
label: "Deploy",
|
|
265
|
+
state: "todo"
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
if (!_asked) {
|
|
269
|
+
return {
|
|
270
|
+
command: "publish.deploy",
|
|
271
|
+
detail: "Cloudflare has not been asked yet, so this is not a claim that nothing shipped.",
|
|
272
|
+
id: "deployed",
|
|
273
|
+
label: "Deploy",
|
|
274
|
+
state: "unknown"
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
if (_observed === null) {
|
|
278
|
+
return {
|
|
279
|
+
command: "publish.deploy",
|
|
280
|
+
detail: "Cloudflare reports no deployments for this project.",
|
|
281
|
+
id: "deployed",
|
|
282
|
+
label: "Deploy",
|
|
283
|
+
state: "todo"
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
return _observed.status === "success" ? {
|
|
287
|
+
command: "publish.deploy",
|
|
288
|
+
detail: `${_observed.environment} — ${_observed.url}`,
|
|
289
|
+
id: "deployed",
|
|
290
|
+
label: "Deploy",
|
|
291
|
+
state: "done"
|
|
292
|
+
} : {
|
|
293
|
+
command: "publish.deploy",
|
|
294
|
+
detail: `Last deployment ${_observed.stage}: ${_observed.status}.`,
|
|
295
|
+
id: "deployed",
|
|
296
|
+
label: "Deploy",
|
|
297
|
+
state: "todo"
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function deployChecklist() {
|
|
301
|
+
return [repoStep(), remoteStep(), providerStep(), deployedStep()];
|
|
302
|
+
}
|
|
303
|
+
function nextDeployStep() {
|
|
304
|
+
return deployChecklist().find((step) => step.state !== "done") ?? null;
|
|
305
|
+
}
|
|
306
|
+
function deployStatusItem() {
|
|
307
|
+
if (!projectState) {
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
const next = nextDeployStep();
|
|
311
|
+
if (next) {
|
|
312
|
+
return { command: next.command, label: next.label, title: next.detail };
|
|
313
|
+
}
|
|
314
|
+
const url = currentDeploy()?.productionUrl;
|
|
315
|
+
return {
|
|
316
|
+
command: "publish.openDashboard",
|
|
317
|
+
label: "Deployed",
|
|
318
|
+
title: url ?? "Everything this project needs to ship is in place."
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
var STEP_CLASS = {
|
|
322
|
+
done: "done",
|
|
323
|
+
todo: "pending",
|
|
324
|
+
unknown: "pending"
|
|
325
|
+
};
|
|
326
|
+
var STEP_ICON = {
|
|
327
|
+
done: "✓",
|
|
328
|
+
todo: "·",
|
|
329
|
+
unknown: "?"
|
|
330
|
+
};
|
|
331
|
+
function actionTpl(step) {
|
|
332
|
+
if (!step) {
|
|
333
|
+
return nothing;
|
|
334
|
+
}
|
|
335
|
+
const registry = activeRegistry();
|
|
336
|
+
const command = registry?.get(step.command);
|
|
337
|
+
if (!registry || !command || !registry.isVisible(step.command)) {
|
|
338
|
+
return nothing;
|
|
339
|
+
}
|
|
340
|
+
const reason = registry.disabledReason(step.command);
|
|
341
|
+
return html`<sp-action-button
|
|
342
|
+
size="s"
|
|
343
|
+
?disabled=${reason !== undefined}
|
|
344
|
+
title=${reason ? `${command.title} — requires ${reason}` : command.title}
|
|
345
|
+
@click=${() => {
|
|
346
|
+
registry.run(step.command);
|
|
347
|
+
}}
|
|
348
|
+
>${command.title}</sp-action-button
|
|
349
|
+
>`;
|
|
350
|
+
}
|
|
351
|
+
function renderDeployChecklist() {
|
|
352
|
+
if (!projectState) {
|
|
353
|
+
return nothing;
|
|
354
|
+
}
|
|
355
|
+
const steps = deployChecklist();
|
|
356
|
+
const next = steps.find((step) => step.state !== "done") ?? null;
|
|
357
|
+
return html`
|
|
358
|
+
<ul class="activity-list">
|
|
359
|
+
<li class="activity-row ${next ? "activity-row--running" : "activity-row--done"}">
|
|
360
|
+
<span class="activity-icon" aria-hidden="true">${next ? "⋯" : "✓"}</span>
|
|
361
|
+
<div class="activity-body">
|
|
362
|
+
<div class="activity-head">
|
|
363
|
+
<span class="activity-title">Deploy checklist</span>
|
|
364
|
+
<span class="activity-source">Publish</span>
|
|
365
|
+
</div>
|
|
366
|
+
<div class="activity-status">
|
|
367
|
+
${next ? next.detail : "Everything this project needs to ship is in place."}
|
|
368
|
+
</div>
|
|
369
|
+
<ol class="activity-steps">
|
|
370
|
+
${steps.map((step) => html`<li class="activity-step activity-step--${STEP_CLASS[step.state]}">
|
|
371
|
+
<span class="activity-step-icon" aria-hidden="true">${STEP_ICON[step.state]}</span>
|
|
372
|
+
${step.label}${step.state === "done" ? "" : ` — ${step.detail}`}
|
|
373
|
+
</li>`)}
|
|
374
|
+
</ol>
|
|
375
|
+
${actionTpl(next)}
|
|
376
|
+
</div>
|
|
377
|
+
</li>
|
|
378
|
+
</ul>
|
|
379
|
+
`;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export { platformSupportsPublish, listAccounts, latestDeployment, writeDeployConfig, connectDeploy, currentDeploy, noteDeployment, deployStatusItem, renderDeployChecklist };
|
|
383
|
+
|
|
384
|
+
//# debugId=F16370A3EAFA6BE564756E2164756E21
|
|
385
|
+
//# sourceMappingURL=studio-myje51t3.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../create/scaffold.ts", "../src/publish/pages-service.ts", "../src/publish/deploy-checklist.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Pure scaffolding helpers — zero node imports so Studio can run them in the browser (the publish\n * flow writes wrangler.jsonc through the PAL) and cloud platforms can seed repos through the Git\n * Data API. generate.ts wraps these with filesystem I/O.\n */\n\nconst CF_ADAPTERS = new Set([\"cloudflare-pages\", \"cloudflare-workers\"]);\n\n/** True when the adapter deploys through wrangler (needs a wrangler.jsonc). */\nexport function adapterNeedsWrangler(adapter: string | undefined): boolean {\n return Boolean(adapter && CF_ADAPTERS.has(adapter));\n}\n\n/**\n * A fresh wrangler.jsonc for the adapter. `name` becomes the Cloudflare project name — when the\n * project has a `build.deploy` block, pass its projectName so the config and the connected Pages\n * project agree.\n */\nexport function buildWranglerJsonc({ slug, adapter }: { slug: string; adapter: string }): string {\n const compatibilityDate = new Date().toISOString().slice(0, 10);\n\n // Nodejs_compat: server functions routinely pull in Node-flavored npm packages\n const config =\n adapter === \"cloudflare-workers\"\n ? {\n assets: { binding: \"ASSETS\", directory: \"./dist\" },\n compatibility_date: compatibilityDate,\n compatibility_flags: [\"nodejs_compat\"],\n main: \"./dist/worker.js\",\n name: slug,\n }\n : {\n compatibility_date: compatibilityDate,\n compatibility_flags: [\"nodejs_compat\"],\n name: slug,\n pages_build_output_dir: \"./dist\",\n };\n\n return `${JSON.stringify(config, null, \"\\t\")}\\n`;\n}\n\n/**\n * Deep-merge connector binding fragments into a wrangler.jsonc (plan Part 4a; consumed by `jx db\n * push`). Fragments are the `bindings` connector-capability results — e.g. `{ d1_databases: [{\n * binding, database_id }] }` or `{ hyperdrive: [{ binding, id }] }`.\n *\n * Merge rules: objects merge recursively; arrays whose elements carry a `binding` key are keyed by\n * it (same-binding entries merge, new ones append — user-added keys on an entry survive); other\n * values only land when the user has not set them (user keys are preserved). Unparseable\n * (comment-bearing) JSONC is returned unchanged with `patched: false` rather than risking data\n * loss.\n *\n * @param {string | null} existing - Current wrangler.jsonc content, or null when absent\n * @param {Record<string, unknown>[]} fragments - Binding fragments, applied in order\n * @returns {{ content: string; patched: boolean }}\n */\nexport function applyBindingFragments(\n existing: string | null,\n fragments: Record<string, unknown>[],\n): { content: string; patched: boolean } {\n if (fragments.length === 0) {\n return { content: existing ?? \"\", patched: false };\n }\n let config: Record<string, unknown> = {};\n if (existing) {\n try {\n config = JSON.parse(existing) as Record<string, unknown>;\n } catch {\n // Comment-bearing JSONC — leave the user's file alone.\n return { content: existing, patched: false };\n }\n }\n for (const fragment of fragments) {\n mergeBindingValue(config, fragment);\n }\n return { content: `${JSON.stringify(config, null, \"\\t\")}\\n`, patched: true };\n}\n\n/** Recursively merge one fragment object into the target, per the applyBindingFragments rules. */\nfunction mergeBindingValue(target: Record<string, unknown>, fragment: Record<string, unknown>) {\n for (const [key, incoming] of Object.entries(fragment)) {\n const current = target[key];\n if (Array.isArray(incoming)) {\n target[key] = mergeBindingArrays(Array.isArray(current) ? current : [], incoming);\n continue;\n }\n if (isPlainObject(incoming)) {\n if (isPlainObject(current)) {\n mergeBindingValue(current, incoming);\n } else if (current === undefined) {\n target[key] = structuredClone(incoming);\n }\n continue;\n }\n if (current === undefined) {\n target[key] = incoming;\n }\n }\n}\n\n/** Merge fragment array entries into an existing array, keyed by each entry's `binding`. */\nfunction mergeBindingArrays(current: unknown[], incoming: unknown[]): unknown[] {\n const merged = [...current];\n for (const entry of incoming) {\n if (!isPlainObject(entry) || typeof entry.binding !== \"string\") {\n // Non-binding-keyed values: append when missing (dedupe by deep equality).\n const exists = merged.some((m) => JSON.stringify(m) === JSON.stringify(entry));\n if (!exists) {\n merged.push(structuredClone(entry));\n }\n continue;\n }\n const index = merged.findIndex(\n (m) => isPlainObject(m) && (m as Record<string, unknown>).binding === entry.binding,\n );\n if (index === -1) {\n merged.push(structuredClone(entry));\n } else {\n // Fragment values win for connector-owned keys; user-added extra keys survive.\n merged[index] = { ...(merged[index] as Record<string, unknown>), ...entry };\n }\n }\n return merged;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/**\n * Patch an existing wrangler.jsonc for an adapter change (or a Pages project rename), touching only\n * the adapter-shape keys and preserving everything else the user added. Regenerates from scratch\n * when the input is missing or unparseable (wrangler.jsonc supports comments, which JSON.parse does\n * not — a commented config falls back to regeneration rather than data loss... it is returned\n * unchanged with `patched: false` so callers can warn).\n */\nexport function updateWranglerConfig(\n existing: string | null,\n { slug, adapter }: { slug: string; adapter: string },\n): { content: string; patched: boolean } {\n if (!existing) {\n return { content: buildWranglerJsonc({ adapter, slug }), patched: true };\n }\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(existing) as Record<string, unknown>;\n } catch {\n // Comment-bearing JSONC — leave the user's file alone.\n return { content: existing, patched: false };\n }\n config[\"name\"] = slug;\n if (adapter === \"cloudflare-workers\") {\n delete config[\"pages_build_output_dir\"];\n config[\"main\"] = \"./dist/worker.js\";\n config[\"assets\"] = { binding: \"ASSETS\", directory: \"./dist\" };\n } else {\n delete config[\"main\"];\n delete config[\"assets\"];\n config[\"pages_build_output_dir\"] = \"./dist\";\n }\n return { content: `${JSON.stringify(config, null, \"\\t\")}\\n`, patched: true };\n}\n",
|
|
6
|
+
"/// <reference lib=\"dom\" />\n/**\n * Pages-service — Cloudflare Pages publish domain logic over the PAL's\n * `cfApi` passthrough. Works identically on every platform that provides it:\n * the dev server / desktop (user API token via cf-settings → /__studio/cf/proxy)\n * and the cloud platform (hosted OAuth). Publish state is written to\n * project.json `build.deploy` — it travels with the repo, so any Studio can\n * tell whether the publish workflow already exists.\n *\n * @license MIT\n */\n\nimport { updateWranglerConfig } from \"@jxsuite/create/scaffold\";\nimport type { DeployConfig, ProjectConfig } from \"@jxsuite/schema/types\";\nimport { getPlatform } from \"../platform\";\nimport { updateSiteConfig } from \"../site-context\";\n\nexport interface CfAccount {\n id: string;\n name: string;\n}\n\nexport interface PagesDeploymentInfo {\n id: string;\n url: string;\n environment: string;\n /** Latest stage name/status, e.g. \"deploy: success\" or \"build: failure\". */\n stage: string;\n status: string;\n createdOn: string;\n}\n\nexport interface ConnectOptions {\n accountId: string;\n projectName: string;\n productionBranch: string;\n owner: string;\n repo: string;\n}\n\n/** True when the active platform can reach the Cloudflare API. */\nexport function platformSupportsPublish(): boolean {\n // Answers false before a platform is registered rather than throwing. This is read by ambient\n // Surfaces — the status bar's deploy item, the Activity tab's checklist — which paint during boot\n // And in tests that register no platform, and neither has any business crashing because\n // Publishing is not available yet. \"Can this host publish?\" has a truthful answer before the host\n // Exists, and it is no.\n try {\n return typeof getPlatform().cfApi === \"function\";\n } catch {\n return false;\n }\n}\n\nasync function cfApi<T>(path: string, init?: { method?: string; body?: unknown }): Promise<T> {\n const api = getPlatform().cfApi;\n if (!api) {\n throw new Error(\"This platform cannot reach the Cloudflare API\");\n }\n return (await api(path, init)) as T;\n}\n\nexport async function listAccounts(): Promise<CfAccount[]> {\n return cfApi<CfAccount[]>(\"/accounts\");\n}\n\ninterface PagesProjectWire {\n name: string;\n subdomain?: string;\n domains?: string[];\n}\n\n/** The Pages project, or null when it does not exist yet. */\nexport async function getPagesProject(\n accountId: string,\n projectName: string,\n): Promise<PagesProjectWire | null> {\n try {\n return await cfApi<PagesProjectWire>(`/accounts/${accountId}/pages/projects/${projectName}`);\n } catch {\n return null;\n }\n}\n\n/**\n * Create a GitHub-connected Pages project that builds `bunx jx build` on every push. Requires the\n * Cloudflare Pages GitHub App on the repo — the characteristic failure is surfaced to the caller\n * with an install hint.\n */\nexport async function createPagesProject(opts: ConnectOptions): Promise<PagesProjectWire> {\n return cfApi<PagesProjectWire>(`/accounts/${opts.accountId}/pages/projects`, {\n method: \"POST\",\n body: {\n name: opts.projectName,\n production_branch: opts.productionBranch,\n build_config: {\n build_command: \"bunx jx build\",\n destination_dir: \"dist\",\n },\n source: {\n type: \"github\",\n config: {\n owner: opts.owner,\n repo_name: opts.repo,\n production_branch: opts.productionBranch,\n deployments_enabled: true,\n },\n },\n },\n });\n}\n\ninterface DeploymentWire {\n id: string;\n url: string;\n environment: string;\n latest_stage?: { name?: string; status?: string };\n created_on: string;\n}\n\n/** The most recent deployment of the connected project, or null when none. */\nexport async function latestDeployment(deploy: DeployConfig): Promise<PagesDeploymentInfo | null> {\n const deployments = await cfApi<DeploymentWire[]>(\n `/accounts/${deploy.accountId}/pages/projects/${deploy.projectName}/deployments`,\n );\n const [latest] = deployments;\n if (!latest) {\n return null;\n }\n return {\n id: latest.id,\n url: latest.url,\n environment: latest.environment,\n stage: latest.latest_stage?.name ?? \"unknown\",\n status: latest.latest_stage?.status ?? \"unknown\",\n createdOn: latest.created_on,\n };\n}\n\n/**\n * Write (or with null, remove) the `build.deploy` block, preserving the rest of `build`. On\n * connect, wrangler.jsonc is patched so its `name` matches the connected Pages project\n * (comment-bearing JSONC is left alone).\n */\nexport async function writeDeployConfig(\n config: ProjectConfig,\n deploy: DeployConfig | null,\n): Promise<void> {\n const build: NonNullable<ProjectConfig[\"build\"]> = { ...config.build };\n if (deploy === null) {\n delete build.deploy;\n } else {\n build.deploy = deploy;\n }\n await updateSiteConfig({ build });\n\n if (deploy !== null) {\n const platform = getPlatform();\n let existing: string | null = null;\n try {\n existing = await platform.readFile(\"wrangler.jsonc\");\n } catch {\n existing = null;\n }\n const adapter =\n build.adapter === \"cloudflare-workers\" ? \"cloudflare-workers\" : \"cloudflare-pages\";\n const { content, patched } = updateWranglerConfig(existing, {\n adapter,\n slug: deploy.projectName,\n });\n if (patched) {\n await platform.writeFile(\"wrangler.jsonc\", content);\n }\n }\n}\n\n/**\n * The whole connect flow: reuse the Pages project when it already exists, create it otherwise, then\n * persist `build.deploy` (+ wrangler.jsonc sync).\n */\nexport async function connectDeploy(\n config: ProjectConfig,\n opts: ConnectOptions,\n): Promise<DeployConfig> {\n const existing = await getPagesProject(opts.accountId, opts.projectName);\n const project = existing ?? (await createPagesProject(opts));\n const deploy: DeployConfig = {\n provider: \"cloudflare-pages\",\n accountId: opts.accountId,\n projectName: opts.projectName,\n ...(project.subdomain ? { productionUrl: `https://${project.subdomain}` } : {}),\n };\n await writeDeployConfig(config, deploy);\n return deploy;\n}\n",
|
|
7
|
+
"/// <reference lib=\"dom\" />\n/**\n * Deploy-checklist.ts — what is MISSING before this project can ship, as an ordered list.\n *\n * What this replaces: a Cloudflare form that opened asking for a GitHub owner and repository on a\n * project that had never been `git init`-ed, failed with a Cloudflare API error naming neither\n * fact, and offered no way forward. Publishing is a CHAIN — the repository exists, it has a remote\n * and the remote is current, a provider is connected, a deployment happened — and every link is a\n * different command owned by a different module. Nothing in Studio held the chain, so no surface\n * could say which link was missing.\n *\n * This module is the chain (plan §9.5):\n *\n * - {@link deployChecklist} is the ordered prerequisite list, each step carrying **the command that\n * satisfies it** rather than a sentence telling the reader to go and find one;\n * - {@link renderDeployChecklist} is its rendering, and it lives in the Bottom dock's **Activity**\n * tab because a deploy is a long operation with a log and the dock cap is four (§2 principle 9).\n * It draws in the Activity vocabulary — `activity-row`, `activity-steps`, `activity-step--done` —\n * for the same reason: a fifth visual idiom for \"an ordered list of stages that finish\" would be\n * a second design of a thing the tab already has;\n * - {@link deployStatusItem} is the status bar's project-field item, whose **label is the next\n * blocking prerequisite** — the shortcut and the explanation in one 24px item, and ambient state\n * rather than a transient message, which is the only thing that bar carries (§3.2 ⑫).\n *\n * **A step it cannot answer says `unknown`.** `services/references.ts` established the rule and it\n * matters more here: \"no deployment\" and \"we have not asked Cloudflare\" look identical from inside\n * the app, and a checklist that renders the second as the first tells the user to redo a deploy\n * that already succeeded. The observation cache ({@link noteDeployment}) is written by the code\n * that actually asked — the Publish panel's load and {@link import(\"./publish-commands\").runDeploy}\n * — and by nothing else.\n *\n * **No secret reaches this module.** A provider is connected or it is not; the token that proves it\n * is read by `platforms/devserver.ts` on its way to the same-origin proxy and by nothing that\n * renders (`studio.md` §15 rule 1).\n */\n\nimport { html, nothing } from \"lit-html\";\nimport { activeRegistry } from \"../commands/active-registry\";\nimport { platformSupportsPublish } from \"./pages-service\";\nimport { projectState } from \"../store\";\nimport { shell } from \"../shell\";\nimport type { DeployConfig, ProjectConfig } from \"@jxsuite/schema/types\";\nimport type { PagesDeploymentInfo } from \"./pages-service\";\nimport type { TemplateResult } from \"lit-html\";\n\n/** The chain, in the order the links must be forged. */\nexport const DEPLOY_STEP_IDS = [\"repo\", \"remote\", \"provider\", \"deployed\"] as const;\n\nexport type DeployStepId = (typeof DEPLOY_STEP_IDS)[number];\n\n/**\n * Whether a link is forged.\n *\n * `unknown` is not a third kind of \"no\": it is the honest answer when the fact lives on a server\n * nobody has asked. It blocks like a `todo` and it READS differently, which is the whole point.\n */\nexport type DeployStepState = \"done\" | \"todo\" | \"unknown\";\n\n/** One prerequisite. */\nexport interface DeployStep {\n readonly id: DeployStepId;\n /** Imperative, and short enough to be a 24px status-bar label. */\n readonly label: string;\n readonly state: DeployStepState;\n /** One sentence: what is true now, or what satisfying it buys. Never a secret. */\n readonly detail: string;\n /** The command that satisfies it — an id, so the row inherits title, chord and refusal. */\n readonly command: string;\n}\n\n/** The active project's configuration, or null when no project is open. */\nfunction currentConfig(): ProjectConfig | null {\n return (projectState?.projectConfig as ProjectConfig | undefined) ?? null;\n}\n\n/**\n * The connected provider block, or `undefined`.\n *\n * Exported because the Publish panel asks the same question and P6's lesson was that two copies of\n * one derivation drift apart in silence — there is one reader of `build.deploy` in the app.\n */\nexport function currentDeploy(): DeployConfig | undefined {\n return currentConfig()?.build?.deploy;\n}\n\n/**\n * The last deployment anybody actually observed, or null when nobody has asked.\n *\n * Module state rather than a field on the config: a deployment is a fact about Cloudflare, not\n * about this repository, and writing it into `project.json` would commit a timestamp that is stale\n * the moment it is pushed.\n */\nlet _observed: PagesDeploymentInfo | null = null;\n\n/** Whether anybody has asked at all — the difference between `todo` and `unknown`. */\nlet _asked = false;\n\n/** Record what Cloudflare answered. `null` means \"asked, and there are none\". */\nexport function noteDeployment(info: PagesDeploymentInfo | null): void {\n _observed = info;\n _asked = true;\n}\n\n/** The observed deployment, or null. */\nexport function observedDeployment(): PagesDeploymentInfo | null {\n return _observed;\n}\n\n/** Forget the observation — project close, and every test that asserts the `unknown` branch. */\nexport function forgetDeployment(): void {\n _observed = null;\n _asked = false;\n}\n\nfunction repoStep(): DeployStep {\n const { status } = shell.git;\n if (status === null) {\n return {\n command: \"git.init\",\n detail: \"Source control has not reported on this project yet.\",\n id: \"repo\",\n label: \"Track this project with git\",\n state: \"unknown\",\n };\n }\n return status.isRepo\n ? {\n command: \"git.init\",\n detail: `Tracked${status.branch ? ` — on branch ${status.branch}` : \"\"}.`,\n id: \"repo\",\n label: \"Track this project with git\",\n state: \"done\",\n }\n : {\n command: \"git.init\",\n detail: \"A deploy ships what the repository holds, so the repository comes first.\",\n id: \"repo\",\n label: \"Track this project with git\",\n state: \"todo\",\n };\n}\n\nfunction remoteStep(): DeployStep {\n const { status } = shell.git;\n if (status === null || !status.isRepo) {\n return {\n command: \"git.createGithubRepository\",\n detail: \"A remote is where the provider builds from.\",\n id: \"remote\",\n label: \"Push to a remote\",\n state: status === null ? \"unknown\" : \"todo\",\n };\n }\n // A GitStatus from a host that reports no remotes array is not a repo with remotes — it is a\n // Host that did not say. Reading through it took the whole status bar down with a TypeError.\n if ((status.remotes ?? []).length === 0) {\n return {\n command: \"git.createGithubRepository\",\n detail: \"This repository is local only — nothing outside this machine can build it.\",\n id: \"remote\",\n label: \"Push to a remote\",\n state: \"todo\",\n };\n }\n return status.ahead > 0\n ? {\n command: \"git.push\",\n detail: `${status.ahead} commit(s) are not on ${status.remotes[0]} yet, so a build would ship the older tree.`,\n id: \"remote\",\n label: \"Push to a remote\",\n state: \"todo\",\n }\n : {\n command: \"git.push\",\n detail: `Up to date with ${status.remotes[0]}.`,\n id: \"remote\",\n label: \"Push to a remote\",\n state: \"done\",\n };\n}\n\nfunction providerStep(): DeployStep {\n const deploy = currentDeploy();\n if (deploy) {\n return {\n command: \"publish.setUp\",\n detail: `Cloudflare Pages project ${deploy.projectName}.`,\n id: \"provider\",\n label: \"Connect a deploy provider\",\n state: \"done\",\n };\n }\n return platformSupportsPublish()\n ? {\n command: \"publish.setUp\",\n detail: \"Connecting one makes every commit build and publish on its own.\",\n id: \"provider\",\n label: \"Connect a deploy provider\",\n state: \"todo\",\n }\n : {\n command: \"publish.setUp\",\n detail:\n \"This platform cannot reach the Cloudflare API. Commit and push instead — your host \" +\n \"runs bunx jx build and serves dist/.\",\n id: \"provider\",\n label: \"Connect a deploy provider\",\n state: \"unknown\",\n };\n}\n\nfunction deployedStep(): DeployStep {\n if (!currentDeploy()) {\n return {\n command: \"publish.deploy\",\n detail: \"Nothing has been deployed, because no provider is connected.\",\n id: \"deployed\",\n label: \"Deploy\",\n state: \"todo\",\n };\n }\n if (!_asked) {\n return {\n command: \"publish.deploy\",\n detail: \"Cloudflare has not been asked yet, so this is not a claim that nothing shipped.\",\n id: \"deployed\",\n label: \"Deploy\",\n state: \"unknown\",\n };\n }\n if (_observed === null) {\n return {\n command: \"publish.deploy\",\n detail: \"Cloudflare reports no deployments for this project.\",\n id: \"deployed\",\n label: \"Deploy\",\n state: \"todo\",\n };\n }\n return _observed.status === \"success\"\n ? {\n command: \"publish.deploy\",\n detail: `${_observed.environment} — ${_observed.url}`,\n id: \"deployed\",\n label: \"Deploy\",\n state: \"done\",\n }\n : {\n command: \"publish.deploy\",\n detail: `Last deployment ${_observed.stage}: ${_observed.status}.`,\n id: \"deployed\",\n label: \"Deploy\",\n state: \"todo\",\n };\n}\n\n/** The four prerequisites, in order. */\nexport function deployChecklist(): DeployStep[] {\n return [repoStep(), remoteStep(), providerStep(), deployedStep()];\n}\n\n/**\n * The first link that is not forged, or null when the chain is whole.\n *\n * `unknown` counts as not forged: the app may not claim a step is done on the strength of not\n * having asked.\n */\nexport function nextDeployStep(): DeployStep | null {\n return deployChecklist().find((step) => step.state !== \"done\") ?? null;\n}\n\n/** What the status bar's project field shows. `null` when there is no project to deploy. */\nexport interface DeployStatusItem {\n readonly command: string;\n readonly label: string;\n readonly title: string;\n}\n\n/**\n * The status-bar item — ambient state, never a transient message.\n *\n * Its LABEL is the next blocking prerequisite, so the item explains itself: a reader who does not\n * know what is missing learns it from the same 24px string that fixes it.\n */\nexport function deployStatusItem(): DeployStatusItem | null {\n if (!projectState) {\n return null;\n }\n const next = nextDeployStep();\n if (next) {\n return { command: next.command, label: next.label, title: next.detail };\n }\n const url = currentDeploy()?.productionUrl;\n return {\n command: \"publish.openDashboard\",\n label: \"Deployed\",\n title: url ?? \"Everything this project needs to ship is in place.\",\n };\n}\n\n// ─── Rendering ────────────────────────────────────────────────────────────────\n\n/** Checklist state → the Activity tab's step classes, so one vocabulary draws both. */\nconst STEP_CLASS: Readonly<Record<DeployStepState, string>> = {\n done: \"done\",\n todo: \"pending\",\n unknown: \"pending\",\n};\n\nconst STEP_ICON: Readonly<Record<DeployStepState, string>> = {\n done: \"✓\",\n todo: \"·\",\n unknown: \"?\",\n};\n\n/**\n * The next action, as a button — or nothing.\n *\n * A command the registry does not have, or whose `when` is false, renders NOTHING rather than a\n * dead label. The status bar's `itemTpl` takes the same position for the same reason: a surface may\n * choose whether to show a command, never whether it exists.\n */\nfunction actionTpl(step: DeployStep | null): TemplateResult | typeof nothing {\n if (!step) {\n return nothing;\n }\n const registry = activeRegistry();\n const command = registry?.get(step.command);\n if (!registry || !command || !registry.isVisible(step.command)) {\n return nothing;\n }\n const reason = registry.disabledReason(step.command);\n return html`<sp-action-button\n size=\"s\"\n ?disabled=${reason !== undefined}\n title=${reason ? `${command.title} — requires ${reason}` : command.title}\n @click=${() => {\n void registry.run(step.command);\n }}\n >${command.title}</sp-action-button\n >`;\n}\n\n/**\n * The checklist, as the Activity tab draws it — or nothing, when no project is open.\n *\n * Rendered ABOVE the operation list rather than as an entry in it: an activity is something that\n * happened, and this is something that has not. It carries no `data-jx-region` stamp — the region\n * is `dock.bottom/panel:activity`, which the dock derives, and a hand-stamped leaf is a committed\n * budget (§13.2) that this does not need to spend.\n */\nexport function renderDeployChecklist(): TemplateResult | typeof nothing {\n if (!projectState) {\n return nothing;\n }\n const steps = deployChecklist();\n const next = steps.find((step) => step.state !== \"done\") ?? null;\n return html`\n <ul class=\"activity-list\">\n <li class=\"activity-row ${next ? \"activity-row--running\" : \"activity-row--done\"}\">\n <span class=\"activity-icon\" aria-hidden=\"true\">${next ? \"⋯\" : \"✓\"}</span>\n <div class=\"activity-body\">\n <div class=\"activity-head\">\n <span class=\"activity-title\">Deploy checklist</span>\n <span class=\"activity-source\">Publish</span>\n </div>\n <div class=\"activity-status\">\n ${next ? next.detail : \"Everything this project needs to ship is in place.\"}\n </div>\n <ol class=\"activity-steps\">\n ${steps.map(\n (step) => html`<li class=\"activity-step activity-step--${STEP_CLASS[step.state]}\">\n <span class=\"activity-step-icon\" aria-hidden=\"true\">${STEP_ICON[step.state]}</span>\n ${step.label}${step.state === \"done\" ? \"\" : ` — ${step.detail}`}\n </li>`,\n )}\n </ol>\n ${actionTpl(next)}\n </div>\n </li>\n </ul>\n `;\n}\n"
|
|
8
|
+
],
|
|
9
|
+
"mappings": "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",
|
|
10
|
+
"debugId": "F16370A3EAFA6BE564756E2164756E21",
|
|
11
|
+
"names": []
|
|
12
|
+
}
|