@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
|
@@ -13,9 +13,9 @@ import { canPickDirectory, pickDirectoryPath } from "../services/directory-picke
|
|
|
13
13
|
import { negotiateCollab } from "@jxsuite/collab/negotiate";
|
|
14
14
|
import type { CollabNegotiation } from "@jxsuite/collab/negotiate";
|
|
15
15
|
import type { WsCollabConnection } from "@jxsuite/collab/client";
|
|
16
|
-
import
|
|
16
|
+
import { isFunction } from "@jxsuite/schema/guards";
|
|
17
|
+
import type { JsonObject, JsonValue, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
|
|
17
18
|
import type {
|
|
18
|
-
CreateProjectDestination,
|
|
19
19
|
DataConnectionsResponse,
|
|
20
20
|
DataConnectionTestResult,
|
|
21
21
|
DataPushResult,
|
|
@@ -35,20 +35,22 @@ import type {
|
|
|
35
35
|
ProjectSchemasResponse,
|
|
36
36
|
ReferencesResult,
|
|
37
37
|
RenameResult,
|
|
38
|
-
|
|
38
|
+
KeyValuePatch,
|
|
39
39
|
SecretsSetResponse,
|
|
40
40
|
SiteBuildResult,
|
|
41
41
|
SitePreviewResult,
|
|
42
42
|
StarterInfo,
|
|
43
|
+
StudioPlatform,
|
|
43
44
|
} from "../types";
|
|
44
45
|
import { problemDetail, problemMessage } from "@jxsuite/protocol";
|
|
46
|
+
import type { CfProxyEnvelope } from "./cloud";
|
|
45
47
|
import type { UploadResult } from "@jxsuite/protocol";
|
|
46
48
|
|
|
47
|
-
/** A directory entry from the server, tolerating extra wire fields. */
|
|
48
|
-
type WireDirEntry = DirEntry & Record<string, unknown>;
|
|
49
|
-
|
|
50
49
|
/** Parse a fetch Response body as JSON, asserting the expected shape at the boundary. */
|
|
51
50
|
async function readJson<T>(res: Response): Promise<T> {
|
|
51
|
+
/* SAFETY: every route read here is a `/__studio/*` route of @jxsuite/server (specs/server.md §4),
|
|
52
|
+
whose replies have the shapes ../types and the wire interfaces in this file describe, and each
|
|
53
|
+
caller names the type of the route it called. */
|
|
52
54
|
return (await res.json()) as T;
|
|
53
55
|
}
|
|
54
56
|
|
|
@@ -56,11 +58,46 @@ interface ErrorBody {
|
|
|
56
58
|
error?: string;
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
/** One entry of the `/__studio/sites` glob: a site's folder and its parsed project.json. */
|
|
59
62
|
interface SiteEntry {
|
|
60
|
-
config:
|
|
63
|
+
config: ProjectConfig | null;
|
|
61
64
|
path: string;
|
|
62
65
|
}
|
|
63
66
|
|
|
67
|
+
/**
|
|
68
|
+
* `GET /__studio/project-info`: what the server knows about a folder. The route sends more than
|
|
69
|
+
* Studio reads (`projectRoot` among them), and those members ride along untouched.
|
|
70
|
+
*/
|
|
71
|
+
interface ProjectInfoReply {
|
|
72
|
+
isSiteProject: boolean;
|
|
73
|
+
projectConfig?: ProjectConfig | null;
|
|
74
|
+
directories?: string[];
|
|
75
|
+
[member: string]: JsonValue | ProjectConfig | undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The body of an `fs` event on the `/__reload` stream (the server's watcher batches them). */
|
|
79
|
+
interface FsEventBatch {
|
|
80
|
+
events?: FsEvent[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** `showDirectoryPicker()` (WICG File System Access), which only Chromium-based browsers expose. */
|
|
84
|
+
type ShowDirectoryPicker = (options: { mode: string }) => Promise<FileSystemDirectoryHandle>;
|
|
85
|
+
|
|
86
|
+
/** True when the window implements the File System Access directory picker. */
|
|
87
|
+
function hasDirectoryPicker(
|
|
88
|
+
host: Window,
|
|
89
|
+
): host is Window & { showDirectoryPicker: ShowDirectoryPicker } {
|
|
90
|
+
return "showDirectoryPicker" in host && isFunction(host.showDirectoryPicker);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The options object {@link StudioPlatform.createProject} takes. */
|
|
94
|
+
type CreateProjectOptions = Parameters<StudioPlatform["createProject"]>[0];
|
|
95
|
+
|
|
96
|
+
/** What a row insert or update answers: the row as stored. */
|
|
97
|
+
interface DataRowWrite {
|
|
98
|
+
row: JsonObject;
|
|
99
|
+
}
|
|
100
|
+
|
|
64
101
|
/**
|
|
65
102
|
* Create a DevServerPlatform instance.
|
|
66
103
|
*
|
|
@@ -117,7 +154,7 @@ export function createDevServerPlatform() {
|
|
|
117
154
|
method: "POST",
|
|
118
155
|
});
|
|
119
156
|
if (!res.ok) {
|
|
120
|
-
const body =
|
|
157
|
+
const body = await readJson<ErrorBody>(res).catch((): ErrorBody => ({}));
|
|
121
158
|
throw new Error(
|
|
122
159
|
`Could not open ${root}: ${problemDetail(body) ?? `activation failed (${res.status})`}`,
|
|
123
160
|
);
|
|
@@ -134,7 +171,7 @@ export function createDevServerPlatform() {
|
|
|
134
171
|
if (!_projectRoot) {
|
|
135
172
|
return;
|
|
136
173
|
}
|
|
137
|
-
_activation = postActivate(_projectRoot).catch((error
|
|
174
|
+
_activation = postActivate(_projectRoot).catch((error) => {
|
|
138
175
|
console.error("Project re-activation failed:", error);
|
|
139
176
|
});
|
|
140
177
|
}
|
|
@@ -158,6 +195,23 @@ export function createDevServerPlatform() {
|
|
|
158
195
|
return `${_projectRoot}/${r}`;
|
|
159
196
|
}
|
|
160
197
|
|
|
198
|
+
/**
|
|
199
|
+
* A `/__studio/git/*` route that names this session's project with `?dir=`.
|
|
200
|
+
*
|
|
201
|
+
* The server serves every Studio tab pointed at it, and its active project is whichever one was
|
|
202
|
+
* activated last; a git call that named no project ran in that one, so Initialize Repository in
|
|
203
|
+
* one session initialised another's project. With no project open, nothing is named and the
|
|
204
|
+
* server falls back to its own root (a clone from the welcome screen).
|
|
205
|
+
*/
|
|
206
|
+
function gitRoute(command: string, params: Record<string, string> = {}): string {
|
|
207
|
+
const query = new URLSearchParams(params);
|
|
208
|
+
if (_projectRoot) {
|
|
209
|
+
query.set("dir", serverPath("."));
|
|
210
|
+
}
|
|
211
|
+
const search = query.toString();
|
|
212
|
+
return `/__studio/git/${command}${search ? `?${search}` : ""}`;
|
|
213
|
+
}
|
|
214
|
+
|
|
161
215
|
/**
|
|
162
216
|
* Strip the project root prefix from a server-root-relative path.
|
|
163
217
|
*
|
|
@@ -171,6 +225,36 @@ export function createDevServerPlatform() {
|
|
|
171
225
|
return p.startsWith(`${_projectRoot}/`) ? p.slice(_projectRoot.length + 1) : p;
|
|
172
226
|
}
|
|
173
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Native folder chooser for the New Project modal's Browse… button. Present only when the browser
|
|
230
|
+
* implements `showDirectoryPicker` (Chromium-based); elsewhere the member stays undefined and the
|
|
231
|
+
* modal falls back to a typed Location field.
|
|
232
|
+
*
|
|
233
|
+
* The picked handle carries no filesystem path, so it is resolved by the id the picker tags the
|
|
234
|
+
* folder with (see `@jxsuite/studio/directory-picker`). Resolves `null` only when the user
|
|
235
|
+
* dismisses the chooser; every other failure rejects with a sentence the modal shows under
|
|
236
|
+
* Location. So `locate` keeps the helper's contract: `null` is "no folder holds this id" (the
|
|
237
|
+
* route's 200 `{ path: null }`), and a non-ok answer throws the problem the server sent rather
|
|
238
|
+
* than posing as a miss. A network failure (`TypeError: Failed to fetch`, e.g. a page that is not
|
|
239
|
+
* being served by the dev server at all) propagates as is, and the picker names it.
|
|
240
|
+
*/
|
|
241
|
+
const directoryPicking: Pick<StudioPlatform, "pickDirectory"> = {};
|
|
242
|
+
if (canPickDirectory()) {
|
|
243
|
+
directoryPicking.pickDirectory = async (): Promise<string | null> =>
|
|
244
|
+
pickDirectoryPath(async ({ id, name }) => {
|
|
245
|
+
const res = await fetch(
|
|
246
|
+
`/__studio/locate-directory?name=${encodeURIComponent(name)}&id=${encodeURIComponent(id)}`,
|
|
247
|
+
);
|
|
248
|
+
if (!res.ok) {
|
|
249
|
+
// A proxy, or a `views://` host with no dev server behind it, may answer in HTML.
|
|
250
|
+
const body = await readJson<JsonValue>(res).catch(() => null);
|
|
251
|
+
throw new Error(problemMessage(body, res.status));
|
|
252
|
+
}
|
|
253
|
+
const found = await readJson<{ path?: string | null }>(res);
|
|
254
|
+
return found.path ?? null;
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
174
258
|
return {
|
|
175
259
|
id: "devserver",
|
|
176
260
|
|
|
@@ -189,7 +273,7 @@ export function createDevServerPlatform() {
|
|
|
189
273
|
// Fire-and-forget: callers that need the binding in place before reading await activate()
|
|
190
274
|
// Themselves. The rejection is reported rather than dropped — an unactivated root leaves
|
|
191
275
|
// Every rootless endpoint (git especially) operating on the server's OWN root.
|
|
192
|
-
_activation = this.activate(_projectRoot).catch((error
|
|
276
|
+
_activation = this.activate(_projectRoot).catch((error) => {
|
|
193
277
|
console.error("Project activation failed:", error);
|
|
194
278
|
});
|
|
195
279
|
}
|
|
@@ -213,17 +297,14 @@ export function createDevServerPlatform() {
|
|
|
213
297
|
|
|
214
298
|
async openProject() {
|
|
215
299
|
// Use Chrome's showDirectoryPicker API
|
|
216
|
-
|
|
300
|
+
const host = window;
|
|
301
|
+
if (!hasDirectoryPicker(host)) {
|
|
217
302
|
throw new Error("showDirectoryPicker not available — use a Chromium-based browser");
|
|
218
303
|
}
|
|
219
304
|
|
|
220
305
|
let dirHandle;
|
|
221
306
|
try {
|
|
222
|
-
dirHandle = await (
|
|
223
|
-
window as unknown as {
|
|
224
|
-
showDirectoryPicker: (opts: { mode: string }) => Promise<FileSystemDirectoryHandle>;
|
|
225
|
-
}
|
|
226
|
-
).showDirectoryPicker({ mode: "readwrite" });
|
|
307
|
+
dirHandle = await host.showDirectoryPicker({ mode: "readwrite" });
|
|
227
308
|
} catch (error) {
|
|
228
309
|
// User cancelled the picker
|
|
229
310
|
if (error instanceof Error && error.name === "AbortError") {
|
|
@@ -241,6 +322,9 @@ export function createDevServerPlatform() {
|
|
|
241
322
|
}
|
|
242
323
|
|
|
243
324
|
const file = await siteHandle.getFile();
|
|
325
|
+
/* SAFETY: the user picked this folder as a project, and project.json is that project's own
|
|
326
|
+
config file; it is matched below against the server's parse of the same file, and every
|
|
327
|
+
adapter hands project.json to Studio as the ProjectConfig the session edits. */
|
|
244
328
|
const config = JSON.parse(await file.text()) as ProjectConfig;
|
|
245
329
|
|
|
246
330
|
// Resolve server-relative path by matching against known sites
|
|
@@ -297,12 +381,7 @@ export function createDevServerPlatform() {
|
|
|
297
381
|
? await readJson<{ name: string; root: string }>(projectRes)
|
|
298
382
|
: { name: "project", root: "." };
|
|
299
383
|
const info = infoRes.ok
|
|
300
|
-
? await readJson<
|
|
301
|
-
isSiteProject: boolean;
|
|
302
|
-
projectConfig?: ProjectConfig | null;
|
|
303
|
-
directories?: string[];
|
|
304
|
-
[key: string]: unknown;
|
|
305
|
-
}>(infoRes)
|
|
384
|
+
? await readJson<ProjectInfoReply>(infoRes)
|
|
306
385
|
: { isSiteProject: false };
|
|
307
386
|
return { info, meta };
|
|
308
387
|
} catch {
|
|
@@ -315,27 +394,8 @@ export function createDevServerPlatform() {
|
|
|
315
394
|
/**
|
|
316
395
|
* Scaffold a project at `destination.parent/directory`. The dev server refuses the request
|
|
317
396
|
* outright when no destination is supplied — it will not fall back to its own root.
|
|
318
|
-
*
|
|
319
|
-
* @param {{
|
|
320
|
-
* name: string;
|
|
321
|
-
* description?: string;
|
|
322
|
-
* url?: string;
|
|
323
|
-
* adapter?: string;
|
|
324
|
-
* directory: string;
|
|
325
|
-
* destination: CreateProjectDestination;
|
|
326
|
-
* }} opts
|
|
327
397
|
*/
|
|
328
|
-
async createProject(opts: {
|
|
329
|
-
name: string;
|
|
330
|
-
description?: string;
|
|
331
|
-
url?: string;
|
|
332
|
-
adapter?: string;
|
|
333
|
-
directory: string;
|
|
334
|
-
destination: CreateProjectDestination;
|
|
335
|
-
starter?: string;
|
|
336
|
-
template?: string;
|
|
337
|
-
design?: Record<string, unknown>;
|
|
338
|
-
}) {
|
|
398
|
+
async createProject(opts: CreateProjectOptions) {
|
|
339
399
|
const res = await fetch("/__studio/create-project", {
|
|
340
400
|
body: JSON.stringify(opts),
|
|
341
401
|
headers: { "Content-Type": "application/json" },
|
|
@@ -348,37 +408,7 @@ export function createDevServerPlatform() {
|
|
|
348
408
|
return await res.json();
|
|
349
409
|
},
|
|
350
410
|
|
|
351
|
-
|
|
352
|
-
* Native folder chooser for the New Project modal's Browse… button. Present only when the
|
|
353
|
-
* browser implements `showDirectoryPicker` (Chromium-based); elsewhere the member stays
|
|
354
|
-
* undefined and the modal falls back to a typed Location field.
|
|
355
|
-
*
|
|
356
|
-
* The picked handle carries no filesystem path, so it is resolved by the id the picker tags the
|
|
357
|
-
* folder with (see `@jxsuite/studio/directory-picker`). Resolves `null` only when the user
|
|
358
|
-
* dismisses the chooser; every other failure rejects with a sentence the modal shows under
|
|
359
|
-
* Location. So `locate` keeps the helper's contract: `null` is "no folder holds this id" (the
|
|
360
|
-
* route's 200 `{ path: null }`), and a non-ok answer throws the problem the server sent rather
|
|
361
|
-
* than posing as a miss. A network failure (`TypeError: Failed to fetch`, e.g. a page that is
|
|
362
|
-
* not being served by the dev server at all) propagates as is, and the picker names it.
|
|
363
|
-
*/
|
|
364
|
-
...(canPickDirectory()
|
|
365
|
-
? {
|
|
366
|
-
async pickDirectory(): Promise<string | null> {
|
|
367
|
-
return pickDirectoryPath(async ({ id, name }) => {
|
|
368
|
-
const res = await fetch(
|
|
369
|
-
`/__studio/locate-directory?name=${encodeURIComponent(name)}&id=${encodeURIComponent(id)}`,
|
|
370
|
-
);
|
|
371
|
-
if (!res.ok) {
|
|
372
|
-
// A proxy, or a `views://` host with no dev server behind it, may answer in HTML.
|
|
373
|
-
const body: unknown = await res.json().catch(() => null);
|
|
374
|
-
throw new Error(problemMessage(body, res.status));
|
|
375
|
-
}
|
|
376
|
-
const found = await readJson<{ path?: string | null }>(res);
|
|
377
|
-
return found.path ?? null;
|
|
378
|
-
});
|
|
379
|
-
},
|
|
380
|
-
}
|
|
381
|
-
: {}),
|
|
411
|
+
...directoryPicking,
|
|
382
412
|
|
|
383
413
|
/** List starter templates from the dev server. */
|
|
384
414
|
async listStarters(): Promise<StarterInfo[]> {
|
|
@@ -407,20 +437,32 @@ export function createDevServerPlatform() {
|
|
|
407
437
|
if (!res.ok) {
|
|
408
438
|
throw new Error(`Failed to list directory: ${dir}`);
|
|
409
439
|
}
|
|
410
|
-
const entries = await readJson<
|
|
440
|
+
const entries = await readJson<DirEntry[]>(res);
|
|
411
441
|
for (const e of entries) {
|
|
412
442
|
e.path = stripRoot(e.path);
|
|
413
443
|
}
|
|
414
444
|
return entries;
|
|
415
445
|
},
|
|
416
446
|
|
|
417
|
-
/**
|
|
447
|
+
/**
|
|
448
|
+
* Read a file as text. A missing file still rejects, as the PAL says; it is only asked for with
|
|
449
|
+
* `optional=1` (`specs/server.md` §4.1), so the absence arrives as a `null` body rather than a 404.
|
|
450
|
+
* Studio probes for files it expects may be missing (a `.gitignore` per listed directory), and
|
|
451
|
+
* a failed request per probe was console noise that read as a fault.
|
|
452
|
+
*
|
|
453
|
+
* @param {string} path
|
|
454
|
+
*/
|
|
418
455
|
async readFile(path: string) {
|
|
419
|
-
const res = await fetch(
|
|
456
|
+
const res = await fetch(
|
|
457
|
+
`/__studio/file?path=${encodeURIComponent(serverPath(path))}&optional=1`,
|
|
458
|
+
);
|
|
420
459
|
if (!res.ok) {
|
|
421
460
|
throw new Error(`Failed to read file: ${path}`);
|
|
422
461
|
}
|
|
423
|
-
const data = await readJson<{ content: string }>(res);
|
|
462
|
+
const data = await readJson<{ content: string | null }>(res);
|
|
463
|
+
if (data.content === null) {
|
|
464
|
+
throw new Error(`Failed to read file: ${path} (not found)`);
|
|
465
|
+
}
|
|
424
466
|
return data.content;
|
|
425
467
|
},
|
|
426
468
|
|
|
@@ -465,10 +507,14 @@ export function createDevServerPlatform() {
|
|
|
465
507
|
if (!res.ok) {
|
|
466
508
|
throw new Error(`Upload failed: ${path}`);
|
|
467
509
|
}
|
|
468
|
-
const body =
|
|
510
|
+
const body = await readJson<Partial<UploadResult>>(res);
|
|
469
511
|
// The dev server echoes the path today; falling back to the request keeps a backend that says
|
|
470
512
|
// Nothing working rather than writing `undefined` into a document.
|
|
471
|
-
|
|
513
|
+
const uploaded: UploadResult = { path: body.path ?? path };
|
|
514
|
+
if (body.size !== undefined) {
|
|
515
|
+
uploaded.size = body.size;
|
|
516
|
+
}
|
|
517
|
+
return uploaded;
|
|
472
518
|
},
|
|
473
519
|
|
|
474
520
|
/** @param {string} path */
|
|
@@ -552,10 +598,12 @@ export function createDevServerPlatform() {
|
|
|
552
598
|
options?.onResync?.("reconnect");
|
|
553
599
|
}
|
|
554
600
|
});
|
|
555
|
-
es.addEventListener("fs", (ev: MessageEvent) => {
|
|
556
|
-
let payload:
|
|
601
|
+
es.addEventListener("fs", (ev: MessageEvent<string>) => {
|
|
602
|
+
let payload: FsEventBatch;
|
|
557
603
|
try {
|
|
558
|
-
|
|
604
|
+
/* SAFETY: `fs` events on /__reload are sent only by @jxsuite/server's watcher, as
|
|
605
|
+
broadcastEvent("fs", { events }) over its batched FsEvent buffer (server watch.ts). */
|
|
606
|
+
payload = JSON.parse(ev.data) as FsEventBatch;
|
|
559
607
|
} catch {
|
|
560
608
|
return;
|
|
561
609
|
}
|
|
@@ -597,7 +645,7 @@ export function createDevServerPlatform() {
|
|
|
597
645
|
}
|
|
598
646
|
if (_collabProbe === null) {
|
|
599
647
|
_collabProbe = fetch("/__studio/collab")
|
|
600
|
-
.then(async (res) => (res.ok ? negotiateCollab(await res
|
|
648
|
+
.then(async (res) => (res.ok ? negotiateCollab(await readJson<JsonValue>(res)) : null))
|
|
601
649
|
.catch(() => null);
|
|
602
650
|
}
|
|
603
651
|
const negotiation = await _collabProbe;
|
|
@@ -694,7 +742,7 @@ export function createDevServerPlatform() {
|
|
|
694
742
|
if (!res.ok) {
|
|
695
743
|
return false;
|
|
696
744
|
}
|
|
697
|
-
const data =
|
|
745
|
+
const data = await readJson<{ needsInstall?: boolean }>(res);
|
|
698
746
|
return Boolean(data.needsInstall);
|
|
699
747
|
},
|
|
700
748
|
|
|
@@ -721,11 +769,8 @@ export function createDevServerPlatform() {
|
|
|
721
769
|
|
|
722
770
|
// ─── Code services (optional) ─────────────────────────────────────────
|
|
723
771
|
|
|
724
|
-
/**
|
|
725
|
-
|
|
726
|
-
* @param {unknown} payload
|
|
727
|
-
*/
|
|
728
|
-
async codeService(action: string, payload: unknown) {
|
|
772
|
+
/** Run one code-service action on the server; null when the route fails or is absent. */
|
|
773
|
+
async codeService(action: string, payload: Parameters<StudioPlatform["codeService"]>[1]) {
|
|
729
774
|
try {
|
|
730
775
|
const res = await fetch(`/__studio/code/${action}`, {
|
|
731
776
|
body: JSON.stringify(payload),
|
|
@@ -788,7 +833,7 @@ export function createDevServerPlatform() {
|
|
|
788
833
|
if (!res.ok) {
|
|
789
834
|
return [];
|
|
790
835
|
}
|
|
791
|
-
const entries = await readJson<
|
|
836
|
+
const entries = await readJson<DirEntry[]>(res);
|
|
792
837
|
for (const e of entries) {
|
|
793
838
|
e.path = stripRoot(e.path);
|
|
794
839
|
}
|
|
@@ -911,26 +956,26 @@ export function createDevServerPlatform() {
|
|
|
911
956
|
return data;
|
|
912
957
|
},
|
|
913
958
|
|
|
914
|
-
async dataInsertRow(req: DataRowInsert): Promise<
|
|
959
|
+
async dataInsertRow(req: DataRowInsert): Promise<DataRowWrite> {
|
|
915
960
|
const res = await fetch(`/__studio/data/rows?dir=${encodeURIComponent(serverPath("."))}`, {
|
|
916
961
|
body: JSON.stringify(req),
|
|
917
962
|
headers: { "Content-Type": "application/json" },
|
|
918
963
|
method: "POST",
|
|
919
964
|
});
|
|
920
|
-
const data = await readJson<
|
|
965
|
+
const data = await readJson<DataRowWrite & ErrorBody>(res);
|
|
921
966
|
if (!res.ok) {
|
|
922
967
|
throw new Error(problemDetail(data) ?? "Insert failed");
|
|
923
968
|
}
|
|
924
969
|
return data;
|
|
925
970
|
},
|
|
926
971
|
|
|
927
|
-
async dataUpdateRow(req: DataRowUpdate): Promise<
|
|
972
|
+
async dataUpdateRow(req: DataRowUpdate): Promise<DataRowWrite> {
|
|
928
973
|
const res = await fetch(`/__studio/data/rows?dir=${encodeURIComponent(serverPath("."))}`, {
|
|
929
974
|
body: JSON.stringify(req),
|
|
930
975
|
headers: { "Content-Type": "application/json" },
|
|
931
976
|
method: "PUT",
|
|
932
977
|
});
|
|
933
|
-
const data = await readJson<
|
|
978
|
+
const data = await readJson<DataRowWrite & ErrorBody>(res);
|
|
934
979
|
if (!res.ok) {
|
|
935
980
|
throw new Error(problemDetail(data) ?? "Update failed");
|
|
936
981
|
}
|
|
@@ -966,7 +1011,7 @@ export function createDevServerPlatform() {
|
|
|
966
1011
|
},
|
|
967
1012
|
|
|
968
1013
|
/** Write/remove secrets in the dev server's .dev.vars; names-only response. */
|
|
969
|
-
async setSecrets(req:
|
|
1014
|
+
async setSecrets(req: KeyValuePatch): Promise<SecretsSetResponse> {
|
|
970
1015
|
const res = await fetch(`/__studio/secrets?dir=${encodeURIComponent(serverPath("."))}`, {
|
|
971
1016
|
body: JSON.stringify(req),
|
|
972
1017
|
headers: { "Content-Type": "application/json" },
|
|
@@ -982,15 +1027,17 @@ export function createDevServerPlatform() {
|
|
|
982
1027
|
/**
|
|
983
1028
|
* Invoke a format capability (parse/serialize) server-side.
|
|
984
1029
|
*
|
|
985
|
-
* @param
|
|
1030
|
+
* @param payload — { format, action, source?, doc?, options? }
|
|
986
1031
|
*/
|
|
987
|
-
async formatAction(payload:
|
|
1032
|
+
async formatAction(payload: Parameters<NonNullable<StudioPlatform["formatAction"]>>[0]) {
|
|
988
1033
|
const res = await fetch("/__studio/format", {
|
|
989
1034
|
body: JSON.stringify({ ...payload, dir: serverPath(".") }),
|
|
990
1035
|
headers: { "Content-Type": "application/json" },
|
|
991
1036
|
method: "POST",
|
|
992
1037
|
});
|
|
993
|
-
|
|
1038
|
+
/* The format route answers `{ result }` on success (the document a format class's `parse`
|
|
1039
|
+
built, or the text its `serialize` wrote) and a problem document otherwise. */
|
|
1040
|
+
const data = await readJson<JsonObject & { result: JxMutableNode | string }>(res);
|
|
994
1041
|
if (!res.ok) {
|
|
995
1042
|
throw new Error(problemDetail(data) ?? "Format action failed");
|
|
996
1043
|
}
|
|
@@ -1016,14 +1063,13 @@ export function createDevServerPlatform() {
|
|
|
1016
1063
|
if (!res.ok) {
|
|
1017
1064
|
return null;
|
|
1018
1065
|
}
|
|
1019
|
-
const { schema } = await readJson<{ schema:
|
|
1066
|
+
const { schema } = await readJson<{ schema: JsonValue }>(res);
|
|
1020
1067
|
return schema;
|
|
1021
1068
|
},
|
|
1022
1069
|
|
|
1023
1070
|
// ─── Class resolution (dev-proxy) ─────────────────────────────────────
|
|
1024
1071
|
|
|
1025
|
-
|
|
1026
|
-
async resolveClass(body: Record<string, unknown>) {
|
|
1072
|
+
async resolveClass(body: Parameters<NonNullable<StudioPlatform["resolveClass"]>>[0]) {
|
|
1027
1073
|
const res = await fetch("/__jx_resolve__", {
|
|
1028
1074
|
body: JSON.stringify(body),
|
|
1029
1075
|
headers: { "content-type": "application/json" },
|
|
@@ -1032,13 +1078,13 @@ export function createDevServerPlatform() {
|
|
|
1032
1078
|
if (!res.ok) {
|
|
1033
1079
|
throw new Error(`Class resolution failed: ${res.status}`);
|
|
1034
1080
|
}
|
|
1035
|
-
return await readJson<
|
|
1081
|
+
return await readJson<JsonValue>(res);
|
|
1036
1082
|
},
|
|
1037
1083
|
|
|
1038
1084
|
// ─── Git operations ──────────────────────────────────────────────────
|
|
1039
1085
|
|
|
1040
1086
|
async gitStatus() {
|
|
1041
|
-
const res = await fetch("
|
|
1087
|
+
const res = await fetch(gitRoute("status"));
|
|
1042
1088
|
if (!res.ok) {
|
|
1043
1089
|
throw new Error(await res.text());
|
|
1044
1090
|
}
|
|
@@ -1046,7 +1092,7 @@ export function createDevServerPlatform() {
|
|
|
1046
1092
|
},
|
|
1047
1093
|
|
|
1048
1094
|
async gitBranches() {
|
|
1049
|
-
const res = await fetch("
|
|
1095
|
+
const res = await fetch(gitRoute("branches"));
|
|
1050
1096
|
if (!res.ok) {
|
|
1051
1097
|
throw new Error(await res.text());
|
|
1052
1098
|
}
|
|
@@ -1055,8 +1101,7 @@ export function createDevServerPlatform() {
|
|
|
1055
1101
|
|
|
1056
1102
|
/** @param {number} [limit] */
|
|
1057
1103
|
async gitLog(limit?: number) {
|
|
1058
|
-
const
|
|
1059
|
-
const res = await fetch(`/__studio/git/log${q}`);
|
|
1104
|
+
const res = await fetch(gitRoute("log", limit ? { limit: String(limit) } : {}));
|
|
1060
1105
|
if (!res.ok) {
|
|
1061
1106
|
throw new Error(await res.text());
|
|
1062
1107
|
}
|
|
@@ -1065,7 +1110,7 @@ export function createDevServerPlatform() {
|
|
|
1065
1110
|
|
|
1066
1111
|
/** @param {string[]} files */
|
|
1067
1112
|
async gitStage(files: string[]) {
|
|
1068
|
-
const res = await fetch("
|
|
1113
|
+
const res = await fetch(gitRoute("stage"), {
|
|
1069
1114
|
body: JSON.stringify({ files }),
|
|
1070
1115
|
headers: { "Content-Type": "application/json" },
|
|
1071
1116
|
method: "POST",
|
|
@@ -1079,7 +1124,7 @@ export function createDevServerPlatform() {
|
|
|
1079
1124
|
|
|
1080
1125
|
/** @param {string[]} files */
|
|
1081
1126
|
async gitUnstage(files: string[]) {
|
|
1082
|
-
const res = await fetch("
|
|
1127
|
+
const res = await fetch(gitRoute("unstage"), {
|
|
1083
1128
|
body: JSON.stringify({ files }),
|
|
1084
1129
|
headers: { "Content-Type": "application/json" },
|
|
1085
1130
|
method: "POST",
|
|
@@ -1093,7 +1138,7 @@ export function createDevServerPlatform() {
|
|
|
1093
1138
|
|
|
1094
1139
|
/** @param {string} message */
|
|
1095
1140
|
async gitCommit(message: string) {
|
|
1096
|
-
const res = await fetch("
|
|
1141
|
+
const res = await fetch(gitRoute("commit"), {
|
|
1097
1142
|
body: JSON.stringify({ message }),
|
|
1098
1143
|
headers: { "Content-Type": "application/json" },
|
|
1099
1144
|
method: "POST",
|
|
@@ -1107,7 +1152,7 @@ export function createDevServerPlatform() {
|
|
|
1107
1152
|
|
|
1108
1153
|
/** @param {{ setUpstream?: boolean }} [opts] */
|
|
1109
1154
|
async gitPush(opts?: { setUpstream?: boolean }) {
|
|
1110
|
-
const res = await fetch("
|
|
1155
|
+
const res = await fetch(gitRoute("push"), {
|
|
1111
1156
|
body: JSON.stringify(opts || {}),
|
|
1112
1157
|
headers: { "Content-Type": "application/json" },
|
|
1113
1158
|
method: "POST",
|
|
@@ -1120,7 +1165,7 @@ export function createDevServerPlatform() {
|
|
|
1120
1165
|
},
|
|
1121
1166
|
|
|
1122
1167
|
async gitPull() {
|
|
1123
|
-
const res = await fetch("
|
|
1168
|
+
const res = await fetch(gitRoute("pull"), { method: "POST" });
|
|
1124
1169
|
if (!res.ok) {
|
|
1125
1170
|
const body = await readJson<ErrorBody>(res);
|
|
1126
1171
|
throw new Error(problemMessage(body));
|
|
@@ -1129,7 +1174,7 @@ export function createDevServerPlatform() {
|
|
|
1129
1174
|
},
|
|
1130
1175
|
|
|
1131
1176
|
async gitFetch() {
|
|
1132
|
-
const res = await fetch("
|
|
1177
|
+
const res = await fetch(gitRoute("fetch"), { method: "POST" });
|
|
1133
1178
|
if (!res.ok) {
|
|
1134
1179
|
const body = await readJson<ErrorBody>(res);
|
|
1135
1180
|
throw new Error(problemMessage(body));
|
|
@@ -1139,7 +1184,7 @@ export function createDevServerPlatform() {
|
|
|
1139
1184
|
|
|
1140
1185
|
/** @param {string} branch */
|
|
1141
1186
|
async gitCheckout(branch: string) {
|
|
1142
|
-
const res = await fetch("
|
|
1187
|
+
const res = await fetch(gitRoute("checkout"), {
|
|
1143
1188
|
body: JSON.stringify({ branch }),
|
|
1144
1189
|
headers: { "Content-Type": "application/json" },
|
|
1145
1190
|
method: "POST",
|
|
@@ -1153,7 +1198,7 @@ export function createDevServerPlatform() {
|
|
|
1153
1198
|
|
|
1154
1199
|
/** @param {string} name */
|
|
1155
1200
|
async gitCreateBranch(name: string) {
|
|
1156
|
-
const res = await fetch("
|
|
1201
|
+
const res = await fetch(gitRoute("create-branch"), {
|
|
1157
1202
|
body: JSON.stringify({ name }),
|
|
1158
1203
|
headers: { "Content-Type": "application/json" },
|
|
1159
1204
|
method: "POST",
|
|
@@ -1167,7 +1212,7 @@ export function createDevServerPlatform() {
|
|
|
1167
1212
|
|
|
1168
1213
|
/** @param {string} [path] */
|
|
1169
1214
|
async gitDiff(path?: string) {
|
|
1170
|
-
const res = await fetch(
|
|
1215
|
+
const res = await fetch(gitRoute("diff", { path: path ?? "" }));
|
|
1171
1216
|
if (!res.ok) {
|
|
1172
1217
|
throw new Error(await res.text());
|
|
1173
1218
|
}
|
|
@@ -1176,11 +1221,9 @@ export function createDevServerPlatform() {
|
|
|
1176
1221
|
|
|
1177
1222
|
/** @param {{ path: string; ref?: string }} opts */
|
|
1178
1223
|
async gitShow(opts: { path: string; ref?: string }) {
|
|
1179
|
-
const
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
}
|
|
1183
|
-
const res = await fetch(`/__studio/git/show?${params}`);
|
|
1224
|
+
const res = await fetch(
|
|
1225
|
+
gitRoute("show", opts.ref ? { path: opts.path, ref: opts.ref } : { path: opts.path }),
|
|
1226
|
+
);
|
|
1184
1227
|
if (!res.ok) {
|
|
1185
1228
|
throw new Error(await res.text());
|
|
1186
1229
|
}
|
|
@@ -1190,7 +1233,7 @@ export function createDevServerPlatform() {
|
|
|
1190
1233
|
|
|
1191
1234
|
/** @param {string[]} files */
|
|
1192
1235
|
async gitDiscard(files: string[]) {
|
|
1193
|
-
const res = await fetch("
|
|
1236
|
+
const res = await fetch(gitRoute("discard"), {
|
|
1194
1237
|
body: JSON.stringify({ files }),
|
|
1195
1238
|
headers: { "Content-Type": "application/json" },
|
|
1196
1239
|
method: "POST",
|
|
@@ -1204,7 +1247,7 @@ export function createDevServerPlatform() {
|
|
|
1204
1247
|
|
|
1205
1248
|
/** @param {string} url */
|
|
1206
1249
|
async gitClone(url: string) {
|
|
1207
|
-
const res = await fetch("
|
|
1250
|
+
const res = await fetch(gitRoute("clone"), {
|
|
1208
1251
|
body: JSON.stringify({ url }),
|
|
1209
1252
|
headers: { "Content-Type": "application/json" },
|
|
1210
1253
|
method: "POST",
|
|
@@ -1217,7 +1260,7 @@ export function createDevServerPlatform() {
|
|
|
1217
1260
|
},
|
|
1218
1261
|
|
|
1219
1262
|
async gitInit() {
|
|
1220
|
-
const res = await fetch("
|
|
1263
|
+
const res = await fetch(gitRoute("init"), { method: "POST" });
|
|
1221
1264
|
if (!res.ok) {
|
|
1222
1265
|
const body = await readJson<ErrorBody>(res);
|
|
1223
1266
|
throw new Error(problemMessage(body));
|
|
@@ -1229,7 +1272,7 @@ export function createDevServerPlatform() {
|
|
|
1229
1272
|
const body = await readJson<ErrorBody>(res);
|
|
1230
1273
|
throw new Error(problemDetail(body) ?? "The site could not be built.");
|
|
1231
1274
|
}
|
|
1232
|
-
return
|
|
1275
|
+
return await readJson<SiteBuildResult>(res);
|
|
1233
1276
|
},
|
|
1234
1277
|
|
|
1235
1278
|
/**
|
|
@@ -1248,7 +1291,7 @@ export function createDevServerPlatform() {
|
|
|
1248
1291
|
const body = await readJson<ErrorBody>(res);
|
|
1249
1292
|
throw new Error(problemDetail(body) ?? "The site could not be previewed.");
|
|
1250
1293
|
}
|
|
1251
|
-
return
|
|
1294
|
+
return await readJson<SitePreviewResult>(res);
|
|
1252
1295
|
},
|
|
1253
1296
|
|
|
1254
1297
|
async setPreviewOverlay(path: string, contents: string) {
|
|
@@ -1272,7 +1315,7 @@ export function createDevServerPlatform() {
|
|
|
1272
1315
|
* @param {string} url
|
|
1273
1316
|
*/
|
|
1274
1317
|
async gitAddRemote(name: string, url: string) {
|
|
1275
|
-
const res = await fetch("
|
|
1318
|
+
const res = await fetch(gitRoute("add-remote"), {
|
|
1276
1319
|
body: JSON.stringify({ name, url }),
|
|
1277
1320
|
headers: { "Content-Type": "application/json" },
|
|
1278
1321
|
method: "POST",
|
|
@@ -1300,12 +1343,7 @@ export function createDevServerPlatform() {
|
|
|
1300
1343
|
headers: { "Content-Type": "application/json", "X-CF-Token": token },
|
|
1301
1344
|
body: JSON.stringify({ path: apiPath, method: init?.method ?? "GET", body: init?.body }),
|
|
1302
1345
|
});
|
|
1303
|
-
const envelope =
|
|
1304
|
-
success?: boolean;
|
|
1305
|
-
result?: unknown;
|
|
1306
|
-
errors?: { message: string }[];
|
|
1307
|
-
error?: string;
|
|
1308
|
-
};
|
|
1346
|
+
const envelope = await readJson<CfProxyEnvelope>(res);
|
|
1309
1347
|
if (!res.ok || envelope.success === false) {
|
|
1310
1348
|
const message =
|
|
1311
1349
|
envelope.errors?.map((e) => e.message).join("; ") ?? envelope.error ?? res.statusText;
|
|
@@ -1322,10 +1360,13 @@ export function createDevServerPlatform() {
|
|
|
1322
1360
|
return null;
|
|
1323
1361
|
}
|
|
1324
1362
|
try {
|
|
1325
|
-
const
|
|
1326
|
-
if (!
|
|
1363
|
+
const result = await this.cfApi("/accounts");
|
|
1364
|
+
if (!Array.isArray(result) || result.length === 0) {
|
|
1327
1365
|
return { connected: false };
|
|
1328
1366
|
}
|
|
1367
|
+
/* SAFETY: cfApi resolved the v4 envelope's `result`, and Cloudflare documents GET /accounts
|
|
1368
|
+
as answering an array of account objects, each with a string `id` and `name`. */
|
|
1369
|
+
const accounts = result as { id: string; name: string }[];
|
|
1329
1370
|
const chosen = accounts.find((a) => a.id === getCfAccountId()) ?? accounts[0]!;
|
|
1330
1371
|
setCfAccountId(chosen.id);
|
|
1331
1372
|
return { connected: true, accountId: chosen.id, accountName: chosen.name };
|
|
@@ -1343,14 +1384,11 @@ export function createDevServerPlatform() {
|
|
|
1343
1384
|
return [];
|
|
1344
1385
|
}
|
|
1345
1386
|
const sites = await readJson<SiteEntry[]>(res);
|
|
1346
|
-
return sites.map((site) => {
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
description: site.path,
|
|
1352
|
-
};
|
|
1353
|
-
});
|
|
1387
|
+
return sites.map((site) => ({
|
|
1388
|
+
name: site.config?.name || site.path.split("/").at(-1) || site.path,
|
|
1389
|
+
root: site.path,
|
|
1390
|
+
description: site.path,
|
|
1391
|
+
}));
|
|
1354
1392
|
},
|
|
1355
1393
|
|
|
1356
1394
|
// ─── AI Assistant (Stack B: OpenAI-compatible SSE proxy) ───────────────────
|