@jxsuite/studio 6.1.1 → 8.0.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/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* Publishing a change set: the destination, the checks, and the one operation both Review changes
|
|
4
|
+
* and the quick publish dialog run (studio.md §22.8).
|
|
5
|
+
*
|
|
6
|
+
* **Two destinations, decided by the host rather than assumed.** **Publish live** commits what is
|
|
7
|
+
* included to the current branch and ships it: through `runDeploy` when a deploy provider is
|
|
8
|
+
* connected (which pushes and asks Cloudflare what it built), otherwise by pushing to the remote,
|
|
9
|
+
* otherwise by committing alone and saying that nothing left the machine. **Send for review** needs
|
|
10
|
+
* a host that opens pull requests (`createPullRequest`); on one that does not (the dev server and
|
|
11
|
+
* the desktop app today) it is drawn disabled with that sentence rather than falling back to a
|
|
12
|
+
* branch push that opens nothing. On a host whose branches are sessions (`gitHosted`, the cloud) a
|
|
13
|
+
* branch cannot be made and committed to mid-flow, so review there commits to the session's own
|
|
14
|
+
* branch and opens the pull request from it, and the destination's note says so.
|
|
15
|
+
*
|
|
16
|
+
* **Every word a control shows is decided here**, so the workspace and the dialog cannot disagree
|
|
17
|
+
* about what a button does: {@link destinationChoices}, {@link publishLabel} and
|
|
18
|
+
* {@link publishBlocker} are read by both, and {@link publishChanges} is the verb behind both
|
|
19
|
+
* primary buttons.
|
|
20
|
+
*
|
|
21
|
+
* @docs studio/publish
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { errorMessage } from "@jxsuite/schema/parse";
|
|
25
|
+
import { flushAllCollab } from "../collab/collab-session";
|
|
26
|
+
import { getPlatform, hasPlatform } from "../platform";
|
|
27
|
+
import { notify } from "../services/notify";
|
|
28
|
+
import { shell } from "../shell";
|
|
29
|
+
import { projectState } from "../store";
|
|
30
|
+
import { slugify } from "../files/new-file-name";
|
|
31
|
+
import { currentDeploy, nextDeployStep } from "./deploy-checklist";
|
|
32
|
+
import { platformSupportsPublish } from "./pages-service";
|
|
33
|
+
import { runDeploy } from "./publish-commands";
|
|
34
|
+
import { platformHostsGit, platformOpensPullRequests, refreshGitStatus } from "./source-control";
|
|
35
|
+
import type { GitFileStatus } from "../types";
|
|
36
|
+
import type { PublishDestination } from "./publish-ids";
|
|
37
|
+
|
|
38
|
+
// ─── Where a change set can go ───────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
/** The remote the status names first, or `""` (a host may omit the array). */
|
|
41
|
+
function firstRemote(): string {
|
|
42
|
+
const remotes = shell.git.status?.remotes;
|
|
43
|
+
return Array.isArray(remotes) && remotes.length > 0 ? (remotes[0] ?? "") : "";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The branch a commit lands on now. */
|
|
47
|
+
export function currentBranch(): string {
|
|
48
|
+
return shell.git.branches?.current || shell.git.status?.branch || "";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Whether Publish live deploys: a provider is connected, the host can reach it, and there is a
|
|
53
|
+
* remote for it to build from.
|
|
54
|
+
*/
|
|
55
|
+
export function deployReady(): boolean {
|
|
56
|
+
return currentDeploy() !== undefined && platformSupportsPublish() && firstRemote() !== "";
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Where a live publish ends up, in words: the site's address, else the Pages project's name. */
|
|
60
|
+
function liveTarget(): string {
|
|
61
|
+
const deploy = currentDeploy();
|
|
62
|
+
return deploy?.productionUrl ?? deploy?.projectName ?? "";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The branch a review is sent from: `studio/` and the summary as a slug, cut short enough to read
|
|
67
|
+
* in a branch picker. A summary with nothing sluggable in it still names a branch.
|
|
68
|
+
*/
|
|
69
|
+
export function reviewBranchName(summary: string): string {
|
|
70
|
+
const slug = slugify(summary).replaceAll(/-+/g, "-").replaceAll(/^-|-$/g, "").slice(0, 48);
|
|
71
|
+
return `studio/${slug.replace(/-$/, "") || "changes"}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** One destination, as a radio card draws it. */
|
|
75
|
+
export interface DestinationChoice {
|
|
76
|
+
value: PublishDestination;
|
|
77
|
+
label: string;
|
|
78
|
+
/** What choosing it does, in one sentence: where the commit lands and what happens next. */
|
|
79
|
+
note: string;
|
|
80
|
+
/**
|
|
81
|
+
* `"true"` for the chosen one. A string, because `jx-action-button`'s `checked` is the radio
|
|
82
|
+
* segment's `"true"`/`"false"`: a boolean draws neither the selection nor the radio role.
|
|
83
|
+
*/
|
|
84
|
+
checked: "true" | "false";
|
|
85
|
+
disabled: boolean;
|
|
86
|
+
/** Why it is disabled, or `""`. Drawn as the card's hint. */
|
|
87
|
+
reason: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** The repository's default branch, when the host reported it, or `""`. */
|
|
91
|
+
export function defaultBranch(): string {
|
|
92
|
+
return shell.git.branches?.defaultBranch ?? "";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Why Send for review cannot run on this host, or `""` when it can. */
|
|
96
|
+
export function reviewRefusal(): string {
|
|
97
|
+
if (!platformOpensPullRequests()) {
|
|
98
|
+
return (
|
|
99
|
+
"This host cannot open a pull request yet. Publish live, or create a branch under " +
|
|
100
|
+
"Branches and push it."
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (platformHostsGit()) {
|
|
104
|
+
/* A commit here lands on GitHub as it is made, and the pull request is opened from the session's
|
|
105
|
+
own branch. On the default branch that is a live publish followed by a pull request into
|
|
106
|
+
itself, so review is refused until the session is on a branch of its own. A host that has
|
|
107
|
+
not said which branch is the default is refused too: the safe answer is the one that cannot
|
|
108
|
+
publish by accident. */
|
|
109
|
+
const base = defaultBranch();
|
|
110
|
+
const branch = currentBranch();
|
|
111
|
+
if (!base || !branch || branch === base) {
|
|
112
|
+
return (
|
|
113
|
+
`Every commit to ${base || "the default branch"} on this host is live. Create a branch ` +
|
|
114
|
+
"under Branches and send it for review from there."
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
return "";
|
|
118
|
+
}
|
|
119
|
+
if (firstRemote() === "") {
|
|
120
|
+
return "A pull request needs a remote. Create the GitHub repository under Hosting first.";
|
|
121
|
+
}
|
|
122
|
+
return "";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** What Publish live does, said before it runs. */
|
|
126
|
+
function liveNote(): string {
|
|
127
|
+
const branch = currentBranch() || "the current branch";
|
|
128
|
+
if (deployReady()) {
|
|
129
|
+
return `Commits to ${branch} and deploys to ${liveTarget()}.`;
|
|
130
|
+
}
|
|
131
|
+
if (platformHostsGit()) {
|
|
132
|
+
return `Commits to ${branch} on GitHub.`;
|
|
133
|
+
}
|
|
134
|
+
const remote = firstRemote();
|
|
135
|
+
return remote
|
|
136
|
+
? `Commits to ${branch} and pushes it to ${remote}.`
|
|
137
|
+
: `Commits to ${branch}. This repository has no remote, so nothing leaves this machine.`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** What Send for review does, said before it runs. */
|
|
141
|
+
function reviewNote(): string {
|
|
142
|
+
const branch = currentBranch() || "the current branch";
|
|
143
|
+
if (platformHostsGit()) {
|
|
144
|
+
return (
|
|
145
|
+
`Commits to ${branch} and opens a pull request from it into ` +
|
|
146
|
+
`${defaultBranch() || "the default branch"}.`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
const summary = shell.git.commitMessage.trim();
|
|
150
|
+
const head = summary ? reviewBranchName(summary) : "a new studio/ branch";
|
|
151
|
+
return `Saves to ${head}, pushes it and opens a pull request into ${branch}.`;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** The two destinations, with the chosen one checked and a refused one disabled. */
|
|
155
|
+
export function destinationChoices(chosen: PublishDestination): DestinationChoice[] {
|
|
156
|
+
const refusal = reviewRefusal();
|
|
157
|
+
return [
|
|
158
|
+
{
|
|
159
|
+
checked: chosen === "live" ? "true" : "false",
|
|
160
|
+
disabled: false,
|
|
161
|
+
label: "Publish live",
|
|
162
|
+
note: liveNote(),
|
|
163
|
+
reason: "",
|
|
164
|
+
value: "live",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
checked: chosen === "review" ? "true" : "false",
|
|
168
|
+
disabled: refusal !== "",
|
|
169
|
+
label: "Send for review",
|
|
170
|
+
note: reviewNote(),
|
|
171
|
+
reason: refusal,
|
|
172
|
+
value: "review",
|
|
173
|
+
},
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* The destination actually in effect: the chosen one, unless it is refused here, in which case the
|
|
179
|
+
* one that is not. A host that cannot open a pull request never leaves the primary button naming
|
|
180
|
+
* one.
|
|
181
|
+
*/
|
|
182
|
+
export function effectiveDestination(chosen: PublishDestination): PublishDestination {
|
|
183
|
+
return chosen === "review" && reviewRefusal() !== "" ? "live" : chosen;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** The primary button's words for a destination. */
|
|
187
|
+
export function publishLabel(destination: PublishDestination): string {
|
|
188
|
+
if (destination === "review") {
|
|
189
|
+
return "Send for review";
|
|
190
|
+
}
|
|
191
|
+
if (deployReady()) {
|
|
192
|
+
return "Publish live";
|
|
193
|
+
}
|
|
194
|
+
return platformHostsGit() || firstRemote() !== "" ? "Commit and push" : "Commit";
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** The files a publish would take: the included ones, or every change when `includeAll`. */
|
|
198
|
+
function filesToPublish(includeAll: boolean): GitFileStatus[] {
|
|
199
|
+
const files = shell.git.status?.files ?? [];
|
|
200
|
+
return includeAll ? files : files.filter((file) => Boolean(file.staged));
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Why the primary button is disabled, or `""` when it may run. One sentence, drawn beside it.
|
|
205
|
+
*
|
|
206
|
+
* @param destination Where the change set would go.
|
|
207
|
+
* @param includeAll Whether the caller publishes every change (the quick dialog) or only the
|
|
208
|
+
* included ones (Review changes).
|
|
209
|
+
*/
|
|
210
|
+
export function publishBlocker(destination: PublishDestination, includeAll = false): string {
|
|
211
|
+
const { status } = shell.git;
|
|
212
|
+
if (!projectState || !status?.isRepo) {
|
|
213
|
+
return "Track this project with git first.";
|
|
214
|
+
}
|
|
215
|
+
if (shell.git.loading) {
|
|
216
|
+
return "Source control is busy.";
|
|
217
|
+
}
|
|
218
|
+
if (status.files.length === 0) {
|
|
219
|
+
return "There is nothing to publish.";
|
|
220
|
+
}
|
|
221
|
+
if (filesToPublish(includeAll).length === 0) {
|
|
222
|
+
return "Include at least one change.";
|
|
223
|
+
}
|
|
224
|
+
if (!shell.git.commitMessage.trim()) {
|
|
225
|
+
return "Write a summary of the change first.";
|
|
226
|
+
}
|
|
227
|
+
return destination === "review" ? reviewRefusal() : "";
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ─── Checks ──────────────────────────────────────────────────────────────────
|
|
231
|
+
|
|
232
|
+
/** One check, as a row draws it. */
|
|
233
|
+
export interface PublishCheck {
|
|
234
|
+
key: "deploy" | "build";
|
|
235
|
+
/** `done`, `todo`, `unknown` (not asked), `running` or `failed`. */
|
|
236
|
+
state: "done" | "todo" | "unknown" | "running" | "failed";
|
|
237
|
+
text: string;
|
|
238
|
+
/** The command that resolves a deploy step, or `""`. */
|
|
239
|
+
command: string;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** The change set a build check is about: the changed paths and their letters. */
|
|
243
|
+
function changeSignature(): string {
|
|
244
|
+
return (shell.git.status?.files ?? []).map((file) => `${file.status}:${file.path}`).join("|");
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/** Whether this host can build the site at all (`StudioPlatform.buildSite`). */
|
|
248
|
+
export function canCheckBuild(): boolean {
|
|
249
|
+
return hasPlatform() && getPlatform().buildSite !== undefined;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Build the site and record what it said, for the change set as it stands.
|
|
254
|
+
*
|
|
255
|
+
* A live preview is not a build and the check says so: a host that renders the working tree in the
|
|
256
|
+
* browser (the cloud) has prerendered nothing, so "the site builds" would be a claim it cannot
|
|
257
|
+
* make.
|
|
258
|
+
*/
|
|
259
|
+
export async function runBuildCheck(): Promise<void> {
|
|
260
|
+
if (!canCheckBuild() || shell.publish.build.state === "running") {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const build = getPlatform().buildSite;
|
|
264
|
+
if (!build) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
shell.publish.build.state = "running";
|
|
268
|
+
shell.publish.build.text = "Building the site…";
|
|
269
|
+
shell.publish.build.for = changeSignature();
|
|
270
|
+
try {
|
|
271
|
+
const result = await build();
|
|
272
|
+
if (result.errors.length > 0) {
|
|
273
|
+
shell.publish.build.state = "failed";
|
|
274
|
+
shell.publish.build.text = `Built with ${result.errors.length} error(s): ${result.errors[0]}`;
|
|
275
|
+
} else {
|
|
276
|
+
shell.publish.build.state = "passed";
|
|
277
|
+
shell.publish.build.text =
|
|
278
|
+
result.mode === "live"
|
|
279
|
+
? `${result.routes} page(s) render. This host previews the working tree; it does not build.`
|
|
280
|
+
: `Site builds: ${result.routes} page(s).`;
|
|
281
|
+
}
|
|
282
|
+
} catch (error) {
|
|
283
|
+
shell.publish.build.state = "failed";
|
|
284
|
+
shell.publish.build.text = `The site could not be built: ${errorMessage(error)}`;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* The checks a change set is published under: the deploy checklist's next step, and a build check
|
|
290
|
+
* where the host can build. A build check about a different set of changes is not shown as passed.
|
|
291
|
+
*/
|
|
292
|
+
export function publishChecks(): PublishCheck[] {
|
|
293
|
+
const checks: PublishCheck[] = [];
|
|
294
|
+
const next = nextDeployStep();
|
|
295
|
+
checks.push(
|
|
296
|
+
next
|
|
297
|
+
? {
|
|
298
|
+
command: next.command,
|
|
299
|
+
key: "deploy",
|
|
300
|
+
state: next.state === "unknown" ? "unknown" : "todo",
|
|
301
|
+
text: `${next.label}: ${next.detail}`,
|
|
302
|
+
}
|
|
303
|
+
: {
|
|
304
|
+
command: "",
|
|
305
|
+
key: "deploy",
|
|
306
|
+
state: "done",
|
|
307
|
+
text: "Everything this project needs to ship is in place.",
|
|
308
|
+
},
|
|
309
|
+
);
|
|
310
|
+
if (canCheckBuild()) {
|
|
311
|
+
const current =
|
|
312
|
+
shell.publish.build.for === changeSignature() || shell.publish.build.state === "running";
|
|
313
|
+
checks.push(
|
|
314
|
+
current && shell.publish.build.state !== "idle"
|
|
315
|
+
? {
|
|
316
|
+
command: "",
|
|
317
|
+
key: "build",
|
|
318
|
+
state:
|
|
319
|
+
shell.publish.build.state === "passed"
|
|
320
|
+
? "done"
|
|
321
|
+
: shell.publish.build.state === "failed"
|
|
322
|
+
? "failed"
|
|
323
|
+
: "running",
|
|
324
|
+
text: shell.publish.build.text,
|
|
325
|
+
}
|
|
326
|
+
: {
|
|
327
|
+
command: "",
|
|
328
|
+
key: "build",
|
|
329
|
+
state: "unknown",
|
|
330
|
+
text: "The site has not been built with these changes.",
|
|
331
|
+
},
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
return checks;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** The checks as one line, for the quick publish dialog: what is not done, or that all is. */
|
|
338
|
+
export function checksLine(checks: readonly PublishCheck[]): string {
|
|
339
|
+
const open = checks.filter((check) => check.state !== "done");
|
|
340
|
+
if (open.length === 0) {
|
|
341
|
+
return "Checks passed: ready to publish.";
|
|
342
|
+
}
|
|
343
|
+
return open.map((check) => check.text).join(" · ");
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ─── The operation ───────────────────────────────────────────────────────────
|
|
347
|
+
|
|
348
|
+
/** The last pull request this session opened, or null. */
|
|
349
|
+
export function lastPullRequest(): { number: number; url: string } | null {
|
|
350
|
+
return shell.publish.review.number > 0
|
|
351
|
+
? { number: shell.publish.review.number, url: shell.publish.review.url }
|
|
352
|
+
: null;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Put the summary back after a publish that failed before its commit landed, unless the author has
|
|
357
|
+
* already typed another.
|
|
358
|
+
*/
|
|
359
|
+
function restoreSummary(message: string): void {
|
|
360
|
+
if (!shell.git.commitMessage) {
|
|
361
|
+
shell.git.commitMessage = message;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Publish the change set to a destination.
|
|
367
|
+
*
|
|
368
|
+
* @param destination `live` or `review`; a refused review is never run.
|
|
369
|
+
* @param options `includeAll` stages every change first (the quick dialog); otherwise only the
|
|
370
|
+
* included files are committed.
|
|
371
|
+
* @returns Whether the change set reached its destination. A failure is already on screen.
|
|
372
|
+
*/
|
|
373
|
+
export async function publishChanges(
|
|
374
|
+
destination: PublishDestination,
|
|
375
|
+
options: { includeAll?: boolean } = {},
|
|
376
|
+
): Promise<boolean> {
|
|
377
|
+
const includeAll = options.includeAll ?? false;
|
|
378
|
+
const blocker = publishBlocker(destination, includeAll);
|
|
379
|
+
if (blocker) {
|
|
380
|
+
shell.git.error = blocker;
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
const message = shell.git.commitMessage.trim();
|
|
384
|
+
const plat = getPlatform();
|
|
385
|
+
shell.git.commitMessage = "";
|
|
386
|
+
shell.git.loading = true;
|
|
387
|
+
shell.git.error = null;
|
|
388
|
+
// Fold co-editing sessions into the backend's tree first so the commit never misses trailing
|
|
389
|
+
// Keystrokes (the mirror is debounced).
|
|
390
|
+
await flushAllCollab();
|
|
391
|
+
let committed = false;
|
|
392
|
+
// Whether the commit left for its destination. Only a deploy can say no without throwing.
|
|
393
|
+
let shipped = true;
|
|
394
|
+
try {
|
|
395
|
+
if (includeAll) {
|
|
396
|
+
const unstaged = filesToPublish(true)
|
|
397
|
+
.filter((file) => !file.staged)
|
|
398
|
+
.map((file) => file.path);
|
|
399
|
+
if (unstaged.length > 0) {
|
|
400
|
+
await plat.gitStage(unstaged);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (destination === "review") {
|
|
404
|
+
await sendForReview(plat, message, () => {
|
|
405
|
+
committed = true;
|
|
406
|
+
});
|
|
407
|
+
} else {
|
|
408
|
+
await plat.gitCommit(message);
|
|
409
|
+
committed = true;
|
|
410
|
+
if (deployReady()) {
|
|
411
|
+
/* The deploy is an Activity with its own steps, log and failure report (§16.4), and it
|
|
412
|
+
pushes with an upstream itself, so it runs after the loading flag is down: a running
|
|
413
|
+
deploy is not source control being busy. */
|
|
414
|
+
shell.git.loading = false;
|
|
415
|
+
/* `false` is a push that failed, a Cloudflare that did not answer, or a cancel; the
|
|
416
|
+
Activity has already said which. The commit landed either way, so the summary stays
|
|
417
|
+
cleared, but the change set did not reach the live site and the caller must not say it
|
|
418
|
+
did. */
|
|
419
|
+
shipped = await runDeploy();
|
|
420
|
+
} else if (!platformHostsGit() && firstRemote() !== "") {
|
|
421
|
+
await plat.gitPush();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
await refreshGitStatus();
|
|
425
|
+
return shipped;
|
|
426
|
+
} catch (error) {
|
|
427
|
+
shell.git.error = errorMessage(error);
|
|
428
|
+
shell.git.loading = false;
|
|
429
|
+
// A push that failed after the commit landed must not offer the same summary again.
|
|
430
|
+
if (!committed) {
|
|
431
|
+
restoreSummary(message);
|
|
432
|
+
}
|
|
433
|
+
return false;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/** What a pull request is opened with: its title, and the branches when the flow chose them. */
|
|
438
|
+
interface PullRequestRequest {
|
|
439
|
+
title: string;
|
|
440
|
+
head?: string;
|
|
441
|
+
base?: string;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Commit for review and say what the pull request is opened from.
|
|
446
|
+
*
|
|
447
|
+
* On a host whose branches are sessions, the commit lands on the session's branch, which already is
|
|
448
|
+
* the branch the pull request is opened from. Elsewhere the change set gets a `studio/` branch of
|
|
449
|
+
* its own, pushed with an upstream, and the pull request goes from it into the branch the author
|
|
450
|
+
* was on.
|
|
451
|
+
*/
|
|
452
|
+
async function commitForReview(
|
|
453
|
+
plat: ReturnType<typeof getPlatform>,
|
|
454
|
+
message: string,
|
|
455
|
+
onCommitted: () => void,
|
|
456
|
+
): Promise<PullRequestRequest> {
|
|
457
|
+
if (platformHostsGit()) {
|
|
458
|
+
// `reviewRefusal` has already refused the default branch, so this commit is not a live one.
|
|
459
|
+
await plat.gitCommit(message);
|
|
460
|
+
onCommitted();
|
|
461
|
+
const base = defaultBranch();
|
|
462
|
+
return base ? { base, title: message } : { title: message };
|
|
463
|
+
}
|
|
464
|
+
const base = currentBranch();
|
|
465
|
+
const head = reviewBranchName(message);
|
|
466
|
+
await plat.gitCreateBranch(head);
|
|
467
|
+
await plat.gitCommit(message);
|
|
468
|
+
onCommitted();
|
|
469
|
+
await plat.gitPush({ setUpstream: true });
|
|
470
|
+
return base ? { base, head, title: message } : { head, title: message };
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/** Send a change set for review: the commit, then the pull request, then where it went. */
|
|
474
|
+
async function sendForReview(
|
|
475
|
+
plat: ReturnType<typeof getPlatform>,
|
|
476
|
+
message: string,
|
|
477
|
+
onCommitted: () => void,
|
|
478
|
+
): Promise<void> {
|
|
479
|
+
const open = plat.createPullRequest;
|
|
480
|
+
if (!open) {
|
|
481
|
+
throw new Error(reviewRefusal());
|
|
482
|
+
}
|
|
483
|
+
const pr = await open(await commitForReview(plat, message, onCommitted));
|
|
484
|
+
shell.publish.review.number = pr.number;
|
|
485
|
+
shell.publish.review.url = pr.url;
|
|
486
|
+
notify.success(`Pull request #${pr.number} opened for review.`, {
|
|
487
|
+
detail: pr.url,
|
|
488
|
+
key: "publish.review",
|
|
489
|
+
source: "Publish",
|
|
490
|
+
});
|
|
491
|
+
}
|
|
@@ -8,13 +8,15 @@
|
|
|
8
8
|
* ships a site was, in the shipped app, unreachable. The toolbar's Publish button had already gone
|
|
9
9
|
* with the toolbar, and nothing replaced it.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* Five records, always reachable, each disabled with the one sentence that says why:
|
|
12
12
|
*
|
|
13
|
-
* | id | what it does
|
|
14
|
-
* | ----------------------- |
|
|
15
|
-
* | `publish.setUp` | opens the provider connection flow
|
|
16
|
-
* | `publish.deploy` | pushes the branch and asks Cloudflare what it did with it
|
|
17
|
-
* | `publish.openDashboard` | opens the connected Pages project on Cloudflare
|
|
13
|
+
* | id | what it does |
|
|
14
|
+
* | ----------------------- | ----------------------------------------------------------- |
|
|
15
|
+
* | `publish.setUp` | opens the provider connection flow |
|
|
16
|
+
* | `publish.deploy` | pushes the branch and asks Cloudflare what it did with it |
|
|
17
|
+
* | `publish.openDashboard` | opens the connected Pages project on Cloudflare |
|
|
18
|
+
* | `publish.quick` | opens the quick publish dialog (the chevron beside Publish) |
|
|
19
|
+
* | `publish.open` | shows the Publish workspace, on one of its four sub-tabs |
|
|
18
20
|
*
|
|
19
21
|
* **`runDeploy` is an Activity, not a toast.** A deploy pushes a branch and then waits on a build
|
|
20
22
|
* that is happening somewhere else; that is the definition of the long operation §16.4 gave the
|
|
@@ -25,17 +27,21 @@
|
|
|
25
27
|
* whether one is connected is a `project.json` question; the token that proves it is read only by
|
|
26
28
|
* `platforms/devserver.ts` on its way to the same-origin proxy (`studio.md` §15 rule 1).
|
|
27
29
|
*
|
|
28
|
-
* **The panel
|
|
29
|
-
* app-commands.ts` is loaded by three CI checks in a bare Bun
|
|
30
|
-
* modal at import would break all three.
|
|
30
|
+
* **The panel, the workspace and the quick dialog are imported lazily** so this module carries no
|
|
31
|
+
* DOM at import time: `commands/app-commands.ts` is loaded by three CI checks in a bare Bun
|
|
32
|
+
* process, and a module that opens a modal at import would break all three.
|
|
31
33
|
*/
|
|
32
34
|
|
|
33
35
|
import { getPlatform } from "../platform";
|
|
34
36
|
import { beginActivity } from "../panels/activity-panel";
|
|
35
37
|
import { currentDeploy, noteDeployment } from "./deploy-checklist";
|
|
36
38
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
37
|
-
import { latestDeployment
|
|
39
|
+
import { latestDeployment } from "./pages-service";
|
|
40
|
+
import { activeRegistry } from "../commands/active-registry";
|
|
41
|
+
import { argsSchema, enumArg, enumProperty } from "../commands/command-args";
|
|
42
|
+
import { PUBLISH_TABS } from "./publish-ids";
|
|
38
43
|
import type { AnyCommand, CommandRegistry } from "../commands/registry";
|
|
44
|
+
import type { CommandArgValues } from "../commands/command-args";
|
|
39
45
|
|
|
40
46
|
/**
|
|
41
47
|
* How long the deploy waits for Cloudflare to admit the push happened.
|
|
@@ -70,10 +76,11 @@ export async function runDeploy(
|
|
|
70
76
|
options: { attempts?: number; delayMs?: number } = {},
|
|
71
77
|
): Promise<boolean> {
|
|
72
78
|
const deploy = currentDeploy();
|
|
73
|
-
|
|
79
|
+
// Aborted by the activity's Cancel; the poll loop checks it between attempts.
|
|
80
|
+
const cancellation = new AbortController();
|
|
74
81
|
const activity = beginActivity({
|
|
75
82
|
cancel: () => {
|
|
76
|
-
|
|
83
|
+
cancellation.abort();
|
|
77
84
|
},
|
|
78
85
|
source: "Publish",
|
|
79
86
|
status: "Starting…",
|
|
@@ -104,7 +111,7 @@ export async function runDeploy(
|
|
|
104
111
|
const attempts = options.attempts ?? DEPLOY_POLL.attempts;
|
|
105
112
|
const delayMs = options.delayMs ?? DEPLOY_POLL.delayMs;
|
|
106
113
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
107
|
-
if (
|
|
114
|
+
if (cancellation.signal.aborted) {
|
|
108
115
|
return false;
|
|
109
116
|
}
|
|
110
117
|
let info;
|
|
@@ -123,7 +130,7 @@ export async function runDeploy(
|
|
|
123
130
|
}
|
|
124
131
|
await sleep(delayMs);
|
|
125
132
|
}
|
|
126
|
-
if (
|
|
133
|
+
if (cancellation.signal.aborted) {
|
|
127
134
|
return false;
|
|
128
135
|
}
|
|
129
136
|
noteDeployment(null);
|
|
@@ -132,12 +139,11 @@ export async function runDeploy(
|
|
|
132
139
|
}
|
|
133
140
|
|
|
134
141
|
/**
|
|
135
|
-
* The
|
|
142
|
+
* The five records.
|
|
136
143
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* `if (platform.x)` the family carries, in the one place a reader looks for it.
|
|
144
|
+
* Whether the host can reach Cloudflare is `ctx.capability.publish` (presence of the PAL's
|
|
145
|
+
* `cfApi`), so the family's refusals read the context like every other PAL difference does (§13.4)
|
|
146
|
+
* rather than asking the platform from inside a predicate.
|
|
141
147
|
*/
|
|
142
148
|
export function publishCommands(): AnyCommand[] {
|
|
143
149
|
return [
|
|
@@ -157,7 +163,7 @@ export function publishCommands(): AnyCommand[] {
|
|
|
157
163
|
requires: "an open project on a platform that can reach the Cloudflare API",
|
|
158
164
|
when: (ctx) => ctx.project.open,
|
|
159
165
|
// `when` already asked about the project.
|
|
160
|
-
enablement: () =>
|
|
166
|
+
enablement: (ctx) => ctx.capability.publish,
|
|
161
167
|
/* No `aiTool`, by `studio-ui-guidelines.md` §12.4's second rule: an auth flow that waits on a
|
|
162
168
|
person, with credentials. */
|
|
163
169
|
run: async () => {
|
|
@@ -177,7 +183,7 @@ export function publishCommands(): AnyCommand[] {
|
|
|
177
183
|
"reach the Cloudflare API",
|
|
178
184
|
when: (ctx) => ctx.project.open,
|
|
179
185
|
enablement: (ctx) =>
|
|
180
|
-
ctx.project.isRepo && currentDeploy() !== undefined &&
|
|
186
|
+
ctx.project.isRepo && currentDeploy() !== undefined && ctx.capability.publish,
|
|
181
187
|
/* No `aiTool`, by `studio-ui-guidelines.md` §12.4's third rule: remote and irreversible, the
|
|
182
188
|
same class as `packages.remove`. */
|
|
183
189
|
run: async () => {
|
|
@@ -193,7 +199,7 @@ export function publishCommands(): AnyCommand[] {
|
|
|
193
199
|
group: "8_publish",
|
|
194
200
|
requires: "a connected deploy provider, on a platform that can reach the Cloudflare API",
|
|
195
201
|
when: (ctx) => ctx.project.open,
|
|
196
|
-
enablement: () => currentDeploy() !== undefined &&
|
|
202
|
+
enablement: (ctx) => currentDeploy() !== undefined && ctx.capability.publish,
|
|
197
203
|
run: () => {
|
|
198
204
|
const deploy = currentDeploy();
|
|
199
205
|
if (deploy) {
|
|
@@ -202,6 +208,66 @@ export function publishCommands(): AnyCommand[] {
|
|
|
202
208
|
},
|
|
203
209
|
title: "Open Deployment Dashboard",
|
|
204
210
|
},
|
|
211
|
+
{
|
|
212
|
+
category: "Publish",
|
|
213
|
+
id: "publish.quick",
|
|
214
|
+
level: "project",
|
|
215
|
+
/* Overflow and palette, never `commandbar/primary`: the Command Bar draws it as the chevron
|
|
216
|
+
beside the Publish workspace tab (studio.md §22.2), which is a rendering of this record,
|
|
217
|
+
and publishing is a workspace rather than a primary verb. */
|
|
218
|
+
menus: ["commandbar/overflow", "palette"],
|
|
219
|
+
group: "8_publish",
|
|
220
|
+
requires: "a project tracked by git",
|
|
221
|
+
when: (ctx) => ctx.project.open,
|
|
222
|
+
enablement: (ctx) => ctx.project.isRepo,
|
|
223
|
+
/* No `aiTool`, by `studio-ui-guidelines.md` §12.4's first rule: it opens a dialog for a
|
|
224
|
+
person, and what that dialog publishes is the person's to send. */
|
|
225
|
+
run: async () => {
|
|
226
|
+
const { openQuickPublish } = await import("./publish-quick");
|
|
227
|
+
openQuickPublish();
|
|
228
|
+
},
|
|
229
|
+
title: "Quick Publish",
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
args: argsSchema(
|
|
233
|
+
{
|
|
234
|
+
tab: enumProperty(
|
|
235
|
+
PUBLISH_TABS,
|
|
236
|
+
"Which view of the Publish workspace to show: review (the changes and where they " +
|
|
237
|
+
"go), deploys (the live site and its deployments), branches, or hosting (where the " +
|
|
238
|
+
"project is saved and hosted). Defaults to the view the workspace was left on.",
|
|
239
|
+
),
|
|
240
|
+
},
|
|
241
|
+
[],
|
|
242
|
+
),
|
|
243
|
+
category: "Publish",
|
|
244
|
+
id: "publish.open",
|
|
245
|
+
level: "project",
|
|
246
|
+
/* `never`, for the reason `styles.open` gives: the palette's way into Publish is
|
|
247
|
+
`workspace.focus.publish` ("Go to Publish"), and a second row running the same switch would
|
|
248
|
+
be the same action under a second name. This is the scripted door, and `tab` is what it can
|
|
249
|
+
say that the chord cannot: the quick dialog's Review all and the screenshot manifest name
|
|
250
|
+
it. */
|
|
251
|
+
menus: ["never"],
|
|
252
|
+
group: "8_publish",
|
|
253
|
+
requires: "an open project",
|
|
254
|
+
enablement: (ctx) => ctx.project.open,
|
|
255
|
+
/* No `aiTool`, by `studio-ui-guidelines.md` §12.4's first rule: it shows a surface. */
|
|
256
|
+
run: async (_commandCtx, args: CommandArgValues) => {
|
|
257
|
+
const tab =
|
|
258
|
+
args["tab"] === undefined ? null : enumArg("publish.open", args, "tab", PUBLISH_TABS);
|
|
259
|
+
const registry = activeRegistry();
|
|
260
|
+
if (!registry) {
|
|
261
|
+
throw new Error('command "publish.open" needs the window\'s command registry');
|
|
262
|
+
}
|
|
263
|
+
await registry.run("view.setWorkspace", { workspace: "publish" });
|
|
264
|
+
if (tab !== null) {
|
|
265
|
+
const { showPublishTab } = await import("./publish-workspace");
|
|
266
|
+
showPublishTab(tab);
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
title: "Show Publish",
|
|
270
|
+
},
|
|
205
271
|
];
|
|
206
272
|
}
|
|
207
273
|
|